@fjall/components-infrastructure 0.75.3 → 0.77.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/app.d.ts +125 -20
- package/dist/lib/app.js +171 -56
- package/dist/lib/aspects/resourceInventory.d.ts +41 -0
- package/dist/lib/aspects/resourceInventory.js +56 -0
- package/dist/lib/config/audit.d.ts +18 -0
- package/dist/lib/config/audit.js +22 -0
- package/dist/lib/config/aws/backupGlobalSettings.d.ts +1 -1
- package/dist/lib/config/aws/backupGlobalSettings.js +1 -1
- package/dist/lib/config/aws/cloudTrail.d.ts +1 -1
- package/dist/lib/config/aws/cloudTrail.js +2 -2
- package/dist/lib/config/aws/disasterRecovery.js +1 -1
- package/dist/lib/config/aws/ecrDefaultImage.d.ts +1 -1
- package/dist/lib/config/aws/ecrDefaultImage.js +4 -4
- package/dist/lib/config/aws/identityCenter.d.ts +3 -3
- package/dist/lib/config/aws/identityCenter.js +1 -1
- package/dist/lib/config/aws/identityCenterGroupMembership.d.ts +2 -2
- package/dist/lib/config/aws/identityCenterGroupMembership.js +1 -1
- package/dist/lib/config/aws/ipam.js +2 -4
- package/dist/lib/config/aws/organisation.d.ts +3 -3
- package/dist/lib/config/aws/organisation.js +1 -1
- package/dist/lib/config/aws/organisationsAccess.d.ts +1 -1
- package/dist/lib/config/aws/organisationsAccess.js +1 -1
- package/dist/lib/config/monitoring.d.ts +18 -0
- package/dist/lib/config/monitoring.js +22 -0
- package/dist/lib/patterns/aws/auditRole.d.ts +44 -0
- package/dist/lib/patterns/aws/auditRole.js +58 -0
- package/dist/lib/patterns/aws/buildkite.d.ts +3 -3
- package/dist/lib/patterns/aws/buildkite.js +1 -1
- package/dist/lib/patterns/aws/compute.d.ts +17 -11
- package/dist/lib/patterns/aws/compute.js +7 -7
- package/dist/lib/patterns/aws/database.d.ts +185 -24
- package/dist/lib/patterns/aws/database.js +280 -42
- package/dist/lib/patterns/aws/ec2.d.ts +43 -0
- package/dist/lib/patterns/aws/ec2.js +123 -0
- package/dist/lib/patterns/aws/fivetranProxy.d.ts +5 -5
- package/dist/lib/patterns/aws/fivetranProxy.js +1 -1
- package/dist/lib/patterns/aws/hostedZone.d.ts +2 -2
- package/dist/lib/patterns/aws/hostedZone.js +1 -1
- package/dist/lib/patterns/aws/index.d.ts +1 -0
- package/dist/lib/patterns/aws/index.js +2 -1
- package/dist/lib/patterns/aws/managedAccount.d.ts +2 -2
- package/dist/lib/patterns/aws/managedAccount.js +1 -1
- package/dist/lib/patterns/aws/managedIdentityCenter.js +1 -1
- package/dist/lib/patterns/aws/managedOrganisation.d.ts +3 -3
- package/dist/lib/patterns/aws/managedOrganisation.js +1 -1
- package/dist/lib/patterns/aws/managedPlatform.d.ts +2 -2
- package/dist/lib/patterns/aws/managedPlatform.js +2 -4
- package/dist/lib/patterns/aws/network.d.ts +75 -0
- package/dist/lib/patterns/aws/network.js +99 -0
- package/dist/lib/patterns/aws/storage.d.ts +4 -55
- package/dist/lib/patterns/aws/storage.js +3 -103
- package/dist/lib/resources/aws/audit/auditRole.d.ts +32 -0
- package/dist/lib/resources/aws/audit/auditRole.js +46 -0
- package/dist/lib/resources/aws/backup/backupPlan.d.ts +2 -2
- package/dist/lib/resources/aws/backup/backupPlan.js +1 -1
- package/dist/lib/resources/aws/backup/backupVault.d.ts +2 -2
- package/dist/lib/resources/aws/backup/backupVault.js +1 -1
- package/dist/lib/resources/aws/base/awsStack.js +1 -4
- package/dist/lib/resources/aws/compute/ec2.d.ts +4 -3
- package/dist/lib/resources/aws/compute/ec2.js +5 -3
- package/dist/lib/resources/aws/compute/ecs.d.ts +9 -9
- package/dist/lib/resources/aws/compute/ecs.js +68 -20
- package/dist/lib/resources/aws/compute/ecsFreeTier.d.ts +6 -7
- package/dist/lib/resources/aws/compute/ecsFreeTier.js +17 -10
- package/dist/lib/resources/aws/compute/ecsSpot.d.ts +6 -7
- package/dist/lib/resources/aws/compute/ecsSpot.js +19 -14
- package/dist/lib/resources/aws/compute/lambda.d.ts +15 -10
- package/dist/lib/resources/aws/compute/lambda.js +27 -19
- package/dist/lib/resources/aws/database/database.d.ts +2 -2
- package/dist/lib/resources/aws/database/database.js +1 -1
- package/dist/lib/resources/aws/database/databaseInstance.d.ts +2 -2
- package/dist/lib/resources/aws/database/databaseInstance.js +2 -2
- package/dist/lib/resources/aws/database/index.d.ts +0 -1
- package/dist/lib/resources/aws/database/index.js +1 -2
- package/dist/lib/resources/aws/database/rdsAurora.d.ts +24 -6
- package/dist/lib/resources/aws/database/rdsAurora.js +212 -85
- package/dist/lib/resources/aws/database/rdsAuroraGlobal.d.ts +41 -6
- package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +38 -8
- package/dist/lib/resources/aws/database/rdsInstance.d.ts +19 -10
- package/dist/lib/resources/aws/database/rdsInstance.js +220 -73
- package/dist/lib/resources/aws/iam/identityCenter/assignment.d.ts +1 -1
- package/dist/lib/resources/aws/iam/identityCenter/assignment.js +1 -1
- package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.d.ts +1 -1
- package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.js +1 -1
- package/dist/lib/resources/aws/iam/identityCenter/group.d.ts +1 -1
- package/dist/lib/resources/aws/iam/identityCenter/group.js +1 -1
- package/dist/lib/resources/aws/iam/identityCenter/permissionSet.d.ts +2 -2
- package/dist/lib/resources/aws/iam/identityCenter/permissionSet.js +1 -1
- package/dist/lib/resources/aws/iam/instanceProfile.d.ts +1 -1
- package/dist/lib/resources/aws/iam/instanceProfile.js +1 -1
- package/dist/lib/resources/aws/iam/managedPolicy.d.ts +1 -1
- package/dist/lib/resources/aws/iam/managedPolicy.js +1 -1
- package/dist/lib/resources/aws/iam/policy.d.ts +1 -1
- package/dist/lib/resources/aws/iam/policy.js +1 -1
- package/dist/lib/resources/aws/iam/role.d.ts +1 -1
- package/dist/lib/resources/aws/iam/role.js +1 -1
- package/dist/lib/resources/aws/iam/securityGroup.d.ts +1 -1
- package/dist/lib/resources/aws/iam/securityGroup.js +1 -1
- package/dist/lib/resources/aws/index.d.ts +1 -0
- package/dist/lib/resources/aws/index.js +2 -1
- package/dist/lib/resources/aws/logging/logGroup.d.ts +2 -2
- package/dist/lib/resources/aws/logging/logGroup.js +1 -1
- package/dist/lib/resources/aws/monitoring/index.d.ts +1 -0
- package/dist/lib/resources/aws/monitoring/index.js +18 -0
- package/dist/lib/resources/aws/monitoring/monitoringRole.d.ts +28 -0
- package/dist/lib/resources/aws/monitoring/monitoringRole.js +69 -0
- package/dist/lib/resources/aws/networking/index.d.ts +0 -1
- package/dist/lib/resources/aws/networking/index.js +1 -2
- package/dist/lib/resources/aws/networking/ipam.d.ts +1 -1
- package/dist/lib/resources/aws/networking/ipam.js +1 -1
- package/dist/lib/resources/aws/networking/ipamPool.d.ts +1 -1
- package/dist/lib/resources/aws/networking/ipamPool.js +1 -2
- package/dist/lib/resources/aws/networking/vpc.d.ts +42 -23
- package/dist/lib/resources/aws/networking/vpc.js +185 -36
- package/dist/lib/resources/aws/secrets/alias.d.ts +1 -1
- package/dist/lib/resources/aws/secrets/alias.js +1 -1
- package/dist/lib/resources/aws/secrets/parameter.d.ts +1 -1
- package/dist/lib/resources/aws/secrets/parameter.js +1 -1
- package/dist/lib/resources/aws/secrets/secret.d.ts +8 -4
- package/dist/lib/resources/aws/secrets/secret.js +19 -2
- package/dist/lib/resources/aws/storage/ecr.d.ts +4 -4
- package/dist/lib/resources/aws/storage/ecr.js +1 -1
- package/dist/lib/resources/aws/storage/s3.d.ts +2 -2
- package/dist/lib/resources/aws/storage/s3.js +1 -1
- package/dist/lib/resources/aws/utilities/awsCustomResource.d.ts +1 -1
- package/dist/lib/resources/aws/utilities/awsCustomResource.js +1 -1
- package/dist/lib/resources/aws/utilities/cfnOutput.d.ts +1 -1
- package/dist/lib/resources/aws/utilities/cfnOutput.js +1 -1
- package/dist/lib/resources/aws/utilities/codeBuild.d.ts +1 -1
- package/dist/lib/resources/aws/utilities/codeBuild.js +1 -1
- package/dist/lib/resources/aws/utilities/customResource.d.ts +9 -7
- package/dist/lib/resources/aws/utilities/customResource.js +35 -11
- package/dist/lib/resources/aws/utilities/customResourceProvider.d.ts +2 -2
- package/dist/lib/resources/aws/utilities/customResourceProvider.js +1 -1
- package/dist/lib/resources/aws/utilities/resourceShare.d.ts +2 -2
- package/dist/lib/resources/aws/utilities/resourceShare.js +1 -1
- package/dist/lib/utils/getAsync.d.ts +1 -1
- package/dist/lib/utils/getAsync.js +1 -1
- package/dist/lib/utils/getCidr.d.ts +8 -0
- package/dist/lib/utils/getCidr.js +40 -0
- package/dist/lib/utils/getConfig.d.ts +2 -2
- package/dist/lib/utils/getConfig.js +3 -3
- package/dist/lib/utils/index.d.ts +1 -0
- package/dist/lib/utils/index.js +2 -1
- package/dist/lib/utils/resourceNaming.d.ts +41 -0
- package/dist/lib/utils/resourceNaming.js +77 -0
- package/dist/lib/utils/standardTagsAspect.d.ts +2 -2
- package/dist/lib/utils/standardTagsAspect.js +6 -5
- package/dist/lib/utils/tagResource.d.ts +1 -1
- package/dist/lib/utils/tagResource.js +1 -1
- package/package.json +3 -3
- package/dist/lib/__tests__/patterns/__snapshots__/compute.test.js.snap +0 -433
- package/dist/lib/__tests__/patterns/compute.test.d.ts +0 -1
- package/dist/lib/__tests__/patterns/compute.test.js +0 -137
- package/dist/lib/__tests__/simple.test.d.ts +0 -0
- package/dist/lib/__tests__/simple.test.js +0 -12
- package/dist/lib/resources/aws/organisations/account.d.ts +0 -37
- package/dist/lib/resources/aws/organisations/account.js +0 -220
- package/dist/lib/resources/aws/organisations/delegatedAdministrator.d.ts +0 -14
- package/dist/lib/resources/aws/organisations/delegatedAdministrator.js +0 -61
- package/dist/lib/resources/aws/organisations/index.d.ts +0 -8
- package/dist/lib/resources/aws/organisations/index.js +0 -22
- package/dist/lib/resources/aws/organisations/interfaces.d.ts +0 -105
- package/dist/lib/resources/aws/organisations/interfaces.js +0 -3
- package/dist/lib/resources/aws/organisations/organisation.d.ts +0 -47
- package/dist/lib/resources/aws/organisations/organisation.js +0 -263
- package/dist/lib/resources/aws/organisations/organisationalUnit.d.ts +0 -28
- package/dist/lib/resources/aws/organisations/organisationalUnit.js +0 -170
- package/dist/lib/resources/aws/organisations/policy.d.ts +0 -17
- package/dist/lib/resources/aws/organisations/policy.js +0 -93
- package/dist/lib/resources/aws/organisations/trustedServiceAccess.d.ts +0 -13
- package/dist/lib/resources/aws/organisations/trustedServiceAccess.js +0 -58
- package/dist/lib/resources/aws/organisations/types.d.ts +0 -165
- package/dist/lib/resources/aws/organisations/types.js +0 -36
- package/dist/lib/utils/directTagging.d.ts +0 -31
- package/dist/lib/utils/directTagging.js +0 -86
- package/dist/lib/utils/fjallConstruct.d.ts +0 -8
- package/dist/lib/utils/fjallConstruct.js +0 -18
- package/dist/lib/utils/fjallStackSynthesizer.d.ts +0 -9
- package/dist/lib/utils/fjallStackSynthesizer.js +0 -22
- package/dist/lib/utils/tagContext.d.ts +0 -28
- package/dist/lib/utils/tagContext.js +0 -53
- package/dist/lib/utils/tagSynthesizer.d.ts +0 -13
- package/dist/lib/utils/tagSynthesizer.js +0 -55
|
@@ -1,57 +1,295 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Database = void 0;
|
|
4
|
-
|
|
3
|
+
exports.Database = exports.DatabaseFactory = exports.USE_CMK = exports.AWS_MANAGED = exports.DATABASE_ENGINE_CONFIG = void 0;
|
|
4
|
+
exports.getAuroraClusterEngine = getAuroraClusterEngine;
|
|
5
|
+
exports.getInstanceEngine = getInstanceEngine;
|
|
6
|
+
exports.getEngineConfig = getEngineConfig;
|
|
7
|
+
exports.isAwsManagedKey = isAwsManagedKey;
|
|
8
|
+
exports.isCMKRequested = isCMKRequested;
|
|
9
|
+
const constructs_1 = require("constructs");
|
|
5
10
|
const database_1 = require("../../resources/aws/database");
|
|
6
|
-
const
|
|
11
|
+
const rdsAuroraGlobal_1 = require("../../resources/aws/database/rdsAuroraGlobal");
|
|
12
|
+
const aws_rds_1 = require("aws-cdk-lib/aws-rds");
|
|
13
|
+
exports.DATABASE_ENGINE_CONFIG = {
|
|
14
|
+
postgresql: {
|
|
15
|
+
aurora: { version: "16.6", majorVersion: "16" },
|
|
16
|
+
instance: { version: "17.5", majorVersion: "17" },
|
|
17
|
+
defaultUsername: "postgres",
|
|
18
|
+
sslParameters: { "rds.force_ssl": "1" },
|
|
19
|
+
rotationAppName: "SecretsManagerRDSPostgreSQLRotationMultiUser"
|
|
20
|
+
},
|
|
21
|
+
mysql: {
|
|
22
|
+
// majorVersion must be Aurora version (3.08.0), NOT MySQL version (8.0)
|
|
23
|
+
aurora: { version: "8.0.mysql_aurora.3.08.0", majorVersion: "3.08.0" },
|
|
24
|
+
instance: { version: "8.4.4", majorVersion: "8.4" },
|
|
25
|
+
defaultUsername: "admin",
|
|
26
|
+
sslParameters: { require_secure_transport: "ON" },
|
|
27
|
+
rotationAppName: "SecretsManagerRDSMySQLRotationMultiUser"
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
const AURORA_ENGINE_FACTORIES = {
|
|
31
|
+
postgresql: () => {
|
|
32
|
+
const { version, majorVersion } = exports.DATABASE_ENGINE_CONFIG.postgresql.aurora;
|
|
33
|
+
return aws_rds_1.DatabaseClusterEngine.auroraPostgres({
|
|
34
|
+
version: aws_rds_1.AuroraPostgresEngineVersion.of(version, majorVersion)
|
|
35
|
+
});
|
|
36
|
+
},
|
|
37
|
+
mysql: () => {
|
|
38
|
+
const { version, majorVersion } = exports.DATABASE_ENGINE_CONFIG.mysql.aurora;
|
|
39
|
+
return aws_rds_1.DatabaseClusterEngine.auroraMysql({
|
|
40
|
+
version: aws_rds_1.AuroraMysqlEngineVersion.of(version, majorVersion)
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
const INSTANCE_ENGINE_FACTORIES = {
|
|
45
|
+
postgresql: () => {
|
|
46
|
+
const { version, majorVersion } = exports.DATABASE_ENGINE_CONFIG.postgresql.instance;
|
|
47
|
+
return aws_rds_1.DatabaseInstanceEngine.postgres({
|
|
48
|
+
version: aws_rds_1.PostgresEngineVersion.of(version, majorVersion)
|
|
49
|
+
});
|
|
50
|
+
},
|
|
51
|
+
mysql: () => {
|
|
52
|
+
const { version, majorVersion } = exports.DATABASE_ENGINE_CONFIG.mysql.instance;
|
|
53
|
+
return aws_rds_1.DatabaseInstanceEngine.mysql({
|
|
54
|
+
version: aws_rds_1.MysqlEngineVersion.of(version, majorVersion)
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
function getAuroraClusterEngine(engine) {
|
|
59
|
+
return AURORA_ENGINE_FACTORIES[engine]();
|
|
60
|
+
}
|
|
61
|
+
function getInstanceEngine(engine) {
|
|
62
|
+
return INSTANCE_ENGINE_FACTORIES[engine]();
|
|
63
|
+
}
|
|
64
|
+
function getEngineConfig(engine) {
|
|
65
|
+
const config = exports.DATABASE_ENGINE_CONFIG[engine];
|
|
66
|
+
return {
|
|
67
|
+
defaultUsername: config.defaultUsername,
|
|
68
|
+
sslParameters: config.sslParameters,
|
|
69
|
+
rotationAppName: config.rotationAppName
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
// Type guard to check if the encryption key spec is AWS managed.
|
|
73
|
+
function isAwsManagedKey(spec) {
|
|
74
|
+
return (spec !== undefined &&
|
|
75
|
+
typeof spec === "object" &&
|
|
76
|
+
"awsManaged" in spec &&
|
|
77
|
+
spec.awsManaged === true);
|
|
78
|
+
}
|
|
7
79
|
/**
|
|
8
|
-
*
|
|
80
|
+
* Type guard to check if CMK is explicitly requested.
|
|
9
81
|
*/
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
82
|
+
function isCMKRequested(spec) {
|
|
83
|
+
return (spec !== undefined &&
|
|
84
|
+
typeof spec === "object" &&
|
|
85
|
+
"useCMK" in spec &&
|
|
86
|
+
spec.useCMK === true);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Convenience constant for specifying AWS managed encryption (the default).
|
|
90
|
+
* @example
|
|
91
|
+
* encryption: { storageKey: AWS_MANAGED }
|
|
92
|
+
*/
|
|
93
|
+
exports.AWS_MANAGED = { awsManaged: true };
|
|
94
|
+
/**
|
|
95
|
+
* Convenience constant for explicitly requesting CMK.
|
|
96
|
+
* @example
|
|
97
|
+
* encryption: { storageKey: USE_CMK }
|
|
98
|
+
*/
|
|
99
|
+
exports.USE_CMK = { useCMK: true };
|
|
100
|
+
/**
|
|
101
|
+
* Validates database props and logs warnings for ignored or misconfigured options.
|
|
102
|
+
* These checks help catch issues when props come from dynamic sources where
|
|
103
|
+
* TypeScript's compile-time checks may not apply.
|
|
104
|
+
*/
|
|
105
|
+
function validateDatabaseProps(props) {
|
|
106
|
+
const propsAny = props;
|
|
107
|
+
// GlobalAurora requires primaryRegion
|
|
108
|
+
if (props.type === "GlobalAurora" && !props.primaryRegion) {
|
|
109
|
+
throw new Error("GlobalAurora database requires 'primaryRegion'. " +
|
|
110
|
+
"Specify the AWS region where the primary cluster will be created.");
|
|
111
|
+
}
|
|
112
|
+
// Warn about Instance-only options on Aurora/GlobalAurora
|
|
113
|
+
if (props.type === "Aurora" || props.type === "GlobalAurora") {
|
|
114
|
+
if ("readReplica" in propsAny && propsAny.readReplica !== undefined) {
|
|
115
|
+
console.warn(`[Fjall] Warning: 'readReplica' is ignored for ${props.type} databases. ` +
|
|
116
|
+
"Use 'readers' configuration for Aurora read scaling.");
|
|
117
|
+
}
|
|
118
|
+
if ("multiAz" in propsAny && propsAny.multiAz !== undefined) {
|
|
119
|
+
console.warn(`[Fjall] Warning: 'multiAz' is ignored for ${props.type} databases. ` +
|
|
120
|
+
"Aurora provides automatic multi-AZ replication.");
|
|
121
|
+
}
|
|
122
|
+
if ("allocatedStorage" in propsAny &&
|
|
123
|
+
propsAny.allocatedStorage !== undefined) {
|
|
124
|
+
console.warn(`[Fjall] Warning: 'allocatedStorage' is ignored for ${props.type} databases. ` +
|
|
125
|
+
"Aurora uses automatic storage scaling.");
|
|
126
|
+
}
|
|
15
127
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
});
|
|
128
|
+
// Warn about Aurora-only options on Instance
|
|
129
|
+
if (props.type === "Instance") {
|
|
130
|
+
if ("readers" in propsAny && propsAny.readers !== undefined) {
|
|
131
|
+
console.warn("[Fjall] Warning: 'readers' is ignored for Instance databases. " +
|
|
132
|
+
"Use 'readReplica' configuration for RDS Instance read scaling.");
|
|
22
133
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
134
|
+
if ("writer" in propsAny && propsAny.writer !== undefined) {
|
|
135
|
+
console.warn("[Fjall] Warning: 'writer' is ignored for Instance databases. " +
|
|
136
|
+
"Writer configuration only applies to Aurora clusters.");
|
|
137
|
+
}
|
|
138
|
+
if ("backupRetention" in propsAny &&
|
|
139
|
+
propsAny.backupRetention !== undefined) {
|
|
140
|
+
console.warn("[Fjall] Warning: 'backupRetention' in days format is Aurora-specific. " +
|
|
141
|
+
"For RDS Instance, backup retention is configured via Duration in the construct.");
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Warn about GlobalAurora-only options on non-global databases
|
|
145
|
+
if (props.type !== "GlobalAurora") {
|
|
146
|
+
if ("primaryRegion" in propsAny && propsAny.primaryRegion !== undefined) {
|
|
147
|
+
console.warn(`[Fjall] Warning: 'primaryRegion' is ignored for ${props.type} databases. ` +
|
|
148
|
+
"Region configuration only applies to GlobalAurora.");
|
|
149
|
+
}
|
|
150
|
+
if ("secondaryRegions" in propsAny &&
|
|
151
|
+
propsAny.secondaryRegions !== undefined) {
|
|
152
|
+
console.warn(`[Fjall] Warning: 'secondaryRegions' is ignored for ${props.type} databases. ` +
|
|
153
|
+
"Multi-region configuration only applies to GlobalAurora.");
|
|
154
|
+
}
|
|
155
|
+
if ("enableGlobalWriteForwarding" in propsAny &&
|
|
156
|
+
propsAny.enableGlobalWriteForwarding !== undefined) {
|
|
157
|
+
console.warn(`[Fjall] Warning: 'enableGlobalWriteForwarding' is ignored for ${props.type} databases. ` +
|
|
158
|
+
"Write forwarding only applies to GlobalAurora.");
|
|
28
159
|
}
|
|
29
160
|
}
|
|
161
|
+
}
|
|
162
|
+
class DatabaseFactory {
|
|
163
|
+
static build(id, props) {
|
|
164
|
+
return (app, scope) => {
|
|
165
|
+
validateDatabaseProps(props);
|
|
166
|
+
const databaseProps = {
|
|
167
|
+
...props,
|
|
168
|
+
vpc: (props.vpc || app.getVpc())
|
|
169
|
+
};
|
|
170
|
+
return new Database(scope, id, databaseProps);
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
exports.DatabaseFactory = DatabaseFactory;
|
|
175
|
+
class Database extends constructs_1.Construct {
|
|
176
|
+
constructor(scope, id, props) {
|
|
177
|
+
super(scope, id);
|
|
178
|
+
this.id = id;
|
|
179
|
+
this.scope = scope;
|
|
180
|
+
this.databaseName = props.databaseName;
|
|
181
|
+
this.addDatabase(props);
|
|
182
|
+
}
|
|
30
183
|
addDatabase(props) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
vpc: this.vpc,
|
|
46
|
-
databaseName: props.databaseName,
|
|
47
|
-
tags: props.tags || {}
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
throw new Error("Invalid database type");
|
|
184
|
+
switch (props.type) {
|
|
185
|
+
case "Aurora":
|
|
186
|
+
this.addAurora(props);
|
|
187
|
+
break;
|
|
188
|
+
case "GlobalAurora":
|
|
189
|
+
this.addAuroraGlobal(props);
|
|
190
|
+
break;
|
|
191
|
+
case "Instance":
|
|
192
|
+
this.addRdsInstance(props);
|
|
193
|
+
break;
|
|
194
|
+
default:
|
|
195
|
+
// Exhaustiveness check
|
|
196
|
+
const _exhaustive = props;
|
|
197
|
+
throw new Error(`Unsupported database type ${props.type}`);
|
|
52
198
|
}
|
|
199
|
+
}
|
|
200
|
+
addAurora(props) {
|
|
201
|
+
if (!props.vpc)
|
|
202
|
+
throw new Error("VPC is required for Aurora database");
|
|
203
|
+
const resolvedDatabaseEngine = props.databaseEngine ?? "postgresql";
|
|
204
|
+
const resolvedEngine = props.engine ?? getAuroraClusterEngine(resolvedDatabaseEngine);
|
|
205
|
+
const engineConfig = getEngineConfig(resolvedDatabaseEngine);
|
|
206
|
+
this.database = new database_1.RdsAurora(this, `${props.databaseName}Rds`, {
|
|
207
|
+
vpc: props.vpc,
|
|
208
|
+
databaseName: props.databaseName,
|
|
209
|
+
engine: resolvedEngine,
|
|
210
|
+
engineConfig,
|
|
211
|
+
writer: props.writer,
|
|
212
|
+
readers: props.readers,
|
|
213
|
+
proxy: props.proxy,
|
|
214
|
+
credentials: props.credentials,
|
|
215
|
+
encryption: props.encryption,
|
|
216
|
+
backupRetention: props.backupRetention,
|
|
217
|
+
monitoringInterval: props.monitoringInterval,
|
|
218
|
+
preferredMaintenanceWindow: props.preferredMaintenanceWindow,
|
|
219
|
+
port: props.port,
|
|
220
|
+
performanceInsights: props.performanceInsights,
|
|
221
|
+
snapshotIdentifier: props.snapshotIdentifier
|
|
222
|
+
});
|
|
223
|
+
this.connections = this.database.connections;
|
|
224
|
+
}
|
|
225
|
+
addAuroraGlobal(props) {
|
|
226
|
+
if (!props.vpc)
|
|
227
|
+
throw new Error("VPC is required for Global Aurora database");
|
|
228
|
+
if (!props.primaryRegion)
|
|
229
|
+
throw new Error("primaryRegion is required for Global Aurora database");
|
|
230
|
+
const resolvedDatabaseEngine = props.databaseEngine ?? "postgresql";
|
|
231
|
+
const resolvedEngine = props.engine ?? getAuroraClusterEngine(resolvedDatabaseEngine);
|
|
232
|
+
const engineConfig = getEngineConfig(resolvedDatabaseEngine);
|
|
233
|
+
this.database = new rdsAuroraGlobal_1.RdsAuroraGlobal(this, `${props.databaseName}RdsGlobal`, {
|
|
234
|
+
vpc: props.vpc,
|
|
235
|
+
databaseName: props.databaseName,
|
|
236
|
+
primaryRegion: props.primaryRegion,
|
|
237
|
+
secondaryRegions: props.secondaryRegions,
|
|
238
|
+
globalClusterIdentifier: props.globalClusterIdentifier,
|
|
239
|
+
engine: resolvedEngine,
|
|
240
|
+
engineConfig,
|
|
241
|
+
enableGlobalWriteForwarding: props.enableGlobalWriteForwarding,
|
|
242
|
+
writer: props.writer,
|
|
243
|
+
readers: props.readers,
|
|
244
|
+
proxy: props.proxy,
|
|
245
|
+
credentials: props.credentials,
|
|
246
|
+
encryption: props.encryption,
|
|
247
|
+
backupRetention: props.backupRetention,
|
|
248
|
+
monitoringInterval: props.monitoringInterval,
|
|
249
|
+
preferredMaintenanceWindow: props.preferredMaintenanceWindow,
|
|
250
|
+
port: props.port,
|
|
251
|
+
performanceInsights: props.performanceInsights,
|
|
252
|
+
snapshotIdentifier: props.snapshotIdentifier
|
|
253
|
+
});
|
|
254
|
+
this.connections = this.database.connections;
|
|
255
|
+
}
|
|
256
|
+
addRdsInstance(props) {
|
|
257
|
+
if (!props.vpc)
|
|
258
|
+
throw new Error("VPC is required for Instance database");
|
|
259
|
+
const resolvedDatabaseEngine = props.databaseEngine ?? "postgresql";
|
|
260
|
+
const resolvedEngine = props.engine ?? getInstanceEngine(resolvedDatabaseEngine);
|
|
261
|
+
const engineConfig = getEngineConfig(resolvedDatabaseEngine);
|
|
262
|
+
this.database = new database_1.RdsInstance(this, `${props.databaseName}Rds`, {
|
|
263
|
+
vpc: props.vpc,
|
|
264
|
+
databaseName: props.databaseName,
|
|
265
|
+
instanceType: props.instanceType,
|
|
266
|
+
allocatedStorage: props.allocatedStorage,
|
|
267
|
+
port: props.port,
|
|
268
|
+
engine: resolvedEngine,
|
|
269
|
+
engineConfig,
|
|
270
|
+
multiAz: props.multiAz,
|
|
271
|
+
performanceInsights: props.performanceInsights,
|
|
272
|
+
proxy: props.proxy,
|
|
273
|
+
readReplica: props.readReplica,
|
|
274
|
+
credentials: props.credentials,
|
|
275
|
+
encryption: props.encryption,
|
|
276
|
+
publiclyAccessible: props.publiclyAccessible,
|
|
277
|
+
snapshotIdentifier: props.snapshotIdentifier
|
|
278
|
+
});
|
|
53
279
|
this.connections = this.database.connections;
|
|
54
280
|
}
|
|
281
|
+
getCredentials() {
|
|
282
|
+
return this.database.getCredentials();
|
|
283
|
+
}
|
|
284
|
+
getHostEndpoint() {
|
|
285
|
+
return this.database.getHostEndpoint();
|
|
286
|
+
}
|
|
287
|
+
getHostPort() {
|
|
288
|
+
return this.database.getHostPort();
|
|
289
|
+
}
|
|
290
|
+
getDatabaseName() {
|
|
291
|
+
return this.databaseName;
|
|
292
|
+
}
|
|
55
293
|
}
|
|
56
294
|
exports.Database = Database;
|
|
57
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvcGF0dGVybnMvYXdzL2RhdGFiYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUFvQztBQUVwQywyREFJc0M7QUFDdEMsNERBQXlEO0FBNkJ6RDs7R0FFRztBQUNILE1BQWEsUUFBUyxTQUFRLG1CQUFLO0lBTWpDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBb0I7UUFDNUQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFvQjtRQUN6QixJQUFJLE9BQU8sSUFBSSxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDekIsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLEdBQXdCLENBQUM7WUFDakQsSUFBSSxDQUFDLEdBQUcsR0FBRyxTQUFHLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxZQUFZLEtBQUssRUFBRTtnQkFDMUQsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLO2FBQ3ZCLENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLEdBQW1CLENBQUM7WUFDNUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLFNBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsWUFBWSxFQUFFLEVBQUU7Z0JBQ2hELFNBQVMsRUFBRSxTQUFTLENBQUMsU0FBUzthQUMvQixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFvQjtRQUM5QixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLG9CQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLFlBQVksS0FBSyxFQUFFO2dCQUM5RCxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7Z0JBQ2IsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO2FBQ2pDLENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLHNCQUFXLENBQUMsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLFlBQVksS0FBSyxFQUFFO2dCQUNoRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7Z0JBQ2IsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO2FBQ2pDLENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLHNCQUFXLENBQUMsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLFlBQVksS0FBSyxFQUFFO2dCQUNoRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7Z0JBQ2IsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO2dCQUNoQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksSUFBSSxFQUFFO2FBQ3ZCLENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFFRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO0lBQy9DLENBQUM7Q0FDRjtBQWxERCw0QkFrREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7XG4gIFJkc0F1cm9yYSxcbiAgUmRzRnJlZVRpZXIsXG4gIFJkc0luc3RhbmNlXG59IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL2RhdGFiYXNlXCI7XG5pbXBvcnQgeyBWcGMgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9uZXR3b3JraW5nL3ZwY1wiO1xuaW1wb3J0IHtcbiAgQ29ubmVjdGlvbnMsXG4gIElDb25uZWN0YWJsZSxcbiAgSVZwYyxcbiAgU3VibmV0VHlwZVxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuXG5pbnRlcmZhY2UgRXhpc3RpbmdWcGNDb25maWcge1xuICB2cGNJZD86IHN0cmluZztcbiAgc3VibmV0VHlwZT86IFN1Ym5ldFR5cGU7XG59XG5cbmludGVyZmFjZSBOZXdWcGNDb25maWcge1xuICBzdWJuZXRUeXBlPzogU3VibmV0VHlwZTtcbiAgYWNjb3VudElkOiBzdHJpbmc7XG59XG5cbnR5cGUgVnBjUHJvcHMgPSBFeGlzdGluZ1ZwY0NvbmZpZyB8IE5ld1ZwY0NvbmZpZztcblxudHlwZSBEYXRhYmFzZVR5cGUgPSBcIkF1cm9yYVwiIHwgXCJJbnN0YW5jZVwiIHwgXCJGcmVlVGllclwiO1xuXG5pbnRlcmZhY2UgRGF0YWJhc2VQcm9wcyB7XG4gIHR5cGU6IERhdGFiYXNlVHlwZTtcbiAgZGF0YWJhc2VOYW1lOiBzdHJpbmc7XG4gIHZwYzogVnBjUHJvcHM7XG4gIHRhZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIFN0b3JhZ2UgaW5zdGVhZFxuICovXG5leHBvcnQgY2xhc3MgRGF0YWJhc2UgZXh0ZW5kcyBTdGFjayBpbXBsZW1lbnRzIElDb25uZWN0YWJsZSB7XG4gIHB1YmxpYyBjb25uZWN0aW9uczogQ29ubmVjdGlvbnM7XG4gIHB1YmxpYyB2cGM6IElWcGM7XG5cbiAgcHJpdmF0ZSBkYXRhYmFzZTogUmRzQXVyb3JhIHwgUmRzSW5zdGFuY2UgfCBSZHNGcmVlVGllcjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogRGF0YWJhc2VQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLmFkZFZwYyhwcm9wcyk7XG4gICAgdGhpcy5hZGREYXRhYmFzZShwcm9wcyk7XG4gIH1cblxuICBhZGRWcGMocHJvcHM6IERhdGFiYXNlUHJvcHMpIHtcbiAgICBpZiAoXCJ2cGNJZFwiIGluIHByb3BzLnZwYykge1xuICAgICAgY29uc3QgdnBjQ29uZmlnID0gcHJvcHMudnBjIGFzIEV4aXN0aW5nVnBjQ29uZmlnO1xuICAgICAgdGhpcy52cGMgPSBWcGMuZnJvbUxvb2t1cCh0aGlzLCBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9VnBjYCwge1xuICAgICAgICB2cGNJZDogdnBjQ29uZmlnLnZwY0lkXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdnBjQ29uZmlnID0gcHJvcHMudnBjIGFzIE5ld1ZwY0NvbmZpZztcbiAgICAgIHRoaXMudnBjID0gbmV3IFZwYyh0aGlzLCBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9YCwge1xuICAgICAgICBhY2NvdW50SWQ6IHZwY0NvbmZpZy5hY2NvdW50SWRcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGFkZERhdGFiYXNlKHByb3BzOiBEYXRhYmFzZVByb3BzKSB7XG4gICAgaWYgKHByb3BzLnR5cGUgPT09IFwiQXVyb3JhXCIpIHtcbiAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUmRzQXVyb3JhKHRoaXMsIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1SZHNgLCB7XG4gICAgICAgIHZwYzogdGhpcy52cGMsXG4gICAgICAgIGRhdGFiYXNlTmFtZTogcHJvcHMuZGF0YWJhc2VOYW1lXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHByb3BzLnR5cGUgPT09IFwiSW5zdGFuY2VcIikge1xuICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBSZHNJbnN0YW5jZSh0aGlzLCBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9UmRzYCwge1xuICAgICAgICB2cGM6IHRoaXMudnBjLFxuICAgICAgICBkYXRhYmFzZU5hbWU6IHByb3BzLmRhdGFiYXNlTmFtZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChwcm9wcy50eXBlID09PSBcIkZyZWVUaWVyXCIpIHtcbiAgICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUmRzRnJlZVRpZXIodGhpcywgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVJkc2AsIHtcbiAgICAgICAgdnBjOiB0aGlzLnZwYyxcbiAgICAgICAgZGF0YWJhc2VOYW1lOiBwcm9wcy5kYXRhYmFzZU5hbWUsXG4gICAgICAgIHRhZ3M6IHByb3BzLnRhZ3MgfHwge31cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGRhdGFiYXNlIHR5cGVcIik7XG4gICAgfVxuXG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IHRoaXMuZGF0YWJhc2UuY29ubmVjdGlvbnM7XG4gIH1cbn1cbiJdfQ==
|
|
295
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvcGF0dGVybnMvYXdzL2RhdGFiYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTZGQSx3REFFQztBQUVELDhDQUVDO0FBRUQsMENBT0M7QUFrREQsMENBU0M7QUFLRCx3Q0FTQztBQXJMRCwyQ0FBdUM7QUFHdkMsMkRBQXNFO0FBQ3RFLGtGQUErRTtBQVMvRSxpREFTNkI7QUFZaEIsUUFBQSxzQkFBc0IsR0FTL0I7SUFDRixVQUFVLEVBQUU7UUFDVixNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUU7UUFDL0MsUUFBUSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFO1FBQ2pELGVBQWUsRUFBRSxVQUFVO1FBQzNCLGFBQWEsRUFBRSxFQUFFLGVBQWUsRUFBRSxHQUFHLEVBQUU7UUFDdkMsZUFBZSxFQUFFLDhDQUE4QztLQUNoRTtJQUNELEtBQUssRUFBRTtRQUNMLHdFQUF3RTtRQUN4RSxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRTtRQUN0RSxRQUFRLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUU7UUFDbkQsZUFBZSxFQUFFLE9BQU87UUFDeEIsYUFBYSxFQUFFLEVBQUUsd0JBQXdCLEVBQUUsSUFBSSxFQUFFO1FBQ2pELGVBQWUsRUFBRSx5Q0FBeUM7S0FDM0Q7Q0FDRixDQUFDO0FBRUYsTUFBTSx1QkFBdUIsR0FBaUQ7SUFDNUUsVUFBVSxFQUFFLEdBQUcsRUFBRTtRQUNmLE1BQU0sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLEdBQUcsOEJBQXNCLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUMzRSxPQUFPLCtCQUFxQixDQUFDLGNBQWMsQ0FBQztZ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O1NBQzdDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7SUFDL0MsQ0FBQztJQUVELGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVELGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVELGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztDQUNGO0FBbkpELDRCQW1KQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbmltcG9ydCB0eXBlIEFwcCBmcm9tIFwiLi4vLi4vYXBwXCI7XG5pbXBvcnQgeyBSZHNBdXJvcmEsIFJkc0luc3RhbmNlIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvZGF0YWJhc2VcIjtcbmltcG9ydCB7IFJkc0F1cm9yYUdsb2JhbCB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL2RhdGFiYXNlL3Jkc0F1cm9yYUdsb2JhbFwiO1xuaW1wb3J0IHsgdHlwZSBTZWNyZXQgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9zZWNyZXRzXCI7XG5cbmltcG9ydCB7XG4gIHR5cGUgQ29ubmVjdGlvbnMsXG4gIHR5cGUgSUNvbm5lY3RhYmxlLFxuICB0eXBlIElWcGMsXG4gIHR5cGUgU3VibmV0U2VsZWN0aW9uXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5pbXBvcnQge1xuICB0eXBlIElJbnN0YW5jZUVuZ2luZSxcbiAgdHlwZSBJQ2x1c3RlckVuZ2luZSxcbiAgRGF0YWJhc2VDbHVzdGVyRW5naW5lLFxuICBEYXRhYmFzZUluc3RhbmNlRW5naW5lLFxuICBBdXJvcmFQb3N0Z3Jlc0VuZ2luZVZlcnNpb24sXG4gIEF1cm9yYU15c3FsRW5naW5lVmVyc2lvbixcbiAgUG9zdGdyZXNFbmdpbmVWZXJzaW9uLFxuICBNeXNxbEVuZ2luZVZlcnNpb25cbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yZHNcIjtcbmltcG9ydCB7IHR5cGUgRHVyYXRpb24gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IHR5cGUgSUtleSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mta21zXCI7XG5cbmV4cG9ydCB0eXBlIERhdGFiYXNlRW5naW5lID0gXCJwb3N0Z3Jlc3FsXCIgfCBcIm15c3FsXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW5naW5lQ29uZmlnIHtcbiAgZGVmYXVsdFVzZXJuYW1lOiBzdHJpbmc7XG4gIHNzbFBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHJvdGF0aW9uQXBwTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgREFUQUJBU0VfRU5HSU5FX0NPTkZJRzogUmVjb3JkPFxuICBEYXRhYmFzZUVuZ2luZSxcbiAge1xuICAgIGF1cm9yYTogeyB2ZXJzaW9uOiBzdHJpbmc7IG1ham9yVmVyc2lvbjogc3RyaW5nIH07XG4gICAgaW5zdGFuY2U6IHsgdmVyc2lvbjogc3RyaW5nOyBtYWpvclZlcnNpb246IHN0cmluZyB9O1xuICAgIGRlZmF1bHRVc2VybmFtZTogc3RyaW5nO1xuICAgIHNzbFBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgcm90YXRpb25BcHBOYW1lOiBzdHJpbmc7XG4gIH1cbj4gPSB7XG4gIHBvc3RncmVzcWw6IHtcbiAgICBhdXJvcmE6IHsgdmVyc2lvbjogXCIxNi42XCIsIG1ham9yVmVyc2lvbjogXCIxNlwiIH0sXG4gICAgaW5zdGFuY2U6IHsgdmVyc2lvbjogXCIxNy41XCIsIG1ham9yVmVyc2lvbjogXCIxN1wiIH0sXG4gICAgZGVmYXVsdFVzZXJuYW1lOiBcInBvc3RncmVzXCIsXG4gICAgc3NsUGFyYW1ldGVyczogeyBcInJkcy5mb3JjZV9zc2xcIjogXCIxXCIgfSxcbiAgICByb3RhdGlvbkFwcE5hbWU6IFwiU2VjcmV0c01hbmFnZXJSRFNQb3N0Z3JlU1FMUm90YXRpb25NdWx0aVVzZXJcIlxuICB9LFxuICBteXNxbDoge1xuICAgIC8vIG1ham9yVmVyc2lvbiBtdXN0IGJlIEF1cm9yYSB2ZXJzaW9uICgzLjA4LjApLCBOT1QgTXlTUUwgdmVyc2lvbiAoOC4wKVxuICAgIGF1cm9yYTogeyB2ZXJzaW9uOiBcIjguMC5teXNxbF9hdXJvcmEuMy4wOC4wXCIsIG1ham9yVmVyc2lvbjogXCIzLjA4LjBcIiB9LFxuICAgIGluc3RhbmNlOiB7IHZlcnNpb246IFwiOC40LjRcIiwgbWFqb3JWZXJzaW9uOiBcIjguNFwiIH0sXG4gICAgZGVmYXVsdFVzZXJuYW1lOiBcImFkbWluXCIsXG4gICAgc3NsUGFyYW1ldGVyczogeyByZXF1aXJlX3NlY3VyZV90cmFuc3BvcnQ6IFwiT05cIiB9LFxuICAgIHJvdGF0aW9uQXBwTmFtZTogXCJTZWNyZXRzTWFuYWdlclJEU015U1FMUm90YXRpb25NdWx0aVVzZXJcIlxuICB9XG59O1xuXG5jb25zdCBBVVJPUkFfRU5HSU5FX0ZBQ1RPUklFUzogUmVjb3JkPERhdGFiYXNlRW5naW5lLCAoKSA9PiBJQ2x1c3RlckVuZ2luZT4gPSB7XG4gIHBvc3RncmVzcWw6ICgpID0+IHtcbiAgICBjb25zdCB7IHZlcnNpb24sIG1ham9yVmVyc2lvbiB9ID0gREFUQUJBU0VfRU5HSU5FX0NPTkZJRy5wb3N0Z3Jlc3FsLmF1cm9yYTtcbiAgICByZXR1cm4gRGF0YWJhc2VDbHVzdGVyRW5naW5lLmF1cm9yYVBvc3RncmVzKHtcbiAgICAgIHZlcnNpb246IEF1cm9yYVBvc3RncmVzRW5naW5lVmVyc2lvbi5vZih2ZXJzaW9uLCBtYWpvclZlcnNpb24pXG4gICAgfSk7XG4gIH0sXG4gIG15c3FsOiAoKSA9PiB7XG4gICAgY29uc3QgeyB2ZXJzaW9uLCBtYWpvclZlcnNpb24gfSA9IERBVEFCQVNFX0VOR0lORV9DT05GSUcubXlzcWwuYXVyb3JhO1xuICAgIHJldHVybiBEYXRhYmFzZUNsdXN0ZXJFbmdpbmUuYXVyb3JhTXlzcWwoe1xuICAgICAgdmVyc2lvbjogQXVyb3JhTXlzcWxFbmdpbmVWZXJzaW9uLm9mKHZlcnNpb24sIG1ham9yVmVyc2lvbilcbiAgICB9KTtcbiAgfVxufTtcblxuY29uc3QgSU5TVEFOQ0VfRU5HSU5FX0ZBQ1RPUklFUzogUmVjb3JkPERhdGFiYXNlRW5naW5lLCAoKSA9PiBJSW5zdGFuY2VFbmdpbmU+ID1cbiAge1xuICAgIHBvc3RncmVzcWw6ICgpID0+IHtcbiAgICAgIGNvbnN0IHsgdmVyc2lvbiwgbWFqb3JWZXJzaW9uIH0gPVxuICAgICAgICBEQVRBQkFTRV9FTkdJTkVfQ09ORklHLnBvc3RncmVzcWwuaW5zdGFuY2U7XG4gICAgICByZXR1cm4gRGF0YWJhc2VJbnN0YW5jZUVuZ2luZS5wb3N0Z3Jlcyh7XG4gICAgICAgIHZlcnNpb246IFBvc3RncmVzRW5naW5lVmVyc2lvbi5vZih2ZXJzaW9uLCBtYWpvclZlcnNpb24pXG4gICAgICB9KTtcbiAgICB9LFxuICAgIG15c3FsOiAoKSA9PiB7XG4gICAgICBjb25zdCB7IHZlcnNpb24sIG1ham9yVmVyc2lvbiB9ID0gREFUQUJBU0VfRU5HSU5FX0NPTkZJRy5teXNxbC5pbnN0YW5jZTtcbiAgICAgIHJldHVybiBEYXRhYmFzZUluc3RhbmNlRW5naW5lLm15c3FsKHtcbiAgICAgICAgdmVyc2lvbjogTXlzcWxFbmdpbmVWZXJzaW9uLm9mKHZlcnNpb24sIG1ham9yVmVyc2lvbilcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEF1cm9yYUNsdXN0ZXJFbmdpbmUoZW5naW5lOiBEYXRhYmFzZUVuZ2luZSk6IElDbHVzdGVyRW5naW5lIHtcbiAgcmV0dXJuIEFVUk9SQV9FTkdJTkVfRkFDVE9SSUVTW2VuZ2luZV0oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEluc3RhbmNlRW5naW5lKGVuZ2luZTogRGF0YWJhc2VFbmdpbmUpOiBJSW5zdGFuY2VFbmdpbmUge1xuICByZXR1cm4gSU5TVEFOQ0VfRU5HSU5FX0ZBQ1RPUklFU1tlbmdpbmVdKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbmdpbmVDb25maWcoZW5naW5lOiBEYXRhYmFzZUVuZ2luZSk6IEVuZ2luZUNvbmZpZyB7XG4gIGNvbnN0IGNvbmZpZyA9IERBVEFCQVNFX0VOR0lORV9DT05GSUdbZW5naW5lXTtcbiAgcmV0dXJuIHtcbiAgICBkZWZhdWx0VXNlcm5hbWU6IGNvbmZpZy5kZWZhdWx0VXNlcm5hbWUsXG4gICAgc3NsUGFyYW1ldGVyczogY29uZmlnLnNzbFBhcmFtZXRlcnMsXG4gICAgcm90YXRpb25BcHBOYW1lOiBjb25maWcucm90YXRpb25BcHBOYW1lXG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJveHlDb25maWcge1xuICBtYXhDb25uZWN0aW9ucz86IG51bWJlcjtcbiAgbWF4SWRsZUNvbm5lY3Rpb25zPzogbnVtYmVyO1xuICBjb25uZWN0aW9uQm9ycm93VGltZW91dD86IG51bWJlcjtcbiAgcmVxdWlyZVRMUz86IGJvb2xlYW47XG4gIHZwY1N1Ym5ldHM/OiBTdWJuZXRTZWxlY3Rpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVhZFJlcGxpY2FDb25maWcge1xuICBpbnN0YW5jZVR5cGU/OiBzdHJpbmc7XG4gIGF2YWlsYWJpbGl0eVpvbmU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGVudGlhbHNDb25maWcge1xuICB1c2VybmFtZT86IHN0cmluZztcbiAgc2VjcmV0Um90YXRpb24/OiBTZWNyZXRSb3RhdGlvbkNvbmZpZyB8IGZhbHNlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlY3JldFJvdGF0aW9uQ29uZmlnIHtcbiAgYXV0b21hdGljYWxseUFmdGVyPzogRHVyYXRpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW5jcnlwdGlvbkNvbmZpZyB7XG4gIHN0b3JhZ2VLZXk/OiBFbmNyeXB0aW9uS2V5U3BlYztcbn1cblxuZXhwb3J0IHR5cGUgUGVyZm9ybWFuY2VJbnNpZ2h0c1JldGVudGlvblBlcmlvZCA9IDcgfCAzMSB8IDkzIHwgMTg2IHwgMzcyIHwgNzMxO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBlcmZvcm1hbmNlSW5zaWdodHNDb25maWcge1xuICBlbmNyeXB0aW9uS2V5PzogRW5jcnlwdGlvbktleVNwZWM7XG4gIC8qKiBSZXRlbnRpb24gcGVyaW9kIGluIGRheXMuIERlZmF1bHQ6IDMxICgxIG1vbnRoKS4gKi9cbiAgcmV0ZW50aW9uUGVyaW9kPzogUGVyZm9ybWFuY2VJbnNpZ2h0c1JldGVudGlvblBlcmlvZDtcbn1cblxuLy8gTWFya2VyIGZvciBBV1MgbWFuYWdlZCBlbmNyeXB0aW9uIGtleSAoYXdzL3JkcywgYXdzL3MzLCBldGMuKVxuZXhwb3J0IGludGVyZmFjZSBBd3NNYW5hZ2VkS2V5IHtcbiAgcmVhZG9ubHkgYXdzTWFuYWdlZDogdHJ1ZTtcbn1cblxuLy8gTWFya2VyIGZvciBleHBsaWNpdGx5IHJlcXVlc3RpbmcgYSBDdXN0b21lciBNYW5hZ2VkIEtleSAoQ01LKS5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tZXJNYW5hZ2VkS2V5TWFya2VyIHtcbiAgcmVhZG9ubHkgdXNlQ01LOiB0cnVlO1xufVxuXG4vLyBFbmNyeXB0aW9uIGtleSBzcGVjaWZpY2F0aW9uIGZvciBSRFMgcmVzb3VyY2VzLlxuZXhwb3J0IHR5cGUgRW5jcnlwdGlvbktleVNwZWMgPSBJS2V5IHwgQXdzTWFuYWdlZEtleSB8IEN1c3RvbWVyTWFuYWdlZEtleU1hcmtlcjtcblxuLy8gVHlwZSBndWFyZCB0byBjaGVjayBpZiB0aGUgZW5jcnlwdGlvbiBrZXkgc3BlYyBpcyBBV1MgbWFuYWdlZC5cbmV4cG9ydCBmdW5jdGlvbiBpc0F3c01hbmFnZWRLZXkoXG4gIHNwZWM6IEVuY3J5cHRpb25LZXlTcGVjIHwgdW5kZWZpbmVkXG4pOiBzcGVjIGlzIEF3c01hbmFnZWRLZXkge1xuICByZXR1cm4gKFxuICAgIHNwZWMgIT09IHVuZGVmaW5lZCAmJlxuICAgIHR5cGVvZiBzcGVjID09PSBcIm9iamVjdFwiICYmXG4gICAgXCJhd3NNYW5hZ2VkXCIgaW4gc3BlYyAmJlxuICAgIChzcGVjIGFzIEF3c01hbmFnZWRLZXkpLmF3c01hbmFnZWQgPT09IHRydWVcbiAgKTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIENNSyBpcyBleHBsaWNpdGx5IHJlcXVlc3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ01LUmVxdWVzdGVkKFxuICBzcGVjOiBFbmNyeXB0aW9uS2V5U3BlYyB8IHVuZGVmaW5lZFxuKTogc3BlYyBpcyBDdXN0b21lck1hbmFnZWRLZXlNYXJrZXIge1xuICByZXR1cm4gKFxuICAgIHNwZWMgIT09IHVuZGVmaW5lZCAmJlxuICAgIHR5cGVvZiBzcGVjID09PSBcIm9iamVjdFwiICYmXG4gICAgXCJ1c2VDTUtcIiBpbiBzcGVjICYmXG4gICAgKHNwZWMgYXMgQ3VzdG9tZXJNYW5hZ2VkS2V5TWFya2VyKS51c2VDTUsgPT09IHRydWVcbiAgKTtcbn1cblxuLyoqXG4gKiBDb252ZW5pZW5jZSBjb25zdGFudCBmb3Igc3BlY2lmeWluZyBBV1MgbWFuYWdlZCBlbmNyeXB0aW9uICh0aGUgZGVmYXVsdCkuXG4gKiBAZXhhbXBsZVxuICogZW5jcnlwdGlvbjogeyBzdG9yYWdlS2V5OiBBV1NfTUFOQUdFRCB9XG4gKi9cbmV4cG9ydCBjb25zdCBBV1NfTUFOQUdFRDogQXdzTWFuYWdlZEtleSA9IHsgYXdzTWFuYWdlZDogdHJ1ZSB9IGFzIGNvbnN0O1xuXG4vKipcbiAqIENvbnZlbmllbmNlIGNvbnN0YW50IGZvciBleHBsaWNpdGx5IHJlcXVlc3RpbmcgQ01LLlxuICogQGV4YW1wbGVcbiAqIGVuY3J5cHRpb246IHsgc3RvcmFnZUtleTogVVNFX0NNSyB9XG4gKi9cbmV4cG9ydCBjb25zdCBVU0VfQ01LOiBDdXN0b21lck1hbmFnZWRLZXlNYXJrZXIgPSB7IHVzZUNNSzogdHJ1ZSB9IGFzIGNvbnN0O1xuXG4vKipcbiAqICoqREVTVFJVQ1RJVkUqKjogQ2hhbmdpbmcgYHN0b3JhZ2VLZXlgIGFmdGVyIGNsdXN0ZXIgY3JlYXRpb24gY2F1c2VzIGNsdXN0ZXIgUkVQTEFDRU1FTlQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXVyb3JhRW5jcnlwdGlvbkNvbmZpZyB7XG4gIC8qKiBERVNUUlVDVElWRTogQ2hhbmdpbmcgYWZ0ZXIgY3JlYXRpb24gY2F1c2VzIGNsdXN0ZXIgcmVwbGFjZW1lbnQgKi9cbiAgc3RvcmFnZUtleT86IEVuY3J5cHRpb25LZXlTcGVjO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1cm9yYVJlYWRlckNvbmZpZyB7XG4gIHNjYWxlV2l0aFdyaXRlcj86IGJvb2xlYW47XG4gIGVuYWJsZVBlcmZvcm1hbmNlSW5zaWdodHM/OiBib29sZWFuO1xuICBpZGVudGlmaWVyU3VmZml4Pzogc3RyaW5nO1xuICBhdmFpbGFiaWxpdHlab25lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1cm9yYVdyaXRlckNvbmZpZyB7XG4gIGVuYWJsZVBlcmZvcm1hbmNlSW5zaWdodHM/OiBib29sZWFuO1xuICBpZGVudGlmaWVyU3VmZml4Pzogc3RyaW5nO1xuICBhdmFpbGFiaWxpdHlab25lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1cm9yYVJlYWRlcnNDb25maWcge1xuICAvKiogTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggaW5zdGFuY2VzICovXG4gIGNvdW50PzogbnVtYmVyO1xuICAvKiogTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggY291bnQgKi9cbiAgaW5zdGFuY2VzPzogQXVyb3JhUmVhZGVyQ29uZmlnW107XG4gIGRlZmF1bHRFbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzPzogYm9vbGVhbjtcbn1cblxudHlwZSBEYXRhYmFzZVR5cGUgPSBcIkF1cm9yYVwiIHwgXCJJbnN0YW5jZVwiIHwgXCJHbG9iYWxBdXJvcmFcIjtcblxuLyoqXG4gKiBCYXNlIHByb3BzIGZvciBkYXRhYmFzZSBjb25maWd1cmF0aW9uLlxuICovXG50eXBlIEJhc2VEYXRhYmFzZVByb3BzID0ge1xuICB2cGM/OiBJVnBjO1xuICBkYXRhYmFzZU5hbWU6IHN0cmluZztcbiAgaW5zdGFuY2VUeXBlPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBBdXJvcmFEYXRhYmFzZVByb3BzIGV4dGVuZHMgQmFzZURhdGFiYXNlUHJvcHMge1xuICB0eXBlOiBcIkF1cm9yYVwiO1xuICBkYXRhYmFzZUVuZ2luZT86IERhdGFiYXNlRW5naW5lO1xuICAvKiogT3ZlcnJpZGVzIGRhdGFiYXNlRW5naW5lIGlmIHByb3ZpZGVkICovXG4gIGVuZ2luZT86IElDbHVzdGVyRW5naW5lO1xuICB3cml0ZXI/OiBBdXJvcmFXcml0ZXJDb25maWc7XG4gIHJlYWRlcnM/OiBBdXJvcmFSZWFkZXJzQ29uZmlnIHwgZmFsc2U7XG4gIHByb3h5PzogUHJveHlDb25maWcgfCBmYWxzZTtcbiAgY3JlZGVudGlhbHM/OiBDcmVkZW50aWFsc0NvbmZpZztcbiAgLyoqIERFU1RSVUNUSVZFOiBDaGFuZ2luZyBzdG9yYWdlS2V5IGNhdXNlcyBjbHVzdGVyIHJlcGxhY2VtZW50ICovXG4gIGVuY3J5cHRpb24/OiBBdXJvcmFFbmNyeXB0aW9uQ29uZmlnO1xuICBiYWNrdXBSZXRlbnRpb24/OiBudW1iZXI7XG4gIG1vbml0b3JpbmdJbnRlcnZhbD86IER1cmF0aW9uO1xuICBwcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdz86IHN0cmluZztcbiAgcG9ydD86IG51bWJlcjtcbiAgcGVyZm9ybWFuY2VJbnNpZ2h0cz86IFBlcmZvcm1hbmNlSW5zaWdodHNDb25maWcgfCBmYWxzZTtcbiAgLyoqIEFSTiBvciBpZGVudGlmaWVyIG9mIERCIGNsdXN0ZXIgc25hcHNob3QgdG8gcmVzdG9yZSBmcm9tICovXG4gIHNuYXBzaG90SWRlbnRpZmllcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHbG9iYWxBdXJvcmFEYXRhYmFzZVByb3BzIGV4dGVuZHMgQmFzZURhdGFiYXNlUHJvcHMge1xuICB0eXBlOiBcIkdsb2JhbEF1cm9yYVwiO1xuICBwcmltYXJ5UmVnaW9uOiBzdHJpbmc7XG4gIHNlY29uZGFyeVJlZ2lvbnM/OiBzdHJpbmdbXTtcbiAgZ2xvYmFsQ2x1c3RlcklkZW50aWZpZXI/OiBzdHJpbmc7XG4gIGVuYWJsZUdsb2JhbFdyaXRlRm9yd2FyZGluZz86IGJvb2xlYW47XG4gIGRhdGFiYXNlRW5naW5lPzogRGF0YWJhc2VFbmdpbmU7XG4gIC8qKiBPdmVycmlkZXMgZGF0YWJhc2VFbmdpbmUgaWYgcHJvdmlkZWQgKi9cbiAgZW5naW5lPzogSUNsdXN0ZXJFbmdpbmU7XG4gIHdyaXRlcj86IEF1cm9yYVdyaXRlckNvbmZpZztcbiAgcmVhZGVycz86IEF1cm9yYVJlYWRlcnNDb25maWcgfCBmYWxzZTtcbiAgcHJveHk/OiBQcm94eUNvbmZpZyB8IGZhbHNlO1xuICBjcmVkZW50aWFscz86IENyZWRlbnRpYWxzQ29uZmlnO1xuICAvKiogREVTVFJVQ1RJVkU6IENoYW5naW5nIHN0b3JhZ2VLZXkgY2F1c2VzIGNsdXN0ZXIgcmVwbGFjZW1lbnQgKi9cbiAgZW5jcnlwdGlvbj86IEF1cm9yYUVuY3J5cHRpb25Db25maWc7XG4gIGJhY2t1cFJldGVudGlvbj86IG51bWJlcjtcbiAgbW9uaXRvcmluZ0ludGVydmFsPzogRHVyYXRpb247XG4gIHByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93Pzogc3RyaW5nO1xuICBwb3J0PzogbnVtYmVyO1xuICBwZXJmb3JtYW5jZUluc2lnaHRzPzogUGVyZm9ybWFuY2VJbnNpZ2h0c0NvbmZpZyB8IGZhbHNlO1xuICAvKiogQVJOIG9yIGlkZW50aWZpZXIgb2YgREIgY2x1c3RlciBzbmFwc2hvdCB0byByZXN0b3JlIGZyb20gKi9cbiAgc25hcHNob3RJZGVudGlmaWVyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEluc3RhbmNlRGF0YWJhc2VQcm9wcyBleHRlbmRzIEJhc2VEYXRhYmFzZVByb3BzIHtcbiAgdHlwZTogXCJJbnN0YW5jZVwiO1xuICBkYXRhYmFzZUVuZ2luZT86IERhdGFiYXNlRW5naW5lO1xuICAvKiogT3ZlcnJpZGVzIGRhdGFiYXNlRW5naW5lIGlmIHByb3ZpZGVkICovXG4gIGVuZ2luZT86IElJbnN0YW5jZUVuZ2luZTtcbiAgYWxsb2NhdGVkU3RvcmFnZT86IG51bWJlcjtcbiAgcG9ydD86IG51bWJlcjtcbiAgbXVsdGlBej86IGJvb2xlYW47XG4gIHBlcmZvcm1hbmNlSW5zaWdodHM/OiBQZXJmb3JtYW5jZUluc2lnaHRzQ29uZmlnIHwgZmFsc2U7XG4gIHByb3h5PzogUHJveHlDb25maWcgfCBmYWxzZTtcbiAgcmVhZFJlcGxpY2E/OiBSZWFkUmVwbGljYUNvbmZpZyB8IGZhbHNlO1xuICBjcmVkZW50aWFscz86IENyZWRlbnRpYWxzQ29uZmlnO1xuICBlbmNyeXB0aW9uPzogRW5jcnlwdGlvbkNvbmZpZztcbiAgcHVibGljbHlBY2Nlc3NpYmxlPzogYm9vbGVhbjtcbiAgLyoqIEFSTiBvciBpZGVudGlmaWVyIG9mIERCIGluc3RhbmNlIHNuYXBzaG90IHRvIHJlc3RvcmUgZnJvbSAqL1xuICBzbmFwc2hvdElkZW50aWZpZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIElEYXRhYmFzZVByb3BzID1cbiAgfCBBdXJvcmFEYXRhYmFzZVByb3BzXG4gIHwgSW5zdGFuY2VEYXRhYmFzZVByb3BzXG4gIHwgR2xvYmFsQXVyb3JhRGF0YWJhc2VQcm9wcztcblxuLyoqXG4gKiBWYWxpZGF0ZXMgZGF0YWJhc2UgcHJvcHMgYW5kIGxvZ3Mgd2FybmluZ3MgZm9yIGlnbm9yZWQgb3IgbWlzY29uZmlndXJlZCBvcHRpb25zLlxuICogVGhlc2UgY2hlY2tzIGhlbHAgY2F0Y2ggaXNzdWVzIHdoZW4gcHJvcHMgY29tZSBmcm9tIGR5bmFtaWMgc291cmNlcyB3aGVyZVxuICogVHlwZVNjcmlwdCdzIGNvbXBpbGUtdGltZSBjaGVja3MgbWF5IG5vdCBhcHBseS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVEYXRhYmFzZVByb3BzKHByb3BzOiBJRGF0YWJhc2VQcm9wcyk6IHZvaWQge1xuICBjb25zdCBwcm9wc0FueSA9IHByb3BzIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLy8gR2xvYmFsQXVyb3JhIHJlcXVpcmVzIHByaW1hcnlSZWdpb25cbiAgaWYgKHByb3BzLnR5cGUgPT09IFwiR2xvYmFsQXVyb3JhXCIgJiYgIXByb3BzLnByaW1hcnlSZWdpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIkdsb2JhbEF1cm9yYSBkYXRhYmFzZSByZXF1aXJlcyAncHJpbWFyeVJlZ2lvbicuIFwiICtcbiAgICAgICAgXCJTcGVjaWZ5IHRoZSBBV1MgcmVnaW9uIHdoZXJlIHRoZSBwcmltYXJ5IGNsdXN0ZXIgd2lsbCBiZSBjcmVhdGVkLlwiXG4gICAgKTtcbiAgfVxuXG4gIC8vIFdhcm4gYWJvdXQgSW5zdGFuY2Utb25seSBvcHRpb25zIG9uIEF1cm9yYS9HbG9iYWxBdXJvcmFcbiAgaWYgKHByb3BzLnR5cGUgPT09IFwiQXVyb3JhXCIgfHwgcHJvcHMudHlwZSA9PT0gXCJHbG9iYWxBdXJvcmFcIikge1xuICAgIGlmIChcInJlYWRSZXBsaWNhXCIgaW4gcHJvcHNBbnkgJiYgcHJvcHNBbnkucmVhZFJlcGxpY2EgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW0ZqYWxsXSBXYXJuaW5nOiAncmVhZFJlcGxpY2EnIGlzIGlnbm9yZWQgZm9yICR7cHJvcHMudHlwZX0gZGF0YWJhc2VzLiBgICtcbiAgICAgICAgICBcIlVzZSAncmVhZGVycycgY29uZmlndXJhdGlvbiBmb3IgQXVyb3JhIHJlYWQgc2NhbGluZy5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKFwibXVsdGlBelwiIGluIHByb3BzQW55ICYmIHByb3BzQW55Lm11bHRpQXogIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW0ZqYWxsXSBXYXJuaW5nOiAnbXVsdGlBeicgaXMgaWdub3JlZCBmb3IgJHtwcm9wcy50eXBlfSBkYXRhYmFzZXMuIGAgK1xuICAgICAgICAgIFwiQXVyb3JhIHByb3ZpZGVzIGF1dG9tYXRpYyBtdWx0aS1BWiByZXBsaWNhdGlvbi5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgXCJhbGxvY2F0ZWRTdG9yYWdlXCIgaW4gcHJvcHNBbnkgJiZcbiAgICAgIHByb3BzQW55LmFsbG9jYXRlZFN0b3JhZ2UgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW0ZqYWxsXSBXYXJuaW5nOiAnYWxsb2NhdGVkU3RvcmFnZScgaXMgaWdub3JlZCBmb3IgJHtwcm9wcy50eXBlfSBkYXRhYmFzZXMuIGAgK1xuICAgICAgICAgIFwiQXVyb3JhIHVzZXMgYXV0b21hdGljIHN0b3JhZ2Ugc2NhbGluZy5cIlxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBXYXJuIGFib3V0IEF1cm9yYS1vbmx5IG9wdGlvbnMgb24gSW5zdGFuY2VcbiAgaWYgKHByb3BzLnR5cGUgPT09IFwiSW5zdGFuY2VcIikge1xuICAgIGlmIChcInJlYWRlcnNcIiBpbiBwcm9wc0FueSAmJiBwcm9wc0FueS5yZWFkZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJbRmphbGxdIFdhcm5pbmc6ICdyZWFkZXJzJyBpcyBpZ25vcmVkIGZvciBJbnN0YW5jZSBkYXRhYmFzZXMuIFwiICtcbiAgICAgICAgICBcIlVzZSAncmVhZFJlcGxpY2EnIGNvbmZpZ3VyYXRpb24gZm9yIFJEUyBJbnN0YW5jZSByZWFkIHNjYWxpbmcuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcIndyaXRlclwiIGluIHByb3BzQW55ICYmIHByb3BzQW55LndyaXRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiW0ZqYWxsXSBXYXJuaW5nOiAnd3JpdGVyJyBpcyBpZ25vcmVkIGZvciBJbnN0YW5jZSBkYXRhYmFzZXMuIFwiICtcbiAgICAgICAgICBcIldyaXRlciBjb25maWd1cmF0aW9uIG9ubHkgYXBwbGllcyB0byBBdXJvcmEgY2x1c3RlcnMuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIFwiYmFja3VwUmV0ZW50aW9uXCIgaW4gcHJvcHNBbnkgJiZcbiAgICAgIHByb3BzQW55LmJhY2t1cFJldGVudGlvbiAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiW0ZqYWxsXSBXYXJuaW5nOiAnYmFja3VwUmV0ZW50aW9uJyBpbiBkYXlzIGZvcm1hdCBpcyBBdXJvcmEtc3BlY2lmaWMuIFwiICtcbiAgICAgICAgICBcIkZvciBSRFMgSW5zdGFuY2UsIGJhY2t1cCByZXRlbnRpb24gaXMgY29uZmlndXJlZCB2aWEgRHVyYXRpb24gaW4gdGhlIGNvbnN0cnVjdC5cIlxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBXYXJuIGFib3V0IEdsb2JhbEF1cm9yYS1vbmx5IG9wdGlvbnMgb24gbm9uLWdsb2JhbCBkYXRhYmFzZXNcbiAgaWYgKHByb3BzLnR5cGUgIT09IFwiR2xvYmFsQXVyb3JhXCIpIHtcbiAgICBpZiAoXCJwcmltYXJ5UmVnaW9uXCIgaW4gcHJvcHNBbnkgJiYgcHJvcHNBbnkucHJpbWFyeVJlZ2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbRmphbGxdIFdhcm5pbmc6ICdwcmltYXJ5UmVnaW9uJyBpcyBpZ25vcmVkIGZvciAke3Byb3BzLnR5cGV9IGRhdGFiYXNlcy4gYCArXG4gICAgICAgICAgXCJSZWdpb24gY29uZmlndXJhdGlvbiBvbmx5IGFwcGxpZXMgdG8gR2xvYmFsQXVyb3JhLlwiXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBcInNlY29uZGFyeVJlZ2lvbnNcIiBpbiBwcm9wc0FueSAmJlxuICAgICAgcHJvcHNBbnkuc2Vjb25kYXJ5UmVnaW9ucyAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbRmphbGxdIFdhcm5pbmc6ICdzZWNvbmRhcnlSZWdpb25zJyBpcyBpZ25vcmVkIGZvciAke3Byb3BzLnR5cGV9IGRhdGFiYXNlcy4gYCArXG4gICAgICAgICAgXCJNdWx0aS1yZWdpb24gY29uZmlndXJhdGlvbiBvbmx5IGFwcGxpZXMgdG8gR2xvYmFsQXVyb3JhLlwiXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBcImVuYWJsZUdsb2JhbFdyaXRlRm9yd2FyZGluZ1wiIGluIHByb3BzQW55ICYmXG4gICAgICBwcm9wc0FueS5lbmFibGVHbG9iYWxXcml0ZUZvcndhcmRpbmcgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW0ZqYWxsXSBXYXJuaW5nOiAnZW5hYmxlR2xvYmFsV3JpdGVGb3J3YXJkaW5nJyBpcyBpZ25vcmVkIGZvciAke3Byb3BzLnR5cGV9IGRhdGFiYXNlcy4gYCArXG4gICAgICAgICAgXCJXcml0ZSBmb3J3YXJkaW5nIG9ubHkgYXBwbGllcyB0byBHbG9iYWxBdXJvcmEuXCJcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEYXRhYmFzZUZhY3Rvcnkge1xuICBzdGF0aWMgYnVpbGQ8VCBleHRlbmRzIElEYXRhYmFzZVByb3BzPihpZDogc3RyaW5nLCBwcm9wczogVCkge1xuICAgIHJldHVybiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IHtcbiAgICAgIHZhbGlkYXRlRGF0YWJhc2VQcm9wcyhwcm9wcyk7XG5cbiAgICAgIGNvbnN0IGRhdGFiYXNlUHJvcHMgPSB7XG4gICAgICAgIC4uLihwcm9wcyBhcyBhbnkpLFxuICAgICAgICB2cGM6IChwcm9wcy52cGMgfHwgYXBwLmdldFZwYygpKSBhcyBJVnBjXG4gICAgICB9IGFzIFQ7XG4gICAgICByZXR1cm4gbmV3IERhdGFiYXNlKHNjb3BlLCBpZCwgZGF0YWJhc2VQcm9wcyk7XG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGF0YWJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJQ29ubmVjdGFibGUge1xuICBwdWJsaWMgaWQ6IHN0cmluZztcbiAgcHVibGljIHNjb3BlOiBDb25zdHJ1Y3Q7XG4gIHB1YmxpYyB2cGM6IElWcGM7XG5cbiAgcHVibGljIGNvbm5lY3Rpb25zOiBDb25uZWN0aW9ucztcblxuICBwcml2YXRlIGRhdGFiYXNlTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIGRhdGFiYXNlOiBSZHNBdXJvcmEgfCBSZHNJbnN0YW5jZSB8IFJkc0F1cm9yYUdsb2JhbDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogSURhdGFiYXNlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLnNjb3BlID0gc2NvcGU7XG5cbiAgICB0aGlzLmRhdGFiYXNlTmFtZSA9IHByb3BzLmRhdGFiYXNlTmFtZTtcbiAgICB0aGlzLmFkZERhdGFiYXNlKHByb3BzKTtcbiAgfVxuXG4gIGFkZERhdGFiYXNlKHByb3BzOiBJRGF0YWJhc2VQcm9wcykge1xuICAgIHN3aXRjaCAocHJvcHMudHlwZSkge1xuICAgICAgY2FzZSBcIkF1cm9yYVwiOlxuICAgICAgICB0aGlzLmFkZEF1cm9yYShwcm9wcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkdsb2JhbEF1cm9yYVwiOlxuICAgICAgICB0aGlzLmFkZEF1cm9yYUdsb2JhbChwcm9wcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIkluc3RhbmNlXCI6XG4gICAgICAgIHRoaXMuYWRkUmRzSW5zdGFuY2UocHJvcHMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIEV4aGF1c3RpdmVuZXNzIGNoZWNrXG4gICAgICAgIGNvbnN0IF9leGhhdXN0aXZlOiBuZXZlciA9IHByb3BzO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGRhdGFiYXNlIHR5cGUgJHsocHJvcHMgYXMgYW55KS50eXBlfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkQXVyb3JhKHByb3BzOiBBdXJvcmFEYXRhYmFzZVByb3BzKSB7XG4gICAgaWYgKCFwcm9wcy52cGMpIHRocm93IG5ldyBFcnJvcihcIlZQQyBpcyByZXF1aXJlZCBmb3IgQXVyb3JhIGRhdGFiYXNlXCIpO1xuXG4gICAgY29uc3QgcmVzb2x2ZWREYXRhYmFzZUVuZ2luZSA9IHByb3BzLmRhdGFiYXNlRW5naW5lID8/IFwicG9zdGdyZXNxbFwiO1xuICAgIGNvbnN0IHJlc29sdmVkRW5naW5lID1cbiAgICAgIHByb3BzLmVuZ2luZSA/PyBnZXRBdXJvcmFDbHVzdGVyRW5naW5lKHJlc29sdmVkRGF0YWJhc2VFbmdpbmUpO1xuICAgIGNvbnN0IGVuZ2luZUNvbmZpZyA9IGdldEVuZ2luZUNvbmZpZyhyZXNvbHZlZERhdGFiYXNlRW5naW5lKTtcblxuICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUmRzQXVyb3JhKHRoaXMsIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1SZHNgLCB7XG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIGRhdGFiYXNlTmFtZTogcHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgZW5naW5lOiByZXNvbHZlZEVuZ2luZSxcbiAgICAgIGVuZ2luZUNvbmZpZyxcbiAgICAgIHdyaXRlcjogcHJvcHMud3JpdGVyLFxuICAgICAgcmVhZGVyczogcHJvcHMucmVhZGVycyxcbiAgICAgIHByb3h5OiBwcm9wcy5wcm94eSxcbiAgICAgIGNyZWRlbnRpYWxzOiBwcm9wcy5jcmVkZW50aWFscyxcbiAgICAgIGVuY3J5cHRpb246IHByb3BzLmVuY3J5cHRpb24sXG4gICAgICBiYWNrdXBSZXRlbnRpb246IHByb3BzLmJhY2t1cFJldGVudGlvbixcbiAgICAgIG1vbml0b3JpbmdJbnRlcnZhbDogcHJvcHMubW9uaXRvcmluZ0ludGVydmFsLFxuICAgICAgcHJlZmVycmVkTWFpbnRlbmFuY2VXaW5kb3c6IHByb3BzLnByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93LFxuICAgICAgcG9ydDogcHJvcHMucG9ydCxcbiAgICAgIHBlcmZvcm1hbmNlSW5zaWdodHM6IHByb3BzLnBlcmZvcm1hbmNlSW5zaWdodHMsXG4gICAgICBzbmFwc2hvdElkZW50aWZpZXI6IHByb3BzLnNuYXBzaG90SWRlbnRpZmllclxuICAgIH0pO1xuICAgIHRoaXMuY29ubmVjdGlvbnMgPSB0aGlzLmRhdGFiYXNlLmNvbm5lY3Rpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRBdXJvcmFHbG9iYWwocHJvcHM6IEdsb2JhbEF1cm9yYURhdGFiYXNlUHJvcHMpIHtcbiAgICBpZiAoIXByb3BzLnZwYylcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlZQQyBpcyByZXF1aXJlZCBmb3IgR2xvYmFsIEF1cm9yYSBkYXRhYmFzZVwiKTtcbiAgICBpZiAoIXByb3BzLnByaW1hcnlSZWdpb24pXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwcmltYXJ5UmVnaW9uIGlzIHJlcXVpcmVkIGZvciBHbG9iYWwgQXVyb3JhIGRhdGFiYXNlXCIpO1xuXG4gICAgY29uc3QgcmVzb2x2ZWREYXRhYmFzZUVuZ2luZSA9IHByb3BzLmRhdGFiYXNlRW5naW5lID8/IFwicG9zdGdyZXNxbFwiO1xuICAgIGNvbnN0IHJlc29sdmVkRW5naW5lID1cbiAgICAgIHByb3BzLmVuZ2luZSA/PyBnZXRBdXJvcmFDbHVzdGVyRW5naW5lKHJlc29sdmVkRGF0YWJhc2VFbmdpbmUpO1xuICAgIGNvbnN0IGVuZ2luZUNvbmZpZyA9IGdldEVuZ2luZUNvbmZpZyhyZXNvbHZlZERhdGFiYXNlRW5naW5lKTtcblxuICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUmRzQXVyb3JhR2xvYmFsKFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1SZHNHbG9iYWxgLFxuICAgICAge1xuICAgICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgICAgZGF0YWJhc2VOYW1lOiBwcm9wcy5kYXRhYmFzZU5hbWUsXG4gICAgICAgIHByaW1hcnlSZWdpb246IHByb3BzLnByaW1hcnlSZWdpb24sXG4gICAgICAgIHNlY29uZGFyeVJlZ2lvbnM6IHByb3BzLnNlY29uZGFyeVJlZ2lvbnMsXG4gICAgICAgIGdsb2JhbENsdXN0ZXJJZGVudGlmaWVyOiBwcm9wcy5nbG9iYWxDbHVzdGVySWRlbnRpZmllcixcbiAgICAgICAgZW5naW5lOiByZXNvbHZlZEVuZ2luZSxcbiAgICAgICAgZW5naW5lQ29uZmlnLFxuICAgICAgICBlbmFibGVHbG9iYWxXcml0ZUZvcndhcmRpbmc6IHByb3BzLmVuYWJsZUdsb2JhbFdyaXRlRm9yd2FyZGluZyxcbiAgICAgICAgd3JpdGVyOiBwcm9wcy53cml0ZXIsXG4gICAgICAgIHJlYWRlcnM6IHByb3BzLnJlYWRlcnMsXG4gICAgICAgIHByb3h5OiBwcm9wcy5wcm94eSxcbiAgICAgICAgY3JlZGVudGlhbHM6IHByb3BzLmNyZWRlbnRpYWxzLFxuICAgICAgICBlbmNyeXB0aW9uOiBwcm9wcy5lbmNyeXB0aW9uLFxuICAgICAgICBiYWNrdXBSZXRlbnRpb246IHByb3BzLmJhY2t1cFJldGVudGlvbixcbiAgICAgICAgbW9uaXRvcmluZ0ludGVydmFsOiBwcm9wcy5tb25pdG9yaW5nSW50ZXJ2YWwsXG4gICAgICAgIHByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93OiBwcm9wcy5wcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdyxcbiAgICAgICAgcG9ydDogcHJvcHMucG9ydCxcbiAgICAgICAgcGVyZm9ybWFuY2VJbnNpZ2h0czogcHJvcHMucGVyZm9ybWFuY2VJbnNpZ2h0cyxcbiAgICAgICAgc25hcHNob3RJZGVudGlmaWVyOiBwcm9wcy5zbmFwc2hvdElkZW50aWZpZXJcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMuY29ubmVjdGlvbnMgPSB0aGlzLmRhdGFiYXNlLmNvbm5lY3Rpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRSZHNJbnN0YW5jZShwcm9wczogSW5zdGFuY2VEYXRhYmFzZVByb3BzKSB7XG4gICAgaWYgKCFwcm9wcy52cGMpIHRocm93IG5ldyBFcnJvcihcIlZQQyBpcyByZXF1aXJlZCBmb3IgSW5zdGFuY2UgZGF0YWJhc2VcIik7XG5cbiAgICBjb25zdCByZXNvbHZlZERhdGFiYXNlRW5naW5lID0gcHJvcHMuZGF0YWJhc2VFbmdpbmUgPz8gXCJwb3N0Z3Jlc3FsXCI7XG4gICAgY29uc3QgcmVzb2x2ZWRFbmdpbmUgPVxuICAgICAgcHJvcHMuZW5naW5lID8/IGdldEluc3RhbmNlRW5naW5lKHJlc29sdmVkRGF0YWJhc2VFbmdpbmUpO1xuICAgIGNvbnN0IGVuZ2luZUNvbmZpZyA9IGdldEVuZ2luZUNvbmZpZyhyZXNvbHZlZERhdGFiYXNlRW5naW5lKTtcblxuICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgUmRzSW5zdGFuY2UodGhpcywgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVJkc2AsIHtcbiAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgZGF0YWJhc2VOYW1lOiBwcm9wcy5kYXRhYmFzZU5hbWUsXG4gICAgICBpbnN0YW5jZVR5cGU6IHByb3BzLmluc3RhbmNlVHlwZSxcbiAgICAgIGFsbG9jYXRlZFN0b3JhZ2U6IHByb3BzLmFsbG9jYXRlZFN0b3JhZ2UsXG4gICAgICBwb3J0OiBwcm9wcy5wb3J0LFxuICAgICAgZW5naW5lOiByZXNvbHZlZEVuZ2luZSxcbiAgICAgIGVuZ2luZUNvbmZpZyxcbiAgICAgIG11bHRpQXo6IHByb3BzLm11bHRpQXosXG4gICAgICBwZXJmb3JtYW5jZUluc2lnaHRzOiBwcm9wcy5wZXJmb3JtYW5jZUluc2lnaHRzLFxuICAgICAgcHJveHk6IHByb3BzLnByb3h5LFxuICAgICAgcmVhZFJlcGxpY2E6IHByb3BzLnJlYWRSZXBsaWNhLFxuICAgICAgY3JlZGVudGlhbHM6IHByb3BzLmNyZWRlbnRpYWxzLFxuICAgICAgZW5jcnlwdGlvbjogcHJvcHMuZW5jcnlwdGlvbixcbiAgICAgIHB1YmxpY2x5QWNjZXNzaWJsZTogcHJvcHMucHVibGljbHlBY2Nlc3NpYmxlLFxuICAgICAgc25hcHNob3RJZGVudGlmaWVyOiBwcm9wcy5zbmFwc2hvdElkZW50aWZpZXJcbiAgICB9KTtcbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gdGhpcy5kYXRhYmFzZS5jb25uZWN0aW9ucztcbiAgfVxuXG4gIGdldENyZWRlbnRpYWxzKCk6IFNlY3JldCB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZ2V0Q3JlZGVudGlhbHMoKTtcbiAgfVxuXG4gIGdldEhvc3RFbmRwb2ludCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmdldEhvc3RFbmRwb2ludCgpO1xuICB9XG5cbiAgZ2V0SG9zdFBvcnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXRIb3N0UG9ydCgpO1xuICB9XG5cbiAgZ2V0RGF0YWJhc2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YWJhc2VOYW1lO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { BlockDevice, IMachineImage, IVpc, SubnetType, UserData, SecurityGroup, IConnectable, Connections } from "aws-cdk-lib/aws-ec2";
|
|
2
|
+
import { Construct } from "constructs";
|
|
3
|
+
import { StackProps } from "aws-cdk-lib";
|
|
4
|
+
import { Role } from "aws-cdk-lib/aws-iam";
|
|
5
|
+
import { KeyValue } from "../../types";
|
|
6
|
+
interface ExistingVpcConfig {
|
|
7
|
+
vpcId?: string;
|
|
8
|
+
subnetType?: SubnetType;
|
|
9
|
+
}
|
|
10
|
+
interface NewVpcConfig {
|
|
11
|
+
subnetType: SubnetType;
|
|
12
|
+
}
|
|
13
|
+
export type VpcProps = ExistingVpcConfig | NewVpcConfig;
|
|
14
|
+
interface Ec2InstanceProps extends StackProps {
|
|
15
|
+
spotCapacityPercentage?: number;
|
|
16
|
+
blockDevices?: BlockDevice[];
|
|
17
|
+
accountId?: string;
|
|
18
|
+
serviceName: string;
|
|
19
|
+
vpc: VpcProps;
|
|
20
|
+
minCapcity?: number;
|
|
21
|
+
maxCapacity?: number;
|
|
22
|
+
instanceType: string;
|
|
23
|
+
machineImage?: IMachineImage;
|
|
24
|
+
userData?: UserData;
|
|
25
|
+
role?: Role;
|
|
26
|
+
enableSSH?: boolean;
|
|
27
|
+
tags: KeyValue;
|
|
28
|
+
}
|
|
29
|
+
export declare class Ec2Instance extends Construct implements IConnectable {
|
|
30
|
+
private launchTemplate;
|
|
31
|
+
vpc: IVpc;
|
|
32
|
+
asgSecurityGroup: SecurityGroup;
|
|
33
|
+
private autoScalingGroup;
|
|
34
|
+
private keyPair;
|
|
35
|
+
constructor(scope: Construct, id: string, props: Ec2InstanceProps);
|
|
36
|
+
connections: Connections;
|
|
37
|
+
addVpc(props: Ec2InstanceProps): void;
|
|
38
|
+
addKeyPair(props: Ec2InstanceProps): void;
|
|
39
|
+
addLaunchTemplate(props: Ec2InstanceProps): void;
|
|
40
|
+
addAutoScalingGroup(props: Ec2InstanceProps): void;
|
|
41
|
+
suspendAutoScaling(): void;
|
|
42
|
+
}
|
|
43
|
+
export {};
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Ec2Instance = void 0;
|
|
4
|
+
const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
|
|
5
|
+
const constructs_1 = require("constructs");
|
|
6
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
7
|
+
const tagResource_1 = require("../../utils/tagResource");
|
|
8
|
+
const aws_autoscaling_1 = require("aws-cdk-lib/aws-autoscaling");
|
|
9
|
+
const awsCustomResource_1 = require("../../resources/aws/utilities/awsCustomResource");
|
|
10
|
+
const custom_resources_1 = require("aws-cdk-lib/custom-resources");
|
|
11
|
+
const vpc_1 = require("../../resources/aws/networking/vpc");
|
|
12
|
+
class Ec2Instance extends constructs_1.Construct {
|
|
13
|
+
constructor(scope, id, props) {
|
|
14
|
+
super(scope, id);
|
|
15
|
+
this.addVpc(props);
|
|
16
|
+
if (props.enableSSH) {
|
|
17
|
+
this.addKeyPair(props);
|
|
18
|
+
}
|
|
19
|
+
this.addLaunchTemplate(props);
|
|
20
|
+
this.addAutoScalingGroup(props);
|
|
21
|
+
this.suspendAutoScaling();
|
|
22
|
+
//TODO: Add load balancer as boolean prop, then configure load balancer
|
|
23
|
+
}
|
|
24
|
+
addVpc(props) {
|
|
25
|
+
if ("vpcId" in props.vpc) {
|
|
26
|
+
this.vpc = vpc_1.Vpc.fromLookup(this, `${props.serviceName}Vpc`, {
|
|
27
|
+
vpcId: props.vpc.vpcId
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
this.vpc = new vpc_1.Vpc(this, `${props.serviceName}Vpc`, {
|
|
32
|
+
accountId: props.accountId,
|
|
33
|
+
tags: props.tags,
|
|
34
|
+
subnetConfiguration: [
|
|
35
|
+
{
|
|
36
|
+
name: `${props.serviceName}`,
|
|
37
|
+
subnetType: props.vpc.subnetType || aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
addKeyPair(props) {
|
|
44
|
+
// TODO: Breakout into a seperate construct for use with better prop handling
|
|
45
|
+
this.keyPair = new aws_ec2_1.KeyPair(this, "KeyPair", {
|
|
46
|
+
keyPairName: `${props.serviceName}KeyPair`
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
addLaunchTemplate(props) {
|
|
50
|
+
this.asgSecurityGroup = new aws_ec2_1.SecurityGroup(this, `AsgSecurityGroup`, {
|
|
51
|
+
vpc: this.vpc,
|
|
52
|
+
description: `Security group for the ${props.serviceName} auto scaling group`
|
|
53
|
+
});
|
|
54
|
+
if (props.enableSSH) {
|
|
55
|
+
this.asgSecurityGroup.addIngressRule(aws_ec2_1.Peer.anyIpv4(), aws_ec2_1.Port.tcp(22), "Allow SSH");
|
|
56
|
+
}
|
|
57
|
+
this.launchTemplate = new aws_ec2_1.LaunchTemplate(this, "LaunchTemplate", {
|
|
58
|
+
launchTemplateName: `${props.serviceName}LaunchTemplate`,
|
|
59
|
+
instanceType: new aws_ec2_1.InstanceType(`${props.instanceType}`),
|
|
60
|
+
machineImage: props.machineImage || aws_ec2_1.MachineImage.latestAmazonLinux2(),
|
|
61
|
+
userData: props.userData,
|
|
62
|
+
role: props.role,
|
|
63
|
+
blockDevices: props?.blockDevices,
|
|
64
|
+
securityGroup: this.asgSecurityGroup,
|
|
65
|
+
detailedMonitoring: true,
|
|
66
|
+
requireImdsv2: true,
|
|
67
|
+
httpPutResponseHopLimit: 2,
|
|
68
|
+
httpTokens: aws_ec2_1.LaunchTemplateHttpTokens.REQUIRED,
|
|
69
|
+
instanceMetadataTags: true,
|
|
70
|
+
keyPair: this.keyPair
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
addAutoScalingGroup(props) {
|
|
74
|
+
// TODO: Support spot instances
|
|
75
|
+
// TODO: Handle terminating EC2 instances when updating, currently hangs.
|
|
76
|
+
this.autoScalingGroup = new aws_autoscaling_1.AutoScalingGroup(this, "AutoScalingGroup", {
|
|
77
|
+
vpc: this.vpc,
|
|
78
|
+
vpcSubnets: {
|
|
79
|
+
subnetType: props.enableSSH ? aws_ec2_1.SubnetType.PUBLIC : undefined
|
|
80
|
+
},
|
|
81
|
+
minCapacity: props.minCapcity,
|
|
82
|
+
maxCapacity: props.maxCapacity,
|
|
83
|
+
launchTemplate: this.launchTemplate,
|
|
84
|
+
cooldown: aws_cdk_lib_1.Duration.seconds(60),
|
|
85
|
+
groupMetrics: [aws_autoscaling_1.GroupMetrics.all()],
|
|
86
|
+
updatePolicy: aws_autoscaling_1.UpdatePolicy.replacingUpdate(),
|
|
87
|
+
newInstancesProtectedFromScaleIn: true,
|
|
88
|
+
// securityGroup: this.asgSecurityGroup,
|
|
89
|
+
terminationPolicies: [
|
|
90
|
+
aws_autoscaling_1.TerminationPolicy.OLDEST_LAUNCH_CONFIGURATION,
|
|
91
|
+
aws_autoscaling_1.TerminationPolicy.CLOSEST_TO_NEXT_INSTANCE_HOUR
|
|
92
|
+
],
|
|
93
|
+
ssmSessionPermissions: true
|
|
94
|
+
});
|
|
95
|
+
(0, tagResource_1.default)(this.autoScalingGroup, props.tags);
|
|
96
|
+
}
|
|
97
|
+
suspendAutoScaling() {
|
|
98
|
+
new awsCustomResource_1.AwsCustomResource(this, "SuspendAutoscaling", {
|
|
99
|
+
functionName: "suspendAutoScaling",
|
|
100
|
+
onCreate: {
|
|
101
|
+
service: "AutoScaling",
|
|
102
|
+
action: "suspendProcesses",
|
|
103
|
+
parameters: {
|
|
104
|
+
AutoScalingGroupName: this.autoScalingGroup.autoScalingGroupName,
|
|
105
|
+
ScalingProcesses: ["AZRebalance"]
|
|
106
|
+
},
|
|
107
|
+
physicalResourceId: custom_resources_1.PhysicalResourceId.of("suspendAutoScaling")
|
|
108
|
+
},
|
|
109
|
+
onUpdate: {
|
|
110
|
+
service: "AutoScaling",
|
|
111
|
+
action: "suspendProcesses",
|
|
112
|
+
parameters: {
|
|
113
|
+
AutoScalingGroupName: this.autoScalingGroup.autoScalingGroupName,
|
|
114
|
+
ScalingProcesses: ["AZRebalance"]
|
|
115
|
+
},
|
|
116
|
+
physicalResourceId: custom_resources_1.PhysicalResourceId.of("suspendAutoScaling")
|
|
117
|
+
},
|
|
118
|
+
resourceType: "Custom::suspendAutoscaling"
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
exports.Ec2Instance = Ec2Instance;
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWMyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL3BhdHRlcm5zL2F3cy9lYzIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaURBaUI2QjtBQUM3QiwyQ0FBdUM7QUFDdkMsNkNBQW1EO0FBQ25ELHlEQUFrRDtBQUVsRCxpRUFLcUM7QUFFckMsdUZBQW9GO0FBQ3BGLG1FQUFrRTtBQUNsRSw0REFBeUQ7QUE2QnpELE1BQWEsV0FBWSxTQUFRLHNCQUFTO0lBT3hDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBdUI7UUFDL0QsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25CLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsQ0FBQztRQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFFMUIsdUVBQXVFO0lBQ3pFLENBQUM7SUFHRCxNQUFNLENBQUMsS0FBdUI7UUFDNUIsSUFBSSxPQUFPLElBQUksS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxHQUFHLEdBQUcsU0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsV0FBVyxLQUFLLEVBQUU7Z0JBQ3pELEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUs7YUFDdkIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksU0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxX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QXdDO1lBQ3hDLG1CQUFtQixFQUFFO2dCQUNuQixtQ0FBaUIsQ0FBQywyQkFBMkI7Z0JBQzdDLG1DQUFpQixDQUFDLDZCQUE2QjthQUNoRDtZQUNELHFCQUFxQixFQUFFLElBQUk7U0FDNUIsQ0FBQyxDQUFDO1FBQ0gsSUFBQSxxQkFBVyxFQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLHFDQUFpQixDQUFDLElBQUksRUFBRSxvQkFBb0IsRUFBRTtZQUNoRCxZQUFZLEVBQUUsb0JBQW9CO1lBQ2xDLFFBQVEsRUFBRTtnQkFDUixPQUFPLEVBQUUsYUFBYTtnQkFDdEIsTUFBTSxFQUFFLGtCQUFrQjtnQkFDMUIsVUFBVSxFQUFFO29CQUNWLG9CQUFvQixFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0I7b0JBQ2hFLGdCQUFnQixFQUFFLENBQUMsYUFBYSxDQUFDO2lCQUNsQztnQkFDRCxrQkFBa0IsRUFBRSxxQ0FBa0IsQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUM7YUFDaEU7WUFDRCxRQUFRLEVBQUU7Z0JBQ1IsT0FBTyxFQUFFLGFBQWE7Z0JBQ3RCLE1BQU0sRUFBRSxrQkFBa0I7Z0JBQzFCLFVBQVUsRUFBRTtvQkFDVixvQkFBb0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CO29CQUNoRSxnQkFBZ0IsRUFBRSxDQUFDLGFBQWEsQ0FBQztpQkFDbEM7Z0JBQ0Qsa0JBQWtCLEVBQUUscUNBQWtCLENBQUMsRUFBRSxDQUFDLG9CQUFvQixDQUFDO2FBQ2hFO1lBQ0QsWUFBWSxFQUFFLDRCQUE0QjtTQUMzQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFoSUQsa0NBZ0lDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQmxvY2tEZXZpY2UsXG4gIElNYWNoaW5lSW1hZ2UsXG4gIEluc3RhbmNlVHlwZSxcbiAgSVZwYyxcbiAgTGF1bmNoVGVtcGxhdGUsXG4gIFN1Ym5ldFR5cGUsXG4gIFVzZXJEYXRhLFxuICBNYWNoaW5lSW1hZ2UsXG4gIExhdW5jaFRlbXBsYXRlSHR0cFRva2VucyxcbiAgS2V5UGFpcixcbiAgSUtleVBhaXIsXG4gIFNlY3VyaXR5R3JvdXAsXG4gIFBlZXIsXG4gIFBvcnQsXG4gIElDb25uZWN0YWJsZSxcbiAgQ29ubmVjdGlvbnNcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBEdXJhdGlvbiwgU3RhY2tQcm9wcyB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHRhZ1Jlc291cmNlIGZyb20gXCIuLi8uLi91dGlscy90YWdSZXNvdXJjZVwiO1xuaW1wb3J0IHsgUm9sZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQge1xuICBBdXRvU2NhbGluZ0dyb3VwLFxuICBHcm91cE1ldHJpY3MsXG4gIFRlcm1pbmF0aW9uUG9saWN5LFxuICBVcGRhdGVQb2xpY3lcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1hdXRvc2NhbGluZ1wiO1xuaW1wb3J0IHsgS2V5VmFsdWUgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IEF3c0N1c3RvbVJlc291cmNlIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvdXRpbGl0aWVzL2F3c0N1c3RvbVJlc291cmNlXCI7XG5pbXBvcnQgeyBQaHlzaWNhbFJlc291cmNlSWQgfSBmcm9tIFwiYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlc1wiO1xuaW1wb3J0IHsgVnBjIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvbmV0d29ya2luZy92cGNcIjtcblxuaW50ZXJmYWNlIEV4aXN0aW5nVnBjQ29uZmlnIHtcbiAgdnBjSWQ/OiBzdHJpbmc7XG4gIHN1Ym5ldFR5cGU/OiBTdWJuZXRUeXBlO1xufVxuXG5pbnRlcmZhY2UgTmV3VnBjQ29uZmlnIHtcbiAgc3VibmV0VHlwZTogU3VibmV0VHlwZTtcbn1cblxuZXhwb3J0IHR5cGUgVnBjUHJvcHMgPSBFeGlzdGluZ1ZwY0NvbmZpZyB8IE5ld1ZwY0NvbmZpZztcblxuaW50ZXJmYWNlIEVjMkluc3RhbmNlUHJvcHMgZXh0ZW5kcyBTdGFja1Byb3BzIHtcbiAgc3BvdENhcGFjaXR5UGVyY2VudGFnZT86IG51bWJlcjtcbiAgYmxvY2tEZXZpY2VzPzogQmxvY2tEZXZpY2VbXTtcbiAgYWNjb3VudElkPzogc3RyaW5nO1xuICBzZXJ2aWNlTmFtZTogc3RyaW5nO1xuICB2cGM6IFZwY1Byb3BzO1xuICBtaW5DYXBjaXR5PzogbnVtYmVyO1xuICBtYXhDYXBhY2l0eT86IG51bWJlcjtcbiAgaW5zdGFuY2VUeXBlOiBzdHJpbmc7XG4gIG1hY2hpbmVJbWFnZT86IElNYWNoaW5lSW1hZ2U7XG4gIHVzZXJEYXRhPzogVXNlckRhdGE7XG4gIHJvbGU/OiBSb2xlO1xuICBlbmFibGVTU0g/OiBib29sZWFuO1xuICB0YWdzOiBLZXlWYWx1ZTtcbn1cblxuZXhwb3J0IGNsYXNzIEVjMkluc3RhbmNlIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSUNvbm5lY3RhYmxlIHtcbiAgcHJpdmF0ZSBsYXVuY2hUZW1wbGF0ZTogTGF1bmNoVGVtcGxhdGU7XG4gIHB1YmxpYyB2cGM6IElWcGM7XG4gIHB1YmxpYyBhc2dTZWN1cml0eUdyb3VwOiBTZWN1cml0eUdyb3VwO1xuICBwcml2YXRlIGF1dG9TY2FsaW5nR3JvdXA6IEF1dG9TY2FsaW5nR3JvdXA7XG4gIHByaXZhdGUga2V5UGFpcjogSUtleVBhaXI7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEVjMkluc3RhbmNlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5hZGRWcGMocHJvcHMpO1xuICAgIGlmIChwcm9wcy5lbmFibGVTU0gpIHtcbiAgICAgIHRoaXMuYWRkS2V5UGFpcihwcm9wcyk7XG4gICAgfVxuICAgIHRoaXMuYWRkTGF1bmNoVGVtcGxhdGUocHJvcHMpO1xuICAgIHRoaXMuYWRkQXV0b1NjYWxpbmdHcm91cChwcm9wcyk7XG4gICAgdGhpcy5zdXNwZW5kQXV0b1NjYWxpbmcoKTtcblxuICAgIC8vVE9ETzogQWRkIGxvYWQgYmFsYW5jZXIgYXMgYm9vbGVhbiBwcm9wLCB0aGVuIGNvbmZpZ3VyZSBsb2FkIGJhbGFuY2VyXG4gIH1cbiAgY29ubmVjdGlvbnM6IENvbm5lY3Rpb25zO1xuXG4gIGFkZFZwYyhwcm9wczogRWMySW5zdGFuY2VQcm9wcykge1xuICAgIGlmIChcInZwY0lkXCIgaW4gcHJvcHMudnBjKSB7XG4gICAgICB0aGlzLnZwYyA9IFZwYy5mcm9tTG9va3VwKHRoaXMsIGAke3Byb3BzLnNlcnZpY2VOYW1lfVZwY2AsIHtcbiAgICAgICAgdnBjSWQ6IHByb3BzLnZwYy52cGNJZFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudnBjID0gbmV3IFZwYyh0aGlzLCBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1WcGNgLCB7XG4gICAgICAgIGFjY291bnRJZDogcHJvcHMuYWNjb3VudElkLFxuICAgICAgICB0YWdzOiBwcm9wcy50YWdzLFxuICAgICAgICBzdWJuZXRDb25maWd1cmF0aW9uOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogYCR7cHJvcHMuc2VydmljZU5hbWV9YCxcbiAgICAgICAgICAgIHN1Ym5ldFR5cGU6IHByb3BzLnZwYy5zdWJuZXRUeXBlIHx8IFN1Ym5ldFR5cGUuUFJJVkFURV9XSVRIX0VHUkVTU1xuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgYWRkS2V5UGFpcihwcm9wczogRWMySW5zdGFuY2VQcm9wcykge1xuICAgIC8vIFRPRE86IEJyZWFrb3V0IGludG8gYSBzZXBlcmF0ZSBjb25zdHJ1Y3QgZm9yIHVzZSB3aXRoIGJldHRlciBwcm9wIGhhbmRsaW5nXG4gICAgdGhpcy5rZXlQYWlyID0gbmV3IEtleVBhaXIodGhpcywgXCJLZXlQYWlyXCIsIHtcbiAgICAgIGtleVBhaXJOYW1lOiBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1LZXlQYWlyYFxuICAgIH0pO1xuICB9XG5cbiAgYWRkTGF1bmNoVGVtcGxhdGUocHJvcHM6IEVjMkluc3RhbmNlUHJvcHMpIHtcbiAgICB0aGlzLmFzZ1NlY3VyaXR5R3JvdXAgPSBuZXcgU2VjdXJpdHlHcm91cCh0aGlzLCBgQXNnU2VjdXJpdHlHcm91cGAsIHtcbiAgICAgIHZwYzogdGhpcy52cGMsXG4gICAgICBkZXNjcmlwdGlvbjogYFNlY3VyaXR5IGdyb3VwIGZvciB0aGUgJHtwcm9wcy5zZXJ2aWNlTmFtZX0gYXV0byBzY2FsaW5nIGdyb3VwYFxuICAgIH0pO1xuXG4gICAgaWYgKHByb3BzLmVuYWJsZVNTSCkge1xuICAgICAgdGhpcy5hc2dTZWN1cml0eUdyb3VwLmFkZEluZ3Jlc3NSdWxlKFxuICAgICAgICBQZWVyLmFueUlwdjQoKSxcbiAgICAgICAgUG9ydC50Y3AoMjIpLFxuICAgICAgICBcIkFsbG93IFNTSFwiXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMubGF1bmNoVGVtcGxhdGUgPSBuZXcgTGF1bmNoVGVtcGxhdGUodGhpcywgXCJMYXVuY2hUZW1wbGF0ZVwiLCB7XG4gICAgICBsYXVuY2hUZW1wbGF0ZU5hbWU6IGAke3Byb3BzLnNlcnZpY2VOYW1lfUxhdW5jaFRlbXBsYXRlYCxcbiAgICAgIGluc3RhbmNlVHlwZTogbmV3IEluc3RhbmNlVHlwZShgJHtwcm9wcy5pbnN0YW5jZVR5cGV9YCksXG4gICAgICBtYWNoaW5lSW1hZ2U6IHByb3BzLm1hY2hpbmVJbWFnZSB8fCBNYWNoaW5lSW1hZ2UubGF0ZXN0QW1hem9uTGludXgyKCksXG4gICAgICB1c2VyRGF0YTogcHJvcHMudXNlckRhdGEsXG4gICAgICByb2xlOiBwcm9wcy5yb2xlLFxuICAgICAgYmxvY2tEZXZpY2VzOiBwcm9wcz8uYmxvY2tEZXZpY2VzLFxuICAgICAgc2VjdXJpdHlHcm91cDogdGhpcy5hc2dTZWN1cml0eUdyb3VwLFxuICAgICAgZGV0YWlsZWRNb25pdG9yaW5nOiB0cnVlLFxuICAgICAgcmVxdWlyZUltZHN2MjogdHJ1ZSxcbiAgICAgIGh0dHBQdXRSZXNwb25zZUhvcExpbWl0OiAyLFxuICAgICAgaHR0cFRva2VuczogTGF1bmNoVGVtcGxhdGVIdHRwVG9rZW5zLlJFUVVJUkVELFxuICAgICAgaW5zdGFuY2VNZXRhZGF0YVRhZ3M6IHRydWUsXG4gICAgICBrZXlQYWlyOiB0aGlzLmtleVBhaXJcbiAgICB9KTtcbiAgfVxuXG4gIGFkZEF1dG9TY2FsaW5nR3JvdXAocHJvcHM6IEVjMkluc3RhbmNlUHJvcHMpIHtcbiAgICAvLyBUT0RPOiBTdXBwb3J0IHNwb3QgaW5zdGFuY2VzXG4gICAgLy8gVE9ETzogSGFuZGxlIHRlcm1pbmF0aW5nIEVDMiBpbnN0YW5jZXMgd2hlbiB1cGRhdGluZywgY3VycmVudGx5IGhhbmdzLlxuICAgIHRoaXMuYXV0b1NjYWxpbmdHcm91cCA9IG5ldyBBdXRvU2NhbGluZ0dyb3VwKHRoaXMsIFwiQXV0b1NjYWxpbmdHcm91cFwiLCB7XG4gICAgICB2cGM6IHRoaXMudnBjLFxuICAgICAgdnBjU3VibmV0czoge1xuICAgICAgICBzdWJuZXRUeXBlOiBwcm9wcy5lbmFibGVTU0ggPyBTdWJuZXRUeXBlLlBVQkxJQyA6IHVuZGVmaW5lZFxuICAgICAgfSxcbiAgICAgIG1pbkNhcGFjaXR5OiBwcm9wcy5taW5DYXBjaXR5LFxuICAgICAgbWF4Q2FwYWNpdHk6IHByb3BzLm1heENhcGFjaXR5LFxuICAgICAgbGF1bmNoVGVtcGxhdGU6IHRoaXMubGF1bmNoVGVtcGxhdGUsXG4gICAgICBjb29sZG93bjogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICBncm91cE1ldHJpY3M6IFtHcm91cE1ldHJpY3MuYWxsKCldLFxuICAgICAgdXBkYXRlUG9saWN5OiBVcGRhdGVQb2xpY3kucmVwbGFjaW5nVXBkYXRlKCksXG4gICAgICBuZXdJbnN0YW5jZXNQcm90ZWN0ZWRGcm9tU2NhbGVJbjogdHJ1ZSxcbiAgICAgIC8vIHNlY3VyaXR5R3JvdXA6IHRoaXMuYXNnU2VjdXJpdHlHcm91cCxcbiAgICAgIHRlcm1pbmF0aW9uUG9saWNpZXM6IFtcbiAgICAgICAgVGVybWluYXRpb25Qb2xpY3kuT0xERVNUX0xBVU5DSF9DT05GSUdVUkFUSU9OLFxuICAgICAgICBUZXJtaW5hdGlvblBvbGljeS5DTE9TRVNUX1RPX05FWFRfSU5TVEFOQ0VfSE9VUlxuICAgICAgXSxcbiAgICAgIHNzbVNlc3Npb25QZXJtaXNzaW9uczogdHJ1ZVxuICAgIH0pO1xuICAgIHRhZ1Jlc291cmNlKHRoaXMuYXV0b1NjYWxpbmdHcm91cCwgcHJvcHMudGFncyk7XG4gIH1cblxuICBzdXNwZW5kQXV0b1NjYWxpbmcoKSB7XG4gICAgbmV3IEF3c0N1c3RvbVJlc291cmNlKHRoaXMsIFwiU3VzcGVuZEF1dG9zY2FsaW5nXCIsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogXCJzdXNwZW5kQXV0b1NjYWxpbmdcIixcbiAgICAgIG9uQ3JlYXRlOiB7XG4gICAgICAgIHNlcnZpY2U6IFwiQXV0b1NjYWxpbmdcIixcbiAgICAgICAgYWN0aW9uOiBcInN1c3BlbmRQcm9jZXNzZXNcIixcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIEF1dG9TY2FsaW5nR3JvdXBOYW1lOiB0aGlzLmF1dG9TY2FsaW5nR3JvdXAuYXV0b1NjYWxpbmdHcm91cE5hbWUsXG4gICAgICAgICAgU2NhbGluZ1Byb2Nlc3NlczogW1wiQVpSZWJhbGFuY2VcIl1cbiAgICAgICAgfSxcbiAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOiBQaHlzaWNhbFJlc291cmNlSWQub2YoXCJzdXNwZW5kQXV0b1NjYWxpbmdcIilcbiAgICAgIH0sXG4gICAgICBvblVwZGF0ZToge1xuICAgICAgICBzZXJ2aWNlOiBcIkF1dG9TY2FsaW5nXCIsXG4gICAgICAgIGFjdGlvbjogXCJzdXNwZW5kUHJvY2Vzc2VzXCIsXG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBBdXRvU2NhbGluZ0dyb3VwTmFtZTogdGhpcy5hdXRvU2NhbGluZ0dyb3VwLmF1dG9TY2FsaW5nR3JvdXBOYW1lLFxuICAgICAgICAgIFNjYWxpbmdQcm9jZXNzZXM6IFtcIkFaUmViYWxhbmNlXCJdXG4gICAgICAgIH0sXG4gICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogUGh5c2ljYWxSZXNvdXJjZUlkLm9mKFwic3VzcGVuZEF1dG9TY2FsaW5nXCIpXG4gICAgICB9LFxuICAgICAgcmVzb3VyY2VUeXBlOiBcIkN1c3RvbTo6c3VzcGVuZEF1dG9zY2FsaW5nXCJcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { Stack, StackProps } from "aws-cdk-lib";
|
|
2
|
-
import { Construct } from "constructs";
|
|
3
|
-
import { KeyValue } from "../../types";
|
|
4
|
-
import { Connections } from "aws-cdk-lib/aws-ec2";
|
|
5
|
-
import { IVpc } from "aws-cdk-lib/aws-ec2";
|
|
1
|
+
import { Stack, type StackProps } from "aws-cdk-lib";
|
|
2
|
+
import { type Construct } from "constructs";
|
|
3
|
+
import { type KeyValue } from "../../types";
|
|
4
|
+
import { type Connections } from "aws-cdk-lib/aws-ec2";
|
|
5
|
+
import { type IVpc } from "aws-cdk-lib/aws-ec2";
|
|
6
6
|
interface ProxyAgentProps extends StackProps {
|
|
7
7
|
accountId?: string;
|
|
8
8
|
vpc?: IVpc;
|