@aws-cdk/integ-runner 2.185.0-alpha.0 → 2.186.1
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 +2 -1
- package/THIRD_PARTY_LICENSES +1 -1
- package/bin/integ-runner +3 -1
- package/lib/cli.js +4 -5
- package/lib/index.js +66 -66
- package/lib/logger.js +1 -1
- package/lib/recommended-feature-flags.json +2 -1
- package/lib/runner/integ-test-runner.d.ts +3 -2
- package/lib/runner/integ-test-runner.js +33 -42
- package/lib/runner/integ-test-suite.d.ts +2 -2
- package/lib/runner/integ-test-suite.js +5 -6
- package/lib/runner/integration-tests.js +5 -7
- package/lib/runner/private/cloud-assembly.d.ts +1 -1
- package/lib/runner/private/cloud-assembly.js +13 -21
- package/lib/runner/private/integ-manifest.d.ts +1 -1
- package/lib/runner/private/integ-manifest.js +2 -3
- package/lib/runner/runner-base.d.ts +5 -4
- package/lib/runner/runner-base.js +9 -15
- package/lib/runner/snapshot-test-runner.d.ts +3 -2
- package/lib/runner/snapshot-test-runner.js +9 -13
- package/lib/utils.js +4 -6
- package/lib/workers/common.d.ts +2 -2
- package/lib/workers/common.js +2 -3
- package/lib/workers/extract/extract_worker.d.ts +4 -4
- package/lib/workers/extract/extract_worker.js +5 -7
- package/lib/workers/extract/index.js +4810 -9448
- package/lib/workers/integ-snapshot-worker.d.ts +3 -3
- package/lib/workers/integ-snapshot-worker.js +1 -1
- package/lib/workers/integ-test-worker.d.ts +2 -2
- package/lib/workers/integ-test-worker.js +2 -2
- package/lib/workers/integ-watch-worker.d.ts +2 -2
- package/lib/workers/integ-watch-worker.js +1 -1
- package/package.json +69 -84
- package/bin/integ-runner.d.ts +0 -1
- package/bin/integ-runner.js +0 -5
- package/build-tools/generate.sh +0 -6
|
@@ -91,14 +91,12 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
91
91
|
* This is meant to be run on a single test and will not create a snapshot
|
|
92
92
|
*/
|
|
93
93
|
async watchIntegTest(options) {
|
|
94
|
-
var _a, _b;
|
|
95
94
|
const actualTestCase = this.actualTestSuite.testSuite[options.testCaseName];
|
|
96
95
|
if (!actualTestCase) {
|
|
97
96
|
throw new Error(`Did not find test case name '${options.testCaseName}' in '${Object.keys(this.actualTestSuite.testSuite)}'`);
|
|
98
97
|
}
|
|
99
98
|
const enableForVerbosityLevel = (needed = 1) => {
|
|
100
|
-
|
|
101
|
-
const verbosity = (_a = options.verbosity) !== null && _a !== void 0 ? _a : 0;
|
|
99
|
+
const verbosity = options.verbosity ?? 0;
|
|
102
100
|
return (verbosity >= needed) ? true : undefined;
|
|
103
101
|
};
|
|
104
102
|
try {
|
|
@@ -109,11 +107,11 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
109
107
|
deploymentMethod: 'direct',
|
|
110
108
|
profile: this.profile,
|
|
111
109
|
requireApproval: cloud_assembly_schema_1.RequireApproval.NEVER,
|
|
112
|
-
traceLogs:
|
|
110
|
+
traceLogs: enableForVerbosityLevel(2) ?? false,
|
|
113
111
|
verbose: enableForVerbosityLevel(3),
|
|
114
112
|
debug: enableForVerbosityLevel(4),
|
|
115
113
|
watch: true,
|
|
116
|
-
}, options.testCaseName,
|
|
114
|
+
}, options.testCaseName, options.verbosity ?? 0);
|
|
117
115
|
}
|
|
118
116
|
catch (e) {
|
|
119
117
|
throw e;
|
|
@@ -131,22 +129,20 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
131
129
|
* a failure to an existing stack, but not for a newly created stack.
|
|
132
130
|
*/
|
|
133
131
|
runIntegTestCase(options) {
|
|
134
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
|
|
135
132
|
let assertionResults;
|
|
136
133
|
const actualTestCase = this.actualTestSuite.testSuite[options.testCaseName];
|
|
137
134
|
if (!actualTestCase) {
|
|
138
135
|
throw new Error(`Did not find test case name '${options.testCaseName}' in '${Object.keys(this.actualTestSuite.testSuite)}'`);
|
|
139
136
|
}
|
|
140
|
-
const clean =
|
|
141
|
-
const updateWorkflowEnabled = (
|
|
142
|
-
&& (
|
|
137
|
+
const clean = options.clean ?? true;
|
|
138
|
+
const updateWorkflowEnabled = (options.updateWorkflow ?? true)
|
|
139
|
+
&& (actualTestCase.stackUpdateWorkflow ?? true);
|
|
143
140
|
const enableForVerbosityLevel = (needed = 1) => {
|
|
144
|
-
|
|
145
|
-
const verbosity = (_a = options.verbosity) !== null && _a !== void 0 ? _a : 0;
|
|
141
|
+
const verbosity = options.verbosity ?? 0;
|
|
146
142
|
return (verbosity >= needed) ? true : undefined;
|
|
147
143
|
};
|
|
148
144
|
try {
|
|
149
|
-
if (!options.dryRun && (
|
|
145
|
+
if (!options.dryRun && (actualTestCase.cdkCommandOptions?.deploy?.enabled ?? true)) {
|
|
150
146
|
assertionResults = this.deploy({
|
|
151
147
|
...this.defaultArgs,
|
|
152
148
|
profile: this.profile,
|
|
@@ -179,7 +175,7 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
179
175
|
}
|
|
180
176
|
finally {
|
|
181
177
|
if (!options.dryRun) {
|
|
182
|
-
if (clean && (
|
|
178
|
+
if (clean && (actualTestCase.cdkCommandOptions?.destroy?.enabled ?? true)) {
|
|
183
179
|
this.destroy(options.testCaseName, {
|
|
184
180
|
...this.defaultArgs,
|
|
185
181
|
profile: this.profile,
|
|
@@ -187,8 +183,8 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
187
183
|
force: true,
|
|
188
184
|
app: this.cdkApp,
|
|
189
185
|
output: path.relative(this.directory, this.cdkOutDir),
|
|
190
|
-
...
|
|
191
|
-
context: this.getContext(
|
|
186
|
+
...actualTestCase.cdkCommandOptions?.destroy?.args,
|
|
187
|
+
context: this.getContext(actualTestCase.cdkCommandOptions?.destroy?.args?.context),
|
|
192
188
|
verbose: enableForVerbosityLevel(3),
|
|
193
189
|
debug: enableForVerbosityLevel(4),
|
|
194
190
|
});
|
|
@@ -202,10 +198,9 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
202
198
|
* Perform a integ test case stack destruction
|
|
203
199
|
*/
|
|
204
200
|
destroy(testCaseName, destroyArgs) {
|
|
205
|
-
var _a, _b, _c, _d, _e, _f, _g;
|
|
206
201
|
const actualTestCase = this.actualTestSuite.testSuite[testCaseName];
|
|
207
202
|
try {
|
|
208
|
-
if (
|
|
203
|
+
if (actualTestCase.hooks?.preDestroy) {
|
|
209
204
|
actualTestCase.hooks.preDestroy.forEach(cmd => {
|
|
210
205
|
(0, utils_1.exec)((0, utils_1.chunks)(cmd), {
|
|
211
206
|
cwd: path.dirname(this.snapshotDir),
|
|
@@ -215,7 +210,7 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
215
210
|
this.cdk.destroy({
|
|
216
211
|
...destroyArgs,
|
|
217
212
|
});
|
|
218
|
-
if (
|
|
213
|
+
if (actualTestCase.hooks?.postDestroy) {
|
|
219
214
|
actualTestCase.hooks.postDestroy.forEach(cmd => {
|
|
220
215
|
(0, utils_1.exec)((0, utils_1.chunks)(cmd), {
|
|
221
216
|
cwd: path.dirname(this.snapshotDir),
|
|
@@ -224,13 +219,12 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
224
219
|
}
|
|
225
220
|
}
|
|
226
221
|
catch (e) {
|
|
227
|
-
this.parseError(e,
|
|
222
|
+
this.parseError(e, actualTestCase.cdkCommandOptions?.destroy?.expectError ?? false, actualTestCase.cdkCommandOptions?.destroy?.expectedMessage);
|
|
228
223
|
}
|
|
229
224
|
}
|
|
230
225
|
async watch(watchArgs, testCaseName, verbosity) {
|
|
231
|
-
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
232
226
|
const actualTestCase = this.actualTestSuite.testSuite[testCaseName];
|
|
233
|
-
if (
|
|
227
|
+
if (actualTestCase.hooks?.preDeploy) {
|
|
234
228
|
actualTestCase.hooks.preDeploy.forEach(cmd => {
|
|
235
229
|
(0, utils_1.exec)((0, utils_1.chunks)(cmd), {
|
|
236
230
|
cwd: path.dirname(this.snapshotDir),
|
|
@@ -246,9 +240,9 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
246
240
|
],
|
|
247
241
|
output: path.relative(this.directory, this.cdkOutDir),
|
|
248
242
|
outputsFile: path.relative(this.directory, path.join(this.cdkOutDir, 'assertion-results.json')),
|
|
249
|
-
...
|
|
243
|
+
...actualTestCase?.cdkCommandOptions?.deploy?.args,
|
|
250
244
|
context: {
|
|
251
|
-
...this.getContext(
|
|
245
|
+
...this.getContext(actualTestCase?.cdkCommandOptions?.deploy?.args?.context),
|
|
252
246
|
},
|
|
253
247
|
app: this.cdkApp,
|
|
254
248
|
};
|
|
@@ -289,12 +283,11 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
289
283
|
cwd: this.directory,
|
|
290
284
|
});
|
|
291
285
|
watcher.on('all', (event, file) => {
|
|
292
|
-
var _a;
|
|
293
286
|
// we only care about changes to the `assertion-results.json` file. If there
|
|
294
287
|
// are assertions then this will change on every deployment
|
|
295
288
|
if (assertionResults.endsWith(file) && (event === 'add' || event === 'change')) {
|
|
296
289
|
const start = Date.now();
|
|
297
|
-
if (
|
|
290
|
+
if (actualTestCase.hooks?.postDeploy) {
|
|
298
291
|
actualTestCase.hooks.postDeploy.forEach(cmd => {
|
|
299
292
|
(0, utils_1.exec)((0, utils_1.chunks)(cmd), {
|
|
300
293
|
cwd: path.dirname(this.snapshotDir),
|
|
@@ -332,23 +325,22 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
332
325
|
});
|
|
333
326
|
const child = this.cdk.watch(deployArgs);
|
|
334
327
|
// if `-v` (or above) is passed then stream the logs
|
|
335
|
-
|
|
328
|
+
child.stdout?.on('data', (message) => {
|
|
336
329
|
if (verbosity > 0) {
|
|
337
330
|
process.stdout.write(message);
|
|
338
331
|
}
|
|
339
332
|
});
|
|
340
|
-
|
|
333
|
+
child.stderr?.on('data', (message) => {
|
|
341
334
|
if (verbosity > 0) {
|
|
342
335
|
process.stderr.write(message);
|
|
343
336
|
}
|
|
344
337
|
});
|
|
345
338
|
await new Promise(resolve => {
|
|
346
339
|
child.on('close', async (code) => {
|
|
347
|
-
var _a;
|
|
348
340
|
if (code !== 0) {
|
|
349
341
|
throw new Error('Watch exited with error');
|
|
350
342
|
}
|
|
351
|
-
|
|
343
|
+
child.stdin?.end();
|
|
352
344
|
await watcher.close();
|
|
353
345
|
resolve(code);
|
|
354
346
|
});
|
|
@@ -359,10 +351,9 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
359
351
|
* peforming the update workflow
|
|
360
352
|
*/
|
|
361
353
|
deploy(deployArgs, updateWorkflowEnabled, testCaseName) {
|
|
362
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z;
|
|
363
354
|
const actualTestCase = this.actualTestSuite.testSuite[testCaseName];
|
|
364
355
|
try {
|
|
365
|
-
if (
|
|
356
|
+
if (actualTestCase.hooks?.preDeploy) {
|
|
366
357
|
actualTestCase.hooks.preDeploy.forEach(cmd => {
|
|
367
358
|
(0, utils_1.exec)((0, utils_1.chunks)(cmd), {
|
|
368
359
|
cwd: path.dirname(this.snapshotDir),
|
|
@@ -376,17 +367,17 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
376
367
|
// We also only want to run the update workflow if there is an existing
|
|
377
368
|
// snapshot (otherwise there is nothing to update)
|
|
378
369
|
if (updateWorkflowEnabled && this.hasSnapshot() &&
|
|
379
|
-
(this.expectedTestSuite && testCaseName in
|
|
370
|
+
(this.expectedTestSuite && testCaseName in this.expectedTestSuite?.testSuite)) {
|
|
380
371
|
// make sure the snapshot is the latest from 'origin'
|
|
381
372
|
this.checkoutSnapshot();
|
|
382
373
|
const expectedTestCase = this.expectedTestSuite.testSuite[testCaseName];
|
|
383
374
|
this.cdk.deploy({
|
|
384
375
|
...deployArgs,
|
|
385
376
|
stacks: expectedTestCase.stacks,
|
|
386
|
-
...
|
|
387
|
-
context: this.getContext(
|
|
377
|
+
...expectedTestCase?.cdkCommandOptions?.deploy?.args,
|
|
378
|
+
context: this.getContext(expectedTestCase?.cdkCommandOptions?.deploy?.args?.context),
|
|
388
379
|
app: path.relative(this.directory, this.snapshotDir),
|
|
389
|
-
lookups:
|
|
380
|
+
lookups: this.expectedTestSuite?.enableLookups,
|
|
390
381
|
});
|
|
391
382
|
}
|
|
392
383
|
// now deploy the "actual" test.
|
|
@@ -397,8 +388,8 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
397
388
|
...actualTestCase.stacks,
|
|
398
389
|
],
|
|
399
390
|
output: path.relative(this.directory, this.cdkOutDir),
|
|
400
|
-
...
|
|
401
|
-
context: this.getContext(
|
|
391
|
+
...actualTestCase?.cdkCommandOptions?.deploy?.args,
|
|
392
|
+
context: this.getContext(actualTestCase?.cdkCommandOptions?.deploy?.args?.context),
|
|
402
393
|
app: this.cdkApp,
|
|
403
394
|
});
|
|
404
395
|
// If there are any assertions
|
|
@@ -416,13 +407,13 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
416
407
|
],
|
|
417
408
|
rollback: false,
|
|
418
409
|
output: path.relative(this.directory, this.cdkOutDir),
|
|
419
|
-
...
|
|
410
|
+
...actualTestCase?.cdkCommandOptions?.deploy?.args,
|
|
420
411
|
outputsFile: path.relative(this.directory, path.join(this.cdkOutDir, 'assertion-results.json')),
|
|
421
|
-
context: this.getContext(
|
|
412
|
+
context: this.getContext(actualTestCase?.cdkCommandOptions?.deploy?.args?.context),
|
|
422
413
|
app: this.cdkApp,
|
|
423
414
|
});
|
|
424
415
|
}
|
|
425
|
-
if (
|
|
416
|
+
if (actualTestCase.hooks?.postDeploy) {
|
|
426
417
|
actualTestCase.hooks.postDeploy.forEach(cmd => {
|
|
427
418
|
(0, utils_1.exec)((0, utils_1.chunks)(cmd), {
|
|
428
419
|
cwd: path.dirname(this.snapshotDir),
|
|
@@ -434,7 +425,7 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
434
425
|
}
|
|
435
426
|
}
|
|
436
427
|
catch (e) {
|
|
437
|
-
this.parseError(e,
|
|
428
|
+
this.parseError(e, actualTestCase.cdkCommandOptions?.deploy?.expectError ?? false, actualTestCase.cdkCommandOptions?.deploy?.expectedMessage);
|
|
438
429
|
}
|
|
439
430
|
return;
|
|
440
431
|
}
|
|
@@ -493,4 +484,4 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
493
484
|
}
|
|
494
485
|
}
|
|
495
486
|
exports.IntegTestRunner = IntegTestRunner;
|
|
496
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWctdGVzdC1ydW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbnRlZy10ZXN0LXJ1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBNkI7QUFDN0IsOERBQTZHO0FBQzdHLDBFQUFpRTtBQUNqRSxxQ0FBcUM7QUFDckMsK0JBQStCO0FBQy9CLHlDQUF5QztBQUN6QywrQ0FBdUY7QUFDdkYsb0NBQW9DO0FBQ3BDLG9DQUF3QztBQUN4Qyw4Q0FBbUk7QUF3RG5JOzs7R0FHRztBQUNILE1BQWEsZUFBZ0IsU0FBUSx5QkFBVztJQUM5QyxZQUFZLE9BQTJCLEVBQUUsa0JBQXdDO1FBQy9FLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxrQkFBa0IsQ0FBQztRQUU5QyxzREFBc0Q7UUFDdEQsMERBQTBEO1FBQzFELDREQUE0RDtRQUM1RCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUM3QyxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEscURBQXFEO2dCQUNuRix5QkFBeUI7Z0JBQ3pCLGdGQUFnRixDQUNqRixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFTSxvQkFBb0I7UUFDekIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7WUFDeEMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ25ELEtBQUssRUFBRSxFQUFHO2FBQ1gsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSyxnQkFBZ0I7UUFDdEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUUzQiwwQ0FBMEM7UUFDMUMsSUFBSSxVQUFVLEdBQXVCLFNBQVMsQ0FBQztRQUMvQyx1RUFBdUU7UUFDdkUsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQVcsSUFBQSxZQUFJLEVBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsRUFBRTtnQkFDL0QsR0FBRzthQUNKLENBQUMsQ0FBQztZQUNILE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkMsS0FBSyxNQUFNLElBQUksSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7b0JBQzVDLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyRCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQ3JCLHdDQUF3QyxFQUN4Qyx3REFBd0QsSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDMUUsK0RBQStELENBQ2hFLENBQUM7WUFDRixNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBRUQsa0ZBQWtGO1FBQ2xGLDhDQUE4QztRQUM5QyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRTVFLElBQUksQ0FBQztnQkFDSCxNQUFNLElBQUksR0FBRyxJQUFBLFlBQUksRUFBQyxDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxFQUFFO29CQUMzRCxHQUFHO2lCQUNKLENBQUMsQ0FBQztnQkFDSCxJQUFBLFlBQUksRUFBQyxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxFQUFFO29CQUN6RCxHQUFHO2lCQUNKLENBQUMsQ0FBQztZQUNMLENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNYLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUNyQiwwQ0FBMEMsSUFBSSxDQUFDLFdBQVcsNkRBQTZELEVBQ3ZILHNDQUFzQyxVQUFVLFFBQVEsbUJBQW1CLEVBQUUsRUFDN0UsRUFBRSxDQUNILENBQUM7Z0JBQ0YsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDakMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBcUI7O1FBQy9DLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsT0FBTyxDQUFDLFlBQVksU0FBUyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9ILENBQUM7UUFDRCxNQUFNLHVCQUF1QixHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxFQUFFOztZQUM3QyxNQUFNLFNBQVMsR0FBRyxNQUFBLE9BQU8sQ0FBQyxTQUFTLG1DQUFJLENBQUMsQ0FBQztZQUN6QyxPQUFPLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNsRCxDQUFDLENBQUM7UUFDRixJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxLQUFLLENBQ2Q7Z0JBQ0UsR0FBRyxJQUFJLENBQUMsV0FBVztnQkFDbkIsUUFBUSxFQUFFLHVDQUFxQixDQUFDLEdBQUc7Z0JBQ25DLE9BQU8sRUFBRSw2QkFBVyxDQUFDLFNBQVM7Z0JBQzlCLGdCQUFnQixFQUFFLFFBQVE7Z0JBQzFCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDckIsZUFBZSxFQUFFLHVDQUFlLENBQUMsS0FBSztnQkFDdEMsU0FBUyxFQUFFLE1BQUEsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLG1DQUFJLEtBQUs7Z0JBQzlDLE9BQU8sRUFBRSx1QkFBdUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ25DLEtBQUssRUFBRSx1QkFBdUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pDLEtBQUssRUFBRSxJQUFJO2FBQ1osRUFDRCxPQUFPLENBQUMsWUFBWSxFQUNwQixNQUFBLE9BQU8sQ0FBQyxTQUFTLG1DQUFJLENBQUMsQ0FDdkIsQ0FBQztRQUNKLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsTUFBTSxDQUFDLENBQUM7UUFDVixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSSxnQkFBZ0IsQ0FBQyxPQUFtQjs7UUFDekMsSUFBSSxnQkFBOEMsQ0FBQztRQUNuRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLE9BQU8sQ0FBQyxZQUFZLFNBQVMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvSCxDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsTUFBQSxPQUFPLENBQUMsS0FBSyxtQ0FBSSxJQUFJLENBQUM7UUFDcEMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLE1BQUEsT0FBTyxDQUFDLGNBQWMsbUNBQUksSUFBSSxDQUFDO2VBQ3pELENBQUMsTUFBQSxjQUFjLENBQUMsbUJBQW1CLG1DQUFJLElBQUksQ0FBQyxDQUFDO1FBQ2xELE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLEVBQUU7O1lBQzdDLE1BQU0sU0FBUyxHQUFHLE1BQUEsT0FBTyxDQUFDLFNBQVMsbUNBQUksQ0FBQyxDQUFDO1lBQ3pDLE9BQU8sQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2xELENBQUMsQ0FBQztRQUVGLElBQUksQ0FBQztZQUNILElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBQSxNQUFBLE1BQUEsY0FBYyxDQUFDLGlCQUFpQiwwQ0FBRSxNQUFNLDBDQUFFLE9BQU8sbUNBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDbkYsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FDNUI7b0JBQ0UsR0FBRyxJQUFJLENBQUMsV0FBVztvQkFDbkIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO29CQUNyQixlQUFlLEVBQUUsdUNBQWUsQ0FBQyxLQUFLO29CQUN0QyxPQUFPLEVBQUUsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO29CQUNuQyxLQUFLLEVBQUUsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO2lCQUNsQyxFQUNELHFCQUFxQixFQUNyQixPQUFPLENBQUMsWUFBWSxDQUNyQixDQUFDO1lBQ0osQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sR0FBRyxHQUF3QjtvQkFDL0IsR0FBRyxtQ0FBcUIsQ0FBQyxHQUFHO29CQUM1QixnQkFBZ0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7d0JBQy9DLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLG1DQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtxQkFDM0UsQ0FBQyxDQUFDO2lCQUNKLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7b0JBQ2pCLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7b0JBQy9CLEdBQUc7b0JBQ0gsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO2lCQUN0RCxDQUFDLENBQUM7WUFDTCxDQUFDO1lBQ0Qsb0VBQW9FO1lBQ3BFLHFCQUFxQjtZQUNyQixJQUFJLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUNuRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsTUFBTSxDQUFDLENBQUM7UUFDVixDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNwQixJQUFJLEtBQUssSUFBSSxDQUFDLE1BQUEsTUFBQSxNQUFBLGNBQWMsQ0FBQyxpQkFBaUIsMENBQUUsT0FBTywwQ0FBRSxPQUFPLG1DQUFJLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQzFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTt3QkFDakMsR0FBRyxJQUFJLENBQUMsV0FBVzt3QkFDbkIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO3dCQUNyQixHQUFHLEVBQUUsSUFBSTt3QkFDVCxLQUFLLEVBQUUsSUFBSTt3QkFDWCxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU07d0JBQ2hCLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQzt3QkFDckQsR0FBRyxNQUFBLE1BQUEsY0FBYyxDQUFDLGlCQUFpQiwwQ0FBRSxPQUFPLDBDQUFFLElBQUk7d0JBQ2xELE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQUEsTUFBQSxNQUFBLGNBQWMsQ0FBQyxpQkFBaUIsMENBQUUsT0FBTywwQ0FBRSxJQUFJLDBDQUFFLE9BQU8sQ0FBQzt3QkFDbEYsT0FBTyxFQUFFLHVCQUF1QixDQUFDLENBQUMsQ0FBQzt3QkFDbkMsS0FBSyxFQUFFLHVCQUF1QixDQUFDLENBQUMsQ0FBQztxQkFDbEMsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDO1lBQ0QsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2pCLENBQUM7UUFDRCxPQUFPLGdCQUFnQixDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNLLE9BQU8sQ0FBQyxZQUFvQixFQUFFLFdBQTJCOztRQUMvRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUM7WUFDSCxJQUFJLE1BQUEsY0FBYyxDQUFDLEtBQUssMENBQUUsVUFBVSxFQUFFLENBQUM7Z0JBQ3JDLGNBQWMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDNUMsSUFBQSxZQUFJLEVBQUMsSUFBQSxjQUFNLEVBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQ2hCLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7cUJBQ3BDLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7WUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztnQkFDZixHQUFHLFdBQVc7YUFDZixDQUFDLENBQUM7WUFFSCxJQUFJLE1BQUEsY0FBYyxDQUFDLEtBQUssMENBQUUsV0FBVyxFQUFFLENBQUM7Z0JBQ3RDLGNBQWMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDN0MsSUFBQSxZQUFJLEVBQUMsSUFBQSxjQUFNLEVBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQ2hCLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7cUJBQ3BDLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUNmLE1BQUEsTUFBQSxNQUFBLGNBQWMsQ0FBQyxpQkFBaUIsMENBQUUsT0FBTywwQ0FBRSxXQUFXLG1DQUFJLEtBQUssRUFDL0QsTUFBQSxNQUFBLGNBQWMsQ0FBQyxpQkFBaUIsMENBQUUsT0FBTywwQ0FBRSxlQUFlLENBQzNELENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVPLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBd0IsRUFBRSxZQUFvQixFQUFFLFNBQWlCOztRQUNuRixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNwRSxJQUFJLE1BQUEsY0FBYyxDQUFDLEtBQUssMENBQUUsU0FBUyxFQUFFLENBQUM7WUFDcEMsY0FBYyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUMzQyxJQUFBLFlBQUksRUFBQyxJQUFBLGNBQU0sRUFBQyxHQUFHLENBQUMsRUFBRTtvQkFDaEIsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztpQkFDcEMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsTUFBTSxVQUFVLEdBQUc7WUFDakIsR0FBRyxTQUFTO1lBQ1osT0FBTyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYTtZQUMzQyxNQUFNLEVBQUU7Z0JBQ04sR0FBRyxjQUFjLENBQUMsTUFBTTtnQkFDeEIsR0FBRyxjQUFjLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTthQUN4RTtZQUNELE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNyRCxXQUFXLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO1lBQy9GLEdBQUcsTUFBQSxNQUFBLGNBQWMsYUFBZCxjQUFjLHVCQUFkLGNBQWMsQ0FBRSxpQkFBaUIsMENBQUUsTUFBTSwwQ0FBRSxJQUFJO1lBQ2xELE9BQU8sRUFBRTtnQkFDUCxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBQSxNQUFBLE1BQUEsY0FBYyxhQUFkLGNBQWMsdUJBQWQsY0FBYyxDQUFFLGlCQUFpQiwwQ0FBRSxNQUFNLDBDQUFFLElBQUksMENBQUUsT0FBTyxDQUFDO2FBQzdFO1lBQ0QsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNO1NBQ2pCLENBQUM7UUFDRixNQUFNLGNBQWMsR0FBRztZQUNyQixrQkFBa0IsRUFBRTtnQkFDbEIsa0VBQWtFO2dCQUNsRSxLQUFLO29CQUNILEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQ3pFLGFBQWE7b0JBQ2IsT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFHO29CQUNyQixVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7b0JBQzNCLGFBQWEsVUFBVSxDQUFDLE9BQU8sRUFBRTtpQkFDbEMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7YUFDZDtTQUNGLENBQUM7UUFDRixVQUFVLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3RDLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RCLHdFQUF3RTtZQUN4RSxnREFBZ0Q7WUFDaEQsVUFBVSxDQUFDLFVBQVUsQ0FBQztnQkFDcEIsa0JBQWtCLEVBQUU7b0JBQ2xCLFFBQVE7b0JBQ1IsS0FBSzt3QkFDSCxXQUFXO3dCQUNYLE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRzt3QkFDckIsT0FBTyxJQUFJLENBQUMsU0FBUyxHQUFHO3dCQUN4QixHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7d0JBQ3pHLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQzt3QkFDM0Isa0JBQWtCLFVBQVUsQ0FBQyxXQUFXLEVBQUU7d0JBQzFDLGFBQWEsVUFBVSxDQUFDLE9BQU8sRUFBRTt3QkFDakMsb0JBQW9CO3FCQUNyQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtpQkFDZDthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO1FBQzdFLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDL0MsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTO1NBQ3BCLENBQUMsQ0FBQztRQUNILE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBdUIsRUFBRSxJQUFZLEVBQUUsRUFBRTs7WUFDMUQsNEVBQTRFO1lBQzVFLDJEQUEyRDtZQUMzRCxJQUFJLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxLQUFLLElBQUksS0FBSyxLQUFLLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQy9FLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxNQUFBLGNBQWMsQ0FBQyxLQUFLLDBDQUFFLFVBQVUsRUFBRSxDQUFDO29CQUNyQyxjQUFjLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQzVDLElBQUEsWUFBSSxFQUFDLElBQUEsY0FBTSxFQUFDLEdBQUcsQ0FBQyxFQUFFOzRCQUNoQixHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO3lCQUNwQyxDQUFDLENBQUM7b0JBQ0wsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztnQkFFRCxJQUFJLGNBQWMsQ0FBQyxjQUFjLElBQUksY0FBYyxDQUFDLGtCQUFrQixFQUFFLENBQUM7b0JBQ3ZFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FDdEMsZ0JBQWdCLEVBQ2hCLGNBQWMsQ0FBQyxrQkFBa0IsRUFDakMsY0FBYyxDQUFDLGNBQWMsQ0FDOUIsQ0FBQztvQkFDRixJQUFJLEdBQUcsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLEVBQUUsQ0FBQzt3QkFDN0QsVUFBVSxDQUFDLFVBQVUsQ0FBQzs0QkFDcEIsTUFBTSxFQUFFLHlCQUFnQixDQUFDLGdCQUFnQjs0QkFDekMsUUFBUSxFQUFFLEdBQUcsWUFBWSxLQUFLLFNBQVMsQ0FBQyxPQUFPLEVBQUU7NEJBQ2pELE9BQU8sRUFBRSxJQUFBLCtCQUFzQixFQUFDLEdBQUcsQ0FBQzs0QkFDcEMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUk7eUJBQ3RDLENBQUMsQ0FBQztvQkFDTCxDQUFDO3lCQUFNLENBQUM7d0JBQ04sVUFBVSxDQUFDLFVBQVUsQ0FBQzs0QkFDcEIsTUFBTSxFQUFFLHlCQUFnQixDQUFDLFlBQVk7NEJBQ3JDLFFBQVEsRUFBRSxHQUFHLFlBQVksRUFBRTs0QkFDM0IsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBQSwrQkFBc0IsRUFBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZTs0QkFDNUQsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUk7eUJBQ3RDLENBQUMsQ0FBQztvQkFDTCxDQUFDO29CQUNELDJDQUEyQztvQkFDM0MsbUNBQW1DO29CQUNuQyxVQUFVLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUN4QyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUMxQixPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLElBQUksRUFBRTtnQkFDN0IsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2QsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pDLG9EQUFvRDtRQUNwRCxNQUFBLEtBQUssQ0FBQyxNQUFNLDBDQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNuQyxJQUFJLFNBQVMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDbEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDaEMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBQSxLQUFLLENBQUMsTUFBTSwwQ0FBRSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDbkMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xCLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDMUIsS0FBSyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFOztnQkFDL0IsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO2dCQUM3QyxDQUFDO2dCQUNELE1BQUEsS0FBSyxDQUFDLEtBQUssMENBQUUsR0FBRyxFQUFFLENBQUM7Z0JBQ25CLE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN0QixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSyxNQUFNLENBQ1osVUFBeUIsRUFDekIscUJBQThCLEVBQzlCLFlBQW9COztRQUVwQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUM7WUFDSCxJQUFJLE1BQUEsY0FBYyxDQUFDLEtBQUssMENBQUUsU0FBUyxFQUFFLENBQUM7Z0JBQ3BDLGNBQWMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDM0MsSUFBQSxZQUFJLEVBQUMsSUFBQSxjQUFNLEVBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQ2hCLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7cUJBQ3BDLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7WUFDRCxnREFBZ0Q7WUFDaEQsaURBQWlEO1lBQ2pELDJEQUEyRDtZQUMzRCxvQ0FBb0M7WUFDcEMsdUVBQXVFO1lBQ3ZFLGtEQUFrRDtZQUNsRCxJQUFJLHFCQUFxQixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQzdDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLFlBQVksS0FBSSxNQUFBLElBQUksQ0FBQyxpQkFBaUIsMENBQUUsU0FBUyxDQUFBLENBQUMsRUFBRSxDQUFDO2dCQUNoRixxREFBcUQ7Z0JBQ3JELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUN4QixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3hFLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO29CQUNkLEdBQUcsVUFBVTtvQkFDYixNQUFNLEVBQUUsZ0JBQWdCLENBQUMsTUFBTTtvQkFDL0IsR0FBRyxNQUFBLE1BQUEsZ0JBQWdCLGFBQWhCLGdCQUFnQix1QkFBaEIsZ0JBQWdCLENBQUUsaUJBQWlCLDBDQUFFLE1BQU0sMENBQUUsSUFBSTtvQkFDcEQsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBQSxNQUFBLE1BQUEsZ0JBQWdCLGFBQWhCLGdCQUFnQix1QkFBaEIsZ0JBQWdCLENBQUUsaUJBQWlCLDBDQUFFLE1BQU0sMENBQUUsSUFBSSwwQ0FBRSxPQUFPLENBQUM7b0JBQ3BGLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQztvQkFDcEQsT0FBTyxFQUFFLE1BQUEsSUFBSSxDQUFDLGlCQUFpQiwwQ0FBRSxhQUFhO2lCQUMvQyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBQ0QsZ0NBQWdDO1lBQ2hDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO2dCQUNkLEdBQUcsVUFBVTtnQkFDYixPQUFPLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhO2dCQUMzQyxNQUFNLEVBQUU7b0JBQ04sR0FBRyxjQUFjLENBQUMsTUFBTTtpQkFDekI7Z0JBQ0QsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUNyRCxHQUFHLE1BQUEsTUFBQSxjQUFjLGFBQWQsY0FBYyx1QkFBZCxjQUFjLENBQUUsaUJBQWlCLDBDQUFFLE1BQU0sMENBQUUsSUFBSTtnQkFDbEQsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBQSxNQUFBLE1BQUEsY0FBYyxhQUFkLGNBQWMsdUJBQWQsY0FBYyxDQUFFLGlCQUFpQiwwQ0FBRSxNQUFNLDBDQUFFLElBQUksMENBQUUsT0FBTyxDQUFDO2dCQUNsRixHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU07YUFDakIsQ0FBQyxDQUFDO1lBRUgsOEJBQThCO1lBQzlCLHFDQUFxQztZQUNyQyxnRUFBZ0U7WUFDaEUsMkVBQTJFO1lBQzNFLDhEQUE4RDtZQUM5RCwrRUFBK0U7WUFDL0UsSUFBSSxjQUFjLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO29CQUNkLEdBQUcsVUFBVTtvQkFDYixPQUFPLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhO29CQUMzQyxNQUFNLEVBQUU7d0JBQ04sY0FBYyxDQUFDLGNBQWM7cUJBQzlCO29CQUNELFFBQVEsRUFBRSxLQUFLO29CQUNmLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDckQsR0FBRyxNQUFBLE1BQUEsY0FBYyxhQUFkLGNBQWMsdUJBQWQsY0FBYyxDQUFFLGlCQUFpQiwwQ0FBRSxNQUFNLDBDQUFFLElBQUk7b0JBQ2xELFdBQVcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLHdCQUF3QixDQUFDLENBQUM7b0JBQy9GLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQUEsTUFBQSxNQUFBLGNBQWMsYUFBZCxjQUFjLHVCQUFkLGNBQWMsQ0FBRSxpQkFBaUIsMENBQUUsTUFBTSwwQ0FBRSxJQUFJLDBDQUFFLE9BQU8sQ0FBQztvQkFDbEYsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNO2lCQUNqQixDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQsSUFBSSxNQUFBLGNBQWMsQ0FBQyxLQUFLLDBDQUFFLFVBQVUsRUFBRSxDQUFDO2dCQUNyQyxjQUFjLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQzVDLElBQUEsWUFBSSxFQUFDLElBQUEsY0FBTSxFQUFDLEdBQUcsQ0FBQyxFQUFFO3dCQUNoQixHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO3FCQUNwQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQsSUFBSSxjQUFjLENBQUMsY0FBYyxJQUFJLGNBQWMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUN2RSxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLHdCQUF3QixDQUFDLEVBQ25ELGNBQWMsQ0FBQyxrQkFBa0IsRUFDakMsY0FBYyxDQUFDLGNBQWMsQ0FDOUIsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUNmLE1BQUEsTUFBQSxNQUFBLGNBQWMsQ0FBQyxpQkFBaUIsMENBQUUsTUFBTSwwQ0FBRSxXQUFXLG1DQUFJLEtBQUssRUFDOUQsTUFBQSxNQUFBLGNBQWMsQ0FBQyxpQkFBaUIsMENBQUUsTUFBTSwwQ0FBRSxlQUFlLENBQzFELENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTztJQUNULENBQUM7SUFFRDs7O09BR0c7SUFDSyx1QkFBdUIsQ0FBQyxJQUFZLEVBQUUsa0JBQTBCLEVBQUUsZ0JBQXdCO1FBQ2hHLE1BQU0sT0FBTyxHQUFxQixFQUFFLENBQUM7UUFDckMsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDO2dCQUNILE1BQU0sT0FBTyxHQUFpRCxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUVwRixJQUFJLGtCQUFrQixJQUFJLE9BQU8sRUFBRSxDQUFDO29CQUNsQyxLQUFLLE1BQU0sQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLENBQUM7d0JBQ2hGLElBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7NEJBQy9DLE1BQU0sZUFBZSxHQUFvQixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7NEJBQ2xGLElBQUksZUFBZSxDQUFDLE1BQU0sS0FBSyxNQUFNLElBQUksZUFBZSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztnQ0FDOUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLGVBQWUsQ0FBQzs0QkFDekMsQ0FBQzt3QkFDSCxDQUFDO29CQUNILENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNYLDBFQUEwRTtnQkFDMUUseUJBQXlCO2dCQUN6QixPQUFPLENBQUMsZ0JBQWdCLENBQUMsR0FBRztvQkFDMUIsTUFBTSxFQUFFLE1BQU07b0JBQ2QsT0FBTyxFQUFFLHVDQUF1QyxDQUFDLEVBQUU7aUJBQ3BELENBQUM7WUFDSixDQUFDO29CQUFTLENBQUM7Z0JBQ1QsNERBQTREO2dCQUM1RCx1REFBdUQ7Z0JBQ3ZELDBCQUEwQjtnQkFDMUIsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0QixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUMvRCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxVQUFVLENBQUMsQ0FBVSxFQUFFLFdBQW9CLEVBQUUsZUFBd0I7UUFDM0UsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixJQUFJLGVBQWUsRUFBRSxDQUFDO2dCQUNwQixNQUFNLE9BQU8sR0FBSSxDQUFXLENBQUMsT0FBTyxDQUFDO2dCQUNyQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO29CQUNwQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ1osQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sQ0FBQyxDQUFDO1FBQ1YsQ0FBQztJQUNILENBQUM7Q0FDRjtBQWhnQkQsMENBZ2dCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBEZXBsb3lPcHRpb25zLCBEZXN0cm95T3B0aW9ucywgSG90c3dhcE1vZGUsIFN0YWNrQWN0aXZpdHlQcm9ncmVzcyB9IGZyb20gJ0Bhd3MtY2RrL2Nkay1jbGktd3JhcHBlcic7XG5pbXBvcnQgeyBSZXF1aXJlQXBwcm92YWwgfSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1zY2hlbWEnO1xuaW1wb3J0ICogYXMgY2hva2lkYXIgZnJvbSAnY2hva2lkYXInO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgd29ya2VycG9vbCBmcm9tICd3b3JrZXJwb29sJztcbmltcG9ydCB7IEludGVnUnVubmVyT3B0aW9ucywgSW50ZWdSdW5uZXIsIERFRkFVTFRfU1lOVEhfT1BUSU9OUyB9IGZyb20gJy4vcnVubmVyLWJhc2UnO1xuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBjaHVua3MsIGV4ZWMgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBEZXN0cnVjdGl2ZUNoYW5nZSwgQXNzZXJ0aW9uUmVzdWx0cywgQXNzZXJ0aW9uUmVzdWx0LCBEaWFnbm9zdGljUmVhc29uLCBmb3JtYXRBc3NlcnRpb25SZXN1bHRzIH0gZnJvbSAnLi4vd29ya2Vycy9jb21tb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbW1vbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZVxuICAgKi9cbiAgcmVhZG9ubHkgdGVzdENhc2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsZXZlbCBvZiB2ZXJib3NpdHkgZm9yIGxvZ2dpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIHJlYWRvbmx5IHZlcmJvc2l0eT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXYXRjaE9wdGlvbnMgZXh0ZW5kcyBDb21tb25PcHRpb25zIHsgfVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSBpbnRlZ3JhdGlvbiB0ZXN0IHJ1bm5lclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bk9wdGlvbnMgZXh0ZW5kcyBDb21tb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRvIHJ1biBgY2RrIGRlc3Ryb3lgIGFuZCBjbGVhbnVwIHRoZVxuICAgKiBpbnRlZ3JhdGlvbiB0ZXN0IHN0YWNrcy5cbiAgICpcbiAgICogU2V0IHRoaXMgdG8gZmFsc2UgaWYgeW91IG5lZWQgdG8gcGVyZm9ybSBhbnkgdmFsaWRhdGlvblxuICAgKiBvciB0cm91Ymxlc2hvb3RpbmcgYWZ0ZXIgZGVwbG95bWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgY2xlYW4/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGludGVncmF0aW9uIHRlc3Qgd2lsbCBub3QgZGVwbG95XG4gICAqIGFueXRoaW5nIGFuZCB3aWxsIHNpbXBseSB1cGRhdGUgdGhlIHNuYXBzaG90LlxuICAgKlxuICAgKiBZb3Ugc2hvdWxkIE5PVCB1c2UgdGhpcyBtZXRob2Qgc2luY2UgeW91IGFyZSBlc3NlbnRpYWxseVxuICAgKiBieXBhc3NpbmcgdGhlIGludGVncmF0aW9uIHRlc3QuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBkcnlSdW4/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJZiB0aGlzIGlzIHNldCB0byBmYWxzZSB0aGVuIHRoZSBzdGFjayB1cGRhdGUgd29ya2Zsb3cgd2lsbFxuICAgKiBub3QgYmUgcnVuXG4gICAqXG4gICAqIFRoZSB1cGRhdGUgd29ya2Zsb3cgZXhpc3RzIHRvIGNoZWNrIGZvciBjYXNlcyB3aGVyZSBhIGNoYW5nZSB3b3VsZCBjYXVzZVxuICAgKiBhIGZhaWx1cmUgdG8gYW4gZXhpc3Rpbmcgc3RhY2ssIGJ1dCBub3QgZm9yIGEgbmV3bHkgY3JlYXRlZCBzdGFjay5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgdXBkYXRlV29ya2Zsb3c/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEFuIGludGVncmF0aW9uIHRlc3QgcnVubmVyIHRoYXQgb3JjaGVzdHJhdGVzIGV4ZWN1dGluZ1xuICogaW50ZWdyYXRpb24gdGVzdHNcbiAqL1xuZXhwb3J0IGNsYXNzIEludGVnVGVzdFJ1bm5lciBleHRlbmRzIEludGVnUnVubmVyIHtcbiAgY29uc3RydWN0b3Iob3B0aW9uczogSW50ZWdSdW5uZXJPcHRpb25zLCBkZXN0cnVjdGl2ZUNoYW5nZXM/OiBEZXN0cnVjdGl2ZUNoYW5nZVtdKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gICAgdGhpcy5fZGVzdHJ1Y3RpdmVDaGFuZ2VzID0gZGVzdHJ1Y3RpdmVDaGFuZ2VzO1xuXG4gICAgLy8gV2UgZG9uJ3Qgd2FudCBuZXcgdGVzdHMgd3JpdHRlbiBpbiB0aGUgbGVnYWN5IG1vZGUuXG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gZXhpc3Rpbmcgc25hcHNob3QgX2FuZF8gdGhpcyBpcyBhIGxlZ2FjeVxuICAgIC8vIHRlc3QgdGhlbiBwb2ludCB0aGUgdXNlciB0byB0aGUgbmV3IGBJbnRlZ1Rlc3RgIGNvbnN0cnVjdFxuICAgIGlmICghdGhpcy5oYXNTbmFwc2hvdCgpICYmIHRoaXMuaXNMZWdhY3lUZXN0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy50ZXN0TmFtZX0gaXMgYSBuZXcgdGVzdC4gUGxlYXNlIHVzZSB0aGUgSW50ZWdUZXN0IGNvbnN0cnVjdCBgICtcbiAgICAgICAgJ3RvIGNvbmZpZ3VyZSB0aGUgdGVzdFxcbicgK1xuICAgICAgICAnaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL3RyZWUvbWFpbi9wYWNrYWdlcy8lNDBhd3MtY2RrL2ludGVnLXRlc3RzLWFscGhhJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNyZWF0ZUNka0NvbnRleHRKc29uKCk6IHZvaWQge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLmNka0NvbnRleHRQYXRoKSkge1xuICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLmNka0NvbnRleHRQYXRoLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHdhdGNoOiB7IH0sXG4gICAgICB9LCB1bmRlZmluZWQsIDIpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hlbiBydW5uaW5nIGludGVncmF0aW9uIHRlc3RzIHdpdGggdGhlIHVwZGF0ZSBwYXRoIHdvcmtmbG93XG4gICAqIGl0IGlzIGltcG9ydGFudCB0aGF0IHRoZSBzbmFwc2hvdCB0aGF0IGlzIGRlcGxveWVkIGlzIHRoZSBjdXJyZW50IHNuYXBzaG90XG4gICAqIGZyb20gdGhlIHVwc3RyZWFtIGJyYW5jaC4gSW4gb3JkZXIgdG8gZ3VhcmFudGVlIHRoYXQsIGZpcnN0IGNoZWNrb3V0IHRoZSBsYXRlc3RcbiAgICogKHRvIHRoZSB1c2VyKSBzbmFwc2hvdCBmcm9tIHVwc3RyZWFtXG4gICAqXG4gICAqIEl0IGlzIG5vdCBzdHJhaWdodGZvcndhcmQgdG8gZmlndXJlIG91dCB3aGF0IGJyYW5jaCB0aGUgY3VycmVudFxuICAgKiB3b3JraW5nIGJyYW5jaCB3YXMgY3JlYXRlZCBmcm9tLiBUaGlzIGlzIGEgYmVzdCBlZmZvcnQgYXR0ZW1wdCB0byBkbyBzby5cbiAgICogVGhpcyBhc3N1bWVzIHRoYXQgdGhlcmUgaXMgYW4gJ29yaWdpbicuIGBnaXQgcmVtb3RlIHNob3cgb3JpZ2luYCByZXR1cm5zIGEgbGlzdCBvZlxuICAgKiBhbGwgYnJhbmNoZXMgYW5kIHdlIHRoZW4gc2VhcmNoIGZvciBvbmUgdGhhdCBzdGFydHMgd2l0aCBgSEVBRCBicmFuY2g6IGBcbiAgICovXG4gIHByaXZhdGUgY2hlY2tvdXRTbmFwc2hvdCgpOiB2b2lkIHtcbiAgICBjb25zdCBjd2QgPSB0aGlzLmRpcmVjdG9yeTtcblxuICAgIC8vIGh0dHBzOi8vZ2l0LXNjbS5jb20vZG9jcy9naXQtbWVyZ2UtYmFzZVxuICAgIGxldCBiYXNlQnJhbmNoOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgLy8gdHJ5IHRvIGZpbmQgdGhlIGJhc2UgYnJhbmNoIHRoYXQgdGhlIHdvcmtpbmcgYnJhbmNoIHdhcyBjcmVhdGVkIGZyb21cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3JpZ2luOiBzdHJpbmcgPSBleGVjKFsnZ2l0JywgJ3JlbW90ZScsICdzaG93JywgJ29yaWdpbiddLCB7XG4gICAgICAgIGN3ZCxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgb3JpZ2luTGluZXMgPSBvcmlnaW4uc3BsaXQoJ1xcbicpO1xuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIG9yaWdpbkxpbmVzKSB7XG4gICAgICAgIGlmIChsaW5lLnRyaW0oKS5zdGFydHNXaXRoKCdIRUFEIGJyYW5jaDogJykpIHtcbiAgICAgICAgICBiYXNlQnJhbmNoID0gbGluZS50cmltKCkuc3BsaXQoJ0hFQUQgYnJhbmNoOiAnKVsxXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dlci53YXJuaW5nKCclc1xcbiVzJyxcbiAgICAgICAgJ0NvdWxkIG5vdCBkZXRlcm1pbmUgZ2l0IG9yaWdpbiBicmFuY2guJyxcbiAgICAgICAgYFlvdSBuZWVkIHRvIG1hbnVhbGx5IGNoZWNrb3V0IHRoZSBzbmFwc2hvdCBkaXJlY3RvcnkgJHt0aGlzLnNuYXBzaG90RGlyfWAgK1xuICAgICAgICAnZnJvbSB0aGUgbWVyZ2UtYmFzZSAoaHR0cHM6Ly9naXQtc2NtLmNvbS9kb2NzL2dpdC1tZXJnZS1iYXNlKScsXG4gICAgICApO1xuICAgICAgbG9nZ2VyLndhcm5pbmcoJ2Vycm9yOiAlcycsIGUpO1xuICAgIH1cblxuICAgIC8vIGlmIHdlIGZvdW5kIHRoZSBiYXNlIGJyYW5jaCB0aGVuIGdldCB0aGUgbWVyZ2UtYmFzZSAobW9zdCByZWNlbnQgY29tbW9uIGNvbW1pdClcbiAgICAvLyBhbmQgY2hlY2tvdXQgdGhlIHNuYXBzaG90IHVzaW5nIHRoYXQgY29tbWl0XG4gICAgaWYgKGJhc2VCcmFuY2gpIHtcbiAgICAgIGNvbnN0IHJlbGF0aXZlU25hcHNob3REaXIgPSBwYXRoLnJlbGF0aXZlKHRoaXMuZGlyZWN0b3J5LCB0aGlzLnNuYXBzaG90RGlyKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYmFzZSA9IGV4ZWMoWydnaXQnLCAnbWVyZ2UtYmFzZScsICdIRUFEJywgYmFzZUJyYW5jaF0sIHtcbiAgICAgICAgICBjd2QsXG4gICAgICAgIH0pO1xuICAgICAgICBleGVjKFsnZ2l0JywgJ2NoZWNrb3V0JywgYmFzZSwgJy0tJywgcmVsYXRpdmVTbmFwc2hvdERpcl0sIHtcbiAgICAgICAgICBjd2QsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIud2FybmluZygnJXNcXG4lcycsXG4gICAgICAgICAgYENvdWxkIG5vdCBjaGVja291dCBzbmFwc2hvdCBkaXJlY3RvcnkgJyR7dGhpcy5zbmFwc2hvdERpcn0nLiBQbGVhc2UgdmVyaWZ5IHRoZSBmb2xsb3dpbmcgY29tbWFuZCBjb21wbGV0ZXMgY29ycmVjdGx5OmAsXG4gICAgICAgICAgYGdpdCBjaGVja291dCAkKGdpdCBtZXJnZS1iYXNlIEhFQUQgJHtiYXNlQnJhbmNofSkgLS0gJHtyZWxhdGl2ZVNuYXBzaG90RGlyfWAsXG4gICAgICAgICAgJycsXG4gICAgICAgICk7XG4gICAgICAgIGxvZ2dlci53YXJuaW5nKCdlcnJvcjogJXMnLCBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBjZGsgZGVwbG95IC0td2F0Y2ggZm9yIGFuIGludGVncmF0aW9uIHRlc3RcbiAgICpcbiAgICogVGhpcyBpcyBtZWFudCB0byBiZSBydW4gb24gYSBzaW5nbGUgdGVzdCBhbmQgd2lsbCBub3QgY3JlYXRlIGEgc25hcHNob3RcbiAgICovXG4gIHB1YmxpYyBhc3luYyB3YXRjaEludGVnVGVzdChvcHRpb25zOiBXYXRjaE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhY3R1YWxUZXN0Q2FzZSA9IHRoaXMuYWN0dWFsVGVzdFN1aXRlLnRlc3RTdWl0ZVtvcHRpb25zLnRlc3RDYXNlTmFtZV07XG4gICAgaWYgKCFhY3R1YWxUZXN0Q2FzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBEaWQgbm90IGZpbmQgdGVzdCBjYXNlIG5hbWUgJyR7b3B0aW9ucy50ZXN0Q2FzZU5hbWV9JyBpbiAnJHtPYmplY3Qua2V5cyh0aGlzLmFjdHVhbFRlc3RTdWl0ZS50ZXN0U3VpdGUpfSdgKTtcbiAgICB9XG4gICAgY29uc3QgZW5hYmxlRm9yVmVyYm9zaXR5TGV2ZWwgPSAobmVlZGVkID0gMSkgPT4ge1xuICAgICAgY29uc3QgdmVyYm9zaXR5ID0gb3B0aW9ucy52ZXJib3NpdHkgPz8gMDtcbiAgICAgIHJldHVybiAodmVyYm9zaXR5ID49IG5lZWRlZCkgPyB0cnVlIDogdW5kZWZpbmVkO1xuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMud2F0Y2goXG4gICAgICAgIHtcbiAgICAgICAgICAuLi50aGlzLmRlZmF1bHRBcmdzLFxuICAgICAgICAgIHByb2dyZXNzOiBTdGFja0FjdGl2aXR5UHJvZ3Jlc3MuQkFSLFxuICAgICAgICAgIGhvdHN3YXA6IEhvdHN3YXBNb2RlLkZBTExfQkFDSyxcbiAgICAgICAgICBkZXBsb3ltZW50TWV0aG9kOiAnZGlyZWN0JyxcbiAgICAgICAgICBwcm9maWxlOiB0aGlzLnByb2ZpbGUsXG4gICAgICAgICAgcmVxdWlyZUFwcHJvdmFsOiBSZXF1aXJlQXBwcm92YWwuTkVWRVIsXG4gICAgICAgICAgdHJhY2VMb2dzOiBlbmFibGVGb3JWZXJib3NpdHlMZXZlbCgyKSA/PyBmYWxzZSxcbiAgICAgICAgICB2ZXJib3NlOiBlbmFibGVGb3JWZXJib3NpdHlMZXZlbCgzKSxcbiAgICAgICAgICBkZWJ1ZzogZW5hYmxlRm9yVmVyYm9zaXR5TGV2ZWwoNCksXG4gICAgICAgICAgd2F0Y2g6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnMudGVzdENhc2VOYW1lLFxuICAgICAgICBvcHRpb25zLnZlcmJvc2l0eSA/PyAwLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPcmNoZXN0cmF0ZXMgcnVubmluZyBpbnRlZ3JhdGlvbiB0ZXN0cy4gQ3VycmVudGx5IHRoaXMgaW5jbHVkZXNcbiAgICpcbiAgICogMS4gKGlmIHVwZGF0ZSB3b3JrZmxvdyBpcyBlbmFibGVkKSBEZXBsb3lpbmcgdGhlIHNuYXBzaG90IHRlc3Qgc3RhY2tzXG4gICAqIDIuIERlcGxveWluZyB0aGUgaW50ZWdyYXRpb24gdGVzdCBzdGFja3NcbiAgICogMi4gU2F2aW5nIHRoZSBzbmFwc2hvdCAoaWYgc3VjY2Vzc2Z1bClcbiAgICogMy4gRGVzdHJveWluZyB0aGUgaW50ZWdyYXRpb24gdGVzdCBzdGFja3MgKGlmIGNsZWFuPWZhbHNlKVxuICAgKlxuICAgKiBUaGUgdXBkYXRlIHdvcmtmbG93IGV4aXN0cyB0byBjaGVjayBmb3IgY2FzZXMgd2hlcmUgYSBjaGFuZ2Ugd291bGQgY2F1c2VcbiAgICogYSBmYWlsdXJlIHRvIGFuIGV4aXN0aW5nIHN0YWNrLCBidXQgbm90IGZvciBhIG5ld2x5IGNyZWF0ZWQgc3RhY2suXG4gICAqL1xuICBwdWJsaWMgcnVuSW50ZWdUZXN0Q2FzZShvcHRpb25zOiBSdW5PcHRpb25zKTogQXNzZXJ0aW9uUmVzdWx0cyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGFzc2VydGlvblJlc3VsdHM6IEFzc2VydGlvblJlc3VsdHMgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgYWN0dWFsVGVzdENhc2UgPSB0aGlzLmFjdHVhbFRlc3RTdWl0ZS50ZXN0U3VpdGVbb3B0aW9ucy50ZXN0Q2FzZU5hbWVdO1xuICAgIGlmICghYWN0dWFsVGVzdENhc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRGlkIG5vdCBmaW5kIHRlc3QgY2FzZSBuYW1lICcke29wdGlvbnMudGVzdENhc2VOYW1lfScgaW4gJyR7T2JqZWN0LmtleXModGhpcy5hY3R1YWxUZXN0U3VpdGUudGVzdFN1aXRlKX0nYCk7XG4gICAgfVxuICAgIGNvbnN0IGNsZWFuID0gb3B0aW9ucy5jbGVhbiA/PyB0cnVlO1xuICAgIGNvbnN0IHVwZGF0ZVdvcmtmbG93RW5hYmxlZCA9IChvcHRpb25zLnVwZGF0ZVdvcmtmbG93ID8/IHRydWUpXG4gICAgICAmJiAoYWN0dWFsVGVzdENhc2Uuc3RhY2tVcGRhdGVXb3JrZmxvdyA/PyB0cnVlKTtcbiAgICBjb25zdCBlbmFibGVGb3JWZXJib3NpdHlMZXZlbCA9IChuZWVkZWQgPSAxKSA9PiB7XG4gICAgICBjb25zdCB2ZXJib3NpdHkgPSBvcHRpb25zLnZlcmJvc2l0eSA/PyAwO1xuICAgICAgcmV0dXJuICh2ZXJib3NpdHkgPj0gbmVlZGVkKSA/IHRydWUgOiB1bmRlZmluZWQ7XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoIW9wdGlvbnMuZHJ5UnVuICYmIChhY3R1YWxUZXN0Q2FzZS5jZGtDb21tYW5kT3B0aW9ucz8uZGVwbG95Py5lbmFibGVkID8/IHRydWUpKSB7XG4gICAgICAgIGFzc2VydGlvblJlc3VsdHMgPSB0aGlzLmRlcGxveShcbiAgICAgICAgICB7XG4gICAgICAgICAgICAuLi50aGlzLmRlZmF1bHRBcmdzLFxuICAgICAgICAgICAgcHJvZmlsZTogdGhpcy5wcm9maWxlLFxuICAgICAgICAgICAgcmVxdWlyZUFwcHJvdmFsOiBSZXF1aXJlQXBwcm92YWwuTkVWRVIsXG4gICAgICAgICAgICB2ZXJib3NlOiBlbmFibGVGb3JWZXJib3NpdHlMZXZlbCgzKSxcbiAgICAgICAgICAgIGRlYnVnOiBlbmFibGVGb3JWZXJib3NpdHlMZXZlbCg0KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVwZGF0ZVdvcmtmbG93RW5hYmxlZCxcbiAgICAgICAgICBvcHRpb25zLnRlc3RDYXNlTmFtZSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVudjogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgICAgICAuLi5ERUZBVUxUX1NZTlRIX09QVElPTlMuZW52LFxuICAgICAgICAgIENES19DT05URVhUX0pTT046IEpTT04uc3RyaW5naWZ5KHRoaXMuZ2V0Q29udGV4dCh7XG4gICAgICAgICAgICAuLi50aGlzLmFjdHVhbFRlc3RTdWl0ZS5lbmFibGVMb29rdXBzID8gREVGQVVMVF9TWU5USF9PUFRJT05TLmNvbnRleHQgOiB7fSxcbiAgICAgICAgICB9KSksXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY2RrLnN5bnRoRmFzdCh7XG4gICAgICAgICAgZXhlY0NtZDogdGhpcy5jZGtBcHAuc3BsaXQoJyAnKSxcbiAgICAgICAgICBlbnYsXG4gICAgICAgICAgb3V0cHV0OiBwYXRoLnJlbGF0aXZlKHRoaXMuZGlyZWN0b3J5LCB0aGlzLmNka091dERpciksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gb25seSBjcmVhdGUgdGhlIHNuYXBzaG90IGlmIHRoZXJlIGFyZSBubyBmYWlsZWQgYXNzZXJ0aW9uIHJlc3VsdHNcbiAgICAgIC8vIChpLmUuIG5vIGZhaWx1cmVzKVxuICAgICAgaWYgKCFhc3NlcnRpb25SZXN1bHRzIHx8ICFPYmplY3QudmFsdWVzKGFzc2VydGlvblJlc3VsdHMpLnNvbWUocmVzdWx0ID0+IHJlc3VsdC5zdGF0dXMgPT09ICdmYWlsJykpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVTbmFwc2hvdCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICghb3B0aW9ucy5kcnlSdW4pIHtcbiAgICAgICAgaWYgKGNsZWFuICYmIChhY3R1YWxUZXN0Q2FzZS5jZGtDb21tYW5kT3B0aW9ucz8uZGVzdHJveT8uZW5hYmxlZCA/PyB0cnVlKSkge1xuICAgICAgICAgIHRoaXMuZGVzdHJveShvcHRpb25zLnRlc3RDYXNlTmFtZSwge1xuICAgICAgICAgICAgLi4udGhpcy5kZWZhdWx0QXJncyxcbiAgICAgICAgICAgIHByb2ZpbGU6IHRoaXMucHJvZmlsZSxcbiAgICAgICAgICAgIGFsbDogdHJ1ZSxcbiAgICAgICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgICAgICAgYXBwOiB0aGlzLmNka0FwcCxcbiAgICAgICAgICAgIG91dHB1dDogcGF0aC5yZWxhdGl2ZSh0aGlzLmRpcmVjdG9yeSwgdGhpcy5jZGtPdXREaXIpLFxuICAgICAgICAgICAgLi4uYWN0dWFsVGVzdENhc2UuY2RrQ29tbWFuZE9wdGlvbnM/LmRlc3Ryb3k/LmFyZ3MsXG4gICAgICAgICAgICBjb250ZXh0OiB0aGlzLmdldENvbnRleHQoYWN0dWFsVGVzdENhc2UuY2RrQ29tbWFuZE9wdGlvbnM/LmRlc3Ryb3k/LmFyZ3M/LmNvbnRleHQpLFxuICAgICAgICAgICAgdmVyYm9zZTogZW5hYmxlRm9yVmVyYm9zaXR5TGV2ZWwoMyksXG4gICAgICAgICAgICBkZWJ1ZzogZW5hYmxlRm9yVmVyYm9zaXR5TGV2ZWwoNCksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgIH1cbiAgICByZXR1cm4gYXNzZXJ0aW9uUmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIGEgaW50ZWcgdGVzdCBjYXNlIHN0YWNrIGRlc3RydWN0aW9uXG4gICAqL1xuICBwcml2YXRlIGRlc3Ryb3kodGVzdENhc2VOYW1lOiBzdHJpbmcsIGRlc3Ryb3lBcmdzOiBEZXN0cm95T3B0aW9ucykge1xuICAgIGNvbnN0IGFjdHVhbFRlc3RDYXNlID0gdGhpcy5hY3R1YWxUZXN0U3VpdGUudGVzdFN1aXRlW3Rlc3RDYXNlTmFtZV07XG4gICAgdHJ5IHtcbiAgICAgIGlmIChhY3R1YWxUZXN0Q2FzZS5ob29rcz8ucHJlRGVzdHJveSkge1xuICAgICAgICBhY3R1YWxUZXN0Q2FzZS5ob29rcy5wcmVEZXN0cm95LmZvckVhY2goY21kID0+IHtcbiAgICAgICAgICBleGVjKGNodW5rcyhjbWQpLCB7XG4gICAgICAgICAgICBjd2Q6IHBhdGguZGlybmFtZSh0aGlzLnNuYXBzaG90RGlyKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNkay5kZXN0cm95KHtcbiAgICAgICAgLi4uZGVzdHJveUFyZ3MsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGFjdHVhbFRlc3RDYXNlLmhvb2tzPy5wb3N0RGVzdHJveSkge1xuICAgICAgICBhY3R1YWxUZXN0Q2FzZS5ob29rcy5wb3N0RGVzdHJveS5mb3JFYWNoKGNtZCA9PiB7XG4gICAgICAgICAgZXhlYyhjaHVua3MoY21kKSwge1xuICAgICAgICAgICAgY3dkOiBwYXRoLmRpcm5hbWUodGhpcy5zbmFwc2hvdERpciksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMucGFyc2VFcnJvcihlLFxuICAgICAgICBhY3R1YWxUZXN0Q2FzZS5jZGtDb21tYW5kT3B0aW9ucz8uZGVzdHJveT8uZXhwZWN0RXJyb3IgPz8gZmFsc2UsXG4gICAgICAgIGFjdHVhbFRlc3RDYXNlLmNka0NvbW1hbmRPcHRpb25zPy5kZXN0cm95Py5leHBlY3RlZE1lc3NhZ2UsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2F0Y2god2F0Y2hBcmdzOiBEZXBsb3lPcHRpb25zLCB0ZXN0Q2FzZU5hbWU6IHN0cmluZywgdmVyYm9zaXR5OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhY3R1YWxUZXN0Q2FzZSA9IHRoaXMuYWN0dWFsVGVzdFN1aXRlLnRlc3RTdWl0ZVt0ZXN0Q2FzZU5hbWVdO1xuICAgIGlmIChhY3R1YWxUZXN0Q2FzZS5ob29rcz8ucHJlRGVwbG95KSB7XG4gICAgICBhY3R1YWxUZXN0Q2FzZS5ob29rcy5wcmVEZXBsb3kuZm9yRWFjaChjbWQgPT4ge1xuICAgICAgICBleGVjKGNodW5rcyhjbWQpLCB7XG4gICAgICAgICAgY3dkOiBwYXRoLmRpcm5hbWUodGhpcy5zbmFwc2hvdERpciksXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGRlcGxveUFyZ3MgPSB7XG4gICAgICAuLi53YXRjaEFyZ3MsXG4gICAgICBsb29rdXBzOiB0aGlzLmFjdHVhbFRlc3RTdWl0ZS5lbmFibGVMb29rdXBzLFxuICAgICAgc3RhY2tzOiBbXG4gICAgICAgIC4uLmFjdHVhbFRlc3RDYXNlLnN0YWNrcyxcbiAgICAgICAgLi4uYWN0dWFsVGVzdENhc2UuYXNzZXJ0aW9uU3RhY2sgPyBbYWN0dWFsVGVzdENhc2UuYXNzZXJ0aW9uU3RhY2tdIDogW10sXG4gICAgICBdLFxuICAgICAgb3V0cHV0OiBwYXRoLnJlbGF0aXZlKHRoaXMuZGlyZWN0b3J5LCB0aGlzLmNka091dERpciksXG4gICAgICBvdXRwdXRzRmlsZTogcGF0aC5yZWxhdGl2ZSh0aGlzLmRpcmVjdG9yeSwgcGF0aC5qb2luKHRoaXMuY2RrT3V0RGlyLCAnYXNzZXJ0aW9uLXJlc3VsdHMuanNvbicpKSxcbiAgICAgIC4uLmFjdHVhbFRlc3RDYXNlPy5jZGtDb21tYW5kT3B0aW9ucz8uZGVwbG95Py5hcmdzLFxuICAgICAgY29udGV4dDoge1xuICAgICAgICAuLi50aGlzLmdldENvbnRleHQoYWN0dWFsVGVzdENhc2U/LmNka0NvbW1hbmRPcHRpb25zPy5kZXBsb3k/LmFyZ3M/LmNvbnRleHQpLFxuICAgICAgfSxcbiAgICAgIGFwcDogdGhpcy5jZGtBcHAsXG4gICAgfTtcbiAgICBjb25zdCBkZXN0cm95TWVzc2FnZSA9IHtcbiAgICAgIGFkZGl0aW9uYWxNZXNzYWdlczogW1xuICAgICAgICAnQWZ0ZXIgeW91IGFyZSBkb25lIHlvdSBtdXN0IG1hbnVhbGx5IGRlc3Ryb3kgdGhlIGRlcGxveWVkIHN0YWNrcycsXG4gICAgICAgIGAgICR7W1xuICAgICAgICAgIC4uLnByb2Nlc3MuZW52LkFXU19SRUdJT04gPyBbYEFXU19SRUdJT049JHtwcm9jZXNzLmVudi5BV1NfUkVHSU9OfWBdIDogW10sXG4gICAgICAgICAgJ2NkayBkZXN0cm95JyxcbiAgICAgICAgICBgLWEgJyR7dGhpcy5jZGtBcHB9J2AsXG4gICAgICAgICAgZGVwbG95QXJncy5zdGFja3Muam9pbignICcpLFxuICAgICAgICAgIGAtLXByb2ZpbGUgJHtkZXBsb3lBcmdzLnByb2ZpbGV9YCxcbiAgICAgICAgXS5qb2luKCcgJyl9YCxcbiAgICAgIF0sXG4gICAgfTtcbiAgICB3b3JrZXJwb29sLndvcmtlckVtaXQoZGVzdHJveU1lc3NhZ2UpO1xuICAgIGlmICh3YXRjaEFyZ3MudmVyYm9zZSkge1xuICAgICAgLy8gaWYgYC12dnZgIChvciBhYm92ZSkgaXMgdXNlZCB0aGVuIHByaW50IG91dCB0aGUgY29tbWFuZCB0aGF0IHdhcyB1c2VkXG4gICAgICAvLyB0aGlzIGFsbG93cyB1c2VycyB0byBtYW51YWxseSBydW4gdGhlIGNvbW1hbmRcbiAgICAgIHdvcmtlcnBvb2wud29ya2VyRW1pdCh7XG4gICAgICAgIGFkZGl0aW9uYWxNZXNzYWdlczogW1xuICAgICAgICAgICdSZXBybzonLFxuICAgICAgICAgIGAgICR7W1xuICAgICAgICAgICAgJ2NkayBzeW50aCcsXG4gICAgICAgICAgICBgLWEgJyR7dGhpcy5jZGtBcHB9J2AsXG4gICAgICAgICAgICBgLW8gJyR7dGhpcy5jZGtPdXREaXJ9J2AsXG4gICAgICAgICAgICAuLi5PYmplY3QuZW50cmllcyh0aGlzLmdldENvbnRleHQoKSkuZmxhdE1hcCgoW2ssIHZdKSA9PiB0eXBlb2YgdiAhPT0gJ29iamVjdCcgPyBbYC1jICcke2t9PSR7dn0nYF0gOiBbXSksXG4gICAgICAgICAgICBkZXBsb3lBcmdzLnN0YWNrcy5qb2luKCcgJyksXG4gICAgICAgICAgICBgLS1vdXRwdXRzLWZpbGUgJHtkZXBsb3lBcmdzLm91dHB1dHNGaWxlfWAsXG4gICAgICAgICAgICBgLS1wcm9maWxlICR7ZGVwbG95QXJncy5wcm9maWxlfWAsXG4gICAgICAgICAgICAnLS1ob3Rzd2FwLWZhbGxiYWNrJyxcbiAgICAgICAgICBdLmpvaW4oJyAnKX1gLFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgYXNzZXJ0aW9uUmVzdWx0cyA9IHBhdGguam9pbih0aGlzLmNka091dERpciwgJ2Fzc2VydGlvbi1yZXN1bHRzLmpzb24nKTtcbiAgICBjb25zdCB3YXRjaGVyID0gY2hva2lkYXIud2F0Y2goW3RoaXMuY2RrT3V0RGlyXSwge1xuICAgICAgY3dkOiB0aGlzLmRpcmVjdG9yeSxcbiAgICB9KTtcbiAgICB3YXRjaGVyLm9uKCdhbGwnLCAoZXZlbnQ6ICdhZGQnIHwgJ2NoYW5nZScsIGZpbGU6IHN0cmluZykgPT4ge1xuICAgICAgLy8gd2Ugb25seSBjYXJlIGFib3V0IGNoYW5nZXMgdG8gdGhlIGBhc3NlcnRpb24tcmVzdWx0cy5qc29uYCBmaWxlLiBJZiB0aGVyZVxuICAgICAgLy8gYXJlIGFzc2VydGlvbnMgdGhlbiB0aGlzIHdpbGwgY2hhbmdlIG9uIGV2ZXJ5IGRlcGxveW1lbnRcbiAgICAgIGlmIChhc3NlcnRpb25SZXN1bHRzLmVuZHNXaXRoKGZpbGUpICYmIChldmVudCA9PT0gJ2FkZCcgfHwgZXZlbnQgPT09ICdjaGFuZ2UnKSkge1xuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChhY3R1YWxUZXN0Q2FzZS5ob29rcz8ucG9zdERlcGxveSkge1xuICAgICAgICAgIGFjdHVhbFRlc3RDYXNlLmhvb2tzLnBvc3REZXBsb3kuZm9yRWFjaChjbWQgPT4ge1xuICAgICAgICAgICAgZXhlYyhjaHVua3MoY21kKSwge1xuICAgICAgICAgICAgICBjd2Q6IHBhdGguZGlybmFtZSh0aGlzLnNuYXBzaG90RGlyKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFjdHVhbFRlc3RDYXNlLmFzc2VydGlvblN0YWNrICYmIGFjdHVhbFRlc3RDYXNlLmFzc2VydGlvblN0YWNrTmFtZSkge1xuICAgICAgICAgIGNvbnN0IHJlcyA9IHRoaXMucHJvY2Vzc0Fzc2VydGlvblJlc3VsdHMoXG4gICAgICAgICAgICBhc3NlcnRpb25SZXN1bHRzLFxuICAgICAgICAgICAgYWN0dWFsVGVzdENhc2UuYXNzZXJ0aW9uU3RhY2tOYW1lLFxuICAgICAgICAgICAgYWN0dWFsVGVzdENhc2UuYXNzZXJ0aW9uU3RhY2ssXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocmVzICYmIE9iamVjdC52YWx1ZXMocmVzKS5zb21lKHIgPT4gci5zdGF0dXMgPT09ICdmYWlsJykpIHtcbiAgICAgICAgICAgIHdvcmtlcnBvb2wud29ya2VyRW1pdCh7XG4gICAgICAgICAgICAgIHJlYXNvbjogRGlhZ25vc3RpY1JlYXNvbi5BU1NFUlRJT05fRkFJTEVELFxuICAgICAgICAgICAgICB0ZXN0TmFtZTogYCR7dGVzdENhc2VOYW1lfSAoJHt3YXRjaEFyZ3MucHJvZmlsZX1gLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXRBc3NlcnRpb25SZXN1bHRzKHJlcyksXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiAoRGF0ZS5ub3coKSAtIHN0YXJ0KSAvIDEwMDAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd29ya2VycG9vbC53b3JrZXJFbWl0KHtcbiAgICAgICAgICAgICAgcmVhc29uOiBEaWFnbm9zdGljUmVhc29uLlRFU1RfU1VDQ0VTUyxcbiAgICAgICAgICAgICAgdGVzdE5hbWU6IGAke3Rlc3RDYXNlTmFtZX1gLFxuICAgICAgICAgICAgICBtZXNzYWdlOiByZXMgPyBmb3JtYXRBc3NlcnRpb25SZXN1bHRzKHJlcykgOiAnTk8gQVNTRVJUSU9OUycsXG4gICAgICAgICAgICAgIGR1cmF0aW9uOiAoRGF0ZS5ub3coKSAtIHN0YXJ0KSAvIDEwMDAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gZW1pdCB0aGUgZGVzdHJveSBtZXNzYWdlIGFmdGVyIGV2ZXJ5IHJ1blxuICAgICAgICAgIC8vIHNvIHRoYXQgaXQncyB2aXNpYmxlIHRvIHRoZSB1c2VyXG4gICAgICAgICAgd29ya2VycG9vbC53b3JrZXJFbWl0KGRlc3Ryb3lNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgd2F0Y2hlci5vbigncmVhZHknLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoe30pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjaGlsZCA9IHRoaXMuY2RrLndhdGNoKGRlcGxveUFyZ3MpO1xuICAgIC8vIGlmIGAtdmAgKG9yIGFib3ZlKSBpcyBwYXNzZWQgdGhlbiBzdHJlYW0gdGhlIGxvZ3NcbiAgICBjaGlsZC5zdGRvdXQ/Lm9uKCdkYXRhJywgKG1lc3NhZ2UpID0+IHtcbiAgICAgIGlmICh2ZXJib3NpdHkgPiAwKSB7XG4gICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNoaWxkLnN0ZGVycj8ub24oJ2RhdGEnLCAobWVzc2FnZSkgPT4ge1xuICAgICAgaWYgKHZlcmJvc2l0eSA+IDApIHtcbiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUobWVzc2FnZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGNoaWxkLm9uKCdjbG9zZScsIGFzeW5jIChjb2RlKSA9PiB7XG4gICAgICAgIGlmIChjb2RlICE9PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXYXRjaCBleGl0ZWQgd2l0aCBlcnJvcicpO1xuICAgICAgICB9XG4gICAgICAgIGNoaWxkLnN0ZGluPy5lbmQoKTtcbiAgICAgICAgYXdhaXQgd2F0Y2hlci5jbG9zZSgpO1xuICAgICAgICByZXNvbHZlKGNvZGUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBhIGludGVnIHRlc3QgY2FzZSBkZXBsb3ltZW50LCBpbmNsdWRpbmdcbiAgICogcGVmb3JtaW5nIHRoZSB1cGRhdGUgd29ya2Zsb3dcbiAgICovXG4gIHByaXZhdGUgZGVwbG95KFxuICAgIGRlcGxveUFyZ3M6IERlcGxveU9wdGlvbnMsXG4gICAgdXBkYXRlV29ya2Zsb3dFbmFibGVkOiBib29sZWFuLFxuICAgIHRlc3RDYXNlTmFtZTogc3RyaW5nLFxuICApOiBBc3NlcnRpb25SZXN1bHRzIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBhY3R1YWxUZXN0Q2FzZSA9IHRoaXMuYWN0dWFsVGVzdFN1aXRlLnRlc3RTdWl0ZVt0ZXN0Q2FzZU5hbWVdO1xuICAgIHRyeSB7XG4gICAgICBpZiAoYWN0dWFsVGVzdENhc2UuaG9va3M/LnByZURlcGxveSkge1xuICAgICAgICBhY3R1YWxUZXN0Q2FzZS5ob29rcy5wcmVEZXBsb3kuZm9yRWFjaChjbWQgPT4ge1xuICAgICAgICAgIGV4ZWMoY2h1bmtzKGNtZCksIHtcbiAgICAgICAgICAgIGN3ZDogcGF0aC5kaXJuYW1lKHRoaXMuc25hcHNob3REaXIpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIGlmIHRoZSB1cGRhdGUgd29ya2Zsb3cgaXMgbm90IGRpc2FibGVkLCBmaXJzdFxuICAgICAgLy8gcGVyZm9ybSBhIGRlcGxveW1lbnQgd2l0aCB0aGUgZXhpc2luZyBzbmFwc2hvdFxuICAgICAgLy8gdGhlbiBwZXJmb3JtIGEgZGVwbG95bWVudCAod2hpY2ggd2lsbCBiZSBhIHN0YWNrIHVwZGF0ZSlcbiAgICAgIC8vIHdpdGggdGhlIGN1cnJlbnQgaW50ZWdyYXRpb24gdGVzdFxuICAgICAgLy8gV2UgYWxzbyBvbmx5IHdhbnQgdG8gcnVuIHRoZSB1cGRhdGUgd29ya2Zsb3cgaWYgdGhlcmUgaXMgYW4gZXhpc3RpbmdcbiAgICAgIC8vIHNuYXBzaG90IChvdGhlcndpc2UgdGhlcmUgaXMgbm90aGluZyB0byB1cGRhdGUpXG4gICAgICBpZiAodXBkYXRlV29ya2Zsb3dFbmFibGVkICYmIHRoaXMuaGFzU25hcHNob3QoKSAmJlxuICAgICAgICAodGhpcy5leHBlY3RlZFRlc3RTdWl0ZSAmJiB0ZXN0Q2FzZU5hbWUgaW4gdGhpcy5leHBlY3RlZFRlc3RTdWl0ZT8udGVzdFN1aXRlKSkge1xuICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIHNuYXBzaG90IGlzIHRoZSBsYXRlc3QgZnJvbSAnb3JpZ2luJ1xuICAgICAgICB0aGlzLmNoZWNrb3V0U25hcHNob3QoKTtcbiAgICAgICAgY29uc3QgZXhwZWN0ZWRUZXN0Q2FzZSA9IHRoaXMuZXhwZWN0ZWRUZXN0U3VpdGUudGVzdFN1aXRlW3Rlc3RDYXNlTmFtZV07XG4gICAgICAgIHRoaXMuY2RrLmRlcGxveSh7XG4gICAgICAgICAgLi4uZGVwbG95QXJncyxcbiAgICAgICAgICBzdGFja3M6IGV4cGVjdGVkVGVzdENhc2Uuc3RhY2tzLFxuICAgICAgICAgIC4uLmV4cGVjdGVkVGVzdENhc2U/LmNka0NvbW1hbmRPcHRpb25zPy5kZXBsb3k/LmFyZ3MsXG4gICAgICAgICAgY29udGV4dDogdGhpcy5nZXRDb250ZXh0KGV4cGVjdGVkVGVzdENhc2U/LmNka0NvbW1hbmRPcHRpb25zPy5kZXBsb3k/LmFyZ3M/LmNvbnRleHQpLFxuICAgICAgICAgIGFwcDogcGF0aC5yZWxhdGl2ZSh0aGlzLmRpcmVjdG9yeSwgdGhpcy5zbmFwc2hvdERpciksXG4gICAgICAgICAgbG9va3VwczogdGhpcy5leHBlY3RlZFRlc3RTdWl0ZT8uZW5hYmxlTG9va3VwcyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvLyBub3cgZGVwbG95IHRoZSBcImFjdHVhbFwiIHRlc3QuXG4gICAgICB0aGlzLmNkay5kZXBsb3koe1xuICAgICAgICAuLi5kZXBsb3lBcmdzLFxuICAgICAgICBsb29rdXBzOiB0aGlzLmFjdHVhbFRlc3RTdWl0ZS5lbmFibGVMb29rdXBzLFxuICAgICAgICBzdGFja3M6IFtcbiAgICAgICAgICAuLi5hY3R1YWxUZXN0Q2FzZS5zdGFja3MsXG4gICAgICAgIF0sXG4gICAgICAgIG91dHB1dDogcGF0aC5yZWxhdGl2ZSh0aGlzLmRpcmVjdG9yeSwgdGhpcy5jZGtPdXREaXIpLFxuICAgICAgICAuLi5hY3R1YWxUZXN0Q2FzZT8uY2RrQ29tbWFuZE9wdGlvbnM/LmRlcGxveT8uYXJncyxcbiAgICAgICAgY29udGV4dDogdGhpcy5nZXRDb250ZXh0KGFjdHVhbFRlc3RDYXNlPy5jZGtDb21tYW5kT3B0aW9ucz8uZGVwbG95Py5hcmdzPy5jb250ZXh0KSxcbiAgICAgICAgYXBwOiB0aGlzLmNka0FwcCxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBJZiB0aGVyZSBhcmUgYW55IGFzc2VydGlvbnNcbiAgICAgIC8vIGRlcGxveSB0aGUgYXNzZXJ0aW9uIHN0YWNrIGFzIHdlbGxcbiAgICAgIC8vIFRoaXMgaXMgc2VwYXJhdGUgZnJvbSB0aGUgYWJvdmUgZGVwbG95bWVudCBiZWNhdXNlIHdlIHdhbnQgdG9cbiAgICAgIC8vIHNldCBgcm9sbGJhY2s6IGZhbHNlYC4gVGhpcyBhbGxvd3MgdGhlIGFzc2VydGlvbiBzdGFjayB0byBkZXBsb3kgYWxsIHRoZVxuICAgICAgLy8gYXNzZXJ0aW9ucyBpbnN0ZWFkIG9mIGZhaWxpbmcgYXQgdGhlIGZpcnN0IGZhaWxlZCBhc3NlcnRpb25cbiAgICAgIC8vIGNvbWJpbmluZyBpdCB3aXRoIHRoZSBhYm92ZSBkZXBsb3ltZW50IHdvdWxkIHByZXZlbnQgYW55IHJlcGxhY2VtZW50IHVwZGF0ZXNcbiAgICAgIGlmIChhY3R1YWxUZXN0Q2FzZS5hc3NlcnRpb25TdGFjaykge1xuICAgICAgICB0aGlzLmNkay5kZXBsb3koe1xuICAgICAgICAgIC4uLmRlcGxveUFyZ3MsXG4gICAgICAgICAgbG9va3VwczogdGhpcy5hY3R1YWxUZXN0U3VpdGUuZW5hYmxlTG9va3VwcyxcbiAgICAgICAgICBzdGFja3M6IFtcbiAgICAgICAgICAgIGFjdHVhbFRlc3RDYXNlLmFzc2VydGlvblN0YWNrLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgcm9sbGJhY2s6IGZhbHNlLFxuICAgICAgICAgIG91dHB1dDogcGF0aC5yZWxhdGl2ZSh0aGlzLmRpcmVjdG9yeSwgdGhpcy5jZGtPdXREaXIpLFxuICAgICAgICAgIC4uLmFjdHVhbFRlc3RDYXNlPy5jZGtDb21tYW5kT3B0aW9ucz8uZGVwbG95Py5hcmdzLFxuICAgICAgICAgIG91dHB1dHNGaWxlOiBwYXRoLnJlbGF0aXZlKHRoaXMuZGlyZWN0b3J5LCBwYXRoLmpvaW4odGhpcy5jZGtPdXREaXIsICdhc3NlcnRpb24tcmVzdWx0cy5qc29uJykpLFxuICAgICAgICAgIGNvbnRleHQ6IHRoaXMuZ2V0Q29udGV4dChhY3R1YWxUZXN0Q2FzZT8uY2RrQ29tbWFuZE9wdGlvbnM/LmRlcGxveT8uYXJncz8uY29udGV4dCksXG4gICAgICAgICAgYXBwOiB0aGlzLmNka0FwcCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhY3R1YWxUZXN0Q2FzZS5ob29rcz8ucG9zdERlcGxveSkge1xuICAgICAgICBhY3R1YWxUZXN0Q2FzZS5ob29rcy5wb3N0RGVwbG95LmZvckVhY2goY21kID0+IHtcbiAgICAgICAgICBleGVjKGNodW5rcyhjbWQpLCB7XG4gICAgICAgICAgICBjd2Q6IHBhdGguZGlybmFtZSh0aGlzLnNuYXBzaG90RGlyKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhY3R1YWxUZXN0Q2FzZS5hc3NlcnRpb25TdGFjayAmJiBhY3R1YWxUZXN0Q2FzZS5hc3NlcnRpb25TdGFja05hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0Fzc2VydGlvblJlc3VsdHMoXG4gICAgICAgICAgcGF0aC5qb2luKHRoaXMuY2RrT3V0RGlyLCAnYXNzZXJ0aW9uLXJlc3VsdHMuanNvbicpLFxuICAgICAgICAgIGFjdHVhbFRlc3RDYXNlLmFzc2VydGlvblN0YWNrTmFtZSxcbiAgICAgICAgICBhY3R1YWxUZXN0Q2FzZS5hc3NlcnRpb25TdGFjayxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLnBhcnNlRXJyb3IoZSxcbiAgICAgICAgYWN0dWFsVGVzdENhc2UuY2RrQ29tbWFuZE9wdGlvbnM/LmRlcGxveT8uZXhwZWN0RXJyb3IgPz8gZmFsc2UsXG4gICAgICAgIGFjdHVhbFRlc3RDYXNlLmNka0NvbW1hbmRPcHRpb25zPy5kZXBsb3k/LmV4cGVjdGVkTWVzc2FnZSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIHRoZSBvdXRwdXRzRmlsZSB3aGljaCBjb250YWlucyB0aGUgYXNzZXJ0aW9ucyByZXN1bHRzIGFzIHN0YWNrXG4gICAqIG91dHB1dHNcbiAgICovXG4gIHByaXZhdGUgcHJvY2Vzc0Fzc2VydGlvblJlc3VsdHMoZmlsZTogc3RyaW5nLCBhc3NlcnRpb25TdGFja05hbWU6IHN0cmluZywgYXNzZXJ0aW9uU3RhY2tJZDogc3RyaW5nKTogQXNzZXJ0aW9uUmVzdWx0cyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVzdWx0czogQXNzZXJ0aW9uUmVzdWx0cyA9IHt9O1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGUpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBvdXRwdXRzOiB7IFtrZXk6IHN0cmluZ106IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gfSA9IGZzLnJlYWRKU09OU3luYyhmaWxlKTtcblxuICAgICAgICBpZiAoYXNzZXJ0aW9uU3RhY2tOYW1lIGluIG91dHB1dHMpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IFthc3NlcnRpb25JZCwgcmVzdWx0XSBvZiBPYmplY3QuZW50cmllcyhvdXRwdXRzW2Fzc2VydGlvblN0YWNrTmFtZV0pKSB7XG4gICAgICAgICAgICBpZiAoYXNzZXJ0aW9uSWQuc3RhcnRzV2l0aCgnQXNzZXJ0aW9uUmVzdWx0cycpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGFzc2VydGlvblJlc3VsdDogQXNzZXJ0aW9uUmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQucmVwbGFjZSgvXFxuL2csICdcXFxcbicpKTtcbiAgICAgICAgICAgICAgaWYgKGFzc2VydGlvblJlc3VsdC5zdGF0dXMgPT09ICdmYWlsJyB8fCBhc3NlcnRpb25SZXN1bHQuc3RhdHVzID09PSAnc3VjY2VzcycpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRzW2Fzc2VydGlvbklkXSA9IGFzc2VydGlvblJlc3VsdDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBpZiB0aGVyZSBhcmUgb3V0cHV0cywgYnV0IHRoZXkgY2Fubm90IGJlIHByb2Nlc3NlZCwgdGhlbiB0aHJvdyBhbiBlcnJvclxuICAgICAgICAvLyBzbyB0aGF0IHRoZSB0ZXN0IGZhaWxzXG4gICAgICAgIHJlc3VsdHNbYXNzZXJ0aW9uU3RhY2tJZF0gPSB7XG4gICAgICAgICAgc3RhdHVzOiAnZmFpbCcsXG4gICAgICAgICAgbWVzc2FnZTogYGVycm9yIHByb2Nlc3NpbmcgYXNzZXJ0aW9uIHJlc3VsdHM6ICR7ZX1gLFxuICAgICAgICB9O1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgLy8gcmVtb3ZlIHRoZSBvdXRwdXRzIGZpbGUgc28gaXQgaXMgbm90IHBhcnQgb2YgdGhlIHNuYXBzaG90XG4gICAgICAgIC8vIGl0IHdpbGwgY29udGFpbiBlbnYgc3BlY2lmaWMgaW5mb3JtYXRpb24gZnJvbSB2YWx1ZXNcbiAgICAgICAgLy8gcmVzb2x2ZWQgYXQgZGVwbG95IHRpbWVcbiAgICAgICAgZnMudW5saW5rU3luYyhmaWxlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHJlc3VsdHMpLmxlbmd0aCA+IDAgPyByZXN1bHRzIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhbiBlcnJvciBtZXNzYWdlIHJldHVybmVkIGZyb20gYSBDREsgY29tbWFuZFxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZUVycm9yKGU6IHVua25vd24sIGV4cGVjdEVycm9yOiBib29sZWFuLCBleHBlY3RlZE1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBpZiAoZXhwZWN0RXJyb3IpIHtcbiAgICAgIGlmIChleHBlY3RlZE1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IChlIGFzIEVycm9yKS5tZXNzYWdlO1xuICAgICAgICBpZiAoIW1lc3NhZ2UubWF0Y2goZXhwZWN0ZWRNZXNzYWdlKSkge1xuICAgICAgICAgIHRocm93IChlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
487
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWctdGVzdC1ydW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbnRlZy10ZXN0LXJ1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBNkI7QUFFN0IsOERBQThFO0FBQzlFLDBFQUFpRTtBQUNqRSxxQ0FBcUM7QUFDckMsK0JBQStCO0FBQy9CLHlDQUF5QztBQUV6QywrQ0FBbUU7QUFDbkUsb0NBQW9DO0FBQ3BDLG9DQUF3QztBQUV4Qyw4Q0FBNkU7QUEwRDdFOzs7R0FHRztBQUNILE1BQWEsZUFBZ0IsU0FBUSx5QkFBVztJQUM5QyxZQUFZLE9BQTJCLEVBQUUsa0JBQXdDO1FBQy9FLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxrQkFBa0IsQ0FBQztRQUU5QyxzREFBc0Q7UUFDdEQsMERBQTBEO1FBQzFELDREQUE0RDtRQUM1RCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUM3QyxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEscURBQXFEO2dCQUNuRix5QkFBeUI7Z0JBQ3pCLGdGQUFnRixDQUNqRixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFTSxvQkFBb0I7UUFDekIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7WUFDeEMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ25ELEtBQUssRUFBRSxFQUFHO2FBQ1gsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSyxnQkFBZ0I7UUFDdEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMs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TSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNaLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLENBQUMsQ0FBQztRQUNWLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFoZ0JELDBDQWdnQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHR5cGUgeyBEZXBsb3lPcHRpb25zLCBEZXN0cm95T3B0aW9ucyB9IGZyb20gJ0Bhd3MtY2RrL2Nkay1jbGktd3JhcHBlcic7XG5pbXBvcnQgeyBIb3Rzd2FwTW9kZSwgU3RhY2tBY3Rpdml0eVByb2dyZXNzIH0gZnJvbSAnQGF3cy1jZGsvY2RrLWNsaS13cmFwcGVyJztcbmltcG9ydCB7IFJlcXVpcmVBcHByb3ZhbCB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LXNjaGVtYSc7XG5pbXBvcnQgKiBhcyBjaG9raWRhciBmcm9tICdjaG9raWRhcic7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgKiBhcyB3b3JrZXJwb29sIGZyb20gJ3dvcmtlcnBvb2wnO1xuaW1wb3J0IHR5cGUgeyBJbnRlZ1J1bm5lck9wdGlvbnMgfSBmcm9tICcuL3J1bm5lci1iYXNlJztcbmltcG9ydCB7IEludGVnUnVubmVyLCBERUZBVUxUX1NZTlRIX09QVElPTlMgfSBmcm9tICcuL3J1bm5lci1iYXNlJztcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHsgY2h1bmtzLCBleGVjIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBEZXN0cnVjdGl2ZUNoYW5nZSwgQXNzZXJ0aW9uUmVzdWx0cywgQXNzZXJ0aW9uUmVzdWx0IH0gZnJvbSAnLi4vd29ya2Vycy9jb21tb24nO1xuaW1wb3J0IHsgRGlhZ25vc3RpY1JlYXNvbiwgZm9ybWF0QXNzZXJ0aW9uUmVzdWx0cyB9IGZyb20gJy4uL3dvcmtlcnMvY29tbW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBDb21tb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2VcbiAgICovXG4gIHJlYWRvbmx5IHRlc3RDYXNlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbGV2ZWwgb2YgdmVyYm9zaXR5IGZvciBsb2dnaW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICByZWFkb25seSB2ZXJib3NpdHk/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hPcHRpb25zIGV4dGVuZHMgQ29tbW9uT3B0aW9ucyB7XG5cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgaW50ZWdyYXRpb24gdGVzdCBydW5uZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5PcHRpb25zIGV4dGVuZHMgQ29tbW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBydW4gYGNkayBkZXN0cm95YCBhbmQgY2xlYW51cCB0aGVcbiAgICogaW50ZWdyYXRpb24gdGVzdCBzdGFja3MuXG4gICAqXG4gICAqIFNldCB0aGlzIHRvIGZhbHNlIGlmIHlvdSBuZWVkIHRvIHBlcmZvcm0gYW55IHZhbGlkYXRpb25cbiAgICogb3IgdHJvdWJsZXNob290aW5nIGFmdGVyIGRlcGxveW1lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGNsZWFuPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgc2V0IHRvIHRydWUsIHRoZSBpbnRlZ3JhdGlvbiB0ZXN0IHdpbGwgbm90IGRlcGxveVxuICAgKiBhbnl0aGluZyBhbmQgd2lsbCBzaW1wbHkgdXBkYXRlIHRoZSBzbmFwc2hvdC5cbiAgICpcbiAgICogWW91IHNob3VsZCBOT1QgdXNlIHRoaXMgbWV0aG9kIHNpbmNlIHlvdSBhcmUgZXNzZW50aWFsbHlcbiAgICogYnlwYXNzaW5nIHRoZSBpbnRlZ3JhdGlvbiB0ZXN0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZHJ5UnVuPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgdGhpcyBpcyBzZXQgdG8gZmFsc2UgdGhlbiB0aGUgc3RhY2sgdXBkYXRlIHdvcmtmbG93IHdpbGxcbiAgICogbm90IGJlIHJ1blxuICAgKlxuICAgKiBUaGUgdXBkYXRlIHdvcmtmbG93IGV4aXN0cyB0byBjaGVjayBmb3IgY2FzZXMgd2hlcmUgYSBjaGFuZ2Ugd291bGQgY2F1c2VcbiAgICogYSBmYWlsdXJlIHRvIGFuIGV4aXN0aW5nIHN0YWNrLCBidXQgbm90IGZvciBhIG5ld2x5IGNyZWF0ZWQgc3RhY2suXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHVwZGF0ZVdvcmtmbG93PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBbiBpbnRlZ3JhdGlvbiB0ZXN0IHJ1bm5lciB0aGF0IG9yY2hlc3RyYXRlcyBleGVjdXRpbmdcbiAqIGludGVncmF0aW9uIHRlc3RzXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlZ1Rlc3RSdW5uZXIgZXh0ZW5kcyBJbnRlZ1J1bm5lciB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEludGVnUnVubmVyT3B0aW9ucywgZGVzdHJ1Y3RpdmVDaGFuZ2VzPzogRGVzdHJ1Y3RpdmVDaGFuZ2VbXSkge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIHRoaXMuX2Rlc3RydWN0aXZlQ2hhbmdlcyA9IGRlc3RydWN0aXZlQ2hhbmdlcztcblxuICAgIC8vIFdlIGRvbid0IHdhbnQgbmV3IHRlc3RzIHdyaXR0ZW4gaW4gdGhlIGxlZ2FjeSBtb2RlLlxuICAgIC8vIElmIHRoZXJlIGlzIG5vIGV4aXN0aW5nIHNuYXBzaG90IF9hbmRfIHRoaXMgaXMgYSBsZWdhY3lcbiAgICAvLyB0ZXN0IHRoZW4gcG9pbnQgdGhlIHVzZXIgdG8gdGhlIG5ldyBgSW50ZWdUZXN0YCBjb25zdHJ1Y3RcbiAgICBpZiAoIXRoaXMuaGFzU25hcHNob3QoKSAmJiB0aGlzLmlzTGVnYWN5VGVzdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMudGVzdE5hbWV9IGlzIGEgbmV3IHRlc3QuIFBsZWFzZSB1c2UgdGhlIEludGVnVGVzdCBjb25zdHJ1Y3QgYCArXG4gICAgICAgICd0byBjb25maWd1cmUgdGhlIHRlc3RcXG4nICtcbiAgICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay90cmVlL21haW4vcGFja2FnZXMvJTQwYXdzLWNkay9pbnRlZy10ZXN0cy1hbHBoYScsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVDZGtDb250ZXh0SnNvbigpOiB2b2lkIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5jZGtDb250ZXh0UGF0aCkpIHtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5jZGtDb250ZXh0UGF0aCwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB3YXRjaDogeyB9LFxuICAgICAgfSwgdW5kZWZpbmVkLCAyKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4gcnVubmluZyBpbnRlZ3JhdGlvbiB0ZXN0cyB3aXRoIHRoZSB1cGRhdGUgcGF0aCB3b3JrZmxvd1xuICAgKiBpdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGUgc25hcHNob3QgdGhhdCBpcyBkZXBsb3llZCBpcyB0aGUgY3VycmVudCBzbmFwc2hvdFxuICAgKiBmcm9tIHRoZSB1cHN0cmVhbSBicmFuY2guIEluIG9yZGVyIHRvIGd1YXJhbnRlZSB0aGF0LCBmaXJzdCBjaGVja291dCB0aGUgbGF0ZXN0XG4gICAqICh0byB0aGUgdXNlcikgc25hcHNob3QgZnJvbSB1cHN0cmVhbVxuICAgKlxuICAgKiBJdCBpcyBub3Qgc3RyYWlnaHRmb3J3YXJkIHRvIGZpZ3VyZSBvdXQgd2hhdCBicmFuY2ggdGhlIGN1cnJlbnRcbiAgICogd29ya2luZyBicmFuY2ggd2FzIGNyZWF0ZWQgZnJvbS4gVGhpcyBpcyBhIGJlc3QgZWZmb3J0IGF0dGVtcHQgdG8gZG8gc28uXG4gICAqIFRoaXMgYXNzdW1lcyB0aGF0IHRoZXJlIGlzIGFuICdvcmlnaW4nLiBgZ2l0IHJlbW90ZSBzaG93IG9yaWdpbmAgcmV0dXJucyBhIGxpc3Qgb2ZcbiAgICogYWxsIGJyYW5jaGVzIGFuZCB3ZSB0aGVuIHNlYXJjaCBmb3Igb25lIHRoYXQgc3RhcnRzIHdpdGggYEhFQUQgYnJhbmNoOiBgXG4gICAqL1xuICBwcml2YXRlIGNoZWNrb3V0U25hcHNob3QoKTogdm9pZCB7XG4gICAgY29uc3QgY3dkID0gdGhpcy5kaXJlY3Rvcnk7XG5cbiAgICAvLyBodHRwczovL2dpdC1zY20uY29tL2RvY3MvZ2l0LW1lcmdlLWJhc2VcbiAgICBsZXQgYmFzZUJyYW5jaDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIC8vIHRyeSB0byBmaW5kIHRoZSBiYXNlIGJyYW5jaCB0aGF0IHRoZSB3b3JraW5nIGJyYW5jaCB3YXMgY3JlYXRlZCBmcm9tXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9yaWdpbjogc3RyaW5nID0gZXhlYyhbJ2dpdCcsICdyZW1vdGUnLCAnc2hvdycsICdvcmlnaW4nXSwge1xuICAgICAgICBjd2QsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG9yaWdpbkxpbmVzID0gb3JpZ2luLnNwbGl0KCdcXG4nKTtcbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBvcmlnaW5MaW5lcykge1xuICAgICAgICBpZiAobGluZS50cmltKCkuc3RhcnRzV2l0aCgnSEVBRCBicmFuY2g6ICcpKSB7XG4gICAgICAgICAgYmFzZUJyYW5jaCA9IGxpbmUudHJpbSgpLnNwbGl0KCdIRUFEIGJyYW5jaDogJylbMV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIud2FybmluZygnJXNcXG4lcycsXG4gICAgICAgICdDb3VsZCBub3QgZGV0ZXJtaW5lIGdpdCBvcmlnaW4gYnJhbmNoLicsXG4gICAgICAgIGBZb3UgbmVlZCB0byBtYW51YWxseSBjaGVja291dCB0aGUgc25hcHNob3QgZGlyZWN0b3J5ICR7dGhpcy5zbmFwc2hvdERpcn1gICtcbiAgICAgICAgJ2Zyb20gdGhlIG1lcmdlLWJhc2UgKGh0dHBzOi8vZ2l0LXNjbS5jb20vZG9jcy9naXQtbWVyZ2UtYmFzZSknLFxuICAgICAgKTtcbiAgICAgIGxvZ2dlci53YXJuaW5nKCdlcnJvcjogJXMnLCBlKTtcbiAgICB9XG5cbiAgICAvLyBpZiB3ZSBmb3VuZCB0aGUgYmFzZSBicmFuY2ggdGhlbiBnZXQgdGhlIG1lcmdlLWJhc2UgKG1vc3QgcmVjZW50IGNvbW1vbiBjb21taXQpXG4gICAgLy8gYW5kIGNoZWNrb3V0IHRoZSBzbmFwc2hvdCB1c2luZyB0aGF0IGNvbW1pdFxuICAgIGlmIChiYXNlQnJhbmNoKSB7XG4gICAgICBjb25zdCByZWxhdGl2ZVNuYXBzaG90RGlyID0gcGF0aC5yZWxhdGl2ZSh0aGlzLmRpcmVjdG9yeSwgdGhpcy5zbmFwc2hvdERpcik7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJhc2UgPSBleGVjKFsnZ2l0JywgJ21lcmdlLWJhc2UnLCAnSEVBRCcsIGJhc2VCcmFuY2hdLCB7XG4gICAgICAgICAgY3dkLFxuICAgICAgICB9KTtcbiAgICAgICAgZXhlYyhbJ2dpdCcsICdjaGVja291dCcsIGJhc2UsICctLScsIHJlbGF0aXZlU25hcHNob3REaXJdLCB7XG4gICAgICAgICAgY3dkLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLndhcm5pbmcoJyVzXFxuJXMnLFxuICAgICAgICAgIGBDb3VsZCBub3QgY2hlY2tvdXQgc25hcHNob3QgZGlyZWN0b3J5ICcke3RoaXMuc25hcHNob3REaXJ9Jy4gUGxlYXNlIHZlcmlmeSB0aGUgZm9sbG93aW5nIGNvbW1hbmQgY29tcGxldGVzIGNvcnJlY3RseTpgLFxuICAgICAgICAgIGBnaXQgY2hlY2tvdXQgJChnaXQgbWVyZ2UtYmFzZSBIRUFEICR7YmFzZUJyYW5jaH0pIC0tICR7cmVsYXRpdmVTbmFwc2hvdERpcn1gLFxuICAgICAgICAgICcnLFxuICAgICAgICApO1xuICAgICAgICBsb2dnZXIud2FybmluZygnZXJyb3I6ICVzJywgZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2RrIGRlcGxveSAtLXdhdGNoIGZvciBhbiBpbnRlZ3JhdGlvbiB0ZXN0XG4gICAqXG4gICAqIFRoaXMgaXMgbWVhbnQgdG8gYmUgcnVuIG9uIGEgc2luZ2xlIHRlc3QgYW5kIHdpbGwgbm90IGNyZWF0ZSBhIHNuYXBzaG90XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgd2F0Y2hJbnRlZ1Rlc3Qob3B0aW9uczogV2F0Y2hPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYWN0dWFsVGVzdENhc2UgPSB0aGlzLmFjdHVhbFRlc3RTdWl0ZS50ZXN0U3VpdGVbb3B0aW9ucy50ZXN0Q2FzZU5hbWVdO1xuICAgIGlmICghYWN0dWFsVGVzdENhc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRGlkIG5vdCBmaW5kIHRlc3QgY2FzZSBuYW1lICcke29wdGlvbnMudGVzdENhc2VOYW1lfScgaW4gJyR7T2JqZWN0LmtleXModGhpcy5hY3R1YWxUZXN0U3VpdGUudGVzdFN1aXRlKX0nYCk7XG4gICAgfVxuICAgIGNvbnN0IGVuYWJsZUZvclZlcmJvc2l0eUxldmVsID0gKG5lZWRlZCA9IDEpID0+IHtcbiAgICAgIGNvbnN0IHZlcmJvc2l0eSA9IG9wdGlvbnMudmVyYm9zaXR5ID8/IDA7XG4gICAgICByZXR1cm4gKHZlcmJvc2l0eSA+PSBuZWVkZWQpID8gdHJ1ZSA6IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLndhdGNoKFxuICAgICAgICB7XG4gICAgICAgICAgLi4udGhpcy5kZWZhdWx0QXJncyxcbiAgICAgICAgICBwcm9ncmVzczogU3RhY2tBY3Rpdml0eVByb2dyZXNzLkJBUixcbiAgICAgICAgICBob3Rzd2FwOiBIb3Rzd2FwTW9kZS5GQUxMX0JBQ0ssXG4gICAgICAgICAgZGVwbG95bWVudE1ldGhvZDogJ2RpcmVjdCcsXG4gICAgICAgICAgcHJvZmlsZTogdGhpcy5wcm9maWxlLFxuICAgICAgICAgIHJlcXVpcmVBcHByb3ZhbDogUmVxdWlyZUFwcHJvdmFsLk5FVkVSLFxuICAgICAgICAgIHRyYWNlTG9nczogZW5hYmxlRm9yVmVyYm9zaXR5TGV2ZWwoMikgPz8gZmFsc2UsXG4gICAgICAgICAgdmVyYm9zZTogZW5hYmxlRm9yVmVyYm9zaXR5TGV2ZWwoMyksXG4gICAgICAgICAgZGVidWc6IGVuYWJsZUZvclZlcmJvc2l0eUxldmVsKDQpLFxuICAgICAgICAgIHdhdGNoOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBvcHRpb25zLnRlc3RDYXNlTmFtZSxcbiAgICAgICAgb3B0aW9ucy52ZXJib3NpdHkgPz8gMCxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3JjaGVzdHJhdGVzIHJ1bm5pbmcgaW50ZWdyYXRpb24gdGVzdHMuIEN1cnJlbnRseSB0aGlzIGluY2x1ZGVzXG4gICAqXG4gICAqIDEuIChpZiB1cGRhdGUgd29ya2Zsb3cgaXMgZW5hYmxlZCkgRGVwbG95aW5nIHRoZSBzbmFwc2hvdCB0ZXN0IHN0YWNrc1xuICAgKiAyLiBEZXBsb3lpbmcgdGhlIGludGVncmF0aW9uIHRlc3Qgc3RhY2tzXG4gICAqIDIuIFNhdmluZyB0aGUgc25hcHNob3QgKGlmIHN1Y2Nlc3NmdWwpXG4gICAqIDMuIERlc3Ryb3lpbmcgdGhlIGludGVncmF0aW9uIHRlc3Qgc3RhY2tzIChpZiBjbGVhbj1mYWxzZSlcbiAgICpcbiAgICogVGhlIHVwZGF0ZSB3b3JrZmxvdyBleGlzdHMgdG8gY2hlY2sgZm9yIGNhc2VzIHdoZXJlIGEgY2hhbmdlIHdvdWxkIGNhdXNlXG4gICAqIGEgZmFpbHVyZSB0byBhbiBleGlzdGluZyBzdGFjaywgYnV0IG5vdCBmb3IgYSBuZXdseSBjcmVhdGVkIHN0YWNrLlxuICAgKi9cbiAgcHVibGljIHJ1bkludGVnVGVzdENhc2Uob3B0aW9uczogUnVuT3B0aW9ucyk6IEFzc2VydGlvblJlc3VsdHMgfCB1bmRlZmluZWQge1xuICAgIGxldCBhc3NlcnRpb25SZXN1bHRzOiBBc3NlcnRpb25SZXN1bHRzIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGFjdHVhbFRlc3RDYXNlID0gdGhpcy5hY3R1YWxUZXN0U3VpdGUudGVzdFN1aXRlW29wdGlvbnMudGVzdENhc2VOYW1lXTtcbiAgICBpZiAoIWFjdHVhbFRlc3RDYXNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYERpZCBub3QgZmluZCB0ZXN0IGNhc2UgbmFtZSAnJHtvcHRpb25zLnRlc3RDYXNlTmFtZX0nIGluICcke09iamVjdC5rZXlzKHRoaXMuYWN0dWFsVGVzdFN1aXRlLnRlc3RTdWl0ZSl9J2ApO1xuICAgIH1cbiAgICBjb25zdCBjbGVhbiA9IG9wdGlvbnMuY2xlYW4gPz8gdHJ1ZTtcbiAgICBjb25zdCB1cGRhdGVXb3JrZmxvd0VuYWJsZWQgPSAob3B0aW9ucy51cGRhdGVXb3JrZmxvdyA/PyB0cnVlKVxuICAgICAgJiYgKGFjdHVhbFRlc3RDYXNlLnN0YWNrVXBkYXRlV29ya2Zsb3cgPz8gdHJ1ZSk7XG4gICAgY29uc3QgZW5hYmxlRm9yVmVyYm9zaXR5TGV2ZWwgPSAobmVlZGVkID0gMSkgPT4ge1xuICAgICAgY29uc3QgdmVyYm9zaXR5ID0gb3B0aW9ucy52ZXJib3NpdHkgPz8gMDtcbiAgICAgIHJldHVybiAodmVyYm9zaXR5ID49IG5lZWRlZCkgPyB0cnVlIDogdW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgaWYgKCFvcHRpb25zLmRyeVJ1biAmJiAoYWN0dWFsVGVzdENhc2UuY2RrQ29tbWFuZE9wdGlvbnM/LmRlcGxveT8uZW5hYmxlZCA/PyB0cnVlKSkge1xuICAgICAgICBhc3NlcnRpb25SZXN1bHRzID0gdGhpcy5kZXBsb3koXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4udGhpcy5kZWZhdWx0QXJncyxcbiAgICAgICAgICAgIHByb2ZpbGU6IHRoaXMucHJvZmlsZSxcbiAgICAgICAgICAgIHJlcXVpcmVBcHByb3ZhbDogUmVxdWlyZUFwcHJvdmFsLk5FVkVSLFxuICAgICAgICAgICAgdmVyYm9zZTogZW5hYmxlRm9yVmVyYm9zaXR5TGV2ZWwoMyksXG4gICAgICAgICAgICBkZWJ1ZzogZW5hYmxlRm9yVmVyYm9zaXR5TGV2ZWwoNCksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1cGRhdGVXb3JrZmxvd0VuYWJsZWQsXG4gICAgICAgICAgb3B0aW9ucy50ZXN0Q2FzZU5hbWUsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlbnY6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICAgICAgLi4uREVGQVVMVF9TWU5USF9PUFRJT05TLmVudixcbiAgICAgICAgICBDREtfQ09OVEVYVF9KU09OOiBKU09OLnN0cmluZ2lmeSh0aGlzLmdldENvbnRleHQoe1xuICAgICAgICAgICAgLi4udGhpcy5hY3R1YWxUZXN0U3VpdGUuZW5hYmxlTG9va3VwcyA/IERFRkFVTFRfU1lOVEhfT1BUSU9OUy5jb250ZXh0IDoge30sXG4gICAgICAgICAgfSkpLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNkay5zeW50aEZhc3Qoe1xuICAgICAgICAgIGV4ZWNDbWQ6IHRoaXMuY2RrQXBwLnNwbGl0KCcgJyksXG4gICAgICAgICAgZW52LFxuICAgICAgICAgIG91dHB1dDogcGF0aC5yZWxhdGl2ZSh0aGlzLmRpcmVjdG9yeSwgdGhpcy5jZGtPdXREaXIpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIG9ubHkgY3JlYXRlIHRoZSBzbmFwc2hvdCBpZiB0aGVyZSBhcmUgbm8gZmFpbGVkIGFzc2VydGlvbiByZXN1bHRzXG4gICAgICAvLyAoaS5lLiBubyBmYWlsdXJlcylcbiAgICAgIGlmICghYXNzZXJ0aW9uUmVzdWx0cyB8fCAhT2JqZWN0LnZhbHVlcyhhc3NlcnRpb25SZXN1bHRzKS5zb21lKHJlc3VsdCA9PiByZXN1bHQuc3RhdHVzID09PSAnZmFpbCcpKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlU25hcHNob3QoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoIW9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgICAgIGlmIChjbGVhbiAmJiAoYWN0dWFsVGVzdENhc2UuY2RrQ29tbWFuZE9wdGlvbnM/LmRlc3Ryb3k/LmVuYWJsZWQgPz8gdHJ1ZSkpIHtcbiAgICAgICAgICB0aGlzLmRlc3Ryb3kob3B0aW9ucy50ZXN0Q2FzZU5hbWUsIHtcbiAgICAgICAgICAgIC4uLnRoaXMuZGVmYXVsdEFyZ3MsXG4gICAgICAgICAgICBwcm9maWxlOiB0aGlzLnByb2ZpbGUsXG4gICAgICAgICAgICBhbGw6IHRydWUsXG4gICAgICAgICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgICAgICAgIGFwcDogdGhpcy5jZGtBcHAsXG4gICAgICAgICAgICBvdXRwdXQ6IHBhdGgucmVsYXRpdmUodGhpcy5kaXJlY3RvcnksIHRoaXMuY2RrT3V0RGlyKSxcbiAgICAgICAgICAgIC4uLmFjdHVhbFRlc3RDYXNlLmNka0NvbW1hbmRPcHRpb25zPy5kZXN0cm95Py5hcmdzLFxuICAgICAgICAgICAgY29udGV4dDogdGhpcy5nZXRDb250ZXh0KGFjdHVhbFRlc3RDYXNlLmNka0NvbW1hbmRPcHRpb25zPy5kZXN0cm95Py5hcmdzPy5jb250ZXh0KSxcbiAgICAgICAgICAgIHZlcmJvc2U6IGVuYWJsZUZvclZlcmJvc2l0eUxldmVsKDMpLFxuICAgICAgICAgICAgZGVidWc6IGVuYWJsZUZvclZlcmJvc2l0eUxldmVsKDQpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmNsZWFudXAoKTtcbiAgICB9XG4gICAgcmV0dXJuIGFzc2VydGlvblJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBhIGludGVnIHRlc3QgY2FzZSBzdGFjayBkZXN0cnVjdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBkZXN0cm95KHRlc3RDYXNlTmFtZTogc3RyaW5nLCBkZXN0cm95QXJnczogRGVzdHJveU9wdGlvbnMpIHtcbiAgICBjb25zdCBhY3R1YWxUZXN0Q2FzZSA9IHRoaXMuYWN0dWFsVGVzdFN1aXRlLnRlc3RTdWl0ZVt0ZXN0Q2FzZU5hbWVdO1xuICAgIHRyeSB7XG4gICAgICBpZiAoYWN0dWFsVGVzdENhc2UuaG9va3M/LnByZURlc3Ryb3kpIHtcbiAgICAgICAgYWN0dWFsVGVzdENhc2UuaG9va3MucHJlRGVzdHJveS5mb3JFYWNoKGNtZCA9PiB7XG4gICAgICAgICAgZXhlYyhjaHVua3MoY21kKSwge1xuICAgICAgICAgICAgY3dkOiBwYXRoLmRpcm5hbWUodGhpcy5zbmFwc2hvdERpciksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5jZGsuZGVzdHJveSh7XG4gICAgICAgIC4uLmRlc3Ryb3lBcmdzLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChhY3R1YWxUZXN0Q2FzZS5ob29rcz8ucG9zdERlc3Ryb3kpIHtcbiAgICAgICAgYWN0dWFsVGVzdENhc2UuaG9va3MucG9zdERlc3Ryb3kuZm9yRWFjaChjbWQgPT4ge1xuICAgICAgICAgIGV4ZWMoY2h1bmtzKGNtZCksIHtcbiAgICAgICAgICAgIGN3ZDogcGF0aC5kaXJuYW1lKHRoaXMuc25hcHNob3REaXIpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLnBhcnNlRXJyb3IoZSxcbiAgICAgICAgYWN0dWFsVGVzdENhc2UuY2RrQ29tbWFuZE9wdGlvbnM/LmRlc3Ryb3k/LmV4cGVjdEVycm9yID8/IGZhbHNlLFxuICAgICAgICBhY3R1YWxUZXN0Q2FzZS5jZGtDb21tYW5kT3B0aW9ucz8uZGVzdHJveT8uZXhwZWN0ZWRNZXNzYWdlLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdhdGNoKHdhdGNoQXJnczogRGVwbG95T3B0aW9ucywgdGVzdENhc2VOYW1lOiBzdHJpbmcsIHZlcmJvc2l0eTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYWN0dWFsVGVzdENhc2UgPSB0aGlzLmFjdHVhbFRlc3RTdWl0ZS50ZXN0U3VpdGVbdGVzdENhc2VOYW1lXTtcbiAgICBpZiAoYWN0dWFsVGVzdENhc2UuaG9va3M/LnByZURlcGxveSkge1xuICAgICAgYWN0dWFsVGVzdENhc2UuaG9va3MucHJlRGVwbG95LmZvckVhY2goY21kID0+IHtcbiAgICAgICAgZXhlYyhjaHVua3MoY21kKSwge1xuICAgICAgICAgIGN3ZDogcGF0aC5kaXJuYW1lKHRoaXMuc25hcHNob3REaXIpLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBkZXBsb3lBcmdzID0ge1xuICAgICAgLi4ud2F0Y2hBcmdzLFxuICAgICAgbG9va3VwczogdGhpcy5hY3R1YWxUZXN0U3VpdGUuZW5hYmxlTG9va3VwcyxcbiAgICAgIHN0YWNrczogW1xuICAgICAgICAuLi5hY3R1YWxUZXN0Q2FzZS5zdGFja3MsXG4gICAgICAgIC4uLmFjdHVhbFRlc3RDYXNlLmFzc2VydGlvblN0YWNrID8gW2FjdHVhbFRlc3RDYXNlLmFzc2VydGlvblN0YWNrXSA6IFtdLFxuICAgICAgXSxcbiAgICAgIG91dHB1dDogcGF0aC5yZWxhdGl2ZSh0aGlzLmRpcmVjdG9yeSwgdGhpcy5jZGtPdXREaXIpLFxuICAgICAgb3V0cHV0c0ZpbGU6IHBhdGgucmVsYXRpdmUodGhpcy5kaXJlY3RvcnksIHBhdGguam9pbih0aGlzLmNka091dERpciwgJ2Fzc2VydGlvbi1yZXN1bHRzLmpzb24nKSksXG4gICAgICAuLi5hY3R1YWxUZXN0Q2FzZT8uY2RrQ29tbWFuZE9wdGlvbnM/LmRlcGxveT8uYXJncyxcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgLi4udGhpcy5nZXRDb250ZXh0KGFjdHVhbFRlc3RDYXNlPy5jZGtDb21tYW5kT3B0aW9ucz8uZGVwbG95Py5hcmdzPy5jb250ZXh0KSxcbiAgICAgIH0sXG4gICAgICBhcHA6IHRoaXMuY2RrQXBwLFxuICAgIH07XG4gICAgY29uc3QgZGVzdHJveU1lc3NhZ2UgPSB7XG4gICAgICBhZGRpdGlvbmFsTWVzc2FnZXM6IFtcbiAgICAgICAgJ0FmdGVyIHlvdSBhcmUgZG9uZSB5b3UgbXVzdCBtYW51YWxseSBkZXN0cm95IHRoZSBkZXBsb3llZCBzdGFja3MnLFxuICAgICAgICBgICAke1tcbiAgICAgICAgICAuLi5wcm9jZXNzLmVudi5BV1NfUkVHSU9OID8gW2BBV1NfUkVHSU9OPSR7cHJvY2Vzcy5lbnYuQVdTX1JFR0lPTn1gXSA6IFtdLFxuICAgICAgICAgICdjZGsgZGVzdHJveScsXG4gICAgICAgICAgYC1hICcke3RoaXMuY2RrQXBwfSdgLFxuICAgICAgICAgIGRlcGxveUFyZ3Muc3RhY2tzLmpvaW4oJyAnKSxcbiAgICAgICAgICBgLS1wcm9maWxlICR7ZGVwbG95QXJncy5wcm9maWxlfWAsXG4gICAgICAgIF0uam9pbignICcpfWAsXG4gICAgICBdLFxuICAgIH07XG4gICAgd29ya2VycG9vbC53b3JrZXJFbWl0KGRlc3Ryb3lNZXNzYWdlKTtcbiAgICBpZiAod2F0Y2hBcmdzLnZlcmJvc2UpIHtcbiAgICAgIC8vIGlmIGAtdnZ2YCAob3IgYWJvdmUpIGlzIHVzZWQgdGhlbiBwcmludCBvdXQgdGhlIGNvbW1hbmQgdGhhdCB3YXMgdXNlZFxuICAgICAgLy8gdGhpcyBhbGxvd3MgdXNlcnMgdG8gbWFudWFsbHkgcnVuIHRoZSBjb21tYW5kXG4gICAgICB3b3JrZXJwb29sLndvcmtlckVtaXQoe1xuICAgICAgICBhZGRpdGlvbmFsTWVzc2FnZXM6IFtcbiAgICAgICAgICAnUmVwcm86JyxcbiAgICAgICAgICBgICAke1tcbiAgICAgICAgICAgICdjZGsgc3ludGgnLFxuICAgICAgICAgICAgYC1hICcke3RoaXMuY2RrQXBwfSdgLFxuICAgICAgICAgICAgYC1vICcke3RoaXMuY2RrT3V0RGlyfSdgLFxuICAgICAgICAgICAgLi4uT2JqZWN0LmVudHJpZXModGhpcy5nZXRDb250ZXh0KCkpLmZsYXRNYXAoKFtrLCB2XSkgPT4gdHlwZW9mIHYgIT09ICdvYmplY3QnID8gW2AtYyAnJHtrfT0ke3Z9J2BdIDogW10pLFxuICAgICAgICAgICAgZGVwbG95QXJncy5zdGFja3Muam9pbignICcpLFxuICAgICAgICAgICAgYC0tb3V0cHV0cy1maWxlICR7ZGVwbG95QXJncy5vdXRwdXRzRmlsZX1gLFxuICAgICAgICAgICAgYC0tcHJvZmlsZSAke2RlcGxveUFyZ3MucHJvZmlsZX1gLFxuICAgICAgICAgICAgJy0taG90c3dhcC1mYWxsYmFjaycsXG4gICAgICAgICAgXS5qb2luKCcgJyl9YCxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGFzc2VydGlvblJlc3VsdHMgPSBwYXRoLmpvaW4odGhpcy5jZGtPdXREaXIsICdhc3NlcnRpb24tcmVzdWx0cy5qc29uJyk7XG4gICAgY29uc3Qgd2F0Y2hlciA9IGNob2tpZGFyLndhdGNoKFt0aGlzLmNka091dERpcl0sIHtcbiAgICAgIGN3ZDogdGhpcy5kaXJlY3RvcnksXG4gICAgfSk7XG4gICAgd2F0Y2hlci5vbignYWxsJywgKGV2ZW50OiAnYWRkJyB8ICdjaGFuZ2UnLCBmaWxlOiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIHdlIG9ubHkgY2FyZSBhYm91dCBjaGFuZ2VzIHRvIHRoZSBgYXNzZXJ0aW9uLXJlc3VsdHMuanNvbmAgZmlsZS4gSWYgdGhlcmVcbiAgICAgIC8vIGFyZSBhc3NlcnRpb25zIHRoZW4gdGhpcyB3aWxsIGNoYW5nZSBvbiBldmVyeSBkZXBsb3ltZW50XG4gICAgICBpZiAoYXNzZXJ0aW9uUmVzdWx0cy5lbmRzV2l0aChmaWxlKSAmJiAoZXZlbnQgPT09ICdhZGQnIHx8IGV2ZW50ID09PSAnY2hhbmdlJykpIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICBpZiAoYWN0dWFsVGVzdENhc2UuaG9va3M/LnBvc3REZXBsb3kpIHtcbiAgICAgICAgICBhY3R1YWxUZXN0Q2FzZS5ob29rcy5wb3N0RGVwbG95LmZvckVhY2goY21kID0+IHtcbiAgICAgICAgICAgIGV4ZWMoY2h1bmtzKGNtZCksIHtcbiAgICAgICAgICAgICAgY3dkOiBwYXRoLmRpcm5hbWUodGhpcy5zbmFwc2hvdERpciksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhY3R1YWxUZXN0Q2FzZS5hc3NlcnRpb25TdGFjayAmJiBhY3R1YWxUZXN0Q2FzZS5hc3NlcnRpb25TdGFja05hbWUpIHtcbiAgICAgICAgICBjb25zdCByZXMgPSB0aGlzLnByb2Nlc3NBc3NlcnRpb25SZXN1bHRzKFxuICAgICAgICAgICAgYXNzZXJ0aW9uUmVzdWx0cyxcbiAgICAgICAgICAgIGFjdHVhbFRlc3RDYXNlLmFzc2VydGlvblN0YWNrTmFtZSxcbiAgICAgICAgICAgIGFjdHVhbFRlc3RDYXNlLmFzc2VydGlvblN0YWNrLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHJlcyAmJiBPYmplY3QudmFsdWVzKHJlcykuc29tZShyID0+IHIuc3RhdHVzID09PSAnZmFpbCcpKSB7XG4gICAgICAgICAgICB3b3JrZXJwb29sLndvcmtlckVtaXQoe1xuICAgICAgICAgICAgICByZWFzb246IERpYWdub3N0aWNSZWFzb24uQVNTRVJUSU9OX0ZBSUxFRCxcbiAgICAgICAgICAgICAgdGVzdE5hbWU6IGAke3Rlc3RDYXNlTmFtZX0gKCR7d2F0Y2hBcmdzLnByb2ZpbGV9YCxcbiAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0QXNzZXJ0aW9uUmVzdWx0cyhyZXMpLFxuICAgICAgICAgICAgICBkdXJhdGlvbjogKERhdGUubm93KCkgLSBzdGFydCkgLyAxMDAwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdvcmtlcnBvb2wud29ya2VyRW1pdCh7XG4gICAgICAgICAgICAgIHJlYXNvbjogRGlhZ25vc3RpY1JlYXNvbi5URVNUX1NVQ0NFU1MsXG4gICAgICAgICAgICAgIHRlc3ROYW1lOiBgJHt0ZXN0Q2FzZU5hbWV9YCxcbiAgICAgICAgICAgICAgbWVzc2FnZTogcmVzID8gZm9ybWF0QXNzZXJ0aW9uUmVzdWx0cyhyZXMpIDogJ05PIEFTU0VSVElPTlMnLFxuICAgICAgICAgICAgICBkdXJhdGlvbjogKERhdGUubm93KCkgLSBzdGFydCkgLyAxMDAwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGVtaXQgdGhlIGRlc3Ryb3kgbWVzc2FnZSBhZnRlciBldmVyeSBydW5cbiAgICAgICAgICAvLyBzbyB0aGF0IGl0J3MgdmlzaWJsZSB0byB0aGUgdXNlclxuICAgICAgICAgIHdvcmtlcnBvb2wud29ya2VyRW1pdChkZXN0cm95TWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIHdhdGNoZXIub24oJ3JlYWR5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHt9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY2hpbGQgPSB0aGlzLmNkay53YXRjaChkZXBsb3lBcmdzKTtcbiAgICAvLyBpZiBgLXZgIChvciBhYm92ZSkgaXMgcGFzc2VkIHRoZW4gc3RyZWFtIHRoZSBsb2dzXG4gICAgY2hpbGQuc3Rkb3V0Py5vbignZGF0YScsIChtZXNzYWdlKSA9PiB7XG4gICAgICBpZiAodmVyYm9zaXR5ID4gMCkge1xuICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShtZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjaGlsZC5zdGRlcnI/Lm9uKCdkYXRhJywgKG1lc3NhZ2UpID0+IHtcbiAgICAgIGlmICh2ZXJib3NpdHkgPiAwKSB7XG4gICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKG1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBjaGlsZC5vbignY2xvc2UnLCBhc3luYyAoY29kZSkgPT4ge1xuICAgICAgICBpZiAoY29kZSAhPT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2F0Y2ggZXhpdGVkIHdpdGggZXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgICBjaGlsZC5zdGRpbj8uZW5kKCk7XG4gICAgICAgIGF3YWl0IHdhdGNoZXIuY2xvc2UoKTtcbiAgICAgICAgcmVzb2x2ZShjb2RlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gYSBpbnRlZyB0ZXN0IGNhc2UgZGVwbG95bWVudCwgaW5jbHVkaW5nXG4gICAqIHBlZm9ybWluZyB0aGUgdXBkYXRlIHdvcmtmbG93XG4gICAqL1xuICBwcml2YXRlIGRlcGxveShcbiAgICBkZXBsb3lBcmdzOiBEZXBsb3lPcHRpb25zLFxuICAgIHVwZGF0ZVdvcmtmbG93RW5hYmxlZDogYm9vbGVhbixcbiAgICB0ZXN0Q2FzZU5hbWU6IHN0cmluZyxcbiAgKTogQXNzZXJ0aW9uUmVzdWx0cyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgYWN0dWFsVGVzdENhc2UgPSB0aGlzLmFjdHVhbFRlc3RTdWl0ZS50ZXN0U3VpdGVbdGVzdENhc2VOYW1lXTtcbiAgICB0cnkge1xuICAgICAgaWYgKGFjdHVhbFRlc3RDYXNlLmhvb2tzPy5wcmVEZXBsb3kpIHtcbiAgICAgICAgYWN0dWFsVGVzdENhc2UuaG9va3MucHJlRGVwbG95LmZvckVhY2goY21kID0+IHtcbiAgICAgICAgICBleGVjKGNodW5rcyhjbWQpLCB7XG4gICAgICAgICAgICBjd2Q6IHBhdGguZGlybmFtZSh0aGlzLnNuYXBzaG90RGlyKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvLyBpZiB0aGUgdXBkYXRlIHdvcmtmbG93IGlzIG5vdCBkaXNhYmxlZCwgZmlyc3RcbiAgICAgIC8vIHBlcmZvcm0gYSBkZXBsb3ltZW50IHdpdGggdGhlIGV4aXNpbmcgc25hcHNob3RcbiAgICAgIC8vIHRoZW4gcGVyZm9ybSBhIGRlcGxveW1lbnQgKHdoaWNoIHdpbGwgYmUgYSBzdGFjayB1cGRhdGUpXG4gICAgICAvLyB3aXRoIHRoZSBjdXJyZW50IGludGVncmF0aW9uIHRlc3RcbiAgICAgIC8vIFdlIGFsc28gb25seSB3YW50IHRvIHJ1biB0aGUgdXBkYXRlIHdvcmtmbG93IGlmIHRoZXJlIGlzIGFuIGV4aXN0aW5nXG4gICAgICAvLyBzbmFwc2hvdCAob3RoZXJ3aXNlIHRoZXJlIGlzIG5vdGhpbmcgdG8gdXBkYXRlKVxuICAgICAgaWYgKHVwZGF0ZVdvcmtmbG93RW5hYmxlZCAmJiB0aGlzLmhhc1NuYXBzaG90KCkgJiZcbiAgICAgICAgKHRoaXMuZXhwZWN0ZWRUZXN0U3VpdGUgJiYgdGVzdENhc2VOYW1lIGluIHRoaXMuZXhwZWN0ZWRUZXN0U3VpdGU/LnRlc3RTdWl0ZSkpIHtcbiAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBzbmFwc2hvdCBpcyB0aGUgbGF0ZXN0IGZyb20gJ29yaWdpbidcbiAgICAgICAgdGhpcy5jaGVja291dFNuYXBzaG90KCk7XG4gICAgICAgIGNvbnN0IGV4cGVjdGVkVGVzdENhc2UgPSB0aGlzLmV4cGVjdGVkVGVzdFN1aXRlLnRlc3RTdWl0ZVt0ZXN0Q2FzZU5hbWVdO1xuICAgICAgICB0aGlzLmNkay5kZXBsb3koe1xuICAgICAgICAgIC4uLmRlcGxveUFyZ3MsXG4gICAgICAgICAgc3RhY2tzOiBleHBlY3RlZFRlc3RDYXNlLnN0YWNrcyxcbiAgICAgICAgICAuLi5leHBlY3RlZFRlc3RDYXNlPy5jZGtDb21tYW5kT3B0aW9ucz8uZGVwbG95Py5hcmdzLFxuICAgICAgICAgIGNvbnRleHQ6IHRoaXMuZ2V0Q29udGV4dChleHBlY3RlZFRlc3RDYXNlPy5jZGtDb21tYW5kT3B0aW9ucz8uZGVwbG95Py5hcmdzPy5jb250ZXh0KSxcbiAgICAgICAgICBhcHA6IHBhdGgucmVsYXRpdmUodGhpcy5kaXJlY3RvcnksIHRoaXMuc25hcHNob3REaXIpLFxuICAgICAgICAgIGxvb2t1cHM6IHRoaXMuZXhwZWN0ZWRUZXN0U3VpdGU/LmVuYWJsZUxvb2t1cHMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gbm93IGRlcGxveSB0aGUgXCJhY3R1YWxcIiB0ZXN0LlxuICAgICAgdGhpcy5jZGsuZGVwbG95KHtcbiAgICAgICAgLi4uZGVwbG95QXJncyxcbiAgICAgICAgbG9va3VwczogdGhpcy5hY3R1YWxUZXN0U3VpdGUuZW5hYmxlTG9va3VwcyxcbiAgICAgICAgc3RhY2tzOiBbXG4gICAgICAgICAgLi4uYWN0dWFsVGVzdENhc2Uuc3RhY2tzLFxuICAgICAgICBdLFxuICAgICAgICBvdXRwdXQ6IHBhdGgucmVsYXRpdmUodGhpcy5kaXJlY3RvcnksIHRoaXMuY2RrT3V0RGlyKSxcbiAgICAgICAgLi4uYWN0dWFsVGVzdENhc2U/LmNka0NvbW1hbmRPcHRpb25zPy5kZXBsb3k/LmFyZ3MsXG4gICAgICAgIGNvbnRleHQ6IHRoaXMuZ2V0Q29udGV4dChhY3R1YWxUZXN0Q2FzZT8uY2RrQ29tbWFuZE9wdGlvbnM/LmRlcGxveT8uYXJncz8uY29udGV4dCksXG4gICAgICAgIGFwcDogdGhpcy5jZGtBcHAsXG4gICAgICB9KTtcblxuICAgICAgLy8gSWYgdGhlcmUgYXJlIGFueSBhc3NlcnRpb25zXG4gICAgICAvLyBkZXBsb3kgdGhlIGFzc2VydGlvbiBzdGFjayBhcyB3ZWxsXG4gICAgICAvLyBUaGlzIGlzIHNlcGFyYXRlIGZyb20gdGhlIGFib3ZlIGRlcGxveW1lbnQgYmVjYXVzZSB3ZSB3YW50IHRvXG4gICAgICAvLyBzZXQgYHJvbGxiYWNrOiBmYWxzZWAuIFRoaXMgYWxsb3dzIHRoZSBhc3NlcnRpb24gc3RhY2sgdG8gZGVwbG95IGFsbCB0aGVcbiAgICAgIC8vIGFzc2VydGlvbnMgaW5zdGVhZCBvZiBmYWlsaW5nIGF0IHRoZSBmaXJzdCBmYWlsZWQgYXNzZXJ0aW9uXG4gICAgICAvLyBjb21iaW5pbmcgaXQgd2l0aCB0aGUgYWJvdmUgZGVwbG95bWVudCB3b3VsZCBwcmV2ZW50IGFueSByZXBsYWNlbWVudCB1cGRhdGVzXG4gICAgICBpZiAoYWN0dWFsVGVzdENhc2UuYXNzZXJ0aW9uU3RhY2spIHtcbiAgICAgICAgdGhpcy5jZGsuZGVwbG95KHtcbiAgICAgICAgICAuLi5kZXBsb3lBcmdzLFxuICAgICAgICAgIGxvb2t1cHM6IHRoaXMuYWN0dWFsVGVzdFN1aXRlLmVuYWJsZUxvb2t1cHMsXG4gICAgICAgICAgc3RhY2tzOiBbXG4gICAgICAgICAgICBhY3R1YWxUZXN0Q2FzZS5hc3NlcnRpb25TdGFjayxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHJvbGxiYWNrOiBmYWxzZSxcbiAgICAgICAgICBvdXRwdXQ6IHBhdGgucmVsYXRpdmUodGhpcy5kaXJlY3RvcnksIHRoaXMuY2RrT3V0RGlyKSxcbiAgICAgICAgICAuLi5hY3R1YWxUZXN0Q2FzZT8uY2RrQ29tbWFuZE9wdGlvbnM/LmRlcGxveT8uYXJncyxcbiAgICAgICAgICBvdXRwdXRzRmlsZTogcGF0aC5yZWxhdGl2ZSh0aGlzLmRpcmVjdG9yeSwgcGF0aC5qb2luKHRoaXMuY2RrT3V0RGlyLCAnYXNzZXJ0aW9uLXJlc3VsdHMuanNvbicpKSxcbiAgICAgICAgICBjb250ZXh0OiB0aGlzLmdldENvbnRleHQoYWN0dWFsVGVzdENhc2U/LmNka0NvbW1hbmRPcHRpb25zPy5kZXBsb3k/LmFyZ3M/LmNvbnRleHQpLFxuICAgICAgICAgIGFwcDogdGhpcy5jZGtBcHAsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoYWN0dWFsVGVzdENhc2UuaG9va3M/LnBvc3REZXBsb3kpIHtcbiAgICAgICAgYWN0dWFsVGVzdENhc2UuaG9va3MucG9zdERlcGxveS5mb3JFYWNoKGNtZCA9PiB7XG4gICAgICAgICAgZXhlYyhjaHVua3MoY21kKSwge1xuICAgICAgICAgICAgY3dkOiBwYXRoLmRpcm5hbWUodGhpcy5zbmFwc2hvdERpciksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoYWN0dWFsVGVzdENhc2UuYXNzZXJ0aW9uU3RhY2sgJiYgYWN0dWFsVGVzdENhc2UuYXNzZXJ0aW9uU3RhY2tOYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NBc3NlcnRpb25SZXN1bHRzKFxuICAgICAgICAgIHBhdGguam9pbih0aGlzLmNka091dERpciwgJ2Fzc2VydGlvbi1yZXN1bHRzLmpzb24nKSxcbiAgICAgICAgICBhY3R1YWxUZXN0Q2FzZS5hc3NlcnRpb25TdGFja05hbWUsXG4gICAgICAgICAgYWN0dWFsVGVzdENhc2UuYXNzZXJ0aW9uU3RhY2ssXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5wYXJzZUVycm9yKGUsXG4gICAgICAgIGFjdHVhbFRlc3RDYXNlLmNka0NvbW1hbmRPcHRpb25zPy5kZXBsb3k/LmV4cGVjdEVycm9yID8/IGZhbHNlLFxuICAgICAgICBhY3R1YWxUZXN0Q2FzZS5jZGtDb21tYW5kT3B0aW9ucz8uZGVwbG95Py5leHBlY3RlZE1lc3NhZ2UsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyB0aGUgb3V0cHV0c0ZpbGUgd2hpY2ggY29udGFpbnMgdGhlIGFzc2VydGlvbnMgcmVzdWx0cyBhcyBzdGFja1xuICAgKiBvdXRwdXRzXG4gICAqL1xuICBwcml2YXRlIHByb2Nlc3NBc3NlcnRpb25SZXN1bHRzKGZpbGU6IHN0cmluZywgYXNzZXJ0aW9uU3RhY2tOYW1lOiBzdHJpbmcsIGFzc2VydGlvblN0YWNrSWQ6IHN0cmluZyk6IEFzc2VydGlvblJlc3VsdHMgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlc3VsdHM6IEFzc2VydGlvblJlc3VsdHMgPSB7fTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgb3V0cHV0czogeyBba2V5OiBzdHJpbmddOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IH0gPSBmcy5yZWFkSlNPTlN5bmMoZmlsZSk7XG5cbiAgICAgICAgaWYgKGFzc2VydGlvblN0YWNrTmFtZSBpbiBvdXRwdXRzKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBbYXNzZXJ0aW9uSWQsIHJlc3VsdF0gb2YgT2JqZWN0LmVudHJpZXMob3V0cHV0c1thc3NlcnRpb25TdGFja05hbWVdKSkge1xuICAgICAgICAgICAgaWYgKGFzc2VydGlvbklkLnN0YXJ0c1dpdGgoJ0Fzc2VydGlvblJlc3VsdHMnKSkge1xuICAgICAgICAgICAgICBjb25zdCBhc3NlcnRpb25SZXN1bHQ6IEFzc2VydGlvblJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0LnJlcGxhY2UoL1xcbi9nLCAnXFxcXG4nKSk7XG4gICAgICAgICAgICAgIGlmIChhc3NlcnRpb25SZXN1bHQuc3RhdHVzID09PSAnZmFpbCcgfHwgYXNzZXJ0aW9uUmVzdWx0LnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0c1thc3NlcnRpb25JZF0gPSBhc3NlcnRpb25SZXN1bHQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaWYgdGhlcmUgYXJlIG91dHB1dHMsIGJ1dCB0aGV5IGNhbm5vdCBiZSBwcm9jZXNzZWQsIHRoZW4gdGhyb3cgYW4gZXJyb3JcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgdGVzdCBmYWlsc1xuICAgICAgICByZXN1bHRzW2Fzc2VydGlvblN0YWNrSWRdID0ge1xuICAgICAgICAgIHN0YXR1czogJ2ZhaWwnLFxuICAgICAgICAgIG1lc3NhZ2U6IGBlcnJvciBwcm9jZXNzaW5nIGFzc2VydGlvbiByZXN1bHRzOiAke2V9YCxcbiAgICAgICAgfTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIC8vIHJlbW92ZSB0aGUgb3V0cHV0cyBmaWxlIHNvIGl0IGlzIG5vdCBwYXJ0IG9mIHRoZSBzbmFwc2hvdFxuICAgICAgICAvLyBpdCB3aWxsIGNvbnRhaW4gZW52IHNwZWNpZmljIGluZm9ybWF0aW9uIGZyb20gdmFsdWVzXG4gICAgICAgIC8vIHJlc29sdmVkIGF0IGRlcGxveSB0aW1lXG4gICAgICAgIGZzLnVubGlua1N5bmMoZmlsZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhyZXN1bHRzKS5sZW5ndGggPiAwID8gcmVzdWx0cyA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYW4gZXJyb3IgbWVzc2FnZSByZXR1cm5lZCBmcm9tIGEgQ0RLIGNvbW1hbmRcbiAgICovXG4gIHByaXZhdGUgcGFyc2VFcnJvcihlOiB1bmtub3duLCBleHBlY3RFcnJvcjogYm9vbGVhbiwgZXhwZWN0ZWRNZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgaWYgKGV4cGVjdEVycm9yKSB7XG4gICAgICBpZiAoZXhwZWN0ZWRNZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAoZSBhcyBFcnJvcikubWVzc2FnZTtcbiAgICAgICAgaWYgKCFtZXNzYWdlLm1hdGNoKGV4cGVjdGVkTWVzc2FnZSkpIHtcbiAgICAgICAgICB0aHJvdyAoZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ICdk, ListOptions } from '@aws-cdk/cdk-cli-wrapper';
|
|
2
|
-
import { TestCase, TestOptions } from '@aws-cdk/cloud-assembly-schema';
|
|
1
|
+
import type { ICdk, ListOptions } from '@aws-cdk/cdk-cli-wrapper';
|
|
2
|
+
import type { TestCase, TestOptions } from '@aws-cdk/cloud-assembly-schema';
|
|
3
3
|
/**
|
|
4
4
|
* Represents an integration test
|
|
5
5
|
*/
|
|
@@ -35,23 +35,22 @@ class IntegTestSuite {
|
|
|
35
35
|
*/
|
|
36
36
|
getStacksWithoutUpdateWorkflow() {
|
|
37
37
|
return Object.values(this.testSuite)
|
|
38
|
-
.filter(testCase =>
|
|
38
|
+
.filter(testCase => !(testCase.stackUpdateWorkflow ?? true))
|
|
39
39
|
.flatMap((testCase) => testCase.stacks);
|
|
40
40
|
}
|
|
41
41
|
/**
|
|
42
42
|
* Returns test case options for a given stack
|
|
43
43
|
*/
|
|
44
44
|
getOptionsForStack(stackId) {
|
|
45
|
-
|
|
46
|
-
for (const testCase of Object.values((_a = this.testSuite) !== null && _a !== void 0 ? _a : {})) {
|
|
45
|
+
for (const testCase of Object.values(this.testSuite ?? {})) {
|
|
47
46
|
if (testCase.stacks.includes(stackId)) {
|
|
48
47
|
return {
|
|
49
48
|
hooks: testCase.hooks,
|
|
50
49
|
regions: testCase.regions,
|
|
51
|
-
diffAssets:
|
|
50
|
+
diffAssets: testCase.diffAssets ?? false,
|
|
52
51
|
allowDestroy: testCase.allowDestroy,
|
|
53
52
|
cdkCommandOptions: testCase.cdkCommandOptions,
|
|
54
|
-
stackUpdateWorkflow:
|
|
53
|
+
stackUpdateWorkflow: testCase.stackUpdateWorkflow ?? true,
|
|
55
54
|
};
|
|
56
55
|
}
|
|
57
56
|
}
|
|
@@ -196,4 +195,4 @@ class LegacyIntegTestSuite extends IntegTestSuite {
|
|
|
196
195
|
}
|
|
197
196
|
}
|
|
198
197
|
exports.LegacyIntegTestSuite = LegacyIntegTestSuite;
|
|
199
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWctdGVzdC1zdWl0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImludGVnLXRlc3Qtc3VpdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0JBQStCO0FBRS9CLDBFQUFnRztBQUNoRywrQkFBK0I7QUFDL0IsNkRBQStEO0FBRS9ELE1BQU0sc0JBQXNCLEdBQUcsZ0JBQWdCLENBQUM7QUFDaEQsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDO0FBQ2hDLE1BQU0seUJBQXlCLEdBQUcscUJBQXFCLENBQUM7QUFDeEQsTUFBTSxtQkFBbUIsR0FBRyw4QkFBOEIsQ0FBQztBQUMzRCxNQUFNLHVCQUF1QixHQUFHLGdDQUFnQyxDQUFDO0FBQ2pFLE1BQU0scUJBQXFCLEdBQUcsdUJBQXVCLENBQUM7QUFTdEQ7Ozs7R0FJRztBQUNILE1BQWEsY0FBYztJQUN6Qjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBWTtRQUNqQyxNQUFNLE1BQU0sR0FBRyxvQ0FBbUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEQsT0FBTyxJQUFJLGNBQWMsQ0FDdkIsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQzFCLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUN0QixNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FDMUIsQ0FBQztJQUNKLENBQUM7SUFJRCxZQUNrQixhQUFzQixFQUN0QixTQUFvQixFQUNwQixZQUF5QztRQUZ6QyxrQkFBYSxHQUFiLGFBQWEsQ0FBUztRQUN0QixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLGlCQUFZLEdBQVosWUFBWSxDQUE2QjtRQUwzQyxTQUFJLEdBQWtCLFlBQVksQ0FBQztJQU1oRCxDQUFDO0lBRUo7O09BRUc7SUFDSSw4QkFBOEI7UUFDbkMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7YUFDakMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxF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LG1CQUFtQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDOUYsQ0FBQztJQUlELFlBQ2tCLGFBQXNCLEVBQ3RCLFNBQW9CLEVBQ3BCLFlBQXlDO1FBRXpELEtBQUssQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFKaEIsa0JBQWEsR0FBYixhQUFhLENBQVM7UUFDdEIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUNwQixpQkFBWSxHQUFaLFlBQVksQ0FBNkI7UUFMM0MsU0FBSSxHQUFrQixtQkFBbUIsQ0FBQztJQVExRCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxZQUFZLENBQUMsU0FBaUIsRUFBRSxPQUE2QjtRQUNsRSxNQUFNLFFBQVEsR0FBa0I7WUFDOUIsT0FBTyxFQUFFLGdDQUFRLENBQUMsT0FBTyxFQUFFO1lBQzNCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztZQUN6QixZQUFZLEVBQUUsT0FBTztZQUNyQixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7U0FDbEMsQ0FBQztRQUNGLGdDQUFRLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLG9DQUFtQixDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztJQUNyRyxDQUFDO0NBQ0Y7QUE1SUQsb0RBNElDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgb3NQYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgSUNkaywgTGlzdE9wdGlvbnMgfSBmcm9tICdAYXdzLWNkay9jZGstY2xpLXdyYXBwZXInO1xuaW1wb3J0IHsgVGVzdENhc2UsIFRlc3RPcHRpb25zLCBNYW5pZmVzdCwgSW50ZWdNYW5pZmVzdCB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LXNjaGVtYSc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyBJbnRlZ01hbmlmZXN0UmVhZGVyIH0gZnJvbSAnLi9wcml2YXRlL2ludGVnLW1hbmlmZXN0JztcblxuY29uc3QgQ0RLX0lOVEVHX1NUQUNLX1BSQUdNQSA9ICcvLy8gIWNkay1pbnRlZyc7XG5jb25zdCBQUkFHTUFfUFJFRklYID0gJ3ByYWdtYTonO1xuY29uc3QgU0VUX0NPTlRFWFRfUFJBR01BX1BSRUZJWCA9ICdwcmFnbWE6c2V0LWNvbnRleHQ6JztcbmNvbnN0IFZFUklGWV9BU1NFVF9IQVNIRVMgPSAncHJhZ21hOmluY2x1ZGUtYXNzZXRzLWhhc2hlcyc7XG5jb25zdCBESVNBQkxFX1VQREFURV9XT1JLRkxPVyA9ICdwcmFnbWE6ZGlzYWJsZS11cGRhdGUtd29ya2Zsb3cnO1xuY29uc3QgRU5BQkxFX0xPT0tVUFNfUFJBR01BID0gJ3ByYWdtYTplbmFibGUtbG9va3Vwcyc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBpbnRlZ3JhdGlvbiB0ZXN0XG4gKi9cbmV4cG9ydCB0eXBlIFRlc3RTdWl0ZSA9IHsgW3Rlc3ROYW1lOiBzdHJpbmddOiBUZXN0Q2FzZSB9O1xuXG5leHBvcnQgdHlwZSBUZXN0U3VpdGVUeXBlID0gJ3Rlc3Qtc3VpdGUnIHwgJ2xlZ2FjeS10ZXN0LXN1aXRlJztcblxuLyoqXG4gKiBIZWxwZXIgY2xhc3MgZm9yIHdvcmtpbmcgd2l0aCBJbnRlZ3JhdGlvbiB0ZXN0c1xuICogVGhpcyByZXF1aXJlcyBhbiBgaW50ZWcuanNvbmAgZmlsZSBpbiB0aGUgc25hcHNob3RcbiAqIGRpcmVjdG9yeS4gRm9yIGxlZ2FjeSB0ZXN0IGNhc2VzIHVzZSBMZWdhY3lJbnRlZ1Rlc3RDYXNlc1xuICovXG5leHBvcnQgY2xhc3MgSW50ZWdUZXN0U3VpdGUge1xuICAvKipcbiAgICogTG9hZHMgaW50ZWcgdGVzdHMgZnJvbSBhIHNuYXBzaG90IGRpcmVjdG9yeVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tUGF0aChwYXRoOiBzdHJpbmcpOiBJbnRlZ1Rlc3RTdWl0ZSB7XG4gICAgY29uc3QgcmVhZGVyID0gSW50ZWdNYW5pZmVzdFJlYWRlci5mcm9tUGF0aChwYXRoKTtcbiAgICByZXR1cm4gbmV3IEludGVnVGVzdFN1aXRlKFxuICAgICAgcmVhZGVyLnRlc3RzLmVuYWJsZUxvb2t1cHMsXG4gICAgICByZWFkZXIudGVzdHMudGVzdENhc2VzLFxuICAgICAgcmVhZGVyLnRlc3RzLnN5bnRoQ29udGV4dCxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IHR5cGU6IFRlc3RTdWl0ZVR5cGUgPSAndGVzdC1zdWl0ZSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGVuYWJsZUxvb2t1cHM6IGJvb2xlYW4sXG4gICAgcHVibGljIHJlYWRvbmx5IHRlc3RTdWl0ZTogVGVzdFN1aXRlLFxuICAgIHB1YmxpYyByZWFkb25seSBzeW50aENvbnRleHQ/OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSxcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdGFja3MgdGhhdCBoYXZlIHN0YWNrVXBkYXRlV29ya2Zsb3cgZGlzYWJsZWRcbiAgICovXG4gIHB1YmxpYyBnZXRTdGFja3NXaXRob3V0VXBkYXRlV29ya2Zsb3coKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMudGVzdFN1aXRlKVxuICAgICAgLmZpbHRlcih0ZXN0Q2FzZSA9PiAhKHRlc3RDYXNlLnN0YWNrVXBkYXRlV29ya2Zsb3cgPz8gdHJ1ZSkpXG4gICAgICAuZmxhdE1hcCgodGVzdENhc2U6IFRlc3RDYXNlKSA9PiB0ZXN0Q2FzZS5zdGFja3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGVzdCBjYXNlIG9wdGlvbnMgZm9yIGEgZ2l2ZW4gc3RhY2tcbiAgICovXG4gIHB1YmxpYyBnZXRPcHRpb25zRm9yU3RhY2soc3RhY2tJZDogc3RyaW5nKTogVGVzdE9wdGlvbnMgfCB1bmRlZmluZWQge1xuICAgIGZvciAoY29uc3QgdGVzdENhc2Ugb2YgT2JqZWN0LnZhbHVlcyh0aGlzLnRlc3RTdWl0ZSA/PyB7fSkpIHtcbiAgICAgIGlmICh0ZXN0Q2FzZS5zdGFja3MuaW5jbHVkZXMoc3RhY2tJZCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBob29rczogdGVzdENhc2UuaG9va3MsXG4gICAgICAgICAgcmVnaW9uczogdGVzdENhc2UucmVnaW9ucyxcbiAgICAgICAgICBkaWZmQXNzZXRzOiB0ZXN0Q2FzZS5kaWZmQXNzZXRzID8/IGZhbHNlLFxuICAgICAgICAgIGFsbG93RGVzdHJveTogdGVzdENhc2UuYWxsb3dEZXN0cm95LFxuICAgICAgICAgIGNka0NvbW1hbmRPcHRpb25zOiB0ZXN0Q2FzZS5jZGtDb21tYW5kT3B0aW9ucyxcbiAgICAgICAgICBzdGFja1VwZGF0ZVdvcmtmbG93OiB0ZXN0Q2FzZS5zdGFja1VwZGF0ZVdvcmtmbG93ID8/IHRydWUsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgbGlzdCBvZiBzdGFja3MgaW4gdGhlIHRlc3Qgc3VpdGVcbiAgICovXG4gIHB1YmxpYyBnZXQgc3RhY2tzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLnRlc3RTdWl0ZSkuZmxhdE1hcCh0ZXN0Q2FzZSA9PiB0ZXN0Q2FzZS5zdGFja3MpO1xuICB9XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYSByZWFkaW5nIGEgbGVnYWN5IHRlc3QgY2FzZSBtYW5pZmVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExlZ2FjeVRlc3RDYXNlQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2VcbiAgICovXG4gIHJlYWRvbmx5IHRlc3ROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9wdGlvbnMgdG8gdXNlIHdoZW4gcGVyZm9ybWluZyBgY2RrIGxpc3RgXG4gICAqIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIG5hbWUgb2YgdGhlIHN0YWNrc1xuICAgKiBpbiB0aGUgdGVzdCBjYXNlXG4gICAqL1xuICByZWFkb25seSBsaXN0T3B0aW9uczogTGlzdE9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIEFuIGluc3RhbmNlIG9mIHRoZSBDREsgQ0xJIChlLmcuIENka0NsaVdyYXBwZXIpXG4gICAqL1xuICByZWFkb25seSBjZGs6IElDZGs7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBpbnRlZ3JhdGlvbiB0ZXN0IGZpbGVcbiAgICogaS5lLiBpbnRlZy50ZXN0LmpzXG4gICAqL1xuICByZWFkb25seSBpbnRlZ1NvdXJjZUZpbGVQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogSGVscGVyIGNsYXNzIGZvciBjcmVhdGluZyBhbiBpbnRlZyBtYW5pZmVzdCBmb3IgbGVnYWN5XG4gKiB0ZXN0IGNhc2VzLCBpLmUuIHRlc3RzIHdpdGhvdXQgYSBgaW50ZWcuanNvbmAuXG4gKi9cbmV4cG9ydCBjbGFzcyBMZWdhY3lJbnRlZ1Rlc3RTdWl0ZSBleHRlbmRzIEludGVnVGVzdFN1aXRlIHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNpbmdsZSB0ZXN0IHN0YWNrIHRvIHVzZS5cbiAgICpcbiAgICogSWYgdGhlIHRlc3QgaGFzIGEgc2luZ2xlIHN0YWNrLCBpdCB3aWxsIGJlIGNob3Nlbi4gT3RoZXJ3aXNlIGEgcHJhZ21hIGlzIGV4cGVjdGVkIHdpdGhpbiB0aGVcbiAgICogdGVzdCBmaWxlIHRoZSBuYW1lIG9mIHRoZSBzdGFjazpcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogICAgLy8vICFjZGstaW50ZWcgPHN0YWNrLW5hbWU+XG4gICAqXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21MZWdhY3koY29uZmlnOiBMZWdhY3lUZXN0Q2FzZUNvbmZpZyk6IExlZ2FjeUludGVnVGVzdFN1aXRlIHtcbiAgICBjb25zdCBwcmFnbWFzID0gdGhpcy5wcmFnbWFzKGNvbmZpZy5pbnRlZ1NvdXJjZUZpbGVQYXRoKTtcbiAgICBjb25zdCB0ZXN0czogVGVzdENhc2UgPSB7XG4gICAgICBzdGFja3M6IFtdLFxuICAgICAgZGlmZkFzc2V0czogcHJhZ21hcy5pbmNsdWRlcyhWRVJJRllfQVNTRVRfSEFTSEVTKSxcbiAgICAgIHN0YWNrVXBkYXRlV29ya2Zsb3c6ICFwcmFnbWFzLmluY2x1ZGVzKERJU0FCTEVfVVBEQVRFX1dPUktGTE9XKSxcbiAgICB9O1xuICAgIGNvbnN0IHByYWdtYSA9IHRoaXMucmVhZFN0YWNrUHJhZ21hKGNvbmZpZy5pbnRlZ1NvdXJjZUZpbGVQYXRoKTtcbiAgICBpZiAocHJhZ21hLmxlbmd0aCA+IDApIHtcbiAgICAgIHRlc3RzLnN0YWNrcy5wdXNoKC4uLnByYWdtYSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9wdGlvbnM6IExpc3RPcHRpb25zID0ge1xuICAgICAgICAuLi5jb25maWcubGlzdE9wdGlvbnMsXG4gICAgICAgIG5vdGljZXM6IGZhbHNlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHN0YWNrcyA9IChjb25maWcuY2RrLmxpc3Qob3B0aW9ucykpLnNwbGl0KCdcXG4nKTtcbiAgICAgIGlmIChzdGFja3MubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignXCJjZGstaW50ZWdcIiBjYW4gb25seSBvcGVyYXRlIG9uIGFwcHMgd2l0aCBhIHNpbmdsZSBzdGFjay5cXG5cXG4nICtcbiAgICAgICAgICAnICBJZiB5b3VyIGFwcCBoYXMgbXVsdGlwbGUgc3RhY2tzLCBzcGVjaWZ5IHdoaWNoIHN0YWNrIHRvIHNlbGVjdCBieSBhZGRpbmcgdGhpcyB0byB5b3VyIHRlc3Qgc291cmNlOlxcblxcbicgK1xuICAgICAgICAgIGAgICAgICAke0NES19JTlRFR19TVEFDS19QUkFHTUF9IFNUQUNLIC4uLlxcblxcbmAgK1xuICAgICAgICAgIGAgIEF2YWlsYWJsZSBzdGFja3M6ICR7c3RhY2tzLmpvaW4oJyAnKX0gKHdpbGRjYXJkcyBhcmUgYWxzbyBzdXBwb3J0ZWQpXFxuYCk7XG4gICAgICB9XG4gICAgICBpZiAoc3RhY2tzLmxlbmd0aCA9PT0gMSAmJiBzdGFja3NbMF0gPT09ICcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gc3RhY2sgZm91bmQgZm9yIHRlc3QgJHtjb25maWcudGVzdE5hbWV9YCk7XG4gICAgICB9XG4gICAgICB0ZXN0cy5zdGFja3MucHVzaCguLi5zdGFja3MpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgTGVnYWN5SW50ZWdUZXN0U3VpdGUoXG4gICAgICBwcmFnbWFzLmluY2x1ZGVzKEVOQUJMRV9MT09LVVBTX1BSQUdNQSksXG4gICAgICB7XG4gICAgICAgIFtjb25maWcudGVzdE5hbWVdOiB0ZXN0cyxcbiAgICAgIH0sXG4gICAgICBMZWdhY3lJbnRlZ1Rlc3RTdWl0ZS5nZXRQcmFnbWFDb250ZXh0KGNvbmZpZy5pbnRlZ1NvdXJjZUZpbGVQYXRoKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXRQcmFnbWFDb250ZXh0KGludGVnU291cmNlRmlsZVBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGNvbnN0IGN0eFByYWdtYUNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblxuICAgIC8vIGFwcGx5IGNvbnRleHQgZnJvbSBzZXQtY29udGV4dCBwcmFnbWFcbiAgICAvLyB1c2FnZTogcHJhZ21hOnNldC1jb250ZXh0OmtleT12YWx1ZVxuICAgIGNvbnN0IGN0eFByYWdtYXMgPSAodGhpcy5wcmFnbWFzKGludGVnU291cmNlRmlsZVBhdGgpKS5maWx0ZXIocCA9PiBwLnN0YXJ0c1dpdGgoU0VUX0NPTlRFWFRfUFJBR01BX1BSRUZJWCkpO1xuICAgIGZvciAoY29uc3QgcCBvZiBjdHhQcmFnbWFzKSB7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbiA9IHAuc3Vic3RyaW5nKFNFVF9DT05URVhUX1BSQUdNQV9QUkVGSVgubGVuZ3RoKTtcbiAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGluc3RydWN0aW9uLnNwbGl0KCc9Jyk7XG4gICAgICBpZiAoa2V5ID09IG51bGwgfHwgdmFsdWUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgXCJzZXQtY29udGV4dFwiIHByYWdtYSBzeW50YXguIGV4YW1wbGU6IFwicHJhZ21hOnNldC1jb250ZXh0OkBhd3MtY2RrL2NvcmU6bmV3U3R5bGVTdGFja1N5bnRoZXNpcz10cnVlXCIgZ290OiAke3B9YCk7XG4gICAgICB9XG5cbiAgICAgIGN0eFByYWdtYUNvbnRleHRba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY3R4UHJhZ21hQ29udGV4dCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIHN0YWNrIG5hbWVzIGZyb20gdGhlIFwiIWNkay1pbnRlZ1wiIHByYWdtYS5cbiAgICpcbiAgICogRXZlcnkgd29yZCB0aGF0J3MgTk9UIHByZWZpeGVkIGJ5IFwicHJhZ21hOlwiIGlzIGNvbnNpZGVyZWQgYSBzdGFjayBuYW1lLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiAgICAvLy8gIWNkay1pbnRlZyA8c3RhY2stbmFtZT5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRTdGFja1ByYWdtYShpbnRlZ1NvdXJjZUZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuICh0aGlzLnJlYWRJbnRlZ1ByYWdtYShpbnRlZ1NvdXJjZUZpbGVQYXRoKSkuZmlsdGVyKHAgPT4gIXAuc3RhcnRzV2l0aChQUkFHTUFfUFJFRklYKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBhcmJpdHJhcnkgY2RrLWludGVnIHByYWdtYSBkaXJlY3RpdmVzXG4gICAqXG4gICAqIFJlYWRzIHRoZSB0ZXN0IHNvdXJjZSBmaWxlIGFuZCBsb29rcyBmb3IgdGhlIFwiIWNkay1pbnRlZ1wiIHByYWdtYS4gSWYgaXQgZXhpc3RzLCByZXR1cm5zIGl0J3NcbiAgICogY29udGVudHMuIFRoaXMgYWxsb3dzIGludGVnIHRlc3RzIHRvIHN1cHBseSBjdXN0b20gY29tbWFuZCBsaW5lIGFyZ3VtZW50cyB0byBcImNkayBkZXBsb3lcIiBhbmQgXCJjZGsgc3ludGhcIi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogICAgLy8vICFjZGstaW50ZWcgWy4uLl1cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRJbnRlZ1ByYWdtYShpbnRlZ1NvdXJjZUZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc291cmNlID0gZnMucmVhZEZpbGVTeW5jKGludGVnU291cmNlRmlsZVBhdGgsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gICAgY29uc3QgcHJhZ21hTGluZSA9IHNvdXJjZS5zcGxpdCgnXFxuJykuZmluZCh4ID0+IHguc3RhcnRzV2l0aChDREtfSU5URUdfU1RBQ0tfUFJBR01BICsgJyAnKSk7XG4gICAgaWYgKCFwcmFnbWFMaW5lKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgYXJncyA9IHByYWdtYUxpbmUuc3Vic3RyaW5nKENES19JTlRFR19TVEFDS19QUkFHTUEubGVuZ3RoKS50cmltKCkuc3BsaXQoJyAnKTtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzeW50YXggZm9yIGNkay1pbnRlZyBwcmFnbWEuIFVzYWdlOiBcIiR7Q0RLX0lOVEVHX1NUQUNLX1BSQUdNQX0gW1NUQUNLXSBbcHJhZ21hOlBSQUdNQV0gWy4uLl1cImApO1xuICAgIH1cbiAgICByZXR1cm4gYXJncztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG5vbi1zdGFjayBwcmFnbWFzXG4gICAqXG4gICAqIFRoZXNlIGFyZSBhbGwgcHJhZ21hcyB0aGF0IHN0YXJ0IHdpdGggXCJwcmFnbWE6XCIuXG4gICAqXG4gICAqIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSByZWFzb25zLCBhbGwgcHJhZ21hcyB0aGF0IERPTidUIHN0YXJ0IHdpdGggdGhpc1xuICAgKiBzdHJpbmcgYXJlIGNvbnNpZGVyZWQgdG8gYmUgc3RhY2sgbmFtZXMuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBwcmFnbWFzKGludGVnU291cmNlRmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gKHRoaXMucmVhZEludGVnUHJhZ21hKGludGVnU291cmNlRmlsZVBhdGgpKS5maWx0ZXIocCA9PiBwLnN0YXJ0c1dpdGgoUFJBR01BX1BSRUZJWCkpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IHR5cGU6IFRlc3RTdWl0ZVR5cGUgPSAnbGVnYWN5LXRlc3Qtc3VpdGUnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBlbmFibGVMb29rdXBzOiBib29sZWFuLFxuICAgIHB1YmxpYyByZWFkb25seSB0ZXN0U3VpdGU6IFRlc3RTdWl0ZSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgc3ludGhDb250ZXh0PzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH0sXG4gICkge1xuICAgIHN1cGVyKGVuYWJsZUxvb2t1cHMsIHRlc3RTdWl0ZSk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSB0aGUgaW50ZWcgbWFuaWZlc3QgdG8gYSBkaXJlY3RvcnlcbiAgICovXG4gIHB1YmxpYyBzYXZlTWFuaWZlc3QoZGlyZWN0b3J5OiBzdHJpbmcsIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG4gICAgY29uc3QgbWFuaWZlc3Q6IEludGVnTWFuaWZlc3QgPSB7XG4gICAgICB2ZXJzaW9uOiBNYW5pZmVzdC52ZXJzaW9uKCksXG4gICAgICB0ZXN0Q2FzZXM6IHRoaXMudGVzdFN1aXRlLFxuICAgICAgc3ludGhDb250ZXh0OiBjb250ZXh0LFxuICAgICAgZW5hYmxlTG9va3VwczogdGhpcy5lbmFibGVMb29rdXBzLFxuICAgIH07XG4gICAgTWFuaWZlc3Quc2F2ZUludGVnTWFuaWZlc3QobWFuaWZlc3QsIG9zUGF0aC5qb2luKGRpcmVjdG9yeSwgSW50ZWdNYW5pZmVzdFJlYWRlci5ERUZBVUxUX0ZJTEVOQU1FKSk7XG4gIH1cbn1cbiJdfQ==
|
|
198
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWctdGVzdC1zdWl0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImludGVnLXRlc3Qtc3VpdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0JBQStCO0FBRy9CLDBFQUEwRDtBQUMxRCwrQkFBK0I7QUFDL0IsNkRBQStEO0FBRS9ELE1BQU0sc0JBQXNCLEdBQUcsZ0JBQWdCLENBQUM7QUFDaEQsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDO0FBQ2hDLE1BQU0seUJBQXlCLEdBQUcscUJBQXFCLENBQUM7QUFDeEQsTUFBTSxtQkFBbUIsR0FBRyw4QkFBOEIsQ0FBQztBQUMzRCxNQUFNLHVCQUF1QixHQUFHLGdDQUFnQyxDQUFDO0FBQ2pFLE1BQU0scUJBQXFCLEdBQUcsdUJBQXVCLENBQUM7QUFTdEQ7Ozs7R0FJRztBQUNILE1BQWEsY0FBYztJQUN6Qjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBWTtRQUNqQyxNQUFNLE1BQU0sR0FBRyxvQ0FBbUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEQsT0FBTyxJQUFJLGNBQWMsQ0FDdkIsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQzFCLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUN0QixNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FDMUIsQ0FBQztJQUNKLENBQUM7SUFJRCxZQUNrQixhQUFzQixFQUN0QixTQUFvQixFQUNwQixZQUF5QztRQUZ6QyxrQkFBYSxHQUFiLGFBQWEsQ0FBUztRQUN0QixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLGlCQUFZLEdBQVosWUFBWSxDQUE2QjtRQUwzQyxTQUFJLEdBQWtCLFlBQVksQ0FBQztJQU9uRCxDQUFDO0lBRUQ7O09BRUc7SUFDSSw4QkFBOEI7UUFDbkMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7YUFDakMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxF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QUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBSUQsWUFDa0IsYUFBc0IsRUFDdEIsU0FBb0IsRUFDcEIsWUFBeUM7UUFFekQsS0FBSyxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUpoQixrQkFBYSxHQUFiLGFBQWEsQ0FBUztRQUN0QixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLGlCQUFZLEdBQVosWUFBWSxDQUE2QjtRQUwzQyxTQUFJLEdBQWtCLG1CQUFtQixDQUFDO0lBUTFELENBQUM7SUFFRDs7T0FFRztJQUNJLFlBQVksQ0FBQyxTQUFpQixFQUFFLE9BQTZCO1FBQ2xFLE1BQU0sUUFBUSxHQUFrQjtZQUM5QixPQUFPLEVBQUUsZ0NBQVEsQ0FBQyxPQUFPLEVBQUU7WUFDM0IsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3pCLFlBQVksRUFBRSxPQUFPO1lBQ3JCLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtTQUNsQyxDQUFDO1FBQ0YsZ0NBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsb0NBQW1CLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7Q0FDRjtBQTVJRCxvREE0SUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBvc1BhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgdHlwZSB7IElDZGssIExpc3RPcHRpb25zIH0gZnJvbSAnQGF3cy1jZGsvY2RrLWNsaS13cmFwcGVyJztcbmltcG9ydCB0eXBlIHsgVGVzdENhc2UsIFRlc3RPcHRpb25zLCBJbnRlZ01hbmlmZXN0IH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hJztcbmltcG9ydCB7IE1hbmlmZXN0IH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IEludGVnTWFuaWZlc3RSZWFkZXIgfSBmcm9tICcuL3ByaXZhdGUvaW50ZWctbWFuaWZlc3QnO1xuXG5jb25zdCBDREtfSU5URUdfU1RBQ0tfUFJBR01BID0gJy8vLyAhY2RrLWludGVnJztcbmNvbnN0IFBSQUdNQV9QUkVGSVggPSAncHJhZ21hOic7XG5jb25zdCBTRVRfQ09OVEVYVF9QUkFHTUFfUFJFRklYID0gJ3ByYWdtYTpzZXQtY29udGV4dDonO1xuY29uc3QgVkVSSUZZX0FTU0VUX0hBU0hFUyA9ICdwcmFnbWE6aW5jbHVkZS1hc3NldHMtaGFzaGVzJztcbmNvbnN0IERJU0FCTEVfVVBEQVRFX1dPUktGTE9XID0gJ3ByYWdtYTpkaXNhYmxlLXVwZGF0ZS13b3JrZmxvdyc7XG5jb25zdCBFTkFCTEVfTE9PS1VQU19QUkFHTUEgPSAncHJhZ21hOmVuYWJsZS1sb29rdXBzJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIGludGVncmF0aW9uIHRlc3RcbiAqL1xuZXhwb3J0IHR5cGUgVGVzdFN1aXRlID0geyBbdGVzdE5hbWU6IHN0cmluZ106IFRlc3RDYXNlIH07XG5cbmV4cG9ydCB0eXBlIFRlc3RTdWl0ZVR5cGUgPSAndGVzdC1zdWl0ZScgfCAnbGVnYWN5LXRlc3Qtc3VpdGUnO1xuXG4vKipcbiAqIEhlbHBlciBjbGFzcyBmb3Igd29ya2luZyB3aXRoIEludGVncmF0aW9uIHRlc3RzXG4gKiBUaGlzIHJlcXVpcmVzIGFuIGBpbnRlZy5qc29uYCBmaWxlIGluIHRoZSBzbmFwc2hvdFxuICogZGlyZWN0b3J5LiBGb3IgbGVnYWN5IHRlc3QgY2FzZXMgdXNlIExlZ2FjeUludGVnVGVzdENhc2VzXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlZ1Rlc3RTdWl0ZSB7XG4gIC8qKlxuICAgKiBMb2FkcyBpbnRlZyB0ZXN0cyBmcm9tIGEgc25hcHNob3QgZGlyZWN0b3J5XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21QYXRoKHBhdGg6IHN0cmluZyk6IEludGVnVGVzdFN1aXRlIHtcbiAgICBjb25zdCByZWFkZXIgPSBJbnRlZ01hbmlmZXN0UmVhZGVyLmZyb21QYXRoKHBhdGgpO1xuICAgIHJldHVybiBuZXcgSW50ZWdUZXN0U3VpdGUoXG4gICAgICByZWFkZXIudGVzdHMuZW5hYmxlTG9va3VwcyxcbiAgICAgIHJlYWRlci50ZXN0cy50ZXN0Q2FzZXMsXG4gICAgICByZWFkZXIudGVzdHMuc3ludGhDb250ZXh0LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogVGVzdFN1aXRlVHlwZSA9ICd0ZXN0LXN1aXRlJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgZW5hYmxlTG9va3VwczogYm9vbGVhbixcbiAgICBwdWJsaWMgcmVhZG9ubHkgdGVzdFN1aXRlOiBUZXN0U3VpdGUsXG4gICAgcHVibGljIHJlYWRvbmx5IHN5bnRoQ29udGV4dD86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9LFxuICApIHtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBzdGFja3MgdGhhdCBoYXZlIHN0YWNrVXBkYXRlV29ya2Zsb3cgZGlzYWJsZWRcbiAgICovXG4gIHB1YmxpYyBnZXRTdGFja3NXaXRob3V0VXBkYXRlV29ya2Zsb3coKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMudGVzdFN1aXRlKVxuICAgICAgLmZpbHRlcih0ZXN0Q2FzZSA9PiAhKHRlc3RDYXNlLnN0YWNrVXBkYXRlV29ya2Zsb3cgPz8gdHJ1ZSkpXG4gICAgICAuZmxhdE1hcCgodGVzdENhc2U6IFRlc3RDYXNlKSA9PiB0ZXN0Q2FzZS5zdGFja3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGVzdCBjYXNlIG9wdGlvbnMgZm9yIGEgZ2l2ZW4gc3RhY2tcbiAgICovXG4gIHB1YmxpYyBnZXRPcHRpb25zRm9yU3RhY2soc3RhY2tJZDogc3RyaW5nKTogVGVzdE9wdGlvbnMgfCB1bmRlZmluZWQge1xuICAgIGZvciAoY29uc3QgdGVzdENhc2Ugb2YgT2JqZWN0LnZhbHVlcyh0aGlzLnRlc3RTdWl0ZSA/PyB7fSkpIHtcbiAgICAgIGlmICh0ZXN0Q2FzZS5zdGFja3MuaW5jbHVkZXMoc3RhY2tJZCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBob29rczogdGVzdENhc2UuaG9va3MsXG4gICAgICAgICAgcmVnaW9uczogdGVzdENhc2UucmVnaW9ucyxcbiAgICAgICAgICBkaWZmQXNzZXRzOiB0ZXN0Q2FzZS5kaWZmQXNzZXRzID8/IGZhbHNlLFxuICAgICAgICAgIGFsbG93RGVzdHJveTogdGVzdENhc2UuYWxsb3dEZXN0cm95LFxuICAgICAgICAgIGNka0NvbW1hbmRPcHRpb25zOiB0ZXN0Q2FzZS5jZGtDb21tYW5kT3B0aW9ucyxcbiAgICAgICAgICBzdGFja1VwZGF0ZVdvcmtmbG93OiB0ZXN0Q2FzZS5zdGFja1VwZGF0ZVdvcmtmbG93ID8/IHRydWUsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgbGlzdCBvZiBzdGFja3MgaW4gdGhlIHRlc3Qgc3VpdGVcbiAgICovXG4gIHB1YmxpYyBnZXQgc3RhY2tzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLnRlc3RTdWl0ZSkuZmxhdE1hcCh0ZXN0Q2FzZSA9PiB0ZXN0Q2FzZS5zdGFja3MpO1xuICB9XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYSByZWFkaW5nIGEgbGVnYWN5IHRlc3QgY2FzZSBtYW5pZmVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExlZ2FjeVRlc3RDYXNlQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2VcbiAgICovXG4gIHJlYWRvbmx5IHRlc3ROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9wdGlvbnMgdG8gdXNlIHdoZW4gcGVyZm9ybWluZyBgY2RrIGxpc3RgXG4gICAqIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIG5hbWUgb2YgdGhlIHN0YWNrc1xuICAgKiBpbiB0aGUgdGVzdCBjYXNlXG4gICAqL1xuICByZWFkb25seSBsaXN0T3B0aW9uczogTGlzdE9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIEFuIGluc3RhbmNlIG9mIHRoZSBDREsgQ0xJIChlLmcuIENka0NsaVdyYXBwZXIpXG4gICAqL1xuICByZWFkb25seSBjZGs6IElDZGs7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBpbnRlZ3JhdGlvbiB0ZXN0IGZpbGVcbiAgICogaS5lLiBpbnRlZy50ZXN0LmpzXG4gICAqL1xuICByZWFkb25seSBpbnRlZ1NvdXJjZUZpbGVQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogSGVscGVyIGNsYXNzIGZvciBjcmVhdGluZyBhbiBpbnRlZyBtYW5pZmVzdCBmb3IgbGVnYWN5XG4gKiB0ZXN0IGNhc2VzLCBpLmUuIHRlc3RzIHdpdGhvdXQgYSBgaW50ZWcuanNvbmAuXG4gKi9cbmV4cG9ydCBjbGFzcyBMZWdhY3lJbnRlZ1Rlc3RTdWl0ZSBleHRlbmRzIEludGVnVGVzdFN1aXRlIHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNpbmdsZSB0ZXN0IHN0YWNrIHRvIHVzZS5cbiAgICpcbiAgICogSWYgdGhlIHRlc3QgaGFzIGEgc2luZ2xlIHN0YWNrLCBpdCB3aWxsIGJlIGNob3Nlbi4gT3RoZXJ3aXNlIGEgcHJhZ21hIGlzIGV4cGVjdGVkIHdpdGhpbiB0aGVcbiAgICogdGVzdCBmaWxlIHRoZSBuYW1lIG9mIHRoZSBzdGFjazpcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogICAgLy8vICFjZGstaW50ZWcgPHN0YWNrLW5hbWU+XG4gICAqXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21MZWdhY3koY29uZmlnOiBMZWdhY3lUZXN0Q2FzZUNvbmZpZyk6IExlZ2FjeUludGVnVGVzdFN1aXRlIHtcbiAgICBjb25zdCBwcmFnbWFzID0gdGhpcy5wcmFnbWFzKGNvbmZpZy5pbnRlZ1NvdXJjZUZpbGVQYXRoKTtcbiAgICBjb25zdCB0ZXN0czogVGVzdENhc2UgPSB7XG4gICAgICBzdGFja3M6IFtdLFxuICAgICAgZGlmZkFzc2V0czogcHJhZ21hcy5pbmNsdWRlcyhWRVJJRllfQVNTRVRfSEFTSEVTKSxcbiAgICAgIHN0YWNrVXBkYXRlV29ya2Zsb3c6ICFwcmFnbWFzLmluY2x1ZGVzKERJU0FCTEVfVVBEQVRFX1dPUktGTE9XKSxcbiAgICB9O1xuICAgIGNvbnN0IHByYWdtYSA9IHRoaXMucmVhZFN0YWNrUHJhZ21hKGNvbmZpZy5pbnRlZ1NvdXJjZUZpbGVQYXRoKTtcbiAgICBpZiAocHJhZ21hLmxlbmd0aCA+IDApIHtcbiAgICAgIHRlc3RzLnN0YWNrcy5wdXNoKC4uLnByYWdtYSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9wdGlvbnM6IExpc3RPcHRpb25zID0ge1xuICAgICAgICAuLi5jb25maWcubGlzdE9wdGlvbnMsXG4gICAgICAgIG5vdGljZXM6IGZhbHNlLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHN0YWNrcyA9IChjb25maWcuY2RrLmxpc3Qob3B0aW9ucykpLnNwbGl0KCdcXG4nKTtcbiAgICAgIGlmIChzdGFja3MubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignXCJjZGstaW50ZWdcIiBjYW4gb25seSBvcGVyYXRlIG9uIGFwcHMgd2l0aCBhIHNpbmdsZSBzdGFjay5cXG5cXG4nICtcbiAgICAgICAgICAnICBJZiB5b3VyIGFwcCBoYXMgbXVsdGlwbGUgc3RhY2tzLCBzcGVjaWZ5IHdoaWNoIHN0YWNrIHRvIHNlbGVjdCBieSBhZGRpbmcgdGhpcyB0byB5b3VyIHRlc3Qgc291cmNlOlxcblxcbicgK1xuICAgICAgICAgIGAgICAgICAke0NES19JTlRFR19TVEFDS19QUkFHTUF9IFNUQUNLIC4uLlxcblxcbmAgK1xuICAgICAgICAgIGAgIEF2YWlsYWJsZSBzdGFja3M6ICR7c3RhY2tzLmpvaW4oJyAnKX0gKHdpbGRjYXJkcyBhcmUgYWxzbyBzdXBwb3J0ZWQpXFxuYCk7XG4gICAgICB9XG4gICAgICBpZiAoc3RhY2tzLmxlbmd0aCA9PT0gMSAmJiBzdGFja3NbMF0gPT09ICcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gc3RhY2sgZm91bmQgZm9yIHRlc3QgJHtjb25maWcudGVzdE5hbWV9YCk7XG4gICAgICB9XG4gICAgICB0ZXN0cy5zdGFja3MucHVzaCguLi5zdGFja3MpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgTGVnYWN5SW50ZWdUZXN0U3VpdGUoXG4gICAgICBwcmFnbWFzLmluY2x1ZGVzKEVOQUJMRV9MT09LVVBTX1BSQUdNQSksXG4gICAgICB7XG4gICAgICAgIFtjb25maWcudGVzdE5hbWVdOiB0ZXN0cyxcbiAgICAgIH0sXG4gICAgICBMZWdhY3lJbnRlZ1Rlc3RTdWl0ZS5nZXRQcmFnbWFDb250ZXh0KGNvbmZpZy5pbnRlZ1NvdXJjZUZpbGVQYXRoKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXRQcmFnbWFDb250ZXh0KGludGVnU291cmNlRmlsZVBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGNvbnN0IGN0eFByYWdtYUNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblxuICAgIC8vIGFwcGx5IGNvbnRleHQgZnJvbSBzZXQtY29udGV4dCBwcmFnbWFcbiAgICAvLyB1c2FnZTogcHJhZ21hOnNldC1jb250ZXh0OmtleT12YWx1ZVxuICAgIGNvbnN0IGN0eFByYWdtYXMgPSAodGhpcy5wcmFnbWFzKGludGVnU291cmNlRmlsZVBhdGgpKS5maWx0ZXIocCA9PiBwLnN0YXJ0c1dpdGgoU0VUX0NPTlRFWFRfUFJBR01BX1BSRUZJWCkpO1xuICAgIGZvciAoY29uc3QgcCBvZiBjdHhQcmFnbWFzKSB7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbiA9IHAuc3Vic3RyaW5nKFNFVF9DT05URVhUX1BSQUdNQV9QUkVGSVgubGVuZ3RoKTtcbiAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGluc3RydWN0aW9uLnNwbGl0KCc9Jyk7XG4gICAgICBpZiAoa2V5ID09IG51bGwgfHwgdmFsdWUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgXCJzZXQtY29udGV4dFwiIHByYWdtYSBzeW50YXguIGV4YW1wbGU6IFwicHJhZ21hOnNldC1jb250ZXh0OkBhd3MtY2RrL2NvcmU6bmV3U3R5bGVTdGFja1N5bnRoZXNpcz10cnVlXCIgZ290OiAke3B9YCk7XG4gICAgICB9XG5cbiAgICAgIGN0eFByYWdtYUNvbnRleHRba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY3R4UHJhZ21hQ29udGV4dCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIHN0YWNrIG5hbWVzIGZyb20gdGhlIFwiIWNkay1pbnRlZ1wiIHByYWdtYS5cbiAgICpcbiAgICogRXZlcnkgd29yZCB0aGF0J3MgTk9UIHByZWZpeGVkIGJ5IFwicHJhZ21hOlwiIGlzIGNvbnNpZGVyZWQgYSBzdGFjayBuYW1lLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiAgICAvLy8gIWNkay1pbnRlZyA8c3RhY2stbmFtZT5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRTdGFja1ByYWdtYShpbnRlZ1NvdXJjZUZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuICh0aGlzLnJlYWRJbnRlZ1ByYWdtYShpbnRlZ1NvdXJjZUZpbGVQYXRoKSkuZmlsdGVyKHAgPT4gIXAuc3RhcnRzV2l0aChQUkFHTUFfUFJFRklYKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBhcmJpdHJhcnkgY2RrLWludGVnIHByYWdtYSBkaXJlY3RpdmVzXG4gICAqXG4gICAqIFJlYWRzIHRoZSB0ZXN0IHNvdXJjZSBmaWxlIGFuZCBsb29rcyBmb3IgdGhlIFwiIWNkay1pbnRlZ1wiIHByYWdtYS4gSWYgaXQgZXhpc3RzLCByZXR1cm5zIGl0J3NcbiAgICogY29udGVudHMuIFRoaXMgYWxsb3dzIGludGVnIHRlc3RzIHRvIHN1cHBseSBjdXN0b20gY29tbWFuZCBsaW5lIGFyZ3VtZW50cyB0byBcImNkayBkZXBsb3lcIiBhbmQgXCJjZGsgc3ludGhcIi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogICAgLy8vICFjZGstaW50ZWcgWy4uLl1cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRJbnRlZ1ByYWdtYShpbnRlZ1NvdXJjZUZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc291cmNlID0gZnMucmVhZEZpbGVTeW5jKGludGVnU291cmNlRmlsZVBhdGgsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gICAgY29uc3QgcHJhZ21hTGluZSA9IHNvdXJjZS5zcGxpdCgnXFxuJykuZmluZCh4ID0+IHguc3RhcnRzV2l0aChDREtfSU5URUdfU1RBQ0tfUFJBR01BICsgJyAnKSk7XG4gICAgaWYgKCFwcmFnbWFMaW5lKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgYXJncyA9IHByYWdtYUxpbmUuc3Vic3RyaW5nKENES19JTlRFR19TVEFDS19QUkFHTUEubGVuZ3RoKS50cmltKCkuc3BsaXQoJyAnKTtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzeW50YXggZm9yIGNkay1pbnRlZyBwcmFnbWEuIFVzYWdlOiBcIiR7Q0RLX0lOVEVHX1NUQUNLX1BSQUdNQX0gW1NUQUNLXSBbcHJhZ21hOlBSQUdNQV0gWy4uLl1cImApO1xuICAgIH1cbiAgICByZXR1cm4gYXJncztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG5vbi1zdGFjayBwcmFnbWFzXG4gICAqXG4gICAqIFRoZXNlIGFyZSBhbGwgcHJhZ21hcyB0aGF0IHN0YXJ0IHdpdGggXCJwcmFnbWE6XCIuXG4gICAqXG4gICAqIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSByZWFzb25zLCBhbGwgcHJhZ21hcyB0aGF0IERPTidUIHN0YXJ0IHdpdGggdGhpc1xuICAgKiBzdHJpbmcgYXJlIGNvbnNpZGVyZWQgdG8gYmUgc3RhY2sgbmFtZXMuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBwcmFnbWFzKGludGVnU291cmNlRmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gKHRoaXMucmVhZEludGVnUHJhZ21hKGludGVnU291cmNlRmlsZVBhdGgpKS5maWx0ZXIocCA9PiBwLnN0YXJ0c1dpdGgoUFJBR01BX1BSRUZJWCkpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IHR5cGU6IFRlc3RTdWl0ZVR5cGUgPSAnbGVnYWN5LXRlc3Qtc3VpdGUnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBlbmFibGVMb29rdXBzOiBib29sZWFuLFxuICAgIHB1YmxpYyByZWFkb25seSB0ZXN0U3VpdGU6IFRlc3RTdWl0ZSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgc3ludGhDb250ZXh0PzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH0sXG4gICkge1xuICAgIHN1cGVyKGVuYWJsZUxvb2t1cHMsIHRlc3RTdWl0ZSk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSB0aGUgaW50ZWcgbWFuaWZlc3QgdG8gYSBkaXJlY3RvcnlcbiAgICovXG4gIHB1YmxpYyBzYXZlTWFuaWZlc3QoZGlyZWN0b3J5OiBzdHJpbmcsIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG4gICAgY29uc3QgbWFuaWZlc3Q6IEludGVnTWFuaWZlc3QgPSB7XG4gICAgICB2ZXJzaW9uOiBNYW5pZmVzdC52ZXJzaW9uKCksXG4gICAgICB0ZXN0Q2FzZXM6IHRoaXMudGVzdFN1aXRlLFxuICAgICAgc3ludGhDb250ZXh0OiBjb250ZXh0LFxuICAgICAgZW5hYmxlTG9va3VwczogdGhpcy5lbmFibGVMb29rdXBzLFxuICAgIH07XG4gICAgTWFuaWZlc3Quc2F2ZUludGVnTWFuaWZlc3QobWFuaWZlc3QsIG9zUGF0aC5qb2luKGRpcmVjdG9yeSwgSW50ZWdNYW5pZmVzdFJlYWRlci5ERUZBVUxUX0ZJTEVOQU1FKSk7XG4gIH1cbn1cbiJdfQ==
|