@aws-cdk/aws-imagebuilder-alpha 2.228.0-alpha.0 → 2.229.1-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,597 @@
1
+ "use strict";
2
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
3
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
4
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
5
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
6
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
7
+ var _, done = false;
8
+ for (var i = decorators.length - 1; i >= 0; i--) {
9
+ var context = {};
10
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
11
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
12
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
13
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
14
+ if (kind === "accessor") {
15
+ if (result === void 0) continue;
16
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
17
+ if (_ = accept(result.get)) descriptor.get = _;
18
+ if (_ = accept(result.set)) descriptor.set = _;
19
+ if (_ = accept(result.init)) initializers.unshift(_);
20
+ }
21
+ else if (_ = accept(result)) {
22
+ if (kind === "field") initializers.unshift(_);
23
+ else descriptor[key] = _;
24
+ }
25
+ }
26
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
27
+ done = true;
28
+ };
29
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
30
+ var useValue = arguments.length > 2;
31
+ for (var i = 0; i < initializers.length; i++) {
32
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
33
+ }
34
+ return useValue ? value : void 0;
35
+ };
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.Workflow = exports.AwsManagedWorkflow = exports.S3WorkflowData = exports.WorkflowData = exports.WorkflowType = exports.WorkflowSchemaVersion = exports.WorkflowParameterType = exports.WorkflowOnFailure = exports.WorkflowAction = 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 yaml = require("yaml");
47
+ const WORKFLOW_SYMBOL = Symbol.for('@aws-cdk/aws-imagebuilder-alpha.Workflow');
48
+ /**
49
+ * Represents the latest version of a workflow. When using the workflow in a pipeline, the pipeline will use the
50
+ * latest workflow at the time of execution.
51
+ *
52
+ * @see https://docs.aws.amazon.com/imagebuilder/latest/userguide/ibhow-semantic-versioning.html
53
+ */
54
+ const LATEST_VERSION = 'x.x.x';
55
+ /**
56
+ * The action for a step within the workflow document
57
+ */
58
+ var WorkflowAction;
59
+ (function (WorkflowAction) {
60
+ /**
61
+ * Applies customizations and configurations to the input AMIs, such as publishing the AMI to SSM Parameter Store,
62
+ * or creating launch template versions with the AMI IDs provided in the input
63
+ */
64
+ WorkflowAction["APPLY_IMAGE_CONFIGURATIONS"] = "ApplyImageConfigurations";
65
+ /**
66
+ * The BootstrapInstanceForContainer action runs a service script to bootstrap the instance with minimum requirements
67
+ * to run container workflows
68
+ */
69
+ WorkflowAction["BOOTSTRAP_INSTANCE_FOR_CONTAINER"] = "BootstrapInstanceForContainer";
70
+ /**
71
+ * The CollectImageMetadata action collects additional information about the instance, such as the list of packages
72
+ * and their respective versions
73
+ */
74
+ WorkflowAction["COLLECT_IMAGE_METADATA"] = "CollectImageMetadata";
75
+ /**
76
+ * The CollectImageScanFindings action collects findings reported by Amazon Inspector for the provided instance
77
+ */
78
+ WorkflowAction["COLLECT_IMAGE_SCAN_FINDINGS"] = "CollectImageScanFindings";
79
+ /**
80
+ * The CreateImage action creates an AMI from a running instance with the ec2:CreateImage API
81
+ */
82
+ WorkflowAction["CREATE_IMAGE"] = "CreateImage";
83
+ /**
84
+ * The DistributeImage action copies an AMI using the image's distribution configuration, or using the distribution
85
+ * settings in the step input
86
+ */
87
+ WorkflowAction["DISTRIBUTE_IMAGE"] = "DistributeImage";
88
+ /**
89
+ * The ExecuteComponents action runs components that are specified in the recipe for the current image being built
90
+ */
91
+ WorkflowAction["EXECUTE_COMPONENTS"] = "ExecuteComponents";
92
+ /**
93
+ * The ExecuteStateMachine action executes a the state machine provided and waits for completion as part of the
94
+ * workflow
95
+ */
96
+ WorkflowAction["EXECUTE_STATE_MACHINE"] = "ExecuteStateMachine";
97
+ /**
98
+ * The LaunchInstance action launches an instance using the settings from your recipe and infrastructure configuration
99
+ * resources
100
+ */
101
+ WorkflowAction["LAUNCH_INSTANCE"] = "LaunchInstance";
102
+ /**
103
+ * Applies attribute updates to the provided set of distributed images, such as launch permission updates
104
+ */
105
+ WorkflowAction["MODIFY_IMAGE_ATTRIBUTES"] = "ModifyImageAttributes";
106
+ /**
107
+ * The RunCommand action runs a command document against the provided instance
108
+ */
109
+ WorkflowAction["RUN_COMMAND"] = "RunCommand";
110
+ /**
111
+ * The RegisterImage action creates an AMI from a set of snapshots with the ec2:RegisterImage API
112
+ */
113
+ WorkflowAction["REGISTER_IMAGE"] = "RegisterImage";
114
+ /**
115
+ * The RunSysprep action runs the Sysprep document on the provided Windows instance
116
+ */
117
+ WorkflowAction["RUN_SYS_PREP"] = "RunSysPrep";
118
+ /**
119
+ * The SanitizeInstance action runs a recommended sanitization script on Linux instances
120
+ */
121
+ WorkflowAction["SANITIZE_INSTANCE"] = "SanitizeInstance";
122
+ /**
123
+ * The TerminateInstance action terminates the provided instance
124
+ */
125
+ WorkflowAction["TERMINATE_INSTANCE"] = "TerminateInstance";
126
+ /**
127
+ * The WaitForAction action pauses the workflow and waits to receive an external signal from the
128
+ * imagebuilder:SendWorkflowStepAction API
129
+ */
130
+ WorkflowAction["WAIT_FOR_ACTION"] = "WaitForAction";
131
+ /**
132
+ * The WaitForSSMAgent action waits for the given instance to have connectivity with SSM before proceeding
133
+ */
134
+ WorkflowAction["WAIT_FOR_SSM_AGENT"] = "WaitForSSMAgent";
135
+ })(WorkflowAction || (exports.WorkflowAction = WorkflowAction = {}));
136
+ /**
137
+ * The action to take if the workflow fails
138
+ */
139
+ var WorkflowOnFailure;
140
+ (function (WorkflowOnFailure) {
141
+ /**
142
+ * Fails the image build if the workflow fails
143
+ */
144
+ WorkflowOnFailure["ABORT"] = "Abort";
145
+ /**
146
+ * Continues with the image build if the workflow fails
147
+ */
148
+ WorkflowOnFailure["CONTINUE"] = "Continue";
149
+ })(WorkflowOnFailure || (exports.WorkflowOnFailure = WorkflowOnFailure = {}));
150
+ /**
151
+ * The parameter type for the workflow parameter
152
+ */
153
+ var WorkflowParameterType;
154
+ (function (WorkflowParameterType) {
155
+ /**
156
+ * Indicates the workflow parameter has a boolean value
157
+ */
158
+ WorkflowParameterType["BOOLEAN"] = "boolean";
159
+ /**
160
+ * Indicates the workflow parameter has an integer value
161
+ */
162
+ WorkflowParameterType["INTEGER"] = "integer";
163
+ /**
164
+ * Indicates the workflow parameter has a string value
165
+ */
166
+ WorkflowParameterType["STRING"] = "string";
167
+ /**
168
+ * Indicates the workflow parameter has a string list value
169
+ */
170
+ WorkflowParameterType["STRING_LIST"] = "stringList";
171
+ })(WorkflowParameterType || (exports.WorkflowParameterType = WorkflowParameterType = {}));
172
+ /**
173
+ * The schema version of the workflow
174
+ */
175
+ var WorkflowSchemaVersion;
176
+ (function (WorkflowSchemaVersion) {
177
+ /**
178
+ * Schema version 1.0 for the workflow document
179
+ */
180
+ WorkflowSchemaVersion["V1_0"] = "1.0";
181
+ })(WorkflowSchemaVersion || (exports.WorkflowSchemaVersion = WorkflowSchemaVersion = {}));
182
+ /**
183
+ * The type of the workflow
184
+ */
185
+ var WorkflowType;
186
+ (function (WorkflowType) {
187
+ /**
188
+ * Indicates the workflow is for building images
189
+ */
190
+ WorkflowType["BUILD"] = "BUILD";
191
+ /**
192
+ * Indicates the workflow is for testing images
193
+ */
194
+ WorkflowType["TEST"] = "TEST";
195
+ /**
196
+ * Indicates the workflow is for distributing images
197
+ */
198
+ WorkflowType["DISTRIBUTION"] = "DISTRIBUTION";
199
+ })(WorkflowType || (exports.WorkflowType = WorkflowType = {}));
200
+ /**
201
+ * Helper class for referencing and uploading workflow data
202
+ */
203
+ class WorkflowData {
204
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.WorkflowData", version: "2.229.1-alpha.0" };
205
+ /**
206
+ * Uploads workflow data from a local file to S3 to use as the workflow data
207
+ *
208
+ * @param scope The construct scope
209
+ * @param id Identifier of the construct
210
+ * @param path The local path to the workflow data file
211
+ * @param options S3 asset upload options
212
+ */
213
+ static fromAsset(scope, id, path, options = {}) {
214
+ const asset = new s3assets.Asset(scope, id, { ...options, path });
215
+ return new S3WorkflowDataFromAsset(asset);
216
+ }
217
+ /**
218
+ * References workflow data from a pre-existing S3 object
219
+ *
220
+ * @param bucket The S3 bucket where the workflow data is stored
221
+ * @param key The S3 key of the workflow data file
222
+ */
223
+ static fromS3(bucket, key) {
224
+ return new S3WorkflowDataFromBucketKey(bucket, key);
225
+ }
226
+ /**
227
+ * Uses an inline JSON object as the workflow data
228
+ *
229
+ * @param data An inline JSON object representing the workflow data
230
+ */
231
+ static fromJsonObject(data) {
232
+ const inlineData = yaml.stringify(data, { indent: 2 });
233
+ return new InlineWorkflowData(inlineData);
234
+ }
235
+ /**
236
+ * Uses an inline JSON or YAML string as the workflow data
237
+ *
238
+ * @param data An inline JSON or YAML string representing the workflow data
239
+ */
240
+ static fromInline(data) {
241
+ return new InlineWorkflowData(data);
242
+ }
243
+ }
244
+ exports.WorkflowData = WorkflowData;
245
+ /**
246
+ * Helper class for S3-based workflow data references, containing additional permission grant methods on the S3 object
247
+ */
248
+ class S3WorkflowData extends WorkflowData {
249
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.S3WorkflowData", version: "2.229.1-alpha.0" };
250
+ bucket;
251
+ key;
252
+ constructor(bucket, key) {
253
+ super();
254
+ this.bucket = bucket;
255
+ this.key = key;
256
+ }
257
+ /**
258
+ * The rendered workflow data text, for use in CloudFormation
259
+ */
260
+ render() {
261
+ return { uri: this.bucket.s3UrlForObject(this.key) };
262
+ }
263
+ /**
264
+ * Grant put permissions to the given grantee for the workflow data in S3
265
+ *
266
+ * @param grantee The principal
267
+ */
268
+ grantPut(grantee) {
269
+ return this.bucket.grantPut(grantee, this.key);
270
+ }
271
+ /**
272
+ * Grant read permissions to the given grantee for the workflow data in S3
273
+ *
274
+ * @param grantee The principal
275
+ */
276
+ grantRead(grantee) {
277
+ return this.bucket.grantRead(grantee, this.key);
278
+ }
279
+ }
280
+ exports.S3WorkflowData = S3WorkflowData;
281
+ class InlineWorkflowData extends WorkflowData {
282
+ data;
283
+ constructor(data) {
284
+ super();
285
+ this.data = data;
286
+ }
287
+ /**
288
+ * The rendered workflow data text, for use in CloudFormation
289
+ */
290
+ render() {
291
+ return { data: this.data };
292
+ }
293
+ }
294
+ class S3WorkflowDataFromBucketKey extends S3WorkflowData {
295
+ constructor(bucket, key) {
296
+ super(bucket, key);
297
+ }
298
+ }
299
+ class S3WorkflowDataFromAsset extends S3WorkflowData {
300
+ constructor(asset) {
301
+ super(asset.bucket, asset.s3ObjectKey);
302
+ }
303
+ }
304
+ /**
305
+ * Helper class for working with AWS-managed workflows
306
+ */
307
+ class AwsManagedWorkflow {
308
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.AwsManagedWorkflow", version: "2.229.1-alpha.0" };
309
+ /**
310
+ * Imports the build-container AWS-managed workflow
311
+ *
312
+ * @param scope The construct scope
313
+ * @param id Identifier of the construct
314
+ */
315
+ static buildContainer(scope, id) {
316
+ return this.fromAwsManagedWorkflowAttributes(scope, id, {
317
+ workflowName: 'build-container',
318
+ workflowType: WorkflowType.BUILD,
319
+ });
320
+ }
321
+ /**
322
+ * Imports the build-image AWS-managed workflow
323
+ *
324
+ * @param scope The construct scope
325
+ * @param id Identifier of the construct
326
+ */
327
+ static buildImage(scope, id) {
328
+ return this.fromAwsManagedWorkflowAttributes(scope, id, {
329
+ workflowName: 'build-image',
330
+ workflowType: WorkflowType.BUILD,
331
+ });
332
+ }
333
+ /**
334
+ * Imports the distribute-container AWS-managed workflow
335
+ *
336
+ * @param scope The construct scope
337
+ * @param id Identifier of the construct
338
+ */
339
+ static distributeContainer(scope, id) {
340
+ return this.fromAwsManagedWorkflowAttributes(scope, id, {
341
+ workflowName: 'distribute-container',
342
+ workflowType: WorkflowType.DISTRIBUTION,
343
+ });
344
+ }
345
+ /**
346
+ * Imports the test-container AWS-managed workflow
347
+ *
348
+ * @param scope The construct scope
349
+ * @param id Identifier of the construct
350
+ */
351
+ static testContainer(scope, id) {
352
+ return this.fromAwsManagedWorkflowAttributes(scope, id, {
353
+ workflowName: 'test-container',
354
+ workflowType: WorkflowType.TEST,
355
+ });
356
+ }
357
+ /**
358
+ * Imports the test-image AWS-managed workflow
359
+ *
360
+ * @param scope The construct scope
361
+ * @param id Identifier of the construct
362
+ */
363
+ static testImage(scope, id) {
364
+ return this.fromAwsManagedWorkflowAttributes(scope, id, {
365
+ workflowName: 'test-image',
366
+ workflowType: WorkflowType.TEST,
367
+ });
368
+ }
369
+ /**
370
+ * Imports an AWS-managed workflow from its attributes
371
+ *
372
+ * @param scope The construct scope
373
+ * @param id Identifier of the construct
374
+ * @param attrs The attributes of the AWS-managed workflow
375
+ */
376
+ static fromAwsManagedWorkflowAttributes(scope, id, attrs) {
377
+ try {
378
+ jsiiDeprecationWarnings._aws_cdk_aws_imagebuilder_alpha_AwsManagedWorkflowAttributes(attrs);
379
+ }
380
+ catch (error) {
381
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
382
+ Error.captureStackTrace(error, this.fromAwsManagedWorkflowAttributes);
383
+ }
384
+ throw error;
385
+ }
386
+ if (cdk.Token.isUnresolved(attrs.workflowType)) {
387
+ throw new cdk.ValidationError('workflowType cannot be a token', scope);
388
+ }
389
+ return Workflow.fromWorkflowArn(scope, id, cdk.Stack.of(scope).formatArn({
390
+ service: 'imagebuilder',
391
+ account: 'aws',
392
+ resource: 'workflow',
393
+ resourceName: `${attrs.workflowType.toLowerCase()}/${attrs.workflowName}/${LATEST_VERSION}`,
394
+ }));
395
+ }
396
+ }
397
+ exports.AwsManagedWorkflow = AwsManagedWorkflow;
398
+ /**
399
+ * A new or imported Workflow
400
+ */
401
+ class WorkflowBase extends cdk.Resource {
402
+ /**
403
+ * Grant custom actions to the given grantee for the workflow
404
+ *
405
+ * @param grantee The principal
406
+ * @param actions The list of actions
407
+ */
408
+ grant(grantee, ...actions) {
409
+ return iam.Grant.addToPrincipal({
410
+ grantee,
411
+ actions,
412
+ resourceArns: [this.workflowArn],
413
+ scope: this,
414
+ });
415
+ }
416
+ /**
417
+ * Grant read permissions to the given grantee for the workflow
418
+ *
419
+ * @param grantee The principal
420
+ */
421
+ grantRead(grantee) {
422
+ return this.grant(grantee, 'imagebuilder:GetWorkflow');
423
+ }
424
+ }
425
+ /**
426
+ * Represents an EC2 Image Builder Workflow.
427
+ *
428
+ * @see https://docs.aws.amazon.com/imagebuilder/latest/userguide/manage-image-workflows.html
429
+ */
430
+ let Workflow = (() => {
431
+ let _classDecorators = [prop_injectable_1.propertyInjectable];
432
+ let _classDescriptor;
433
+ let _classExtraInitializers = [];
434
+ let _classThis;
435
+ let _classSuper = WorkflowBase;
436
+ var Workflow = class extends _classSuper {
437
+ static { _classThis = this; }
438
+ static {
439
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
440
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
441
+ Workflow = _classThis = _classDescriptor.value;
442
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
443
+ }
444
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-imagebuilder-alpha.Workflow", version: "2.229.1-alpha.0" };
445
+ /** Uniquely identifies this class. */
446
+ static PROPERTY_INJECTION_ID = '@aws-cdk.aws-imagebuilder-alpha.Workflow';
447
+ /**
448
+ * Import an existing workflow given its ARN.
449
+ */
450
+ static fromWorkflowArn(scope, id, workflowArn) {
451
+ return this.fromWorkflowAttributes(scope, id, { workflowArn });
452
+ }
453
+ /**
454
+ * Import an existing workflow by providing its attributes. The provided name must be normalized by converting
455
+ * all alphabetical characters to lowercase, and replacing all spaces and underscores with hyphens. You may not
456
+ * provide a dynamic expression for the workflowArn or workflowType
457
+ */
458
+ static fromWorkflowAttributes(scope, id, attrs) {
459
+ try {
460
+ jsiiDeprecationWarnings._aws_cdk_aws_imagebuilder_alpha_WorkflowAttributes(attrs);
461
+ }
462
+ catch (error) {
463
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
464
+ Error.captureStackTrace(error, this.fromWorkflowAttributes);
465
+ }
466
+ throw error;
467
+ }
468
+ if (attrs.workflowArn !== undefined &&
469
+ (attrs.workflowName !== undefined || attrs.workflowType !== undefined || attrs.workflowVersion !== undefined)) {
470
+ throw new cdk.ValidationError('a workflowName, workflowType, or workflowVersion cannot be provided when a workflowArn is provided', scope);
471
+ }
472
+ if (attrs.workflowArn === undefined && (attrs.workflowName === undefined || attrs.workflowType === undefined)) {
473
+ throw new cdk.ValidationError('either workflowArn, or workflowName and workflowType is required', scope);
474
+ }
475
+ if (attrs.workflowType && cdk.Token.isUnresolved(attrs.workflowType)) {
476
+ throw new cdk.ValidationError('workflowType cannot be an unresolved token', scope);
477
+ }
478
+ const workflowArn = (() => {
479
+ if (attrs.workflowArn !== undefined) {
480
+ return attrs.workflowArn;
481
+ }
482
+ return cdk.Stack.of(scope).formatArn({
483
+ service: 'imagebuilder',
484
+ resource: 'workflow',
485
+ resourceName: `${attrs.workflowType.toLowerCase()}/${attrs.workflowName}/${attrs.workflowVersion ?? LATEST_VERSION}`,
486
+ });
487
+ })();
488
+ const [workflowType, workflowName, workflowVersion] = (() => {
489
+ if (attrs.workflowName !== undefined) {
490
+ return [attrs.workflowType.toUpperCase(), attrs.workflowName, attrs.workflowVersion ?? LATEST_VERSION];
491
+ }
492
+ const workflowNameTypeVersion = cdk.Stack.of(scope).splitArn(workflowArn, cdk.ArnFormat.SLASH_RESOURCE_NAME).resourceName;
493
+ if (cdk.Token.isUnresolved(workflowNameTypeVersion)) {
494
+ throw new cdk.ValidationError('the workflowName, workflowType, and workflowVersion in the workflowArn cannot be an unresolved token', scope);
495
+ }
496
+ if (workflowNameTypeVersion.split('/').length < 3) {
497
+ throw new cdk.ValidationError('the workflow ARN must end with <workflow-type>/<workflow-name>/<workflow-version>', scope);
498
+ }
499
+ const workflowNameTypeVersionSplit = workflowNameTypeVersion.split('/');
500
+ const [workflowTypeFromArn, workflowNameFromArn, workflowVersionFromArn] = workflowNameTypeVersionSplit.slice(0, 3);
501
+ return [workflowTypeFromArn.toUpperCase(), workflowNameFromArn, workflowVersionFromArn];
502
+ })();
503
+ class Import extends WorkflowBase {
504
+ workflowArn = workflowArn;
505
+ workflowName = workflowName;
506
+ workflowType = workflowType;
507
+ workflowVersion = workflowVersion;
508
+ }
509
+ return new Import(scope, id);
510
+ }
511
+ /**
512
+ * Return whether the given object is a Workflow.
513
+ */
514
+ static isWorkflow(x) {
515
+ return x !== null && typeof x === 'object' && WORKFLOW_SYMBOL in x;
516
+ }
517
+ /**
518
+ * The ARN of the workflow
519
+ */
520
+ workflowArn;
521
+ /**
522
+ * The name of the workflow
523
+ */
524
+ workflowName;
525
+ /**
526
+ * The type of the workflow
527
+ */
528
+ workflowType;
529
+ /**
530
+ * The version of the workflow
531
+ */
532
+ workflowVersion;
533
+ constructor(scope, id, props) {
534
+ super(scope, id, {
535
+ physicalName: props.workflowName ??
536
+ cdk.Lazy.string({
537
+ produce: () => cdk.Names.uniqueResourceName(this, {
538
+ maxLength: 128,
539
+ separator: '-',
540
+ allowedSpecialCharacters: '-',
541
+ }).toLowerCase(), // Enforce lowercase for the auto-generated fallback
542
+ }),
543
+ });
544
+ try {
545
+ jsiiDeprecationWarnings._aws_cdk_aws_imagebuilder_alpha_WorkflowProps(props);
546
+ }
547
+ catch (error) {
548
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
549
+ Error.captureStackTrace(error, Workflow);
550
+ }
551
+ throw error;
552
+ }
553
+ // Enhanced CDK Analytics Telemetry
554
+ (0, metadata_resource_1.addConstructMetadata)(this, props);
555
+ Object.defineProperty(this, WORKFLOW_SYMBOL, { value: true });
556
+ this.validateWorkflowName();
557
+ const workflowVersion = props.workflowVersion ?? '1.0.0';
558
+ const workflow = new aws_imagebuilder_1.CfnWorkflow(this, 'Resource', {
559
+ name: this.physicalName,
560
+ version: workflowVersion,
561
+ type: props.workflowType,
562
+ changeDescription: props.changeDescription,
563
+ description: props.description,
564
+ kmsKeyId: props.kmsKey?.keyArn,
565
+ tags: props.tags,
566
+ ...props.data.render(),
567
+ });
568
+ this.workflowName = this.getResourceNameAttribute(workflow.getAtt('Name').toString());
569
+ this.workflowArn = workflow.attrArn;
570
+ this.workflowVersion = workflowVersion;
571
+ this.workflowType = props.workflowType;
572
+ }
573
+ validateWorkflowName() {
574
+ if (cdk.Token.isUnresolved(this.physicalName)) {
575
+ return; // Cannot validate unresolved tokens, given their actual value is rendered at deployment time
576
+ }
577
+ if (this.physicalName.length > 128) {
578
+ throw new cdk.ValidationError('the workflowName cannot be longer than 128 characters', this);
579
+ }
580
+ if (this.physicalName.includes(' ')) {
581
+ throw new cdk.ValidationError('the workflowName cannot contain spaces', this);
582
+ }
583
+ if (this.physicalName.includes('_')) {
584
+ throw new cdk.ValidationError('the workflowName cannot contain underscores', this);
585
+ }
586
+ if (this.physicalName !== this.physicalName.toLowerCase()) {
587
+ throw new cdk.ValidationError('the workflowName must be lowercase', this);
588
+ }
589
+ }
590
+ static {
591
+ __runInitializers(_classThis, _classExtraInitializers);
592
+ }
593
+ };
594
+ return Workflow = _classThis;
595
+ })();
596
+ exports.Workflow = Workflow;
597
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2Zsb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3b3JrZmxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxtQ0FBbUM7QUFDbkMsMkNBQTJDO0FBQzNDLG1FQUEyRDtBQUczRCxzREFBc0Q7QUFDdEQsOEVBQThFO0FBQzlFLDBFQUEwRTtBQUUxRSw2QkFBNkI7QUFFN0IsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO0FBRS9FOzs7OztHQUtHO0FBQ0gsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDO0FBNkovQjs7R0FFRztBQUNILElBQVksY0E0Rlg7QUE1RkQsV0FBWSxjQUFjO0lBQ3hCOzs7T0FHRztJQUNILHlFQUF1RCxDQUFBO0lBRXZEOzs7T0FHRztJQUNILG9GQUFrRSxDQUFBO0lBRWxFOzs7T0FHRztJQUNILGlFQUErQyxDQUFBO0lBRS9DOztPQUVHO0lBQ0gsMEVBQXdELENBQUE7SUFFeEQ7O09BRUc7SUFDSCw4Q0FBNEIsQ0FBQTtJQUU1Qjs7O09BR0c7SUFDSCxzREFBb0MsQ0FBQTtJQUVwQzs7T0FFRztJQUNILDBEQUF3QyxDQUFBO0lBRXhDOzs7T0FHRztJQUNILCtEQUE2QyxDQUFBO0lBRTdDOzs7T0FHRztJQUNILG9EQUFrQyxDQUFBO0lBRWxDOztPQUVHO0lBQ0gsbUVBQWlELENBQUE7SUFFakQ7O09BRUc7SUFDSCw0Q0FBMEIsQ0FBQTtJQUUxQjs7T0FFRztJQUNILGtEQUFnQyxDQUFBO0lBRWhDOztPQUVHO0lBQ0gsNkNBQTJCLENBQUE7SUFFM0I7O09BRUc7SUFDSCx3REFBc0MsQ0FBQTtJQUV0Qzs7T0FFRztJQUNILDBEQUF3QyxDQUFBO0lBRXhDOzs7T0FHRztJQUNILG1EQUFpQyxDQUFBO0lBRWpDOztPQUVHO0lBQ0gsd0RBQXNDLENBQUE7QUFDeEMsQ0FBQyxFQTVGVyxjQUFjLDhC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QU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUMsdURBQXVELEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDL0YsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDcEMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUMsd0NBQXdDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDaEYsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDcEMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUMsNkNBQTZDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDckYsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7Z0JBQzFELE1BQU0sSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDLG9DQUFvQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzVFLENBQUM7U0FDRjs7WUEvS1UsdURBQVE7Ozs7O0FBQVIsNEJBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjZGsgZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgQ2ZuV29ya2Zsb3cgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaW1hZ2VidWlsZGVyJztcbmltcG9ydCAqIGFzIGttcyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgKiBhcyBzM2Fzc2V0cyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtYXNzZXRzJztcbmltcG9ydCB7IGFkZENvbnN0cnVjdE1ldGFkYXRhIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvbWV0YWRhdGEtcmVzb3VyY2UnO1xuaW1wb3J0IHsgcHJvcGVydHlJbmplY3RhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvcHJvcC1pbmplY3RhYmxlJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tICd5YW1sJztcblxuY29uc3QgV09SS0ZMT1dfU1lNQk9MID0gU3ltYm9sLmZvcignQGF3cy1jZGsvYXdzLWltYWdlYnVpbGRlci1hbHBoYS5Xb3JrZmxvdycpO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGEgd29ya2Zsb3cuIFdoZW4gdXNpbmcgdGhlIHdvcmtmbG93IGluIGEgcGlwZWxpbmUsIHRoZSBwaXBlbGluZSB3aWxsIHVzZSB0aGVcbiAqIGxhdGVzdCB3b3JrZmxvdyBhdCB0aGUgdGltZSBvZiBleGVjdXRpb24uXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaW1hZ2VidWlsZGVyL2xhdGVzdC91c2VyZ3VpZGUvaWJob3ctc2VtYW50aWMtdmVyc2lvbmluZy5odG1sXG4gKi9cbmNvbnN0IExBVEVTVF9WRVJTSU9OID0gJ3gueC54JztcblxuLyoqXG4gKiBBbiBFQzIgSW1hZ2UgQnVpbGRlciBXb3JrZmxvdy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJV29ya2Zsb3cgZXh0ZW5kcyBjZGsuSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIHdvcmtmbG93XG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHdvcmtmbG93QXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSB3b3JrZmxvd1xuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSB3b3JrZmxvd05hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIHdvcmtmbG93XG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHdvcmtmbG93VHlwZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgd29ya2Zsb3dcbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgd29ya2Zsb3dWZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEdyYW50IGN1c3RvbSBhY3Rpb25zIHRvIHRoZSBnaXZlbiBncmFudGVlIGZvciB0aGUgd29ya2Zsb3dcbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgVGhlIHByaW5jaXBhbFxuICAgKiBAcGFyYW0gYWN0aW9ucyBUaGUgbGlzdCBvZiBhY3Rpb25zXG4gICAqL1xuICBncmFudChncmFudGVlOiBpYW0uSUdyYW50YWJsZSwgLi4uYWN0aW9uczogc3RyaW5nW10pOiBpYW0uR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQgcGVybWlzc2lvbnMgdG8gdGhlIGdpdmVuIGdyYW50ZWUgZm9yIHRoZSB3b3JrZmxvd1xuICAgKlxuICAgKiBAcGFyYW0gZ3JhbnRlZSBUaGUgcHJpbmNpcGFsXG4gICAqL1xuICBncmFudFJlYWQoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQ7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgY3JlYXRpbmcgYSBXb3JrZmxvdyByZXNvdXJjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93UHJvcHMge1xuICAvKipcbiAgICogVGhlIHdvcmtmbG93IGRvY3VtZW50IGNvbnRlbnQgdGhhdCBkZWZpbmVzIHRoZSBpbWFnZSBjcmVhdGlvbiBwcm9jZXNzLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YTogV29ya2Zsb3dEYXRhO1xuXG4gIC8qKlxuICAgKiBUaGUgcGhhc2UgaW4gdGhlIGltYWdlIGJ1aWxkIHByb2Nlc3MgZm9yIHdoaWNoIHRoZSB3b3JrZmxvdyByZXNvdXJjZSBpcyByZXNwb25zaWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IHdvcmtmbG93VHlwZTogV29ya2Zsb3dUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgd29ya2Zsb3cuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYSBuYW1lIGlzIGdlbmVyYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgd29ya2Zsb3dOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgd29ya2Zsb3cuXG4gICAqXG4gICAqIEBkZWZhdWx0IDEuMC4wXG4gICAqL1xuICByZWFkb25seSB3b3JrZmxvd1ZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgd29ya2Zsb3cuXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY2hhbmdlIGRlc2NyaXB0aW9uIG9mIHRoZSB3b3JrZmxvdy4gRGVzY3JpYmVzIHdoYXQgY2hhbmdlIGhhcyBiZWVuIG1hZGUgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSB3b3JrZmxvdywgb3JcbiAgICogd2hhdCBtYWtlcyB0aGlzIHZlcnNpb24gZGlmZmVyZW50IGZyb20gb3RoZXIgdmVyc2lvbnMuXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGNoYW5nZURlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgS01TIGtleSB1c2VkIHRvIGVuY3J5cHQgdGhpcyB3b3JrZmxvdy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhbiBJbWFnZSBCdWlsZGVyIG93bmVkIGtleSB3aWxsIGJlIHVzZWQgdG8gZW5jcnlwdCB0aGUgd29ya2Zsb3cuXG4gICAqL1xuICByZWFkb25seSBrbXNLZXk/OiBrbXMuSUtleTtcblxuICAvKipcbiAgICogVGhlIHRhZ3MgdG8gYXBwbHkgdG8gdGhlIHdvcmtmbG93XG4gICAqXG4gICAqIEBkZWZhdWx0IE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IHRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGFuIEVDMiBJbWFnZSBCdWlsZGVyIFdvcmtmbG93XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dBdHRyaWJ1dGVzIHtcbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIHdvcmtmbG93XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIEFSTiBpcyBhdXRvbWF0aWNhbGx5IGNvbnN0cnVjdGVkIGlmIGEgd29ya2Zsb3dOYW1lIGFuZCB3b3JrZmxvd1R5cGUgaXMgcHJvdmlkZWQsIG90aGVyd2lzZSBhXG4gICAqIHdvcmtmbG93QXJuIGlzIHJlcXVpcmVkXG4gICAqL1xuICByZWFkb25seSB3b3JrZmxvd0Fybj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHdvcmtmbG93XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIG5hbWUgaXMgYXV0b21hdGljYWxseSBjb25zdHJ1Y3RlZCBpZiBhIHdvcmtmbG93QXJuIGlzIHByb3ZpZGVkLCBvdGhlcndpc2UgYSB3b3JrZmxvd05hbWUgaXMgcmVxdWlyZWRcbiAgICovXG4gIHJlYWRvbmx5IHdvcmtmbG93TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIHdvcmtmbG93XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIHR5cGUgaXMgYXV0b21hdGljYWxseSBjb25zdHJ1Y3RlZCBpZiBhIHdvcmtmbG93QXJuIGlzIHByb3ZpZGVkLCBvdGhlcndpc2UgYSB3b3JrZmxvd1R5cGUgaXMgcmVxdWlyZWRcbiAgICovXG4gIHJlYWRvbmx5IHdvcmtmbG93VHlwZT86IFdvcmtmbG93VHlwZTtcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIHdvcmtmbG93XG4gICAqXG4gICAqIEBkZWZhdWx0IHgueC54XG4gICAqL1xuICByZWFkb25seSB3b3JrZmxvd1ZlcnNpb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYW4gRUMyIEltYWdlIEJ1aWxkZXIgQVdTLW1hbmFnZWQgd29ya2Zsb3dcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBd3NNYW5hZ2VkV29ya2Zsb3dBdHRyaWJ1dGVzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBBV1MtbWFuYWdlZCB3b3JrZmxvd1xuICAgKi9cbiAgcmVhZG9ubHkgd29ya2Zsb3dOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBBV1MtbWFuYWdlZCB3b3JrZmxvd1xuICAgKi9cbiAgcmVhZG9ubHkgd29ya2Zsb3dUeXBlOiBXb3JrZmxvd1R5cGU7XG59XG5cbi8qKlxuICogVGhlIGFjdGlvbiBmb3IgYSBzdGVwIHdpdGhpbiB0aGUgd29ya2Zsb3cgZG9jdW1lbnRcbiAqL1xuZXhwb3J0IGVudW0gV29ya2Zsb3dBY3Rpb24ge1xuICAvKipcbiAgICogQXBwbGllcyBjdXN0b21pemF0aW9ucyBhbmQgY29uZmlndXJhdGlvbnMgdG8gdGhlIGlucHV0IEFNSXMsIHN1Y2ggYXMgcHVibGlzaGluZyB0aGUgQU1JIHRvIFNTTSBQYXJhbWV0ZXIgU3RvcmUsXG4gICAqIG9yIGNyZWF0aW5nIGxhdW5jaCB0ZW1wbGF0ZSB2ZXJzaW9ucyB3aXRoIHRoZSBBTUkgSURzIHByb3ZpZGVkIGluIHRoZSBpbnB1dFxuICAgKi9cbiAgQVBQTFlfSU1BR0VfQ09ORklHVVJBVElPTlMgPSAnQXBwbHlJbWFnZUNvbmZpZ3VyYXRpb25zJyxcblxuICAvKipcbiAgICogVGhlIEJvb3RzdHJhcEluc3RhbmNlRm9yQ29udGFpbmVyIGFjdGlvbiBydW5zIGEgc2VydmljZSBzY3JpcHQgdG8gYm9vdHN0cmFwIHRoZSBpbnN0YW5jZSB3aXRoIG1pbmltdW0gcmVxdWlyZW1lbnRzXG4gICAqIHRvIHJ1biBjb250YWluZXIgd29ya2Zsb3dzXG4gICAqL1xuICBCT09UU1RSQVBfSU5TVEFOQ0VfRk9SX0NPTlRBSU5FUiA9ICdCb290c3RyYXBJbnN0YW5jZUZvckNvbnRhaW5lcicsXG5cbiAgLyoqXG4gICAqIFRoZSBDb2xsZWN0SW1hZ2VNZXRhZGF0YSBhY3Rpb24gY29sbGVjdHMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5zdGFuY2UsIHN1Y2ggYXMgdGhlIGxpc3Qgb2YgcGFja2FnZXNcbiAgICogYW5kIHRoZWlyIHJlc3BlY3RpdmUgdmVyc2lvbnNcbiAgICovXG4gIENPTExFQ1RfSU1BR0VfTUVUQURBVEEgPSAnQ29sbGVjdEltYWdlTWV0YWRhdGEnLFxuXG4gIC8qKlxuICAgKiBUaGUgQ29sbGVjdEltYWdlU2NhbkZpbmRpbmdzIGFjdGlvbiBjb2xsZWN0cyBmaW5kaW5ncyByZXBvcnRlZCBieSBBbWF6b24gSW5zcGVjdG9yIGZvciB0aGUgcHJvdmlkZWQgaW5zdGFuY2VcbiAgICovXG4gIENPTExFQ1RfSU1BR0VfU0NBTl9GSU5ESU5HUyA9ICdDb2xsZWN0SW1hZ2VTY2FuRmluZGluZ3MnLFxuXG4gIC8qKlxuICAgKiBUaGUgQ3JlYXRlSW1hZ2UgYWN0aW9uIGNyZWF0ZXMgYW4gQU1JIGZyb20gYSBydW5uaW5nIGluc3RhbmNlIHdpdGggdGhlIGVjMjpDcmVhdGVJbWFnZSBBUElcbiAgICovXG4gIENSRUFURV9JTUFHRSA9ICdDcmVhdGVJbWFnZScsXG5cbiAgLyoqXG4gICAqIFRoZSBEaXN0cmlidXRlSW1hZ2UgYWN0aW9uIGNvcGllcyBhbiBBTUkgdXNpbmcgdGhlIGltYWdlJ3MgZGlzdHJpYnV0aW9uIGNvbmZpZ3VyYXRpb24sIG9yIHVzaW5nIHRoZSBkaXN0cmlidXRpb25cbiAgICogc2V0dGluZ3MgaW4gdGhlIHN0ZXAgaW5wdXRcbiAgICovXG4gIERJU1RSSUJVVEVfSU1BR0UgPSAnRGlzdHJpYnV0ZUltYWdlJyxcblxuICAvKipcbiAgICogVGhlIEV4ZWN1dGVDb21wb25lbnRzIGFjdGlvbiBydW5zIGNvbXBvbmVudHMgdGhhdCBhcmUgc3BlY2lmaWVkIGluIHRoZSByZWNpcGUgZm9yIHRoZSBjdXJyZW50IGltYWdlIGJlaW5nIGJ1aWx0XG4gICAqL1xuICBFWEVDVVRFX0NPTVBPTkVOVFMgPSAnRXhlY3V0ZUNvbXBvbmVudHMnLFxuXG4gIC8qKlxuICAgKiBUaGUgRXhlY3V0ZVN0YXRlTWFjaGluZSBhY3Rpb24gZXhlY3V0ZXMgYSB0aGUgc3RhdGUgbWFjaGluZSBwcm92aWRlZCBhbmQgd2FpdHMgZm9yIGNvbXBsZXRpb24gYXMgcGFydCBvZiB0aGVcbiAgICogd29ya2Zsb3dcbiAgICovXG4gIEVYRUNVVEVfU1RBVEVfTUFDSElORSA9ICdFeGVjdXRlU3RhdGVNYWNoaW5lJyxcblxuICAvKipcbiAgICogVGhlIExhdW5jaEluc3RhbmNlIGFjdGlvbiBsYXVuY2hlcyBhbiBpbnN0YW5jZSB1c2luZyB0aGUgc2V0dGluZ3MgZnJvbSB5b3VyIHJlY2lwZSBhbmQgaW5mcmFzdHJ1Y3R1cmUgY29uZmlndXJhdGlvblxuICAgKiByZXNvdXJjZXNcbiAgICovXG4gIExBVU5DSF9JTlNUQU5DRSA9ICdMYXVuY2hJbnN0YW5jZScsXG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgYXR0cmlidXRlIHVwZGF0ZXMgdG8gdGhlIHByb3ZpZGVkIHNldCBvZiBkaXN0cmlidXRlZCBpbWFnZXMsIHN1Y2ggYXMgbGF1bmNoIHBlcm1pc3Npb24gdXBkYXRlc1xuICAgKi9cbiAgTU9ESUZZX0lNQUdFX0FUVFJJQlVURVMgPSAnTW9kaWZ5SW1hZ2VBdHRyaWJ1dGVzJyxcblxuICAvKipcbiAgICogVGhlIFJ1bkNvbW1hbmQgYWN0aW9uIHJ1bnMgYSBjb21tYW5kIGRvY3VtZW50IGFnYWluc3QgdGhlIHByb3ZpZGVkIGluc3RhbmNlXG4gICAqL1xuICBSVU5fQ09NTUFORCA9ICdSdW5Db21tYW5kJyxcblxuICAvKipcbiAgICogVGhlIFJlZ2lzdGVySW1hZ2UgYWN0aW9uIGNyZWF0ZXMgYW4gQU1JIGZyb20gYSBzZXQgb2Ygc25hcHNob3RzIHdpdGggdGhlIGVjMjpSZWdpc3RlckltYWdlIEFQSVxuICAgKi9cbiAgUkVHSVNURVJfSU1BR0UgPSAnUmVnaXN0ZXJJbWFnZScsXG5cbiAgLyoqXG4gICAqIFRoZSBSdW5TeXNwcmVwIGFjdGlvbiBydW5zIHRoZSBTeXNwcmVwIGRvY3VtZW50IG9uIHRoZSBwcm92aWRlZCBXaW5kb3dzIGluc3RhbmNlXG4gICAqL1xuICBSVU5fU1lTX1BSRVAgPSAnUnVuU3lzUHJlcCcsXG5cbiAgLyoqXG4gICAqIFRoZSBTYW5pdGl6ZUluc3RhbmNlIGFjdGlvbiBydW5zIGEgcmVjb21tZW5kZWQgc2FuaXRpemF0aW9uIHNjcmlwdCBvbiBMaW51eCBpbnN0YW5jZXNcbiAgICovXG4gIFNBTklUSVpFX0lOU1RBTkNFID0gJ1Nhbml0aXplSW5zdGFuY2UnLFxuXG4gIC8qKlxuICAgKiBUaGUgVGVybWluYXRlSW5zdGFuY2UgYWN0aW9uIHRlcm1pbmF0ZXMgdGhlIHByb3ZpZGVkIGluc3RhbmNlXG4gICAqL1xuICBURVJNSU5BVEVfSU5TVEFOQ0UgPSAnVGVybWluYXRlSW5zdGFuY2UnLFxuXG4gIC8qKlxuICAgKiBUaGUgV2FpdEZvckFjdGlvbiBhY3Rpb24gcGF1c2VzIHRoZSB3b3JrZmxvdyBhbmQgd2FpdHMgdG8gcmVjZWl2ZSBhbiBleHRlcm5hbCBzaWduYWwgZnJvbSB0aGVcbiAgICogaW1hZ2VidWlsZGVyOlNlbmRXb3JrZmxvd1N0ZXBBY3Rpb24gQVBJXG4gICAqL1xuICBXQUlUX0ZPUl9BQ1RJT04gPSAnV2FpdEZvckFjdGlvbicsXG5cbiAgLyoqXG4gICAqIFRoZSBXYWl0Rm9yU1NNQWdlbnQgYWN0aW9uIHdhaXRzIGZvciB0aGUgZ2l2ZW4gaW5zdGFuY2UgdG8gaGF2ZSBjb25uZWN0aXZpdHkgd2l0aCBTU00gYmVmb3JlIHByb2NlZWRpbmdcbiAgICovXG4gIFdBSVRfRk9SX1NTTV9BR0VOVCA9ICdXYWl0Rm9yU1NNQWdlbnQnLFxufVxuXG4vKipcbiAqIFRoZSBhY3Rpb24gdG8gdGFrZSBpZiB0aGUgd29ya2Zsb3cgZmFpbHNcbiAqL1xuZXhwb3J0IGVudW0gV29ya2Zsb3dPbkZhaWx1cmUge1xuICAvKipcbiAgICogRmFpbHMgdGhlIGltYWdlIGJ1aWxkIGlmIHRoZSB3b3JrZmxvdyBmYWlsc1xuICAgKi9cbiAgQUJPUlQgPSAnQWJvcnQnLFxuXG4gIC8qKlxuICAgKiBDb250aW51ZXMgd2l0aCB0aGUgaW1hZ2UgYnVpbGQgaWYgdGhlIHdvcmtmbG93IGZhaWxzXG4gICAqL1xuICBDT05USU5VRSA9ICdDb250aW51ZScsXG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlciB0eXBlIGZvciB0aGUgd29ya2Zsb3cgcGFyYW1ldGVyXG4gKi9cbmV4cG9ydCBlbnVtIFdvcmtmbG93UGFyYW1ldGVyVHlwZSB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhlIHdvcmtmbG93IHBhcmFtZXRlciBoYXMgYSBib29sZWFuIHZhbHVlXG4gICAqL1xuICBCT09MRUFOID0gJ2Jvb2xlYW4nLFxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhlIHdvcmtmbG93IHBhcmFtZXRlciBoYXMgYW4gaW50ZWdlciB2YWx1ZVxuICAgKi9cbiAgSU5URUdFUiA9ICdpbnRlZ2VyJyxcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHRoZSB3b3JrZmxvdyBwYXJhbWV0ZXIgaGFzIGEgc3RyaW5nIHZhbHVlXG4gICAqL1xuICBTVFJJTkcgPSAnc3RyaW5nJyxcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHRoZSB3b3JrZmxvdyBwYXJhbWV0ZXIgaGFzIGEgc3RyaW5nIGxpc3QgdmFsdWVcbiAgICovXG4gIFNUUklOR19MSVNUID0gJ3N0cmluZ0xpc3QnLFxufVxuXG4vKipcbiAqIFRoZSBzY2hlbWEgdmVyc2lvbiBvZiB0aGUgd29ya2Zsb3dcbiAqL1xuZXhwb3J0IGVudW0gV29ya2Zsb3dTY2hlbWFWZXJzaW9uIHtcbiAgLyoqXG4gICAqIFNjaGVtYSB2ZXJzaW9uIDEuMCBmb3IgdGhlIHdvcmtmbG93IGRvY3VtZW50XG4gICAqL1xuICBWMV8wID0gJzEuMCcsXG59XG5cbi8qKlxuICogVGhlIHR5cGUgb2YgdGhlIHdvcmtmbG93XG4gKi9cbmV4cG9ydCBlbnVtIFdvcmtmbG93VHlwZSB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhlIHdvcmtmbG93IGlzIGZvciBidWlsZGluZyBpbWFnZXNcbiAgICovXG4gIEJVSUxEID0gJ0JVSUxEJyxcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHRoZSB3b3JrZmxvdyBpcyBmb3IgdGVzdGluZyBpbWFnZXNcbiAgICovXG4gIFRFU1QgPSAnVEVTVCcsXG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGUgd29ya2Zsb3cgaXMgZm9yIGRpc3RyaWJ1dGluZyBpbWFnZXNcbiAgICovXG4gIERJU1RSSUJVVElPTiA9ICdESVNUUklCVVRJT04nLFxufVxuXG4vKipcbiAqIFRoZSByZW5kZXJlZCB3b3JrZmxvdyBkYXRhIHZhbHVlLCBmb3IgdXNlIGluIENsb3VkRm9ybWF0aW9uLlxuICogLSBGb3IgaW5saW5lIHdvcmtmbG93cywgZGF0YSBpcyB0aGUgd29ya2Zsb3cgdGV4dFxuICogLSBGb3IgUzMtYmFja2VkIHdvcmtmbG93cywgdXJpIGlzIHRoZSBTMyBVUkxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0RhdGFDb25maWcge1xuICAvKipcbiAgICogVGhlIHJlbmRlcmVkIHdvcmtmbG93IGRhdGEsIGZvciB1c2UgaW4gQ2xvdWRGb3JtYXRpb25cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lIGlmIHVyaSBpcyBzZXRcbiAgICovXG4gIHJlYWRvbmx5IGRhdGE/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZW5kZXJlZCB3b3JrZmxvdyBkYXRhIFVSSSwgZm9yIHVzZSBpbiBDbG91ZEZvcm1hdGlvblxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vbmUgaWYgZGF0YSBpcyBzZXRcbiAgICovXG4gIHJlYWRvbmx5IHVyaT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBIZWxwZXIgY2xhc3MgZm9yIHJlZmVyZW5jaW5nIGFuZCB1cGxvYWRpbmcgd29ya2Zsb3cgZGF0YVxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgV29ya2Zsb3dEYXRhIHtcbiAgLyoqXG4gICAqIFVwbG9hZHMgd29ya2Zsb3cgZGF0YSBmcm9tIGEgbG9jYWwgZmlsZSB0byBTMyB0byB1c2UgYXMgdGhlIHdvcmtmbG93IGRhdGFcbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogQHBhcmFtIGlkIElkZW50aWZpZXIgb2YgdGhlIGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gcGF0aCBUaGUgbG9jYWwgcGF0aCB0byB0aGUgd29ya2Zsb3cgZGF0YSBmaWxlXG4gICAqIEBwYXJhbSBvcHRpb25zIFMzIGFzc2V0IHVwbG9hZCBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Bc3NldChcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHMzYXNzZXRzLkFzc2V0T3B0aW9ucyA9IHt9LFxuICApOiBTM1dvcmtmbG93RGF0YSB7XG4gICAgY29uc3QgYXNzZXQgPSBuZXcgczNhc3NldHMuQXNzZXQoc2NvcGUsIGlkLCB7IC4uLm9wdGlvbnMsIHBhdGggfSk7XG4gICAgcmV0dXJuIG5ldyBTM1dvcmtmbG93RGF0YUZyb21Bc3NldChhc3NldCk7XG4gIH1cblxuICAvKipcbiAgICogUmVmZXJlbmNlcyB3b3JrZmxvdyBkYXRhIGZyb20gYSBwcmUtZXhpc3RpbmcgUzMgb2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSBidWNrZXQgVGhlIFMzIGJ1Y2tldCB3aGVyZSB0aGUgd29ya2Zsb3cgZGF0YSBpcyBzdG9yZWRcbiAgICogQHBhcmFtIGtleSBUaGUgUzMga2V5IG9mIHRoZSB3b3JrZmxvdyBkYXRhIGZpbGVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVMzKGJ1Y2tldDogczMuSUJ1Y2tldCwga2V5OiBzdHJpbmcpOiBTM1dvcmtmbG93RGF0YSB7XG4gICAgcmV0dXJuIG5ldyBTM1dvcmtmbG93RGF0YUZyb21CdWNrZXRLZXkoYnVja2V0LCBrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZXMgYW4gaW5saW5lIEpTT04gb2JqZWN0IGFzIHRoZSB3b3JrZmxvdyBkYXRhXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIEFuIGlubGluZSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHdvcmtmbG93IGRhdGFcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUpzb25PYmplY3QoZGF0YTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSk6IFdvcmtmbG93RGF0YSB7XG4gICAgY29uc3QgaW5saW5lRGF0YSA9IHlhbWwuc3RyaW5naWZ5KGRhdGEsIHsgaW5kZW50OiAyIH0pO1xuICAgIHJldHVybiBuZXcgSW5saW5lV29ya2Zsb3dEYXRhKGlubGluZURhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZXMgYW4gaW5saW5lIEpTT04gb3IgWUFNTCBzdHJpbmcgYXMgdGhlIHdvcmtmbG93IGRhdGFcbiAgICpcbiAgICogQHBhcmFtIGRhdGEgQW4gaW5saW5lIEpTT04gb3IgWUFNTCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB3b3JrZmxvdyBkYXRhXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21JbmxpbmUoZGF0YTogc3RyaW5nKTogV29ya2Zsb3dEYXRhIHtcbiAgICByZXR1cm4gbmV3IElubGluZVdvcmtmbG93RGF0YShkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVuZGVyZWQgd29ya2Zsb3cgZGF0YSB2YWx1ZSwgZm9yIHVzZSBpbiBDbG91ZEZvcm1hdGlvbi5cbiAgICogLSBGb3IgaW5saW5lIHdvcmtmbG93cywgZGF0YSBpcyB0aGUgd29ya2Zsb3cgdGV4dFxuICAgKiAtIEZvciBTMy1iYWNrZWQgd29ya2Zsb3dzLCB1cmkgaXMgdGhlIFMzIFVSTFxuICAgKi9cbiAgYWJzdHJhY3QgcmVuZGVyKCk6IFdvcmtmbG93RGF0YUNvbmZpZztcbn1cblxuLyoqXG4gKiBIZWxwZXIgY2xhc3MgZm9yIFMzLWJhc2VkIHdvcmtmbG93IGRhdGEgcmVmZXJlbmNlcywgY29udGFpbmluZyBhZGRpdGlvbmFsIHBlcm1pc3Npb24gZ3JhbnQgbWV0aG9kcyBvbiB0aGUgUzMgb2JqZWN0XG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTM1dvcmtmbG93RGF0YSBleHRlbmRzIFdvcmtmbG93RGF0YSB7XG4gIHByb3RlY3RlZCByZWFkb25seSBidWNrZXQ6IHMzLklCdWNrZXQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBrZXk6IHN0cmluZztcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoYnVja2V0OiBzMy5JQnVja2V0LCBrZXk6IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmJ1Y2tldCA9IGJ1Y2tldDtcbiAgICB0aGlzLmtleSA9IGtleTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVuZGVyZWQgd29ya2Zsb3cgZGF0YSB0ZXh0LCBmb3IgdXNlIGluIENsb3VkRm9ybWF0aW9uXG4gICAqL1xuICBwdWJsaWMgcmVuZGVyKCk6IFdvcmtmbG93RGF0YUNvbmZpZyB7XG4gICAgcmV0dXJuIHsgdXJpOiB0aGlzLmJ1Y2tldC5zM1VybEZvck9iamVjdCh0aGlzLmtleSkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCBwdXQgcGVybWlzc2lvbnMgdG8gdGhlIGdpdmVuIGdyYW50ZWUgZm9yIHRoZSB3b3JrZmxvdyBkYXRhIGluIFMzXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIFRoZSBwcmluY2lwYWxcbiAgICovXG4gIHB1YmxpYyBncmFudFB1dChncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0LmdyYW50UHV0KGdyYW50ZWUsIHRoaXMua2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCByZWFkIHBlcm1pc3Npb25zIHRvIHRoZSBnaXZlbiBncmFudGVlIGZvciB0aGUgd29ya2Zsb3cgZGF0YSBpbiBTM1xuICAgKlxuICAgKiBAcGFyYW0gZ3JhbnRlZSBUaGUgcHJpbmNpcGFsXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRSZWFkKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXQuZ3JhbnRSZWFkKGdyYW50ZWUsIHRoaXMua2V5KTtcbiAgfVxufVxuXG5jbGFzcyBJbmxpbmVXb3JrZmxvd0RhdGEgZXh0ZW5kcyBXb3JrZmxvd0RhdGEge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGF0YTogc3RyaW5nO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihkYXRhOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVuZGVyZWQgd29ya2Zsb3cgZGF0YSB0ZXh0LCBmb3IgdXNlIGluIENsb3VkRm9ybWF0aW9uXG4gICAqL1xuICBwdWJsaWMgcmVuZGVyKCk6IFdvcmtmbG93RGF0YUNvbmZpZyB7XG4gICAgcmV0dXJuIHsgZGF0YTogdGhpcy5kYXRhIH07XG4gIH1cbn1cblxuY2xhc3MgUzNXb3JrZmxvd0RhdGFGcm9tQnVja2V0S2V5IGV4dGVuZHMgUzNXb3JrZmxvd0RhdGEge1xuICBwdWJsaWMgY29uc3RydWN0b3IoYnVja2V0OiBzMy5JQnVja2V0LCBrZXk6IHN0cmluZykge1xuICAgIHN1cGVyKGJ1Y2tldCwga2V5KTtcbiAgfVxufVxuXG5jbGFzcyBTM1dvcmtmbG93RGF0YUZyb21Bc3NldCBleHRlbmRzIFMzV29ya2Zsb3dEYXRhIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKGFzc2V0OiBzM2Fzc2V0cy5Bc3NldCkge1xuICAgIHN1cGVyKGFzc2V0LmJ1Y2tldCwgYXNzZXQuczNPYmplY3RLZXkpO1xuICB9XG59XG5cbi8qKlxuICogSGVscGVyIGNsYXNzIGZvciB3b3JraW5nIHdpdGggQVdTLW1hbmFnZWQgd29ya2Zsb3dzXG4gKi9cbmV4cG9ydCBjbGFzcyBBd3NNYW5hZ2VkV29ya2Zsb3cge1xuICAvKipcbiAgICogSW1wb3J0cyB0aGUgYnVpbGQtY29udGFpbmVyIEFXUy1tYW5hZ2VkIHdvcmtmbG93XG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgY29uc3RydWN0IHNjb3BlXG4gICAqIEBwYXJhbSBpZCBJZGVudGlmaWVyIG9mIHRoZSBjb25zdHJ1Y3RcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYnVpbGRDb250YWluZXIoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZyk6IElXb3JrZmxvdyB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbUF3c01hbmFnZWRXb3JrZmxvd0F0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7XG4gICAgICB3b3JrZmxvd05hbWU6ICdidWlsZC1jb250YWluZXInLFxuICAgICAgd29ya2Zsb3dUeXBlOiBXb3JrZmxvd1R5cGUuQlVJTEQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0cyB0aGUgYnVpbGQtaW1hZ2UgQVdTLW1hbmFnZWQgd29ya2Zsb3dcbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogQHBhcmFtIGlkIElkZW50aWZpZXIgb2YgdGhlIGNvbnN0cnVjdFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBidWlsZEltYWdlKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcpOiBJV29ya2Zsb3cge1xuICAgIHJldHVybiB0aGlzLmZyb21Bd3NNYW5hZ2VkV29ya2Zsb3dBdHRyaWJ1dGVzKHNjb3BlLCBpZCwge1xuICAgICAgd29ya2Zsb3dOYW1lOiAnYnVpbGQtaW1hZ2UnLFxuICAgICAgd29ya2Zsb3dUeXBlOiBXb3JrZmxvd1R5cGUuQlVJTEQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0cyB0aGUgZGlzdHJpYnV0ZS1jb250YWluZXIgQVdTLW1hbmFnZWQgd29ya2Zsb3dcbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogQHBhcmFtIGlkIElkZW50aWZpZXIgb2YgdGhlIGNvbnN0cnVjdFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBkaXN0cmlidXRlQ29udGFpbmVyKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcpOiBJV29ya2Zsb3cge1xuICAgIHJldHVybiB0aGlzLmZyb21Bd3NNYW5hZ2VkV29ya2Zsb3dBdHRyaWJ1dGVzKHNjb3BlLCBpZCwge1xuICAgICAgd29ya2Zsb3dOYW1lOiAnZGlzdHJpYnV0ZS1jb250YWluZXInLFxuICAgICAgd29ya2Zsb3dUeXBlOiBXb3JrZmxvd1R5cGUuRElTVFJJQlVUSU9OLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydHMgdGhlIHRlc3QtY29udGFpbmVyIEFXUy1tYW5hZ2VkIHdvcmtmbG93XG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgY29uc3RydWN0IHNjb3BlXG4gICAqIEBwYXJhbSBpZCBJZGVudGlmaWVyIG9mIHRoZSBjb25zdHJ1Y3RcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdGVzdENvbnRhaW5lcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKTogSVdvcmtmbG93IHtcbiAgICByZXR1cm4gdGhpcy5mcm9tQXdzTWFuYWdlZFdvcmtmbG93QXR0cmlidXRlcyhzY29wZSwgaWQsIHtcbiAgICAgIHdvcmtmbG93TmFtZTogJ3Rlc3QtY29udGFpbmVyJyxcbiAgICAgIHdvcmtmbG93VHlwZTogV29ya2Zsb3dUeXBlLlRFU1QsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0cyB0aGUgdGVzdC1pbWFnZSBBV1MtbWFuYWdlZCB3b3JrZmxvd1xuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgVGhlIGNvbnN0cnVjdCBzY29wZVxuICAgKiBAcGFyYW0gaWQgSWRlbnRpZmllciBvZiB0aGUgY29uc3RydWN0XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHRlc3RJbWFnZShzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKTogSVdvcmtmbG93IHtcbiAgICByZXR1cm4gdGhpcy5mcm9tQXdzTWFuYWdlZFdvcmtmbG93QXR0cmlidXRlcyhzY29wZSwgaWQsIHtcbiAgICAgIHdvcmtmbG93TmFtZTogJ3Rlc3QtaW1hZ2UnLFxuICAgICAgd29ya2Zsb3dUeXBlOiBXb3JrZmxvd1R5cGUuVEVTVCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnRzIGFuIEFXUy1tYW5hZ2VkIHdvcmtmbG93IGZyb20gaXRzIGF0dHJpYnV0ZXNcbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogQHBhcmFtIGlkIElkZW50aWZpZXIgb2YgdGhlIGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gYXR0cnMgVGhlIGF0dHJpYnV0ZXMgb2YgdGhlIEFXUy1tYW5hZ2VkIHdvcmtmbG93XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Bd3NNYW5hZ2VkV29ya2Zsb3dBdHRyaWJ1dGVzKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBhdHRyczogQXdzTWFuYWdlZFdvcmtmbG93QXR0cmlidXRlcyxcbiAgKTogSVdvcmtmbG93IHtcbiAgICBpZiAoY2RrLlRva2VuLmlzVW5yZXNvbHZlZChhdHRycy53b3JrZmxvd1R5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcignd29ya2Zsb3dUeXBlIGNhbm5vdCBiZSBhIHRva2VuJywgc2NvcGUpO1xuICAgIH1cblxuICAgIHJldHVybiBXb3JrZmxvdy5mcm9tV29ya2Zsb3dBcm4oXG4gICAgICBzY29wZSxcbiAgICAgIGlkLFxuICAgICAgY2RrLlN0YWNrLm9mKHNjb3BlKS5mb3JtYXRBcm4oe1xuICAgICAgICBzZXJ2aWNlOiAnaW1hZ2VidWlsZGVyJyxcbiAgICAgICAgYWNjb3VudDogJ2F3cycsXG4gICAgICAgIHJlc291cmNlOiAnd29ya2Zsb3cnLFxuICAgICAgICByZXNvdXJjZU5hbWU6IGAke2F0dHJzLndvcmtmbG93VHlwZS50b0xvd2VyQ2FzZSgpfS8ke2F0dHJzLndvcmtmbG93TmFtZX0vJHtMQVRFU1RfVkVSU0lPTn1gLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgbmV3IG9yIGltcG9ydGVkIFdvcmtmbG93XG4gKi9cbmFic3RyYWN0IGNsYXNzIFdvcmtmbG93QmFzZSBleHRlbmRzIGNkay5SZXNvdXJjZSBpbXBsZW1lbnRzIElXb3JrZmxvdyB7XG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSB3b3JrZmxvd1xuICAgKi9cbiAgYWJzdHJhY3QgcmVhZG9ubHkgd29ya2Zsb3dBcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHdvcmtmbG93XG4gICAqL1xuICBhYnN0cmFjdCByZWFkb25seSB3b3JrZmxvd05hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIHdvcmtmbG93XG4gICAqL1xuICBhYnN0cmFjdCByZWFkb25seSB3b3JrZmxvd1R5cGU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIHdvcmtmbG93XG4gICAqL1xuICBhYnN0cmFjdCByZWFkb25seSB3b3JrZmxvd1ZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogR3JhbnQgY3VzdG9tIGFjdGlvbnMgdG8gdGhlIGdpdmVuIGdyYW50ZWUgZm9yIHRoZSB3b3JrZmxvd1xuICAgKlxuICAgKiBAcGFyYW0gZ3JhbnRlZSBUaGUgcHJpbmNpcGFsXG4gICAqIEBwYXJhbSBhY3Rpb25zIFRoZSBsaXN0IG9mIGFjdGlvbnNcbiAgICovXG4gIHB1YmxpYyBncmFudChncmFudGVlOiBpYW0uSUdyYW50YWJsZSwgLi4uYWN0aW9uczogc3RyaW5nW10pOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWwoe1xuICAgICAgZ3JhbnRlZSxcbiAgICAgIGFjdGlvbnMsXG4gICAgICByZXNvdXJjZUFybnM6IFt0aGlzLndvcmtmbG93QXJuXSxcbiAgICAgIHNjb3BlOiB0aGlzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQgcGVybWlzc2lvbnMgdG8gdGhlIGdpdmVuIGdyYW50ZWUgZm9yIHRoZSB3b3JrZmxvd1xuICAgKlxuICAgKiBAcGFyYW0gZ3JhbnRlZSBUaGUgcHJpbmNpcGFsXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRSZWFkKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5ncmFudChncmFudGVlLCAnaW1hZ2VidWlsZGVyOkdldFdvcmtmbG93Jyk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIEVDMiBJbWFnZSBCdWlsZGVyIFdvcmtmbG93LlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2ltYWdlYnVpbGRlci9sYXRlc3QvdXNlcmd1aWRlL21hbmFnZS1pbWFnZS13b3JrZmxvd3MuaHRtbFxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgV29ya2Zsb3cgZXh0ZW5kcyBXb3JrZmxvd0Jhc2Uge1xuICAvKiogVW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGNsYXNzLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1BFUlRZX0lOSkVDVElPTl9JRDogc3RyaW5nID0gJ0Bhd3MtY2RrLmF3cy1pbWFnZWJ1aWxkZXItYWxwaGEuV29ya2Zsb3cnO1xuXG4gIC8qKlxuICAgKiBJbXBvcnQgYW4gZXhpc3Rpbmcgd29ya2Zsb3cgZ2l2ZW4gaXRzIEFSTi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVdvcmtmbG93QXJuKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHdvcmtmbG93QXJuOiBzdHJpbmcpOiBJV29ya2Zsb3cge1xuICAgIHJldHVybiB0aGlzLmZyb21Xb3JrZmxvd0F0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7IHdvcmtmbG93QXJuIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleGlzdGluZyB3b3JrZmxvdyBieSBwcm92aWRpbmcgaXRzIGF0dHJpYnV0ZXMuIFRoZSBwcm92aWRlZCBuYW1lIG11c3QgYmUgbm9ybWFsaXplZCBieSBjb252ZXJ0aW5nXG4gICAqIGFsbCBhbHBoYWJldGljYWwgY2hhcmFjdGVycyB0byBsb3dlcmNhc2UsIGFuZCByZXBsYWNpbmcgYWxsIHNwYWNlcyBhbmQgdW5kZXJzY29yZXMgd2l0aCBoeXBoZW5zLiBZb3UgbWF5IG5vdFxuICAgKiBwcm92aWRlIGEgZHluYW1pYyBleHByZXNzaW9uIGZvciB0aGUgd29ya2Zsb3dBcm4gb3Igd29ya2Zsb3dUeXBlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Xb3JrZmxvd0F0dHJpYnV0ZXMoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXR0cnM6IFdvcmtmbG93QXR0cmlidXRlcyk6IElXb3JrZmxvdyB7XG4gICAgaWYgKFxuICAgICAgYXR0cnMud29ya2Zsb3dBcm4gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgKGF0dHJzLndvcmtmbG93TmFtZSAhPT0gdW5kZWZpbmVkIHx8IGF0dHJzLndvcmtmbG93VHlwZSAhPT0gdW5kZWZpbmVkIHx8IGF0dHJzLndvcmtmbG93VmVyc2lvbiAhPT0gdW5kZWZpbmVkKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICdhIHdvcmtmbG93TmFtZSwgd29ya2Zsb3dUeXBlLCBvciB3b3JrZmxvd1ZlcnNpb24gY2Fubm90IGJlIHByb3ZpZGVkIHdoZW4gYSB3b3JrZmxvd0FybiBpcyBwcm92aWRlZCcsXG4gICAgICAgIHNjb3BlLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYXR0cnMud29ya2Zsb3dBcm4gPT09IHVuZGVmaW5lZCAmJiAoYXR0cnMud29ya2Zsb3dOYW1lID09PSB1bmRlZmluZWQgfHwgYXR0cnMud29ya2Zsb3dUeXBlID09PSB1bmRlZmluZWQpKSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcignZWl0aGVyIHdvcmtmbG93QXJuLCBvciB3b3JrZmxvd05hbWUgYW5kIHdvcmtmbG93VHlwZSBpcyByZXF1aXJlZCcsIHNjb3BlKTtcbiAgICB9XG5cbiAgICBpZiAoYXR0cnMud29ya2Zsb3dUeXBlICYmIGNkay5Ub2tlbi5pc1VucmVzb2x2ZWQoYXR0cnMud29ya2Zsb3dUeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoJ3dvcmtmbG93VHlwZSBjYW5ub3QgYmUgYW4gdW5yZXNvbHZlZCB0b2tlbicsIHNjb3BlKTtcbiAgICB9XG5cbiAgICBjb25zdCB3b3JrZmxvd0FybiA9ICgoKSA9PiB7XG4gICAgICBpZiAoYXR0cnMud29ya2Zsb3dBcm4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gYXR0cnMud29ya2Zsb3dBcm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjZGsuU3RhY2sub2Yoc2NvcGUpLmZvcm1hdEFybih7XG4gICAgICAgIHNlcnZpY2U6ICdpbWFnZWJ1aWxkZXInLFxuICAgICAgICByZXNvdXJjZTogJ3dvcmtmbG93JyxcbiAgICAgICAgcmVzb3VyY2VOYW1lOiBgJHthdHRycy53b3JrZmxvd1R5cGUhLnRvTG93ZXJDYXNlKCl9LyR7YXR0cnMud29ya2Zsb3dOYW1lIX0vJHthdHRycy53b3JrZmxvd1ZlcnNpb24gPz8gTEFURVNUX1ZFUlNJT059YCxcbiAgICAgIH0pO1xuICAgIH0pKCk7XG5cbiAgICBjb25zdCBbd29ya2Zsb3dUeXBlLCB3b3JrZmxvd05hbWUsIHdvcmtmbG93VmVyc2lvbl0gPSAoKCkgPT4ge1xuICAgICAgaWYgKGF0dHJzLndvcmtmbG93TmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBbYXR0cnMud29ya2Zsb3dUeXBlIS50b1VwcGVyQ2FzZSgpLCBhdHRycy53b3JrZmxvd05hbWUsIGF0dHJzLndvcmtmbG93VmVyc2lvbiA/PyBMQVRFU1RfVkVSU0lPTl07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdvcmtmbG93TmFtZVR5cGVWZXJzaW9uID0gY2RrLlN0YWNrLm9mKHNjb3BlKS5zcGxpdEFybihcbiAgICAgICAgd29ya2Zsb3dBcm4sXG4gICAgICAgIGNkay5Bcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRSxcbiAgICAgICkucmVzb3VyY2VOYW1lITtcblxuICAgICAgaWYgKGNkay5Ub2tlbi5pc1VucmVzb2x2ZWQod29ya2Zsb3dOYW1lVHlwZVZlcnNpb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgICd0aGUgd29ya2Zsb3dOYW1lLCB3b3JrZmxvd1R5cGUsIGFuZCB3b3JrZmxvd1ZlcnNpb24gaW4gdGhlIHdvcmtmbG93QXJuIGNhbm5vdCBiZSBhbiB1bnJlc29sdmVkIHRva2VuJyxcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHdvcmtmbG93TmFtZVR5cGVWZXJzaW9uLnNwbGl0KCcvJykubGVuZ3RoIDwgMykge1xuICAgICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICAndGhlIHdvcmtmbG93IEFSTiBtdXN0IGVuZCB3aXRoIDx3b3JrZmxvdy10eXBlPi88d29ya2Zsb3ctbmFtZT4vPHdvcmtmbG93LXZlcnNpb24+JyxcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgd29ya2Zsb3dOYW1lVHlwZVZlcnNpb25TcGxpdCA9IHdvcmtmbG93TmFtZVR5cGVWZXJzaW9uLnNwbGl0KCcvJyk7XG4gICAgICBjb25zdCBbd29ya2Zsb3dUeXBlRnJvbUFybiwgd29ya2Zsb3dOYW1lRnJvbUFybiwgd29ya2Zsb3dWZXJzaW9uRnJvbUFybl0gPSB3b3JrZmxvd05hbWVUeXBlVmVyc2lvblNwbGl0LnNsaWNlKFxuICAgICAgICAwLFxuICAgICAgICAzLFxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIFt3b3JrZmxvd1R5cGVGcm9tQXJuLnRvVXBwZXJDYXNlKCksIHdvcmtmbG93TmFtZUZyb21Bcm4sIHdvcmtmbG93VmVyc2lvbkZyb21Bcm5dO1xuICAgIH0pKCk7XG5cbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBXb3JrZmxvd0Jhc2Uge1xuICAgICAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93QXJuID0gd29ya2Zsb3dBcm47XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgd29ya2Zsb3dOYW1lID0gd29ya2Zsb3dOYW1lO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93VHlwZSA9IHdvcmtmbG93VHlwZTtcbiAgICAgIHB1YmxpYyByZWFkb25seSB3b3JrZmxvd1ZlcnNpb24gPSB3b3JrZmxvd1ZlcnNpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgV29ya2Zsb3cuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlzV29ya2Zsb3coeDogYW55KTogeCBpcyBXb3JrZmxvdyB7XG4gICAgcmV0dXJuIHggIT09IG51bGwgJiYgdHlwZW9mIHggPT09ICdvYmplY3QnICYmIFdPUktGTE9XX1NZTUJPTCBpbiB4O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIHdvcmtmbG93XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd29ya2Zsb3dBcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHdvcmtmbG93XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd29ya2Zsb3dOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSB3b3JrZmxvd1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93VHlwZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgd29ya2Zsb3dcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB3b3JrZmxvd1ZlcnNpb246IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFdvcmtmbG93UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTpcbiAgICAgICAgcHJvcHMud29ya2Zsb3dOYW1lID8/XG4gICAgICAgIGNkay5MYXp5LnN0cmluZyh7XG4gICAgICAgICAgcHJvZHVjZTogKCkgPT5cbiAgICAgICAgICAgIGNkay5OYW1lcy51bmlxdWVSZXNvdXJjZU5hbWUodGhpcywge1xuICAgICAgICAgICAgICBtYXhMZW5ndGg6IDEyOCxcbiAgICAgICAgICAgICAgc2VwYXJhdG9yOiAnLScsXG4gICAgICAgICAgICAgIGFsbG93ZWRTcGVjaWFsQ2hhcmFjdGVyczogJy0nLFxuICAgICAgICAgICAgfSkudG9Mb3dlckNhc2UoKSwgLy8gRW5mb3JjZSBsb3dlcmNhc2UgZm9yIHRoZSBhdXRvLWdlbmVyYXRlZCBmYWxsYmFja1xuICAgICAgICB9KSxcbiAgICB9KTtcbiAgICAvLyBFbmhhbmNlZCBDREsgQW5hbHl0aWNzIFRlbGVtZXRyeVxuICAgIGFkZENvbnN0cnVjdE1ldGFkYXRhKHRoaXMsIHByb3BzKTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBXT1JLRkxPV19TWU1CT0wsIHsgdmFsdWU6IHRydWUgfSk7XG5cbiAgICB0aGlzLnZhbGlkYXRlV29ya2Zsb3dOYW1lKCk7XG5cbiAgICBjb25zdCB3b3JrZmxvd1ZlcnNpb24gPSBwcm9wcy53b3JrZmxvd1ZlcnNpb24gPz8gJzEuMC4wJztcbiAgICBjb25zdCB3b3JrZmxvdyA9IG5ldyBDZm5Xb3JrZmxvdyh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBuYW1lOiB0aGlzLnBoeXNpY2FsTmFtZSxcbiAgICAgIHZlcnNpb246IHdvcmtmbG93VmVyc2lvbixcbiAgICAgIHR5cGU6IHByb3BzLndvcmtmbG93VHlwZSxcbiAgICAgIGNoYW5nZURlc2NyaXB0aW9uOiBwcm9wcy5jaGFuZ2VEZXNjcmlwdGlvbixcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgIGttc0tleUlkOiBwcm9wcy5rbXNLZXk/LmtleUFybixcbiAgICAgIHRhZ3M6IHByb3BzLnRhZ3MsXG4gICAgICAuLi5wcm9wcy5kYXRhLnJlbmRlcigpLFxuICAgIH0pO1xuXG4gICAgdGhpcy53b3JrZmxvd05hbWUgPSB0aGlzLmdldFJlc291cmNlTmFtZUF0dHJpYnV0ZSh3b3JrZmxvdy5nZXRBdHQoJ05hbWUnKS50b1N0cmluZygpKTtcbiAgICB0aGlzLndvcmtmbG93QXJuID0gd29ya2Zsb3cuYXR0ckFybjtcbiAgICB0aGlzLndvcmtmbG93VmVyc2lvbiA9IHdvcmtmbG93VmVyc2lvbjtcbiAgICB0aGlzLndvcmtmbG93VHlwZSA9IHByb3BzLndvcmtmbG93VHlwZTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVXb3JrZmxvd05hbWUoKSB7XG4gICAgaWYgKGNkay5Ub2tlbi5pc1VucmVzb2x2ZWQodGhpcy5waHlzaWNhbE5hbWUpKSB7XG4gICAgICByZXR1cm47IC8vIENhbm5vdCB2YWxpZGF0ZSB1bnJlc29sdmVkIHRva2VucywgZ2l2ZW4gdGhlaXIgYWN0dWFsIHZhbHVlIGlzIHJlbmRlcmVkIGF0IGRlcGxveW1lbnQgdGltZVxuICAgIH1cblxuICAgIGlmICh0aGlzLnBoeXNpY2FsTmFtZS5sZW5ndGggPiAxMjgpIHtcbiAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKCd0aGUgd29ya2Zsb3dOYW1lIGNhbm5vdCBiZSBsb25nZXIgdGhhbiAxMjggY2hhcmFjdGVycycsIHRoaXMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBoeXNpY2FsTmFtZS5pbmNsdWRlcygnICcpKSB7XG4gICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcigndGhlIHdvcmtmbG93TmFtZSBjYW5ub3QgY29udGFpbiBzcGFjZXMnLCB0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5waHlzaWNhbE5hbWUuaW5jbHVkZXMoJ18nKSkge1xuICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IoJ3RoZSB3b3JrZmxvd05hbWUgY2Fubm90IGNvbnRhaW4gdW5kZXJzY29yZXMnLCB0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5waHlzaWNhbE5hbWUgIT09IHRoaXMucGh5c2ljYWxOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKCd0aGUgd29ya2Zsb3dOYW1lIG11c3QgYmUgbG93ZXJjYXNlJywgdGhpcyk7XG4gICAgfVxuICB9XG59XG4iXX0=