@aws-cdk-testing/cli-integ 3.33.1 → 3.33.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.
- package/npm-shrinkwrap.json +1 -1
- package/package.json +2 -2
- package/resources/cdk-apps/validate-online-app/app.js +3 -1
- package/tests/cli-integ-tests/validate/cdk-validate-passes-clean-app.integtest.js +2 -2
- package/tests/cli-integ-tests/validate-online/cdk-validate-online-combined-offline-and-online.integtest.js +4 -1
- package/tests/cli-integ-tests/validate-online/cdk-validate-online-passes-valid-template.integtest.js +2 -2
- package/tests/cli-integ-tests/watch/cdk-watch-detects-file-changes-with-directory-scoped-glob.integtest.d.ts +1 -0
- package/tests/cli-integ-tests/watch/cdk-watch-detects-file-changes-with-directory-scoped-glob.integtest.js +65 -0
package/npm-shrinkwrap.json
CHANGED
package/package.json
CHANGED
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"organization": true
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
|
-
"@aws-cdk/toolkit-lib": "1.
|
|
42
|
+
"@aws-cdk/toolkit-lib": "1.30.0",
|
|
43
43
|
"@aws-cdk/yarn-cling": "0.0.0",
|
|
44
44
|
"@cdklabs/eslint-plugin": "^2.0.9",
|
|
45
45
|
"@stylistic/eslint-plugin": "^3",
|
|
@@ -125,7 +125,7 @@
|
|
|
125
125
|
"publishConfig": {
|
|
126
126
|
"access": "public"
|
|
127
127
|
},
|
|
128
|
-
"version": "3.33.
|
|
128
|
+
"version": "3.33.2",
|
|
129
129
|
"packageManager": "yarn@4.13.0",
|
|
130
130
|
"types": "lib/index.d.ts",
|
|
131
131
|
"//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"yarn projen\"."
|
|
@@ -40,7 +40,9 @@ class SecurityPlugin {
|
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
const app = new cdk.App();
|
|
43
|
-
|
|
43
|
+
if (process.env.INJECT_OFFLINE_ERRORS) {
|
|
44
|
+
cdk.Validations.of(app).addPlugins(new SecurityPlugin());
|
|
45
|
+
}
|
|
44
46
|
|
|
45
47
|
// Valid stack — no offline or online errors
|
|
46
48
|
class ValidStack extends cdk.Stack {
|
|
@@ -3,6 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const lib_1 = require("../../../lib");
|
|
4
4
|
(0, lib_1.integTest)('cdk validate passes for clean app', (0, lib_1.withSpecificFixture)('validate-passing-app', async (fixture) => {
|
|
5
5
|
const output = await fixture.cdk(['--unstable=validate', 'validate', fixture.fullStackName('validate-passing')]);
|
|
6
|
-
expect(output).toContain('
|
|
6
|
+
expect(output).toContain('Validation did not find any problems.');
|
|
7
7
|
}));
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLXZhbGlkYXRlLXBhc3Nlcy1jbGVhbi1hcHAuaW50ZWd0ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2RrLXZhbGlkYXRlLXBhc3Nlcy1jbGVhbi1hcHAuaW50ZWd0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQThEO0FBRTlELElBQUEsZUFBUyxFQUNQLG1DQUFtQyxFQUNuQyxJQUFBLHlCQUFtQixFQUFDLHNCQUFzQixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUM1RCxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQzlCLENBQUMscUJBQXFCLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUMvRSxDQUFDO0lBRUYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO0FBQ3BFLENBQUMsQ0FBQyxDQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbnRlZ1Rlc3QsIHdpdGhTcGVjaWZpY0ZpeHR1cmUgfSBmcm9tICcuLi8uLi8uLi9saWInO1xuXG5pbnRlZ1Rlc3QoXG4gICdjZGsgdmFsaWRhdGUgcGFzc2VzIGZvciBjbGVhbiBhcHAnLFxuICB3aXRoU3BlY2lmaWNGaXh0dXJlKCd2YWxpZGF0ZS1wYXNzaW5nLWFwcCcsIGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgZml4dHVyZS5jZGsoXG4gICAgICBbJy0tdW5zdGFibGU9dmFsaWRhdGUnLCAndmFsaWRhdGUnLCBmaXh0dXJlLmZ1bGxTdGFja05hbWUoJ3ZhbGlkYXRlLXBhc3NpbmcnKV0sXG4gICAgKTtcblxuICAgIGV4cGVjdChvdXRwdXQpLnRvQ29udGFpbignVmFsaWRhdGlvbiBkaWQgbm90IGZpbmQgYW55IHByb2JsZW1zLicpO1xuICB9KSxcbik7XG4iXX0=
|
|
@@ -8,6 +8,9 @@ const lib_1 = require("../../../lib");
|
|
|
8
8
|
// Validate combined stack — has both a bucket (SecurityPlugin) and
|
|
9
9
|
// uses the same bucket name (CFN early validation conflict)
|
|
10
10
|
const output = await fixture.cdk(['--unstable=validate', 'validate', '--online', fixture.fullStackName('validate-online-combined')], {
|
|
11
|
+
modEnv: {
|
|
12
|
+
INJECT_OFFLINE_ERRORS: 'true',
|
|
13
|
+
},
|
|
11
14
|
allowErrExit: true,
|
|
12
15
|
});
|
|
13
16
|
// Offline: SecurityPlugin catches the S3 bucket
|
|
@@ -21,4 +24,4 @@ const lib_1 = require("../../../lib");
|
|
|
21
24
|
await fixture.cdk(['destroy', '--force', fixture.fullStackName('validate-online-deployed')]);
|
|
22
25
|
}
|
|
23
26
|
}));
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLXZhbGlkYXRlLW9ubGluZS1jb21iaW5lZC1vZmZsaW5lLWFuZC1vbmxpbmUuaW50ZWd0ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2RrLXZhbGlkYXRlLW9ubGluZS1jb21iaW5lZC1vZmZsaW5lLWFuZC1vbmxpbmUuaW50ZWd0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQThEO0FBRTlELElBQUEsZUFBUyxFQUNQLDhEQUE4RCxFQUM5RCxJQUFBLHlCQUFtQixFQUFDLHFCQUFxQixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUMzRCxzQ0FBc0M7SUFDdEMsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLENBQUMsUUFBUSxFQUFFLDBCQUEwQixFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUMxRixDQUFDO0lBRUYsSUFBSSxDQUFDO1FBQ0gsbUVBQW1FO1FBQ25FLDREQUE0RDtRQUM1RCxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQzlCLENBQUMscUJBQXFCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsYUFBYSxDQUFDLDBCQUEwQixDQUFDLENBQUMsRUFDbEc7WUFDRSxNQUFNLEVBQUU7Z0JBQ04scUJBQXFCLEVBQUUsTUFBTTthQUM5QjtZQUNELFlBQVksRUFBRSxJQUFJO1NBQ25CLENBQ0YsQ0FBQztRQUVGLGdEQUFnRDtRQUNoRCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7UUFDdkUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRTNDLDBEQUEwRDtRQUMxRCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDM0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzdDLENBQUM7WUFBUyxDQUFDO1FBQ1QsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsYUFBYSxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9GLENBQUM7QUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW50ZWdUZXN0LCB3aXRoU3BlY2lmaWNGaXh0dXJlIH0gZnJvbSAnLi4vLi4vLi4vbGliJztcblxuaW50ZWdUZXN0KFxuICAnY2RrIHZhbGlkYXRlIC0tb25saW5lIHJlcG9ydHMgYm90aCBvZmZsaW5lIGFuZCBvbmxpbmUgZXJyb3JzJyxcbiAgd2l0aFNwZWNpZmljRml4dHVyZSgndmFsaWRhdGUtb25saW5lLWFwcCcsIGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgLy8gRGVwbG95IGEgc3RhY2sgdGhhdCBvd25zIHRoZSBidWNrZXRcbiAgICBhd2FpdCBmaXh0dXJlLmNkayhcbiAgICAgIFsnZGVwbG95JywgJy0tcmVxdWlyZS1hcHByb3ZhbD1uZXZlcicsIGZpeHR1cmUuZnVsbFN0YWNrTmFtZSgndmFsaWRhdGUtb25saW5lLWRlcGxveWVkJyldLFxuICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gVmFsaWRhdGUgY29tYmluZWQgc3RhY2sg4oCUIGhhcyBib3RoIGEgYnVja2V0IChTZWN1cml0eVBsdWdpbikgYW5kXG4gICAgICAvLyB1c2VzIHRoZSBzYW1lIGJ1Y2tldCBuYW1lIChDRk4gZWFybHkgdmFsaWRhdGlvbiBjb25mbGljdClcbiAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IGZpeHR1cmUuY2RrKFxuICAgICAgICBbJy0tdW5zdGFibGU9dmFsaWRhdGUnLCAndmFsaWRhdGUnLCAnLS1vbmxpbmUnLCBmaXh0dXJlLmZ1bGxTdGFja05hbWUoJ3ZhbGlkYXRlLW9ubGluZS1jb21iaW5lZCcpXSxcbiAgICAgICAge1xuICAgICAgICAgIG1vZEVudjoge1xuICAgICAgICAgICAgSU5KRUNUX09GRkxJTkVfRVJST1JTOiAndHJ1ZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhbGxvd0VyckV4aXQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICAvLyBPZmZsaW5lOiBTZWN1cml0eVBsdWdpbiBjYXRjaGVzIHRoZSBTMyBidWNrZXRcbiAgICAgIGV4cGVjdChvdXRwdXQpLnRvQ29udGFpbignUzMgQnVja2V0cyBtdXN0IG5vdCBiZSBwdWJsaWNseSBhY2Nlc3NpYmxlJyk7XG4gICAgICBleHBlY3Qob3V0cHV0KS50b0NvbnRhaW4oJ1NlY3VyaXR5UGx1Z2luJyk7XG5cbiAgICAgIC8vIE9ubGluZTogQ2xvdWRGb3JtYXRpb24gY2F0Y2hlcyB0aGUgYnVja2V0IG5hbWUgY29uZmxpY3RcbiAgICAgIGV4cGVjdChvdXRwdXQpLnRvQ29udGFpbignYWxyZWFkeSBleGlzdHMnKTtcbiAgICAgIGV4cGVjdChvdXRwdXQpLnRvQ29udGFpbignQ2xvdWRGb3JtYXRpb24nKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZml4dHVyZS5jZGsoWydkZXN0cm95JywgJy0tZm9yY2UnLCBmaXh0dXJlLmZ1bGxTdGFja05hbWUoJ3ZhbGlkYXRlLW9ubGluZS1kZXBsb3llZCcpXSk7XG4gICAgfVxuICB9KSxcbik7XG4iXX0=
|
package/tests/cli-integ-tests/validate-online/cdk-validate-online-passes-valid-template.integtest.js
CHANGED
|
@@ -3,6 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const lib_1 = require("../../../lib");
|
|
4
4
|
(0, lib_1.integTest)('cdk validate --online passes for valid template', (0, lib_1.withSpecificFixture)('validate-online-app', async (fixture) => {
|
|
5
5
|
const output = await fixture.cdk(['--unstable=validate', 'validate', '--online', fixture.fullStackName('validate-online-valid')]);
|
|
6
|
-
expect(output).toContain('
|
|
6
|
+
expect(output).toContain('Validation did not find any problems');
|
|
7
7
|
}));
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLXZhbGlkYXRlLW9ubGluZS1wYXNzZXMtdmFsaWQtdGVtcGxhdGUuaW50ZWd0ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2RrLXZhbGlkYXRlLW9ubGluZS1wYXNzZXMtdmFsaWQtdGVtcGxhdGUuaW50ZWd0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQThEO0FBRTlELElBQUEsZUFBUyxFQUNQLGlEQUFpRCxFQUNqRCxJQUFBLHlCQUFtQixFQUFDLHFCQUFxQixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUMzRCxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQzlCLENBQUMscUJBQXFCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsYUFBYSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FDaEcsQ0FBQztJQUVGLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsc0NBQXNDLENBQUMsQ0FBQztBQUNuRSxDQUFDLENBQUMsQ0FDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW50ZWdUZXN0LCB3aXRoU3BlY2lmaWNGaXh0dXJlIH0gZnJvbSAnLi4vLi4vLi4vbGliJztcblxuaW50ZWdUZXN0KFxuICAnY2RrIHZhbGlkYXRlIC0tb25saW5lIHBhc3NlcyBmb3IgdmFsaWQgdGVtcGxhdGUnLFxuICB3aXRoU3BlY2lmaWNGaXh0dXJlKCd2YWxpZGF0ZS1vbmxpbmUtYXBwJywgYXN5bmMgKGZpeHR1cmUpID0+IHtcbiAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBmaXh0dXJlLmNkayhcbiAgICAgIFsnLS11bnN0YWJsZT12YWxpZGF0ZScsICd2YWxpZGF0ZScsICctLW9ubGluZScsIGZpeHR1cmUuZnVsbFN0YWNrTmFtZSgndmFsaWRhdGUtb25saW5lLXZhbGlkJyldLFxuICAgICk7XG5cbiAgICBleHBlY3Qob3V0cHV0KS50b0NvbnRhaW4oJ1ZhbGlkYXRpb24gZGlkIG5vdCBmaW5kIGFueSBwcm9ibGVtcycpO1xuICB9KSxcbik7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const child_process = require("child_process");
|
|
4
|
+
const fs = require("fs");
|
|
5
|
+
const path = require("path");
|
|
6
|
+
const watch_helpers_1 = require("./watch-helpers");
|
|
7
|
+
const lib_1 = require("../../../lib");
|
|
8
|
+
jest.setTimeout(5 * 60 * 1000); // 5 minutes for watch tests
|
|
9
|
+
// Regression test for https://github.com/aws/aws-cdk-cli/issues/1647:
|
|
10
|
+
// a user-supplied glob scoped to a subdirectory (e.g. 'src/**/*.ts') must
|
|
11
|
+
// detect changes to files nested inside that directory. The chokidar v4
|
|
12
|
+
// `ignored` callback also gates directory traversal, so an earlier bug pruned
|
|
13
|
+
// the 'src' directory (which does not itself match the file glob) before any
|
|
14
|
+
// nested file could be discovered - watch then silently observed nothing.
|
|
15
|
+
(0, lib_1.integTest)('cdk watch detects file changes with a directory-scoped glob pattern', (0, lib_1.withDefaultFixture)(async (fixture) => {
|
|
16
|
+
// Create a watched file nested inside a subdirectory, matched by 'src/**/*.ts'.
|
|
17
|
+
const srcDir = path.join(fixture.integTestDir, 'src');
|
|
18
|
+
fs.mkdirSync(srcDir, { recursive: true });
|
|
19
|
+
const testFile = path.join(srcDir, 'watch-test-file.ts');
|
|
20
|
+
fs.writeFileSync(testFile, 'export const initial = true;');
|
|
21
|
+
// Update cdk.json with a watch glob scoped to the 'src' directory.
|
|
22
|
+
const cdkJsonPath = path.join(fixture.integTestDir, 'cdk.json');
|
|
23
|
+
const cdkJson = JSON.parse(fs.readFileSync(cdkJsonPath, 'utf-8'));
|
|
24
|
+
cdkJson.watch = {
|
|
25
|
+
include: ['src/**/*.ts'],
|
|
26
|
+
};
|
|
27
|
+
fs.writeFileSync(cdkJsonPath, JSON.stringify(cdkJson, null, 2));
|
|
28
|
+
await fixture.cli.makeCliAvailable();
|
|
29
|
+
let output = '';
|
|
30
|
+
// Start cdk watch
|
|
31
|
+
const watchProcess = child_process.spawn('cdk', [
|
|
32
|
+
'watch', '--hotswap', '-v', fixture.fullStackName('test-1'),
|
|
33
|
+
], {
|
|
34
|
+
cwd: fixture.integTestDir,
|
|
35
|
+
stdio: 'pipe',
|
|
36
|
+
env: { ...process.env, ...fixture.cdkShellEnv() },
|
|
37
|
+
});
|
|
38
|
+
try {
|
|
39
|
+
watchProcess.stdout?.on('data', (data) => {
|
|
40
|
+
output += data.toString();
|
|
41
|
+
fixture.log(data.toString());
|
|
42
|
+
});
|
|
43
|
+
watchProcess.stderr?.on('data', (data) => {
|
|
44
|
+
output += data.toString();
|
|
45
|
+
fixture.log(data.toString());
|
|
46
|
+
});
|
|
47
|
+
await (0, watch_helpers_1.waitForOutput)(() => output, "Triggering initial 'cdk deploy'");
|
|
48
|
+
fixture.log('✓ Watch start detected');
|
|
49
|
+
await (0, watch_helpers_1.waitForOutput)(() => output, 'deployment time');
|
|
50
|
+
fixture.log('✓ Initial deployment completed');
|
|
51
|
+
// Modify the nested file to trigger a watch event. Before the fix the
|
|
52
|
+
// 'src' directory was pruned, so this change was never detected.
|
|
53
|
+
fs.writeFileSync(testFile, 'export const modified = true;');
|
|
54
|
+
await (0, watch_helpers_1.waitForOutput)(() => output, 'Detected change to');
|
|
55
|
+
fixture.log('✓ Watch detected change to file nested under a directory-scoped glob');
|
|
56
|
+
// Wait for the second deployment to complete (2 occurrences of 'deployment time')
|
|
57
|
+
await (0, watch_helpers_1.waitForCondition)(() => (output.match(/deployment time/g) || []).length >= 2);
|
|
58
|
+
fixture.log('✓ Second deployment completed');
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
(0, watch_helpers_1.safeKillProcess)(watchProcess);
|
|
62
|
+
}
|
|
63
|
+
expect.assertions(4);
|
|
64
|
+
}));
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLXdhdGNoLWRldGVjdHMtZmlsZS1jaGFuZ2VzLXdpdGgtZGlyZWN0b3J5LXNjb3BlZC1nbG9iLmludGVndGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNkay13YXRjaC1kZXRlY3RzLWZpbGUtY2hhbmdlcy13aXRoLWRpcmVjdG9yeS1zY29wZWQtZ2xvYi5pbnRlZ3Rlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwrQ0FBK0M7QUFDL0MseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3QixtREFBbUY7QUFDbkYsc0NBQTZEO0FBRTdELElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLDRCQUE0QjtBQUU1RCxzRUFBc0U7QUFDdEUsMEVBQTBFO0FBQzFFLHdFQUF3RTtBQUN4RSw4RUFBOEU7QUFDOUUsNkVBQTZFO0FBQzdFLDBFQUEwRTtBQUMxRSxJQUFBLGVBQVMsRUFDUCxxRUFBcUUsRUFDckUsSUFBQSx3QkFBa0IsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDbkMsZ0ZBQWdGO0lBQ2hGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN0RCxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFDekQsRUFBRSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsOEJBQThCLENBQUMsQ0FBQztJQUUzRCxtRUFBbUU7SUFDbkUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNsRSxPQUFPLENBQUMsS0FBSyxHQUFHO1FBQ2QsT0FBTyxFQUFFLENBQUMsYUFBYSxDQUFDO0tBQ3pCLENBQUM7SUFDRixFQUFFLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVoRSxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUVyQyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFFaEIsa0JBQWtCO0lBQ2xCLE1BQU0sWUFBWSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFO1FBQzlDLE9BQU8sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDO0tBQzVELEVBQUU7UUFDRCxHQUFHLEVBQUUsT0FBTyxDQUFDLFlBQVk7UUFDekIsS0FBSyxFQUFFLE1BQU07UUFDYixHQUFHLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUU7S0FDbEQsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDO1FBQ0gsWUFBWSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDdkMsTUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMxQixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO1FBQ0gsWUFBWSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDdkMsTUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMxQixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxJQUFBLDZCQUFhLEVBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLGlDQUFpQyxDQUFDLENBQUM7UUFDckUsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBRXRDLE1BQU0sSUFBQSw2QkFBYSxFQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3JELE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUU5QyxzRUFBc0U7UUFDdEUsaUVBQWlFO1FBQ2pFLEVBQUUsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLCtCQUErQixDQUFDLENBQUM7UUFFNUQsTUFBTSxJQUFBLDZCQUFhLEVBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFDeEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzRUFBc0UsQ0FBQyxDQUFDO1FBRXBGLGtGQUFrRjtRQUNsRixNQUFNLElBQUEsZ0NBQWdCLEVBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ25GLE9BQU8sQ0FBQyxHQUFHLENBQUMsK0JBQStCLENBQUMsQ0FBQztJQUMvQyxDQUFDO1lBQVMsQ0FBQztRQUNULElBQUEsK0JBQWUsRUFBQyxZQUFZLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixDQUFDLENBQUMsQ0FDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2hpbGRfcHJvY2VzcyBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyB3YWl0Rm9yT3V0cHV0LCB3YWl0Rm9yQ29uZGl0aW9uLCBzYWZlS2lsbFByb2Nlc3MgfSBmcm9tICcuL3dhdGNoLWhlbHBlcnMnO1xuaW1wb3J0IHsgaW50ZWdUZXN0LCB3aXRoRGVmYXVsdEZpeHR1cmUgfSBmcm9tICcuLi8uLi8uLi9saWInO1xuXG5qZXN0LnNldFRpbWVvdXQoNSAqIDYwICogMTAwMCk7IC8vIDUgbWludXRlcyBmb3Igd2F0Y2ggdGVzdHNcblxuLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGstY2xpL2lzc3Vlcy8xNjQ3OlxuLy8gYSB1c2VyLXN1cHBsaWVkIGdsb2Igc2NvcGVkIHRvIGEgc3ViZGlyZWN0b3J5IChlLmcuICdzcmMvKiovKi50cycpIG11c3Rcbi8vIGRldGVjdCBjaGFuZ2VzIHRvIGZpbGVzIG5lc3RlZCBpbnNpZGUgdGhhdCBkaXJlY3RvcnkuIFRoZSBjaG9raWRhciB2NFxuLy8gYGlnbm9yZWRgIGNhbGxiYWNrIGFsc28gZ2F0ZXMgZGlyZWN0b3J5IHRyYXZlcnNhbCwgc28gYW4gZWFybGllciBidWcgcHJ1bmVkXG4vLyB0aGUgJ3NyYycgZGlyZWN0b3J5ICh3aGljaCBkb2VzIG5vdCBpdHNlbGYgbWF0Y2ggdGhlIGZpbGUgZ2xvYikgYmVmb3JlIGFueVxuLy8gbmVzdGVkIGZpbGUgY291bGQgYmUgZGlzY292ZXJlZCAtIHdhdGNoIHRoZW4gc2lsZW50bHkgb2JzZXJ2ZWQgbm90aGluZy5cbmludGVnVGVzdChcbiAgJ2NkayB3YXRjaCBkZXRlY3RzIGZpbGUgY2hhbmdlcyB3aXRoIGEgZGlyZWN0b3J5LXNjb3BlZCBnbG9iIHBhdHRlcm4nLFxuICB3aXRoRGVmYXVsdEZpeHR1cmUoYXN5bmMgKGZpeHR1cmUpID0+IHtcbiAgICAvLyBDcmVhdGUgYSB3YXRjaGVkIGZpbGUgbmVzdGVkIGluc2lkZSBhIHN1YmRpcmVjdG9yeSwgbWF0Y2hlZCBieSAnc3JjLyoqLyoudHMnLlxuICAgIGNvbnN0IHNyY0RpciA9IHBhdGguam9pbihmaXh0dXJlLmludGVnVGVzdERpciwgJ3NyYycpO1xuICAgIGZzLm1rZGlyU3luYyhzcmNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGNvbnN0IHRlc3RGaWxlID0gcGF0aC5qb2luKHNyY0RpciwgJ3dhdGNoLXRlc3QtZmlsZS50cycpO1xuICAgIGZzLndyaXRlRmlsZVN5bmModGVzdEZpbGUsICdleHBvcnQgY29uc3QgaW5pdGlhbCA9IHRydWU7Jyk7XG5cbiAgICAvLyBVcGRhdGUgY2RrLmpzb24gd2l0aCBhIHdhdGNoIGdsb2Igc2NvcGVkIHRvIHRoZSAnc3JjJyBkaXJlY3RvcnkuXG4gICAgY29uc3QgY2RrSnNvblBhdGggPSBwYXRoLmpvaW4oZml4dHVyZS5pbnRlZ1Rlc3REaXIsICdjZGsuanNvbicpO1xuICAgIGNvbnN0IGNka0pzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhjZGtKc29uUGF0aCwgJ3V0Zi04JykpO1xuICAgIGNka0pzb24ud2F0Y2ggPSB7XG4gICAgICBpbmNsdWRlOiBbJ3NyYy8qKi8qLnRzJ10sXG4gICAgfTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGNka0pzb25QYXRoLCBKU09OLnN0cmluZ2lmeShjZGtKc29uLCBudWxsLCAyKSk7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNsaS5tYWtlQ2xpQXZhaWxhYmxlKCk7XG5cbiAgICBsZXQgb3V0cHV0ID0gJyc7XG5cbiAgICAvLyBTdGFydCBjZGsgd2F0Y2hcbiAgICBjb25zdCB3YXRjaFByb2Nlc3MgPSBjaGlsZF9wcm9jZXNzLnNwYXduKCdjZGsnLCBbXG4gICAgICAnd2F0Y2gnLCAnLS1ob3Rzd2FwJywgJy12JywgZml4dHVyZS5mdWxsU3RhY2tOYW1lKCd0ZXN0LTEnKSxcbiAgICBdLCB7XG4gICAgICBjd2Q6IGZpeHR1cmUuaW50ZWdUZXN0RGlyLFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4uZml4dHVyZS5jZGtTaGVsbEVudigpIH0sXG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgd2F0Y2hQcm9jZXNzLnN0ZG91dD8ub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICBvdXRwdXQgKz0gZGF0YS50b1N0cmluZygpO1xuICAgICAgICBmaXh0dXJlLmxvZyhkYXRhLnRvU3RyaW5nKCkpO1xuICAgICAgfSk7XG4gICAgICB3YXRjaFByb2Nlc3Muc3RkZXJyPy5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgIG91dHB1dCArPSBkYXRhLnRvU3RyaW5nKCk7XG4gICAgICAgIGZpeHR1cmUubG9nKGRhdGEudG9TdHJpbmcoKSk7XG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgd2FpdEZvck91dHB1dCgoKSA9PiBvdXRwdXQsIFwiVHJpZ2dlcmluZyBpbml0aWFsICdjZGsgZGVwbG95J1wiKTtcbiAgICAgIGZpeHR1cmUubG9nKCfinJMgV2F0Y2ggc3RhcnQgZGV0ZWN0ZWQnKTtcblxuICAgICAgYXdhaXQgd2FpdEZvck91dHB1dCgoKSA9PiBvdXRwdXQsICdkZXBsb3ltZW50IHRpbWUnKTtcbiAgICAgIGZpeHR1cmUubG9nKCfinJMgSW5pdGlhbCBkZXBsb3ltZW50IGNvbXBsZXRlZCcpO1xuXG4gICAgICAvLyBNb2RpZnkgdGhlIG5lc3RlZCBmaWxlIHRvIHRyaWdnZXIgYSB3YXRjaCBldmVudC4gQmVmb3JlIHRoZSBmaXggdGhlXG4gICAgICAvLyAnc3JjJyBkaXJlY3Rvcnkgd2FzIHBydW5lZCwgc28gdGhpcyBjaGFuZ2Ugd2FzIG5ldmVyIGRldGVjdGVkLlxuICAgICAgZnMud3JpdGVGaWxlU3luYyh0ZXN0RmlsZSwgJ2V4cG9ydCBjb25zdCBtb2RpZmllZCA9IHRydWU7Jyk7XG5cbiAgICAgIGF3YWl0IHdhaXRGb3JPdXRwdXQoKCkgPT4gb3V0cHV0LCAnRGV0ZWN0ZWQgY2hhbmdlIHRvJyk7XG4gICAgICBmaXh0dXJlLmxvZygn4pyTIFdhdGNoIGRldGVjdGVkIGNoYW5nZSB0byBmaWxlIG5lc3RlZCB1bmRlciBhIGRpcmVjdG9yeS1zY29wZWQgZ2xvYicpO1xuXG4gICAgICAvLyBXYWl0IGZvciB0aGUgc2Vjb25kIGRlcGxveW1lbnQgdG8gY29tcGxldGUgKDIgb2NjdXJyZW5jZXMgb2YgJ2RlcGxveW1lbnQgdGltZScpXG4gICAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKCgpID0+IChvdXRwdXQubWF0Y2goL2RlcGxveW1lbnQgdGltZS9nKSB8fCBbXSkubGVuZ3RoID49IDIpO1xuICAgICAgZml4dHVyZS5sb2coJ+KckyBTZWNvbmQgZGVwbG95bWVudCBjb21wbGV0ZWQnKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2FmZUtpbGxQcm9jZXNzKHdhdGNoUHJvY2Vzcyk7XG4gICAgfVxuXG4gICAgZXhwZWN0LmFzc2VydGlvbnMoNCk7XG4gIH0pLFxuKTtcbiJdfQ==
|