@aws-cdk/aws-imagebuilder-alpha 2.227.0-alpha.0 → 2.229.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.
@@ -0,0 +1,451 @@
1
+ "use strict";
2
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
3
+ var useValue = arguments.length > 2;
4
+ for (var i = 0; i < initializers.length; i++) {
5
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
6
+ }
7
+ return useValue ? value : void 0;
8
+ };
9
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
10
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
11
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
12
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
13
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
14
+ var _, done = false;
15
+ for (var i = decorators.length - 1; i >= 0; i--) {
16
+ var context = {};
17
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
18
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
19
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
20
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
21
+ if (kind === "accessor") {
22
+ if (result === void 0) continue;
23
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
24
+ if (_ = accept(result.get)) descriptor.get = _;
25
+ if (_ = accept(result.set)) descriptor.set = _;
26
+ if (_ = accept(result.init)) initializers.unshift(_);
27
+ }
28
+ else if (_ = accept(result)) {
29
+ if (kind === "field") initializers.unshift(_);
30
+ else descriptor[key] = _;
31
+ }
32
+ }
33
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
34
+ done = true;
35
+ };
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.ContainerRecipe = exports.ContainerRecipeBase = exports.S3DockerfileData = exports.DockerfileData = exports.ContainerType = void 0;
38
+ const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
39
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
40
+ const cdk = require("aws-cdk-lib");
41
+ const iam = require("aws-cdk-lib/aws-iam");
42
+ const aws_imagebuilder_1 = require("aws-cdk-lib/aws-imagebuilder");
43
+ const s3assets = require("aws-cdk-lib/aws-s3-assets");
44
+ const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
45
+ const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
46
+ const CONTAINER_RECIPE_SYMBOL = Symbol.for('@aws-cdk/aws-imagebuilder-alpha.ContainerRecipe');
47
+ /**
48
+ * Represents the latest version of a container recipe. When using the recipe in a pipeline, the pipeline will use the
49
+ * latest recipe at the time of execution.
50
+ *
51
+ * @see https://docs.aws.amazon.com/imagebuilder/latest/userguide/ibhow-semantic-versioning.html
52
+ */
53
+ const LATEST_VERSION = 'x.x.x';
54
+ /**
55
+ * The default version to use in the container recipe. When the recipe is updated, the `x` will be incremented off from
56
+ * the latest recipe version that exists.
57
+ *
58
+ * @see https://docs.aws.amazon.com/imagebuilder/latest/userguide/create-image-recipes.html
59
+ */
60
+ const DEFAULT_RECIPE_VERSION = '1.0.x';
61
+ /**
62
+ * The type of the container being used in the container recipe
63
+ */
64
+ var ContainerType;
65
+ (function (ContainerType) {
66
+ /**
67
+ * Indicates the container recipe uses a Docker container
68
+ */
69
+ ContainerType["DOCKER"] = "DOCKER";
70
+ })(ContainerType || (exports.ContainerType = ContainerType = {}));
71
+ /**
72
+ * Helper class for referencing and uploading dockerfile data for the container recipe
73
+ */
74
+ class DockerfileData {
75
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.DockerfileData", version: "2.229.0-alpha.0" };
76
+ /**
77
+ * Uploads dockerfile data from a local file to S3 to use as the dockerfile data
78
+ *
79
+ * @param scope The construct scope
80
+ * @param id Identifier of the construct
81
+ * @param path The local path to the dockerfile data file
82
+ * @param options S3 asset upload options
83
+ */
84
+ static fromAsset(scope, id, path, options = {}) {
85
+ const asset = new s3assets.Asset(scope, id, { ...options, path });
86
+ return new S3DockerfileDataFromAsset(asset);
87
+ }
88
+ /**
89
+ * References dockerfile data from a pre-existing S3 object
90
+ *
91
+ * @param bucket The S3 bucket where the dockerfile data is stored
92
+ * @param key The S3 key of the dockerfile data file
93
+ */
94
+ static fromS3(bucket, key) {
95
+ return new S3DockerfileDataFromBucketKey(bucket, key);
96
+ }
97
+ /**
98
+ * Uses an inline string as the dockerfile data
99
+ *
100
+ * @param data An inline string representing the dockerfile data
101
+ */
102
+ static fromInline(data) {
103
+ return new InlineDockerfileData(data);
104
+ }
105
+ }
106
+ exports.DockerfileData = DockerfileData;
107
+ /**
108
+ * Helper class for S3-based dockerfile data references, containing additional permission grant methods on the S3 object
109
+ */
110
+ class S3DockerfileData extends DockerfileData {
111
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.S3DockerfileData", version: "2.229.0-alpha.0" };
112
+ bucket;
113
+ key;
114
+ constructor(bucket, key) {
115
+ super();
116
+ this.bucket = bucket;
117
+ this.key = key;
118
+ }
119
+ /**
120
+ * The rendered Dockerfile S3 URL, for use in CloudFormation
121
+ */
122
+ render() {
123
+ return { dockerfileTemplateUri: this.bucket.s3UrlForObject(this.key) };
124
+ }
125
+ /**
126
+ * Grant put permissions to the given grantee for the dockerfile data in S3
127
+ *
128
+ * @param grantee The principal
129
+ */
130
+ grantPut(grantee) {
131
+ return this.bucket.grantPut(grantee, this.key);
132
+ }
133
+ /**
134
+ * Grant read permissions to the given grantee for the dockerfile data in S3
135
+ *
136
+ * @param grantee The principal
137
+ */
138
+ grantRead(grantee) {
139
+ return this.bucket.grantRead(grantee, this.key);
140
+ }
141
+ }
142
+ exports.S3DockerfileData = S3DockerfileData;
143
+ class InlineDockerfileData extends DockerfileData {
144
+ data;
145
+ constructor(data) {
146
+ super();
147
+ this.data = data;
148
+ }
149
+ /**
150
+ * The rendered Dockerfile text, for use in CloudFormation
151
+ */
152
+ render() {
153
+ return { dockerfileTemplateData: this.data };
154
+ }
155
+ }
156
+ class S3DockerfileDataFromBucketKey extends S3DockerfileData {
157
+ constructor(bucket, key) {
158
+ super(bucket, key);
159
+ }
160
+ }
161
+ class S3DockerfileDataFromAsset extends S3DockerfileData {
162
+ constructor(asset) {
163
+ super(asset.bucket, asset.s3ObjectKey);
164
+ }
165
+ }
166
+ /**
167
+ * A new or imported Container Recipe
168
+ */
169
+ class ContainerRecipeBase extends cdk.Resource {
170
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.ContainerRecipeBase", version: "2.229.0-alpha.0" };
171
+ /**
172
+ * Grant custom actions to the given grantee for the container recipe
173
+ *
174
+ * @param grantee The principal
175
+ * @param actions The list of actions
176
+ */
177
+ grant(grantee, ...actions) {
178
+ return iam.Grant.addToPrincipal({
179
+ grantee,
180
+ actions,
181
+ resourceArns: [this.containerRecipeArn],
182
+ scope: this,
183
+ });
184
+ }
185
+ /**
186
+ * Grant read permissions to the given grantee for the container recipe
187
+ *
188
+ * @param grantee The principal
189
+ */
190
+ grantRead(grantee) {
191
+ return this.grant(grantee, 'imagebuilder:GetContainerRecipe');
192
+ }
193
+ /**
194
+ * Indicates whether the recipe is a Container Recipe
195
+ *
196
+ * @internal
197
+ */
198
+ _isContainerRecipe() {
199
+ return true;
200
+ }
201
+ /**
202
+ * Indicates whether the recipe is an Image Recipe
203
+ *
204
+ * @internal
205
+ */
206
+ _isImageRecipe() {
207
+ return false;
208
+ }
209
+ }
210
+ exports.ContainerRecipeBase = ContainerRecipeBase;
211
+ /**
212
+ * Represents an EC2 Image Builder Container Recipe.
213
+ *
214
+ * @see https://docs.aws.amazon.com/imagebuilder/latest/userguide/manage-recipes.html
215
+ */
216
+ let ContainerRecipe = (() => {
217
+ let _classDecorators = [prop_injectable_1.propertyInjectable];
218
+ let _classDescriptor;
219
+ let _classExtraInitializers = [];
220
+ let _classThis;
221
+ let _classSuper = ContainerRecipeBase;
222
+ let _instanceExtraInitializers = [];
223
+ let _addInstanceBlockDevice_decorators;
224
+ var ContainerRecipe = class extends _classSuper {
225
+ static { _classThis = this; }
226
+ static {
227
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
228
+ _addInstanceBlockDevice_decorators = [(0, metadata_resource_1.MethodMetadata)()];
229
+ __esDecorate(this, null, _addInstanceBlockDevice_decorators, { kind: "method", name: "addInstanceBlockDevice", static: false, private: false, access: { has: obj => "addInstanceBlockDevice" in obj, get: obj => obj.addInstanceBlockDevice }, metadata: _metadata }, null, _instanceExtraInitializers);
230
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
231
+ ContainerRecipe = _classThis = _classDescriptor.value;
232
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
233
+ }
234
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.ContainerRecipe", version: "2.229.0-alpha.0" };
235
+ /** Uniquely identifies this class. */
236
+ static PROPERTY_INJECTION_ID = '@aws-cdk.aws-imagebuilder-alpha.ContainerRecipe';
237
+ /**
238
+ * Import an existing container recipe given its ARN.
239
+ */
240
+ static fromContainerRecipeArn(scope, id, containerRecipeArn) {
241
+ return this.fromContainerRecipeAttributes(scope, id, { containerRecipeArn });
242
+ }
243
+ /**
244
+ * Import the latest version of an existing container recipe given its name. The provided name must be normalized by
245
+ * converting all alphabetical characters to lowercase, and replacing all spaces and underscores with hyphens.
246
+ */
247
+ static fromContainerRecipeName(scope, id, containerRecipeName) {
248
+ return this.fromContainerRecipeAttributes(scope, id, { containerRecipeName });
249
+ }
250
+ /**
251
+ * Import an existing container recipe by providing its attributes. If the container recipe name is provided as an
252
+ * attribute, it must be normalized by converting all alphabetical characters to lowercase, and replacing all spaces
253
+ * and underscores with hyphens.
254
+ */
255
+ static fromContainerRecipeAttributes(scope, id, attrs) {
256
+ try {
257
+ jsiiDeprecationWarnings._aws_cdk_aws_imagebuilder_alpha_ContainerRecipeAttributes(attrs);
258
+ }
259
+ catch (error) {
260
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
261
+ Error.captureStackTrace(error, this.fromContainerRecipeAttributes);
262
+ }
263
+ throw error;
264
+ }
265
+ if (!attrs.containerRecipeArn && !attrs.containerRecipeName) {
266
+ throw new cdk.ValidationError('either either containerRecipeArn or containerRecipeName must be provided to import a container recipe', scope);
267
+ }
268
+ const containerRecipeArn = attrs.containerRecipeArn ??
269
+ cdk.Stack.of(scope).formatArn({
270
+ service: 'imagebuilder',
271
+ resource: 'container-recipe',
272
+ resourceName: `${attrs.containerRecipeName}/${attrs.containerRecipeVersion ?? LATEST_VERSION}`,
273
+ });
274
+ const [containerRecipeName, containerRecipeVersion] = (() => {
275
+ if (attrs.containerRecipeName) {
276
+ return [attrs.containerRecipeName, attrs.containerRecipeVersion ?? LATEST_VERSION];
277
+ }
278
+ const containerRecipeNameVersion = cdk.Stack.of(scope).splitArn(containerRecipeArn, cdk.ArnFormat.SLASH_RESOURCE_NAME).resourceName;
279
+ const containerRecipeNameVersionSplit = cdk.Fn.split('/', containerRecipeNameVersion);
280
+ return [cdk.Fn.select(0, containerRecipeNameVersionSplit), cdk.Fn.select(1, containerRecipeNameVersionSplit)];
281
+ })();
282
+ class Import extends ContainerRecipeBase {
283
+ containerRecipeArn = containerRecipeArn;
284
+ containerRecipeName = containerRecipeName;
285
+ containerRecipeVersion = containerRecipeVersion;
286
+ }
287
+ return new Import(scope, id);
288
+ }
289
+ /**
290
+ * Return whether the given object is a ContainerRecipe.
291
+ */
292
+ static isContainerRecipe(x) {
293
+ return x !== null && typeof x === 'object' && CONTAINER_RECIPE_SYMBOL in x;
294
+ }
295
+ /**
296
+ * The ARN of the container recipe
297
+ */
298
+ containerRecipeArn = __runInitializers(this, _instanceExtraInitializers);
299
+ /**
300
+ * The name of the container recipe
301
+ */
302
+ containerRecipeName;
303
+ /**
304
+ * The version of the container recipe
305
+ */
306
+ containerRecipeVersion;
307
+ instanceBlockDevices = [];
308
+ constructor(scope, id, props) {
309
+ super(scope, id, {
310
+ physicalName: props.containerRecipeName ??
311
+ cdk.Lazy.string({
312
+ produce: () => cdk.Names.uniqueResourceName(this, {
313
+ maxLength: 128,
314
+ separator: '-',
315
+ allowedSpecialCharacters: '-',
316
+ }).toLowerCase(), // Enforce lowercase for the auto-generated fallback
317
+ }),
318
+ });
319
+ try {
320
+ jsiiDeprecationWarnings._aws_cdk_aws_imagebuilder_alpha_ContainerRecipeProps(props);
321
+ }
322
+ catch (error) {
323
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
324
+ Error.captureStackTrace(error, ContainerRecipe);
325
+ }
326
+ throw error;
327
+ }
328
+ // Enhanced CDK Analytics Telemetry
329
+ (0, metadata_resource_1.addConstructMetadata)(this, props);
330
+ Object.defineProperty(this, CONTAINER_RECIPE_SYMBOL, { value: true });
331
+ this.validateContainerRecipeName();
332
+ this.addInstanceBlockDevice(...(props.instanceBlockDevices ?? []));
333
+ const components = props.components?.map((component) => ({
334
+ componentArn: component.component.componentArn,
335
+ ...(component.parameters && {
336
+ parameters: Object.entries(component.parameters).map(([name, param]) => ({
337
+ name,
338
+ value: param.value,
339
+ })),
340
+ }),
341
+ }));
342
+ const dockerfile = props.dockerfile ??
343
+ DockerfileData.fromInline('FROM {{{ imagebuilder:parentImage }}}\n{{{ imagebuilder:environments }}}\n{{{ imagebuilder:components }}}');
344
+ const containerRecipeVersion = props.containerRecipeVersion ?? DEFAULT_RECIPE_VERSION;
345
+ const containerRecipe = new aws_imagebuilder_1.CfnContainerRecipe(this, 'Resource', {
346
+ name: this.physicalName,
347
+ version: containerRecipeVersion,
348
+ description: props.description,
349
+ parentImage: props.baseImage.image,
350
+ containerType: ContainerType.DOCKER,
351
+ targetRepository: {
352
+ repositoryName: props.targetRepository.repositoryName,
353
+ service: props.targetRepository.service,
354
+ },
355
+ platformOverride: props.osVersion?.platform,
356
+ imageOsVersionOverride: props.osVersion?.osVersion,
357
+ kmsKeyId: props.kmsKey?.keyArn,
358
+ instanceConfiguration: cdk.Lazy.any({ produce: () => this.buildInstanceConfiguration(props) }),
359
+ workingDirectory: props.workingDirectory,
360
+ tags: props.tags,
361
+ ...dockerfile.render(),
362
+ ...(components?.length && { components }),
363
+ });
364
+ this.containerRecipeName = this.getResourceNameAttribute(containerRecipe.attrName);
365
+ this.containerRecipeArn = this.getResourceArnAttribute(containerRecipe.attrArn, {
366
+ service: 'imagebuilder',
367
+ resource: 'container-recipe',
368
+ resourceName: `${this.physicalName}/${containerRecipeVersion}`,
369
+ });
370
+ this.containerRecipeVersion = containerRecipe.getAtt('Version').toString();
371
+ }
372
+ /**
373
+ * Adds block devices to attach to the instance used for building, testing, and distributing the container image.
374
+ *
375
+ * @param instanceBlockDevices - The list of block devices to attach
376
+ */
377
+ addInstanceBlockDevice(...instanceBlockDevices) {
378
+ this.instanceBlockDevices.push(...instanceBlockDevices);
379
+ }
380
+ /**
381
+ * Renders the block devices provided as input to the construct, into the block device mapping structure that
382
+ * CfnContainerRecipe expects to receive.
383
+ *
384
+ * This is rendered at synthesis time, as users can add additional block devices with `addInstanceBlockDevice`, after
385
+ * the construct has been instantiated.
386
+ *
387
+ * @private
388
+ */
389
+ renderBlockDevices() {
390
+ const blockDevices = this.instanceBlockDevices.map((blockDevice) => {
391
+ const ebsDevice = blockDevice.volume.ebsDevice;
392
+ const ebs = {
393
+ ...(ebsDevice?.deleteOnTermination !== undefined && { deleteOnTermination: ebsDevice.deleteOnTermination }),
394
+ ...(ebsDevice?.encrypted !== undefined && { encrypted: ebsDevice.encrypted }),
395
+ ...(ebsDevice?.iops !== undefined && { iops: ebsDevice.iops }),
396
+ ...(ebsDevice?.kmsKey !== undefined && { kmsKeyId: ebsDevice.kmsKey.keyArn }),
397
+ ...(ebsDevice?.snapshotId !== undefined && { snapshotId: ebsDevice.snapshotId }),
398
+ ...(ebsDevice?.throughput !== undefined && { throughput: ebsDevice.throughput }),
399
+ ...(ebsDevice?.volumeSize !== undefined && { volumeSize: ebsDevice.volumeSize }),
400
+ ...(ebsDevice?.volumeType !== undefined && { volumeType: ebsDevice.volumeType }),
401
+ };
402
+ const mappingEnabled = blockDevice.mappingEnabled ?? true;
403
+ return {
404
+ deviceName: blockDevice.deviceName,
405
+ virtualName: blockDevice.volume.virtualName,
406
+ ...(!mappingEnabled && { noDevice: '' }),
407
+ ...(Object.keys(ebs).length && { ebs }),
408
+ };
409
+ });
410
+ return blockDevices.length ? blockDevices : undefined;
411
+ }
412
+ /**
413
+ * Generates the instance configuration property into the `InstanceConfiguration` type in the CloudFormation L1
414
+ * definition.
415
+ *
416
+ * @param props The props passed as input to the construct
417
+ * @private
418
+ */
419
+ buildInstanceConfiguration(props) {
420
+ const blockDevices = this.renderBlockDevices();
421
+ const instanceConfiguration = {
422
+ ...(blockDevices?.length && { blockDeviceMappings: blockDevices }),
423
+ ...(props.instanceImage !== undefined && { image: props.instanceImage.image }),
424
+ };
425
+ return Object.keys(instanceConfiguration).length ? instanceConfiguration : undefined;
426
+ }
427
+ validateContainerRecipeName() {
428
+ if (cdk.Token.isUnresolved(this.physicalName)) {
429
+ return; // Cannot validate unresolved tokens, given their actual value is rendered at deployment time
430
+ }
431
+ if (this.physicalName.length > 128) {
432
+ throw new cdk.ValidationError(`the containerRecipeName cannot be longer than 128 characters, got: '${this.physicalName}'`, this);
433
+ }
434
+ if (this.physicalName.includes(' ')) {
435
+ throw new cdk.ValidationError(`the containerRecipeName cannot contain spaces, got: '${this.physicalName}'`, this);
436
+ }
437
+ if (this.physicalName.includes('_')) {
438
+ throw new cdk.ValidationError(`the containerRecipeName cannot contain underscores, got: '${this.physicalName}'`, this);
439
+ }
440
+ if (this.physicalName !== this.physicalName.toLowerCase()) {
441
+ throw new cdk.ValidationError(`the containerRecipeName must be lowercase, got: '${this.physicalName}'`, this);
442
+ }
443
+ }
444
+ static {
445
+ __runInitializers(_classThis, _classExtraInitializers);
446
+ }
447
+ };
448
+ return ContainerRecipe = _classThis;
449
+ })();
450
+ exports.ContainerRecipe = ContainerRecipe;
451
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFpbmVyLXJlY2lwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvbnRhaW5lci1yZWNpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbUNBQW1DO0FBRW5DLDJDQUEyQztBQUMzQyxtRUFBa0U7QUFHbEUsc0RBQXNEO0FBQ3RELDhFQUE4RjtBQUM5RiwwRUFBMEU7QUFRMUUsTUFBTSx1QkFBdUIsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7QUFFOUY7Ozs7O0dBS0c7QUFDSCxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUM7QUFFL0I7Ozs7O0dBS0c7QUFDSCxNQUFNLHNCQUFzQixHQUFHLE9BQU8sQ0FBQztBQTJIdkM7O0dBRUc7QUFDSCxJQUFZLGFBS1g7QUFMRCxXQUFZLGFBQWE7SUFDdkI7O09BRUc7SUFDSCxrQ0FBaUIsQ0FBQTtBQUNuQixDQUFDLEVBTFcsYUFBYSw2QkFBYixhQUFhLFFBS3hCO0FBdUJEOztHQUVHO0FBQ0gsTUFBc0IsY0FBYzs7SUFDbEM7Ozs7Ozs7T0FPRztJQUNJLE1BQU0sQ0FBQyxTQUFTLENBQ3JCLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixJQUFZLEVBQ1osVUFBaUMsRUFBRTtRQUVuQyxNQUFNLEtBQUssR0FBRyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbEUsT0FBTyxJQUFJLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQzdDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQWtCLEVBQUUsR0FBVztRQUNsRCxPQUFPLElBQUksNkJBQTZCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0tBQ3ZEO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0s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SUFBSSxDQUNMLENBQUM7WUFDSixDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztnQkFDMUQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUMsb0RBQW9ELElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNoSCxDQUFDO1NBQ0Y7O1lBaFFVLHVEQUFlOzs7OztBQUFmLDBDQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGVjMiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IENmbkNvbnRhaW5lclJlY2lwZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pbWFnZWJ1aWxkZXInO1xuaW1wb3J0ICogYXMga21zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1rbXMnO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCAqIGFzIHMzYXNzZXRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMy1hc3NldHMnO1xuaW1wb3J0IHsgYWRkQ29uc3RydWN0TWV0YWRhdGEsIE1ldGhvZE1ldGFkYXRhIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvbWV0YWRhdGEtcmVzb3VyY2UnO1xuaW1wb3J0IHsgcHJvcGVydHlJbmplY3RhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvcHJvcC1pbmplY3RhYmxlJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQmFzZUNvbnRhaW5lckltYWdlLCBDb250YWluZXJJbnN0YW5jZUltYWdlIH0gZnJvbSAnLi9iYXNlLWltYWdlJztcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tICcuL2Rpc3RyaWJ1dGlvbi1jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IElJbWFnZVJlY2lwZSB9IGZyb20gJy4vaW1hZ2UtcmVjaXBlJztcbmltcG9ydCB7IE9TVmVyc2lvbiB9IGZyb20gJy4vb3MtdmVyc2lvbic7XG5pbXBvcnQgeyBDb21wb25lbnRDb25maWd1cmF0aW9uLCBJUmVjaXBlQmFzZSB9IGZyb20gJy4vcmVjaXBlLWJhc2UnO1xuXG5jb25zdCBDT05UQUlORVJfUkVDSVBFX1NZTUJPTCA9IFN5bWJvbC5mb3IoJ0Bhd3MtY2RrL2F3cy1pbWFnZWJ1aWxkZXItYWxwaGEuQ29udGFpbmVyUmVjaXBlJyk7XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgYSBjb250YWluZXIgcmVjaXBlLiBXaGVuIHVzaW5nIHRoZSByZWNpcGUgaW4gYSBwaXBlbGluZSwgdGhlIHBpcGVsaW5lIHdpbGwgdXNlIHRoZVxuICogbGF0ZXN0IHJlY2lwZSBhdCB0aGUgdGltZSBvZiBleGVjdXRpb24uXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW1hZ2VidWlsZGVyL2xhdGVzdC91c2VyZ3VpZGUvaWJob3ctc2VtYW50aWMtdmVyc2lvbmluZy5odG1sXG4gKi9cbmNvbnN0IExBVEVTVF9WRVJTSU9OID0gJ3gueC54JztcblxuLyoqXG4gKiBUaGUgZGVmYXVsdCB2ZXJzaW9uIHRvIHVzZSBpbiB0aGUgY29udGFpbmVyIHJlY2lwZS4gV2hlbiB0aGUgcmVjaXBlIGlzIHVwZGF0ZWQsIHRoZSBgeGAgd2lsbCBiZSBpbmNyZW1lbnRlZCBvZmYgZnJvbVxuICogdGhlIGxhdGVzdCByZWNpcGUgdmVyc2lvbiB0aGF0IGV4aXN0cy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pbWFnZWJ1aWxkZXIvbGF0ZXN0L3VzZXJndWlkZS9jcmVhdGUtaW1hZ2UtcmVjaXBlcy5odG1sXG4gKi9cbmNvbnN0IERFRkFVTFRfUkVDSVBFX1ZFUlNJT04gPSAnMS4wLngnO1xuXG4vKipcbiAqIEFuIEVDMiBJbWFnZSBCdWlsZGVyIENvbnRhaW5lciBSZWNpcGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbnRhaW5lclJlY2lwZSBleHRlbmRzIElSZWNpcGVCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIGNvbnRhaW5lciByZWNpcGVcbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgY29udGFpbmVyUmVjaXBlQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIgcmVjaXBlXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGNvbnRhaW5lclJlY2lwZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIGNvbnRhaW5lciByZWNpcGVcbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgY29udGFpbmVyUmVjaXBlVmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGNyZWF0aW5nIGEgQ29udGFpbmVyIFJlY2lwZSByZXNvdXJjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRhaW5lclJlY2lwZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltYWdlIGZvciBjdXN0b21pemF0aW9ucyBzcGVjaWZpZWQgaW4gdGhlIGNvbnRhaW5lciByZWNpcGUuXG4gICAqL1xuICByZWFkb25seSBiYXNlSW1hZ2U6IEJhc2VDb250YWluZXJJbWFnZTtcblxuICAvKipcbiAgICogVGhlIGNvbnRhaW5lciByZXBvc2l0b3J5IHdoZXJlIHRoZSBvdXRwdXQgY29udGFpbmVyIGltYWdlIGlzIHN0b3JlZC5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFJlcG9zaXRvcnk6IFJlcG9zaXRvcnk7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIgcmVjaXBlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBhIG5hbWUgaXMgZ2VuZXJhdGVkXG4gICAqL1xuICByZWFkb25seSBjb250YWluZXJSZWNpcGVOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgY29udGFpbmVyIHJlY2lwZS5cbiAgICpcbiAgICogQGRlZmF1bHQgMS4wLnhcbiAgICovXG4gIHJlYWRvbmx5IGNvbnRhaW5lclJlY2lwZVZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgY29udGFpbmVyIHJlY2lwZS5cbiAgICpcbiAgICogQGRlZmF1bHQgTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkb2NrZXJmaWxlIHRlbXBsYXRlIHVzZWQgdG8gYnVpbGQgdGhlIGNvbnRhaW5lciBpbWFnZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIHN0YW5kYXJkIGRvY2tlcmZpbGUgdGVtcGxhdGUgd2lsbCBiZSBnZW5lcmF0ZWQgdG8gcHVsbCB0aGUgYmFzZSBpbWFnZSwgcGVyZm9ybSBlbnZpcm9ubWVudCBzZXR1cCwgYW5kXG4gICAqIHJ1biBhbGwgY29tcG9uZW50cyBpbiB0aGUgcmVjaXBlXG4gICAqL1xuICByZWFkb25seSBkb2NrZXJmaWxlPzogRG9ja2VyZmlsZURhdGE7XG5cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGNvbXBvbmVudCBjb25maWd1cmF0aW9ucyB0byBhcHBseSBpbiB0aGUgaW1hZ2UgYnVpbGQuXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGNvbXBvbmVudHM/OiBDb21wb25lbnRDb25maWd1cmF0aW9uW107XG5cbiAgLyoqXG4gICAqIFRoZSBLTVMga2V5IHVzZWQgdG8gZW5jcnlwdCB0aGUgZG9ja2VyZmlsZSB0ZW1wbGF0ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkga21zS2V5Pzoga21zLklLZXk7XG5cbiAgLyoqXG4gICAqIFRoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdXNlIGR1cmluZyBidWlsZCBhbmQgdGVzdCB3b3JrZmxvd3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIEltYWdlIEJ1aWxkZXIgZGVmYXVsdCB3b3JraW5nIGRpcmVjdG9yeSBpcyB1c2VkLiBGb3IgTGludXggYW5kIG1hY09TIGJ1aWxkcywgdGhpcyB3b3VsZCBiZSAvdG1wLiBGb3JcbiAgICogV2luZG93cyBidWlsZHMsIHRoaXMgd291bGQgYmUgQzovXG4gICAqL1xuICByZWFkb25seSB3b3JraW5nRGlyZWN0b3J5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb3BlcmF0aW5nIHN5c3RlbSAoT1MpIHZlcnNpb24gb2YgdGhlIGJhc2UgaW1hZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gSW1hZ2UgQnVpbGRlciB3aWxsIGRldGVybWluZSB0aGUgT1MgdmVyc2lvbiBvZiB0aGUgYmFzZSBpbWFnZSwgaWYgc291cmNlZCBmcm9tIGEgdGhpcmQtcGFydHkgY29udGFpbmVyXG4gICAqIHJlZ2lzdHJ5LiBPdGhlcndpc2UsIHRoZSBPUyB2ZXJzaW9uIG9mIHRoZSBiYXNlIGltYWdlIGlzIHJlcXVpcmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgb3NWZXJzaW9uPzogT1NWZXJzaW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgYmxvY2sgZGV2aWNlcyB0byBhdHRhY2ggdG8gdGhlIGluc3RhbmNlIHVzZWQgZm9yIGJ1aWxkaW5nLCB0ZXN0aW5nLCBhbmQgZGlzdHJpYnV0aW5nIHRoZSBjb250YWluZXIgaW1hZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRoZSBibG9jayBkZXZpY2VzIG9mIHRoZSBpbnN0YW5jZSBpbWFnZSB3aWxsIGJlIHVzZWRcbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbmNlQmxvY2tEZXZpY2VzPzogZWMyLkJsb2NrRGV2aWNlW107XG5cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSB0byB1c2UgdG8gbGF1bmNoIHRoZSBpbnN0YW5jZSB1c2VkIGZvciBidWlsZGluZywgdGVzdGluZywgYW5kIGRpc3RyaWJ1dGluZyB0aGUgY29udGFpbmVyIGltYWdlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBJbWFnZSBCdWlsZGVyIHdpbGwgdXNlIHRoZSBhcHByb3ByaWF0ZSBFQ1Mtb3B0aW1pemVkIEFNSVxuICAgKi9cbiAgcmVhZG9ubHkgaW5zdGFuY2VJbWFnZT86IENvbnRhaW5lckluc3RhbmNlSW1hZ2U7XG5cbiAgLyoqXG4gICAqIFRoZSB0YWdzIHRvIGFwcGx5IHRvIHRoZSBjb250YWluZXIgcmVjaXBlXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IHRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIFRoZSB0eXBlIG9mIHRoZSBjb250YWluZXIgYmVpbmcgdXNlZCBpbiB0aGUgY29udGFpbmVyIHJlY2lwZVxuICovXG5leHBvcnQgZW51bSBDb250YWluZXJUeXBlIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGUgY29udGFpbmVyIHJlY2lwZSB1c2VzIGEgRG9ja2VyIGNvbnRhaW5lclxuICAgKi9cbiAgRE9DS0VSID0gJ0RPQ0tFUicsXG59XG5cbi8qKlxuICogVGhlIHJlbmRlcmVkIERvY2tlcmZpbGUgdmFsdWUsIGZvciB1c2UgaW4gQ2xvdWRGb3JtYXRpb24uXG4gKiAtIEZvciBpbmxpbmUgZG9ja2VyZmlsZXMsIGRvY2tlcmZpbGVUZW1wbGF0ZURhdGEgaXMgdGhlIERvY2tlcmZpbGUgdGVtcGxhdGUgdGV4dFxuICogLSBGb3IgUzMtYmFja2VkIGRvY2tlcmZpbGVzLCBkb2NrZXJmaWxlVGVtcGxhdGVVcmkgaXMgdGhlIFMzIFVSTFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY2tlcmZpbGVUZW1wbGF0ZUNvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgcmVuZGVyZWQgRG9ja2VyZmlsZSBkYXRhLCBmb3IgdXNlIGluIENsb3VkRm9ybWF0aW9uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm9uZSBpZiBkb2NrZXJmaWxlVGVtcGxhdGVVcmkgaXMgc2V0XG4gICAqL1xuICByZWFkb25seSBkb2NrZXJmaWxlVGVtcGxhdGVEYXRhPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVuZGVyZWQgRG9ja2VyZmlsZSBVUkksIGZvciB1c2UgaW4gQ2xvdWRGb3JtYXRpb25cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lIGlmIGRvY2tlcmZpbGVUZW1wbGF0ZURhdGEgaXMgc2V0XG4gICAqL1xuICByZWFkb25seSBkb2NrZXJmaWxlVGVtcGxhdGVVcmk/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogSGVscGVyIGNsYXNzIGZvciByZWZlcmVuY2luZyBhbmQgdXBsb2FkaW5nIGRvY2tlcmZpbGUgZGF0YSBmb3IgdGhlIGNvbnRhaW5lciByZWNpcGVcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERvY2tlcmZpbGVEYXRhIHtcbiAgLyoqXG4gICAqIFVwbG9hZHMgZG9ja2VyZmlsZSBkYXRhIGZyb20gYSBsb2NhbCBmaWxlIHRvIFMzIHRvIHVzZSBhcyB0aGUgZG9ja2VyZmlsZSBkYXRhXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgY29uc3RydWN0IHNjb3BlXG4gICAqIEBwYXJhbSBpZCBJZGVudGlmaWVyIG9mIHRoZSBjb25zdHJ1Y3RcbiAgICogQHBhcmFtIHBhdGggVGhlIGxvY2FsIHBhdGggdG8gdGhlIGRvY2tlcmZpbGUgZGF0YSBmaWxlXG4gICAqIEBwYXJhbSBvcHRpb25zIFMzIGFzc2V0IHVwbG9hZCBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Bc3NldChcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHMzYXNzZXRzLkFzc2V0T3B0aW9ucyA9IHt9LFxuICApOiBTM0RvY2tlcmZpbGVEYXRhIHtcbiAgICBjb25zdCBhc3NldCA9IG5ldyBzM2Fzc2V0cy5Bc3NldChzY29wZSwgaWQsIHsgLi4ub3B0aW9ucywgcGF0aCB9KTtcbiAgICByZXR1cm4gbmV3IFMzRG9ja2VyZmlsZURhdGFGcm9tQXNzZXQoYXNzZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZmVyZW5jZXMgZG9ja2VyZmlsZSBkYXRhIGZyb20gYSBwcmUtZXhpc3RpbmcgUzMgb2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSBidWNrZXQgVGhlIFMzIGJ1Y2tldCB3aGVyZSB0aGUgZG9ja2VyZmlsZSBkYXRhIGlzIHN0b3JlZFxuICAgKiBAcGFyYW0ga2V5IFRoZSBTMyBrZXkgb2YgdGhlIGRvY2tlcmZpbGUgZGF0YSBmaWxlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21TMyhidWNrZXQ6IHMzLklCdWNrZXQsIGtleTogc3RyaW5nKTogUzNEb2NrZXJmaWxlRGF0YSB7XG4gICAgcmV0dXJuIG5ldyBTM0RvY2tlcmZpbGVEYXRhRnJvbUJ1Y2tldEtleShidWNrZXQsIGtleSk7XG4gIH1cblxuICAvKipcbiAgICogVXNlcyBhbiBpbmxpbmUgc3RyaW5nIGFzIHRoZSBkb2NrZXJmaWxlIGRhdGFcbiAgICpcbiAgICogQHBhcmFtIGRhdGEgQW4gaW5saW5lIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGRvY2tlcmZpbGUgZGF0YVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tSW5saW5lKGRhdGE6IHN0cmluZyk6IERvY2tlcmZpbGVEYXRhIHtcbiAgICByZXR1cm4gbmV3IElubGluZURvY2tlcmZpbGVEYXRhKGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZW5kZXJlZCBEb2NrZXJmaWxlIHZhbHVlLCBmb3IgdXNlIGluIENsb3VkRm9ybWF0aW9uLlxuICAgKiAtIEZvciBpbmxpbmUgZG9ja2VyZmlsZXMsIGRvY2tlcmZpbGVUZW1wbGF0ZURhdGEgaXMgdGhlIERvY2tlcmZpbGUgdGVtcGxhdGUgdGV4dFxuICAgKiAtIEZvciBTMy1iYWNrZWQgZG9ja2VyZmlsZXMsIGRvY2tlcmZpbGVUZW1wbGF0ZVVyaSBpcyB0aGUgUzMgVVJMXG4gICAqL1xuICBhYnN0cmFjdCByZW5kZXIoKTogRG9ja2VyZmlsZVRlbXBsYXRlQ29uZmlnO1xufVxuXG4vKipcbiAqIEhlbHBlciBjbGFzcyBmb3IgUzMtYmFzZWQgZG9ja2VyZmlsZSBkYXRhIHJlZmVyZW5jZXMsIGNvbnRhaW5pbmcgYWRkaXRpb25hbCBwZXJtaXNzaW9uIGdyYW50IG1ldGhvZHMgb24gdGhlIFMzIG9iamVjdFxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUzNEb2NrZXJmaWxlRGF0YSBleHRlbmRzIERvY2tlcmZpbGVEYXRhIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGJ1Y2tldDogczMuSUJ1Y2tldDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihidWNrZXQ6IHMzLklCdWNrZXQsIGtleTogc3RyaW5nKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuYnVja2V0ID0gYnVja2V0O1xuICAgIHRoaXMua2V5ID0ga2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZW5kZXJlZCBEb2NrZXJmaWxlIFMzIFVSTCwgZm9yIHVzZSBpbiBDbG91ZEZvcm1hdGlvblxuICAgKi9cbiAgcHVibGljIHJlbmRlcigpOiBEb2NrZXJmaWxlVGVtcGxhdGVDb25maWcge1xuICAgIHJldHVybiB7IGRvY2tlcmZpbGVUZW1wbGF0ZVVyaTogdGhpcy5idWNrZXQuczNVcmxGb3JPYmplY3QodGhpcy5rZXkpIH07XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgcHV0IHBlcm1pc3Npb25zIHRvIHRoZSBnaXZlbiBncmFudGVlIGZvciB0aGUgZG9ja2VyZmlsZSBkYXRhIGluIFMzXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIFRoZSBwcmluY2lwYWxcbiAgICovXG4gIHB1YmxpYyBncmFudFB1dChncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0LmdyYW50UHV0KGdyYW50ZWUsIHRoaXMua2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCByZWFkIHBlcm1pc3Npb25zIHRvIHRoZSBnaXZlbiBncmFudGVlIGZvciB0aGUgZG9ja2VyZmlsZSBkYXRhIGluIFMzXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIFRoZSBwcmluY2lwYWxcbiAgICovXG4gIHB1YmxpYyBncmFudFJlYWQoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5ncmFudFJlYWQoZ3JhbnRlZSwgdGhpcy5rZXkpO1xuICB9XG59XG5cbmNsYXNzIElubGluZURvY2tlcmZpbGVEYXRhIGV4dGVuZHMgRG9ja2VyZmlsZURhdGEge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGF0YTogc3RyaW5nO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihkYXRhOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVuZGVyZWQgRG9ja2VyZmlsZSB0ZXh0LCBmb3IgdXNlIGluIENsb3VkRm9ybWF0aW9uXG4gICAqL1xuICBwdWJsaWMgcmVuZGVyKCk6IERvY2tlcmZpbGVUZW1wbGF0ZUNvbmZpZyB7XG4gICAgcmV0dXJuIHsgZG9ja2VyZmlsZVRlbXBsYXRlRGF0YTogdGhpcy5kYXRhIH07XG4gIH1cbn1cblxuY2xhc3MgUzNEb2NrZXJmaWxlRGF0YUZyb21CdWNrZXRLZXkgZXh0ZW5kcyBTM0RvY2tlcmZpbGVEYXRhIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKGJ1Y2tldDogczMuSUJ1Y2tldCwga2V5OiBzdHJpbmcpIHtcbiAgICBzdXBlcihidWNrZXQsIGtleSk7XG4gIH1cbn1cblxuY2xhc3MgUzNEb2NrZXJmaWxlRGF0YUZyb21Bc3NldCBleHRlbmRzIFMzRG9ja2VyZmlsZURhdGEge1xuICBwdWJsaWMgY29uc3RydWN0b3IoYXNzZXQ6IHMzYXNzZXRzLkFzc2V0KSB7XG4gICAgc3VwZXIoYXNzZXQuYnVja2V0LCBhc3NldC5zM09iamVjdEtleSk7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhbiBFQzIgSW1hZ2UgQnVpbGRlciBjb250YWluZXIgcmVjaXBlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGFpbmVyUmVjaXBlQXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBjb250YWluZXIgcmVjaXBlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGVyaXZlZCBmcm9tIGNvbnRhaW5lclJlY2lwZU5hbWVcbiAgICovXG4gIHJlYWRvbmx5IGNvbnRhaW5lclJlY2lwZUFybj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciByZWNpcGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBkZXJpdmVkIGZyb20gY29udGFpbmVyUmVjaXBlQXJuXG4gICAqL1xuICByZWFkb25seSBjb250YWluZXJSZWNpcGVOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgY29udGFpbmVyIHJlY2lwZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRlcml2ZWQgZnJvbSBjb250YWluZXJSZWNpcGVBcm4uIGlmIGEgY29udGFpbmVyUmVjaXBlTmFtZSBpcyBwcm92aWRlZCwgdGhlIGxhdGVzdCB2ZXJzaW9uLCB4LngueCwgd2lsbFxuICAgKiBiZSB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGFpbmVyUmVjaXBlVmVyc2lvbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIG5ldyBvciBpbXBvcnRlZCBDb250YWluZXIgUmVjaXBlXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb250YWluZXJSZWNpcGVCYXNlIGV4dGVuZHMgY2RrLlJlc291cmNlIGltcGxlbWVudHMgSUNvbnRhaW5lclJlY2lwZSB7XG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBjb250YWluZXIgcmVjaXBlXG4gICAqL1xuICBhYnN0cmFjdCByZWFkb25seSBjb250YWluZXJSZWNpcGVBcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciByZWNpcGVcbiAgICovXG4gIGFic3RyYWN0IHJlYWRvbmx5IGNvbnRhaW5lclJlY2lwZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIGNvbnRhaW5lciByZWNpcGVcbiAgICovXG4gIGFic3RyYWN0IHJlYWRvbmx5IGNvbnRhaW5lclJlY2lwZVZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogR3JhbnQgY3VzdG9tIGFjdGlvbnMgdG8gdGhlIGdpdmVuIGdyYW50ZWUgZm9yIHRoZSBjb250YWluZXIgcmVjaXBlXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIFRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIGFjdGlvbnMgVGhlIGxpc3Qgb2YgYWN0aW9uc1xuICAgKi9cbiAgcHVibGljIGdyYW50KGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlLCAuLi5hY3Rpb25zOiBzdHJpbmdbXSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIGlhbS5HcmFudC5hZGRUb1ByaW5jaXBhbCh7XG4gICAgICBncmFudGVlLFxuICAgICAgYWN0aW9ucyxcbiAgICAgIHJlc291cmNlQXJuczogW3RoaXMuY29udGFpbmVyUmVjaXBlQXJuXSxcbiAgICAgIHNjb3BlOiB0aGlzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQgcGVybWlzc2lvbnMgdG8gdGhlIGdpdmVuIGdyYW50ZWUgZm9yIHRoZSBjb250YWluZXIgcmVjaXBlXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIFRoZSBwcmluY2lwYWxcbiAgICovXG4gIHB1YmxpYyBncmFudFJlYWQoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmdyYW50KGdyYW50ZWUsICdpbWFnZWJ1aWxkZXI6R2V0Q29udGFpbmVyUmVjaXBlJyk7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJlY2lwZSBpcyBhIENvbnRhaW5lciBSZWNpcGVcbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2lzQ29udGFpbmVyUmVjaXBlKCk6IHRoaXMgaXMgSUNvbnRhaW5lclJlY2lwZSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJlY2lwZSBpcyBhbiBJbWFnZSBSZWNpcGVcbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2lzSW1hZ2VSZWNpcGUoKTogdGhpcyBpcyBJSW1hZ2VSZWNpcGUge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gRUMyIEltYWdlIEJ1aWxkZXIgQ29udGFpbmVyIFJlY2lwZS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9pbWFnZWJ1aWxkZXIvbGF0ZXN0L3VzZXJndWlkZS9tYW5hZ2UtcmVjaXBlcy5odG1sXG4gKi9cbkBwcm9wZXJ0eUluamVjdGFibGVcbmV4cG9ydCBjbGFzcyBDb250YWluZXJSZWNpcGUgZXh0ZW5kcyBDb250YWluZXJSZWNpcGVCYXNlIHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtaW1hZ2VidWlsZGVyLWFscGhhLkNvbnRhaW5lclJlY2lwZSc7XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleGlzdGluZyBjb250YWluZXIgcmVjaXBlIGdpdmVuIGl0cyBBUk4uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Db250YWluZXJSZWNpcGVBcm4oc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgY29udGFpbmVyUmVjaXBlQXJuOiBzdHJpbmcpOiBJQ29udGFpbmVyUmVjaXBlIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tQ29udGFpbmVyUmVjaXBlQXR0cmlidXRlcyhzY29wZSwgaWQsIHsgY29udGFpbmVyUmVjaXBlQXJuIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgYW4gZXhpc3RpbmcgY29udGFpbmVyIHJlY2lwZSBnaXZlbiBpdHMgbmFtZS4gVGhlIHByb3ZpZGVkIG5hbWUgbXVzdCBiZSBub3JtYWxpemVkIGJ5XG4gICAqIGNvbnZlcnRpbmcgYWxsIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXJzIHRvIGxvd2VyY2FzZSwgYW5kIHJlcGxhY2luZyBhbGwgc3BhY2VzIGFuZCB1bmRlcnNjb3JlcyB3aXRoIGh5cGhlbnMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Db250YWluZXJSZWNpcGVOYW1lKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGNvbnRhaW5lclJlY2lwZU5hbWU6IHN0cmluZyk6IElDb250YWluZXJSZWNpcGUge1xuICAgIHJldHVybiB0aGlzLmZyb21Db250YWluZXJSZWNpcGVBdHRyaWJ1dGVzKHNjb3BlLCBpZCwgeyBjb250YWluZXJSZWNpcGVOYW1lIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleGlzdGluZyBjb250YWluZXIgcmVjaXBlIGJ5IHByb3ZpZGluZyBpdHMgYXR0cmlidXRlcy4gSWYgdGhlIGNvbnRhaW5lciByZWNpcGUgbmFtZSBpcyBwcm92aWRlZCBhcyBhblxuICAgKiBhdHRyaWJ1dGUsIGl0IG11c3QgYmUgbm9ybWFsaXplZCBieSBjb252ZXJ0aW5nIGFsbCBhbHBoYWJldGljYWwgY2hhcmFjdGVycyB0byBsb3dlcmNhc2UsIGFuZCByZXBsYWNpbmcgYWxsIHNwYWNlc1xuICAgKiBhbmQgdW5kZXJzY29yZXMgd2l0aCBoeXBoZW5zLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQ29udGFpbmVyUmVjaXBlQXR0cmlidXRlcyhcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgYXR0cnM6IENvbnRhaW5lclJlY2lwZUF0dHJpYnV0ZXMsXG4gICk6IElDb250YWluZXJSZWNpcGUge1xuICAgIGlmICghYXR0cnMuY29udGFpbmVyUmVjaXBlQXJuICYmICFhdHRycy5jb250YWluZXJSZWNpcGVOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgJ2VpdGhlciBlaXRoZXIgY29udGFpbmVyUmVjaXBlQXJuIG9yIGNvbnRhaW5lclJlY2lwZU5hbWUgbXVzdCBiZSBwcm92aWRlZCB0byBpbXBvcnQgYSBjb250YWluZXIgcmVjaXBlJyxcbiAgICAgICAgc2NvcGUsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRhaW5lclJlY2lwZUFybiA9XG4gICAgICBhdHRycy5jb250YWluZXJSZWNpcGVBcm4gPz9cbiAgICAgIGNkay5TdGFjay5vZihzY29wZSkuZm9ybWF0QXJuKHtcbiAgICAgICAgc2VydmljZTogJ2ltYWdlYnVpbGRlcicsXG4gICAgICAgIHJlc291cmNlOiAnY29udGFpbmVyLXJlY2lwZScsXG4gICAgICAgIHJlc291cmNlTmFtZTogYCR7YXR0cnMuY29udGFpbmVyUmVjaXBlTmFtZX0vJHthdHRycy5jb250YWluZXJSZWNpcGVWZXJzaW9uID8/IExBVEVTVF9WRVJTSU9OfWAsXG4gICAgICB9KTtcblxuICAgIGNvbnN0IFtjb250YWluZXJSZWNpcGVOYW1lLCBjb250YWluZXJSZWNpcGVWZXJzaW9uXSA9ICgoKSA9PiB7XG4gICAgICBpZiAoYXR0cnMuY29udGFpbmVyUmVjaXBlTmFtZSkge1xuICAgICAgICByZXR1cm4gW2F0dHJzLmNvbnRhaW5lclJlY2lwZU5hbWUsIGF0dHJzLmNvbnRhaW5lclJlY2lwZVZlcnNpb24gPz8gTEFURVNUX1ZFUlNJT05dO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb250YWluZXJSZWNpcGVOYW1lVmVyc2lvbiA9IGNkay5TdGFjay5vZihzY29wZSkuc3BsaXRBcm4oXG4gICAgICAgIGNvbnRhaW5lclJlY2lwZUFybixcbiAgICAgICAgY2RrLkFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FLFxuICAgICAgKS5yZXNvdXJjZU5hbWUhO1xuXG4gICAgICBjb25zdCBjb250YWluZXJSZWNpcGVOYW1lVmVyc2lvblNwbGl0ID0gY2RrLkZuLnNwbGl0KCcvJywgY29udGFpbmVyUmVjaXBlTmFtZVZlcnNpb24pO1xuICAgICAgcmV0dXJuIFtjZGsuRm4uc2VsZWN0KDAsIGNvbnRhaW5lclJlY2lwZU5hbWVWZXJzaW9uU3BsaXQpLCBjZGsuRm4uc2VsZWN0KDEsIGNvbnRhaW5lclJlY2lwZU5hbWVWZXJzaW9uU3BsaXQpXTtcbiAgICB9KSgpO1xuXG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgQ29udGFpbmVyUmVjaXBlQmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgY29udGFpbmVyUmVjaXBlQXJuID0gY29udGFpbmVyUmVjaXBlQXJuO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGNvbnRhaW5lclJlY2lwZU5hbWUgPSBjb250YWluZXJSZWNpcGVOYW1lO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGNvbnRhaW5lclJlY2lwZVZlcnNpb24gPSBjb250YWluZXJSZWNpcGVWZXJzaW9uO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCBpcyBhIENvbnRhaW5lclJlY2lwZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXNDb250YWluZXJSZWNpcGUoeDogYW55KTogeCBpcyBDb250YWluZXJSZWNpcGUge1xuICAgIHJldHVybiB4ICE9PSBudWxsICYmIHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiBDT05UQUlORVJfUkVDSVBFX1NZTUJPTCBpbiB4O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIGNvbnRhaW5lciByZWNpcGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb250YWluZXJSZWNpcGVBcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciByZWNpcGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb250YWluZXJSZWNpcGVOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBjb250YWluZXIgcmVjaXBlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29udGFpbmVyUmVjaXBlVmVyc2lvbjogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zdGFuY2VCbG9ja0RldmljZXM6IGVjMi5CbG9ja0RldmljZVtdID0gW107XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBDb250YWluZXJSZWNpcGVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgcGh5c2ljYWxOYW1lOlxuICAgICAgICBwcm9wcy5jb250YWluZXJSZWNpcGVOYW1lID8/XG4gICAgICAgIGNkay5MYXp5LnN0cmluZyh7XG4gICAgICAgICAgcHJvZHVjZTogKCkgPT5cbiAgICAgICAgICAgIGNkay5OYW1lcy51bmlxdWVSZXNvdXJjZU5hbWUodGhpcywge1xuICAgICAgICAgICAgICBtYXhMZW5ndGg6IDEyOCxcbiAgICAgICAgICAgICAgc2VwYXJhdG9yOiAnLScsXG4gICAgICAgICAgICAgIGFsbG93ZWRTcGVjaWFsQ2hhcmFjdGVyczogJy0nLFxuICAgICAgICAgICAgfSkudG9Mb3dlckNhc2UoKSwgLy8gRW5mb3JjZSBsb3dlcmNhc2UgZm9yIHRoZSBhdXRvLWdlbmVyYXRlZCBmYWxsYmFja1xuICAgICAgICB9KSxcbiAgICB9KTtcbiAgICAvLyBFbmhhbmNlZCBDREsgQW5hbHl0aWNzIFRlbGVtZXRyeVxuICAgIGFkZENvbnN0cnVjdE1ldGFkYXRhKHRoaXMsIHByb3BzKTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBDT05UQUlORVJfUkVDSVBFX1NZTUJPTCwgeyB2YWx1ZTogdHJ1ZSB9KTtcblxuICAgIHRoaXMudmFsaWRhdGVDb250YWluZXJSZWNpcGVOYW1lKCk7XG5cbiAgICB0aGlzLmFkZEluc3RhbmNlQmxvY2tEZXZpY2UoLi4uKHByb3BzLmluc3RhbmNlQmxvY2tEZXZpY2VzID8/IFtdKSk7XG5cbiAgICBjb25zdCBjb21wb25lbnRzOiBDZm5Db250YWluZXJSZWNpcGUuQ29tcG9uZW50Q29uZmlndXJhdGlvblByb3BlcnR5W10gfCB1bmRlZmluZWQgPSBwcm9wcy5jb21wb25lbnRzPy5tYXAoXG4gICAgICAoY29tcG9uZW50KSA9PiAoe1xuICAgICAgICBjb21wb25lbnRBcm46IGNvbXBvbmVudC5jb21wb25lbnQuY29tcG9uZW50QXJuLFxuICAgICAgICAuLi4oY29tcG9uZW50LnBhcmFtZXRlcnMgJiYge1xuICAgICAgICAgIHBhcmFtZXRlcnM6IE9iamVjdC5lbnRyaWVzKGNvbXBvbmVudC5wYXJhbWV0ZXJzKS5tYXAoXG4gICAgICAgICAgICAoW25hbWUsIHBhcmFtXSk6IENmbkNvbnRhaW5lclJlY2lwZS5Db21wb25lbnRQYXJhbWV0ZXJQcm9wZXJ0eSA9PiAoe1xuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICB2YWx1ZTogcGFyYW0udmFsdWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjb25zdCBkb2NrZXJmaWxlID1cbiAgICAgIHByb3BzLmRvY2tlcmZpbGUgPz9cbiAgICAgIERvY2tlcmZpbGVEYXRhLmZyb21JbmxpbmUoXG4gICAgICAgICdGUk9NIHt7eyBpbWFnZWJ1aWxkZXI6cGFyZW50SW1hZ2UgfX19XFxue3t7IGltYWdlYnVpbGRlcjplbnZpcm9ubWVudHMgfX19XFxue3t7IGltYWdlYnVpbGRlcjpjb21wb25lbnRzIH19fScsXG4gICAgICApO1xuXG4gICAgY29uc3QgY29udGFpbmVyUmVjaXBlVmVyc2lvbiA9IHByb3BzLmNvbnRhaW5lclJlY2lwZVZlcnNpb24gPz8gREVGQVVMVF9SRUNJUEVfVkVSU0lPTjtcbiAgICBjb25zdCBjb250YWluZXJSZWNpcGUgPSBuZXcgQ2ZuQ29udGFpbmVyUmVjaXBlKHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIG5hbWU6IHRoaXMucGh5c2ljYWxOYW1lLFxuICAgICAgdmVyc2lvbjogY29udGFpbmVyUmVjaXBlVmVyc2lvbixcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgIHBhcmVudEltYWdlOiBwcm9wcy5iYXNlSW1hZ2UuaW1hZ2UsXG4gICAgICBjb250YWluZXJUeXBlOiBDb250YWluZXJUeXBlLkRPQ0tFUixcbiAgICAgIHRhcmdldFJlcG9zaXRvcnk6IHtcbiAgICAgICAgcmVwb3NpdG9yeU5hbWU6IHByb3BzLnRhcmdldFJlcG9zaXRvcnkucmVwb3NpdG9yeU5hbWUsXG4gICAgICAgIHNlcnZpY2U6IHByb3BzLnRhcmdldFJlcG9zaXRvcnkuc2VydmljZSxcbiAgICAgIH0sXG4gICAgICBwbGF0Zm9ybU92ZXJyaWRlOiBwcm9wcy5vc1ZlcnNpb24/LnBsYXRmb3JtLFxuICAgICAgaW1hZ2VPc1ZlcnNpb25PdmVycmlkZTogcHJvcHMub3NWZXJzaW9uPy5vc1ZlcnNpb24sXG4gICAgICBrbXNLZXlJZDogcHJvcHMua21zS2V5Py5rZXlBcm4sXG4gICAgICBpbnN0YW5jZUNvbmZpZ3VyYXRpb246IGNkay5MYXp5LmFueSh7IHByb2R1Y2U6ICgpID0+IHRoaXMuYnVpbGRJbnN0YW5jZUNvbmZpZ3VyYXRpb24ocHJvcHMpIH0pLFxuICAgICAgd29ya2luZ0RpcmVjdG9yeTogcHJvcHMud29ya2luZ0RpcmVjdG9yeSxcbiAgICAgIHRhZ3M6IHByb3BzLnRhZ3MsXG4gICAgICAuLi5kb2NrZXJmaWxlLnJlbmRlcigpLFxuICAgICAgLi4uKGNvbXBvbmVudHM/Lmxlbmd0aCAmJiB7IGNvbXBvbmVudHMgfSksXG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbnRhaW5lclJlY2lwZU5hbWUgPSB0aGlzLmdldFJlc291cmNlTmFtZUF0dHJpYnV0ZShjb250YWluZXJSZWNpcGUuYXR0ck5hbWUpO1xuICAgIHRoaXMuY29udGFpbmVyUmVjaXBlQXJuID0gdGhpcy5nZXRSZXNvdXJjZUFybkF0dHJpYnV0ZShjb250YWluZXJSZWNpcGUuYXR0ckFybiwge1xuICAgICAgc2VydmljZTogJ2ltYWdlYnVpbGRlcicsXG4gICAgICByZXNvdXJjZTogJ2NvbnRhaW5lci1yZWNpcGUnLFxuICAgICAgcmVzb3VyY2VOYW1lOiBgJHt0aGlzLnBoeXNpY2FsTmFtZX0vJHtjb250YWluZXJSZWNpcGVWZXJzaW9ufWAsXG4gICAgfSk7XG4gICAgdGhpcy5jb250YWluZXJSZWNpcGVWZXJzaW9uID0gY29udGFpbmVyUmVjaXBlLmdldEF0dCgnVmVyc2lvbicpLnRvU3RyaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBibG9jayBkZXZpY2VzIHRvIGF0dGFjaCB0byB0aGUgaW5zdGFuY2UgdXNlZCBmb3IgYnVpbGRpbmcsIHRlc3RpbmcsIGFuZCBkaXN0cmlidXRpbmcgdGhlIGNvbnRhaW5lciBpbWFnZS5cbiAgICpcbiAgICogQHBhcmFtIGluc3RhbmNlQmxvY2tEZXZpY2VzIC0gVGhlIGxpc3Qgb2YgYmxvY2sgZGV2aWNlcyB0byBhdHRhY2hcbiAgICovXG4gIEBNZXRob2RNZXRhZGF0YSgpXG4gIHB1YmxpYyBhZGRJbnN0YW5jZUJsb2NrRGV2aWNlKC4uLmluc3RhbmNlQmxvY2tEZXZpY2VzOiBlYzIuQmxvY2tEZXZpY2VbXSk6IHZvaWQge1xuICAgIHRoaXMuaW5zdGFuY2VCbG9ja0RldmljZXMucHVzaCguLi5pbnN0YW5jZUJsb2NrRGV2aWNlcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgYmxvY2sgZGV2aWNlcyBwcm92aWRlZCBhcyBpbnB1dCB0byB0aGUgY29uc3RydWN0LCBpbnRvIHRoZSBibG9jayBkZXZpY2UgbWFwcGluZyBzdHJ1Y3R1cmUgdGhhdFxuICAgKiBDZm5Db250YWluZXJSZWNpcGUgZXhwZWN0cyB0byByZWNlaXZlLlxuICAgKlxuICAgKiBUaGlzIGlzIHJlbmRlcmVkIGF0IHN5bnRoZXNpcyB0aW1lLCBhcyB1c2VycyBjYW4gYWRkIGFkZGl0aW9uYWwgYmxvY2sgZGV2aWNlcyB3aXRoIGBhZGRJbnN0YW5jZUJsb2NrRGV2aWNlYCwgYWZ0ZXJcbiAgICogdGhlIGNvbnN0cnVjdCBoYXMgYmVlbiBpbnN0YW50aWF0ZWQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHJlbmRlckJsb2NrRGV2aWNlcygpOiBDZm5Db250YWluZXJSZWNpcGUuSW5zdGFuY2VCbG9ja0RldmljZU1hcHBpbmdQcm9wZXJ0eVtdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBibG9ja0RldmljZXMgPSB0aGlzLmluc3RhbmNlQmxvY2tEZXZpY2VzLm1hcChcbiAgICAgIChibG9ja0RldmljZSk6IENmbkNvbnRhaW5lclJlY2lwZS5JbnN0YW5jZUJsb2NrRGV2aWNlTWFwcGluZ1Byb3BlcnR5ID0+IHtcbiAgICAgICAgY29uc3QgZWJzRGV2aWNlID0gYmxvY2tEZXZpY2Uudm9sdW1lLmVic0RldmljZTtcbiAgICAgICAgY29uc3QgZWJzOiBDZm5Db250YWluZXJSZWNpcGUuRWJzSW5zdGFuY2VCbG9ja0RldmljZVNwZWNpZmljYXRpb25Qcm9wZXJ0eSA9IHtcbiAgICAgICAgICAuLi4oZWJzRGV2aWNlPy5kZWxldGVPblRlcm1pbmF0aW9uICE9PSB1bmRlZmluZWQgJiYgeyBkZWxldGVPblRlcm1pbmF0aW9uOiBlYnNEZXZpY2UuZGVsZXRlT25UZXJtaW5hdGlvbiB9KSxcbiAgICAgICAgICAuLi4oZWJzRGV2aWNlPy5lbmNyeXB0ZWQgIT09IHVuZGVmaW5lZCAmJiB7IGVuY3J5cHRlZDogZWJzRGV2aWNlLmVuY3J5cHRlZCB9KSxcbiAgICAgICAgICAuLi4oZWJzRGV2aWNlPy5pb3BzICE9PSB1bmRlZmluZWQgJiYgeyBpb3BzOiBlYnNEZXZpY2UuaW9wcyB9KSxcbiAgICAgICAgICAuLi4oZWJzRGV2aWNlPy5rbXNLZXkgIT09IHVuZGVmaW5lZCAmJiB7IGttc0tleUlkOiBlYnNEZXZpY2Uua21zS2V5LmtleUFybiB9KSxcbiAgICAgICAgICAuLi4oZWJzRGV2aWNlPy5zbmFwc2hvdElkICE9PSB1bmRlZmluZWQgJiYgeyBzbmFwc2hvdElkOiBlYnNEZXZpY2Uuc25hcHNob3RJZCB9KSxcbiAgICAgICAgICAuLi4oZWJzRGV2aWNlPy50aHJvdWdocHV0ICE9PSB1bmRlZmluZWQgJiYgeyB0aHJvdWdocHV0OiBlYnNEZXZpY2UudGhyb3VnaHB1dCB9KSxcbiAgICAgICAgICAuLi4oZWJzRGV2aWNlPy52b2x1bWVTaXplICE9PSB1bmRlZmluZWQgJiYgeyB2b2x1bWVTaXplOiBlYnNEZXZpY2Uudm9sdW1lU2l6ZSB9KSxcbiAgICAgICAgICAuLi4oZWJzRGV2aWNlPy52b2x1bWVUeXBlICE9PSB1bmRlZmluZWQgJiYgeyB2b2x1bWVUeXBlOiBlYnNEZXZpY2Uudm9sdW1lVHlwZSB9KSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBtYXBwaW5nRW5hYmxlZCA9IGJsb2NrRGV2aWNlLm1hcHBpbmdFbmFibGVkID8/IHRydWU7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGV2aWNlTmFtZTogYmxvY2tEZXZpY2UuZGV2aWNlTmFtZSxcbiAgICAgICAgICB2aXJ0dWFsTmFtZTogYmxvY2tEZXZpY2Uudm9sdW1lLnZpcnR1YWxOYW1lLFxuICAgICAgICAgIC4uLighbWFwcGluZ0VuYWJsZWQgJiYgeyBub0RldmljZTogJycgfSksXG4gICAgICAgICAgLi4uKE9iamVjdC5rZXlzKGVicykubGVuZ3RoICYmIHsgZWJzIH0pLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmV0dXJuIGJsb2NrRGV2aWNlcy5sZW5ndGggPyBibG9ja0RldmljZXMgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIHRoZSBpbnN0YW5jZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGludG8gdGhlIGBJbnN0YW5jZUNvbmZpZ3VyYXRpb25gIHR5cGUgaW4gdGhlICBDbG91ZEZvcm1hdGlvbiBMMVxuICAgKiBkZWZpbml0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgVGhlIHByb3BzIHBhc3NlZCBhcyBpbnB1dCB0byB0aGUgY29uc3RydWN0XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkSW5zdGFuY2VDb25maWd1cmF0aW9uKFxuICAgIHByb3BzOiBDb250YWluZXJSZWNpcGVQcm9wcyxcbiAgKTogQ2ZuQ29udGFpbmVyUmVjaXBlLkluc3RhbmNlQ29uZmlndXJhdGlvblByb3BlcnR5IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBibG9ja0RldmljZXMgPSB0aGlzLnJlbmRlckJsb2NrRGV2aWNlcygpO1xuXG4gICAgY29uc3QgaW5zdGFuY2VDb25maWd1cmF0aW9uOiBDZm5Db250YWluZXJSZWNpcGUuSW5zdGFuY2VDb25maWd1cmF0aW9uUHJvcGVydHkgPSB7XG4gICAgICAuLi4oYmxvY2tEZXZpY2VzPy5sZW5ndGggJiYgeyBibG9ja0RldmljZU1hcHBpbmdzOiBibG9ja0RldmljZXMgfSksXG4gICAgICAuLi4ocHJvcHMuaW5zdGFuY2VJbWFnZSAhPT0gdW5kZWZpbmVkICYmIHsgaW1hZ2U6IHByb3BzLmluc3RhbmNlSW1hZ2UuaW1hZ2UgfSksXG4gICAgfTtcblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhpbnN0YW5jZUNvbmZpZ3VyYXRpb24pLmxlbmd0aCA/IGluc3RhbmNlQ29uZmlndXJhdGlvbiA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVDb250YWluZXJSZWNpcGVOYW1lKCkge1xuICAgIGlmIChjZGsuVG9rZW4uaXNVbnJlc29sdmVkKHRoaXMucGh5c2ljYWxOYW1lKSkge1xuICAgICAgcmV0dXJuOyAvLyBDYW5ub3QgdmFsaWRhdGUgdW5yZXNvbHZlZCB0b2tlbnMsIGdpdmVuIHRoZWlyIGFjdHVhbCB2YWx1ZSBpcyByZW5kZXJlZCBhdCBkZXBsb3ltZW50IHRpbWVcbiAgICB9XG5cbiAgICBpZiAodGhpcy5waHlzaWNhbE5hbWUubGVuZ3RoID4gMTI4KSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgYHRoZSBjb250YWluZXJSZWNpcGVOYW1lIGNhbm5vdCBiZSBsb25nZXIgdGhhbiAxMjggY2hhcmFjdGVycywgZ290OiAnJHt0aGlzLnBoeXNpY2FsTmFtZX0nYCxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGh5c2ljYWxOYW1lLmluY2x1ZGVzKCcgJykpIHtcbiAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKGB0aGUgY29udGFpbmVyUmVjaXBlTmFtZSBjYW5ub3QgY29udGFpbiBzcGFjZXMsIGdvdDogJyR7dGhpcy5waHlzaWNhbE5hbWV9J2AsIHRoaXMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBoeXNpY2FsTmFtZS5pbmNsdWRlcygnXycpKSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgYHRoZSBjb250YWluZXJSZWNpcGVOYW1lIGNhbm5vdCBjb250YWluIHVuZGVyc2NvcmVzLCBnb3Q6ICcke3RoaXMucGh5c2ljYWxOYW1lfSdgLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5waHlzaWNhbE5hbWUgIT09IHRoaXMucGh5c2ljYWxOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKGB0aGUgY29udGFpbmVyUmVjaXBlTmFtZSBtdXN0IGJlIGxvd2VyY2FzZSwgZ290OiAnJHt0aGlzLnBoeXNpY2FsTmFtZX0nYCwgdGhpcyk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -398,6 +398,17 @@ export declare class DistributionConfiguration extends DistributionConfiguration
398
398
  */
399
399
  addContainerDistributions(...containerDistributions: ContainerDistribution[]): void;
400
400
  private validateDistributionConfigurationName;
401
+ /**
402
+ * Renders the AMI and container distributions provided as input to the construct, into the `Distribution[]` structure
403
+ * that CfnDistributionConfiguration expects to receive. Distributions provided to CfnDistributionConfiguration must
404
+ * map to a unique region per entry in the list - this render function also handles combining AMI and container
405
+ * distributions in the same region into a single entry.
406
+ *
407
+ * This is rendered at synthesis time, as users can add additional AMI and container distributions with
408
+ * `addAmiDistributions` and `addContainerDistributions`, after the construct has been instantiated.
409
+ *
410
+ * @private
411
+ */
401
412
  private renderDistributions;
402
413
  private buildAmiDistribution;
403
414
  private buildContainerDistribution;