vitest 0.1.27 → 0.2.3
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/LICENSE.md +87 -34
- package/dist/{_commonjsHelpers-c9e3b764.js → _commonjsHelpers-bdec4bbd.js} +2 -6
- package/dist/cli.js +20 -1088
- package/dist/create-b3e0df3f.js +9169 -0
- package/dist/{diff-2acc5f39.js → diff-abc9f1a4.js} +3 -3
- package/dist/entry.js +22 -8
- package/dist/{globals-2b76a322.js → globals-67f38862.js} +7 -6
- package/dist/index-0c3a317d.js +2411 -0
- package/dist/{index-ba307c22.js → index-1085cee5.js} +37 -4
- package/dist/{index-9cc4cba7.js → index-6102d563.js} +2 -2
- package/dist/index-825cb54c.js +331 -0
- package/dist/{index-e69e6df8.js → index-87602a5a.js} +3 -29
- package/dist/index.d.ts +54 -46
- package/dist/index.js +7 -6
- package/dist/jest-mock-113430de.js +1 -1
- package/dist/node.d.ts +16 -10
- package/dist/node.js +7 -7
- package/dist/{setup-aacc2afb.js → setup-0edb4bff.js} +5 -5
- package/dist/{source-map-23caa14c.js → source-map-002462f4.js} +2 -2
- package/dist/vi-7f0c5d26.js +5750 -0
- package/dist/worker.js +12 -41
- package/package.json +7 -6
- package/dist/create-2d77f928.js +0 -9153
- package/dist/index-648e7ab2.js +0 -331
- package/dist/index-6e709f57.js +0 -782
- package/dist/index-ce49e384.js +0 -1644
- package/dist/vi-edfe5437.js +0 -3502
package/dist/vi-edfe5437.js
DELETED
|
@@ -1,3502 +0,0 @@
|
|
|
1
|
-
import { n as noop, i as isObject } from './index-e69e6df8.js';
|
|
2
|
-
import { i as isMockFunction, a as spyOn, f as fn, s as spies } from './jest-mock-113430de.js';
|
|
3
|
-
import { c as commonjsGlobal, g as getDefaultExportFromCjs } from './_commonjsHelpers-c9e3b764.js';
|
|
4
|
-
import { p as parseStacktrace } from './source-map-23caa14c.js';
|
|
5
|
-
|
|
6
|
-
var __defProp = Object.defineProperty;
|
|
7
|
-
var __defProps = Object.defineProperties;
|
|
8
|
-
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
9
|
-
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
10
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
11
|
-
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
12
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
13
|
-
var __spreadValues = (a, b) => {
|
|
14
|
-
for (var prop in b || (b = {}))
|
|
15
|
-
if (__hasOwnProp.call(b, prop))
|
|
16
|
-
__defNormalProp(a, prop, b[prop]);
|
|
17
|
-
if (__getOwnPropSymbols)
|
|
18
|
-
for (var prop of __getOwnPropSymbols(b)) {
|
|
19
|
-
if (__propIsEnum.call(b, prop))
|
|
20
|
-
__defNormalProp(a, prop, b[prop]);
|
|
21
|
-
}
|
|
22
|
-
return a;
|
|
23
|
-
};
|
|
24
|
-
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
25
|
-
function createChainable(keys, fn) {
|
|
26
|
-
function create(obj) {
|
|
27
|
-
const chain2 = function(...args) {
|
|
28
|
-
return fn.apply(obj, args);
|
|
29
|
-
};
|
|
30
|
-
for (const key of keys) {
|
|
31
|
-
Object.defineProperty(chain2, key, {
|
|
32
|
-
get() {
|
|
33
|
-
return create(__spreadProps(__spreadValues({}, obj), { [key]: true }));
|
|
34
|
-
}
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
return chain2;
|
|
38
|
-
}
|
|
39
|
-
const chain = create({});
|
|
40
|
-
chain.fn = fn;
|
|
41
|
-
return chain;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
const context = {
|
|
45
|
-
tasks: [],
|
|
46
|
-
currentSuite: null
|
|
47
|
-
};
|
|
48
|
-
function collectTask(task) {
|
|
49
|
-
var _a;
|
|
50
|
-
(_a = context.currentSuite) == null ? void 0 : _a.tasks.push(task);
|
|
51
|
-
}
|
|
52
|
-
async function runWithSuite(suite, fn) {
|
|
53
|
-
const prev = context.currentSuite;
|
|
54
|
-
context.currentSuite = suite;
|
|
55
|
-
await fn();
|
|
56
|
-
context.currentSuite = prev;
|
|
57
|
-
}
|
|
58
|
-
function getDefaultTestTimeout() {
|
|
59
|
-
return process.__vitest_worker__.config.testTimeout;
|
|
60
|
-
}
|
|
61
|
-
function getDefaultHookTimeout() {
|
|
62
|
-
return process.__vitest_worker__.config.hookTimeout;
|
|
63
|
-
}
|
|
64
|
-
function withTimeout(fn, _timeout) {
|
|
65
|
-
const timeout = _timeout ?? getDefaultTestTimeout();
|
|
66
|
-
if (timeout <= 0 || timeout === Infinity)
|
|
67
|
-
return fn;
|
|
68
|
-
return (...args) => {
|
|
69
|
-
return Promise.race([fn(...args), new Promise((resolve, reject) => {
|
|
70
|
-
const timer = setTimeout(() => {
|
|
71
|
-
clearTimeout(timer);
|
|
72
|
-
reject(new Error(`Test timed out in ${timeout}ms.`));
|
|
73
|
-
}, timeout);
|
|
74
|
-
timer.unref();
|
|
75
|
-
})]);
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
function ensureAsyncTest(fn) {
|
|
79
|
-
if (!fn.length)
|
|
80
|
-
return fn;
|
|
81
|
-
return () => new Promise((resolve, reject) => {
|
|
82
|
-
const done = (...args) => args[0] ? reject(args[0]) : resolve();
|
|
83
|
-
fn(done);
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
function normalizeTest(fn, timeout) {
|
|
87
|
-
return withTimeout(ensureAsyncTest(fn), timeout);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
const fnMap = new WeakMap();
|
|
91
|
-
const hooksMap = new WeakMap();
|
|
92
|
-
function setFn(key, fn) {
|
|
93
|
-
fnMap.set(key, fn);
|
|
94
|
-
}
|
|
95
|
-
function getFn(key) {
|
|
96
|
-
return fnMap.get(key);
|
|
97
|
-
}
|
|
98
|
-
function setHooks(key, hooks) {
|
|
99
|
-
hooksMap.set(key, hooks);
|
|
100
|
-
}
|
|
101
|
-
function getHooks(key) {
|
|
102
|
-
return hooksMap.get(key);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
const suite = createSuite();
|
|
106
|
-
const test$7 = createChainable(["concurrent", "skip", "only", "todo", "fails"], function(name, fn, timeout) {
|
|
107
|
-
getCurrentSuite().test.fn.call(this, name, fn, timeout);
|
|
108
|
-
});
|
|
109
|
-
const describe = suite;
|
|
110
|
-
const it = test$7;
|
|
111
|
-
const defaultSuite = suite("");
|
|
112
|
-
function clearContext() {
|
|
113
|
-
context.tasks.length = 0;
|
|
114
|
-
defaultSuite.clear();
|
|
115
|
-
context.currentSuite = defaultSuite;
|
|
116
|
-
}
|
|
117
|
-
function getCurrentSuite() {
|
|
118
|
-
return context.currentSuite || defaultSuite;
|
|
119
|
-
}
|
|
120
|
-
function createSuiteHooks() {
|
|
121
|
-
return {
|
|
122
|
-
beforeAll: [],
|
|
123
|
-
afterAll: [],
|
|
124
|
-
beforeEach: [],
|
|
125
|
-
afterEach: []
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
function createSuiteCollector(name, factory = () => {
|
|
129
|
-
}, mode, concurrent) {
|
|
130
|
-
const tasks = [];
|
|
131
|
-
const factoryQueue = [];
|
|
132
|
-
let suite2;
|
|
133
|
-
initSuite();
|
|
134
|
-
const test2 = createChainable(["concurrent", "skip", "only", "todo", "fails"], function(name2, fn, timeout) {
|
|
135
|
-
const mode2 = this.only ? "only" : this.skip ? "skip" : this.todo ? "todo" : "run";
|
|
136
|
-
const test3 = {
|
|
137
|
-
id: "",
|
|
138
|
-
type: "test",
|
|
139
|
-
name: name2,
|
|
140
|
-
mode: mode2,
|
|
141
|
-
suite: void 0,
|
|
142
|
-
fails: this.fails
|
|
143
|
-
};
|
|
144
|
-
if (this.concurrent || concurrent)
|
|
145
|
-
test3.concurrent = true;
|
|
146
|
-
setFn(test3, normalizeTest(fn || noop, timeout));
|
|
147
|
-
tasks.push(test3);
|
|
148
|
-
});
|
|
149
|
-
const collector = {
|
|
150
|
-
type: "collector",
|
|
151
|
-
name,
|
|
152
|
-
mode,
|
|
153
|
-
test: test2,
|
|
154
|
-
tasks,
|
|
155
|
-
collect,
|
|
156
|
-
clear,
|
|
157
|
-
on: addHook
|
|
158
|
-
};
|
|
159
|
-
function addHook(name2, ...fn) {
|
|
160
|
-
getHooks(suite2)[name2].push(...fn);
|
|
161
|
-
}
|
|
162
|
-
function initSuite() {
|
|
163
|
-
suite2 = {
|
|
164
|
-
id: "",
|
|
165
|
-
type: "suite",
|
|
166
|
-
name,
|
|
167
|
-
mode,
|
|
168
|
-
tasks: []
|
|
169
|
-
};
|
|
170
|
-
setHooks(suite2, createSuiteHooks());
|
|
171
|
-
}
|
|
172
|
-
function clear() {
|
|
173
|
-
tasks.length = 0;
|
|
174
|
-
factoryQueue.length = 0;
|
|
175
|
-
initSuite();
|
|
176
|
-
}
|
|
177
|
-
async function collect(file) {
|
|
178
|
-
factoryQueue.length = 0;
|
|
179
|
-
if (factory)
|
|
180
|
-
await runWithSuite(collector, () => factory(test2));
|
|
181
|
-
const allChildren = await Promise.all([...factoryQueue, ...tasks].map((i) => i.type === "collector" ? i.collect(file) : i));
|
|
182
|
-
suite2.file = file;
|
|
183
|
-
suite2.tasks = allChildren;
|
|
184
|
-
allChildren.forEach((task) => {
|
|
185
|
-
task.suite = suite2;
|
|
186
|
-
if (file)
|
|
187
|
-
task.file = file;
|
|
188
|
-
});
|
|
189
|
-
return suite2;
|
|
190
|
-
}
|
|
191
|
-
collectTask(collector);
|
|
192
|
-
return collector;
|
|
193
|
-
}
|
|
194
|
-
function createSuite() {
|
|
195
|
-
return createChainable(["concurrent", "skip", "only", "todo"], function(name, factory) {
|
|
196
|
-
const mode = this.only ? "only" : this.skip ? "skip" : this.todo ? "todo" : "run";
|
|
197
|
-
return createSuiteCollector(name, factory, mode, this.concurrent);
|
|
198
|
-
});
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
var build = {};
|
|
202
|
-
|
|
203
|
-
var ansiStyles = {exports: {}};
|
|
204
|
-
|
|
205
|
-
(function (module) {
|
|
206
|
-
|
|
207
|
-
const ANSI_BACKGROUND_OFFSET = 10;
|
|
208
|
-
|
|
209
|
-
const wrapAnsi256 = (offset = 0) => code => `\u001B[${38 + offset};5;${code}m`;
|
|
210
|
-
|
|
211
|
-
const wrapAnsi16m = (offset = 0) => (red, green, blue) => `\u001B[${38 + offset};2;${red};${green};${blue}m`;
|
|
212
|
-
|
|
213
|
-
function assembleStyles() {
|
|
214
|
-
const codes = new Map();
|
|
215
|
-
const styles = {
|
|
216
|
-
modifier: {
|
|
217
|
-
reset: [0, 0],
|
|
218
|
-
// 21 isn't widely supported and 22 does the same thing
|
|
219
|
-
bold: [1, 22],
|
|
220
|
-
dim: [2, 22],
|
|
221
|
-
italic: [3, 23],
|
|
222
|
-
underline: [4, 24],
|
|
223
|
-
overline: [53, 55],
|
|
224
|
-
inverse: [7, 27],
|
|
225
|
-
hidden: [8, 28],
|
|
226
|
-
strikethrough: [9, 29]
|
|
227
|
-
},
|
|
228
|
-
color: {
|
|
229
|
-
black: [30, 39],
|
|
230
|
-
red: [31, 39],
|
|
231
|
-
green: [32, 39],
|
|
232
|
-
yellow: [33, 39],
|
|
233
|
-
blue: [34, 39],
|
|
234
|
-
magenta: [35, 39],
|
|
235
|
-
cyan: [36, 39],
|
|
236
|
-
white: [37, 39],
|
|
237
|
-
|
|
238
|
-
// Bright color
|
|
239
|
-
blackBright: [90, 39],
|
|
240
|
-
redBright: [91, 39],
|
|
241
|
-
greenBright: [92, 39],
|
|
242
|
-
yellowBright: [93, 39],
|
|
243
|
-
blueBright: [94, 39],
|
|
244
|
-
magentaBright: [95, 39],
|
|
245
|
-
cyanBright: [96, 39],
|
|
246
|
-
whiteBright: [97, 39]
|
|
247
|
-
},
|
|
248
|
-
bgColor: {
|
|
249
|
-
bgBlack: [40, 49],
|
|
250
|
-
bgRed: [41, 49],
|
|
251
|
-
bgGreen: [42, 49],
|
|
252
|
-
bgYellow: [43, 49],
|
|
253
|
-
bgBlue: [44, 49],
|
|
254
|
-
bgMagenta: [45, 49],
|
|
255
|
-
bgCyan: [46, 49],
|
|
256
|
-
bgWhite: [47, 49],
|
|
257
|
-
|
|
258
|
-
// Bright color
|
|
259
|
-
bgBlackBright: [100, 49],
|
|
260
|
-
bgRedBright: [101, 49],
|
|
261
|
-
bgGreenBright: [102, 49],
|
|
262
|
-
bgYellowBright: [103, 49],
|
|
263
|
-
bgBlueBright: [104, 49],
|
|
264
|
-
bgMagentaBright: [105, 49],
|
|
265
|
-
bgCyanBright: [106, 49],
|
|
266
|
-
bgWhiteBright: [107, 49]
|
|
267
|
-
}
|
|
268
|
-
};
|
|
269
|
-
|
|
270
|
-
// Alias bright black as gray (and grey)
|
|
271
|
-
styles.color.gray = styles.color.blackBright;
|
|
272
|
-
styles.bgColor.bgGray = styles.bgColor.bgBlackBright;
|
|
273
|
-
styles.color.grey = styles.color.blackBright;
|
|
274
|
-
styles.bgColor.bgGrey = styles.bgColor.bgBlackBright;
|
|
275
|
-
|
|
276
|
-
for (const [groupName, group] of Object.entries(styles)) {
|
|
277
|
-
for (const [styleName, style] of Object.entries(group)) {
|
|
278
|
-
styles[styleName] = {
|
|
279
|
-
open: `\u001B[${style[0]}m`,
|
|
280
|
-
close: `\u001B[${style[1]}m`
|
|
281
|
-
};
|
|
282
|
-
|
|
283
|
-
group[styleName] = styles[styleName];
|
|
284
|
-
|
|
285
|
-
codes.set(style[0], style[1]);
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
Object.defineProperty(styles, groupName, {
|
|
289
|
-
value: group,
|
|
290
|
-
enumerable: false
|
|
291
|
-
});
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
Object.defineProperty(styles, 'codes', {
|
|
295
|
-
value: codes,
|
|
296
|
-
enumerable: false
|
|
297
|
-
});
|
|
298
|
-
|
|
299
|
-
styles.color.close = '\u001B[39m';
|
|
300
|
-
styles.bgColor.close = '\u001B[49m';
|
|
301
|
-
|
|
302
|
-
styles.color.ansi256 = wrapAnsi256();
|
|
303
|
-
styles.color.ansi16m = wrapAnsi16m();
|
|
304
|
-
styles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);
|
|
305
|
-
styles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);
|
|
306
|
-
|
|
307
|
-
// From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js
|
|
308
|
-
Object.defineProperties(styles, {
|
|
309
|
-
rgbToAnsi256: {
|
|
310
|
-
value: (red, green, blue) => {
|
|
311
|
-
// We use the extended greyscale palette here, with the exception of
|
|
312
|
-
// black and white. normal palette only has 4 greyscale shades.
|
|
313
|
-
if (red === green && green === blue) {
|
|
314
|
-
if (red < 8) {
|
|
315
|
-
return 16;
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
if (red > 248) {
|
|
319
|
-
return 231;
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
return Math.round(((red - 8) / 247) * 24) + 232;
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
return 16 +
|
|
326
|
-
(36 * Math.round(red / 255 * 5)) +
|
|
327
|
-
(6 * Math.round(green / 255 * 5)) +
|
|
328
|
-
Math.round(blue / 255 * 5);
|
|
329
|
-
},
|
|
330
|
-
enumerable: false
|
|
331
|
-
},
|
|
332
|
-
hexToRgb: {
|
|
333
|
-
value: hex => {
|
|
334
|
-
const matches = /(?<colorString>[a-f\d]{6}|[a-f\d]{3})/i.exec(hex.toString(16));
|
|
335
|
-
if (!matches) {
|
|
336
|
-
return [0, 0, 0];
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
let {colorString} = matches.groups;
|
|
340
|
-
|
|
341
|
-
if (colorString.length === 3) {
|
|
342
|
-
colorString = colorString.split('').map(character => character + character).join('');
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
const integer = Number.parseInt(colorString, 16);
|
|
346
|
-
|
|
347
|
-
return [
|
|
348
|
-
(integer >> 16) & 0xFF,
|
|
349
|
-
(integer >> 8) & 0xFF,
|
|
350
|
-
integer & 0xFF
|
|
351
|
-
];
|
|
352
|
-
},
|
|
353
|
-
enumerable: false
|
|
354
|
-
},
|
|
355
|
-
hexToAnsi256: {
|
|
356
|
-
value: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)),
|
|
357
|
-
enumerable: false
|
|
358
|
-
}
|
|
359
|
-
});
|
|
360
|
-
|
|
361
|
-
return styles;
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
// Make the export immutable
|
|
365
|
-
Object.defineProperty(module, 'exports', {
|
|
366
|
-
enumerable: true,
|
|
367
|
-
get: assembleStyles
|
|
368
|
-
});
|
|
369
|
-
}(ansiStyles));
|
|
370
|
-
|
|
371
|
-
var collections = {};
|
|
372
|
-
|
|
373
|
-
Object.defineProperty(collections, '__esModule', {
|
|
374
|
-
value: true
|
|
375
|
-
});
|
|
376
|
-
collections.printIteratorEntries = printIteratorEntries;
|
|
377
|
-
collections.printIteratorValues = printIteratorValues;
|
|
378
|
-
collections.printListItems = printListItems;
|
|
379
|
-
collections.printObjectProperties = printObjectProperties;
|
|
380
|
-
|
|
381
|
-
/**
|
|
382
|
-
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
|
|
383
|
-
*
|
|
384
|
-
* This source code is licensed under the MIT license found in the
|
|
385
|
-
* LICENSE file in the root directory of this source tree.
|
|
386
|
-
*
|
|
387
|
-
*/
|
|
388
|
-
const getKeysOfEnumerableProperties = (object, compareKeys) => {
|
|
389
|
-
const keys = Object.keys(object).sort(compareKeys);
|
|
390
|
-
|
|
391
|
-
if (Object.getOwnPropertySymbols) {
|
|
392
|
-
Object.getOwnPropertySymbols(object).forEach(symbol => {
|
|
393
|
-
if (Object.getOwnPropertyDescriptor(object, symbol).enumerable) {
|
|
394
|
-
keys.push(symbol);
|
|
395
|
-
}
|
|
396
|
-
});
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
return keys;
|
|
400
|
-
};
|
|
401
|
-
/**
|
|
402
|
-
* Return entries (for example, of a map)
|
|
403
|
-
* with spacing, indentation, and comma
|
|
404
|
-
* without surrounding punctuation (for example, braces)
|
|
405
|
-
*/
|
|
406
|
-
|
|
407
|
-
function printIteratorEntries(
|
|
408
|
-
iterator,
|
|
409
|
-
config,
|
|
410
|
-
indentation,
|
|
411
|
-
depth,
|
|
412
|
-
refs,
|
|
413
|
-
printer, // Too bad, so sad that separator for ECMAScript Map has been ' => '
|
|
414
|
-
// What a distracting diff if you change a data structure to/from
|
|
415
|
-
// ECMAScript Object or Immutable.Map/OrderedMap which use the default.
|
|
416
|
-
separator = ': '
|
|
417
|
-
) {
|
|
418
|
-
let result = '';
|
|
419
|
-
let current = iterator.next();
|
|
420
|
-
|
|
421
|
-
if (!current.done) {
|
|
422
|
-
result += config.spacingOuter;
|
|
423
|
-
const indentationNext = indentation + config.indent;
|
|
424
|
-
|
|
425
|
-
while (!current.done) {
|
|
426
|
-
const name = printer(
|
|
427
|
-
current.value[0],
|
|
428
|
-
config,
|
|
429
|
-
indentationNext,
|
|
430
|
-
depth,
|
|
431
|
-
refs
|
|
432
|
-
);
|
|
433
|
-
const value = printer(
|
|
434
|
-
current.value[1],
|
|
435
|
-
config,
|
|
436
|
-
indentationNext,
|
|
437
|
-
depth,
|
|
438
|
-
refs
|
|
439
|
-
);
|
|
440
|
-
result += indentationNext + name + separator + value;
|
|
441
|
-
current = iterator.next();
|
|
442
|
-
|
|
443
|
-
if (!current.done) {
|
|
444
|
-
result += ',' + config.spacingInner;
|
|
445
|
-
} else if (!config.min) {
|
|
446
|
-
result += ',';
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
result += config.spacingOuter + indentation;
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
return result;
|
|
454
|
-
}
|
|
455
|
-
/**
|
|
456
|
-
* Return values (for example, of a set)
|
|
457
|
-
* with spacing, indentation, and comma
|
|
458
|
-
* without surrounding punctuation (braces or brackets)
|
|
459
|
-
*/
|
|
460
|
-
|
|
461
|
-
function printIteratorValues(
|
|
462
|
-
iterator,
|
|
463
|
-
config,
|
|
464
|
-
indentation,
|
|
465
|
-
depth,
|
|
466
|
-
refs,
|
|
467
|
-
printer
|
|
468
|
-
) {
|
|
469
|
-
let result = '';
|
|
470
|
-
let current = iterator.next();
|
|
471
|
-
|
|
472
|
-
if (!current.done) {
|
|
473
|
-
result += config.spacingOuter;
|
|
474
|
-
const indentationNext = indentation + config.indent;
|
|
475
|
-
|
|
476
|
-
while (!current.done) {
|
|
477
|
-
result +=
|
|
478
|
-
indentationNext +
|
|
479
|
-
printer(current.value, config, indentationNext, depth, refs);
|
|
480
|
-
current = iterator.next();
|
|
481
|
-
|
|
482
|
-
if (!current.done) {
|
|
483
|
-
result += ',' + config.spacingInner;
|
|
484
|
-
} else if (!config.min) {
|
|
485
|
-
result += ',';
|
|
486
|
-
}
|
|
487
|
-
}
|
|
488
|
-
|
|
489
|
-
result += config.spacingOuter + indentation;
|
|
490
|
-
}
|
|
491
|
-
|
|
492
|
-
return result;
|
|
493
|
-
}
|
|
494
|
-
/**
|
|
495
|
-
* Return items (for example, of an array)
|
|
496
|
-
* with spacing, indentation, and comma
|
|
497
|
-
* without surrounding punctuation (for example, brackets)
|
|
498
|
-
**/
|
|
499
|
-
|
|
500
|
-
function printListItems(list, config, indentation, depth, refs, printer) {
|
|
501
|
-
let result = '';
|
|
502
|
-
|
|
503
|
-
if (list.length) {
|
|
504
|
-
result += config.spacingOuter;
|
|
505
|
-
const indentationNext = indentation + config.indent;
|
|
506
|
-
|
|
507
|
-
for (let i = 0; i < list.length; i++) {
|
|
508
|
-
result += indentationNext;
|
|
509
|
-
|
|
510
|
-
if (i in list) {
|
|
511
|
-
result += printer(list[i], config, indentationNext, depth, refs);
|
|
512
|
-
}
|
|
513
|
-
|
|
514
|
-
if (i < list.length - 1) {
|
|
515
|
-
result += ',' + config.spacingInner;
|
|
516
|
-
} else if (!config.min) {
|
|
517
|
-
result += ',';
|
|
518
|
-
}
|
|
519
|
-
}
|
|
520
|
-
|
|
521
|
-
result += config.spacingOuter + indentation;
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
return result;
|
|
525
|
-
}
|
|
526
|
-
/**
|
|
527
|
-
* Return properties of an object
|
|
528
|
-
* with spacing, indentation, and comma
|
|
529
|
-
* without surrounding punctuation (for example, braces)
|
|
530
|
-
*/
|
|
531
|
-
|
|
532
|
-
function printObjectProperties(val, config, indentation, depth, refs, printer) {
|
|
533
|
-
let result = '';
|
|
534
|
-
const keys = getKeysOfEnumerableProperties(val, config.compareKeys);
|
|
535
|
-
|
|
536
|
-
if (keys.length) {
|
|
537
|
-
result += config.spacingOuter;
|
|
538
|
-
const indentationNext = indentation + config.indent;
|
|
539
|
-
|
|
540
|
-
for (let i = 0; i < keys.length; i++) {
|
|
541
|
-
const key = keys[i];
|
|
542
|
-
const name = printer(key, config, indentationNext, depth, refs);
|
|
543
|
-
const value = printer(val[key], config, indentationNext, depth, refs);
|
|
544
|
-
result += indentationNext + name + ': ' + value;
|
|
545
|
-
|
|
546
|
-
if (i < keys.length - 1) {
|
|
547
|
-
result += ',' + config.spacingInner;
|
|
548
|
-
} else if (!config.min) {
|
|
549
|
-
result += ',';
|
|
550
|
-
}
|
|
551
|
-
}
|
|
552
|
-
|
|
553
|
-
result += config.spacingOuter + indentation;
|
|
554
|
-
}
|
|
555
|
-
|
|
556
|
-
return result;
|
|
557
|
-
}
|
|
558
|
-
|
|
559
|
-
var AsymmetricMatcher$1 = {};
|
|
560
|
-
|
|
561
|
-
Object.defineProperty(AsymmetricMatcher$1, '__esModule', {
|
|
562
|
-
value: true
|
|
563
|
-
});
|
|
564
|
-
AsymmetricMatcher$1.test = AsymmetricMatcher$1.serialize = AsymmetricMatcher$1.default = void 0;
|
|
565
|
-
|
|
566
|
-
var _collections$3 = collections;
|
|
567
|
-
|
|
568
|
-
var global$2 = (function () {
|
|
569
|
-
if (typeof globalThis !== 'undefined') {
|
|
570
|
-
return globalThis;
|
|
571
|
-
} else if (typeof global$2 !== 'undefined') {
|
|
572
|
-
return global$2;
|
|
573
|
-
} else if (typeof self !== 'undefined') {
|
|
574
|
-
return self;
|
|
575
|
-
} else if (typeof window !== 'undefined') {
|
|
576
|
-
return window;
|
|
577
|
-
} else {
|
|
578
|
-
return Function('return this')();
|
|
579
|
-
}
|
|
580
|
-
})();
|
|
581
|
-
|
|
582
|
-
var Symbol$2 = global$2['jest-symbol-do-not-touch'] || global$2.Symbol;
|
|
583
|
-
const asymmetricMatcher =
|
|
584
|
-
typeof Symbol$2 === 'function' && Symbol$2.for
|
|
585
|
-
? Symbol$2.for('jest.asymmetricMatcher')
|
|
586
|
-
: 0x1357a5;
|
|
587
|
-
const SPACE$2 = ' ';
|
|
588
|
-
|
|
589
|
-
const serialize$6 = (val, config, indentation, depth, refs, printer) => {
|
|
590
|
-
const stringedValue = val.toString();
|
|
591
|
-
|
|
592
|
-
if (
|
|
593
|
-
stringedValue === 'ArrayContaining' ||
|
|
594
|
-
stringedValue === 'ArrayNotContaining'
|
|
595
|
-
) {
|
|
596
|
-
if (++depth > config.maxDepth) {
|
|
597
|
-
return '[' + stringedValue + ']';
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
return (
|
|
601
|
-
stringedValue +
|
|
602
|
-
SPACE$2 +
|
|
603
|
-
'[' +
|
|
604
|
-
(0, _collections$3.printListItems)(
|
|
605
|
-
val.sample,
|
|
606
|
-
config,
|
|
607
|
-
indentation,
|
|
608
|
-
depth,
|
|
609
|
-
refs,
|
|
610
|
-
printer
|
|
611
|
-
) +
|
|
612
|
-
']'
|
|
613
|
-
);
|
|
614
|
-
}
|
|
615
|
-
|
|
616
|
-
if (
|
|
617
|
-
stringedValue === 'ObjectContaining' ||
|
|
618
|
-
stringedValue === 'ObjectNotContaining'
|
|
619
|
-
) {
|
|
620
|
-
if (++depth > config.maxDepth) {
|
|
621
|
-
return '[' + stringedValue + ']';
|
|
622
|
-
}
|
|
623
|
-
|
|
624
|
-
return (
|
|
625
|
-
stringedValue +
|
|
626
|
-
SPACE$2 +
|
|
627
|
-
'{' +
|
|
628
|
-
(0, _collections$3.printObjectProperties)(
|
|
629
|
-
val.sample,
|
|
630
|
-
config,
|
|
631
|
-
indentation,
|
|
632
|
-
depth,
|
|
633
|
-
refs,
|
|
634
|
-
printer
|
|
635
|
-
) +
|
|
636
|
-
'}'
|
|
637
|
-
);
|
|
638
|
-
}
|
|
639
|
-
|
|
640
|
-
if (
|
|
641
|
-
stringedValue === 'StringMatching' ||
|
|
642
|
-
stringedValue === 'StringNotMatching'
|
|
643
|
-
) {
|
|
644
|
-
return (
|
|
645
|
-
stringedValue +
|
|
646
|
-
SPACE$2 +
|
|
647
|
-
printer(val.sample, config, indentation, depth, refs)
|
|
648
|
-
);
|
|
649
|
-
}
|
|
650
|
-
|
|
651
|
-
if (
|
|
652
|
-
stringedValue === 'StringContaining' ||
|
|
653
|
-
stringedValue === 'StringNotContaining'
|
|
654
|
-
) {
|
|
655
|
-
return (
|
|
656
|
-
stringedValue +
|
|
657
|
-
SPACE$2 +
|
|
658
|
-
printer(val.sample, config, indentation, depth, refs)
|
|
659
|
-
);
|
|
660
|
-
}
|
|
661
|
-
|
|
662
|
-
return val.toAsymmetricMatcher();
|
|
663
|
-
};
|
|
664
|
-
|
|
665
|
-
AsymmetricMatcher$1.serialize = serialize$6;
|
|
666
|
-
|
|
667
|
-
const test$6 = val => val && val.$$typeof === asymmetricMatcher;
|
|
668
|
-
|
|
669
|
-
AsymmetricMatcher$1.test = test$6;
|
|
670
|
-
const plugin$6 = {
|
|
671
|
-
serialize: serialize$6,
|
|
672
|
-
test: test$6
|
|
673
|
-
};
|
|
674
|
-
var _default$7 = plugin$6;
|
|
675
|
-
AsymmetricMatcher$1.default = _default$7;
|
|
676
|
-
|
|
677
|
-
var ConvertAnsi = {};
|
|
678
|
-
|
|
679
|
-
var ansiRegex = ({onlyFirst = false} = {}) => {
|
|
680
|
-
const pattern = [
|
|
681
|
-
'[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)',
|
|
682
|
-
'(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))'
|
|
683
|
-
].join('|');
|
|
684
|
-
|
|
685
|
-
return new RegExp(pattern, onlyFirst ? undefined : 'g');
|
|
686
|
-
};
|
|
687
|
-
|
|
688
|
-
Object.defineProperty(ConvertAnsi, '__esModule', {
|
|
689
|
-
value: true
|
|
690
|
-
});
|
|
691
|
-
ConvertAnsi.test = ConvertAnsi.serialize = ConvertAnsi.default = void 0;
|
|
692
|
-
|
|
693
|
-
var _ansiRegex = _interopRequireDefault$2(ansiRegex);
|
|
694
|
-
|
|
695
|
-
var _ansiStyles$1 = _interopRequireDefault$2(ansiStyles.exports);
|
|
696
|
-
|
|
697
|
-
function _interopRequireDefault$2(obj) {
|
|
698
|
-
return obj && obj.__esModule ? obj : {default: obj};
|
|
699
|
-
}
|
|
700
|
-
|
|
701
|
-
/**
|
|
702
|
-
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
|
|
703
|
-
*
|
|
704
|
-
* This source code is licensed under the MIT license found in the
|
|
705
|
-
* LICENSE file in the root directory of this source tree.
|
|
706
|
-
*/
|
|
707
|
-
const toHumanReadableAnsi = text =>
|
|
708
|
-
text.replace((0, _ansiRegex.default)(), match => {
|
|
709
|
-
switch (match) {
|
|
710
|
-
case _ansiStyles$1.default.red.close:
|
|
711
|
-
case _ansiStyles$1.default.green.close:
|
|
712
|
-
case _ansiStyles$1.default.cyan.close:
|
|
713
|
-
case _ansiStyles$1.default.gray.close:
|
|
714
|
-
case _ansiStyles$1.default.white.close:
|
|
715
|
-
case _ansiStyles$1.default.yellow.close:
|
|
716
|
-
case _ansiStyles$1.default.bgRed.close:
|
|
717
|
-
case _ansiStyles$1.default.bgGreen.close:
|
|
718
|
-
case _ansiStyles$1.default.bgYellow.close:
|
|
719
|
-
case _ansiStyles$1.default.inverse.close:
|
|
720
|
-
case _ansiStyles$1.default.dim.close:
|
|
721
|
-
case _ansiStyles$1.default.bold.close:
|
|
722
|
-
case _ansiStyles$1.default.reset.open:
|
|
723
|
-
case _ansiStyles$1.default.reset.close:
|
|
724
|
-
return '</>';
|
|
725
|
-
|
|
726
|
-
case _ansiStyles$1.default.red.open:
|
|
727
|
-
return '<red>';
|
|
728
|
-
|
|
729
|
-
case _ansiStyles$1.default.green.open:
|
|
730
|
-
return '<green>';
|
|
731
|
-
|
|
732
|
-
case _ansiStyles$1.default.cyan.open:
|
|
733
|
-
return '<cyan>';
|
|
734
|
-
|
|
735
|
-
case _ansiStyles$1.default.gray.open:
|
|
736
|
-
return '<gray>';
|
|
737
|
-
|
|
738
|
-
case _ansiStyles$1.default.white.open:
|
|
739
|
-
return '<white>';
|
|
740
|
-
|
|
741
|
-
case _ansiStyles$1.default.yellow.open:
|
|
742
|
-
return '<yellow>';
|
|
743
|
-
|
|
744
|
-
case _ansiStyles$1.default.bgRed.open:
|
|
745
|
-
return '<bgRed>';
|
|
746
|
-
|
|
747
|
-
case _ansiStyles$1.default.bgGreen.open:
|
|
748
|
-
return '<bgGreen>';
|
|
749
|
-
|
|
750
|
-
case _ansiStyles$1.default.bgYellow.open:
|
|
751
|
-
return '<bgYellow>';
|
|
752
|
-
|
|
753
|
-
case _ansiStyles$1.default.inverse.open:
|
|
754
|
-
return '<inverse>';
|
|
755
|
-
|
|
756
|
-
case _ansiStyles$1.default.dim.open:
|
|
757
|
-
return '<dim>';
|
|
758
|
-
|
|
759
|
-
case _ansiStyles$1.default.bold.open:
|
|
760
|
-
return '<bold>';
|
|
761
|
-
|
|
762
|
-
default:
|
|
763
|
-
return '';
|
|
764
|
-
}
|
|
765
|
-
});
|
|
766
|
-
|
|
767
|
-
const test$5 = val =>
|
|
768
|
-
typeof val === 'string' && !!val.match((0, _ansiRegex.default)());
|
|
769
|
-
|
|
770
|
-
ConvertAnsi.test = test$5;
|
|
771
|
-
|
|
772
|
-
const serialize$5 = (val, config, indentation, depth, refs, printer) =>
|
|
773
|
-
printer(toHumanReadableAnsi(val), config, indentation, depth, refs);
|
|
774
|
-
|
|
775
|
-
ConvertAnsi.serialize = serialize$5;
|
|
776
|
-
const plugin$5 = {
|
|
777
|
-
serialize: serialize$5,
|
|
778
|
-
test: test$5
|
|
779
|
-
};
|
|
780
|
-
var _default$6 = plugin$5;
|
|
781
|
-
ConvertAnsi.default = _default$6;
|
|
782
|
-
|
|
783
|
-
var DOMCollection$1 = {};
|
|
784
|
-
|
|
785
|
-
Object.defineProperty(DOMCollection$1, '__esModule', {
|
|
786
|
-
value: true
|
|
787
|
-
});
|
|
788
|
-
DOMCollection$1.test = DOMCollection$1.serialize = DOMCollection$1.default = void 0;
|
|
789
|
-
|
|
790
|
-
var _collections$2 = collections;
|
|
791
|
-
|
|
792
|
-
/**
|
|
793
|
-
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
|
|
794
|
-
*
|
|
795
|
-
* This source code is licensed under the MIT license found in the
|
|
796
|
-
* LICENSE file in the root directory of this source tree.
|
|
797
|
-
*/
|
|
798
|
-
|
|
799
|
-
/* eslint-disable local/ban-types-eventually */
|
|
800
|
-
const SPACE$1 = ' ';
|
|
801
|
-
const OBJECT_NAMES = ['DOMStringMap', 'NamedNodeMap'];
|
|
802
|
-
const ARRAY_REGEXP = /^(HTML\w*Collection|NodeList)$/;
|
|
803
|
-
|
|
804
|
-
const testName = name =>
|
|
805
|
-
OBJECT_NAMES.indexOf(name) !== -1 || ARRAY_REGEXP.test(name);
|
|
806
|
-
|
|
807
|
-
const test$4 = val =>
|
|
808
|
-
val &&
|
|
809
|
-
val.constructor &&
|
|
810
|
-
!!val.constructor.name &&
|
|
811
|
-
testName(val.constructor.name);
|
|
812
|
-
|
|
813
|
-
DOMCollection$1.test = test$4;
|
|
814
|
-
|
|
815
|
-
const isNamedNodeMap = collection =>
|
|
816
|
-
collection.constructor.name === 'NamedNodeMap';
|
|
817
|
-
|
|
818
|
-
const serialize$4 = (collection, config, indentation, depth, refs, printer) => {
|
|
819
|
-
const name = collection.constructor.name;
|
|
820
|
-
|
|
821
|
-
if (++depth > config.maxDepth) {
|
|
822
|
-
return '[' + name + ']';
|
|
823
|
-
}
|
|
824
|
-
|
|
825
|
-
return (
|
|
826
|
-
(config.min ? '' : name + SPACE$1) +
|
|
827
|
-
(OBJECT_NAMES.indexOf(name) !== -1
|
|
828
|
-
? '{' +
|
|
829
|
-
(0, _collections$2.printObjectProperties)(
|
|
830
|
-
isNamedNodeMap(collection)
|
|
831
|
-
? Array.from(collection).reduce((props, attribute) => {
|
|
832
|
-
props[attribute.name] = attribute.value;
|
|
833
|
-
return props;
|
|
834
|
-
}, {})
|
|
835
|
-
: {...collection},
|
|
836
|
-
config,
|
|
837
|
-
indentation,
|
|
838
|
-
depth,
|
|
839
|
-
refs,
|
|
840
|
-
printer
|
|
841
|
-
) +
|
|
842
|
-
'}'
|
|
843
|
-
: '[' +
|
|
844
|
-
(0, _collections$2.printListItems)(
|
|
845
|
-
Array.from(collection),
|
|
846
|
-
config,
|
|
847
|
-
indentation,
|
|
848
|
-
depth,
|
|
849
|
-
refs,
|
|
850
|
-
printer
|
|
851
|
-
) +
|
|
852
|
-
']')
|
|
853
|
-
);
|
|
854
|
-
};
|
|
855
|
-
|
|
856
|
-
DOMCollection$1.serialize = serialize$4;
|
|
857
|
-
const plugin$4 = {
|
|
858
|
-
serialize: serialize$4,
|
|
859
|
-
test: test$4
|
|
860
|
-
};
|
|
861
|
-
var _default$5 = plugin$4;
|
|
862
|
-
DOMCollection$1.default = _default$5;
|
|
863
|
-
|
|
864
|
-
var DOMElement$1 = {};
|
|
865
|
-
|
|
866
|
-
var markup = {};
|
|
867
|
-
|
|
868
|
-
var escapeHTML$1 = {};
|
|
869
|
-
|
|
870
|
-
Object.defineProperty(escapeHTML$1, '__esModule', {
|
|
871
|
-
value: true
|
|
872
|
-
});
|
|
873
|
-
escapeHTML$1.default = escapeHTML;
|
|
874
|
-
|
|
875
|
-
/**
|
|
876
|
-
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
|
|
877
|
-
*
|
|
878
|
-
* This source code is licensed under the MIT license found in the
|
|
879
|
-
* LICENSE file in the root directory of this source tree.
|
|
880
|
-
*/
|
|
881
|
-
function escapeHTML(str) {
|
|
882
|
-
return str.replace(/</g, '<').replace(/>/g, '>');
|
|
883
|
-
}
|
|
884
|
-
|
|
885
|
-
Object.defineProperty(markup, '__esModule', {
|
|
886
|
-
value: true
|
|
887
|
-
});
|
|
888
|
-
markup.printText =
|
|
889
|
-
markup.printProps =
|
|
890
|
-
markup.printElementAsLeaf =
|
|
891
|
-
markup.printElement =
|
|
892
|
-
markup.printComment =
|
|
893
|
-
markup.printChildren =
|
|
894
|
-
void 0;
|
|
895
|
-
|
|
896
|
-
var _escapeHTML = _interopRequireDefault$1(escapeHTML$1);
|
|
897
|
-
|
|
898
|
-
function _interopRequireDefault$1(obj) {
|
|
899
|
-
return obj && obj.__esModule ? obj : {default: obj};
|
|
900
|
-
}
|
|
901
|
-
|
|
902
|
-
/**
|
|
903
|
-
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
|
|
904
|
-
*
|
|
905
|
-
* This source code is licensed under the MIT license found in the
|
|
906
|
-
* LICENSE file in the root directory of this source tree.
|
|
907
|
-
*/
|
|
908
|
-
// Return empty string if keys is empty.
|
|
909
|
-
const printProps = (keys, props, config, indentation, depth, refs, printer) => {
|
|
910
|
-
const indentationNext = indentation + config.indent;
|
|
911
|
-
const colors = config.colors;
|
|
912
|
-
return keys
|
|
913
|
-
.map(key => {
|
|
914
|
-
const value = props[key];
|
|
915
|
-
let printed = printer(value, config, indentationNext, depth, refs);
|
|
916
|
-
|
|
917
|
-
if (typeof value !== 'string') {
|
|
918
|
-
if (printed.indexOf('\n') !== -1) {
|
|
919
|
-
printed =
|
|
920
|
-
config.spacingOuter +
|
|
921
|
-
indentationNext +
|
|
922
|
-
printed +
|
|
923
|
-
config.spacingOuter +
|
|
924
|
-
indentation;
|
|
925
|
-
}
|
|
926
|
-
|
|
927
|
-
printed = '{' + printed + '}';
|
|
928
|
-
}
|
|
929
|
-
|
|
930
|
-
return (
|
|
931
|
-
config.spacingInner +
|
|
932
|
-
indentation +
|
|
933
|
-
colors.prop.open +
|
|
934
|
-
key +
|
|
935
|
-
colors.prop.close +
|
|
936
|
-
'=' +
|
|
937
|
-
colors.value.open +
|
|
938
|
-
printed +
|
|
939
|
-
colors.value.close
|
|
940
|
-
);
|
|
941
|
-
})
|
|
942
|
-
.join('');
|
|
943
|
-
}; // Return empty string if children is empty.
|
|
944
|
-
|
|
945
|
-
markup.printProps = printProps;
|
|
946
|
-
|
|
947
|
-
const printChildren = (children, config, indentation, depth, refs, printer) =>
|
|
948
|
-
children
|
|
949
|
-
.map(
|
|
950
|
-
child =>
|
|
951
|
-
config.spacingOuter +
|
|
952
|
-
indentation +
|
|
953
|
-
(typeof child === 'string'
|
|
954
|
-
? printText(child, config)
|
|
955
|
-
: printer(child, config, indentation, depth, refs))
|
|
956
|
-
)
|
|
957
|
-
.join('');
|
|
958
|
-
|
|
959
|
-
markup.printChildren = printChildren;
|
|
960
|
-
|
|
961
|
-
const printText = (text, config) => {
|
|
962
|
-
const contentColor = config.colors.content;
|
|
963
|
-
return (
|
|
964
|
-
contentColor.open + (0, _escapeHTML.default)(text) + contentColor.close
|
|
965
|
-
);
|
|
966
|
-
};
|
|
967
|
-
|
|
968
|
-
markup.printText = printText;
|
|
969
|
-
|
|
970
|
-
const printComment = (comment, config) => {
|
|
971
|
-
const commentColor = config.colors.comment;
|
|
972
|
-
return (
|
|
973
|
-
commentColor.open +
|
|
974
|
-
'<!--' +
|
|
975
|
-
(0, _escapeHTML.default)(comment) +
|
|
976
|
-
'-->' +
|
|
977
|
-
commentColor.close
|
|
978
|
-
);
|
|
979
|
-
}; // Separate the functions to format props, children, and element,
|
|
980
|
-
// so a plugin could override a particular function, if needed.
|
|
981
|
-
// Too bad, so sad: the traditional (but unnecessary) space
|
|
982
|
-
// in a self-closing tagColor requires a second test of printedProps.
|
|
983
|
-
|
|
984
|
-
markup.printComment = printComment;
|
|
985
|
-
|
|
986
|
-
const printElement = (
|
|
987
|
-
type,
|
|
988
|
-
printedProps,
|
|
989
|
-
printedChildren,
|
|
990
|
-
config,
|
|
991
|
-
indentation
|
|
992
|
-
) => {
|
|
993
|
-
const tagColor = config.colors.tag;
|
|
994
|
-
return (
|
|
995
|
-
tagColor.open +
|
|
996
|
-
'<' +
|
|
997
|
-
type +
|
|
998
|
-
(printedProps &&
|
|
999
|
-
tagColor.close +
|
|
1000
|
-
printedProps +
|
|
1001
|
-
config.spacingOuter +
|
|
1002
|
-
indentation +
|
|
1003
|
-
tagColor.open) +
|
|
1004
|
-
(printedChildren
|
|
1005
|
-
? '>' +
|
|
1006
|
-
tagColor.close +
|
|
1007
|
-
printedChildren +
|
|
1008
|
-
config.spacingOuter +
|
|
1009
|
-
indentation +
|
|
1010
|
-
tagColor.open +
|
|
1011
|
-
'</' +
|
|
1012
|
-
type
|
|
1013
|
-
: (printedProps && !config.min ? '' : ' ') + '/') +
|
|
1014
|
-
'>' +
|
|
1015
|
-
tagColor.close
|
|
1016
|
-
);
|
|
1017
|
-
};
|
|
1018
|
-
|
|
1019
|
-
markup.printElement = printElement;
|
|
1020
|
-
|
|
1021
|
-
const printElementAsLeaf = (type, config) => {
|
|
1022
|
-
const tagColor = config.colors.tag;
|
|
1023
|
-
return (
|
|
1024
|
-
tagColor.open +
|
|
1025
|
-
'<' +
|
|
1026
|
-
type +
|
|
1027
|
-
tagColor.close +
|
|
1028
|
-
' …' +
|
|
1029
|
-
tagColor.open +
|
|
1030
|
-
' />' +
|
|
1031
|
-
tagColor.close
|
|
1032
|
-
);
|
|
1033
|
-
};
|
|
1034
|
-
|
|
1035
|
-
markup.printElementAsLeaf = printElementAsLeaf;
|
|
1036
|
-
|
|
1037
|
-
Object.defineProperty(DOMElement$1, '__esModule', {
|
|
1038
|
-
value: true
|
|
1039
|
-
});
|
|
1040
|
-
DOMElement$1.test = DOMElement$1.serialize = DOMElement$1.default = void 0;
|
|
1041
|
-
|
|
1042
|
-
var _markup$2 = markup;
|
|
1043
|
-
|
|
1044
|
-
/**
|
|
1045
|
-
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
|
|
1046
|
-
*
|
|
1047
|
-
* This source code is licensed under the MIT license found in the
|
|
1048
|
-
* LICENSE file in the root directory of this source tree.
|
|
1049
|
-
*/
|
|
1050
|
-
const ELEMENT_NODE = 1;
|
|
1051
|
-
const TEXT_NODE = 3;
|
|
1052
|
-
const COMMENT_NODE = 8;
|
|
1053
|
-
const FRAGMENT_NODE = 11;
|
|
1054
|
-
const ELEMENT_REGEXP = /^((HTML|SVG)\w*)?Element$/;
|
|
1055
|
-
|
|
1056
|
-
const testHasAttribute = val => {
|
|
1057
|
-
try {
|
|
1058
|
-
return typeof val.hasAttribute === 'function' && val.hasAttribute('is');
|
|
1059
|
-
} catch {
|
|
1060
|
-
return false;
|
|
1061
|
-
}
|
|
1062
|
-
};
|
|
1063
|
-
|
|
1064
|
-
const testNode = val => {
|
|
1065
|
-
const constructorName = val.constructor.name;
|
|
1066
|
-
const {nodeType, tagName} = val;
|
|
1067
|
-
const isCustomElement =
|
|
1068
|
-
(typeof tagName === 'string' && tagName.includes('-')) ||
|
|
1069
|
-
testHasAttribute(val);
|
|
1070
|
-
return (
|
|
1071
|
-
(nodeType === ELEMENT_NODE &&
|
|
1072
|
-
(ELEMENT_REGEXP.test(constructorName) || isCustomElement)) ||
|
|
1073
|
-
(nodeType === TEXT_NODE && constructorName === 'Text') ||
|
|
1074
|
-
(nodeType === COMMENT_NODE && constructorName === 'Comment') ||
|
|
1075
|
-
(nodeType === FRAGMENT_NODE && constructorName === 'DocumentFragment')
|
|
1076
|
-
);
|
|
1077
|
-
};
|
|
1078
|
-
|
|
1079
|
-
const test$3 = val => {
|
|
1080
|
-
var _val$constructor;
|
|
1081
|
-
|
|
1082
|
-
return (
|
|
1083
|
-
(val === null || val === void 0
|
|
1084
|
-
? void 0
|
|
1085
|
-
: (_val$constructor = val.constructor) === null ||
|
|
1086
|
-
_val$constructor === void 0
|
|
1087
|
-
? void 0
|
|
1088
|
-
: _val$constructor.name) && testNode(val)
|
|
1089
|
-
);
|
|
1090
|
-
};
|
|
1091
|
-
|
|
1092
|
-
DOMElement$1.test = test$3;
|
|
1093
|
-
|
|
1094
|
-
function nodeIsText(node) {
|
|
1095
|
-
return node.nodeType === TEXT_NODE;
|
|
1096
|
-
}
|
|
1097
|
-
|
|
1098
|
-
function nodeIsComment(node) {
|
|
1099
|
-
return node.nodeType === COMMENT_NODE;
|
|
1100
|
-
}
|
|
1101
|
-
|
|
1102
|
-
function nodeIsFragment(node) {
|
|
1103
|
-
return node.nodeType === FRAGMENT_NODE;
|
|
1104
|
-
}
|
|
1105
|
-
|
|
1106
|
-
const serialize$3 = (node, config, indentation, depth, refs, printer) => {
|
|
1107
|
-
if (nodeIsText(node)) {
|
|
1108
|
-
return (0, _markup$2.printText)(node.data, config);
|
|
1109
|
-
}
|
|
1110
|
-
|
|
1111
|
-
if (nodeIsComment(node)) {
|
|
1112
|
-
return (0, _markup$2.printComment)(node.data, config);
|
|
1113
|
-
}
|
|
1114
|
-
|
|
1115
|
-
const type = nodeIsFragment(node)
|
|
1116
|
-
? `DocumentFragment`
|
|
1117
|
-
: node.tagName.toLowerCase();
|
|
1118
|
-
|
|
1119
|
-
if (++depth > config.maxDepth) {
|
|
1120
|
-
return (0, _markup$2.printElementAsLeaf)(type, config);
|
|
1121
|
-
}
|
|
1122
|
-
|
|
1123
|
-
return (0, _markup$2.printElement)(
|
|
1124
|
-
type,
|
|
1125
|
-
(0, _markup$2.printProps)(
|
|
1126
|
-
nodeIsFragment(node)
|
|
1127
|
-
? []
|
|
1128
|
-
: Array.from(node.attributes)
|
|
1129
|
-
.map(attr => attr.name)
|
|
1130
|
-
.sort(),
|
|
1131
|
-
nodeIsFragment(node)
|
|
1132
|
-
? {}
|
|
1133
|
-
: Array.from(node.attributes).reduce((props, attribute) => {
|
|
1134
|
-
props[attribute.name] = attribute.value;
|
|
1135
|
-
return props;
|
|
1136
|
-
}, {}),
|
|
1137
|
-
config,
|
|
1138
|
-
indentation + config.indent,
|
|
1139
|
-
depth,
|
|
1140
|
-
refs,
|
|
1141
|
-
printer
|
|
1142
|
-
),
|
|
1143
|
-
(0, _markup$2.printChildren)(
|
|
1144
|
-
Array.prototype.slice.call(node.childNodes || node.children),
|
|
1145
|
-
config,
|
|
1146
|
-
indentation + config.indent,
|
|
1147
|
-
depth,
|
|
1148
|
-
refs,
|
|
1149
|
-
printer
|
|
1150
|
-
),
|
|
1151
|
-
config,
|
|
1152
|
-
indentation
|
|
1153
|
-
);
|
|
1154
|
-
};
|
|
1155
|
-
|
|
1156
|
-
DOMElement$1.serialize = serialize$3;
|
|
1157
|
-
const plugin$3 = {
|
|
1158
|
-
serialize: serialize$3,
|
|
1159
|
-
test: test$3
|
|
1160
|
-
};
|
|
1161
|
-
var _default$4 = plugin$3;
|
|
1162
|
-
DOMElement$1.default = _default$4;
|
|
1163
|
-
|
|
1164
|
-
var Immutable$1 = {};
|
|
1165
|
-
|
|
1166
|
-
Object.defineProperty(Immutable$1, '__esModule', {
|
|
1167
|
-
value: true
|
|
1168
|
-
});
|
|
1169
|
-
Immutable$1.test = Immutable$1.serialize = Immutable$1.default = void 0;
|
|
1170
|
-
|
|
1171
|
-
var _collections$1 = collections;
|
|
1172
|
-
|
|
1173
|
-
/**
|
|
1174
|
-
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
|
|
1175
|
-
*
|
|
1176
|
-
* This source code is licensed under the MIT license found in the
|
|
1177
|
-
* LICENSE file in the root directory of this source tree.
|
|
1178
|
-
*/
|
|
1179
|
-
// SENTINEL constants are from https://github.com/facebook/immutable-js
|
|
1180
|
-
const IS_ITERABLE_SENTINEL = '@@__IMMUTABLE_ITERABLE__@@';
|
|
1181
|
-
const IS_LIST_SENTINEL = '@@__IMMUTABLE_LIST__@@';
|
|
1182
|
-
const IS_KEYED_SENTINEL$1 = '@@__IMMUTABLE_KEYED__@@';
|
|
1183
|
-
const IS_MAP_SENTINEL = '@@__IMMUTABLE_MAP__@@';
|
|
1184
|
-
const IS_ORDERED_SENTINEL$1 = '@@__IMMUTABLE_ORDERED__@@';
|
|
1185
|
-
const IS_RECORD_SENTINEL = '@@__IMMUTABLE_RECORD__@@'; // immutable v4
|
|
1186
|
-
|
|
1187
|
-
const IS_SEQ_SENTINEL = '@@__IMMUTABLE_SEQ__@@';
|
|
1188
|
-
const IS_SET_SENTINEL$1 = '@@__IMMUTABLE_SET__@@';
|
|
1189
|
-
const IS_STACK_SENTINEL = '@@__IMMUTABLE_STACK__@@';
|
|
1190
|
-
|
|
1191
|
-
const getImmutableName = name => 'Immutable.' + name;
|
|
1192
|
-
|
|
1193
|
-
const printAsLeaf = name => '[' + name + ']';
|
|
1194
|
-
|
|
1195
|
-
const SPACE = ' ';
|
|
1196
|
-
const LAZY = '…'; // Seq is lazy if it calls a method like filter
|
|
1197
|
-
|
|
1198
|
-
const printImmutableEntries = (
|
|
1199
|
-
val,
|
|
1200
|
-
config,
|
|
1201
|
-
indentation,
|
|
1202
|
-
depth,
|
|
1203
|
-
refs,
|
|
1204
|
-
printer,
|
|
1205
|
-
type
|
|
1206
|
-
) =>
|
|
1207
|
-
++depth > config.maxDepth
|
|
1208
|
-
? printAsLeaf(getImmutableName(type))
|
|
1209
|
-
: getImmutableName(type) +
|
|
1210
|
-
SPACE +
|
|
1211
|
-
'{' +
|
|
1212
|
-
(0, _collections$1.printIteratorEntries)(
|
|
1213
|
-
val.entries(),
|
|
1214
|
-
config,
|
|
1215
|
-
indentation,
|
|
1216
|
-
depth,
|
|
1217
|
-
refs,
|
|
1218
|
-
printer
|
|
1219
|
-
) +
|
|
1220
|
-
'}'; // Record has an entries method because it is a collection in immutable v3.
|
|
1221
|
-
// Return an iterator for Immutable Record from version v3 or v4.
|
|
1222
|
-
|
|
1223
|
-
function getRecordEntries(val) {
|
|
1224
|
-
let i = 0;
|
|
1225
|
-
return {
|
|
1226
|
-
next() {
|
|
1227
|
-
if (i < val._keys.length) {
|
|
1228
|
-
const key = val._keys[i++];
|
|
1229
|
-
return {
|
|
1230
|
-
done: false,
|
|
1231
|
-
value: [key, val.get(key)]
|
|
1232
|
-
};
|
|
1233
|
-
}
|
|
1234
|
-
|
|
1235
|
-
return {
|
|
1236
|
-
done: true,
|
|
1237
|
-
value: undefined
|
|
1238
|
-
};
|
|
1239
|
-
}
|
|
1240
|
-
};
|
|
1241
|
-
}
|
|
1242
|
-
|
|
1243
|
-
const printImmutableRecord = (
|
|
1244
|
-
val,
|
|
1245
|
-
config,
|
|
1246
|
-
indentation,
|
|
1247
|
-
depth,
|
|
1248
|
-
refs,
|
|
1249
|
-
printer
|
|
1250
|
-
) => {
|
|
1251
|
-
// _name property is defined only for an Immutable Record instance
|
|
1252
|
-
// which was constructed with a second optional descriptive name arg
|
|
1253
|
-
const name = getImmutableName(val._name || 'Record');
|
|
1254
|
-
return ++depth > config.maxDepth
|
|
1255
|
-
? printAsLeaf(name)
|
|
1256
|
-
: name +
|
|
1257
|
-
SPACE +
|
|
1258
|
-
'{' +
|
|
1259
|
-
(0, _collections$1.printIteratorEntries)(
|
|
1260
|
-
getRecordEntries(val),
|
|
1261
|
-
config,
|
|
1262
|
-
indentation,
|
|
1263
|
-
depth,
|
|
1264
|
-
refs,
|
|
1265
|
-
printer
|
|
1266
|
-
) +
|
|
1267
|
-
'}';
|
|
1268
|
-
};
|
|
1269
|
-
|
|
1270
|
-
const printImmutableSeq = (val, config, indentation, depth, refs, printer) => {
|
|
1271
|
-
const name = getImmutableName('Seq');
|
|
1272
|
-
|
|
1273
|
-
if (++depth > config.maxDepth) {
|
|
1274
|
-
return printAsLeaf(name);
|
|
1275
|
-
}
|
|
1276
|
-
|
|
1277
|
-
if (val[IS_KEYED_SENTINEL$1]) {
|
|
1278
|
-
return (
|
|
1279
|
-
name +
|
|
1280
|
-
SPACE +
|
|
1281
|
-
'{' + // from Immutable collection of entries or from ECMAScript object
|
|
1282
|
-
(val._iter || val._object
|
|
1283
|
-
? (0, _collections$1.printIteratorEntries)(
|
|
1284
|
-
val.entries(),
|
|
1285
|
-
config,
|
|
1286
|
-
indentation,
|
|
1287
|
-
depth,
|
|
1288
|
-
refs,
|
|
1289
|
-
printer
|
|
1290
|
-
)
|
|
1291
|
-
: LAZY) +
|
|
1292
|
-
'}'
|
|
1293
|
-
);
|
|
1294
|
-
}
|
|
1295
|
-
|
|
1296
|
-
return (
|
|
1297
|
-
name +
|
|
1298
|
-
SPACE +
|
|
1299
|
-
'[' +
|
|
1300
|
-
(val._iter || // from Immutable collection of values
|
|
1301
|
-
val._array || // from ECMAScript array
|
|
1302
|
-
val._collection || // from ECMAScript collection in immutable v4
|
|
1303
|
-
val._iterable // from ECMAScript collection in immutable v3
|
|
1304
|
-
? (0, _collections$1.printIteratorValues)(
|
|
1305
|
-
val.values(),
|
|
1306
|
-
config,
|
|
1307
|
-
indentation,
|
|
1308
|
-
depth,
|
|
1309
|
-
refs,
|
|
1310
|
-
printer
|
|
1311
|
-
)
|
|
1312
|
-
: LAZY) +
|
|
1313
|
-
']'
|
|
1314
|
-
);
|
|
1315
|
-
};
|
|
1316
|
-
|
|
1317
|
-
const printImmutableValues = (
|
|
1318
|
-
val,
|
|
1319
|
-
config,
|
|
1320
|
-
indentation,
|
|
1321
|
-
depth,
|
|
1322
|
-
refs,
|
|
1323
|
-
printer,
|
|
1324
|
-
type
|
|
1325
|
-
) =>
|
|
1326
|
-
++depth > config.maxDepth
|
|
1327
|
-
? printAsLeaf(getImmutableName(type))
|
|
1328
|
-
: getImmutableName(type) +
|
|
1329
|
-
SPACE +
|
|
1330
|
-
'[' +
|
|
1331
|
-
(0, _collections$1.printIteratorValues)(
|
|
1332
|
-
val.values(),
|
|
1333
|
-
config,
|
|
1334
|
-
indentation,
|
|
1335
|
-
depth,
|
|
1336
|
-
refs,
|
|
1337
|
-
printer
|
|
1338
|
-
) +
|
|
1339
|
-
']';
|
|
1340
|
-
|
|
1341
|
-
const serialize$2 = (val, config, indentation, depth, refs, printer) => {
|
|
1342
|
-
if (val[IS_MAP_SENTINEL]) {
|
|
1343
|
-
return printImmutableEntries(
|
|
1344
|
-
val,
|
|
1345
|
-
config,
|
|
1346
|
-
indentation,
|
|
1347
|
-
depth,
|
|
1348
|
-
refs,
|
|
1349
|
-
printer,
|
|
1350
|
-
val[IS_ORDERED_SENTINEL$1] ? 'OrderedMap' : 'Map'
|
|
1351
|
-
);
|
|
1352
|
-
}
|
|
1353
|
-
|
|
1354
|
-
if (val[IS_LIST_SENTINEL]) {
|
|
1355
|
-
return printImmutableValues(
|
|
1356
|
-
val,
|
|
1357
|
-
config,
|
|
1358
|
-
indentation,
|
|
1359
|
-
depth,
|
|
1360
|
-
refs,
|
|
1361
|
-
printer,
|
|
1362
|
-
'List'
|
|
1363
|
-
);
|
|
1364
|
-
}
|
|
1365
|
-
|
|
1366
|
-
if (val[IS_SET_SENTINEL$1]) {
|
|
1367
|
-
return printImmutableValues(
|
|
1368
|
-
val,
|
|
1369
|
-
config,
|
|
1370
|
-
indentation,
|
|
1371
|
-
depth,
|
|
1372
|
-
refs,
|
|
1373
|
-
printer,
|
|
1374
|
-
val[IS_ORDERED_SENTINEL$1] ? 'OrderedSet' : 'Set'
|
|
1375
|
-
);
|
|
1376
|
-
}
|
|
1377
|
-
|
|
1378
|
-
if (val[IS_STACK_SENTINEL]) {
|
|
1379
|
-
return printImmutableValues(
|
|
1380
|
-
val,
|
|
1381
|
-
config,
|
|
1382
|
-
indentation,
|
|
1383
|
-
depth,
|
|
1384
|
-
refs,
|
|
1385
|
-
printer,
|
|
1386
|
-
'Stack'
|
|
1387
|
-
);
|
|
1388
|
-
}
|
|
1389
|
-
|
|
1390
|
-
if (val[IS_SEQ_SENTINEL]) {
|
|
1391
|
-
return printImmutableSeq(val, config, indentation, depth, refs, printer);
|
|
1392
|
-
} // For compatibility with immutable v3 and v4, let record be the default.
|
|
1393
|
-
|
|
1394
|
-
return printImmutableRecord(val, config, indentation, depth, refs, printer);
|
|
1395
|
-
}; // Explicitly comparing sentinel properties to true avoids false positive
|
|
1396
|
-
// when mock identity-obj-proxy returns the key as the value for any key.
|
|
1397
|
-
|
|
1398
|
-
Immutable$1.serialize = serialize$2;
|
|
1399
|
-
|
|
1400
|
-
const test$2 = val =>
|
|
1401
|
-
val &&
|
|
1402
|
-
(val[IS_ITERABLE_SENTINEL] === true || val[IS_RECORD_SENTINEL] === true);
|
|
1403
|
-
|
|
1404
|
-
Immutable$1.test = test$2;
|
|
1405
|
-
const plugin$2 = {
|
|
1406
|
-
serialize: serialize$2,
|
|
1407
|
-
test: test$2
|
|
1408
|
-
};
|
|
1409
|
-
var _default$3 = plugin$2;
|
|
1410
|
-
Immutable$1.default = _default$3;
|
|
1411
|
-
|
|
1412
|
-
var ReactElement$1 = {};
|
|
1413
|
-
|
|
1414
|
-
var reactIs = {exports: {}};
|
|
1415
|
-
|
|
1416
|
-
var reactIs_production_min = {};
|
|
1417
|
-
|
|
1418
|
-
/** @license React v17.0.2
|
|
1419
|
-
* react-is.production.min.js
|
|
1420
|
-
*
|
|
1421
|
-
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
1422
|
-
*
|
|
1423
|
-
* This source code is licensed under the MIT license found in the
|
|
1424
|
-
* LICENSE file in the root directory of this source tree.
|
|
1425
|
-
*/
|
|
1426
|
-
var b=60103,c=60106,d=60107,e=60108,f=60114,g=60109,h=60110,k=60112,l=60113,m=60120,n=60115,p=60116,q=60121,r=60122,u=60117,v=60129,w=60131;
|
|
1427
|
-
if("function"===typeof Symbol&&Symbol.for){var x=Symbol.for;b=x("react.element");c=x("react.portal");d=x("react.fragment");e=x("react.strict_mode");f=x("react.profiler");g=x("react.provider");h=x("react.context");k=x("react.forward_ref");l=x("react.suspense");m=x("react.suspense_list");n=x("react.memo");p=x("react.lazy");q=x("react.block");r=x("react.server.block");u=x("react.fundamental");v=x("react.debug_trace_mode");w=x("react.legacy_hidden");}
|
|
1428
|
-
function y(a){if("object"===typeof a&&null!==a){var t=a.$$typeof;switch(t){case b:switch(a=a.type,a){case d:case f:case e:case l:case m:return a;default:switch(a=a&&a.$$typeof,a){case h:case k:case p:case n:case g:return a;default:return t}}case c:return t}}}var z=g,A=b,B=k,C=d,D=p,E=n,F=c,G=f,H=e,I=l;reactIs_production_min.ContextConsumer=h;reactIs_production_min.ContextProvider=z;reactIs_production_min.Element=A;reactIs_production_min.ForwardRef=B;reactIs_production_min.Fragment=C;reactIs_production_min.Lazy=D;reactIs_production_min.Memo=E;reactIs_production_min.Portal=F;reactIs_production_min.Profiler=G;reactIs_production_min.StrictMode=H;
|
|
1429
|
-
reactIs_production_min.Suspense=I;reactIs_production_min.isAsyncMode=function(){return !1};reactIs_production_min.isConcurrentMode=function(){return !1};reactIs_production_min.isContextConsumer=function(a){return y(a)===h};reactIs_production_min.isContextProvider=function(a){return y(a)===g};reactIs_production_min.isElement=function(a){return "object"===typeof a&&null!==a&&a.$$typeof===b};reactIs_production_min.isForwardRef=function(a){return y(a)===k};reactIs_production_min.isFragment=function(a){return y(a)===d};reactIs_production_min.isLazy=function(a){return y(a)===p};reactIs_production_min.isMemo=function(a){return y(a)===n};
|
|
1430
|
-
reactIs_production_min.isPortal=function(a){return y(a)===c};reactIs_production_min.isProfiler=function(a){return y(a)===f};reactIs_production_min.isStrictMode=function(a){return y(a)===e};reactIs_production_min.isSuspense=function(a){return y(a)===l};reactIs_production_min.isValidElementType=function(a){return "string"===typeof a||"function"===typeof a||a===d||a===f||a===v||a===e||a===l||a===m||a===w||"object"===typeof a&&null!==a&&(a.$$typeof===p||a.$$typeof===n||a.$$typeof===g||a.$$typeof===h||a.$$typeof===k||a.$$typeof===u||a.$$typeof===q||a[0]===r)?!0:!1};
|
|
1431
|
-
reactIs_production_min.typeOf=y;
|
|
1432
|
-
|
|
1433
|
-
var reactIs_development = {};
|
|
1434
|
-
|
|
1435
|
-
/** @license React v17.0.2
|
|
1436
|
-
* react-is.development.js
|
|
1437
|
-
*
|
|
1438
|
-
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
1439
|
-
*
|
|
1440
|
-
* This source code is licensed under the MIT license found in the
|
|
1441
|
-
* LICENSE file in the root directory of this source tree.
|
|
1442
|
-
*/
|
|
1443
|
-
|
|
1444
|
-
if (process.env.NODE_ENV !== "production") {
|
|
1445
|
-
(function() {
|
|
1446
|
-
|
|
1447
|
-
// ATTENTION
|
|
1448
|
-
// When adding new symbols to this file,
|
|
1449
|
-
// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'
|
|
1450
|
-
// The Symbol used to tag the ReactElement-like types. If there is no native Symbol
|
|
1451
|
-
// nor polyfill, then a plain number is used for performance.
|
|
1452
|
-
var REACT_ELEMENT_TYPE = 0xeac7;
|
|
1453
|
-
var REACT_PORTAL_TYPE = 0xeaca;
|
|
1454
|
-
var REACT_FRAGMENT_TYPE = 0xeacb;
|
|
1455
|
-
var REACT_STRICT_MODE_TYPE = 0xeacc;
|
|
1456
|
-
var REACT_PROFILER_TYPE = 0xead2;
|
|
1457
|
-
var REACT_PROVIDER_TYPE = 0xeacd;
|
|
1458
|
-
var REACT_CONTEXT_TYPE = 0xeace;
|
|
1459
|
-
var REACT_FORWARD_REF_TYPE = 0xead0;
|
|
1460
|
-
var REACT_SUSPENSE_TYPE = 0xead1;
|
|
1461
|
-
var REACT_SUSPENSE_LIST_TYPE = 0xead8;
|
|
1462
|
-
var REACT_MEMO_TYPE = 0xead3;
|
|
1463
|
-
var REACT_LAZY_TYPE = 0xead4;
|
|
1464
|
-
var REACT_BLOCK_TYPE = 0xead9;
|
|
1465
|
-
var REACT_SERVER_BLOCK_TYPE = 0xeada;
|
|
1466
|
-
var REACT_FUNDAMENTAL_TYPE = 0xead5;
|
|
1467
|
-
var REACT_DEBUG_TRACING_MODE_TYPE = 0xeae1;
|
|
1468
|
-
var REACT_LEGACY_HIDDEN_TYPE = 0xeae3;
|
|
1469
|
-
|
|
1470
|
-
if (typeof Symbol === 'function' && Symbol.for) {
|
|
1471
|
-
var symbolFor = Symbol.for;
|
|
1472
|
-
REACT_ELEMENT_TYPE = symbolFor('react.element');
|
|
1473
|
-
REACT_PORTAL_TYPE = symbolFor('react.portal');
|
|
1474
|
-
REACT_FRAGMENT_TYPE = symbolFor('react.fragment');
|
|
1475
|
-
REACT_STRICT_MODE_TYPE = symbolFor('react.strict_mode');
|
|
1476
|
-
REACT_PROFILER_TYPE = symbolFor('react.profiler');
|
|
1477
|
-
REACT_PROVIDER_TYPE = symbolFor('react.provider');
|
|
1478
|
-
REACT_CONTEXT_TYPE = symbolFor('react.context');
|
|
1479
|
-
REACT_FORWARD_REF_TYPE = symbolFor('react.forward_ref');
|
|
1480
|
-
REACT_SUSPENSE_TYPE = symbolFor('react.suspense');
|
|
1481
|
-
REACT_SUSPENSE_LIST_TYPE = symbolFor('react.suspense_list');
|
|
1482
|
-
REACT_MEMO_TYPE = symbolFor('react.memo');
|
|
1483
|
-
REACT_LAZY_TYPE = symbolFor('react.lazy');
|
|
1484
|
-
REACT_BLOCK_TYPE = symbolFor('react.block');
|
|
1485
|
-
REACT_SERVER_BLOCK_TYPE = symbolFor('react.server.block');
|
|
1486
|
-
REACT_FUNDAMENTAL_TYPE = symbolFor('react.fundamental');
|
|
1487
|
-
symbolFor('react.scope');
|
|
1488
|
-
symbolFor('react.opaque.id');
|
|
1489
|
-
REACT_DEBUG_TRACING_MODE_TYPE = symbolFor('react.debug_trace_mode');
|
|
1490
|
-
symbolFor('react.offscreen');
|
|
1491
|
-
REACT_LEGACY_HIDDEN_TYPE = symbolFor('react.legacy_hidden');
|
|
1492
|
-
}
|
|
1493
|
-
|
|
1494
|
-
// Filter certain DOM attributes (e.g. src, href) if their values are empty strings.
|
|
1495
|
-
|
|
1496
|
-
var enableScopeAPI = false; // Experimental Create Event Handle API.
|
|
1497
|
-
|
|
1498
|
-
function isValidElementType(type) {
|
|
1499
|
-
if (typeof type === 'string' || typeof type === 'function') {
|
|
1500
|
-
return true;
|
|
1501
|
-
} // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill).
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || type === REACT_DEBUG_TRACING_MODE_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || type === REACT_LEGACY_HIDDEN_TYPE || enableScopeAPI ) {
|
|
1505
|
-
return true;
|
|
1506
|
-
}
|
|
1507
|
-
|
|
1508
|
-
if (typeof type === 'object' && type !== null) {
|
|
1509
|
-
if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_BLOCK_TYPE || type[0] === REACT_SERVER_BLOCK_TYPE) {
|
|
1510
|
-
return true;
|
|
1511
|
-
}
|
|
1512
|
-
}
|
|
1513
|
-
|
|
1514
|
-
return false;
|
|
1515
|
-
}
|
|
1516
|
-
|
|
1517
|
-
function typeOf(object) {
|
|
1518
|
-
if (typeof object === 'object' && object !== null) {
|
|
1519
|
-
var $$typeof = object.$$typeof;
|
|
1520
|
-
|
|
1521
|
-
switch ($$typeof) {
|
|
1522
|
-
case REACT_ELEMENT_TYPE:
|
|
1523
|
-
var type = object.type;
|
|
1524
|
-
|
|
1525
|
-
switch (type) {
|
|
1526
|
-
case REACT_FRAGMENT_TYPE:
|
|
1527
|
-
case REACT_PROFILER_TYPE:
|
|
1528
|
-
case REACT_STRICT_MODE_TYPE:
|
|
1529
|
-
case REACT_SUSPENSE_TYPE:
|
|
1530
|
-
case REACT_SUSPENSE_LIST_TYPE:
|
|
1531
|
-
return type;
|
|
1532
|
-
|
|
1533
|
-
default:
|
|
1534
|
-
var $$typeofType = type && type.$$typeof;
|
|
1535
|
-
|
|
1536
|
-
switch ($$typeofType) {
|
|
1537
|
-
case REACT_CONTEXT_TYPE:
|
|
1538
|
-
case REACT_FORWARD_REF_TYPE:
|
|
1539
|
-
case REACT_LAZY_TYPE:
|
|
1540
|
-
case REACT_MEMO_TYPE:
|
|
1541
|
-
case REACT_PROVIDER_TYPE:
|
|
1542
|
-
return $$typeofType;
|
|
1543
|
-
|
|
1544
|
-
default:
|
|
1545
|
-
return $$typeof;
|
|
1546
|
-
}
|
|
1547
|
-
|
|
1548
|
-
}
|
|
1549
|
-
|
|
1550
|
-
case REACT_PORTAL_TYPE:
|
|
1551
|
-
return $$typeof;
|
|
1552
|
-
}
|
|
1553
|
-
}
|
|
1554
|
-
|
|
1555
|
-
return undefined;
|
|
1556
|
-
}
|
|
1557
|
-
var ContextConsumer = REACT_CONTEXT_TYPE;
|
|
1558
|
-
var ContextProvider = REACT_PROVIDER_TYPE;
|
|
1559
|
-
var Element = REACT_ELEMENT_TYPE;
|
|
1560
|
-
var ForwardRef = REACT_FORWARD_REF_TYPE;
|
|
1561
|
-
var Fragment = REACT_FRAGMENT_TYPE;
|
|
1562
|
-
var Lazy = REACT_LAZY_TYPE;
|
|
1563
|
-
var Memo = REACT_MEMO_TYPE;
|
|
1564
|
-
var Portal = REACT_PORTAL_TYPE;
|
|
1565
|
-
var Profiler = REACT_PROFILER_TYPE;
|
|
1566
|
-
var StrictMode = REACT_STRICT_MODE_TYPE;
|
|
1567
|
-
var Suspense = REACT_SUSPENSE_TYPE;
|
|
1568
|
-
var hasWarnedAboutDeprecatedIsAsyncMode = false;
|
|
1569
|
-
var hasWarnedAboutDeprecatedIsConcurrentMode = false; // AsyncMode should be deprecated
|
|
1570
|
-
|
|
1571
|
-
function isAsyncMode(object) {
|
|
1572
|
-
{
|
|
1573
|
-
if (!hasWarnedAboutDeprecatedIsAsyncMode) {
|
|
1574
|
-
hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint
|
|
1575
|
-
|
|
1576
|
-
console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 18+.');
|
|
1577
|
-
}
|
|
1578
|
-
}
|
|
1579
|
-
|
|
1580
|
-
return false;
|
|
1581
|
-
}
|
|
1582
|
-
function isConcurrentMode(object) {
|
|
1583
|
-
{
|
|
1584
|
-
if (!hasWarnedAboutDeprecatedIsConcurrentMode) {
|
|
1585
|
-
hasWarnedAboutDeprecatedIsConcurrentMode = true; // Using console['warn'] to evade Babel and ESLint
|
|
1586
|
-
|
|
1587
|
-
console['warn']('The ReactIs.isConcurrentMode() alias has been deprecated, ' + 'and will be removed in React 18+.');
|
|
1588
|
-
}
|
|
1589
|
-
}
|
|
1590
|
-
|
|
1591
|
-
return false;
|
|
1592
|
-
}
|
|
1593
|
-
function isContextConsumer(object) {
|
|
1594
|
-
return typeOf(object) === REACT_CONTEXT_TYPE;
|
|
1595
|
-
}
|
|
1596
|
-
function isContextProvider(object) {
|
|
1597
|
-
return typeOf(object) === REACT_PROVIDER_TYPE;
|
|
1598
|
-
}
|
|
1599
|
-
function isElement(object) {
|
|
1600
|
-
return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;
|
|
1601
|
-
}
|
|
1602
|
-
function isForwardRef(object) {
|
|
1603
|
-
return typeOf(object) === REACT_FORWARD_REF_TYPE;
|
|
1604
|
-
}
|
|
1605
|
-
function isFragment(object) {
|
|
1606
|
-
return typeOf(object) === REACT_FRAGMENT_TYPE;
|
|
1607
|
-
}
|
|
1608
|
-
function isLazy(object) {
|
|
1609
|
-
return typeOf(object) === REACT_LAZY_TYPE;
|
|
1610
|
-
}
|
|
1611
|
-
function isMemo(object) {
|
|
1612
|
-
return typeOf(object) === REACT_MEMO_TYPE;
|
|
1613
|
-
}
|
|
1614
|
-
function isPortal(object) {
|
|
1615
|
-
return typeOf(object) === REACT_PORTAL_TYPE;
|
|
1616
|
-
}
|
|
1617
|
-
function isProfiler(object) {
|
|
1618
|
-
return typeOf(object) === REACT_PROFILER_TYPE;
|
|
1619
|
-
}
|
|
1620
|
-
function isStrictMode(object) {
|
|
1621
|
-
return typeOf(object) === REACT_STRICT_MODE_TYPE;
|
|
1622
|
-
}
|
|
1623
|
-
function isSuspense(object) {
|
|
1624
|
-
return typeOf(object) === REACT_SUSPENSE_TYPE;
|
|
1625
|
-
}
|
|
1626
|
-
|
|
1627
|
-
reactIs_development.ContextConsumer = ContextConsumer;
|
|
1628
|
-
reactIs_development.ContextProvider = ContextProvider;
|
|
1629
|
-
reactIs_development.Element = Element;
|
|
1630
|
-
reactIs_development.ForwardRef = ForwardRef;
|
|
1631
|
-
reactIs_development.Fragment = Fragment;
|
|
1632
|
-
reactIs_development.Lazy = Lazy;
|
|
1633
|
-
reactIs_development.Memo = Memo;
|
|
1634
|
-
reactIs_development.Portal = Portal;
|
|
1635
|
-
reactIs_development.Profiler = Profiler;
|
|
1636
|
-
reactIs_development.StrictMode = StrictMode;
|
|
1637
|
-
reactIs_development.Suspense = Suspense;
|
|
1638
|
-
reactIs_development.isAsyncMode = isAsyncMode;
|
|
1639
|
-
reactIs_development.isConcurrentMode = isConcurrentMode;
|
|
1640
|
-
reactIs_development.isContextConsumer = isContextConsumer;
|
|
1641
|
-
reactIs_development.isContextProvider = isContextProvider;
|
|
1642
|
-
reactIs_development.isElement = isElement;
|
|
1643
|
-
reactIs_development.isForwardRef = isForwardRef;
|
|
1644
|
-
reactIs_development.isFragment = isFragment;
|
|
1645
|
-
reactIs_development.isLazy = isLazy;
|
|
1646
|
-
reactIs_development.isMemo = isMemo;
|
|
1647
|
-
reactIs_development.isPortal = isPortal;
|
|
1648
|
-
reactIs_development.isProfiler = isProfiler;
|
|
1649
|
-
reactIs_development.isStrictMode = isStrictMode;
|
|
1650
|
-
reactIs_development.isSuspense = isSuspense;
|
|
1651
|
-
reactIs_development.isValidElementType = isValidElementType;
|
|
1652
|
-
reactIs_development.typeOf = typeOf;
|
|
1653
|
-
})();
|
|
1654
|
-
}
|
|
1655
|
-
|
|
1656
|
-
if (process.env.NODE_ENV === 'production') {
|
|
1657
|
-
reactIs.exports = reactIs_production_min;
|
|
1658
|
-
} else {
|
|
1659
|
-
reactIs.exports = reactIs_development;
|
|
1660
|
-
}
|
|
1661
|
-
|
|
1662
|
-
Object.defineProperty(ReactElement$1, '__esModule', {
|
|
1663
|
-
value: true
|
|
1664
|
-
});
|
|
1665
|
-
ReactElement$1.test = ReactElement$1.serialize = ReactElement$1.default = void 0;
|
|
1666
|
-
|
|
1667
|
-
var ReactIs = _interopRequireWildcard(reactIs.exports);
|
|
1668
|
-
|
|
1669
|
-
var _markup$1 = markup;
|
|
1670
|
-
|
|
1671
|
-
function _getRequireWildcardCache(nodeInterop) {
|
|
1672
|
-
if (typeof WeakMap !== 'function') return null;
|
|
1673
|
-
var cacheBabelInterop = new WeakMap();
|
|
1674
|
-
var cacheNodeInterop = new WeakMap();
|
|
1675
|
-
return (_getRequireWildcardCache = function (nodeInterop) {
|
|
1676
|
-
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
1677
|
-
})(nodeInterop);
|
|
1678
|
-
}
|
|
1679
|
-
|
|
1680
|
-
function _interopRequireWildcard(obj, nodeInterop) {
|
|
1681
|
-
if (!nodeInterop && obj && obj.__esModule) {
|
|
1682
|
-
return obj;
|
|
1683
|
-
}
|
|
1684
|
-
if (obj === null || (typeof obj !== 'object' && typeof obj !== 'function')) {
|
|
1685
|
-
return {default: obj};
|
|
1686
|
-
}
|
|
1687
|
-
var cache = _getRequireWildcardCache(nodeInterop);
|
|
1688
|
-
if (cache && cache.has(obj)) {
|
|
1689
|
-
return cache.get(obj);
|
|
1690
|
-
}
|
|
1691
|
-
var newObj = {};
|
|
1692
|
-
var hasPropertyDescriptor =
|
|
1693
|
-
Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
1694
|
-
for (var key in obj) {
|
|
1695
|
-
if (key !== 'default' && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
1696
|
-
var desc = hasPropertyDescriptor
|
|
1697
|
-
? Object.getOwnPropertyDescriptor(obj, key)
|
|
1698
|
-
: null;
|
|
1699
|
-
if (desc && (desc.get || desc.set)) {
|
|
1700
|
-
Object.defineProperty(newObj, key, desc);
|
|
1701
|
-
} else {
|
|
1702
|
-
newObj[key] = obj[key];
|
|
1703
|
-
}
|
|
1704
|
-
}
|
|
1705
|
-
}
|
|
1706
|
-
newObj.default = obj;
|
|
1707
|
-
if (cache) {
|
|
1708
|
-
cache.set(obj, newObj);
|
|
1709
|
-
}
|
|
1710
|
-
return newObj;
|
|
1711
|
-
}
|
|
1712
|
-
|
|
1713
|
-
/**
|
|
1714
|
-
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
|
|
1715
|
-
*
|
|
1716
|
-
* This source code is licensed under the MIT license found in the
|
|
1717
|
-
* LICENSE file in the root directory of this source tree.
|
|
1718
|
-
*/
|
|
1719
|
-
// Given element.props.children, or subtree during recursive traversal,
|
|
1720
|
-
// return flattened array of children.
|
|
1721
|
-
const getChildren = (arg, children = []) => {
|
|
1722
|
-
if (Array.isArray(arg)) {
|
|
1723
|
-
arg.forEach(item => {
|
|
1724
|
-
getChildren(item, children);
|
|
1725
|
-
});
|
|
1726
|
-
} else if (arg != null && arg !== false) {
|
|
1727
|
-
children.push(arg);
|
|
1728
|
-
}
|
|
1729
|
-
|
|
1730
|
-
return children;
|
|
1731
|
-
};
|
|
1732
|
-
|
|
1733
|
-
const getType = element => {
|
|
1734
|
-
const type = element.type;
|
|
1735
|
-
|
|
1736
|
-
if (typeof type === 'string') {
|
|
1737
|
-
return type;
|
|
1738
|
-
}
|
|
1739
|
-
|
|
1740
|
-
if (typeof type === 'function') {
|
|
1741
|
-
return type.displayName || type.name || 'Unknown';
|
|
1742
|
-
}
|
|
1743
|
-
|
|
1744
|
-
if (ReactIs.isFragment(element)) {
|
|
1745
|
-
return 'React.Fragment';
|
|
1746
|
-
}
|
|
1747
|
-
|
|
1748
|
-
if (ReactIs.isSuspense(element)) {
|
|
1749
|
-
return 'React.Suspense';
|
|
1750
|
-
}
|
|
1751
|
-
|
|
1752
|
-
if (typeof type === 'object' && type !== null) {
|
|
1753
|
-
if (ReactIs.isContextProvider(element)) {
|
|
1754
|
-
return 'Context.Provider';
|
|
1755
|
-
}
|
|
1756
|
-
|
|
1757
|
-
if (ReactIs.isContextConsumer(element)) {
|
|
1758
|
-
return 'Context.Consumer';
|
|
1759
|
-
}
|
|
1760
|
-
|
|
1761
|
-
if (ReactIs.isForwardRef(element)) {
|
|
1762
|
-
if (type.displayName) {
|
|
1763
|
-
return type.displayName;
|
|
1764
|
-
}
|
|
1765
|
-
|
|
1766
|
-
const functionName = type.render.displayName || type.render.name || '';
|
|
1767
|
-
return functionName !== ''
|
|
1768
|
-
? 'ForwardRef(' + functionName + ')'
|
|
1769
|
-
: 'ForwardRef';
|
|
1770
|
-
}
|
|
1771
|
-
|
|
1772
|
-
if (ReactIs.isMemo(element)) {
|
|
1773
|
-
const functionName =
|
|
1774
|
-
type.displayName || type.type.displayName || type.type.name || '';
|
|
1775
|
-
return functionName !== '' ? 'Memo(' + functionName + ')' : 'Memo';
|
|
1776
|
-
}
|
|
1777
|
-
}
|
|
1778
|
-
|
|
1779
|
-
return 'UNDEFINED';
|
|
1780
|
-
};
|
|
1781
|
-
|
|
1782
|
-
const getPropKeys$1 = element => {
|
|
1783
|
-
const {props} = element;
|
|
1784
|
-
return Object.keys(props)
|
|
1785
|
-
.filter(key => key !== 'children' && props[key] !== undefined)
|
|
1786
|
-
.sort();
|
|
1787
|
-
};
|
|
1788
|
-
|
|
1789
|
-
const serialize$1 = (element, config, indentation, depth, refs, printer) =>
|
|
1790
|
-
++depth > config.maxDepth
|
|
1791
|
-
? (0, _markup$1.printElementAsLeaf)(getType(element), config)
|
|
1792
|
-
: (0, _markup$1.printElement)(
|
|
1793
|
-
getType(element),
|
|
1794
|
-
(0, _markup$1.printProps)(
|
|
1795
|
-
getPropKeys$1(element),
|
|
1796
|
-
element.props,
|
|
1797
|
-
config,
|
|
1798
|
-
indentation + config.indent,
|
|
1799
|
-
depth,
|
|
1800
|
-
refs,
|
|
1801
|
-
printer
|
|
1802
|
-
),
|
|
1803
|
-
(0, _markup$1.printChildren)(
|
|
1804
|
-
getChildren(element.props.children),
|
|
1805
|
-
config,
|
|
1806
|
-
indentation + config.indent,
|
|
1807
|
-
depth,
|
|
1808
|
-
refs,
|
|
1809
|
-
printer
|
|
1810
|
-
),
|
|
1811
|
-
config,
|
|
1812
|
-
indentation
|
|
1813
|
-
);
|
|
1814
|
-
|
|
1815
|
-
ReactElement$1.serialize = serialize$1;
|
|
1816
|
-
|
|
1817
|
-
const test$1 = val => val != null && ReactIs.isElement(val);
|
|
1818
|
-
|
|
1819
|
-
ReactElement$1.test = test$1;
|
|
1820
|
-
const plugin$1 = {
|
|
1821
|
-
serialize: serialize$1,
|
|
1822
|
-
test: test$1
|
|
1823
|
-
};
|
|
1824
|
-
var _default$2 = plugin$1;
|
|
1825
|
-
ReactElement$1.default = _default$2;
|
|
1826
|
-
|
|
1827
|
-
var ReactTestComponent$1 = {};
|
|
1828
|
-
|
|
1829
|
-
Object.defineProperty(ReactTestComponent$1, '__esModule', {
|
|
1830
|
-
value: true
|
|
1831
|
-
});
|
|
1832
|
-
ReactTestComponent$1.test = ReactTestComponent$1.serialize = ReactTestComponent$1.default = void 0;
|
|
1833
|
-
|
|
1834
|
-
var _markup = markup;
|
|
1835
|
-
|
|
1836
|
-
var global$1 = (function () {
|
|
1837
|
-
if (typeof globalThis !== 'undefined') {
|
|
1838
|
-
return globalThis;
|
|
1839
|
-
} else if (typeof global$1 !== 'undefined') {
|
|
1840
|
-
return global$1;
|
|
1841
|
-
} else if (typeof self !== 'undefined') {
|
|
1842
|
-
return self;
|
|
1843
|
-
} else if (typeof window !== 'undefined') {
|
|
1844
|
-
return window;
|
|
1845
|
-
} else {
|
|
1846
|
-
return Function('return this')();
|
|
1847
|
-
}
|
|
1848
|
-
})();
|
|
1849
|
-
|
|
1850
|
-
var Symbol$1 = global$1['jest-symbol-do-not-touch'] || global$1.Symbol;
|
|
1851
|
-
const testSymbol =
|
|
1852
|
-
typeof Symbol$1 === 'function' && Symbol$1.for
|
|
1853
|
-
? Symbol$1.for('react.test.json')
|
|
1854
|
-
: 0xea71357;
|
|
1855
|
-
|
|
1856
|
-
const getPropKeys = object => {
|
|
1857
|
-
const {props} = object;
|
|
1858
|
-
return props
|
|
1859
|
-
? Object.keys(props)
|
|
1860
|
-
.filter(key => props[key] !== undefined)
|
|
1861
|
-
.sort()
|
|
1862
|
-
: [];
|
|
1863
|
-
};
|
|
1864
|
-
|
|
1865
|
-
const serialize = (object, config, indentation, depth, refs, printer) =>
|
|
1866
|
-
++depth > config.maxDepth
|
|
1867
|
-
? (0, _markup.printElementAsLeaf)(object.type, config)
|
|
1868
|
-
: (0, _markup.printElement)(
|
|
1869
|
-
object.type,
|
|
1870
|
-
object.props
|
|
1871
|
-
? (0, _markup.printProps)(
|
|
1872
|
-
getPropKeys(object),
|
|
1873
|
-
object.props,
|
|
1874
|
-
config,
|
|
1875
|
-
indentation + config.indent,
|
|
1876
|
-
depth,
|
|
1877
|
-
refs,
|
|
1878
|
-
printer
|
|
1879
|
-
)
|
|
1880
|
-
: '',
|
|
1881
|
-
object.children
|
|
1882
|
-
? (0, _markup.printChildren)(
|
|
1883
|
-
object.children,
|
|
1884
|
-
config,
|
|
1885
|
-
indentation + config.indent,
|
|
1886
|
-
depth,
|
|
1887
|
-
refs,
|
|
1888
|
-
printer
|
|
1889
|
-
)
|
|
1890
|
-
: '',
|
|
1891
|
-
config,
|
|
1892
|
-
indentation
|
|
1893
|
-
);
|
|
1894
|
-
|
|
1895
|
-
ReactTestComponent$1.serialize = serialize;
|
|
1896
|
-
|
|
1897
|
-
const test = val => val && val.$$typeof === testSymbol;
|
|
1898
|
-
|
|
1899
|
-
ReactTestComponent$1.test = test;
|
|
1900
|
-
const plugin = {
|
|
1901
|
-
serialize,
|
|
1902
|
-
test
|
|
1903
|
-
};
|
|
1904
|
-
var _default$1 = plugin;
|
|
1905
|
-
ReactTestComponent$1.default = _default$1;
|
|
1906
|
-
|
|
1907
|
-
Object.defineProperty(build, '__esModule', {
|
|
1908
|
-
value: true
|
|
1909
|
-
});
|
|
1910
|
-
build.default = build.DEFAULT_OPTIONS = void 0;
|
|
1911
|
-
var format_1 = build.format = format;
|
|
1912
|
-
var plugins_1 = build.plugins = void 0;
|
|
1913
|
-
|
|
1914
|
-
var _ansiStyles = _interopRequireDefault(ansiStyles.exports);
|
|
1915
|
-
|
|
1916
|
-
var _collections = collections;
|
|
1917
|
-
|
|
1918
|
-
var _AsymmetricMatcher = _interopRequireDefault(
|
|
1919
|
-
AsymmetricMatcher$1
|
|
1920
|
-
);
|
|
1921
|
-
|
|
1922
|
-
var _ConvertAnsi = _interopRequireDefault(ConvertAnsi);
|
|
1923
|
-
|
|
1924
|
-
var _DOMCollection = _interopRequireDefault(DOMCollection$1);
|
|
1925
|
-
|
|
1926
|
-
var _DOMElement = _interopRequireDefault(DOMElement$1);
|
|
1927
|
-
|
|
1928
|
-
var _Immutable = _interopRequireDefault(Immutable$1);
|
|
1929
|
-
|
|
1930
|
-
var _ReactElement = _interopRequireDefault(ReactElement$1);
|
|
1931
|
-
|
|
1932
|
-
var _ReactTestComponent = _interopRequireDefault(
|
|
1933
|
-
ReactTestComponent$1
|
|
1934
|
-
);
|
|
1935
|
-
|
|
1936
|
-
function _interopRequireDefault(obj) {
|
|
1937
|
-
return obj && obj.__esModule ? obj : {default: obj};
|
|
1938
|
-
}
|
|
1939
|
-
|
|
1940
|
-
/**
|
|
1941
|
-
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
|
|
1942
|
-
*
|
|
1943
|
-
* This source code is licensed under the MIT license found in the
|
|
1944
|
-
* LICENSE file in the root directory of this source tree.
|
|
1945
|
-
*/
|
|
1946
|
-
|
|
1947
|
-
/* eslint-disable local/ban-types-eventually */
|
|
1948
|
-
const toString = Object.prototype.toString;
|
|
1949
|
-
const toISOString = Date.prototype.toISOString;
|
|
1950
|
-
const errorToString = Error.prototype.toString;
|
|
1951
|
-
const regExpToString = RegExp.prototype.toString;
|
|
1952
|
-
/**
|
|
1953
|
-
* Explicitly comparing typeof constructor to function avoids undefined as name
|
|
1954
|
-
* when mock identity-obj-proxy returns the key as the value for any key.
|
|
1955
|
-
*/
|
|
1956
|
-
|
|
1957
|
-
const getConstructorName = val =>
|
|
1958
|
-
(typeof val.constructor === 'function' && val.constructor.name) || 'Object';
|
|
1959
|
-
/* global window */
|
|
1960
|
-
|
|
1961
|
-
/** Is val is equal to global window object? Works even if it does not exist :) */
|
|
1962
|
-
|
|
1963
|
-
const isWindow = val => typeof window !== 'undefined' && val === window;
|
|
1964
|
-
|
|
1965
|
-
const SYMBOL_REGEXP = /^Symbol\((.*)\)(.*)$/;
|
|
1966
|
-
const NEWLINE_REGEXP = /\n/gi;
|
|
1967
|
-
|
|
1968
|
-
class PrettyFormatPluginError extends Error {
|
|
1969
|
-
constructor(message, stack) {
|
|
1970
|
-
super(message);
|
|
1971
|
-
this.stack = stack;
|
|
1972
|
-
this.name = this.constructor.name;
|
|
1973
|
-
}
|
|
1974
|
-
}
|
|
1975
|
-
|
|
1976
|
-
function isToStringedArrayType(toStringed) {
|
|
1977
|
-
return (
|
|
1978
|
-
toStringed === '[object Array]' ||
|
|
1979
|
-
toStringed === '[object ArrayBuffer]' ||
|
|
1980
|
-
toStringed === '[object DataView]' ||
|
|
1981
|
-
toStringed === '[object Float32Array]' ||
|
|
1982
|
-
toStringed === '[object Float64Array]' ||
|
|
1983
|
-
toStringed === '[object Int8Array]' ||
|
|
1984
|
-
toStringed === '[object Int16Array]' ||
|
|
1985
|
-
toStringed === '[object Int32Array]' ||
|
|
1986
|
-
toStringed === '[object Uint8Array]' ||
|
|
1987
|
-
toStringed === '[object Uint8ClampedArray]' ||
|
|
1988
|
-
toStringed === '[object Uint16Array]' ||
|
|
1989
|
-
toStringed === '[object Uint32Array]'
|
|
1990
|
-
);
|
|
1991
|
-
}
|
|
1992
|
-
|
|
1993
|
-
function printNumber(val) {
|
|
1994
|
-
return Object.is(val, -0) ? '-0' : String(val);
|
|
1995
|
-
}
|
|
1996
|
-
|
|
1997
|
-
function printBigInt(val) {
|
|
1998
|
-
return String(`${val}n`);
|
|
1999
|
-
}
|
|
2000
|
-
|
|
2001
|
-
function printFunction(val, printFunctionName) {
|
|
2002
|
-
if (!printFunctionName) {
|
|
2003
|
-
return '[Function]';
|
|
2004
|
-
}
|
|
2005
|
-
|
|
2006
|
-
return '[Function ' + (val.name || 'anonymous') + ']';
|
|
2007
|
-
}
|
|
2008
|
-
|
|
2009
|
-
function printSymbol(val) {
|
|
2010
|
-
return String(val).replace(SYMBOL_REGEXP, 'Symbol($1)');
|
|
2011
|
-
}
|
|
2012
|
-
|
|
2013
|
-
function printError(val) {
|
|
2014
|
-
return '[' + errorToString.call(val) + ']';
|
|
2015
|
-
}
|
|
2016
|
-
/**
|
|
2017
|
-
* The first port of call for printing an object, handles most of the
|
|
2018
|
-
* data-types in JS.
|
|
2019
|
-
*/
|
|
2020
|
-
|
|
2021
|
-
function printBasicValue(val, printFunctionName, escapeRegex, escapeString) {
|
|
2022
|
-
if (val === true || val === false) {
|
|
2023
|
-
return '' + val;
|
|
2024
|
-
}
|
|
2025
|
-
|
|
2026
|
-
if (val === undefined) {
|
|
2027
|
-
return 'undefined';
|
|
2028
|
-
}
|
|
2029
|
-
|
|
2030
|
-
if (val === null) {
|
|
2031
|
-
return 'null';
|
|
2032
|
-
}
|
|
2033
|
-
|
|
2034
|
-
const typeOf = typeof val;
|
|
2035
|
-
|
|
2036
|
-
if (typeOf === 'number') {
|
|
2037
|
-
return printNumber(val);
|
|
2038
|
-
}
|
|
2039
|
-
|
|
2040
|
-
if (typeOf === 'bigint') {
|
|
2041
|
-
return printBigInt(val);
|
|
2042
|
-
}
|
|
2043
|
-
|
|
2044
|
-
if (typeOf === 'string') {
|
|
2045
|
-
if (escapeString) {
|
|
2046
|
-
return '"' + val.replace(/"|\\/g, '\\$&') + '"';
|
|
2047
|
-
}
|
|
2048
|
-
|
|
2049
|
-
return '"' + val + '"';
|
|
2050
|
-
}
|
|
2051
|
-
|
|
2052
|
-
if (typeOf === 'function') {
|
|
2053
|
-
return printFunction(val, printFunctionName);
|
|
2054
|
-
}
|
|
2055
|
-
|
|
2056
|
-
if (typeOf === 'symbol') {
|
|
2057
|
-
return printSymbol(val);
|
|
2058
|
-
}
|
|
2059
|
-
|
|
2060
|
-
const toStringed = toString.call(val);
|
|
2061
|
-
|
|
2062
|
-
if (toStringed === '[object WeakMap]') {
|
|
2063
|
-
return 'WeakMap {}';
|
|
2064
|
-
}
|
|
2065
|
-
|
|
2066
|
-
if (toStringed === '[object WeakSet]') {
|
|
2067
|
-
return 'WeakSet {}';
|
|
2068
|
-
}
|
|
2069
|
-
|
|
2070
|
-
if (
|
|
2071
|
-
toStringed === '[object Function]' ||
|
|
2072
|
-
toStringed === '[object GeneratorFunction]'
|
|
2073
|
-
) {
|
|
2074
|
-
return printFunction(val, printFunctionName);
|
|
2075
|
-
}
|
|
2076
|
-
|
|
2077
|
-
if (toStringed === '[object Symbol]') {
|
|
2078
|
-
return printSymbol(val);
|
|
2079
|
-
}
|
|
2080
|
-
|
|
2081
|
-
if (toStringed === '[object Date]') {
|
|
2082
|
-
return isNaN(+val) ? 'Date { NaN }' : toISOString.call(val);
|
|
2083
|
-
}
|
|
2084
|
-
|
|
2085
|
-
if (toStringed === '[object Error]') {
|
|
2086
|
-
return printError(val);
|
|
2087
|
-
}
|
|
2088
|
-
|
|
2089
|
-
if (toStringed === '[object RegExp]') {
|
|
2090
|
-
if (escapeRegex) {
|
|
2091
|
-
// https://github.com/benjamingr/RegExp.escape/blob/main/polyfill.js
|
|
2092
|
-
return regExpToString.call(val).replace(/[\\^$*+?.()|[\]{}]/g, '\\$&');
|
|
2093
|
-
}
|
|
2094
|
-
|
|
2095
|
-
return regExpToString.call(val);
|
|
2096
|
-
}
|
|
2097
|
-
|
|
2098
|
-
if (val instanceof Error) {
|
|
2099
|
-
return printError(val);
|
|
2100
|
-
}
|
|
2101
|
-
|
|
2102
|
-
return null;
|
|
2103
|
-
}
|
|
2104
|
-
/**
|
|
2105
|
-
* Handles more complex objects ( such as objects with circular references.
|
|
2106
|
-
* maps and sets etc )
|
|
2107
|
-
*/
|
|
2108
|
-
|
|
2109
|
-
function printComplexValue(
|
|
2110
|
-
val,
|
|
2111
|
-
config,
|
|
2112
|
-
indentation,
|
|
2113
|
-
depth,
|
|
2114
|
-
refs,
|
|
2115
|
-
hasCalledToJSON
|
|
2116
|
-
) {
|
|
2117
|
-
if (refs.indexOf(val) !== -1) {
|
|
2118
|
-
return '[Circular]';
|
|
2119
|
-
}
|
|
2120
|
-
|
|
2121
|
-
refs = refs.slice();
|
|
2122
|
-
refs.push(val);
|
|
2123
|
-
const hitMaxDepth = ++depth > config.maxDepth;
|
|
2124
|
-
const min = config.min;
|
|
2125
|
-
|
|
2126
|
-
if (
|
|
2127
|
-
config.callToJSON &&
|
|
2128
|
-
!hitMaxDepth &&
|
|
2129
|
-
val.toJSON &&
|
|
2130
|
-
typeof val.toJSON === 'function' &&
|
|
2131
|
-
!hasCalledToJSON
|
|
2132
|
-
) {
|
|
2133
|
-
return printer(val.toJSON(), config, indentation, depth, refs, true);
|
|
2134
|
-
}
|
|
2135
|
-
|
|
2136
|
-
const toStringed = toString.call(val);
|
|
2137
|
-
|
|
2138
|
-
if (toStringed === '[object Arguments]') {
|
|
2139
|
-
return hitMaxDepth
|
|
2140
|
-
? '[Arguments]'
|
|
2141
|
-
: (min ? '' : 'Arguments ') +
|
|
2142
|
-
'[' +
|
|
2143
|
-
(0, _collections.printListItems)(
|
|
2144
|
-
val,
|
|
2145
|
-
config,
|
|
2146
|
-
indentation,
|
|
2147
|
-
depth,
|
|
2148
|
-
refs,
|
|
2149
|
-
printer
|
|
2150
|
-
) +
|
|
2151
|
-
']';
|
|
2152
|
-
}
|
|
2153
|
-
|
|
2154
|
-
if (isToStringedArrayType(toStringed)) {
|
|
2155
|
-
return hitMaxDepth
|
|
2156
|
-
? '[' + val.constructor.name + ']'
|
|
2157
|
-
: (min
|
|
2158
|
-
? ''
|
|
2159
|
-
: !config.printBasicPrototype && val.constructor.name === 'Array'
|
|
2160
|
-
? ''
|
|
2161
|
-
: val.constructor.name + ' ') +
|
|
2162
|
-
'[' +
|
|
2163
|
-
(0, _collections.printListItems)(
|
|
2164
|
-
val,
|
|
2165
|
-
config,
|
|
2166
|
-
indentation,
|
|
2167
|
-
depth,
|
|
2168
|
-
refs,
|
|
2169
|
-
printer
|
|
2170
|
-
) +
|
|
2171
|
-
']';
|
|
2172
|
-
}
|
|
2173
|
-
|
|
2174
|
-
if (toStringed === '[object Map]') {
|
|
2175
|
-
return hitMaxDepth
|
|
2176
|
-
? '[Map]'
|
|
2177
|
-
: 'Map {' +
|
|
2178
|
-
(0, _collections.printIteratorEntries)(
|
|
2179
|
-
val.entries(),
|
|
2180
|
-
config,
|
|
2181
|
-
indentation,
|
|
2182
|
-
depth,
|
|
2183
|
-
refs,
|
|
2184
|
-
printer,
|
|
2185
|
-
' => '
|
|
2186
|
-
) +
|
|
2187
|
-
'}';
|
|
2188
|
-
}
|
|
2189
|
-
|
|
2190
|
-
if (toStringed === '[object Set]') {
|
|
2191
|
-
return hitMaxDepth
|
|
2192
|
-
? '[Set]'
|
|
2193
|
-
: 'Set {' +
|
|
2194
|
-
(0, _collections.printIteratorValues)(
|
|
2195
|
-
val.values(),
|
|
2196
|
-
config,
|
|
2197
|
-
indentation,
|
|
2198
|
-
depth,
|
|
2199
|
-
refs,
|
|
2200
|
-
printer
|
|
2201
|
-
) +
|
|
2202
|
-
'}';
|
|
2203
|
-
} // Avoid failure to serialize global window object in jsdom test environment.
|
|
2204
|
-
// For example, not even relevant if window is prop of React element.
|
|
2205
|
-
|
|
2206
|
-
return hitMaxDepth || isWindow(val)
|
|
2207
|
-
? '[' + getConstructorName(val) + ']'
|
|
2208
|
-
: (min
|
|
2209
|
-
? ''
|
|
2210
|
-
: !config.printBasicPrototype && getConstructorName(val) === 'Object'
|
|
2211
|
-
? ''
|
|
2212
|
-
: getConstructorName(val) + ' ') +
|
|
2213
|
-
'{' +
|
|
2214
|
-
(0, _collections.printObjectProperties)(
|
|
2215
|
-
val,
|
|
2216
|
-
config,
|
|
2217
|
-
indentation,
|
|
2218
|
-
depth,
|
|
2219
|
-
refs,
|
|
2220
|
-
printer
|
|
2221
|
-
) +
|
|
2222
|
-
'}';
|
|
2223
|
-
}
|
|
2224
|
-
|
|
2225
|
-
function isNewPlugin(plugin) {
|
|
2226
|
-
return plugin.serialize != null;
|
|
2227
|
-
}
|
|
2228
|
-
|
|
2229
|
-
function printPlugin(plugin, val, config, indentation, depth, refs) {
|
|
2230
|
-
let printed;
|
|
2231
|
-
|
|
2232
|
-
try {
|
|
2233
|
-
printed = isNewPlugin(plugin)
|
|
2234
|
-
? plugin.serialize(val, config, indentation, depth, refs, printer)
|
|
2235
|
-
: plugin.print(
|
|
2236
|
-
val,
|
|
2237
|
-
valChild => printer(valChild, config, indentation, depth, refs),
|
|
2238
|
-
str => {
|
|
2239
|
-
const indentationNext = indentation + config.indent;
|
|
2240
|
-
return (
|
|
2241
|
-
indentationNext +
|
|
2242
|
-
str.replace(NEWLINE_REGEXP, '\n' + indentationNext)
|
|
2243
|
-
);
|
|
2244
|
-
},
|
|
2245
|
-
{
|
|
2246
|
-
edgeSpacing: config.spacingOuter,
|
|
2247
|
-
min: config.min,
|
|
2248
|
-
spacing: config.spacingInner
|
|
2249
|
-
},
|
|
2250
|
-
config.colors
|
|
2251
|
-
);
|
|
2252
|
-
} catch (error) {
|
|
2253
|
-
throw new PrettyFormatPluginError(error.message, error.stack);
|
|
2254
|
-
}
|
|
2255
|
-
|
|
2256
|
-
if (typeof printed !== 'string') {
|
|
2257
|
-
throw new Error(
|
|
2258
|
-
`pretty-format: Plugin must return type "string" but instead returned "${typeof printed}".`
|
|
2259
|
-
);
|
|
2260
|
-
}
|
|
2261
|
-
|
|
2262
|
-
return printed;
|
|
2263
|
-
}
|
|
2264
|
-
|
|
2265
|
-
function findPlugin(plugins, val) {
|
|
2266
|
-
for (let p = 0; p < plugins.length; p++) {
|
|
2267
|
-
try {
|
|
2268
|
-
if (plugins[p].test(val)) {
|
|
2269
|
-
return plugins[p];
|
|
2270
|
-
}
|
|
2271
|
-
} catch (error) {
|
|
2272
|
-
throw new PrettyFormatPluginError(error.message, error.stack);
|
|
2273
|
-
}
|
|
2274
|
-
}
|
|
2275
|
-
|
|
2276
|
-
return null;
|
|
2277
|
-
}
|
|
2278
|
-
|
|
2279
|
-
function printer(val, config, indentation, depth, refs, hasCalledToJSON) {
|
|
2280
|
-
const plugin = findPlugin(config.plugins, val);
|
|
2281
|
-
|
|
2282
|
-
if (plugin !== null) {
|
|
2283
|
-
return printPlugin(plugin, val, config, indentation, depth, refs);
|
|
2284
|
-
}
|
|
2285
|
-
|
|
2286
|
-
const basicResult = printBasicValue(
|
|
2287
|
-
val,
|
|
2288
|
-
config.printFunctionName,
|
|
2289
|
-
config.escapeRegex,
|
|
2290
|
-
config.escapeString
|
|
2291
|
-
);
|
|
2292
|
-
|
|
2293
|
-
if (basicResult !== null) {
|
|
2294
|
-
return basicResult;
|
|
2295
|
-
}
|
|
2296
|
-
|
|
2297
|
-
return printComplexValue(
|
|
2298
|
-
val,
|
|
2299
|
-
config,
|
|
2300
|
-
indentation,
|
|
2301
|
-
depth,
|
|
2302
|
-
refs,
|
|
2303
|
-
hasCalledToJSON
|
|
2304
|
-
);
|
|
2305
|
-
}
|
|
2306
|
-
|
|
2307
|
-
const DEFAULT_THEME = {
|
|
2308
|
-
comment: 'gray',
|
|
2309
|
-
content: 'reset',
|
|
2310
|
-
prop: 'yellow',
|
|
2311
|
-
tag: 'cyan',
|
|
2312
|
-
value: 'green'
|
|
2313
|
-
};
|
|
2314
|
-
const DEFAULT_THEME_KEYS = Object.keys(DEFAULT_THEME);
|
|
2315
|
-
const DEFAULT_OPTIONS = {
|
|
2316
|
-
callToJSON: true,
|
|
2317
|
-
compareKeys: undefined,
|
|
2318
|
-
escapeRegex: false,
|
|
2319
|
-
escapeString: true,
|
|
2320
|
-
highlight: false,
|
|
2321
|
-
indent: 2,
|
|
2322
|
-
maxDepth: Infinity,
|
|
2323
|
-
min: false,
|
|
2324
|
-
plugins: [],
|
|
2325
|
-
printBasicPrototype: true,
|
|
2326
|
-
printFunctionName: true,
|
|
2327
|
-
theme: DEFAULT_THEME
|
|
2328
|
-
};
|
|
2329
|
-
build.DEFAULT_OPTIONS = DEFAULT_OPTIONS;
|
|
2330
|
-
|
|
2331
|
-
function validateOptions(options) {
|
|
2332
|
-
Object.keys(options).forEach(key => {
|
|
2333
|
-
if (!DEFAULT_OPTIONS.hasOwnProperty(key)) {
|
|
2334
|
-
throw new Error(`pretty-format: Unknown option "${key}".`);
|
|
2335
|
-
}
|
|
2336
|
-
});
|
|
2337
|
-
|
|
2338
|
-
if (options.min && options.indent !== undefined && options.indent !== 0) {
|
|
2339
|
-
throw new Error(
|
|
2340
|
-
'pretty-format: Options "min" and "indent" cannot be used together.'
|
|
2341
|
-
);
|
|
2342
|
-
}
|
|
2343
|
-
|
|
2344
|
-
if (options.theme !== undefined) {
|
|
2345
|
-
if (options.theme === null) {
|
|
2346
|
-
throw new Error(`pretty-format: Option "theme" must not be null.`);
|
|
2347
|
-
}
|
|
2348
|
-
|
|
2349
|
-
if (typeof options.theme !== 'object') {
|
|
2350
|
-
throw new Error(
|
|
2351
|
-
`pretty-format: Option "theme" must be of type "object" but instead received "${typeof options.theme}".`
|
|
2352
|
-
);
|
|
2353
|
-
}
|
|
2354
|
-
}
|
|
2355
|
-
}
|
|
2356
|
-
|
|
2357
|
-
const getColorsHighlight = options =>
|
|
2358
|
-
DEFAULT_THEME_KEYS.reduce((colors, key) => {
|
|
2359
|
-
const value =
|
|
2360
|
-
options.theme && options.theme[key] !== undefined
|
|
2361
|
-
? options.theme[key]
|
|
2362
|
-
: DEFAULT_THEME[key];
|
|
2363
|
-
const color = value && _ansiStyles.default[value];
|
|
2364
|
-
|
|
2365
|
-
if (
|
|
2366
|
-
color &&
|
|
2367
|
-
typeof color.close === 'string' &&
|
|
2368
|
-
typeof color.open === 'string'
|
|
2369
|
-
) {
|
|
2370
|
-
colors[key] = color;
|
|
2371
|
-
} else {
|
|
2372
|
-
throw new Error(
|
|
2373
|
-
`pretty-format: Option "theme" has a key "${key}" whose value "${value}" is undefined in ansi-styles.`
|
|
2374
|
-
);
|
|
2375
|
-
}
|
|
2376
|
-
|
|
2377
|
-
return colors;
|
|
2378
|
-
}, Object.create(null));
|
|
2379
|
-
|
|
2380
|
-
const getColorsEmpty = () =>
|
|
2381
|
-
DEFAULT_THEME_KEYS.reduce((colors, key) => {
|
|
2382
|
-
colors[key] = {
|
|
2383
|
-
close: '',
|
|
2384
|
-
open: ''
|
|
2385
|
-
};
|
|
2386
|
-
return colors;
|
|
2387
|
-
}, Object.create(null));
|
|
2388
|
-
|
|
2389
|
-
const getPrintFunctionName = options =>
|
|
2390
|
-
options && options.printFunctionName !== undefined
|
|
2391
|
-
? options.printFunctionName
|
|
2392
|
-
: DEFAULT_OPTIONS.printFunctionName;
|
|
2393
|
-
|
|
2394
|
-
const getEscapeRegex = options =>
|
|
2395
|
-
options && options.escapeRegex !== undefined
|
|
2396
|
-
? options.escapeRegex
|
|
2397
|
-
: DEFAULT_OPTIONS.escapeRegex;
|
|
2398
|
-
|
|
2399
|
-
const getEscapeString = options =>
|
|
2400
|
-
options && options.escapeString !== undefined
|
|
2401
|
-
? options.escapeString
|
|
2402
|
-
: DEFAULT_OPTIONS.escapeString;
|
|
2403
|
-
|
|
2404
|
-
const getConfig = options => {
|
|
2405
|
-
var _options$printBasicPr;
|
|
2406
|
-
|
|
2407
|
-
return {
|
|
2408
|
-
callToJSON:
|
|
2409
|
-
options && options.callToJSON !== undefined
|
|
2410
|
-
? options.callToJSON
|
|
2411
|
-
: DEFAULT_OPTIONS.callToJSON,
|
|
2412
|
-
colors:
|
|
2413
|
-
options && options.highlight
|
|
2414
|
-
? getColorsHighlight(options)
|
|
2415
|
-
: getColorsEmpty(),
|
|
2416
|
-
compareKeys:
|
|
2417
|
-
options && typeof options.compareKeys === 'function'
|
|
2418
|
-
? options.compareKeys
|
|
2419
|
-
: DEFAULT_OPTIONS.compareKeys,
|
|
2420
|
-
escapeRegex: getEscapeRegex(options),
|
|
2421
|
-
escapeString: getEscapeString(options),
|
|
2422
|
-
indent:
|
|
2423
|
-
options && options.min
|
|
2424
|
-
? ''
|
|
2425
|
-
: createIndent(
|
|
2426
|
-
options && options.indent !== undefined
|
|
2427
|
-
? options.indent
|
|
2428
|
-
: DEFAULT_OPTIONS.indent
|
|
2429
|
-
),
|
|
2430
|
-
maxDepth:
|
|
2431
|
-
options && options.maxDepth !== undefined
|
|
2432
|
-
? options.maxDepth
|
|
2433
|
-
: DEFAULT_OPTIONS.maxDepth,
|
|
2434
|
-
min:
|
|
2435
|
-
options && options.min !== undefined ? options.min : DEFAULT_OPTIONS.min,
|
|
2436
|
-
plugins:
|
|
2437
|
-
options && options.plugins !== undefined
|
|
2438
|
-
? options.plugins
|
|
2439
|
-
: DEFAULT_OPTIONS.plugins,
|
|
2440
|
-
printBasicPrototype:
|
|
2441
|
-
(_options$printBasicPr =
|
|
2442
|
-
options === null || options === void 0
|
|
2443
|
-
? void 0
|
|
2444
|
-
: options.printBasicPrototype) !== null &&
|
|
2445
|
-
_options$printBasicPr !== void 0
|
|
2446
|
-
? _options$printBasicPr
|
|
2447
|
-
: true,
|
|
2448
|
-
printFunctionName: getPrintFunctionName(options),
|
|
2449
|
-
spacingInner: options && options.min ? ' ' : '\n',
|
|
2450
|
-
spacingOuter: options && options.min ? '' : '\n'
|
|
2451
|
-
};
|
|
2452
|
-
};
|
|
2453
|
-
|
|
2454
|
-
function createIndent(indent) {
|
|
2455
|
-
return new Array(indent + 1).join(' ');
|
|
2456
|
-
}
|
|
2457
|
-
/**
|
|
2458
|
-
* Returns a presentation string of your `val` object
|
|
2459
|
-
* @param val any potential JavaScript object
|
|
2460
|
-
* @param options Custom settings
|
|
2461
|
-
*/
|
|
2462
|
-
|
|
2463
|
-
function format(val, options) {
|
|
2464
|
-
if (options) {
|
|
2465
|
-
validateOptions(options);
|
|
2466
|
-
|
|
2467
|
-
if (options.plugins) {
|
|
2468
|
-
const plugin = findPlugin(options.plugins, val);
|
|
2469
|
-
|
|
2470
|
-
if (plugin !== null) {
|
|
2471
|
-
return printPlugin(plugin, val, getConfig(options), '', 0, []);
|
|
2472
|
-
}
|
|
2473
|
-
}
|
|
2474
|
-
}
|
|
2475
|
-
|
|
2476
|
-
const basicResult = printBasicValue(
|
|
2477
|
-
val,
|
|
2478
|
-
getPrintFunctionName(options),
|
|
2479
|
-
getEscapeRegex(options),
|
|
2480
|
-
getEscapeString(options)
|
|
2481
|
-
);
|
|
2482
|
-
|
|
2483
|
-
if (basicResult !== null) {
|
|
2484
|
-
return basicResult;
|
|
2485
|
-
}
|
|
2486
|
-
|
|
2487
|
-
return printComplexValue(val, getConfig(options), '', 0, []);
|
|
2488
|
-
}
|
|
2489
|
-
|
|
2490
|
-
const plugins = {
|
|
2491
|
-
AsymmetricMatcher: _AsymmetricMatcher.default,
|
|
2492
|
-
ConvertAnsi: _ConvertAnsi.default,
|
|
2493
|
-
DOMCollection: _DOMCollection.default,
|
|
2494
|
-
DOMElement: _DOMElement.default,
|
|
2495
|
-
Immutable: _Immutable.default,
|
|
2496
|
-
ReactElement: _ReactElement.default,
|
|
2497
|
-
ReactTestComponent: _ReactTestComponent.default
|
|
2498
|
-
};
|
|
2499
|
-
plugins_1 = build.plugins = plugins;
|
|
2500
|
-
var _default = format;
|
|
2501
|
-
build.default = _default;
|
|
2502
|
-
|
|
2503
|
-
const {
|
|
2504
|
-
DOMCollection,
|
|
2505
|
-
DOMElement,
|
|
2506
|
-
Immutable,
|
|
2507
|
-
ReactElement,
|
|
2508
|
-
ReactTestComponent,
|
|
2509
|
-
AsymmetricMatcher
|
|
2510
|
-
} = plugins_1;
|
|
2511
|
-
let PLUGINS = [
|
|
2512
|
-
ReactTestComponent,
|
|
2513
|
-
ReactElement,
|
|
2514
|
-
DOMElement,
|
|
2515
|
-
DOMCollection,
|
|
2516
|
-
Immutable,
|
|
2517
|
-
AsymmetricMatcher
|
|
2518
|
-
];
|
|
2519
|
-
const addSerializer = (plugin) => {
|
|
2520
|
-
PLUGINS = [plugin].concat(PLUGINS);
|
|
2521
|
-
};
|
|
2522
|
-
const getSerializers = () => PLUGINS;
|
|
2523
|
-
|
|
2524
|
-
function equals(a, b, customTesters, strictCheck) {
|
|
2525
|
-
customTesters = customTesters || [];
|
|
2526
|
-
return eq(a, b, [], [], customTesters, strictCheck ? hasKey : hasDefinedKey);
|
|
2527
|
-
}
|
|
2528
|
-
function isAsymmetric(obj) {
|
|
2529
|
-
return !!obj && isA("Function", obj.asymmetricMatch);
|
|
2530
|
-
}
|
|
2531
|
-
function hasAsymmetric(obj, seen = new Set()) {
|
|
2532
|
-
if (seen.has(obj))
|
|
2533
|
-
return false;
|
|
2534
|
-
seen.add(obj);
|
|
2535
|
-
if (isAsymmetric(obj))
|
|
2536
|
-
return true;
|
|
2537
|
-
if (Array.isArray(obj))
|
|
2538
|
-
return obj.some((i) => hasAsymmetric(i, seen));
|
|
2539
|
-
if (obj instanceof Set)
|
|
2540
|
-
return Array.from(obj).some((i) => hasAsymmetric(i, seen));
|
|
2541
|
-
if (isObject(obj))
|
|
2542
|
-
return Object.values(obj).some((v) => hasAsymmetric(v, seen));
|
|
2543
|
-
return false;
|
|
2544
|
-
}
|
|
2545
|
-
function asymmetricMatch(a, b) {
|
|
2546
|
-
const asymmetricA = isAsymmetric(a);
|
|
2547
|
-
const asymmetricB = isAsymmetric(b);
|
|
2548
|
-
if (asymmetricA && asymmetricB)
|
|
2549
|
-
return void 0;
|
|
2550
|
-
if (asymmetricA)
|
|
2551
|
-
return a.asymmetricMatch(b);
|
|
2552
|
-
if (asymmetricB)
|
|
2553
|
-
return b.asymmetricMatch(a);
|
|
2554
|
-
}
|
|
2555
|
-
function eq(a, b, aStack, bStack, customTesters, hasKey2) {
|
|
2556
|
-
let result = true;
|
|
2557
|
-
const asymmetricResult = asymmetricMatch(a, b);
|
|
2558
|
-
if (asymmetricResult !== void 0)
|
|
2559
|
-
return asymmetricResult;
|
|
2560
|
-
for (let i = 0; i < customTesters.length; i++) {
|
|
2561
|
-
const customTesterResult = customTesters[i](a, b);
|
|
2562
|
-
if (customTesterResult !== void 0)
|
|
2563
|
-
return customTesterResult;
|
|
2564
|
-
}
|
|
2565
|
-
if (a instanceof Error && b instanceof Error)
|
|
2566
|
-
return a.message === b.message;
|
|
2567
|
-
if (Object.is(a, b))
|
|
2568
|
-
return true;
|
|
2569
|
-
if (a === null || b === null)
|
|
2570
|
-
return a === b;
|
|
2571
|
-
const className = Object.prototype.toString.call(a);
|
|
2572
|
-
if (className !== Object.prototype.toString.call(b))
|
|
2573
|
-
return false;
|
|
2574
|
-
switch (className) {
|
|
2575
|
-
case "[object Boolean]":
|
|
2576
|
-
case "[object String]":
|
|
2577
|
-
case "[object Number]":
|
|
2578
|
-
if (typeof a !== typeof b) {
|
|
2579
|
-
return false;
|
|
2580
|
-
} else if (typeof a !== "object" && typeof b !== "object") {
|
|
2581
|
-
return Object.is(a, b);
|
|
2582
|
-
} else {
|
|
2583
|
-
return Object.is(a.valueOf(), b.valueOf());
|
|
2584
|
-
}
|
|
2585
|
-
case "[object Date]":
|
|
2586
|
-
return +a === +b;
|
|
2587
|
-
case "[object RegExp]":
|
|
2588
|
-
return a.source === b.source && a.flags === b.flags;
|
|
2589
|
-
}
|
|
2590
|
-
if (typeof a !== "object" || typeof b !== "object")
|
|
2591
|
-
return false;
|
|
2592
|
-
if (isDomNode(a) && isDomNode(b))
|
|
2593
|
-
return a.isEqualNode(b);
|
|
2594
|
-
let length = aStack.length;
|
|
2595
|
-
while (length--) {
|
|
2596
|
-
if (aStack[length] === a)
|
|
2597
|
-
return bStack[length] === b;
|
|
2598
|
-
else if (bStack[length] === b)
|
|
2599
|
-
return false;
|
|
2600
|
-
}
|
|
2601
|
-
aStack.push(a);
|
|
2602
|
-
bStack.push(b);
|
|
2603
|
-
if (className === "[object Array]" && a.length !== b.length)
|
|
2604
|
-
return false;
|
|
2605
|
-
const aKeys = keys(a, hasKey2);
|
|
2606
|
-
let key;
|
|
2607
|
-
let size = aKeys.length;
|
|
2608
|
-
if (keys(b, hasKey2).length !== size)
|
|
2609
|
-
return false;
|
|
2610
|
-
while (size--) {
|
|
2611
|
-
key = aKeys[size];
|
|
2612
|
-
result = hasKey2(b, key) && eq(a[key], b[key], aStack, bStack, customTesters, hasKey2);
|
|
2613
|
-
if (!result)
|
|
2614
|
-
return false;
|
|
2615
|
-
}
|
|
2616
|
-
aStack.pop();
|
|
2617
|
-
bStack.pop();
|
|
2618
|
-
return result;
|
|
2619
|
-
}
|
|
2620
|
-
function keys(obj, hasKey2) {
|
|
2621
|
-
const keys2 = [];
|
|
2622
|
-
for (const key in obj) {
|
|
2623
|
-
if (hasKey2(obj, key))
|
|
2624
|
-
keys2.push(key);
|
|
2625
|
-
}
|
|
2626
|
-
return keys2.concat(Object.getOwnPropertySymbols(obj).filter((symbol) => Object.getOwnPropertyDescriptor(obj, symbol).enumerable));
|
|
2627
|
-
}
|
|
2628
|
-
function hasDefinedKey(obj, key) {
|
|
2629
|
-
return hasKey(obj, key) && obj[key] !== void 0;
|
|
2630
|
-
}
|
|
2631
|
-
function hasKey(obj, key) {
|
|
2632
|
-
return Object.prototype.hasOwnProperty.call(obj, key);
|
|
2633
|
-
}
|
|
2634
|
-
function isA(typeName, value) {
|
|
2635
|
-
return Object.prototype.toString.apply(value) === `[object ${typeName}]`;
|
|
2636
|
-
}
|
|
2637
|
-
function isDomNode(obj) {
|
|
2638
|
-
return obj !== null && typeof obj === "object" && typeof obj.nodeType === "number" && typeof obj.nodeName === "string" && typeof obj.isEqualNode === "function";
|
|
2639
|
-
}
|
|
2640
|
-
const IS_KEYED_SENTINEL = "@@__IMMUTABLE_KEYED__@@";
|
|
2641
|
-
const IS_SET_SENTINEL = "@@__IMMUTABLE_SET__@@";
|
|
2642
|
-
const IS_ORDERED_SENTINEL = "@@__IMMUTABLE_ORDERED__@@";
|
|
2643
|
-
function isImmutableUnorderedKeyed(maybeKeyed) {
|
|
2644
|
-
return !!(maybeKeyed && maybeKeyed[IS_KEYED_SENTINEL] && !maybeKeyed[IS_ORDERED_SENTINEL]);
|
|
2645
|
-
}
|
|
2646
|
-
function isImmutableUnorderedSet(maybeSet) {
|
|
2647
|
-
return !!(maybeSet && maybeSet[IS_SET_SENTINEL] && !maybeSet[IS_ORDERED_SENTINEL]);
|
|
2648
|
-
}
|
|
2649
|
-
const IteratorSymbol = Symbol.iterator;
|
|
2650
|
-
const hasIterator = (object) => !!(object != null && object[IteratorSymbol]);
|
|
2651
|
-
const iterableEquality = (a, b, aStack = [], bStack = []) => {
|
|
2652
|
-
if (typeof a !== "object" || typeof b !== "object" || Array.isArray(a) || Array.isArray(b) || !hasIterator(a) || !hasIterator(b))
|
|
2653
|
-
return void 0;
|
|
2654
|
-
if (a.constructor !== b.constructor)
|
|
2655
|
-
return false;
|
|
2656
|
-
let length = aStack.length;
|
|
2657
|
-
while (length--) {
|
|
2658
|
-
if (aStack[length] === a)
|
|
2659
|
-
return bStack[length] === b;
|
|
2660
|
-
}
|
|
2661
|
-
aStack.push(a);
|
|
2662
|
-
bStack.push(b);
|
|
2663
|
-
const iterableEqualityWithStack = (a2, b2) => iterableEquality(a2, b2, [...aStack], [...bStack]);
|
|
2664
|
-
if (a.size !== void 0) {
|
|
2665
|
-
if (a.size !== b.size) {
|
|
2666
|
-
return false;
|
|
2667
|
-
} else if (isA("Set", a) || isImmutableUnorderedSet(a)) {
|
|
2668
|
-
let allFound = true;
|
|
2669
|
-
for (const aValue of a) {
|
|
2670
|
-
if (!b.has(aValue)) {
|
|
2671
|
-
let has = false;
|
|
2672
|
-
for (const bValue of b) {
|
|
2673
|
-
const isEqual = equals(aValue, bValue, [iterableEqualityWithStack]);
|
|
2674
|
-
if (isEqual === true)
|
|
2675
|
-
has = true;
|
|
2676
|
-
}
|
|
2677
|
-
if (has === false) {
|
|
2678
|
-
allFound = false;
|
|
2679
|
-
break;
|
|
2680
|
-
}
|
|
2681
|
-
}
|
|
2682
|
-
}
|
|
2683
|
-
aStack.pop();
|
|
2684
|
-
bStack.pop();
|
|
2685
|
-
return allFound;
|
|
2686
|
-
} else if (isA("Map", a) || isImmutableUnorderedKeyed(a)) {
|
|
2687
|
-
let allFound = true;
|
|
2688
|
-
for (const aEntry of a) {
|
|
2689
|
-
if (!b.has(aEntry[0]) || !equals(aEntry[1], b.get(aEntry[0]), [iterableEqualityWithStack])) {
|
|
2690
|
-
let has = false;
|
|
2691
|
-
for (const bEntry of b) {
|
|
2692
|
-
const matchedKey = equals(aEntry[0], bEntry[0], [
|
|
2693
|
-
iterableEqualityWithStack
|
|
2694
|
-
]);
|
|
2695
|
-
let matchedValue = false;
|
|
2696
|
-
if (matchedKey === true) {
|
|
2697
|
-
matchedValue = equals(aEntry[1], bEntry[1], [
|
|
2698
|
-
iterableEqualityWithStack
|
|
2699
|
-
]);
|
|
2700
|
-
}
|
|
2701
|
-
if (matchedValue === true)
|
|
2702
|
-
has = true;
|
|
2703
|
-
}
|
|
2704
|
-
if (has === false) {
|
|
2705
|
-
allFound = false;
|
|
2706
|
-
break;
|
|
2707
|
-
}
|
|
2708
|
-
}
|
|
2709
|
-
}
|
|
2710
|
-
aStack.pop();
|
|
2711
|
-
bStack.pop();
|
|
2712
|
-
return allFound;
|
|
2713
|
-
}
|
|
2714
|
-
}
|
|
2715
|
-
const bIterator = b[IteratorSymbol]();
|
|
2716
|
-
for (const aValue of a) {
|
|
2717
|
-
const nextB = bIterator.next();
|
|
2718
|
-
if (nextB.done || !equals(aValue, nextB.value, [iterableEqualityWithStack]))
|
|
2719
|
-
return false;
|
|
2720
|
-
}
|
|
2721
|
-
if (!bIterator.next().done)
|
|
2722
|
-
return false;
|
|
2723
|
-
aStack.pop();
|
|
2724
|
-
bStack.pop();
|
|
2725
|
-
return true;
|
|
2726
|
-
};
|
|
2727
|
-
const hasPropertyInObject = (object, key) => {
|
|
2728
|
-
const shouldTerminate = !object || typeof object !== "object" || object === Object.prototype;
|
|
2729
|
-
if (shouldTerminate)
|
|
2730
|
-
return false;
|
|
2731
|
-
return Object.prototype.hasOwnProperty.call(object, key) || hasPropertyInObject(Object.getPrototypeOf(object), key);
|
|
2732
|
-
};
|
|
2733
|
-
const isObjectWithKeys = (a) => isObject(a) && !(a instanceof Error) && !(a instanceof Array) && !(a instanceof Date);
|
|
2734
|
-
const subsetEquality = (object, subset) => {
|
|
2735
|
-
const subsetEqualityWithContext = (seenReferences = new WeakMap()) => (object2, subset2) => {
|
|
2736
|
-
if (!isObjectWithKeys(subset2))
|
|
2737
|
-
return void 0;
|
|
2738
|
-
return Object.keys(subset2).every((key) => {
|
|
2739
|
-
if (isObjectWithKeys(subset2[key])) {
|
|
2740
|
-
if (seenReferences.has(subset2[key]))
|
|
2741
|
-
return equals(object2[key], subset2[key], [iterableEquality]);
|
|
2742
|
-
seenReferences.set(subset2[key], true);
|
|
2743
|
-
}
|
|
2744
|
-
const result = object2 != null && hasPropertyInObject(object2, key) && equals(object2[key], subset2[key], [
|
|
2745
|
-
iterableEquality,
|
|
2746
|
-
subsetEqualityWithContext(seenReferences)
|
|
2747
|
-
]);
|
|
2748
|
-
seenReferences.delete(subset2[key]);
|
|
2749
|
-
return result;
|
|
2750
|
-
});
|
|
2751
|
-
};
|
|
2752
|
-
return subsetEqualityWithContext()(object, subset);
|
|
2753
|
-
};
|
|
2754
|
-
const typeEquality = (a, b) => {
|
|
2755
|
-
if (a == null || b == null || a.constructor === b.constructor)
|
|
2756
|
-
return void 0;
|
|
2757
|
-
return false;
|
|
2758
|
-
};
|
|
2759
|
-
const arrayBufferEquality = (a, b) => {
|
|
2760
|
-
if (!(a instanceof ArrayBuffer) || !(b instanceof ArrayBuffer))
|
|
2761
|
-
return void 0;
|
|
2762
|
-
const dataViewA = new DataView(a);
|
|
2763
|
-
const dataViewB = new DataView(b);
|
|
2764
|
-
if (dataViewA.byteLength !== dataViewB.byteLength)
|
|
2765
|
-
return false;
|
|
2766
|
-
for (let i = 0; i < dataViewA.byteLength; i++) {
|
|
2767
|
-
if (dataViewA.getUint8(i) !== dataViewB.getUint8(i))
|
|
2768
|
-
return false;
|
|
2769
|
-
}
|
|
2770
|
-
return true;
|
|
2771
|
-
};
|
|
2772
|
-
const sparseArrayEquality = (a, b) => {
|
|
2773
|
-
if (!Array.isArray(a) || !Array.isArray(b))
|
|
2774
|
-
return void 0;
|
|
2775
|
-
const aKeys = Object.keys(a);
|
|
2776
|
-
const bKeys = Object.keys(b);
|
|
2777
|
-
return equals(a, b, [iterableEquality, typeEquality], true) && equals(aKeys, bKeys);
|
|
2778
|
-
};
|
|
2779
|
-
|
|
2780
|
-
const MATCHERS_OBJECT = Symbol.for("matchers-object");
|
|
2781
|
-
if (!Object.prototype.hasOwnProperty.call(global, MATCHERS_OBJECT)) {
|
|
2782
|
-
const defaultState = {
|
|
2783
|
-
assertionCalls: 0,
|
|
2784
|
-
isExpectingAssertions: false,
|
|
2785
|
-
isExpectingAssertionsError: null,
|
|
2786
|
-
expectedAssertionsNumber: null,
|
|
2787
|
-
expectedAssertionsNumberError: null
|
|
2788
|
-
};
|
|
2789
|
-
Object.defineProperty(global, MATCHERS_OBJECT, {
|
|
2790
|
-
value: {
|
|
2791
|
-
state: defaultState
|
|
2792
|
-
}
|
|
2793
|
-
});
|
|
2794
|
-
}
|
|
2795
|
-
const getState = () => global[MATCHERS_OBJECT].state;
|
|
2796
|
-
const setState = (state) => {
|
|
2797
|
-
Object.assign(global[MATCHERS_OBJECT].state, state);
|
|
2798
|
-
};
|
|
2799
|
-
const JestChaiExpect = (chai, utils) => {
|
|
2800
|
-
function def(name, fn) {
|
|
2801
|
-
const addMethod = (n) => {
|
|
2802
|
-
utils.addMethod(chai.Assertion.prototype, n, fn);
|
|
2803
|
-
};
|
|
2804
|
-
if (Array.isArray(name))
|
|
2805
|
-
name.forEach((n) => addMethod(n));
|
|
2806
|
-
else
|
|
2807
|
-
addMethod(name);
|
|
2808
|
-
}
|
|
2809
|
-
const chaiEqual = chai.Assertion.prototype.equal;
|
|
2810
|
-
def("chaiEqual", function(...args) {
|
|
2811
|
-
return chaiEqual.apply(this, args);
|
|
2812
|
-
});
|
|
2813
|
-
["throw", "throws", "Throw"].forEach((m) => {
|
|
2814
|
-
utils.overwriteMethod(chai.Assertion.prototype, m, (_super) => {
|
|
2815
|
-
return function(...args) {
|
|
2816
|
-
const promise = utils.flag(this, "promise");
|
|
2817
|
-
const object = utils.flag(this, "object");
|
|
2818
|
-
if (promise === "rejects") {
|
|
2819
|
-
utils.flag(this, "object", () => {
|
|
2820
|
-
throw object;
|
|
2821
|
-
});
|
|
2822
|
-
}
|
|
2823
|
-
_super.apply(this, args);
|
|
2824
|
-
};
|
|
2825
|
-
});
|
|
2826
|
-
});
|
|
2827
|
-
utils.overwriteMethod(chai.Assertion.prototype, "equal", (_super) => {
|
|
2828
|
-
return function(...args) {
|
|
2829
|
-
const expected = args[0];
|
|
2830
|
-
const actual = utils.flag(this, "object");
|
|
2831
|
-
if (hasAsymmetric(expected)) {
|
|
2832
|
-
this.assert(equals(actual, expected, void 0, true), "not match with #{act}", "should not match with #{act}", actual, expected);
|
|
2833
|
-
} else {
|
|
2834
|
-
_super.apply(this, args);
|
|
2835
|
-
}
|
|
2836
|
-
};
|
|
2837
|
-
});
|
|
2838
|
-
utils.overwriteMethod(chai.Assertion.prototype, "eql", (_super) => {
|
|
2839
|
-
return function(...args) {
|
|
2840
|
-
const expected = args[0];
|
|
2841
|
-
const actual = utils.flag(this, "object");
|
|
2842
|
-
if (hasAsymmetric(expected)) {
|
|
2843
|
-
this.assert(equals(actual, expected), "not match with #{exp}", "should not match with #{exp}", expected, actual);
|
|
2844
|
-
} else {
|
|
2845
|
-
_super.apply(this, args);
|
|
2846
|
-
}
|
|
2847
|
-
};
|
|
2848
|
-
});
|
|
2849
|
-
def("toEqual", function(expected) {
|
|
2850
|
-
return this.eql(expected);
|
|
2851
|
-
});
|
|
2852
|
-
def("toStrictEqual", function(expected) {
|
|
2853
|
-
const obj = utils.flag(this, "object");
|
|
2854
|
-
const equal = equals(obj, expected, [
|
|
2855
|
-
iterableEquality,
|
|
2856
|
-
typeEquality,
|
|
2857
|
-
sparseArrayEquality,
|
|
2858
|
-
arrayBufferEquality
|
|
2859
|
-
], true);
|
|
2860
|
-
return this.assert(equal, "expected #{this} to strictly equal #{exp}", "expected #{this} to not strictly equal #{exp}", expected, obj);
|
|
2861
|
-
});
|
|
2862
|
-
def("toBe", function(expected) {
|
|
2863
|
-
return this.equal(expected);
|
|
2864
|
-
});
|
|
2865
|
-
def("toMatchObject", function(expected) {
|
|
2866
|
-
return this.containSubset(expected);
|
|
2867
|
-
});
|
|
2868
|
-
def("toMatch", function(expected) {
|
|
2869
|
-
if (typeof expected === "string")
|
|
2870
|
-
return this.include(expected);
|
|
2871
|
-
else
|
|
2872
|
-
return this.match(expected);
|
|
2873
|
-
});
|
|
2874
|
-
def("toContain", function(item) {
|
|
2875
|
-
return this.contain(item);
|
|
2876
|
-
});
|
|
2877
|
-
def("toContainEqual", function(expected) {
|
|
2878
|
-
const obj = utils.flag(this, "object");
|
|
2879
|
-
const index = Array.from(obj).findIndex((item) => {
|
|
2880
|
-
return equals(item, expected);
|
|
2881
|
-
});
|
|
2882
|
-
this.assert(index !== -1, "expected #{this} to deep equally contain #{exp}", "expected #{this} to not deep equally contain #{exp}", expected);
|
|
2883
|
-
});
|
|
2884
|
-
def("toBeTruthy", function() {
|
|
2885
|
-
const obj = utils.flag(this, "object");
|
|
2886
|
-
this.assert(Boolean(obj), "expected #{this} to be truthy", "expected #{this} to not be truthy", obj);
|
|
2887
|
-
});
|
|
2888
|
-
def("toBeFalsy", function() {
|
|
2889
|
-
const obj = utils.flag(this, "object");
|
|
2890
|
-
this.assert(!obj, "expected #{this} to be falsy", "expected #{this} to not be falsy", obj);
|
|
2891
|
-
});
|
|
2892
|
-
def("toBeGreaterThan", function(expected) {
|
|
2893
|
-
return this.to.greaterThan(expected);
|
|
2894
|
-
});
|
|
2895
|
-
def("toBeGreaterThanOrEqual", function(expected) {
|
|
2896
|
-
return this.to.greaterThanOrEqual(expected);
|
|
2897
|
-
});
|
|
2898
|
-
def("toBeLessThan", function(expected) {
|
|
2899
|
-
return this.to.lessThan(expected);
|
|
2900
|
-
});
|
|
2901
|
-
def("toBeLessThanOrEqual", function(expected) {
|
|
2902
|
-
return this.to.lessThanOrEqual(expected);
|
|
2903
|
-
});
|
|
2904
|
-
def("toBeNaN", function() {
|
|
2905
|
-
return this.be.NaN;
|
|
2906
|
-
});
|
|
2907
|
-
def("toBeUndefined", function() {
|
|
2908
|
-
return this.be.undefined;
|
|
2909
|
-
});
|
|
2910
|
-
def("toBeNull", function() {
|
|
2911
|
-
return this.be.null;
|
|
2912
|
-
});
|
|
2913
|
-
def("toBeDefined", function() {
|
|
2914
|
-
const negate = utils.flag(this, "negate");
|
|
2915
|
-
utils.flag(this, "negate", false);
|
|
2916
|
-
if (negate)
|
|
2917
|
-
return this.be.undefined;
|
|
2918
|
-
return this.not.be.undefined;
|
|
2919
|
-
});
|
|
2920
|
-
def("toBeInstanceOf", function(obj) {
|
|
2921
|
-
return this.instanceOf(obj);
|
|
2922
|
-
});
|
|
2923
|
-
def("toHaveLength", function(length) {
|
|
2924
|
-
return this.have.length(length);
|
|
2925
|
-
});
|
|
2926
|
-
def("toHaveProperty", function(...args) {
|
|
2927
|
-
return this.have.deep.nested.property(...args);
|
|
2928
|
-
});
|
|
2929
|
-
def("toBeCloseTo", function(received, precision = 2) {
|
|
2930
|
-
const expected = this._obj;
|
|
2931
|
-
let pass = false;
|
|
2932
|
-
let expectedDiff = 0;
|
|
2933
|
-
let receivedDiff = 0;
|
|
2934
|
-
if (received === Infinity && expected === Infinity) {
|
|
2935
|
-
pass = true;
|
|
2936
|
-
} else if (received === -Infinity && expected === -Infinity) {
|
|
2937
|
-
pass = true;
|
|
2938
|
-
} else {
|
|
2939
|
-
expectedDiff = Math.pow(10, -precision) / 2;
|
|
2940
|
-
receivedDiff = Math.abs(expected - received);
|
|
2941
|
-
pass = receivedDiff < expectedDiff;
|
|
2942
|
-
}
|
|
2943
|
-
return this.assert(pass, `expected #{this} to be close to #{exp}, received difference is ${receivedDiff}, but expected ${expectedDiff}`, `expected #{this} to not be close to #{exp}, received difference is ${receivedDiff}, but expected ${expectedDiff}`, received, expected);
|
|
2944
|
-
});
|
|
2945
|
-
const assertIsMock = (assertion) => {
|
|
2946
|
-
if (!isMockFunction(assertion._obj))
|
|
2947
|
-
throw new TypeError(`${utils.inspect(assertion._obj)} is not a spy or a call to a spy!`);
|
|
2948
|
-
};
|
|
2949
|
-
const getSpy = (assertion) => {
|
|
2950
|
-
assertIsMock(assertion);
|
|
2951
|
-
return assertion._obj;
|
|
2952
|
-
};
|
|
2953
|
-
def(["toHaveBeenCalledTimes", "toBeCalledTimes"], function(number) {
|
|
2954
|
-
const spy = getSpy(this);
|
|
2955
|
-
const spyName = spy.getMockName();
|
|
2956
|
-
const callCount = spy.mock.calls.length;
|
|
2957
|
-
return this.assert(callCount === number, `expected "${spyName}" to be called #{exp} times`, `expected "${spyName}" to not be called #{exp} times`, number, callCount);
|
|
2958
|
-
});
|
|
2959
|
-
def("toHaveBeenCalledOnce", function() {
|
|
2960
|
-
const spy = getSpy(this);
|
|
2961
|
-
const spyName = spy.getMockName();
|
|
2962
|
-
const callCount = spy.mock.calls.length;
|
|
2963
|
-
return this.assert(callCount === 1, `expected "${spyName}" to be called once`, `expected "${spyName}" to not be called once`, 1, callCount);
|
|
2964
|
-
});
|
|
2965
|
-
def(["toHaveBeenCalled", "toBeCalled"], function() {
|
|
2966
|
-
const spy = getSpy(this);
|
|
2967
|
-
const spyName = spy.getMockName();
|
|
2968
|
-
const called = spy.mock.calls.length > 0;
|
|
2969
|
-
return this.assert(called, `expected "${spyName}" to be called at least once`, `expected "${spyName}" to not be called at all`, true, called);
|
|
2970
|
-
});
|
|
2971
|
-
def(["toHaveBeenCalledWith", "toBeCalledWith"], function(...args) {
|
|
2972
|
-
const spy = getSpy(this);
|
|
2973
|
-
const spyName = spy.getMockName();
|
|
2974
|
-
const pass = spy.mock.calls.some((callArg) => equals(callArg, args, [iterableEquality]));
|
|
2975
|
-
return this.assert(pass, `expected "${spyName}" to be called with arguments: #{exp}`, `expected "${spyName}" to not be called with arguments: #{exp}`, args, spy.mock.calls);
|
|
2976
|
-
});
|
|
2977
|
-
const ordinalOf = (i) => {
|
|
2978
|
-
const j = i % 10;
|
|
2979
|
-
const k = i % 100;
|
|
2980
|
-
if (j === 1 && k !== 11)
|
|
2981
|
-
return `${i}st`;
|
|
2982
|
-
if (j === 2 && k !== 12)
|
|
2983
|
-
return `${i}nd`;
|
|
2984
|
-
if (j === 3 && k !== 13)
|
|
2985
|
-
return `${i}rd`;
|
|
2986
|
-
return `${i}th`;
|
|
2987
|
-
};
|
|
2988
|
-
def(["toHaveBeenNthCalledWith", "nthCalledWith"], function(times, ...args) {
|
|
2989
|
-
const spy = getSpy(this);
|
|
2990
|
-
const spyName = spy.getMockName();
|
|
2991
|
-
const nthCall = spy.mock.calls[times - 1];
|
|
2992
|
-
this.assert(equals(nthCall, args, [iterableEquality]), `expected ${ordinalOf(times)} "${spyName}" call to have been called with #{exp}`, `expected ${ordinalOf(times)} "${spyName}" call to not have been called with #{exp}`, args, nthCall);
|
|
2993
|
-
});
|
|
2994
|
-
def(["toHaveBeenLastCalledWith", "lastCalledWith"], function(...args) {
|
|
2995
|
-
const spy = getSpy(this);
|
|
2996
|
-
const spyName = spy.getMockName();
|
|
2997
|
-
const lastCall = spy.mock.calls[spy.calls.length - 1];
|
|
2998
|
-
this.assert(equals(lastCall, args, [iterableEquality]), `expected last "${spyName}" call to have been called with #{exp}`, `expected last "${spyName}" call to not have been called with #{exp}`, args, lastCall);
|
|
2999
|
-
});
|
|
3000
|
-
def(["toThrow", "toThrowError"], function(expected) {
|
|
3001
|
-
const obj = this._obj;
|
|
3002
|
-
const promise = utils.flag(this, "promise");
|
|
3003
|
-
let thrown = null;
|
|
3004
|
-
if (promise) {
|
|
3005
|
-
thrown = obj;
|
|
3006
|
-
} else {
|
|
3007
|
-
try {
|
|
3008
|
-
obj();
|
|
3009
|
-
} catch (err) {
|
|
3010
|
-
thrown = err;
|
|
3011
|
-
}
|
|
3012
|
-
}
|
|
3013
|
-
if (typeof expected === "function") {
|
|
3014
|
-
const name = expected.name || expected.prototype.constructor.name;
|
|
3015
|
-
return this.assert(thrown && thrown instanceof expected, `expected error to be instance of ${name}`, `expected error not to be instance of ${name}`, expected, thrown);
|
|
3016
|
-
}
|
|
3017
|
-
if (expected && expected instanceof Error) {
|
|
3018
|
-
return this.assert(thrown && expected.message === thrown.message, `expected error to have message: ${expected.message}`, `expected error not to have message: ${expected.message}`, expected.message, thrown && thrown.message);
|
|
3019
|
-
}
|
|
3020
|
-
if (expected && typeof expected.asymmetricMatch === "function") {
|
|
3021
|
-
const matcher = expected;
|
|
3022
|
-
return this.assert(thrown && matcher.asymmetricMatch(thrown), "expected error to match asymmetric matcher", "expected error not to match asymmetric matcher", matcher.toString(), thrown);
|
|
3023
|
-
}
|
|
3024
|
-
return this.to.throws(expected);
|
|
3025
|
-
});
|
|
3026
|
-
def(["toHaveReturned", "toReturn"], function() {
|
|
3027
|
-
const spy = getSpy(this);
|
|
3028
|
-
const spyName = spy.getMockName();
|
|
3029
|
-
const calledAndNotThrew = spy.mock.calls.length > 0 && !spy.mock.results.some(({ type }) => type === "throw");
|
|
3030
|
-
this.assert(calledAndNotThrew, `expected "${spyName}" to be successfully called at least once`, `expected "${spyName}" to not be successfully called`, calledAndNotThrew, !calledAndNotThrew);
|
|
3031
|
-
});
|
|
3032
|
-
def(["toHaveReturnedTimes", "toReturnTimes"], function(times) {
|
|
3033
|
-
const spy = getSpy(this);
|
|
3034
|
-
const spyName = spy.getMockName();
|
|
3035
|
-
const successfullReturns = spy.mock.results.reduce((success, { type }) => type === "throw" ? success : ++success, 0);
|
|
3036
|
-
this.assert(successfullReturns === times, `expected "${spyName}" to be successfully called ${times} times`, `expected "${spyName}" to not be successfully called ${times} times`, `expected number of returns: ${times}`, `received number of returns: ${successfullReturns}`);
|
|
3037
|
-
});
|
|
3038
|
-
def(["toHaveReturnedWith", "toReturnWith"], function(value) {
|
|
3039
|
-
const spy = getSpy(this);
|
|
3040
|
-
const spyName = spy.getMockName();
|
|
3041
|
-
const pass = spy.mock.results.some(({ type, value: result }) => type === "return" && equals(value, result));
|
|
3042
|
-
this.assert(pass, `expected "${spyName}" to be successfully called with #{exp}`, `expected "${spyName}" to not be successfully called with #{exp}`, value);
|
|
3043
|
-
});
|
|
3044
|
-
def(["toHaveLastReturnedWith", "lastReturnedWith"], function(value) {
|
|
3045
|
-
const spy = getSpy(this);
|
|
3046
|
-
const spyName = spy.getMockName();
|
|
3047
|
-
const { value: lastResult } = spy.mock.results[spy.returns.length - 1];
|
|
3048
|
-
const pass = equals(lastResult, value);
|
|
3049
|
-
this.assert(pass, `expected last "${spyName}" call to return #{exp}`, `expected last "${spyName}" call to not return #{exp}`, value, lastResult);
|
|
3050
|
-
});
|
|
3051
|
-
def(["toHaveNthReturnedWith", "nthReturnedWith"], function(nthCall, value) {
|
|
3052
|
-
const spy = getSpy(this);
|
|
3053
|
-
const spyName = spy.getMockName();
|
|
3054
|
-
const isNot = utils.flag(this, "negate");
|
|
3055
|
-
const { type: callType, value: callResult } = spy.mock.results[nthCall - 1];
|
|
3056
|
-
const ordinalCall = `${ordinalOf(nthCall)} call`;
|
|
3057
|
-
if (!isNot && callType === "throw")
|
|
3058
|
-
chai.assert.fail(`expected ${ordinalCall} to return #{exp}, but instead it threw an error`);
|
|
3059
|
-
const nthCallReturn = equals(callResult, value);
|
|
3060
|
-
this.assert(nthCallReturn, `expected ${ordinalCall} "${spyName}" call to return #{exp}`, `expected ${ordinalCall} "${spyName}" call to not return #{exp}`, value, callResult);
|
|
3061
|
-
});
|
|
3062
|
-
utils.addProperty(chai.Assertion.prototype, "resolves", function() {
|
|
3063
|
-
utils.flag(this, "promise", "resolves");
|
|
3064
|
-
const obj = utils.flag(this, "object");
|
|
3065
|
-
const proxy = new Proxy(this, {
|
|
3066
|
-
get: (target, key, reciever) => {
|
|
3067
|
-
const result = Reflect.get(target, key, reciever);
|
|
3068
|
-
if (typeof result !== "function")
|
|
3069
|
-
return result instanceof chai.Assertion ? proxy : result;
|
|
3070
|
-
return async (...args) => {
|
|
3071
|
-
return obj.then((value) => {
|
|
3072
|
-
utils.flag(this, "object", value);
|
|
3073
|
-
return result.call(this, ...args);
|
|
3074
|
-
}, (err) => {
|
|
3075
|
-
throw new Error(`promise rejected "${err}" instead of resolving`);
|
|
3076
|
-
});
|
|
3077
|
-
};
|
|
3078
|
-
}
|
|
3079
|
-
});
|
|
3080
|
-
return proxy;
|
|
3081
|
-
});
|
|
3082
|
-
utils.addProperty(chai.Assertion.prototype, "rejects", function() {
|
|
3083
|
-
utils.flag(this, "promise", "rejects");
|
|
3084
|
-
const obj = utils.flag(this, "object");
|
|
3085
|
-
const wrapper = typeof obj === "function" ? obj() : obj;
|
|
3086
|
-
const proxy = new Proxy(this, {
|
|
3087
|
-
get: (target, key, reciever) => {
|
|
3088
|
-
const result = Reflect.get(target, key, reciever);
|
|
3089
|
-
if (typeof result !== "function")
|
|
3090
|
-
return result instanceof chai.Assertion ? proxy : result;
|
|
3091
|
-
return async (...args) => {
|
|
3092
|
-
return wrapper.then((value) => {
|
|
3093
|
-
throw new Error(`promise resolved "${value}" instead of rejecting`);
|
|
3094
|
-
}, (err) => {
|
|
3095
|
-
utils.flag(this, "object", err);
|
|
3096
|
-
return result.call(this, ...args);
|
|
3097
|
-
});
|
|
3098
|
-
};
|
|
3099
|
-
}
|
|
3100
|
-
});
|
|
3101
|
-
return proxy;
|
|
3102
|
-
});
|
|
3103
|
-
utils.addMethod(chai.expect, "assertions", function assertions(expected) {
|
|
3104
|
-
const error = new Error(`expected number of assertions to be ${expected}, but got ${getState().assertionCalls}`);
|
|
3105
|
-
if (Error.captureStackTrace)
|
|
3106
|
-
Error.captureStackTrace(error, assertions);
|
|
3107
|
-
setState({
|
|
3108
|
-
expectedAssertionsNumber: expected,
|
|
3109
|
-
expectedAssertionsNumberError: error
|
|
3110
|
-
});
|
|
3111
|
-
});
|
|
3112
|
-
utils.addMethod(chai.expect, "hasAssertions", function hasAssertions() {
|
|
3113
|
-
const error = new Error("expected any number of assertion, but got none");
|
|
3114
|
-
if (Error.captureStackTrace)
|
|
3115
|
-
Error.captureStackTrace(error, hasAssertions);
|
|
3116
|
-
setState({
|
|
3117
|
-
isExpectingAssertions: true,
|
|
3118
|
-
isExpectingAssertionsError: error
|
|
3119
|
-
});
|
|
3120
|
-
});
|
|
3121
|
-
utils.addMethod(chai.expect, "addSnapshotSerializer", addSerializer);
|
|
3122
|
-
};
|
|
3123
|
-
|
|
3124
|
-
var mockdate$1 = {exports: {}};
|
|
3125
|
-
|
|
3126
|
-
(function (module, exports) {
|
|
3127
|
-
(function (global, factory) {
|
|
3128
|
-
factory(exports) ;
|
|
3129
|
-
}(commonjsGlobal, (function (exports) {
|
|
3130
|
-
/*! *****************************************************************************
|
|
3131
|
-
Copyright (c) Microsoft Corporation.
|
|
3132
|
-
|
|
3133
|
-
Permission to use, copy, modify, and/or distribute this software for any
|
|
3134
|
-
purpose with or without fee is hereby granted.
|
|
3135
|
-
|
|
3136
|
-
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
3137
|
-
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
3138
|
-
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
3139
|
-
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
3140
|
-
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
3141
|
-
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
3142
|
-
PERFORMANCE OF THIS SOFTWARE.
|
|
3143
|
-
***************************************************************************** */
|
|
3144
|
-
/* global Reflect, Promise */
|
|
3145
|
-
|
|
3146
|
-
var extendStatics = function(d, b) {
|
|
3147
|
-
extendStatics = Object.setPrototypeOf ||
|
|
3148
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
3149
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
3150
|
-
return extendStatics(d, b);
|
|
3151
|
-
};
|
|
3152
|
-
|
|
3153
|
-
function __extends(d, b) {
|
|
3154
|
-
if (typeof b !== "function" && b !== null)
|
|
3155
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
3156
|
-
extendStatics(d, b);
|
|
3157
|
-
function __() { this.constructor = d; }
|
|
3158
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
3159
|
-
}
|
|
3160
|
-
|
|
3161
|
-
var RealDate = Date;
|
|
3162
|
-
var now = null;
|
|
3163
|
-
var MockDate = /** @class */ (function (_super) {
|
|
3164
|
-
__extends(Date, _super);
|
|
3165
|
-
function Date(y, m, d, h, M, s, ms) {
|
|
3166
|
-
_super.call(this) || this;
|
|
3167
|
-
var date;
|
|
3168
|
-
switch (arguments.length) {
|
|
3169
|
-
case 0:
|
|
3170
|
-
if (now !== null) {
|
|
3171
|
-
date = new RealDate(now.valueOf());
|
|
3172
|
-
}
|
|
3173
|
-
else {
|
|
3174
|
-
date = new RealDate();
|
|
3175
|
-
}
|
|
3176
|
-
break;
|
|
3177
|
-
case 1:
|
|
3178
|
-
date = new RealDate(y);
|
|
3179
|
-
break;
|
|
3180
|
-
default:
|
|
3181
|
-
d = typeof d === 'undefined' ? 1 : d;
|
|
3182
|
-
h = h || 0;
|
|
3183
|
-
M = M || 0;
|
|
3184
|
-
s = s || 0;
|
|
3185
|
-
ms = ms || 0;
|
|
3186
|
-
date = new RealDate(y, m, d, h, M, s, ms);
|
|
3187
|
-
break;
|
|
3188
|
-
}
|
|
3189
|
-
return date;
|
|
3190
|
-
}
|
|
3191
|
-
return Date;
|
|
3192
|
-
}(RealDate));
|
|
3193
|
-
MockDate.prototype = RealDate.prototype;
|
|
3194
|
-
MockDate.UTC = RealDate.UTC;
|
|
3195
|
-
MockDate.now = function () {
|
|
3196
|
-
return new MockDate().valueOf();
|
|
3197
|
-
};
|
|
3198
|
-
MockDate.parse = function (dateString) {
|
|
3199
|
-
return RealDate.parse(dateString);
|
|
3200
|
-
};
|
|
3201
|
-
MockDate.toString = function () {
|
|
3202
|
-
return RealDate.toString();
|
|
3203
|
-
};
|
|
3204
|
-
function set(date) {
|
|
3205
|
-
var dateObj = new Date(date.valueOf());
|
|
3206
|
-
if (isNaN(dateObj.getTime())) {
|
|
3207
|
-
throw new TypeError('mockdate: The time set is an invalid date: ' + date);
|
|
3208
|
-
}
|
|
3209
|
-
// @ts-ignore
|
|
3210
|
-
Date = MockDate;
|
|
3211
|
-
now = dateObj.valueOf();
|
|
3212
|
-
}
|
|
3213
|
-
function reset() {
|
|
3214
|
-
Date = RealDate;
|
|
3215
|
-
}
|
|
3216
|
-
var mockdate = {
|
|
3217
|
-
set: set,
|
|
3218
|
-
reset: reset,
|
|
3219
|
-
};
|
|
3220
|
-
|
|
3221
|
-
exports.default = mockdate;
|
|
3222
|
-
exports.reset = reset;
|
|
3223
|
-
exports.set = set;
|
|
3224
|
-
|
|
3225
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
3226
|
-
|
|
3227
|
-
})));
|
|
3228
|
-
}(mockdate$1, mockdate$1.exports));
|
|
3229
|
-
|
|
3230
|
-
var mockdate = /*@__PURE__*/getDefaultExportFromCjs(mockdate$1.exports);
|
|
3231
|
-
|
|
3232
|
-
const originalSetTimeout = global.setTimeout;
|
|
3233
|
-
const originalSetInterval = global.setInterval;
|
|
3234
|
-
const originalClearTimeout = global.clearTimeout;
|
|
3235
|
-
const originalClearInterval = global.clearInterval;
|
|
3236
|
-
const MAX_LOOPS = 1e4;
|
|
3237
|
-
var QueueTaskType;
|
|
3238
|
-
(function(QueueTaskType2) {
|
|
3239
|
-
QueueTaskType2["Interval"] = "interval";
|
|
3240
|
-
QueueTaskType2["Timeout"] = "timeout";
|
|
3241
|
-
QueueTaskType2["Immediate"] = "immediate";
|
|
3242
|
-
})(QueueTaskType || (QueueTaskType = {}));
|
|
3243
|
-
const assertEvery = (assertions, message) => {
|
|
3244
|
-
if (assertions.some((a) => !a))
|
|
3245
|
-
throw new Error(message);
|
|
3246
|
-
};
|
|
3247
|
-
const assertMaxLoop = (times) => {
|
|
3248
|
-
if (times >= MAX_LOOPS)
|
|
3249
|
-
throw new Error("setTimeout/setInterval called 10 000 times. It's possible it stuck in an infinite loop.");
|
|
3250
|
-
};
|
|
3251
|
-
const getNodeTimeout = (id) => {
|
|
3252
|
-
const timer = {
|
|
3253
|
-
ref: () => timer,
|
|
3254
|
-
unref: () => timer,
|
|
3255
|
-
hasRef: () => true,
|
|
3256
|
-
refresh: () => timer,
|
|
3257
|
-
[Symbol.toPrimitive]: () => id
|
|
3258
|
-
};
|
|
3259
|
-
return timer;
|
|
3260
|
-
};
|
|
3261
|
-
class FakeTimers {
|
|
3262
|
-
constructor() {
|
|
3263
|
-
this._advancedTime = 0;
|
|
3264
|
-
this._nestedTime = {};
|
|
3265
|
-
this._scopeId = 0;
|
|
3266
|
-
this._isNested = false;
|
|
3267
|
-
this._isOnlyPending = false;
|
|
3268
|
-
this._spyid = 0;
|
|
3269
|
-
this._isMocked = false;
|
|
3270
|
-
this._tasksQueue = [];
|
|
3271
|
-
this._queueCount = 0;
|
|
3272
|
-
}
|
|
3273
|
-
useFakeTimers() {
|
|
3274
|
-
this._isMocked = true;
|
|
3275
|
-
this.reset();
|
|
3276
|
-
const spyFactory = (spyType, resultBuilder) => {
|
|
3277
|
-
return (cb, ms = 0) => {
|
|
3278
|
-
const id = ++this._spyid;
|
|
3279
|
-
const nestedTo = Object.entries(this._nestedTime).filter(([key]) => Number(key) <= this._scopeId);
|
|
3280
|
-
const nestedMs = nestedTo.reduce((total, [, ms2]) => total + ms2, ms);
|
|
3281
|
-
const call = { id, cb, ms, nestedMs, scopeId: this._scopeId };
|
|
3282
|
-
const task = { type: spyType, call, nested: this._isNested };
|
|
3283
|
-
this.pushTask(task);
|
|
3284
|
-
return resultBuilder(id, cb);
|
|
3285
|
-
};
|
|
3286
|
-
};
|
|
3287
|
-
this._setTimeout = spyOn(global, "setTimeout").mockImplementation(spyFactory(QueueTaskType.Timeout, getNodeTimeout));
|
|
3288
|
-
this._setInterval = spyOn(global, "setInterval").mockImplementation(spyFactory(QueueTaskType.Interval, getNodeTimeout));
|
|
3289
|
-
const clearTimerFactory = (spyType) => (id) => {
|
|
3290
|
-
if (id === void 0)
|
|
3291
|
-
return;
|
|
3292
|
-
const index = this._tasksQueue.findIndex(({ call, type }) => type === spyType && call.id === Number(id));
|
|
3293
|
-
if (index !== -1)
|
|
3294
|
-
this._tasksQueue.splice(index, 1);
|
|
3295
|
-
};
|
|
3296
|
-
this._clearTimeout = spyOn(global, "clearTimeout").mockImplementation(clearTimerFactory(QueueTaskType.Timeout));
|
|
3297
|
-
this._clearInterval = spyOn(global, "clearInterval").mockImplementation(clearTimerFactory(QueueTaskType.Interval));
|
|
3298
|
-
}
|
|
3299
|
-
useRealTimers() {
|
|
3300
|
-
this._isMocked = false;
|
|
3301
|
-
this.reset();
|
|
3302
|
-
global.setTimeout = originalSetTimeout;
|
|
3303
|
-
global.setInterval = originalSetInterval;
|
|
3304
|
-
global.clearTimeout = originalClearTimeout;
|
|
3305
|
-
global.clearInterval = originalClearInterval;
|
|
3306
|
-
}
|
|
3307
|
-
runOnlyPendingTimers() {
|
|
3308
|
-
this.assertMocked();
|
|
3309
|
-
this._isOnlyPending = true;
|
|
3310
|
-
this.runQueue();
|
|
3311
|
-
}
|
|
3312
|
-
runAllTimers() {
|
|
3313
|
-
this.assertMocked();
|
|
3314
|
-
this.runQueue();
|
|
3315
|
-
}
|
|
3316
|
-
advanceTimersByTime(ms) {
|
|
3317
|
-
this.assertMocked();
|
|
3318
|
-
this._advancedTime += ms;
|
|
3319
|
-
this.runQueue();
|
|
3320
|
-
}
|
|
3321
|
-
advanceTimersToNextTimer() {
|
|
3322
|
-
this.assertMocked();
|
|
3323
|
-
this.callQueueItem(0);
|
|
3324
|
-
}
|
|
3325
|
-
getTimerCount() {
|
|
3326
|
-
this.assertMocked();
|
|
3327
|
-
return this._tasksQueue.length;
|
|
3328
|
-
}
|
|
3329
|
-
reset() {
|
|
3330
|
-
var _a, _b, _c, _d;
|
|
3331
|
-
this._advancedTime = 0;
|
|
3332
|
-
this._nestedTime = {};
|
|
3333
|
-
this._isNested = false;
|
|
3334
|
-
this._isOnlyPending = false;
|
|
3335
|
-
this._spyid = 0;
|
|
3336
|
-
this._queueCount = 0;
|
|
3337
|
-
this._tasksQueue = [];
|
|
3338
|
-
(_a = this._clearInterval) == null ? void 0 : _a.mockRestore();
|
|
3339
|
-
(_b = this._clearTimeout) == null ? void 0 : _b.mockRestore();
|
|
3340
|
-
(_c = this._setInterval) == null ? void 0 : _c.mockRestore();
|
|
3341
|
-
(_d = this._setTimeout) == null ? void 0 : _d.mockRestore();
|
|
3342
|
-
}
|
|
3343
|
-
callQueueItem(index) {
|
|
3344
|
-
var _a, _b;
|
|
3345
|
-
const task = this._tasksQueue[index];
|
|
3346
|
-
if (!task)
|
|
3347
|
-
return;
|
|
3348
|
-
const { call, type } = task;
|
|
3349
|
-
this._scopeId = call.id;
|
|
3350
|
-
this._isNested = true;
|
|
3351
|
-
(_a = this._nestedTime)[_b = call.id] ?? (_a[_b] = 0);
|
|
3352
|
-
this._nestedTime[call.id] += call.ms;
|
|
3353
|
-
if (type === "timeout") {
|
|
3354
|
-
this.removeTask(index);
|
|
3355
|
-
} else if (type === "interval") {
|
|
3356
|
-
call.nestedMs += call.ms;
|
|
3357
|
-
const nestedMs = call.nestedMs;
|
|
3358
|
-
const closestTask = this._tasksQueue.findIndex(({ type: type2, call: call2 }) => type2 === "interval" && call2.nestedMs < nestedMs);
|
|
3359
|
-
if (closestTask !== -1 && closestTask !== index)
|
|
3360
|
-
this.ensureQueueOrder();
|
|
3361
|
-
}
|
|
3362
|
-
call.cb();
|
|
3363
|
-
this._queueCount++;
|
|
3364
|
-
}
|
|
3365
|
-
runQueue() {
|
|
3366
|
-
let index = 0;
|
|
3367
|
-
while (this._tasksQueue[index]) {
|
|
3368
|
-
assertMaxLoop(this._queueCount);
|
|
3369
|
-
const { call, nested } = this._tasksQueue[index];
|
|
3370
|
-
if (this._advancedTime && call.nestedMs > this._advancedTime)
|
|
3371
|
-
break;
|
|
3372
|
-
if (this._isOnlyPending && nested) {
|
|
3373
|
-
index++;
|
|
3374
|
-
continue;
|
|
3375
|
-
}
|
|
3376
|
-
this.callQueueItem(index);
|
|
3377
|
-
}
|
|
3378
|
-
}
|
|
3379
|
-
removeTask(index) {
|
|
3380
|
-
if (index === 0)
|
|
3381
|
-
this._tasksQueue.shift();
|
|
3382
|
-
else
|
|
3383
|
-
this._tasksQueue.splice(index, 1);
|
|
3384
|
-
}
|
|
3385
|
-
pushTask(task) {
|
|
3386
|
-
this._tasksQueue.push(task);
|
|
3387
|
-
this.ensureQueueOrder();
|
|
3388
|
-
}
|
|
3389
|
-
ensureQueueOrder() {
|
|
3390
|
-
this._tasksQueue.sort((t1, t2) => {
|
|
3391
|
-
const diff = t1.call.nestedMs - t2.call.nestedMs;
|
|
3392
|
-
if (diff === 0) {
|
|
3393
|
-
if (t1.type === QueueTaskType.Immediate && t2.type !== QueueTaskType.Immediate)
|
|
3394
|
-
return 1;
|
|
3395
|
-
return 0;
|
|
3396
|
-
}
|
|
3397
|
-
return diff;
|
|
3398
|
-
});
|
|
3399
|
-
}
|
|
3400
|
-
assertMocked() {
|
|
3401
|
-
assertEvery([
|
|
3402
|
-
this._isMocked,
|
|
3403
|
-
this._setTimeout,
|
|
3404
|
-
this._setInterval,
|
|
3405
|
-
this._clearTimeout,
|
|
3406
|
-
this._clearInterval
|
|
3407
|
-
], 'timers are not mocked. try calling "vi.useFakeTimers()" first');
|
|
3408
|
-
}
|
|
3409
|
-
}
|
|
3410
|
-
|
|
3411
|
-
class VitestUtils {
|
|
3412
|
-
constructor() {
|
|
3413
|
-
this.spyOn = spyOn;
|
|
3414
|
-
this.fn = fn;
|
|
3415
|
-
this._timers = new FakeTimers();
|
|
3416
|
-
this._mocker = typeof __vitest_mocker__ !== "undefined" ? __vitest_mocker__ : null;
|
|
3417
|
-
this._mockedDate = null;
|
|
3418
|
-
if (!this._mocker)
|
|
3419
|
-
throw new Error("Vitest was initialised with native Node instead of Vite Node");
|
|
3420
|
-
}
|
|
3421
|
-
useFakeTimers() {
|
|
3422
|
-
return this._timers.useFakeTimers();
|
|
3423
|
-
}
|
|
3424
|
-
useRealTimers() {
|
|
3425
|
-
return this._timers.useRealTimers();
|
|
3426
|
-
}
|
|
3427
|
-
runOnlyPendingTimers() {
|
|
3428
|
-
return this._timers.runOnlyPendingTimers();
|
|
3429
|
-
}
|
|
3430
|
-
runAllTimers() {
|
|
3431
|
-
return this._timers.runAllTimers();
|
|
3432
|
-
}
|
|
3433
|
-
advanceTimersByTime(ms) {
|
|
3434
|
-
return this._timers.advanceTimersByTime(ms);
|
|
3435
|
-
}
|
|
3436
|
-
advanceTimersToNextTimer() {
|
|
3437
|
-
return this._timers.advanceTimersToNextTimer();
|
|
3438
|
-
}
|
|
3439
|
-
getTimerCount() {
|
|
3440
|
-
return this._timers.getTimerCount();
|
|
3441
|
-
}
|
|
3442
|
-
mockCurrentDate(date) {
|
|
3443
|
-
this._mockedDate = date;
|
|
3444
|
-
mockdate.set(date);
|
|
3445
|
-
}
|
|
3446
|
-
restoreCurrentDate() {
|
|
3447
|
-
this._mockedDate = null;
|
|
3448
|
-
mockdate.reset();
|
|
3449
|
-
}
|
|
3450
|
-
getMockedDate() {
|
|
3451
|
-
return this._mockedDate;
|
|
3452
|
-
}
|
|
3453
|
-
getImporter() {
|
|
3454
|
-
const err = new Error("mock");
|
|
3455
|
-
const [, , importer] = parseStacktrace(err, true);
|
|
3456
|
-
return importer.file;
|
|
3457
|
-
}
|
|
3458
|
-
mock(path, factory) {
|
|
3459
|
-
this._mocker.queueMock(path, this.getImporter(), factory);
|
|
3460
|
-
}
|
|
3461
|
-
unmock(path) {
|
|
3462
|
-
this._mocker.queueUnmock(path, this.getImporter());
|
|
3463
|
-
}
|
|
3464
|
-
doMock(path, factory) {
|
|
3465
|
-
this._mocker.queueMock(path, this.getImporter(), factory);
|
|
3466
|
-
}
|
|
3467
|
-
doUnmock(path) {
|
|
3468
|
-
this._mocker.queueUnmock(path, this.getImporter());
|
|
3469
|
-
}
|
|
3470
|
-
async importActual(path) {
|
|
3471
|
-
return this._mocker.importActual(path, this.getImporter());
|
|
3472
|
-
}
|
|
3473
|
-
async importMock(path) {
|
|
3474
|
-
return this._mocker.importMock(path, this.getImporter());
|
|
3475
|
-
}
|
|
3476
|
-
mocked(item, _deep = false) {
|
|
3477
|
-
return item;
|
|
3478
|
-
}
|
|
3479
|
-
isMockFunction(fn2) {
|
|
3480
|
-
return isMockFunction(fn2);
|
|
3481
|
-
}
|
|
3482
|
-
clearAllMocks() {
|
|
3483
|
-
this._mocker.clearMocks({ clearMocks: true });
|
|
3484
|
-
spies.forEach((spy) => spy.mockClear());
|
|
3485
|
-
return this;
|
|
3486
|
-
}
|
|
3487
|
-
resetAllMocks() {
|
|
3488
|
-
this._mocker.clearMocks({ mockReset: true });
|
|
3489
|
-
spies.forEach((spy) => spy.mockReset());
|
|
3490
|
-
return this;
|
|
3491
|
-
}
|
|
3492
|
-
restoreAllMocks() {
|
|
3493
|
-
this._mocker.clearMocks({ restoreMocks: true });
|
|
3494
|
-
spies.forEach((spy) => spy.mockRestore());
|
|
3495
|
-
return this;
|
|
3496
|
-
}
|
|
3497
|
-
}
|
|
3498
|
-
const vitest = new VitestUtils();
|
|
3499
|
-
const vi = vitest;
|
|
3500
|
-
|
|
3501
|
-
export { JestChaiExpect as J, getDefaultHookTimeout as a, getState as b, suite as c, describe as d, vi as e, format_1 as f, getCurrentSuite as g, getSerializers as h, it as i, equals as j, iterableEquality as k, subsetEquality as l, isA as m, clearContext as n, defaultSuite as o, plugins_1 as p, setHooks as q, getHooks as r, setState as s, test$7 as t, context as u, vitest as v, withTimeout as w, getFn as x };
|
|
3502
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmktZWRmZTU0MzcuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lL2NoYWluLnRzIiwiLi4vc3JjL3J1bnRpbWUvY29udGV4dC50cyIsIi4uL3NyYy9ydW50aW1lL21hcC50cyIsIi4uL3NyYy9ydW50aW1lL3N1aXRlLnRzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2Fuc2ktc3R5bGVzQDUuMi4wL25vZGVfbW9kdWxlcy9hbnNpLXN0eWxlcy9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmV0dHktZm9ybWF0QDI3LjQuNi9ub2RlX21vZHVsZXMvcHJldHR5LWZvcm1hdC9idWlsZC9jb2xsZWN0aW9ucy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmV0dHktZm9ybWF0QDI3LjQuNi9ub2RlX21vZHVsZXMvcHJldHR5LWZvcm1hdC9idWlsZC9wbHVnaW5zL0FzeW1tZXRyaWNNYXRjaGVyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2Fuc2ktcmVnZXhANS4wLjEvbm9kZV9tb2R1bGVzL2Fuc2ktcmVnZXgvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJldHR5LWZvcm1hdEAyNy40LjYvbm9kZV9tb2R1bGVzL3ByZXR0eS1mb3JtYXQvYnVpbGQvcGx1Z2lucy9Db252ZXJ0QW5zaS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmV0dHktZm9ybWF0QDI3LjQuNi9ub2RlX21vZHVsZXMvcHJldHR5LWZvcm1hdC9idWlsZC9wbHVnaW5zL0RPTUNvbGxlY3Rpb24uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJldHR5LWZvcm1hdEAyNy40LjYvbm9kZV9tb2R1bGVzL3ByZXR0eS1mb3JtYXQvYnVpbGQvcGx1Z2lucy9saWIvZXNjYXBlSFRNTC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmV0dHktZm9ybWF0QDI3LjQuNi9ub2RlX21vZHVsZXMvcHJldHR5LWZvcm1hdC9idWlsZC9wbHVnaW5zL2xpYi9tYXJrdXAuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJldHR5LWZvcm1hdEAyNy40LjYvbm9kZV9tb2R1bGVzL3ByZXR0eS1mb3JtYXQvYnVpbGQvcGx1Z2lucy9ET01FbGVtZW50LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3ByZXR0eS1mb3JtYXRAMjcuNC42L25vZGVfbW9kdWxlcy9wcmV0dHktZm9ybWF0L2J1aWxkL3BsdWdpbnMvSW1tdXRhYmxlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3JlYWN0LWlzQDE3LjAuMi9ub2RlX21vZHVsZXMvcmVhY3QtaXMvY2pzL3JlYWN0LWlzLnByb2R1Y3Rpb24ubWluLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3JlYWN0LWlzQDE3LjAuMi9ub2RlX21vZHVsZXMvcmVhY3QtaXMvY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3JlYWN0LWlzQDE3LjAuMi9ub2RlX21vZHVsZXMvcmVhY3QtaXMvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJldHR5LWZvcm1hdEAyNy40LjYvbm9kZV9tb2R1bGVzL3ByZXR0eS1mb3JtYXQvYnVpbGQvcGx1Z2lucy9SZWFjdEVsZW1lbnQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJldHR5LWZvcm1hdEAyNy40LjYvbm9kZV9tb2R1bGVzL3ByZXR0eS1mb3JtYXQvYnVpbGQvcGx1Z2lucy9SZWFjdFRlc3RDb21wb25lbnQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJldHR5LWZvcm1hdEAyNy40LjYvbm9kZV9tb2R1bGVzL3ByZXR0eS1mb3JtYXQvYnVpbGQvaW5kZXguanMiLCIuLi9zcmMvaW50ZWdyYXRpb25zL3NuYXBzaG90L3BvcnQvcGx1Z2lucy50cyIsIi4uL3NyYy9pbnRlZ3JhdGlvbnMvY2hhaS9qZXN0LXV0aWxzLnRzIiwiLi4vc3JjL2ludGVncmF0aW9ucy9jaGFpL2plc3QtZXhwZWN0LnRzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL21vY2tkYXRlQDMuMC41L25vZGVfbW9kdWxlcy9tb2NrZGF0ZS9saWIvbW9ja2RhdGUuanMiLCIuLi9zcmMvaW50ZWdyYXRpb25zL3RpbWVycy50cyIsIi4uL3NyYy9pbnRlZ3JhdGlvbnMvdmkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgQ2hhaW5hYmxlRnVuY3Rpb248VCBleHRlbmRzIHN0cmluZywgQXJncyBleHRlbmRzIGFueVtdLCBSID0gYW55PiA9IHtcbiAgKC4uLmFyZ3M6IEFyZ3MpOiBSXG59ICYge1xuICBbeCBpbiBUXTogQ2hhaW5hYmxlRnVuY3Rpb248VCwgQXJncywgUj5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNoYWluYWJsZTxUIGV4dGVuZHMgc3RyaW5nLCBBcmdzIGV4dGVuZHMgYW55W10sIFIgPSBhbnk+KFxuICBrZXlzOiBUW10sXG4gIGZuOiAodGhpczogUmVjb3JkPFQsIGJvb2xlYW4gfCB1bmRlZmluZWQ+LCAuLi5hcmdzOiBBcmdzKSA9PiBSLFxuKTogQ2hhaW5hYmxlRnVuY3Rpb248VCwgQXJncywgUj4ge1xuICBmdW5jdGlvbiBjcmVhdGUob2JqOiBSZWNvcmQ8VCwgYm9vbGVhbiB8IHVuZGVmaW5lZD4pIHtcbiAgICBjb25zdCBjaGFpbiA9IGZ1bmN0aW9uKHRoaXM6IGFueSwgLi4uYXJnczogQXJncykge1xuICAgICAgcmV0dXJuIGZuLmFwcGx5KG9iaiwgYXJncylcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNoYWluLCBrZXksIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBjcmVhdGUoeyAuLi5vYmosIFtrZXldOiB0cnVlIH0pXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gY2hhaW5cbiAgfVxuXG4gIGNvbnN0IGNoYWluID0gY3JlYXRlKHt9IGFzIGFueSkgYXMgYW55XG4gIGNoYWluLmZuID0gZm5cbiAgcmV0dXJuIGNoYWluXG59XG4iLCJpbXBvcnQgdHlwZSB7IEF3YWl0YWJsZSwgRG9uZUNhbGxiYWNrLCBSdW50aW1lQ29udGV4dCwgU3VpdGVDb2xsZWN0b3IsIFRlc3RGdW5jdGlvbiB9IGZyb20gJy4uL3R5cGVzJ1xuXG5leHBvcnQgY29uc3QgY29udGV4dDogUnVudGltZUNvbnRleHQgPSB7XG4gIHRhc2tzOiBbXSxcbiAgY3VycmVudFN1aXRlOiBudWxsLFxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdFRhc2sodGFzazogU3VpdGVDb2xsZWN0b3IpIHtcbiAgY29udGV4dC5jdXJyZW50U3VpdGU/LnRhc2tzLnB1c2godGFzaylcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhTdWl0ZShzdWl0ZTogU3VpdGVDb2xsZWN0b3IsIGZuOiAoKCkgPT4gQXdhaXRhYmxlPHZvaWQ+KSkge1xuICBjb25zdCBwcmV2ID0gY29udGV4dC5jdXJyZW50U3VpdGVcbiAgY29udGV4dC5jdXJyZW50U3VpdGUgPSBzdWl0ZVxuICBhd2FpdCBmbigpXG4gIGNvbnRleHQuY3VycmVudFN1aXRlID0gcHJldlxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdFRlc3RUaW1lb3V0KCkge1xuICByZXR1cm4gcHJvY2Vzcy5fX3ZpdGVzdF93b3JrZXJfXyEuY29uZmlnIS50ZXN0VGltZW91dFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdEhvb2tUaW1lb3V0KCkge1xuICByZXR1cm4gcHJvY2Vzcy5fX3ZpdGVzdF93b3JrZXJfXyEuY29uZmlnIS5ob29rVGltZW91dFxufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aFRpbWVvdXQ8VCBleHRlbmRzKCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KT4oZm46IFQsIF90aW1lb3V0PzogbnVtYmVyKTogVCB7XG4gIGNvbnN0IHRpbWVvdXQgPSBfdGltZW91dCA/PyBnZXREZWZhdWx0VGVzdFRpbWVvdXQoKVxuICBpZiAodGltZW91dCA8PSAwIHx8IHRpbWVvdXQgPT09IEluZmluaXR5KVxuICAgIHJldHVybiBmblxuXG4gIHJldHVybiAoKC4uLmFyZ3M6IChUIGV4dGVuZHMgKCguLi5hcmdzOiBpbmZlciBBKSA9PiBhbnkpID8gQSA6IG5ldmVyKSkgPT4ge1xuICAgIHJldHVybiBQcm9taXNlLnJhY2UoW2ZuKC4uLmFyZ3MpLCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpXG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFRlc3QgdGltZWQgb3V0IGluICR7dGltZW91dH1tcy5gKSlcbiAgICAgIH0sIHRpbWVvdXQpXG4gICAgICB0aW1lci51bnJlZigpXG4gICAgfSldKSBhcyBBd2FpdGFibGU8dm9pZD5cbiAgfSkgYXMgVFxufVxuXG5mdW5jdGlvbiBlbnN1cmVBc3luY1Rlc3QoZm46IFRlc3RGdW5jdGlvbik6ICgpID0+IEF3YWl0YWJsZTx2b2lkPiB7XG4gIGlmICghZm4ubGVuZ3RoKVxuICAgIHJldHVybiBmbiBhcyAoKSA9PiBBd2FpdGFibGU8dm9pZD5cblxuICByZXR1cm4gKCkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGRvbmU6IERvbmVDYWxsYmFjayA9ICguLi5hcmdzOiBhbnlbXSkgPT4gYXJnc1swXSAvLyByZWplY3Qgb24gdHJ1dGh5IHZhbHVlc1xuICAgICAgPyByZWplY3QoYXJnc1swXSlcbiAgICAgIDogcmVzb2x2ZSgpXG4gICAgZm4oZG9uZSlcbiAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVRlc3QoZm46IFRlc3RGdW5jdGlvbiwgdGltZW91dD86IG51bWJlcik6ICgpID0+IEF3YWl0YWJsZTx2b2lkPiB7XG4gIHJldHVybiB3aXRoVGltZW91dChlbnN1cmVBc3luY1Rlc3QoZm4pLCB0aW1lb3V0KVxufVxuIiwiaW1wb3J0IHR5cGUgeyBBd2FpdGFibGUsIFN1aXRlLCBTdWl0ZUhvb2tzLCBUZXN0IH0gZnJvbSAnLi4vdHlwZXMnXG5cbi8vIHVzZSBXZWFrTWFwIGhlcmUgdG8gbWFrZSB0aGUgVGVzdCBhbmQgU3VpdGUgb2JqZWN0IHNlcmlhbGl6YWJsZVxuY29uc3QgZm5NYXAgPSBuZXcgV2Vha01hcCgpXG5jb25zdCBob29rc01hcCA9IG5ldyBXZWFrTWFwKClcblxuZXhwb3J0IGZ1bmN0aW9uIHNldEZuKGtleTogVGVzdCwgZm46ICgpID0+IEF3YWl0YWJsZTx2b2lkPikge1xuICBmbk1hcC5zZXQoa2V5LCBmbilcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZuKGtleTogVGVzdCk6ICgpID0+IEF3YWl0YWJsZTx2b2lkPiB7XG4gIHJldHVybiBmbk1hcC5nZXQoa2V5KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0SG9va3Moa2V5OiBTdWl0ZSwgaG9va3M6IFN1aXRlSG9va3MpIHtcbiAgaG9va3NNYXAuc2V0KGtleSwgaG9va3MpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRIb29rcyhrZXk6IFN1aXRlKTogU3VpdGVIb29rcyB7XG4gIHJldHVybiBob29rc01hcC5nZXQoa2V5KVxufVxuIiwiaW1wb3J0IHR5cGUgeyBGaWxlLCBSdW5Nb2RlLCBTdWl0ZSwgU3VpdGVDb2xsZWN0b3IsIFN1aXRlSG9va3MsIFRlc3QsIFRlc3RDb2xsZWN0b3IsIFRlc3RGYWN0b3J5LCBUZXN0RnVuY3Rpb24gfSBmcm9tICcuLi90eXBlcydcbmltcG9ydCB7IG5vb3AgfSBmcm9tICcuLi91dGlscydcbmltcG9ydCB7IGNyZWF0ZUNoYWluYWJsZSB9IGZyb20gJy4vY2hhaW4nXG5pbXBvcnQgeyBjb2xsZWN0VGFzaywgY29udGV4dCwgbm9ybWFsaXplVGVzdCwgcnVuV2l0aFN1aXRlIH0gZnJvbSAnLi9jb250ZXh0J1xuaW1wb3J0IHsgZ2V0SG9va3MsIHNldEZuLCBzZXRIb29rcyB9IGZyb20gJy4vbWFwJ1xuXG4vLyBhcGlzXG5leHBvcnQgY29uc3Qgc3VpdGUgPSBjcmVhdGVTdWl0ZSgpXG5leHBvcnQgY29uc3QgdGVzdDogVGVzdENvbGxlY3RvciA9IGNyZWF0ZUNoYWluYWJsZShcbiAgWydjb25jdXJyZW50JywgJ3NraXAnLCAnb25seScsICd0b2RvJywgJ2ZhaWxzJ10sXG4gIGZ1bmN0aW9uKG5hbWU6IHN0cmluZywgZm4/OiBUZXN0RnVuY3Rpb24sIHRpbWVvdXQ/OiBudW1iZXIpIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHVudHlwZWQgaW50ZXJuYWwgcHJvcFxuICAgIGdldEN1cnJlbnRTdWl0ZSgpLnRlc3QuZm4uY2FsbCh0aGlzLCBuYW1lLCBmbiwgdGltZW91dClcbiAgfSxcbilcblxuLy8gYWxpYXNcbmV4cG9ydCBjb25zdCBkZXNjcmliZSA9IHN1aXRlXG5leHBvcnQgY29uc3QgaXQgPSB0ZXN0XG5cbi8vIGltcGxlbWVudGF0aW9uc1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRTdWl0ZSA9IHN1aXRlKCcnKVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJDb250ZXh0KCkge1xuICBjb250ZXh0LnRhc2tzLmxlbmd0aCA9IDBcbiAgZGVmYXVsdFN1aXRlLmNsZWFyKClcbiAgY29udGV4dC5jdXJyZW50U3VpdGUgPSBkZWZhdWx0U3VpdGVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEN1cnJlbnRTdWl0ZSgpIHtcbiAgcmV0dXJuIGNvbnRleHQuY3VycmVudFN1aXRlIHx8IGRlZmF1bHRTdWl0ZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3VpdGVIb29rcygpIHtcbiAgcmV0dXJuIHtcbiAgICBiZWZvcmVBbGw6IFtdLFxuICAgIGFmdGVyQWxsOiBbXSxcbiAgICBiZWZvcmVFYWNoOiBbXSxcbiAgICBhZnRlckVhY2g6IFtdLFxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVN1aXRlQ29sbGVjdG9yKG5hbWU6IHN0cmluZywgZmFjdG9yeTogVGVzdEZhY3RvcnkgPSAoKSA9PiB7IH0sIG1vZGU6IFJ1bk1vZGUsIGNvbmN1cnJlbnQ/OiBib29sZWFuKSB7XG4gIGNvbnN0IHRhc2tzOiAoVGVzdCB8IFN1aXRlIHwgU3VpdGVDb2xsZWN0b3IpW10gPSBbXVxuICBjb25zdCBmYWN0b3J5UXVldWU6IChUZXN0IHwgU3VpdGUgfCBTdWl0ZUNvbGxlY3RvcilbXSA9IFtdXG5cbiAgbGV0IHN1aXRlOiBTdWl0ZVxuXG4gIGluaXRTdWl0ZSgpXG5cbiAgY29uc3QgdGVzdCA9IGNyZWF0ZUNoYWluYWJsZShcbiAgICBbJ2NvbmN1cnJlbnQnLCAnc2tpcCcsICdvbmx5JywgJ3RvZG8nLCAnZmFpbHMnXSxcbiAgICBmdW5jdGlvbihuYW1lOiBzdHJpbmcsIGZuPzogVGVzdEZ1bmN0aW9uLCB0aW1lb3V0PzogbnVtYmVyKSB7XG4gICAgICBjb25zdCBtb2RlID0gdGhpcy5vbmx5ID8gJ29ubHknIDogdGhpcy5za2lwID8gJ3NraXAnIDogdGhpcy50b2RvID8gJ3RvZG8nIDogJ3J1bidcblxuICAgICAgY29uc3QgdGVzdDogVGVzdCA9IHtcbiAgICAgICAgaWQ6ICcnLFxuICAgICAgICB0eXBlOiAndGVzdCcsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIG1vZGUsXG4gICAgICAgIHN1aXRlOiB1bmRlZmluZWQhLFxuICAgICAgICBmYWlsczogdGhpcy5mYWlscyxcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbmN1cnJlbnQgfHwgY29uY3VycmVudClcbiAgICAgICAgdGVzdC5jb25jdXJyZW50ID0gdHJ1ZVxuXG4gICAgICBzZXRGbih0ZXN0LCBub3JtYWxpemVUZXN0KGZuIHx8IG5vb3AsIHRpbWVvdXQpKVxuICAgICAgdGFza3MucHVzaCh0ZXN0KVxuICAgIH0sXG4gIClcblxuICBjb25zdCBjb2xsZWN0b3I6IFN1aXRlQ29sbGVjdG9yID0ge1xuICAgIHR5cGU6ICdjb2xsZWN0b3InLFxuICAgIG5hbWUsXG4gICAgbW9kZSxcbiAgICB0ZXN0LFxuICAgIHRhc2tzLFxuICAgIGNvbGxlY3QsXG4gICAgY2xlYXIsXG4gICAgb246IGFkZEhvb2ssXG4gIH1cblxuICBmdW5jdGlvbiBhZGRIb29rPFQgZXh0ZW5kcyBrZXlvZiBTdWl0ZUhvb2tzPihuYW1lOiBULCAuLi5mbjogU3VpdGVIb29rc1tUXSkge1xuICAgIGdldEhvb2tzKHN1aXRlKVtuYW1lXS5wdXNoKC4uLmZuIGFzIGFueSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRTdWl0ZSgpIHtcbiAgICBzdWl0ZSA9IHtcbiAgICAgIGlkOiAnJyxcbiAgICAgIHR5cGU6ICdzdWl0ZScsXG4gICAgICBuYW1lLFxuICAgICAgbW9kZSxcbiAgICAgIHRhc2tzOiBbXSxcbiAgICB9XG4gICAgc2V0SG9va3Moc3VpdGUsIGNyZWF0ZVN1aXRlSG9va3MoKSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgIHRhc2tzLmxlbmd0aCA9IDBcbiAgICBmYWN0b3J5UXVldWUubGVuZ3RoID0gMFxuICAgIGluaXRTdWl0ZSgpXG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjb2xsZWN0KGZpbGU/OiBGaWxlKSB7XG4gICAgZmFjdG9yeVF1ZXVlLmxlbmd0aCA9IDBcbiAgICBpZiAoZmFjdG9yeSlcbiAgICAgIGF3YWl0IHJ1bldpdGhTdWl0ZShjb2xsZWN0b3IsICgpID0+IGZhY3RvcnkodGVzdCkpXG5cbiAgICBjb25zdCBhbGxDaGlsZHJlbiA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgWy4uLmZhY3RvcnlRdWV1ZSwgLi4udGFza3NdXG4gICAgICAgIC5tYXAoaSA9PiBpLnR5cGUgPT09ICdjb2xsZWN0b3InID8gaS5jb2xsZWN0KGZpbGUpIDogaSksXG4gICAgKVxuXG4gICAgc3VpdGUuZmlsZSA9IGZpbGVcbiAgICBzdWl0ZS50YXNrcyA9IGFsbENoaWxkcmVuXG5cbiAgICBhbGxDaGlsZHJlbi5mb3JFYWNoKCh0YXNrKSA9PiB7XG4gICAgICB0YXNrLnN1aXRlID0gc3VpdGVcbiAgICAgIGlmIChmaWxlKVxuICAgICAgICB0YXNrLmZpbGUgPSBmaWxlXG4gICAgfSlcblxuICAgIHJldHVybiBzdWl0ZVxuICB9XG5cbiAgY29sbGVjdFRhc2soY29sbGVjdG9yKVxuXG4gIHJldHVybiBjb2xsZWN0b3Jcbn1cblxuZnVuY3Rpb24gY3JlYXRlU3VpdGUoKSB7XG4gIHJldHVybiBjcmVhdGVDaGFpbmFibGUoXG4gICAgWydjb25jdXJyZW50JywgJ3NraXAnLCAnb25seScsICd0b2RvJ10sXG4gICAgZnVuY3Rpb24obmFtZTogc3RyaW5nLCBmYWN0b3J5PzogVGVzdEZhY3RvcnkpIHtcbiAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLm9ubHkgPyAnb25seScgOiB0aGlzLnNraXAgPyAnc2tpcCcgOiB0aGlzLnRvZG8gPyAndG9kbycgOiAncnVuJ1xuICAgICAgcmV0dXJuIGNyZWF0ZVN1aXRlQ29sbGVjdG9yKG5hbWUsIGZhY3RvcnksIG1vZGUsIHRoaXMuY29uY3VycmVudClcbiAgICB9LFxuICApXG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IEFOU0lfQkFDS0dST1VORF9PRkZTRVQgPSAxMDtcblxuY29uc3Qgd3JhcEFuc2kyNTYgPSAob2Zmc2V0ID0gMCkgPT4gY29kZSA9PiBgXFx1MDAxQlskezM4ICsgb2Zmc2V0fTs1OyR7Y29kZX1tYDtcblxuY29uc3Qgd3JhcEFuc2kxNm0gPSAob2Zmc2V0ID0gMCkgPT4gKHJlZCwgZ3JlZW4sIGJsdWUpID0+IGBcXHUwMDFCWyR7MzggKyBvZmZzZXR9OzI7JHtyZWR9OyR7Z3JlZW59OyR7Ymx1ZX1tYDtcblxuZnVuY3Rpb24gYXNzZW1ibGVTdHlsZXMoKSB7XG5cdGNvbnN0IGNvZGVzID0gbmV3IE1hcCgpO1xuXHRjb25zdCBzdHlsZXMgPSB7XG5cdFx0bW9kaWZpZXI6IHtcblx0XHRcdHJlc2V0OiBbMCwgMF0sXG5cdFx0XHQvLyAyMSBpc24ndCB3aWRlbHkgc3VwcG9ydGVkIGFuZCAyMiBkb2VzIHRoZSBzYW1lIHRoaW5nXG5cdFx0XHRib2xkOiBbMSwgMjJdLFxuXHRcdFx0ZGltOiBbMiwgMjJdLFxuXHRcdFx0aXRhbGljOiBbMywgMjNdLFxuXHRcdFx0dW5kZXJsaW5lOiBbNCwgMjRdLFxuXHRcdFx0b3ZlcmxpbmU6IFs1MywgNTVdLFxuXHRcdFx0aW52ZXJzZTogWzcsIDI3XSxcblx0XHRcdGhpZGRlbjogWzgsIDI4XSxcblx0XHRcdHN0cmlrZXRocm91Z2g6IFs5LCAyOV1cblx0XHR9LFxuXHRcdGNvbG9yOiB7XG5cdFx0XHRibGFjazogWzMwLCAzOV0sXG5cdFx0XHRyZWQ6IFszMSwgMzldLFxuXHRcdFx0Z3JlZW46IFszMiwgMzldLFxuXHRcdFx0eWVsbG93OiBbMzMsIDM5XSxcblx0XHRcdGJsdWU6IFszNCwgMzldLFxuXHRcdFx0bWFnZW50YTogWzM1LCAzOV0sXG5cdFx0XHRjeWFuOiBbMzYsIDM5XSxcblx0XHRcdHdoaXRlOiBbMzcsIDM5XSxcblxuXHRcdFx0Ly8gQnJpZ2h0IGNvbG9yXG5cdFx0XHRibGFja0JyaWdodDogWzkwLCAzOV0sXG5cdFx0XHRyZWRCcmlnaHQ6IFs5MSwgMzldLFxuXHRcdFx0Z3JlZW5CcmlnaHQ6IFs5MiwgMzldLFxuXHRcdFx0eWVsbG93QnJpZ2h0OiBbOTMsIDM5XSxcblx0XHRcdGJsdWVCcmlnaHQ6IFs5NCwgMzldLFxuXHRcdFx0bWFnZW50YUJyaWdodDogWzk1LCAzOV0sXG5cdFx0XHRjeWFuQnJpZ2h0OiBbOTYsIDM5XSxcblx0XHRcdHdoaXRlQnJpZ2h0OiBbOTcsIDM5XVxuXHRcdH0sXG5cdFx0YmdDb2xvcjoge1xuXHRcdFx0YmdCbGFjazogWzQwLCA0OV0sXG5cdFx0XHRiZ1JlZDogWzQxLCA0OV0sXG5cdFx0XHRiZ0dyZWVuOiBbNDIsIDQ5XSxcblx0XHRcdGJnWWVsbG93OiBbNDMsIDQ5XSxcblx0XHRcdGJnQmx1ZTogWzQ0LCA0OV0sXG5cdFx0XHRiZ01hZ2VudGE6IFs0NSwgNDldLFxuXHRcdFx0YmdDeWFuOiBbNDYsIDQ5XSxcblx0XHRcdGJnV2hpdGU6IFs0NywgNDldLFxuXG5cdFx0XHQvLyBCcmlnaHQgY29sb3Jcblx0XHRcdGJnQmxhY2tCcmlnaHQ6IFsxMDAsIDQ5XSxcblx0XHRcdGJnUmVkQnJpZ2h0OiBbMTAxLCA0OV0sXG5cdFx0XHRiZ0dyZWVuQnJpZ2h0OiBbMTAyLCA0OV0sXG5cdFx0XHRiZ1llbGxvd0JyaWdodDogWzEwMywgNDldLFxuXHRcdFx0YmdCbHVlQnJpZ2h0OiBbMTA0LCA0OV0sXG5cdFx0XHRiZ01hZ2VudGFCcmlnaHQ6IFsxMDUsIDQ5XSxcblx0XHRcdGJnQ3lhbkJyaWdodDogWzEwNiwgNDldLFxuXHRcdFx0YmdXaGl0ZUJyaWdodDogWzEwNywgNDldXG5cdFx0fVxuXHR9O1xuXG5cdC8vIEFsaWFzIGJyaWdodCBibGFjayBhcyBncmF5IChhbmQgZ3JleSlcblx0c3R5bGVzLmNvbG9yLmdyYXkgPSBzdHlsZXMuY29sb3IuYmxhY2tCcmlnaHQ7XG5cdHN0eWxlcy5iZ0NvbG9yLmJnR3JheSA9IHN0eWxlcy5iZ0NvbG9yLmJnQmxhY2tCcmlnaHQ7XG5cdHN0eWxlcy5jb2xvci5ncmV5ID0gc3R5bGVzLmNvbG9yLmJsYWNrQnJpZ2h0O1xuXHRzdHlsZXMuYmdDb2xvci5iZ0dyZXkgPSBzdHlsZXMuYmdDb2xvci5iZ0JsYWNrQnJpZ2h0O1xuXG5cdGZvciAoY29uc3QgW2dyb3VwTmFtZSwgZ3JvdXBdIG9mIE9iamVjdC5lbnRyaWVzKHN0eWxlcykpIHtcblx0XHRmb3IgKGNvbnN0IFtzdHlsZU5hbWUsIHN0eWxlXSBvZiBPYmplY3QuZW50cmllcyhncm91cCkpIHtcblx0XHRcdHN0eWxlc1tzdHlsZU5hbWVdID0ge1xuXHRcdFx0XHRvcGVuOiBgXFx1MDAxQlske3N0eWxlWzBdfW1gLFxuXHRcdFx0XHRjbG9zZTogYFxcdTAwMUJbJHtzdHlsZVsxXX1tYFxuXHRcdFx0fTtcblxuXHRcdFx0Z3JvdXBbc3R5bGVOYW1lXSA9IHN0eWxlc1tzdHlsZU5hbWVdO1xuXG5cdFx0XHRjb2Rlcy5zZXQoc3R5bGVbMF0sIHN0eWxlWzFdKTtcblx0XHR9XG5cblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoc3R5bGVzLCBncm91cE5hbWUsIHtcblx0XHRcdHZhbHVlOiBncm91cCxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlXG5cdFx0fSk7XG5cdH1cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoc3R5bGVzLCAnY29kZXMnLCB7XG5cdFx0dmFsdWU6IGNvZGVzLFxuXHRcdGVudW1lcmFibGU6IGZhbHNlXG5cdH0pO1xuXG5cdHN0eWxlcy5jb2xvci5jbG9zZSA9ICdcXHUwMDFCWzM5bSc7XG5cdHN0eWxlcy5iZ0NvbG9yLmNsb3NlID0gJ1xcdTAwMUJbNDltJztcblxuXHRzdHlsZXMuY29sb3IuYW5zaTI1NiA9IHdyYXBBbnNpMjU2KCk7XG5cdHN0eWxlcy5jb2xvci5hbnNpMTZtID0gd3JhcEFuc2kxNm0oKTtcblx0c3R5bGVzLmJnQ29sb3IuYW5zaTI1NiA9IHdyYXBBbnNpMjU2KEFOU0lfQkFDS0dST1VORF9PRkZTRVQpO1xuXHRzdHlsZXMuYmdDb2xvci5hbnNpMTZtID0gd3JhcEFuc2kxNm0oQU5TSV9CQUNLR1JPVU5EX09GRlNFVCk7XG5cblx0Ly8gRnJvbSBodHRwczovL2dpdGh1Yi5jb20vUWl4LS9jb2xvci1jb252ZXJ0L2Jsb2IvM2YwZTBkNGU5MmUyMzU3OTZjY2IxN2Y2ZTg1YzcyMDk0YTY1MWY0OS9jb252ZXJzaW9ucy5qc1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyhzdHlsZXMsIHtcblx0XHRyZ2JUb0Fuc2kyNTY6IHtcblx0XHRcdHZhbHVlOiAocmVkLCBncmVlbiwgYmx1ZSkgPT4ge1xuXHRcdFx0XHQvLyBXZSB1c2UgdGhlIGV4dGVuZGVkIGdyZXlzY2FsZSBwYWxldHRlIGhlcmUsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZlxuXHRcdFx0XHQvLyBibGFjayBhbmQgd2hpdGUuIG5vcm1hbCBwYWxldHRlIG9ubHkgaGFzIDQgZ3JleXNjYWxlIHNoYWRlcy5cblx0XHRcdFx0aWYgKHJlZCA9PT0gZ3JlZW4gJiYgZ3JlZW4gPT09IGJsdWUpIHtcblx0XHRcdFx0XHRpZiAocmVkIDwgOCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIDE2O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChyZWQgPiAyNDgpIHtcblx0XHRcdFx0XHRcdHJldHVybiAyMzE7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIE1hdGgucm91bmQoKChyZWQgLSA4KSAvIDI0NykgKiAyNCkgKyAyMzI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gMTYgK1xuXHRcdFx0XHRcdCgzNiAqIE1hdGgucm91bmQocmVkIC8gMjU1ICogNSkpICtcblx0XHRcdFx0XHQoNiAqIE1hdGgucm91bmQoZ3JlZW4gLyAyNTUgKiA1KSkgK1xuXHRcdFx0XHRcdE1hdGgucm91bmQoYmx1ZSAvIDI1NSAqIDUpO1xuXHRcdFx0fSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlXG5cdFx0fSxcblx0XHRoZXhUb1JnYjoge1xuXHRcdFx0dmFsdWU6IGhleCA9PiB7XG5cdFx0XHRcdGNvbnN0IG1hdGNoZXMgPSAvKD88Y29sb3JTdHJpbmc+W2EtZlxcZF17Nn18W2EtZlxcZF17M30pL2kuZXhlYyhoZXgudG9TdHJpbmcoMTYpKTtcblx0XHRcdFx0aWYgKCFtYXRjaGVzKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFswLCAwLCAwXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCB7Y29sb3JTdHJpbmd9ID0gbWF0Y2hlcy5ncm91cHM7XG5cblx0XHRcdFx0aWYgKGNvbG9yU3RyaW5nLmxlbmd0aCA9PT0gMykge1xuXHRcdFx0XHRcdGNvbG9yU3RyaW5nID0gY29sb3JTdHJpbmcuc3BsaXQoJycpLm1hcChjaGFyYWN0ZXIgPT4gY2hhcmFjdGVyICsgY2hhcmFjdGVyKS5qb2luKCcnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGludGVnZXIgPSBOdW1iZXIucGFyc2VJbnQoY29sb3JTdHJpbmcsIDE2KTtcblxuXHRcdFx0XHRyZXR1cm4gW1xuXHRcdFx0XHRcdChpbnRlZ2VyID4+IDE2KSAmIDB4RkYsXG5cdFx0XHRcdFx0KGludGVnZXIgPj4gOCkgJiAweEZGLFxuXHRcdFx0XHRcdGludGVnZXIgJiAweEZGXG5cdFx0XHRcdF07XG5cdFx0XHR9LFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2Vcblx0XHR9LFxuXHRcdGhleFRvQW5zaTI1Njoge1xuXHRcdFx0dmFsdWU6IGhleCA9PiBzdHlsZXMucmdiVG9BbnNpMjU2KC4uLnN0eWxlcy5oZXhUb1JnYihoZXgpKSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlXG5cdFx0fVxuXHR9KTtcblxuXHRyZXR1cm4gc3R5bGVzO1xufVxuXG4vLyBNYWtlIHRoZSBleHBvcnQgaW1tdXRhYmxlXG5PYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCAnZXhwb3J0cycsIHtcblx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0Z2V0OiBhc3NlbWJsZVN0eWxlc1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5wcmludEl0ZXJhdG9yRW50cmllcyA9IHByaW50SXRlcmF0b3JFbnRyaWVzO1xuZXhwb3J0cy5wcmludEl0ZXJhdG9yVmFsdWVzID0gcHJpbnRJdGVyYXRvclZhbHVlcztcbmV4cG9ydHMucHJpbnRMaXN0SXRlbXMgPSBwcmludExpc3RJdGVtcztcbmV4cG9ydHMucHJpbnRPYmplY3RQcm9wZXJ0aWVzID0gcHJpbnRPYmplY3RQcm9wZXJ0aWVzO1xuXG4vKipcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICpcbiAqL1xuY29uc3QgZ2V0S2V5c09mRW51bWVyYWJsZVByb3BlcnRpZXMgPSAob2JqZWN0LCBjb21wYXJlS2V5cykgPT4ge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KS5zb3J0KGNvbXBhcmVLZXlzKTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KS5mb3JFYWNoKHN5bWJvbCA9PiB7XG4gICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bWJvbCkuZW51bWVyYWJsZSkge1xuICAgICAgICBrZXlzLnB1c2goc3ltYm9sKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBrZXlzO1xufTtcbi8qKlxuICogUmV0dXJuIGVudHJpZXMgKGZvciBleGFtcGxlLCBvZiBhIG1hcClcbiAqIHdpdGggc3BhY2luZywgaW5kZW50YXRpb24sIGFuZCBjb21tYVxuICogd2l0aG91dCBzdXJyb3VuZGluZyBwdW5jdHVhdGlvbiAoZm9yIGV4YW1wbGUsIGJyYWNlcylcbiAqL1xuXG5mdW5jdGlvbiBwcmludEl0ZXJhdG9yRW50cmllcyhcbiAgaXRlcmF0b3IsXG4gIGNvbmZpZyxcbiAgaW5kZW50YXRpb24sXG4gIGRlcHRoLFxuICByZWZzLFxuICBwcmludGVyLCAvLyBUb28gYmFkLCBzbyBzYWQgdGhhdCBzZXBhcmF0b3IgZm9yIEVDTUFTY3JpcHQgTWFwIGhhcyBiZWVuICcgPT4gJ1xuICAvLyBXaGF0IGEgZGlzdHJhY3RpbmcgZGlmZiBpZiB5b3UgY2hhbmdlIGEgZGF0YSBzdHJ1Y3R1cmUgdG8vZnJvbVxuICAvLyBFQ01BU2NyaXB0IE9iamVjdCBvciBJbW11dGFibGUuTWFwL09yZGVyZWRNYXAgd2hpY2ggdXNlIHRoZSBkZWZhdWx0LlxuICBzZXBhcmF0b3IgPSAnOiAnXG4pIHtcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBsZXQgY3VycmVudCA9IGl0ZXJhdG9yLm5leHQoKTtcblxuICBpZiAoIWN1cnJlbnQuZG9uZSkge1xuICAgIHJlc3VsdCArPSBjb25maWcuc3BhY2luZ091dGVyO1xuICAgIGNvbnN0IGluZGVudGF0aW9uTmV4dCA9IGluZGVudGF0aW9uICsgY29uZmlnLmluZGVudDtcblxuICAgIHdoaWxlICghY3VycmVudC5kb25lKSB7XG4gICAgICBjb25zdCBuYW1lID0gcHJpbnRlcihcbiAgICAgICAgY3VycmVudC52YWx1ZVswXSxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBpbmRlbnRhdGlvbk5leHQsXG4gICAgICAgIGRlcHRoLFxuICAgICAgICByZWZzXG4gICAgICApO1xuICAgICAgY29uc3QgdmFsdWUgPSBwcmludGVyKFxuICAgICAgICBjdXJyZW50LnZhbHVlWzFdLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIGluZGVudGF0aW9uTmV4dCxcbiAgICAgICAgZGVwdGgsXG4gICAgICAgIHJlZnNcbiAgICAgICk7XG4gICAgICByZXN1bHQgKz0gaW5kZW50YXRpb25OZXh0ICsgbmFtZSArIHNlcGFyYXRvciArIHZhbHVlO1xuICAgICAgY3VycmVudCA9IGl0ZXJhdG9yLm5leHQoKTtcblxuICAgICAgaWYgKCFjdXJyZW50LmRvbmUpIHtcbiAgICAgICAgcmVzdWx0ICs9ICcsJyArIGNvbmZpZy5zcGFjaW5nSW5uZXI7XG4gICAgICB9IGVsc2UgaWYgKCFjb25maWcubWluKSB7XG4gICAgICAgIHJlc3VsdCArPSAnLCc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVzdWx0ICs9IGNvbmZpZy5zcGFjaW5nT3V0ZXIgKyBpbmRlbnRhdGlvbjtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIFJldHVybiB2YWx1ZXMgKGZvciBleGFtcGxlLCBvZiBhIHNldClcbiAqIHdpdGggc3BhY2luZywgaW5kZW50YXRpb24sIGFuZCBjb21tYVxuICogd2l0aG91dCBzdXJyb3VuZGluZyBwdW5jdHVhdGlvbiAoYnJhY2VzIG9yIGJyYWNrZXRzKVxuICovXG5cbmZ1bmN0aW9uIHByaW50SXRlcmF0b3JWYWx1ZXMoXG4gIGl0ZXJhdG9yLFxuICBjb25maWcsXG4gIGluZGVudGF0aW9uLFxuICBkZXB0aCxcbiAgcmVmcyxcbiAgcHJpbnRlclxuKSB7XG4gIGxldCByZXN1bHQgPSAnJztcbiAgbGV0IGN1cnJlbnQgPSBpdGVyYXRvci5uZXh0KCk7XG5cbiAgaWYgKCFjdXJyZW50LmRvbmUpIHtcbiAgICByZXN1bHQgKz0gY29uZmlnLnNwYWNpbmdPdXRlcjtcbiAgICBjb25zdCBpbmRlbnRhdGlvbk5leHQgPSBpbmRlbnRhdGlvbiArIGNvbmZpZy5pbmRlbnQ7XG5cbiAgICB3aGlsZSAoIWN1cnJlbnQuZG9uZSkge1xuICAgICAgcmVzdWx0ICs9XG4gICAgICAgIGluZGVudGF0aW9uTmV4dCArXG4gICAgICAgIHByaW50ZXIoY3VycmVudC52YWx1ZSwgY29uZmlnLCBpbmRlbnRhdGlvbk5leHQsIGRlcHRoLCByZWZzKTtcbiAgICAgIGN1cnJlbnQgPSBpdGVyYXRvci5uZXh0KCk7XG5cbiAgICAgIGlmICghY3VycmVudC5kb25lKSB7XG4gICAgICAgIHJlc3VsdCArPSAnLCcgKyBjb25maWcuc3BhY2luZ0lubmVyO1xuICAgICAgfSBlbHNlIGlmICghY29uZmlnLm1pbikge1xuICAgICAgICByZXN1bHQgKz0gJywnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc3VsdCArPSBjb25maWcuc3BhY2luZ091dGVyICsgaW5kZW50YXRpb247XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBSZXR1cm4gaXRlbXMgKGZvciBleGFtcGxlLCBvZiBhbiBhcnJheSlcbiAqIHdpdGggc3BhY2luZywgaW5kZW50YXRpb24sIGFuZCBjb21tYVxuICogd2l0aG91dCBzdXJyb3VuZGluZyBwdW5jdHVhdGlvbiAoZm9yIGV4YW1wbGUsIGJyYWNrZXRzKVxuICoqL1xuXG5mdW5jdGlvbiBwcmludExpc3RJdGVtcyhsaXN0LCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcikge1xuICBsZXQgcmVzdWx0ID0gJyc7XG5cbiAgaWYgKGxpc3QubGVuZ3RoKSB7XG4gICAgcmVzdWx0ICs9IGNvbmZpZy5zcGFjaW5nT3V0ZXI7XG4gICAgY29uc3QgaW5kZW50YXRpb25OZXh0ID0gaW5kZW50YXRpb24gKyBjb25maWcuaW5kZW50O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHQgKz0gaW5kZW50YXRpb25OZXh0O1xuXG4gICAgICBpZiAoaSBpbiBsaXN0KSB7XG4gICAgICAgIHJlc3VsdCArPSBwcmludGVyKGxpc3RbaV0sIGNvbmZpZywgaW5kZW50YXRpb25OZXh0LCBkZXB0aCwgcmVmcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpIDwgbGlzdC5sZW5ndGggLSAxKSB7XG4gICAgICAgIHJlc3VsdCArPSAnLCcgKyBjb25maWcuc3BhY2luZ0lubmVyO1xuICAgICAgfSBlbHNlIGlmICghY29uZmlnLm1pbikge1xuICAgICAgICByZXN1bHQgKz0gJywnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc3VsdCArPSBjb25maWcuc3BhY2luZ091dGVyICsgaW5kZW50YXRpb247XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBSZXR1cm4gcHJvcGVydGllcyBvZiBhbiBvYmplY3RcbiAqIHdpdGggc3BhY2luZywgaW5kZW50YXRpb24sIGFuZCBjb21tYVxuICogd2l0aG91dCBzdXJyb3VuZGluZyBwdW5jdHVhdGlvbiAoZm9yIGV4YW1wbGUsIGJyYWNlcylcbiAqL1xuXG5mdW5jdGlvbiBwcmludE9iamVjdFByb3BlcnRpZXModmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcikge1xuICBsZXQgcmVzdWx0ID0gJyc7XG4gIGNvbnN0IGtleXMgPSBnZXRLZXlzT2ZFbnVtZXJhYmxlUHJvcGVydGllcyh2YWwsIGNvbmZpZy5jb21wYXJlS2V5cyk7XG5cbiAgaWYgKGtleXMubGVuZ3RoKSB7XG4gICAgcmVzdWx0ICs9IGNvbmZpZy5zcGFjaW5nT3V0ZXI7XG4gICAgY29uc3QgaW5kZW50YXRpb25OZXh0ID0gaW5kZW50YXRpb24gKyBjb25maWcuaW5kZW50O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgY29uc3QgbmFtZSA9IHByaW50ZXIoa2V5LCBjb25maWcsIGluZGVudGF0aW9uTmV4dCwgZGVwdGgsIHJlZnMpO1xuICAgICAgY29uc3QgdmFsdWUgPSBwcmludGVyKHZhbFtrZXldLCBjb25maWcsIGluZGVudGF0aW9uTmV4dCwgZGVwdGgsIHJlZnMpO1xuICAgICAgcmVzdWx0ICs9IGluZGVudGF0aW9uTmV4dCArIG5hbWUgKyAnOiAnICsgdmFsdWU7XG5cbiAgICAgIGlmIChpIDwga2V5cy5sZW5ndGggLSAxKSB7XG4gICAgICAgIHJlc3VsdCArPSAnLCcgKyBjb25maWcuc3BhY2luZ0lubmVyO1xuICAgICAgfSBlbHNlIGlmICghY29uZmlnLm1pbikge1xuICAgICAgICByZXN1bHQgKz0gJywnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc3VsdCArPSBjb25maWcuc3BhY2luZ091dGVyICsgaW5kZW50YXRpb247XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudGVzdCA9IGV4cG9ydHMuc2VyaWFsaXplID0gZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX2NvbGxlY3Rpb25zID0gcmVxdWlyZSgnLi4vY29sbGVjdGlvbnMnKTtcblxudmFyIGdsb2JhbCA9IChmdW5jdGlvbiAoKSB7XG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZ2xvYmFsVGhpcztcbiAgfSBlbHNlIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBnbG9iYWw7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHNlbGY7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuICB9XG59KSgpO1xuXG52YXIgU3ltYm9sID0gZ2xvYmFsWydqZXN0LXN5bWJvbC1kby1ub3QtdG91Y2gnXSB8fCBnbG9iYWwuU3ltYm9sO1xuY29uc3QgYXN5bW1ldHJpY01hdGNoZXIgPVxuICB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3JcbiAgICA/IFN5bWJvbC5mb3IoJ2plc3QuYXN5bW1ldHJpY01hdGNoZXInKVxuICAgIDogMHgxMzU3YTU7XG5jb25zdCBTUEFDRSA9ICcgJztcblxuY29uc3Qgc2VyaWFsaXplID0gKHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpID0+IHtcbiAgY29uc3Qgc3RyaW5nZWRWYWx1ZSA9IHZhbC50b1N0cmluZygpO1xuXG4gIGlmIChcbiAgICBzdHJpbmdlZFZhbHVlID09PSAnQXJyYXlDb250YWluaW5nJyB8fFxuICAgIHN0cmluZ2VkVmFsdWUgPT09ICdBcnJheU5vdENvbnRhaW5pbmcnXG4gICkge1xuICAgIGlmICgrK2RlcHRoID4gY29uZmlnLm1heERlcHRoKSB7XG4gICAgICByZXR1cm4gJ1snICsgc3RyaW5nZWRWYWx1ZSArICddJztcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgc3RyaW5nZWRWYWx1ZSArXG4gICAgICBTUEFDRSArXG4gICAgICAnWycgK1xuICAgICAgKDAsIF9jb2xsZWN0aW9ucy5wcmludExpc3RJdGVtcykoXG4gICAgICAgIHZhbC5zYW1wbGUsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgaW5kZW50YXRpb24sXG4gICAgICAgIGRlcHRoLFxuICAgICAgICByZWZzLFxuICAgICAgICBwcmludGVyXG4gICAgICApICtcbiAgICAgICddJ1xuICAgICk7XG4gIH1cblxuICBpZiAoXG4gICAgc3RyaW5nZWRWYWx1ZSA9PT0gJ09iamVjdENvbnRhaW5pbmcnIHx8XG4gICAgc3RyaW5nZWRWYWx1ZSA9PT0gJ09iamVjdE5vdENvbnRhaW5pbmcnXG4gICkge1xuICAgIGlmICgrK2RlcHRoID4gY29uZmlnLm1heERlcHRoKSB7XG4gICAgICByZXR1cm4gJ1snICsgc3RyaW5nZWRWYWx1ZSArICddJztcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgc3RyaW5nZWRWYWx1ZSArXG4gICAgICBTUEFDRSArXG4gICAgICAneycgK1xuICAgICAgKDAsIF9jb2xsZWN0aW9ucy5wcmludE9iamVjdFByb3BlcnRpZXMpKFxuICAgICAgICB2YWwuc2FtcGxlLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIGluZGVudGF0aW9uLFxuICAgICAgICBkZXB0aCxcbiAgICAgICAgcmVmcyxcbiAgICAgICAgcHJpbnRlclxuICAgICAgKSArXG4gICAgICAnfSdcbiAgICApO1xuICB9XG5cbiAgaWYgKFxuICAgIHN0cmluZ2VkVmFsdWUgPT09ICdTdHJpbmdNYXRjaGluZycgfHxcbiAgICBzdHJpbmdlZFZhbHVlID09PSAnU3RyaW5nTm90TWF0Y2hpbmcnXG4gICkge1xuICAgIHJldHVybiAoXG4gICAgICBzdHJpbmdlZFZhbHVlICtcbiAgICAgIFNQQUNFICtcbiAgICAgIHByaW50ZXIodmFsLnNhbXBsZSwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMpXG4gICAgKTtcbiAgfVxuXG4gIGlmIChcbiAgICBzdHJpbmdlZFZhbHVlID09PSAnU3RyaW5nQ29udGFpbmluZycgfHxcbiAgICBzdHJpbmdlZFZhbHVlID09PSAnU3RyaW5nTm90Q29udGFpbmluZydcbiAgKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHN0cmluZ2VkVmFsdWUgK1xuICAgICAgU1BBQ0UgK1xuICAgICAgcHJpbnRlcih2YWwuc2FtcGxlLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcylcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHZhbC50b0FzeW1tZXRyaWNNYXRjaGVyKCk7XG59O1xuXG5leHBvcnRzLnNlcmlhbGl6ZSA9IHNlcmlhbGl6ZTtcblxuY29uc3QgdGVzdCA9IHZhbCA9PiB2YWwgJiYgdmFsLiQkdHlwZW9mID09PSBhc3ltbWV0cmljTWF0Y2hlcjtcblxuZXhwb3J0cy50ZXN0ID0gdGVzdDtcbmNvbnN0IHBsdWdpbiA9IHtcbiAgc2VyaWFsaXplLFxuICB0ZXN0XG59O1xudmFyIF9kZWZhdWx0ID0gcGx1Z2luO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gKHtvbmx5Rmlyc3QgPSBmYWxzZX0gPSB7fSkgPT4ge1xuXHRjb25zdCBwYXR0ZXJuID0gW1xuXHRcdCdbXFxcXHUwMDFCXFxcXHUwMDlCXVtbXFxcXF0oKSM7P10qKD86KD86KD86KD86O1stYS16QS1aXFxcXGRcXFxcLyMmLjo9PyVAfl9dKykqfFthLXpBLVpcXFxcZF0rKD86O1stYS16QS1aXFxcXGRcXFxcLyMmLjo9PyVAfl9dKikqKT9cXFxcdTAwMDcpJyxcblx0XHQnKD86KD86XFxcXGR7MSw0fSg/OjtcXFxcZHswLDR9KSopP1tcXFxcZEEtUFItVFpjZi1udHFyeT0+PH5dKSknXG5cdF0uam9pbignfCcpO1xuXG5cdHJldHVybiBuZXcgUmVnRXhwKHBhdHRlcm4sIG9ubHlGaXJzdCA/IHVuZGVmaW5lZCA6ICdnJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudGVzdCA9IGV4cG9ydHMuc2VyaWFsaXplID0gZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX2Fuc2lSZWdleCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgnYW5zaS1yZWdleCcpKTtcblxudmFyIF9hbnNpU3R5bGVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCdhbnNpLXN0eWxlcycpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHtkZWZhdWx0OiBvYmp9O1xufVxuXG4vKipcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5jb25zdCB0b0h1bWFuUmVhZGFibGVBbnNpID0gdGV4dCA9PlxuICB0ZXh0LnJlcGxhY2UoKDAsIF9hbnNpUmVnZXguZGVmYXVsdCkoKSwgbWF0Y2ggPT4ge1xuICAgIHN3aXRjaCAobWF0Y2gpIHtcbiAgICAgIGNhc2UgX2Fuc2lTdHlsZXMuZGVmYXVsdC5yZWQuY2xvc2U6XG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQuZ3JlZW4uY2xvc2U6XG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQuY3lhbi5jbG9zZTpcbiAgICAgIGNhc2UgX2Fuc2lTdHlsZXMuZGVmYXVsdC5ncmF5LmNsb3NlOlxuICAgICAgY2FzZSBfYW5zaVN0eWxlcy5kZWZhdWx0LndoaXRlLmNsb3NlOlxuICAgICAgY2FzZSBfYW5zaVN0eWxlcy5kZWZhdWx0LnllbGxvdy5jbG9zZTpcbiAgICAgIGNhc2UgX2Fuc2lTdHlsZXMuZGVmYXVsdC5iZ1JlZC5jbG9zZTpcbiAgICAgIGNhc2UgX2Fuc2lTdHlsZXMuZGVmYXVsdC5iZ0dyZWVuLmNsb3NlOlxuICAgICAgY2FzZSBfYW5zaVN0eWxlcy5kZWZhdWx0LmJnWWVsbG93LmNsb3NlOlxuICAgICAgY2FzZSBfYW5zaVN0eWxlcy5kZWZhdWx0LmludmVyc2UuY2xvc2U6XG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQuZGltLmNsb3NlOlxuICAgICAgY2FzZSBfYW5zaVN0eWxlcy5kZWZhdWx0LmJvbGQuY2xvc2U6XG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQucmVzZXQub3BlbjpcbiAgICAgIGNhc2UgX2Fuc2lTdHlsZXMuZGVmYXVsdC5yZXNldC5jbG9zZTpcbiAgICAgICAgcmV0dXJuICc8Lz4nO1xuXG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQucmVkLm9wZW46XG4gICAgICAgIHJldHVybiAnPHJlZD4nO1xuXG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQuZ3JlZW4ub3BlbjpcbiAgICAgICAgcmV0dXJuICc8Z3JlZW4+JztcblxuICAgICAgY2FzZSBfYW5zaVN0eWxlcy5kZWZhdWx0LmN5YW4ub3BlbjpcbiAgICAgICAgcmV0dXJuICc8Y3lhbj4nO1xuXG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQuZ3JheS5vcGVuOlxuICAgICAgICByZXR1cm4gJzxncmF5Pic7XG5cbiAgICAgIGNhc2UgX2Fuc2lTdHlsZXMuZGVmYXVsdC53aGl0ZS5vcGVuOlxuICAgICAgICByZXR1cm4gJzx3aGl0ZT4nO1xuXG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQueWVsbG93Lm9wZW46XG4gICAgICAgIHJldHVybiAnPHllbGxvdz4nO1xuXG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQuYmdSZWQub3BlbjpcbiAgICAgICAgcmV0dXJuICc8YmdSZWQ+JztcblxuICAgICAgY2FzZSBfYW5zaVN0eWxlcy5kZWZhdWx0LmJnR3JlZW4ub3BlbjpcbiAgICAgICAgcmV0dXJuICc8YmdHcmVlbj4nO1xuXG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQuYmdZZWxsb3cub3BlbjpcbiAgICAgICAgcmV0dXJuICc8YmdZZWxsb3c+JztcblxuICAgICAgY2FzZSBfYW5zaVN0eWxlcy5kZWZhdWx0LmludmVyc2Uub3BlbjpcbiAgICAgICAgcmV0dXJuICc8aW52ZXJzZT4nO1xuXG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQuZGltLm9wZW46XG4gICAgICAgIHJldHVybiAnPGRpbT4nO1xuXG4gICAgICBjYXNlIF9hbnNpU3R5bGVzLmRlZmF1bHQuYm9sZC5vcGVuOlxuICAgICAgICByZXR1cm4gJzxib2xkPic7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH0pO1xuXG5jb25zdCB0ZXN0ID0gdmFsID0+XG4gIHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnICYmICEhdmFsLm1hdGNoKCgwLCBfYW5zaVJlZ2V4LmRlZmF1bHQpKCkpO1xuXG5leHBvcnRzLnRlc3QgPSB0ZXN0O1xuXG5jb25zdCBzZXJpYWxpemUgPSAodmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcikgPT5cbiAgcHJpbnRlcih0b0h1bWFuUmVhZGFibGVBbnNpKHZhbCksIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzKTtcblxuZXhwb3J0cy5zZXJpYWxpemUgPSBzZXJpYWxpemU7XG5jb25zdCBwbHVnaW4gPSB7XG4gIHNlcmlhbGl6ZSxcbiAgdGVzdFxufTtcbnZhciBfZGVmYXVsdCA9IHBsdWdpbjtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudGVzdCA9IGV4cG9ydHMuc2VyaWFsaXplID0gZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX2NvbGxlY3Rpb25zID0gcmVxdWlyZSgnLi4vY29sbGVjdGlvbnMnKTtcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBsb2NhbC9iYW4tdHlwZXMtZXZlbnR1YWxseSAqL1xuY29uc3QgU1BBQ0UgPSAnICc7XG5jb25zdCBPQkpFQ1RfTkFNRVMgPSBbJ0RPTVN0cmluZ01hcCcsICdOYW1lZE5vZGVNYXAnXTtcbmNvbnN0IEFSUkFZX1JFR0VYUCA9IC9eKEhUTUxcXHcqQ29sbGVjdGlvbnxOb2RlTGlzdCkkLztcblxuY29uc3QgdGVzdE5hbWUgPSBuYW1lID0+XG4gIE9CSkVDVF9OQU1FUy5pbmRleE9mKG5hbWUpICE9PSAtMSB8fCBBUlJBWV9SRUdFWFAudGVzdChuYW1lKTtcblxuY29uc3QgdGVzdCA9IHZhbCA9PlxuICB2YWwgJiZcbiAgdmFsLmNvbnN0cnVjdG9yICYmXG4gICEhdmFsLmNvbnN0cnVjdG9yLm5hbWUgJiZcbiAgdGVzdE5hbWUodmFsLmNvbnN0cnVjdG9yLm5hbWUpO1xuXG5leHBvcnRzLnRlc3QgPSB0ZXN0O1xuXG5jb25zdCBpc05hbWVkTm9kZU1hcCA9IGNvbGxlY3Rpb24gPT5cbiAgY29sbGVjdGlvbi5jb25zdHJ1Y3Rvci5uYW1lID09PSAnTmFtZWROb2RlTWFwJztcblxuY29uc3Qgc2VyaWFsaXplID0gKGNvbGxlY3Rpb24sIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSA9PiB7XG4gIGNvbnN0IG5hbWUgPSBjb2xsZWN0aW9uLmNvbnN0cnVjdG9yLm5hbWU7XG5cbiAgaWYgKCsrZGVwdGggPiBjb25maWcubWF4RGVwdGgpIHtcbiAgICByZXR1cm4gJ1snICsgbmFtZSArICddJztcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgKGNvbmZpZy5taW4gPyAnJyA6IG5hbWUgKyBTUEFDRSkgK1xuICAgIChPQkpFQ1RfTkFNRVMuaW5kZXhPZihuYW1lKSAhPT0gLTFcbiAgICAgID8gJ3snICtcbiAgICAgICAgKDAsIF9jb2xsZWN0aW9ucy5wcmludE9iamVjdFByb3BlcnRpZXMpKFxuICAgICAgICAgIGlzTmFtZWROb2RlTWFwKGNvbGxlY3Rpb24pXG4gICAgICAgICAgICA/IEFycmF5LmZyb20oY29sbGVjdGlvbikucmVkdWNlKChwcm9wcywgYXR0cmlidXRlKSA9PiB7XG4gICAgICAgICAgICAgICAgcHJvcHNbYXR0cmlidXRlLm5hbWVdID0gYXR0cmlidXRlLnZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9wcztcbiAgICAgICAgICAgICAgfSwge30pXG4gICAgICAgICAgICA6IHsuLi5jb2xsZWN0aW9ufSxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgaW5kZW50YXRpb24sXG4gICAgICAgICAgZGVwdGgsXG4gICAgICAgICAgcmVmcyxcbiAgICAgICAgICBwcmludGVyXG4gICAgICAgICkgK1xuICAgICAgICAnfSdcbiAgICAgIDogJ1snICtcbiAgICAgICAgKDAsIF9jb2xsZWN0aW9ucy5wcmludExpc3RJdGVtcykoXG4gICAgICAgICAgQXJyYXkuZnJvbShjb2xsZWN0aW9uKSxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgaW5kZW50YXRpb24sXG4gICAgICAgICAgZGVwdGgsXG4gICAgICAgICAgcmVmcyxcbiAgICAgICAgICBwcmludGVyXG4gICAgICAgICkgK1xuICAgICAgICAnXScpXG4gICk7XG59O1xuXG5leHBvcnRzLnNlcmlhbGl6ZSA9IHNlcmlhbGl6ZTtcbmNvbnN0IHBsdWdpbiA9IHtcbiAgc2VyaWFsaXplLFxuICB0ZXN0XG59O1xudmFyIF9kZWZhdWx0ID0gcGx1Z2luO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZXNjYXBlSFRNTDtcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuZnVuY3Rpb24gZXNjYXBlSFRNTChzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC88L2csICcmbHQ7JykucmVwbGFjZSgvPi9nLCAnJmd0OycpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMucHJpbnRUZXh0ID1cbiAgZXhwb3J0cy5wcmludFByb3BzID1cbiAgZXhwb3J0cy5wcmludEVsZW1lbnRBc0xlYWYgPVxuICBleHBvcnRzLnByaW50RWxlbWVudCA9XG4gIGV4cG9ydHMucHJpbnRDb21tZW50ID1cbiAgZXhwb3J0cy5wcmludENoaWxkcmVuID1cbiAgICB2b2lkIDA7XG5cbnZhciBfZXNjYXBlSFRNTCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgnLi9lc2NhcGVIVE1MJykpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikge1xuICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDoge2RlZmF1bHQ6IG9ian07XG59XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cbi8vIFJldHVybiBlbXB0eSBzdHJpbmcgaWYga2V5cyBpcyBlbXB0eS5cbmNvbnN0IHByaW50UHJvcHMgPSAoa2V5cywgcHJvcHMsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSA9PiB7XG4gIGNvbnN0IGluZGVudGF0aW9uTmV4dCA9IGluZGVudGF0aW9uICsgY29uZmlnLmluZGVudDtcbiAgY29uc3QgY29sb3JzID0gY29uZmlnLmNvbG9ycztcbiAgcmV0dXJuIGtleXNcbiAgICAubWFwKGtleSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHByb3BzW2tleV07XG4gICAgICBsZXQgcHJpbnRlZCA9IHByaW50ZXIodmFsdWUsIGNvbmZpZywgaW5kZW50YXRpb25OZXh0LCBkZXB0aCwgcmVmcyk7XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmIChwcmludGVkLmluZGV4T2YoJ1xcbicpICE9PSAtMSkge1xuICAgICAgICAgIHByaW50ZWQgPVxuICAgICAgICAgICAgY29uZmlnLnNwYWNpbmdPdXRlciArXG4gICAgICAgICAgICBpbmRlbnRhdGlvbk5leHQgK1xuICAgICAgICAgICAgcHJpbnRlZCArXG4gICAgICAgICAgICBjb25maWcuc3BhY2luZ091dGVyICtcbiAgICAgICAgICAgIGluZGVudGF0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJpbnRlZCA9ICd7JyArIHByaW50ZWQgKyAnfSc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvbmZpZy5zcGFjaW5nSW5uZXIgK1xuICAgICAgICBpbmRlbnRhdGlvbiArXG4gICAgICAgIGNvbG9ycy5wcm9wLm9wZW4gK1xuICAgICAgICBrZXkgK1xuICAgICAgICBjb2xvcnMucHJvcC5jbG9zZSArXG4gICAgICAgICc9JyArXG4gICAgICAgIGNvbG9ycy52YWx1ZS5vcGVuICtcbiAgICAgICAgcHJpbnRlZCArXG4gICAgICAgIGNvbG9ycy52YWx1ZS5jbG9zZVxuICAgICAgKTtcbiAgICB9KVxuICAgIC5qb2luKCcnKTtcbn07IC8vIFJldHVybiBlbXB0eSBzdHJpbmcgaWYgY2hpbGRyZW4gaXMgZW1wdHkuXG5cbmV4cG9ydHMucHJpbnRQcm9wcyA9IHByaW50UHJvcHM7XG5cbmNvbnN0IHByaW50Q2hpbGRyZW4gPSAoY2hpbGRyZW4sIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSA9PlxuICBjaGlsZHJlblxuICAgIC5tYXAoXG4gICAgICBjaGlsZCA9PlxuICAgICAgICBjb25maWcuc3BhY2luZ091dGVyICtcbiAgICAgICAgaW5kZW50YXRpb24gK1xuICAgICAgICAodHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gcHJpbnRUZXh0KGNoaWxkLCBjb25maWcpXG4gICAgICAgICAgOiBwcmludGVyKGNoaWxkLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcykpXG4gICAgKVxuICAgIC5qb2luKCcnKTtcblxuZXhwb3J0cy5wcmludENoaWxkcmVuID0gcHJpbnRDaGlsZHJlbjtcblxuY29uc3QgcHJpbnRUZXh0ID0gKHRleHQsIGNvbmZpZykgPT4ge1xuICBjb25zdCBjb250ZW50Q29sb3IgPSBjb25maWcuY29sb3JzLmNvbnRlbnQ7XG4gIHJldHVybiAoXG4gICAgY29udGVudENvbG9yLm9wZW4gKyAoMCwgX2VzY2FwZUhUTUwuZGVmYXVsdCkodGV4dCkgKyBjb250ZW50Q29sb3IuY2xvc2VcbiAgKTtcbn07XG5cbmV4cG9ydHMucHJpbnRUZXh0ID0gcHJpbnRUZXh0O1xuXG5jb25zdCBwcmludENvbW1lbnQgPSAoY29tbWVudCwgY29uZmlnKSA9PiB7XG4gIGNvbnN0IGNvbW1lbnRDb2xvciA9IGNvbmZpZy5jb2xvcnMuY29tbWVudDtcbiAgcmV0dXJuIChcbiAgICBjb21tZW50Q29sb3Iub3BlbiArXG4gICAgJzwhLS0nICtcbiAgICAoMCwgX2VzY2FwZUhUTUwuZGVmYXVsdCkoY29tbWVudCkgK1xuICAgICctLT4nICtcbiAgICBjb21tZW50Q29sb3IuY2xvc2VcbiAgKTtcbn07IC8vIFNlcGFyYXRlIHRoZSBmdW5jdGlvbnMgdG8gZm9ybWF0IHByb3BzLCBjaGlsZHJlbiwgYW5kIGVsZW1lbnQsXG4vLyBzbyBhIHBsdWdpbiBjb3VsZCBvdmVycmlkZSBhIHBhcnRpY3VsYXIgZnVuY3Rpb24sIGlmIG5lZWRlZC5cbi8vIFRvbyBiYWQsIHNvIHNhZDogdGhlIHRyYWRpdGlvbmFsIChidXQgdW5uZWNlc3NhcnkpIHNwYWNlXG4vLyBpbiBhIHNlbGYtY2xvc2luZyB0YWdDb2xvciByZXF1aXJlcyBhIHNlY29uZCB0ZXN0IG9mIHByaW50ZWRQcm9wcy5cblxuZXhwb3J0cy5wcmludENvbW1lbnQgPSBwcmludENvbW1lbnQ7XG5cbmNvbnN0IHByaW50RWxlbWVudCA9IChcbiAgdHlwZSxcbiAgcHJpbnRlZFByb3BzLFxuICBwcmludGVkQ2hpbGRyZW4sXG4gIGNvbmZpZyxcbiAgaW5kZW50YXRpb25cbikgPT4ge1xuICBjb25zdCB0YWdDb2xvciA9IGNvbmZpZy5jb2xvcnMudGFnO1xuICByZXR1cm4gKFxuICAgIHRhZ0NvbG9yLm9wZW4gK1xuICAgICc8JyArXG4gICAgdHlwZSArXG4gICAgKHByaW50ZWRQcm9wcyAmJlxuICAgICAgdGFnQ29sb3IuY2xvc2UgK1xuICAgICAgICBwcmludGVkUHJvcHMgK1xuICAgICAgICBjb25maWcuc3BhY2luZ091dGVyICtcbiAgICAgICAgaW5kZW50YXRpb24gK1xuICAgICAgICB0YWdDb2xvci5vcGVuKSArXG4gICAgKHByaW50ZWRDaGlsZHJlblxuICAgICAgPyAnPicgK1xuICAgICAgICB0YWdDb2xvci5jbG9zZSArXG4gICAgICAgIHByaW50ZWRDaGlsZHJlbiArXG4gICAgICAgIGNvbmZpZy5zcGFjaW5nT3V0ZXIgK1xuICAgICAgICBpbmRlbnRhdGlvbiArXG4gICAgICAgIHRhZ0NvbG9yLm9wZW4gK1xuICAgICAgICAnPC8nICtcbiAgICAgICAgdHlwZVxuICAgICAgOiAocHJpbnRlZFByb3BzICYmICFjb25maWcubWluID8gJycgOiAnICcpICsgJy8nKSArXG4gICAgJz4nICtcbiAgICB0YWdDb2xvci5jbG9zZVxuICApO1xufTtcblxuZXhwb3J0cy5wcmludEVsZW1lbnQgPSBwcmludEVsZW1lbnQ7XG5cbmNvbnN0IHByaW50RWxlbWVudEFzTGVhZiA9ICh0eXBlLCBjb25maWcpID0+IHtcbiAgY29uc3QgdGFnQ29sb3IgPSBjb25maWcuY29sb3JzLnRhZztcbiAgcmV0dXJuIChcbiAgICB0YWdDb2xvci5vcGVuICtcbiAgICAnPCcgK1xuICAgIHR5cGUgK1xuICAgIHRhZ0NvbG9yLmNsb3NlICtcbiAgICAnIOKApicgK1xuICAgIHRhZ0NvbG9yLm9wZW4gK1xuICAgICcgLz4nICtcbiAgICB0YWdDb2xvci5jbG9zZVxuICApO1xufTtcblxuZXhwb3J0cy5wcmludEVsZW1lbnRBc0xlYWYgPSBwcmludEVsZW1lbnRBc0xlYWY7XG4iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy50ZXN0ID0gZXhwb3J0cy5zZXJpYWxpemUgPSBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfbWFya3VwID0gcmVxdWlyZSgnLi9saWIvbWFya3VwJyk7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cbmNvbnN0IEVMRU1FTlRfTk9ERSA9IDE7XG5jb25zdCBURVhUX05PREUgPSAzO1xuY29uc3QgQ09NTUVOVF9OT0RFID0gODtcbmNvbnN0IEZSQUdNRU5UX05PREUgPSAxMTtcbmNvbnN0IEVMRU1FTlRfUkVHRVhQID0gL14oKEhUTUx8U1ZHKVxcdyopP0VsZW1lbnQkLztcblxuY29uc3QgdGVzdEhhc0F0dHJpYnV0ZSA9IHZhbCA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWwuaGFzQXR0cmlidXRlID09PSAnZnVuY3Rpb24nICYmIHZhbC5oYXNBdHRyaWJ1dGUoJ2lzJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuY29uc3QgdGVzdE5vZGUgPSB2YWwgPT4ge1xuICBjb25zdCBjb25zdHJ1Y3Rvck5hbWUgPSB2YWwuY29uc3RydWN0b3IubmFtZTtcbiAgY29uc3Qge25vZGVUeXBlLCB0YWdOYW1lfSA9IHZhbDtcbiAgY29uc3QgaXNDdXN0b21FbGVtZW50ID1cbiAgICAodHlwZW9mIHRhZ05hbWUgPT09ICdzdHJpbmcnICYmIHRhZ05hbWUuaW5jbHVkZXMoJy0nKSkgfHxcbiAgICB0ZXN0SGFzQXR0cmlidXRlKHZhbCk7XG4gIHJldHVybiAoXG4gICAgKG5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgJiZcbiAgICAgIChFTEVNRU5UX1JFR0VYUC50ZXN0KGNvbnN0cnVjdG9yTmFtZSkgfHwgaXNDdXN0b21FbGVtZW50KSkgfHxcbiAgICAobm9kZVR5cGUgPT09IFRFWFRfTk9ERSAmJiBjb25zdHJ1Y3Rvck5hbWUgPT09ICdUZXh0JykgfHxcbiAgICAobm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSAmJiBjb25zdHJ1Y3Rvck5hbWUgPT09ICdDb21tZW50JykgfHxcbiAgICAobm9kZVR5cGUgPT09IEZSQUdNRU5UX05PREUgJiYgY29uc3RydWN0b3JOYW1lID09PSAnRG9jdW1lbnRGcmFnbWVudCcpXG4gICk7XG59O1xuXG5jb25zdCB0ZXN0ID0gdmFsID0+IHtcbiAgdmFyIF92YWwkY29uc3RydWN0b3I7XG5cbiAgcmV0dXJuIChcbiAgICAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdm9pZCAwXG4gICAgICA/IHZvaWQgMFxuICAgICAgOiAoX3ZhbCRjb25zdHJ1Y3RvciA9IHZhbC5jb25zdHJ1Y3RvcikgPT09IG51bGwgfHxcbiAgICAgICAgX3ZhbCRjb25zdHJ1Y3RvciA9PT0gdm9pZCAwXG4gICAgICA/IHZvaWQgMFxuICAgICAgOiBfdmFsJGNvbnN0cnVjdG9yLm5hbWUpICYmIHRlc3ROb2RlKHZhbClcbiAgKTtcbn07XG5cbmV4cG9ydHMudGVzdCA9IHRlc3Q7XG5cbmZ1bmN0aW9uIG5vZGVJc1RleHQobm9kZSkge1xuICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFO1xufVxuXG5mdW5jdGlvbiBub2RlSXNDb21tZW50KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERTtcbn1cblxuZnVuY3Rpb24gbm9kZUlzRnJhZ21lbnQobm9kZSkge1xuICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gRlJBR01FTlRfTk9ERTtcbn1cblxuY29uc3Qgc2VyaWFsaXplID0gKG5vZGUsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSA9PiB7XG4gIGlmIChub2RlSXNUZXh0KG5vZGUpKSB7XG4gICAgcmV0dXJuICgwLCBfbWFya3VwLnByaW50VGV4dCkobm9kZS5kYXRhLCBjb25maWcpO1xuICB9XG5cbiAgaWYgKG5vZGVJc0NvbW1lbnQobm9kZSkpIHtcbiAgICByZXR1cm4gKDAsIF9tYXJrdXAucHJpbnRDb21tZW50KShub2RlLmRhdGEsIGNvbmZpZyk7XG4gIH1cblxuICBjb25zdCB0eXBlID0gbm9kZUlzRnJhZ21lbnQobm9kZSlcbiAgICA/IGBEb2N1bWVudEZyYWdtZW50YFxuICAgIDogbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgaWYgKCsrZGVwdGggPiBjb25maWcubWF4RGVwdGgpIHtcbiAgICByZXR1cm4gKDAsIF9tYXJrdXAucHJpbnRFbGVtZW50QXNMZWFmKSh0eXBlLCBjb25maWcpO1xuICB9XG5cbiAgcmV0dXJuICgwLCBfbWFya3VwLnByaW50RWxlbWVudCkoXG4gICAgdHlwZSxcbiAgICAoMCwgX21hcmt1cC5wcmludFByb3BzKShcbiAgICAgIG5vZGVJc0ZyYWdtZW50KG5vZGUpXG4gICAgICAgID8gW11cbiAgICAgICAgOiBBcnJheS5mcm9tKG5vZGUuYXR0cmlidXRlcylcbiAgICAgICAgICAgIC5tYXAoYXR0ciA9PiBhdHRyLm5hbWUpXG4gICAgICAgICAgICAuc29ydCgpLFxuICAgICAgbm9kZUlzRnJhZ21lbnQobm9kZSlcbiAgICAgICAgPyB7fVxuICAgICAgICA6IEFycmF5LmZyb20obm9kZS5hdHRyaWJ1dGVzKS5yZWR1Y2UoKHByb3BzLCBhdHRyaWJ1dGUpID0+IHtcbiAgICAgICAgICAgIHByb3BzW2F0dHJpYnV0ZS5uYW1lXSA9IGF0dHJpYnV0ZS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiBwcm9wcztcbiAgICAgICAgICB9LCB7fSksXG4gICAgICBjb25maWcsXG4gICAgICBpbmRlbnRhdGlvbiArIGNvbmZpZy5pbmRlbnQsXG4gICAgICBkZXB0aCxcbiAgICAgIHJlZnMsXG4gICAgICBwcmludGVyXG4gICAgKSxcbiAgICAoMCwgX21hcmt1cC5wcmludENoaWxkcmVuKShcbiAgICAgIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG5vZGUuY2hpbGROb2RlcyB8fCBub2RlLmNoaWxkcmVuKSxcbiAgICAgIGNvbmZpZyxcbiAgICAgIGluZGVudGF0aW9uICsgY29uZmlnLmluZGVudCxcbiAgICAgIGRlcHRoLFxuICAgICAgcmVmcyxcbiAgICAgIHByaW50ZXJcbiAgICApLFxuICAgIGNvbmZpZyxcbiAgICBpbmRlbnRhdGlvblxuICApO1xufTtcblxuZXhwb3J0cy5zZXJpYWxpemUgPSBzZXJpYWxpemU7XG5jb25zdCBwbHVnaW4gPSB7XG4gIHNlcmlhbGl6ZSxcbiAgdGVzdFxufTtcbnZhciBfZGVmYXVsdCA9IHBsdWdpbjtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudGVzdCA9IGV4cG9ydHMuc2VyaWFsaXplID0gZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX2NvbGxlY3Rpb25zID0gcmVxdWlyZSgnLi4vY29sbGVjdGlvbnMnKTtcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuLy8gU0VOVElORUwgY29uc3RhbnRzIGFyZSBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9pbW11dGFibGUtanNcbmNvbnN0IElTX0lURVJBQkxFX1NFTlRJTkVMID0gJ0BAX19JTU1VVEFCTEVfSVRFUkFCTEVfX0BAJztcbmNvbnN0IElTX0xJU1RfU0VOVElORUwgPSAnQEBfX0lNTVVUQUJMRV9MSVNUX19AQCc7XG5jb25zdCBJU19LRVlFRF9TRU5USU5FTCA9ICdAQF9fSU1NVVRBQkxFX0tFWUVEX19AQCc7XG5jb25zdCBJU19NQVBfU0VOVElORUwgPSAnQEBfX0lNTVVUQUJMRV9NQVBfX0BAJztcbmNvbnN0IElTX09SREVSRURfU0VOVElORUwgPSAnQEBfX0lNTVVUQUJMRV9PUkRFUkVEX19AQCc7XG5jb25zdCBJU19SRUNPUkRfU0VOVElORUwgPSAnQEBfX0lNTVVUQUJMRV9SRUNPUkRfX0BAJzsgLy8gaW1tdXRhYmxlIHY0XG5cbmNvbnN0IElTX1NFUV9TRU5USU5FTCA9ICdAQF9fSU1NVVRBQkxFX1NFUV9fQEAnO1xuY29uc3QgSVNfU0VUX1NFTlRJTkVMID0gJ0BAX19JTU1VVEFCTEVfU0VUX19AQCc7XG5jb25zdCBJU19TVEFDS19TRU5USU5FTCA9ICdAQF9fSU1NVVRBQkxFX1NUQUNLX19AQCc7XG5cbmNvbnN0IGdldEltbXV0YWJsZU5hbWUgPSBuYW1lID0+ICdJbW11dGFibGUuJyArIG5hbWU7XG5cbmNvbnN0IHByaW50QXNMZWFmID0gbmFtZSA9PiAnWycgKyBuYW1lICsgJ10nO1xuXG5jb25zdCBTUEFDRSA9ICcgJztcbmNvbnN0IExBWlkgPSAn4oCmJzsgLy8gU2VxIGlzIGxhenkgaWYgaXQgY2FsbHMgYSBtZXRob2QgbGlrZSBmaWx0ZXJcblxuY29uc3QgcHJpbnRJbW11dGFibGVFbnRyaWVzID0gKFxuICB2YWwsXG4gIGNvbmZpZyxcbiAgaW5kZW50YXRpb24sXG4gIGRlcHRoLFxuICByZWZzLFxuICBwcmludGVyLFxuICB0eXBlXG4pID0+XG4gICsrZGVwdGggPiBjb25maWcubWF4RGVwdGhcbiAgICA/IHByaW50QXNMZWFmKGdldEltbXV0YWJsZU5hbWUodHlwZSkpXG4gICAgOiBnZXRJbW11dGFibGVOYW1lKHR5cGUpICtcbiAgICAgIFNQQUNFICtcbiAgICAgICd7JyArXG4gICAgICAoMCwgX2NvbGxlY3Rpb25zLnByaW50SXRlcmF0b3JFbnRyaWVzKShcbiAgICAgICAgdmFsLmVudHJpZXMoKSxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBpbmRlbnRhdGlvbixcbiAgICAgICAgZGVwdGgsXG4gICAgICAgIHJlZnMsXG4gICAgICAgIHByaW50ZXJcbiAgICAgICkgK1xuICAgICAgJ30nOyAvLyBSZWNvcmQgaGFzIGFuIGVudHJpZXMgbWV0aG9kIGJlY2F1c2UgaXQgaXMgYSBjb2xsZWN0aW9uIGluIGltbXV0YWJsZSB2My5cbi8vIFJldHVybiBhbiBpdGVyYXRvciBmb3IgSW1tdXRhYmxlIFJlY29yZCBmcm9tIHZlcnNpb24gdjMgb3IgdjQuXG5cbmZ1bmN0aW9uIGdldFJlY29yZEVudHJpZXModmFsKSB7XG4gIGxldCBpID0gMDtcbiAgcmV0dXJuIHtcbiAgICBuZXh0KCkge1xuICAgICAgaWYgKGkgPCB2YWwuX2tleXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHZhbC5fa2V5c1tpKytdO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgICAgIHZhbHVlOiBba2V5LCB2YWwuZ2V0KGtleSldXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRvbmU6IHRydWUsXG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWRcbiAgICAgIH07XG4gICAgfVxuICB9O1xufVxuXG5jb25zdCBwcmludEltbXV0YWJsZVJlY29yZCA9IChcbiAgdmFsLFxuICBjb25maWcsXG4gIGluZGVudGF0aW9uLFxuICBkZXB0aCxcbiAgcmVmcyxcbiAgcHJpbnRlclxuKSA9PiB7XG4gIC8vIF9uYW1lIHByb3BlcnR5IGlzIGRlZmluZWQgb25seSBmb3IgYW4gSW1tdXRhYmxlIFJlY29yZCBpbnN0YW5jZVxuICAvLyB3aGljaCB3YXMgY29uc3RydWN0ZWQgd2l0aCBhIHNlY29uZCBvcHRpb25hbCBkZXNjcmlwdGl2ZSBuYW1lIGFyZ1xuICBjb25zdCBuYW1lID0gZ2V0SW1tdXRhYmxlTmFtZSh2YWwuX25hbWUgfHwgJ1JlY29yZCcpO1xuICByZXR1cm4gKytkZXB0aCA+IGNvbmZpZy5tYXhEZXB0aFxuICAgID8gcHJpbnRBc0xlYWYobmFtZSlcbiAgICA6IG5hbWUgK1xuICAgICAgICBTUEFDRSArXG4gICAgICAgICd7JyArXG4gICAgICAgICgwLCBfY29sbGVjdGlvbnMucHJpbnRJdGVyYXRvckVudHJpZXMpKFxuICAgICAgICAgIGdldFJlY29yZEVudHJpZXModmFsKSxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgaW5kZW50YXRpb24sXG4gICAgICAgICAgZGVwdGgsXG4gICAgICAgICAgcmVmcyxcbiAgICAgICAgICBwcmludGVyXG4gICAgICAgICkgK1xuICAgICAgICAnfSc7XG59O1xuXG5jb25zdCBwcmludEltbXV0YWJsZVNlcSA9ICh2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSA9PiB7XG4gIGNvbnN0IG5hbWUgPSBnZXRJbW11dGFibGVOYW1lKCdTZXEnKTtcblxuICBpZiAoKytkZXB0aCA+IGNvbmZpZy5tYXhEZXB0aCkge1xuICAgIHJldHVybiBwcmludEFzTGVhZihuYW1lKTtcbiAgfVxuXG4gIGlmICh2YWxbSVNfS0VZRURfU0VOVElORUxdKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIG5hbWUgK1xuICAgICAgU1BBQ0UgK1xuICAgICAgJ3snICsgLy8gZnJvbSBJbW11dGFibGUgY29sbGVjdGlvbiBvZiBlbnRyaWVzIG9yIGZyb20gRUNNQVNjcmlwdCBvYmplY3RcbiAgICAgICh2YWwuX2l0ZXIgfHwgdmFsLl9vYmplY3RcbiAgICAgICAgPyAoMCwgX2NvbGxlY3Rpb25zLnByaW50SXRlcmF0b3JFbnRyaWVzKShcbiAgICAgICAgICAgIHZhbC5lbnRyaWVzKCksXG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICBpbmRlbnRhdGlvbixcbiAgICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgICAgcmVmcyxcbiAgICAgICAgICAgIHByaW50ZXJcbiAgICAgICAgICApXG4gICAgICAgIDogTEFaWSkgK1xuICAgICAgJ30nXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgbmFtZSArXG4gICAgU1BBQ0UgK1xuICAgICdbJyArXG4gICAgKHZhbC5faXRlciB8fCAvLyBmcm9tIEltbXV0YWJsZSBjb2xsZWN0aW9uIG9mIHZhbHVlc1xuICAgIHZhbC5fYXJyYXkgfHwgLy8gZnJvbSBFQ01BU2NyaXB0IGFycmF5XG4gICAgdmFsLl9jb2xsZWN0aW9uIHx8IC8vIGZyb20gRUNNQVNjcmlwdCBjb2xsZWN0aW9uIGluIGltbXV0YWJsZSB2NFxuICAgIHZhbC5faXRlcmFibGUgLy8gZnJvbSBFQ01BU2NyaXB0IGNvbGxlY3Rpb24gaW4gaW1tdXRhYmxlIHYzXG4gICAgICA/ICgwLCBfY29sbGVjdGlvbnMucHJpbnRJdGVyYXRvclZhbHVlcykoXG4gICAgICAgICAgdmFsLnZhbHVlcygpLFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICBpbmRlbnRhdGlvbixcbiAgICAgICAgICBkZXB0aCxcbiAgICAgICAgICByZWZzLFxuICAgICAgICAgIHByaW50ZXJcbiAgICAgICAgKVxuICAgICAgOiBMQVpZKSArXG4gICAgJ10nXG4gICk7XG59O1xuXG5jb25zdCBwcmludEltbXV0YWJsZVZhbHVlcyA9IChcbiAgdmFsLFxuICBjb25maWcsXG4gIGluZGVudGF0aW9uLFxuICBkZXB0aCxcbiAgcmVmcyxcbiAgcHJpbnRlcixcbiAgdHlwZVxuKSA9PlxuICArK2RlcHRoID4gY29uZmlnLm1heERlcHRoXG4gICAgPyBwcmludEFzTGVhZihnZXRJbW11dGFibGVOYW1lKHR5cGUpKVxuICAgIDogZ2V0SW1tdXRhYmxlTmFtZSh0eXBlKSArXG4gICAgICBTUEFDRSArXG4gICAgICAnWycgK1xuICAgICAgKDAsIF9jb2xsZWN0aW9ucy5wcmludEl0ZXJhdG9yVmFsdWVzKShcbiAgICAgICAgdmFsLnZhbHVlcygpLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIGluZGVudGF0aW9uLFxuICAgICAgICBkZXB0aCxcbiAgICAgICAgcmVmcyxcbiAgICAgICAgcHJpbnRlclxuICAgICAgKSArXG4gICAgICAnXSc7XG5cbmNvbnN0IHNlcmlhbGl6ZSA9ICh2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSA9PiB7XG4gIGlmICh2YWxbSVNfTUFQX1NFTlRJTkVMXSkge1xuICAgIHJldHVybiBwcmludEltbXV0YWJsZUVudHJpZXMoXG4gICAgICB2YWwsXG4gICAgICBjb25maWcsXG4gICAgICBpbmRlbnRhdGlvbixcbiAgICAgIGRlcHRoLFxuICAgICAgcmVmcyxcbiAgICAgIHByaW50ZXIsXG4gICAgICB2YWxbSVNfT1JERVJFRF9TRU5USU5FTF0gPyAnT3JkZXJlZE1hcCcgOiAnTWFwJ1xuICAgICk7XG4gIH1cblxuICBpZiAodmFsW0lTX0xJU1RfU0VOVElORUxdKSB7XG4gICAgcmV0dXJuIHByaW50SW1tdXRhYmxlVmFsdWVzKFxuICAgICAgdmFsLFxuICAgICAgY29uZmlnLFxuICAgICAgaW5kZW50YXRpb24sXG4gICAgICBkZXB0aCxcbiAgICAgIHJlZnMsXG4gICAgICBwcmludGVyLFxuICAgICAgJ0xpc3QnXG4gICAgKTtcbiAgfVxuXG4gIGlmICh2YWxbSVNfU0VUX1NFTlRJTkVMXSkge1xuICAgIHJldHVybiBwcmludEltbXV0YWJsZVZhbHVlcyhcbiAgICAgIHZhbCxcbiAgICAgIGNvbmZpZyxcbiAgICAgIGluZGVudGF0aW9uLFxuICAgICAgZGVwdGgsXG4gICAgICByZWZzLFxuICAgICAgcHJpbnRlcixcbiAgICAgIHZhbFtJU19PUkRFUkVEX1NFTlRJTkVMXSA/ICdPcmRlcmVkU2V0JyA6ICdTZXQnXG4gICAgKTtcbiAgfVxuXG4gIGlmICh2YWxbSVNfU1RBQ0tfU0VOVElORUxdKSB7XG4gICAgcmV0dXJuIHByaW50SW1tdXRhYmxlVmFsdWVzKFxuICAgICAgdmFsLFxuICAgICAgY29uZmlnLFxuICAgICAgaW5kZW50YXRpb24sXG4gICAgICBkZXB0aCxcbiAgICAgIHJlZnMsXG4gICAgICBwcmludGVyLFxuICAgICAgJ1N0YWNrJ1xuICAgICk7XG4gIH1cblxuICBpZiAodmFsW0lTX1NFUV9TRU5USU5FTF0pIHtcbiAgICByZXR1cm4gcHJpbnRJbW11dGFibGVTZXEodmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcik7XG4gIH0gLy8gRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBpbW11dGFibGUgdjMgYW5kIHY0LCBsZXQgcmVjb3JkIGJlIHRoZSBkZWZhdWx0LlxuXG4gIHJldHVybiBwcmludEltbXV0YWJsZVJlY29yZCh2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKTtcbn07IC8vIEV4cGxpY2l0bHkgY29tcGFyaW5nIHNlbnRpbmVsIHByb3BlcnRpZXMgdG8gdHJ1ZSBhdm9pZHMgZmFsc2UgcG9zaXRpdmVcbi8vIHdoZW4gbW9jayBpZGVudGl0eS1vYmotcHJveHkgcmV0dXJucyB0aGUga2V5IGFzIHRoZSB2YWx1ZSBmb3IgYW55IGtleS5cblxuZXhwb3J0cy5zZXJpYWxpemUgPSBzZXJpYWxpemU7XG5cbmNvbnN0IHRlc3QgPSB2YWwgPT5cbiAgdmFsICYmXG4gICh2YWxbSVNfSVRFUkFCTEVfU0VOVElORUxdID09PSB0cnVlIHx8IHZhbFtJU19SRUNPUkRfU0VOVElORUxdID09PSB0cnVlKTtcblxuZXhwb3J0cy50ZXN0ID0gdGVzdDtcbmNvbnN0IHBsdWdpbiA9IHtcbiAgc2VyaWFsaXplLFxuICB0ZXN0XG59O1xudmFyIF9kZWZhdWx0ID0gcGx1Z2luO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4iLCIvKiogQGxpY2Vuc2UgUmVhY3QgdjE3LjAuMlxuICogcmVhY3QtaXMucHJvZHVjdGlvbi5taW4uanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO3ZhciBiPTYwMTAzLGM9NjAxMDYsZD02MDEwNyxlPTYwMTA4LGY9NjAxMTQsZz02MDEwOSxoPTYwMTEwLGs9NjAxMTIsbD02MDExMyxtPTYwMTIwLG49NjAxMTUscD02MDExNixxPTYwMTIxLHI9NjAxMjIsdT02MDExNyx2PTYwMTI5LHc9NjAxMzE7XG5pZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuZm9yKXt2YXIgeD1TeW1ib2wuZm9yO2I9eChcInJlYWN0LmVsZW1lbnRcIik7Yz14KFwicmVhY3QucG9ydGFsXCIpO2Q9eChcInJlYWN0LmZyYWdtZW50XCIpO2U9eChcInJlYWN0LnN0cmljdF9tb2RlXCIpO2Y9eChcInJlYWN0LnByb2ZpbGVyXCIpO2c9eChcInJlYWN0LnByb3ZpZGVyXCIpO2g9eChcInJlYWN0LmNvbnRleHRcIik7az14KFwicmVhY3QuZm9yd2FyZF9yZWZcIik7bD14KFwicmVhY3Quc3VzcGVuc2VcIik7bT14KFwicmVhY3Quc3VzcGVuc2VfbGlzdFwiKTtuPXgoXCJyZWFjdC5tZW1vXCIpO3A9eChcInJlYWN0LmxhenlcIik7cT14KFwicmVhY3QuYmxvY2tcIik7cj14KFwicmVhY3Quc2VydmVyLmJsb2NrXCIpO3U9eChcInJlYWN0LmZ1bmRhbWVudGFsXCIpO3Y9eChcInJlYWN0LmRlYnVnX3RyYWNlX21vZGVcIik7dz14KFwicmVhY3QubGVnYWN5X2hpZGRlblwiKX1cbmZ1bmN0aW9uIHkoYSl7aWYoXCJvYmplY3RcIj09PXR5cGVvZiBhJiZudWxsIT09YSl7dmFyIHQ9YS4kJHR5cGVvZjtzd2l0Y2godCl7Y2FzZSBiOnN3aXRjaChhPWEudHlwZSxhKXtjYXNlIGQ6Y2FzZSBmOmNhc2UgZTpjYXNlIGw6Y2FzZSBtOnJldHVybiBhO2RlZmF1bHQ6c3dpdGNoKGE9YSYmYS4kJHR5cGVvZixhKXtjYXNlIGg6Y2FzZSBrOmNhc2UgcDpjYXNlIG46Y2FzZSBnOnJldHVybiBhO2RlZmF1bHQ6cmV0dXJuIHR9fWNhc2UgYzpyZXR1cm4gdH19fXZhciB6PWcsQT1iLEI9ayxDPWQsRD1wLEU9bixGPWMsRz1mLEg9ZSxJPWw7ZXhwb3J0cy5Db250ZXh0Q29uc3VtZXI9aDtleHBvcnRzLkNvbnRleHRQcm92aWRlcj16O2V4cG9ydHMuRWxlbWVudD1BO2V4cG9ydHMuRm9yd2FyZFJlZj1CO2V4cG9ydHMuRnJhZ21lbnQ9QztleHBvcnRzLkxhenk9RDtleHBvcnRzLk1lbW89RTtleHBvcnRzLlBvcnRhbD1GO2V4cG9ydHMuUHJvZmlsZXI9RztleHBvcnRzLlN0cmljdE1vZGU9SDtcbmV4cG9ydHMuU3VzcGVuc2U9STtleHBvcnRzLmlzQXN5bmNNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuITF9O2V4cG9ydHMuaXNDb25jdXJyZW50TW9kZT1mdW5jdGlvbigpe3JldHVybiExfTtleHBvcnRzLmlzQ29udGV4dENvbnN1bWVyPWZ1bmN0aW9uKGEpe3JldHVybiB5KGEpPT09aH07ZXhwb3J0cy5pc0NvbnRleHRQcm92aWRlcj1mdW5jdGlvbihhKXtyZXR1cm4geShhKT09PWd9O2V4cG9ydHMuaXNFbGVtZW50PWZ1bmN0aW9uKGEpe3JldHVyblwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEmJmEuJCR0eXBlb2Y9PT1ifTtleHBvcnRzLmlzRm9yd2FyZFJlZj1mdW5jdGlvbihhKXtyZXR1cm4geShhKT09PWt9O2V4cG9ydHMuaXNGcmFnbWVudD1mdW5jdGlvbihhKXtyZXR1cm4geShhKT09PWR9O2V4cG9ydHMuaXNMYXp5PWZ1bmN0aW9uKGEpe3JldHVybiB5KGEpPT09cH07ZXhwb3J0cy5pc01lbW89ZnVuY3Rpb24oYSl7cmV0dXJuIHkoYSk9PT1ufTtcbmV4cG9ydHMuaXNQb3J0YWw9ZnVuY3Rpb24oYSl7cmV0dXJuIHkoYSk9PT1jfTtleHBvcnRzLmlzUHJvZmlsZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIHkoYSk9PT1mfTtleHBvcnRzLmlzU3RyaWN0TW9kZT1mdW5jdGlvbihhKXtyZXR1cm4geShhKT09PWV9O2V4cG9ydHMuaXNTdXNwZW5zZT1mdW5jdGlvbihhKXtyZXR1cm4geShhKT09PWx9O2V4cG9ydHMuaXNWYWxpZEVsZW1lbnRUeXBlPWZ1bmN0aW9uKGEpe3JldHVyblwic3RyaW5nXCI9PT10eXBlb2YgYXx8XCJmdW5jdGlvblwiPT09dHlwZW9mIGF8fGE9PT1kfHxhPT09Znx8YT09PXZ8fGE9PT1lfHxhPT09bHx8YT09PW18fGE9PT13fHxcIm9iamVjdFwiPT09dHlwZW9mIGEmJm51bGwhPT1hJiYoYS4kJHR5cGVvZj09PXB8fGEuJCR0eXBlb2Y9PT1ufHxhLiQkdHlwZW9mPT09Z3x8YS4kJHR5cGVvZj09PWh8fGEuJCR0eXBlb2Y9PT1rfHxhLiQkdHlwZW9mPT09dXx8YS4kJHR5cGVvZj09PXF8fGFbMF09PT1yKT8hMDohMX07XG5leHBvcnRzLnR5cGVPZj15O1xuIiwiLyoqIEBsaWNlbnNlIFJlYWN0IHYxNy4wLjJcbiAqIHJlYWN0LWlzLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gQVRURU5USU9OXG4vLyBXaGVuIGFkZGluZyBuZXcgc3ltYm9scyB0byB0aGlzIGZpbGUsXG4vLyBQbGVhc2UgY29uc2lkZXIgYWxzbyBhZGRpbmcgdG8gJ3JlYWN0LWRldnRvb2xzLXNoYXJlZC9zcmMvYmFja2VuZC9SZWFjdFN5bWJvbHMnXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQtbGlrZSB0eXBlcy4gSWYgdGhlcmUgaXMgbm8gbmF0aXZlIFN5bWJvbFxuLy8gbm9yIHBvbHlmaWxsLCB0aGVuIGEgcGxhaW4gbnVtYmVyIGlzIHVzZWQgZm9yIHBlcmZvcm1hbmNlLlxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IDB4ZWFjNztcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IDB4ZWFjYTtcbnZhciBSRUFDVF9GUkFHTUVOVF9UWVBFID0gMHhlYWNiO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSAweGVhY2M7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IDB4ZWFkMjtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gMHhlYWNkO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IDB4ZWFjZTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gMHhlYWQwO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSAweGVhZDE7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gMHhlYWQ4O1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IDB4ZWFkMztcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSAweGVhZDQ7XG52YXIgUkVBQ1RfQkxPQ0tfVFlQRSA9IDB4ZWFkOTtcbnZhciBSRUFDVF9TRVJWRVJfQkxPQ0tfVFlQRSA9IDB4ZWFkYTtcbnZhciBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFID0gMHhlYWQ1O1xudmFyIFJFQUNUX1NDT1BFX1RZUEUgPSAweGVhZDc7XG52YXIgUkVBQ1RfT1BBUVVFX0lEX1RZUEUgPSAweGVhZTA7XG52YXIgUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEUgPSAweGVhZTE7XG52YXIgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSAweGVhZTI7XG52YXIgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFID0gMHhlYWUzO1xuXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuZm9yKSB7XG4gIHZhciBzeW1ib2xGb3IgPSBTeW1ib2wuZm9yO1xuICBSRUFDVF9FTEVNRU5UX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmVsZW1lbnQnKTtcbiAgUkVBQ1RfUE9SVEFMX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnBvcnRhbCcpO1xuICBSRUFDVF9GUkFHTUVOVF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5mcmFnbWVudCcpO1xuICBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xuICBSRUFDVF9QUk9GSUxFUl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5wcm9maWxlcicpO1xuICBSRUFDVF9QUk9WSURFUl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5wcm92aWRlcicpO1xuICBSRUFDVF9DT05URVhUX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmNvbnRleHQnKTtcbiAgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbiAgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Quc3VzcGVuc2UnKTtcbiAgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG4gIFJFQUNUX01FTU9fVFlQRSA9IHN5bWJvbEZvcigncmVhY3QubWVtbycpO1xuICBSRUFDVF9MQVpZX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmxhenknKTtcbiAgUkVBQ1RfQkxPQ0tfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuYmxvY2snKTtcbiAgUkVBQ1RfU0VSVkVSX0JMT0NLX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnNlcnZlci5ibG9jaycpO1xuICBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5mdW5kYW1lbnRhbCcpO1xuICBSRUFDVF9TQ09QRV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zY29wZScpO1xuICBSRUFDVF9PUEFRVUVfSURfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Qub3BhcXVlLmlkJyk7XG4gIFJFQUNUX0RFQlVHX1RSQUNJTkdfTU9ERV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5kZWJ1Z190cmFjZV9tb2RlJyk7XG4gIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5vZmZzY3JlZW4nKTtcbiAgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5sZWdhY3lfaGlkZGVuJyk7XG59XG5cbi8vIEZpbHRlciBjZXJ0YWluIERPTSBhdHRyaWJ1dGVzIChlLmcuIHNyYywgaHJlZikgaWYgdGhlaXIgdmFsdWVzIGFyZSBlbXB0eSBzdHJpbmdzLlxuXG52YXIgZW5hYmxlU2NvcGVBUEkgPSBmYWxzZTsgLy8gRXhwZXJpbWVudGFsIENyZWF0ZSBFdmVudCBIYW5kbGUgQVBJLlxuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkge1xuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gTm90ZTogdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgKGUuZy4gaWYgaXQncyBhIHBvbHlmaWxsKS5cblxuXG4gIGlmICh0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEUgfHwgZW5hYmxlU2NvcGVBUEkgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwpIHtcbiAgICBpZiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQkxPQ0tfVFlQRSB8fCB0eXBlWzBdID09PSBSRUFDVF9TRVJWRVJfQkxPQ0tfVFlQRSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiB0eXBlT2Yob2JqZWN0KSB7XG4gIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwpIHtcbiAgICB2YXIgJCR0eXBlb2YgPSBvYmplY3QuJCR0eXBlb2Y7XG5cbiAgICBzd2l0Y2ggKCQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgdmFyIHR5cGUgPSBvYmplY3QudHlwZTtcblxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB2YXIgJCR0eXBlb2ZUeXBlID0gdHlwZSAmJiB0eXBlLiQkdHlwZW9mO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKCQkdHlwZW9mVHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2ZUeXBlO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG52YXIgQ29udGV4dENvbnN1bWVyID0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xudmFyIENvbnRleHRQcm92aWRlciA9IFJFQUNUX1BST1ZJREVSX1RZUEU7XG52YXIgRWxlbWVudCA9IFJFQUNUX0VMRU1FTlRfVFlQRTtcbnZhciBGb3J3YXJkUmVmID0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbnZhciBGcmFnbWVudCA9IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG52YXIgTGF6eSA9IFJFQUNUX0xBWllfVFlQRTtcbnZhciBNZW1vID0gUkVBQ1RfTUVNT19UWVBFO1xudmFyIFBvcnRhbCA9IFJFQUNUX1BPUlRBTF9UWVBFO1xudmFyIFByb2ZpbGVyID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbnZhciBTdHJpY3RNb2RlID0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbnZhciBTdXNwZW5zZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG52YXIgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUgPSBmYWxzZTtcbnZhciBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0NvbmN1cnJlbnRNb2RlID0gZmFsc2U7IC8vIEFzeW5jTW9kZSBzaG91bGQgYmUgZGVwcmVjYXRlZFxuXG5mdW5jdGlvbiBpc0FzeW5jTW9kZShvYmplY3QpIHtcbiAge1xuICAgIGlmICghaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUpIHtcbiAgICAgIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gdHJ1ZTsgLy8gVXNpbmcgY29uc29sZVsnd2FybiddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcblxuICAgICAgY29uc29sZVsnd2FybiddKCdUaGUgUmVhY3RJcy5pc0FzeW5jTW9kZSgpIGFsaWFzIGhhcyBiZWVuIGRlcHJlY2F0ZWQsICcgKyAnYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBSZWFjdCAxOCsuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHtcbiAge1xuICAgIGlmICghaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNDb25jdXJyZW50TW9kZSkge1xuICAgICAgaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNDb25jdXJyZW50TW9kZSA9IHRydWU7IC8vIFVzaW5nIGNvbnNvbGVbJ3dhcm4nXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50XG5cbiAgICAgIGNvbnNvbGVbJ3dhcm4nXSgnVGhlIFJlYWN0SXMuaXNDb25jdXJyZW50TW9kZSgpIGFsaWFzIGhhcyBiZWVuIGRlcHJlY2F0ZWQsICcgKyAnYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBSZWFjdCAxOCsuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0Q29uc3VtZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0UHJvdmlkZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRm9yd2FyZFJlZihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xufVxuZnVuY3Rpb24gaXNGcmFnbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNMYXp5KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0xBWllfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTWVtbyhvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9NRU1PX1RZUEU7XG59XG5mdW5jdGlvbiBpc1BvcnRhbChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QT1JUQUxfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUHJvZmlsZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3RyaWN0TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xufVxuXG5leHBvcnRzLkNvbnRleHRDb25zdW1lciA9IENvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuQ29udGV4dFByb3ZpZGVyID0gQ29udGV4dFByb3ZpZGVyO1xuZXhwb3J0cy5FbGVtZW50ID0gRWxlbWVudDtcbmV4cG9ydHMuRm9yd2FyZFJlZiA9IEZvcndhcmRSZWY7XG5leHBvcnRzLkZyYWdtZW50ID0gRnJhZ21lbnQ7XG5leHBvcnRzLkxhenkgPSBMYXp5O1xuZXhwb3J0cy5NZW1vID0gTWVtbztcbmV4cG9ydHMuUG9ydGFsID0gUG9ydGFsO1xuZXhwb3J0cy5Qcm9maWxlciA9IFByb2ZpbGVyO1xuZXhwb3J0cy5TdHJpY3RNb2RlID0gU3RyaWN0TW9kZTtcbmV4cG9ydHMuU3VzcGVuc2UgPSBTdXNwZW5zZTtcbmV4cG9ydHMuaXNBc3luY01vZGUgPSBpc0FzeW5jTW9kZTtcbmV4cG9ydHMuaXNDb25jdXJyZW50TW9kZSA9IGlzQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLmlzQ29udGV4dENvbnN1bWVyID0gaXNDb250ZXh0Q29uc3VtZXI7XG5leHBvcnRzLmlzQ29udGV4dFByb3ZpZGVyID0gaXNDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLmlzRWxlbWVudCA9IGlzRWxlbWVudDtcbmV4cG9ydHMuaXNGb3J3YXJkUmVmID0gaXNGb3J3YXJkUmVmO1xuZXhwb3J0cy5pc0ZyYWdtZW50ID0gaXNGcmFnbWVudDtcbmV4cG9ydHMuaXNMYXp5ID0gaXNMYXp5O1xuZXhwb3J0cy5pc01lbW8gPSBpc01lbW87XG5leHBvcnRzLmlzUG9ydGFsID0gaXNQb3J0YWw7XG5leHBvcnRzLmlzUHJvZmlsZXIgPSBpc1Byb2ZpbGVyO1xuZXhwb3J0cy5pc1N0cmljdE1vZGUgPSBpc1N0cmljdE1vZGU7XG5leHBvcnRzLmlzU3VzcGVuc2UgPSBpc1N1c3BlbnNlO1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGU7XG5leHBvcnRzLnR5cGVPZiA9IHR5cGVPZjtcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudGVzdCA9IGV4cG9ydHMuc2VyaWFsaXplID0gZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgUmVhY3RJcyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoJ3JlYWN0LWlzJykpO1xuXG52YXIgX21hcmt1cCA9IHJlcXVpcmUoJy4vbGliL21hcmt1cCcpO1xuXG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApIHtcbiAgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gbnVsbDtcbiAgdmFyIGNhY2hlQmFiZWxJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTtcbiAgdmFyIGNhY2hlTm9kZUludGVyb3AgPSBuZXcgV2Vha01hcCgpO1xuICByZXR1cm4gKF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIChub2RlSW50ZXJvcCkge1xuICAgIHJldHVybiBub2RlSW50ZXJvcCA/IGNhY2hlTm9kZUludGVyb3AgOiBjYWNoZUJhYmVsSW50ZXJvcDtcbiAgfSkobm9kZUludGVyb3ApO1xufVxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmosIG5vZGVJbnRlcm9wKSB7XG4gIGlmICghbm9kZUludGVyb3AgJiYgb2JqICYmIG9iai5fX2VzTW9kdWxlKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuICBpZiAob2JqID09PSBudWxsIHx8ICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb2JqICE9PSAnZnVuY3Rpb24nKSkge1xuICAgIHJldHVybiB7ZGVmYXVsdDogb2JqfTtcbiAgfVxuICB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUobm9kZUludGVyb3ApO1xuICBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHtcbiAgICByZXR1cm4gY2FjaGUuZ2V0KG9iaik7XG4gIH1cbiAgdmFyIG5ld09iaiA9IHt9O1xuICB2YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9yID1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGlmIChrZXkgIT09ICdkZWZhdWx0JyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvclxuICAgICAgICA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpXG4gICAgICAgIDogbnVsbDtcbiAgICAgIGlmIChkZXNjICYmIChkZXNjLmdldCB8fCBkZXNjLnNldCkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld09ialtrZXldID0gb2JqW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIG5ld09iai5kZWZhdWx0ID0gb2JqO1xuICBpZiAoY2FjaGUpIHtcbiAgICBjYWNoZS5zZXQob2JqLCBuZXdPYmopO1xuICB9XG4gIHJldHVybiBuZXdPYmo7XG59XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cbi8vIEdpdmVuIGVsZW1lbnQucHJvcHMuY2hpbGRyZW4sIG9yIHN1YnRyZWUgZHVyaW5nIHJlY3Vyc2l2ZSB0cmF2ZXJzYWwsXG4vLyByZXR1cm4gZmxhdHRlbmVkIGFycmF5IG9mIGNoaWxkcmVuLlxuY29uc3QgZ2V0Q2hpbGRyZW4gPSAoYXJnLCBjaGlsZHJlbiA9IFtdKSA9PiB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFyZykpIHtcbiAgICBhcmcuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGdldENoaWxkcmVuKGl0ZW0sIGNoaWxkcmVuKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChhcmcgIT0gbnVsbCAmJiBhcmcgIT09IGZhbHNlKSB7XG4gICAgY2hpbGRyZW4ucHVzaChhcmcpO1xuICB9XG5cbiAgcmV0dXJuIGNoaWxkcmVuO1xufTtcblxuY29uc3QgZ2V0VHlwZSA9IGVsZW1lbnQgPT4ge1xuICBjb25zdCB0eXBlID0gZWxlbWVudC50eXBlO1xuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCAnVW5rbm93bic7XG4gIH1cblxuICBpZiAoUmVhY3RJcy5pc0ZyYWdtZW50KGVsZW1lbnQpKSB7XG4gICAgcmV0dXJuICdSZWFjdC5GcmFnbWVudCc7XG4gIH1cblxuICBpZiAoUmVhY3RJcy5pc1N1c3BlbnNlKGVsZW1lbnQpKSB7XG4gICAgcmV0dXJuICdSZWFjdC5TdXNwZW5zZSc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwpIHtcbiAgICBpZiAoUmVhY3RJcy5pc0NvbnRleHRQcm92aWRlcihlbGVtZW50KSkge1xuICAgICAgcmV0dXJuICdDb250ZXh0LlByb3ZpZGVyJztcbiAgICB9XG5cbiAgICBpZiAoUmVhY3RJcy5pc0NvbnRleHRDb25zdW1lcihlbGVtZW50KSkge1xuICAgICAgcmV0dXJuICdDb250ZXh0LkNvbnN1bWVyJztcbiAgICB9XG5cbiAgICBpZiAoUmVhY3RJcy5pc0ZvcndhcmRSZWYoZWxlbWVudCkpIHtcbiAgICAgIGlmICh0eXBlLmRpc3BsYXlOYW1lKSB7XG4gICAgICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSB0eXBlLnJlbmRlci5kaXNwbGF5TmFtZSB8fCB0eXBlLnJlbmRlci5uYW1lIHx8ICcnO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uTmFtZSAhPT0gJydcbiAgICAgICAgPyAnRm9yd2FyZFJlZignICsgZnVuY3Rpb25OYW1lICsgJyknXG4gICAgICAgIDogJ0ZvcndhcmRSZWYnO1xuICAgIH1cblxuICAgIGlmIChSZWFjdElzLmlzTWVtbyhlbGVtZW50KSkge1xuICAgICAgY29uc3QgZnVuY3Rpb25OYW1lID1cbiAgICAgICAgdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLnR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS50eXBlLm5hbWUgfHwgJyc7XG4gICAgICByZXR1cm4gZnVuY3Rpb25OYW1lICE9PSAnJyA/ICdNZW1vKCcgKyBmdW5jdGlvbk5hbWUgKyAnKScgOiAnTWVtbyc7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICdVTkRFRklORUQnO1xufTtcblxuY29uc3QgZ2V0UHJvcEtleXMgPSBlbGVtZW50ID0+IHtcbiAgY29uc3Qge3Byb3BzfSA9IGVsZW1lbnQ7XG4gIHJldHVybiBPYmplY3Qua2V5cyhwcm9wcylcbiAgICAuZmlsdGVyKGtleSA9PiBrZXkgIT09ICdjaGlsZHJlbicgJiYgcHJvcHNba2V5XSAhPT0gdW5kZWZpbmVkKVxuICAgIC5zb3J0KCk7XG59O1xuXG5jb25zdCBzZXJpYWxpemUgPSAoZWxlbWVudCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpID0+XG4gICsrZGVwdGggPiBjb25maWcubWF4RGVwdGhcbiAgICA/ICgwLCBfbWFya3VwLnByaW50RWxlbWVudEFzTGVhZikoZ2V0VHlwZShlbGVtZW50KSwgY29uZmlnKVxuICAgIDogKDAsIF9tYXJrdXAucHJpbnRFbGVtZW50KShcbiAgICAgICAgZ2V0VHlwZShlbGVtZW50KSxcbiAgICAgICAgKDAsIF9tYXJrdXAucHJpbnRQcm9wcykoXG4gICAgICAgICAgZ2V0UHJvcEtleXMoZWxlbWVudCksXG4gICAgICAgICAgZWxlbWVudC5wcm9wcyxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgaW5kZW50YXRpb24gKyBjb25maWcuaW5kZW50LFxuICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgIHJlZnMsXG4gICAgICAgICAgcHJpbnRlclxuICAgICAgICApLFxuICAgICAgICAoMCwgX21hcmt1cC5wcmludENoaWxkcmVuKShcbiAgICAgICAgICBnZXRDaGlsZHJlbihlbGVtZW50LnByb3BzLmNoaWxkcmVuKSxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgaW5kZW50YXRpb24gKyBjb25maWcuaW5kZW50LFxuICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgIHJlZnMsXG4gICAgICAgICAgcHJpbnRlclxuICAgICAgICApLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIGluZGVudGF0aW9uXG4gICAgICApO1xuXG5leHBvcnRzLnNlcmlhbGl6ZSA9IHNlcmlhbGl6ZTtcblxuY29uc3QgdGVzdCA9IHZhbCA9PiB2YWwgIT0gbnVsbCAmJiBSZWFjdElzLmlzRWxlbWVudCh2YWwpO1xuXG5leHBvcnRzLnRlc3QgPSB0ZXN0O1xuY29uc3QgcGx1Z2luID0ge1xuICBzZXJpYWxpemUsXG4gIHRlc3Rcbn07XG52YXIgX2RlZmF1bHQgPSBwbHVnaW47XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDtcbiIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnRlc3QgPSBleHBvcnRzLnNlcmlhbGl6ZSA9IGV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9tYXJrdXAgPSByZXF1aXJlKCcuL2xpYi9tYXJrdXAnKTtcblxudmFyIGdsb2JhbCA9IChmdW5jdGlvbiAoKSB7XG4gIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZ2xvYmFsVGhpcztcbiAgfSBlbHNlIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBnbG9iYWw7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHNlbGY7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuICB9XG59KSgpO1xuXG52YXIgU3ltYm9sID0gZ2xvYmFsWydqZXN0LXN5bWJvbC1kby1ub3QtdG91Y2gnXSB8fCBnbG9iYWwuU3ltYm9sO1xuY29uc3QgdGVzdFN5bWJvbCA9XG4gIHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmZvclxuICAgID8gU3ltYm9sLmZvcigncmVhY3QudGVzdC5qc29uJylcbiAgICA6IDB4ZWE3MTM1NztcblxuY29uc3QgZ2V0UHJvcEtleXMgPSBvYmplY3QgPT4ge1xuICBjb25zdCB7cHJvcHN9ID0gb2JqZWN0O1xuICByZXR1cm4gcHJvcHNcbiAgICA/IE9iamVjdC5rZXlzKHByb3BzKVxuICAgICAgICAuZmlsdGVyKGtleSA9PiBwcm9wc1trZXldICE9PSB1bmRlZmluZWQpXG4gICAgICAgIC5zb3J0KClcbiAgICA6IFtdO1xufTtcblxuY29uc3Qgc2VyaWFsaXplID0gKG9iamVjdCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpID0+XG4gICsrZGVwdGggPiBjb25maWcubWF4RGVwdGhcbiAgICA/ICgwLCBfbWFya3VwLnByaW50RWxlbWVudEFzTGVhZikob2JqZWN0LnR5cGUsIGNvbmZpZylcbiAgICA6ICgwLCBfbWFya3VwLnByaW50RWxlbWVudCkoXG4gICAgICAgIG9iamVjdC50eXBlLFxuICAgICAgICBvYmplY3QucHJvcHNcbiAgICAgICAgICA/ICgwLCBfbWFya3VwLnByaW50UHJvcHMpKFxuICAgICAgICAgICAgICBnZXRQcm9wS2V5cyhvYmplY3QpLFxuICAgICAgICAgICAgICBvYmplY3QucHJvcHMsXG4gICAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgICAgaW5kZW50YXRpb24gKyBjb25maWcuaW5kZW50LFxuICAgICAgICAgICAgICBkZXB0aCxcbiAgICAgICAgICAgICAgcmVmcyxcbiAgICAgICAgICAgICAgcHJpbnRlclxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogJycsXG4gICAgICAgIG9iamVjdC5jaGlsZHJlblxuICAgICAgICAgID8gKDAsIF9tYXJrdXAucHJpbnRDaGlsZHJlbikoXG4gICAgICAgICAgICAgIG9iamVjdC5jaGlsZHJlbixcbiAgICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgICBpbmRlbnRhdGlvbiArIGNvbmZpZy5pbmRlbnQsXG4gICAgICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgICAgICByZWZzLFxuICAgICAgICAgICAgICBwcmludGVyXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiAnJyxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBpbmRlbnRhdGlvblxuICAgICAgKTtcblxuZXhwb3J0cy5zZXJpYWxpemUgPSBzZXJpYWxpemU7XG5cbmNvbnN0IHRlc3QgPSB2YWwgPT4gdmFsICYmIHZhbC4kJHR5cGVvZiA9PT0gdGVzdFN5bWJvbDtcblxuZXhwb3J0cy50ZXN0ID0gdGVzdDtcbmNvbnN0IHBsdWdpbiA9IHtcbiAgc2VyaWFsaXplLFxuICB0ZXN0XG59O1xudmFyIF9kZWZhdWx0ID0gcGx1Z2luO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZXhwb3J0cy5ERUZBVUxUX09QVElPTlMgPSB2b2lkIDA7XG5leHBvcnRzLmZvcm1hdCA9IGZvcm1hdDtcbmV4cG9ydHMucGx1Z2lucyA9IHZvaWQgMDtcblxudmFyIF9hbnNpU3R5bGVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCdhbnNpLXN0eWxlcycpKTtcblxudmFyIF9jb2xsZWN0aW9ucyA9IHJlcXVpcmUoJy4vY29sbGVjdGlvbnMnKTtcblxudmFyIF9Bc3ltbWV0cmljTWF0Y2hlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoXG4gIHJlcXVpcmUoJy4vcGx1Z2lucy9Bc3ltbWV0cmljTWF0Y2hlcicpXG4pO1xuXG52YXIgX0NvbnZlcnRBbnNpID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCcuL3BsdWdpbnMvQ29udmVydEFuc2knKSk7XG5cbnZhciBfRE9NQ29sbGVjdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgnLi9wbHVnaW5zL0RPTUNvbGxlY3Rpb24nKSk7XG5cbnZhciBfRE9NRWxlbWVudCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgnLi9wbHVnaW5zL0RPTUVsZW1lbnQnKSk7XG5cbnZhciBfSW1tdXRhYmxlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKCcuL3BsdWdpbnMvSW1tdXRhYmxlJykpO1xuXG52YXIgX1JlYWN0RWxlbWVudCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZSgnLi9wbHVnaW5zL1JlYWN0RWxlbWVudCcpKTtcblxudmFyIF9SZWFjdFRlc3RDb21wb25lbnQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KFxuICByZXF1aXJlKCcuL3BsdWdpbnMvUmVhY3RUZXN0Q29tcG9uZW50Jylcbik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7XG4gIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ZGVmYXVsdDogb2JqfTtcbn1cblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBsb2NhbC9iYW4tdHlwZXMtZXZlbnR1YWxseSAqL1xuY29uc3QgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuY29uc3QgdG9JU09TdHJpbmcgPSBEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZztcbmNvbnN0IGVycm9yVG9TdHJpbmcgPSBFcnJvci5wcm90b3R5cGUudG9TdHJpbmc7XG5jb25zdCByZWdFeHBUb1N0cmluZyA9IFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmc7XG4vKipcbiAqIEV4cGxpY2l0bHkgY29tcGFyaW5nIHR5cGVvZiBjb25zdHJ1Y3RvciB0byBmdW5jdGlvbiBhdm9pZHMgdW5kZWZpbmVkIGFzIG5hbWVcbiAqIHdoZW4gbW9jayBpZGVudGl0eS1vYmotcHJveHkgcmV0dXJucyB0aGUga2V5IGFzIHRoZSB2YWx1ZSBmb3IgYW55IGtleS5cbiAqL1xuXG5jb25zdCBnZXRDb25zdHJ1Y3Rvck5hbWUgPSB2YWwgPT5cbiAgKHR5cGVvZiB2YWwuY29uc3RydWN0b3IgPT09ICdmdW5jdGlvbicgJiYgdmFsLmNvbnN0cnVjdG9yLm5hbWUpIHx8ICdPYmplY3QnO1xuLyogZ2xvYmFsIHdpbmRvdyAqL1xuXG4vKiogSXMgdmFsIGlzIGVxdWFsIHRvIGdsb2JhbCB3aW5kb3cgb2JqZWN0PyBXb3JrcyBldmVuIGlmIGl0IGRvZXMgbm90IGV4aXN0IDopICovXG5cbmNvbnN0IGlzV2luZG93ID0gdmFsID0+IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHZhbCA9PT0gd2luZG93O1xuXG5jb25zdCBTWU1CT0xfUkVHRVhQID0gL15TeW1ib2xcXCgoLiopXFwpKC4qKSQvO1xuY29uc3QgTkVXTElORV9SRUdFWFAgPSAvXFxuL2dpO1xuXG5jbGFzcyBQcmV0dHlGb3JtYXRQbHVnaW5FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSwgc3RhY2spIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLnN0YWNrID0gc3RhY2s7XG4gICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzVG9TdHJpbmdlZEFycmF5VHlwZSh0b1N0cmluZ2VkKSB7XG4gIHJldHVybiAoXG4gICAgdG9TdHJpbmdlZCA9PT0gJ1tvYmplY3QgQXJyYXldJyB8fFxuICAgIHRvU3RyaW5nZWQgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScgfHxcbiAgICB0b1N0cmluZ2VkID09PSAnW29iamVjdCBEYXRhVmlld10nIHx8XG4gICAgdG9TdHJpbmdlZCA9PT0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScgfHxcbiAgICB0b1N0cmluZ2VkID09PSAnW29iamVjdCBGbG9hdDY0QXJyYXldJyB8fFxuICAgIHRvU3RyaW5nZWQgPT09ICdbb2JqZWN0IEludDhBcnJheV0nIHx8XG4gICAgdG9TdHJpbmdlZCA9PT0gJ1tvYmplY3QgSW50MTZBcnJheV0nIHx8XG4gICAgdG9TdHJpbmdlZCA9PT0gJ1tvYmplY3QgSW50MzJBcnJheV0nIHx8XG4gICAgdG9TdHJpbmdlZCA9PT0gJ1tvYmplY3QgVWludDhBcnJheV0nIHx8XG4gICAgdG9TdHJpbmdlZCA9PT0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyB8fFxuICAgIHRvU3RyaW5nZWQgPT09ICdbb2JqZWN0IFVpbnQxNkFycmF5XScgfHxcbiAgICB0b1N0cmluZ2VkID09PSAnW29iamVjdCBVaW50MzJBcnJheV0nXG4gICk7XG59XG5cbmZ1bmN0aW9uIHByaW50TnVtYmVyKHZhbCkge1xuICByZXR1cm4gT2JqZWN0LmlzKHZhbCwgLTApID8gJy0wJyA6IFN0cmluZyh2YWwpO1xufVxuXG5mdW5jdGlvbiBwcmludEJpZ0ludCh2YWwpIHtcbiAgcmV0dXJuIFN0cmluZyhgJHt2YWx9bmApO1xufVxuXG5mdW5jdGlvbiBwcmludEZ1bmN0aW9uKHZhbCwgcHJpbnRGdW5jdGlvbk5hbWUpIHtcbiAgaWYgKCFwcmludEZ1bmN0aW9uTmFtZSkge1xuICAgIHJldHVybiAnW0Z1bmN0aW9uXSc7XG4gIH1cblxuICByZXR1cm4gJ1tGdW5jdGlvbiAnICsgKHZhbC5uYW1lIHx8ICdhbm9ueW1vdXMnKSArICddJztcbn1cblxuZnVuY3Rpb24gcHJpbnRTeW1ib2wodmFsKSB7XG4gIHJldHVybiBTdHJpbmcodmFsKS5yZXBsYWNlKFNZTUJPTF9SRUdFWFAsICdTeW1ib2woJDEpJyk7XG59XG5cbmZ1bmN0aW9uIHByaW50RXJyb3IodmFsKSB7XG4gIHJldHVybiAnWycgKyBlcnJvclRvU3RyaW5nLmNhbGwodmFsKSArICddJztcbn1cbi8qKlxuICogVGhlIGZpcnN0IHBvcnQgb2YgY2FsbCBmb3IgcHJpbnRpbmcgYW4gb2JqZWN0LCBoYW5kbGVzIG1vc3Qgb2YgdGhlXG4gKiBkYXRhLXR5cGVzIGluIEpTLlxuICovXG5cbmZ1bmN0aW9uIHByaW50QmFzaWNWYWx1ZSh2YWwsIHByaW50RnVuY3Rpb25OYW1lLCBlc2NhcGVSZWdleCwgZXNjYXBlU3RyaW5nKSB7XG4gIGlmICh2YWwgPT09IHRydWUgfHwgdmFsID09PSBmYWxzZSkge1xuICAgIHJldHVybiAnJyArIHZhbDtcbiAgfVxuXG4gIGlmICh2YWwgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgfVxuXG4gIGlmICh2YWwgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ251bGwnO1xuICB9XG5cbiAgY29uc3QgdHlwZU9mID0gdHlwZW9mIHZhbDtcblxuICBpZiAodHlwZU9mID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBwcmludE51bWJlcih2YWwpO1xuICB9XG5cbiAgaWYgKHR5cGVPZiA9PT0gJ2JpZ2ludCcpIHtcbiAgICByZXR1cm4gcHJpbnRCaWdJbnQodmFsKTtcbiAgfVxuXG4gIGlmICh0eXBlT2YgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKGVzY2FwZVN0cmluZykge1xuICAgICAgcmV0dXJuICdcIicgKyB2YWwucmVwbGFjZSgvXCJ8XFxcXC9nLCAnXFxcXCQmJykgKyAnXCInO1xuICAgIH1cblxuICAgIHJldHVybiAnXCInICsgdmFsICsgJ1wiJztcbiAgfVxuXG4gIGlmICh0eXBlT2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gcHJpbnRGdW5jdGlvbih2YWwsIHByaW50RnVuY3Rpb25OYW1lKTtcbiAgfVxuXG4gIGlmICh0eXBlT2YgPT09ICdzeW1ib2wnKSB7XG4gICAgcmV0dXJuIHByaW50U3ltYm9sKHZhbCk7XG4gIH1cblxuICBjb25zdCB0b1N0cmluZ2VkID0gdG9TdHJpbmcuY2FsbCh2YWwpO1xuXG4gIGlmICh0b1N0cmluZ2VkID09PSAnW29iamVjdCBXZWFrTWFwXScpIHtcbiAgICByZXR1cm4gJ1dlYWtNYXAge30nO1xuICB9XG5cbiAgaWYgKHRvU3RyaW5nZWQgPT09ICdbb2JqZWN0IFdlYWtTZXRdJykge1xuICAgIHJldHVybiAnV2Vha1NldCB7fSc7XG4gIH1cblxuICBpZiAoXG4gICAgdG9TdHJpbmdlZCA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJyB8fFxuICAgIHRvU3RyaW5nZWQgPT09ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSdcbiAgKSB7XG4gICAgcmV0dXJuIHByaW50RnVuY3Rpb24odmFsLCBwcmludEZ1bmN0aW9uTmFtZSk7XG4gIH1cblxuICBpZiAodG9TdHJpbmdlZCA9PT0gJ1tvYmplY3QgU3ltYm9sXScpIHtcbiAgICByZXR1cm4gcHJpbnRTeW1ib2wodmFsKTtcbiAgfVxuXG4gIGlmICh0b1N0cmluZ2VkID09PSAnW29iamVjdCBEYXRlXScpIHtcbiAgICByZXR1cm4gaXNOYU4oK3ZhbCkgPyAnRGF0ZSB7IE5hTiB9JyA6IHRvSVNPU3RyaW5nLmNhbGwodmFsKTtcbiAgfVxuXG4gIGlmICh0b1N0cmluZ2VkID09PSAnW29iamVjdCBFcnJvcl0nKSB7XG4gICAgcmV0dXJuIHByaW50RXJyb3IodmFsKTtcbiAgfVxuXG4gIGlmICh0b1N0cmluZ2VkID09PSAnW29iamVjdCBSZWdFeHBdJykge1xuICAgIGlmIChlc2NhcGVSZWdleCkge1xuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2JlbmphbWluZ3IvUmVnRXhwLmVzY2FwZS9ibG9iL21haW4vcG9seWZpbGwuanNcbiAgICAgIHJldHVybiByZWdFeHBUb1N0cmluZy5jYWxsKHZhbCkucmVwbGFjZSgvW1xcXFxeJCorPy4oKXxbXFxde31dL2csICdcXFxcJCYnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVnRXhwVG9TdHJpbmcuY2FsbCh2YWwpO1xuICB9XG5cbiAgaWYgKHZhbCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHByaW50RXJyb3IodmFsKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBIYW5kbGVzIG1vcmUgY29tcGxleCBvYmplY3RzICggc3VjaCBhcyBvYmplY3RzIHdpdGggY2lyY3VsYXIgcmVmZXJlbmNlcy5cbiAqIG1hcHMgYW5kIHNldHMgZXRjIClcbiAqL1xuXG5mdW5jdGlvbiBwcmludENvbXBsZXhWYWx1ZShcbiAgdmFsLFxuICBjb25maWcsXG4gIGluZGVudGF0aW9uLFxuICBkZXB0aCxcbiAgcmVmcyxcbiAgaGFzQ2FsbGVkVG9KU09OXG4pIHtcbiAgaWYgKHJlZnMuaW5kZXhPZih2YWwpICE9PSAtMSkge1xuICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gIH1cblxuICByZWZzID0gcmVmcy5zbGljZSgpO1xuICByZWZzLnB1c2godmFsKTtcbiAgY29uc3QgaGl0TWF4RGVwdGggPSArK2RlcHRoID4gY29uZmlnLm1heERlcHRoO1xuICBjb25zdCBtaW4gPSBjb25maWcubWluO1xuXG4gIGlmIChcbiAgICBjb25maWcuY2FsbFRvSlNPTiAmJlxuICAgICFoaXRNYXhEZXB0aCAmJlxuICAgIHZhbC50b0pTT04gJiZcbiAgICB0eXBlb2YgdmFsLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICFoYXNDYWxsZWRUb0pTT05cbiAgKSB7XG4gICAgcmV0dXJuIHByaW50ZXIodmFsLnRvSlNPTigpLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgdHJ1ZSk7XG4gIH1cblxuICBjb25zdCB0b1N0cmluZ2VkID0gdG9TdHJpbmcuY2FsbCh2YWwpO1xuXG4gIGlmICh0b1N0cmluZ2VkID09PSAnW29iamVjdCBBcmd1bWVudHNdJykge1xuICAgIHJldHVybiBoaXRNYXhEZXB0aFxuICAgICAgPyAnW0FyZ3VtZW50c10nXG4gICAgICA6IChtaW4gPyAnJyA6ICdBcmd1bWVudHMgJykgK1xuICAgICAgICAgICdbJyArXG4gICAgICAgICAgKDAsIF9jb2xsZWN0aW9ucy5wcmludExpc3RJdGVtcykoXG4gICAgICAgICAgICB2YWwsXG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICBpbmRlbnRhdGlvbixcbiAgICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgICAgcmVmcyxcbiAgICAgICAgICAgIHByaW50ZXJcbiAgICAgICAgICApICtcbiAgICAgICAgICAnXSc7XG4gIH1cblxuICBpZiAoaXNUb1N0cmluZ2VkQXJyYXlUeXBlKHRvU3RyaW5nZWQpKSB7XG4gICAgcmV0dXJuIGhpdE1heERlcHRoXG4gICAgICA/ICdbJyArIHZhbC5jb25zdHJ1Y3Rvci5uYW1lICsgJ10nXG4gICAgICA6IChtaW5cbiAgICAgICAgICA/ICcnXG4gICAgICAgICAgOiAhY29uZmlnLnByaW50QmFzaWNQcm90b3R5cGUgJiYgdmFsLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdBcnJheSdcbiAgICAgICAgICA/ICcnXG4gICAgICAgICAgOiB2YWwuY29uc3RydWN0b3IubmFtZSArICcgJykgK1xuICAgICAgICAgICdbJyArXG4gICAgICAgICAgKDAsIF9jb2xsZWN0aW9ucy5wcmludExpc3RJdGVtcykoXG4gICAgICAgICAgICB2YWwsXG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICBpbmRlbnRhdGlvbixcbiAgICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgICAgcmVmcyxcbiAgICAgICAgICAgIHByaW50ZXJcbiAgICAgICAgICApICtcbiAgICAgICAgICAnXSc7XG4gIH1cblxuICBpZiAodG9TdHJpbmdlZCA9PT0gJ1tvYmplY3QgTWFwXScpIHtcbiAgICByZXR1cm4gaGl0TWF4RGVwdGhcbiAgICAgID8gJ1tNYXBdJ1xuICAgICAgOiAnTWFwIHsnICtcbiAgICAgICAgICAoMCwgX2NvbGxlY3Rpb25zLnByaW50SXRlcmF0b3JFbnRyaWVzKShcbiAgICAgICAgICAgIHZhbC5lbnRyaWVzKCksXG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICBpbmRlbnRhdGlvbixcbiAgICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgICAgcmVmcyxcbiAgICAgICAgICAgIHByaW50ZXIsXG4gICAgICAgICAgICAnID0+ICdcbiAgICAgICAgICApICtcbiAgICAgICAgICAnfSc7XG4gIH1cblxuICBpZiAodG9TdHJpbmdlZCA9PT0gJ1tvYmplY3QgU2V0XScpIHtcbiAgICByZXR1cm4gaGl0TWF4RGVwdGhcbiAgICAgID8gJ1tTZXRdJ1xuICAgICAgOiAnU2V0IHsnICtcbiAgICAgICAgICAoMCwgX2NvbGxlY3Rpb25zLnByaW50SXRlcmF0b3JWYWx1ZXMpKFxuICAgICAgICAgICAgdmFsLnZhbHVlcygpLFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgaW5kZW50YXRpb24sXG4gICAgICAgICAgICBkZXB0aCxcbiAgICAgICAgICAgIHJlZnMsXG4gICAgICAgICAgICBwcmludGVyXG4gICAgICAgICAgKSArXG4gICAgICAgICAgJ30nO1xuICB9IC8vIEF2b2lkIGZhaWx1cmUgdG8gc2VyaWFsaXplIGdsb2JhbCB3aW5kb3cgb2JqZWN0IGluIGpzZG9tIHRlc3QgZW52aXJvbm1lbnQuXG4gIC8vIEZvciBleGFtcGxlLCBub3QgZXZlbiByZWxldmFudCBpZiB3aW5kb3cgaXMgcHJvcCBvZiBSZWFjdCBlbGVtZW50LlxuXG4gIHJldHVybiBoaXRNYXhEZXB0aCB8fCBpc1dpbmRvdyh2YWwpXG4gICAgPyAnWycgKyBnZXRDb25zdHJ1Y3Rvck5hbWUodmFsKSArICddJ1xuICAgIDogKG1pblxuICAgICAgICA/ICcnXG4gICAgICAgIDogIWNvbmZpZy5wcmludEJhc2ljUHJvdG90eXBlICYmIGdldENvbnN0cnVjdG9yTmFtZSh2YWwpID09PSAnT2JqZWN0J1xuICAgICAgICA/ICcnXG4gICAgICAgIDogZ2V0Q29uc3RydWN0b3JOYW1lKHZhbCkgKyAnICcpICtcbiAgICAgICAgJ3snICtcbiAgICAgICAgKDAsIF9jb2xsZWN0aW9ucy5wcmludE9iamVjdFByb3BlcnRpZXMpKFxuICAgICAgICAgIHZhbCxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgaW5kZW50YXRpb24sXG4gICAgICAgICAgZGVwdGgsXG4gICAgICAgICAgcmVmcyxcbiAgICAgICAgICBwcmludGVyXG4gICAgICAgICkgK1xuICAgICAgICAnfSc7XG59XG5cbmZ1bmN0aW9uIGlzTmV3UGx1Z2luKHBsdWdpbikge1xuICByZXR1cm4gcGx1Z2luLnNlcmlhbGl6ZSAhPSBudWxsO1xufVxuXG5mdW5jdGlvbiBwcmludFBsdWdpbihwbHVnaW4sIHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMpIHtcbiAgbGV0IHByaW50ZWQ7XG5cbiAgdHJ5IHtcbiAgICBwcmludGVkID0gaXNOZXdQbHVnaW4ocGx1Z2luKVxuICAgICAgPyBwbHVnaW4uc2VyaWFsaXplKHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpXG4gICAgICA6IHBsdWdpbi5wcmludChcbiAgICAgICAgICB2YWwsXG4gICAgICAgICAgdmFsQ2hpbGQgPT4gcHJpbnRlcih2YWxDaGlsZCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMpLFxuICAgICAgICAgIHN0ciA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbmRlbnRhdGlvbk5leHQgPSBpbmRlbnRhdGlvbiArIGNvbmZpZy5pbmRlbnQ7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICBpbmRlbnRhdGlvbk5leHQgK1xuICAgICAgICAgICAgICBzdHIucmVwbGFjZShORVdMSU5FX1JFR0VYUCwgJ1xcbicgKyBpbmRlbnRhdGlvbk5leHQpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgZWRnZVNwYWNpbmc6IGNvbmZpZy5zcGFjaW5nT3V0ZXIsXG4gICAgICAgICAgICBtaW46IGNvbmZpZy5taW4sXG4gICAgICAgICAgICBzcGFjaW5nOiBjb25maWcuc3BhY2luZ0lubmVyXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb25maWcuY29sb3JzXG4gICAgICAgICk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IFByZXR0eUZvcm1hdFBsdWdpbkVycm9yKGVycm9yLm1lc3NhZ2UsIGVycm9yLnN0YWNrKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgcHJpbnRlZCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgcHJldHR5LWZvcm1hdDogUGx1Z2luIG11c3QgcmV0dXJuIHR5cGUgXCJzdHJpbmdcIiBidXQgaW5zdGVhZCByZXR1cm5lZCBcIiR7dHlwZW9mIHByaW50ZWR9XCIuYFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gcHJpbnRlZDtcbn1cblxuZnVuY3Rpb24gZmluZFBsdWdpbihwbHVnaW5zLCB2YWwpIHtcbiAgZm9yIChsZXQgcCA9IDA7IHAgPCBwbHVnaW5zLmxlbmd0aDsgcCsrKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChwbHVnaW5zW3BdLnRlc3QodmFsKSkge1xuICAgICAgICByZXR1cm4gcGx1Z2luc1twXTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IFByZXR0eUZvcm1hdFBsdWdpbkVycm9yKGVycm9yLm1lc3NhZ2UsIGVycm9yLnN0YWNrKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcHJpbnRlcih2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBoYXNDYWxsZWRUb0pTT04pIHtcbiAgY29uc3QgcGx1Z2luID0gZmluZFBsdWdpbihjb25maWcucGx1Z2lucywgdmFsKTtcblxuICBpZiAocGx1Z2luICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHByaW50UGx1Z2luKHBsdWdpbiwgdmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcyk7XG4gIH1cblxuICBjb25zdCBiYXNpY1Jlc3VsdCA9IHByaW50QmFzaWNWYWx1ZShcbiAgICB2YWwsXG4gICAgY29uZmlnLnByaW50RnVuY3Rpb25OYW1lLFxuICAgIGNvbmZpZy5lc2NhcGVSZWdleCxcbiAgICBjb25maWcuZXNjYXBlU3RyaW5nXG4gICk7XG5cbiAgaWYgKGJhc2ljUmVzdWx0ICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIGJhc2ljUmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIHByaW50Q29tcGxleFZhbHVlKFxuICAgIHZhbCxcbiAgICBjb25maWcsXG4gICAgaW5kZW50YXRpb24sXG4gICAgZGVwdGgsXG4gICAgcmVmcyxcbiAgICBoYXNDYWxsZWRUb0pTT05cbiAgKTtcbn1cblxuY29uc3QgREVGQVVMVF9USEVNRSA9IHtcbiAgY29tbWVudDogJ2dyYXknLFxuICBjb250ZW50OiAncmVzZXQnLFxuICBwcm9wOiAneWVsbG93JyxcbiAgdGFnOiAnY3lhbicsXG4gIHZhbHVlOiAnZ3JlZW4nXG59O1xuY29uc3QgREVGQVVMVF9USEVNRV9LRVlTID0gT2JqZWN0LmtleXMoREVGQVVMVF9USEVNRSk7XG5jb25zdCBERUZBVUxUX09QVElPTlMgPSB7XG4gIGNhbGxUb0pTT046IHRydWUsXG4gIGNvbXBhcmVLZXlzOiB1bmRlZmluZWQsXG4gIGVzY2FwZVJlZ2V4OiBmYWxzZSxcbiAgZXNjYXBlU3RyaW5nOiB0cnVlLFxuICBoaWdobGlnaHQ6IGZhbHNlLFxuICBpbmRlbnQ6IDIsXG4gIG1heERlcHRoOiBJbmZpbml0eSxcbiAgbWluOiBmYWxzZSxcbiAgcGx1Z2luczogW10sXG4gIHByaW50QmFzaWNQcm90b3R5cGU6IHRydWUsXG4gIHByaW50RnVuY3Rpb25OYW1lOiB0cnVlLFxuICB0aGVtZTogREVGQVVMVF9USEVNRVxufTtcbmV4cG9ydHMuREVGQVVMVF9PUFRJT05TID0gREVGQVVMVF9PUFRJT05TO1xuXG5mdW5jdGlvbiB2YWxpZGF0ZU9wdGlvbnMob3B0aW9ucykge1xuICBPYmplY3Qua2V5cyhvcHRpb25zKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgaWYgKCFERUZBVUxUX09QVElPTlMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBwcmV0dHktZm9ybWF0OiBVbmtub3duIG9wdGlvbiBcIiR7a2V5fVwiLmApO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKG9wdGlvbnMubWluICYmIG9wdGlvbnMuaW5kZW50ICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5pbmRlbnQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAncHJldHR5LWZvcm1hdDogT3B0aW9ucyBcIm1pblwiIGFuZCBcImluZGVudFwiIGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyLidcbiAgICApO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMudGhlbWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChvcHRpb25zLnRoZW1lID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHByZXR0eS1mb3JtYXQ6IE9wdGlvbiBcInRoZW1lXCIgbXVzdCBub3QgYmUgbnVsbC5gKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMudGhlbWUgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBwcmV0dHktZm9ybWF0OiBPcHRpb24gXCJ0aGVtZVwiIG11c3QgYmUgb2YgdHlwZSBcIm9iamVjdFwiIGJ1dCBpbnN0ZWFkIHJlY2VpdmVkIFwiJHt0eXBlb2Ygb3B0aW9ucy50aGVtZX1cIi5gXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBnZXRDb2xvcnNIaWdobGlnaHQgPSBvcHRpb25zID0+XG4gIERFRkFVTFRfVEhFTUVfS0VZUy5yZWR1Y2UoKGNvbG9ycywga2V5KSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPVxuICAgICAgb3B0aW9ucy50aGVtZSAmJiBvcHRpb25zLnRoZW1lW2tleV0gIT09IHVuZGVmaW5lZFxuICAgICAgICA/IG9wdGlvbnMudGhlbWVba2V5XVxuICAgICAgICA6IERFRkFVTFRfVEhFTUVba2V5XTtcbiAgICBjb25zdCBjb2xvciA9IHZhbHVlICYmIF9hbnNpU3R5bGVzLmRlZmF1bHRbdmFsdWVdO1xuXG4gICAgaWYgKFxuICAgICAgY29sb3IgJiZcbiAgICAgIHR5cGVvZiBjb2xvci5jbG9zZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgIHR5cGVvZiBjb2xvci5vcGVuID09PSAnc3RyaW5nJ1xuICAgICkge1xuICAgICAgY29sb3JzW2tleV0gPSBjb2xvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgcHJldHR5LWZvcm1hdDogT3B0aW9uIFwidGhlbWVcIiBoYXMgYSBrZXkgXCIke2tleX1cIiB3aG9zZSB2YWx1ZSBcIiR7dmFsdWV9XCIgaXMgdW5kZWZpbmVkIGluIGFuc2ktc3R5bGVzLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbG9ycztcbiAgfSwgT2JqZWN0LmNyZWF0ZShudWxsKSk7XG5cbmNvbnN0IGdldENvbG9yc0VtcHR5ID0gKCkgPT5cbiAgREVGQVVMVF9USEVNRV9LRVlTLnJlZHVjZSgoY29sb3JzLCBrZXkpID0+IHtcbiAgICBjb2xvcnNba2V5XSA9IHtcbiAgICAgIGNsb3NlOiAnJyxcbiAgICAgIG9wZW46ICcnXG4gICAgfTtcbiAgICByZXR1cm4gY29sb3JzO1xuICB9LCBPYmplY3QuY3JlYXRlKG51bGwpKTtcblxuY29uc3QgZ2V0UHJpbnRGdW5jdGlvbk5hbWUgPSBvcHRpb25zID0+XG4gIG9wdGlvbnMgJiYgb3B0aW9ucy5wcmludEZ1bmN0aW9uTmFtZSAhPT0gdW5kZWZpbmVkXG4gICAgPyBvcHRpb25zLnByaW50RnVuY3Rpb25OYW1lXG4gICAgOiBERUZBVUxUX09QVElPTlMucHJpbnRGdW5jdGlvbk5hbWU7XG5cbmNvbnN0IGdldEVzY2FwZVJlZ2V4ID0gb3B0aW9ucyA9PlxuICBvcHRpb25zICYmIG9wdGlvbnMuZXNjYXBlUmVnZXggIT09IHVuZGVmaW5lZFxuICAgID8gb3B0aW9ucy5lc2NhcGVSZWdleFxuICAgIDogREVGQVVMVF9PUFRJT05TLmVzY2FwZVJlZ2V4O1xuXG5jb25zdCBnZXRFc2NhcGVTdHJpbmcgPSBvcHRpb25zID0+XG4gIG9wdGlvbnMgJiYgb3B0aW9ucy5lc2NhcGVTdHJpbmcgIT09IHVuZGVmaW5lZFxuICAgID8gb3B0aW9ucy5lc2NhcGVTdHJpbmdcbiAgICA6IERFRkFVTFRfT1BUSU9OUy5lc2NhcGVTdHJpbmc7XG5cbmNvbnN0IGdldENvbmZpZyA9IG9wdGlvbnMgPT4ge1xuICB2YXIgX29wdGlvbnMkcHJpbnRCYXNpY1ByO1xuXG4gIHJldHVybiB7XG4gICAgY2FsbFRvSlNPTjpcbiAgICAgIG9wdGlvbnMgJiYgb3B0aW9ucy5jYWxsVG9KU09OICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBvcHRpb25zLmNhbGxUb0pTT05cbiAgICAgICAgOiBERUZBVUxUX09QVElPTlMuY2FsbFRvSlNPTixcbiAgICBjb2xvcnM6XG4gICAgICBvcHRpb25zICYmIG9wdGlvbnMuaGlnaGxpZ2h0XG4gICAgICAgID8gZ2V0Q29sb3JzSGlnaGxpZ2h0KG9wdGlvbnMpXG4gICAgICAgIDogZ2V0Q29sb3JzRW1wdHkoKSxcbiAgICBjb21wYXJlS2V5czpcbiAgICAgIG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMuY29tcGFyZUtleXMgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyBvcHRpb25zLmNvbXBhcmVLZXlzXG4gICAgICAgIDogREVGQVVMVF9PUFRJT05TLmNvbXBhcmVLZXlzLFxuICAgIGVzY2FwZVJlZ2V4OiBnZXRFc2NhcGVSZWdleChvcHRpb25zKSxcbiAgICBlc2NhcGVTdHJpbmc6IGdldEVzY2FwZVN0cmluZyhvcHRpb25zKSxcbiAgICBpbmRlbnQ6XG4gICAgICBvcHRpb25zICYmIG9wdGlvbnMubWluXG4gICAgICAgID8gJydcbiAgICAgICAgOiBjcmVhdGVJbmRlbnQoXG4gICAgICAgICAgICBvcHRpb25zICYmIG9wdGlvbnMuaW5kZW50ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyBvcHRpb25zLmluZGVudFxuICAgICAgICAgICAgICA6IERFRkFVTFRfT1BUSU9OUy5pbmRlbnRcbiAgICAgICAgICApLFxuICAgIG1heERlcHRoOlxuICAgICAgb3B0aW9ucyAmJiBvcHRpb25zLm1heERlcHRoICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBvcHRpb25zLm1heERlcHRoXG4gICAgICAgIDogREVGQVVMVF9PUFRJT05TLm1heERlcHRoLFxuICAgIG1pbjpcbiAgICAgIG9wdGlvbnMgJiYgb3B0aW9ucy5taW4gIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubWluIDogREVGQVVMVF9PUFRJT05TLm1pbixcbiAgICBwbHVnaW5zOlxuICAgICAgb3B0aW9ucyAmJiBvcHRpb25zLnBsdWdpbnMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IG9wdGlvbnMucGx1Z2luc1xuICAgICAgICA6IERFRkFVTFRfT1BUSU9OUy5wbHVnaW5zLFxuICAgIHByaW50QmFzaWNQcm90b3R5cGU6XG4gICAgICAoX29wdGlvbnMkcHJpbnRCYXNpY1ByID1cbiAgICAgICAgb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDBcbiAgICAgICAgICA/IHZvaWQgMFxuICAgICAgICAgIDogb3B0aW9ucy5wcmludEJhc2ljUHJvdG90eXBlKSAhPT0gbnVsbCAmJlxuICAgICAgX29wdGlvbnMkcHJpbnRCYXNpY1ByICE9PSB2b2lkIDBcbiAgICAgICAgPyBfb3B0aW9ucyRwcmludEJhc2ljUHJcbiAgICAgICAgOiB0cnVlLFxuICAgIHByaW50RnVuY3Rpb25OYW1lOiBnZXRQcmludEZ1bmN0aW9uTmFtZShvcHRpb25zKSxcbiAgICBzcGFjaW5nSW5uZXI6IG9wdGlvbnMgJiYgb3B0aW9ucy5taW4gPyAnICcgOiAnXFxuJyxcbiAgICBzcGFjaW5nT3V0ZXI6IG9wdGlvbnMgJiYgb3B0aW9ucy5taW4gPyAnJyA6ICdcXG4nXG4gIH07XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVJbmRlbnQoaW5kZW50KSB7XG4gIHJldHVybiBuZXcgQXJyYXkoaW5kZW50ICsgMSkuam9pbignICcpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgcHJlc2VudGF0aW9uIHN0cmluZyBvZiB5b3VyIGB2YWxgIG9iamVjdFxuICogQHBhcmFtIHZhbCBhbnkgcG90ZW50aWFsIEphdmFTY3JpcHQgb2JqZWN0XG4gKiBAcGFyYW0gb3B0aW9ucyBDdXN0b20gc2V0dGluZ3NcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXQodmFsLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgdmFsaWRhdGVPcHRpb25zKG9wdGlvbnMpO1xuXG4gICAgaWYgKG9wdGlvbnMucGx1Z2lucykge1xuICAgICAgY29uc3QgcGx1Z2luID0gZmluZFBsdWdpbihvcHRpb25zLnBsdWdpbnMsIHZhbCk7XG5cbiAgICAgIGlmIChwbHVnaW4gIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHByaW50UGx1Z2luKHBsdWdpbiwgdmFsLCBnZXRDb25maWcob3B0aW9ucyksICcnLCAwLCBbXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgYmFzaWNSZXN1bHQgPSBwcmludEJhc2ljVmFsdWUoXG4gICAgdmFsLFxuICAgIGdldFByaW50RnVuY3Rpb25OYW1lKG9wdGlvbnMpLFxuICAgIGdldEVzY2FwZVJlZ2V4KG9wdGlvbnMpLFxuICAgIGdldEVzY2FwZVN0cmluZyhvcHRpb25zKVxuICApO1xuXG4gIGlmIChiYXNpY1Jlc3VsdCAhPT0gbnVsbCkge1xuICAgIHJldHVybiBiYXNpY1Jlc3VsdDtcbiAgfVxuXG4gIHJldHVybiBwcmludENvbXBsZXhWYWx1ZSh2YWwsIGdldENvbmZpZyhvcHRpb25zKSwgJycsIDAsIFtdKTtcbn1cblxuY29uc3QgcGx1Z2lucyA9IHtcbiAgQXN5bW1ldHJpY01hdGNoZXI6IF9Bc3ltbWV0cmljTWF0Y2hlci5kZWZhdWx0LFxuICBDb252ZXJ0QW5zaTogX0NvbnZlcnRBbnNpLmRlZmF1bHQsXG4gIERPTUNvbGxlY3Rpb246IF9ET01Db2xsZWN0aW9uLmRlZmF1bHQsXG4gIERPTUVsZW1lbnQ6IF9ET01FbGVtZW50LmRlZmF1bHQsXG4gIEltbXV0YWJsZTogX0ltbXV0YWJsZS5kZWZhdWx0LFxuICBSZWFjdEVsZW1lbnQ6IF9SZWFjdEVsZW1lbnQuZGVmYXVsdCxcbiAgUmVhY3RUZXN0Q29tcG9uZW50OiBfUmVhY3RUZXN0Q29tcG9uZW50LmRlZmF1bHRcbn07XG5leHBvcnRzLnBsdWdpbnMgPSBwbHVnaW5zO1xudmFyIF9kZWZhdWx0ID0gZm9ybWF0O1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgUGx1Z2luIGFzIFByZXR0eUZvcm1hdFBsdWdpbixcbiAgUGx1Z2lucyBhcyBQcmV0dHlGb3JtYXRQbHVnaW5zLFxufSBmcm9tICdwcmV0dHktZm9ybWF0J1xuaW1wb3J0IHtcbiAgcGx1Z2lucyBhcyBwcmV0dHlGb3JtYXRQbHVnaW5zLFxufSBmcm9tICdwcmV0dHktZm9ybWF0J1xuXG5jb25zdCB7XG4gIERPTUNvbGxlY3Rpb24sXG4gIERPTUVsZW1lbnQsXG4gIEltbXV0YWJsZSxcbiAgUmVhY3RFbGVtZW50LFxuICBSZWFjdFRlc3RDb21wb25lbnQsXG4gIEFzeW1tZXRyaWNNYXRjaGVyLFxufSA9IHByZXR0eUZvcm1hdFBsdWdpbnNcblxubGV0IFBMVUdJTlM6IFByZXR0eUZvcm1hdFBsdWdpbnMgPSBbXG4gIFJlYWN0VGVzdENvbXBvbmVudCxcbiAgUmVhY3RFbGVtZW50LFxuICBET01FbGVtZW50LFxuICBET01Db2xsZWN0aW9uLFxuICBJbW11dGFibGUsXG4gIEFzeW1tZXRyaWNNYXRjaGVyLFxuICAvLyBUT0RPOiB3cml0ZSBzaW5vbiBtb2NrIHNlcmlhbGl6ZXJcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2plc3QvYmxvYi80ZWI0ZjZhNTliNmVhZTBlMDViOGU1MWRkOGNkM2ZkY2ExYzdhZmYxL3BhY2thZ2VzL2plc3Qtc25hcHNob3Qvc3JjL21vY2tTZXJpYWxpemVyLnRzI0w0XG5dXG5cbi8vIFRPRE86IGV4cG9zZSB0aGVzZSBhbmQgYWxsb3cgdXNlciB0byBhZGQgY3VzdG9tIHNlcmlhbGl6ZXJzXG4vLyBQcmVwZW5kIHRvIGxpc3Qgc28gdGhlIGxhc3QgYWRkZWQgaXMgdGhlIGZpcnN0IHRlc3RlZC5cbmV4cG9ydCBjb25zdCBhZGRTZXJpYWxpemVyID0gKHBsdWdpbjogUHJldHR5Rm9ybWF0UGx1Z2luKTogdm9pZCA9PiB7XG4gIFBMVUdJTlMgPSBbcGx1Z2luXS5jb25jYXQoUExVR0lOUylcbn1cblxuZXhwb3J0IGNvbnN0IGdldFNlcmlhbGl6ZXJzID0gKCk6IFByZXR0eUZvcm1hdFBsdWdpbnMgPT4gUExVR0lOU1xuIiwiLypcbkNvcHlyaWdodCAoYykgMjAwOC0yMDE2IFBpdm90YWwgTGFic1xuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmdcbmEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG53aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG5kaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG9cbnBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0b1xudGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZVxuaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG5FWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbk1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EXG5OT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFXG5MSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OXG5PRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT05cbldJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4qL1xuXG5pbXBvcnQgeyBpc09iamVjdCB9IGZyb20gJy4uLy4uL3V0aWxzJ1xuaW1wb3J0IHR5cGUgeyBUZXN0ZXIgfSBmcm9tICcuL3R5cGVzJ1xuXG4vLyBFeHRyYWN0ZWQgb3V0IG9mIGphc21pbmUgMi41LjJcbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoXG4gIGE6IHVua25vd24sXG4gIGI6IHVua25vd24sXG4gIGN1c3RvbVRlc3RlcnM/OiBBcnJheTxUZXN0ZXI+LFxuICBzdHJpY3RDaGVjaz86IGJvb2xlYW4sXG4pOiBib29sZWFuIHtcbiAgY3VzdG9tVGVzdGVycyA9IGN1c3RvbVRlc3RlcnMgfHwgW11cbiAgcmV0dXJuIGVxKGEsIGIsIFtdLCBbXSwgY3VzdG9tVGVzdGVycywgc3RyaWN0Q2hlY2sgPyBoYXNLZXkgOiBoYXNEZWZpbmVkS2V5KVxufVxuXG5jb25zdCBmdW5jdGlvblRvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0FzeW1tZXRyaWMob2JqOiBhbnkpIHtcbiAgcmV0dXJuICEhb2JqICYmIGlzQSgnRnVuY3Rpb24nLCBvYmouYXN5bW1ldHJpY01hdGNoKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzQXN5bW1ldHJpYyhvYmo6IGFueSwgc2VlbiA9IG5ldyBTZXQoKSk6IGJvb2xlYW4ge1xuICBpZiAoc2Vlbi5oYXMob2JqKSlcbiAgICByZXR1cm4gZmFsc2VcbiAgc2Vlbi5hZGQob2JqKVxuICBpZiAoaXNBc3ltbWV0cmljKG9iaikpXG4gICAgcmV0dXJuIHRydWVcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSlcbiAgICByZXR1cm4gb2JqLnNvbWUoaSA9PiBoYXNBc3ltbWV0cmljKGksIHNlZW4pKVxuICBpZiAob2JqIGluc3RhbmNlb2YgU2V0KVxuICAgIHJldHVybiBBcnJheS5mcm9tKG9iaikuc29tZShpID0+IGhhc0FzeW1tZXRyaWMoaSwgc2VlbikpXG4gIGlmIChpc09iamVjdChvYmopKVxuICAgIHJldHVybiBPYmplY3QudmFsdWVzKG9iaikuc29tZSh2ID0+IGhhc0FzeW1tZXRyaWModiwgc2VlbikpXG4gIHJldHVybiBmYWxzZVxufVxuXG5mdW5jdGlvbiBhc3ltbWV0cmljTWF0Y2goYTogYW55LCBiOiBhbnkpIHtcbiAgY29uc3QgYXN5bW1ldHJpY0EgPSBpc0FzeW1tZXRyaWMoYSlcbiAgY29uc3QgYXN5bW1ldHJpY0IgPSBpc0FzeW1tZXRyaWMoYilcblxuICBpZiAoYXN5bW1ldHJpY0EgJiYgYXN5bW1ldHJpY0IpXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGlmIChhc3ltbWV0cmljQSlcbiAgICByZXR1cm4gYS5hc3ltbWV0cmljTWF0Y2goYilcblxuICBpZiAoYXN5bW1ldHJpY0IpXG4gICAgcmV0dXJuIGIuYXN5bW1ldHJpY01hdGNoKGEpXG59XG5cbi8vIEVxdWFsaXR5IGZ1bmN0aW9uIGxvdmluZ2x5IGFkYXB0ZWQgZnJvbSBpc0VxdWFsIGluXG4vLyAgIFtVbmRlcnNjb3JlXShodHRwOi8vdW5kZXJzY29yZWpzLm9yZylcbmZ1bmN0aW9uIGVxKFxuICBhOiBhbnksXG4gIGI6IGFueSxcbiAgYVN0YWNrOiBBcnJheTx1bmtub3duPixcbiAgYlN0YWNrOiBBcnJheTx1bmtub3duPixcbiAgY3VzdG9tVGVzdGVyczogQXJyYXk8VGVzdGVyPixcbiAgaGFzS2V5OiBhbnksXG4pOiBib29sZWFuIHtcbiAgbGV0IHJlc3VsdCA9IHRydWVcblxuICBjb25zdCBhc3ltbWV0cmljUmVzdWx0ID0gYXN5bW1ldHJpY01hdGNoKGEsIGIpXG4gIGlmIChhc3ltbWV0cmljUmVzdWx0ICE9PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIGFzeW1tZXRyaWNSZXN1bHRcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGN1c3RvbVRlc3RlcnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjdXN0b21UZXN0ZXJSZXN1bHQgPSBjdXN0b21UZXN0ZXJzW2ldKGEsIGIpXG4gICAgaWYgKGN1c3RvbVRlc3RlclJlc3VsdCAhPT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIGN1c3RvbVRlc3RlclJlc3VsdFxuICB9XG5cbiAgaWYgKGEgaW5zdGFuY2VvZiBFcnJvciAmJiBiIGluc3RhbmNlb2YgRXJyb3IpXG4gICAgcmV0dXJuIGEubWVzc2FnZSA9PT0gYi5tZXNzYWdlXG5cbiAgaWYgKE9iamVjdC5pcyhhLCBiKSlcbiAgICByZXR1cm4gdHJ1ZVxuXG4gIC8vIEEgc3RyaWN0IGNvbXBhcmlzb24gaXMgbmVjZXNzYXJ5IGJlY2F1c2UgYG51bGwgPT0gdW5kZWZpbmVkYC5cbiAgaWYgKGEgPT09IG51bGwgfHwgYiA9PT0gbnVsbClcbiAgICByZXR1cm4gYSA9PT0gYlxuXG4gIGNvbnN0IGNsYXNzTmFtZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKVxuICBpZiAoY2xhc3NOYW1lICE9PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYikpXG4gICAgcmV0dXJuIGZhbHNlXG5cbiAgc3dpdGNoIChjbGFzc05hbWUpIHtcbiAgICBjYXNlICdbb2JqZWN0IEJvb2xlYW5dJzpcbiAgICBjYXNlICdbb2JqZWN0IFN0cmluZ10nOlxuICAgIGNhc2UgJ1tvYmplY3QgTnVtYmVyXSc6XG4gICAgICBpZiAodHlwZW9mIGEgIT09IHR5cGVvZiBiKSB7XG4gICAgICAgIC8vIE9uZSBpcyBhIHByaW1pdGl2ZSwgb25lIGEgYG5ldyBQcmltaXRpdmUoKWBcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgICBlbHNlIGlmICh0eXBlb2YgYSAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIGIgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIC8vIGJvdGggYXJlIHByb3BlciBwcmltaXRpdmVzXG4gICAgICAgIHJldHVybiBPYmplY3QuaXMoYSwgYilcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICAvLyBib3RoIGFyZSBgbmV3IFByaW1pdGl2ZSgpYHNcbiAgICAgICAgcmV0dXJuIE9iamVjdC5pcyhhLnZhbHVlT2YoKSwgYi52YWx1ZU9mKCkpXG4gICAgICB9XG4gICAgY2FzZSAnW29iamVjdCBEYXRlXSc6XG4gICAgICAvLyBDb2VyY2UgZGF0ZXMgdG8gbnVtZXJpYyBwcmltaXRpdmUgdmFsdWVzLiBEYXRlcyBhcmUgY29tcGFyZWQgYnkgdGhlaXJcbiAgICAgIC8vIG1pbGxpc2Vjb25kIHJlcHJlc2VudGF0aW9ucy4gTm90ZSB0aGF0IGludmFsaWQgZGF0ZXMgd2l0aCBtaWxsaXNlY29uZCByZXByZXNlbnRhdGlvbnNcbiAgICAgIC8vIG9mIGBOYU5gIGFyZSBub3QgZXF1aXZhbGVudC5cbiAgICAgIHJldHVybiArYSA9PT0gK2JcbiAgICAvLyBSZWdFeHBzIGFyZSBjb21wYXJlZCBieSB0aGVpciBzb3VyY2UgcGF0dGVybnMgYW5kIGZsYWdzLlxuICAgIGNhc2UgJ1tvYmplY3QgUmVnRXhwXSc6XG4gICAgICByZXR1cm4gYS5zb3VyY2UgPT09IGIuc291cmNlICYmIGEuZmxhZ3MgPT09IGIuZmxhZ3NcbiAgfVxuICBpZiAodHlwZW9mIGEgIT09ICdvYmplY3QnIHx8IHR5cGVvZiBiICE9PSAnb2JqZWN0JylcbiAgICByZXR1cm4gZmFsc2VcblxuICAvLyBVc2UgRE9NMyBtZXRob2QgaXNFcXVhbE5vZGUgKElFPj05KVxuICBpZiAoaXNEb21Ob2RlKGEpICYmIGlzRG9tTm9kZShiKSlcbiAgICByZXR1cm4gYS5pc0VxdWFsTm9kZShiKVxuXG4gIC8vIFVzZWQgdG8gZGV0ZWN0IGNpcmN1bGFyIHJlZmVyZW5jZXMuXG4gIGxldCBsZW5ndGggPSBhU3RhY2subGVuZ3RoXG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIC8vIExpbmVhciBzZWFyY2guIFBlcmZvcm1hbmNlIGlzIGludmVyc2VseSBwcm9wb3J0aW9uYWwgdG8gdGhlIG51bWJlciBvZlxuICAgIC8vIHVuaXF1ZSBuZXN0ZWQgc3RydWN0dXJlcy5cbiAgICAvLyBjaXJjdWxhciByZWZlcmVuY2VzIGF0IHNhbWUgZGVwdGggYXJlIGVxdWFsXG4gICAgLy8gY2lyY3VsYXIgcmVmZXJlbmNlIGlzIG5vdCBlcXVhbCB0byBub24tY2lyY3VsYXIgb25lXG4gICAgaWYgKGFTdGFja1tsZW5ndGhdID09PSBhKVxuICAgICAgcmV0dXJuIGJTdGFja1tsZW5ndGhdID09PSBiXG5cbiAgICBlbHNlIGlmIChiU3RhY2tbbGVuZ3RoXSA9PT0gYilcbiAgICAgIHJldHVybiBmYWxzZVxuICB9XG4gIC8vIEFkZCB0aGUgZmlyc3Qgb2JqZWN0IHRvIHRoZSBzdGFjayBvZiB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAgYVN0YWNrLnB1c2goYSlcbiAgYlN0YWNrLnB1c2goYilcbiAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIGFuZCBhcnJheXMuXG4gIC8vIENvbXBhcmUgYXJyYXkgbGVuZ3RocyB0byBkZXRlcm1pbmUgaWYgYSBkZWVwIGNvbXBhcmlzb24gaXMgbmVjZXNzYXJ5LlxuICBpZiAoY2xhc3NOYW1lID09PSAnW29iamVjdCBBcnJheV0nICYmIGEubGVuZ3RoICE9PSBiLmxlbmd0aClcbiAgICByZXR1cm4gZmFsc2VcblxuICAvLyBEZWVwIGNvbXBhcmUgb2JqZWN0cy5cbiAgY29uc3QgYUtleXMgPSBrZXlzKGEsIGhhc0tleSlcbiAgbGV0IGtleVxuICBsZXQgc2l6ZSA9IGFLZXlzLmxlbmd0aFxuXG4gIC8vIEVuc3VyZSB0aGF0IGJvdGggb2JqZWN0cyBjb250YWluIHRoZSBzYW1lIG51bWJlciBvZiBwcm9wZXJ0aWVzIGJlZm9yZSBjb21wYXJpbmcgZGVlcCBlcXVhbGl0eS5cbiAgaWYgKGtleXMoYiwgaGFzS2V5KS5sZW5ndGggIT09IHNpemUpXG4gICAgcmV0dXJuIGZhbHNlXG5cbiAgd2hpbGUgKHNpemUtLSkge1xuICAgIGtleSA9IGFLZXlzW3NpemVdXG5cbiAgICAvLyBEZWVwIGNvbXBhcmUgZWFjaCBtZW1iZXJcbiAgICByZXN1bHRcbiAgICAgID0gaGFzS2V5KGIsIGtleSlcbiAgICAgICYmIGVxKGFba2V5XSwgYltrZXldLCBhU3RhY2ssIGJTdGFjaywgY3VzdG9tVGVzdGVycywgaGFzS2V5KVxuXG4gICAgaWYgKCFyZXN1bHQpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxuICAvLyBSZW1vdmUgdGhlIGZpcnN0IG9iamVjdCBmcm9tIHRoZSBzdGFjayBvZiB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAgYVN0YWNrLnBvcCgpXG4gIGJTdGFjay5wb3AoKVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24ga2V5cyhvYmo6IG9iamVjdCwgaGFzS2V5OiAob2JqOiBvYmplY3QsIGtleTogc3RyaW5nKSA9PiBib29sZWFuKSB7XG4gIGNvbnN0IGtleXMgPSBbXVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKGhhc0tleShvYmosIGtleSkpXG4gICAgICBrZXlzLnB1c2goa2V5KVxuICB9XG4gIHJldHVybiBrZXlzLmNvbmNhdChcbiAgICAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmopIGFzIEFycmF5PGFueT4pLmZpbHRlcihcbiAgICAgIHN5bWJvbCA9PlxuICAgICAgICAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHN5bWJvbCkgYXMgUHJvcGVydHlEZXNjcmlwdG9yKVxuICAgICAgICAgIC5lbnVtZXJhYmxlLFxuICAgICksXG4gIClcbn1cblxuZnVuY3Rpb24gaGFzRGVmaW5lZEtleShvYmo6IGFueSwga2V5OiBzdHJpbmcpIHtcbiAgcmV0dXJuIGhhc0tleShvYmosIGtleSkgJiYgb2JqW2tleV0gIT09IHVuZGVmaW5lZFxufVxuXG5mdW5jdGlvbiBoYXNLZXkob2JqOiBhbnksIGtleTogc3RyaW5nKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0EodHlwZU5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkodmFsdWUpID09PSBgW29iamVjdCAke3R5cGVOYW1lfV1gXG59XG5cbmZ1bmN0aW9uIGlzRG9tTm9kZShvYmo6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIG9iaiAhPT0gbnVsbFxuICAgICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnXG4gICAgJiYgdHlwZW9mIG9iai5ub2RlVHlwZSA9PT0gJ251bWJlcidcbiAgICAmJiB0eXBlb2Ygb2JqLm5vZGVOYW1lID09PSAnc3RyaW5nJ1xuICAgICYmIHR5cGVvZiBvYmouaXNFcXVhbE5vZGUgPT09ICdmdW5jdGlvbidcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZm5OYW1lRm9yKGZ1bmM6IEZ1bmN0aW9uKSB7XG4gIGlmIChmdW5jLm5hbWUpXG4gICAgcmV0dXJuIGZ1bmMubmFtZVxuXG4gIGNvbnN0IG1hdGNoZXMgPSBmdW5jdGlvblRvU3RyaW5nXG4gICAgLmNhbGwoZnVuYylcbiAgICAubWF0Y2goL14oPzphc3luYyk/XFxzKmZ1bmN0aW9uXFxzKlxcKj9cXHMqKFtcXHckXSspXFxzKlxcKC8pXG4gIHJldHVybiBtYXRjaGVzID8gbWF0Y2hlc1sxXSA6ICc8YW5vbnltb3VzPidcbn1cblxuZnVuY3Rpb24gZ2V0UHJvdG90eXBlKG9iajogb2JqZWN0KSB7XG4gIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YpXG4gICAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopXG5cbiAgaWYgKG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgPT09IG9iailcbiAgICByZXR1cm4gbnVsbFxuXG4gIHJldHVybiBvYmouY29uc3RydWN0b3IucHJvdG90eXBlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNQcm9wZXJ0eShvYmo6IG9iamVjdCB8IG51bGwsIHByb3BlcnR5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFvYmopXG4gICAgcmV0dXJuIGZhbHNlXG5cbiAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3BlcnR5KSlcbiAgICByZXR1cm4gdHJ1ZVxuXG4gIHJldHVybiBoYXNQcm9wZXJ0eShnZXRQcm90b3R5cGUob2JqKSwgcHJvcGVydHkpXG59XG5cbi8vIFNFTlRJTkVMIGNvbnN0YW50cyBhcmUgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svaW1tdXRhYmxlLWpzXG5jb25zdCBJU19LRVlFRF9TRU5USU5FTCA9ICdAQF9fSU1NVVRBQkxFX0tFWUVEX19AQCdcbmNvbnN0IElTX1NFVF9TRU5USU5FTCA9ICdAQF9fSU1NVVRBQkxFX1NFVF9fQEAnXG5jb25zdCBJU19PUkRFUkVEX1NFTlRJTkVMID0gJ0BAX19JTU1VVEFCTEVfT1JERVJFRF9fQEAnXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ltbXV0YWJsZVVub3JkZXJlZEtleWVkKG1heWJlS2V5ZWQ6IGFueSkge1xuICByZXR1cm4gISEoXG4gICAgbWF5YmVLZXllZFxuICAgICYmIG1heWJlS2V5ZWRbSVNfS0VZRURfU0VOVElORUxdXG4gICAgJiYgIW1heWJlS2V5ZWRbSVNfT1JERVJFRF9TRU5USU5FTF1cbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJbW11dGFibGVVbm9yZGVyZWRTZXQobWF5YmVTZXQ6IGFueSkge1xuICByZXR1cm4gISEoXG4gICAgbWF5YmVTZXRcbiAgICAmJiBtYXliZVNldFtJU19TRVRfU0VOVElORUxdXG4gICAgJiYgIW1heWJlU2V0W0lTX09SREVSRURfU0VOVElORUxdXG4gIClcbn1cblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqXG4gKi9cbmNvbnN0IEl0ZXJhdG9yU3ltYm9sID0gU3ltYm9sLml0ZXJhdG9yXG5cbmNvbnN0IGhhc0l0ZXJhdG9yID0gKG9iamVjdDogYW55KSA9PlxuICAhIShvYmplY3QgIT0gbnVsbCAmJiBvYmplY3RbSXRlcmF0b3JTeW1ib2xdKVxuXG5leHBvcnQgY29uc3QgaXRlcmFibGVFcXVhbGl0eSA9IChcbiAgYTogYW55LFxuICBiOiBhbnksXG4gIGFTdGFjazogQXJyYXk8YW55PiA9IFtdLFxuICBiU3RhY2s6IEFycmF5PGFueT4gPSBbXSxcbik6IGJvb2xlYW4gfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoXG4gICAgdHlwZW9mIGEgIT09ICdvYmplY3QnXG4gICAgfHwgdHlwZW9mIGIgIT09ICdvYmplY3QnXG4gICAgfHwgQXJyYXkuaXNBcnJheShhKVxuICAgIHx8IEFycmF5LmlzQXJyYXkoYilcbiAgICB8fCAhaGFzSXRlcmF0b3IoYSlcbiAgICB8fCAhaGFzSXRlcmF0b3IoYilcbiAgKVxuICAgIHJldHVybiB1bmRlZmluZWRcblxuICBpZiAoYS5jb25zdHJ1Y3RvciAhPT0gYi5jb25zdHJ1Y3RvcilcbiAgICByZXR1cm4gZmFsc2VcblxuICBsZXQgbGVuZ3RoID0gYVN0YWNrLmxlbmd0aFxuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAvLyBMaW5lYXIgc2VhcmNoLiBQZXJmb3JtYW5jZSBpcyBpbnZlcnNlbHkgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2ZcbiAgICAvLyB1bmlxdWUgbmVzdGVkIHN0cnVjdHVyZXMuXG4gICAgLy8gY2lyY3VsYXIgcmVmZXJlbmNlcyBhdCBzYW1lIGRlcHRoIGFyZSBlcXVhbFxuICAgIC8vIGNpcmN1bGFyIHJlZmVyZW5jZSBpcyBub3QgZXF1YWwgdG8gbm9uLWNpcmN1bGFyIG9uZVxuICAgIGlmIChhU3RhY2tbbGVuZ3RoXSA9PT0gYSlcbiAgICAgIHJldHVybiBiU3RhY2tbbGVuZ3RoXSA9PT0gYlxuICB9XG4gIGFTdGFjay5wdXNoKGEpXG4gIGJTdGFjay5wdXNoKGIpXG5cbiAgY29uc3QgaXRlcmFibGVFcXVhbGl0eVdpdGhTdGFjayA9IChhOiBhbnksIGI6IGFueSkgPT5cbiAgICBpdGVyYWJsZUVxdWFsaXR5KGEsIGIsIFsuLi5hU3RhY2tdLCBbLi4uYlN0YWNrXSlcblxuICBpZiAoYS5zaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBlbHNlIGlmIChpc0EoJ1NldCcsIGEpIHx8IGlzSW1tdXRhYmxlVW5vcmRlcmVkU2V0KGEpKSB7XG4gICAgICBsZXQgYWxsRm91bmQgPSB0cnVlXG4gICAgICBmb3IgKGNvbnN0IGFWYWx1ZSBvZiBhKSB7XG4gICAgICAgIGlmICghYi5oYXMoYVZhbHVlKSkge1xuICAgICAgICAgIGxldCBoYXMgPSBmYWxzZVxuICAgICAgICAgIGZvciAoY29uc3QgYlZhbHVlIG9mIGIpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzRXF1YWwgPSBlcXVhbHMoYVZhbHVlLCBiVmFsdWUsIFtpdGVyYWJsZUVxdWFsaXR5V2l0aFN0YWNrXSlcbiAgICAgICAgICAgIGlmIChpc0VxdWFsID09PSB0cnVlKVxuICAgICAgICAgICAgICBoYXMgPSB0cnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGFsbEZvdW5kID0gZmFsc2VcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBSZW1vdmUgdGhlIGZpcnN0IHZhbHVlIGZyb20gdGhlIHN0YWNrIG9mIHRyYXZlcnNlZCB2YWx1ZXMuXG4gICAgICBhU3RhY2sucG9wKClcbiAgICAgIGJTdGFjay5wb3AoKVxuICAgICAgcmV0dXJuIGFsbEZvdW5kXG4gICAgfVxuICAgIGVsc2UgaWYgKGlzQSgnTWFwJywgYSkgfHwgaXNJbW11dGFibGVVbm9yZGVyZWRLZXllZChhKSkge1xuICAgICAgbGV0IGFsbEZvdW5kID0gdHJ1ZVxuICAgICAgZm9yIChjb25zdCBhRW50cnkgb2YgYSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIWIuaGFzKGFFbnRyeVswXSlcbiAgICAgICAgICB8fCAhZXF1YWxzKGFFbnRyeVsxXSwgYi5nZXQoYUVudHJ5WzBdKSwgW2l0ZXJhYmxlRXF1YWxpdHlXaXRoU3RhY2tdKVxuICAgICAgICApIHtcbiAgICAgICAgICBsZXQgaGFzID0gZmFsc2VcbiAgICAgICAgICBmb3IgKGNvbnN0IGJFbnRyeSBvZiBiKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkS2V5ID0gZXF1YWxzKGFFbnRyeVswXSwgYkVudHJ5WzBdLCBbXG4gICAgICAgICAgICAgIGl0ZXJhYmxlRXF1YWxpdHlXaXRoU3RhY2ssXG4gICAgICAgICAgICBdKVxuXG4gICAgICAgICAgICBsZXQgbWF0Y2hlZFZhbHVlID0gZmFsc2VcbiAgICAgICAgICAgIGlmIChtYXRjaGVkS2V5ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgIG1hdGNoZWRWYWx1ZSA9IGVxdWFscyhhRW50cnlbMV0sIGJFbnRyeVsxXSwgW1xuICAgICAgICAgICAgICAgIGl0ZXJhYmxlRXF1YWxpdHlXaXRoU3RhY2ssXG4gICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWF0Y2hlZFZhbHVlID09PSB0cnVlKVxuICAgICAgICAgICAgICBoYXMgPSB0cnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGFsbEZvdW5kID0gZmFsc2VcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBSZW1vdmUgdGhlIGZpcnN0IHZhbHVlIGZyb20gdGhlIHN0YWNrIG9mIHRyYXZlcnNlZCB2YWx1ZXMuXG4gICAgICBhU3RhY2sucG9wKClcbiAgICAgIGJTdGFjay5wb3AoKVxuICAgICAgcmV0dXJuIGFsbEZvdW5kXG4gICAgfVxuICB9XG5cbiAgY29uc3QgYkl0ZXJhdG9yID0gYltJdGVyYXRvclN5bWJvbF0oKVxuXG4gIGZvciAoY29uc3QgYVZhbHVlIG9mIGEpIHtcbiAgICBjb25zdCBuZXh0QiA9IGJJdGVyYXRvci5uZXh0KClcbiAgICBpZiAoXG4gICAgICBuZXh0Qi5kb25lXG4gICAgICB8fCAhZXF1YWxzKGFWYWx1ZSwgbmV4dEIudmFsdWUsIFtpdGVyYWJsZUVxdWFsaXR5V2l0aFN0YWNrXSlcbiAgICApXG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBpZiAoIWJJdGVyYXRvci5uZXh0KCkuZG9uZSlcbiAgICByZXR1cm4gZmFsc2VcblxuICAvLyBSZW1vdmUgdGhlIGZpcnN0IHZhbHVlIGZyb20gdGhlIHN0YWNrIG9mIHRyYXZlcnNlZCB2YWx1ZXMuXG4gIGFTdGFjay5wb3AoKVxuICBiU3RhY2sucG9wKClcbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYGhhc093blByb3BlcnR5KG9iamVjdCwga2V5KWAgdXAgdGhlIHByb3RvdHlwZSBjaGFpbiwgc3RvcHBpbmcgYXQgYE9iamVjdC5wcm90b3R5cGVgLlxuICovXG5jb25zdCBoYXNQcm9wZXJ0eUluT2JqZWN0ID0gKG9iamVjdDogb2JqZWN0LCBrZXk6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBzaG91bGRUZXJtaW5hdGVcbiAgICA9ICFvYmplY3QgfHwgdHlwZW9mIG9iamVjdCAhPT0gJ29iamVjdCcgfHwgb2JqZWN0ID09PSBPYmplY3QucHJvdG90eXBlXG5cbiAgaWYgKHNob3VsZFRlcm1pbmF0ZSlcbiAgICByZXR1cm4gZmFsc2VcblxuICByZXR1cm4gKFxuICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSlcbiAgICB8fCBoYXNQcm9wZXJ0eUluT2JqZWN0KE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpLCBrZXkpXG4gIClcbn1cblxuY29uc3QgaXNPYmplY3RXaXRoS2V5cyA9IChhOiBhbnkpID0+XG4gIGlzT2JqZWN0KGEpXG4gICYmICEoYSBpbnN0YW5jZW9mIEVycm9yKVxuICAmJiAhKGEgaW5zdGFuY2VvZiBBcnJheSlcbiAgJiYgIShhIGluc3RhbmNlb2YgRGF0ZSlcblxuZXhwb3J0IGNvbnN0IHN1YnNldEVxdWFsaXR5ID0gKFxuICBvYmplY3Q6IHVua25vd24sXG4gIHN1YnNldDogdW5rbm93bixcbik6IGJvb2xlYW4gfCB1bmRlZmluZWQgPT4ge1xuICAvLyBzdWJzZXRFcXVhbGl0eSBuZWVkcyB0byBrZWVwIHRyYWNrIG9mIHRoZSByZWZlcmVuY2VzXG4gIC8vIGl0IGhhcyBhbHJlYWR5IHZpc2l0ZWQgdG8gYXZvaWQgaW5maW5pdGUgbG9vcHMgaW4gY2FzZVxuICAvLyB0aGVyZSBhcmUgY2lyY3VsYXIgcmVmZXJlbmNlcyBpbiB0aGUgc3Vic2V0IHBhc3NlZCB0byBpdC5cbiAgY29uc3Qgc3Vic2V0RXF1YWxpdHlXaXRoQ29udGV4dFxuICAgID0gKHNlZW5SZWZlcmVuY2VzOiBXZWFrTWFwPG9iamVjdCwgYm9vbGVhbj4gPSBuZXcgV2Vha01hcCgpKSA9PlxuICAgICAgKG9iamVjdDogYW55LCBzdWJzZXQ6IGFueSk6IGJvb2xlYW4gfCB1bmRlZmluZWQgPT4ge1xuICAgICAgICBpZiAoIWlzT2JqZWN0V2l0aEtleXMoc3Vic2V0KSlcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHN1YnNldCkuZXZlcnkoKGtleSkgPT4ge1xuICAgICAgICAgIGlmIChpc09iamVjdFdpdGhLZXlzKHN1YnNldFtrZXldKSkge1xuICAgICAgICAgICAgaWYgKHNlZW5SZWZlcmVuY2VzLmhhcyhzdWJzZXRba2V5XSkpXG4gICAgICAgICAgICAgIHJldHVybiBlcXVhbHMob2JqZWN0W2tleV0sIHN1YnNldFtrZXldLCBbaXRlcmFibGVFcXVhbGl0eV0pXG5cbiAgICAgICAgICAgIHNlZW5SZWZlcmVuY2VzLnNldChzdWJzZXRba2V5XSwgdHJ1ZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmVzdWx0XG4gICAgICAgICAgPSBvYmplY3QgIT0gbnVsbFxuICAgICAgICAgICYmIGhhc1Byb3BlcnR5SW5PYmplY3Qob2JqZWN0LCBrZXkpXG4gICAgICAgICAgJiYgZXF1YWxzKG9iamVjdFtrZXldLCBzdWJzZXRba2V5XSwgW1xuICAgICAgICAgICAgaXRlcmFibGVFcXVhbGl0eSxcbiAgICAgICAgICAgIHN1YnNldEVxdWFsaXR5V2l0aENvbnRleHQoc2VlblJlZmVyZW5jZXMpLFxuICAgICAgICAgIF0pXG4gICAgICAgICAgLy8gVGhlIG1haW4gZ29hbCBvZiB1c2luZyBzZWVuUmVmZXJlbmNlIGlzIHRvIGF2b2lkIGNpcmN1bGFyIG5vZGUgb24gdHJlZS5cbiAgICAgICAgICAvLyBJdCB3aWxsIG9ubHkgaGFwcGVuIHdpdGhpbiBhIHBhcmVudCBhbmQgaXRzIGNoaWxkLCBub3QgYSBub2RlIGFuZCBub2RlcyBuZXh0IHRvIGl0IChzYW1lIGxldmVsKVxuICAgICAgICAgIC8vIFdlIHNob3VsZCBrZWVwIHRoZSByZWZlcmVuY2UgZm9yIGEgcGFyZW50IGFuZCBpdHMgY2hpbGQgb25seVxuICAgICAgICAgIC8vIFRodXMgd2Ugc2hvdWxkIGRlbGV0ZSB0aGUgcmVmZXJlbmNlIGltbWVkaWF0ZWx5IHNvIHRoYXQgaXQgZG9lc24ndCBpbnRlcmZlcmVcbiAgICAgICAgICAvLyBvdGhlciBub2RlcyB3aXRoaW4gdGhlIHNhbWUgbGV2ZWwgb24gdHJlZS5cbiAgICAgICAgICBzZWVuUmVmZXJlbmNlcy5kZWxldGUoc3Vic2V0W2tleV0pXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gIHJldHVybiBzdWJzZXRFcXVhbGl0eVdpdGhDb250ZXh0KCkob2JqZWN0LCBzdWJzZXQpXG59XG5cbmV4cG9ydCBjb25zdCB0eXBlRXF1YWxpdHkgPSAoYTogYW55LCBiOiBhbnkpOiBib29sZWFuIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwgfHwgYS5jb25zdHJ1Y3RvciA9PT0gYi5jb25zdHJ1Y3RvcilcbiAgICByZXR1cm4gdW5kZWZpbmVkXG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBjb25zdCBhcnJheUJ1ZmZlckVxdWFsaXR5ID0gKFxuICBhOiB1bmtub3duLFxuICBiOiB1bmtub3duLFxuKTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghKGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgfHwgIShiIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKVxuICAgIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBkYXRhVmlld0EgPSBuZXcgRGF0YVZpZXcoYSlcbiAgY29uc3QgZGF0YVZpZXdCID0gbmV3IERhdGFWaWV3KGIpXG5cbiAgLy8gQnVmZmVycyBhcmUgbm90IGVxdWFsIHdoZW4gdGhleSBkbyBub3QgaGF2ZSB0aGUgc2FtZSBieXRlIGxlbmd0aFxuICBpZiAoZGF0YVZpZXdBLmJ5dGVMZW5ndGggIT09IGRhdGFWaWV3Qi5ieXRlTGVuZ3RoKVxuICAgIHJldHVybiBmYWxzZVxuXG4gIC8vIENoZWNrIGlmIGV2ZXJ5IGJ5dGUgdmFsdWUgaXMgZXF1YWwgdG8gZWFjaCBvdGhlclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFWaWV3QS5ieXRlTGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZGF0YVZpZXdBLmdldFVpbnQ4KGkpICE9PSBkYXRhVmlld0IuZ2V0VWludDgoaSkpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBjb25zdCBzcGFyc2VBcnJheUVxdWFsaXR5ID0gKFxuICBhOiB1bmtub3duLFxuICBiOiB1bmtub3duLFxuKTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghQXJyYXkuaXNBcnJheShhKSB8fCAhQXJyYXkuaXNBcnJheShiKSlcbiAgICByZXR1cm4gdW5kZWZpbmVkXG5cbiAgLy8gQSBzcGFyc2UgYXJyYXkgWywgLCAxXSB3aWxsIGhhdmUga2V5cyBbXCIyXCJdIHdoZXJlYXMgW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAxXSB3aWxsIGhhdmUga2V5cyBbXCIwXCIsIFwiMVwiLCBcIjJcIl1cbiAgY29uc3QgYUtleXMgPSBPYmplY3Qua2V5cyhhKVxuICBjb25zdCBiS2V5cyA9IE9iamVjdC5rZXlzKGIpXG4gIHJldHVybiAoXG4gICAgZXF1YWxzKGEsIGIsIFtpdGVyYWJsZUVxdWFsaXR5LCB0eXBlRXF1YWxpdHldLCB0cnVlKSAmJiBlcXVhbHMoYUtleXMsIGJLZXlzKVxuICApXG59XG4iLCJpbXBvcnQgdHlwZSB7IEVuaGFuY2VkU3B5IH0gZnJvbSAnLi4vamVzdC1tb2NrJ1xuaW1wb3J0IHsgaXNNb2NrRnVuY3Rpb24gfSBmcm9tICcuLi9qZXN0LW1vY2snXG5pbXBvcnQgeyBhZGRTZXJpYWxpemVyIH0gZnJvbSAnLi4vc25hcHNob3QvcG9ydC9wbHVnaW5zJ1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZXMnXG5pbXBvcnQgdHlwZSB7IENoYWlQbHVnaW4sIE1hdGNoZXJTdGF0ZSB9IGZyb20gJy4vdHlwZXMnXG5pbXBvcnQgeyBhcnJheUJ1ZmZlckVxdWFsaXR5LCBlcXVhbHMgYXMgYXN5bW1ldHJpY0VxdWFscywgaGFzQXN5bW1ldHJpYywgaXRlcmFibGVFcXVhbGl0eSwgc3BhcnNlQXJyYXlFcXVhbGl0eSwgdHlwZUVxdWFsaXR5IH0gZnJvbSAnLi9qZXN0LXV0aWxzJ1xuaW1wb3J0IHR5cGUgeyBBc3ltbWV0cmljTWF0Y2hlciB9IGZyb20gJy4vamVzdC1hc3ltbWV0cmljLW1hdGNoZXJzJ1xuXG5jb25zdCBNQVRDSEVSU19PQkpFQ1QgPSBTeW1ib2wuZm9yKCdtYXRjaGVycy1vYmplY3QnKVxuXG5pZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChnbG9iYWwsIE1BVENIRVJTX09CSkVDVCkpIHtcbiAgY29uc3QgZGVmYXVsdFN0YXRlOiBQYXJ0aWFsPE1hdGNoZXJTdGF0ZT4gPSB7XG4gICAgYXNzZXJ0aW9uQ2FsbHM6IDAsXG4gICAgaXNFeHBlY3RpbmdBc3NlcnRpb25zOiBmYWxzZSxcbiAgICBpc0V4cGVjdGluZ0Fzc2VydGlvbnNFcnJvcjogbnVsbCxcbiAgICBleHBlY3RlZEFzc2VydGlvbnNOdW1iZXI6IG51bGwsXG4gICAgZXhwZWN0ZWRBc3NlcnRpb25zTnVtYmVyRXJyb3I6IG51bGwsXG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbCwgTUFUQ0hFUlNfT0JKRUNULCB7XG4gICAgdmFsdWU6IHtcbiAgICAgIHN0YXRlOiBkZWZhdWx0U3RhdGUsXG4gICAgfSxcbiAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IGdldFN0YXRlID0gPFN0YXRlIGV4dGVuZHMgTWF0Y2hlclN0YXRlID0gTWF0Y2hlclN0YXRlPigpOiBTdGF0ZSA9PlxuICAoZ2xvYmFsIGFzIGFueSlbTUFUQ0hFUlNfT0JKRUNUXS5zdGF0ZVxuXG5leHBvcnQgY29uc3Qgc2V0U3RhdGUgPSA8U3RhdGUgZXh0ZW5kcyBNYXRjaGVyU3RhdGUgPSBNYXRjaGVyU3RhdGU+KFxuICBzdGF0ZTogUGFydGlhbDxTdGF0ZT4sXG4pOiB2b2lkID0+IHtcbiAgT2JqZWN0LmFzc2lnbigoZ2xvYmFsIGFzIGFueSlbTUFUQ0hFUlNfT0JKRUNUXS5zdGF0ZSwgc3RhdGUpXG59XG5cbi8vIEplc3QgRXhwZWN0IENvbXBhY3RcbmV4cG9ydCBjb25zdCBKZXN0Q2hhaUV4cGVjdDogQ2hhaVBsdWdpbiA9IChjaGFpLCB1dGlscykgPT4ge1xuICBmdW5jdGlvbiBkZWYobmFtZToga2V5b2YgQ2hhaS5WaXRlc3RBc3NlcnRpb24gfCAoa2V5b2YgQ2hhaS5WaXRlc3RBc3NlcnRpb24pW10sIGZuOiAoKHRoaXM6IENoYWkuQXNzZXJ0aW9uU3RhdGljICYgQ2hhaS5WaXRlc3RBc3NlcnRpb24sIC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpKSB7XG4gICAgY29uc3QgYWRkTWV0aG9kID0gKG46IGtleW9mIENoYWkuVml0ZXN0QXNzZXJ0aW9uKSA9PiB7XG4gICAgICB1dGlscy5hZGRNZXRob2QoY2hhaS5Bc3NlcnRpb24ucHJvdG90eXBlLCBuLCBmbilcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShuYW1lKSlcbiAgICAgIG5hbWUuZm9yRWFjaChuID0+IGFkZE1ldGhvZChuKSlcblxuICAgIGVsc2VcbiAgICAgIGFkZE1ldGhvZChuYW1lKVxuICB9XG5cbiAgLy8gd2Ugb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGAuZXF1YWxgLCBrZWVwIG9yaWdpbmFsIGAuY2hhaUVxdWFsYCBpbiBjYXNlIG5lZWRcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciBwcm90b3R5cGVcbiAgY29uc3QgY2hhaUVxdWFsID0gY2hhaS5Bc3NlcnRpb24ucHJvdG90eXBlLmVxdWFsXG4gIGRlZignY2hhaUVxdWFsJywgZnVuY3Rpb24oLi4uYXJnczogYW55W10pIHtcbiAgICByZXR1cm4gY2hhaUVxdWFsLmFwcGx5KHRoaXMsIGFyZ3MpXG4gIH0pXG5cbiAgOyhbJ3Rocm93JywgJ3Rocm93cycsICdUaHJvdyddIGFzIGNvbnN0KS5mb3JFYWNoKChtKSA9PiB7XG4gICAgdXRpbHMub3ZlcndyaXRlTWV0aG9kKGNoYWkuQXNzZXJ0aW9uLnByb3RvdHlwZSwgbSwgKF9zdXBlcjogYW55KSA9PiB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odGhpczogQ2hhaS5Bc3NlcnRpb24gJiBDaGFpLkFzc2VydGlvblN0YXRpYywgLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHV0aWxzLmZsYWcodGhpcywgJ3Byb21pc2UnKVxuICAgICAgICBjb25zdCBvYmplY3QgPSB1dGlscy5mbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgICBpZiAocHJvbWlzZSA9PT0gJ3JlamVjdHMnKSB7XG4gICAgICAgICAgdXRpbHMuZmxhZyh0aGlzLCAnb2JqZWN0JywgKCkgPT4ge1xuICAgICAgICAgICAgdGhyb3cgb2JqZWN0XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBfc3VwZXIuYXBwbHkodGhpcywgYXJncylcbiAgICAgIH1cbiAgICB9KVxuICB9KVxuXG4gIC8vIG92ZXJyaWRlcyBgLmVxdWFsYCBhbmQgYC5lcWxgIHRvIHByb3ZpZGUgY3VzdG9tIGFzc2VydGlvbiBmb3IgYXN5bW1ldHJpYyBlcXVhbGl0eVxuICB1dGlscy5vdmVyd3JpdGVNZXRob2QoY2hhaS5Bc3NlcnRpb24ucHJvdG90eXBlLCAnZXF1YWwnLCAoX3N1cGVyOiBhbnkpID0+IHtcbiAgICByZXR1cm4gZnVuY3Rpb24odGhpczogQ2hhaS5Bc3NlcnRpb24gJiBDaGFpLkFzc2VydGlvblN0YXRpYywgLi4uYXJnczogYW55W10pIHtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0gYXJnc1swXVxuICAgICAgY29uc3QgYWN0dWFsID0gdXRpbHMuZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgIGlmIChoYXNBc3ltbWV0cmljKGV4cGVjdGVkKSkge1xuICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICBhc3ltbWV0cmljRXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQsIHVuZGVmaW5lZCwgdHJ1ZSksXG4gICAgICAgICAgJ25vdCBtYXRjaCB3aXRoICN7YWN0fScsXG4gICAgICAgICAgJ3Nob3VsZCBub3QgbWF0Y2ggd2l0aCAje2FjdH0nLFxuICAgICAgICAgIGFjdHVhbCxcbiAgICAgICAgICBleHBlY3RlZCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIF9zdXBlci5hcHBseSh0aGlzLCBhcmdzKVxuICAgICAgfVxuICAgIH1cbiAgfSlcbiAgdXRpbHMub3ZlcndyaXRlTWV0aG9kKGNoYWkuQXNzZXJ0aW9uLnByb3RvdHlwZSwgJ2VxbCcsIChfc3VwZXI6IGFueSkgPT4ge1xuICAgIHJldHVybiBmdW5jdGlvbih0aGlzOiBDaGFpLkFzc2VydGlvbiAmIENoYWkuQXNzZXJ0aW9uU3RhdGljLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBhcmdzWzBdXG4gICAgICBjb25zdCBhY3R1YWwgPSB1dGlscy5mbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgaWYgKGhhc0FzeW1tZXRyaWMoZXhwZWN0ZWQpKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIGFzeW1tZXRyaWNFcXVhbHMoYWN0dWFsLCBleHBlY3RlZCksXG4gICAgICAgICAgJ25vdCBtYXRjaCB3aXRoICN7ZXhwfScsXG4gICAgICAgICAgJ3Nob3VsZCBub3QgbWF0Y2ggd2l0aCAje2V4cH0nLFxuICAgICAgICAgIGV4cGVjdGVkLFxuICAgICAgICAgIGFjdHVhbCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIF9zdXBlci5hcHBseSh0aGlzLCBhcmdzKVxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICBkZWYoJ3RvRXF1YWwnLCBmdW5jdGlvbihleHBlY3RlZCkge1xuICAgIHJldHVybiB0aGlzLmVxbChleHBlY3RlZClcbiAgfSlcblxuICBkZWYoJ3RvU3RyaWN0RXF1YWwnLCBmdW5jdGlvbihleHBlY3RlZCkge1xuICAgIGNvbnN0IG9iaiA9IHV0aWxzLmZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgY29uc3QgZXF1YWwgPSBhc3ltbWV0cmljRXF1YWxzKFxuICAgICAgb2JqLFxuICAgICAgZXhwZWN0ZWQsXG4gICAgICBbXG4gICAgICAgIGl0ZXJhYmxlRXF1YWxpdHksXG4gICAgICAgIHR5cGVFcXVhbGl0eSxcbiAgICAgICAgc3BhcnNlQXJyYXlFcXVhbGl0eSxcbiAgICAgICAgYXJyYXlCdWZmZXJFcXVhbGl0eSxcbiAgICAgIF0sXG4gICAgICB0cnVlLFxuICAgIClcblxuICAgIHJldHVybiB0aGlzLmFzc2VydChcbiAgICAgIGVxdWFsLFxuICAgICAgJ2V4cGVjdGVkICN7dGhpc30gdG8gc3RyaWN0bHkgZXF1YWwgI3tleHB9JyxcbiAgICAgICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBzdHJpY3RseSBlcXVhbCAje2V4cH0nLFxuICAgICAgZXhwZWN0ZWQsXG4gICAgICBvYmosXG4gICAgKVxuICB9KVxuICBkZWYoJ3RvQmUnLCBmdW5jdGlvbihleHBlY3RlZCkge1xuICAgIHJldHVybiB0aGlzLmVxdWFsKGV4cGVjdGVkKVxuICB9KVxuICBkZWYoJ3RvTWF0Y2hPYmplY3QnLCBmdW5jdGlvbihleHBlY3RlZCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5TdWJzZXQoZXhwZWN0ZWQpXG4gIH0pXG4gIGRlZigndG9NYXRjaCcsIGZ1bmN0aW9uKGV4cGVjdGVkOiBzdHJpbmcgfCBSZWdFeHApIHtcbiAgICBpZiAodHlwZW9mIGV4cGVjdGVkID09PSAnc3RyaW5nJylcbiAgICAgIHJldHVybiB0aGlzLmluY2x1ZGUoZXhwZWN0ZWQpXG4gICAgZWxzZVxuICAgICAgcmV0dXJuIHRoaXMubWF0Y2goZXhwZWN0ZWQpXG4gIH0pXG4gIGRlZigndG9Db250YWluJywgZnVuY3Rpb24oaXRlbSkge1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW4oaXRlbSlcbiAgfSlcbiAgZGVmKCd0b0NvbnRhaW5FcXVhbCcsIGZ1bmN0aW9uKGV4cGVjdGVkKSB7XG4gICAgY29uc3Qgb2JqID0gdXRpbHMuZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICBjb25zdCBpbmRleCA9IEFycmF5LmZyb20ob2JqKS5maW5kSW5kZXgoKGl0ZW0pID0+IHtcbiAgICAgIHJldHVybiBhc3ltbWV0cmljRXF1YWxzKGl0ZW0sIGV4cGVjdGVkKVxuICAgIH0pXG5cbiAgICB0aGlzLmFzc2VydChcbiAgICAgIGluZGV4ICE9PSAtMSxcbiAgICAgICdleHBlY3RlZCAje3RoaXN9IHRvIGRlZXAgZXF1YWxseSBjb250YWluICN7ZXhwfScsXG4gICAgICAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgZGVlcCBlcXVhbGx5IGNvbnRhaW4gI3tleHB9JyxcbiAgICAgIGV4cGVjdGVkLFxuICAgIClcbiAgfSlcbiAgZGVmKCd0b0JlVHJ1dGh5JywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgb2JqID0gdXRpbHMuZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICB0aGlzLmFzc2VydChcbiAgICAgIEJvb2xlYW4ob2JqKSxcbiAgICAgICdleHBlY3RlZCAje3RoaXN9IHRvIGJlIHRydXRoeScsXG4gICAgICAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgYmUgdHJ1dGh5JyxcbiAgICAgIG9iaixcbiAgICApXG4gIH0pXG4gIGRlZigndG9CZUZhbHN5JywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgb2JqID0gdXRpbHMuZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICB0aGlzLmFzc2VydChcbiAgICAgICFvYmosXG4gICAgICAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBmYWxzeScsXG4gICAgICAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgYmUgZmFsc3knLFxuICAgICAgb2JqLFxuICAgIClcbiAgfSlcbiAgZGVmKCd0b0JlR3JlYXRlclRoYW4nLCBmdW5jdGlvbihleHBlY3RlZDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMudG8uZ3JlYXRlclRoYW4oZXhwZWN0ZWQpXG4gIH0pXG4gIGRlZigndG9CZUdyZWF0ZXJUaGFuT3JFcXVhbCcsIGZ1bmN0aW9uKGV4cGVjdGVkOiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy50by5ncmVhdGVyVGhhbk9yRXF1YWwoZXhwZWN0ZWQpXG4gIH0pXG4gIGRlZigndG9CZUxlc3NUaGFuJywgZnVuY3Rpb24oZXhwZWN0ZWQ6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLnRvLmxlc3NUaGFuKGV4cGVjdGVkKVxuICB9KVxuICBkZWYoJ3RvQmVMZXNzVGhhbk9yRXF1YWwnLCBmdW5jdGlvbihleHBlY3RlZDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMudG8ubGVzc1RoYW5PckVxdWFsKGV4cGVjdGVkKVxuICB9KVxuICBkZWYoJ3RvQmVOYU4nLCBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5iZS5OYU5cbiAgfSlcbiAgZGVmKCd0b0JlVW5kZWZpbmVkJywgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuYmUudW5kZWZpbmVkXG4gIH0pXG4gIGRlZigndG9CZU51bGwnLCBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5iZS5udWxsXG4gIH0pXG4gIGRlZigndG9CZURlZmluZWQnLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBuZWdhdGUgPSB1dGlscy5mbGFnKHRoaXMsICduZWdhdGUnKVxuICAgIHV0aWxzLmZsYWcodGhpcywgJ25lZ2F0ZScsIGZhbHNlKVxuXG4gICAgaWYgKG5lZ2F0ZSlcbiAgICAgIHJldHVybiB0aGlzLmJlLnVuZGVmaW5lZFxuXG4gICAgcmV0dXJuIHRoaXMubm90LmJlLnVuZGVmaW5lZFxuICB9KVxuICBkZWYoJ3RvQmVJbnN0YW5jZU9mJywgZnVuY3Rpb24ob2JqOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW5jZU9mKG9iailcbiAgfSlcbiAgZGVmKCd0b0hhdmVMZW5ndGgnLCBmdW5jdGlvbihsZW5ndGg6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLmhhdmUubGVuZ3RoKGxlbmd0aClcbiAgfSlcbiAgLy8gZGVzdHJ1Y3R1cmluZywgYmVjYXVzZSBpdCBjaGVja3MgYGFyZ3VtZW50c2AgaW5zaWRlLCBhbmQgdmFsdWUgaXMgcGFzc2luZyBhcyBgdW5kZWZpbmVkYFxuICBkZWYoJ3RvSGF2ZVByb3BlcnR5JywgZnVuY3Rpb24oLi4uYXJnczogW3Byb3BlcnR5OiBzdHJpbmcsIHZhbHVlPzogYW55XSkge1xuICAgIHJldHVybiB0aGlzLmhhdmUuZGVlcC5uZXN0ZWQucHJvcGVydHkoLi4uYXJncylcbiAgfSlcbiAgZGVmKCd0b0JlQ2xvc2VUbycsIGZ1bmN0aW9uKHJlY2VpdmVkOiBudW1iZXIsIHByZWNpc2lvbiA9IDIpIHtcbiAgICBjb25zdCBleHBlY3RlZCA9IHRoaXMuX29ialxuICAgIGxldCBwYXNzID0gZmFsc2VcbiAgICBsZXQgZXhwZWN0ZWREaWZmID0gMFxuICAgIGxldCByZWNlaXZlZERpZmYgPSAwXG5cbiAgICBpZiAocmVjZWl2ZWQgPT09IEluZmluaXR5ICYmIGV4cGVjdGVkID09PSBJbmZpbml0eSkge1xuICAgICAgcGFzcyA9IHRydWVcbiAgICB9XG4gICAgZWxzZSBpZiAocmVjZWl2ZWQgPT09IC1JbmZpbml0eSAmJiBleHBlY3RlZCA9PT0gLUluZmluaXR5KSB7XG4gICAgICBwYXNzID0gdHJ1ZVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGV4cGVjdGVkRGlmZiA9IE1hdGgucG93KDEwLCAtcHJlY2lzaW9uKSAvIDJcbiAgICAgIHJlY2VpdmVkRGlmZiA9IE1hdGguYWJzKGV4cGVjdGVkIC0gcmVjZWl2ZWQpXG4gICAgICBwYXNzID0gcmVjZWl2ZWREaWZmIDwgZXhwZWN0ZWREaWZmXG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFzc2VydChcbiAgICAgIHBhc3MsXG4gICAgICBgZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBjbG9zZSB0byAje2V4cH0sIHJlY2VpdmVkIGRpZmZlcmVuY2UgaXMgJHtyZWNlaXZlZERpZmZ9LCBidXQgZXhwZWN0ZWQgJHtleHBlY3RlZERpZmZ9YCxcbiAgICAgIGBleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBiZSBjbG9zZSB0byAje2V4cH0sIHJlY2VpdmVkIGRpZmZlcmVuY2UgaXMgJHtyZWNlaXZlZERpZmZ9LCBidXQgZXhwZWN0ZWQgJHtleHBlY3RlZERpZmZ9YCxcbiAgICAgIHJlY2VpdmVkLFxuICAgICAgZXhwZWN0ZWQsXG4gICAgKVxuICB9KVxuXG4gIGNvbnN0IGFzc2VydElzTW9jayA9IChhc3NlcnRpb246IGFueSkgPT4ge1xuICAgIGlmICghaXNNb2NrRnVuY3Rpb24oYXNzZXJ0aW9uLl9vYmopKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt1dGlscy5pbnNwZWN0KGFzc2VydGlvbi5fb2JqKX0gaXMgbm90IGEgc3B5IG9yIGEgY2FsbCB0byBhIHNweSFgKVxuICB9XG4gIGNvbnN0IGdldFNweSA9IChhc3NlcnRpb246IGFueSkgPT4ge1xuICAgIGFzc2VydElzTW9jayhhc3NlcnRpb24pXG4gICAgcmV0dXJuIGFzc2VydGlvbi5fb2JqIGFzIEVuaGFuY2VkU3B5XG4gIH1cbiAgZGVmKFsndG9IYXZlQmVlbkNhbGxlZFRpbWVzJywgJ3RvQmVDYWxsZWRUaW1lcyddLCBmdW5jdGlvbihudW1iZXI6IG51bWJlcikge1xuICAgIGNvbnN0IHNweSA9IGdldFNweSh0aGlzKVxuICAgIGNvbnN0IHNweU5hbWUgPSBzcHkuZ2V0TW9ja05hbWUoKVxuICAgIGNvbnN0IGNhbGxDb3VudCA9IHNweS5tb2NrLmNhbGxzLmxlbmd0aFxuICAgIHJldHVybiB0aGlzLmFzc2VydChcbiAgICAgIGNhbGxDb3VudCA9PT0gbnVtYmVyLFxuICAgICAgYGV4cGVjdGVkIFwiJHtzcHlOYW1lfVwiIHRvIGJlIGNhbGxlZCAje2V4cH0gdGltZXNgLFxuICAgICAgYGV4cGVjdGVkIFwiJHtzcHlOYW1lfVwiIHRvIG5vdCBiZSBjYWxsZWQgI3tleHB9IHRpbWVzYCxcbiAgICAgIG51bWJlcixcbiAgICAgIGNhbGxDb3VudCxcbiAgICApXG4gIH0pXG4gIGRlZigndG9IYXZlQmVlbkNhbGxlZE9uY2UnLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBzcHkgPSBnZXRTcHkodGhpcylcbiAgICBjb25zdCBzcHlOYW1lID0gc3B5LmdldE1vY2tOYW1lKClcbiAgICBjb25zdCBjYWxsQ291bnQgPSBzcHkubW9jay5jYWxscy5sZW5ndGhcbiAgICByZXR1cm4gdGhpcy5hc3NlcnQoXG4gICAgICBjYWxsQ291bnQgPT09IDEsXG4gICAgICBgZXhwZWN0ZWQgXCIke3NweU5hbWV9XCIgdG8gYmUgY2FsbGVkIG9uY2VgLFxuICAgICAgYGV4cGVjdGVkIFwiJHtzcHlOYW1lfVwiIHRvIG5vdCBiZSBjYWxsZWQgb25jZWAsXG4gICAgICAxLFxuICAgICAgY2FsbENvdW50LFxuICAgIClcbiAgfSlcbiAgZGVmKFsndG9IYXZlQmVlbkNhbGxlZCcsICd0b0JlQ2FsbGVkJ10sIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHNweSA9IGdldFNweSh0aGlzKVxuICAgIGNvbnN0IHNweU5hbWUgPSBzcHkuZ2V0TW9ja05hbWUoKVxuICAgIGNvbnN0IGNhbGxlZCA9IHNweS5tb2NrLmNhbGxzLmxlbmd0aCA+IDBcbiAgICByZXR1cm4gdGhpcy5hc3NlcnQoXG4gICAgICBjYWxsZWQsXG4gICAgICBgZXhwZWN0ZWQgXCIke3NweU5hbWV9XCIgdG8gYmUgY2FsbGVkIGF0IGxlYXN0IG9uY2VgLFxuICAgICAgYGV4cGVjdGVkIFwiJHtzcHlOYW1lfVwiIHRvIG5vdCBiZSBjYWxsZWQgYXQgYWxsYCxcbiAgICAgIHRydWUsXG4gICAgICBjYWxsZWQsXG4gICAgKVxuICB9KVxuICBkZWYoWyd0b0hhdmVCZWVuQ2FsbGVkV2l0aCcsICd0b0JlQ2FsbGVkV2l0aCddLCBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgY29uc3Qgc3B5ID0gZ2V0U3B5KHRoaXMpXG4gICAgY29uc3Qgc3B5TmFtZSA9IHNweS5nZXRNb2NrTmFtZSgpXG4gICAgY29uc3QgcGFzcyA9IHNweS5tb2NrLmNhbGxzLnNvbWUoY2FsbEFyZyA9PiBhc3ltbWV0cmljRXF1YWxzKGNhbGxBcmcsIGFyZ3MsIFtpdGVyYWJsZUVxdWFsaXR5XSkpXG4gICAgcmV0dXJuIHRoaXMuYXNzZXJ0KFxuICAgICAgcGFzcyxcbiAgICAgIGBleHBlY3RlZCBcIiR7c3B5TmFtZX1cIiB0byBiZSBjYWxsZWQgd2l0aCBhcmd1bWVudHM6ICN7ZXhwfWAsXG4gICAgICBgZXhwZWN0ZWQgXCIke3NweU5hbWV9XCIgdG8gbm90IGJlIGNhbGxlZCB3aXRoIGFyZ3VtZW50czogI3tleHB9YCxcbiAgICAgIGFyZ3MsXG4gICAgICBzcHkubW9jay5jYWxscyxcbiAgICApXG4gIH0pXG4gIGNvbnN0IG9yZGluYWxPZiA9IChpOiBudW1iZXIpID0+IHtcbiAgICBjb25zdCBqID0gaSAlIDEwXG4gICAgY29uc3QgayA9IGkgJSAxMDBcblxuICAgIGlmIChqID09PSAxICYmIGsgIT09IDExKVxuICAgICAgcmV0dXJuIGAke2l9c3RgXG5cbiAgICBpZiAoaiA9PT0gMiAmJiBrICE9PSAxMilcbiAgICAgIHJldHVybiBgJHtpfW5kYFxuXG4gICAgaWYgKGogPT09IDMgJiYgayAhPT0gMTMpXG4gICAgICByZXR1cm4gYCR7aX1yZGBcblxuICAgIHJldHVybiBgJHtpfXRoYFxuICB9XG4gIGRlZihbJ3RvSGF2ZUJlZW5OdGhDYWxsZWRXaXRoJywgJ250aENhbGxlZFdpdGgnXSwgZnVuY3Rpb24odGltZXM6IG51bWJlciwgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCBzcHkgPSBnZXRTcHkodGhpcylcbiAgICBjb25zdCBzcHlOYW1lID0gc3B5LmdldE1vY2tOYW1lKClcbiAgICBjb25zdCBudGhDYWxsID0gc3B5Lm1vY2suY2FsbHNbdGltZXMgLSAxXVxuXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBhc3ltbWV0cmljRXF1YWxzKG50aENhbGwsIGFyZ3MsIFtpdGVyYWJsZUVxdWFsaXR5XSksXG4gICAgICBgZXhwZWN0ZWQgJHtvcmRpbmFsT2YodGltZXMpfSBcIiR7c3B5TmFtZX1cIiBjYWxsIHRvIGhhdmUgYmVlbiBjYWxsZWQgd2l0aCAje2V4cH1gLFxuICAgICAgYGV4cGVjdGVkICR7b3JkaW5hbE9mKHRpbWVzKX0gXCIke3NweU5hbWV9XCIgY2FsbCB0byBub3QgaGF2ZSBiZWVuIGNhbGxlZCB3aXRoICN7ZXhwfWAsXG4gICAgICBhcmdzLFxuICAgICAgbnRoQ2FsbCxcbiAgICApXG4gIH0pXG4gIGRlZihbJ3RvSGF2ZUJlZW5MYXN0Q2FsbGVkV2l0aCcsICdsYXN0Q2FsbGVkV2l0aCddLCBmdW5jdGlvbiguLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IHNweSA9IGdldFNweSh0aGlzKVxuICAgIGNvbnN0IHNweU5hbWUgPSBzcHkuZ2V0TW9ja05hbWUoKVxuICAgIGNvbnN0IGxhc3RDYWxsID0gc3B5Lm1vY2suY2FsbHNbc3B5LmNhbGxzLmxlbmd0aCAtIDFdXG5cbiAgICB0aGlzLmFzc2VydChcbiAgICAgIGFzeW1tZXRyaWNFcXVhbHMobGFzdENhbGwsIGFyZ3MsIFtpdGVyYWJsZUVxdWFsaXR5XSksXG4gICAgICBgZXhwZWN0ZWQgbGFzdCBcIiR7c3B5TmFtZX1cIiBjYWxsIHRvIGhhdmUgYmVlbiBjYWxsZWQgd2l0aCAje2V4cH1gLFxuICAgICAgYGV4cGVjdGVkIGxhc3QgXCIke3NweU5hbWV9XCIgY2FsbCB0byBub3QgaGF2ZSBiZWVuIGNhbGxlZCB3aXRoICN7ZXhwfWAsXG4gICAgICBhcmdzLFxuICAgICAgbGFzdENhbGwsXG4gICAgKVxuICB9KVxuICBkZWYoWyd0b1Rocm93JywgJ3RvVGhyb3dFcnJvciddLCBmdW5jdGlvbihleHBlY3RlZD86IHN0cmluZyB8IENvbnN0cnVjdGFibGUgfCBSZWdFeHAgfCBFcnJvcikge1xuICAgIGNvbnN0IG9iaiA9IHRoaXMuX29ialxuICAgIGNvbnN0IHByb21pc2UgPSB1dGlscy5mbGFnKHRoaXMsICdwcm9taXNlJylcbiAgICBsZXQgdGhyb3duOiBhbnkgPSBudWxsXG5cbiAgICBpZiAocHJvbWlzZSkge1xuICAgICAgdGhyb3duID0gb2JqXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgb2JqKClcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3duID0gZXJyXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBleHBlY3RlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3QgbmFtZSA9IGV4cGVjdGVkLm5hbWUgfHwgZXhwZWN0ZWQucHJvdG90eXBlLmNvbnN0cnVjdG9yLm5hbWVcbiAgICAgIHJldHVybiB0aGlzLmFzc2VydChcbiAgICAgICAgdGhyb3duICYmIHRocm93biBpbnN0YW5jZW9mIGV4cGVjdGVkLFxuICAgICAgICBgZXhwZWN0ZWQgZXJyb3IgdG8gYmUgaW5zdGFuY2Ugb2YgJHtuYW1lfWAsXG4gICAgICAgIGBleHBlY3RlZCBlcnJvciBub3QgdG8gYmUgaW5zdGFuY2Ugb2YgJHtuYW1lfWAsXG4gICAgICAgIGV4cGVjdGVkLFxuICAgICAgICB0aHJvd24sXG4gICAgICApXG4gICAgfVxuXG4gICAgaWYgKGV4cGVjdGVkICYmIGV4cGVjdGVkIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHJldHVybiB0aGlzLmFzc2VydChcbiAgICAgICAgdGhyb3duICYmIGV4cGVjdGVkLm1lc3NhZ2UgPT09IHRocm93bi5tZXNzYWdlLFxuICAgICAgICBgZXhwZWN0ZWQgZXJyb3IgdG8gaGF2ZSBtZXNzYWdlOiAke2V4cGVjdGVkLm1lc3NhZ2V9YCxcbiAgICAgICAgYGV4cGVjdGVkIGVycm9yIG5vdCB0byBoYXZlIG1lc3NhZ2U6ICR7ZXhwZWN0ZWQubWVzc2FnZX1gLFxuICAgICAgICBleHBlY3RlZC5tZXNzYWdlLFxuICAgICAgICB0aHJvd24gJiYgdGhyb3duLm1lc3NhZ2UsXG4gICAgICApXG4gICAgfVxuXG4gICAgaWYgKGV4cGVjdGVkICYmIHR5cGVvZiAoZXhwZWN0ZWQgYXMgYW55KS5hc3ltbWV0cmljTWF0Y2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IG1hdGNoZXIgPSBleHBlY3RlZCBhcyBhbnkgYXMgQXN5bW1ldHJpY01hdGNoZXI8YW55PlxuICAgICAgcmV0dXJuIHRoaXMuYXNzZXJ0KFxuICAgICAgICB0aHJvd24gJiYgbWF0Y2hlci5hc3ltbWV0cmljTWF0Y2godGhyb3duKSxcbiAgICAgICAgJ2V4cGVjdGVkIGVycm9yIHRvIG1hdGNoIGFzeW1tZXRyaWMgbWF0Y2hlcicsXG4gICAgICAgICdleHBlY3RlZCBlcnJvciBub3QgdG8gbWF0Y2ggYXN5bW1ldHJpYyBtYXRjaGVyJyxcbiAgICAgICAgbWF0Y2hlci50b1N0cmluZygpLFxuICAgICAgICB0aHJvd24sXG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudG8udGhyb3dzKGV4cGVjdGVkKVxuICB9KVxuICBkZWYoWyd0b0hhdmVSZXR1cm5lZCcsICd0b1JldHVybiddLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBzcHkgPSBnZXRTcHkodGhpcylcbiAgICBjb25zdCBzcHlOYW1lID0gc3B5LmdldE1vY2tOYW1lKClcbiAgICBjb25zdCBjYWxsZWRBbmROb3RUaHJldyA9IHNweS5tb2NrLmNhbGxzLmxlbmd0aCA+IDAgJiYgIXNweS5tb2NrLnJlc3VsdHMuc29tZSgoeyB0eXBlIH0pID0+IHR5cGUgPT09ICd0aHJvdycpXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBjYWxsZWRBbmROb3RUaHJldyxcbiAgICAgIGBleHBlY3RlZCBcIiR7c3B5TmFtZX1cIiB0byBiZSBzdWNjZXNzZnVsbHkgY2FsbGVkIGF0IGxlYXN0IG9uY2VgLFxuICAgICAgYGV4cGVjdGVkIFwiJHtzcHlOYW1lfVwiIHRvIG5vdCBiZSBzdWNjZXNzZnVsbHkgY2FsbGVkYCxcbiAgICAgIGNhbGxlZEFuZE5vdFRocmV3LFxuICAgICAgIWNhbGxlZEFuZE5vdFRocmV3LFxuICAgIClcbiAgfSlcbiAgZGVmKFsndG9IYXZlUmV0dXJuZWRUaW1lcycsICd0b1JldHVyblRpbWVzJ10sIGZ1bmN0aW9uKHRpbWVzOiBudW1iZXIpIHtcbiAgICBjb25zdCBzcHkgPSBnZXRTcHkodGhpcylcbiAgICBjb25zdCBzcHlOYW1lID0gc3B5LmdldE1vY2tOYW1lKClcbiAgICBjb25zdCBzdWNjZXNzZnVsbFJldHVybnMgPSBzcHkubW9jay5yZXN1bHRzLnJlZHVjZSgoc3VjY2VzcywgeyB0eXBlIH0pID0+IHR5cGUgPT09ICd0aHJvdycgPyBzdWNjZXNzIDogKytzdWNjZXNzLCAwKVxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgc3VjY2Vzc2Z1bGxSZXR1cm5zID09PSB0aW1lcyxcbiAgICAgIGBleHBlY3RlZCBcIiR7c3B5TmFtZX1cIiB0byBiZSBzdWNjZXNzZnVsbHkgY2FsbGVkICR7dGltZXN9IHRpbWVzYCxcbiAgICAgIGBleHBlY3RlZCBcIiR7c3B5TmFtZX1cIiB0byBub3QgYmUgc3VjY2Vzc2Z1bGx5IGNhbGxlZCAke3RpbWVzfSB0aW1lc2AsXG4gICAgICBgZXhwZWN0ZWQgbnVtYmVyIG9mIHJldHVybnM6ICR7dGltZXN9YCxcbiAgICAgIGByZWNlaXZlZCBudW1iZXIgb2YgcmV0dXJuczogJHtzdWNjZXNzZnVsbFJldHVybnN9YCxcbiAgICApXG4gIH0pXG4gIGRlZihbJ3RvSGF2ZVJldHVybmVkV2l0aCcsICd0b1JldHVybldpdGgnXSwgZnVuY3Rpb24odmFsdWU6IGFueSkge1xuICAgIGNvbnN0IHNweSA9IGdldFNweSh0aGlzKVxuICAgIGNvbnN0IHNweU5hbWUgPSBzcHkuZ2V0TW9ja05hbWUoKVxuICAgIGNvbnN0IHBhc3MgPSBzcHkubW9jay5yZXN1bHRzLnNvbWUoKHsgdHlwZSwgdmFsdWU6IHJlc3VsdCB9KSA9PiB0eXBlID09PSAncmV0dXJuJyAmJiBhc3ltbWV0cmljRXF1YWxzKHZhbHVlLCByZXN1bHQpKVxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgcGFzcyxcbiAgICAgIGBleHBlY3RlZCBcIiR7c3B5TmFtZX1cIiB0byBiZSBzdWNjZXNzZnVsbHkgY2FsbGVkIHdpdGggI3tleHB9YCxcbiAgICAgIGBleHBlY3RlZCBcIiR7c3B5TmFtZX1cIiB0byBub3QgYmUgc3VjY2Vzc2Z1bGx5IGNhbGxlZCB3aXRoICN7ZXhwfWAsXG4gICAgICB2YWx1ZSxcbiAgICApXG4gIH0pXG4gIGRlZihbJ3RvSGF2ZUxhc3RSZXR1cm5lZFdpdGgnLCAnbGFzdFJldHVybmVkV2l0aCddLCBmdW5jdGlvbih2YWx1ZTogYW55KSB7XG4gICAgY29uc3Qgc3B5ID0gZ2V0U3B5KHRoaXMpXG4gICAgY29uc3Qgc3B5TmFtZSA9IHNweS5nZXRNb2NrTmFtZSgpXG4gICAgY29uc3QgeyB2YWx1ZTogbGFzdFJlc3VsdCB9ID0gc3B5Lm1vY2sucmVzdWx0c1tzcHkucmV0dXJucy5sZW5ndGggLSAxXVxuICAgIGNvbnN0IHBhc3MgPSBhc3ltbWV0cmljRXF1YWxzKGxhc3RSZXN1bHQsIHZhbHVlKVxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgcGFzcyxcbiAgICAgIGBleHBlY3RlZCBsYXN0IFwiJHtzcHlOYW1lfVwiIGNhbGwgdG8gcmV0dXJuICN7ZXhwfWAsXG4gICAgICBgZXhwZWN0ZWQgbGFzdCBcIiR7c3B5TmFtZX1cIiBjYWxsIHRvIG5vdCByZXR1cm4gI3tleHB9YCxcbiAgICAgIHZhbHVlLFxuICAgICAgbGFzdFJlc3VsdCxcbiAgICApXG4gIH0pXG4gIGRlZihbJ3RvSGF2ZU50aFJldHVybmVkV2l0aCcsICdudGhSZXR1cm5lZFdpdGgnXSwgZnVuY3Rpb24obnRoQ2FsbDogbnVtYmVyLCB2YWx1ZTogYW55KSB7XG4gICAgY29uc3Qgc3B5ID0gZ2V0U3B5KHRoaXMpXG4gICAgY29uc3Qgc3B5TmFtZSA9IHNweS5nZXRNb2NrTmFtZSgpXG4gICAgY29uc3QgaXNOb3QgPSB1dGlscy5mbGFnKHRoaXMsICduZWdhdGUnKSBhcyBib29sZWFuXG4gICAgY29uc3QgeyB0eXBlOiBjYWxsVHlwZSwgdmFsdWU6IGNhbGxSZXN1bHQgfSA9IHNweS5tb2NrLnJlc3VsdHNbbnRoQ2FsbCAtIDFdXG4gICAgY29uc3Qgb3JkaW5hbENhbGwgPSBgJHtvcmRpbmFsT2YobnRoQ2FsbCl9IGNhbGxgXG5cbiAgICBpZiAoIWlzTm90ICYmIGNhbGxUeXBlID09PSAndGhyb3cnKVxuICAgICAgY2hhaS5hc3NlcnQuZmFpbChgZXhwZWN0ZWQgJHtvcmRpbmFsQ2FsbH0gdG8gcmV0dXJuICN7ZXhwfSwgYnV0IGluc3RlYWQgaXQgdGhyZXcgYW4gZXJyb3JgKVxuXG4gICAgY29uc3QgbnRoQ2FsbFJldHVybiA9IGFzeW1tZXRyaWNFcXVhbHMoY2FsbFJlc3VsdCwgdmFsdWUpXG5cbiAgICB0aGlzLmFzc2VydChcbiAgICAgIG50aENhbGxSZXR1cm4sXG4gICAgICBgZXhwZWN0ZWQgJHtvcmRpbmFsQ2FsbH0gXCIke3NweU5hbWV9XCIgY2FsbCB0byByZXR1cm4gI3tleHB9YCxcbiAgICAgIGBleHBlY3RlZCAke29yZGluYWxDYWxsfSBcIiR7c3B5TmFtZX1cIiBjYWxsIHRvIG5vdCByZXR1cm4gI3tleHB9YCxcbiAgICAgIHZhbHVlLFxuICAgICAgY2FsbFJlc3VsdCxcbiAgICApXG4gIH0pXG5cbiAgdXRpbHMuYWRkUHJvcGVydHkoY2hhaS5Bc3NlcnRpb24ucHJvdG90eXBlLCAncmVzb2x2ZXMnLCBmdW5jdGlvbih0aGlzOiBhbnkpIHtcbiAgICB1dGlscy5mbGFnKHRoaXMsICdwcm9taXNlJywgJ3Jlc29sdmVzJylcbiAgICBjb25zdCBvYmogPSB1dGlscy5mbGFnKHRoaXMsICdvYmplY3QnKVxuICAgIGNvbnN0IHByb3h5OiBhbnkgPSBuZXcgUHJveHkodGhpcywge1xuICAgICAgZ2V0OiAodGFyZ2V0LCBrZXksIHJlY2lldmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuZ2V0KHRhcmdldCwga2V5LCByZWNpZXZlcilcblxuICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICByZXR1cm4gcmVzdWx0IGluc3RhbmNlb2YgY2hhaS5Bc3NlcnRpb24gPyBwcm94eSA6IHJlc3VsdFxuXG4gICAgICAgIHJldHVybiBhc3luYyguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgICAgIHJldHVybiBvYmoudGhlbihcbiAgICAgICAgICAgICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgIHV0aWxzLmZsYWcodGhpcywgJ29iamVjdCcsIHZhbHVlKVxuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmNhbGwodGhpcywgLi4uYXJncylcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBwcm9taXNlIHJlamVjdGVkIFwiJHtlcnJ9XCIgaW5zdGVhZCBvZiByZXNvbHZpbmdgKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSlcblxuICAgIHJldHVybiBwcm94eVxuICB9KVxuXG4gIHV0aWxzLmFkZFByb3BlcnR5KGNoYWkuQXNzZXJ0aW9uLnByb3RvdHlwZSwgJ3JlamVjdHMnLCBmdW5jdGlvbih0aGlzOiBhbnkpIHtcbiAgICB1dGlscy5mbGFnKHRoaXMsICdwcm9taXNlJywgJ3JlamVjdHMnKVxuICAgIGNvbnN0IG9iaiA9IHV0aWxzLmZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgY29uc3Qgd3JhcHBlciA9IHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicgPyBvYmooKSA6IG9iaiAvLyBmb3IgamVzdCBjb21wYXRcbiAgICBjb25zdCBwcm94eTogYW55ID0gbmV3IFByb3h5KHRoaXMsIHtcbiAgICAgIGdldDogKHRhcmdldCwga2V5LCByZWNpZXZlcikgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBSZWZsZWN0LmdldCh0YXJnZXQsIGtleSwgcmVjaWV2ZXIpXG5cbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgIT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdCBpbnN0YW5jZW9mIGNoYWkuQXNzZXJ0aW9uID8gcHJveHkgOiByZXN1bHRcblxuICAgICAgICByZXR1cm4gYXN5bmMoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgICAgICByZXR1cm4gd3JhcHBlci50aGVuKFxuICAgICAgICAgICAgKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBwcm9taXNlIHJlc29sdmVkIFwiJHt2YWx1ZX1cIiBpbnN0ZWFkIG9mIHJlamVjdGluZ2ApXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICAgIHV0aWxzLmZsYWcodGhpcywgJ29iamVjdCcsIGVycilcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5jYWxsKHRoaXMsIC4uLmFyZ3MpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgcmV0dXJuIHByb3h5XG4gIH0pXG5cbiAgdXRpbHMuYWRkTWV0aG9kKFxuICAgIGNoYWkuZXhwZWN0LFxuICAgICdhc3NlcnRpb25zJyxcbiAgICBmdW5jdGlvbiBhc3NlcnRpb25zKGV4cGVjdGVkOiBudW1iZXIpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGBleHBlY3RlZCBudW1iZXIgb2YgYXNzZXJ0aW9ucyB0byBiZSAke2V4cGVjdGVkfSwgYnV0IGdvdCAke2dldFN0YXRlKCkuYXNzZXJ0aW9uQ2FsbHN9YClcbiAgICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSlcbiAgICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UoZXJyb3IsIGFzc2VydGlvbnMpXG5cbiAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgZXhwZWN0ZWRBc3NlcnRpb25zTnVtYmVyOiBleHBlY3RlZCxcbiAgICAgICAgZXhwZWN0ZWRBc3NlcnRpb25zTnVtYmVyRXJyb3I6IGVycm9yLFxuICAgICAgfSlcbiAgICB9LFxuICApXG5cbiAgdXRpbHMuYWRkTWV0aG9kKFxuICAgIGNoYWkuZXhwZWN0LFxuICAgICdoYXNBc3NlcnRpb25zJyxcbiAgICBmdW5jdGlvbiBoYXNBc3NlcnRpb25zKCkge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ2V4cGVjdGVkIGFueSBudW1iZXIgb2YgYXNzZXJ0aW9uLCBidXQgZ290IG5vbmUnKVxuICAgICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKVxuICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnJvciwgaGFzQXNzZXJ0aW9ucylcblxuICAgICAgc2V0U3RhdGUoe1xuICAgICAgICBpc0V4cGVjdGluZ0Fzc2VydGlvbnM6IHRydWUsXG4gICAgICAgIGlzRXhwZWN0aW5nQXNzZXJ0aW9uc0Vycm9yOiBlcnJvcixcbiAgICAgIH0pXG4gICAgfSxcbiAgKVxuXG4gIHV0aWxzLmFkZE1ldGhvZChcbiAgICBjaGFpLmV4cGVjdCxcbiAgICAnYWRkU25hcHNob3RTZXJpYWxpemVyJyxcbiAgICBhZGRTZXJpYWxpemVyLFxuICApXG59XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cykgOlxuICAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnXSwgZmFjdG9yeSkgOlxuICAgIChnbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogZ2xvYmFsIHx8IHNlbGYsIGZhY3RvcnkoZ2xvYmFsLk1vY2tEYXRlID0ge30pKTtcbn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzKSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gICAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG4gICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbiAgICBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG4gICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG4gICAgUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbiAgICBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbiAgICBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuICAgIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbiAgICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcbiAgICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICAgIC8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XHJcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG4gICAgfVxuXG4gICAgdmFyIFJlYWxEYXRlID0gRGF0ZTtcclxuICAgIHZhciBub3cgPSBudWxsO1xyXG4gICAgdmFyIE1vY2tEYXRlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xyXG4gICAgICAgIF9fZXh0ZW5kcyhEYXRlLCBfc3VwZXIpO1xyXG4gICAgICAgIGZ1bmN0aW9uIERhdGUoeSwgbSwgZCwgaCwgTSwgcywgbXMpIHtcclxuICAgICAgICAgICAgX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcclxuICAgICAgICAgICAgdmFyIGRhdGU7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChub3cgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IG5ldyBSZWFsRGF0ZShub3cudmFsdWVPZigpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGUgPSBuZXcgUmVhbERhdGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IG5ldyBSZWFsRGF0ZSh5KTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgZCA9IHR5cGVvZiBkID09PSAndW5kZWZpbmVkJyA/IDEgOiBkO1xyXG4gICAgICAgICAgICAgICAgICAgIGggPSBoIHx8IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgTSA9IE0gfHwgMDtcclxuICAgICAgICAgICAgICAgICAgICBzID0gcyB8fCAwO1xyXG4gICAgICAgICAgICAgICAgICAgIG1zID0gbXMgfHwgMDtcclxuICAgICAgICAgICAgICAgICAgICBkYXRlID0gbmV3IFJlYWxEYXRlKHksIG0sIGQsIGgsIE0sIHMsIG1zKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZGF0ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIERhdGU7XHJcbiAgICB9KFJlYWxEYXRlKSk7XHJcbiAgICBNb2NrRGF0ZS5wcm90b3R5cGUgPSBSZWFsRGF0ZS5wcm90b3R5cGU7XHJcbiAgICBNb2NrRGF0ZS5VVEMgPSBSZWFsRGF0ZS5VVEM7XHJcbiAgICBNb2NrRGF0ZS5ub3cgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBNb2NrRGF0ZSgpLnZhbHVlT2YoKTtcclxuICAgIH07XHJcbiAgICBNb2NrRGF0ZS5wYXJzZSA9IGZ1bmN0aW9uIChkYXRlU3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIFJlYWxEYXRlLnBhcnNlKGRhdGVTdHJpbmcpO1xyXG4gICAgfTtcclxuICAgIE1vY2tEYXRlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiBSZWFsRGF0ZS50b1N0cmluZygpO1xyXG4gICAgfTtcclxuICAgIGZ1bmN0aW9uIHNldChkYXRlKSB7XHJcbiAgICAgICAgdmFyIGRhdGVPYmogPSBuZXcgRGF0ZShkYXRlLnZhbHVlT2YoKSk7XHJcbiAgICAgICAgaWYgKGlzTmFOKGRhdGVPYmouZ2V0VGltZSgpKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtb2NrZGF0ZTogVGhlIHRpbWUgc2V0IGlzIGFuIGludmFsaWQgZGF0ZTogJyArIGRhdGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgRGF0ZSA9IE1vY2tEYXRlO1xyXG4gICAgICAgIG5vdyA9IGRhdGVPYmoudmFsdWVPZigpO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gcmVzZXQoKSB7XHJcbiAgICAgICAgRGF0ZSA9IFJlYWxEYXRlO1xyXG4gICAgfVxyXG4gICAgdmFyIG1vY2tkYXRlID0ge1xyXG4gICAgICAgIHNldDogc2V0LFxyXG4gICAgICAgIHJlc2V0OiByZXNldCxcclxuICAgIH07XG5cbiAgICBleHBvcnRzLmRlZmF1bHQgPSBtb2NrZGF0ZTtcbiAgICBleHBvcnRzLnJlc2V0ID0gcmVzZXQ7XG4gICAgZXhwb3J0cy5zZXQgPSBzZXQ7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG59KSkpO1xuIiwiLy8gVE9ETyBzZXRJbW1lZGlhdGUsIG5leHRUaWNrLCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUsIGNhbmNlbEFuaW1hdGlvbkZyYW1lXG4vLyBUT0RPIGFzeW5jIHRpbWVyc1xuXG5pbXBvcnQgdHlwZSB7IEplc3RNb2NrQ29tcGF0IH0gZnJvbSAnLi9qZXN0LW1vY2snXG5pbXBvcnQgeyBzcHlPbiB9IGZyb20gJy4vamVzdC1tb2NrJ1xuXG5jb25zdCBvcmlnaW5hbFNldFRpbWVvdXQgPSBnbG9iYWwuc2V0VGltZW91dFxuY29uc3Qgb3JpZ2luYWxTZXRJbnRlcnZhbCA9IGdsb2JhbC5zZXRJbnRlcnZhbFxuY29uc3Qgb3JpZ2luYWxDbGVhclRpbWVvdXQgPSBnbG9iYWwuY2xlYXJUaW1lb3V0XG5jb25zdCBvcmlnaW5hbENsZWFySW50ZXJ2YWwgPSBnbG9iYWwuY2xlYXJJbnRlcnZhbFxuXG50eXBlIEFyZ3VtZW50cyA9IFtjYjogKGFyZ3M6IHZvaWQpID0+IHZvaWQsIG1zPzogbnVtYmVyIHwgdW5kZWZpbmVkXVxuXG5jb25zdCBNQVhfTE9PUFMgPSAxMF8wMDBcblxuaW50ZXJmYWNlIEZha2VDYWxsIHtcbiAgY2I6ICgpID0+IGFueVxuICBtczogbnVtYmVyXG4gIGlkOiBudW1iZXJcbiAgbmVzdGVkTXM6IG51bWJlclxuICBzY29wZUlkOiBudW1iZXJcbn1cblxuZW51bSBRdWV1ZVRhc2tUeXBlIHtcbiAgSW50ZXJ2YWwgPSAnaW50ZXJ2YWwnLFxuICBUaW1lb3V0ID0gJ3RpbWVvdXQnLFxuICBJbW1lZGlhdGUgPSAnaW1tZWRpYXRlJyxcbn1cblxuaW50ZXJmYWNlIFF1ZXVlVGFzayB7XG4gIHR5cGU6IFF1ZXVlVGFza1R5cGVcbiAgY2FsbDogRmFrZUNhbGxcbiAgbmVzdGVkOiBib29sZWFuXG59XG5cbmNvbnN0IGFzc2VydEV2ZXJ5ID0gKGFzc2VydGlvbnM6IGFueVtdLCBtZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAgaWYgKGFzc2VydGlvbnMuc29tZShhID0+ICFhKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSlcbn1cblxuY29uc3QgYXNzZXJ0TWF4TG9vcCA9ICh0aW1lczogbnVtYmVyKSA9PiB7XG4gIGlmICh0aW1lcyA+PSBNQVhfTE9PUFMpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0L3NldEludGVydmFsIGNhbGxlZCAxMCAwMDAgdGltZXMuIEl0XFwncyBwb3NzaWJsZSBpdCBzdHVjayBpbiBhbiBpbmZpbml0ZSBsb29wLicpXG59XG5cbi8vIFRPRE8gc2hvdWxkIGRvIHdoYXQgTm9kZUpTLlRpbWVvdXQgZG9lcyBvbiByZWZyZXNoXG5jb25zdCBnZXROb2RlVGltZW91dCA9IChpZDogbnVtYmVyKTogTm9kZUpTLlRpbWVvdXQgPT4ge1xuICBjb25zdCB0aW1lciA9IHtcbiAgICByZWY6ICgpID0+IHRpbWVyLFxuICAgIHVucmVmOiAoKSA9PiB0aW1lcixcbiAgICBoYXNSZWY6ICgpID0+IHRydWUsXG4gICAgcmVmcmVzaDogKCkgPT4gdGltZXIsXG4gICAgW1N5bWJvbC50b1ByaW1pdGl2ZV06ICgpID0+IGlkLFxuICB9XG5cbiAgcmV0dXJuIHRpbWVyXG59XG5cbmV4cG9ydCBjbGFzcyBGYWtlVGltZXJzIHtcbiAgcHJpdmF0ZSBfc2V0VGltZW91dCE6IEplc3RNb2NrQ29tcGF0PEFyZ3VtZW50cywgTm9kZUpTLlRpbWVvdXQ+XG4gIHByaXZhdGUgX3NldEludGVydmFsITogSmVzdE1vY2tDb21wYXQ8QXJndW1lbnRzLCBOb2RlSlMuVGltZW91dD5cblxuICBwcml2YXRlIF9jbGVhclRpbWVvdXQhOiBKZXN0TW9ja0NvbXBhdDxbTm9kZUpTLlRpbWVvdXRdLCB2b2lkPlxuICBwcml2YXRlIF9jbGVhckludGVydmFsITogSmVzdE1vY2tDb21wYXQ8W05vZGVKUy5UaW1lb3V0XSwgdm9pZD5cblxuICBwcml2YXRlIF9hZHZhbmNlZFRpbWUgPSAwXG4gIHByaXZhdGUgX25lc3RlZFRpbWU6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fVxuICBwcml2YXRlIF9zY29wZUlkID0gMFxuICBwcml2YXRlIF9pc05lc3RlZCA9IGZhbHNlXG4gIHByaXZhdGUgX2lzT25seVBlbmRpbmcgPSBmYWxzZVxuXG4gIHByaXZhdGUgX3NweWlkID0gMFxuXG4gIHByaXZhdGUgX2lzTW9ja2VkID0gZmFsc2VcblxuICBwcml2YXRlIF90YXNrc1F1ZXVlOiBRdWV1ZVRhc2tbXSA9IFtdXG4gIHByaXZhdGUgX3F1ZXVlQ291bnQgPSAwXG5cbiAgcHVibGljIHVzZUZha2VUaW1lcnMoKSB7XG4gICAgdGhpcy5faXNNb2NrZWQgPSB0cnVlXG5cbiAgICB0aGlzLnJlc2V0KClcblxuICAgIGNvbnN0IHNweUZhY3RvcnkgPSAoc3B5VHlwZTogUXVldWVUYXNrVHlwZSwgcmVzdWx0QnVpbGRlcjogKGlkOiBudW1iZXIsIGNiOiAoYXJnczogdm9pZCkgPT4gdm9pZCkgPT4gYW55KSA9PiB7XG4gICAgICByZXR1cm4gKGNiOiAoYXJnczogdm9pZCkgPT4gdm9pZCwgbXMgPSAwKSA9PiB7XG4gICAgICAgIGNvbnN0IGlkID0gKyt0aGlzLl9zcHlpZFxuICAgICAgICAvLyBhbGwgdGltZXJzIHVwIHVudGlsIHRoaXMgcG9pbnRcbiAgICAgICAgY29uc3QgbmVzdGVkVG8gPSBPYmplY3QuZW50cmllcyh0aGlzLl9uZXN0ZWRUaW1lKS5maWx0ZXIoKFtrZXldKSA9PiBOdW1iZXIoa2V5KSA8PSB0aGlzLl9zY29wZUlkKVxuICAgICAgICBjb25zdCBuZXN0ZWRNcyA9IG5lc3RlZFRvLnJlZHVjZSgodG90YWwsIFssIG1zXSkgPT4gdG90YWwgKyBtcywgbXMpXG4gICAgICAgIGNvbnN0IGNhbGw6IEZha2VDYWxsID0geyBpZCwgY2IsIG1zLCBuZXN0ZWRNcywgc2NvcGVJZDogdGhpcy5fc2NvcGVJZCB9XG4gICAgICAgIGNvbnN0IHRhc2sgPSB7IHR5cGU6IHNweVR5cGUsIGNhbGwsIG5lc3RlZDogdGhpcy5faXNOZXN0ZWQgfVxuXG4gICAgICAgIHRoaXMucHVzaFRhc2sodGFzaylcblxuICAgICAgICByZXR1cm4gcmVzdWx0QnVpbGRlcihpZCwgY2IpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fc2V0VGltZW91dCA9IHNweU9uKGdsb2JhbCwgJ3NldFRpbWVvdXQnKS5tb2NrSW1wbGVtZW50YXRpb24oc3B5RmFjdG9yeShRdWV1ZVRhc2tUeXBlLlRpbWVvdXQsIGdldE5vZGVUaW1lb3V0KSlcbiAgICB0aGlzLl9zZXRJbnRlcnZhbCA9IHNweU9uKGdsb2JhbCwgJ3NldEludGVydmFsJykubW9ja0ltcGxlbWVudGF0aW9uKHNweUZhY3RvcnkoUXVldWVUYXNrVHlwZS5JbnRlcnZhbCwgZ2V0Tm9kZVRpbWVvdXQpKVxuXG4gICAgY29uc3QgY2xlYXJUaW1lckZhY3RvcnkgPSAoc3B5VHlwZTogUXVldWVUYXNrVHlwZSkgPT4gKGlkOiBudW1iZXIgfCB1bmRlZmluZWQgfCBOb2RlSlMuVGltZW91dCkgPT4ge1xuICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQpIHJldHVyblxuXG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuX3Rhc2tzUXVldWUuZmluZEluZGV4KCh7IGNhbGwsIHR5cGUgfSkgPT4gdHlwZSA9PT0gc3B5VHlwZSAmJiBjYWxsLmlkID09PSBOdW1iZXIoaWQpKVxuXG4gICAgICBpZiAoaW5kZXggIT09IC0xKVxuICAgICAgICB0aGlzLl90YXNrc1F1ZXVlLnNwbGljZShpbmRleCwgMSlcbiAgICB9XG5cbiAgICB0aGlzLl9jbGVhclRpbWVvdXQgPSBzcHlPbihnbG9iYWwsICdjbGVhclRpbWVvdXQnKS5tb2NrSW1wbGVtZW50YXRpb24oY2xlYXJUaW1lckZhY3RvcnkoUXVldWVUYXNrVHlwZS5UaW1lb3V0KSlcbiAgICB0aGlzLl9jbGVhckludGVydmFsID0gc3B5T24oZ2xvYmFsLCAnY2xlYXJJbnRlcnZhbCcpLm1vY2tJbXBsZW1lbnRhdGlvbihjbGVhclRpbWVyRmFjdG9yeShRdWV1ZVRhc2tUeXBlLkludGVydmFsKSlcbiAgfVxuXG4gIHB1YmxpYyB1c2VSZWFsVGltZXJzKCkge1xuICAgIHRoaXMuX2lzTW9ja2VkID0gZmFsc2VcblxuICAgIHRoaXMucmVzZXQoKVxuXG4gICAgZ2xvYmFsLnNldFRpbWVvdXQgPSBvcmlnaW5hbFNldFRpbWVvdXRcbiAgICBnbG9iYWwuc2V0SW50ZXJ2YWwgPSBvcmlnaW5hbFNldEludGVydmFsXG4gICAgZ2xvYmFsLmNsZWFyVGltZW91dCA9IG9yaWdpbmFsQ2xlYXJUaW1lb3V0XG4gICAgZ2xvYmFsLmNsZWFySW50ZXJ2YWwgPSBvcmlnaW5hbENsZWFySW50ZXJ2YWxcbiAgfVxuXG4gIHB1YmxpYyBydW5Pbmx5UGVuZGluZ1RpbWVycygpOiB2b2lkIHwgUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hc3NlcnRNb2NrZWQoKVxuXG4gICAgdGhpcy5faXNPbmx5UGVuZGluZyA9IHRydWVcbiAgICB0aGlzLnJ1blF1ZXVlKClcbiAgfVxuXG4gIHB1YmxpYyBydW5BbGxUaW1lcnMoKTogdm9pZCB8IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuYXNzZXJ0TW9ja2VkKClcblxuICAgIHRoaXMucnVuUXVldWUoKVxuICB9XG5cbiAgcHVibGljIGFkdmFuY2VUaW1lcnNCeVRpbWUobXM6IG51bWJlcik6IHZvaWQgfCBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmFzc2VydE1vY2tlZCgpXG5cbiAgICB0aGlzLl9hZHZhbmNlZFRpbWUgKz0gbXNcbiAgICB0aGlzLnJ1blF1ZXVlKClcbiAgfVxuXG4gIHB1YmxpYyBhZHZhbmNlVGltZXJzVG9OZXh0VGltZXIoKTogdm9pZCB8IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuYXNzZXJ0TW9ja2VkKClcblxuICAgIHRoaXMuY2FsbFF1ZXVlSXRlbSgwKVxuICB9XG5cbiAgcHVibGljIGdldFRpbWVyQ291bnQoKTogbnVtYmVyIHtcbiAgICB0aGlzLmFzc2VydE1vY2tlZCgpXG5cbiAgICByZXR1cm4gdGhpcy5fdGFza3NRdWV1ZS5sZW5ndGhcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXQoKSB7XG4gICAgdGhpcy5fYWR2YW5jZWRUaW1lID0gMFxuICAgIHRoaXMuX25lc3RlZFRpbWUgPSB7fVxuICAgIHRoaXMuX2lzTmVzdGVkID0gZmFsc2VcbiAgICB0aGlzLl9pc09ubHlQZW5kaW5nID0gZmFsc2VcbiAgICB0aGlzLl9zcHlpZCA9IDBcbiAgICB0aGlzLl9xdWV1ZUNvdW50ID0gMFxuICAgIHRoaXMuX3Rhc2tzUXVldWUgPSBbXVxuXG4gICAgdGhpcy5fY2xlYXJJbnRlcnZhbD8ubW9ja1Jlc3RvcmUoKVxuICAgIHRoaXMuX2NsZWFyVGltZW91dD8ubW9ja1Jlc3RvcmUoKVxuICAgIHRoaXMuX3NldEludGVydmFsPy5tb2NrUmVzdG9yZSgpXG4gICAgdGhpcy5fc2V0VGltZW91dD8ubW9ja1Jlc3RvcmUoKVxuICB9XG5cbiAgcHJpdmF0ZSBjYWxsUXVldWVJdGVtKGluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCB0YXNrID0gdGhpcy5fdGFza3NRdWV1ZVtpbmRleF1cblxuICAgIGlmICghdGFzaykgcmV0dXJuXG5cbiAgICBjb25zdCB7IGNhbGwsIHR5cGUgfSA9IHRhc2tcblxuICAgIHRoaXMuX3Njb3BlSWQgPSBjYWxsLmlkXG4gICAgdGhpcy5faXNOZXN0ZWQgPSB0cnVlXG5cbiAgICB0aGlzLl9uZXN0ZWRUaW1lW2NhbGwuaWRdID8/PSAwXG4gICAgdGhpcy5fbmVzdGVkVGltZVtjYWxsLmlkXSArPSBjYWxsLm1zXG5cbiAgICBpZiAodHlwZSA9PT0gJ3RpbWVvdXQnKSB7XG4gICAgICB0aGlzLnJlbW92ZVRhc2soaW5kZXgpXG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgPT09ICdpbnRlcnZhbCcpIHtcbiAgICAgIGNhbGwubmVzdGVkTXMgKz0gY2FsbC5tc1xuICAgICAgY29uc3QgbmVzdGVkTXMgPSBjYWxsLm5lc3RlZE1zXG4gICAgICBjb25zdCBjbG9zZXN0VGFzayA9IHRoaXMuX3Rhc2tzUXVldWUuZmluZEluZGV4KCh7IHR5cGUsIGNhbGwgfSkgPT4gdHlwZSA9PT0gJ2ludGVydmFsJyAmJiBjYWxsLm5lc3RlZE1zIDwgbmVzdGVkTXMpXG5cbiAgICAgIGlmIChjbG9zZXN0VGFzayAhPT0gLTEgJiYgY2xvc2VzdFRhc2sgIT09IGluZGV4KVxuICAgICAgICB0aGlzLmVuc3VyZVF1ZXVlT3JkZXIoKVxuICAgIH1cblxuICAgIGNhbGwuY2IoKVxuXG4gICAgdGhpcy5fcXVldWVDb3VudCsrXG4gIH1cblxuICBwcml2YXRlIHJ1blF1ZXVlKCkge1xuICAgIGxldCBpbmRleCA9IDBcbiAgICB3aGlsZSAodGhpcy5fdGFza3NRdWV1ZVtpbmRleF0pIHtcbiAgICAgIGFzc2VydE1heExvb3AodGhpcy5fcXVldWVDb3VudClcblxuICAgICAgY29uc3QgeyBjYWxsLCBuZXN0ZWQgfSA9IHRoaXMuX3Rhc2tzUXVldWVbaW5kZXhdXG5cbiAgICAgIGlmICh0aGlzLl9hZHZhbmNlZFRpbWUgJiYgY2FsbC5uZXN0ZWRNcyA+IHRoaXMuX2FkdmFuY2VkVGltZSlcbiAgICAgICAgYnJlYWtcblxuICAgICAgaWYgKHRoaXMuX2lzT25seVBlbmRpbmcgJiYgbmVzdGVkKSB7XG4gICAgICAgIGluZGV4KytcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgdGhpcy5jYWxsUXVldWVJdGVtKGluZGV4KVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlVGFzayhpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKGluZGV4ID09PSAwKVxuICAgICAgdGhpcy5fdGFza3NRdWV1ZS5zaGlmdCgpXG4gICAgZWxzZVxuICAgICAgdGhpcy5fdGFza3NRdWV1ZS5zcGxpY2UoaW5kZXgsIDEpXG4gIH1cblxuICBwcml2YXRlIHB1c2hUYXNrKHRhc2s6IFF1ZXVlVGFzaykge1xuICAgIHRoaXMuX3Rhc2tzUXVldWUucHVzaCh0YXNrKVxuICAgIHRoaXMuZW5zdXJlUXVldWVPcmRlcigpXG4gIH1cblxuICBwcml2YXRlIGVuc3VyZVF1ZXVlT3JkZXIoKSB7XG4gICAgdGhpcy5fdGFza3NRdWV1ZS5zb3J0KCh0MSwgdDIpID0+IHtcbiAgICAgIGNvbnN0IGRpZmYgPSB0MS5jYWxsLm5lc3RlZE1zIC0gdDIuY2FsbC5uZXN0ZWRNc1xuXG4gICAgICBpZiAoZGlmZiA9PT0gMCkge1xuICAgICAgICBpZiAodDEudHlwZSA9PT0gUXVldWVUYXNrVHlwZS5JbW1lZGlhdGUgJiYgdDIudHlwZSAhPT0gUXVldWVUYXNrVHlwZS5JbW1lZGlhdGUpXG4gICAgICAgICAgcmV0dXJuIDFcblxuICAgICAgICByZXR1cm4gMFxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGlmZlxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGFzc2VydE1vY2tlZCgpIHtcbiAgICBhc3NlcnRFdmVyeShbXG4gICAgICB0aGlzLl9pc01vY2tlZCxcbiAgICAgIHRoaXMuX3NldFRpbWVvdXQsXG4gICAgICB0aGlzLl9zZXRJbnRlcnZhbCxcbiAgICAgIHRoaXMuX2NsZWFyVGltZW91dCxcbiAgICAgIHRoaXMuX2NsZWFySW50ZXJ2YWwsXG4gICAgXSwgJ3RpbWVycyBhcmUgbm90IG1vY2tlZC4gdHJ5IGNhbGxpbmcgXCJ2aS51c2VGYWtlVGltZXJzKClcIiBmaXJzdCcpXG4gIH1cbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuXG5pbXBvcnQgbW9ja2RhdGUgZnJvbSAnbW9ja2RhdGUnXG5pbXBvcnQgeyBwYXJzZVN0YWNrdHJhY2UgfSBmcm9tICcuLi91dGlscy9zb3VyY2UtbWFwJ1xuaW1wb3J0IHR5cGUgeyBWaXRlc3RNb2NrZXIgfSBmcm9tICcuLi9ub2RlL21vY2tlcidcbmltcG9ydCB7IEZha2VUaW1lcnMgfSBmcm9tICcuL3RpbWVycydcbmltcG9ydCB0eXBlIHsgRW5oYW5jZWRTcHksIE1heWJlTW9ja2VkLCBNYXliZU1vY2tlZERlZXAgfSBmcm9tICcuL2plc3QtbW9jaydcbmltcG9ydCB7IGZuLCBpc01vY2tGdW5jdGlvbiwgc3BpZXMsIHNweU9uIH0gZnJvbSAnLi9qZXN0LW1vY2snXG5cbmNsYXNzIFZpdGVzdFV0aWxzIHtcbiAgcHJpdmF0ZSBfdGltZXJzOiBGYWtlVGltZXJzXG4gIHByaXZhdGUgX21vY2tlZERhdGU6IHN0cmluZyB8IG51bWJlciB8IERhdGUgfCBudWxsXG4gIHByaXZhdGUgX21vY2tlcjogVml0ZXN0TW9ja2VyXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fdGltZXJzID0gbmV3IEZha2VUaW1lcnMoKVxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgaW5qZWN0ZWQgYnkgdml0ZS1uaWRlXG4gICAgdGhpcy5fbW9ja2VyID0gdHlwZW9mIF9fdml0ZXN0X21vY2tlcl9fICE9PSAndW5kZWZpbmVkJyA/IF9fdml0ZXN0X21vY2tlcl9fIDogbnVsbFxuICAgIHRoaXMuX21vY2tlZERhdGUgPSBudWxsXG5cbiAgICBpZiAoIXRoaXMuX21vY2tlcilcbiAgICAgIHRocm93IG5ldyBFcnJvcignVml0ZXN0IHdhcyBpbml0aWFsaXNlZCB3aXRoIG5hdGl2ZSBOb2RlIGluc3RlYWQgb2YgVml0ZSBOb2RlJylcbiAgfVxuXG4gIC8vIHRpbWVyc1xuXG4gIHB1YmxpYyB1c2VGYWtlVGltZXJzKCkge1xuICAgIHJldHVybiB0aGlzLl90aW1lcnMudXNlRmFrZVRpbWVycygpXG4gIH1cblxuICBwdWJsaWMgdXNlUmVhbFRpbWVycygpIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZXJzLnVzZVJlYWxUaW1lcnMoKVxuICB9XG5cbiAgcHVibGljIHJ1bk9ubHlQZW5kaW5nVGltZXJzKCkge1xuICAgIHJldHVybiB0aGlzLl90aW1lcnMucnVuT25seVBlbmRpbmdUaW1lcnMoKVxuICB9XG5cbiAgcHVibGljIHJ1bkFsbFRpbWVycygpIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZXJzLnJ1bkFsbFRpbWVycygpXG4gIH1cblxuICBwdWJsaWMgYWR2YW5jZVRpbWVyc0J5VGltZShtczogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RpbWVycy5hZHZhbmNlVGltZXJzQnlUaW1lKG1zKVxuICB9XG5cbiAgcHVibGljIGFkdmFuY2VUaW1lcnNUb05leHRUaW1lcigpIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZXJzLmFkdmFuY2VUaW1lcnNUb05leHRUaW1lcigpXG4gIH1cblxuICBwdWJsaWMgZ2V0VGltZXJDb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZXJzLmdldFRpbWVyQ291bnQoKVxuICB9XG5cbiAgLy8gZGF0ZVxuXG4gIHB1YmxpYyBtb2NrQ3VycmVudERhdGUoZGF0ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSkge1xuICAgIHRoaXMuX21vY2tlZERhdGUgPSBkYXRlXG4gICAgbW9ja2RhdGUuc2V0KGRhdGUpXG4gIH1cblxuICBwdWJsaWMgcmVzdG9yZUN1cnJlbnREYXRlKCkge1xuICAgIHRoaXMuX21vY2tlZERhdGUgPSBudWxsXG4gICAgbW9ja2RhdGUucmVzZXQoKVxuICB9XG5cbiAgcHVibGljIGdldE1vY2tlZERhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21vY2tlZERhdGVcbiAgfVxuXG4gIC8vIG1vY2tzXG5cbiAgc3B5T24gPSBzcHlPblxuICBmbiA9IGZuXG5cbiAgcHJpdmF0ZSBnZXRJbXBvcnRlcigpIHtcbiAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoJ21vY2snKVxuICAgIGNvbnN0IFssLCBpbXBvcnRlcl0gPSBwYXJzZVN0YWNrdHJhY2UoZXJyLCB0cnVlKVxuICAgIHJldHVybiBpbXBvcnRlci5maWxlXG4gIH1cblxuICAvKipcbiAgICogTWFrZXMgYWxsIGBpbXBvcnRzYCB0byBwYXNzZWQgbW9kdWxlIHRvIGJlIG1vY2tlZC5cbiAgICogLSBJZiB0aGVyZSBpcyBhIGZhY3RvcnksIHdpbGwgcmV0dXJuIGl0J3MgcmVzdWx0LiBUaGUgY2FsbCB0byBgdmkubW9ja2AgaXMgaG9pc3RlZCB0byB0aGUgdG9wIG9mIHRoZSBmaWxlLFxuICAgKiBzbyB5b3UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gdmFyaWFibGVzIGRlY2xhcmVkIGluIHRoZSBnbG9iYWwgZmlsZSBzY29wZSwgaWYgeW91IGRpZG4ndCBwdXQgdGhlbSBiZWZvcmUgaW1wb3J0cyFcbiAgICogLSBJZiBgX19tb2Nrc19fYCBmb2xkZXIgd2l0aCBmaWxlIG9mIHRoZSBzYW1lIG5hbWUgZXhpc3QsIGFsbCBpbXBvcnRzIHdpbGxcbiAgICogcmV0dXJuIGl0LlxuICAgKiAtIElmIHRoZXJlIGlzIG5vIGBfX21vY2tzX19gIGZvbGRlciBvciBhIGZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lIGluc2lkZSwgd2lsbCBjYWxsIG9yaWdpbmFsXG4gICAqIG1vZHVsZSBhbmQgbW9jayBpdC5cbiAgICogQHBhcmFtIHBhdGggUGF0aCB0byB0aGUgbW9kdWxlLiBDYW4gYmUgYWxpYXNlZCwgaWYgeW91ciBjb25maWcgc3VwcG9ycyBpdFxuICAgKiBAcGFyYW0gZmFjdG9yeSBGYWN0b3J5IGZvciB0aGUgbW9ja2VkIG1vZHVsZS4gSGFzIHRoZSBoaWdoZXN0IHByaW9yaXR5LlxuICAgKi9cbiAgcHVibGljIG1vY2socGF0aDogc3RyaW5nLCBmYWN0b3J5PzogKCkgPT4gYW55KSB7XG4gICAgdGhpcy5fbW9ja2VyLnF1ZXVlTW9jayhwYXRoLCB0aGlzLmdldEltcG9ydGVyKCksIGZhY3RvcnkpXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBtb2R1bGUgZnJvbSBtb2NrZWQgcmVnaXN0cnkuIEFsbCBzdWJzZXF1ZW50IGNhbGxzIHRvIGltcG9ydCB3aWxsXG4gICAqIHJldHVybiBvcmlnaW5hbCBtb2R1bGUgZXZlbiBpZiBpdCB3YXMgbW9ja2VkLlxuICAgKiBAcGFyYW0gcGF0aCBQYXRoIHRvIHRoZSBtb2R1bGUuIENhbiBiZSBhbGlhc2VkLCBpZiB5b3VyIGNvbmZpZyBzdXBwb3JzIGl0XG4gICAqL1xuICBwdWJsaWMgdW5tb2NrKHBhdGg6IHN0cmluZykge1xuICAgIHRoaXMuX21vY2tlci5xdWV1ZVVubW9jayhwYXRoLCB0aGlzLmdldEltcG9ydGVyKCkpXG4gIH1cblxuICBwdWJsaWMgZG9Nb2NrKHBhdGg6IHN0cmluZywgZmFjdG9yeT86ICgpID0+IGFueSkge1xuICAgIHRoaXMuX21vY2tlci5xdWV1ZU1vY2socGF0aCwgdGhpcy5nZXRJbXBvcnRlcigpLCBmYWN0b3J5KVxuICB9XG5cbiAgcHVibGljIGRvVW5tb2NrKHBhdGg6IHN0cmluZykge1xuICAgIHRoaXMuX21vY2tlci5xdWV1ZVVubW9jayhwYXRoLCB0aGlzLmdldEltcG9ydGVyKCkpXG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0cyBtb2R1bGUsIGJ5cGFzc2luZyBhbGwgY2hlY2tzIGlmIGl0IHNob3VsZCBiZSBtb2NrZWQuXG4gICAqIENhbiBiZSB1c2VmdWwgaWYgeW91IHdhbnQgdG8gbW9jayBtb2R1bGUgcGFydGlhbGx5LlxuICAgKiBAZXhhbXBsZVxuICAgKiB2aS5tb2NrKCcuL2V4YW1wbGUnLCBhc3luYyAoKSA9PiB7XG4gICAqICBjb25zdCBheGlvcyA9IGF3YWl0IHZpLmltcG9ydEFjdHVhbCgnLi9leGFtcGxlJylcbiAgICpcbiAgICogIHJldHVybiB7IC4uLmF4aW9zLCBnZXQ6IHZpLmZuKCkgfVxuICAgKiB9KVxuICAgKiBAcGFyYW0gcGF0aCBQYXRoIHRvIHRoZSBtb2R1bGUuIENhbiBiZSBhbGlhc2VkLCBpZiB5b3VyIGNvbmZpZyBzdXBwb3JzIGl0XG4gICAqIEByZXR1cm5zIEFjdHVhbCBtb2R1bGUgd2l0aG91dCBzcGllc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGltcG9ydEFjdHVhbDxUPihwYXRoOiBzdHJpbmcpOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fbW9ja2VyLmltcG9ydEFjdHVhbDxUPihwYXRoLCB0aGlzLmdldEltcG9ydGVyKCkpXG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0cyBhIG1vZHVsZSB3aXRoIGFsbCBvZiBpdHMgcHJvcGVydGllcyBhbmQgbmVzdGVkIHByb3BlcnRpZXMgbW9ja2VkLlxuICAgKiBGb3IgdGhlIHJ1bGVzIGFwcGxpZWQsIHNlZSBkb2NzLlxuICAgKiBAcGFyYW0gcGF0aCBQYXRoIHRvIHRoZSBtb2R1bGUuIENhbiBiZSBhbGlhc2VkLCBpZiB5b3VyIGNvbmZpZyBzdXBwb3JzIGl0XG4gICAqIEByZXR1cm5zIEZ1bGx5IG1vY2tlZCBtb2R1bGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbXBvcnRNb2NrPFQ+KHBhdGg6IHN0cmluZyk6IFByb21pc2U8TWF5YmVNb2NrZWREZWVwPFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMuX21vY2tlci5pbXBvcnRNb2NrKHBhdGgsIHRoaXMuZ2V0SW1wb3J0ZXIoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBUeXBlIGhlbHBlcnMgZm9yIFR5cGVTY3JpcHQuIEluIHJlYWxpdHkganVzdCByZXR1cm5zIHRoZSBvYmplY3QgdGhhdCB3YXMgcGFzc2VkLlxuICAgKiBAZXhhbXBsZVxuICAgKiBpbXBvcnQgZXhhbXBsZSBmcm9tICcuL2V4YW1wbGUnXG4gICAqIHZpLm1vY2soJy4vZXhhbXBsZScpXG4gICAqXG4gICAqIHRlc3QoJzErMSBlcXVhbHMgMicgYXN5bmMgKCkgPT4ge1xuICAgKiAgdmkubW9ja2VkKGV4YW1wbGUuY2FsYykubW9ja1Jlc3RvcmUoKVxuICAgKlxuICAgKiAgY29uc3QgcmVzID0gZXhhbXBsZS5jYWxjKDEsICcrJywgMSlcbiAgICpcbiAgICogIGV4cGVjdChyZXMpLnRvQmUoMilcbiAgICogfSlcbiAgICogQHBhcmFtIGl0ZW0gQW55dGhpbmcgdGhhdCBjYW4gYmUgbW9ja2VkXG4gICAqIEBwYXJhbSBkZWVwIElmIHRoZSBvYmplY3QgaXMgZGVlcGx5IG1vY2tlZFxuICAgKi9cbiAgcHVibGljIG1vY2tlZDxUPihpdGVtOiBULCBkZWVwPzogZmFsc2UpOiBNYXliZU1vY2tlZDxUPlxuICBwdWJsaWMgbW9ja2VkPFQ+KGl0ZW06IFQsIGRlZXA6IHRydWUpOiBNYXliZU1vY2tlZERlZXA8VD5cbiAgcHVibGljIG1vY2tlZDxUPihpdGVtOiBULCBfZGVlcCA9IGZhbHNlKTogTWF5YmVNb2NrZWQ8VD4gfCBNYXliZU1vY2tlZERlZXA8VD4ge1xuICAgIHJldHVybiBpdGVtIGFzIGFueVxuICB9XG5cbiAgcHVibGljIGlzTW9ja0Z1bmN0aW9uKGZuOiBhbnkpOiBmbiBpcyBFbmhhbmNlZFNweSB7XG4gICAgcmV0dXJuIGlzTW9ja0Z1bmN0aW9uKGZuKVxuICB9XG5cbiAgcHVibGljIGNsZWFyQWxsTW9ja3MoKSB7XG4gICAgdGhpcy5fbW9ja2VyLmNsZWFyTW9ja3MoeyBjbGVhck1vY2tzOiB0cnVlIH0pXG4gICAgc3BpZXMuZm9yRWFjaChzcHkgPT4gc3B5Lm1vY2tDbGVhcigpKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwdWJsaWMgcmVzZXRBbGxNb2NrcygpIHtcbiAgICB0aGlzLl9tb2NrZXIuY2xlYXJNb2Nrcyh7IG1vY2tSZXNldDogdHJ1ZSB9KVxuICAgIHNwaWVzLmZvckVhY2goc3B5ID0+IHNweS5tb2NrUmVzZXQoKSlcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcHVibGljIHJlc3RvcmVBbGxNb2NrcygpIHtcbiAgICB0aGlzLl9tb2NrZXIuY2xlYXJNb2Nrcyh7IHJlc3RvcmVNb2NrczogdHJ1ZSB9KVxuICAgIHNwaWVzLmZvckVhY2goc3B5ID0+IHNweS5tb2NrUmVzdG9yZSgpKVxuICAgIHJldHVybiB0aGlzXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHZpdGVzdCA9IG5ldyBWaXRlc3RVdGlscygpXG5leHBvcnQgY29uc3QgdmkgPSB2aXRlc3RcbiJdLCJuYW1lcyI6WyJ0ZXN0IiwiQXN5bW1ldHJpY01hdGNoZXIiLCJfY29sbGVjdGlvbnMiLCJyZXF1aXJlJCQwIiwiZ2xvYmFsIiwiU3ltYm9sIiwiU1BBQ0UiLCJzZXJpYWxpemUiLCJwbHVnaW4iLCJfZGVmYXVsdCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfYW5zaVN0eWxlcyIsInJlcXVpcmUkJDEiLCJET01Db2xsZWN0aW9uIiwiZXNjYXBlSFRNTF8xIiwiRE9NRWxlbWVudCIsIl9tYXJrdXAiLCJJbW11dGFibGUiLCJJU19LRVlFRF9TRU5USU5FTCIsIklTX09SREVSRURfU0VOVElORUwiLCJJU19TRVRfU0VOVElORUwiLCJyZWFjdElzTW9kdWxlIiwiUmVhY3RFbGVtZW50IiwiZ2V0UHJvcEtleXMiLCJSZWFjdFRlc3RDb21wb25lbnQiLCJyZXF1aXJlJCQyIiwicmVxdWlyZSQkMyIsInJlcXVpcmUkJDQiLCJyZXF1aXJlJCQ1IiwicmVxdWlyZSQkNiIsInJlcXVpcmUkJDciLCJyZXF1aXJlJCQ4IiwicHJldHR5Rm9ybWF0UGx1Z2lucyIsImFzeW1tZXRyaWNFcXVhbHMiLCJ0aGlzIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBLElBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUM7QUFDdEMsSUFBSSxVQUFVLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDO0FBQ3pDLElBQUksaUJBQWlCLEdBQUcsTUFBTSxDQUFDLHlCQUF5QixDQUFDO0FBQ3pELElBQUksbUJBQW1CLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDO0FBQ3ZELElBQUksWUFBWSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDO0FBQ25ELElBQUksWUFBWSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsb0JBQW9CLENBQUM7QUFDekQsSUFBSSxlQUFlLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssS0FBSyxHQUFHLElBQUksR0FBRyxHQUFHLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ2hLLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSztBQUMvQixFQUFFLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEMsSUFBSSxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztBQUNsQyxNQUFNLGVBQWUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3hDLEVBQUUsSUFBSSxtQkFBbUI7QUFDekIsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQzdDLE1BQU0sSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7QUFDcEMsUUFBUSxlQUFlLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUMxQyxLQUFLO0FBQ0wsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUMsQ0FBQztBQUNGLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxVQUFVLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0QsU0FBUyxlQUFlLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRTtBQUMxQyxFQUFFLFNBQVMsTUFBTSxDQUFDLEdBQUcsRUFBRTtBQUN2QixJQUFJLE1BQU0sTUFBTSxHQUFHLFNBQVMsR0FBRyxJQUFJLEVBQUU7QUFDckMsTUFBTSxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2pDLEtBQUssQ0FBQztBQUNOLElBQUksS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFDNUIsTUFBTSxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUU7QUFDekMsUUFBUSxHQUFHLEdBQUc7QUFDZCxVQUFVLE9BQU8sTUFBTSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2pGLFNBQVM7QUFDVCxPQUFPLENBQUMsQ0FBQztBQUNULEtBQUs7QUFDTCxJQUFJLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLEdBQUc7QUFDSCxFQUFFLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMzQixFQUFFLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDZjs7QUNwQ1ksTUFBQyxPQUFPLEdBQUc7QUFDdkIsRUFBRSxLQUFLLEVBQUUsRUFBRTtBQUNYLEVBQUUsWUFBWSxFQUFFLElBQUk7QUFDcEIsRUFBRTtBQUNLLFNBQVMsV0FBVyxDQUFDLElBQUksRUFBRTtBQUNsQyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQ1QsRUFBRSxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsWUFBWSxLQUFLLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyRSxDQUFDO0FBQ00sZUFBZSxZQUFZLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtBQUM5QyxFQUFFLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7QUFDcEMsRUFBRSxPQUFPLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUM7QUFDYixFQUFFLE9BQU8sQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO0FBQzlCLENBQUM7QUFDTSxTQUFTLHFCQUFxQixHQUFHO0FBQ3hDLEVBQUUsT0FBTyxPQUFPLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztBQUN0RCxDQUFDO0FBQ00sU0FBUyxxQkFBcUIsR0FBRztBQUN4QyxFQUFFLE9BQU8sT0FBTyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7QUFDdEQsQ0FBQztBQUNNLFNBQVMsV0FBVyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUU7QUFDMUMsRUFBRSxNQUFNLE9BQU8sR0FBRyxRQUFRLElBQUkscUJBQXFCLEVBQUUsQ0FBQztBQUN0RCxFQUFFLElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxPQUFPLEtBQUssUUFBUTtBQUMxQyxJQUFJLE9BQU8sRUFBRSxDQUFDO0FBQ2QsRUFBRSxPQUFPLENBQUMsR0FBRyxJQUFJLEtBQUs7QUFDdEIsSUFBSSxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEtBQUs7QUFDdkUsTUFBTSxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsTUFBTTtBQUNyQyxRQUFRLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM1QixRQUFRLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLGtCQUFrQixFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0QsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2xCLE1BQU0sS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3BCLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNULEdBQUcsQ0FBQztBQUNKLENBQUM7QUFDRCxTQUFTLGVBQWUsQ0FBQyxFQUFFLEVBQUU7QUFDN0IsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU07QUFDaEIsSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUNkLEVBQUUsT0FBTyxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sS0FBSztBQUNoRCxJQUFJLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQztBQUNwRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNiLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUNNLFNBQVMsYUFBYSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUU7QUFDM0MsRUFBRSxPQUFPLFdBQVcsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbkQ7O0FDNUNBLE1BQU0sS0FBSyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7QUFDNUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUN4QixTQUFTLEtBQUssQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFO0FBQy9CLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDckIsQ0FBQztBQUNNLFNBQVMsS0FBSyxDQUFDLEdBQUcsRUFBRTtBQUMzQixFQUFFLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QixDQUFDO0FBQ00sU0FBUyxRQUFRLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRTtBQUNyQyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFDTSxTQUFTLFFBQVEsQ0FBQyxHQUFHLEVBQUU7QUFDOUIsRUFBRSxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0I7O0FDVFksTUFBQyxLQUFLLEdBQUcsV0FBVyxHQUFHO0FBQ3ZCLE1BQUNBLE1BQUksR0FBRyxlQUFlLENBQUMsQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLEVBQUUsU0FBUyxJQUFJLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRTtBQUNqSCxFQUFFLGVBQWUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzFELENBQUMsRUFBRTtBQUNTLE1BQUMsUUFBUSxHQUFHLE1BQU07QUFDbEIsTUFBQyxFQUFFLEdBQUdBLE9BQUs7QUFDWCxNQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsRUFBRSxFQUFFO0FBQy9CLFNBQVMsWUFBWSxHQUFHO0FBQy9CLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7QUFDdEMsQ0FBQztBQUNNLFNBQVMsZUFBZSxHQUFHO0FBQ2xDLEVBQUUsT0FBTyxPQUFPLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQztBQUM5QyxDQUFDO0FBQ00sU0FBUyxnQkFBZ0IsR0FBRztBQUNuQyxFQUFFLE9BQU87QUFDVCxJQUFJLFNBQVMsRUFBRSxFQUFFO0FBQ2pCLElBQUksUUFBUSxFQUFFLEVBQUU7QUFDaEIsSUFBSSxVQUFVLEVBQUUsRUFBRTtBQUNsQixJQUFJLFNBQVMsRUFBRSxFQUFFO0FBQ2pCLEdBQUcsQ0FBQztBQUNKLENBQUM7QUFDRCxTQUFTLG9CQUFvQixDQUFDLElBQUksRUFBRSxPQUFPLEdBQUcsTUFBTTtBQUNwRCxDQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtBQUNyQixFQUFFLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztBQUMxQixFQUFFLElBQUksTUFBTSxDQUFDO0FBQ2IsRUFBRSxTQUFTLEVBQUUsQ0FBQztBQUNkLEVBQUUsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxFQUFFLFNBQVMsS0FBSyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUU7QUFDOUcsSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sR0FBRyxLQUFLLENBQUM7QUFDdkYsSUFBSSxNQUFNLEtBQUssR0FBRztBQUNsQixNQUFNLEVBQUUsRUFBRSxFQUFFO0FBQ1osTUFBTSxJQUFJLEVBQUUsTUFBTTtBQUNsQixNQUFNLElBQUksRUFBRSxLQUFLO0FBQ2pCLE1BQU0sSUFBSSxFQUFFLEtBQUs7QUFDakIsTUFBTSxLQUFLLEVBQUUsS0FBSyxDQUFDO0FBQ25CLE1BQU0sS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO0FBQ3ZCLEtBQUssQ0FBQztBQUNOLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLFVBQVU7QUFDckMsTUFBTSxLQUFLLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztBQUM5QixJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUNyRCxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdEIsR0FBRyxDQUFDLENBQUM7QUFDTCxFQUFFLE1BQU0sU0FBUyxHQUFHO0FBQ3BCLElBQUksSUFBSSxFQUFFLFdBQVc7QUFDckIsSUFBSSxJQUFJO0FBQ1IsSUFBSSxJQUFJO0FBQ1IsSUFBSSxJQUFJLEVBQUUsS0FBSztBQUNmLElBQUksS0FBSztBQUNULElBQUksT0FBTztBQUNYLElBQUksS0FBSztBQUNULElBQUksRUFBRSxFQUFFLE9BQU87QUFDZixHQUFHLENBQUM7QUFDSixFQUFFLFNBQVMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtBQUNqQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUN4QyxHQUFHO0FBQ0gsRUFBRSxTQUFTLFNBQVMsR0FBRztBQUN2QixJQUFJLE1BQU0sR0FBRztBQUNiLE1BQU0sRUFBRSxFQUFFLEVBQUU7QUFDWixNQUFNLElBQUksRUFBRSxPQUFPO0FBQ25CLE1BQU0sSUFBSTtBQUNWLE1BQU0sSUFBSTtBQUNWLE1BQU0sS0FBSyxFQUFFLEVBQUU7QUFDZixLQUFLLENBQUM7QUFDTixJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO0FBQ3pDLEdBQUc7QUFDSCxFQUFFLFNBQVMsS0FBSyxHQUFHO0FBQ25CLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDckIsSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUM1QixJQUFJLFNBQVMsRUFBRSxDQUFDO0FBQ2hCLEdBQUc7QUFDSCxFQUFFLGVBQWUsT0FBTyxDQUFDLElBQUksRUFBRTtBQUMvQixJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLElBQUksSUFBSSxPQUFPO0FBQ2YsTUFBTSxNQUFNLFlBQVksQ0FBQyxTQUFTLEVBQUUsTUFBTSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUMxRCxJQUFJLE1BQU0sV0FBVyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsWUFBWSxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEtBQUssV0FBVyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3ZCLElBQUksTUFBTSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUM7QUFDL0IsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxLQUFLO0FBQ2xDLE1BQU0sSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7QUFDMUIsTUFBTSxJQUFJLElBQUk7QUFDZCxRQUFRLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3pCLEtBQUssQ0FBQyxDQUFDO0FBQ1AsSUFBSSxPQUFPLE1BQU0sQ0FBQztBQUNsQixHQUFHO0FBQ0gsRUFBRSxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDekIsRUFBRSxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBQ0QsU0FBUyxXQUFXLEdBQUc7QUFDdkIsRUFBRSxPQUFPLGVBQWUsQ0FBQyxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUFFLFNBQVMsSUFBSSxFQUFFLE9BQU8sRUFBRTtBQUN6RixJQUFJLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxHQUFHLEtBQUssQ0FBQztBQUN0RixJQUFJLE9BQU8sb0JBQW9CLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ3RFLEdBQUcsQ0FBQyxDQUFDO0FBQ0w7Ozs7Ozs7QUNqR0E7QUFDQSxNQUFNLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztBQUNsQztBQUNBLE1BQU0sV0FBVyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9FO0FBQ0EsTUFBTSxXQUFXLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RztBQUNBLFNBQVMsY0FBYyxHQUFHO0FBQzFCLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUN6QixDQUFDLE1BQU0sTUFBTSxHQUFHO0FBQ2hCLEVBQUUsUUFBUSxFQUFFO0FBQ1osR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2hCO0FBQ0EsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO0FBQ2hCLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztBQUNmLEdBQUcsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztBQUNsQixHQUFHLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7QUFDckIsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0FBQ3JCLEdBQUcsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztBQUNuQixHQUFHLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7QUFDbEIsR0FBRyxhQUFhLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO0FBQ3pCLEdBQUc7QUFDSCxFQUFFLEtBQUssRUFBRTtBQUNULEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUNsQixHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFDaEIsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0FBQ2xCLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUNuQixHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFDakIsR0FBRyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0FBQ3BCLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUNqQixHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFDbEI7QUFDQTtBQUNBLEdBQUcsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUN4QixHQUFHLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFDdEIsR0FBRyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0FBQ3hCLEdBQUcsWUFBWSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUN6QixHQUFHLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFDdkIsR0FBRyxhQUFhLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0FBQzFCLEdBQUcsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUN2QixHQUFHLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFDeEIsR0FBRztBQUNILEVBQUUsT0FBTyxFQUFFO0FBQ1gsR0FBRyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0FBQ3BCLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUNsQixHQUFHLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFDcEIsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0FBQ3JCLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUNuQixHQUFHLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFDdEIsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0FBQ25CLEdBQUcsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUNwQjtBQUNBO0FBQ0EsR0FBRyxhQUFhLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO0FBQzNCLEdBQUcsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztBQUN6QixHQUFHLGFBQWEsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7QUFDM0IsR0FBRyxjQUFjLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO0FBQzVCLEdBQUcsWUFBWSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztBQUMxQixHQUFHLGVBQWUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7QUFDN0IsR0FBRyxZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO0FBQzFCLEdBQUcsYUFBYSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztBQUMzQixHQUFHO0FBQ0gsRUFBRSxDQUFDO0FBQ0g7QUFDQTtBQUNBLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7QUFDOUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztBQUN0RCxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDO0FBQzlDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7QUFDdEQ7QUFDQSxDQUFDLEtBQUssTUFBTSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO0FBQzFELEVBQUUsS0FBSyxNQUFNLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDMUQsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUc7QUFDdkIsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvQixJQUFJLEtBQUssRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLElBQUksQ0FBQztBQUNMO0FBQ0EsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3hDO0FBQ0EsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQyxHQUFHO0FBQ0g7QUFDQSxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRTtBQUMzQyxHQUFHLEtBQUssRUFBRSxLQUFLO0FBQ2YsR0FBRyxVQUFVLEVBQUUsS0FBSztBQUNwQixHQUFHLENBQUMsQ0FBQztBQUNMLEVBQUU7QUFDRjtBQUNBLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFO0FBQ3hDLEVBQUUsS0FBSyxFQUFFLEtBQUs7QUFDZCxFQUFFLFVBQVUsRUFBRSxLQUFLO0FBQ25CLEVBQUUsQ0FBQyxDQUFDO0FBQ0o7QUFDQSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQztBQUNuQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQztBQUNyQztBQUNBLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsV0FBVyxFQUFFLENBQUM7QUFDdEMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxXQUFXLEVBQUUsQ0FBQztBQUN0QyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxHQUFHLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBQzlELENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLHNCQUFzQixDQUFDLENBQUM7QUFDOUQ7QUFDQTtBQUNBLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRTtBQUNqQyxFQUFFLFlBQVksRUFBRTtBQUNoQixHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxLQUFLO0FBQ2hDO0FBQ0E7QUFDQSxJQUFJLElBQUksR0FBRyxLQUFLLEtBQUssSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO0FBQ3pDLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFO0FBQ2xCLE1BQU0sT0FBTyxFQUFFLENBQUM7QUFDaEIsTUFBTTtBQUNOO0FBQ0EsS0FBSyxJQUFJLEdBQUcsR0FBRyxHQUFHLEVBQUU7QUFDcEIsTUFBTSxPQUFPLEdBQUcsQ0FBQztBQUNqQixNQUFNO0FBQ047QUFDQSxLQUFLLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ3JELEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTyxFQUFFO0FBQ2IsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3JDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0QyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNoQyxJQUFJO0FBQ0osR0FBRyxVQUFVLEVBQUUsS0FBSztBQUNwQixHQUFHO0FBQ0gsRUFBRSxRQUFRLEVBQUU7QUFDWixHQUFHLEtBQUssRUFBRSxHQUFHLElBQUk7QUFDakIsSUFBSSxNQUFNLE9BQU8sR0FBRyx3Q0FBd0MsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3BGLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtBQUNsQixLQUFLLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7QUFDdkM7QUFDQSxJQUFJLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7QUFDbEMsS0FBSyxXQUFXLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxJQUFJLFNBQVMsR0FBRyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUYsS0FBSztBQUNMO0FBQ0EsSUFBSSxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNyRDtBQUNBLElBQUksT0FBTztBQUNYLEtBQUssQ0FBQyxPQUFPLElBQUksRUFBRSxJQUFJLElBQUk7QUFDM0IsS0FBSyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksSUFBSTtBQUMxQixLQUFLLE9BQU8sR0FBRyxJQUFJO0FBQ25CLEtBQUssQ0FBQztBQUNOLElBQUk7QUFDSixHQUFHLFVBQVUsRUFBRSxLQUFLO0FBQ3BCLEdBQUc7QUFDSCxFQUFFLFlBQVksRUFBRTtBQUNoQixHQUFHLEtBQUssRUFBRSxHQUFHLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0QsR0FBRyxVQUFVLEVBQUUsS0FBSztBQUNwQixHQUFHO0FBQ0gsRUFBRSxDQUFDLENBQUM7QUFDSjtBQUNBLENBQUMsT0FBTyxNQUFNLENBQUM7QUFDZixDQUFDO0FBQ0Q7QUFDQTtBQUNBLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRTtBQUN6QyxDQUFDLFVBQVUsRUFBRSxJQUFJO0FBQ2pCLENBQUMsR0FBRyxFQUFFLGNBQWM7QUFDcEIsQ0FBQyxDQUFDOzs7OztBQ2pLRixNQUFNLENBQUMsY0FBYyxDQUFDLFdBQU8sRUFBRSxZQUFZLEVBQUU7QUFDN0MsRUFBRSxLQUFLLEVBQUUsSUFBSTtBQUNiLENBQUMsQ0FBQyxDQUFDO2dDQUN5QixHQUFHLHFCQUFxQjsrQkFDekIsR0FBRyxvQkFBb0I7MEJBQzVCLEdBQUcsZUFBZTtpQ0FDWCxHQUFHLHNCQUFzQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSw2QkFBNkIsR0FBRyxDQUFDLE1BQU0sRUFBRSxXQUFXLEtBQUs7QUFDL0QsRUFBRSxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNyRDtBQUNBLEVBQUUsSUFBSSxNQUFNLENBQUMscUJBQXFCLEVBQUU7QUFDcEMsSUFBSSxNQUFNLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSTtBQUMzRCxNQUFNLElBQUksTUFBTSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxVQUFVLEVBQUU7QUFDdEUsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzFCLE9BQU87QUFDUCxLQUFLLENBQUMsQ0FBQztBQUNQLEdBQUc7QUFDSDtBQUNBLEVBQUUsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDLENBQUM7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLG9CQUFvQjtBQUM3QixFQUFFLFFBQVE7QUFDVixFQUFFLE1BQU07QUFDUixFQUFFLFdBQVc7QUFDYixFQUFFLEtBQUs7QUFDUCxFQUFFLElBQUk7QUFDTixFQUFFLE9BQU87QUFDVDtBQUNBO0FBQ0EsRUFBRSxTQUFTLEdBQUcsSUFBSTtBQUNsQixFQUFFO0FBQ0YsRUFBRSxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDaEM7QUFDQSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFO0FBQ3JCLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUM7QUFDbEMsSUFBSSxNQUFNLGVBQWUsR0FBRyxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztBQUN4RDtBQUNBLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7QUFDMUIsTUFBTSxNQUFNLElBQUksR0FBRyxPQUFPO0FBQzFCLFFBQVEsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDeEIsUUFBUSxNQUFNO0FBQ2QsUUFBUSxlQUFlO0FBQ3ZCLFFBQVEsS0FBSztBQUNiLFFBQVEsSUFBSTtBQUNaLE9BQU8sQ0FBQztBQUNSLE1BQU0sTUFBTSxLQUFLLEdBQUcsT0FBTztBQUMzQixRQUFRLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLFFBQVEsTUFBTTtBQUNkLFFBQVEsZUFBZTtBQUN2QixRQUFRLEtBQUs7QUFDYixRQUFRLElBQUk7QUFDWixPQUFPLENBQUM7QUFDUixNQUFNLE1BQU0sSUFBSSxlQUFlLEdBQUcsSUFBSSxHQUFHLFNBQVMsR0FBRyxLQUFLLENBQUM7QUFDM0QsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ2hDO0FBQ0EsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRTtBQUN6QixRQUFRLE1BQU0sSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztBQUM1QyxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7QUFDOUIsUUFBUSxNQUFNLElBQUksR0FBRyxDQUFDO0FBQ3RCLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztBQUNoRCxHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLG1CQUFtQjtBQUM1QixFQUFFLFFBQVE7QUFDVixFQUFFLE1BQU07QUFDUixFQUFFLFdBQVc7QUFDYixFQUFFLEtBQUs7QUFDUCxFQUFFLElBQUk7QUFDTixFQUFFLE9BQU87QUFDVCxFQUFFO0FBQ0YsRUFBRSxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDaEM7QUFDQSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFO0FBQ3JCLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUM7QUFDbEMsSUFBSSxNQUFNLGVBQWUsR0FBRyxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztBQUN4RDtBQUNBLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7QUFDMUIsTUFBTSxNQUFNO0FBQ1osUUFBUSxlQUFlO0FBQ3ZCLFFBQVEsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDckUsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ2hDO0FBQ0EsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRTtBQUN6QixRQUFRLE1BQU0sSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztBQUM1QyxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7QUFDOUIsUUFBUSxNQUFNLElBQUksR0FBRyxDQUFDO0FBQ3RCLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztBQUNoRCxHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLGNBQWMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtBQUN6RSxFQUFFLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNsQjtBQUNBLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQ25CLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUM7QUFDbEMsSUFBSSxNQUFNLGVBQWUsR0FBRyxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztBQUN4RDtBQUNBLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDMUMsTUFBTSxNQUFNLElBQUksZUFBZSxDQUFDO0FBQ2hDO0FBQ0EsTUFBTSxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUU7QUFDckIsUUFBUSxNQUFNLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN6RSxPQUFPO0FBQ1A7QUFDQSxNQUFNLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO0FBQy9CLFFBQVEsTUFBTSxJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO0FBQzVDLE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtBQUM5QixRQUFRLE1BQU0sSUFBSSxHQUFHLENBQUM7QUFDdEIsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO0FBQ2hELEdBQUc7QUFDSDtBQUNBLEVBQUUsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMscUJBQXFCLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7QUFDL0UsRUFBRSxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxNQUFNLElBQUksR0FBRyw2QkFBNkIsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3RFO0FBQ0EsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7QUFDbkIsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQztBQUNsQyxJQUFJLE1BQU0sZUFBZSxHQUFHLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0FBQ3hEO0FBQ0EsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUMxQyxNQUFNLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQixNQUFNLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdEUsTUFBTSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzVFLE1BQU0sTUFBTSxJQUFJLGVBQWUsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQztBQUN0RDtBQUNBLE1BQU0sSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7QUFDL0IsUUFBUSxNQUFNLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7QUFDNUMsT0FBTyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO0FBQzlCLFFBQVEsTUFBTSxJQUFJLEdBQUcsQ0FBQztBQUN0QixPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0EsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7QUFDaEQsR0FBRztBQUNIO0FBQ0EsRUFBRSxPQUFPLE1BQU0sQ0FBQztBQUNoQjs7OztBQ3hMQSxNQUFNLENBQUMsY0FBYyxDQUFDQyxtQkFBTyxFQUFFLFlBQVksRUFBRTtBQUM3QyxFQUFFLEtBQUssRUFBRSxJQUFJO0FBQ2IsQ0FBQyxDQUFDLENBQUM7d0JBQ1MsZ0NBQW9CLDhCQUFrQixHQUFHLEtBQUssRUFBRTtBQUM1RDtBQUNBLElBQUlDLGNBQVksR0FBR0MsV0FBeUIsQ0FBQztBQUM3QztBQUNBLElBQUlDLFFBQU0sR0FBRyxDQUFDLFlBQVk7QUFDMUIsRUFBRSxJQUFJLE9BQU8sVUFBVSxLQUFLLFdBQVcsRUFBRTtBQUN6QyxJQUFJLE9BQU8sVUFBVSxDQUFDO0FBQ3RCLEdBQUcsTUFBTSxJQUFJLE9BQU9BLFFBQU0sS0FBSyxXQUFXLEVBQUU7QUFDNUMsSUFBSSxPQUFPQSxRQUFNLENBQUM7QUFDbEIsR0FBRyxNQUFNLElBQUksT0FBTyxJQUFJLEtBQUssV0FBVyxFQUFFO0FBQzFDLElBQUksT0FBTyxJQUFJLENBQUM7QUFDaEIsR0FBRyxNQUFNLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFO0FBQzVDLElBQUksT0FBTyxNQUFNLENBQUM7QUFDbEIsR0FBRyxNQUFNO0FBQ1QsSUFBSSxPQUFPLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO0FBQ3JDLEdBQUc7QUFDSCxDQUFDLEdBQUcsQ0FBQztBQUNMO0FBQ0EsSUFBSUMsUUFBTSxHQUFHRCxRQUFNLENBQUMsMEJBQTBCLENBQUMsSUFBSUEsUUFBTSxDQUFDLE1BQU0sQ0FBQztBQUNqRSxNQUFNLGlCQUFpQjtBQUN2QixFQUFFLE9BQU9DLFFBQU0sS0FBSyxVQUFVLElBQUlBLFFBQU0sQ0FBQyxHQUFHO0FBQzVDLE1BQU1BLFFBQU0sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUM7QUFDMUMsTUFBTSxRQUFRLENBQUM7QUFDZixNQUFNQyxPQUFLLEdBQUcsR0FBRyxDQUFDO0FBQ2xCO0FBQ0EsTUFBTUMsV0FBUyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEtBQUs7QUFDdEUsRUFBRSxNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDdkM7QUFDQSxFQUFFO0FBQ0YsSUFBSSxhQUFhLEtBQUssaUJBQWlCO0FBQ3ZDLElBQUksYUFBYSxLQUFLLG9CQUFvQjtBQUMxQyxJQUFJO0FBQ0osSUFBSSxJQUFJLEVBQUUsS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUU7QUFDbkMsTUFBTSxPQUFPLEdBQUcsR0FBRyxhQUFhLEdBQUcsR0FBRyxDQUFDO0FBQ3ZDLEtBQUs7QUFDTDtBQUNBLElBQUk7QUFDSixNQUFNLGFBQWE7QUFDbkIsTUFBTUQsT0FBSztBQUNYLE1BQU0sR0FBRztBQUNULE1BQU0sSUFBSUosY0FBWSxDQUFDLGNBQWM7QUFDckMsUUFBUSxHQUFHLENBQUMsTUFBTTtBQUNsQixRQUFRLE1BQU07QUFDZCxRQUFRLFdBQVc7QUFDbkIsUUFBUSxLQUFLO0FBQ2IsUUFBUSxJQUFJO0FBQ1osUUFBUSxPQUFPO0FBQ2YsT0FBTztBQUNQLE1BQU0sR0FBRztBQUNULE1BQU07QUFDTixHQUFHO0FBQ0g7QUFDQSxFQUFFO0FBQ0YsSUFBSSxhQUFhLEtBQUssa0JBQWtCO0FBQ3hDLElBQUksYUFBYSxLQUFLLHFCQUFxQjtBQUMzQyxJQUFJO0FBQ0osSUFBSSxJQUFJLEVBQUUsS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUU7QUFDbkMsTUFBTSxPQUFPLEdBQUcsR0FBRyxhQUFhLEdBQUcsR0FBRyxDQUFDO0FBQ3ZDLEtBQUs7QUFDTDtBQUNBLElBQUk7QUFDSixNQUFNLGFBQWE7QUFDbkIsTUFBTUksT0FBSztBQUNYLE1BQU0sR0FBRztBQUNULE1BQU0sSUFBSUosY0FBWSxDQUFDLHFCQUFxQjtBQUM1QyxRQUFRLEdBQUcsQ0FBQyxNQUFNO0FBQ2xCLFFBQVEsTUFBTTtBQUNkLFFBQVEsV0FBVztBQUNuQixRQUFRLEtBQUs7QUFDYixRQUFRLElBQUk7QUFDWixRQUFRLE9BQU87QUFDZixPQUFPO0FBQ1AsTUFBTSxHQUFHO0FBQ1QsTUFBTTtBQUNOLEdBQUc7QUFDSDtBQUNBLEVBQUU7QUFDRixJQUFJLGFBQWEsS0FBSyxnQkFBZ0I7QUFDdEMsSUFBSSxhQUFhLEtBQUssbUJBQW1CO0FBQ3pDLElBQUk7QUFDSixJQUFJO0FBQ0osTUFBTSxhQUFhO0FBQ25CLE1BQU1JLE9BQUs7QUFDWCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQztBQUMzRCxNQUFNO0FBQ04sR0FBRztBQUNIO0FBQ0EsRUFBRTtBQUNGLElBQUksYUFBYSxLQUFLLGtCQUFrQjtBQUN4QyxJQUFJLGFBQWEsS0FBSyxxQkFBcUI7QUFDM0MsSUFBSTtBQUNKLElBQUk7QUFDSixNQUFNLGFBQWE7QUFDbkIsTUFBTUEsT0FBSztBQUNYLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDO0FBQzNELE1BQU07QUFDTixHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sR0FBRyxDQUFDLG1CQUFtQixFQUFFLENBQUM7QUFDbkMsQ0FBQyxDQUFDO0FBQ0Y7NkJBQ2lCLEdBQUdDLFlBQVU7QUFDOUI7QUFDQSxNQUFNUCxNQUFJLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsUUFBUSxLQUFLLGlCQUFpQixDQUFDO0FBQzlEO3dCQUNZLEdBQUdBLE1BQUksQ0FBQztBQUNwQixNQUFNUSxRQUFNLEdBQUc7QUFDZixhQUFFRCxXQUFTO0FBQ1gsUUFBRVAsTUFBSTtBQUNOLENBQUMsQ0FBQztBQUNGLElBQUlTLFVBQVEsR0FBR0QsUUFBTSxDQUFDOzJCQUNQLEdBQUdDOzs7O0lDbEhsQixTQUFjLEdBQUcsQ0FBQyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUs7QUFDL0MsQ0FBQyxNQUFNLE9BQU8sR0FBRztBQUNqQixFQUFFLDhIQUE4SDtBQUNoSSxFQUFFLDBEQUEwRDtBQUM1RCxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2I7QUFDQSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLFNBQVMsR0FBRyxTQUFTLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDekQsQ0FBQzs7QUNQRCxNQUFNLENBQUMsY0FBYyxDQUFDLFdBQU8sRUFBRSxZQUFZLEVBQUU7QUFDN0MsRUFBRSxLQUFLLEVBQUUsSUFBSTtBQUNiLENBQUMsQ0FBQyxDQUFDO2dCQUNTLHdCQUFvQixzQkFBa0IsR0FBRyxLQUFLLEVBQUU7QUFDNUQ7QUFDQSxJQUFJLFVBQVUsR0FBR0Msd0JBQXNCLENBQUNQLFNBQXFCLENBQUMsQ0FBQztBQUMvRDtBQUNBLElBQUlRLGFBQVcsR0FBR0Qsd0JBQXNCLENBQUNFLGtCQUFzQixDQUFDLENBQUM7QUFDakU7QUFDQSxTQUFTRix3QkFBc0IsQ0FBQyxHQUFHLEVBQUU7QUFDckMsRUFBRSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsVUFBVSxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLG1CQUFtQixHQUFHLElBQUk7QUFDaEMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksVUFBVSxDQUFDLE9BQU8sR0FBRyxFQUFFLEtBQUssSUFBSTtBQUNuRCxJQUFJLFFBQVEsS0FBSztBQUNqQixNQUFNLEtBQUtDLGFBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztBQUN6QyxNQUFNLEtBQUtBLGFBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztBQUMzQyxNQUFNLEtBQUtBLGFBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztBQUMxQyxNQUFNLEtBQUtBLGFBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztBQUMxQyxNQUFNLEtBQUtBLGFBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztBQUMzQyxNQUFNLEtBQUtBLGFBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztBQUM1QyxNQUFNLEtBQUtBLGFBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztBQUMzQyxNQUFNLEtBQUtBLGFBQVcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztBQUM3QyxNQUFNLEtBQUtBLGFBQVcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztBQUM5QyxNQUFNLEtBQUtBLGFBQVcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztBQUM3QyxNQUFNLEtBQUtBLGFBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztBQUN6QyxNQUFNLEtBQUtBLGFBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztBQUMxQyxNQUFNLEtBQUtBLGFBQVcsQ0FBQyxPQUFPLENBQUMs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
|