@aws-cdk-testing/cli-integ 3.21.2 → 3.22.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.
package/package.json CHANGED
@@ -39,7 +39,7 @@
39
39
  "organization": true
40
40
  },
41
41
  "devDependencies": {
42
- "@aws-cdk/toolkit-lib": "1.13.0",
42
+ "@aws-cdk/toolkit-lib": "1.14.0",
43
43
  "@aws-cdk/yarn-cling": "0.0.0",
44
44
  "@cdklabs/eslint-plugin": "^1.3.5",
45
45
  "@stylistic/eslint-plugin": "^3",
@@ -80,7 +80,7 @@
80
80
  "@aws-sdk/client-sso": "^3.953.0",
81
81
  "@aws-sdk/client-sts": "^3.953.0",
82
82
  "@aws-sdk/credential-providers": "^3.953.0",
83
- "@cdklabs/cdk-atmosphere-client": "^0.0.79",
83
+ "@cdklabs/cdk-atmosphere-client": "^0.0.84",
84
84
  "@octokit/rest": "^20",
85
85
  "@smithy/types": "^4.10.0",
86
86
  "@smithy/util-retry": "^4.2.6",
@@ -116,7 +116,7 @@
116
116
  "publishConfig": {
117
117
  "access": "public"
118
118
  },
119
- "version": "3.21.2",
119
+ "version": "3.22.0",
120
120
  "types": "lib/index.d.ts",
121
121
  "//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\"."
122
122
  }
@@ -32,6 +32,7 @@ if (process.env.PACKAGE_LAYOUT_VERSION === '1') {
32
32
  aws_lambda_nodejs: node_lambda,
33
33
  aws_ecr_assets: docker,
34
34
  aws_appsync: appsync,
35
+ aws_bedrockagentcore: bedrockagentcore,
35
36
  Stack
36
37
  } = require('aws-cdk-lib');
37
38
  }
@@ -672,6 +673,44 @@ class EcsHotswapStack extends cdk.Stack {
672
673
  }
673
674
  }
674
675
 
676
+ class AgentCoreHotswapStack extends cdk.Stack {
677
+ constructor(parent, id, props) {
678
+ super(parent, id, props);
679
+
680
+ const role = new iam.Role(this, 'RuntimeRole', {
681
+ assumedBy: new iam.ServicePrincipal('bedrock-agentcore.amazonaws.com'),
682
+ managedPolicies: [
683
+ iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonBedrockFullAccess'),
684
+ ],
685
+ });
686
+
687
+ const image = new docker.DockerImageAsset(this, 'Image', {
688
+ directory: path.join(__dirname, 'docker'),
689
+ platform: docker.Platform.LINUX_ARM64,
690
+ });
691
+ image.repository.grantPull(role);
692
+
693
+ const runtime = new bedrockagentcore.CfnRuntime(this, 'Runtime', {
694
+ agentRuntimeName: 'test_runtime',
695
+ roleArn: role.roleArn,
696
+ networkConfiguration: {
697
+ networkMode: 'PUBLIC',
698
+ },
699
+ agentRuntimeArtifact: {
700
+ containerConfiguration: {
701
+ containerUri: image.imageUri,
702
+ },
703
+ },
704
+ description: process.env.DYNAMIC_BEDROCK_RUNTIME_DESCRIPTION ?? 'runtime',
705
+ environmentVariables: {
706
+ TEST_VAR: process.env.DYNAMIC_BEDROCK_RUNTIME_ENV_VAR ?? 'original',
707
+ },
708
+ });
709
+ runtime.node.addDependency(role);
710
+ new cdk.CfnOutput(this, 'RuntimeId', { value: runtime.ref });
711
+ }
712
+ }
713
+
675
714
  class DockerStack extends cdk.Stack {
676
715
  constructor(parent, id, props) {
677
716
  super(parent, id, props);
@@ -928,6 +967,7 @@ switch (stackSet) {
928
967
  new SessionTagsWithNoExecutionRoleCustomSynthesizerStack(app, `${stackPrefix}-session-tags-with-custom-synthesizer`);
929
968
  new LambdaHotswapStack(app, `${stackPrefix}-lambda-hotswap`);
930
969
  new EcsHotswapStack(app, `${stackPrefix}-ecs-hotswap`);
970
+ new AgentCoreHotswapStack(app, `${stackPrefix}-agentcore-hotswap`);
931
971
  new AppSyncHotswapStack(app, `${stackPrefix}-appsync-hotswap`);
932
972
  new DockerStack(app, `${stackPrefix}-docker`);
933
973
  new DockerInUseStack(app, `${stackPrefix}-docker-in-use`);
@@ -14,5 +14,5 @@ jest.setTimeout(2 * 60 * 60_000); // Includes the time to acquire locks, worst-c
14
14
  '--yes',
15
15
  ]);
16
16
  expect(output).toContain('Flag changes:');
17
- }), true));
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWZsYWdzLXdpdGgtY2xpLWNvbnRleHQuaW50ZWd0ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2RrLWZsYWdzLXdpdGgtY2xpLWNvbnRleHQuaW50ZWd0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNFO0FBRXRFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLHlFQUF5RTtBQUUzRyxJQUFBLGVBQVMsRUFDUCxpREFBaUQsRUFDakQsSUFBQSxhQUFPLEVBQ0wsSUFBQSx3QkFBa0IsRUFBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO0lBQ2xELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLENBQUMsQ0FBQyxDQUFDO0lBRW5FLE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUMvQixPQUFPO1FBQ1Asa0JBQWtCO1FBQ2xCLE9BQU87UUFDUCxlQUFlO1FBQ2YsT0FBTztRQUNQLElBQUksRUFBRSwwQkFBMEI7UUFDaEMsT0FBTztLQUNSLENBQUMsQ0FBQztJQUVILE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDNUMsQ0FBQyxDQUFDLEVBQ0YsSUFBSSxDQUNMLENBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGludGVnVGVzdCwgd2l0aEF3cywgd2l0aFNwZWNpZmljQ2RrQXBwIH0gZnJvbSAnLi4vLi4vLi4vbGliJztcblxuamVzdC5zZXRUaW1lb3V0KDIgKiA2MCAqIDYwXzAwMCk7IC8vIEluY2x1ZGVzIHRoZSB0aW1lIHRvIGFjcXVpcmUgbG9ja3MsIHdvcnN0LWNhc2Ugc2luZ2xlLXRocmVhZGVkIHJ1bnRpbWVcblxuaW50ZWdUZXN0KFxuICAnZmxhZ3MgY29tbWFuZCB3b3JrcyB3aXRoIENMSSBjb250ZXh0IHBhcmFtZXRlcnMnLFxuICB3aXRoQXdzKFxuICAgIHdpdGhTcGVjaWZpY0Nka0FwcCgnY29udGV4dC1hcHAnLCBhc3luYyAoZml4dHVyZSkgPT4ge1xuICAgICAgYXdhaXQgZml4dHVyZS5jZGsoWydib290c3RyYXAnLCAnLWMnLCAnbXlDb250ZXh0UGFyYW09dGVzdFZhbHVlJ10pO1xuXG4gICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBmaXh0dXJlLmNkayhbXG4gICAgICAgICdmbGFncycsXG4gICAgICAgICctLXVuc3RhYmxlPWZsYWdzJyxcbiAgICAgICAgJy0tc2V0JyxcbiAgICAgICAgJy0tcmVjb21tZW5kZWQnLFxuICAgICAgICAnLS1hbGwnLFxuICAgICAgICAnLWMnLCAnbXlDb250ZXh0UGFyYW09dGVzdFZhbHVlJyxcbiAgICAgICAgJy0teWVzJyxcbiAgICAgIF0pO1xuXG4gICAgICBleHBlY3Qob3V0cHV0KS50b0NvbnRhaW4oJ0ZsYWcgY2hhbmdlczonKTtcbiAgICB9KSxcbiAgICB0cnVlLFxuICApLFxuKTtcbiJdfQ==
17
+ }), { disableBootstrap: true }));
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWZsYWdzLXdpdGgtY2xpLWNvbnRleHQuaW50ZWd0ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2RrLWZsYWdzLXdpdGgtY2xpLWNvbnRleHQuaW50ZWd0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXNFO0FBRXRFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLHlFQUF5RTtBQUUzRyxJQUFBLGVBQVMsRUFDUCxpREFBaUQsRUFDakQsSUFBQSxhQUFPLEVBQ0wsSUFBQSx3QkFBa0IsRUFBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO0lBQ2xELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLENBQUMsQ0FBQyxDQUFDO0lBRW5FLE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUMvQixPQUFPO1FBQ1Asa0JBQWtCO1FBQ2xCLE9BQU87UUFDUCxlQUFlO1FBQ2YsT0FBTztRQUNQLElBQUksRUFBRSwwQkFBMEI7UUFDaEMsT0FBTztLQUNSLENBQUMsQ0FBQztJQUVILE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDNUMsQ0FBQyxDQUFDLEVBQ0YsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsQ0FDM0IsQ0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW50ZWdUZXN0LCB3aXRoQXdzLCB3aXRoU3BlY2lmaWNDZGtBcHAgfSBmcm9tICcuLi8uLi8uLi9saWInO1xuXG5qZXN0LnNldFRpbWVvdXQoMiAqIDYwICogNjBfMDAwKTsgLy8gSW5jbHVkZXMgdGhlIHRpbWUgdG8gYWNxdWlyZSBsb2Nrcywgd29yc3QtY2FzZSBzaW5nbGUtdGhyZWFkZWQgcnVudGltZVxuXG5pbnRlZ1Rlc3QoXG4gICdmbGFncyBjb21tYW5kIHdvcmtzIHdpdGggQ0xJIGNvbnRleHQgcGFyYW1ldGVycycsXG4gIHdpdGhBd3MoXG4gICAgd2l0aFNwZWNpZmljQ2RrQXBwKCdjb250ZXh0LWFwcCcsIGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgICBhd2FpdCBmaXh0dXJlLmNkayhbJ2Jvb3RzdHJhcCcsICctYycsICdteUNvbnRleHRQYXJhbT10ZXN0VmFsdWUnXSk7XG5cbiAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IGZpeHR1cmUuY2RrKFtcbiAgICAgICAgJ2ZsYWdzJyxcbiAgICAgICAgJy0tdW5zdGFibGU9ZmxhZ3MnLFxuICAgICAgICAnLS1zZXQnLFxuICAgICAgICAnLS1yZWNvbW1lbmRlZCcsXG4gICAgICAgICctLWFsbCcsXG4gICAgICAgICctYycsICdteUNvbnRleHRQYXJhbT10ZXN0VmFsdWUnLFxuICAgICAgICAnLS15ZXMnLFxuICAgICAgXSk7XG5cbiAgICAgIGV4cGVjdChvdXRwdXQpLnRvQ29udGFpbignRmxhZyBjaGFuZ2VzOicpO1xuICAgIH0pLFxuICAgIHsgZGlzYWJsZUJvb3RzdHJhcDogdHJ1ZSB9LFxuICApLFxuKTtcbiJdfQ==
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const client_cloudformation_1 = require("@aws-sdk/client-cloudformation");
4
+ const lib_1 = require("../../../lib");
5
+ jest.setTimeout(2 * 60 * 60_000); // Includes the time to acquire locks, worst-case single-threaded runtime
6
+ (0, lib_1.integTest)('hotswap deployment supports Bedrock AgentCore Runtime', (0, lib_1.withDefaultFixture)(async (fixture) => {
7
+ // GIVEN
8
+ const stackName = 'agentcore-hotswap';
9
+ await fixture.cdkDeploy(stackName, {
10
+ captureStderr: false,
11
+ modEnv: {
12
+ DYNAMIC_BEDROCK_RUNTIME_DESCRIPTION: 'original description',
13
+ DYNAMIC_BEDROCK_RUNTIME_ENV_VAR: 'original value',
14
+ },
15
+ });
16
+ // WHEN
17
+ const deployOutput = await fixture.cdkDeploy(stackName, {
18
+ options: ['--hotswap'],
19
+ captureStderr: true,
20
+ onlyStderr: true,
21
+ modEnv: {
22
+ DYNAMIC_BEDROCK_RUNTIME_DESCRIPTION: 'new description',
23
+ DYNAMIC_BEDROCK_RUNTIME_ENV_VAR: 'new value',
24
+ },
25
+ });
26
+ const response = await fixture.aws.cloudFormation.send(new client_cloudformation_1.DescribeStacksCommand({
27
+ StackName: fixture.fullStackName(stackName),
28
+ }));
29
+ const runtimeId = response.Stacks?.[0].Outputs?.find((output) => output.OutputKey === 'RuntimeId')?.OutputValue;
30
+ // THEN
31
+ // The deployment should not trigger a full deployment, thus the stack's status must remains
32
+ // "CREATE_COMPLETE"
33
+ expect(response.Stacks?.[0].StackStatus).toEqual('CREATE_COMPLETE');
34
+ // The entire string fails locally due to formatting. Making this test less specific
35
+ expect(deployOutput).toMatch(/hotswapped!/);
36
+ expect(deployOutput).toContain(runtimeId);
37
+ }, {
38
+ aws: {
39
+ // Bedrock AgentCore Runtime is only available in specific regions
40
+ // Source: https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/agentcore-regions.html
41
+ regions: [
42
+ 'ap-south-1',
43
+ 'ap-southeast-1',
44
+ 'ap-southeast-2',
45
+ 'ap-northeast-1',
46
+ 'eu-west-1',
47
+ 'eu-central-1',
48
+ 'us-east-1',
49
+ 'us-east-2',
50
+ 'us-west-2',
51
+ ],
52
+ },
53
+ }));
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWhvdHN3YXAtZGVwbG95bWVudC1zdXBwb3J0cy1iZWRyb2NrLWFnZW50Y29yZS1ydW50aW1lLmludGVndGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNkay1ob3Rzd2FwLWRlcGxveW1lbnQtc3VwcG9ydHMtYmVkcm9jay1hZ2VudGNvcmUtcnVudGltZS5pbnRlZ3Rlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwwRUFBdUU7QUFDdkUsc0NBQTZEO0FBRTdELElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLHlFQUF5RTtBQUUzRyxJQUFBLGVBQVMsRUFDUCx1REFBdUQsRUFDdkQsSUFBQSx3QkFBa0IsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDbkMsUUFBUTtJQUNSLE1BQU0sU0FBUyxHQUFHLG1CQUFtQixDQUFDO0lBQ3RDLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUU7UUFDakMsYUFBYSxFQUFFLEtBQUs7UUFDcEIsTUFBTSxFQUFFO1lBQ04sbUNBQW1DLEVBQUUsc0JBQXNCO1lBQzNELCtCQUErQixFQUFFLGdCQUFnQjtTQUNsRDtLQUNGLENBQUMsQ0FBQztJQUVILE9BQU87SUFDUCxNQUFNLFlBQVksR0FBRyxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFO1FBQ3RELE9BQU8sRUFBRSxDQUFDLFdBQVcsQ0FBQztRQUN0QixhQUFhLEVBQUUsSUFBSTtRQUNuQixVQUFVLEVBQUUsSUFBSTtRQUNoQixNQUFNLEVBQUU7WUFDTixtQ0FBbUMsRUFBRSxpQkFBaUI7WUFDdEQsK0JBQStCLEVBQUUsV0FBVztTQUM3QztLQUNGLENBQUMsQ0FBQztJQUVILE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUNwRCxJQUFJLDZDQUFxQixDQUFDO1FBQ3hCLFNBQVMsRUFBRSxPQUFPLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQztLQUM1QyxDQUFDLENBQ0gsQ0FBQztJQUNGLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxLQUFLLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQztJQUVoSCxPQUFPO0lBRVAsNEZBQTRGO0lBQzVGLG9CQUFvQjtJQUNwQixNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3BFLG9GQUFvRjtJQUNwRixNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDNUMsQ0FBQyxFQUFFO0lBQ0QsR0FBRyxFQUFFO1FBQ0gsa0VBQWtFO1FBQ2xFLCtGQUErRjtRQUMvRixPQUFPLEVBQUU7WUFDUCxZQUFZO1lBQ1osZ0JBQWdCO1lBQ2hCLGdCQUFnQjtZQUNoQixnQkFBZ0I7WUFDaEIsV0FBVztZQUNYLGNBQWM7WUFDZCxXQUFXO1lBQ1gsV0FBVztZQUNYLFdBQVc7U0FDWjtLQUNGO0NBQ0YsQ0FBQyxDQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZXNjcmliZVN0YWNrc0NvbW1hbmQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHsgaW50ZWdUZXN0LCB3aXRoRGVmYXVsdEZpeHR1cmUgfSBmcm9tICcuLi8uLi8uLi9saWInO1xuXG5qZXN0LnNldFRpbWVvdXQoMiAqIDYwICogNjBfMDAwKTsgLy8gSW5jbHVkZXMgdGhlIHRpbWUgdG8gYWNxdWlyZSBsb2Nrcywgd29yc3QtY2FzZSBzaW5nbGUtdGhyZWFkZWQgcnVudGltZVxuXG5pbnRlZ1Rlc3QoXG4gICdob3Rzd2FwIGRlcGxveW1lbnQgc3VwcG9ydHMgQmVkcm9jayBBZ2VudENvcmUgUnVudGltZScsXG4gIHdpdGhEZWZhdWx0Rml4dHVyZShhc3luYyAoZml4dHVyZSkgPT4ge1xuICAgIC8vIEdJVkVOXG4gICAgY29uc3Qgc3RhY2tOYW1lID0gJ2FnZW50Y29yZS1ob3Rzd2FwJztcbiAgICBhd2FpdCBmaXh0dXJlLmNka0RlcGxveShzdGFja05hbWUsIHtcbiAgICAgIGNhcHR1cmVTdGRlcnI6IGZhbHNlLFxuICAgICAgbW9kRW52OiB7XG4gICAgICAgIERZTkFNSUNfQkVEUk9DS19SVU5USU1FX0RFU0NSSVBUSU9OOiAnb3JpZ2luYWwgZGVzY3JpcHRpb24nLFxuICAgICAgICBEWU5BTUlDX0JFRFJPQ0tfUlVOVElNRV9FTlZfVkFSOiAnb3JpZ2luYWwgdmFsdWUnLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIFdIRU5cbiAgICBjb25zdCBkZXBsb3lPdXRwdXQgPSBhd2FpdCBmaXh0dXJlLmNka0RlcGxveShzdGFja05hbWUsIHtcbiAgICAgIG9wdGlvbnM6IFsnLS1ob3Rzd2FwJ10sXG4gICAgICBjYXB0dXJlU3RkZXJyOiB0cnVlLFxuICAgICAgb25seVN0ZGVycjogdHJ1ZSxcbiAgICAgIG1vZEVudjoge1xuICAgICAgICBEWU5BTUlDX0JFRFJPQ0tfUlVOVElNRV9ERVNDUklQVElPTjogJ25ldyBkZXNjcmlwdGlvbicsXG4gICAgICAgIERZTkFNSUNfQkVEUk9DS19SVU5USU1FX0VOVl9WQVI6ICduZXcgdmFsdWUnLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZml4dHVyZS5hd3MuY2xvdWRGb3JtYXRpb24uc2VuZChcbiAgICAgIG5ldyBEZXNjcmliZVN0YWNrc0NvbW1hbmQoe1xuICAgICAgICBTdGFja05hbWU6IGZpeHR1cmUuZnVsbFN0YWNrTmFtZShzdGFja05hbWUpLFxuICAgICAgfSksXG4gICAgKTtcbiAgICBjb25zdCBydW50aW1lSWQgPSByZXNwb25zZS5TdGFja3M/LlswXS5PdXRwdXRzPy5maW5kKChvdXRwdXQpID0+IG91dHB1dC5PdXRwdXRLZXkgPT09ICdSdW50aW1lSWQnKT8uT3V0cHV0VmFsdWU7XG5cbiAgICAvLyBUSEVOXG5cbiAgICAvLyBUaGUgZGVwbG95bWVudCBzaG91bGQgbm90IHRyaWdnZXIgYSBmdWxsIGRlcGxveW1lbnQsIHRodXMgdGhlIHN0YWNrJ3Mgc3RhdHVzIG11c3QgcmVtYWluc1xuICAgIC8vIFwiQ1JFQVRFX0NPTVBMRVRFXCJcbiAgICBleHBlY3QocmVzcG9uc2UuU3RhY2tzPy5bMF0uU3RhY2tTdGF0dXMpLnRvRXF1YWwoJ0NSRUFURV9DT01QTEVURScpO1xuICAgIC8vIFRoZSBlbnRpcmUgc3RyaW5nIGZhaWxzIGxvY2FsbHkgZHVlIHRvIGZvcm1hdHRpbmcuIE1ha2luZyB0aGlzIHRlc3QgbGVzcyBzcGVjaWZpY1xuICAgIGV4cGVjdChkZXBsb3lPdXRwdXQpLnRvTWF0Y2goL2hvdHN3YXBwZWQhLyk7XG4gICAgZXhwZWN0KGRlcGxveU91dHB1dCkudG9Db250YWluKHJ1bnRpbWVJZCk7XG4gIH0sIHtcbiAgICBhd3M6IHtcbiAgICAgIC8vIEJlZHJvY2sgQWdlbnRDb3JlIFJ1bnRpbWUgaXMgb25seSBhdmFpbGFibGUgaW4gc3BlY2lmaWMgcmVnaW9uc1xuICAgICAgLy8gU291cmNlOiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYmVkcm9jay1hZ2VudGNvcmUvbGF0ZXN0L2Rldmd1aWRlL2FnZW50Y29yZS1yZWdpb25zLmh0bWxcbiAgICAgIHJlZ2lvbnM6IFtcbiAgICAgICAgJ2FwLXNvdXRoLTEnLFxuICAgICAgICAnYXAtc291dGhlYXN0LTEnLFxuICAgICAgICAnYXAtc291dGhlYXN0LTInLFxuICAgICAgICAnYXAtbm9ydGhlYXN0LTEnLFxuICAgICAgICAnZXUtd2VzdC0xJyxcbiAgICAgICAgJ2V1LWNlbnRyYWwtMScsXG4gICAgICAgICd1cy1lYXN0LTEnLFxuICAgICAgICAndXMtZWFzdC0yJyxcbiAgICAgICAgJ3VzLXdlc3QtMicsXG4gICAgICBdLFxuICAgIH0sXG4gIH0pLFxuKTtcbiJdfQ==