@aws-cdk/integ-runner 2.202.2 → 2.203.0

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.
Files changed (39) hide show
  1. package/THIRD_PARTY_LICENSES +26 -0
  2. package/lib/cli.d.ts.map +1 -1
  3. package/lib/cli.js +3 -2
  4. package/lib/engines/toolkit-lib.d.ts +1 -1
  5. package/lib/engines/toolkit-lib.d.ts.map +1 -1
  6. package/lib/engines/toolkit-lib.js +11 -11
  7. package/lib/files.d.ts +9 -0
  8. package/lib/files.d.ts.map +1 -0
  9. package/lib/files.js +51 -0
  10. package/lib/index.js +218 -182
  11. package/lib/runner/{cdk-integ-helper.d.ts → cdk-test-app.d.ts} +90 -114
  12. package/lib/runner/cdk-test-app.d.ts.map +1 -0
  13. package/lib/runner/cdk-test-app.js +584 -0
  14. package/lib/runner/engine.d.ts +2 -2
  15. package/lib/runner/engine.d.ts.map +1 -1
  16. package/lib/runner/engine.js +2 -2
  17. package/lib/runner/index.d.ts +1 -1
  18. package/lib/runner/index.d.ts.map +1 -1
  19. package/lib/runner/index.js +2 -2
  20. package/lib/runner/integ-test-runner.d.ts +36 -36
  21. package/lib/runner/integ-test-runner.d.ts.map +1 -1
  22. package/lib/runner/integ-test-runner.js +172 -235
  23. package/lib/runner/integ-test-suite.d.ts +6 -11
  24. package/lib/runner/integ-test-suite.d.ts.map +1 -1
  25. package/lib/runner/integ-test-suite.js +14 -20
  26. package/lib/runner/integration-tests.d.ts +12 -3
  27. package/lib/runner/integration-tests.d.ts.map +1 -1
  28. package/lib/runner/integration-tests.js +32 -8
  29. package/lib/runner/snapshot-test-runner.d.ts +19 -22
  30. package/lib/runner/snapshot-test-runner.d.ts.map +1 -1
  31. package/lib/runner/snapshot-test-runner.js +47 -75
  32. package/lib/workers/extract/extract_worker.d.ts.map +1 -1
  33. package/lib/workers/extract/extract_worker.js +65 -78
  34. package/lib/workers/extract/index.js +228344 -227587
  35. package/lib/workers/integ-test-worker.d.ts.map +1 -1
  36. package/lib/workers/integ-test-worker.js +3 -2
  37. package/package.json +5 -5
  38. package/lib/runner/cdk-integ-helper.d.ts.map +0 -1
  39. package/lib/runner/cdk-integ-helper.js +0 -525
@@ -37,31 +37,19 @@ exports.IntegSnapshotRunner = void 0;
37
37
  const path = __importStar(require("path"));
38
38
  const stream_1 = require("stream");
39
39
  const string_decoder_1 = require("string_decoder");
40
- const cloud_assembly_api_1 = require("@aws-cdk/cloud-assembly-api");
41
40
  const cloudformation_diff_1 = require("@aws-cdk/cloudformation-diff");
42
- const cdk_integ_helper_1 = require("./cdk-integ-helper");
43
- const cloud_assembly_1 = require("./private/cloud-assembly");
41
+ const cdk_test_app_1 = require("./cdk-test-app");
44
42
  const common_1 = require("../workers/common");
45
43
  /**
46
44
  * Runner for snapshot tests. This handles orchestrating
47
45
  * the validation of the integration test snapshots
48
46
  */
49
47
  class IntegSnapshotRunner {
50
- helper;
48
+ options;
49
+ test;
51
50
  constructor(options) {
52
- this.helper = cdk_integ_helper_1.CdkIntegHelper.create({
53
- ...options,
54
- region: cloud_assembly_api_1.UNKNOWN_REGION,
55
- });
56
- }
57
- hasSnapshot() {
58
- return this.helper.hasSnapshot();
59
- }
60
- actualTests() {
61
- return this.helper.actualTests();
62
- }
63
- dontCareAboutLegacyLookupsForTests() {
64
- this.helper.configureLegacyEnableLookups('dont-care');
51
+ this.options = options;
52
+ this.test = options.test;
65
53
  }
66
54
  /**
67
55
  * Synth the CDK app and compare the templates to the existing snapshot.
@@ -69,70 +57,57 @@ class IntegSnapshotRunner {
69
57
  * @returns any diagnostics and any destructive changes
70
58
  */
71
59
  async testSnapshot(options = {}) {
72
- let doClean = true;
60
+ let cleanApp;
73
61
  try {
74
- // Read the "expected" snapshot
75
- const expectedTestSuite = await this.helper.expectedTestSuite();
76
- const expectedSnapshotAssembly = this.getSnapshotAssembly(this.helper.goldenSnapshotDir, expectedTestSuite?.stacks);
77
- // Configure settings from the golden snapshot
78
- this.helper.configureLegacyEnableLookups(expectedTestSuite?.enableLookups ?? false);
62
+ // Read expected
63
+ const expected = await cdk_test_app_1.CdkTestApp.forGoldenSnapshot(this.options);
64
+ const expectedSuite = await expected.loadExistingSuite();
65
+ if (expectedSuite === undefined) {
66
+ return { type: 'no-shapshot' };
67
+ }
68
+ const expectedSnapshotAssembly = expected.snapshotAssembly(expectedSuite?.stacks);
69
+ // Set up actual
70
+ let actual = await cdk_test_app_1.CdkTestApp.forComparison(this.options);
71
+ cleanApp = actual;
72
+ // Special mode for testing, comparing the snapshot to itself.
73
+ if (this.options.TESTING_compareAgainstDirectory) {
74
+ actual = await cdk_test_app_1.CdkTestApp.forSpecificDirectory({
75
+ ...this.options,
76
+ outputDirectoryNameTemplate: this.options.TESTING_compareAgainstDirectory,
77
+ });
78
+ cleanApp = undefined;
79
+ }
79
80
  // read the "actual" snapshot
80
- const actualSnapshot = await this.helper.actualSnapshot();
81
- const actualSnapshotAssembly = this.getSnapshotAssembly(this.helper.temporarySnapshotDir, actualSnapshot.testDefinition.stacks);
81
+ const actualSuite = await actual.synthForSnapshotComparison(expectedSuite.enableLookups ?? true);
82
+ const actualSnapshotAssembly = actual.snapshotAssembly(actualSuite.stacks);
82
83
  // diff the existing snapshot (expected) with the integration test (actual)
83
- const diagnostics = await this.diffAssembly(expectedSnapshotAssembly, actualSnapshotAssembly);
84
+ const diagnostics = await this.diffAssembly(expectedSnapshotAssembly, actualSnapshotAssembly, actual);
84
85
  if (diagnostics.diagnostics.length) {
85
86
  // Attach additional messages to the first diagnostic
86
87
  const additionalMessages = [];
87
88
  if (options.retain) {
88
- additionalMessages.push(`(Failure retained) Expected: ${path.relative(process.cwd(), this.helper.goldenSnapshotDir)}`, ` Actual: ${path.relative(process.cwd(), this.helper.temporarySnapshotDir)}`),
89
- doClean = false;
89
+ additionalMessages.push(`(Failure retained) Expected: ${path.relative(process.cwd(), expected.outputDirectory)}`, ` Actual: ${path.relative(process.cwd(), actual.outputDirectory)}`),
90
+ cleanApp = undefined;
90
91
  }
91
92
  if (options.verbose) {
92
- additionalMessages.push('Repro:', ` ${this.helper.actualSynthReproCommand().join(' ')}`);
93
+ additionalMessages.push('Repro:', ` ${actual.synthReproCommand}`);
93
94
  }
94
- diagnostics.diagnostics[0] = {
95
- ...diagnostics.diagnostics[0],
96
- additionalMessages,
97
- };
95
+ Object.assign(diagnostics.diagnostics[0], { additionalMessages });
98
96
  }
99
- return diagnostics;
97
+ return {
98
+ type: 'did-compare',
99
+ diagnostics: diagnostics.diagnostics,
100
+ destructiveChanges: diagnostics.destructiveChanges,
101
+ };
100
102
  }
101
103
  catch (e) {
102
104
  throw e;
103
105
  }
104
106
  finally {
105
- if (doClean) {
106
- this.helper.cleanup();
107
- }
108
- }
109
- }
110
- /**
111
- * For a given cloud assembly return a collection of all templates
112
- * that should be part of the snapshot and any required meta data.
113
- *
114
- * @param cloudAssemblyDir - The directory of the cloud assembly to look for snapshots
115
- * @param pickStacks - Pick only these stacks from the cloud assembly
116
- * @returns A SnapshotAssembly, the collection of all templates in this snapshot and required meta data
117
- */
118
- getSnapshotAssembly(cloudAssemblyDir, pickStacks = []) {
119
- const assembly = this.readAssembly(cloudAssemblyDir);
120
- const stacks = assembly.stacks;
121
- const snapshots = {};
122
- for (const [stackName, stackTemplate] of Object.entries(stacks)) {
123
- if (pickStacks.includes(stackName)) {
124
- const manifest = cloud_assembly_1.AssemblyManifestReader.fromPath(cloudAssemblyDir);
125
- const assets = manifest.getAssetIdsForStack(stackName);
126
- snapshots[stackName] = {
127
- templates: {
128
- [stackName]: stackTemplate,
129
- ...assembly.getNestedStacksForStack(stackName),
130
- },
131
- assets,
132
- };
107
+ if (cleanApp) {
108
+ cleanApp.cleanup();
133
109
  }
134
110
  }
135
- return snapshots;
136
111
  }
137
112
  /**
138
113
  * For a given stack return all resource types that are allowed to be destroyed
@@ -141,8 +116,8 @@ class IntegSnapshotRunner {
141
116
  * @param stackId - the stack id
142
117
  * @returns a list of resource types or undefined if none are found
143
118
  */
144
- async getAllowedDestroyTypesForStack(stackId) {
145
- for (const testCase of Object.values((await this.helper.actualTests()) ?? {})) {
119
+ async getAllowedDestroyTypesForStack(actual, stackId) {
120
+ for (const testCase of Object.values(actual.testCases())) {
146
121
  if (testCase.stacks.includes(stackId)) {
147
122
  return testCase.allowDestroy;
148
123
  }
@@ -156,7 +131,7 @@ class IntegSnapshotRunner {
156
131
  * @param actual - the new (actual) snapshot
157
132
  * @returns any diagnostics and any destructive changes
158
133
  */
159
- async diffAssembly(expected, actual) {
134
+ async diffAssembly(expected, actual, actualApp) {
160
135
  const failures = [];
161
136
  const destructiveChanges = [];
162
137
  // check if there is a CFN template in the current snapshot
@@ -165,7 +140,7 @@ class IntegSnapshotRunner {
165
140
  for (const templateId of Object.keys(stack.templates)) {
166
141
  if (!actual[stackId]?.templates[templateId]) {
167
142
  failures.push({
168
- testName: this.helper.testName,
143
+ testName: this.test.testName,
169
144
  stackName: templateId,
170
145
  reason: common_1.DiagnosticReason.SNAPSHOT_FAILED,
171
146
  message: `${templateId} exists in snapshot, but not in actual`,
@@ -179,7 +154,7 @@ class IntegSnapshotRunner {
179
154
  // that does not exist in the current snapshot
180
155
  if (!expected[stackId]?.templates[templateId]) {
181
156
  failures.push({
182
- testName: this.helper.testName,
157
+ testName: this.test.testName,
183
158
  stackName: templateId,
184
159
  reason: common_1.DiagnosticReason.SNAPSHOT_FAILED,
185
160
  message: `${templateId} does not exist in snapshot, but does in actual`,
@@ -188,7 +163,7 @@ class IntegSnapshotRunner {
188
163
  }
189
164
  else {
190
165
  const config = {
191
- diffAssets: (await this.helper.actualSnapshot()).testDefinition.getOptionsForStack(stackId)?.diffAssets,
166
+ diffAssets: actualApp.testSuite.getOptionsForStack(stackId)?.diffAssets,
192
167
  };
193
168
  let actualTemplate = actual[stackId].templates[templateId];
194
169
  let expectedTemplate = expected[stackId].templates[templateId];
@@ -201,7 +176,7 @@ class IntegSnapshotRunner {
201
176
  }
202
177
  const templateDiff = (0, cloudformation_diff_1.fullDiff)(expectedTemplate, actualTemplate);
203
178
  if (!templateDiff.isEmpty) {
204
- const allowedDestroyTypes = (await this.getAllowedDestroyTypesForStack(stackId)) ?? [];
179
+ const allowedDestroyTypes = (await this.getAllowedDestroyTypesForStack(actualApp, stackId)) ?? [];
205
180
  // go through all the resource differences and check for any
206
181
  // "destructive" changes
207
182
  templateDiff.resources.forEachDifference((logicalId, change) => {
@@ -240,7 +215,7 @@ class IntegSnapshotRunner {
240
215
  reason: common_1.DiagnosticReason.SNAPSHOT_FAILED,
241
216
  message: writable.data,
242
217
  stackName: templateId,
243
- testName: this.helper.testName,
218
+ testName: this.test.testName,
244
219
  config,
245
220
  });
246
221
  }
@@ -252,9 +227,6 @@ class IntegSnapshotRunner {
252
227
  destructiveChanges,
253
228
  };
254
229
  }
255
- readAssembly(dir) {
256
- return cloud_assembly_1.AssemblyManifestReader.fromPath(dir);
257
- }
258
230
  /**
259
231
  * Reduce template to a normal form where asset references have been normalized
260
232
  *
@@ -350,4 +322,4 @@ class StringWritable extends stream_1.Writable {
350
322
  callback();
351
323
  }
352
324
  }
353
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcHNob3QtdGVzdC1ydW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzbmFwc2hvdC10ZXN0LXJ1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBNkI7QUFFN0IsbUNBQWtDO0FBQ2xDLG1EQUErQztBQUMvQyxvRUFBNkQ7QUFFN0Qsc0VBQTJGO0FBRTNGLHlEQUFvRDtBQUNwRCw2REFBa0U7QUFFbEUsOENBQXFEO0FBcUJyRDs7O0dBR0c7QUFDSCxNQUFhLG1CQUFtQjtJQUNiLE1BQU0sQ0FBaUI7SUFDeEMsWUFBWSxPQUE4QztRQUN4RCxJQUFJLENBQUMsTUFBTSxHQUFHLGlDQUFjLENBQUMsTUFBTSxDQUFDO1lBQ2xDLEdBQUcsT0FBTztZQUNWLE1BQU0sRUFBRSxtQ0FBYztTQUN2QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sV0FBVztRQUNoQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVNLFdBQVc7UUFDaEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFTSxrQ0FBa0M7UUFDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBdUMsRUFBRTtRQUlqRSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxDQUFDO1lBQ0gsK0JBQStCO1lBQy9CLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDaEUsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxpQkFB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RSxDQUFDO2dCQUNwRCxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDakMsQ0FBQztZQUNELE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztJQUNILENBQUM7Q0FDRjtBQW5VRCxrREFtVUM7QUFFRCxNQUFNLGNBQWUsU0FBUSxpQkFBUTtJQUM1QixJQUFJLENBQVM7SUFDWixRQUFRLENBQWdCO0lBQ2hDLFlBQVksT0FBd0I7UUFDbEMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLDhCQUFhLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQVUsRUFBRSxRQUFnQixFQUFFLFFBQXdDO1FBQzNFLElBQUksUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzFCLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksSUFBSSxLQUFLLENBQUM7UUFDbkIsUUFBUSxFQUFFLENBQUM7SUFDYixDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQXdDO1FBQzdDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNqQyxRQUFRLEVBQUUsQ0FBQztJQUNiLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgdHlwZSB7IFdyaXRhYmxlT3B0aW9ucyB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBXcml0YWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBTdHJpbmdEZWNvZGVyIH0gZnJvbSAnc3RyaW5nX2RlY29kZXInO1xuaW1wb3J0IHsgVU5LTk9XTl9SRUdJT04gfSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1hcGknO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZURpZmZlcmVuY2UgfSBmcm9tICdAYXdzLWNkay9jbG91ZGZvcm1hdGlvbi1kaWZmJztcbmltcG9ydCB7IGZ1bGxEaWZmLCBmb3JtYXREaWZmZXJlbmNlcywgUmVzb3VyY2VJbXBhY3QgfSBmcm9tICdAYXdzLWNkay9jbG91ZGZvcm1hdGlvbi1kaWZmJztcbmltcG9ydCB0eXBlIHsgQ2RrSW50ZWdIZWxwZXJPcHRpb25zIH0gZnJvbSAnLi9jZGstaW50ZWctaGVscGVyJztcbmltcG9ydCB7IENka0ludGVnSGVscGVyIH0gZnJvbSAnLi9jZGstaW50ZWctaGVscGVyJztcbmltcG9ydCB7IEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIgfSBmcm9tICcuL3ByaXZhdGUvY2xvdWQtYXNzZW1ibHknO1xuaW1wb3J0IHR5cGUgeyBEaWFnbm9zdGljLCBEZXN0cnVjdGl2ZUNoYW5nZSwgU25hcHNob3RWZXJpZmljYXRpb25PcHRpb25zIH0gZnJvbSAnLi4vd29ya2Vycy9jb21tb24nO1xuaW1wb3J0IHsgRGlhZ25vc3RpY1JlYXNvbiB9IGZyb20gJy4uL3dvcmtlcnMvY29tbW9uJztcblxuaW50ZXJmYWNlIFNuYXBzaG90QXNzZW1ibHkge1xuICAvKipcbiAgICogTWFwIG9mIHN0YWNrcyB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMgYXNzZW1ibHlcbiAgICovXG4gIFtzdGFja05hbWU6IHN0cmluZ106IHtcbiAgICAvKipcbiAgICAgKiBBbGwgdGVtcGxhdGVzIGZvciB0aGlzIHN0YWNrLCBpbmNsdWRpbmcgbmVzdGVkIHN0YWNrc1xuICAgICAqL1xuICAgIHRlbXBsYXRlczoge1xuICAgICAgW3RlbXBsYXRlSWQ6IHN0cmluZ106IGFueTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBhc3NldCBJZHMgdGhhdCBhcmUgdXNlZCBieSB0aGlzIGFzc2VtYmx5XG4gICAgICovXG4gICAgYXNzZXRzOiBzdHJpbmdbXTtcbiAgfTtcbn1cblxuLyoqXG4gKiBSdW5uZXIgZm9yIHNuYXBzaG90IHRlc3RzLiBUaGlzIGhhbmRsZXMgb3JjaGVzdHJhdGluZ1xuICogdGhlIHZhbGlkYXRpb24gb2YgdGhlIGludGVncmF0aW9uIHRlc3Qgc25hcHNob3RzXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlZ1NuYXBzaG90UnVubmVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBoZWxwZXI6IENka0ludGVnSGVscGVyO1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPbWl0PENka0ludGVnSGVscGVyT3B0aW9ucywgJ3JlZ2lvbic+KSB7XG4gICAgdGhpcy5oZWxwZXIgPSBDZGtJbnRlZ0hlbHBlci5jcmVhdGUoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHJlZ2lvbjogVU5LTk9XTl9SRUdJT04sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgaGFzU25hcHNob3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGVscGVyLmhhc1NuYXBzaG90KCk7XG4gIH1cblxuICBwdWJsaWMgYWN0dWFsVGVzdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGVscGVyLmFjdHVhbFRlc3RzKCk7XG4gIH1cblxuICBwdWJsaWMgZG9udENhcmVBYm91dExlZ2FjeUxvb2t1cHNGb3JUZXN0cygpIHtcbiAgICB0aGlzLmhlbHBlci5jb25maWd1cmVMZWdhY3lFbmFibGVMb29rdXBzKCdkb250LWNhcmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW50aCB0aGUgQ0RLIGFwcCBhbmQgY29tcGFyZSB0aGUgdGVtcGxhdGVzIHRvIHRoZSBleGlzdGluZyBzbmFwc2hvdC5cbiAgICpcbiAgICogQHJldHVybnMgYW55IGRpYWdub3N0aWNzIGFuZCBhbnkgZGVzdHJ1Y3RpdmUgY2hhbmdlc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHRlc3RTbmFwc2hvdChvcHRpb25zOiBTbmFwc2hvdFZlcmlmaWNhdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8e1xuICAgIGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW107XG4gICAgZGVzdHJ1Y3RpdmVDaGFuZ2VzOiBEZXN0cnVjdGl2ZUNoYW5nZVtdO1xuICB9PiB7XG4gICAgbGV0IGRvQ2xlYW4gPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICAvLyBSZWFkIHRoZSBcImV4cGVjdGVkXCIgc25hcHNob3RcbiAgICAgIGNvbnN0IGV4cGVjdGVkVGVzdFN1aXRlID0gYXdhaXQgdGhpcy5oZWxwZXIuZXhwZWN0ZWRUZXN0U3VpdGUoKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkU25hcHNob3RBc3NlbWJseSA9IHRoaXMuZ2V0U25hcHNob3RBc3NlbWJseSh0aGlzLmhlbHBlci5nb2xkZW5TbmFwc2hvdERpciwgZXhwZWN0ZWRUZXN0U3VpdGU/LnN0YWNrcyk7XG5cbiAgICAgIC8vIENvbmZpZ3VyZSBzZXR0aW5ncyBmcm9tIHRoZSBnb2xkZW4gc25hcHNob3RcbiAgICAgIHRoaXMuaGVscGVyLmNvbmZpZ3VyZUxlZ2FjeUVuYWJsZUxvb2t1cHMoZXhwZWN0ZWRUZXN0U3VpdGU/LmVuYWJsZUxvb2t1cHMgPz8gZmFsc2UpO1xuXG4gICAgICAvLyByZWFkIHRoZSBcImFjdHVhbFwiIHNuYXBzaG90XG4gICAgICBjb25zdCBhY3R1YWxTbmFwc2hvdCA9IGF3YWl0IHRoaXMuaGVscGVyLmFjdHVhbFNuYXBzaG90KCk7XG4gICAgICBjb25zdCBhY3R1YWxTbmFwc2hvdEFzc2VtYmx5ID0gdGhpcy5nZXRTbmFwc2hvdEFzc2VtYmx5KHRoaXMuaGVscGVyLnRlbXBvcmFyeVNuYXBzaG90RGlyLCBhY3R1YWxTbmFwc2hvdC50ZXN0RGVmaW5pdGlvbi5zdGFja3MpO1xuXG4gICAgICAvLyBkaWZmIHRoZSBleGlzdGluZyBzbmFwc2hvdCAoZXhwZWN0ZWQpIHdpdGggdGhlIGludGVncmF0aW9uIHRlc3QgKGFjdHVhbClcbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzID0gYXdhaXQgdGhpcy5kaWZmQXNzZW1ibHkoZXhwZWN0ZWRTbmFwc2hvdEFzc2VtYmx5LCBhY3R1YWxTbmFwc2hvdEFzc2VtYmx5KTtcblxuICAgICAgaWYgKGRpYWdub3N0aWNzLmRpYWdub3N0aWNzLmxlbmd0aCkge1xuICAgICAgICAvLyBBdHRhY2ggYWRkaXRpb25hbCBtZXNzYWdlcyB0byB0aGUgZmlyc3QgZGlhZ25vc3RpY1xuICAgICAgICBjb25zdCBhZGRpdGlvbmFsTWVzc2FnZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgaWYgKG9wdGlvbnMucmV0YWluKSB7XG4gICAgICAgICAgYWRkaXRpb25hbE1lc3NhZ2VzLnB1c2goXG4gICAgICAgICAgICBgKEZhaWx1cmUgcmV0YWluZWQpIEV4cGVjdGVkOiAke3BhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgdGhpcy5oZWxwZXIuZ29sZGVuU25hcHNob3REaXIpfWAsXG4gICAgICAgICAgICBgICAgICAgICAgICAgICAgICAgIEFjdHVhbDogICAke3BhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgdGhpcy5oZWxwZXIudGVtcG9yYXJ5U25hcHNob3REaXIpfWAsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBkb0NsZWFuID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgYWRkaXRpb25hbE1lc3NhZ2VzLnB1c2goXG4gICAgICAgICAgICAnUmVwcm86JyxcbiAgICAgICAgICAgIGAgICR7dGhpcy5oZWxwZXIuYWN0dWFsU3ludGhSZXByb0NvbW1hbmQoKS5qb2luKCcgJyl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlhZ25vc3RpY3MuZGlhZ25vc3RpY3NbMF0gPSB7XG4gICAgICAgICAgLi4uZGlhZ25vc3RpY3MuZGlhZ25vc3RpY3NbMF0sXG4gICAgICAgICAgYWRkaXRpb25hbE1lc3NhZ2VzLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGlhZ25vc3RpY3M7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGRvQ2xlYW4pIHtcbiAgICAgICAgdGhpcy5oZWxwZXIuY2xlYW51cCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGb3IgYSBnaXZlbiBjbG91ZCBhc3NlbWJseSByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIGFsbCB0ZW1wbGF0ZXNcbiAgICogdGhhdCBzaG91bGQgYmUgcGFydCBvZiB0aGUgc25hcHNob3QgYW5kIGFueSByZXF1aXJlZCBtZXRhIGRhdGEuXG4gICAqXG4gICAqIEBwYXJhbSBjbG91ZEFzc2VtYmx5RGlyIC0gVGhlIGRpcmVjdG9yeSBvZiB0aGUgY2xvdWQgYXNzZW1ibHkgdG8gbG9vayBmb3Igc25hcHNob3RzXG4gICAqIEBwYXJhbSBwaWNrU3RhY2tzIC0gUGljayBvbmx5IHRoZXNlIHN0YWNrcyBmcm9tIHRoZSBjbG91ZCBhc3NlbWJseVxuICAgKiBAcmV0dXJucyBBIFNuYXBzaG90QXNzZW1ibHksIHRoZSBjb2xsZWN0aW9uIG9mIGFsbCB0ZW1wbGF0ZXMgaW4gdGhpcyBzbmFwc2hvdCBhbmQgcmVxdWlyZWQgbWV0YSBkYXRhXG4gICAqL1xuICBwcml2YXRlIGdldFNuYXBzaG90QXNzZW1ibHkoY2xvdWRBc3NlbWJseURpcjogc3RyaW5nLCBwaWNrU3RhY2tzOiBzdHJpbmdbXSA9IFtdKTogU25hcHNob3RBc3NlbWJseSB7XG4gICAgY29uc3QgYXNzZW1ibHkgPSB0aGlzLnJlYWRBc3NlbWJseShjbG91ZEFzc2VtYmx5RGlyKTtcbiAgICBjb25zdCBzdGFja3MgPSBhc3NlbWJseS5zdGFja3M7XG4gICAgY29uc3Qgc25hcHNob3RzOiBTbmFwc2hvdEFzc2VtYmx5ID0ge307XG4gICAgZm9yIChjb25zdCBbc3RhY2tOYW1lLCBzdGFja1RlbXBsYXRlXSBvZiBPYmplY3QuZW50cmllcyhzdGFja3MpKSB7XG4gICAgICBpZiAocGlja1N0YWNrcy5pbmNsdWRlcyhzdGFja05hbWUpKSB7XG4gICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gQXNzZW1ibHlNYW5pZmVzdFJlYWRlci5mcm9tUGF0aChjbG91ZEFzc2VtYmx5RGlyKTtcbiAgICAgICAgY29uc3QgYXNzZXRzID0gbWFuaWZlc3QuZ2V0QXNzZXRJZHNGb3JTdGFjayhzdGFja05hbWUpO1xuXG4gICAgICAgIHNuYXBzaG90c1tzdGFja05hbWVdID0ge1xuICAgICAgICAgIHRlbXBsYXRlczoge1xuICAgICAgICAgICAgW3N0YWNrTmFtZV06IHN0YWNrVGVtcGxhdGUsXG4gICAgICAgICAgICAuLi5hc3NlbWJseS5nZXROZXN0ZWRTdGFja3NGb3JTdGFjayhzdGFja05hbWUpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXNzZXRzLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzbmFwc2hvdHM7XG4gIH1cblxuICAvKipcbiAgICogRm9yIGEgZ2l2ZW4gc3RhY2sgcmV0dXJuIGFsbCByZXNvdXJjZSB0eXBlcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGJlIGRlc3Ryb3llZFxuICAgKiBhcyBwYXJ0IG9mIGEgc3RhY2sgdXBkYXRlXG4gICAqXG4gICAqIEBwYXJhbSBzdGFja0lkIC0gdGhlIHN0YWNrIGlkXG4gICAqIEByZXR1cm5zIGEgbGlzdCBvZiByZXNvdXJjZSB0eXBlcyBvciB1bmRlZmluZWQgaWYgbm9uZSBhcmUgZm91bmRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0QWxsb3dlZERlc3Ryb3lUeXBlc0ZvclN0YWNrKHN0YWNrSWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10gfCB1bmRlZmluZWQ+IHtcbiAgICBmb3IgKGNvbnN0IHRlc3RDYXNlIG9mIE9iamVjdC52YWx1ZXMoKGF3YWl0IHRoaXMuaGVscGVyLmFjdHVhbFRlc3RzKCkpID8/IHt9KSkge1xuICAgICAgaWYgKHRlc3RDYXNlLnN0YWNrcy5pbmNsdWRlcyhzdGFja0lkKSkge1xuICAgICAgICByZXR1cm4gdGVzdENhc2UuYWxsb3dEZXN0cm95O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYW55IGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIGV4aXN0aW5nIGFuZCBleHBlY3RlZCBzbmFwc2hvdHNcbiAgICpcbiAgICogQHBhcmFtIGV4aXN0aW5nIC0gdGhlIGV4aXN0aW5nIChleHBlY3RlZCkgc25hcHNob3RcbiAgICogQHBhcmFtIGFjdHVhbCAtIHRoZSBuZXcgKGFjdHVhbCkgc25hcHNob3RcbiAgICogQHJldHVybnMgYW55IGRpYWdub3N0aWNzIGFuZCBhbnkgZGVzdHJ1Y3RpdmUgY2hhbmdlc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaWZmQXNzZW1ibHkoXG4gICAgZXhwZWN0ZWQ6IFNuYXBzaG90QXNzZW1ibHksXG4gICAgYWN0dWFsOiBTbmFwc2hvdEFzc2VtYmx5LFxuICApOiBQcm9taXNlPHsgZGlhZ25vc3RpY3M6IERpYWdub3N0aWNbXTsgZGVzdHJ1Y3RpdmVDaGFuZ2VzOiBEZXN0cnVjdGl2ZUNoYW5nZVtdIH0+IHtcbiAgICBjb25zdCBmYWlsdXJlczogRGlhZ25vc3RpY1tdID0gW107XG4gICAgY29uc3QgZGVzdHJ1Y3RpdmVDaGFuZ2VzOiBEZXN0cnVjdGl2ZUNoYW5nZVtdID0gW107XG5cbiAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhIENGTiB0ZW1wbGF0ZSBpbiB0aGUgY3VycmVudCBzbmFwc2hvdFxuICAgIC8vIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIFwiYWN0dWFsXCIgc25hcHNob3RcbiAgICBmb3IgKGNvbnN0IFtzdGFja0lkLCBzdGFja10gb2YgT2JqZWN0LmVudHJpZXMoZXhwZWN0ZWQpKSB7XG4gICAgICBmb3IgKGNvbnN0IHRlbXBsYXRlSWQgb2YgT2JqZWN0LmtleXMoc3RhY2sudGVtcGxhdGVzKSkge1xuICAgICAgICBpZiAoIWFjdHVhbFtzdGFja0lkXT8udGVtcGxhdGVzW3RlbXBsYXRlSWRdKSB7XG4gICAgICAgICAgZmFpbHVyZXMucHVzaCh7XG4gICAgICAgICAgICB0ZXN0TmFtZTogdGhpcy5oZWxwZXIudGVzdE5hbWUsXG4gICAgICAgICAgICBzdGFja05hbWU6IHRlbXBsYXRlSWQsXG4gICAgICAgICAgICByZWFzb246IERpYWdub3N0aWNSZWFzb24uU05BUFNIT1RfRkFJTEVELFxuICAgICAgICAgICAgbWVzc2FnZTogYCR7dGVtcGxhdGVJZH0gZXhpc3RzIGluIHNuYXBzaG90LCBidXQgbm90IGluIGFjdHVhbGAsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtzdGFja0lkLCBzdGFja10gb2YgT2JqZWN0LmVudHJpZXMoYWN0dWFsKSkge1xuICAgICAgZm9yIChjb25zdCB0ZW1wbGF0ZUlkIG9mIE9iamVjdC5rZXlzKHN0YWNrLnRlbXBsYXRlcykpIHtcbiAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgQ0ZOIHRlbXBsYXRlIGluIHRoZSBcImFjdHVhbFwiIHNuYXBzaG90XG4gICAgICAvLyB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBjdXJyZW50IHNuYXBzaG90XG4gICAgICAgIGlmICghZXhwZWN0ZWRbc3RhY2tJZF0/LnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXSkge1xuICAgICAgICAgIGZhaWx1cmVzLnB1c2goe1xuICAgICAgICAgICAgdGVzdE5hbWU6IHRoaXMuaGVscGVyLnRlc3ROYW1lLFxuICAgICAgICAgICAgc3RhY2tOYW1lOiB0ZW1wbGF0ZUlkLFxuICAgICAgICAgICAgcmVhc29uOiBEaWFnbm9zdGljUmVhc29uLlNOQVBTSE9UX0ZBSUxFRCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGAke3RlbXBsYXRlSWR9IGRvZXMgbm90IGV4aXN0IGluIHNuYXBzaG90LCBidXQgZG9lcyBpbiBhY3R1YWxgLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgICAgICAgIGRpZmZBc3NldHM6IChhd2FpdCB0aGlzLmhlbHBlci5hY3R1YWxTbmFwc2hvdCgpKS50ZXN0RGVmaW5pdGlvbi5nZXRPcHRpb25zRm9yU3RhY2soc3RhY2tJZCk/LmRpZmZBc3NldHMsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBsZXQgYWN0dWFsVGVtcGxhdGUgPSBhY3R1YWxbc3RhY2tJZF0udGVtcGxhdGVzW3RlbXBsYXRlSWRdO1xuICAgICAgICAgIGxldCBleHBlY3RlZFRlbXBsYXRlID0gZXhwZWN0ZWRbc3RhY2tJZF0udGVtcGxhdGVzW3RlbXBsYXRlSWRdO1xuXG4gICAgICAgICAgLy8gaWYgd2UgYXJlIG5vdCB2ZXJpZnlpbmcgYXNzZXQgaGFzaGVzIHRoZW4gcmVtb3ZlIHRoZSBzcGVjaWZpY1xuICAgICAgICAgIC8vIGFzc2V0IGhhc2hlcyBmcm9tIHRoZSB0ZW1wbGF0ZXMgc28gdGhleSBhcmUgbm90IHBhcnQgb2YgdGhlIGRpZmZcbiAgICAgICAgICAvLyBjb21wYXJpc29uXG4gICAgICAgICAgaWYgKCFjb25maWcuZGlmZkFzc2V0cykge1xuICAgICAgICAgICAgYWN0dWFsVGVtcGxhdGUgPSB0aGlzLmNhbm9uaWNhbGl6ZVRlbXBsYXRlKGFjdHVhbFRlbXBsYXRlLCBhY3R1YWxbc3RhY2tJZF0uYXNzZXRzKTtcbiAgICAgICAgICAgIGV4cGVjdGVkVGVtcGxhdGUgPSB0aGlzLmNhbm9uaWNhbGl6ZVRlbXBsYXRlKGV4cGVjdGVkVGVtcGxhdGUsIGV4cGVjdGVkW3N0YWNrSWRdLmFzc2V0cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHRlbXBsYXRlRGlmZiA9IGZ1bGxEaWZmKGV4cGVjdGVkVGVtcGxhdGUsIGFjdHVhbFRlbXBsYXRlKTtcbiAgICAgICAgICBpZiAoIXRlbXBsYXRlRGlmZi5pc0VtcHR5KSB7XG4gICAgICAgICAgICBjb25zdCBhbGxvd2VkRGVzdHJveVR5cGVzID0gKGF3YWl0IHRoaXMuZ2V0QWxsb3dlZERlc3Ryb3lUeXBlc0ZvclN0YWNrKHN0YWNrSWQpKSA/PyBbXTtcblxuICAgICAgICAgICAgLy8gZ28gdGhyb3VnaCBhbGwgdGhlIHJlc291cmNlIGRpZmZlcmVuY2VzIGFuZCBjaGVjayBmb3IgYW55XG4gICAgICAgICAgICAvLyBcImRlc3RydWN0aXZlXCIgY2hhbmdlc1xuICAgICAgICAgICAgdGVtcGxhdGVEaWZmLnJlc291cmNlcy5mb3JFYWNoRGlmZmVyZW5jZSgobG9naWNhbElkOiBzdHJpbmcsIGNoYW5nZTogUmVzb3VyY2VEaWZmZXJlbmNlKSA9PiB7XG4gICAgICAgICAgICAvLyBpZiB0aGUgY2hhbmdlIGlzIGEgcmVtb3ZhbCBpdCB3aWxsIG5vdCBzaG93IHVwIGFzIGEgJ2NoYW5nZUltcGFjdCdcbiAgICAgICAgICAgIC8vIHNvIG5lZWQgdG8gY2hlY2sgZm9yIGl0IHNlcGFyYXRlbHksIHVubGVzcyBpdCBpcyBhIHJlc291cmNlVHlwZSB0aGF0XG4gICAgICAgICAgICAvLyBoYXMgYmVlbiBcImFsbG93ZWRcIiB0byBiZSBkZXN0cm95ZWRcbiAgICAgICAgICAgICAgY29uc3QgcmVzb3VyY2VUeXBlID0gY2hhbmdlLm9sZFZhbHVlPy5UeXBlID8/IGNoYW5nZS5uZXdWYWx1ZT8uVHlwZTtcbiAgICAgICAgICAgICAgaWYgKHJlc291cmNlVHlwZSAmJiBhbGxvd2VkRGVzdHJveVR5cGVzLmluY2x1ZGVzKHJlc291cmNlVHlwZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGNoYW5nZS5pc1JlbW92YWwpIHtcbiAgICAgICAgICAgICAgICBkZXN0cnVjdGl2ZUNoYW5nZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICBpbXBhY3Q6IFJlc291cmNlSW1wYWN0LldJTExfREVTVFJPWSxcbiAgICAgICAgICAgICAgICAgIGxvZ2ljYWxJZCxcbiAgICAgICAgICAgICAgICAgIHN0YWNrTmFtZTogdGVtcGxhdGVJZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGNoYW5nZS5jaGFuZ2VJbXBhY3QpIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgUmVzb3VyY2VJbXBhY3QuTUFZX1JFUExBQ0U6XG4gICAgICAgICAgICAgICAgICBjYXNlIFJlc291cmNlSW1wYWN0LldJTExfT1JQSEFOOlxuICAgICAgICAgICAgICAgICAgY2FzZSBSZXNvdXJjZUltcGFjdC5XSUxMX0RFU1RST1k6XG4gICAgICAgICAgICAgICAgICBjYXNlIFJlc291cmNlSW1wYWN0LldJTExfUkVQTEFDRTpcbiAgICAgICAgICAgICAgICAgICAgZGVzdHJ1Y3RpdmVDaGFuZ2VzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgIGltcGFjdDogY2hhbmdlLmNoYW5nZUltcGFjdCxcbiAgICAgICAgICAgICAgICAgICAgICBsb2dpY2FsSWQsXG4gICAgICAgICAgICAgICAgICAgICAgc3RhY2tOYW1lOiB0ZW1wbGF0ZUlkLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHdyaXRhYmxlID0gbmV3IFN0cmluZ1dyaXRhYmxlKHt9KTtcbiAgICAgICAgICAgIGZvcm1hdERpZmZlcmVuY2VzKHdyaXRhYmxlLCB0ZW1wbGF0ZURpZmYpO1xuICAgICAgICAgICAgZmFpbHVyZXMucHVzaCh7XG4gICAgICAgICAgICAgIHJlYXNvbjogRGlhZ25vc3RpY1JlYXNvbi5TTkFQU0hPVF9GQUlMRUQsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHdyaXRhYmxlLmRhdGEsXG4gICAgICAgICAgICAgIHN0YWNrTmFtZTogdGVtcGxhdGVJZCxcbiAgICAgICAgICAgICAgdGVzdE5hbWU6IHRoaXMuaGVscGVyLnRlc3ROYW1lLFxuICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGlhZ25vc3RpY3M6IGZhaWx1cmVzLFxuICAgICAgZGVzdHJ1Y3RpdmVDaGFuZ2VzLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJlYWRBc3NlbWJseShkaXI6IHN0cmluZyk6IEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIge1xuICAgIHJldHVybiBBc3NlbWJseU1hbmlmZXN0UmVhZGVyLmZyb21QYXRoKGRpcik7XG4gIH1cblxuICAvKipcbiAgICogUmVkdWNlIHRlbXBsYXRlIHRvIGEgbm9ybWFsIGZvcm0gd2hlcmUgYXNzZXQgcmVmZXJlbmNlcyBoYXZlIGJlZW4gbm9ybWFsaXplZFxuICAgKlxuICAgKiBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGNvbXBhcmUgdGVtcGxhdGVzIGlmIGFsbCB0aGF0J3MgZGlmZmVyZW50IGJldHdlZW5cbiAgICogdGhlbSBpcyB0aGUgaGFzaGVzIG9mIHRoZSBhc3NldCB2YWx1ZXMuXG4gICAqL1xuICBwcml2YXRlIGNhbm9uaWNhbGl6ZVRlbXBsYXRlKHRlbXBsYXRlOiBhbnksIGFzc2V0czogc3RyaW5nW10pOiBhbnkge1xuICAgIGNvbnN0IGFzc2V0c1NlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBzdHJpbmdTdWJzdGl0dXRpb25zID0gbmV3IEFycmF5PFtSZWdFeHAsIHN0cmluZ10+KCk7XG5cbiAgICAvLyBGaW5kIGFzc2V0cyB2aWEgcGFyYW1ldGVycyAoZm9yIExlZ2FjeVN0YWNrU3ludGhlc2l6ZXIpXG4gICAgY29uc3QgcGFyYW1SZSA9IC9eQXNzZXRQYXJhbWV0ZXJzKFthLXpBLVowLTldezY0fSkoUzNCdWNrZXR8UzNWZXJzaW9uS2V5fEFydGlmYWN0SGFzaCkoW2EtekEtWjAtOV17OH0pJC87XG4gICAgZm9yIChjb25zdCBwYXJhbU5hbWUgb2YgT2JqZWN0LmtleXModGVtcGxhdGU/LlBhcmFtZXRlcnMgfHwge30pKSB7XG4gICAgICBjb25zdCBtID0gcGFyYW1SZS5leGVjKHBhcmFtTmFtZSk7XG4gICAgICBpZiAoIW0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoYXNzZXRzU2Vlbi5oYXMobVsxXSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGFzc2V0c1NlZW4uYWRkKG1bMV0pO1xuICAgICAgY29uc3QgaXggPSBhc3NldHNTZWVuLnNpemU7XG5cbiAgICAgIC8vIEZ1bGwgcGFyYW1ldGVyIHJlZmVyZW5jZVxuICAgICAgc3RyaW5nU3Vic3RpdHV0aW9ucy5wdXNoKFtcbiAgICAgICAgbmV3IFJlZ0V4cChgQXNzZXRQYXJhbWV0ZXJzJHttWzFdfShTM0J1Y2tldHxTM1ZlcnNpb25LZXl8QXJ0aWZhY3RIYXNoKShbYS16QS1aMC05XXs4fSlgKSxcbiAgICAgICAgYEFzc2V0JHtpeH0kMWAsXG4gICAgICBdKTtcbiAgICAgIC8vIFN1YnN0cmluZyBhc3NldCBoYXNoIHJlZmVyZW5jZVxuICAgICAgc3RyaW5nU3Vic3RpdHV0aW9ucy5wdXNoKFtcbiAgICAgICAgbmV3IFJlZ0V4cChgJHttWzFdfWApLFxuICAgICAgICBgQXNzZXQke2l4fUhhc2hgLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgLy8gZmluZCBhc3NldHMgZGVmaW5lZCBpbiB0aGUgYXNzZXQgbWFuaWZlc3RcbiAgICB0cnkge1xuICAgICAgYXNzZXRzLmZvckVhY2goYXNzZXQgPT4ge1xuICAgICAgICBpZiAoIWFzc2V0c1NlZW4uaGFzKGFzc2V0KSkge1xuICAgICAgICAgIGFzc2V0c1NlZW4uYWRkKGFzc2V0KTtcbiAgICAgICAgICBjb25zdCBpeCA9IGFzc2V0c1NlZW4uc2l6ZTtcbiAgICAgICAgICBzdHJpbmdTdWJzdGl0dXRpb25zLnB1c2goW1xuICAgICAgICAgICAgbmV3IFJlZ0V4cChhc3NldCksXG4gICAgICAgICAgICBgQXNzZXQke2l4fSQxYCxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBpZiB0aGVyZSBpcyBubyBhc3NldCBtYW5pZmVzdCB0aGF0IGlzIGZpbmUuXG4gICAgfVxuXG4gICAgLy8gU3Vic3RpdHV0ZSB0aGVtIG91dFxuICAgIHJldHVybiBzdWJzdGl0dXRlKHRlbXBsYXRlKTtcblxuICAgIGZ1bmN0aW9uIHN1YnN0aXR1dGUod2hhdDogYW55KTogYW55IHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHdoYXQpKSB7XG4gICAgICAgIHJldHVybiB3aGF0Lm1hcChzdWJzdGl0dXRlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB3aGF0ID09PSAnb2JqZWN0JyAmJiB3aGF0ICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHJldDogYW55ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHdoYXQpKSB7XG4gICAgICAgICAgcmV0W3N0cmluZ1N1YihrKV0gPSBzdWJzdGl0dXRlKHYpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygd2hhdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZ1N1Yih3aGF0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHdoYXQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3RyaW5nU3ViKHg6IHN0cmluZykge1xuICAgICAgZm9yIChjb25zdCBbcmUsIHJlcGxhY2VtZW50XSBvZiBzdHJpbmdTdWJzdGl0dXRpb25zKSB7XG4gICAgICAgIHggPSB4LnJlcGxhY2UocmUsIHJlcGxhY2VtZW50KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBTdHJpbmdXcml0YWJsZSBleHRlbmRzIFdyaXRhYmxlIHtcbiAgcHVibGljIGRhdGE6IHN0cmluZztcbiAgcHJpdmF0ZSBfZGVjb2RlcjogU3RyaW5nRGVjb2RlcjtcbiAgY29uc3RydWN0b3Iob3B0aW9uczogV3JpdGFibGVPcHRpb25zKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gICAgdGhpcy5fZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKCk7XG4gICAgdGhpcy5kYXRhID0gJyc7XG4gIH1cblxuICBfd3JpdGUoY2h1bms6IGFueSwgZW5jb2Rpbmc6IHN0cmluZywgY2FsbGJhY2s6IChlcnJvcj86IEVycm9yIHwgbnVsbCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGlmIChlbmNvZGluZyA9PT0gJ2J1ZmZlcicpIHtcbiAgICAgIGNodW5rID0gdGhpcy5fZGVjb2Rlci53cml0ZShjaHVuayk7XG4gICAgfVxuXG4gICAgdGhpcy5kYXRhICs9IGNodW5rO1xuICAgIGNhbGxiYWNrKCk7XG4gIH1cblxuICBfZmluYWwoY2FsbGJhY2s6IChlcnJvcj86IEVycm9yIHwgbnVsbCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuZGF0YSArPSB0aGlzLl9kZWNvZGVyLmVuZCgpO1xuICAgIGNhbGxiYWNrKCk7XG4gIH1cbn1cbiJdfQ==
325
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcHNob3QtdGVzdC1ydW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzbmFwc2hvdC10ZXN0LXJ1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBNkI7QUFFN0IsbUNBQWtDO0FBQ2xDLG1EQUErQztBQUUvQyxzRUFBMkY7QUFFM0YsaURBQTRDO0FBRzVDLDhDQUFxRDtBQWNyRDs7O0dBR0c7QUFDSCxNQUFhLG1CQUFtQjtJQUdEO0lBRlosSUFBSSxDQUFZO0lBRWpDLFlBQTZCLE9BQXNCO1FBQXRCLFlBQU8sR0FBUCxPQUFPLENBQWU7UUFDakQsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLFlBQVksQ0FBQyxVQUF1QyxFQUFFO1FBQ2pFLElBQUksUUFBZ0MsQ0FBQztRQUNyQyxJQUFJLENBQUM7WUFDSCxnQkFBZ0I7WUFDaEIsTUFBTSxRQUFRLEdBQUcsTUFBTSx5QkFBVSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNsRSxNQUFNLGFBQWEsR0FBRyxNQUFNLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBRXpELElBQUksYUFBYSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNoQyxPQUFPLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDO1lBQ2pDLENBQUM7WUFFRCxNQUFNLHdCQUF3QixHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFbEYsZ0JBQWdCO1lBQ2hCLElBQUksTUFBTSxHQUFHLE1BQU0seUJBQVUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzFELFFBQVEsR0FBRyxNQUFNLENBQUM7WUFFbEIsOERBQThEO1lBQzlE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bnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB0eXBlIHsgV3JpdGFibGVPcHRpb25zIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IFdyaXRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IFN0cmluZ0RlY29kZXIgfSBmcm9tICdzdHJpbmdfZGVjb2Rlcic7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlRGlmZmVyZW5jZSB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkZm9ybWF0aW9uLWRpZmYnO1xuaW1wb3J0IHsgZnVsbERpZmYsIGZvcm1hdERpZmZlcmVuY2VzLCBSZXNvdXJjZUltcGFjdCB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkZm9ybWF0aW9uLWRpZmYnO1xuaW1wb3J0IHR5cGUgeyBDZGtUZXN0QXBwT3B0aW9ucywgU25hcHNob3RBc3NlbWJseSB9IGZyb20gJy4vY2RrLXRlc3QtYXBwJztcbmltcG9ydCB7IENka1Rlc3RBcHAgfSBmcm9tICcuL2Nkay10ZXN0LWFwcCc7XG5pbXBvcnQgdHlwZSB7IEludGVnVGVzdCB9IGZyb20gJy4vaW50ZWdyYXRpb24tdGVzdHMnO1xuaW1wb3J0IHR5cGUgeyBEaWFnbm9zdGljLCBEZXN0cnVjdGl2ZUNoYW5nZSwgU25hcHNob3RWZXJpZmljYXRpb25PcHRpb25zIH0gZnJvbSAnLi4vd29ya2Vycy9jb21tb24nO1xuaW1wb3J0IHsgRGlhZ25vc3RpY1JlYXNvbiB9IGZyb20gJy4uL3dvcmtlcnMvY29tbW9uJztcblxudHlwZSBSdW5uZXJPcHRpb25zID0gT21pdDxDZGtUZXN0QXBwT3B0aW9ucywgJ291dHB1dERpcmVjdG9yeU5hbWVUZW1wbGF0ZScgfCAncmVnaW9uJz4gJiB7XG4gIC8qKlxuICAgKiBPbmx5IHVzZWQgZm9yIHRlc3RpbmdcbiAgICovXG4gIHJlYWRvbmx5IFRFU1RJTkdfY29tcGFyZUFnYWluc3REaXJlY3Rvcnk/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBTbmFwc2hvdFJlc3VsdCA9XG4gIHwgeyB0eXBlOiAnbm8tc2hhcHNob3QnIH1cbiAgfCB7IHR5cGU6ICdkaWQtY29tcGFyZSc7IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW107IGRlc3RydWN0aXZlQ2hhbmdlczogRGVzdHJ1Y3RpdmVDaGFuZ2VbXSB9XG4gIDtcblxuLyoqXG4gKiBSdW5uZXIgZm9yIHNuYXBzaG90IHRlc3RzLiBUaGlzIGhhbmRsZXMgb3JjaGVzdHJhdGluZ1xuICogdGhlIHZhbGlkYXRpb24gb2YgdGhlIGludGVncmF0aW9uIHRlc3Qgc25hcHNob3RzXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlZ1NuYXBzaG90UnVubmVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSB0ZXN0OiBJbnRlZ1Rlc3Q7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBSdW5uZXJPcHRpb25zKSB7XG4gICAgdGhpcy50ZXN0ID0gb3B0aW9ucy50ZXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bnRoIHRoZSBDREsgYXBwIGFuZCBjb21wYXJlIHRoZSB0ZW1wbGF0ZXMgdG8gdGhlIGV4aXN0aW5nIHNuYXBzaG90LlxuICAgKlxuICAgKiBAcmV0dXJucyBhbnkgZGlhZ25vc3RpY3MgYW5kIGFueSBkZXN0cnVjdGl2ZSBjaGFuZ2VzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdGVzdFNuYXBzaG90KG9wdGlvbnM6IFNuYXBzaG90VmVyaWZpY2F0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTbmFwc2hvdFJlc3VsdD4ge1xuICAgIGxldCBjbGVhbkFwcDogQ2RrVGVzdEFwcCB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgLy8gUmVhZCBleHBlY3RlZFxuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBhd2FpdCBDZGtUZXN0QXBwLmZvckdvbGRlblNuYXBzaG90KHRoaXMub3B0aW9ucyk7XG4gICAgICBjb25zdCBleHBlY3RlZFN1aXRlID0gYXdhaXQgZXhwZWN0ZWQubG9hZEV4aXN0aW5nU3VpdGUoKTtcblxuICAgICAgaWYgKGV4cGVjdGVkU3VpdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4geyB0eXBlOiAnbm8tc2hhcHNob3QnIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4cGVjdGVkU25hcHNob3RBc3NlbWJseSA9IGV4cGVjdGVkLnNuYXBzaG90QXNzZW1ibHkoZXhwZWN0ZWRTdWl0ZT8uc3RhY2tzKTtcblxuICAgICAgLy8gU2V0IHVwIGFjdHVhbFxuICAgICAgbGV0IGFjdHVhbCA9IGF3YWl0IENka1Rlc3RBcHAuZm9yQ29tcGFyaXNvbih0aGlzLm9wdGlvbnMpO1xuICAgICAgY2xlYW5BcHAgPSBhY3R1YWw7XG5cbiAgICAgIC8vIFNwZWNpYWwgbW9kZSBmb3IgdGVzdGluZywgY29tcGFyaW5nIHRoZSBzbmFwc2hvdCB0byBpdHNlbGYuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLlRFU1RJTkdfY29tcGFyZUFnYWluc3REaXJlY3RvcnkpIHtcbiAgICAgICAgYWN0dWFsID0gYXdhaXQgQ2RrVGVzdEFwcC5mb3JTcGVjaWZpY0RpcmVjdG9yeSh7XG4gICAgICAgICAgLi4udGhpcy5vcHRpb25zLFxuICAgICAgICAgIG91dHB1dERpcmVjdG9yeU5hbWVUZW1wbGF0ZTogdGhpcy5vcHRpb25zLlRFU1RJTkdfY29tcGFyZUFnYWluc3REaXJlY3RvcnksXG4gICAgICAgIH0pO1xuICAgICAgICBjbGVhbkFwcCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgLy8gcmVhZCB0aGUgXCJhY3R1YWxcIiBzbmFwc2hvdFxuICAgICAgY29uc3QgYWN0dWFsU3VpdGUgPSBhd2FpdCBhY3R1YWwuc3ludGhGb3JTbmFwc2hvdENvbXBhcmlzb24oZXhwZWN0ZWRTdWl0ZS5lbmFibGVMb29rdXBzID8/IHRydWUpO1xuICAgICAgY29uc3QgYWN0dWFsU25hcHNob3RBc3NlbWJseSA9IGFjdHVhbC5zbmFwc2hvdEFzc2VtYmx5KGFjdHVhbFN1aXRlLnN0YWNrcyk7XG5cbiAgICAgIC8vIGRpZmYgdGhlIGV4aXN0aW5nIHNuYXBzaG90IChleHBlY3RlZCkgd2l0aCB0aGUgaW50ZWdyYXRpb24gdGVzdCAoYWN0dWFsKVxuICAgICAgY29uc3QgZGlhZ25vc3RpY3MgPSBhd2FpdCB0aGlzLmRpZmZBc3NlbWJseShleHBlY3RlZFNuYXBzaG90QXNzZW1ibHksIGFjdHVhbFNuYXBzaG90QXNzZW1ibHksIGFjdHVhbCk7XG5cbiAgICAgIGlmIChkaWFnbm9zdGljcy5kaWFnbm9zdGljcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gQXR0YWNoIGFkZGl0aW9uYWwgbWVzc2FnZXMgdG8gdGhlIGZpcnN0IGRpYWdub3N0aWNcbiAgICAgICAgY29uc3QgYWRkaXRpb25hbE1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnJldGFpbikge1xuICAgICAgICAgIGFkZGl0aW9uYWxNZXNzYWdlcy5wdXNoKFxuICAgICAgICAgICAgYChGYWlsdXJlIHJldGFpbmVkKSBFeHBlY3RlZDogJHtwYXRoLnJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIGV4cGVjdGVkLm91dHB1dERpcmVjdG9yeSl9YCxcbiAgICAgICAgICAgIGAgICAgICAgICAgICAgICAgICAgQWN0dWFsOiAgICR7cGF0aC5yZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBhY3R1YWwub3V0cHV0RGlyZWN0b3J5KX1gLFxuICAgICAgICAgICksXG4gICAgICAgICAgY2xlYW5BcHAgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgYWRkaXRpb25hbE1lc3NhZ2VzLnB1c2goXG4gICAgICAgICAgICAnUmVwcm86JyxcbiAgICAgICAgICAgIGAgICR7YWN0dWFsLnN5bnRoUmVwcm9Db21tYW5kfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24oZGlhZ25vc3RpY3MuZGlhZ25vc3RpY3NbMF0sIHsgYWRkaXRpb25hbE1lc3NhZ2VzIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnZGlkLWNvbXBhcmUnLFxuICAgICAgICBkaWFnbm9zdGljczogZGlhZ25vc3RpY3MuZGlhZ25vc3RpY3MsXG4gICAgICAgIGRlc3RydWN0aXZlQ2hhbmdlczogZGlhZ25vc3RpY3MuZGVzdHJ1Y3RpdmVDaGFuZ2VzLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoY2xlYW5BcHApIHtcbiAgICAgICAgY2xlYW5BcHAuY2xlYW51cCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGb3IgYSBnaXZlbiBzdGFjayByZXR1cm4gYWxsIHJlc291cmNlIHR5cGVzIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgZGVzdHJveWVkXG4gICAqIGFzIHBhcnQgb2YgYSBzdGFjayB1cGRhdGVcbiAgICpcbiAgICogQHBhcmFtIHN0YWNrSWQgLSB0aGUgc3RhY2sgaWRcbiAgICogQHJldHVybnMgYSBsaXN0IG9mIHJlc291cmNlIHR5cGVzIG9yIHVuZGVmaW5lZCBpZiBub25lIGFyZSBmb3VuZFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRBbGxvd2VkRGVzdHJveVR5cGVzRm9yU3RhY2soYWN0dWFsOiBDZGtUZXN0QXBwLCBzdGFja0lkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdIHwgdW5kZWZpbmVkPiB7XG4gICAgZm9yIChjb25zdCB0ZXN0Q2FzZSBvZiBPYmplY3QudmFsdWVzKGFjdHVhbC50ZXN0Q2FzZXMoKSkpIHtcbiAgICAgIGlmICh0ZXN0Q2FzZS5zdGFja3MuaW5jbHVkZXMoc3RhY2tJZCkpIHtcbiAgICAgICAgcmV0dXJuIHRlc3RDYXNlLmFsbG93RGVzdHJveTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGFueSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBleGlzdGluZyBhbmQgZXhwZWN0ZWQgc25hcHNob3RzXG4gICAqXG4gICAqIEBwYXJhbSBleGlzdGluZyAtIHRoZSBleGlzdGluZyAoZXhwZWN0ZWQpIHNuYXBzaG90XG4gICAqIEBwYXJhbSBhY3R1YWwgLSB0aGUgbmV3IChhY3R1YWwpIHNuYXBzaG90XG4gICAqIEByZXR1cm5zIGFueSBkaWFnbm9zdGljcyBhbmQgYW55IGRlc3RydWN0aXZlIGNoYW5nZXNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlmZkFzc2VtYmx5KFxuICAgIGV4cGVjdGVkOiBTbmFwc2hvdEFzc2VtYmx5LFxuICAgIGFjdHVhbDogU25hcHNob3RBc3NlbWJseSxcbiAgICBhY3R1YWxBcHA6IENka1Rlc3RBcHAsXG4gICk6IFByb21pc2U8eyBkaWFnbm9zdGljczogRGlhZ25vc3RpY1tdOyBkZXN0cnVjdGl2ZUNoYW5nZXM6IERlc3RydWN0aXZlQ2hhbmdlW10gfT4ge1xuICAgIGNvbnN0IGZhaWx1cmVzOiBEaWFnbm9zdGljW10gPSBbXTtcbiAgICBjb25zdCBkZXN0cnVjdGl2ZUNoYW5nZXM6IERlc3RydWN0aXZlQ2hhbmdlW10gPSBbXTtcblxuICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgQ0ZOIHRlbXBsYXRlIGluIHRoZSBjdXJyZW50IHNuYXBzaG90XG4gICAgLy8gdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgXCJhY3R1YWxcIiBzbmFwc2hvdFxuICAgIGZvciAoY29uc3QgW3N0YWNrSWQsIHN0YWNrXSBvZiBPYmplY3QuZW50cmllcyhleHBlY3RlZCkpIHtcbiAgICAgIGZvciAoY29uc3QgdGVtcGxhdGVJZCBvZiBPYmplY3Qua2V5cyhzdGFjay50ZW1wbGF0ZXMpKSB7XG4gICAgICAgIGlmICghYWN0dWFsW3N0YWNrSWRdPy50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0pIHtcbiAgICAgICAgICBmYWlsdXJlcy5wdXNoKHtcbiAgICAgICAgICAgIHRlc3ROYW1lOiB0aGlzLnRlc3QudGVzdE5hbWUsXG4gICAgICAgICAgICBzdGFja05hbWU6IHRlbXBsYXRlSWQsXG4gICAgICAgICAgICByZWFzb246IERpYWdub3N0aWNSZWFzb24uU05BUFNIT1RfRkFJTEVELFxuICAgICAgICAgICAgbWVzc2FnZTogYCR7dGVtcGxhdGVJZH0gZXhpc3RzIGluIHNuYXBzaG90LCBidXQgbm90IGluIGFjdHVhbGAsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtzdGFja0lkLCBzdGFja10gb2YgT2JqZWN0LmVudHJpZXMoYWN0dWFsKSkge1xuICAgICAgZm9yIChjb25zdCB0ZW1wbGF0ZUlkIG9mIE9iamVjdC5rZXlzKHN0YWNrLnRlbXBsYXRlcykpIHtcbiAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgQ0ZOIHRlbXBsYXRlIGluIHRoZSBcImFjdHVhbFwiIHNuYXBzaG90XG4gICAgICAvLyB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBjdXJyZW50IHNuYXBzaG90XG4gICAgICAgIGlmICghZXhwZWN0ZWRbc3RhY2tJZF0/LnRlbXBsYXRlc1t0ZW1wbGF0ZUlkXSkge1xuICAgICAgICAgIGZhaWx1cmVzLnB1c2goe1xuICAgICAgICAgICAgdGVzdE5hbWU6IHRoaXMudGVzdC50ZXN0TmFtZSxcbiAgICAgICAgICAgIHN0YWNrTmFtZTogdGVtcGxhdGVJZCxcbiAgICAgICAgICAgIHJlYXNvbjogRGlhZ25vc3RpY1JlYXNvbi5TTkFQU0hPVF9GQUlMRUQsXG4gICAgICAgICAgICBtZXNzYWdlOiBgJHt0ZW1wbGF0ZUlkfSBkb2VzIG5vdCBleGlzdCBpbiBzbmFwc2hvdCwgYnV0IGRvZXMgaW4gYWN0dWFsYCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICAgICAgICBkaWZmQXNzZXRzOiBhY3R1YWxBcHAudGVzdFN1aXRlLmdldE9wdGlvbnNGb3JTdGFjayhzdGFja0lkKT8uZGlmZkFzc2V0cyxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGxldCBhY3R1YWxUZW1wbGF0ZSA9IGFjdHVhbFtzdGFja0lkXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF07XG4gICAgICAgICAgbGV0IGV4cGVjdGVkVGVtcGxhdGUgPSBleHBlY3RlZFtzdGFja0lkXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF07XG5cbiAgICAgICAgICAvLyBpZiB3ZSBhcmUgbm90IHZlcmlmeWluZyBhc3NldCBoYXNoZXMgdGhlbiByZW1vdmUgdGhlIHNwZWNpZmljXG4gICAgICAgICAgLy8gYXNzZXQgaGFzaGVzIGZyb20gdGhlIHRlbXBsYXRlcyBzbyB0aGV5IGFyZSBub3QgcGFydCBvZiB0aGUgZGlmZlxuICAgICAgICAgIC8vIGNvbXBhcmlzb25cbiAgICAgICAgICBpZiAoIWNvbmZpZy5kaWZmQXNzZXRzKSB7XG4gICAgICAgICAgICBhY3R1YWxUZW1wbGF0ZSA9IHRoaXMuY2Fub25pY2FsaXplVGVtcGxhdGUoYWN0dWFsVGVtcGxhdGUsIGFjdHVhbFtzdGFja0lkXS5hc3NldHMpO1xuICAgICAgICAgICAgZXhwZWN0ZWRUZW1wbGF0ZSA9IHRoaXMuY2Fub25pY2FsaXplVGVtcGxhdGUoZXhwZWN0ZWRUZW1wbGF0ZSwgZXhwZWN0ZWRbc3RhY2tJZF0uYXNzZXRzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdGVtcGxhdGVEaWZmID0gZnVsbERpZmYoZXhwZWN0ZWRUZW1wbGF0ZSwgYWN0dWFsVGVtcGxhdGUpO1xuICAgICAgICAgIGlmICghdGVtcGxhdGVEaWZmLmlzRW1wdHkpIHtcbiAgICAgICAgICAgIGNvbnN0IGFsbG93ZWREZXN0cm95VHlwZXMgPSAoYXdhaXQgdGhpcy5nZXRBbGxvd2VkRGVzdHJveVR5cGVzRm9yU3RhY2soYWN0dWFsQXBwLCBzdGFja0lkKSkgPz8gW107XG5cbiAgICAgICAgICAgIC8vIGdvIHRocm91Z2ggYWxsIHRoZSByZXNvdXJjZSBkaWZmZXJlbmNlcyBhbmQgY2hlY2sgZm9yIGFueVxuICAgICAgICAgICAgLy8gXCJkZXN0cnVjdGl2ZVwiIGNoYW5nZXNcbiAgICAgICAgICAgIHRlbXBsYXRlRGlmZi5yZXNvdXJjZXMuZm9yRWFjaERpZmZlcmVuY2UoKGxvZ2ljYWxJZDogc3RyaW5nLCBjaGFuZ2U6IFJlc291cmNlRGlmZmVyZW5jZSkgPT4ge1xuICAgICAgICAgICAgLy8gaWYgdGhlIGNoYW5nZSBpcyBhIHJlbW92YWwgaXQgd2lsbCBub3Qgc2hvdyB1cCBhcyBhICdjaGFuZ2VJbXBhY3QnXG4gICAgICAgICAgICAvLyBzbyBuZWVkIHRvIGNoZWNrIGZvciBpdCBzZXBhcmF0ZWx5LCB1bmxlc3MgaXQgaXMgYSByZXNvdXJjZVR5cGUgdGhhdFxuICAgICAgICAgICAgLy8gaGFzIGJlZW4gXCJhbGxvd2VkXCIgdG8gYmUgZGVzdHJveWVkXG4gICAgICAgICAgICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IGNoYW5nZS5vbGRWYWx1ZT8uVHlwZSA/PyBjaGFuZ2UubmV3VmFsdWU/LlR5cGU7XG4gICAgICAgICAgICAgIGlmIChyZXNvdXJjZVR5cGUgJiYgYWxsb3dlZERlc3Ryb3lUeXBlcy5pbmNsdWRlcyhyZXNvdXJjZVR5cGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChjaGFuZ2UuaXNSZW1vdmFsKSB7XG4gICAgICAgICAgICAgICAgZGVzdHJ1Y3RpdmVDaGFuZ2VzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgaW1wYWN0OiBSZXNvdXJjZUltcGFjdC5XSUxMX0RFU1RST1ksXG4gICAgICAgICAgICAgICAgICBsb2dpY2FsSWQsXG4gICAgICAgICAgICAgICAgICBzdGFja05hbWU6IHRlbXBsYXRlSWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChjaGFuZ2UuY2hhbmdlSW1wYWN0KSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIFJlc291cmNlSW1wYWN0Lk1BWV9SRVBMQUNFOlxuICAgICAgICAgICAgICAgICAgY2FzZSBSZXNvdXJjZUltcGFjdC5XSUxMX09SUEhBTjpcbiAgICAgICAgICAgICAgICAgIGNhc2UgUmVzb3VyY2VJbXBhY3QuV0lMTF9ERVNUUk9ZOlxuICAgICAgICAgICAgICAgICAgY2FzZSBSZXNvdXJjZUltcGFjdC5XSUxMX1JFUExBQ0U6XG4gICAgICAgICAgICAgICAgICAgIGRlc3RydWN0aXZlQ2hhbmdlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICBpbXBhY3Q6IGNoYW5nZS5jaGFuZ2VJbXBhY3QsXG4gICAgICAgICAgICAgICAgICAgICAgbG9naWNhbElkLFxuICAgICAgICAgICAgICAgICAgICAgIHN0YWNrTmFtZTogdGVtcGxhdGVJZCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCB3cml0YWJsZSA9IG5ldyBTdHJpbmdXcml0YWJsZSh7fSk7XG4gICAgICAgICAgICBmb3JtYXREaWZmZXJlbmNlcyh3cml0YWJsZSwgdGVtcGxhdGVEaWZmKTtcbiAgICAgICAgICAgIGZhaWx1cmVzLnB1c2goe1xuICAgICAgICAgICAgICByZWFzb246IERpYWdub3N0aWNSZWFzb24uU05BUFNIT1RfRkFJTEVELFxuICAgICAgICAgICAgICBtZXNzYWdlOiB3cml0YWJsZS5kYXRhLFxuICAgICAgICAgICAgICBzdGFja05hbWU6IHRlbXBsYXRlSWQsXG4gICAgICAgICAgICAgIHRlc3ROYW1lOiB0aGlzLnRlc3QudGVzdE5hbWUsXG4gICAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkaWFnbm9zdGljczogZmFpbHVyZXMsXG4gICAgICBkZXN0cnVjdGl2ZUNoYW5nZXMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWR1Y2UgdGVtcGxhdGUgdG8gYSBub3JtYWwgZm9ybSB3aGVyZSBhc3NldCByZWZlcmVuY2VzIGhhdmUgYmVlbiBub3JtYWxpemVkXG4gICAqXG4gICAqIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gY29tcGFyZSB0ZW1wbGF0ZXMgaWYgYWxsIHRoYXQncyBkaWZmZXJlbnQgYmV0d2VlblxuICAgKiB0aGVtIGlzIHRoZSBoYXNoZXMgb2YgdGhlIGFzc2V0IHZhbHVlcy5cbiAgICovXG4gIHByaXZhdGUgY2Fub25pY2FsaXplVGVtcGxhdGUodGVtcGxhdGU6IGFueSwgYXNzZXRzOiBzdHJpbmdbXSk6IGFueSB7XG4gICAgY29uc3QgYXNzZXRzU2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IHN0cmluZ1N1YnN0aXR1dGlvbnMgPSBuZXcgQXJyYXk8W1JlZ0V4cCwgc3RyaW5nXT4oKTtcblxuICAgIC8vIEZpbmQgYXNzZXRzIHZpYSBwYXJhbWV0ZXJzIChmb3IgTGVnYWN5U3RhY2tTeW50aGVzaXplcilcbiAgICBjb25zdCBwYXJhbVJlID0gL15Bc3NldFBhcmFtZXRlcnMoW2EtekEtWjAtOV17NjR9KShTM0J1Y2tldHxTM1ZlcnNpb25LZXl8QXJ0aWZhY3RIYXNoKShbYS16QS1aMC05XXs4fSkkLztcbiAgICBmb3IgKGNvbnN0IHBhcmFtTmFtZSBvZiBPYmplY3Qua2V5cyh0ZW1wbGF0ZT8uUGFyYW1ldGVycyB8fCB7fSkpIHtcbiAgICAgIGNvbnN0IG0gPSBwYXJhbVJlLmV4ZWMocGFyYW1OYW1lKTtcbiAgICAgIGlmICghbSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChhc3NldHNTZWVuLmhhcyhtWzFdKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYXNzZXRzU2Vlbi5hZGQobVsxXSk7XG4gICAgICBjb25zdCBpeCA9IGFzc2V0c1NlZW4uc2l6ZTtcblxuICAgICAgLy8gRnVsbCBwYXJhbWV0ZXIgcmVmZXJlbmNlXG4gICAgICBzdHJpbmdTdWJzdGl0dXRpb25zLnB1c2goW1xuICAgICAgICBuZXcgUmVnRXhwKGBBc3NldFBhcmFtZXRlcnMke21bMV19KFMzQnVja2V0fFMzVmVyc2lvbktleXxBcnRpZmFjdEhhc2gpKFthLXpBLVowLTldezh9KWApLFxuICAgICAgICBgQXNzZXQke2l4fSQxYCxcbiAgICAgIF0pO1xuICAgICAgLy8gU3Vic3RyaW5nIGFzc2V0IGhhc2ggcmVmZXJlbmNlXG4gICAgICBzdHJpbmdTdWJzdGl0dXRpb25zLnB1c2goW1xuICAgICAgICBuZXcgUmVnRXhwKGAke21bMV19YCksXG4gICAgICAgIGBBc3NldCR7aXh9SGFzaGAsXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICAvLyBmaW5kIGFzc2V0cyBkZWZpbmVkIGluIHRoZSBhc3NldCBtYW5pZmVzdFxuICAgIHRyeSB7XG4gICAgICBhc3NldHMuZm9yRWFjaChhc3NldCA9PiB7XG4gICAgICAgIGlmICghYXNzZXRzU2Vlbi5oYXMoYXNzZXQpKSB7XG4gICAgICAgICAgYXNzZXRzU2Vlbi5hZGQoYXNzZXQpO1xuICAgICAgICAgIGNvbnN0IGl4ID0gYXNzZXRzU2Vlbi5zaXplO1xuICAgICAgICAgIHN0cmluZ1N1YnN0aXR1dGlvbnMucHVzaChbXG4gICAgICAgICAgICBuZXcgUmVnRXhwKGFzc2V0KSxcbiAgICAgICAgICAgIGBBc3NldCR7aXh9JDFgLFxuICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIGFzc2V0IG1hbmlmZXN0IHRoYXQgaXMgZmluZS5cbiAgICB9XG5cbiAgICAvLyBTdWJzdGl0dXRlIHRoZW0gb3V0XG4gICAgcmV0dXJuIHN1YnN0aXR1dGUodGVtcGxhdGUpO1xuXG4gICAgZnVuY3Rpb24gc3Vic3RpdHV0ZSh3aGF0OiBhbnkpOiBhbnkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkod2hhdCkpIHtcbiAgICAgICAgcmV0dXJuIHdoYXQubWFwKHN1YnN0aXR1dGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHdoYXQgPT09ICdvYmplY3QnICYmIHdoYXQgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgcmV0OiBhbnkgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMod2hhdCkpIHtcbiAgICAgICAgICByZXRbc3RyaW5nU3ViKGspXSA9IHN1YnN0aXR1dGUodik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB3aGF0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gc3RyaW5nU3ViKHdoYXQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gd2hhdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdHJpbmdTdWIoeDogc3RyaW5nKSB7XG4gICAgICBmb3IgKGNvbnN0IFtyZSwgcmVwbGFjZW1lbnRdIG9mIHN0cmluZ1N1YnN0aXR1dGlvbnMpIHtcbiAgICAgICAgeCA9IHgucmVwbGFjZShyZSwgcmVwbGFjZW1lbnQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIFN0cmluZ1dyaXRhYmxlIGV4dGVuZHMgV3JpdGFibGUge1xuICBwdWJsaWMgZGF0YTogc3RyaW5nO1xuICBwcml2YXRlIF9kZWNvZGVyOiBTdHJpbmdEZWNvZGVyO1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBXcml0YWJsZU9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgICB0aGlzLl9kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoKTtcbiAgICB0aGlzLmRhdGEgPSAnJztcbiAgfVxuXG4gIF93cml0ZShjaHVuazogYW55LCBlbmNvZGluZzogc3RyaW5nLCBjYWxsYmFjazogKGVycm9yPzogRXJyb3IgfCBudWxsKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgaWYgKGVuY29kaW5nID09PSAnYnVmZmVyJykge1xuICAgICAgY2h1bmsgPSB0aGlzLl9kZWNvZGVyLndyaXRlKGNodW5rKTtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGEgKz0gY2h1bms7XG4gICAgY2FsbGJhY2soKTtcbiAgfVxuXG4gIF9maW5hbChjYWxsYmFjazogKGVycm9yPzogRXJyb3IgfCBudWxsKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5kYXRhICs9IHRoaXMuX2RlY29kZXIuZW5kKCk7XG4gICAgY2FsbGJhY2soKTtcbiAgfVxufVxuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"extract_worker.d.ts","sourceRoot":"","sources":["extract_worker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAEpE,OAAO,KAAK,EAAE,qBAAqB,EAAE,2BAA2B,EAAc,MAAM,WAAW,CAAC;AAEhG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAgFtG;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B/E;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,aAAa,EAAE,OAAO,GAAE,2BAAgC,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CA6D7I"}
1
+ {"version":3,"file":"extract_worker.d.ts","sourceRoot":"","sources":["extract_worker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAEpE,OAAO,KAAK,EAAE,qBAAqB,EAAE,2BAA2B,EAAc,MAAM,WAAW,CAAC;AAEhG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAyEtG;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB/E;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,aAAa,EAAE,OAAO,GAAE,2BAAgC,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAkE7I"}
@@ -52,7 +52,7 @@ async function integTestWorker(request) {
52
52
  const failures = [];
53
53
  const verbosity = request.verbosity ?? 0;
54
54
  for (const testInfo of request.tests) {
55
- const test = new integration_tests_1.IntegTest({
55
+ const test = integration_tests_1.IntegTest.hydrate({
56
56
  ...testInfo,
57
57
  watch: request.watch,
58
58
  }); // Hydrate from data
@@ -68,52 +68,45 @@ async function integTestWorker(request) {
68
68
  CDK_DOCKER: process.env.CDK_DOCKER ?? 'docker',
69
69
  },
70
70
  showOutput: verbosity >= 2,
71
- testingUsingMocksLeaveDirectories: request.testingUsingMocksLeaveDirectories,
71
+ TESTING_usingMocks: request.testingUsingMocksLeaveDirectories,
72
72
  }, testInfo.destructiveChanges);
73
- const tests = await runner.actualTests();
74
- if (!tests || Object.keys(tests).length === 0) {
75
- throw new Error(`No tests defined for ${runner.testName}`);
76
- }
77
- for (const testCaseName of Object.keys(tests)) {
78
- try {
79
- const results = await runner.runIntegTestCase({
80
- testCaseName,
81
- clean: request.clean,
82
- dryRun: request.dryRun,
83
- updateWorkflow: request.updateWorkflow,
84
- updateFromTags: request.updateFromTags,
85
- verbosity,
86
- roleArn: request.roleArn,
87
- allowDeleteFailures: request.allowDeleteFailures,
73
+ try {
74
+ const results = await runner.runIntegTestCase({
75
+ clean: request.clean,
76
+ dryRun: request.dryRun,
77
+ updateWorkflow: request.updateWorkflow,
78
+ updateFromTags: request.updateFromTags,
79
+ verbosity,
80
+ roleArn: request.roleArn,
81
+ allowDeleteFailures: request.allowDeleteFailures,
82
+ });
83
+ if (results && Object.values(results).some(result => result.status === 'fail')) {
84
+ failures.push(testInfo);
85
+ workerpool.workerEmit({
86
+ reason: common_1.DiagnosticReason.ASSERTION_FAILED,
87
+ testName: `${test.testName} (${request.profile}/${request.region})`,
88
+ message: (0, common_1.formatAssertionResults)(results),
89
+ duration: (Date.now() - start) / 1000,
88
90
  });
89
- if (results && Object.values(results).some(result => result.status === 'fail')) {
90
- failures.push(testInfo);
91
- workerpool.workerEmit({
92
- reason: common_1.DiagnosticReason.ASSERTION_FAILED,
93
- testName: `${runner.testName}-${testCaseName} (${request.profile}/${request.region})`,
94
- message: (0, common_1.formatAssertionResults)(results),
95
- duration: (Date.now() - start) / 1000,
96
- });
97
- }
98
- else {
99
- workerpool.workerEmit({
100
- reason: common_1.DiagnosticReason.TEST_SUCCESS,
101
- testName: `${runner.testName}-${testCaseName}`,
102
- message: results ? (0, common_1.formatAssertionResults)(results) : 'NO ASSERTIONS',
103
- duration: (Date.now() - start) / 1000,
104
- });
105
- }
106
91
  }
107
- catch (e) {
108
- failures.push(testInfo);
92
+ else {
109
93
  workerpool.workerEmit({
110
- reason: common_1.DiagnosticReason.TEST_FAILED,
111
- testName: `${runner.testName}-${testCaseName} (${request.profile}/${request.region})`,
112
- message: `Integration test failed: ${(0, common_1.formatError)(e)}`,
94
+ reason: common_1.DiagnosticReason.TEST_SUCCESS,
95
+ testName: `${test.testName}`,
96
+ message: results ? (0, common_1.formatAssertionResults)(results) : 'NO ASSERTIONS',
113
97
  duration: (Date.now() - start) / 1000,
114
98
  });
115
99
  }
116
100
  }
101
+ catch (e) {
102
+ failures.push(testInfo);
103
+ workerpool.workerEmit({
104
+ reason: common_1.DiagnosticReason.TEST_FAILED,
105
+ testName: `${test.testName} (${request.profile}/${request.region})`,
106
+ message: `Integration test failed: ${(0, common_1.formatError)(e)}`,
107
+ duration: (Date.now() - start) / 1000,
108
+ });
109
+ }
117
110
  }
118
111
  catch (e) {
119
112
  failures.push(testInfo);
@@ -141,18 +134,10 @@ async function watchTestWorker(options) {
141
134
  },
142
135
  showOutput: verbosity >= 2,
143
136
  });
144
- runner.createCdkContextJson();
145
- const tests = await runner.actualTests();
146
- if (!tests || Object.keys(tests).length === 0) {
147
- throw new Error(`No tests defined for ${runner.testName}`);
148
- }
149
- for (const testCaseName of Object.keys(tests)) {
150
- await runner.watchIntegTest({
151
- testCaseName,
152
- verbosity,
153
- roleArn: options.roleArn,
154
- });
155
- }
137
+ await runner.watchIntegTest({
138
+ verbosity,
139
+ roleArn: options.roleArn,
140
+ });
156
141
  }
157
142
  /**
158
143
  * Runs a single snapshot test batch request.
@@ -176,37 +161,39 @@ async function snapshotTestWorker(testInfo, options = {}) {
176
161
  const runner = new runner_1.IntegSnapshotRunner({
177
162
  test,
178
163
  showOutput: options.verbose ?? false,
179
- testingUsingMocksLeaveDirectories: options.testingUsingMocksLeaveDirectories,
164
+ TESTING_usingMocks: options.testingUsingMocksLeaveDirectories,
180
165
  });
181
- if (!runner.hasSnapshot()) {
182
- workerpool.workerEmit({
183
- reason: common_1.DiagnosticReason.NO_SNAPSHOT,
184
- testName: test.testName,
185
- message: 'No Snapshot',
186
- duration: (Date.now() - start) / 1000,
187
- });
188
- failedTests.push(test.info);
189
- }
190
- else {
191
- const { diagnostics, destructiveChanges } = await runner.testSnapshot(options);
192
- if (diagnostics.length > 0) {
193
- diagnostics.forEach(diagnostic => workerpool.workerEmit({
194
- ...diagnostic,
195
- duration: (Date.now() - start) / 1000,
196
- }));
197
- failedTests.push({
198
- ...test.info,
199
- destructiveChanges,
200
- });
201
- }
202
- else {
166
+ const result = await runner.testSnapshot(options);
167
+ switch (result.type) {
168
+ case 'no-shapshot':
203
169
  workerpool.workerEmit({
204
- reason: common_1.DiagnosticReason.SNAPSHOT_SUCCESS,
170
+ reason: common_1.DiagnosticReason.NO_SNAPSHOT,
205
171
  testName: test.testName,
206
- message: 'Success',
172
+ message: 'No Snapshot',
207
173
  duration: (Date.now() - start) / 1000,
208
174
  });
209
- }
175
+ failedTests.push(test.info);
176
+ break;
177
+ case 'did-compare':
178
+ if (result.diagnostics.length > 0) {
179
+ result.diagnostics.forEach(diagnostic => workerpool.workerEmit({
180
+ ...diagnostic,
181
+ duration: (Date.now() - start) / 1000,
182
+ }));
183
+ failedTests.push({
184
+ ...test.info,
185
+ destructiveChanges: result.destructiveChanges,
186
+ });
187
+ }
188
+ else {
189
+ workerpool.workerEmit({
190
+ reason: common_1.DiagnosticReason.SNAPSHOT_SUCCESS,
191
+ testName: test.testName,
192
+ message: 'Success',
193
+ duration: (Date.now() - start) / 1000,
194
+ });
195
+ }
196
+ break;
210
197
  }
211
198
  }
212
199
  catch (e) {
@@ -228,4 +215,4 @@ workerpool.worker({
228
215
  integTestWorker,
229
216
  watchTestWorker,
230
217
  });
231
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0cmFjdF93b3JrZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJleHRyYWN0X3dvcmtlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlCQSwwQ0FnRkM7QUFFRCwwQ0EyQkM7QUFRRCxnREE2REM7QUFuTUQsdURBQXlDO0FBQ3pDLHlDQUFvRTtBQUVwRSxzRUFBMkQ7QUFFM0Qsc0NBQWtGO0FBSWxGOzs7Ozs7O0dBT0c7QUFDSSxLQUFLLFVBQVUsZUFBZSxDQUFDLE9BQThCO0lBQ2xFLE1BQU0sUUFBUSxHQUFvQixFQUFFLENBQUM7SUFDckMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUM7SUFFekMsS0FBSyxNQUFNLFFBQVEsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDckMsTUFBTSxJQUFJLEdBQUcsSUFBSSw2QkFBUyxDQUFDO1lBQ3pCLEdBQUcsUUFBUTtZQUNYLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztTQUNyQixDQUFDLENBQUMsQ0FBQyxvQkFBb0I7UUFDeEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRXpCLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLElBQUksd0JBQWUsQ0FBQztnQkFDakMsSUFBSTtnQkFDSixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87Z0JBQ3hCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtnQkFDdEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO2dCQUNwQixZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVk7Z0JBQ2xDLEdBQUcsRUFBRTtvQkFDSCxVQUFVLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksUUFBUTtpQkFDL0M7Z0JBQ0QsVUFBVSxFQUFFLFNBQVMsSUFBSSxDQUFDO2dCQUMxQixpQ0FBaUMsRUFBRSxPQUFPLENBQUMs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b0JBQ2xCLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJO2lCQUN4QixDQUFDLENBQUM7WUFDbkIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztRQUNoQixXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixVQUFVLENBQUMsVUFBVSxDQUFDO1lBQ3BCLE9BQU8sRUFBRSxJQUFBLG9CQUFXLEVBQUMsQ0FBQyxDQUFDO1lBQ3ZCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixNQUFNLEVBQUUseUJBQWdCLENBQUMsY0FBYztZQUN2QyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDLEdBQUcsSUFBSTtTQUN4QixDQUFDLENBQUM7SUFDbkIsQ0FBQztZQUFTLENBQUM7UUFDVCxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUVELE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRCxVQUFVLENBQUMsTUFBTSxDQUFDO0lBQ2hCLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2YsZUFBZTtDQUNoQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB3b3JrZXJwb29sIGZyb20gJ3dvcmtlcnBvb2wnO1xuaW1wb3J0IHsgSW50ZWdTbmFwc2hvdFJ1bm5lciwgSW50ZWdUZXN0UnVubmVyIH0gZnJvbSAnLi4vLi4vcnVubmVyJztcbmltcG9ydCB0eXBlIHsgSW50ZWdUZXN0SW5mbyB9IGZyb20gJy4uLy4uL3J1bm5lci9pbnRlZ3JhdGlvbi10ZXN0cyc7XG5pbXBvcnQgeyBJbnRlZ1Rlc3QgfSBmcm9tICcuLi8uLi9ydW5uZXIvaW50ZWdyYXRpb24tdGVzdHMnO1xuaW1wb3J0IHR5cGUgeyBJbnRlZ1Rlc3RXb3JrZXJDb25maWcsIFNuYXBzaG90VmVyaWZpY2F0aW9uT3B0aW9ucywgRGlhZ25vc3RpYyB9IGZyb20gJy4uL2NvbW1vbic7XG5pbXBvcnQgeyBEaWFnbm9zdGljUmVhc29uLCBmb3JtYXRBc3NlcnRpb25SZXN1bHRzLCBmb3JtYXRFcnJvciB9IGZyb20gJy4uL2NvbW1vbic7XG5pbXBvcnQgdHlwZSB7IEludGVnVGVzdEJhdGNoUmVxdWVzdCB9IGZyb20gJy4uL2ludGVnLXRlc3Qtd29ya2VyJztcbmltcG9ydCB0eXBlIHsgSW50ZWdXYXRjaE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlZy13YXRjaC13b3JrZXInO1xuXG4vKipcbiAqIFJ1bnMgYSBzaW5nbGUgaW50ZWdyYXRpb24gdGVzdCBiYXRjaCByZXF1ZXN0LlxuICogSWYgdGhlIHRlc3QgZG9lcyBub3QgaGF2ZSBhbiBleGlzdGluZyBzbmFwc2hvdCxcbiAqIHRoaXMgd2lsbCBmaXJzdCBnZW5lcmF0ZSBhIHNuYXBzaG90IGFuZCB0aGVuIGV4ZWN1dGVcbiAqIHRoZSBpbnRlZ3JhdGlvbiB0ZXN0cy5cbiAqXG4gKiBJZiB0aGUgdGVzdHMgc3VjY2VlZCBpdCB3aWxsIHRoZW4gc2F2ZSB0aGUgc25hcHNob3RcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGludGVnVGVzdFdvcmtlcihyZXF1ZXN0OiBJbnRlZ1Rlc3RCYXRjaFJlcXVlc3QpOiBQcm9taXNlPEludGVnVGVzdFdvcmtlckNvbmZpZ1tdPiB7XG4gIGNvbnN0IGZhaWx1cmVzOiBJbnRlZ1Rlc3RJbmZvW10gPSBbXTtcbiAgY29uc3QgdmVyYm9zaXR5ID0gcmVxdWVzdC52ZXJib3NpdHkgPz8gMDtcblxuICBmb3IgKGNvbnN0IHRlc3RJbmZvIG9mIHJlcXVlc3QudGVzdHMpIHtcbiAgICBjb25zdCB0ZXN0ID0gbmV3IEludGVnVGVzdCh7XG4gICAgICAuLi50ZXN0SW5mbyxcbiAgICAgIHdhdGNoOiByZXF1ZXN0LndhdGNoLFxuICAgIH0pOyAvLyBIeWRyYXRlIGZyb20gZGF0YVxuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBydW5uZXIgPSBuZXcgSW50ZWdUZXN0UnVubmVyKHtcbiAgICAgICAgdGVzdCxcbiAgICAgICAgcHJvZmlsZTogcmVxdWVzdC5wcm9maWxlLFxuICAgICAgICByZWdpb246IHJlcXVlc3QucmVnaW9uLFxuICAgICAgICBwcm94eTogcmVxdWVzdC5wcm94eSxcbiAgICAgICAgY2FCdW5kbGVQYXRoOiByZXF1ZXN0LmNhQnVuZGxlUGF0aCxcbiAgICAgICAgZW52OiB7XG4gICAgICAgICAgQ0RLX0RPQ0tFUjogcHJvY2Vzcy5lbnYuQ0RLX0RPQ0tFUiA/PyAnZG9ja2VyJyxcbiAgICAgICAgfSxcbiAgICAgICAgc2hvd091dHB1dDogdmVyYm9zaXR5ID49IDIsXG4gICAgICAgIHRlc3RpbmdVc2luZ01vY2tzTGVhdmVEaXJlY3RvcmllczogcmVxdWVzdC50ZXN0aW5nVXNpbmdNb2Nrc0xlYXZlRGlyZWN0b3JpZXMsXG4gICAgICB9LCB0ZXN0SW5mby5kZXN0cnVjdGl2ZUNoYW5nZXMpO1xuXG4gICAgICBjb25zdCB0ZXN0cyA9IGF3YWl0IHJ1bm5lci5hY3R1YWxUZXN0cygpO1xuXG4gICAgICBpZiAoIXRlc3RzIHx8IE9iamVjdC5rZXlzKHRlc3RzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyB0ZXN0cyBkZWZpbmVkIGZvciAke3J1bm5lci50ZXN0TmFtZX1gKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgdGVzdENhc2VOYW1lIG9mIE9iamVjdC5rZXlzKHRlc3RzKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBydW5uZXIucnVuSW50ZWdUZXN0Q2FzZSh7XG4gICAgICAgICAgICB0ZXN0Q2FzZU5hbWUsXG4gICAgICAgICAgICBjbGVhbjogcmVxdWVzdC5jbGVhbixcbiAgICAgICAgICAgIGRyeVJ1bjogcmVxdWVzdC5kcnlSdW4sXG4gICAgICAgICAgICB1cGRhdGVXb3JrZmxvdzogcmVxdWVzdC51cGRhdGVXb3JrZmxvdyxcbiAgICAgICAgICAgIHVwZGF0ZUZyb21UYWdzOiByZXF1ZXN0LnVwZGF0ZUZyb21UYWdzLFxuICAgICAgICAgICAgdmVyYm9zaXR5LFxuICAgICAgICAgICAgcm9sZUFybjogcmVxdWVzdC5yb2xlQXJuLFxuICAgICAgICAgICAgYWxsb3dEZWxldGVGYWlsdXJlczogcmVxdWVzdC5hbGxvd0RlbGV0ZUZhaWx1cmVzLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChyZXN1bHRzICYmIE9iamVjdC52YWx1ZXMocmVzdWx0cykuc29tZShyZXN1bHQgPT4gcmVzdWx0LnN0YXR1cyA9PT0gJ2ZhaWwnKSkge1xuICAgICAgICAgICAgZmFpbHVyZXMucHVzaCh0ZXN0SW5mbyk7XG4gICAgICAgICAgICB3b3JrZXJwb29sLndvcmtlckVtaXQoe1xuICAgICAgICAgICAgICByZWFzb246IERpYWdub3N0aWNSZWFzb24uQVNTRVJUSU9OX0ZBSUxFRCxcbiAgICAgICAgICAgICAgdGVzdE5hbWU6IGAke3J1bm5lci50ZXN0TmFtZX0tJHt0ZXN0Q2FzZU5hbWV9ICgke3JlcXVlc3QucHJvZmlsZX0vJHtyZXF1ZXN0LnJlZ2lvbn0pYCxcbiAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0QXNzZXJ0aW9uUmVzdWx0cyhyZXN1bHRzKSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IChEYXRlLm5vdygpIC0gc3RhcnQpIC8gMTAwMCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3b3JrZXJwb29sLndvcmtlckVtaXQoe1xuICAgICAgICAgICAgICByZWFzb246IERpYWdub3N0aWNSZWFzb24uVEVTVF9TVUNDRVNTLFxuICAgICAgICAgICAgICB0ZXN0TmFtZTogYCR7cnVubmVyLnRlc3ROYW1lfS0ke3Rlc3RDYXNlTmFtZX1gLFxuICAgICAgICAgICAgICBtZXNzYWdlOiByZXN1bHRzID8gZm9ybWF0QXNzZXJ0aW9uUmVzdWx0cyhyZXN1bHRzKSA6ICdOTyBBU1NFUlRJT05TJyxcbiAgICAgICAgICAgICAgZHVyYXRpb246IChEYXRlLm5vdygpIC0gc3RhcnQpIC8gMTAwMCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGZhaWx1cmVzLnB1c2godGVzdEluZm8pO1xuICAgICAgICAgIHdvcmtlcnBvb2wud29ya2VyRW1pdCh7XG4gICAgICAgICAgICByZWFzb246IERpYWdub3N0aWNSZWFzb24uVEVTVF9GQUlMRUQsXG4gICAgICAgICAgICB0ZXN0TmFtZTogYCR7cnVubmVyLnRlc3ROYW1lfS0ke3Rlc3RDYXNlTmFtZX0gKCR7cmVxdWVzdC5wcm9maWxlfS8ke3JlcXVlc3QucmVnaW9ufSlgLFxuICAgICAgICAgICAgbWVzc2FnZTogYEludGVncmF0aW9uIHRlc3QgZmFpbGVkOiAke2Zvcm1hdEVycm9yKGUpfWAsXG4gICAgICAgICAgICBkdXJhdGlvbjogKERhdGUubm93KCkgLSBzdGFydCkgLyAxMDAwLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZmFpbHVyZXMucHVzaCh0ZXN0SW5mbyk7XG4gICAgICB3b3JrZXJwb29sLndvcmtlckVtaXQoe1xuICAgICAgICByZWFzb246IERpYWdub3N0aWNSZWFzb24uVEVTVF9FUlJPUixcbiAgICAgICAgdGVzdE5hbWU6IGAke3Rlc3RJbmZvLmZpbGVOYW1lfSAoJHtyZXF1ZXN0LnByb2ZpbGV9LyR7cmVxdWVzdC5yZWdpb259KWAsXG4gICAgICAgIG1lc3NhZ2U6IGBFcnJvciBkdXJpbmcgaW50ZWdyYXRpb24gdGVzdDogJHtmb3JtYXRFcnJvcihlKX1gLFxuICAgICAgICBkdXJhdGlvbjogKERhdGUubm93KCkgLSBzdGFydCkgLyAxMDAwLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhaWx1cmVzO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2F0Y2hUZXN0V29ya2VyKG9wdGlvbnM6IEludGVnV2F0Y2hPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHZlcmJvc2l0eSA9IG9wdGlvbnMudmVyYm9zaXR5ID8/IDA7XG4gIGNvbnN0IHRlc3QgPSBuZXcgSW50ZWdUZXN0KG9wdGlvbnMpO1xuICBjb25zdCBydW5uZXIgPSBuZXcgSW50ZWdUZXN0UnVubmVyKHtcbiAgICB0ZXN0LFxuICAgIHByb2ZpbGU6IG9wdGlvbnMucHJvZmlsZSxcbiAgICByZWdpb246IG9wdGlvbnMucmVnaW9uLFxuICAgIHByb3h5OiBvcHRpb25zLnByb3h5LFxuICAgIGNhQnVuZGxlUGF0aDogb3B0aW9ucy5jYUJ1bmRsZVBhdGgsXG4gICAgZW52OiB7XG4gICAgICBDREtfRE9DS0VSOiBwcm9jZXNzLmVudi5DREtfRE9DS0VSID8/ICdkb2NrZXInLFxuICAgIH0sXG4gICAgc2hvd091dHB1dDogdmVyYm9zaXR5ID49IDIsXG4gIH0pO1xuICBydW5uZXIuY3JlYXRlQ2RrQ29udGV4dEpzb24oKTtcbiAgY29uc3QgdGVzdHMgPSBhd2FpdCBydW5uZXIuYWN0dWFsVGVzdHMoKTtcblxuICBpZiAoIXRlc3RzIHx8IE9iamVjdC5rZXlzKHRlc3RzKS5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHRlc3RzIGRlZmluZWQgZm9yICR7cnVubmVyLnRlc3ROYW1lfWApO1xuICB9XG4gIGZvciAoY29uc3QgdGVzdENhc2VOYW1lIG9mIE9iamVjdC5rZXlzKHRlc3RzKSkge1xuICAgIGF3YWl0IHJ1bm5lci53YXRjaEludGVnVGVzdCh7XG4gICAgICB0ZXN0Q2FzZU5hbWUsXG4gICAgICB2ZXJib3NpdHksXG4gICAgICByb2xlQXJuOiBvcHRpb25zLnJvbGVBcm4sXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSdW5zIGEgc2luZ2xlIHNuYXBzaG90IHRlc3QgYmF0Y2ggcmVxdWVzdC5cbiAqIEZvciBlYWNoIGludGVncmF0aW9uIHRlc3QgdGhpcyB3aWxsIGNoZWNrIHRvIHNlZVxuICogaWYgdGhlcmUgaXMgYW4gZXhpc3Rpbmcgc25hcHNob3QsIGFuZCBpZiB0aGVyZSBpcyB3aWxsXG4gKiBjaGVjayBpZiB0aGVyZSBhcmUgYW55IGNoYW5nZXNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNuYXBzaG90VGVzdFdvcmtlcih0ZXN0SW5mbzogSW50ZWdUZXN0SW5mbywgb3B0aW9uczogU25hcHNob3RWZXJpZmljYXRpb25PcHRpb25zID0ge30pOiBQcm9taXNlPEludGVnVGVzdFdvcmtlckNvbmZpZ1tdPiB7XG4gIGNvbnN0IGZhaWxlZFRlc3RzID0gbmV3IEFycmF5PEludGVnVGVzdFdvcmtlckNvbmZpZz4oKTtcbiAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICBjb25zdCB0ZXN0ID0gbmV3IEludGVnVGVzdCh0ZXN0SW5mbyk7IC8vIEh5ZHJhdGUgdGhlIGRhdGEgcmVjb3JkIGFnYWluXG5cbiAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICB3b3JrZXJwb29sLndvcmtlckVtaXQoe1xuICAgICAgcmVhc29uOiBEaWFnbm9zdGljUmVhc29uLlRFU1RfV0FSTklORyxcbiAgICAgIHRlc3ROYW1lOiB0ZXN0LnRlc3ROYW1lLFxuICAgICAgbWVzc2FnZTogJ1Rlc3QgaXMgdGFraW5nIGEgdmVyeSBsb25nIHRpbWUnLFxuICAgICAgZHVyYXRpb246IChEYXRlLm5vdygpIC0gc3RhcnQpIC8gMTAwMCxcbiAgICB9KTtcbiAgfSwgNjBfMDAwKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJ1bm5lciA9IG5ldyBJbnRlZ1NuYXBzaG90UnVubmVyKHtcbiAgICAgIHRlc3QsXG4gICAgICBzaG93T3V0cHV0OiBvcHRpb25zLnZlcmJvc2UgPz8gZmFsc2UsXG4gICAgICB0ZXN0aW5nVXNpbmdNb2Nrc0xlYXZlRGlyZWN0b3JpZXM6IG9wdGlvbnMudGVzdGluZ1VzaW5nTW9ja3NMZWF2ZURpcmVjdG9yaWVzLFxuICAgIH0pO1xuICAgIGlmICghcnVubmVyLmhhc1NuYXBzaG90KCkpIHtcbiAgICAgIHdvcmtlcnBvb2wud29ya2VyRW1pdCh7XG4gICAgICAgIHJlYXNvbjogRGlhZ25vc3RpY1JlYXNvbi5OT19TTkFQU0hPVCxcbiAgICAgICAgdGVzdE5hbWU6IHRlc3QudGVzdE5hbWUsXG4gICAgICAgIG1lc3NhZ2U6ICdObyBTbmFwc2hvdCcsXG4gICAgICAgIGR1cmF0aW9uOiAoRGF0ZS5ub3coKSAtIHN0YXJ0KSAvIDEwMDAsXG4gICAgICB9KTtcbiAgICAgIGZhaWxlZFRlc3RzLnB1c2godGVzdC5pbmZvKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgeyBkaWFnbm9zdGljcywgZGVzdHJ1Y3RpdmVDaGFuZ2VzIH0gPSBhd2FpdCBydW5uZXIudGVzdFNuYXBzaG90KG9wdGlvbnMpO1xuICAgICAgaWYgKGRpYWdub3N0aWNzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZGlhZ25vc3RpY3MuZm9yRWFjaChkaWFnbm9zdGljID0+IHdvcmtlcnBvb2wud29ya2VyRW1pdCh7XG4gICAgICAgICAgLi4uZGlhZ25vc3RpYyxcbiAgICAgICAgICBkdXJhdGlvbjogKERhdGUubm93KCkgLSBzdGFydCkgLyAxMDAwLFxuICAgICAgICB9IGFzIERpYWdub3N0aWMpKTtcbiAgICAgICAgZmFpbGVkVGVzdHMucHVzaCh7XG4gICAgICAgICAgLi4udGVzdC5pbmZvLFxuICAgICAgICAgIGRlc3RydWN0aXZlQ2hhbmdlcyxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3b3JrZXJwb29sLndvcmtlckVtaXQoe1xuICAgICAgICAgIHJlYXNvbjogRGlhZ25vc3RpY1JlYXNvbi5TTkFQU0hPVF9TVUNDRVNTLFxuICAgICAgICAgIHRlc3ROYW1lOiB0ZXN0LnRlc3ROYW1lLFxuICAgICAgICAgIG1lc3NhZ2U6ICdTdWNjZXNzJyxcbiAgICAgICAgICBkdXJhdGlvbjogKERhdGUubm93KCkgLSBzdGFydCkgLyAxMDAwLFxuICAgICAgICB9IGFzIERpYWdub3N0aWMpO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgZmFpbGVkVGVzdHMucHVzaCh0ZXN0LmluZm8pO1xuICAgIHdvcmtlcnBvb2wud29ya2VyRW1pdCh7XG4gICAgICBtZXNzYWdlOiBmb3JtYXRFcnJvcihlKSxcbiAgICAgIHRlc3ROYW1lOiB0ZXN0LnRlc3ROYW1lLFxuICAgICAgcmVhc29uOiBEaWFnbm9zdGljUmVhc29uLlNOQVBTSE9UX0VSUk9SLFxuICAgICAgZHVyYXRpb246IChEYXRlLm5vdygpIC0gc3RhcnQpIC8gMTAwMCxcbiAgICB9IGFzIERpYWdub3N0aWMpO1xuICB9IGZpbmFsbHkge1xuICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gIH1cblxuICByZXR1cm4gZmFpbGVkVGVzdHM7XG59XG5cbndvcmtlcnBvb2wud29ya2VyKHtcbiAgc25hcHNob3RUZXN0V29ya2VyLFxuICBpbnRlZ1Rlc3RXb3JrZXIsXG4gIHdhdGNoVGVzdFdvcmtlcixcbn0pO1xuIl19
218
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0cmFjdF93b3JrZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJleHRyYWN0X3dvcmtlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlCQSwwQ0F5RUM7QUFFRCwwQ0FtQkM7QUFRRCxnREFrRUM7QUF6TEQsdURBQXlDO0FBQ3pDLHlDQUFvRTtBQUVwRSxzRUFBMkQ7QUFFM0Qsc0NBQWtGO0FBSWxGOzs7Ozs7O0dBT0c7QUFDSSxLQUFLLFVBQVUsZUFBZSxDQUFDLE9BQThCO0lBQ2xFLE1BQU0sUUFBUSxHQUFvQixFQUFFLENBQUM7SUFDckMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUM7SUFFekMsS0FBSyxNQUFNLFFBQVEsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDckMsTUFBTSxJQUFJLEdBQUcsNkJBQVMsQ0FBQyxPQUFPLENBQUM7WUFDN0IsR0FBRyxRQUFRO1lBQ1gsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1NBQ3JCLENBQUMsQ0FBQyxDQUFDLG9CQUFvQjtRQUV4QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFekIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSx3QkFBZSxDQUFDO2dCQUNqQyxJQUFJO2dCQUNKLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztnQkFDeEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO2dCQUN0QixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7Z0JBQ3BCLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWTtnQkFDbEMsR0FBRyxFQUFFO29CQUNILFVBQVUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxRQUFRO2lCQUMvQztnQkFDRCxVQUFVLEVBQUUsU0FBUyxJQUFJLENBQUM7Z0JBQzFCLGtCQUFrQixFQUFFLE9BQU8s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b3JrZXJwb29sIGZyb20gJ3dvcmtlcnBvb2wnO1xuaW1wb3J0IHsgSW50ZWdTbmFwc2hvdFJ1bm5lciwgSW50ZWdUZXN0UnVubmVyIH0gZnJvbSAnLi4vLi4vcnVubmVyJztcbmltcG9ydCB0eXBlIHsgSW50ZWdUZXN0SW5mbyB9IGZyb20gJy4uLy4uL3J1bm5lci9pbnRlZ3JhdGlvbi10ZXN0cyc7XG5pbXBvcnQgeyBJbnRlZ1Rlc3QgfSBmcm9tICcuLi8uLi9ydW5uZXIvaW50ZWdyYXRpb24tdGVzdHMnO1xuaW1wb3J0IHR5cGUgeyBJbnRlZ1Rlc3RXb3JrZXJDb25maWcsIFNuYXBzaG90VmVyaWZpY2F0aW9uT3B0aW9ucywgRGlhZ25vc3RpYyB9IGZyb20gJy4uL2NvbW1vbic7XG5pbXBvcnQgeyBEaWFnbm9zdGljUmVhc29uLCBmb3JtYXRBc3NlcnRpb25SZXN1bHRzLCBmb3JtYXRFcnJvciB9IGZyb20gJy4uL2NvbW1vbic7XG5pbXBvcnQgdHlwZSB7IEludGVnVGVzdEJhdGNoUmVxdWVzdCB9IGZyb20gJy4uL2ludGVnLXRlc3Qtd29ya2VyJztcbmltcG9ydCB0eXBlIHsgSW50ZWdXYXRjaE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlZy13YXRjaC13b3JrZXInO1xuXG4vKipcbiAqIFJ1bnMgYSBzaW5nbGUgaW50ZWdyYXRpb24gdGVzdCBiYXRjaCByZXF1ZXN0LlxuICogSWYgdGhlIHRlc3QgZG9lcyBub3QgaGF2ZSBhbiBleGlzdGluZyBzbmFwc2hvdCxcbiAqIHRoaXMgd2lsbCBmaXJzdCBnZW5lcmF0ZSBhIHNuYXBzaG90IGFuZCB0aGVuIGV4ZWN1dGVcbiAqIHRoZSBpbnRlZ3JhdGlvbiB0ZXN0cy5cbiAqXG4gKiBJZiB0aGUgdGVzdHMgc3VjY2VlZCBpdCB3aWxsIHRoZW4gc2F2ZSB0aGUgc25hcHNob3RcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGludGVnVGVzdFdvcmtlcihyZXF1ZXN0OiBJbnRlZ1Rlc3RCYXRjaFJlcXVlc3QpOiBQcm9taXNlPEludGVnVGVzdFdvcmtlckNvbmZpZ1tdPiB7XG4gIGNvbnN0IGZhaWx1cmVzOiBJbnRlZ1Rlc3RJbmZvW10gPSBbXTtcbiAgY29uc3QgdmVyYm9zaXR5ID0gcmVxdWVzdC52ZXJib3NpdHkgPz8gMDtcblxuICBmb3IgKGNvbnN0IHRlc3RJbmZvIG9mIHJlcXVlc3QudGVzdHMpIHtcbiAgICBjb25zdCB0ZXN0ID0gSW50ZWdUZXN0Lmh5ZHJhdGUoe1xuICAgICAgLi4udGVzdEluZm8sXG4gICAgICB3YXRjaDogcmVxdWVzdC53YXRjaCxcbiAgICB9KTsgLy8gSHlkcmF0ZSBmcm9tIGRhdGFcblxuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBydW5uZXIgPSBuZXcgSW50ZWdUZXN0UnVubmVyKHtcbiAgICAgICAgdGVzdCxcbiAgICAgICAgcHJvZmlsZTogcmVxdWVzdC5wcm9maWxlLFxuICAgICAgICByZWdpb246IHJlcXVlc3QucmVnaW9uLFxuICAgICAgICBwcm94eTogcmVxdWVzdC5wcm94eSxcbiAgICAgICAgY2FCdW5kbGVQYXRoOiByZXF1ZXN0LmNhQnVuZGxlUGF0aCxcbiAgICAgICAgZW52OiB7XG4gICAgICAgICAgQ0RLX0RPQ0tFUjogcHJvY2Vzcy5lbnYuQ0RLX0RPQ0tFUiA/PyAnZG9ja2VyJyxcbiAgICAgICAgfSxcbiAgICAgICAgc2hvd091dHB1dDogdmVyYm9zaXR5ID49IDIsXG4gICAgICAgIFRFU1RJTkdfdXNpbmdNb2NrczogcmVxdWVzdC50ZXN0aW5nVXNpbmdNb2Nrc0xlYXZlRGlyZWN0b3JpZXMsXG4gICAgICB9LCB0ZXN0SW5mby5kZXN0cnVjdGl2ZUNoYW5nZXMpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgcnVubmVyLnJ1bkludGVnVGVzdENhc2Uoe1xuICAgICAgICAgIGNsZWFuOiByZXF1ZXN0LmNsZWFuLFxuICAgICAgICAgIGRyeVJ1bjogcmVxdWVzdC5kcnlSdW4sXG4gICAgICAgICAgdXBkYXRlV29ya2Zsb3c6IHJlcXVlc3QudXBkYXRlV29ya2Zsb3csXG4gICAgICAgICAgdXBkYXRlRnJvbVRhZ3M6IHJlcXVlc3QudXBkYXRlRnJvbVRhZ3MsXG4gICAgICAgICAgdmVyYm9zaXR5LFxuICAgICAgICAgIHJvbGVBcm46IHJlcXVlc3Qucm9sZUFybixcbiAgICAgICAgICBhbGxvd0RlbGV0ZUZhaWx1cmVzOiByZXF1ZXN0LmFsbG93RGVsZXRlRmFpbHVyZXMsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0cyAmJiBPYmplY3QudmFsdWVzKHJlc3VsdHMpLnNvbWUocmVzdWx0ID0+IHJlc3VsdC5zdGF0dXMgPT09ICdmYWlsJykpIHtcbiAgICAgICAgICBmYWlsdXJlcy5wdXNoKHRlc3RJbmZvKTtcbiAgICAgICAgICB3b3JrZXJwb29sLndvcmtlckVtaXQoe1xuICAgICAgICAgICAgcmVhc29uOiBEaWFnbm9zdGljUmVhc29uLkFTU0VSVElPTl9GQUlMRUQsXG4gICAgICAgICAgICB0ZXN0TmFtZTogYCR7dGVzdC50ZXN0TmFtZX0gKCR7cmVxdWVzdC5wcm9maWxlfS8ke3JlcXVlc3QucmVnaW9ufSlgLFxuICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0QXNzZXJ0aW9uUmVzdWx0cyhyZXN1bHRzKSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiAoRGF0ZS5ub3coKSAtIHN0YXJ0KSAvIDEwMDAsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd29ya2VycG9vbC53b3JrZXJFbWl0KHtcbiAgICAgICAgICAgIHJlYXNvbjogRGlhZ25vc3RpY1JlYXNvbi5URVNUX1NVQ0NFU1MsXG4gICAgICAgICAgICB0ZXN0TmFtZTogYCR7dGVzdC50ZXN0TmFtZX1gLFxuICAgICAgICAgICAgbWVzc2FnZTogcmVzdWx0cyA/IGZvcm1hdEFzc2VydGlvblJlc3VsdHMocmVzdWx0cykgOiAnTk8gQVNTRVJUSU9OUycsXG4gICAgICAgICAgICBkdXJhdGlvbjogKERhdGUubm93KCkgLSBzdGFydCkgLyAxMDAwLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGZhaWx1cmVzLnB1c2godGVzdEluZm8pO1xuICAgICAgICB3b3JrZXJwb29sLndvcmtlckVtaXQoe1xuICAgICAgICAgIHJlYXNvbjogRGlhZ25vc3RpY1JlYXNvbi5URVNUX0ZBSUxFRCxcbiAgICAgICAgICB0ZXN0TmFtZTogYCR7dGVzdC50ZXN0TmFtZX0gKCR7cmVxdWVzdC5wcm9maWxlfS8ke3JlcXVlc3QucmVnaW9ufSlgLFxuICAgICAgICAgIG1lc3NhZ2U6IGBJbnRlZ3JhdGlvbiB0ZXN0IGZhaWxlZDogJHtmb3JtYXRFcnJvcihlKX1gLFxuICAgICAgICAgIGR1cmF0aW9uOiAoRGF0ZS5ub3coKSAtIHN0YXJ0KSAvIDEwMDAsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGZhaWx1cmVzLnB1c2godGVzdEluZm8pO1xuICAgICAgd29ya2VycG9vbC53b3JrZXJFbWl0KHtcbiAgICAgICAgcmVhc29uOiBEaWFnbm9zdGljUmVhc29uLlRFU1RfRVJST1IsXG4gICAgICAgIHRlc3ROYW1lOiBgJHt0ZXN0SW5mby5maWxlTmFtZX0gKCR7cmVxdWVzdC5wcm9maWxlfS8ke3JlcXVlc3QucmVnaW9ufSlgLFxuICAgICAgICBtZXNzYWdlOiBgRXJyb3IgZHVyaW5nIGludGVncmF0aW9uIHRlc3Q6ICR7Zm9ybWF0RXJyb3IoZSl9YCxcbiAgICAgICAgZHVyYXRpb246IChEYXRlLm5vdygpIC0gc3RhcnQpIC8gMTAwMCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWlsdXJlcztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhdGNoVGVzdFdvcmtlcihvcHRpb25zOiBJbnRlZ1dhdGNoT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB2ZXJib3NpdHkgPSBvcHRpb25zLnZlcmJvc2l0eSA/PyAwO1xuICBjb25zdCB0ZXN0ID0gbmV3IEludGVnVGVzdChvcHRpb25zKTtcbiAgY29uc3QgcnVubmVyID0gbmV3IEludGVnVGVzdFJ1bm5lcih7XG4gICAgdGVzdCxcbiAgICBwcm9maWxlOiBvcHRpb25zLnByb2ZpbGUsXG4gICAgcmVnaW9uOiBvcHRpb25zLnJlZ2lvbixcbiAgICBwcm94eTogb3B0aW9ucy5wcm94eSxcbiAgICBjYUJ1bmRsZVBhdGg6IG9wdGlvbnMuY2FCdW5kbGVQYXRoLFxuICAgIGVudjoge1xuICAgICAgQ0RLX0RPQ0tFUjogcHJvY2Vzcy5lbnYuQ0RLX0RPQ0tFUiA/PyAnZG9ja2VyJyxcbiAgICB9LFxuICAgIHNob3dPdXRwdXQ6IHZlcmJvc2l0eSA+PSAyLFxuICB9KTtcblxuICBhd2FpdCBydW5uZXIud2F0Y2hJbnRlZ1Rlc3Qoe1xuICAgIHZlcmJvc2l0eSxcbiAgICByb2xlQXJuOiBvcHRpb25zLnJvbGVBcm4sXG4gIH0pO1xufVxuXG4vKipcbiAqIFJ1bnMgYSBzaW5nbGUgc25hcHNob3QgdGVzdCBiYXRjaCByZXF1ZXN0LlxuICogRm9yIGVhY2ggaW50ZWdyYXRpb24gdGVzdCB0aGlzIHdpbGwgY2hlY2sgdG8gc2VlXG4gKiBpZiB0aGVyZSBpcyBhbiBleGlzdGluZyBzbmFwc2hvdCwgYW5kIGlmIHRoZXJlIGlzIHdpbGxcbiAqIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgY2hhbmdlc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc25hcHNob3RUZXN0V29ya2VyKHRlc3RJbmZvOiBJbnRlZ1Rlc3RJbmZvLCBvcHRpb25zOiBTbmFwc2hvdFZlcmlmaWNhdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8SW50ZWdUZXN0V29ya2VyQ29uZmlnW10+IHtcbiAgY29uc3QgZmFpbGVkVGVzdHMgPSBuZXcgQXJyYXk8SW50ZWdUZXN0V29ya2VyQ29uZmlnPigpO1xuICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gIGNvbnN0IHRlc3QgPSBuZXcgSW50ZWdUZXN0KHRlc3RJbmZvKTsgLy8gSHlkcmF0ZSB0aGUgZGF0YSByZWNvcmQgYWdhaW5cblxuICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIHdvcmtlcnBvb2wud29ya2VyRW1pdCh7XG4gICAgICByZWFzb246IERpYWdub3N0aWNSZWFzb24uVEVTVF9XQVJOSU5HLFxuICAgICAgdGVzdE5hbWU6IHRlc3QudGVzdE5hbWUsXG4gICAgICBtZXNzYWdlOiAnVGVzdCBpcyB0YWtpbmcgYSB2ZXJ5IGxvbmcgdGltZScsXG4gICAgICBkdXJhdGlvbjogKERhdGUubm93KCkgLSBzdGFydCkgLyAxMDAwLFxuICAgIH0pO1xuICB9LCA2MF8wMDApO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcnVubmVyID0gbmV3IEludGVnU25hcHNob3RSdW5uZXIoe1xuICAgICAgdGVzdCxcbiAgICAgIHNob3dPdXRwdXQ6IG9wdGlvbnMudmVyYm9zZSA/PyBmYWxzZSxcbiAgICAgIFRFU1RJTkdfdXNpbmdNb2Nrczogb3B0aW9ucy50ZXN0aW5nVXNpbmdNb2Nrc0xlYXZlRGlyZWN0b3JpZXMsXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW5uZXIudGVzdFNuYXBzaG90KG9wdGlvbnMpO1xuICAgIHN3aXRjaCAocmVzdWx0LnR5cGUpIHtcbiAgICAgIGNhc2UgJ25vLXNoYXBzaG90JzpcbiAgICAgICAgd29ya2VycG9vbC53b3JrZXJFbWl0KHtcbiAgICAgICAgICByZWFzb246IERpYWdub3N0aWNSZWFzb24uTk9fU05BUFNIT1QsXG4gICAgICAgICAgdGVzdE5hbWU6IHRlc3QudGVzdE5hbWUsXG4gICAgICAgICAgbWVzc2FnZTogJ05vIFNuYXBzaG90JyxcbiAgICAgICAgICBkdXJhdGlvbjogKERhdGUubm93KCkgLSBzdGFydCkgLyAxMDAwLFxuICAgICAgICB9KTtcbiAgICAgICAgZmFpbGVkVGVzdHMucHVzaCh0ZXN0LmluZm8pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZGlkLWNvbXBhcmUnOlxuICAgICAgICBpZiAocmVzdWx0LmRpYWdub3N0aWNzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXN1bHQuZGlhZ25vc3RpY3MuZm9yRWFjaChkaWFnbm9zdGljID0+IHdvcmtlcnBvb2wud29ya2VyRW1pdCh7XG4gICAgICAgICAgICAuLi5kaWFnbm9zdGljLFxuICAgICAgICAgICAgZHVyYXRpb246IChEYXRlLm5vdygpIC0gc3RhcnQpIC8gMTAwMCxcbiAgICAgICAgICB9IGFzIERpYWdub3N0aWMpKTtcbiAgICAgICAgICBmYWlsZWRUZXN0cy5wdXNoKHtcbiAgICAgICAgICAgIC4uLnRlc3QuaW5mbyxcbiAgICAgICAgICAgIGRlc3RydWN0aXZlQ2hhbmdlczogcmVzdWx0LmRlc3RydWN0aXZlQ2hhbmdlcyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3b3JrZXJwb29sLndvcmtlckVtaXQoe1xuICAgICAgICAgICAgcmVhc29uOiBEaWFnbm9zdGljUmVhc29uLlNOQVBTSE9UX1NVQ0NFU1MsXG4gICAgICAgICAgICB0ZXN0TmFtZTogdGVzdC50ZXN0TmFtZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdTdWNjZXNzJyxcbiAgICAgICAgICAgIGR1cmF0aW9uOiAoRGF0ZS5ub3coKSAtIHN0YXJ0KSAvIDEwMDAsXG4gICAgICAgICAgfSBhcyBEaWFnbm9zdGljKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIGZhaWxlZFRlc3RzLnB1c2godGVzdC5pbmZvKTtcbiAgICB3b3JrZXJwb29sLndvcmtlckVtaXQoe1xuICAgICAgbWVzc2FnZTogZm9ybWF0RXJyb3IoZSksXG4gICAgICB0ZXN0TmFtZTogdGVzdC50ZXN0TmFtZSxcbiAgICAgIHJlYXNvbjogRGlhZ25vc3RpY1JlYXNvbi5TTkFQU0hPVF9FUlJPUixcbiAgICAgIGR1cmF0aW9uOiAoRGF0ZS5ub3coKSAtIHN0YXJ0KSAvIDEwMDAsXG4gICAgfSBhcyBEaWFnbm9zdGljKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICB9XG5cbiAgcmV0dXJuIGZhaWxlZFRlc3RzO1xufVxuXG53b3JrZXJwb29sLndvcmtlcih7XG4gIHNuYXBzaG90VGVzdFdvcmtlcixcbiAgaW50ZWdUZXN0V29ya2VyLFxuICB3YXRjaFRlc3RXb3JrZXIsXG59KTtcbiJdfQ==