@aws-cdk/app-staging-synthesizer-alpha 2.82.0-alpha.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/.jsii +5029 -0
- package/.jsii.tabl.json.gz +0 -0
- package/.warnings.jsii.js +169 -0
- package/LICENSE +201 -0
- package/NOTICE +2 -0
- package/README.md +401 -0
- package/adr/resource-names.md +30 -0
- package/jest.config.js +4 -0
- package/lib/app-staging-synthesizer.d.ts +125 -0
- package/lib/app-staging-synthesizer.js +255 -0
- package/lib/bootstrap-roles.d.ts +93 -0
- package/lib/bootstrap-roles.js +98 -0
- package/lib/default-staging-stack.d.ts +151 -0
- package/lib/default-staging-stack.js +285 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.js +21 -0
- package/lib/per-env-staging-factory.d.ts +10 -0
- package/lib/per-env-staging-factory.js +32 -0
- package/lib/private/app-global.d.ts +16 -0
- package/lib/private/app-global.js +34 -0
- package/lib/private/no-tokens.d.ts +1 -0
- package/lib/private/no-tokens.js +13 -0
- package/lib/staging-stack.d.ts +107 -0
- package/lib/staging-stack.js +3 -0
- package/package.json +105 -0
- package/rosetta/_generated.ts-fixture +6 -0
- package/rosetta/default.ts-fixture +22 -0
- package/rosetta/with-custom-staging.ts-fixture +44 -0
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.AppStagingSynthesizer = void 0;
|
|
5
|
+
const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
|
|
6
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
7
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
8
|
+
const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal");
|
|
9
|
+
const bootstrap_roles_1 = require("./bootstrap-roles");
|
|
10
|
+
const default_staging_stack_1 = require("./default-staging-stack");
|
|
11
|
+
const per_env_staging_factory_1 = require("./per-env-staging-factory");
|
|
12
|
+
const app_global_1 = require("./private/app-global");
|
|
13
|
+
const no_tokens_1 = require("./private/no-tokens");
|
|
14
|
+
const AGNOSTIC_STACKS = new app_global_1.AppScopedGlobal(() => new Set());
|
|
15
|
+
const ENV_AWARE_STACKS = new app_global_1.AppScopedGlobal(() => new Set());
|
|
16
|
+
/**
|
|
17
|
+
* App Staging Synthesizer
|
|
18
|
+
*/
|
|
19
|
+
class AppStagingSynthesizer extends aws_cdk_lib_1.StackSynthesizer {
|
|
20
|
+
/**
|
|
21
|
+
* Use the Default Staging Resources, creating a single stack per environment this app is deployed in
|
|
22
|
+
*/
|
|
23
|
+
static defaultResources(options) {
|
|
24
|
+
try {
|
|
25
|
+
jsiiDeprecationWarnings._aws_cdk_app_staging_synthesizer_alpha_DefaultResourcesOptions(options);
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
29
|
+
Error.captureStackTrace(error, this.defaultResources);
|
|
30
|
+
}
|
|
31
|
+
throw error;
|
|
32
|
+
}
|
|
33
|
+
(0, no_tokens_1.validateNoTokens)(options, 'AppStagingSynthesizer');
|
|
34
|
+
return AppStagingSynthesizer.customFactory({
|
|
35
|
+
factory: default_staging_stack_1.DefaultStagingStack.factory(options),
|
|
36
|
+
deploymentIdentities: options.deploymentIdentities,
|
|
37
|
+
bootstrapQualifier: options.bootstrapQualifier,
|
|
38
|
+
oncePerEnv: true,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Use these exact staging resources for every stack that this synthesizer is used for
|
|
43
|
+
*/
|
|
44
|
+
static customResources(options) {
|
|
45
|
+
try {
|
|
46
|
+
jsiiDeprecationWarnings._aws_cdk_app_staging_synthesizer_alpha_CustomResourcesOptions(options);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
50
|
+
Error.captureStackTrace(error, this.customResources);
|
|
51
|
+
}
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
return AppStagingSynthesizer.customFactory({
|
|
55
|
+
deploymentIdentities: options.deploymentIdentities,
|
|
56
|
+
bootstrapQualifier: options.bootstrapQualifier,
|
|
57
|
+
oncePerEnv: false,
|
|
58
|
+
factory: {
|
|
59
|
+
obtainStagingResources() {
|
|
60
|
+
return options.resources;
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Supply your own stagingStackFactory method for creating an IStagingStack when
|
|
67
|
+
* a stack is bound to the synthesizer.
|
|
68
|
+
*
|
|
69
|
+
* By default, `oncePerEnv = true`, which means that a new instance of the IStagingStack
|
|
70
|
+
* will be created in new environments. Set `oncePerEnv = false` to turn off that behavior.
|
|
71
|
+
*/
|
|
72
|
+
static customFactory(options) {
|
|
73
|
+
try {
|
|
74
|
+
jsiiDeprecationWarnings._aws_cdk_app_staging_synthesizer_alpha_CustomFactoryOptions(options);
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
78
|
+
Error.captureStackTrace(error, this.customFactory);
|
|
79
|
+
}
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
82
|
+
const oncePerEnv = options.oncePerEnv ?? true;
|
|
83
|
+
const factory = oncePerEnv ? new per_env_staging_factory_1.PerEnvironmentStagingFactory(options.factory) : options.factory;
|
|
84
|
+
return new AppStagingSynthesizer({
|
|
85
|
+
factory,
|
|
86
|
+
bootstrapQualifier: options.bootstrapQualifier,
|
|
87
|
+
deploymentIdentities: options.deploymentIdentities,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
constructor(props) {
|
|
91
|
+
super();
|
|
92
|
+
this.props = props;
|
|
93
|
+
this.roles = {
|
|
94
|
+
deploymentRole: props.deploymentIdentities?.roles.deploymentRole ??
|
|
95
|
+
bootstrap_roles_1.BootstrapRole.fromRoleArn(AppStagingSynthesizer.DEFAULT_DEPLOY_ROLE_ARN),
|
|
96
|
+
cloudFormationExecutionRole: props.deploymentIdentities?.roles.cloudFormationExecutionRole ??
|
|
97
|
+
bootstrap_roles_1.BootstrapRole.fromRoleArn(AppStagingSynthesizer.DEFAULT_CLOUDFORMATION_ROLE_ARN),
|
|
98
|
+
lookupRole: this.props.deploymentIdentities?.roles.lookupRole ??
|
|
99
|
+
bootstrap_roles_1.BootstrapRole.fromRoleArn(AppStagingSynthesizer.DEFAULT_LOOKUP_ROLE_ARN),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Returns a version of the synthesizer bound to a stack.
|
|
104
|
+
*/
|
|
105
|
+
reusableBind(stack) {
|
|
106
|
+
this.checkEnvironmentGnosticism(stack);
|
|
107
|
+
const qualifier = this.props.bootstrapQualifier ??
|
|
108
|
+
stack.node.tryGetContext(aws_cdk_lib_1.BOOTSTRAP_QUALIFIER_CONTEXT) ??
|
|
109
|
+
AppStagingSynthesizer.DEFAULT_QUALIFIER;
|
|
110
|
+
const spec = new helpers_internal_1.StringSpecializer(stack, qualifier);
|
|
111
|
+
const deployRole = this.roles.deploymentRole._specialize(spec);
|
|
112
|
+
const context = {
|
|
113
|
+
environmentString: [
|
|
114
|
+
aws_cdk_lib_1.Token.isUnresolved(stack.account) ? 'ACCOUNT' : stack.account,
|
|
115
|
+
aws_cdk_lib_1.Token.isUnresolved(stack.region) ? 'REGION' : stack.region,
|
|
116
|
+
].join('-'),
|
|
117
|
+
deployRoleArn: deployRole._arnForCloudFormation(),
|
|
118
|
+
qualifier,
|
|
119
|
+
};
|
|
120
|
+
return new BoundAppStagingSynthesizer(stack, {
|
|
121
|
+
stagingResources: this.props.factory.obtainStagingResources(stack, context),
|
|
122
|
+
deployRole,
|
|
123
|
+
cloudFormationExecutionRole: this.roles.cloudFormationExecutionRole._specialize(spec),
|
|
124
|
+
lookupRole: this.roles.lookupRole._specialize(spec),
|
|
125
|
+
qualifier,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Implemented for legacy purposes; this will never be called.
|
|
130
|
+
*/
|
|
131
|
+
bind(_stack) {
|
|
132
|
+
throw new Error('This is a legacy API, call reusableBind instead');
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Implemented for legacy purposes; this will never be called.
|
|
136
|
+
*/
|
|
137
|
+
synthesize(_session) {
|
|
138
|
+
throw new Error('This is a legacy API, call reusableBind instead');
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Implemented for legacy purposes; this will never be called.
|
|
142
|
+
*/
|
|
143
|
+
addFileAsset(_asset) {
|
|
144
|
+
throw new Error('This is a legacy API, call reusableBind instead');
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Implemented for legacy purposes; this will never be called.
|
|
148
|
+
*/
|
|
149
|
+
addDockerImageAsset(_asset) {
|
|
150
|
+
throw new Error('This is a legacy API, call reusableBind instead');
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Check that we're only being used for exclusively gnostic or agnostic stacks.
|
|
154
|
+
*
|
|
155
|
+
* We can think about whether to loosen this requirement later.
|
|
156
|
+
*/
|
|
157
|
+
checkEnvironmentGnosticism(stack) {
|
|
158
|
+
const isAgnostic = aws_cdk_lib_1.Token.isUnresolved(stack.account) || aws_cdk_lib_1.Token.isUnresolved(stack.region);
|
|
159
|
+
const agnosticStacks = AGNOSTIC_STACKS.for(stack);
|
|
160
|
+
const envAwareStacks = ENV_AWARE_STACKS.for(stack);
|
|
161
|
+
(isAgnostic ? agnosticStacks : envAwareStacks).add(stack);
|
|
162
|
+
if (agnosticStacks.size > 0 && envAwareStacks.size > 0) {
|
|
163
|
+
const describeStacks = (xs) => Array.from(xs).map(s => s.node.path).join(', ');
|
|
164
|
+
throw new Error([
|
|
165
|
+
'It is not safe to use AppStagingSynthesizer for both environment-agnostic and environment-aware stacks at the same time.',
|
|
166
|
+
'Please either specify environments for all stacks or no stacks in the CDK App.',
|
|
167
|
+
`Stacks with environment: ${describeStacks(agnosticStacks)}.`,
|
|
168
|
+
`Stacks without environment: ${describeStacks(envAwareStacks)}.`,
|
|
169
|
+
].join(' '));
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
174
|
+
AppStagingSynthesizer[_a] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.AppStagingSynthesizer", version: "2.82.0-alpha.0" };
|
|
175
|
+
/**
|
|
176
|
+
* Default ARN qualifier
|
|
177
|
+
*/
|
|
178
|
+
AppStagingSynthesizer.DEFAULT_QUALIFIER = 'hnb659fds';
|
|
179
|
+
/**
|
|
180
|
+
* Default CloudFormation role ARN.
|
|
181
|
+
*/
|
|
182
|
+
AppStagingSynthesizer.DEFAULT_CLOUDFORMATION_ROLE_ARN = 'arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-${Qualifier}-cfn-exec-role-${AWS::AccountId}-${AWS::Region}';
|
|
183
|
+
/**
|
|
184
|
+
* Default deploy role ARN.
|
|
185
|
+
*/
|
|
186
|
+
AppStagingSynthesizer.DEFAULT_DEPLOY_ROLE_ARN = 'arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-${Qualifier}-deploy-role-${AWS::AccountId}-${AWS::Region}';
|
|
187
|
+
/**
|
|
188
|
+
* Default lookup role ARN for missing values.
|
|
189
|
+
*/
|
|
190
|
+
AppStagingSynthesizer.DEFAULT_LOOKUP_ROLE_ARN = 'arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-${Qualifier}-lookup-role-${AWS::AccountId}-${AWS::Region}';
|
|
191
|
+
exports.AppStagingSynthesizer = AppStagingSynthesizer;
|
|
192
|
+
class BoundAppStagingSynthesizer extends aws_cdk_lib_1.StackSynthesizer {
|
|
193
|
+
constructor(stack, props) {
|
|
194
|
+
super();
|
|
195
|
+
this.props = props;
|
|
196
|
+
this.assetManifest = new aws_cdk_lib_1.AssetManifestBuilder();
|
|
197
|
+
this.dependencyStacks = new Set();
|
|
198
|
+
super.bind(stack);
|
|
199
|
+
this.qualifier = props.qualifier;
|
|
200
|
+
this.stagingStack = props.stagingResources;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* The qualifier used to bootstrap this stack
|
|
204
|
+
*/
|
|
205
|
+
get bootstrapQualifier() {
|
|
206
|
+
// Not sure why we need this.
|
|
207
|
+
return this.qualifier;
|
|
208
|
+
}
|
|
209
|
+
synthesize(session) {
|
|
210
|
+
const templateAssetSource = this.synthesizeTemplate(session, this.props.lookupRole?._arnForCloudAssembly());
|
|
211
|
+
const templateAsset = this.addFileAsset(templateAssetSource);
|
|
212
|
+
const dependencies = Array.from(this.dependencyStacks).flatMap((d) => d.artifactId);
|
|
213
|
+
const assetManifestId = this.assetManifest.emitManifest(this.boundStack, session, {}, dependencies);
|
|
214
|
+
const lookupRoleArn = this.props.lookupRole?._arnForCloudAssembly();
|
|
215
|
+
this.emitArtifact(session, {
|
|
216
|
+
assumeRoleArn: this.props.deployRole?._arnForCloudAssembly(),
|
|
217
|
+
additionalDependencies: [assetManifestId],
|
|
218
|
+
stackTemplateAssetObjectUrl: templateAsset.s3ObjectUrlWithPlaceholders,
|
|
219
|
+
cloudFormationExecutionRoleArn: this.props.cloudFormationExecutionRole?._arnForCloudAssembly(),
|
|
220
|
+
lookupRole: lookupRoleArn ? { arn: lookupRoleArn } : undefined,
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Add a file asset to the manifest.
|
|
225
|
+
*/
|
|
226
|
+
addFileAsset(asset) {
|
|
227
|
+
const { bucketName, assumeRoleArn, prefix, dependencyStack } = this.stagingStack.addFile(asset);
|
|
228
|
+
const location = this.assetManifest.defaultAddFileAsset(this.boundStack, asset, {
|
|
229
|
+
bucketName: (0, helpers_internal_1.translateCfnTokenToAssetToken)(bucketName),
|
|
230
|
+
bucketPrefix: prefix,
|
|
231
|
+
role: assumeRoleArn ? { assumeRoleArn: (0, helpers_internal_1.translateCfnTokenToAssetToken)(assumeRoleArn) } : undefined,
|
|
232
|
+
});
|
|
233
|
+
if (dependencyStack) {
|
|
234
|
+
this.boundStack.addDependency(dependencyStack, 'stack depends on the staging stack for staging resources');
|
|
235
|
+
this.dependencyStacks.add(dependencyStack);
|
|
236
|
+
}
|
|
237
|
+
return this.cloudFormationLocationFromFileAsset(location);
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Add a docker image asset to the manifest.
|
|
241
|
+
*/
|
|
242
|
+
addDockerImageAsset(asset) {
|
|
243
|
+
const { repoName, assumeRoleArn, dependencyStack } = this.stagingStack.addDockerImage(asset);
|
|
244
|
+
const location = this.assetManifest.defaultAddDockerImageAsset(this.boundStack, asset, {
|
|
245
|
+
repositoryName: (0, helpers_internal_1.translateCfnTokenToAssetToken)(repoName),
|
|
246
|
+
role: assumeRoleArn ? { assumeRoleArn: (0, helpers_internal_1.translateCfnTokenToAssetToken)(assumeRoleArn) } : undefined,
|
|
247
|
+
});
|
|
248
|
+
if (dependencyStack) {
|
|
249
|
+
this.boundStack.addDependency(dependencyStack, 'stack depends on the staging stack for staging resources');
|
|
250
|
+
this.dependencyStacks.add(dependencyStack);
|
|
251
|
+
}
|
|
252
|
+
return this.cloudFormationLocationFromDockerImageAsset(location);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXN0YWdpbmctc3ludGhlc2l6ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJhcHAtc3RhZ2luZy1zeW50aGVzaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw2Q0FhcUI7QUFDckIsNEVBQXlHO0FBQ3pHLHVEQUF3RjtBQUN4RixtRUFBMEY7QUFDMUYsdUVBQXlHO0FBQ3pHLHFEQUF1RDtBQUN2RCxtREFBdUQ7QUFHdkQsTUFBTSxlQUFlLEdBQUcsSUFBSSw0QkFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFTLENBQUMsQ0FBQztBQUNwRSxNQUFNLGdCQUFnQixHQUFHLElBQUksNEJBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBUyxDQUFDLENBQUM7QUF5RXJFOztHQUVHO0FBQ0gsTUFBYSxxQkFBc0IsU0FBUSw4QkFBZ0I7SUFxQnpEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQWdDOzs7Ozs7Ozs7O1FBQzdELElBQUEsNEJBQWdCLEVBQUMsT0FBTyxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFFbkQsT0FBTyxxQkFBcUIsQ0FBQyxhQUFhLENBQUM7WUFDekMsT0FBTyxFQUFFLDJDQUFtQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDN0Msb0JBQW9CLEVBQUUsT0FBTyxDQUFDLG9CQUFvQjtZQUNsRCxrQkFBa0IsRUFBRSxPQUFPLENBQUMsa0JBQWtCO1lBQzlDLFVBQVUsRUFBRSxJQUFJO1NBQ2pCLENBQUMsQ0FBQztLQUNKO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQStCOzs7Ozs7Ozs7O1FBQzNELE9BQU8scUJBQXFCLENBQUMsYUFBYSxDQUFDO1lBQ3pDLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxvQkFBb0I7WUFDbEQsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLGtCQUFrQjtZQUM5QyxVQUFVLEVBQUUsS0FBSztZQUNqQixPQUFPLEVBQUU7Z0JBQ1Asc0JBQXNCO29CQUNwQixPQUFPLE9BQU8sQ0FBQyxTQUFTLENBQUM7Z0JBQzNCLENBQUM7YUFDRjtTQUNGLENBQUMsQ0FBQztLQUNKO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUE2Qjs7Ozs7Ozs7OztRQUN2RCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQztRQUM5QyxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksc0RBQTRCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBRWpHLE9BQU8sSUFBSSxxQkFBcUIsQ0FBQztZQUMvQixPQUFPO1lBQ1Asa0JBQWtCLEVBQUUsT0FBTyxDQUFDLGtCQUFrQjtZQUM5QyxvQkFBb0IsRUFBRSxPQUFPLENBQUMsb0JBQW9CO1NBQ25ELENBQUMsQ0FBQztLQUNKO0lBSUQsWUFBcUMsS0FBaUM7UUFDcEUsS0FBSyxFQUFFLENBQUM7UUFEMkIsVUFBSyxHQUFMLEtBQUssQ0FBNEI7UUFHcEUsSUFBSSxDQUFDLEtBQUssR0FBRztZQUNYLGNBQWMsRUFBRSxLQUFLLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLGNBQWM7Z0JBQzlELCtCQUFhLENBQUMsV0FBVyxDQUFDLHFCQUFxQixDQUFDLHVCQUF1QixDQUFDO1lBQzFFLDJCQUEyQixFQUFFLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsMkJBQTJCO2dCQUN4RiwrQkFBYSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQywrQkFBK0IsQ0FBQztZQUNsRixVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsVUFBVTtnQkFDM0QsK0JBQWEsQ0FBQyxXQUFXLENBQUMscUJBQXFCLENBQUMsdUJBQXVCLENBQUM7U0FDM0UsQ0FBQztLQUNIO0lBRUQ7O09BRUc7SUFDSSxZQUFZLENBQUMsS0FBWTtRQUM5QixJQUFJLENBQUMsMEJBQTBCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0I7WUFDN0MsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMseUNBQTJCLENBQUM7WUFDckQscUJBQXFCLENBQUMsaUJBQWlCLENBQUM7UUFDMUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxvQ0FBaUIsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFckQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRS9ELE1BQU0sT0FBTyxHQUFrQztZQUM3QyxpQkFBaUIsRUFBRTtnQkFDakIsbUJBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPO2dCQUM3RCxtQkFBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU07YUFDM0QsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQ1gsYUFBYSxFQUFFLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRTtZQUNqRCxTQUFTO1NBQ1YsQ0FBQztRQUVGLE9BQU8sSUFBSSwwQkFBMEIsQ0FBQyxLQUFLLEVBQUU7WUFDM0MsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQztZQUMzRSxVQUFVO1lBQ1YsMkJBQTJCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO1lBQ3JGLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO1lBQ25ELFNBQVM7U0FDVixDQUFDLENBQUM7S0FDSjtJQUVEOztPQUVHO0lBQ0ksSUFBSSxDQUFDLE1BQWE7UUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO0tBQ3BFO0lBRUQ7O09BRUc7SUFDSSxVQUFVLENBQUMsUUFBMkI7UUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO0tBQ3BFO0lBRUQ7O09BRUc7SUFDSSxZQUFZLENBQUMsTUFBdUI7UUFDekMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO0tBQ3BFO0lBRUQ7O09BRUc7SUFDSSxtQkFBbUIsQ0FBQyxNQUE4QjtRQUN2RCxNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7S0FDcEU7SUFFRDs7OztPQUlHO0lBQ0ssMEJBQTBCLENBQUMsS0FBWTtRQUM3QyxNQUFNLFVBQVUsR0FBRyxtQkFBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksbUJBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pGLE1BQU0sY0FBYyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEQsTUFBTSxjQUFjLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRW5ELENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxRCxJQUFJLGNBQWMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFO1lBRXRELE1BQU0sY0FBYyxHQUFHLENBQUMsRUFBYyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRTNGLE1BQU0sSUFBSSxLQUFLLENBQUM7Z0JBQ2QsMEhBQTBIO2dCQUMxSCxnRkFBZ0Y7Z0JBQ2hGLDRCQUE0QixjQUFjLENBQUMsY0FBYyxDQUFDLEdBQUc7Z0JBQzdELCtCQUErQixjQUFjLENBQUMsY0FBYyxDQUFDLEdBQUc7YUFDakUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUNkO0tBQ0Y7Ozs7QUFuS0Q7O0dBRUc7QUFDb0IsdUNBQWlCLEdBQUcsV0FBVyxDQUFDO0FBRXZEOztHQUVHO0FBQ29CLHFEQUErQixHQUFHLG1IQUFtSCxDQUFDO0FBRTdLOztHQUVHO0FBQ29CLDZDQUF1QixHQUFHLGlIQUFpSCxDQUFDO0FBRW5LOztHQUVHO0FBQ29CLDZDQUF1QixHQUFHLGlIQUFpSCxDQUFDO0FBbkJ4SixzREFBcUI7QUFxTWxDLE1BQU0sMEJBQTJCLFNBQVEsOEJBQWdCO0lBTXZELFlBQVksS0FBWSxFQUFtQixLQUFzQztRQUMvRSxLQUFLLEVBQUUsQ0FBQztRQURpQyxVQUFLLEdBQUwsS0FBSyxDQUFpQztRQUpoRSxrQkFBYSxHQUFHLElBQUksa0NBQW9CLEVBQUUsQ0FBQztRQUUzQyxxQkFBZ0IsR0FBZSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBSXhELEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDO0tBQzVDO0lBQ0Q7O09BRUc7SUFDSCxJQUFXLGtCQUFrQjtRQUMzQiw2QkFBNkI7UUFDN0IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0tBQ3ZCO0lBRU0sVUFBVSxDQUFDLE9BQTBCO1FBQzFDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxvQkFBb0IsRUFBRSxDQUFDLENBQUM7UUFDNUcsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBRTdELE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEYsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRXBHLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLG9CQUFvQixFQUFFLENBQUM7UUFFcEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUU7WUFDekIsYUFBYSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLG9CQUFvQixFQUFFO1lBQzVELHNCQUFzQixFQUFFLENBQUMsZUFBZSxDQUFDO1lBQ3pDLDJCQUEyQixFQUFFLGFBQWEsQ0FBQywyQkFBMkI7WUFDdEUsOEJBQThCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxvQkFBb0IsRUFBRTtZQUM5RixVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUztTQUMvRCxDQUFDLENBQUM7S0FDSjtJQUVEOztPQUVHO0lBQ0ksWUFBWSxDQUFDLEtBQXNCO1FBQ3hDLE1BQU0sRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFO1lBQzlFLFVBQVUsRUFBRSxJQUFBLGdEQUE2QixFQUFDLFVBQVUsQ0FBQztZQUNyRCxZQUFZLEVBQUUsTUFBTTtZQUNwQixJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxJQUFBLGdEQUE2QixFQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVM7U0FDbEcsQ0FBQyxDQUFDO1FBRUgsSUFBSSxlQUFlLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsZUFBZSxFQUFFLDBEQUEwRCxDQUFDLENBQUM7WUFDM0csSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztTQUM1QztRQUVELE9BQU8sSUFBSSxDQUFDLG1DQUFtQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQzNEO0lBRUQ7O09BRUc7SUFDSSxtQkFBbUIsQ0FBQyxLQUE2QjtRQUN0RCxNQUFNLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3RixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFO1lBQ3JGLGNBQWMsRUFBRSxJQUFBLGdEQUE2QixFQUFDLFFBQVEsQ0FBQztZQUN2RCxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxJQUFBLGdEQUE2QixFQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVM7U0FDbEcsQ0FBQyxDQUFDO1FBRUgsSUFBSSxlQUFlLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsZUFBZSxFQUFFLDBEQUEwRCxDQUFDLENBQUM7WUFDM0csSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztTQUM1QztRQUVELE9BQU8sSUFBSSxDQUFDLDBDQUEwQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQ2xFO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBc3NldE1hbmlmZXN0QnVpbGRlcixcbiAgQk9PVFNUUkFQX1FVQUxJRklFUl9DT05URVhULFxuICBEb2NrZXJJbWFnZUFzc2V0TG9jYXRpb24sXG4gIERvY2tlckltYWdlQXNzZXRTb3VyY2UsXG4gIEZpbGVBc3NldExvY2F0aW9uLFxuICBGaWxlQXNzZXRTb3VyY2UsXG4gIElCb3VuZFN0YWNrU3ludGhlc2l6ZXIgYXMgSUJvdW5kQXBwU3RhZ2luZ1N5bnRoZXNpemVyLFxuICBJUmV1c2FibGVTdGFja1N5bnRoZXNpemVyLFxuICBJU3ludGhlc2lzU2Vzc2lvbixcbiAgU3RhY2ssXG4gIFN0YWNrU3ludGhlc2l6ZXIsXG4gIFRva2VuLFxufSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBTdHJpbmdTcGVjaWFsaXplciwgdHJhbnNsYXRlQ2ZuVG9rZW5Ub0Fzc2V0VG9rZW4gfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9oZWxwZXJzLWludGVybmFsJztcbmltcG9ydCB7IEJvb3RzdHJhcFJvbGUsIEJvb3RzdHJhcFJvbGVzLCBEZXBsb3ltZW50SWRlbnRpdGllcyB9IGZyb20gJy4vYm9vdHN0cmFwLXJvbGVzJztcbmltcG9ydCB7IERlZmF1bHRTdGFnaW5nU3RhY2ssIERlZmF1bHRTdGFnaW5nU3RhY2tPcHRpb25zIH0gZnJvbSAnLi9kZWZhdWx0LXN0YWdpbmctc3RhY2snO1xuaW1wb3J0IHsgUGVyRW52aXJvbm1lbnRTdGFnaW5nRmFjdG9yeSBhcyBQZXJFbnZpcm9ubWVudFN0YWdpbmdGYWN0b3J5IH0gZnJvbSAnLi9wZXItZW52LXN0YWdpbmctZmFjdG9yeSc7XG5pbXBvcnQgeyBBcHBTY29wZWRHbG9iYWwgfSBmcm9tICcuL3ByaXZhdGUvYXBwLWdsb2JhbCc7XG5pbXBvcnQgeyB2YWxpZGF0ZU5vVG9rZW5zIH0gZnJvbSAnLi9wcml2YXRlL25vLXRva2Vucyc7XG5pbXBvcnQgeyBJU3RhZ2luZ1Jlc291cmNlcywgSVN0YWdpbmdSZXNvdXJjZXNGYWN0b3J5LCBPYnRhaW5TdGFnaW5nUmVzb3VyY2VzQ29udGV4dCB9IGZyb20gJy4vc3RhZ2luZy1zdGFjayc7XG5cbmNvbnN0IEFHTk9TVElDX1NUQUNLUyA9IG5ldyBBcHBTY29wZWRHbG9iYWwoKCkgPT4gbmV3IFNldDxTdGFjaz4oKSk7XG5jb25zdCBFTlZfQVdBUkVfU1RBQ0tTID0gbmV3IEFwcFNjb3BlZEdsb2JhbCgoKSA9PiBuZXcgU2V0PFN0YWNrPigpKTtcblxuLyoqXG4gKiBPcHRpb25zIHRoYXQgYXBwbHkgdG8gYWxsIEFwcFN0YWdpbmdTeW50aGVzaXplciB2YXJpYW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcFN0YWdpbmdTeW50aGVzaXplck9wdGlvbnMge1xuICAvKipcbiAgICogV2hhdCByb2xlcyB0byB1c2UgdG8gZGVwbG95IGFwcGxpY2F0aW9uc1xuICAgKlxuICAgKiBUaGVzZSBhcmUgdGhlIHJvbGVzIHRoYXQgaGF2ZSBwZXJtaXNzaW9ucyB0byBpbnRlcmFjdCB3aXRoIENsb3VkRm9ybWF0aW9uXG4gICAqIG9uIHlvdXIgYmVoYWxmLiBCeSBkZWZhdWx0IHRoZXNlIGFyZSB0aGUgc3RhbmRhcmQgYm9vdHN0cmFwcGVkIENESyByb2xlcyxcbiAgICogYnV0IHlvdSBjYW4gY3VzdG9taXplIHRoZW0gb3IgdHVybiB0aGVtIG9mZiBhbmQgdXNlIHRoZSBDTEkgY3JlZGVudGlhbHNcbiAgICogdG8gZGVwbG95LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRoZSBzdGFuZGFyZCBib290c3RyYXBwZWQgQ0RLIHJvbGVzXG4gICAqL1xuICByZWFkb25seSBkZXBsb3ltZW50SWRlbnRpdGllcz86IERlcGxveW1lbnRJZGVudGl0aWVzO1xuXG4gIC8qKlxuICAgKiBRdWFsaWZpZXIgdG8gZGlzYW1iaWd1YXRlIG11bHRpcGxlIGJvb3RzdHJhcHBlZCBlbnZpcm9ubWVudHMgaW4gdGhlIHNhbWUgYWNjb3VudFxuICAgKlxuICAgKiBUaGlzIHF1YWxpZmllciBpcyBvbmx5IHVzZWQgdG8gcmVmZXJlbmNlIGJvb3RzdHJhcHBlZCByZXNvdXJjZXMuIEl0IHdpbGwgbm90XG4gICAqIGJlIHVzZWQgaW4gdGhlIGNyZWF0aW9uIG9mIGFwcC1zcGVjaWZpYyBzdGFnaW5nIHJlc291cmNlczogYGFwcElkYCBpcyB1c2VkIGZvciB0aGF0XG4gICAqIGluc3RlYWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVmFsdWUgb2YgY29udGV4dCBrZXkgJ0Bhd3MtY2RrL2NvcmU6Ym9vdHN0cmFwUXVhbGlmaWVyJyBpZiBzZXQsIG90aGVyd2lzZSBgREVGQVVMVF9RVUFMSUZJRVJgXG4gICAqL1xuICByZWFkb25seSBib290c3RyYXBRdWFsaWZpZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3Igc3RhY2tQZXJFbnYgc3RhdGljIG1ldGhvZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRSZXNvdXJjZXNPcHRpb25zIGV4dGVuZHMgQXBwU3RhZ2luZ1N5bnRoZXNpemVyT3B0aW9ucywgRGVmYXVsdFN0YWdpbmdTdGFja09wdGlvbnMge31cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBjdXN0b21GYWN0b3J5IHN0YXRpYyBtZXRob2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21GYWN0b3J5T3B0aW9ucyBleHRlbmRzIEFwcFN0YWdpbmdTeW50aGVzaXplck9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGZhY3RvcnkgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcmV0dXJuIHN0YWdpbmcgcmVzb3VyY2VzIGZvciBlYWNoIHN0YWNrXG4gICAqL1xuICByZWFkb25seSBmYWN0b3J5OiBJU3RhZ2luZ1Jlc291cmNlc0ZhY3Rvcnk7XG5cbiAgLyoqXG4gICAqIFJldXNlIHRoZSBhbnN3ZXIgZnJvbSB0aGUgZmFjdG9yeSBmb3Igc3RhY2tzIGluIHRoZSBzYW1lIGVudmlyb25tZW50XG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IG9uY2VQZXJFbnY/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGN1c3RvbVJlc291cmNlcyBzdGF0aWMgbWV0aG9kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tUmVzb3VyY2VzT3B0aW9ucyBleHRlbmRzIEFwcFN0YWdpbmdTeW50aGVzaXplck9wdGlvbnMge1xuICAvKipcbiAgICogVXNlIHRoZXNlIGV4YWN0IHN0YWdpbmcgcmVzb3VyY2VzIGZvciBldmVyeSBzdGFjayB0aGF0IHRoaXMgc3ludGhlc2l6ZXIgaXMgdXNlZCBmb3JcbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlczogSVN0YWdpbmdSZXNvdXJjZXM7XG59XG5cbi8qKlxuICogSW50ZXJuYWwgcHJvcGVydGllcyBmb3IgQXBwU3RhZ2luZ1N5bnRoZXNpemVyXG4gKi9cbmludGVyZmFjZSBBcHBTdGFnaW5nU3ludGhlc2l6ZXJQcm9wcyBleHRlbmRzIEFwcFN0YWdpbmdTeW50aGVzaXplck9wdGlvbnMge1xuICAvKipcbiAgICogQSBmYWN0b3J5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYW4gSVN0YWdpbmdTdGFjayB3aGVuIGdpdmVuIHRoZSBzdGFjayB0aGVcbiAgICogc3ludGhlc2l6ZXIgaXMgYmluZGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGZhY3Rvcnk6IElTdGFnaW5nUmVzb3VyY2VzRmFjdG9yeTtcbn1cblxuLyoqXG4gKiBBcHAgU3RhZ2luZyBTeW50aGVzaXplclxuICovXG5leHBvcnQgY2xhc3MgQXBwU3RhZ2luZ1N5bnRoZXNpemVyIGV4dGVuZHMgU3RhY2tTeW50aGVzaXplciBpbXBsZW1lbnRzIElSZXVzYWJsZVN0YWNrU3ludGhlc2l6ZXIge1xuICAvKipcbiAgICogRGVmYXVsdCBBUk4gcXVhbGlmaWVyXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfUVVBTElGSUVSID0gJ2huYjY1OWZkcyc7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgQ2xvdWRGb3JtYXRpb24gcm9sZSBBUk4uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfQ0xPVURGT1JNQVRJT05fUk9MRV9BUk4gPSAnYXJuOiR7QVdTOjpQYXJ0aXRpb259OmlhbTo6JHtBV1M6OkFjY291bnRJZH06cm9sZS9jZGstJHtRdWFsaWZpZXJ9LWNmbi1leGVjLXJvbGUtJHtBV1M6OkFjY291bnRJZH0tJHtBV1M6OlJlZ2lvbn0nO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGRlcGxveSByb2xlIEFSTi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9ERVBMT1lfUk9MRV9BUk4gPSAnYXJuOiR7QVdTOjpQYXJ0aXRpb259OmlhbTo6JHtBV1M6OkFjY291bnRJZH06cm9sZS9jZGstJHtRdWFsaWZpZXJ9LWRlcGxveS1yb2xlLSR7QVdTOjpBY2NvdW50SWR9LSR7QVdTOjpSZWdpb259JztcblxuICAvKipcbiAgICogRGVmYXVsdCBsb29rdXAgcm9sZSBBUk4gZm9yIG1pc3NpbmcgdmFsdWVzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0xPT0tVUF9ST0xFX0FSTiA9ICdhcm46JHtBV1M6OlBhcnRpdGlvbn06aWFtOjoke0FXUzo6QWNjb3VudElkfTpyb2xlL2Nkay0ke1F1YWxpZmllcn0tbG9va3VwLXJvbGUtJHtBV1M6OkFjY291bnRJZH0tJHtBV1M6OlJlZ2lvbn0nO1xuXG4gIC8qKlxuICAgKiBVc2UgdGhlIERlZmF1bHQgU3RhZ2luZyBSZXNvdXJjZXMsIGNyZWF0aW5nIGEgc2luZ2xlIHN0YWNrIHBlciBlbnZpcm9ubWVudCB0aGlzIGFwcCBpcyBkZXBsb3llZCBpblxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBkZWZhdWx0UmVzb3VyY2VzKG9wdGlvbnM6IERlZmF1bHRSZXNvdXJjZXNPcHRpb25zKSB7XG4gICAgdmFsaWRhdGVOb1Rva2VucyhvcHRpb25zLCAnQXBwU3RhZ2luZ1N5bnRoZXNpemVyJyk7XG5cbiAgICByZXR1cm4gQXBwU3RhZ2luZ1N5bnRoZXNpemVyLmN1c3RvbUZhY3Rvcnkoe1xuICAgICAgZmFjdG9yeTogRGVmYXVsdFN0YWdpbmdTdGFjay5mYWN0b3J5KG9wdGlvbnMpLFxuICAgICAgZGVwbG95bWVudElkZW50aXRpZXM6IG9wdGlvbnMuZGVwbG95bWVudElkZW50aXRpZXMsXG4gICAgICBib290c3RyYXBRdWFsaWZpZXI6IG9wdGlvbnMuYm9vdHN0cmFwUXVhbGlmaWVyLFxuICAgICAgb25jZVBlckVudjogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2UgdGhlc2UgZXhhY3Qgc3RhZ2luZyByZXNvdXJjZXMgZm9yIGV2ZXJ5IHN0YWNrIHRoYXQgdGhpcyBzeW50aGVzaXplciBpcyB1c2VkIGZvclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjdXN0b21SZXNvdXJjZXMob3B0aW9uczogQ3VzdG9tUmVzb3VyY2VzT3B0aW9ucykge1xuICAgIHJldHVybiBBcHBTdGFnaW5nU3ludGhlc2l6ZXIuY3VzdG9tRmFjdG9yeSh7XG4gICAgICBkZXBsb3ltZW50SWRlbnRpdGllczogb3B0aW9ucy5kZXBsb3ltZW50SWRlbnRpdGllcyxcbiAgICAgIGJvb3RzdHJhcFF1YWxpZmllcjogb3B0aW9ucy5ib290c3RyYXBRdWFsaWZpZXIsXG4gICAgICBvbmNlUGVyRW52OiBmYWxzZSxcbiAgICAgIGZhY3Rvcnk6IHtcbiAgICAgICAgb2J0YWluU3RhZ2luZ1Jlc291cmNlcygpIHtcbiAgICAgICAgICByZXR1cm4gb3B0aW9ucy5yZXNvdXJjZXM7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1cHBseSB5b3VyIG93biBzdGFnaW5nU3RhY2tGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgYW4gSVN0YWdpbmdTdGFjayB3aGVuXG4gICAqIGEgc3RhY2sgaXMgYm91bmQgdG8gdGhlIHN5bnRoZXNpemVyLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBgb25jZVBlckVudiA9IHRydWVgLCB3aGljaCBtZWFucyB0aGF0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSBJU3RhZ2luZ1N0YWNrXG4gICAqIHdpbGwgYmUgY3JlYXRlZCBpbiBuZXcgZW52aXJvbm1lbnRzLiBTZXQgYG9uY2VQZXJFbnYgPSBmYWxzZWAgdG8gdHVybiBvZmYgdGhhdCBiZWhhdmlvci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3VzdG9tRmFjdG9yeShvcHRpb25zOiBDdXN0b21GYWN0b3J5T3B0aW9ucykge1xuICAgIGNvbnN0IG9uY2VQZXJFbnYgPSBvcHRpb25zLm9uY2VQZXJFbnYgPz8gdHJ1ZTtcbiAgICBjb25zdCBmYWN0b3J5ID0gb25jZVBlckVudiA/IG5ldyBQZXJFbnZpcm9ubWVudFN0YWdpbmdGYWN0b3J5KG9wdGlvbnMuZmFjdG9yeSkgOiBvcHRpb25zLmZhY3Rvcnk7XG5cbiAgICByZXR1cm4gbmV3IEFwcFN0YWdpbmdTeW50aGVzaXplcih7XG4gICAgICBmYWN0b3J5LFxuICAgICAgYm9vdHN0cmFwUXVhbGlmaWVyOiBvcHRpb25zLmJvb3RzdHJhcFF1YWxpZmllcixcbiAgICAgIGRlcGxveW1lbnRJZGVudGl0aWVzOiBvcHRpb25zLmRlcGxveW1lbnRJZGVudGl0aWVzLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSByb2xlczogUmVxdWlyZWQ8Qm9vdHN0cmFwUm9sZXM+O1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9wczogQXBwU3RhZ2luZ1N5bnRoZXNpemVyUHJvcHMpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5yb2xlcyA9IHtcbiAgICAgIGRlcGxveW1lbnRSb2xlOiBwcm9wcy5kZXBsb3ltZW50SWRlbnRpdGllcz8ucm9sZXMuZGVwbG95bWVudFJvbGUgPz9cbiAgICAgICAgQm9vdHN0cmFwUm9sZS5mcm9tUm9sZUFybihBcHBTdGFnaW5nU3ludGhlc2l6ZXIuREVGQVVMVF9ERVBMT1lfUk9MRV9BUk4pLFxuICAgICAgY2xvdWRGb3JtYXRpb25FeGVjdXRpb25Sb2xlOiBwcm9wcy5kZXBsb3ltZW50SWRlbnRpdGllcz8ucm9sZXMuY2xvdWRGb3JtYXRpb25FeGVjdXRpb25Sb2xlID8/XG4gICAgICAgIEJvb3RzdHJhcFJvbGUuZnJvbVJvbGVBcm4oQXBwU3RhZ2luZ1N5bnRoZXNpemVyLkRFRkFVTFRfQ0xPVURGT1JNQVRJT05fUk9MRV9BUk4pLFxuICAgICAgbG9va3VwUm9sZTogdGhpcy5wcm9wcy5kZXBsb3ltZW50SWRlbnRpdGllcz8ucm9sZXMubG9va3VwUm9sZSA/P1xuICAgICAgICBCb290c3RyYXBSb2xlLmZyb21Sb2xlQXJuKEFwcFN0YWdpbmdTeW50aGVzaXplci5ERUZBVUxUX0xPT0tVUF9ST0xFX0FSTiksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgdmVyc2lvbiBvZiB0aGUgc3ludGhlc2l6ZXIgYm91bmQgdG8gYSBzdGFjay5cbiAgICovXG4gIHB1YmxpYyByZXVzYWJsZUJpbmQoc3RhY2s6IFN0YWNrKTogSUJvdW5kQXBwU3RhZ2luZ1N5bnRoZXNpemVyIHtcbiAgICB0aGlzLmNoZWNrRW52aXJvbm1lbnRHbm9zdGljaXNtKHN0YWNrKTtcbiAgICBjb25zdCBxdWFsaWZpZXIgPSB0aGlzLnByb3BzLmJvb3RzdHJhcFF1YWxpZmllciA/P1xuICAgICAgc3RhY2subm9kZS50cnlHZXRDb250ZXh0KEJPT1RTVFJBUF9RVUFMSUZJRVJfQ09OVEVYVCkgPz9cbiAgICAgIEFwcFN0YWdpbmdTeW50aGVzaXplci5ERUZBVUxUX1FVQUxJRklFUjtcbiAgICBjb25zdCBzcGVjID0gbmV3IFN0cmluZ1NwZWNpYWxpemVyKHN0YWNrLCBxdWFsaWZpZXIpO1xuXG4gICAgY29uc3QgZGVwbG95Um9sZSA9IHRoaXMucm9sZXMuZGVwbG95bWVudFJvbGUuX3NwZWNpYWxpemUoc3BlYyk7XG5cbiAgICBjb25zdCBjb250ZXh0OiBPYnRhaW5TdGFnaW5nUmVzb3VyY2VzQ29udGV4dCA9IHtcbiAgICAgIGVudmlyb25tZW50U3RyaW5nOiBbXG4gICAgICAgIFRva2VuLmlzVW5yZXNvbHZlZChzdGFjay5hY2NvdW50KSA/ICdBQ0NPVU5UJyA6IHN0YWNrLmFjY291bnQsXG4gICAgICAgIFRva2VuLmlzVW5yZXNvbHZlZChzdGFjay5yZWdpb24pID8gJ1JFR0lPTicgOiBzdGFjay5yZWdpb24sXG4gICAgICBdLmpvaW4oJy0nKSxcbiAgICAgIGRlcGxveVJvbGVBcm46IGRlcGxveVJvbGUuX2FybkZvckNsb3VkRm9ybWF0aW9uKCksXG4gICAgICBxdWFsaWZpZXIsXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgQm91bmRBcHBTdGFnaW5nU3ludGhlc2l6ZXIoc3RhY2ssIHtcbiAgICAgIHN0YWdpbmdSZXNvdXJjZXM6IHRoaXMucHJvcHMuZmFjdG9yeS5vYnRhaW5TdGFnaW5nUmVzb3VyY2VzKHN0YWNrLCBjb250ZXh0KSxcbiAgICAgIGRlcGxveVJvbGUsXG4gICAgICBjbG91ZEZvcm1hdGlvbkV4ZWN1dGlvblJvbGU6IHRoaXMucm9sZXMuY2xvdWRGb3JtYXRpb25FeGVjdXRpb25Sb2xlLl9zcGVjaWFsaXplKHNwZWMpLFxuICAgICAgbG9va3VwUm9sZTogdGhpcy5yb2xlcy5sb29rdXBSb2xlLl9zcGVjaWFsaXplKHNwZWMpLFxuICAgICAgcXVhbGlmaWVyLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGVkIGZvciBsZWdhY3kgcHVycG9zZXM7IHRoaXMgd2lsbCBuZXZlciBiZSBjYWxsZWQuXG4gICAqL1xuICBwdWJsaWMgYmluZChfc3RhY2s6IFN0YWNrKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIGlzIGEgbGVnYWN5IEFQSSwgY2FsbCByZXVzYWJsZUJpbmQgaW5zdGVhZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGVkIGZvciBsZWdhY3kgcHVycG9zZXM7IHRoaXMgd2lsbCBuZXZlciBiZSBjYWxsZWQuXG4gICAqL1xuICBwdWJsaWMgc3ludGhlc2l6ZShfc2Vzc2lvbjogSVN5bnRoZXNpc1Nlc3Npb24pOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgaXMgYSBsZWdhY3kgQVBJLCBjYWxsIHJldXNhYmxlQmluZCBpbnN0ZWFkJyk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50ZWQgZm9yIGxlZ2FjeSBwdXJwb3NlczsgdGhpcyB3aWxsIG5ldmVyIGJlIGNhbGxlZC5cbiAgICovXG4gIHB1YmxpYyBhZGRGaWxlQXNzZXQoX2Fzc2V0OiBGaWxlQXNzZXRTb3VyY2UpOiBGaWxlQXNzZXRMb2NhdGlvbiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIGlzIGEgbGVnYWN5IEFQSSwgY2FsbCByZXVzYWJsZUJpbmQgaW5zdGVhZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGVkIGZvciBsZWdhY3kgcHVycG9zZXM7IHRoaXMgd2lsbCBuZXZlciBiZSBjYWxsZWQuXG4gICAqL1xuICBwdWJsaWMgYWRkRG9ja2VySW1hZ2VBc3NldChfYXNzZXQ6IERvY2tlckltYWdlQXNzZXRTb3VyY2UpOiBEb2NrZXJJbWFnZUFzc2V0TG9jYXRpb24ge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBpcyBhIGxlZ2FjeSBBUEksIGNhbGwgcmV1c2FibGVCaW5kIGluc3RlYWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB0aGF0IHdlJ3JlIG9ubHkgYmVpbmcgdXNlZCBmb3IgZXhjbHVzaXZlbHkgZ25vc3RpYyBvciBhZ25vc3RpYyBzdGFja3MuXG4gICAqXG4gICAqIFdlIGNhbiB0aGluayBhYm91dCB3aGV0aGVyIHRvIGxvb3NlbiB0aGlzIHJlcXVpcmVtZW50IGxhdGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja0Vudmlyb25tZW50R25vc3RpY2lzbShzdGFjazogU3RhY2spIHtcbiAgICBjb25zdCBpc0Fnbm9zdGljID0gVG9rZW4uaXNVbnJlc29sdmVkKHN0YWNrLmFjY291bnQpIHx8IFRva2VuLmlzVW5yZXNvbHZlZChzdGFjay5yZWdpb24pO1xuICAgIGNvbnN0IGFnbm9zdGljU3RhY2tzID0gQUdOT1NUSUNfU1RBQ0tTLmZvcihzdGFjayk7XG4gICAgY29uc3QgZW52QXdhcmVTdGFja3MgPSBFTlZfQVdBUkVfU1RBQ0tTLmZvcihzdGFjayk7XG5cbiAgICAoaXNBZ25vc3RpYyA/IGFnbm9zdGljU3RhY2tzIDogZW52QXdhcmVTdGFja3MpLmFkZChzdGFjayk7XG4gICAgaWYgKGFnbm9zdGljU3RhY2tzLnNpemUgPiAwICYmIGVudkF3YXJlU3RhY2tzLnNpemUgPiAwKSB7XG5cbiAgICAgIGNvbnN0IGRlc2NyaWJlU3RhY2tzID0gKHhzOiBTZXQ8U3RhY2s+KSA9PiBBcnJheS5mcm9tKHhzKS5tYXAocyA9PiBzLm5vZGUucGF0aCkuam9pbignLCAnKTtcblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFtcbiAgICAgICAgJ0l0IGlzIG5vdCBzYWZlIHRvIHVzZSBBcHBTdGFnaW5nU3ludGhlc2l6ZXIgZm9yIGJvdGggZW52aXJvbm1lbnQtYWdub3N0aWMgYW5kIGVudmlyb25tZW50LWF3YXJlIHN0YWNrcyBhdCB0aGUgc2FtZSB0aW1lLicsXG4gICAgICAgICdQbGVhc2UgZWl0aGVyIHNwZWNpZnkgZW52aXJvbm1lbnRzIGZvciBhbGwgc3RhY2tzIG9yIG5vIHN0YWNrcyBpbiB0aGUgQ0RLIEFwcC4nLFxuICAgICAgICBgU3RhY2tzIHdpdGggZW52aXJvbm1lbnQ6ICR7ZGVzY3JpYmVTdGFja3MoYWdub3N0aWNTdGFja3MpfS5gLFxuICAgICAgICBgU3RhY2tzIHdpdGhvdXQgZW52aXJvbm1lbnQ6ICR7ZGVzY3JpYmVTdGFja3MoZW52QXdhcmVTdGFja3MpfS5gLFxuICAgICAgXS5qb2luKCcgJykpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEludGVybmFsIHByb3BlcnRpZXMgZm9yIEJvdW5kQXBwU3RhZ2luZ1N5bnRoZXNpemVyXG4gKi9cbmludGVyZmFjZSBCb3VuZEFwcFN0YWdpbmdTeW50aGVzaXplclByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBib290c3RyYXAgcXVhbGlmaWVyXG4gICAqL1xuICByZWFkb25seSBxdWFsaWZpZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlc291cmNlcyB3ZSBlbmQgdXAgdXNpbmcgZm9yIHRoaXMgc3ludGhlc2l6ZXJcbiAgICovXG4gIHJlYWRvbmx5IHN0YWdpbmdSZXNvdXJjZXM6IElTdGFnaW5nUmVzb3VyY2VzO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVwbG95IHJvbGVcbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveVJvbGU6IEJvb3RzdHJhcFJvbGU7XG5cbiAgLyoqXG4gICAqIENsb3VkRm9ybWF0aW9uIEV4ZWN1dGlvbiBSb2xlXG4gICAqL1xuICByZWFkb25seSBjbG91ZEZvcm1hdGlvbkV4ZWN1dGlvblJvbGU6IEJvb3RzdHJhcFJvbGU7XG5cbiAgLyoqXG4gICAqIExvb2t1cCBSb2xlXG4gICAqL1xuICByZWFkb25seSBsb29rdXBSb2xlOiBCb290c3RyYXBSb2xlO1xufVxuXG5jbGFzcyBCb3VuZEFwcFN0YWdpbmdTeW50aGVzaXplciBleHRlbmRzIFN0YWNrU3ludGhlc2l6ZXIgaW1wbGVtZW50cyBJQm91bmRBcHBTdGFnaW5nU3ludGhlc2l6ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YWdpbmdTdGFjazogSVN0YWdpbmdSZXNvdXJjZXM7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXNzZXRNYW5pZmVzdCA9IG5ldyBBc3NldE1hbmlmZXN0QnVpbGRlcigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHF1YWxpZmllcjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlcGVuZGVuY3lTdGFja3M6IFNldDxTdGFjaz4gPSBuZXcgU2V0KCk7XG5cbiAgY29uc3RydWN0b3Ioc3RhY2s6IFN0YWNrLCBwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBCb3VuZEFwcFN0YWdpbmdTeW50aGVzaXplclByb3BzKSB7XG4gICAgc3VwZXIoKTtcbiAgICBzdXBlci5iaW5kKHN0YWNrKTtcblxuICAgIHRoaXMucXVhbGlmaWVyID0gcHJvcHMucXVhbGlmaWVyO1xuICAgIHRoaXMuc3RhZ2luZ1N0YWNrID0gcHJvcHMuc3RhZ2luZ1Jlc291cmNlcztcbiAgfVxuICAvKipcbiAgICogVGhlIHF1YWxpZmllciB1c2VkIHRvIGJvb3RzdHJhcCB0aGlzIHN0YWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0IGJvb3RzdHJhcFF1YWxpZmllcigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIC8vIE5vdCBzdXJlIHdoeSB3ZSBuZWVkIHRoaXMuXG4gICAgcmV0dXJuIHRoaXMucXVhbGlmaWVyO1xuICB9XG5cbiAgcHVibGljIHN5bnRoZXNpemUoc2Vzc2lvbjogSVN5bnRoZXNpc1Nlc3Npb24pOiB2b2lkIHtcbiAgICBjb25zdCB0ZW1wbGF0ZUFzc2V0U291cmNlID0gdGhpcy5zeW50aGVzaXplVGVtcGxhdGUoc2Vzc2lvbiwgdGhpcy5wcm9wcy5sb29rdXBSb2xlPy5fYXJuRm9yQ2xvdWRBc3NlbWJseSgpKTtcbiAgICBjb25zdCB0ZW1wbGF0ZUFzc2V0ID0gdGhpcy5hZGRGaWxlQXNzZXQodGVtcGxhdGVBc3NldFNvdXJjZSk7XG5cbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBBcnJheS5mcm9tKHRoaXMuZGVwZW5kZW5jeVN0YWNrcykuZmxhdE1hcCgoZCkgPT4gZC5hcnRpZmFjdElkKTtcbiAgICBjb25zdCBhc3NldE1hbmlmZXN0SWQgPSB0aGlzLmFzc2V0TWFuaWZlc3QuZW1pdE1hbmlmZXN0KHRoaXMuYm91bmRTdGFjaywgc2Vzc2lvbiwge30sIGRlcGVuZGVuY2llcyk7XG5cbiAgICBjb25zdCBsb29rdXBSb2xlQXJuID0gdGhpcy5wcm9wcy5sb29rdXBSb2xlPy5fYXJuRm9yQ2xvdWRBc3NlbWJseSgpO1xuXG4gICAgdGhpcy5lbWl0QXJ0aWZhY3Qoc2Vzc2lvbiwge1xuICAgICAgYXNzdW1lUm9sZUFybjogdGhpcy5wcm9wcy5kZXBsb3lSb2xlPy5fYXJuRm9yQ2xvdWRBc3NlbWJseSgpLFxuICAgICAgYWRkaXRpb25hbERlcGVuZGVuY2llczogW2Fzc2V0TWFuaWZlc3RJZF0sXG4gICAgICBzdGFja1RlbXBsYXRlQXNzZXRPYmplY3RVcmw6IHRlbXBsYXRlQXNzZXQuczNPYmplY3RVcmxXaXRoUGxhY2Vob2xkZXJzLFxuICAgICAgY2xvdWRGb3JtYXRpb25FeGVjdXRpb25Sb2xlQXJuOiB0aGlzLnByb3BzLmNsb3VkRm9ybWF0aW9uRXhlY3V0aW9uUm9sZT8uX2FybkZvckNsb3VkQXNzZW1ibHkoKSxcbiAgICAgIGxvb2t1cFJvbGU6IGxvb2t1cFJvbGVBcm4gPyB7IGFybjogbG9va3VwUm9sZUFybiB9IDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGZpbGUgYXNzZXQgdG8gdGhlIG1hbmlmZXN0LlxuICAgKi9cbiAgcHVibGljIGFkZEZpbGVBc3NldChhc3NldDogRmlsZUFzc2V0U291cmNlKTogRmlsZUFzc2V0TG9jYXRpb24ge1xuICAgIGNvbnN0IHsgYnVja2V0TmFtZSwgYXNzdW1lUm9sZUFybiwgcHJlZml4LCBkZXBlbmRlbmN5U3RhY2sgfSA9IHRoaXMuc3RhZ2luZ1N0YWNrLmFkZEZpbGUoYXNzZXQpO1xuICAgIGNvbnN0IGxvY2F0aW9uID0gdGhpcy5hc3NldE1hbmlmZXN0LmRlZmF1bHRBZGRGaWxlQXNzZXQodGhpcy5ib3VuZFN0YWNrLCBhc3NldCwge1xuICAgICAgYnVja2V0TmFtZTogdHJhbnNsYXRlQ2ZuVG9rZW5Ub0Fzc2V0VG9rZW4oYnVja2V0TmFtZSksXG4gICAgICBidWNrZXRQcmVmaXg6IHByZWZpeCxcbiAgICAgIHJvbGU6IGFzc3VtZVJvbGVBcm4gPyB7IGFzc3VtZVJvbGVBcm46IHRyYW5zbGF0ZUNmblRva2VuVG9Bc3NldFRva2VuKGFzc3VtZVJvbGVBcm4pIH0gOiB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICBpZiAoZGVwZW5kZW5jeVN0YWNrKSB7XG4gICAgICB0aGlzLmJvdW5kU3RhY2suYWRkRGVwZW5kZW5jeShkZXBlbmRlbmN5U3RhY2ssICdzdGFjayBkZXBlbmRzIG9uIHRoZSBzdGFnaW5nIHN0YWNrIGZvciBzdGFnaW5nIHJlc291cmNlcycpO1xuICAgICAgdGhpcy5kZXBlbmRlbmN5U3RhY2tzLmFkZChkZXBlbmRlbmN5U3RhY2spO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNsb3VkRm9ybWF0aW9uTG9jYXRpb25Gcm9tRmlsZUFzc2V0KGxvY2F0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBkb2NrZXIgaW1hZ2UgYXNzZXQgdG8gdGhlIG1hbmlmZXN0LlxuICAgKi9cbiAgcHVibGljIGFkZERvY2tlckltYWdlQXNzZXQoYXNzZXQ6IERvY2tlckltYWdlQXNzZXRTb3VyY2UpOiBEb2NrZXJJbWFnZUFzc2V0TG9jYXRpb24ge1xuICAgIGNvbnN0IHsgcmVwb05hbWUsIGFzc3VtZVJvbGVBcm4sIGRlcGVuZGVuY3lTdGFjayB9ID0gdGhpcy5zdGFnaW5nU3RhY2suYWRkRG9ja2VySW1hZ2UoYXNzZXQpO1xuICAgIGNvbnN0IGxvY2F0aW9uID0gdGhpcy5hc3NldE1hbmlmZXN0LmRlZmF1bHRBZGREb2NrZXJJbWFnZUFzc2V0KHRoaXMuYm91bmRTdGFjaywgYXNzZXQsIHtcbiAgICAgIHJlcG9zaXRvcnlOYW1lOiB0cmFuc2xhdGVDZm5Ub2tlblRvQXNzZXRUb2tlbihyZXBvTmFtZSksXG4gICAgICByb2xlOiBhc3N1bWVSb2xlQXJuID8geyBhc3N1bWVSb2xlQXJuOiB0cmFuc2xhdGVDZm5Ub2tlblRvQXNzZXRUb2tlbihhc3N1bWVSb2xlQXJuKSB9IDogdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgaWYgKGRlcGVuZGVuY3lTdGFjaykge1xuICAgICAgdGhpcy5ib3VuZFN0YWNrLmFkZERlcGVuZGVuY3koZGVwZW5kZW5jeVN0YWNrLCAnc3RhY2sgZGVwZW5kcyBvbiB0aGUgc3RhZ2luZyBzdGFjayBmb3Igc3RhZ2luZyByZXNvdXJjZXMnKTtcbiAgICAgIHRoaXMuZGVwZW5kZW5jeVN0YWNrcy5hZGQoZGVwZW5kZW5jeVN0YWNrKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jbG91ZEZvcm1hdGlvbkxvY2F0aW9uRnJvbURvY2tlckltYWdlQXNzZXQobG9jYXRpb24pO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { StringSpecializer } from 'aws-cdk-lib/core/lib/helpers-internal';
|
|
2
|
+
/**
|
|
3
|
+
* Bootstrapped role specifier. These roles must exist already.
|
|
4
|
+
* This class does not create new IAM Roles.
|
|
5
|
+
*/
|
|
6
|
+
export declare class BootstrapRole {
|
|
7
|
+
private readonly roleArn;
|
|
8
|
+
/**
|
|
9
|
+
* Use the currently assumed role/credentials
|
|
10
|
+
*/
|
|
11
|
+
static cliCredentials(): BootstrapRole;
|
|
12
|
+
/**
|
|
13
|
+
* Specify an existing IAM Role to assume
|
|
14
|
+
*/
|
|
15
|
+
static fromRoleArn(arn: string): BootstrapRole;
|
|
16
|
+
private static CLI_CREDS;
|
|
17
|
+
private constructor();
|
|
18
|
+
/**
|
|
19
|
+
* Whether or not this is object was created using BootstrapRole.cliCredentials()
|
|
20
|
+
*/
|
|
21
|
+
isCliCredentials(): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* @internal
|
|
24
|
+
*/
|
|
25
|
+
_arnForCloudFormation(): string | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* @internal
|
|
28
|
+
*/
|
|
29
|
+
_arnForCloudAssembly(): string | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* @internal
|
|
32
|
+
*/
|
|
33
|
+
_specialize(spec: StringSpecializer): BootstrapRole;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Deployment identities are the class of roles to be assumed by the CDK
|
|
37
|
+
* when deploying the App.
|
|
38
|
+
*/
|
|
39
|
+
export declare class DeploymentIdentities {
|
|
40
|
+
/** roles that are bootstrapped to your account. */
|
|
41
|
+
readonly roles: BootstrapRoles;
|
|
42
|
+
/**
|
|
43
|
+
* Use CLI credentials for all deployment identities.
|
|
44
|
+
*/
|
|
45
|
+
static cliCredentials(): DeploymentIdentities;
|
|
46
|
+
/**
|
|
47
|
+
* Specify your own roles for all deployment identities. These roles
|
|
48
|
+
* must already exist.
|
|
49
|
+
*/
|
|
50
|
+
static specifyRoles(roles: BootstrapRoles): DeploymentIdentities;
|
|
51
|
+
private constructor();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Roles that are bootstrapped to your account.
|
|
55
|
+
*/
|
|
56
|
+
export interface BootstrapRoles {
|
|
57
|
+
/**
|
|
58
|
+
* CloudFormation Execution Role
|
|
59
|
+
*
|
|
60
|
+
* @default - use bootstrapped role
|
|
61
|
+
*/
|
|
62
|
+
readonly cloudFormationExecutionRole?: BootstrapRole;
|
|
63
|
+
/**
|
|
64
|
+
* Deployment Action Role
|
|
65
|
+
*
|
|
66
|
+
* @default - use boostrapped role
|
|
67
|
+
*/
|
|
68
|
+
readonly deploymentRole?: BootstrapRole;
|
|
69
|
+
/**
|
|
70
|
+
* Lookup Role
|
|
71
|
+
*
|
|
72
|
+
* @default - use bootstrapped role
|
|
73
|
+
*/
|
|
74
|
+
readonly lookupRole?: BootstrapRole;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Roles that are included in the Staging Stack
|
|
78
|
+
* (for access to Staging Resources)
|
|
79
|
+
*/
|
|
80
|
+
export interface StagingRoles {
|
|
81
|
+
/**
|
|
82
|
+
* File Asset Publishing Role
|
|
83
|
+
*
|
|
84
|
+
* @default - staging stack creates a file asset publishing role
|
|
85
|
+
*/
|
|
86
|
+
readonly fileAssetPublishingRole?: BootstrapRole;
|
|
87
|
+
/**
|
|
88
|
+
* Docker Asset Publishing Role
|
|
89
|
+
*
|
|
90
|
+
* @default - staging stack creates a docker asset publishing role
|
|
91
|
+
*/
|
|
92
|
+
readonly dockerAssetPublishingRole?: BootstrapRole;
|
|
93
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a, _b;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.DeploymentIdentities = exports.BootstrapRole = void 0;
|
|
5
|
+
const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
|
|
6
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
7
|
+
const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal");
|
|
8
|
+
/**
|
|
9
|
+
* Bootstrapped role specifier. These roles must exist already.
|
|
10
|
+
* This class does not create new IAM Roles.
|
|
11
|
+
*/
|
|
12
|
+
class BootstrapRole {
|
|
13
|
+
/**
|
|
14
|
+
* Use the currently assumed role/credentials
|
|
15
|
+
*/
|
|
16
|
+
static cliCredentials() {
|
|
17
|
+
return new BootstrapRole(BootstrapRole.CLI_CREDS);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Specify an existing IAM Role to assume
|
|
21
|
+
*/
|
|
22
|
+
static fromRoleArn(arn) {
|
|
23
|
+
helpers_internal_1.StringSpecializer.validateNoTokens(arn, 'BootstrapRole ARN');
|
|
24
|
+
return new BootstrapRole(arn);
|
|
25
|
+
}
|
|
26
|
+
constructor(roleArn) {
|
|
27
|
+
this.roleArn = roleArn;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Whether or not this is object was created using BootstrapRole.cliCredentials()
|
|
31
|
+
*/
|
|
32
|
+
isCliCredentials() {
|
|
33
|
+
return this.roleArn === BootstrapRole.CLI_CREDS;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* @internal
|
|
37
|
+
*/
|
|
38
|
+
_arnForCloudFormation() {
|
|
39
|
+
return this.isCliCredentials() ? undefined : (0, helpers_internal_1.translateAssetTokenToCfnToken)(this.roleArn);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* @internal
|
|
43
|
+
*/
|
|
44
|
+
_arnForCloudAssembly() {
|
|
45
|
+
return this.isCliCredentials() ? undefined : (0, helpers_internal_1.translateCfnTokenToAssetToken)(this.roleArn);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* @internal
|
|
49
|
+
*/
|
|
50
|
+
_specialize(spec) {
|
|
51
|
+
return new BootstrapRole(spec.specialize(this.roleArn));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
55
|
+
BootstrapRole[_a] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.BootstrapRole", version: "2.82.0-alpha.0" };
|
|
56
|
+
BootstrapRole.CLI_CREDS = 'cli-credentials';
|
|
57
|
+
exports.BootstrapRole = BootstrapRole;
|
|
58
|
+
/**
|
|
59
|
+
* Deployment identities are the class of roles to be assumed by the CDK
|
|
60
|
+
* when deploying the App.
|
|
61
|
+
*/
|
|
62
|
+
class DeploymentIdentities {
|
|
63
|
+
/**
|
|
64
|
+
* Use CLI credentials for all deployment identities.
|
|
65
|
+
*/
|
|
66
|
+
static cliCredentials() {
|
|
67
|
+
return new DeploymentIdentities({
|
|
68
|
+
cloudFormationExecutionRole: BootstrapRole.cliCredentials(),
|
|
69
|
+
deploymentRole: BootstrapRole.cliCredentials(),
|
|
70
|
+
lookupRole: BootstrapRole.cliCredentials(),
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Specify your own roles for all deployment identities. These roles
|
|
75
|
+
* must already exist.
|
|
76
|
+
*/
|
|
77
|
+
static specifyRoles(roles) {
|
|
78
|
+
try {
|
|
79
|
+
jsiiDeprecationWarnings._aws_cdk_app_staging_synthesizer_alpha_BootstrapRoles(roles);
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
83
|
+
Error.captureStackTrace(error, this.specifyRoles);
|
|
84
|
+
}
|
|
85
|
+
throw error;
|
|
86
|
+
}
|
|
87
|
+
return new DeploymentIdentities(roles);
|
|
88
|
+
}
|
|
89
|
+
constructor(
|
|
90
|
+
/** roles that are bootstrapped to your account. */
|
|
91
|
+
roles) {
|
|
92
|
+
this.roles = roles;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
_b = JSII_RTTI_SYMBOL_1;
|
|
96
|
+
DeploymentIdentities[_b] = { fqn: "@aws-cdk/app-staging-synthesizer-alpha.DeploymentIdentities", version: "2.82.0-alpha.0" };
|
|
97
|
+
exports.DeploymentIdentities = DeploymentIdentities;
|
|
98
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLXJvbGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYm9vdHN0cmFwLXJvbGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDRFQUF3STtBQUV4STs7O0dBR0c7QUFDSCxNQUFhLGFBQWE7SUFDeEI7O09BRUc7SUFDSSxNQUFNLENBQUMsY0FBYztRQUMxQixPQUFPLElBQUksYUFBYSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUNuRDtJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFXO1FBQ25DLG9DQUFpQixDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQzdELE9BQU8sSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDL0I7SUFJRCxZQUFxQyxPQUFlO1FBQWYsWUFBTyxHQUFQLE9BQU8sQ0FBUTtLQUFJO0lBRXhEOztPQUVHO0lBQ0ksZ0JBQWdCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxhQUFhLENBQUMsU0FBUyxDQUFDO0tBQ2pEO0lBRUQ7O09BRUc7SUFDSSxxQkFBcUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFBLGdEQUE2QixFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUMxRjtJQUVEOztPQUVHO0lBQ0ksb0JBQW9CO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBQSxnREFBNkIsRUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDMUY7SUFFRDs7T0FFRztJQUNJLFdBQVcsQ0FBQyxJQUF1QjtRQUN4QyxPQUFPLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7S0FDekQ7Ozs7QUE5QmMsdUJBQVMsR0FBRyxpQkFBaUIsQ0FBQztBQWhCbEMsc0NBQWE7QUFpRDFCOzs7R0FHRztBQUNILE1BQWEsb0JBQW9CO0lBQy9COztPQUVHO0lBQ0ksTUFBTSxDQUFDLGNBQWM7UUFDMUIsT0FBTyxJQUFJLG9CQUFvQixDQUFDO1lBQzlCLDJCQUEyQixFQUFFLGFBQWEsQ0FBQyxjQUFjLEVBQUU7WUFDM0QsY0FBYyxFQUFFLGFBQWEsQ0FBQyxjQUFjLEVBQUU7WUFDOUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxjQUFjLEVBQUU7U0FDM0MsQ0FBQyxDQUFDO0tBQ0o7SUFFRDs7O09BR0c7SUFDSSxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQXFCOzs7Ozs7Ozs7O1FBQzlDLE9BQU8sSUFBSSxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUN4QztJQUVEO0lBQ0UsbURBQW1EO0lBQ25DLEtBQXFCO1FBQXJCLFVBQUssR0FBTCxLQUFLLENBQWdCO0tBQ25DOzs7O0FBdkJPLG9EQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN0cmluZ1NwZWNpYWxpemVyLCB0cmFuc2xhdGVBc3NldFRva2VuVG9DZm5Ub2tlbiwgdHJhbnNsYXRlQ2ZuVG9rZW5Ub0Fzc2V0VG9rZW4gfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9oZWxwZXJzLWludGVybmFsJztcblxuLyoqXG4gKiBCb290c3RyYXBwZWQgcm9sZSBzcGVjaWZpZXIuIFRoZXNlIHJvbGVzIG11c3QgZXhpc3QgYWxyZWFkeS5cbiAqIFRoaXMgY2xhc3MgZG9lcyBub3QgY3JlYXRlIG5ldyBJQU0gUm9sZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBCb290c3RyYXBSb2xlIHtcbiAgLyoqXG4gICAqIFVzZSB0aGUgY3VycmVudGx5IGFzc3VtZWQgcm9sZS9jcmVkZW50aWFsc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjbGlDcmVkZW50aWFscygpIHtcbiAgICByZXR1cm4gbmV3IEJvb3RzdHJhcFJvbGUoQm9vdHN0cmFwUm9sZS5DTElfQ1JFRFMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgYW4gZXhpc3RpbmcgSUFNIFJvbGUgdG8gYXNzdW1lXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Sb2xlQXJuKGFybjogc3RyaW5nKSB7XG4gICAgU3RyaW5nU3BlY2lhbGl6ZXIudmFsaWRhdGVOb1Rva2Vucyhhcm4sICdCb290c3RyYXBSb2xlIEFSTicpO1xuICAgIHJldHVybiBuZXcgQm9vdHN0cmFwUm9sZShhcm4pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgQ0xJX0NSRURTID0gJ2NsaS1jcmVkZW50aWFscyc7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHJvbGVBcm46IHN0cmluZykge31cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhpcyBpcyBvYmplY3Qgd2FzIGNyZWF0ZWQgdXNpbmcgQm9vdHN0cmFwUm9sZS5jbGlDcmVkZW50aWFscygpXG4gICAqL1xuICBwdWJsaWMgaXNDbGlDcmVkZW50aWFscygpIHtcbiAgICByZXR1cm4gdGhpcy5yb2xlQXJuID09PSBCb290c3RyYXBSb2xlLkNMSV9DUkVEUztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfYXJuRm9yQ2xvdWRGb3JtYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNDbGlDcmVkZW50aWFscygpID8gdW5kZWZpbmVkIDogdHJhbnNsYXRlQXNzZXRUb2tlblRvQ2ZuVG9rZW4odGhpcy5yb2xlQXJuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfYXJuRm9yQ2xvdWRBc3NlbWJseSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc0NsaUNyZWRlbnRpYWxzKCkgPyB1bmRlZmluZWQgOiB0cmFuc2xhdGVDZm5Ub2tlblRvQXNzZXRUb2tlbih0aGlzLnJvbGVBcm4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF9zcGVjaWFsaXplKHNwZWM6IFN0cmluZ1NwZWNpYWxpemVyKSB7XG4gICAgcmV0dXJuIG5ldyBCb290c3RyYXBSb2xlKHNwZWMuc3BlY2lhbGl6ZSh0aGlzLnJvbGVBcm4pKTtcbiAgfVxufVxuXG4vKipcbiAqIERlcGxveW1lbnQgaWRlbnRpdGllcyBhcmUgdGhlIGNsYXNzIG9mIHJvbGVzIHRvIGJlIGFzc3VtZWQgYnkgdGhlIENES1xuICogd2hlbiBkZXBsb3lpbmcgdGhlIEFwcC5cbiAqL1xuZXhwb3J0IGNsYXNzIERlcGxveW1lbnRJZGVudGl0aWVzIHtcbiAgLyoqXG4gICAqIFVzZSBDTEkgY3JlZGVudGlhbHMgZm9yIGFsbCBkZXBsb3ltZW50IGlkZW50aXRpZXMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNsaUNyZWRlbnRpYWxzKCk6IERlcGxveW1lbnRJZGVudGl0aWVzIHtcbiAgICByZXR1cm4gbmV3IERlcGxveW1lbnRJZGVudGl0aWVzKHtcbiAgICAgIGNsb3VkRm9ybWF0aW9uRXhlY3V0aW9uUm9sZTogQm9vdHN0cmFwUm9sZS5jbGlDcmVkZW50aWFscygpLFxuICAgICAgZGVwbG95bWVudFJvbGU6IEJvb3RzdHJhcFJvbGUuY2xpQ3JlZGVudGlhbHMoKSxcbiAgICAgIGxvb2t1cFJvbGU6IEJvb3RzdHJhcFJvbGUuY2xpQ3JlZGVudGlhbHMoKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHlvdXIgb3duIHJvbGVzIGZvciBhbGwgZGVwbG95bWVudCBpZGVudGl0aWVzLiBUaGVzZSByb2xlc1xuICAgKiBtdXN0IGFscmVhZHkgZXhpc3QuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNwZWNpZnlSb2xlcyhyb2xlczogQm9vdHN0cmFwUm9sZXMpOiBEZXBsb3ltZW50SWRlbnRpdGllcyB7XG4gICAgcmV0dXJuIG5ldyBEZXBsb3ltZW50SWRlbnRpdGllcyhyb2xlcyk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIC8qKiByb2xlcyB0aGF0IGFyZSBib290c3RyYXBwZWQgdG8geW91ciBhY2NvdW50LiAqL1xuICAgIHB1YmxpYyByZWFkb25seSByb2xlczogQm9vdHN0cmFwUm9sZXMsXG4gICkge31cbn1cblxuLyoqXG4gKiBSb2xlcyB0aGF0IGFyZSBib290c3RyYXBwZWQgdG8geW91ciBhY2NvdW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJvb3RzdHJhcFJvbGVzIHtcbiAgLyoqXG4gICAqIENsb3VkRm9ybWF0aW9uIEV4ZWN1dGlvbiBSb2xlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdXNlIGJvb3RzdHJhcHBlZCByb2xlXG4gICAqL1xuICByZWFkb25seSBjbG91ZEZvcm1hdGlvbkV4ZWN1dGlvblJvbGU/OiBCb290c3RyYXBSb2xlO1xuXG4gIC8qKlxuICAgKiBEZXBsb3ltZW50IEFjdGlvbiBSb2xlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdXNlIGJvb3N0cmFwcGVkIHJvbGVcbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveW1lbnRSb2xlPzogQm9vdHN0cmFwUm9sZTtcblxuICAvKipcbiAgICogTG9va3VwIFJvbGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSB1c2UgYm9vdHN0cmFwcGVkIHJvbGVcbiAgICovXG4gIHJlYWRvbmx5IGxvb2t1cFJvbGU/OiBCb290c3RyYXBSb2xlO1xufVxuXG4vKipcbiAqIFJvbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBTdGFnaW5nIFN0YWNrXG4gKiAoZm9yIGFjY2VzcyB0byBTdGFnaW5nIFJlc291cmNlcylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFnaW5nUm9sZXMge1xuICAvKipcbiAgICogRmlsZSBBc3NldCBQdWJsaXNoaW5nIFJvbGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdGFnaW5nIHN0YWNrIGNyZWF0ZXMgYSBmaWxlIGFzc2V0IHB1Ymxpc2hpbmcgcm9sZVxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZUFzc2V0UHVibGlzaGluZ1JvbGU/OiBCb290c3RyYXBSb2xlO1xuXG4gIC8qKlxuICAgKiBEb2NrZXIgQXNzZXQgUHVibGlzaGluZyBSb2xlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gc3RhZ2luZyBzdGFjayBjcmVhdGVzIGEgZG9ja2VyIGFzc2V0IHB1Ymxpc2hpbmcgcm9sZVxuICAgKi9cbiAgcmVhZG9ubHkgZG9ja2VyQXNzZXRQdWJsaXNoaW5nUm9sZT86IEJvb3RzdHJhcFJvbGU7XG59XG4iXX0=
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { App, DockerImageAssetSource, Duration, FileAssetSource, ISynthesisSession, Stack, StackProps } from 'aws-cdk-lib';
|
|
2
|
+
import * as ecr from 'aws-cdk-lib/aws-ecr';
|
|
3
|
+
import * as s3 from 'aws-cdk-lib/aws-s3';
|
|
4
|
+
import { BootstrapRole } from './bootstrap-roles';
|
|
5
|
+
import { FileStagingLocation, IStagingResources, IStagingResourcesFactory, ImageStagingLocation } from './staging-stack';
|
|
6
|
+
export declare const DEPLOY_TIME_PREFIX = "deploy-time/";
|
|
7
|
+
/**
|
|
8
|
+
* User configurable options to the DefaultStagingStack.
|
|
9
|
+
*/
|
|
10
|
+
export interface DefaultStagingStackOptions {
|
|
11
|
+
/**
|
|
12
|
+
* A unique identifier for the application that the staging stack belongs to.
|
|
13
|
+
*
|
|
14
|
+
* This identifier will be used in the name of staging resources
|
|
15
|
+
* created for this application, and should be unique across CDK apps.
|
|
16
|
+
*
|
|
17
|
+
* The identifier should include lowercase characters and dashes ('-') only
|
|
18
|
+
* and have a maximum of 20 characters.
|
|
19
|
+
*/
|
|
20
|
+
readonly appId: string;
|
|
21
|
+
/**
|
|
22
|
+
* Explicit name for the staging bucket
|
|
23
|
+
*
|
|
24
|
+
* @default - a well-known name unique to this app/env.
|
|
25
|
+
*/
|
|
26
|
+
readonly stagingBucketName?: string;
|
|
27
|
+
/**
|
|
28
|
+
* Pass in an existing role to be used as the file publishing role.
|
|
29
|
+
*
|
|
30
|
+
* @default - a new role will be created
|
|
31
|
+
*/
|
|
32
|
+
readonly fileAssetPublishingRole?: BootstrapRole;
|
|
33
|
+
/**
|
|
34
|
+
* Pass in an existing role to be used as the image publishing role.
|
|
35
|
+
*
|
|
36
|
+
* @default - a new role will be created
|
|
37
|
+
*/
|
|
38
|
+
readonly imageAssetPublishingRole?: BootstrapRole;
|
|
39
|
+
/**
|
|
40
|
+
* The lifetime for deploy time file assets.
|
|
41
|
+
*
|
|
42
|
+
* Assets that are only necessary at deployment time (for instance,
|
|
43
|
+
* CloudFormation templates and Lambda source code bundles) will be
|
|
44
|
+
* automatically deleted after this many days. Assets that may be
|
|
45
|
+
* read from the staging bucket during your application's run time
|
|
46
|
+
* will not be deleted.
|
|
47
|
+
*
|
|
48
|
+
* Set this to the length of time you wish to be able to roll back to
|
|
49
|
+
* previous versions of your application without having to do a new
|
|
50
|
+
* `cdk synth` and re-upload of assets.
|
|
51
|
+
*
|
|
52
|
+
* @default - Duration.days(30)
|
|
53
|
+
*/
|
|
54
|
+
readonly deployTimeFileAssetLifetime?: Duration;
|
|
55
|
+
/**
|
|
56
|
+
* The maximum number of image versions to store in a repository.
|
|
57
|
+
*
|
|
58
|
+
* Previous versions of an image can be stored for rollback purposes.
|
|
59
|
+
* Once a repository has more than 3 image versions stored, the oldest
|
|
60
|
+
* version will be discarded. This allows for sensible garbage collection
|
|
61
|
+
* while maintaining a few previous versions for rollback scenarios.
|
|
62
|
+
*
|
|
63
|
+
* @default - up to 3 versions stored
|
|
64
|
+
*/
|
|
65
|
+
readonly imageAssetVersionCount?: number;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Default Staging Stack Properties
|
|
69
|
+
*/
|
|
70
|
+
export interface DefaultStagingStackProps extends DefaultStagingStackOptions, StackProps {
|
|
71
|
+
/**
|
|
72
|
+
* The ARN of the deploy action role, if given
|
|
73
|
+
*
|
|
74
|
+
* This role will need permissions to read from to the staging resources.
|
|
75
|
+
*
|
|
76
|
+
* @default - The CLI credentials are assumed, no additional permissions are granted.
|
|
77
|
+
*/
|
|
78
|
+
readonly deployRoleArn?: string;
|
|
79
|
+
/**
|
|
80
|
+
* The qualifier used to specialize strings
|
|
81
|
+
*
|
|
82
|
+
* Shouldn't be necessary but who knows what people might do.
|
|
83
|
+
*/
|
|
84
|
+
readonly qualifier: string;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* A default Staging Stack that implements IStagingResources.
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* const defaultStagingStack = DefaultStagingStack.factory({ appId: 'my-app-id' });
|
|
91
|
+
*/
|
|
92
|
+
export declare class DefaultStagingStack extends Stack implements IStagingResources {
|
|
93
|
+
private readonly props;
|
|
94
|
+
/**
|
|
95
|
+
* Return a factory that will create DefaultStagingStacks
|
|
96
|
+
*/
|
|
97
|
+
static factory(options: DefaultStagingStackOptions): IStagingResourcesFactory;
|
|
98
|
+
/**
|
|
99
|
+
* Default asset publishing role name for file (S3) assets.
|
|
100
|
+
*/
|
|
101
|
+
private get fileRoleName();
|
|
102
|
+
/**
|
|
103
|
+
* Default asset publishing role name for docker (ECR) assets.
|
|
104
|
+
*/
|
|
105
|
+
private get imageRoleName();
|
|
106
|
+
/**
|
|
107
|
+
* The app-scoped, evironment-keyed staging bucket.
|
|
108
|
+
*/
|
|
109
|
+
readonly stagingBucket?: s3.Bucket;
|
|
110
|
+
/**
|
|
111
|
+
* The app-scoped, environment-keyed ecr repositories associated with this app.
|
|
112
|
+
*/
|
|
113
|
+
readonly stagingRepos: Record<string, ecr.Repository>;
|
|
114
|
+
/**
|
|
115
|
+
* The stack to add dependencies to.
|
|
116
|
+
*/
|
|
117
|
+
readonly dependencyStack: Stack;
|
|
118
|
+
private readonly appId;
|
|
119
|
+
private readonly stagingBucketName?;
|
|
120
|
+
/**
|
|
121
|
+
* File publish role ARN in asset manifest format
|
|
122
|
+
*/
|
|
123
|
+
private readonly providedFileRole?;
|
|
124
|
+
private fileRole?;
|
|
125
|
+
private fileRoleManifestArn?;
|
|
126
|
+
/**
|
|
127
|
+
* Image publishing role ARN in asset manifest format
|
|
128
|
+
*/
|
|
129
|
+
private readonly providedImageRole?;
|
|
130
|
+
private imageRole?;
|
|
131
|
+
private didImageRole;
|
|
132
|
+
private imageRoleManifestArn?;
|
|
133
|
+
private readonly deployRoleArn?;
|
|
134
|
+
constructor(scope: App, id: string, props: DefaultStagingStackProps);
|
|
135
|
+
private validateAppId;
|
|
136
|
+
private ensureFileRole;
|
|
137
|
+
private ensureImageRole;
|
|
138
|
+
private createBucketKey;
|
|
139
|
+
private getCreateBucket;
|
|
140
|
+
/**
|
|
141
|
+
* Returns the well-known name of the repo
|
|
142
|
+
*/
|
|
143
|
+
private getCreateRepo;
|
|
144
|
+
addFile(asset: FileAssetSource): FileStagingLocation;
|
|
145
|
+
addDockerImage(asset: DockerImageAssetSource): ImageStagingLocation;
|
|
146
|
+
/**
|
|
147
|
+
* Synthesizes the cloudformation template into a cloud assembly.
|
|
148
|
+
* @internal
|
|
149
|
+
*/
|
|
150
|
+
_synthesizeTemplate(session: ISynthesisSession, lookupRoleArn?: string | undefined): void;
|
|
151
|
+
}
|