@aws-cdk/integ-runner 2.200.0 → 2.200.2

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.
@@ -0,0 +1,451 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_SYNTH_OPTIONS = exports.CdkIntegHelper = void 0;
4
+ exports.currentlyRecommendedAwsCdkLibFlags = currentlyRecommendedAwsCdkLibFlags;
5
+ /* eslint-disable @cdklabs/no-literal-partition */
6
+ const path = require("path");
7
+ const cloud_assembly_api_1 = require("@aws-cdk/cloud-assembly-api");
8
+ const fs = require("fs-extra");
9
+ const integ_test_suite_1 = require("./integ-test-suite");
10
+ const recommendedFlagsFile = require("../recommended-feature-flags.json");
11
+ const utils_1 = require("../utils");
12
+ const engine_1 = require("./engine");
13
+ const logger = require("../logger");
14
+ const cloud_assembly_1 = require("./private/cloud-assembly");
15
+ const integ_manifest_1 = require("./private/integ-manifest");
16
+ const DESTRUCTIVE_CHANGES = '!!DESTRUCTIVE_CHANGES:';
17
+ /**
18
+ * Class with some helper routines for running CDK snapshots and integration tests.
19
+ *
20
+ * A "golden snapshot" is the snapshot that is stored permanently in version
21
+ * control, that new runs are compared against (stored in a directory named
22
+ * `<test-name>.snapshot`).
23
+ *
24
+ * This is as opposed to other snapshots, which can be generated for example
25
+ * temporarily in a temporary directory, to compare agains the golden snapshot.
26
+ */
27
+ class CdkIntegHelper {
28
+ /**
29
+ * Factory method to create an instance of the CdkIntegHelper.
30
+ *
31
+ * Hiding the constructor to prevent inheritance.
32
+ */
33
+ static create(options) {
34
+ return new CdkIntegHelper(options);
35
+ }
36
+ /**
37
+ * The directory where the golden snapshot will be stored
38
+ */
39
+ goldenSnapshotDir;
40
+ /**
41
+ * An instance of the CDK CLI
42
+ */
43
+ cdk;
44
+ /**
45
+ * Pretty name of the test
46
+ */
47
+ testName;
48
+ /**
49
+ * The value used in the '--app' CLI parameter
50
+ *
51
+ * Path to the integ test source file, relative to `this.directory`.
52
+ */
53
+ cdkApp;
54
+ /**
55
+ * The path where the `cdk.context.json` file
56
+ * will be created
57
+ */
58
+ cdkContextPath;
59
+ /**
60
+ * The working directory that the integration tests will be
61
+ * executed from
62
+ */
63
+ directory;
64
+ /**
65
+ * The test to run
66
+ */
67
+ test;
68
+ /**
69
+ * Default options to pass to the CDK CLI
70
+ */
71
+ defaultArgs = {
72
+ pathMetadata: false,
73
+ assetMetadata: false,
74
+ versionReporting: false,
75
+ };
76
+ /**
77
+ * The directory where the CDK will be synthed to
78
+ *
79
+ * Relative to cwd.
80
+ */
81
+ cdkOutDir;
82
+ /**
83
+ * The profile to use for the CDK CLI calls
84
+ */
85
+ profile;
86
+ /**
87
+ * Show output from the integ test run.
88
+ */
89
+ showOutput;
90
+ _destructiveChanges;
91
+ legacyContext;
92
+ _expectedTestSuite;
93
+ _actualSnapshot;
94
+ _legacyEnableLookups;
95
+ /**
96
+ * Private constructor to prevent inheritance.
97
+ */
98
+ constructor(options) {
99
+ this.test = options.test;
100
+ this.directory = this.test.directory;
101
+ this.testName = this.test.testName;
102
+ this.goldenSnapshotDir = this.test.snapshotDir;
103
+ this.cdkContextPath = path.join(this.directory, 'cdk.context.json');
104
+ this.profile = options.profile;
105
+ this.showOutput = options.showOutput ?? false;
106
+ this.cdk = options.cdk ?? (0, engine_1.makeEngine)(options);
107
+ this.cdkOutDir = options.integOutDir ?? this.test.temporaryOutputDir;
108
+ const testRunCommand = this.test.appCommand;
109
+ this.cdkApp = testRunCommand.replace('{filePath}', path.relative(this.directory, this.test.fileName));
110
+ }
111
+ /**
112
+ * Configure the legacy enableLookups value to use when generating the actual snapshot.
113
+ *
114
+ * Must be set before using snapshot methods.
115
+ */
116
+ configureLegacyEnableLookups(enableLookups) {
117
+ this._legacyEnableLookups = enableLookups;
118
+ }
119
+ /**
120
+ * Return the list of actual (i.e. new) test cases for this integration test
121
+ */
122
+ async actualTests() {
123
+ return (await this.actualTestSuite()).testSuite;
124
+ }
125
+ /**
126
+ * Generate a new "actual" snapshot which will be compared to the
127
+ * existing "expected" snapshot
128
+ * This will synth and then load the integration test manifest
129
+ */
130
+ async generateActualSnapshot() {
131
+ await this.synthActualSnapshot(this.cdkOutDir);
132
+ const manifest = await this.loadManifest(this.cdkOutDir);
133
+ return {
134
+ testDefinition: manifest,
135
+ snapshotDirectory: this.cdkOutDir,
136
+ };
137
+ }
138
+ /**
139
+ * Synth the actual application to the given directory, for purposes of generating/validating a snapshot
140
+ *
141
+ * `legacyEnableLookups` is to preserve historical behavior for a while:
142
+ * traditionally, the application would only be seeded with context if
143
+ * `enableLookups` was true, and this information would come from the test
144
+ * definition.
145
+ *
146
+ * - Since the test definition comes from inside the app, this requires a
147
+ * synth just to get the test definition, and then another synth to generate
148
+ * the actual snapshot with the correct context, which is time consuming.
149
+ * - Given that the context is fixed and fake, it could always have been passed.
150
+ *
151
+ * However, the snapshot contents themselves depend on the context flag, and changing
152
+ * this behavior now invalidates all snapshots everywhere, which is annoying for upgrading.
153
+ *
154
+ * So we will use the behavior from the GOLDEN SNAPSHOT's test definition to
155
+ * determine whether to pass the context, and if the new actual snapshot has a
156
+ * different value for `enableLookups`, we will throw away the old snapshot and synth again.
157
+ */
158
+ async synthActualSnapshot(outputDirectory) {
159
+ if (this._legacyEnableLookups === undefined) {
160
+ throw new Error('Must call configureLegacyEnableLookups before generating snapshots');
161
+ }
162
+ await this.cdk.synth({
163
+ app: this.cdkApp,
164
+ context: this.getContext(this._legacyEnableLookups !== false ? exports.DEFAULT_SYNTH_OPTIONS.context : {}),
165
+ env: exports.DEFAULT_SYNTH_OPTIONS.env,
166
+ output: path.relative(this.directory, outputDirectory),
167
+ });
168
+ }
169
+ actualSynthReproCommand() {
170
+ // Show the command necessary to repro this
171
+ const envSet = Object.entries(exports.DEFAULT_SYNTH_OPTIONS.env).map(([k, v]) => `${k}='${v}'`);
172
+ const envCmd = envSet.length > 0 ? ['env', ...envSet] : [];
173
+ return [
174
+ ...envCmd,
175
+ 'cdk',
176
+ 'synth',
177
+ '-a',
178
+ `'${this.cdkApp}'`,
179
+ '-o',
180
+ `'${this.cdkOutDir}'`,
181
+ ...Object.entries(this.getContext(exports.DEFAULT_SYNTH_OPTIONS.context)).flatMap(([k, v]) => typeof v !== 'object' ? [`-c '${k}=${v}'`] : []),
182
+ ];
183
+ }
184
+ /**
185
+ * Returns true if a snapshot already exists for this test
186
+ */
187
+ hasSnapshot() {
188
+ return fs.existsSync(this.goldenSnapshotDir);
189
+ }
190
+ /**
191
+ * The test suite from the existing snapshot
192
+ */
193
+ async expectedTestSuite() {
194
+ if (!this._expectedTestSuite && this.hasSnapshot()) {
195
+ this._expectedTestSuite = await this.loadManifest();
196
+ }
197
+ return this._expectedTestSuite;
198
+ }
199
+ async actualSnapshot() {
200
+ if (!this._actualSnapshot) {
201
+ this._actualSnapshot = await this.generateActualSnapshot();
202
+ // Check if the enableLookups value has changed between the golden
203
+ // snapshot and the actual snapshot. If it has, we need to re-synth the
204
+ // actual snapshot with the new enableLookups value.
205
+ //
206
+ // See `synthActualSnapshot` for a description of why this is necessary.
207
+ const actualEnableLookups = this._actualSnapshot.testDefinition.enableLookups ?? false;
208
+ if (actualEnableLookups !== this._legacyEnableLookups && this._legacyEnableLookups !== 'dont-care') {
209
+ this.configureLegacyEnableLookups(actualEnableLookups);
210
+ this._actualSnapshot = await this.generateActualSnapshot();
211
+ }
212
+ }
213
+ return this._actualSnapshot;
214
+ }
215
+ /**
216
+ * The test suite from the new "actual" snapshot
217
+ */
218
+ async actualTestSuite() {
219
+ return (await this.actualSnapshot()).testDefinition;
220
+ }
221
+ /**
222
+ * Load the integ manifest which contains information
223
+ * on how to execute the tests
224
+ * First we try and load the manifest from the integ manifest (i.e. integ.json)
225
+ * from the cloud assembly. If it doesn't exist, then we fallback to the
226
+ * "legacy mode" and create a manifest from pragma
227
+ */
228
+ async loadManifest(dir) {
229
+ const manifest = dir ?? this.goldenSnapshotDir;
230
+ try {
231
+ const testSuite = integ_test_suite_1.IntegTestSuite.fromPath(manifest);
232
+ return testSuite;
233
+ }
234
+ catch (modernError) {
235
+ // Only attempt legacy test case if the integ test manifest was not found
236
+ // For any other errors, e.g. when parsing the manifest fails, we abort.
237
+ if (!(modernError instanceof integ_manifest_1.NoManifestError)) {
238
+ throw modernError;
239
+ }
240
+ if (this.showOutput) {
241
+ logger.trace("Failed to load integ test manifest for '%s'. Attempting as deprecated legacy test instead. Error was: %s", manifest, modernError.message ?? String(modernError));
242
+ }
243
+ const testCases = await integ_test_suite_1.LegacyIntegTestSuite.fromLegacy({
244
+ cdk: this.cdk,
245
+ testName: this.test.normalizedTestName,
246
+ integSourceFilePath: this.test.fileName,
247
+ listOptions: {
248
+ ...this.defaultArgs,
249
+ all: true,
250
+ app: this.cdkApp,
251
+ profile: this.profile,
252
+ output: path.relative(this.directory, this.cdkOutDir),
253
+ },
254
+ });
255
+ this.legacyContext = integ_test_suite_1.LegacyIntegTestSuite.getPragmaContext(this.test.fileName);
256
+ return testCases;
257
+ }
258
+ }
259
+ cleanup() {
260
+ const cdkOutPath = this.cdkOutDir;
261
+ if (fs.existsSync(cdkOutPath)) {
262
+ fs.removeSync(cdkOutPath);
263
+ }
264
+ // Clear cache
265
+ this._actualSnapshot = undefined;
266
+ }
267
+ /**
268
+ * If there are any destructive changes to a stack then this will record
269
+ * those in the manifest.json file
270
+ */
271
+ renderTraceData() {
272
+ const traceData = new Map();
273
+ const destructiveChanges = this._destructiveChanges ?? [];
274
+ destructiveChanges.forEach(change => {
275
+ const trace = traceData.get(change.stackName);
276
+ if (trace) {
277
+ trace.set(change.logicalId, `${DESTRUCTIVE_CHANGES} ${change.impact}`);
278
+ }
279
+ else {
280
+ traceData.set(change.stackName, new Map([
281
+ [change.logicalId, `${DESTRUCTIVE_CHANGES} ${change.impact}`],
282
+ ]));
283
+ }
284
+ });
285
+ return traceData;
286
+ }
287
+ /**
288
+ * In cases where we do not want to retain the assets,
289
+ * for example, if the assets are very large.
290
+ *
291
+ * Since it is possible to disable the update workflow for individual test
292
+ * cases, this needs to first get a list of stacks that have the update workflow
293
+ * disabled and then delete assets that relate to that stack. It does that
294
+ * by reading the asset manifest for the stack and deleting the asset source
295
+ */
296
+ async removeAssetsFromSnapshot() {
297
+ const stacks = (await this.actualTestSuite()).getStacksWithoutUpdateWorkflow() ?? [];
298
+ const manifest = cloud_assembly_1.AssemblyManifestReader.fromPath(this.goldenSnapshotDir);
299
+ const assets = (0, utils_1.flatten)(stacks.map(stack => {
300
+ return manifest.getAssetLocationsForStack(stack) ?? [];
301
+ }));
302
+ assets.forEach(asset => {
303
+ const fileName = path.join(this.goldenSnapshotDir, asset);
304
+ if (fs.existsSync(fileName)) {
305
+ if (fs.lstatSync(fileName).isDirectory()) {
306
+ fs.removeSync(fileName);
307
+ }
308
+ else {
309
+ fs.unlinkSync(fileName);
310
+ }
311
+ }
312
+ });
313
+ }
314
+ /**
315
+ * Remove the asset cache (.cache/) files from the snapshot.
316
+ * These are a cache of the asset zips, but we are fine with
317
+ * re-zipping on deploy
318
+ */
319
+ removeAssetsCacheFromSnapshot() {
320
+ const files = fs.readdirSync(this.goldenSnapshotDir);
321
+ files.forEach(file => {
322
+ const fileName = path.join(this.goldenSnapshotDir, file);
323
+ if (fs.lstatSync(fileName).isDirectory() && file === '.cache') {
324
+ fs.emptyDirSync(fileName);
325
+ fs.rmdirSync(fileName);
326
+ }
327
+ });
328
+ }
329
+ /**
330
+ * Create the new snapshot.
331
+ *
332
+ * If lookups are enabled, then we need create the snapshot by synth'ing again
333
+ * with the dummy context so that each time the test is run on different machines
334
+ * (and with different context/env) the diff will not change.
335
+ *
336
+ * If lookups are disabled (which means the stack is env agnostic) then just copy
337
+ * the assembly that was output by the deployment
338
+ */
339
+ async createSnapshot() {
340
+ if (fs.existsSync(this.goldenSnapshotDir)) {
341
+ fs.removeSync(this.goldenSnapshotDir);
342
+ }
343
+ // TODO: If we're clever, we should be able to reuse the snapshot that was
344
+ // generated during the test invalidation check and avoid the below synth.
345
+ // But that gets run in a completely different lifecycle and it might not
346
+ // exist. We're not dealing with that just yet.
347
+ await this.synthActualSnapshot(this.goldenSnapshotDir);
348
+ await this.cleanupGoldenSnapshot();
349
+ }
350
+ /**
351
+ * Perform some cleanup steps after the snapshot is created
352
+ * Anytime the snapshot needs to be modified after creation
353
+ * the logic should live here.
354
+ */
355
+ async cleanupGoldenSnapshot() {
356
+ if (fs.existsSync(this.goldenSnapshotDir)) {
357
+ await this.removeAssetsFromSnapshot();
358
+ this.removeAssetsCacheFromSnapshot();
359
+ const assembly = cloud_assembly_1.AssemblyManifestReader.fromPath(this.goldenSnapshotDir);
360
+ assembly.cleanManifest();
361
+ assembly.recordTrace(this.renderTraceData());
362
+ }
363
+ // if this is a legacy test then create an integ manifest
364
+ // in the snapshot directory which can be used for the
365
+ // update workflow. Save any legacyContext as well so that it can be read
366
+ // the next time
367
+ const actualTestSuite = await this.actualTestSuite();
368
+ if (actualTestSuite.type === 'legacy-test-suite') {
369
+ actualTestSuite.saveManifest(this.goldenSnapshotDir, this.legacyContext);
370
+ }
371
+ }
372
+ getContext(additionalContext) {
373
+ return {
374
+ ...currentlyRecommendedAwsCdkLibFlags(),
375
+ ...this.legacyContext,
376
+ ...additionalContext,
377
+ // Don't record creation stack traces in the snapshot, since they just take up space and are never deterministic.
378
+ 'aws:cdk:disable-creation-stack-traces': true,
379
+ // We originally had PLANNED to set this to ['aws', 'aws-cn'], but due to a programming mistake
380
+ // it was set to everything. In this PR, set it to everything to not mess up all the snapshots.
381
+ '@aws-cdk/core:target-partitions': undefined,
382
+ /* ---------------- THE FUTURE LIVES BELOW----------------------------
383
+ // Restricting to these target partitions makes most service principals synthesize to
384
+ // `service.${URL_SUFFIX}`, which is technically *incorrect* (it's only `amazonaws.com`
385
+ // or `amazonaws.com.cn`, never UrlSuffix for any of the restricted regions) but it's what
386
+ // most existing integ tests contain, and we want to disturb as few as possible.
387
+ // [TARGET_PARTITIONS]: ['aws', 'aws-cn'],
388
+ /* ---------------- END OF THE FUTURE ------------------------------- */
389
+ };
390
+ }
391
+ }
392
+ exports.CdkIntegHelper = CdkIntegHelper;
393
+ // Default context we run all integ tests with, so they don't depend on the
394
+ // account of the exercising user.
395
+ exports.DEFAULT_SYNTH_OPTIONS = {
396
+ context: {
397
+ [cloud_assembly_api_1.AVAILABILITY_ZONE_FALLBACK_CONTEXT_KEY]: ['test-region-1a', 'test-region-1b', 'test-region-1c'],
398
+ 'availability-zones:account=12345678:region=test-region': ['test-region-1a', 'test-region-1b', 'test-region-1c'],
399
+ 'ssm:account=12345678:parameterName=/aws/service/ami-amazon-linux-latest/amzn-ami-hvm-x86_64-gp2:region=test-region': 'ami-1234',
400
+ 'ssm:account=12345678:parameterName=/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2:region=test-region': 'ami-1234',
401
+ 'ssm:account=12345678:parameterName=/aws/service/ecs/optimized-ami/amazon-linux/recommended:region=test-region': '{"image_id": "ami-1234"}',
402
+ // eslint-disable-next-line @stylistic/max-len
403
+ 'ami:account=12345678:filters.image-type.0=machine:filters.name.0=amzn-ami-vpc-nat-*:filters.state.0=available:owners.0=amazon:region=test-region': 'ami-1234',
404
+ 'vpc-provider:account=12345678:filter.isDefault=true:region=test-region:returnAsymmetricSubnets=true': {
405
+ vpcId: 'vpc-60900905',
406
+ subnetGroups: [
407
+ {
408
+ type: 'Public',
409
+ name: 'Public',
410
+ subnets: [
411
+ {
412
+ subnetId: 'subnet-e19455ca',
413
+ availabilityZone: 'us-east-1a',
414
+ routeTableId: 'rtb-e19455ca',
415
+ },
416
+ {
417
+ subnetId: 'subnet-e0c24797',
418
+ availabilityZone: 'us-east-1b',
419
+ routeTableId: 'rtb-e0c24797',
420
+ },
421
+ {
422
+ subnetId: 'subnet-ccd77395',
423
+ availabilityZone: 'us-east-1c',
424
+ routeTableId: 'rtb-ccd77395',
425
+ },
426
+ ],
427
+ },
428
+ ],
429
+ },
430
+ },
431
+ env: {
432
+ CDK_INTEG_ACCOUNT: '12345678',
433
+ CDK_INTEG_REGION: 'test-region',
434
+ CDK_INTEG_HOSTED_ZONE_ID: 'Z23ABC4XYZL05B',
435
+ CDK_INTEG_HOSTED_ZONE_NAME: 'example.com',
436
+ CDK_INTEG_DOMAIN_NAME: '*.example.com',
437
+ CDK_INTEG_CERT_ARN: 'arn:aws:acm:test-region:12345678:certificate/86468209-a272-595d-b831-0efb6421265z',
438
+ CDK_INTEG_SUBNET_ID: 'subnet-0dff1a399d8f6f92c',
439
+ },
440
+ };
441
+ /**
442
+ * Return the currently recommended flags for `aws-cdk-lib`.
443
+ *
444
+ * These have been built into the CLI at build time. If this ever gets changed
445
+ * back to a dynamic load, remember that this source file may be bundled into
446
+ * a JavaScript bundle, and `__dirname` might not point where you think it does.
447
+ */
448
+ function currentlyRecommendedAwsCdkLibFlags() {
449
+ return recommendedFlagsFile;
450
+ }
451
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWludGVnLWhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNkay1pbnRlZy1oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBNGpCQSxnRkFFQztBQTlqQkQsa0RBQWtEO0FBQ2xELDZCQUE2QjtBQUM3QixvRUFBcUY7QUFFckYsK0JBQStCO0FBQy9CLHlEQUEwRTtBQUUxRSwwRUFBMEU7QUFDMUUsb0NBQW1DO0FBQ25DLHFDQUFzQztBQUV0QyxvQ0FBb0M7QUFFcEMsNkRBQWtFO0FBRWxFLDZEQUEyRDtBQUUzRCxNQUFNLG1CQUFtQixHQUFHLHdCQUF3QixDQUFDO0FBOEVyRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFhLGNBQWM7SUFDekI7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBOEI7UUFDakQsT0FBTyxJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7O09BRUc7SUFDYSxpQkFBaUIsQ0FBUztJQUUxQzs7T0FFRztJQUNhLEdBQUcsQ0FBTztJQUUxQjs7T0FFRztJQUNhLFFBQVEsQ0FBUztJQUVqQzs7OztPQUlHO0lBQ2EsTUFBTSxDQUFTO0lBRS9COzs7T0FHRztJQUNhLGNBQWMsQ0FBUztJQUV2Qzs7O09BR0c7SUFDYSxTQUFTLENBQVM7SUFFbEM7O09BRUc7SUFDYyxJQUFJLENBQVk7SUFFakM7O09BRUc7SUFDYSxXQUFXLEdBQXNCO1FBQy9DLFlBQVksRUFBRSxLQUFLO1FBQ25CLGFBQWEsRUFBRSxLQUFLO1FBQ3BCLGdCQUFnQixFQUFFLEtBQUs7S0FDeEIsQ0FBQztJQUVGOzs7O09BSUc7SUFDYSxTQUFTLENBQVM7SUFFbEM7O09BRUc7SUFDYSxPQUFPLENBQVU7SUFFakM7O09BRUc7SUFDYyxVQUFVLENBQVU7SUFFOUIsbUJBQW1CLENBQXVCO0lBQ3pDLGFBQWEsQ0FBdUI7SUFDcEMsa0JBQWtCLENBQXlDO0lBQzNELGVBQWUsQ0FBNkI7SUFDNUMs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QUNGO0tBQ0Y7SUFDRCxHQUFHLEVBQUU7UUFDSCxpQkFBaUIsRUFBRSxVQUFVO1FBQzdCLGdCQUFnQixFQUFFLGFBQWE7UUFDL0Isd0JBQXdCLEVBQUUsZ0JBQWdCO1FBQzFDLDBCQUEwQixFQUFFLGFBQWE7UUFDekMscUJBQXFCLEVBQUUsZUFBZTtRQUN0QyxrQkFBa0IsRUFBRSxtRkFBbUY7UUFDdkcsbUJBQW1CLEVBQUUsMEJBQTBCO0tBQ2hEO0NBQ0YsQ0FBQztBQUVGOzs7Ozs7R0FNRztBQUNILFNBQWdCLGtDQUFrQztJQUNoRCxPQUFPLG9CQUFvQixDQUFDO0FBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAY2RrbGFicy9uby1saXRlcmFsLXBhcnRpdGlvbiAqL1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IEFWQUlMQUJJTElUWV9aT05FX0ZBTExCQUNLX0NPTlRFWFRfS0VZIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktYXBpJztcbmltcG9ydCB0eXBlIHsgVGVzdENhc2UsIERlZmF1bHRDZGtPcHRpb25zIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IEludGVnVGVzdFN1aXRlLCBMZWdhY3lJbnRlZ1Rlc3RTdWl0ZSB9IGZyb20gJy4vaW50ZWctdGVzdC1zdWl0ZSc7XG5pbXBvcnQgdHlwZSB7IEludGVnVGVzdCB9IGZyb20gJy4vaW50ZWdyYXRpb24tdGVzdHMnO1xuaW1wb3J0ICogYXMgcmVjb21tZW5kZWRGbGFnc0ZpbGUgZnJvbSAnLi4vcmVjb21tZW5kZWQtZmVhdHVyZS1mbGFncy5qc29uJztcbmltcG9ydCB7IGZsYXR0ZW4gfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBtYWtlRW5naW5lIH0gZnJvbSAnLi9lbmdpbmUnO1xuaW1wb3J0IHR5cGUgeyBJQ2RrIH0gZnJvbSAnLi4vZW5naW5lcy9jZGstaW50ZXJmYWNlJztcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHR5cGUgeyBNYW5pZmVzdFRyYWNlIH0gZnJvbSAnLi9wcml2YXRlL2Nsb3VkLWFzc2VtYmx5JztcbmltcG9ydCB7IEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIgfSBmcm9tICcuL3ByaXZhdGUvY2xvdWQtYXNzZW1ibHknO1xuaW1wb3J0IHR5cGUgeyBEZXN0cnVjdGl2ZUNoYW5nZSB9IGZyb20gJy4uL3dvcmtlcnMvY29tbW9uJztcbmltcG9ydCB7IE5vTWFuaWZlc3RFcnJvciB9IGZyb20gJy4vcHJpdmF0ZS9pbnRlZy1tYW5pZmVzdCc7XG5cbmNvbnN0IERFU1RSVUNUSVZFX0NIQU5HRVMgPSAnISFERVNUUlVDVElWRV9DSEFOR0VTOic7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY3JlYXRpbmcgYW4gaW50ZWcgaGVscGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2RrSW50ZWdIZWxwZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSB0ZXN0IHRvIHJ1blxuICAgKi9cbiAgcmVhZG9ubHkgdGVzdDogSW50ZWdUZXN0O1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uIHdoZXJlIHRoZSB0ZXN0IHNob3VsZCBiZSBkZXBsb3llZFxuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBV1MgcHJvZmlsZSB0byB1c2Ugd2hlbiBpbnZva2luZyB0aGUgQ0RLIENMSVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHByb2ZpbGUgaXMgcGFzc2VkLCB0aGUgZGVmYXVsdCBwcm9maWxlIGlzIHVzZWRcbiAgICovXG4gIHJlYWRvbmx5IHByb2ZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgd2lsbCBiZSBhdmFpbGFibGVcbiAgICogdG8gdGhlIENESyBDTElcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBhZGRpdGlvbmFsIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgKi9cbiAgcmVhZG9ubHkgZW52PzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIHRtcCBjZGsub3V0IGRpcmVjdG9yeVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRpcmVjdG9yeSB3aWxsIGJlIGBjZGstaW50ZWcub3V0LiR7dGVzdE5hbWV9YFxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZWdPdXREaXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluc3RhbmNlIG9mIHRoZSBDREsgVG9vbGtpdCBFbmdpbmUgdG8gdXNlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYmFzZWQgb24gYGVuZ2luZWAgb3B0aW9uXG4gICAqL1xuICByZWFkb25seSBjZGs/OiBJQ2RrO1xuXG4gIC8qKlxuICAgKiBTaG93IG91dHB1dCBmcm9tIHJ1bm5pbmcgaW50ZWdyYXRpb24gdGVzdHNcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHNob3dPdXRwdXQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBVc2UgdGhlIGluZGljYXRlZCBwcm94eVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHByb3h5XG4gICAqL1xuICByZWFkb25seSBwcm94eT86IHN0cmluZztcblxuICAvKipcbiAgICogUGF0aCB0byBDQSBjZXJ0aWZpY2F0ZSB0byB1c2Ugd2hlbiB2YWxpZGF0aW5nIEhUVFBTIHJlcXVlc3RzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gYWRkaXRpb25hbCBDQSBidW5kbGVcbiAgICovXG4gIHJlYWRvbmx5IGNhQnVuZGxlUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRvIHN5bnRoZXNpemUgdGhlIGFjdHVhbCBzbmFwc2hvdCB3aXRoIGxvb2t1cHMgZW5hYmxlZCBvciBub3QuXG4gKlxuICogSWYgZWl0aGVyIGB0cnVlYCBvciBgZmFsc2VgLCB3ZSBzZW5kIGNvbnRleHQgaW4gb3Igbm90IHdoaWxlIHN5bnRoZXNpemluZyxcbiAqIGFuZCBpZiB0aGUgZ2VuZXJhdGVkIHNuYXBzaG90IHRlc3QgZGVmaW5pdGlvbiByZXF1ZXN0cyBhIGRpZmZlcmVudCB2YWx1ZSB3ZVxuICogd2lsbCBzeW50aCBhZ2Fpbi5cbiAqXG4gKiBGb3IgYGRvbnQtY2FyZWAsIHdlIGRvIHNlbmQgaW4gdGhlIGNvbnRleHQgYnV0IHdlIG5ldmVyIHJlc3ludGguXG4gKi9cbmV4cG9ydCB0eXBlIExlZ2FjeUVuYWJsZUxvb2t1cHMgPSB0cnVlIHwgZmFsc2UgfCAnZG9udC1jYXJlJztcblxuLyoqXG4gKiBDbGFzcyB3aXRoIHNvbWUgaGVscGVyIHJvdXRpbmVzIGZvciBydW5uaW5nIENESyBzbmFwc2hvdHMgYW5kIGludGVncmF0aW9uIHRlc3RzLlxuICpcbiAqIEEgXCJnb2xkZW4gc25hcHNob3RcIiBpcyB0aGUgc25hcHNob3QgdGhhdCBpcyBzdG9yZWQgcGVybWFuZW50bHkgaW4gdmVyc2lvblxuICogY29udHJvbCwgdGhhdCBuZXcgcnVucyBhcmUgY29tcGFyZWQgYWdhaW5zdCAoc3RvcmVkIGluIGEgZGlyZWN0b3J5IG5hbWVkXG4gKiBgPHRlc3QtbmFtZT4uc25hcHNob3RgKS5cbiAqXG4gKiBUaGlzIGlzIGFzIG9wcG9zZWQgdG8gb3RoZXIgc25hcHNob3RzLCB3aGljaCBjYW4gYmUgZ2VuZXJhdGVkIGZvciBleGFtcGxlXG4gKiB0ZW1wb3JhcmlseSBpbiBhIHRlbXBvcmFyeSBkaXJlY3RvcnksIHRvIGNvbXBhcmUgYWdhaW5zIHRoZSBnb2xkZW4gc25hcHNob3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBDZGtJbnRlZ0hlbHBlciB7XG4gIC8qKlxuICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIENka0ludGVnSGVscGVyLlxuICAgKlxuICAgKiBIaWRpbmcgdGhlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgaW5oZXJpdGFuY2UuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNyZWF0ZShvcHRpb25zOiBDZGtJbnRlZ0hlbHBlck9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IENka0ludGVnSGVscGVyKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGdvbGRlbiBzbmFwc2hvdCB3aWxsIGJlIHN0b3JlZFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGdvbGRlblNuYXBzaG90RGlyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGluc3RhbmNlIG9mIHRoZSBDREsgIENMSVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNkazogSUNkaztcblxuICAvKipcbiAgICogUHJldHR5IG5hbWUgb2YgdGhlIHRlc3RcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0ZXN0TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgdXNlZCBpbiB0aGUgJy0tYXBwJyBDTEkgcGFyYW1ldGVyXG4gICAqXG4gICAqIFBhdGggdG8gdGhlIGludGVnIHRlc3Qgc291cmNlIGZpbGUsIHJlbGF0aXZlIHRvIGB0aGlzLmRpcmVjdG9yeWAuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2RrQXBwOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHdoZXJlIHRoZSBgY2RrLmNvbnRleHQuanNvbmAgZmlsZVxuICAgKiB3aWxsIGJlIGNyZWF0ZWRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjZGtDb250ZXh0UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgd29ya2luZyBkaXJlY3RvcnkgdGhhdCB0aGUgaW50ZWdyYXRpb24gdGVzdHMgd2lsbCBiZVxuICAgKiBleGVjdXRlZCBmcm9tXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGlyZWN0b3J5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXN0IHRvIHJ1blxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSB0ZXN0OiBJbnRlZ1Rlc3Q7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBDREsgQ0xJXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGVmYXVsdEFyZ3M6IERlZmF1bHRDZGtPcHRpb25zID0ge1xuICAgIHBhdGhNZXRhZGF0YTogZmFsc2UsXG4gICAgYXNzZXRNZXRhZGF0YTogZmFsc2UsXG4gICAgdmVyc2lvblJlcG9ydGluZzogZmFsc2UsXG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIENESyB3aWxsIGJlIHN5bnRoZWQgdG9cbiAgICpcbiAgICogUmVsYXRpdmUgdG8gY3dkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNka091dERpcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvZmlsZSB0byB1c2UgZm9yIHRoZSBDREsgQ0xJIGNhbGxzXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJvZmlsZT86IHN0cmluZztcblxuICAvKipcbiAgICogU2hvdyBvdXRwdXQgZnJvbSB0aGUgaW50ZWcgdGVzdCBydW4uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNob3dPdXRwdXQ6IGJvb2xlYW47XG5cbiAgcHVibGljIF9kZXN0cnVjdGl2ZUNoYW5nZXM/OiBEZXN0cnVjdGl2ZUNoYW5nZVtdO1xuICBwcml2YXRlIGxlZ2FjeUNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBwcml2YXRlIF9leHBlY3RlZFRlc3RTdWl0ZT86IEludGVnVGVzdFN1aXRlIHwgTGVnYWN5SW50ZWdUZXN0U3VpdGU7XG4gIHByaXZhdGUgX2FjdHVhbFNuYXBzaG90PzogU25hcHNob3RBbmRUZXN0RGVmaW5pdGlvbjtcbiAgcHJpdmF0ZSBfbGVnYWN5RW5hYmxlTG9va3Vwcz86IExlZ2FjeUVuYWJsZUxvb2t1cHM7XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCBpbmhlcml0YW5jZS5cbiAgICovXG4gIHByaXZhdGUgY29uc3RydWN0b3Iob3B0aW9uczogQ2RrSW50ZWdIZWxwZXJPcHRpb25zKSB7XG4gICAgdGhpcy50ZXN0ID0gb3B0aW9ucy50ZXN0O1xuICAgIHRoaXMuZGlyZWN0b3J5ID0gdGhpcy50ZXN0LmRpcmVjdG9yeTtcbiAgICB0aGlzLnRlc3ROYW1lID0gdGhpcy50ZXN0LnRlc3ROYW1lO1xuICAgIHRoaXMuZ29sZGVuU25hcHNob3REaXIgPSB0aGlzLnRlc3Quc25hcHNob3REaXI7XG4gICAgdGhpcy5jZGtDb250ZXh0UGF0aCA9IHBhdGguam9pbih0aGlzLmRpcmVjdG9yeSwgJ2Nkay5jb250ZXh0Lmpzb24nKTtcbiAgICB0aGlzLnByb2ZpbGUgPSBvcHRpb25zLnByb2ZpbGU7XG4gICAgdGhpcy5zaG93T3V0cHV0ID0gb3B0aW9ucy5zaG93T3V0cHV0ID8/IGZhbHNlO1xuXG4gICAgdGhpcy5jZGsgPSBvcHRpb25zLmNkayA/PyBtYWtlRW5naW5lKG9wdGlvbnMpO1xuICAgIHRoaXMuY2RrT3V0RGlyID0gb3B0aW9ucy5pbnRlZ091dERpciA/PyB0aGlzLnRlc3QudGVtcG9yYXJ5T3V0cHV0RGlyO1xuXG4gICAgY29uc3QgdGVzdFJ1bkNvbW1hbmQgPSB0aGlzLnRlc3QuYXBwQ29tbWFuZDtcbiAgICB0aGlzLmNka0FwcCA9IHRlc3RSdW5Db21tYW5kLnJlcGxhY2UoJ3tmaWxlUGF0aH0nLCBwYXRoLnJlbGF0aXZlKHRoaXMuZGlyZWN0b3J5LCB0aGlzLnRlc3QuZmlsZU5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgdGhlIGxlZ2FjeSBlbmFibGVMb29rdXBzIHZhbHVlIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgdGhlIGFjdHVhbCBzbmFwc2hvdC5cbiAgICpcbiAgICogTXVzdCBiZSBzZXQgYmVmb3JlIHVzaW5nIHNuYXBzaG90IG1ldGhvZHMuXG4gICAqL1xuICBwdWJsaWMgY29uZmlndXJlTGVnYWN5RW5hYmxlTG9va3VwcyhlbmFibGVMb29rdXBzOiBMZWdhY3lFbmFibGVMb29rdXBzKTogdm9pZCB7XG4gICAgdGhpcy5fbGVnYWN5RW5hYmxlTG9va3VwcyA9IGVuYWJsZUxvb2t1cHM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBsaXN0IG9mIGFjdHVhbCAoaS5lLiBuZXcpIHRlc3QgY2FzZXMgZm9yIHRoaXMgaW50ZWdyYXRpb24gdGVzdFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGFjdHVhbFRlc3RzKCk6IFByb21pc2U8eyBbdGVzdE5hbWU6IHN0cmluZ106IFRlc3RDYXNlIH0gfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuYWN0dWFsVGVzdFN1aXRlKCkpLnRlc3RTdWl0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIG5ldyBcImFjdHVhbFwiIHNuYXBzaG90IHdoaWNoIHdpbGwgYmUgY29tcGFyZWQgdG8gdGhlXG4gICAqIGV4aXN0aW5nIFwiZXhwZWN0ZWRcIiBzbmFwc2hvdFxuICAgKiBUaGlzIHdpbGwgc3ludGggYW5kIHRoZW4gbG9hZCB0aGUgaW50ZWdyYXRpb24gdGVzdCBtYW5pZmVzdFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUFjdHVhbFNuYXBzaG90KCk6IFByb21pc2U8U25hcHNob3RBbmRUZXN0RGVmaW5pdGlvbj4ge1xuICAgIGF3YWl0IHRoaXMuc3ludGhBY3R1YWxTbmFwc2hvdCh0aGlzLmNka091dERpcik7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBhd2FpdCB0aGlzLmxvYWRNYW5pZmVzdCh0aGlzLmNka091dERpcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRlc3REZWZpbml0aW9uOiBtYW5pZmVzdCxcbiAgICAgIHNuYXBzaG90RGlyZWN0b3J5OiB0aGlzLmNka091dERpcixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bnRoIHRoZSBhY3R1YWwgYXBwbGljYXRpb24gdG8gdGhlIGdpdmVuIGRpcmVjdG9yeSwgZm9yIHB1cnBvc2VzIG9mIGdlbmVyYXRpbmcvdmFsaWRhdGluZyBhIHNuYXBzaG90XG4gICAqXG4gICAqIGBsZWdhY3lFbmFibGVMb29rdXBzYCBpcyB0byBwcmVzZXJ2ZSBoaXN0b3JpY2FsIGJlaGF2aW9yIGZvciBhIHdoaWxlOlxuICAgKiB0cmFkaXRpb25hbGx5LCB0aGUgYXBwbGljYXRpb24gd291bGQgb25seSBiZSBzZWVkZWQgd2l0aCBjb250ZXh0IGlmXG4gICAqIGBlbmFibGVMb29rdXBzYCB3YXMgdHJ1ZSwgYW5kIHRoaXMgaW5mb3JtYXRpb24gd291bGQgY29tZSBmcm9tIHRoZSB0ZXN0XG4gICAqIGRlZmluaXRpb24uXG4gICAqXG4gICAqIC0gU2luY2UgdGhlIHRlc3QgZGVmaW5pdGlvbiBjb21lcyBmcm9tIGluc2lkZSB0aGUgYXBwLCB0aGlzIHJlcXVpcmVzIGFcbiAgICogICBzeW50aCBqdXN0IHRvIGdldCB0aGUgdGVzdCBkZWZpbml0aW9uLCBhbmQgdGhlbiBhbm90aGVyIHN5bnRoIHRvIGdlbmVyYXRlXG4gICAqICAgdGhlIGFjdHVhbCBzbmFwc2hvdCB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHQsIHdoaWNoIGlzIHRpbWUgY29uc3VtaW5nLlxuICAgKiAtIEdpdmVuIHRoYXQgdGhlIGNvbnRleHQgaXMgZml4ZWQgYW5kIGZha2UsIGl0IGNvdWxkIGFsd2F5cyBoYXZlIGJlZW4gcGFzc2VkLlxuICAgKlxuICAgKiBIb3dldmVyLCB0aGUgc25hcHNob3QgY29udGVudHMgdGhlbXNlbHZlcyBkZXBlbmQgb24gdGhlIGNvbnRleHQgZmxhZywgYW5kIGNoYW5naW5nXG4gICAqIHRoaXMgYmVoYXZpb3Igbm93IGludmFsaWRhdGVzIGFsbCBzbmFwc2hvdHMgZXZlcnl3aGVyZSwgd2hpY2ggaXMgYW5ub3lpbmcgZm9yIHVwZ3JhZGluZy5cbiAgICpcbiAgICogU28gd2Ugd2lsbCB1c2UgdGhlIGJlaGF2aW9yIGZyb20gdGhlIEdPTERFTiBTTkFQU0hPVCdzIHRlc3QgZGVmaW5pdGlvbiB0b1xuICAgKiBkZXRlcm1pbmUgd2hldGhlciB0byBwYXNzIHRoZSBjb250ZXh0LCBhbmQgaWYgdGhlIG5ldyBhY3R1YWwgc25hcHNob3QgaGFzIGFcbiAgICogZGlmZmVyZW50IHZhbHVlIGZvciBgZW5hYmxlTG9va3Vwc2AsIHdlIHdpbGwgdGhyb3cgYXdheSB0aGUgb2xkIHNuYXBzaG90IGFuZCBzeW50aCBhZ2Fpbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc3ludGhBY3R1YWxTbmFwc2hvdChvdXRwdXREaXJlY3Rvcnk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9sZWdhY3lFbmFibGVMb29rdXBzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBjYWxsIGNvbmZpZ3VyZUxlZ2FjeUVuYWJsZUxvb2t1cHMgYmVmb3JlIGdlbmVyYXRpbmcgc25hcHNob3RzJyk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5jZGsuc3ludGgoe1xuICAgICAgYXBwOiB0aGlzLmNka0FwcCxcbiAgICAgIGNvbnRleHQ6IHRoaXMuZ2V0Q29udGV4dCh0aGlzLl9sZWdhY3lFbmFibGVMb29rdXBzICE9PSBmYWxzZSA/IERFRkFVTFRfU1lOVEhfT1BUSU9OUy5jb250ZXh0IDoge30pLFxuICAgICAgZW52OiBERUZBVUxUX1NZTlRIX09QVElPTlMuZW52LFxuICAgICAgb3V0cHV0OiBwYXRoLnJlbGF0aXZlKHRoaXMuZGlyZWN0b3J5LCBvdXRwdXREaXJlY3RvcnkpLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFjdHVhbFN5bnRoUmVwcm9Db21tYW5kKCkge1xuICAgIC8vIFNob3cgdGhlIGNvbW1hbmQgbmVjZXNzYXJ5IHRvIHJlcHJvIHRoaXNcbiAgICBjb25zdCBlbnZTZXQgPSBPYmplY3QuZW50cmllcyhERUZBVUxUX1NZTlRIX09QVElPTlMuZW52KS5tYXAoKFtrLCB2XSkgPT4gYCR7a309JyR7dn0nYCk7XG4gICAgY29uc3QgZW52Q21kID0gZW52U2V0Lmxlbmd0aCA+IDAgPyBbJ2VudicsIC4uLmVudlNldF0gOiBbXTtcblxuICAgIHJldHVybiBbXG4gICAgICAuLi5lbnZDbWQsXG4gICAgICAnY2RrJyxcbiAgICAgICdzeW50aCcsXG4gICAgICAnLWEnLFxuICAgICAgYCcke3RoaXMuY2RrQXBwfSdgLFxuICAgICAgJy1vJyxcbiAgICAgIGAnJHt0aGlzLmNka091dERpcn0nYCxcbiAgICAgIC4uLk9iamVjdC5lbnRyaWVzKHRoaXMuZ2V0Q29udGV4dChERUZBVUxUX1NZTlRIX09QVElPTlMuY29udGV4dCkpLmZsYXRNYXAoKFtrLCB2XSkgPT4gdHlwZW9mIHYgIT09ICdvYmplY3QnID8gW2AtYyAnJHtrfT0ke3Z9J2BdIDogW10pLFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGEgc25hcHNob3QgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgdGVzdFxuICAgKi9cbiAgcHVibGljIGhhc1NuYXBzaG90KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHRoaXMuZ29sZGVuU25hcHNob3REaXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXN0IHN1aXRlIGZyb20gdGhlIGV4aXN0aW5nIHNuYXBzaG90XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZXhwZWN0ZWRUZXN0U3VpdGUoKTogUHJvbWlzZTxJbnRlZ1Rlc3RTdWl0ZSB8IExlZ2FjeUludGVnVGVzdFN1aXRlIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKCF0aGlzLl9leHBlY3RlZFRlc3RTdWl0ZSAmJiB0aGlzLmhhc1NuYXBzaG90KCkpIHtcbiAgICAgIHRoaXMuX2V4cGVjdGVkVGVzdFN1aXRlID0gYXdhaXQgdGhpcy5sb2FkTWFuaWZlc3QoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2V4cGVjdGVkVGVzdFN1aXRlO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFjdHVhbFNuYXBzaG90KCk6IFByb21pc2U8U25hcHNob3RBbmRUZXN0RGVmaW5pdGlvbj4ge1xuICAgIGlmICghdGhpcy5fYWN0dWFsU25hcHNob3QpIHtcbiAgICAgIHRoaXMuX2FjdHVhbFNuYXBzaG90ID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUFjdHVhbFNuYXBzaG90KCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBlbmFibGVMb29rdXBzIHZhbHVlIGhhcyBjaGFuZ2VkIGJldHdlZW4gdGhlIGdvbGRlblxuICAgICAgLy8gc25hcHNob3QgYW5kIHRoZSBhY3R1YWwgc25hcHNob3QuIElmIGl0IGhhcywgd2UgbmVlZCB0byByZS1zeW50aCB0aGVcbiAgICAgIC8vIGFjdHVhbCBzbmFwc2hvdCB3aXRoIHRoZSBuZXcgZW5hYmxlTG9va3VwcyB2YWx1ZS5cbiAgICAgIC8vXG4gICAgICAvLyBTZWUgYHN5bnRoQWN0dWFsU25hcHNob3RgIGZvciBhIGRlc2NyaXB0aW9uIG9mIHdoeSB0aGlzIGlzIG5lY2Vzc2FyeS5cbiAgICAgIGNvbnN0IGFjdHVhbEVuYWJsZUxvb2t1cHMgPSB0aGlzLl9hY3R1YWxTbmFwc2hvdC50ZXN0RGVmaW5pdGlvbi5lbmFibGVMb29rdXBzID8/IGZhbHNlO1xuICAgICAgaWYgKGFjdHVhbEVuYWJsZUxvb2t1cHMgIT09IHRoaXMuX2xlZ2FjeUVuYWJsZUxvb2t1cHMgJiYgdGhpcy5fbGVnYWN5RW5hYmxlTG9va3VwcyAhPT0gJ2RvbnQtY2FyZScpIHtcbiAgICAgICAgdGhpcy5jb25maWd1cmVMZWdhY3lFbmFibGVMb29rdXBzKGFjdHVhbEVuYWJsZUxvb2t1cHMpO1xuICAgICAgICB0aGlzLl9hY3R1YWxTbmFwc2hvdCA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVBY3R1YWxTbmFwc2hvdCgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYWN0dWFsU25hcHNob3Q7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRlc3Qgc3VpdGUgZnJvbSB0aGUgbmV3IFwiYWN0dWFsXCIgc25hcHNob3RcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYWN0dWFsVGVzdFN1aXRlKCk6IFByb21pc2U8SW50ZWdUZXN0U3VpdGUgfCBMZWdhY3lJbnRlZ1Rlc3RTdWl0ZT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5hY3R1YWxTbmFwc2hvdCgpKS50ZXN0RGVmaW5pdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIHRoZSBpbnRlZyBtYW5pZmVzdCB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvblxuICAgKiBvbiBob3cgdG8gZXhlY3V0ZSB0aGUgdGVzdHNcbiAgICogRmlyc3Qgd2UgdHJ5IGFuZCBsb2FkIHRoZSBtYW5pZmVzdCBmcm9tIHRoZSBpbnRlZyBtYW5pZmVzdCAoaS5lLiBpbnRlZy5qc29uKVxuICAgKiBmcm9tIHRoZSBjbG91ZCBhc3NlbWJseS4gSWYgaXQgZG9lc24ndCBleGlzdCwgdGhlbiB3ZSBmYWxsYmFjayB0byB0aGVcbiAgICogXCJsZWdhY3kgbW9kZVwiIGFuZCBjcmVhdGUgYSBtYW5pZmVzdCBmcm9tIHByYWdtYVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvYWRNYW5pZmVzdChkaXI/OiBzdHJpbmcpOiBQcm9taXNlPEludGVnVGVzdFN1aXRlIHwgTGVnYWN5SW50ZWdUZXN0U3VpdGU+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IGRpciA/PyB0aGlzLmdvbGRlblNuYXBzaG90RGlyO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ZXN0U3VpdGUgPSBJbnRlZ1Rlc3RTdWl0ZS5mcm9tUGF0aChtYW5pZmVzdCk7XG4gICAgICByZXR1cm4gdGVzdFN1aXRlO1xuICAgIH0gY2F0Y2ggKG1vZGVybkVycm9yOiBhbnkpIHtcbiAgICAgIC8vIE9ubHkgYXR0ZW1wdCBsZWdhY3kgdGVzdCBjYXNlIGlmIHRoZSBpbnRlZyB0ZXN0IG1hbmlmZXN0IHdhcyBub3QgZm91bmRcbiAgICAgIC8vIEZvciBhbnkgb3RoZXIgZXJyb3JzLCBlLmcuIHdoZW4gcGFyc2luZyB0aGUgbWFuaWZlc3QgZmFpbHMsIHdlIGFib3J0LlxuICAgICAgaWYgKCEobW9kZXJuRXJyb3IgaW5zdGFuY2VvZiBOb01hbmlmZXN0RXJyb3IpKSB7XG4gICAgICAgIHRocm93IG1vZGVybkVycm9yO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zaG93T3V0cHV0KSB7XG4gICAgICAgIGxvZ2dlci50cmFjZShcbiAgICAgICAgICBcIkZhaWxlZCB0byBsb2FkIGludGVnIHRlc3QgbWFuaWZlc3QgZm9yICclcycuIEF0dGVtcHRpbmcgYXMgZGVwcmVjYXRlZCBsZWdhY3kgdGVzdCBpbnN0ZWFkLiBFcnJvciB3YXM6ICVzXCIsXG4gICAgICAgICAgbWFuaWZlc3QsXG4gICAgICAgICAgbW9kZXJuRXJyb3IubWVzc2FnZSA/PyBTdHJpbmcobW9kZXJuRXJyb3IpLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0ZXN0Q2FzZXMgPSBhd2FpdCBMZWdhY3lJbnRlZ1Rlc3RTdWl0ZS5mcm9tTGVnYWN5KHtcbiAgICAgICAgY2RrOiB0aGlzLmNkayxcbiAgICAgICAgdGVzdE5hbWU6IHRoaXMudGVzdC5ub3JtYWxpemVkVGVzdE5hbWUsXG4gICAgICAgIGludGVnU291cmNlRmlsZVBhdGg6IHRoaXMudGVzdC5maWxlTmFtZSxcbiAgICAgICAgbGlzdE9wdGlvbnM6IHtcbiAgICAgICAgICAuLi50aGlzLmRlZmF1bHRBcmdzLFxuICAgICAgICAgIGFsbDogdHJ1ZSxcbiAgICAgICAgICBhcHA6IHRoaXMuY2RrQXBwLFxuICAgICAgICAgIHByb2ZpbGU6IHRoaXMucHJvZmlsZSxcbiAgICAgICAgICBvdXRwdXQ6IHBhdGgucmVsYXRpdmUodGhpcy5kaXJlY3RvcnksIHRoaXMuY2RrT3V0RGlyKSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5sZWdhY3lDb250ZXh0ID0gTGVnYWN5SW50ZWdUZXN0U3VpdGUuZ2V0UHJhZ21hQ29udGV4dCh0aGlzLnRlc3QuZmlsZU5hbWUpO1xuICAgICAgcmV0dXJuIHRlc3RDYXNlcztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2xlYW51cCgpOiB2b2lkIHtcbiAgICBjb25zdCBjZGtPdXRQYXRoID0gdGhpcy5jZGtPdXREaXI7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY2RrT3V0UGF0aCkpIHtcbiAgICAgIGZzLnJlbW92ZVN5bmMoY2RrT3V0UGF0aCk7XG4gICAgfVxuICAgIC8vIENsZWFyIGNhY2hlXG4gICAgdGhpcy5fYWN0dWFsU25hcHNob3QgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlcmUgYXJlIGFueSBkZXN0cnVjdGl2ZSBjaGFuZ2VzIHRvIGEgc3RhY2sgdGhlbiB0aGlzIHdpbGwgcmVjb3JkXG4gICAqIHRob3NlIGluIHRoZSBtYW5pZmVzdC5qc29uIGZpbGVcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyVHJhY2VEYXRhKCk6IE1hbmlmZXN0VHJhY2Uge1xuICAgIGNvbnN0IHRyYWNlRGF0YTogTWFuaWZlc3RUcmFjZSA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBkZXN0cnVjdGl2ZUNoYW5nZXMgPSB0aGlzLl9kZXN0cnVjdGl2ZUNoYW5nZXMgPz8gW107XG4gICAgZGVzdHJ1Y3RpdmVDaGFuZ2VzLmZvckVhY2goY2hhbmdlID0+IHtcbiAgICAgIGNvbnN0IHRyYWNlID0gdHJhY2VEYXRhLmdldChjaGFuZ2Uuc3RhY2tOYW1lKTtcbiAgICAgIGlmICh0cmFjZSkge1xuICAgICAgICB0cmFjZS5zZXQoY2hhbmdlLmxvZ2ljYWxJZCwgYCR7REVTVFJVQ1RJVkVfQ0hBTkdFU30gJHtjaGFuZ2UuaW1wYWN0fWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhY2VEYXRhLnNldChjaGFuZ2Uuc3RhY2tOYW1lLCBuZXcgTWFwKFtcbiAgICAgICAgICBbY2hhbmdlLmxvZ2ljYWxJZCwgYCR7REVTVFJVQ1RJVkVfQ0hBTkdFU30gJHtjaGFuZ2UuaW1wYWN0fWBdLFxuICAgICAgICBdKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRyYWNlRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbiBjYXNlcyB3aGVyZSB3ZSBkbyBub3Qgd2FudCB0byByZXRhaW4gdGhlIGFzc2V0cyxcbiAgICogZm9yIGV4YW1wbGUsIGlmIHRoZSBhc3NldHMgYXJlIHZlcnkgbGFyZ2UuXG4gICAqXG4gICAqIFNpbmNlIGl0IGlzIHBvc3NpYmxlIHRvIGRpc2FibGUgdGhlIHVwZGF0ZSB3b3JrZmxvdyBmb3IgaW5kaXZpZHVhbCB0ZXN0XG4gICAqIGNhc2VzLCB0aGlzIG5lZWRzIHRvIGZpcnN0IGdldCBhIGxpc3Qgb2Ygc3RhY2tzIHRoYXQgaGF2ZSB0aGUgdXBkYXRlIHdvcmtmbG93XG4gICAqIGRpc2FibGVkIGFuZCB0aGVuIGRlbGV0ZSBhc3NldHMgdGhhdCByZWxhdGUgdG8gdGhhdCBzdGFjay4gSXQgZG9lcyB0aGF0XG4gICAqIGJ5IHJlYWRpbmcgdGhlIGFzc2V0IG1hbmlmZXN0IGZvciB0aGUgc3RhY2sgYW5kIGRlbGV0aW5nIHRoZSBhc3NldCBzb3VyY2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVtb3ZlQXNzZXRzRnJvbVNuYXBzaG90KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YWNrcyA9IChhd2FpdCB0aGlzLmFjdHVhbFRlc3RTdWl0ZSgpKS5nZXRTdGFja3NXaXRob3V0VXBkYXRlV29ya2Zsb3coKSA/PyBbXTtcbiAgICBjb25zdCBtYW5pZmVzdCA9IEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIuZnJvbVBhdGgodGhpcy5nb2xkZW5TbmFwc2hvdERpcik7XG4gICAgY29uc3QgYXNzZXRzID0gZmxhdHRlbihzdGFja3MubWFwKHN0YWNrID0+IHtcbiAgICAgIHJldHVybiBtYW5pZmVzdC5nZXRBc3NldExvY2F0aW9uc0ZvclN0YWNrKHN0YWNrKSA/PyBbXTtcbiAgICB9KSk7XG5cbiAgICBhc3NldHMuZm9yRWFjaChhc3NldCA9PiB7XG4gICAgICBjb25zdCBmaWxlTmFtZSA9IHBhdGguam9pbih0aGlzLmdvbGRlblNuYXBzaG90RGlyLCBhc3NldCk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlTmFtZSkpIHtcbiAgICAgICAgaWYgKGZzLmxzdGF0U3luYyhmaWxlTmFtZSkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgIGZzLnJlbW92ZVN5bmMoZmlsZU5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZzLnVubGlua1N5bmMoZmlsZU5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHRoZSBhc3NldCBjYWNoZSAoLmNhY2hlLykgZmlsZXMgZnJvbSB0aGUgc25hcHNob3QuXG4gICAqIFRoZXNlIGFyZSBhIGNhY2hlIG9mIHRoZSBhc3NldCB6aXBzLCBidXQgd2UgYXJlIGZpbmUgd2l0aFxuICAgKiByZS16aXBwaW5nIG9uIGRlcGxveVxuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVBc3NldHNDYWNoZUZyb21TbmFwc2hvdCgpOiB2b2lkIHtcbiAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKHRoaXMuZ29sZGVuU25hcHNob3REaXIpO1xuICAgIGZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gICAgICBjb25zdCBmaWxlTmFtZSA9IHBhdGguam9pbih0aGlzLmdvbGRlblNuYXBzaG90RGlyLCBmaWxlKTtcbiAgICAgIGlmIChmcy5sc3RhdFN5bmMoZmlsZU5hbWUpLmlzRGlyZWN0b3J5KCkgJiYgZmlsZSA9PT0gJy5jYWNoZScpIHtcbiAgICAgICAgZnMuZW1wdHlEaXJTeW5jKGZpbGVOYW1lKTtcbiAgICAgICAgZnMucm1kaXJTeW5jKGZpbGVOYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIG5ldyBzbmFwc2hvdC5cbiAgICpcbiAgICogSWYgbG9va3VwcyBhcmUgZW5hYmxlZCwgdGhlbiB3ZSBuZWVkIGNyZWF0ZSB0aGUgc25hcHNob3QgYnkgc3ludGgnaW5nIGFnYWluXG4gICAqIHdpdGggdGhlIGR1bW15IGNvbnRleHQgc28gdGhhdCBlYWNoIHRpbWUgdGhlIHRlc3QgaXMgcnVuIG9uIGRpZmZlcmVudCBtYWNoaW5lc1xuICAgKiAoYW5kIHdpdGggZGlmZmVyZW50IGNvbnRleHQvZW52KSB0aGUgZGlmZiB3aWxsIG5vdCBjaGFuZ2UuXG4gICAqXG4gICAqIElmIGxvb2t1cHMgYXJlIGRpc2FibGVkICh3aGljaCBtZWFucyB0aGUgc3RhY2sgaXMgZW52IGFnbm9zdGljKSB0aGVuIGp1c3QgY29weVxuICAgKiB0aGUgYXNzZW1ibHkgdGhhdCB3YXMgb3V0cHV0IGJ5IHRoZSBkZXBsb3ltZW50XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY3JlYXRlU25hcHNob3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmModGhpcy5nb2xkZW5TbmFwc2hvdERpcikpIHtcbiAgICAgIGZzLnJlbW92ZVN5bmModGhpcy5nb2xkZW5TbmFwc2hvdERpcik7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogSWYgd2UncmUgY2xldmVyLCB3ZSBzaG91bGQgYmUgYWJsZSB0byByZXVzZSB0aGUgc25hcHNob3QgdGhhdCB3YXNcbiAgICAvLyBnZW5lcmF0ZWQgZHVyaW5nIHRoZSB0ZXN0IGludmFsaWRhdGlvbiBjaGVjayBhbmQgYXZvaWQgdGhlIGJlbG93IHN5bnRoLlxuICAgIC8vIEJ1dCB0aGF0IGdldHMgcnVuIGluIGEgY29tcGxldGVseSBkaWZmZXJlbnQgbGlmZWN5Y2xlIGFuZCBpdCBtaWdodCBub3RcbiAgICAvLyBleGlzdC4gV2UncmUgbm90IGRlYWxpbmcgd2l0aCB0aGF0IGp1c3QgeWV0LlxuICAgIGF3YWl0IHRoaXMuc3ludGhBY3R1YWxTbmFwc2hvdCh0aGlzLmdvbGRlblNuYXBzaG90RGlyKTtcblxuICAgIGF3YWl0IHRoaXMuY2xlYW51cEdvbGRlblNuYXBzaG90KCk7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBzb21lIGNsZWFudXAgc3RlcHMgYWZ0ZXIgdGhlIHNuYXBzaG90IGlzIGNyZWF0ZWRcbiAgICogQW55dGltZSB0aGUgc25hcHNob3QgbmVlZHMgdG8gYmUgbW9kaWZpZWQgYWZ0ZXIgY3JlYXRpb25cbiAgICogdGhlIGxvZ2ljIHNob3VsZCBsaXZlIGhlcmUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNsZWFudXBHb2xkZW5TbmFwc2hvdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyh0aGlzLmdvbGRlblNuYXBzaG90RGlyKSkge1xuICAgICAgYXdhaXQgdGhpcy5yZW1vdmVBc3NldHNGcm9tU25hcHNob3QoKTtcbiAgICAgIHRoaXMucmVtb3ZlQXNzZXRzQ2FjaGVGcm9tU25hcHNob3QoKTtcbiAgICAgIGNvbnN0IGFzc2VtYmx5ID0gQXNzZW1ibHlNYW5pZmVzdFJlYWRlci5mcm9tUGF0aCh0aGlzLmdvbGRlblNuYXBzaG90RGlyKTtcbiAgICAgIGFzc2VtYmx5LmNsZWFuTWFuaWZlc3QoKTtcbiAgICAgIGFzc2VtYmx5LnJlY29yZFRyYWNlKHRoaXMucmVuZGVyVHJhY2VEYXRhKCkpO1xuICAgIH1cblxuICAgIC8vIGlmIHRoaXMgaXMgYSBsZWdhY3kgdGVzdCB0aGVuIGNyZWF0ZSBhbiBpbnRlZyBtYW5pZmVzdFxuICAgIC8vIGluIHRoZSBzbmFwc2hvdCBkaXJlY3Rvcnkgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRoZVxuICAgIC8vIHVwZGF0ZSB3b3JrZmxvdy4gU2F2ZSBhbnkgbGVnYWN5Q29udGV4dCBhcyB3ZWxsIHNvIHRoYXQgaXQgY2FuIGJlIHJlYWRcbiAgICAvLyB0aGUgbmV4dCB0aW1lXG4gICAgY29uc3QgYWN0dWFsVGVzdFN1aXRlID0gYXdhaXQgdGhpcy5hY3R1YWxUZXN0U3VpdGUoKTtcbiAgICBpZiAoYWN0dWFsVGVzdFN1aXRlLnR5cGUgPT09ICdsZWdhY3ktdGVzdC1zdWl0ZScpIHtcbiAgICAgIChhY3R1YWxUZXN0U3VpdGUgYXMgTGVnYWN5SW50ZWdUZXN0U3VpdGUpLnNhdmVNYW5pZmVzdCh0aGlzLmdvbGRlblNuYXBzaG90RGlyLCB0aGlzLmxlZ2FjeUNvbnRleHQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRDb250ZXh0KGFkZGl0aW9uYWxDb250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55Pik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5jdXJyZW50bHlSZWNvbW1lbmRlZEF3c0Nka0xpYkZsYWdzKCksXG4gICAgICAuLi50aGlzLmxlZ2FjeUNvbnRleHQsXG4gICAgICAuLi5hZGRpdGlvbmFsQ29udGV4dCxcblxuICAgICAgLy8gRG9uJ3QgcmVjb3JkIGNyZWF0aW9uIHN0YWNrIHRyYWNlcyBpbiB0aGUgc25hcHNob3QsIHNpbmNlIHRoZXkganVzdCB0YWtlIHVwIHNwYWNlIGFuZCBhcmUgbmV2ZXIgZGV0ZXJtaW5pc3RpYy5cbiAgICAgICdhd3M6Y2RrOmRpc2FibGUtY3JlYXRpb24tc3RhY2stdHJhY2VzJzogdHJ1ZSxcblxuICAgICAgLy8gV2Ugb3JpZ2luYWxseSBoYWQgUExBTk5FRCB0byBzZXQgdGhpcyB0byBbJ2F3cycsICdhd3MtY24nXSwgYnV0IGR1ZSB0byBhIHByb2dyYW1taW5nIG1pc3Rha2VcbiAgICAgIC8vIGl0IHdhcyBzZXQgdG8gZXZlcnl0aGluZy4gSW4gdGhpcyBQUiwgc2V0IGl0IHRvIGV2ZXJ5dGhpbmcgdG8gbm90IG1lc3MgdXAgYWxsIHRoZSBzbmFwc2hvdHMuXG4gICAgICAnQGF3cy1jZGsvY29yZTp0YXJnZXQtcGFydGl0aW9ucyc6IHVuZGVmaW5lZCxcblxuICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLSBUSEUgRlVUVVJFIExJVkVTIEJFTE9XLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgLy8gUmVzdHJpY3RpbmcgdG8gdGhlc2UgdGFyZ2V0IHBhcnRpdGlvbnMgbWFrZXMgbW9zdCBzZXJ2aWNlIHByaW5jaXBhbHMgc3ludGhlc2l6ZSB0b1xuICAgICAgLy8gYHNlcnZpY2UuJHtVUkxfU1VGRklYfWAsIHdoaWNoIGlzIHRlY2huaWNhbGx5ICppbmNvcnJlY3QqIChpdCdzIG9ubHkgYGFtYXpvbmF3cy5jb21gXG4gICAgICAvLyBvciBgYW1hem9uYXdzLmNvbS5jbmAsIG5ldmVyIFVybFN1ZmZpeCBmb3IgYW55IG9mIHRoZSByZXN0cmljdGVkIHJlZ2lvbnMpIGJ1dCBpdCdzIHdoYXRcbiAgICAgIC8vIG1vc3QgZXhpc3RpbmcgaW50ZWcgdGVzdHMgY29udGFpbiwgYW5kIHdlIHdhbnQgdG8gZGlzdHVyYiBhcyBmZXcgYXMgcG9zc2libGUuXG4gICAgICAvLyBbVEFSR0VUX1BBUlRJVElPTlNdOiBbJ2F3cycsICdhd3MtY24nXSxcbiAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0gRU5EIE9GIFRIRSBGVVRVUkUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgIH07XG4gIH1cbn1cblxuLy8gRGVmYXVsdCBjb250ZXh0IHdlIHJ1biBhbGwgaW50ZWcgdGVzdHMgd2l0aCwgc28gdGhleSBkb24ndCBkZXBlbmQgb24gdGhlXG4vLyBhY2NvdW50IG9mIHRoZSBleGVyY2lzaW5nIHVzZXIuXG5leHBvcnQgY29uc3QgREVGQVVMVF9TWU5USF9PUFRJT05TID0ge1xuICBjb250ZXh0OiB7XG4gICAgW0FWQUlMQUJJTElUWV9aT05FX0ZBTExCQUNLX0NPTlRFWFRfS0VZXTogWyd0ZXN0LXJlZ2lvbi0xYScsICd0ZXN0LXJlZ2lvbi0xYicsICd0ZXN0LXJlZ2lvbi0xYyddLFxuICAgICdhdmFpbGFiaWxpdHktem9uZXM6YWNjb3VudD0xMjM0NTY3ODpyZWdpb249dGVzdC1yZWdpb24nOiBbJ3Rlc3QtcmVnaW9uLTFhJywgJ3Rlc3QtcmVnaW9uLTFiJywgJ3Rlc3QtcmVnaW9uLTFjJ10sXG4gICAgJ3NzbTphY2NvdW50PTEyMzQ1Njc4OnBhcmFtZXRlck5hbWU9L2F3cy9zZXJ2aWNlL2FtaS1hbWF6b24tbGludXgtbGF0ZXN0L2Ftem4tYW1pLWh2bS14ODZfNjQtZ3AyOnJlZ2lvbj10ZXN0LXJlZ2lvbic6ICdhbWktMTIzNCcsXG4gICAgJ3NzbTphY2NvdW50PTEyMzQ1Njc4OnBhcmFtZXRlck5hbWU9L2F3cy9zZXJ2aWNlL2FtaS1hbWF6b24tbGludXgtbGF0ZXN0L2Ftem4yLWFtaS1odm0teDg2XzY0LWdwMjpyZWdpb249dGVzdC1yZWdpb24nOiAnYW1pLTEyMzQnLFxuICAgICdzc206YWNjb3VudD0xMjM0NTY3ODpwYXJhbWV0ZXJOYW1lPS9hd3Mvc2VydmljZS9lY3Mvb3B0aW1pemVkLWFtaS9hbWF6b24tbGludXgvcmVjb21tZW5kZWQ6cmVnaW9uPXRlc3QtcmVnaW9uJzogJ3tcImltYWdlX2lkXCI6IFwiYW1pLTEyMzRcIn0nLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAc3R5bGlzdGljL21heC1sZW5cbiAgICAnYW1pOmFjY291bnQ9MTIzNDU2Nzg6ZmlsdGVycy5pbWFnZS10eXBlLjA9bWFjaGluZTpmaWx0ZXJzLm5hbWUuMD1hbXpuLWFtaS12cGMtbmF0LSo6ZmlsdGVycy5zdGF0ZS4wPWF2YWlsYWJsZTpvd25lcnMuMD1hbWF6b246cmVnaW9uPXRlc3QtcmVnaW9uJzogJ2FtaS0xMjM0JyxcbiAgICAndnBjLXByb3ZpZGVyOmFjY291bnQ9MTIzNDU2Nzg6ZmlsdGVyLmlzRGVmYXVsdD10cnVlOnJlZ2lvbj10ZXN0LXJlZ2lvbjpyZXR1cm5Bc3ltbWV0cmljU3VibmV0cz10cnVlJzoge1xuICAgICAgdnBjSWQ6ICd2cGMtNjA5MDA5MDUnLFxuICAgICAgc3VibmV0R3JvdXBzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnUHVibGljJyxcbiAgICAgICAgICBuYW1lOiAnUHVibGljJyxcbiAgICAgICAgICBzdWJuZXRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN1Ym5ldElkOiAnc3VibmV0LWUxOTQ1NWNhJyxcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogJ3VzLWVhc3QtMWEnLFxuICAgICAgICAgICAgICByb3V0ZVRhYmxlSWQ6ICdydGItZTE5NDU1Y2EnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3VibmV0SWQ6ICdzdWJuZXQtZTBjMjQ3OTcnLFxuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lOiAndXMtZWFzdC0xYicsXG4gICAgICAgICAgICAgIHJvdXRlVGFibGVJZDogJ3J0Yi1lMGMyNDc5NycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzdWJuZXRJZDogJ3N1Ym5ldC1jY2Q3NzM5NScsXG4gICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmU6ICd1cy1lYXN0LTFjJyxcbiAgICAgICAgICAgICAgcm91dGVUYWJsZUlkOiAncnRiLWNjZDc3Mzk1JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgfSxcbiAgZW52OiB7XG4gICAgQ0RLX0lOVEVHX0FDQ09VTlQ6ICcxMjM0NTY3OCcsXG4gICAgQ0RLX0lOVEVHX1JFR0lPTjogJ3Rlc3QtcmVnaW9uJyxcbiAgICBDREtfSU5URUdfSE9TVEVEX1pPTkVfSUQ6ICdaMjNBQkM0WFlaTDA1QicsXG4gICAgQ0RLX0lOVEVHX0hPU1RFRF9aT05FX05BTUU6ICdleGFtcGxlLmNvbScsXG4gICAgQ0RLX0lOVEVHX0RPTUFJTl9OQU1FOiAnKi5leGFtcGxlLmNvbScsXG4gICAgQ0RLX0lOVEVHX0NFUlRfQVJOOiAnYXJuOmF3czphY206dGVzdC1yZWdpb246MTIzNDU2Nzg6Y2VydGlmaWNhdGUvODY0NjgyMDktYTI3Mi01OTVkLWI4MzEtMGVmYjY0MjEyNjV6JyxcbiAgICBDREtfSU5URUdfU1VCTkVUX0lEOiAnc3VibmV0LTBkZmYxYTM5OWQ4ZjZmOTJjJyxcbiAgfSxcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBjdXJyZW50bHkgcmVjb21tZW5kZWQgZmxhZ3MgZm9yIGBhd3MtY2RrLWxpYmAuXG4gKlxuICogVGhlc2UgaGF2ZSBiZWVuIGJ1aWx0IGludG8gdGhlIENMSSBhdCBidWlsZCB0aW1lLiBJZiB0aGlzIGV2ZXIgZ2V0cyBjaGFuZ2VkXG4gKiBiYWNrIHRvIGEgZHluYW1pYyBsb2FkLCByZW1lbWJlciB0aGF0IHRoaXMgc291cmNlIGZpbGUgbWF5IGJlIGJ1bmRsZWQgaW50b1xuICogYSBKYXZhU2NyaXB0IGJ1bmRsZSwgYW5kIGBfX2Rpcm5hbWVgIG1pZ2h0IG5vdCBwb2ludCB3aGVyZSB5b3UgdGhpbmsgaXQgZG9lcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGN1cnJlbnRseVJlY29tbWVuZGVkQXdzQ2RrTGliRmxhZ3MoKSB7XG4gIHJldHVybiByZWNvbW1lbmRlZEZsYWdzRmlsZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTbmFwc2hvdEFuZFRlc3REZWZpbml0aW9uIHtcbiAgcmVhZG9ubHkgdGVzdERlZmluaXRpb246IEludGVnVGVzdFN1aXRlIHwgTGVnYWN5SW50ZWdUZXN0U3VpdGU7XG4gIHJlYWRvbmx5IHNuYXBzaG90RGlyZWN0b3J5OiBzdHJpbmc7XG59XG4iXX0=
@@ -1,9 +1,10 @@
1
- import type { IntegRunnerOptions } from './runner-base';
1
+ import type { CdkIntegHelperOptions } from './cdk-integ-helper';
2
2
  import { ToolkitLibRunnerEngine } from '../engines/toolkit-lib';
3
3
  /**
4
4
  * Creates the engine for running integration tests.
5
5
  *
6
6
  * Only the toolkit-lib engine is supported.
7
7
  */
8
- export declare function makeEngine(options: IntegRunnerOptions): ToolkitLibRunnerEngine;
8
+ export declare function makeEngine(options: EngineOptions): ToolkitLibRunnerEngine;
9
+ export type EngineOptions = Pick<CdkIntegHelperOptions, 'test' | 'showOutput' | 'env' | 'region' | 'profile' | 'proxy' | 'caBundlePath'>;
9
10
  //# sourceMappingURL=engine.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,kBAAkB,GAAG,sBAAsB,CAU9E"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,sBAAsB,CAUzE;AAED,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,qBAAqB,EAAE,MAAM,GAAG,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,cAAc,CAAC,CAAC"}
@@ -18,4 +18,4 @@ function makeEngine(options) {
18
18
  caBundlePath: options.caBundlePath,
19
19
  });
20
20
  }
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5naW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZW5naW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBUUEsZ0NBVUM7QUFqQkQsd0RBQWdFO0FBRWhFOzs7O0dBSUc7QUFDSCxTQUFnQixVQUFVLENBQUMsT0FBMkI7SUFDcEQsT0FBTyxJQUFJLG9DQUFzQixDQUFDO1FBQ2hDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUztRQUN4QyxVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7UUFDOUIsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHO1FBQ2hCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtRQUN0QixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87UUFDeEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWTtLQUNuQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbnRlZ1J1bm5lck9wdGlvbnMgfSBmcm9tICcuL3J1bm5lci1iYXNlJztcbmltcG9ydCB7IFRvb2xraXRMaWJSdW5uZXJFbmdpbmUgfSBmcm9tICcuLi9lbmdpbmVzL3Rvb2xraXQtbGliJztcblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBlbmdpbmUgZm9yIHJ1bm5pbmcgaW50ZWdyYXRpb24gdGVzdHMuXG4gKlxuICogT25seSB0aGUgdG9vbGtpdC1saWIgZW5naW5lIGlzIHN1cHBvcnRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VFbmdpbmUob3B0aW9uczogSW50ZWdSdW5uZXJPcHRpb25zKTogVG9vbGtpdExpYlJ1bm5lckVuZ2luZSB7XG4gIHJldHVybiBuZXcgVG9vbGtpdExpYlJ1bm5lckVuZ2luZSh7XG4gICAgd29ya2luZ0RpcmVjdG9yeTogb3B0aW9ucy50ZXN0LmRpcmVjdG9yeSxcbiAgICBzaG93T3V0cHV0OiBvcHRpb25zLnNob3dPdXRwdXQsXG4gICAgZW52OiBvcHRpb25zLmVudixcbiAgICByZWdpb246IG9wdGlvbnMucmVnaW9uLFxuICAgIHByb2ZpbGU6IG9wdGlvbnMucHJvZmlsZSxcbiAgICBwcm94eTogb3B0aW9ucy5wcm94eSxcbiAgICBjYUJ1bmRsZVBhdGg6IG9wdGlvbnMuY2FCdW5kbGVQYXRoLFxuICB9KTtcbn1cbiJdfQ==
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5naW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZW5naW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBUUEsZ0NBVUM7QUFqQkQsd0RBQWdFO0FBRWhFOzs7O0dBSUc7QUFDSCxTQUFnQixVQUFVLENBQUMsT0FBc0I7SUFDL0MsT0FBTyxJQUFJLG9DQUFzQixDQUFDO1FBQ2hDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUztRQUN4QyxVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7UUFDOUIsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHO1FBQ2hCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtRQUN0QixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87UUFDeEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWTtLQUNuQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDZGtJbnRlZ0hlbHBlck9wdGlvbnMgfSBmcm9tICcuL2Nkay1pbnRlZy1oZWxwZXInO1xuaW1wb3J0IHsgVG9vbGtpdExpYlJ1bm5lckVuZ2luZSB9IGZyb20gJy4uL2VuZ2luZXMvdG9vbGtpdC1saWInO1xuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGVuZ2luZSBmb3IgcnVubmluZyBpbnRlZ3JhdGlvbiB0ZXN0cy5cbiAqXG4gKiBPbmx5IHRoZSB0b29sa2l0LWxpYiBlbmdpbmUgaXMgc3VwcG9ydGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZUVuZ2luZShvcHRpb25zOiBFbmdpbmVPcHRpb25zKTogVG9vbGtpdExpYlJ1bm5lckVuZ2luZSB7XG4gIHJldHVybiBuZXcgVG9vbGtpdExpYlJ1bm5lckVuZ2luZSh7XG4gICAgd29ya2luZ0RpcmVjdG9yeTogb3B0aW9ucy50ZXN0LmRpcmVjdG9yeSxcbiAgICBzaG93T3V0cHV0OiBvcHRpb25zLnNob3dPdXRwdXQsXG4gICAgZW52OiBvcHRpb25zLmVudixcbiAgICByZWdpb246IG9wdGlvbnMucmVnaW9uLFxuICAgIHByb2ZpbGU6IG9wdGlvbnMucHJvZmlsZSxcbiAgICBwcm94eTogb3B0aW9ucy5wcm94eSxcbiAgICBjYUJ1bmRsZVBhdGg6IG9wdGlvbnMuY2FCdW5kbGVQYXRoLFxuICB9KTtcbn1cblxuZXhwb3J0IHR5cGUgRW5naW5lT3B0aW9ucyA9IFBpY2s8Q2RrSW50ZWdIZWxwZXJPcHRpb25zLCAndGVzdCcgfCAnc2hvd091dHB1dCcgfCAnZW52JyB8ICdyZWdpb24nIHwgJ3Byb2ZpbGUnIHwgJ3Byb3h5JyB8ICdjYUJ1bmRsZVBhdGgnPjtcbiJdfQ==
@@ -1,4 +1,4 @@
1
- export * from './runner-base';
1
+ export * from './cdk-integ-helper';
2
2
  export * from './integ-test-suite';
3
3
  export * from './integ-test-runner';
4
4
  export * from './snapshot-test-runner';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC"}
@@ -14,9 +14,9 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./runner-base"), exports);
17
+ __exportStar(require("./cdk-integ-helper"), exports);
18
18
  __exportStar(require("./integ-test-suite"), exports);
19
19
  __exportStar(require("./integ-test-runner"), exports);
20
20
  __exportStar(require("./snapshot-test-runner"), exports);
21
21
  __exportStar(require("./integration-tests"), exports);
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZ0RBQThCO0FBQzlCLHFEQUFtQztBQUNuQyxzREFBb0M7QUFDcEMseURBQXVDO0FBQ3ZDLHNEQUFvQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vcnVubmVyLWJhc2UnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlZy10ZXN0LXN1aXRlJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZWctdGVzdC1ydW5uZXInO1xuZXhwb3J0ICogZnJvbSAnLi9zbmFwc2hvdC10ZXN0LXJ1bm5lcic7XG5leHBvcnQgKiBmcm9tICcuL2ludGVncmF0aW9uLXRlc3RzJztcbiJdfQ==
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEscURBQW1DO0FBQ25DLHFEQUFtQztBQUNuQyxzREFBb0M7QUFDcEMseURBQXVDO0FBQ3ZDLHNEQUFvQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vY2RrLWludGVnLWhlbHBlcic7XG5leHBvcnQgKiBmcm9tICcuL2ludGVnLXRlc3Qtc3VpdGUnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlZy10ZXN0LXJ1bm5lcic7XG5leHBvcnQgKiBmcm9tICcuL3NuYXBzaG90LXRlc3QtcnVubmVyJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZWdyYXRpb24tdGVzdHMnO1xuIl19
@@ -1,6 +1,5 @@
1
1
  import type { TestCase } from '@aws-cdk/cloud-assembly-schema';
2
- import type { IntegRunnerOptions } from './runner-base';
3
- import { IntegRunner } from './runner-base';
2
+ import type { CdkIntegHelperOptions } from './cdk-integ-helper';
4
3
  import type { DestructiveChange, AssertionResults } from '../workers/common';
5
4
  export interface CommonOptions {
6
5
  /**
@@ -83,8 +82,17 @@ export interface RunOptions extends CommonOptions {
83
82
  * An integration test runner that orchestrates executing
84
83
  * integration tests
85
84
  */
86
- export declare class IntegTestRunner extends IntegRunner {
87
- constructor(options: IntegRunnerOptions, destructiveChanges?: DestructiveChange[]);
85
+ export declare class IntegTestRunner {
86
+ private readonly helper;
87
+ constructor(options: CdkIntegHelperOptions, destructiveChanges?: DestructiveChange[]);
88
+ /**
89
+ * Compatibility shim with old API
90
+ */
91
+ get testName(): string;
92
+ /**
93
+ * Compatibility shim with old API
94
+ */
95
+ private actualTestSuite;
88
96
  actualTests(): Promise<{
89
97
  [testName: string]: TestCase;
90
98
  } | undefined>;
@@ -1 +1 @@
1
- {"version":3,"file":"integ-test-runner.d.ts","sourceRoot":"","sources":["integ-test-runner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAkB,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAM/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAI5C,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAmB,MAAM,mBAAmB,CAAC;AAkB9F,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAE9B;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,YAAa,SAAQ,aAAa;IACjD;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,UAAW,SAAQ,aAAa;IAC/C;;;;;;;;OAQG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAEzB;;;;;;;;OAQG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAE1B;;;;;;;;OAQG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAElC;;;;;OAKG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnC;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;;;;OAOG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;CACxC;AAED;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,WAAW;gBAClC,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,EAAE,iBAAiB,EAAE;IAKpE,WAAW,IAAI,OAAO,CAAC;QAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAA;KAAE,GAAG,SAAS,CAAC;IAe1E,oBAAoB,IAAI,IAAI;IAQnC;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAgB7B;;;OAGG;YACW,cAAc;IAgD5B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,gBAAgB;IAgDxB;;;;OAIG;IACU,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAmCjE;;;;;;;;;;OAUG;IACU,gBAAgB,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAgEzF;;OAEG;YACW,OAAO;YA6BP,KAAK;IA0InB;;;OAGG;YACW,MAAM;IA8GpB;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAiC/B;;OAEG;IACH,OAAO,CAAC,UAAU;CAYnB"}
1
+ {"version":3,"file":"integ-test-runner.d.ts","sourceRoot":"","sources":["integ-test-runner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAkB,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAM/E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAKhE,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAmB,MAAM,mBAAmB,CAAC;AAkB9F,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAE9B;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,YAAa,SAAQ,aAAa;IACjD;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,UAAW,SAAQ,aAAa;IAC/C;;;;;;;;OAQG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAEzB;;;;;;;;OAQG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAE1B;;;;;;;;OAQG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAElC;;;;;OAKG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnC;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;;;;OAOG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;CACxC;AAED;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;gBAC5B,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,CAAC,EAAE,iBAAiB,EAAE;IAepF;;OAEG;IACH,IAAW,QAAQ,WAElB;IAED;;OAEG;YACW,eAAe;IAIhB,WAAW,IAAI,OAAO,CAAC;QAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAA;KAAE,GAAG,SAAS,CAAC;IAe1E,oBAAoB,IAAI,IAAI;IAQnC;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAgB7B;;;OAGG;YACW,cAAc;IAgD5B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,gBAAgB;IAgDxB;;;;OAIG;IACU,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAmCjE;;;;;;;;;;OAUG;IACU,gBAAgB,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IA0EzF;;OAEG;YACW,OAAO;YA6BP,KAAK;IA0InB;;;OAGG;YACW,MAAM;IA8GpB;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAiC/B;;OAEG;IACH,OAAO,CAAC,UAAU;CAYnB"}