@aws-mdaa/dataops-job-l3-construct 1.5.0 → 1.6.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.
Files changed (90) hide show
  1. package/.jsii +38 -28
  2. package/README.md +5 -0
  3. package/lib/dataops-job-l3-construct.d.ts +8 -1
  4. package/lib/dataops-job-l3-construct.js +40 -13
  5. package/node_modules/@aws-mdaa/config/README.md +3 -0
  6. package/node_modules/@aws-mdaa/config/lib/blueprint-value-transformer.d.ts +20 -0
  7. package/node_modules/@aws-mdaa/config/lib/blueprint-value-transformer.js +70 -0
  8. package/node_modules/@aws-mdaa/config/lib/blueprint-value-transformer.ts +88 -0
  9. package/node_modules/@aws-mdaa/config/lib/config.d.ts +87 -0
  10. package/node_modules/@aws-mdaa/config/lib/config.js +7 -0
  11. package/node_modules/@aws-mdaa/config/lib/config.ts +92 -0
  12. package/node_modules/@aws-mdaa/config/lib/index.d.ts +11 -0
  13. package/node_modules/@aws-mdaa/config/lib/index.js +28 -0
  14. package/node_modules/@aws-mdaa/config/lib/index.ts +12 -0
  15. package/node_modules/@aws-mdaa/config/lib/param-transformer.d.ts +49 -0
  16. package/node_modules/@aws-mdaa/config/lib/param-transformer.js +160 -0
  17. package/node_modules/@aws-mdaa/config/lib/param-transformer.ts +159 -0
  18. package/node_modules/@aws-mdaa/config/lib/path-value-transformer.d.ts +10 -0
  19. package/node_modules/@aws-mdaa/config/lib/path-value-transformer.js +30 -0
  20. package/node_modules/@aws-mdaa/config/lib/path-value-transformer.ts +27 -0
  21. package/node_modules/@aws-mdaa/config/lib/ref-value-transformer.d.ts +44 -0
  22. package/node_modules/@aws-mdaa/config/lib/ref-value-transformer.js +243 -0
  23. package/node_modules/@aws-mdaa/config/lib/ref-value-transformer.ts +302 -0
  24. package/node_modules/@aws-mdaa/config/lib/ssm-ref-transformer.d.ts +8 -0
  25. package/node_modules/@aws-mdaa/config/lib/ssm-ref-transformer.js +22 -0
  26. package/node_modules/@aws-mdaa/config/lib/ssm-ref-transformer.ts +21 -0
  27. package/node_modules/@aws-mdaa/config/lib/transformer.d.ts +35 -0
  28. package/node_modules/@aws-mdaa/config/lib/transformer.js +66 -0
  29. package/node_modules/@aws-mdaa/config/lib/transformer.ts +74 -0
  30. package/node_modules/@aws-mdaa/config/package.json +42 -0
  31. package/node_modules/@aws-mdaa/config/test/blueprint-value-transformer.test.js +224 -0
  32. package/node_modules/@aws-mdaa/config/test/blueprint-value-transformer.test.ts +259 -0
  33. package/node_modules/@aws-mdaa/config/test/config-nt.test.d.ts +5 -0
  34. package/node_modules/@aws-mdaa/config/test/config-nt.test.js +129 -0
  35. package/node_modules/@aws-mdaa/config/test/config-nt.test.ts +163 -0
  36. package/node_modules/@aws-mdaa/config/test/config.test.d.ts +5 -0
  37. package/node_modules/@aws-mdaa/config/test/config.test.js +409 -0
  38. package/node_modules/@aws-mdaa/config/test/config.test.ts +517 -0
  39. package/node_modules/@aws-mdaa/config/test/param-transformer.test.d.ts +5 -0
  40. package/node_modules/@aws-mdaa/config/test/param-transformer.test.js +216 -0
  41. package/node_modules/@aws-mdaa/config/test/param-transformer.test.ts +234 -0
  42. package/node_modules/@aws-mdaa/config/test/path-value-transformer.test.d.ts +5 -0
  43. package/node_modules/@aws-mdaa/config/test/path-value-transformer.test.js +59 -0
  44. package/node_modules/@aws-mdaa/config/test/path-value-transformer.test.ts +68 -0
  45. package/node_modules/@aws-mdaa/config/test/ref-value-transformer.test.d.ts +5 -0
  46. package/node_modules/@aws-mdaa/config/test/ref-value-transformer.test.js +254 -0
  47. package/node_modules/@aws-mdaa/config/test/ref-value-transformer.test.ts +304 -0
  48. package/node_modules/@aws-mdaa/config/test/ssm-ref-transformer.test.d.ts +5 -0
  49. package/node_modules/@aws-mdaa/config/test/ssm-ref-transformer.test.js +66 -0
  50. package/node_modules/@aws-mdaa/config/test/ssm-ref-transformer.test.ts +79 -0
  51. package/node_modules/@aws-mdaa/config/tsconfig.tsbuildinfo +1 -0
  52. package/node_modules/lodash/README.md +2 -2
  53. package/node_modules/lodash/_baseOrderBy.js +1 -1
  54. package/node_modules/lodash/_baseUnset.js +7 -20
  55. package/node_modules/lodash/_setCacheHas.js +1 -1
  56. package/node_modules/lodash/compact.js +1 -1
  57. package/node_modules/lodash/core.js +3 -3
  58. package/node_modules/lodash/core.min.js +26 -25
  59. package/node_modules/lodash/fromPairs.js +3 -1
  60. package/node_modules/lodash/lodash.js +38 -27
  61. package/node_modules/lodash/lodash.min.js +125 -129
  62. package/node_modules/lodash/package.json +4 -2
  63. package/node_modules/lodash/random.js +9 -0
  64. package/node_modules/lodash/template.js +16 -4
  65. package/node_modules/lodash/templateSettings.js +4 -0
  66. package/package.json +27 -32
  67. package/node_modules/@aws-mdaa/s3-bucketpolicy-helper/README.md +0 -185
  68. package/node_modules/@aws-mdaa/s3-bucketpolicy-helper/lib/index.d.ts +0 -57
  69. package/node_modules/@aws-mdaa/s3-bucketpolicy-helper/lib/index.js +0 -198
  70. package/node_modules/@aws-mdaa/s3-bucketpolicy-helper/lib/index.ts +0 -241
  71. package/node_modules/@aws-mdaa/s3-bucketpolicy-helper/package.json +0 -44
  72. package/node_modules/@aws-mdaa/s3-bucketpolicy-helper/test/bucketpolicy-helper.test.js +0 -200
  73. package/node_modules/@aws-mdaa/s3-bucketpolicy-helper/test/bucketpolicy-helper.test.ts +0 -215
  74. package/node_modules/@aws-mdaa/s3-bucketpolicy-helper/tsconfig.tsbuildinfo +0 -1
  75. package/node_modules/@aws-mdaa/s3-inventory-helper/.npmignore +0 -34
  76. package/node_modules/@aws-mdaa/s3-inventory-helper/README.md +0 -3
  77. package/node_modules/@aws-mdaa/s3-inventory-helper/jest.config.js +0 -5
  78. package/node_modules/@aws-mdaa/s3-inventory-helper/lib/index.d.ts +0 -48
  79. package/node_modules/@aws-mdaa/s3-inventory-helper/lib/index.js +0 -213
  80. package/node_modules/@aws-mdaa/s3-inventory-helper/lib/index.ts +0 -241
  81. package/node_modules/@aws-mdaa/s3-inventory-helper/package.json +0 -44
  82. package/node_modules/@aws-mdaa/s3-inventory-helper/test/TODO +0 -0
  83. package/node_modules/@aws-mdaa/s3-inventory-helper/tsconfig.json +0 -40
  84. package/node_modules/@aws-mdaa/s3-inventory-helper/tsconfig.tsbuildinfo +0 -1
  85. package/node_modules/@aws-mdaa/s3-inventory-helper/typedoc.json +0 -7
  86. /package/node_modules/@aws-mdaa/{s3-bucketpolicy-helper → config}/.npmignore +0 -0
  87. /package/node_modules/@aws-mdaa/{s3-bucketpolicy-helper → config}/jest.config.js +0 -0
  88. /package/node_modules/@aws-mdaa/{s3-bucketpolicy-helper/test/bucketpolicy-helper.test.d.ts → config/test/blueprint-value-transformer.test.d.ts} +0 -0
  89. /package/node_modules/@aws-mdaa/{s3-bucketpolicy-helper → config}/tsconfig.json +0 -0
  90. /package/node_modules/@aws-mdaa/{s3-bucketpolicy-helper → config}/typedoc.json +0 -0
package/.jsii CHANGED
@@ -7,22 +7,20 @@
7
7
  "url": "https://aws.amazon.com/solutions"
8
8
  },
9
9
  "bundled": {
10
- "@aws-mdaa/s3-bucketpolicy-helper": "1.5.0",
11
- "@aws-mdaa/s3-inventory-helper": "1.5.0",
12
- "lodash": "4.17.23"
10
+ "@aws-mdaa/config": "1.6.0",
11
+ "lodash": "4.18.1"
13
12
  },
14
13
  "dependencies": {
15
- "@aws-mdaa/cloudwatch-constructs": "1.5.0",
16
- "@aws-mdaa/construct": "1.5.0",
17
- "@aws-mdaa/dataops-project-l3-construct": "1.5.0",
18
- "@aws-mdaa/eventbridge-helper": "1.5.0",
19
- "@aws-mdaa/glue-constructs": "1.5.0",
20
- "@aws-mdaa/iam-constructs": "1.5.0",
21
- "@aws-mdaa/iam-role-helper": "1.5.0",
22
- "@aws-mdaa/l3-construct": "1.5.0",
23
- "@aws-mdaa/naming": "1.5.0",
24
- "@aws-mdaa/s3-constructs": "1.5.0",
25
- "@aws-mdaa/sns-constructs": "1.5.0",
14
+ "@aws-mdaa/cloudwatch-constructs": "1.6.0",
15
+ "@aws-mdaa/construct": "1.6.0",
16
+ "@aws-mdaa/dataops-project-l3-construct": "1.6.0",
17
+ "@aws-mdaa/eventbridge-helper": "1.6.0",
18
+ "@aws-mdaa/glue-constructs": "1.6.0",
19
+ "@aws-mdaa/iam-constructs": "1.6.0",
20
+ "@aws-mdaa/iam-role-helper": "1.6.0",
21
+ "@aws-mdaa/l3-construct": "1.6.0",
22
+ "@aws-mdaa/s3-constructs": "1.6.0",
23
+ "@aws-mdaa/sns-constructs": "1.6.0",
26
24
  "aws-cdk-lib": "2.220.0",
27
25
  "cdk-nag": "2.37.55",
28
26
  "constructs": "10.0.96"
@@ -190,13 +188,6 @@
190
188
  }
191
189
  }
192
190
  },
193
- "@aws-mdaa/datazone-l3-construct": {
194
- "targets": {
195
- "js": {
196
- "npm": "@aws-mdaa/datazone-l3-construct"
197
- }
198
- }
199
- },
200
191
  "@aws-mdaa/ec2-constructs": {
201
192
  "targets": {
202
193
  "js": {
@@ -4401,7 +4392,7 @@
4401
4392
  },
4402
4393
  "name": "@aws-mdaa/dataops-job-l3-construct",
4403
4394
  "readme": {
4404
- "markdown": "# Construct Overview\n\nThe Data Ops Job CDK L3 construct is used to deploy the resources required to support and perform data operations on top of a Data Lake using Glue Jobs.\n\n***\n\n## Deployed Resources\n\n![dataops-job](docs/dataops-job.png)\n\n* **Glue Jobs** - Glue Jobs will be created for each job specification in the configs\n"
4395
+ "markdown": "# Construct Overview\n\nThe Data Ops Job CDK L3 construct is used to deploy the resources required to support and perform data operations on top of a Data Lake using Glue Jobs.\n\n***\n\n## Deployed Resources\n\n![dataops-job](docs/dataops-job.png)\n\n* **Glue Jobs** - Glue Jobs will be created for each job specification in the configs\n\n## Optional Features\n\n### Asset Script Resolution\nSet `assetBasePath` on the construct props to enable `asset:` prefixed paths in `scriptLocation` and `additionalScripts`. When a path starts with `asset:`, it is resolved relative to the configured base path (e.g., `asset:dq-main.py` resolves to `<assetBasePath>/dq-main.py`).\n"
4405
4396
  },
4406
4397
  "repository": {
4407
4398
  "type": "git",
@@ -4427,7 +4418,7 @@
4427
4418
  },
4428
4419
  "locationInModule": {
4429
4420
  "filename": "lib/dataops-job-l3-construct.ts",
4430
- "line": 153
4421
+ "line": 160
4431
4422
  },
4432
4423
  "parameters": [
4433
4424
  {
@@ -4453,7 +4444,7 @@
4453
4444
  "kind": "class",
4454
4445
  "locationInModule": {
4455
4446
  "filename": "lib/dataops-job-l3-construct.ts",
4456
- "line": 149
4447
+ "line": 156
4457
4448
  },
4458
4449
  "name": "GlueJobL3Construct",
4459
4450
  "properties": [
@@ -4464,7 +4455,7 @@
4464
4455
  "immutable": true,
4465
4456
  "locationInModule": {
4466
4457
  "filename": "lib/dataops-job-l3-construct.ts",
4467
- "line": 150
4458
+ "line": 157
4468
4459
  },
4469
4460
  "name": "props",
4470
4461
  "protected": true,
@@ -4513,6 +4504,24 @@
4513
4504
  }
4514
4505
  }
4515
4506
  },
4507
+ {
4508
+ "abstract": true,
4509
+ "docs": {
4510
+ "remarks": "When a job's scriptLocation starts with `asset:`, it is resolved\nrelative to this directory.",
4511
+ "stability": "experimental",
4512
+ "summary": "Base path for resolving `asset:` prefixed script locations."
4513
+ },
4514
+ "immutable": true,
4515
+ "locationInModule": {
4516
+ "filename": "lib/dataops-job-l3-construct.ts",
4517
+ "line": 153
4518
+ },
4519
+ "name": "assetBasePath",
4520
+ "optional": true,
4521
+ "type": {
4522
+ "primitive": "string"
4523
+ }
4524
+ },
4516
4525
  {
4517
4526
  "abstract": true,
4518
4527
  "docs": {
@@ -4655,8 +4664,9 @@
4655
4664
  {
4656
4665
  "abstract": true,
4657
4666
  "docs": {
4667
+ "remarks": "Available assets: dq-main.py (DQ evaluation, with utils/ as additionalScripts).",
4658
4668
  "stability": "experimental",
4659
- "summary": "Relative path to the Glue script for job execution."
4669
+ "summary": "Relative path to the Glue script for job execution, or `asset:<filename>` to use a pre-built script from the app's assets directory."
4660
4670
  },
4661
4671
  "immutable": true,
4662
4672
  "locationInModule": {
@@ -5089,6 +5099,6 @@
5089
5099
  "symbolId": "lib/dataops-job-l3-construct:LoggingConfig"
5090
5100
  }
5091
5101
  },
5092
- "version": "1.5.0",
5093
- "fingerprint": "3fwTg1cuEVkGekybvR1p0i6vHE1WdbFkjzHywfOEhyI="
5102
+ "version": "1.6.0",
5103
+ "fingerprint": "CDrJjMPj2ioWctWkDbvZNiwiA9fw68dPsZxK4CiNoqQ="
5094
5104
  }
package/README.md CHANGED
@@ -9,3 +9,8 @@ The Data Ops Job CDK L3 construct is used to deploy the resources required to su
9
9
  ![dataops-job](docs/dataops-job.png)
10
10
 
11
11
  * **Glue Jobs** - Glue Jobs will be created for each job specification in the configs
12
+
13
+ ## Optional Features
14
+
15
+ ### Asset Script Resolution
16
+ Set `assetBasePath` on the construct props to enable `asset:` prefixed paths in `scriptLocation` and `additionalScripts`. When a path starts with `asset:`, it is resolved relative to the configured base path (e.g., `asset:dq-main.py` resolves to `<assetBasePath>/dq-main.py`).
@@ -35,7 +35,7 @@ export interface JobCommand {
35
35
  readonly name: JobCommandName;
36
36
  /** Python version for job runtime ('2' or '3'). */
37
37
  readonly pythonVersion?: JobCommandPythonVersion;
38
- /** Relative path to the Glue script for job execution. */
38
+ /** Relative path to the Glue script for job execution, or `asset:<filename>` to use a pre-built script from the app's assets directory. Available assets: dq-main.py (DQ evaluation, with utils/ as additionalScripts). */
39
39
  readonly scriptLocation: string;
40
40
  }
41
41
  export type JobWorkerType = 'Standard' | 'G.1X' | 'G.2X';
@@ -119,6 +119,12 @@ export interface GlueJobL3ConstructProps extends MdaaL3ConstructProps {
119
119
  * Dataops project KMS key ARN.
120
120
  */
121
121
  readonly kmsArn?: string;
122
+ /**
123
+ * Base path for resolving `asset:` prefixed script locations.
124
+ * When a job's scriptLocation starts with `asset:`, it is resolved
125
+ * relative to this directory.
126
+ */
127
+ readonly assetBasePath?: string;
122
128
  }
123
129
  export declare class GlueJobL3Construct extends MdaaL3Construct {
124
130
  protected readonly props: GlueJobL3ConstructProps;
@@ -128,6 +134,7 @@ export declare class GlueJobL3Construct extends MdaaL3Construct {
128
134
  private addAdditionalScripts;
129
135
  private addAdditionalJars;
130
136
  private addAdditionalFiles;
137
+ private resolveAssetPath;
131
138
  private createJob;
132
139
  private createJobMonitoringEventRule;
133
140
  private createLogGroup;
@@ -41,19 +41,27 @@ class GlueJobL3Construct extends l3_construct_1.MdaaL3Construct {
41
41
  this.kmsKey = aws_kms_1.Key.fromKeyArn(this, this.props.projectName ?? 'kms-key', this.props.kmsArn);
42
42
  // Build our jobs!
43
43
  const allJobs = this.props.jobConfigs;
44
- Object.keys(allJobs).forEach(jobName => {
44
+ for (const jobName of Object.keys(allJobs)) {
45
45
  const jobConfig = allJobs[jobName];
46
46
  this.createJob(jobName, jobConfig, deploymentRole, bucket);
47
- });
48
- //CDK S3 Deployment automatically adds inline policy to project deployment role.
47
+ }
48
+ // BucketDeployment adds an inline policy to the imported deployment role,
49
+ // which CDK synthesizes as a standalone AWS::IAM::Policy resource.
50
+ // Because the policy name is derived from the construct path (not the stack name),
51
+ // multiple stacks importing the same role produce colliding physical names.
52
+ // Remove the inline policy node — the deployment role already has the necessary
53
+ // S3 permissions granted in the dataops-project construct that owns it.
54
+ for (const child of deploymentRole.node.children) {
55
+ if (child.node.id === 'Policy') {
56
+ deploymentRole.node.tryRemoveChild(child.node.id);
57
+ break;
58
+ }
59
+ }
60
+ // Suppress nag warnings on the imported deployment role node itself
61
+ // (remaining after inline policy removal, e.g. wildcard resource warnings)
49
62
  this.scope.node.children.forEach(child => {
50
63
  if (child.node.id.startsWith('deployment-role')) {
51
- construct_1.MdaaNagSuppressions.addCodeResourceSuppressions(child, [
52
- { id: 'AwsSolutions-IAM5', reason: 'Inline policy used only for deployment.' },
53
- { id: 'NIST.800.53.R5-IAMNoInlinePolicy', reason: 'Policy used only for deployment.' },
54
- { id: 'HIPAA.Security-IAMNoInlinePolicy', reason: 'Policy used only for deployment.' },
55
- { id: 'PCI.DSS.321-IAMNoInlinePolicy', reason: 'Policy used only for deployment.' },
56
- ], true);
64
+ construct_1.MdaaNagSuppressions.addCodeResourceSuppressions(child, [{ id: 'AwsSolutions-IAM5', reason: 'Permissions granted on deployment role in owning stack.' }], true);
57
65
  }
58
66
  });
59
67
  }
@@ -150,10 +158,22 @@ class GlueJobL3Construct extends l3_construct_1.MdaaL3Construct {
150
158
  }
151
159
  }
152
160
  }
161
+ resolveAssetPath(jobName, location) {
162
+ if (location.startsWith('asset:')) {
163
+ const assetName = location.substring('asset:'.length);
164
+ if (!this.props.assetBasePath) {
165
+ throw new Error(`Job '${jobName}' uses asset: prefix but no assetBasePath is configured. ` +
166
+ `Set assetBasePath in the construct props.`);
167
+ }
168
+ return path.join(this.props.assetBasePath, assetName);
169
+ }
170
+ return location;
171
+ }
153
172
  createJob(jobName, jobConfig, deploymentRole, bucket) {
154
173
  const defaultArguments = jobConfig.defaultArguments ? jobConfig.defaultArguments : {};
155
- const scriptPath = path.dirname(jobConfig.command.scriptLocation.trim());
156
- const scriptName = path.basename(jobConfig.command.scriptLocation.trim());
174
+ let scriptLocation = this.resolveAssetPath(jobName, jobConfig.command.scriptLocation.trim());
175
+ const scriptPath = path.dirname(scriptLocation);
176
+ const scriptName = path.basename(scriptLocation);
157
177
  const scriptSource = aws_s3_deployment_1.Source.asset(scriptPath, { exclude: ['**', `!${scriptName}`] });
158
178
  const scriptDeploymentPath = `deployment/jobs/${jobName}`;
159
179
  const scriptDeployment = new aws_s3_deployment_1.BucketDeployment(this.scope, `job-deployment-${jobName}`, {
@@ -163,6 +183,13 @@ class GlueJobL3Construct extends l3_construct_1.MdaaL3Construct {
163
183
  role: deploymentRole,
164
184
  extract: true,
165
185
  });
186
+ // Resolve asset: prefixes in additionalScripts before processing
187
+ if (jobConfig.additionalScripts) {
188
+ jobConfig = {
189
+ ...jobConfig,
190
+ additionalScripts: jobConfig.additionalScripts.map(s => this.resolveAssetPath(jobName, s.trim())),
191
+ };
192
+ }
166
193
  this.addAdditionalScripts(jobName, jobConfig, bucket, deploymentRole, defaultArguments);
167
194
  this.addAdditionalJars(jobName, jobConfig, bucket, deploymentRole, defaultArguments);
168
195
  this.addAdditionalFiles(jobName, jobConfig, bucket, deploymentRole, defaultArguments);
@@ -289,5 +316,5 @@ class GlueJobL3Construct extends l3_construct_1.MdaaL3Construct {
289
316
  }
290
317
  exports.GlueJobL3Construct = GlueJobL3Construct;
291
318
  _a = JSII_RTTI_SYMBOL_1;
292
- GlueJobL3Construct[_a] = { fqn: "@aws-mdaa/dataops-job-l3-construct.GlueJobL3Construct", version: "1.5.0" };
293
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YW9wcy1qb2ItbDMtY29uc3RydWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGF0YW9wcy1qb2ItbDMtY29uc3RydWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7OztHQUdHO0FBRUgseUZBQTZFO0FBQzdFLHFFQUFpRTtBQUNqRSwrREFBdUQ7QUFDdkQsNkRBQW9EO0FBQ3BELDJEQUFxRDtBQUNyRCx5REFBK0U7QUFFL0UscUVBQWtGO0FBQ2xGLG1EQUEwRCxDQUFDLFNBQVM7QUFFcEUsNkJBQTZCO0FBQzdCLHVFQUEwRDtBQUMxRCw2REFBd0Q7QUFFeEQsNkNBQWlDO0FBRWpDLG1EQUFxRDtBQUNyRCwyRUFBK0Q7QUFDL0QsaURBQWdEO0FBQ2hELHVGQUFpRjtBQTRIakYsTUFBYSxrQkFBbUIsU0FBUSw4QkFBZTtJQUlyRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQThCO1FBQ3RFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBRW5CLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO1FBQzNFLENBQUM7UUFDRCxNQUFNLGNBQWMsR0FBRyx5QkFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN6RyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7UUFDM0UsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLDBCQUFVLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVB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LENBQ3BELElBQUksQ0FBQyxLQUFLLEVBQ1YsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQ2pCLFFBQVEsRUFDUiw2QkFBNkIsRUFDN0I7WUFDRSxPQUFPLEVBQUUsUUFBUTtZQUNqQixLQUFLLEVBQUUsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQztTQUN4QyxDQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sY0FBYyxDQUFDLHNCQUE4QixFQUFFLFlBQW9CLEVBQUUsYUFBNEI7UUFDdkcsSUFBSSxxQkFBb0MsQ0FBQztRQUV6QyxJQUFJLGFBQWEsQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM3QyxxQkFBcUIsR0FBRyxhQUFhLENBQUMscUJBQXFCLENBQUM7UUFDOUQsQ0FBQzthQUFNLENBQUM7WUFDTixxQkFBcUIsR0FBRyx3QkFBYSxDQUFDLFFBQVEsQ0FBQztRQUNqRCxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUc7WUFDZixNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO1lBQ3pCLFlBQVksRUFBRSxZQUFZO1lBQzFCLHNCQUFzQixFQUFFLHNCQUFzQjtZQUM5QyxhQUFhLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDMUIsU0FBUyxFQUFFLHFCQUFxQjtTQUNqQyxDQUFDO1FBQ0YsSUFBSSxvQ0FBWSxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDL0MsMERBQTBEO1FBQzFELE9BQU8sSUFBQSw0QkFBVyxFQUFDLFFBQVEsQ0FBQyxDQUFDLFlBQWEsQ0FBQztJQUM3QyxDQUFDOztBQXZXSCxnREF3V0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIENvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuXG5pbXBvcnQgeyBEYXRhT3BzUHJvamVjdFV0aWxzIH0gZnJvbSAnQGF3cy1tZGFhL2RhdGFvcHMtcHJvamVjdC1sMy1jb25zdHJ1Y3QnO1xuaW1wb3J0IHsgRXZlbnRCcmlkZ2VIZWxwZXIgfSBmcm9tICdAYXdzLW1kYWEvZXZlbnRicmlkZ2UtaGVscGVyJztcbmltcG9ydCB7IE1kYWFDZm5Kb2IgfSBmcm9tICdAYXdzLW1kYWEvZ2x1ZS1jb25zdHJ1Y3RzJztcbmltcG9ydCB7IE1kYWFSb2xlIH0gZnJvbSAnQGF3cy1tZGFhL2lhbS1jb25zdHJ1Y3RzJztcbmltcG9ydCB7IE1kYWFCdWNrZXQgfSBmcm9tICdAYXdzLW1kYWEvczMtY29uc3RydWN0cyc7XG5pbXBvcnQgeyBNZGFhTDNDb25zdHJ1Y3QsIE1kYWFMM0NvbnN0cnVjdFByb3BzIH0gZnJvbSAnQGF3cy1tZGFhL2wzLWNvbnN0cnVjdCc7XG5pbXBvcnQgeyBDZm5Kb2IgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZ2x1ZSc7XG5pbXBvcnQgeyBCdWNrZXREZXBsb3ltZW50LCBJU291cmNlLCBTb3VyY2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtZGVwbG95bWVudCc7XG5pbXBvcnQgeyBNZGFhTmFnU3VwcHJlc3Npb25zIH0gZnJvbSAnQGF3cy1tZGFhL2NvbnN0cnVjdCc7IC8vTk9TT05BUlxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgU25zVG9waWMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZXZlbnRzLXRhcmdldHMnO1xuaW1wb3J0IHsgTWRhYVNuc1RvcGljIH0gZnJvbSAnQGF3cy1tZGFhL3Nucy1jb25zdHJ1Y3RzJztcbmltcG9ydCB7IFJ1bGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZXZlbnRzJztcbmltcG9ydCB7IEZuIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkVsZW1lbnQgfSBmcm9tICdAYXdzLW1kYWEvY29uZmlnJztcbmltcG9ydCB7IFJldGVudGlvbkRheXMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbG9ncyc7XG5pbXBvcnQgeyBNZGFhTG9nR3JvdXAgfSBmcm9tICdAYXdzLW1kYWEvY2xvdWR3YXRjaC1jb25zdHJ1Y3RzJztcbmltcG9ydCB7IElLZXksIEtleSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1rbXMnO1xuaW1wb3J0IHsgdXBkYXRlUHJvcHMgfSBmcm9tICdAYXdzLW1kYWEvY2xvdWR3YXRjaC1jb25zdHJ1Y3RzL2xpYi9sb2dncm91cC11dGlscyc7XG5pbXBvcnQgeyBJQnVja2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IElSb2xlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5cbmV4cG9ydCB0eXBlIEpvYkNvbW1hbmRQeXRob25WZXJzaW9uID0gJzInIHwgJzMnIHwgdW5kZWZpbmVkO1xuZXhwb3J0IHR5cGUgSm9iQ29tbWFuZE5hbWUgPSAnZ2x1ZWV0bCcgfCAncHl0aG9uc2hlbGwnO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIEdsdWUgam9iIGxvZ2dpbmcgd2l0aCBDbG91ZFdhdGNoIGxvZyByZXRlbnRpb24gbWFuYWdlbWVudC5cbiAqXG4gKiBVc2UgY2FzZXM6IExvZyByZXRlbnRpb24gbWFuYWdlbWVudDsgQ29tcGxpYW5jZSByZXF1aXJlbWVudHM7IENvc3Qgb3B0aW1pemF0aW9uOyBBdWRpdCB0cmFpbCBtYW5hZ2VtZW50XG4gKlxuICogQVdTOiBDbG91ZFdhdGNoIGxvZyBncm91cCByZXRlbnRpb24gZm9yIEdsdWUgam9iIGV4ZWN1dGlvbiBsb2dzIGFuZCBtb25pdG9yaW5nXG4gKlxuICogVmFsaWRhdGlvbjogbG9nR3JvdXBSZXRlbnRpb25EYXlzIGlzIHJlcXVpcmVkIHdpdGggc3BlY2lmaWMgYWxsb3dlZCB2YWx1ZXMgZm9yIHJldGVudGlvbiBwZXJpb2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dnaW5nQ29uZmlnIHtcbiAgLyoqIENsb3VkV2F0Y2ggbG9nIGdyb3VwIHJldGVudGlvbiBpbiBkYXlzLiBBbGxvd2VkOiAxLDMsNSw3LDE0LDMwLDYwLDkwLDEyMCwxNTAsMTgwLDM2NSw0MDAsNTQ1LDczMSwxODI3LDM2NTMsIG9yIDAuICovXG4gIHJlYWRvbmx5IGxvZ0dyb3VwUmV0ZW50aW9uRGF5czogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGEgR2x1ZSBqb2IgY29tbWFuZCBzcGVjaWZ5aW5nIHNjcmlwdCBleGVjdXRpb24gYW5kIHJ1bnRpbWUgZW52aXJvbm1lbnQuXG4gKlxuICogVXNlIGNhc2VzOiBKb2IgY29tbWFuZCBjb25maWd1cmF0aW9uOyBTY3JpcHQgZXhlY3V0aW9uOyBSdW50aW1lIGVudmlyb25tZW50OyBFVEwgam9iIHNldHVwXG4gKlxuICogQVdTOiBHbHVlIGpvYiBjb21tYW5kIGNvbmZpZ3VyYXRpb24gZm9yIHNjcmlwdCBleGVjdXRpb24gYW5kIHJ1bnRpbWUgZW52aXJvbm1lbnRcbiAqXG4gKiBWYWxpZGF0aW9uOiBuYW1lIGFuZCBzY3JpcHRMb2NhdGlvbiBhcmUgcmVxdWlyZWQ7IHB5dGhvblZlcnNpb24gaXMgb3B0aW9uYWwgd2l0aCBzcGVjaWZpYyBjb25zdHJhaW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEpvYkNvbW1hbmQge1xuICAvKiogSm9iIHR5cGU6ICdnbHVlZXRsJyBmb3IgU3BhcmsgRVRMIG9yICdweXRob25zaGVsbCcgZm9yIFB5dGhvbiBzY3JpcHRzLiAqL1xuICByZWFkb25seSBuYW1lOiBKb2JDb21tYW5kTmFtZTtcbiAgLyoqIFB5dGhvbiB2ZXJzaW9uIGZvciBqb2IgcnVudGltZSAoJzInIG9yICczJykuICovXG4gIHJlYWRvbmx5IHB5dGhvblZlcnNpb24/OiBKb2JDb21tYW5kUHl0aG9uVmVyc2lvbjtcbiAgLyoqIFJlbGF0aXZlIHBhdGggdG8gdGhlIEdsdWUgc2NyaXB0IGZvciBqb2IgZXhlY3V0aW9uLiAqL1xuICByZWFkb25seSBzY3JpcHRMb2NhdGlvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBKb2JXb3JrZXJUeXBlID0gJ1N0YW5kYXJkJyB8ICdHLjFYJyB8ICdHLjJYJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBhIEdsdWUgam9iIGluY2x1ZGluZyBleGVjdXRpb24gcm9sZXMsIGNvbW1hbmRzLCBjYXBhY2l0eSwgYW5kIG1vbml0b3JpbmcuXG4gKlxuICogVXNlIGNhc2VzOiBFVEwgam9iIGNvbmZpZ3VyYXRpb247IERhdGEgdHJhbnNmb3JtYXRpb247IEpvYiByZXNvdXJjZSBtYW5hZ2VtZW50OyBEYXRhT3BzIHByb2Nlc3NpbmdcbiAqXG4gKiBBV1M6IEdsdWUgam9iIGNvbmZpZ3VyYXRpb24gZm9yIEVUTCBwcm9jZXNzaW5nIGFuZCBkYXRhIHRyYW5zZm9ybWF0aW9uIHdvcmtmbG93c1xuICpcbiAqIFZhbGlkYXRpb246IGV4ZWN1dGlvblJvbGVBcm4sIGNvbW1hbmQsIGFuZCBkZXNjcmlwdGlvbiBhcmUgcmVxdWlyZWQ7IG90aGVyIHByb3BlcnRpZXMgYXJlIG9wdGlvbmFsIHdpdGggc3BlY2lmaWMgY29uc3RyYWludHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKb2JDb25maWcge1xuICAvKiogSUFNIHJvbGUgQVJOIGZvciBHbHVlIGpvYiBleGVjdXRpb24gcGVybWlzc2lvbnMuICovXG4gIHJlYWRvbmx5IGV4ZWN1dGlvblJvbGVBcm46IHN0cmluZztcbiAgLyoqIEpvYiBjb21tYW5kIGNvbmZpZ3VyYXRpb24gZGVmaW5pbmcgc2NyaXB0IGFuZCBydW50aW1lIGVudmlyb25tZW50LiAqL1xuICByZWFkb25seSBjb21tYW5kOiBKb2JDb21tYW5kO1xuICAvKiogVGVtcGxhdGUgbmFtZSBmb3IgY29uZmlndXJhdGlvbiBpbmhlcml0YW5jZS4gKi9cbiAgcmVhZG9ubHkgdGVtcGxhdGU/OiBzdHJpbmc7XG4gIC8qKiBOdW1iZXIgb2YgY2FwYWNpdHkgdW5pdHMgYWxsb2NhdGVkIHRvIHRoZSBqb2IuICovXG4gIHJlYWRvbmx5IGFsbG9jYXRlZENhcGFjaXR5PzogbnVtYmVyO1xuICAvKiogQ29ubmVjdGlvbiBuYW1lcyBmb3IgZGF0YWJhc2UgYW5kIGV4dGVybmFsIHN5c3RlbSBhY2Nlc3MuICovXG4gIHJlYWRvbmx5IGNvbm5lY3Rpb25zPzogc3RyaW5nW107XG4gIC8qKiBEZWZhdWx0IGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGpvYiBhdCBydW50aW1lLiAqL1xuICByZWFkb25seSBkZWZhdWx0QXJndW1lbnRzPzogQ29uZmlndXJhdGlvbkVsZW1lbnQ7XG4gIC8qKiBKb2IgZGVzY3JpcHRpb24gZm9yIGRvY3VtZW50YXRpb24gYW5kIG1hbmFnZW1lbnQuICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKiBFeGVjdXRpb24gcHJvcGVydGllcyBpbmNsdWRpbmcgbWF4aW11bSBjb25jdXJyZW50IHJ1bnMuICovXG4gIHJlYWRvbmx5IGV4ZWN1dGlvblByb3BlcnR5PzogQ2ZuSm9iLkV4ZWN1dGlvblByb3BlcnR5UHJvcGVydHk7XG4gIC8qKiBHbHVlIHJ1bnRpbWUgdmVyc2lvbiBmb3IgdGhlIGpvYi4gKi9cbiAgcmVhZG9ubHkgZ2x1ZVZlcnNpb24/OiBzdHJpbmc7XG4gIC8qKiBNYXhpbXVtIERQVSBjYXBhY2l0eSBmb3IgdGhlIGpvYi4gKi9cbiAgcmVhZG9ubHkgbWF4Q2FwYWNpdHk/OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIHJldHJ5IGNvdW50IGJlZm9yZSBqb2IgZmFpbHVyZS4gKi9cbiAgcmVhZG9ubHkgbWF4UmV0cmllcz86IG51bWJlcjtcbiAgLyoqIE5vdGlmaWNhdGlvbiBzZXR0aW5ncyBmb3Igam9iIG1vbml0b3JpbmcgYW5kIGFsZXJ0aW5nLiAqL1xuICByZWFkb25seSBub3RpZmljYXRpb25Qcm9wZXJ0eT86IENmbkpvYi5Ob3RpZmljYXRpb25Qcm9wZXJ0eVByb3BlcnR5O1xuICAvKiogTnVtYmVyIG9mIHdvcmtlcnMgZm9yIHBhcmFsbGVsIHByb2Nlc3NpbmcuICovXG4gIHJlYWRvbmx5IG51bWJlck9mV29ya2Vycz86IG51bWJlcjtcbiAgLyoqIEpvYiB0aW1lb3V0IGluIG1pbnV0ZXMuICovXG4gIHJlYWRvbmx5IHRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKiBXb3JrZXIgdHlwZTogJ1N0YW5kYXJkJywgJ0cuMVgnLCBvciAnRy4yWCcuICovXG4gIHJlYWRvbmx5IHdvcmtlclR5cGU/OiBKb2JXb3JrZXJUeXBlO1xuICAvKiogUmVsYXRpdmUgcGF0aHMgdG8gYWRkaXRpb25hbCBQeXRob24gc2NyaXB0cyBmb3IgdGhlIGpvYi4gKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbFNjcmlwdHM/OiBzdHJpbmdbXTtcbiAgLyoqIFJlbGF0aXZlIHBhdGhzIHRvIGFkZGl0aW9uYWwgSkFSIGZpbGVzIGZvciB0aGUgam9iLiAqL1xuICByZWFkb25seSBhZGRpdGlvbmFsSmFycz86IHN0cmluZ1tdO1xuICAvKiogUmVsYXRpdmUgcGF0aHMgdG8gYWRkaXRpb25hbCBmaWxlcyBmb3IgdGhlIGpvYi4gKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbEZpbGVzPzogc3RyaW5nW107XG4gIC8qKiBDb250aW51b3VzIGxvZ2dpbmcgY29uZmlndXJhdGlvbiBmb3IgcmVhbC10aW1lIG1vbml0b3JpbmcuICovXG4gIHJlYWRvbmx5IGNvbnRpbnVvdXNMb2dnaW5nPzogTG9nZ2luZ0NvbmZpZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHbHVlSm9iTDNDb25zdHJ1Y3RQcm9wcyBleHRlbmRzIE1kYWFMM0NvbnN0cnVjdFByb3BzIHtcbiAgLyoqXG4gICAqIFJvbGUgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGRlcGxveSB0aGUgSm9iIGNvZGUuIFNob3VsZCBiZSBvYnRhaW5lZCBmcm9tIHRoZSBEYXRhT3BzIFByb2plY3RcbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveW1lbnRSb2xlQXJuPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIERhdGEgT3BzIHByb2plY3QgYnVja2V0IHdoZXJlIGpvYiByZXNvdXJjZXMgd2lsbCBiZSBkZXBsb3llZCBhbmQgd2hpY2ggd2lsbCBiZSB1c2VkIGFzIGEgdGVtcG9yYXJ5IGpvYiBsb2NhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0TmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIE1hcCBvZiBqb2IgbmFtZXMgdG8gam9iIGNvbmZpZ3VyYXRpb25zXG4gICAqL1xuICByZWFkb25seSBqb2JDb25maWdzOiB7IFtrZXk6IHN0cmluZ106IEpvYkNvbmZpZyB9O1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgR2x1ZSBTZWN1cml0eSBjb25maWd1cmF0aW9uIHRvIGJlIHVzZWQgZm9yIGFsbCBqb2JzLiBMaWtlbHkgc3VwcGxpZWQgYnkgdGhlIERhdGFPcHMgUHJvamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHNlY3VyaXR5Q29uZmlndXJhdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBkYXRhb3BzIHByb2plY3QgdG8gd2hpY2ggdGhlIGpvYiB3aWxsIGJlIGFzc29jaWF0ZWQuXG4gICAqL1xuICByZWFkb25seSBwcm9qZWN0TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogTm90aWZpY2F0aW9uIHRvcGljIEFyblxuICAgKi9cbiAgcmVhZG9ubHkgbm90aWZpY2F0aW9uVG9waWNBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERhdGFvcHMgcHJvamVjdCBLTVMga2V5IEFSTi5cbiAgICovXG4gIHJlYWRvbmx5IGttc0Fybj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIEdsdWVKb2JMM0NvbnN0cnVjdCBleHRlbmRzIE1kYWFMM0NvbnN0cnVjdCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBwcm9wczogR2x1ZUpvYkwzQ29uc3RydWN0UHJvcHM7XG4gIHByaXZhdGUgcmVhZG9ubHkga21zS2V5OiBJS2V5O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBHbHVlSm9iTDNDb25zdHJ1Y3RQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcblxuICAgIGlmICghdGhpcy5wcm9wcy5kZXBsb3ltZW50Um9sZUFybikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEZXBsb3ltZW50IHJvbGUgQVJOIGlzIHJlcXVpcmVkIGZvciBqb2IgY29uZmlndXJhdGlvbicpO1xuICAgIH1cbiAgICBjb25zdCBkZXBsb3ltZW50Um9sZSA9IE1kYWFSb2xlLmZyb21Sb2xlQXJuKHRoaXMuc2NvcGUsIGBkZXBsb3ltZW50LXJvbGVgLCB0aGlzLnByb3BzLmRlcGxveW1lbnRSb2xlQXJuKTtcbiAgICBpZiAoIXRoaXMucHJvcHMuYnVja2V0TmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcm9qZWN0IGJ1Y2tldCBuYW1lIGlzIHJlcXVpcmVkIGZvciBqb2IgY29uZmlndXJhdGlvbicpO1xuICAgIH1cbiAgICBjb25zdCBidWNrZXQgPSBNZGFhQnVja2V0LmZyb21CdWNrZXROYW1lKHRoaXMuc2NvcGUsIGBwcm9qZWN0LWJ1Y2tldGAsIHRoaXMucHJvcHMuYnVja2V0TmFtZSk7XG4gICAgaWYgKCF0aGlzLnByb3BzLmttc0Fybikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcm9qZWN0IEtNUyBLZXkgaXMgcmVxdWlyZWQgZm9yIGpvYiBjb25maWd1cmF0aW9uJyk7XG4gICAgfVxuICAgIHRoaXMua21zS2V5ID0gS2V5LmZyb21LZXlBcm4odGhpcywgdGhpcy5wcm9wcy5wcm9qZWN0TmFtZSA/PyAna21zLWtleScsIHRoaXMucHJvcHMua21zQXJuKTtcblxuICAgIC8vIEJ1aWxkIG91ciBqb2JzIVxuICAgIGNvbnN0IGFsbEpvYnMgPSB0aGlzLnByb3BzLmpvYkNvbmZpZ3M7XG4gICAgT2JqZWN0LmtleXMoYWxsSm9icykuZm9yRWFjaChqb2JOYW1lID0+IHtcbiAgICAgIGNvbnN0IGpvYkNvbmZpZyA9IGFsbEpvYnNbam9iTmFtZV07XG4gICAgICB0aGlzLmNyZWF0ZUpvYihqb2JOYW1lLCBqb2JDb25maWcsIGRlcGxveW1lbnRSb2xlLCBidWNrZXQpO1xuICAgIH0pO1xuICAgIC8vQ0RLIFMzIERlcGxveW1lbnQgYXV0b21hdGljYWxseSBhZGRzIGlubGluZSBwb2xpY3kgdG8gcHJvamVjdCBkZXBsb3ltZW50IHJvbGUuXG4gICAgdGhpcy5zY29wZS5ub2RlLmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgaWYgKGNoaWxkLm5vZGUuaWQuc3RhcnRzV2l0aCgnZGVwbG95bWVudC1yb2xlJykpIHtcbiAgICAgICAgTWRhYU5hZ1N1cHByZXNzaW9ucy5hZGRDb2RlUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgW1xuICAgICAgICAgICAgeyBpZDogJ0F3c1NvbHV0aW9ucy1JQU01JywgcmVhc29uOiAnSW5saW5lIHBvbGljeSB1c2VkIG9ubHkgZm9yIGRlcGxveW1lbnQuJyB9LFxuICAgICAgICAgICAgeyBpZDogJ05JU1QuODAwLjUzLlI1LUlBTU5vSW5saW5lUG9saWN5JywgcmVhc29uOiAnUG9saWN5IHVzZWQgb25seSBmb3IgZGVwbG95bWVudC4nIH0sXG4gICAgICAgICAgICB7IGlkOiAnSElQQUEuU2VjdXJpdHktSUFNTm9JbmxpbmVQb2xpY3knLCByZWFzb246ICdQb2xpY3kgdXNlZCBvbmx5IGZvciBkZXBsb3ltZW50LicgfSxcbiAgICAgICAgICAgIHsgaWQ6ICdQQ0kuRFNTLjMyMS1JQU1Ob0lubGluZVBvbGljeScsIHJlYXNvbjogJ1BvbGljeSB1c2VkIG9ubHkgZm9yIGRlcGxveW1lbnQuJyB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZGVwbG95QWRkaXRpb25hbEZpbGVzKFxuICAgIGFkZGl0aW9uYWxGaWxlc1NvdXJjZXM6IElTb3VyY2VbXSxcbiAgICBidWNrZXQ6IElCdWNrZXQsXG4gICAgZGVwbG95bWVudFJvbGU6IElSb2xlLFxuICAgIGRlcGxveW1lbnRJZDogc3RyaW5nLFxuICAgIGRlcGxveW1lbnRQYXRoOiBzdHJpbmcsXG4gICAgZXh0cmFjdDogYm9vbGVhbixcbiAgKTogQnVja2V0RGVwbG95bWVudCB7XG4gICAgLy8gRGVwbG95IFNvdXJjZSBhc3NldChzKSB0byAvZGVwbG95bWVudC9saWJzLzxqb2I+IGxvY2F0aW9uLlxuICAgIHJldHVybiBuZXcgQnVja2V0RGVwbG95bWVudCh0aGlzLnNjb3BlLCBkZXBsb3ltZW50SWQsIHtcbiAgICAgIHNvdXJjZXM6IGFkZGl0aW9uYWxGaWxlc1NvdXJjZXMsXG4gICAgICBkZXN0aW5hdGlvbkJ1Y2tldDogYnVja2V0LFxuICAgICAgZGVzdGluYXRpb25LZXlQcmVmaXg6IGRlcGxveW1lbnRQYXRoLFxuICAgICAgcm9sZTogZGVwbG95bWVudFJvbGUsXG4gICAgICBleHRyYWN0OiBleHRyYWN0LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRBZGRpdGlvbmFsU2NyaXB0cyhcbiAgICBqb2JOYW1lOiBzdHJpbmcsXG4gICAgam9iQ29uZmlnOiBKb2JDb25maWcsXG4gICAgYnVja2V0OiBJQnVja2V0LFxuICAgIGRlcGxveW1lbnRSb2xlOiBJUm9sZSxcbiAgICBkZWZhdWx0QXJndW1lbnRzOiBDb25maWd1cmF0aW9uRWxlbWVudCxcbiAgKSB7XG4gICAgaWYgKGpvYkNvbmZpZy5hZGRpdGlvbmFsU2NyaXB0cykge1xuICAgICAgLyoqXG4gICAgICAgKiBHcm91cCBhbGwgZmlsZXMgYXQgcGFyZW50IGRpcmVjdG9yeSBsZXZlbC4gVGhpcyB3aWxsIGFsbG93IGNyZWF0aW5nIHppcCBsaWIgYXNzZXN0cyBhdCB2YXJpb3VzIGRpcmVjdG9yeSBsZXZlbHNcbiAgICAgICAqIGV4LiAnL21haW4vc2NyaXB0MS5weScgLCAnL3V0aWwvc2NyaXB0Mi5weScgLCAnL3V0aWwvc2NyaXB0My5weScgd2lsbCBjcmVhdGUgMiB6aXAgZmlsZXMgcmVwcmVzZW50aW5nICdtYWluJyBhbmQgJ3V0aWxzJ1xuICAgICAgICogICovXG4gICAgICBjb25zdCBkaXJlY3RvcnlUb0ZpbGU6IHsgW2ZpbGVQYXRoOiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XG4gICAgICBqb2JDb25maWcuYWRkaXRpb25hbFNjcmlwdHMuZm9yRWFjaChmaWxlTG9jYXRpb24gPT4ge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguZGlybmFtZShmaWxlTG9jYXRpb24udHJpbSgpKTtcbiAgICAgICAgaWYgKGZpbGVQYXRoIGluIGRpcmVjdG9yeVRvRmlsZSkge1xuICAgICAgICAgIGRpcmVjdG9yeVRvRmlsZVtmaWxlUGF0aF0ucHVzaChgISR7cGF0aC5iYXNlbmFtZShmaWxlTG9jYXRpb24udHJpbSgpKX1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkaXJlY3RvcnlUb0ZpbGVbZmlsZVBhdGhdID0gW2AhJHtwYXRoLmJhc2VuYW1lKGZpbGVMb2NhdGlvbi50cmltKCkpfWBdO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gQ3JlYXRlIFNvdXJjZSBhc3NldCBmb3IgZWFjaCBkaXJlY3RvcnlcbiAgICAgIGNvbnN0IGFkZGl0aW9uYWxGaWxlc1NvdXJjZXMgPSBPYmplY3QuZW50cmllcyhkaXJlY3RvcnlUb0ZpbGUpLm1hcCgoW2ZpbGVQYXRoLCBmaWxlTmFtZXNdKSA9PiB7XG4gICAgICAgIHJldHVybiBTb3VyY2UuYXNzZXQoZmlsZVBhdGgsIHsgZXhjbHVkZTogWycqKicsIC4uLmZpbGVOYW1lc10gfSk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRlcGxveW1lbnRQYXRoID0gYGRlcGxveW1lbnQvbGlicy8ke2pvYk5hbWV9YDtcbiAgICAgIGNvbnN0IGFkZGl0aW9uYWxGaWxlRGVwbG95bWVudCA9IHRoaXMuZGVwbG95QWRkaXRpb25hbEZpbGVzKFxuICAgICAgICBhZGRpdGlvbmFsRmlsZXNTb3VyY2VzLFxuICAgICAgICBidWNrZXQsXG4gICAgICAgIGRlcGxveW1lbnRSb2xlLFxuICAgICAgICBgam9iLWRlcGxveW1lbnQtJHtqb2JOYW1lfS1hZGRpdGlvbmFsLXNjcmlwdGAsXG4gICAgICAgIGRlcGxveW1lbnRQYXRoLFxuICAgICAgICBmYWxzZSwgLy8gR2x1ZSBleHBlY3RzIHppcCBvZiBhZGRpdGlvbmFsIHNjcmlwdHMsIGhlbmNlIGRpc2FibGluZyB0aGUgZXh0cmFjdGlvblxuICAgICAgKTtcblxuICAgICAgLy8gRXh0cmFjdCB6aXAgbmFtZShzKSBmb3IgZWFjaCBzb3VyY2UgYW5kIGNyZWF0ZSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBzMyBsb2NhdGlvbnNcbiAgICAgIGNvbnN0IGxpYnJhcnlaaXBOYW1lczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZGRpdGlvbmFsRmlsZXNTb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGxpYk5hbWUgPSBGbi5zZWxlY3QoaSwgYWRkaXRpb25hbEZpbGVEZXBsb3ltZW50Lm9iamVjdEtleXMpOyAvLyBFeHRyYWN0IGZpbGUgbmFtZSBvZiB6aXAgY29udGFpbmluZyBhZGRpdGlvbmFsIHNjcmlwdHNcbiAgICAgICAgbGlicmFyeVppcE5hbWVzLnB1c2goYHMzOi8vJHthZGRpdGlvbmFsRmlsZURlcGxveW1lbnQuZGVwbG95ZWRCdWNrZXQuYnVja2V0TmFtZX0vJHtkZXBsb3ltZW50UGF0aH0vJHtsaWJOYW1lfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgemlwIGZpbGUgbmFtZXMgdG8gZGVmYXVsdCBhcmd1bWVudHMuXG4gICAgICBpZiAoZGVmYXVsdEFyZ3VtZW50c1snLS1leHRyYS1weS1maWxlcyddKSB7XG4gICAgICAgIGRlZmF1bHRBcmd1bWVudHNbJy0tZXh0cmEtcHktZmlsZXMnXSArPSAnLCcgKyBsaWJyYXJ5WmlwTmFtZXMuam9pbignLCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmYXVsdEFyZ3VtZW50c1snLS1leHRyYS1weS1maWxlcyddID0gbGlicmFyeVppcE5hbWVzLmpvaW4oJywnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZEFkZGl0aW9uYWxKYXJzKFxuICAgIGpvYk5hbWU6IHN0cmluZyxcbiAgICBqb2JDb25maWc6IEpvYkNvbmZpZyxcbiAgICBidWNrZXQ6IElCdWNrZXQsXG4gICAgZGVwbG95bWVudFJvbGU6IElSb2xlLFxuICAgIGRlZmF1bHRBcmd1bWVudHM6IENvbmZpZ3VyYXRpb25FbGVtZW50LFxuICApIHtcbiAgICBpZiAoam9iQ29uZmlnLmFkZGl0aW9uYWxKYXJzKSB7XG4gICAgICAvLyBDcmVhdGUgU291cmNlIGFzc2V0IGZvciBlYWNoIGRpcmVjdG9yeVxuICAgICAgY29uc3QgYWRkaXRpb25hbEZpbGVzU291cmNlcyA9IGpvYkNvbmZpZy5hZGRpdGlvbmFsSmFycy5tYXAoZnVsbEZpbGVOYW1lID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmRpcm5hbWUoZnVsbEZpbGVOYW1lLnRyaW0oKSk7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShmdWxsRmlsZU5hbWUudHJpbSgpKTtcbiAgICAgICAgcmV0dXJuIFNvdXJjZS5hc3NldChmaWxlUGF0aCwgeyBleGNsdWRlOiBbJyoqJywgYCEke2ZpbGVOYW1lfWBdIH0pO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBkZXBsb3ltZW50UGF0aCA9IGBkZXBsb3ltZW50L2xpYnMvJHtqb2JOYW1lfWA7XG5cbiAgICAgIGNvbnN0IGFkZGl0aW9uYWxGaWxlRGVwbG95bWVudCA9IHRoaXMuZGVwbG95QWRkaXRpb25hbEZpbGVzKFxuICAgICAgICBhZGRpdGlvbmFsRmlsZXNTb3VyY2VzLFxuICAgICAgICBidWNrZXQsXG4gICAgICAgIGRlcGxveW1lbnRSb2xlLFxuICAgICAgICBgam9iLWRlcGxveW1lbnQtJHtqb2JOYW1lfS1hZGRpdGlvbmFsLWphcmAsXG4gICAgICAgIGRlcGxveW1lbnRQYXRoLFxuICAgICAgICB0cnVlLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgZXh0cmFKYXJOYW1lcyA9IGpvYkNvbmZpZy5hZGRpdGlvbmFsSmFycy5tYXAoZnVsbEZpbGVOYW1lID0+IHtcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBwYXRoLmJhc2VuYW1lKGZ1bGxGaWxlTmFtZS50cmltKCkpO1xuICAgICAgICByZXR1cm4gYHMzOi8vJHthZGRpdGlvbmFsRmlsZURlcGxveW1lbnQuZGVwbG95ZWRCdWNrZXQuYnVja2V0TmFtZX0vJHtkZXBsb3ltZW50UGF0aH0vJHtmaWxlTmFtZX1gO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIEFkZCBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiB6aXAgZmlsZSBuYW1lcyB0byBkZWZhdWx0IGFyZ3VtZW50cy5cbiAgICAgIGlmIChkZWZhdWx0QXJndW1lbnRzWyctLWV4dHJhLWphcnMnXSkge1xuICAgICAgICBkZWZhdWx0QXJndW1lbnRzWyctLWV4dHJhLWphcnMnXSArPSAnLCcgKyBleHRyYUphck5hbWVzLmpvaW4oJywnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlZmF1bHRBcmd1bWVudHNbJy0tZXh0cmEtamFycyddID0gZXh0cmFKYXJOYW1lcy5qb2luKCcsJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRBZGRpdGlvbmFsRmlsZXMoXG4gICAgam9iTmFtZTogc3RyaW5nLFxuICAgIGpvYkNvbmZpZzogSm9iQ29uZmlnLFxuICAgIGJ1Y2tldDogSUJ1Y2tldCxcbiAgICBkZXBsb3ltZW50Um9sZTogSVJvbGUsXG4gICAgZGVmYXVsdEFyZ3VtZW50czogQ29uZmlndXJhdGlvbkVsZW1lbnQsXG4gICkge1xuICAgIGlmIChqb2JDb25maWcuYWRkaXRpb25hbEZpbGVzKSB7XG4gICAgICAvLyBDcmVhdGUgU291cmNlIGFzc2V0IGZvciBlYWNoIGRpcmVjdG9yeVxuICAgICAgY29uc3QgYWRkaXRpb25hbEZpbGVzU291cmNlcyA9IGpvYkNvbmZpZy5hZGRpdGlvbmFsRmlsZXMubWFwKGZ1bGxGaWxlTmFtZSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5kaXJuYW1lKGZ1bGxGaWxlTmFtZS50cmltKCkpO1xuICAgICAgICBjb25zdCBmaWxlTmFtZSA9IHBhdGguYmFzZW5hbWUoZnVsbEZpbGVOYW1lLnRyaW0oKSk7XG4gICAgICAgIHJldHVybiBTb3VyY2UuYXNzZXQoZmlsZVBhdGgsIHsgZXhjbHVkZTogWycqKicsIGAhJHtmaWxlTmFtZX1gXSB9KTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGVwbG95bWVudFBhdGggPSBgZGVwbG95bWVudC9maWxlcy8ke2pvYk5hbWV9YDtcbiAgICAgIGNvbnN0IGFkZGl0aW9uYWxGaWxlRGVwbG95bWVudCA9IHRoaXMuZGVwbG95QWRkaXRpb25hbEZpbGVzKFxuICAgICAgICBhZGRpdGlvbmFsRmlsZXNTb3VyY2VzLFxuICAgICAgICBidWNrZXQsXG4gICAgICAgIGRlcGxveW1lbnRSb2xlLFxuICAgICAgICBgam9iLWRlcGxveW1lbnQtJHtqb2JOYW1lfS1hZGRpdGlvbmFsLWZpbGVgLFxuICAgICAgICBkZXBsb3ltZW50UGF0aCxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICk7XG4gICAgICBjb25zdCBleHRyYUZpbGVOYW1lcyA9IGpvYkNvbmZpZy5hZGRpdGlvbmFsRmlsZXMubWFwKGZ1bGxGaWxlTmFtZSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShmdWxsRmlsZU5hbWUudHJpbSgpKTtcbiAgICAgICAgcmV0dXJuIGBzMzovLyR7YWRkaXRpb25hbEZpbGVEZXBsb3ltZW50LmRlcGxveWVkQnVja2V0LmJ1Y2tldE5hbWV9LyR7ZGVwbG95bWVudFBhdGh9LyR7ZmlsZU5hbWV9YDtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBZGQgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgemlwIGZpbGUgbmFtZXMgdG8gZGVmYXVsdCBhcmd1bWVudHMuXG4gICAgICBpZiAoZGVmYXVsdEFyZ3VtZW50c1snLS1leHRyYS1maWxlcyddKSB7XG4gICAgICAgIGRlZmF1bHRBcmd1bWVudHNbJy0tZXh0cmEtZmlsZXMnXSArPSAnLCcgKyBleHRyYUZpbGVOYW1lcy5qb2luKCcsJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZhdWx0QXJndW1lbnRzWyctLWV4dHJhLWZpbGVzJ10gPSBleHRyYUZpbGVOYW1lcy5qb2luKCcsJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVKb2Ioam9iTmFtZTogc3RyaW5nLCBqb2JDb25maWc6IEpvYkNvbmZpZywgZGVwbG95bWVudFJvbGU6IElSb2xlLCBidWNrZXQ6IElCdWNrZXQpIHtcbiAgICBjb25zdCBkZWZhdWx0QXJndW1lbnRzID0gam9iQ29uZmlnLmRlZmF1bHRBcmd1bWVudHMgPyBqb2JDb25maWcuZGVmYXVsdEFyZ3VtZW50cyA6IHt9O1xuICAgIGNvbnN0IHNjcmlwdFBhdGggPSBwYXRoLmRpcm5hbWUoam9iQ29uZmlnLmNvbW1hbmQuc2NyaXB0TG9jYXRpb24udHJpbSgpKTtcbiAgICBjb25zdCBzY3JpcHROYW1lID0gcGF0aC5iYXNlbmFtZShqb2JDb25maWcuY29tbWFuZC5zY3JpcHRMb2NhdGlvbi50cmltKCkpO1xuICAgIGNvbnN0IHNjcmlwdFNvdXJjZSA9IFNvdXJjZS5hc3NldChzY3JpcHRQYXRoLCB7IGV4Y2x1ZGU6IFsnKionLCBgISR7c2NyaXB0TmFtZX1gXSB9KTtcblxuICAgIGNvbnN0IHNjcmlwdERlcGxveW1lbnRQYXRoID0gYGRlcGxveW1lbnQvam9icy8ke2pvYk5hbWV9YDtcbiAgICBjb25zdCBzY3JpcHREZXBsb3ltZW50ID0gbmV3IEJ1Y2tldERlcGxveW1lbnQodGhpcy5zY29wZSwgYGpvYi1kZXBsb3ltZW50LSR7am9iTmFtZX1gLCB7XG4gICAgICBzb3VyY2VzOiBbc2NyaXB0U291cmNlXSxcbiAgICAgIGRlc3RpbmF0aW9uQnVja2V0OiBidWNrZXQsXG4gICAgICBkZXN0aW5hdGlvbktleVByZWZpeDogc2NyaXB0RGVwbG95bWVudFBhdGgsXG4gICAgICByb2xlOiBkZXBsb3ltZW50Um9sZSxcbiAgICAgIGV4dHJhY3Q6IHRydWUsXG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZEFkZGl0aW9uYWxTY3JpcHRzKGpvYk5hbWUsIGpvYkNvbmZpZywgYnVja2V0LCBkZXBsb3ltZW50Um9sZSwgZGVmYXVsdEFyZ3VtZW50cyk7XG4gICAgdGhpcy5hZGRBZGRpdGlvbmFsSmFycyhqb2JOYW1lLCBqb2JDb25maWcsIGJ1Y2tldCwgZGVwbG95bWVudFJvbGUsIGRlZmF1bHRBcmd1bWVudHMpO1xuICAgIHRoaXMuYWRkQWRkaXRpb25hbEZpbGVzKGpvYk5hbWUsIGpvYkNvbmZpZywgYnVja2V0LCBkZXBsb3ltZW50Um9sZSwgZGVmYXVsdEFyZ3VtZW50cyk7XG4gICAgTWRhYU5hZ1N1cHByZXNzaW9ucy5hZGRDb2RlUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gICAgICB0aGlzLnNjb3BlLFxuICAgICAgW1xuICAgICAgICB7IGlkOiAnQXdzU29sdXRpb25zLUwxJywgcmVhc29uOiAnRnVuY3Rpb24gaXMgdXNlZCBvbmx5IGFzIGN1c3RvbSByZXNvdXJjZSBkdXJpbmcgQ0RLIGRlcGxveW1lbnQuJyB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdOSVNULjgwMC41My5SNS1MYW1iZGFDb25jdXJyZW5jeScsXG4gICAgICAgICAgcmVhc29uOiAnRnVuY3Rpb24gaXMgdXNlZCBvbmx5IGFzIGN1c3RvbSByZXNvdXJjZSBkdXJpbmcgQ0RLIGRlcGxveW1lbnQuJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnTklTVC44MDAuNTMuUjUtTGFtYmRhSW5zaWRlVlBDJyxcbiAgICAgICAgICByZWFzb246ICdGdW5jdGlvbiBpcyB1c2VkIG9ubHkgYXMgY3VzdG9tIHJlc291cmNlIGR1cmluZyBDREsgZGVwbG95bWVudCBhbmQgaW50ZXJhY3RzIG9ubHkgd2l0aCBTMy4nLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdOSVNULjgwMC41My5SNS1MYW1iZGFETFEnLFxuICAgICAgICAgIHJlYXNvbjpcbiAgICAgICAgICAgICdGdW5jdGlvbiBpcyB1c2VkIG9ubHkgYXMgY3VzdG9tIHJlc291cmNlIGR1cmluZyBDREsgZGVwbG95bWVudC4gRXJyb3JzIHdpbGwgYmUgaGFuZGxlZCBieSBDbG91ZEZvcm1hdGlvbi4nLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdISVBBQS5TZWN1cml0eS1MYW1iZGFDb25jdXJyZW5jeScsXG4gICAgICAgICAgcmVhc29uOiAnRnVuY3Rpb24gaXMgdXNlZCBvbmx5IGFzIGN1c3RvbSByZXNvdXJjZSBkdXJpbmcgQ0RLIGRlcGxveW1lbnQuJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnUENJLkRTUy4zMjEtTGFtYmRhQ29uY3VycmVuY3knLFxuICAgICAgICAgIHJlYXNvbjogJ0Z1bmN0aW9uIGlzIHVzZWQgb25seSBhcyBjdXN0b20gcmVzb3VyY2UgZHVyaW5nIENESyBkZXBsb3ltZW50LicsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ0hJUEFBLlNlY3VyaXR5LUxhbWJkYUluc2lkZVZQQycsXG4gICAgICAgICAgcmVhc29uOiAnRnVuY3Rpb24gaXMgdXNlZCBvbmx5IGFzIGN1c3RvbSByZXNvdXJjZSBkdXJpbmcgQ0RLIGRlcGxveW1lbnQgYW5kIGludGVyYWN0cyBvbmx5IHdpdGggUzMuJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnUENJLkRTUy4zMjEtTGFtYmRhSW5zaWRlVlBDJyxcbiAgICAgICAgICByZWFzb246ICdGdW5jdGlvbiBpcyB1c2VkIG9ubHkgYXMgY3VzdG9tIHJlc291cmNlIGR1cmluZyBDREsgZGVwbG95bWVudCBhbmQgaW50ZXJhY3RzIG9ubHkgd2l0aCBTMy4nLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdISVBBQS5TZWN1cml0eS1MYW1iZGFETFEnLFxuICAgICAgICAgIHJlYXNvbjpcbiAgICAgICAgICAgICdGdW5jdGlvbiBpcyB1c2VkIG9ubHkgYXMgY3VzdG9tIHJlc291cmNlIGR1cmluZyBDREsgZGVwbG95bWVudC4gRXJyb3JzIHdpbGwgYmUgaGFuZGxlZCBieSBDbG91ZEZvcm1hdGlvbi4nLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdQQ0kuRFNTLjMyMS1MYW1iZGFETFEnLFxuICAgICAgICAgIHJlYXNvbjpcbiAgICAgICAgICAgICdGdW5jdGlvbiBpcyB1c2VkIG9ubHkgYXMgY3VzdG9tIHJlc291cmNlIGR1cmluZyBDREsgZGVwbG95bWVudC4gRXJyb3JzIHdpbGwgYmUgaGFuZGxlZCBieSBDbG91ZEZvcm1hdGlvbi4nLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHRydWUsXG4gICAgKTtcbiAgICAvLyBDb25uZWN0aW9ucyB3aWxsIHJlcXVpcmUgYW4gYXJyYXkgb2YgcmVmZXJlbmNlcyB3aGVyZSB0aGV5IGFyZSBkZWZpbmVkXG4gICAgbGV0IGNvbm5lY3Rpb25zQ29uZmlndXJlZDogQ29uZmlndXJhdGlvbkVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGpvYkNvbmZpZy5jb25uZWN0aW9ucykge1xuICAgICAgY29ubmVjdGlvbnNDb25maWd1cmVkID0ge1xuICAgICAgICBjb25uZWN0aW9uczogam9iQ29uZmlnLmNvbm5lY3Rpb25zLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBkZWZhdWx0QXJndW1lbnRzWyctLVRlbXBEaXInXSA9IGBzMzovLyR7dGhpcy5wcm9wcy5idWNrZXROYW1lfS90ZW1wL2pvYnMvJHtqb2JOYW1lfWA7XG5cbiAgICAvLyBhZGQgY29udGludW91cyBsb2dnaW5nIHVubGVzcyBleHBsaWNpdGx5IGRpc2FibGVkXG4gICAgaWYgKGpvYkNvbmZpZy5jb250aW51b3VzTG9nZ2luZykge1xuICAgICAgY29uc3QgbG9nR3JvdXBOYW1lID0gam9iTmFtZTtcbiAgICAgIGNvbnN0IGxvZ0dyb3VwTmFtZVBhdGhQcmVmaXggPSAnL2F3cy9nbHVlJztcbiAgICAgIGRlZmF1bHRBcmd1bWVudHNbJy0tY29udGludW91cy1sb2ctbG9nR3JvdXAnXSA9IHRoaXMuY3JlYXRlTG9nR3JvdXAoXG4gICAgICAgIGxvZ0dyb3VwTmFtZVBhdGhQcmVmaXgsXG4gICAgICAgIGxvZ0dyb3VwTmFtZSxcbiAgICAgICAgam9iQ29uZmlnLmNvbnRpbnVvdXNMb2dnaW5nLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coYENvbnRpbnVvdXMgbG9nZ2luZyBub3QgZW5hYmxlZCBmb3Igam9iOiAke2pvYk5hbWV9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5wdXRQYXJhbXMgPSBkZWZhdWx0QXJndW1lbnRzWyctLWlucHV0X3BhcmFtcyddO1xuICAgIGlmIChpbnB1dFBhcmFtcykge1xuICAgICAgZGVmYXVsdEFyZ3VtZW50c1snLS1pbnB1dF9wYXJhbXMnXSA9IEpTT04uc3RyaW5naWZ5KGlucHV0UGFyYW1zKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnByb3BzLnNlY3VyaXR5Q29uZmlndXJhdGlvbk5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2VjdXJpdHkgY29uZmlndXJhdGlvbiBuYW1lIGlzIHJlcXVpcmVkIGZvciBqb2IgbW9uaXRvcmluZyBldmVudCBydWxlJyk7XG4gICAgfVxuICAgIGNvbnN0IGpvYiA9IG5ldyBNZGFhQ2ZuSm9iKHRoaXMuc2NvcGUsIGAke2pvYk5hbWV9LWpvYmAsIHtcbiAgICAgIGNvbW1hbmQ6IHtcbiAgICAgICAgbmFtZTogam9iQ29uZmlnLmNvbW1hbmQubmFtZSxcbiAgICAgICAgcHl0aG9uVmVyc2lvbjogam9iQ29uZmlnLmNvbW1hbmQucHl0aG9uVmVyc2lvbixcbiAgICAgICAgc2NyaXB0TG9jYXRpb246IGBzMzovLyR7c2NyaXB0RGVwbG95bWVudC5kZXBsb3llZEJ1Y2tldC5idWNrZXROYW1lfS8ke3NjcmlwdERlcGxveW1lbnRQYXRofS8ke3NjcmlwdE5hbWV9YCxcbiAgICAgIH0sXG4gICAgICByb2xlOiBqb2JDb25maWcuZXhlY3V0aW9uUm9sZUFybixcbiAgICAgIGFsbG9jYXRlZENhcGFjaXR5OiBqb2JDb25maWcuYWxsb2NhdGVkQ2FwYWNpdHksXG4gICAgICBjb25uZWN0aW9uczogY29ubmVjdGlvbnNDb25maWd1cmVkLFxuICAgICAgZGVmYXVsdEFyZ3VtZW50czogZGVmYXVsdEFyZ3VtZW50cyxcbiAgICAgIGRlc2NyaXB0aW9uOiBqb2JDb25maWcuZGVzY3JpcHRpb24sXG4gICAgICBleGVjdXRpb25Qcm9wZXJ0eTogam9iQ29uZmlnLmV4ZWN1dGlvblByb3BlcnR5LFxuICAgICAgZ2x1ZVZlcnNpb246IGpvYkNvbmZpZy5nbHVlVmVyc2lvbixcbiAgICAgIG1heENhcGFjaXR5OiBqb2JDb25maWcubWF4Q2FwYWNpdHksXG4gICAgICBtYXhSZXRyaWVzOiBqb2JDb25maWcubWF4UmV0cmllcyxcbiAgICAgIG5hbWU6IGpvYk5hbWUsXG4gICAgICBub3RpZmljYXRpb25Qcm9wZXJ0eTogam9iQ29uZmlnLm5vdGlmaWNhdGlvblByb3BlcnR5LFxuICAgICAgbnVtYmVyT2ZXb3JrZXJzOiBqb2JDb25maWcubnVtYmVyT2ZXb3JrZXJzLFxuICAgICAgc2VjdXJpdHlDb25maWd1cmF0aW9uOiB0aGlzLnByb3BzLnNlY3VyaXR5Q29uZmlndXJhdGlvbk5hbWUsXG4gICAgICB0aW1lb3V0OiBqb2JDb25maWcudGltZW91dCxcbiAgICAgIHdvcmtlclR5cGU6IGpvYkNvbmZpZy53b3JrZXJUeXBlLFxuICAgICAgbmFtaW5nOiB0aGlzLnByb3BzLm5hbWluZyxcbiAgICB9KTtcbiAgICBpZiAoam9iLm5hbWUgJiYgdGhpcy5wcm9wcy5wcm9qZWN0TmFtZSkge1xuICAgICAgRGF0YU9wc1Byb2plY3RVdGlscy5jcmVhdGVQcm9qZWN0U1NNUGFyYW0oXG4gICAgICAgIHRoaXMuc2NvcGUsXG4gICAgICAgIHRoaXMucHJvcHMubmFtaW5nLFxuICAgICAgICB0aGlzLnByb3BzLnByb2plY3ROYW1lLFxuICAgICAgICBgam9iL25hbWUvJHtqb2JOYW1lfWAsXG4gICAgICAgIGpvYi5uYW1lLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgZXZlbnRSdWxlID0gdGhpcy5jcmVhdGVKb2JNb25pdG9yaW5nRXZlbnRSdWxlKGAke2pvYk5hbWV9LW1vbml0b3JgLCBbam9iLm5hbWVdKTtcbiAgICAgIGlmICghdGhpcy5wcm9wcy5ub3RpZmljYXRpb25Ub3BpY0Fybikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdGlmaWNhdGlvbiB0b3BpYyBBUk4gaXMgcmVxdWlyZWQgZm9yIGpvYiBtb25pdG9yaW5nIGV2ZW50IHJ1bGUnKTtcbiAgICAgIH1cbiAgICAgIGV2ZW50UnVsZS5hZGRUYXJnZXQoXG4gICAgICAgIG5ldyBTbnNUb3BpYyhNZGFhU25zVG9waWMuZnJvbVRvcGljQXJuKHRoaXMuc2NvcGUsIGAke2pvYk5hbWV9LXRvcGljYCwgdGhpcy5wcm9wcy5ub3RpZmljYXRpb25Ub3BpY0FybikpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUpvYk1vbml0b3JpbmdFdmVudFJ1bGUocnVsZU5hbWU6IHN0cmluZywgam9iTmFtZXM6IHN0cmluZ1tdKTogUnVsZSB7XG4gICAgcmV0dXJuIEV2ZW50QnJpZGdlSGVscGVyLmNyZWF0ZUdsdWVNb25pdG9yaW5nRXZlbnRSdWxlKFxuICAgICAgdGhpcy5zY29wZSxcbiAgICAgIHRoaXMucHJvcHMubmFtaW5nLFxuICAgICAgcnVsZU5hbWUsXG4gICAgICAnV29ya2Zsb3cgSm9iIGZhaWx1cmUgZXZlbnRzJyxcbiAgICAgIHtcbiAgICAgICAgam9iTmFtZTogam9iTmFtZXMsXG4gICAgICAgIHN0YXRlOiBbJ0ZBSUxFRCcsICdUSU1FT1VUJywgJ1NUT1BQRUQnXSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTG9nR3JvdXAobG9nR3JvdXBOYW1lUGF0aFByZWZpeDogc3RyaW5nLCBsb2dHcm91cE5hbWU6IHN0cmluZywgbG9nZ2luZ0NvbmZpZzogTG9nZ2luZ0NvbmZpZyk6IHN0cmluZyB7XG4gICAgbGV0IGxvZ0dyb3VwUmV0ZW50aW9uRGF5czogUmV0ZW50aW9uRGF5cztcblxuICAgIGlmIChsb2dnaW5nQ29uZmlnLmxvZ0dyb3VwUmV0ZW50aW9uRGF5cyAhPSAwKSB7XG4gICAgICBsb2dHcm91cFJldGVudGlvbkRheXMgPSBsb2dnaW5nQ29uZmlnLmxvZ0dyb3VwUmV0ZW50aW9uRGF5cztcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nR3JvdXBSZXRlbnRpb25EYXlzID0gUmV0ZW50aW9uRGF5cy5JTkZJTklURTtcbiAgICB9XG5cbiAgICBjb25zdCBsb2dQcm9wcyA9IHtcbiAgICAgIG5hbWluZzogdGhpcy5wcm9wcy5uYW1pbmcsXG4gICAgICBsb2dHcm91cE5hbWU6IGxvZ0dyb3VwTmFtZSxcbiAgICAgIGxvZ0dyb3VwTmFtZVBhdGhQcmVmaXg6IGxvZ0dyb3VwTmFtZVBhdGhQcmVmaXgsXG4gICAgICBlbmNyeXB0aW9uS2V5OiB0aGlzLmttc0tleSxcbiAgICAgIHJldGVudGlvbjogbG9nR3JvdXBSZXRlbnRpb25EYXlzLFxuICAgIH07XG4gICAgbmV3IE1kYWFMb2dHcm91cCh0aGlzLCBsb2dHcm91cE5hbWUsIGxvZ1Byb3BzKTtcbiAgICAvLyBgdXBkYXRlUHJvcHNgIGFsd2F5cyByZXR1cm5zIGEgcHJvcCB3aXRoIGEgbG9nR3JvdXBOYW1lXG4gICAgcmV0dXJuIHVwZGF0ZVByb3BzKGxvZ1Byb3BzKS5sb2dHcm91cE5hbWUhO1xuICB9XG59XG4iXX0=
319
+ GlueJobL3Construct[_a] = { fqn: "@aws-mdaa/dataops-job-l3-construct.GlueJobL3Construct", version: "1.6.0" };
320
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YW9wcy1qb2ItbDMtY29uc3RydWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGF0YW9wcy1qb2ItbDMtY29uc3RydWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7OztHQUdHO0FBRUgseUZBQTZFO0FBQzdFLHFFQUFpRTtBQUNqRSwrREFBdUQ7QUFDdkQsNkRBQW9EO0FBQ3BELDJEQUFxRDtBQUNyRCx5REFBK0U7QUFFL0UscUVBQWtGO0FBQ2xGLG1EQUEwRCxDQUFDLFNBQVM7QUFFcEUsNkJBQTZCO0FBQzdCLHVFQUEwRDtBQUMxRCw2REFBd0Q7QUFFeEQsNkNBQWlDO0FBRWpDLG1EQUFxRDtBQUNyRCwyRUFBK0Q7QUFDL0QsaURBQWdEO0FBQ2hELHVGQUFpRjtBQW1JakYsTUFBYSxrQkFBbUIsU0FBUSw4QkFBZTtJQUlyRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQThCO1FBQ3RFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBRW5CLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO1FBQzNFLENBQUM7UUFDRCxNQUFNLGNBQWMsR0FBRyx5QkFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN6RyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7UUFDM0UsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLDBCQUFVLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVB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akIsS0FBSyxFQUFFLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUM7U0FDeEMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLGNBQWMsQ0FBQyxzQkFBOEIsRUFBRSxZQUFvQixFQUFFLGFBQTRCO1FBQ3ZHLElBQUkscUJBQW9DLENBQUM7UUFFekMsSUFBSSxhQUFhLENBQUMscUJBQXFCLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDN0MscUJBQXFCLEdBQUcsYUFBYSxDQUFDLHFCQUFxQixDQUFDO1FBQzlELENBQUM7YUFBTSxDQUFDO1lBQ04scUJBQXFCLEdBQUcsd0JBQWEsQ0FBQyxRQUFRLENBQUM7UUFDakQsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHO1lBQ2YsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTTtZQUN6QixZQUFZLEVBQUUsWUFBWTtZQUMxQixzQkFBc0IsRUFBRSxzQkFBc0I7WUFDOUMsYUFBYSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQzFCLFNBQVMsRUFBRSxxQkFBcUI7U0FDakMsQ0FBQztRQUNGLElBQUksb0NBQVksQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLDBEQUEwRDtRQUMxRCxPQUFPLElBQUEsNEJBQVcsRUFBQyxRQUFRLENBQUMsQ0FBQyxZQUFhLENBQUM7SUFDN0MsQ0FBQzs7QUExWUgsZ0RBMllDIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cblxuaW1wb3J0IHsgRGF0YU9wc1Byb2plY3RVdGlscyB9IGZyb20gJ0Bhd3MtbWRhYS9kYXRhb3BzLXByb2plY3QtbDMtY29uc3RydWN0JztcbmltcG9ydCB7IEV2ZW50QnJpZGdlSGVscGVyIH0gZnJvbSAnQGF3cy1tZGFhL2V2ZW50YnJpZGdlLWhlbHBlcic7XG5pbXBvcnQgeyBNZGFhQ2ZuSm9iIH0gZnJvbSAnQGF3cy1tZGFhL2dsdWUtY29uc3RydWN0cyc7XG5pbXBvcnQgeyBNZGFhUm9sZSB9IGZyb20gJ0Bhd3MtbWRhYS9pYW0tY29uc3RydWN0cyc7XG5pbXBvcnQgeyBNZGFhQnVja2V0IH0gZnJvbSAnQGF3cy1tZGFhL3MzLWNvbnN0cnVjdHMnO1xuaW1wb3J0IHsgTWRhYUwzQ29uc3RydWN0LCBNZGFhTDNDb25zdHJ1Y3RQcm9wcyB9IGZyb20gJ0Bhd3MtbWRhYS9sMy1jb25zdHJ1Y3QnO1xuaW1wb3J0IHsgQ2ZuSm9iIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWdsdWUnO1xuaW1wb3J0IHsgQnVja2V0RGVwbG95bWVudCwgSVNvdXJjZSwgU291cmNlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzLWRlcGxveW1lbnQnO1xuaW1wb3J0IHsgTWRhYU5hZ1N1cHByZXNzaW9ucyB9IGZyb20gJ0Bhd3MtbWRhYS9jb25zdHJ1Y3QnOyAvL05PU09OQVJcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFNuc1RvcGljIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzJztcbmltcG9ydCB7IE1kYWFTbnNUb3BpYyB9IGZyb20gJ0Bhd3MtbWRhYS9zbnMtY29uc3RydWN0cyc7XG5pbXBvcnQgeyBSdWxlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cyc7XG5pbXBvcnQgeyBGbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FbGVtZW50IH0gZnJvbSAnQGF3cy1tZGFhL2NvbmZpZyc7XG5pbXBvcnQgeyBSZXRlbnRpb25EYXlzIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xuaW1wb3J0IHsgTWRhYUxvZ0dyb3VwIH0gZnJvbSAnQGF3cy1tZGFhL2Nsb3Vkd2F0Y2gtY29uc3RydWN0cyc7XG5pbXBvcnQgeyBJS2V5LCBLZXkgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCB7IHVwZGF0ZVByb3BzIH0gZnJvbSAnQGF3cy1tZGFhL2Nsb3Vkd2F0Y2gtY29uc3RydWN0cy9saWIvbG9nZ3JvdXAtdXRpbHMnO1xuaW1wb3J0IHsgSUJ1Y2tldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBJUm9sZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuXG5leHBvcnQgdHlwZSBKb2JDb21tYW5kUHl0aG9uVmVyc2lvbiA9ICcyJyB8ICczJyB8IHVuZGVmaW5lZDtcbmV4cG9ydCB0eXBlIEpvYkNvbW1hbmROYW1lID0gJ2dsdWVldGwnIHwgJ3B5dGhvbnNoZWxsJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBHbHVlIGpvYiBsb2dnaW5nIHdpdGggQ2xvdWRXYXRjaCBsb2cgcmV0ZW50aW9uIG1hbmFnZW1lbnQuXG4gKlxuICogVXNlIGNhc2VzOiBMb2cgcmV0ZW50aW9uIG1hbmFnZW1lbnQ7IENvbXBsaWFuY2UgcmVxdWlyZW1lbnRzOyBDb3N0IG9wdGltaXphdGlvbjsgQXVkaXQgdHJhaWwgbWFuYWdlbWVudFxuICpcbiAqIEFXUzogQ2xvdWRXYXRjaCBsb2cgZ3JvdXAgcmV0ZW50aW9uIGZvciBHbHVlIGpvYiBleGVjdXRpb24gbG9ncyBhbmQgbW9uaXRvcmluZ1xuICpcbiAqIFZhbGlkYXRpb246IGxvZ0dyb3VwUmV0ZW50aW9uRGF5cyBpcyByZXF1aXJlZCB3aXRoIHNwZWNpZmljIGFsbG93ZWQgdmFsdWVzIGZvciByZXRlbnRpb24gcGVyaW9kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9nZ2luZ0NvbmZpZyB7XG4gIC8qKiBDbG91ZFdhdGNoIGxvZyBncm91cCByZXRlbnRpb24gaW4gZGF5cy4gQWxsb3dlZDogMSwzLDUsNywxNCwzMCw2MCw5MCwxMjAsMTUwLDE4MCwzNjUsNDAwLDU0NSw3MzEsMTgyNywzNjUzLCBvciAwLiAqL1xuICByZWFkb25seSBsb2dHcm91cFJldGVudGlvbkRheXM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBhIEdsdWUgam9iIGNvbW1hbmQgc3BlY2lmeWluZyBzY3JpcHQgZXhlY3V0aW9uIGFuZCBydW50aW1lIGVudmlyb25tZW50LlxuICpcbiAqIFVzZSBjYXNlczogSm9iIGNvbW1hbmQgY29uZmlndXJhdGlvbjsgU2NyaXB0IGV4ZWN1dGlvbjsgUnVudGltZSBlbnZpcm9ubWVudDsgRVRMIGpvYiBzZXR1cFxuICpcbiAqIEFXUzogR2x1ZSBqb2IgY29tbWFuZCBjb25maWd1cmF0aW9uIGZvciBzY3JpcHQgZXhlY3V0aW9uIGFuZCBydW50aW1lIGVudmlyb25tZW50XG4gKlxuICogVmFsaWRhdGlvbjogbmFtZSBhbmQgc2NyaXB0TG9jYXRpb24gYXJlIHJlcXVpcmVkOyBweXRob25WZXJzaW9uIGlzIG9wdGlvbmFsIHdpdGggc3BlY2lmaWMgY29uc3RyYWludHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKb2JDb21tYW5kIHtcbiAgLyoqIEpvYiB0eXBlOiAnZ2x1ZWV0bCcgZm9yIFNwYXJrIEVUTCBvciAncHl0aG9uc2hlbGwnIGZvciBQeXRob24gc2NyaXB0cy4gKi9cbiAgcmVhZG9ubHkgbmFtZTogSm9iQ29tbWFuZE5hbWU7XG4gIC8qKiBQeXRob24gdmVyc2lvbiBmb3Igam9iIHJ1bnRpbWUgKCcyJyBvciAnMycpLiAqL1xuICByZWFkb25seSBweXRob25WZXJzaW9uPzogSm9iQ29tbWFuZFB5dGhvblZlcnNpb247XG4gIC8qKiBSZWxhdGl2ZSBwYXRoIHRvIHRoZSBHbHVlIHNjcmlwdCBmb3Igam9iIGV4ZWN1dGlvbiwgb3IgYGFzc2V0OjxmaWxlbmFtZT5gIHRvIHVzZSBhIHByZS1idWlsdCBzY3JpcHQgZnJvbSB0aGUgYXBwJ3MgYXNzZXRzIGRpcmVjdG9yeS4gQXZhaWxhYmxlIGFzc2V0czogZHEtbWFpbi5weSAoRFEgZXZhbHVhdGlvbiwgd2l0aCB1dGlscy8gYXMgYWRkaXRpb25hbFNjcmlwdHMpLiAqL1xuICByZWFkb25seSBzY3JpcHRMb2NhdGlvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBKb2JXb3JrZXJUeXBlID0gJ1N0YW5kYXJkJyB8ICdHLjFYJyB8ICdHLjJYJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBhIEdsdWUgam9iIGluY2x1ZGluZyBleGVjdXRpb24gcm9sZXMsIGNvbW1hbmRzLCBjYXBhY2l0eSwgYW5kIG1vbml0b3JpbmcuXG4gKlxuICogVXNlIGNhc2VzOiBFVEwgam9iIGNvbmZpZ3VyYXRpb247IERhdGEgdHJhbnNmb3JtYXRpb247IEpvYiByZXNvdXJjZSBtYW5hZ2VtZW50OyBEYXRhT3BzIHByb2Nlc3NpbmdcbiAqXG4gKiBBV1M6IEdsdWUgam9iIGNvbmZpZ3VyYXRpb24gZm9yIEVUTCBwcm9jZXNzaW5nIGFuZCBkYXRhIHRyYW5zZm9ybWF0aW9uIHdvcmtmbG93c1xuICpcbiAqIFZhbGlkYXRpb246IGV4ZWN1dGlvblJvbGVBcm4sIGNvbW1hbmQsIGFuZCBkZXNjcmlwdGlvbiBhcmUgcmVxdWlyZWQ7IG90aGVyIHByb3BlcnRpZXMgYXJlIG9wdGlvbmFsIHdpdGggc3BlY2lmaWMgY29uc3RyYWludHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKb2JDb25maWcge1xuICAvKiogSUFNIHJvbGUgQVJOIGZvciBHbHVlIGpvYiBleGVjdXRpb24gcGVybWlzc2lvbnMuICovXG4gIHJlYWRvbmx5IGV4ZWN1dGlvblJvbGVBcm46IHN0cmluZztcbiAgLyoqIEpvYiBjb21tYW5kIGNvbmZpZ3VyYXRpb24gZGVmaW5pbmcgc2NyaXB0IGFuZCBydW50aW1lIGVudmlyb25tZW50LiAqL1xuICByZWFkb25seSBjb21tYW5kOiBKb2JDb21tYW5kO1xuICAvKiogVGVtcGxhdGUgbmFtZSBmb3IgY29uZmlndXJhdGlvbiBpbmhlcml0YW5jZS4gKi9cbiAgcmVhZG9ubHkgdGVtcGxhdGU/OiBzdHJpbmc7XG4gIC8qKiBOdW1iZXIgb2YgY2FwYWNpdHkgdW5pdHMgYWxsb2NhdGVkIHRvIHRoZSBqb2IuICovXG4gIHJlYWRvbmx5IGFsbG9jYXRlZENhcGFjaXR5PzogbnVtYmVyO1xuICAvKiogQ29ubmVjdGlvbiBuYW1lcyBmb3IgZGF0YWJhc2UgYW5kIGV4dGVybmFsIHN5c3RlbSBhY2Nlc3MuICovXG4gIHJlYWRvbmx5IGNvbm5lY3Rpb25zPzogc3RyaW5nW107XG4gIC8qKiBEZWZhdWx0IGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGpvYiBhdCBydW50aW1lLiAqL1xuICByZWFkb25seSBkZWZhdWx0QXJndW1lbnRzPzogQ29uZmlndXJhdGlvbkVsZW1lbnQ7XG4gIC8qKiBKb2IgZGVzY3JpcHRpb24gZm9yIGRvY3VtZW50YXRpb24gYW5kIG1hbmFnZW1lbnQuICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKiBFeGVjdXRpb24gcHJvcGVydGllcyBpbmNsdWRpbmcgbWF4aW11bSBjb25jdXJyZW50IHJ1bnMuICovXG4gIHJlYWRvbmx5IGV4ZWN1dGlvblByb3BlcnR5PzogQ2ZuSm9iLkV4ZWN1dGlvblByb3BlcnR5UHJvcGVydHk7XG4gIC8qKiBHbHVlIHJ1bnRpbWUgdmVyc2lvbiBmb3IgdGhlIGpvYi4gKi9cbiAgcmVhZG9ubHkgZ2x1ZVZlcnNpb24/OiBzdHJpbmc7XG4gIC8qKiBNYXhpbXVtIERQVSBjYXBhY2l0eSBmb3IgdGhlIGpvYi4gKi9cbiAgcmVhZG9ubHkgbWF4Q2FwYWNpdHk/OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIHJldHJ5IGNvdW50IGJlZm9yZSBqb2IgZmFpbHVyZS4gKi9cbiAgcmVhZG9ubHkgbWF4UmV0cmllcz86IG51bWJlcjtcbiAgLyoqIE5vdGlmaWNhdGlvbiBzZXR0aW5ncyBmb3Igam9iIG1vbml0b3JpbmcgYW5kIGFsZXJ0aW5nLiAqL1xuICByZWFkb25seSBub3RpZmljYXRpb25Qcm9wZXJ0eT86IENmbkpvYi5Ob3RpZmljYXRpb25Qcm9wZXJ0eVByb3BlcnR5O1xuICAvKiogTnVtYmVyIG9mIHdvcmtlcnMgZm9yIHBhcmFsbGVsIHByb2Nlc3NpbmcuICovXG4gIHJlYWRvbmx5IG51bWJlck9mV29ya2Vycz86IG51bWJlcjtcbiAgLyoqIEpvYiB0aW1lb3V0IGluIG1pbnV0ZXMuICovXG4gIHJlYWRvbmx5IHRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKiBXb3JrZXIgdHlwZTogJ1N0YW5kYXJkJywgJ0cuMVgnLCBvciAnRy4yWCcuICovXG4gIHJlYWRvbmx5IHdvcmtlclR5cGU/OiBKb2JXb3JrZXJUeXBlO1xuICAvKiogUmVsYXRpdmUgcGF0aHMgdG8gYWRkaXRpb25hbCBQeXRob24gc2NyaXB0cyBmb3IgdGhlIGpvYi4gKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbFNjcmlwdHM/OiBzdHJpbmdbXTtcbiAgLyoqIFJlbGF0aXZlIHBhdGhzIHRvIGFkZGl0aW9uYWwgSkFSIGZpbGVzIGZvciB0aGUgam9iLiAqL1xuICByZWFkb25seSBhZGRpdGlvbmFsSmFycz86IHN0cmluZ1tdO1xuICAvKiogUmVsYXRpdmUgcGF0aHMgdG8gYWRkaXRpb25hbCBmaWxlcyBmb3IgdGhlIGpvYi4gKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbEZpbGVzPzogc3RyaW5nW107XG4gIC8qKiBDb250aW51b3VzIGxvZ2dpbmcgY29uZmlndXJhdGlvbiBmb3IgcmVhbC10aW1lIG1vbml0b3JpbmcuICovXG4gIHJlYWRvbmx5IGNvbnRpbnVvdXNMb2dnaW5nPzogTG9nZ2luZ0NvbmZpZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHbHVlSm9iTDNDb25zdHJ1Y3RQcm9wcyBleHRlbmRzIE1kYWFMM0NvbnN0cnVjdFByb3BzIHtcbiAgLyoqXG4gICAqIFJvbGUgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGRlcGxveSB0aGUgSm9iIGNvZGUuIFNob3VsZCBiZSBvYnRhaW5lZCBmcm9tIHRoZSBEYXRhT3BzIFByb2plY3RcbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveW1lbnRSb2xlQXJuPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIERhdGEgT3BzIHByb2plY3QgYnVja2V0IHdoZXJlIGpvYiByZXNvdXJjZXMgd2lsbCBiZSBkZXBsb3llZCBhbmQgd2hpY2ggd2lsbCBiZSB1c2VkIGFzIGEgdGVtcG9yYXJ5IGpvYiBsb2NhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0TmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIE1hcCBvZiBqb2IgbmFtZXMgdG8gam9iIGNvbmZpZ3VyYXRpb25zXG4gICAqL1xuICByZWFkb25seSBqb2JDb25maWdzOiB7IFtrZXk6IHN0cmluZ106IEpvYkNvbmZpZyB9O1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgR2x1ZSBTZWN1cml0eSBjb25maWd1cmF0aW9uIHRvIGJlIHVzZWQgZm9yIGFsbCBqb2JzLiBMaWtlbHkgc3VwcGxpZWQgYnkgdGhlIERhdGFPcHMgUHJvamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHNlY3VyaXR5Q29uZmlndXJhdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBkYXRhb3BzIHByb2plY3QgdG8gd2hpY2ggdGhlIGpvYiB3aWxsIGJlIGFzc29jaWF0ZWQuXG4gICAqL1xuICByZWFkb25seSBwcm9qZWN0TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogTm90aWZpY2F0aW9uIHRvcGljIEFyblxuICAgKi9cbiAgcmVhZG9ubHkgbm90aWZpY2F0aW9uVG9waWNBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERhdGFvcHMgcHJvamVjdCBLTVMga2V5IEFSTi5cbiAgICovXG4gIHJlYWRvbmx5IGttc0Fybj86IHN0cmluZztcblxuICAvKipcbiAgICogQmFzZSBwYXRoIGZvciByZXNvbHZpbmcgYGFzc2V0OmAgcHJlZml4ZWQgc2NyaXB0IGxvY2F0aW9ucy5cbiAgICogV2hlbiBhIGpvYidzIHNjcmlwdExvY2F0aW9uIHN0YXJ0cyB3aXRoIGBhc3NldDpgLCBpdCBpcyByZXNvbHZlZFxuICAgKiByZWxhdGl2ZSB0byB0aGlzIGRpcmVjdG9yeS5cbiAgICovXG4gIHJlYWRvbmx5IGFzc2V0QmFzZVBhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBHbHVlSm9iTDNDb25zdHJ1Y3QgZXh0ZW5kcyBNZGFhTDNDb25zdHJ1Y3Qge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJvcHM6IEdsdWVKb2JMM0NvbnN0cnVjdFByb3BzO1xuICBwcml2YXRlIHJlYWRvbmx5IGttc0tleTogSUtleTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogR2x1ZUpvYkwzQ29uc3RydWN0UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG5cbiAgICBpZiAoIXRoaXMucHJvcHMuZGVwbG95bWVudFJvbGVBcm4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGVwbG95bWVudCByb2xlIEFSTiBpcyByZXF1aXJlZCBmb3Igam9iIGNvbmZpZ3VyYXRpb24nKTtcbiAgICB9XG4gICAgY29uc3QgZGVwbG95bWVudFJvbGUgPSBNZGFhUm9sZS5mcm9tUm9sZUFybih0aGlzLnNjb3BlLCBgZGVwbG95bWVudC1yb2xlYCwgdGhpcy5wcm9wcy5kZXBsb3ltZW50Um9sZUFybik7XG4gICAgaWYgKCF0aGlzLnByb3BzLmJ1Y2tldE5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUHJvamVjdCBidWNrZXQgbmFtZSBpcyByZXF1aXJlZCBmb3Igam9iIGNvbmZpZ3VyYXRpb24nKTtcbiAgICB9XG4gICAgY29uc3QgYnVja2V0ID0gTWRhYUJ1Y2tldC5mcm9tQnVja2V0TmFtZSh0aGlzLnNjb3BlLCBgcHJvamVjdC1idWNrZXRgLCB0aGlzLnByb3BzLmJ1Y2tldE5hbWUpO1xuICAgIGlmICghdGhpcy5wcm9wcy5rbXNBcm4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUHJvamVjdCBLTVMgS2V5IGlzIHJlcXVpcmVkIGZvciBqb2IgY29uZmlndXJhdGlvbicpO1xuICAgIH1cbiAgICB0aGlzLmttc0tleSA9IEtleS5mcm9tS2V5QXJuKHRoaXMsIHRoaXMucHJvcHMucHJvamVjdE5hbWUgPz8gJ2ttcy1rZXknLCB0aGlzLnByb3BzLmttc0Fybik7XG5cbiAgICAvLyBCdWlsZCBvdXIgam9icyFcbiAgICBjb25zdCBhbGxKb2JzID0gdGhpcy5wcm9wcy5qb2JDb25maWdzO1xuICAgIGZvciAoY29uc3Qgam9iTmFtZSBvZiBPYmplY3Qua2V5cyhhbGxKb2JzKSkge1xuICAgICAgY29uc3Qgam9iQ29uZmlnID0gYWxsSm9ic1tqb2JOYW1lXTtcbiAgICAgIHRoaXMuY3JlYXRlSm9iKGpvYk5hbWUsIGpvYkNvbmZpZywgZGVwbG95bWVudFJvbGUsIGJ1Y2tldCk7XG4gICAgfVxuXG4gICAgLy8gQnVja2V0RGVwbG95bWVudCBhZGRzIGFuIGlubGluZSBwb2xpY3kgdG8gdGhlIGltcG9ydGVkIGRlcGxveW1lbnQgcm9sZSxcbiAgICAvLyB3aGljaCBDREsgc3ludGhlc2l6ZXMgYXMgYSBzdGFuZGFsb25lIEFXUzo6SUFNOjpQb2xpY3kgcmVzb3VyY2UuXG4gICAgLy8gQmVjYXVzZSB0aGUgcG9saWN5IG5hbWUgaXMgZGVyaXZlZCBmcm9tIHRoZSBjb25zdHJ1Y3QgcGF0aCAobm90IHRoZSBzdGFjayBuYW1lKSxcbiAgICAvLyBtdWx0aXBsZSBzdGFja3MgaW1wb3J0aW5nIHRoZSBzYW1lIHJvbGUgcHJvZHVjZSBjb2xsaWRpbmcgcGh5c2ljYWwgbmFtZXMuXG4gICAgLy8gUmVtb3ZlIHRoZSBpbmxpbmUgcG9saWN5IG5vZGUg4oCUIHRoZSBkZXBsb3ltZW50IHJvbGUgYWxyZWFkeSBoYXMgdGhlIG5lY2Vzc2FyeVxuICAgIC8vIFMzIHBlcm1pc3Npb25zIGdyYW50ZWQgaW4gdGhlIGRhdGFvcHMtcHJvamVjdCBjb25zdHJ1Y3QgdGhhdCBvd25zIGl0LlxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZGVwbG95bWVudFJvbGUubm9kZS5jaGlsZHJlbikge1xuICAgICAgaWYgKGNoaWxkLm5vZGUuaWQgPT09ICdQb2xpY3knKSB7XG4gICAgICAgIGRlcGxveW1lbnRSb2xlLm5vZGUudHJ5UmVtb3ZlQ2hpbGQoY2hpbGQubm9kZS5pZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFN1cHByZXNzIG5hZyB3YXJuaW5ncyBvbiB0aGUgaW1wb3J0ZWQgZGVwbG95bWVudCByb2xlIG5vZGUgaXRzZWxmXG4gICAgLy8gKHJlbWFpbmluZyBhZnRlciBpbmxpbmUgcG9saWN5IHJlbW92YWwsIGUuZy4gd2lsZGNhcmQgcmVzb3VyY2Ugd2FybmluZ3MpXG4gICAgdGhpcy5zY29wZS5ub2RlLmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgaWYgKGNoaWxkLm5vZGUuaWQuc3RhcnRzV2l0aCgnZGVwbG95bWVudC1yb2xlJykpIHtcbiAgICAgICAgTWRhYU5hZ1N1cHByZXNzaW9ucy5hZGRDb2RlUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgW3sgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNScsIHJlYXNvbjogJ1Blcm1pc3Npb25zIGdyYW50ZWQgb24gZGVwbG95bWVudCByb2xlIGluIG93bmluZyBzdGFjay4nIH1dLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGRlcGxveUFkZGl0aW9uYWxGaWxlcyhcbiAgICBhZGRpdGlvbmFsRmlsZXNTb3VyY2VzOiBJU291cmNlW10sXG4gICAgYnVja2V0OiBJQnVja2V0LFxuICAgIGRlcGxveW1lbnRSb2xlOiBJUm9sZSxcbiAgICBkZXBsb3ltZW50SWQ6IHN0cmluZyxcbiAgICBkZXBsb3ltZW50UGF0aDogc3RyaW5nLFxuICAgIGV4dHJhY3Q6IGJvb2xlYW4sXG4gICk6IEJ1Y2tldERlcGxveW1lbnQge1xuICAgIC8vIERlcGxveSBTb3VyY2UgYXNzZXQocykgdG8gL2RlcGxveW1lbnQvbGlicy88am9iPiBsb2NhdGlvbi5cbiAgICByZXR1cm4gbmV3IEJ1Y2tldERlcGxveW1lbnQodGhpcy5zY29wZSwgZGVwbG95bWVudElkLCB7XG4gICAgICBzb3VyY2VzOiBhZGRpdGlvbmFsRmlsZXNTb3VyY2VzLFxuICAgICAgZGVzdGluYXRpb25CdWNrZXQ6IGJ1Y2tldCxcbiAgICAgIGRlc3RpbmF0aW9uS2V5UHJlZml4OiBkZXBsb3ltZW50UGF0aCxcbiAgICAgIHJvbGU6IGRlcGxveW1lbnRSb2xlLFxuICAgICAgZXh0cmFjdDogZXh0cmFjdCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkQWRkaXRpb25hbFNjcmlwdHMoXG4gICAgam9iTmFtZTogc3RyaW5nLFxuICAgIGpvYkNvbmZpZzogSm9iQ29uZmlnLFxuICAgIGJ1Y2tldDogSUJ1Y2tldCxcbiAgICBkZXBsb3ltZW50Um9sZTogSVJvbGUsXG4gICAgZGVmYXVsdEFyZ3VtZW50czogQ29uZmlndXJhdGlvbkVsZW1lbnQsXG4gICkge1xuICAgIGlmIChqb2JDb25maWcuYWRkaXRpb25hbFNjcmlwdHMpIHtcbiAgICAgIC8qKlxuICAgICAgICogR3JvdXAgYWxsIGZpbGVzIGF0IHBhcmVudCBkaXJlY3RvcnkgbGV2ZWwuIFRoaXMgd2lsbCBhbGxvdyBjcmVhdGluZyB6aXAgbGliIGFzc2VzdHMgYXQgdmFyaW91cyBkaXJlY3RvcnkgbGV2ZWxzXG4gICAgICAgKiBleC4gJy9tYWluL3NjcmlwdDEucHknICwgJy91dGlsL3NjcmlwdDIucHknICwgJy91dGlsL3NjcmlwdDMucHknIHdpbGwgY3JlYXRlIDIgemlwIGZpbGVzIHJlcHJlc2VudGluZyAnbWFpbicgYW5kICd1dGlscydcbiAgICAgICAqICAqL1xuICAgICAgY29uc3QgZGlyZWN0b3J5VG9GaWxlOiB7IFtmaWxlUGF0aDogc3RyaW5nXTogc3RyaW5nW10gfSA9IHt9O1xuICAgICAgam9iQ29uZmlnLmFkZGl0aW9uYWxTY3JpcHRzLmZvckVhY2goZmlsZUxvY2F0aW9uID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmRpcm5hbWUoZmlsZUxvY2F0aW9uLnRyaW0oKSk7XG4gICAgICAgIGlmIChmaWxlUGF0aCBpbiBkaXJlY3RvcnlUb0ZpbGUpIHtcbiAgICAgICAgICBkaXJlY3RvcnlUb0ZpbGVbZmlsZVBhdGhdLnB1c2goYCEke3BhdGguYmFzZW5hbWUoZmlsZUxvY2F0aW9uLnRyaW0oKSl9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGlyZWN0b3J5VG9GaWxlW2ZpbGVQYXRoXSA9IFtgISR7cGF0aC5iYXNlbmFtZShmaWxlTG9jYXRpb24udHJpbSgpKX1gXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIENyZWF0ZSBTb3VyY2UgYXNzZXQgZm9yIGVhY2ggZGlyZWN0b3J5XG4gICAgICBjb25zdCBhZGRpdGlvbmFsRmlsZXNTb3VyY2VzID0gT2JqZWN0LmVudHJpZXMoZGlyZWN0b3J5VG9GaWxlKS5tYXAoKFtmaWxlUGF0aCwgZmlsZU5hbWVzXSkgPT4ge1xuICAgICAgICByZXR1cm4gU291cmNlLmFzc2V0KGZpbGVQYXRoLCB7IGV4Y2x1ZGU6IFsnKionLCAuLi5maWxlTmFtZXNdIH0pO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBkZXBsb3ltZW50UGF0aCA9IGBkZXBsb3ltZW50L2xpYnMvJHtqb2JOYW1lfWA7XG4gICAgICBjb25zdCBhZGRpdGlvbmFsRmlsZURlcGxveW1lbnQgPSB0aGlzLmRlcGxveUFkZGl0aW9uYWxGaWxlcyhcbiAgICAgICAgYWRkaXRpb25hbEZpbGVzU291cmNlcyxcbiAgICAgICAgYnVja2V0LFxuICAgICAgICBkZXBsb3ltZW50Um9sZSxcbiAgICAgICAgYGpvYi1kZXBsb3ltZW50LSR7am9iTmFtZX0tYWRkaXRpb25hbC1zY3JpcHRgLFxuICAgICAgICBkZXBsb3ltZW50UGF0aCxcbiAgICAgICAgZmFsc2UsIC8vIEdsdWUgZXhwZWN0cyB6aXAgb2YgYWRkaXRpb25hbCBzY3JpcHRzLCBoZW5jZSBkaXNhYmxpbmcgdGhlIGV4dHJhY3Rpb25cbiAgICAgICk7XG5cbiAgICAgIC8vIEV4dHJhY3QgemlwIG5hbWUocykgZm9yIGVhY2ggc291cmNlIGFuZCBjcmVhdGUgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgczMgbG9jYXRpb25zXG4gICAgICBjb25zdCBsaWJyYXJ5WmlwTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWRkaXRpb25hbEZpbGVzU291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBsaWJOYW1lID0gRm4uc2VsZWN0KGksIGFkZGl0aW9uYWxGaWxlRGVwbG95bWVudC5vYmplY3RLZXlzKTsgLy8gRXh0cmFjdCBmaWxlIG5hbWUgb2YgemlwIGNvbnRhaW5pbmcgYWRkaXRpb25hbCBzY3JpcHRzXG4gICAgICAgIGxpYnJhcnlaaXBOYW1lcy5wdXNoKGBzMzovLyR7YWRkaXRpb25hbEZpbGVEZXBsb3ltZW50LmRlcGxveWVkQnVja2V0LmJ1Y2tldE5hbWV9LyR7ZGVwbG95bWVudFBhdGh9LyR7bGliTmFtZX1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHppcCBmaWxlIG5hbWVzIHRvIGRlZmF1bHQgYXJndW1lbnRzLlxuICAgICAgaWYgKGRlZmF1bHRBcmd1bWVudHNbJy0tZXh0cmEtcHktZmlsZXMnXSkge1xuICAgICAgICBkZWZhdWx0QXJndW1lbnRzWyctLWV4dHJhLXB5LWZpbGVzJ10gKz0gJywnICsgbGlicmFyeVppcE5hbWVzLmpvaW4oJywnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlZmF1bHRBcmd1bWVudHNbJy0tZXh0cmEtcHktZmlsZXMnXSA9IGxpYnJhcnlaaXBOYW1lcy5qb2luKCcsJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRBZGRpdGlvbmFsSmFycyhcbiAgICBqb2JOYW1lOiBzdHJpbmcsXG4gICAgam9iQ29uZmlnOiBKb2JDb25maWcsXG4gICAgYnVja2V0OiBJQnVja2V0LFxuICAgIGRlcGxveW1lbnRSb2xlOiBJUm9sZSxcbiAgICBkZWZhdWx0QXJndW1lbnRzOiBDb25maWd1cmF0aW9uRWxlbWVudCxcbiAgKSB7XG4gICAgaWYgKGpvYkNvbmZpZy5hZGRpdGlvbmFsSmFycykge1xuICAgICAgLy8gQ3JlYXRlIFNvdXJjZSBhc3NldCBmb3IgZWFjaCBkaXJlY3RvcnlcbiAgICAgIGNvbnN0IGFkZGl0aW9uYWxGaWxlc1NvdXJjZXMgPSBqb2JDb25maWcuYWRkaXRpb25hbEphcnMubWFwKGZ1bGxGaWxlTmFtZSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5kaXJuYW1lKGZ1bGxGaWxlTmFtZS50cmltKCkpO1xuICAgICAgICBjb25zdCBmaWxlTmFtZSA9IHBhdGguYmFzZW5hbWUoZnVsbEZpbGVOYW1lLnRyaW0oKSk7XG4gICAgICAgIHJldHVybiBTb3VyY2UuYXNzZXQoZmlsZVBhdGgsIHsgZXhjbHVkZTogWycqKicsIGAhJHtmaWxlTmFtZX1gXSB9KTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGVwbG95bWVudFBhdGggPSBgZGVwbG95bWVudC9saWJzLyR7am9iTmFtZX1gO1xuXG4gICAgICBjb25zdCBhZGRpdGlvbmFsRmlsZURlcGxveW1lbnQgPSB0aGlzLmRlcGxveUFkZGl0aW9uYWxGaWxlcyhcbiAgICAgICAgYWRkaXRpb25hbEZpbGVzU291cmNlcyxcbiAgICAgICAgYnVja2V0LFxuICAgICAgICBkZXBsb3ltZW50Um9sZSxcbiAgICAgICAgYGpvYi1kZXBsb3ltZW50LSR7am9iTmFtZX0tYWRkaXRpb25hbC1qYXJgLFxuICAgICAgICBkZXBsb3ltZW50UGF0aCxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGV4dHJhSmFyTmFtZXMgPSBqb2JDb25maWcuYWRkaXRpb25hbEphcnMubWFwKGZ1bGxGaWxlTmFtZSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShmdWxsRmlsZU5hbWUudHJpbSgpKTtcbiAgICAgICAgcmV0dXJuIGBzMzovLyR7YWRkaXRpb25hbEZpbGVEZXBsb3ltZW50LmRlcGxveWVkQnVja2V0LmJ1Y2tldE5hbWV9LyR7ZGVwbG95bWVudFBhdGh9LyR7ZmlsZU5hbWV9YDtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBZGQgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgemlwIGZpbGUgbmFtZXMgdG8gZGVmYXVsdCBhcmd1bWVudHMuXG4gICAgICBpZiAoZGVmYXVsdEFyZ3VtZW50c1snLS1leHRyYS1qYXJzJ10pIHtcbiAgICAgICAgZGVmYXVsdEFyZ3VtZW50c1snLS1leHRyYS1qYXJzJ10gKz0gJywnICsgZXh0cmFKYXJOYW1lcy5qb2luKCcsJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZhdWx0QXJndW1lbnRzWyctLWV4dHJhLWphcnMnXSA9IGV4dHJhSmFyTmFtZXMuam9pbignLCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkQWRkaXRpb25hbEZpbGVzKFxuICAgIGpvYk5hbWU6IHN0cmluZyxcbiAgICBqb2JDb25maWc6IEpvYkNvbmZpZyxcbiAgICBidWNrZXQ6IElCdWNrZXQsXG4gICAgZGVwbG95bWVudFJvbGU6IElSb2xlLFxuICAgIGRlZmF1bHRBcmd1bWVudHM6IENvbmZpZ3VyYXRpb25FbGVtZW50LFxuICApIHtcbiAgICBpZiAoam9iQ29uZmlnLmFkZGl0aW9uYWxGaWxlcykge1xuICAgICAgLy8gQ3JlYXRlIFNvdXJjZSBhc3NldCBmb3IgZWFjaCBkaXJlY3RvcnlcbiAgICAgIGNvbnN0IGFkZGl0aW9uYWxGaWxlc1NvdXJjZXMgPSBqb2JDb25maWcuYWRkaXRpb25hbEZpbGVzLm1hcChmdWxsRmlsZU5hbWUgPT4ge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguZGlybmFtZShmdWxsRmlsZU5hbWUudHJpbSgpKTtcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBwYXRoLmJhc2VuYW1lKGZ1bGxGaWxlTmFtZS50cmltKCkpO1xuICAgICAgICByZXR1cm4gU291cmNlLmFzc2V0KGZpbGVQYXRoLCB7IGV4Y2x1ZGU6IFsnKionLCBgISR7ZmlsZU5hbWV9YF0gfSk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRlcGxveW1lbnRQYXRoID0gYGRlcGxveW1lbnQvZmlsZXMvJHtqb2JOYW1lfWA7XG4gICAgICBjb25zdCBhZGRpdGlvbmFsRmlsZURlcGxveW1lbnQgPSB0aGlzLmRlcGxveUFkZGl0aW9uYWxGaWxlcyhcbiAgICAgICAgYWRkaXRpb25hbEZpbGVzU291cmNlcyxcbiAgICAgICAgYnVja2V0LFxuICAgICAgICBkZXBsb3ltZW50Um9sZSxcbiAgICAgICAgYGpvYi1kZXBsb3ltZW50LSR7am9iTmFtZX0tYWRkaXRpb25hbC1maWxlYCxcbiAgICAgICAgZGVwbG95bWVudFBhdGgsXG4gICAgICAgIHRydWUsXG4gICAgICApO1xuICAgICAgY29uc3QgZXh0cmFGaWxlTmFtZXMgPSBqb2JDb25maWcuYWRkaXRpb25hbEZpbGVzLm1hcChmdWxsRmlsZU5hbWUgPT4ge1xuICAgICAgICBjb25zdCBmaWxlTmFtZSA9IHBhdGguYmFzZW5hbWUoZnVsbEZpbGVOYW1lLnRyaW0oKSk7XG4gICAgICAgIHJldHVybiBgczM6Ly8ke2FkZGl0aW9uYWxGaWxlRGVwbG95bWVudC5kZXBsb3llZEJ1Y2tldC5idWNrZXROYW1lfS8ke2RlcGxveW1lbnRQYXRofS8ke2ZpbGVOYW1lfWA7XG4gICAgICB9KTtcblxuICAgICAgLy8gQWRkIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHppcCBmaWxlIG5hbWVzIHRvIGRlZmF1bHQgYXJndW1lbnRzLlxuICAgICAgaWYgKGRlZmF1bHRBcmd1bWVudHNbJy0tZXh0cmEtZmlsZXMnXSkge1xuICAgICAgICBkZWZhdWx0QXJndW1lbnRzWyctLWV4dHJhLWZpbGVzJ10gKz0gJywnICsgZXh0cmFGaWxlTmFtZXMuam9pbignLCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmYXVsdEFyZ3VtZW50c1snLS1leHRyYS1maWxlcyddID0gZXh0cmFGaWxlTmFtZXMuam9pbignLCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUFzc2V0UGF0aChqb2JOYW1lOiBzdHJpbmcsIGxvY2F0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChsb2NhdGlvbi5zdGFydHNXaXRoKCdhc3NldDonKSkge1xuICAgICAgY29uc3QgYXNzZXROYW1lID0gbG9jYXRpb24uc3Vic3RyaW5nKCdhc3NldDonLmxlbmd0aCk7XG4gICAgICBpZiAoIXRoaXMucHJvcHMuYXNzZXRCYXNlUGF0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEpvYiAnJHtqb2JOYW1lfScgdXNlcyBhc3NldDogcHJlZml4IGJ1dCBubyBhc3NldEJhc2VQYXRoIGlzIGNvbmZpZ3VyZWQuIGAgK1xuICAgICAgICAgICAgYFNldCBhc3NldEJhc2VQYXRoIGluIHRoZSBjb25zdHJ1Y3QgcHJvcHMuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5wcm9wcy5hc3NldEJhc2VQYXRoLCBhc3NldE5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gbG9jYXRpb247XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUpvYihqb2JOYW1lOiBzdHJpbmcsIGpvYkNvbmZpZzogSm9iQ29uZmlnLCBkZXBsb3ltZW50Um9sZTogSVJvbGUsIGJ1Y2tldDogSUJ1Y2tldCkge1xuICAgIGNvbnN0IGRlZmF1bHRBcmd1bWVudHMgPSBqb2JDb25maWcuZGVmYXVsdEFyZ3VtZW50cyA/IGpvYkNvbmZpZy5kZWZhdWx0QXJndW1lbnRzIDoge307XG4gICAgbGV0IHNjcmlwdExvY2F0aW9uID0gdGhpcy5yZXNvbHZlQXNzZXRQYXRoKGpvYk5hbWUsIGpvYkNvbmZpZy5jb21tYW5kLnNjcmlwdExvY2F0aW9uLnRyaW0oKSk7XG5cbiAgICBjb25zdCBzY3JpcHRQYXRoID0gcGF0aC5kaXJuYW1lKHNjcmlwdExvY2F0aW9uKTtcbiAgICBjb25zdCBzY3JpcHROYW1lID0gcGF0aC5iYXNlbmFtZShzY3JpcHRMb2NhdGlvbik7XG4gICAgY29uc3Qgc2NyaXB0U291cmNlID0gU291cmNlLmFzc2V0KHNjcmlwdFBhdGgsIHsgZXhjbHVkZTogWycqKicsIGAhJHtzY3JpcHROYW1lfWBdIH0pO1xuXG4gICAgY29uc3Qgc2NyaXB0RGVwbG95bWVudFBhdGggPSBgZGVwbG95bWVudC9qb2JzLyR7am9iTmFtZX1gO1xuICAgIGNvbnN0IHNjcmlwdERlcGxveW1lbnQgPSBuZXcgQnVja2V0RGVwbG95bWVudCh0aGlzLnNjb3BlLCBgam9iLWRlcGxveW1lbnQtJHtqb2JOYW1lfWAsIHtcbiAgICAgIHNvdXJjZXM6IFtzY3JpcHRTb3VyY2VdLFxuICAgICAgZGVzdGluYXRpb25CdWNrZXQ6IGJ1Y2tldCxcbiAgICAgIGRlc3RpbmF0aW9uS2V5UHJlZml4OiBzY3JpcHREZXBsb3ltZW50UGF0aCxcbiAgICAgIHJvbGU6IGRlcGxveW1lbnRSb2xlLFxuICAgICAgZXh0cmFjdDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIFJlc29sdmUgYXNzZXQ6IHByZWZpeGVzIGluIGFkZGl0aW9uYWxTY3JpcHRzIGJlZm9yZSBwcm9jZXNzaW5nXG4gICAgaWYgKGpvYkNvbmZpZy5hZGRpdGlvbmFsU2NyaXB0cykge1xuICAgICAgam9iQ29uZmlnID0ge1xuICAgICAgICAuLi5qb2JDb25maWcsXG4gICAgICAgIGFkZGl0aW9uYWxTY3JpcHRzOiBqb2JDb25maWcuYWRkaXRpb25hbFNjcmlwdHMubWFwKHMgPT4gdGhpcy5yZXNvbHZlQXNzZXRQYXRoKGpvYk5hbWUsIHMudHJpbSgpKSksXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuYWRkQWRkaXRpb25hbFNjcmlwdHMoam9iTmFtZSwgam9iQ29uZmlnLCBidWNrZXQsIGRlcGxveW1lbnRSb2xlLCBkZWZhdWx0QXJndW1lbnRzKTtcbiAgICB0aGlzLmFkZEFkZGl0aW9uYWxKYXJzKGpvYk5hbWUsIGpvYkNvbmZpZywgYnVja2V0LCBkZXBsb3ltZW50Um9sZSwgZGVmYXVsdEFyZ3VtZW50cyk7XG4gICAgdGhpcy5hZGRBZGRpdGlvbmFsRmlsZXMoam9iTmFtZSwgam9iQ29uZmlnLCBidWNrZXQsIGRlcGxveW1lbnRSb2xlLCBkZWZhdWx0QXJndW1lbnRzKTtcbiAgICBNZGFhTmFnU3VwcHJlc3Npb25zLmFkZENvZGVSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgICAgIHRoaXMuc2NvcGUsXG4gICAgICBbXG4gICAgICAgIHsgaWQ6ICdBd3NTb2x1dGlvbnMtTDEnLCByZWFzb246ICdGdW5jdGlvbiBpcyB1c2VkIG9ubHkgYXMgY3VzdG9tIHJlc291cmNlIGR1cmluZyBDREsgZGVwbG95bWVudC4nIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ05JU1QuODAwLjUzLlI1LUxhbWJkYUNvbmN1cnJlbmN5JyxcbiAgICAgICAgICByZWFzb246ICdGdW5jdGlvbiBpcyB1c2VkIG9ubHkgYXMgY3VzdG9tIHJlc291cmNlIGR1cmluZyBDREsgZGVwbG95bWVudC4nLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdOSVNULjgwMC41My5SNS1MYW1iZGFJbnNpZGVWUEMnLFxuICAgICAgICAgIHJlYXNvbjogJ0Z1bmN0aW9uIGlzIHVzZWQgb25seSBhcyBjdXN0b20gcmVzb3VyY2UgZHVyaW5nIENESyBkZXBsb3ltZW50IGFuZCBpbnRlcmFjdHMgb25seSB3aXRoIFMzLicsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ05JU1QuODAwLjUzLlI1LUxhbWJkYURMUScsXG4gICAgICAgICAgcmVhc29uOlxuICAgICAgICAgICAgJ0Z1bmN0aW9uIGlzIHVzZWQgb25seSBhcyBjdXN0b20gcmVzb3VyY2UgZHVyaW5nIENESyBkZXBsb3ltZW50LiBFcnJvcnMgd2lsbCBiZSBoYW5kbGVkIGJ5IENsb3VkRm9ybWF0aW9uLicsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ0hJUEFBLlNlY3VyaXR5LUxhbWJkYUNvbmN1cnJlbmN5JyxcbiAgICAgICAgICByZWFzb246ICdGdW5jdGlvbiBpcyB1c2VkIG9ubHkgYXMgY3VzdG9tIHJlc291cmNlIGR1cmluZyBDREsgZGVwbG95bWVudC4nLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdQQ0kuRFNTLjMyMS1MYW1iZGFDb25jdXJyZW5jeScsXG4gICAgICAgICAgcmVhc29uOiAnRnVuY3Rpb24gaXMgdXNlZCBvbmx5IGFzIGN1c3RvbSByZXNvdXJjZSBkdXJpbmcgQ0RLIGRlcGxveW1lbnQuJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnSElQQUEuU2VjdXJpdHktTGFtYmRhSW5zaWRlVlBDJyxcbiAgICAgICAgICByZWFzb246ICdGdW5jdGlvbiBpcyB1c2VkIG9ubHkgYXMgY3VzdG9tIHJlc291cmNlIGR1cmluZyBDREsgZGVwbG95bWVudCBhbmQgaW50ZXJhY3RzIG9ubHkgd2l0aCBTMy4nLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdQQ0kuRFNTLjMyMS1MYW1iZGFJbnNpZGVWUEMnLFxuICAgICAgICAgIHJlYXNvbjogJ0Z1bmN0aW9uIGlzIHVzZWQgb25seSBhcyBjdXN0b20gcmVzb3VyY2UgZHVyaW5nIENESyBkZXBsb3ltZW50IGFuZCBpbnRlcmFjdHMgb25seSB3aXRoIFMzLicsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ0hJUEFBLlNlY3VyaXR5LUxhbWJkYURMUScsXG4gICAgICAgICAgcmVhc29uOlxuICAgICAgICAgICAgJ0Z1bmN0aW9uIGlzIHVzZWQgb25seSBhcyBjdXN0b20gcmVzb3VyY2UgZHVyaW5nIENESyBkZXBsb3ltZW50LiBFcnJvcnMgd2lsbCBiZSBoYW5kbGVkIGJ5IENsb3VkRm9ybWF0aW9uLicsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ1BDSS5EU1MuMzIxLUxhbWJkYURMUScsXG4gICAgICAgICAgcmVhc29uOlxuICAgICAgICAgICAgJ0Z1bmN0aW9uIGlzIHVzZWQgb25seSBhcyBjdXN0b20gcmVzb3VyY2UgZHVyaW5nIENESyBkZXBsb3ltZW50LiBFcnJvcnMgd2lsbCBiZSBoYW5kbGVkIGJ5IENsb3VkRm9ybWF0aW9uLicsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICAgIC8vIENvbm5lY3Rpb25zIHdpbGwgcmVxdWlyZSBhbiBhcnJheSBvZiByZWZlcmVuY2VzIHdoZXJlIHRoZXkgYXJlIGRlZmluZWRcbiAgICBsZXQgY29ubmVjdGlvbnNDb25maWd1cmVkOiBDb25maWd1cmF0aW9uRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICBpZiAoam9iQ29uZmlnLmNvbm5lY3Rpb25zKSB7XG4gICAgICBjb25uZWN0aW9uc0NvbmZpZ3VyZWQgPSB7XG4gICAgICAgIGNvbm5lY3Rpb25zOiBqb2JDb25maWcuY29ubmVjdGlvbnMsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGRlZmF1bHRBcmd1bWVudHNbJy0tVGVtcERpciddID0gYHMzOi8vJHt0aGlzLnByb3BzLmJ1Y2tldE5hbWV9L3RlbXAvam9icy8ke2pvYk5hbWV9YDtcblxuICAgIC8vIGFkZCBjb250aW51b3VzIGxvZ2dpbmcgdW5sZXNzIGV4cGxpY2l0bHkgZGlzYWJsZWRcbiAgICBpZiAoam9iQ29uZmlnLmNvbnRpbnVvdXNMb2dnaW5nKSB7XG4gICAgICBjb25zdCBsb2dHcm91cE5hbWUgPSBqb2JOYW1lO1xuICAgICAgY29uc3QgbG9nR3JvdXBOYW1lUGF0aFByZWZpeCA9ICcvYXdzL2dsdWUnO1xuICAgICAgZGVmYXVsdEFyZ3VtZW50c1snLS1jb250aW51b3VzLWxvZy1sb2dHcm91cCddID0gdGhpcy5jcmVhdGVMb2dHcm91cChcbiAgICAgICAgbG9nR3JvdXBOYW1lUGF0aFByZWZpeCxcbiAgICAgICAgbG9nR3JvdXBOYW1lLFxuICAgICAgICBqb2JDb25maWcuY29udGludW91c0xvZ2dpbmcsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhgQ29udGludW91cyBsb2dnaW5nIG5vdCBlbmFibGVkIGZvciBqb2I6ICR7am9iTmFtZX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dFBhcmFtcyA9IGRlZmF1bHRBcmd1bWVudHNbJy0taW5wdXRfcGFyYW1zJ107XG4gICAgaWYgKGlucHV0UGFyYW1zKSB7XG4gICAgICBkZWZhdWx0QXJndW1lbnRzWyctLWlucHV0X3BhcmFtcyddID0gSlNPTi5zdHJpbmdpZnkoaW5wdXRQYXJhbXMpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMucHJvcHMuc2VjdXJpdHlDb25maWd1cmF0aW9uTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZWN1cml0eSBjb25maWd1cmF0aW9uIG5hbWUgaXMgcmVxdWlyZWQgZm9yIGpvYiBtb25pdG9yaW5nIGV2ZW50IHJ1bGUnKTtcbiAgICB9XG4gICAgY29uc3Qgam9iID0gbmV3IE1kYWFDZm5Kb2IodGhpcy5zY29wZSwgYCR7am9iTmFtZX0tam9iYCwge1xuICAgICAgY29tbWFuZDoge1xuICAgICAgICBuYW1lOiBqb2JDb25maWcuY29tbWFuZC5uYW1lLFxuICAgICAgICBweXRob25WZXJzaW9uOiBqb2JDb25maWcuY29tbWFuZC5weXRob25WZXJzaW9uLFxuICAgICAgICBzY3JpcHRMb2NhdGlvbjogYHMzOi8vJHtzY3JpcHREZXBsb3ltZW50LmRlcGxveWVkQnVja2V0LmJ1Y2tldE5hbWV9LyR7c2NyaXB0RGVwbG95bWVudFBhdGh9LyR7c2NyaXB0TmFtZX1gLFxuICAgICAgfSxcbiAgICAgIHJvbGU6IGpvYkNvbmZpZy5leGVjdXRpb25Sb2xlQXJuLFxuICAgICAgYWxsb2NhdGVkQ2FwYWNpdHk6IGpvYkNvbmZpZy5hbGxvY2F0ZWRDYXBhY2l0eSxcbiAgICAgIGNvbm5lY3Rpb25zOiBjb25uZWN0aW9uc0NvbmZpZ3VyZWQsXG4gICAgICBkZWZhdWx0QXJndW1lbnRzOiBkZWZhdWx0QXJndW1lbnRzLFxuICAgICAgZGVzY3JpcHRpb246IGpvYkNvbmZpZy5kZXNjcmlwdGlvbixcbiAgICAgIGV4ZWN1dGlvblByb3BlcnR5OiBqb2JDb25maWcuZXhlY3V0aW9uUHJvcGVydHksXG4gICAgICBnbHVlVmVyc2lvbjogam9iQ29uZmlnLmdsdWVWZXJzaW9uLFxuICAgICAgbWF4Q2FwYWNpdHk6IGpvYkNvbmZpZy5tYXhDYXBhY2l0eSxcbiAgICAgIG1heFJldHJpZXM6IGpvYkNvbmZpZy5tYXhSZXRyaWVzLFxuICAgICAgbmFtZTogam9iTmFtZSxcbiAgICAgIG5vdGlmaWNhdGlvblByb3BlcnR5OiBqb2JDb25maWcubm90aWZpY2F0aW9uUHJvcGVydHksXG4gICAgICBudW1iZXJPZldvcmtlcnM6IGpvYkNvbmZpZy5udW1iZXJPZldvcmtlcnMsXG4gICAgICBzZWN1cml0eUNvbmZpZ3VyYXRpb246IHRoaXMucHJvcHMuc2VjdXJpdHlDb25maWd1cmF0aW9uTmFtZSxcbiAgICAgIHRpbWVvdXQ6IGpvYkNvbmZpZy50aW1lb3V0LFxuICAgICAgd29ya2VyVHlwZTogam9iQ29uZmlnLndvcmtlclR5cGUsXG4gICAgICBuYW1pbmc6IHRoaXMucHJvcHMubmFtaW5nLFxuICAgIH0pO1xuXG4gICAgaWYgKGpvYi5uYW1lICYmIHRoaXMucHJvcHMucHJvamVjdE5hbWUpIHtcbiAgICAgIERhdGFPcHNQcm9qZWN0VXRpbHMuY3JlYXRlUHJvamVjdFNTTVBhcmFtKFxuICAgICAgICB0aGlzLnNjb3BlLFxuICAgICAgICB0aGlzLnByb3BzLm5hbWluZyxcbiAgICAgICAgdGhpcy5wcm9wcy5wcm9qZWN0TmFtZSxcbiAgICAgICAgYGpvYi9uYW1lLyR7am9iTmFtZX1gLFxuICAgICAgICBqb2IubmFtZSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGV2ZW50UnVsZSA9IHRoaXMuY3JlYXRlSm9iTW9uaXRvcmluZ0V2ZW50UnVsZShgJHtqb2JOYW1lfS1tb25pdG9yYCwgW2pvYi5uYW1lXSk7XG4gICAgICBpZiAoIXRoaXMucHJvcHMubm90aWZpY2F0aW9uVG9waWNBcm4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3RpZmljYXRpb24gdG9waWMgQVJOIGlzIHJlcXVpcmVkIGZvciBqb2IgbW9uaXRvcmluZyBldmVudCBydWxlJyk7XG4gICAgICB9XG4gICAgICBldmVudFJ1bGUuYWRkVGFyZ2V0KFxuICAgICAgICBuZXcgU25zVG9waWMoTWRhYVNuc1RvcGljLmZyb21Ub3BpY0Fybih0aGlzLnNjb3BlLCBgJHtqb2JOYW1lfS10b3BpY2AsIHRoaXMucHJvcHMubm90aWZpY2F0aW9uVG9waWNBcm4pKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVKb2JNb25pdG9yaW5nRXZlbnRSdWxlKHJ1bGVOYW1lOiBzdHJpbmcsIGpvYk5hbWVzOiBzdHJpbmdbXSk6IFJ1bGUge1xuICAgIHJldHVybiBFdmVudEJyaWRnZUhlbHBlci5jcmVhdGVHbHVlTW9uaXRvcmluZ0V2ZW50UnVsZShcbiAgICAgIHRoaXMuc2NvcGUsXG4gICAgICB0aGlzLnByb3BzLm5hbWluZyxcbiAgICAgIHJ1bGVOYW1lLFxuICAgICAgJ1dvcmtmbG93IEpvYiBmYWlsdXJlIGV2ZW50cycsXG4gICAgICB7XG4gICAgICAgIGpvYk5hbWU6IGpvYk5hbWVzLFxuICAgICAgICBzdGF0ZTogWydGQUlMRUQnLCAnVElNRU9VVCcsICdTVE9QUEVEJ10sXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUxvZ0dyb3VwKGxvZ0dyb3VwTmFtZVBhdGhQcmVmaXg6IHN0cmluZywgbG9nR3JvdXBOYW1lOiBzdHJpbmcsIGxvZ2dpbmdDb25maWc6IExvZ2dpbmdDb25maWcpOiBzdHJpbmcge1xuICAgIGxldCBsb2dHcm91cFJldGVudGlvbkRheXM6IFJldGVudGlvbkRheXM7XG5cbiAgICBpZiAobG9nZ2luZ0NvbmZpZy5sb2dHcm91cFJldGVudGlvbkRheXMgIT0gMCkge1xuICAgICAgbG9nR3JvdXBSZXRlbnRpb25EYXlzID0gbG9nZ2luZ0NvbmZpZy5sb2dHcm91cFJldGVudGlvbkRheXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ0dyb3VwUmV0ZW50aW9uRGF5cyA9IFJldGVudGlvbkRheXMuSU5GSU5JVEU7XG4gICAgfVxuXG4gICAgY29uc3QgbG9nUHJvcHMgPSB7XG4gICAgICBuYW1pbmc6IHRoaXMucHJvcHMubmFtaW5nLFxuICAgICAgbG9nR3JvdXBOYW1lOiBsb2dHcm91cE5hbWUsXG4gICAgICBsb2dHcm91cE5hbWVQYXRoUHJlZml4OiBsb2dHcm91cE5hbWVQYXRoUHJlZml4LFxuICAgICAgZW5jcnlwdGlvbktleTogdGhpcy5rbXNLZXksXG4gICAgICByZXRlbnRpb246IGxvZ0dyb3VwUmV0ZW50aW9uRGF5cyxcbiAgICB9O1xuICAgIG5ldyBNZGFhTG9nR3JvdXAodGhpcywgbG9nR3JvdXBOYW1lLCBsb2dQcm9wcyk7XG4gICAgLy8gYHVwZGF0ZVByb3BzYCBhbHdheXMgcmV0dXJucyBhIHByb3Agd2l0aCBhIGxvZ0dyb3VwTmFtZVxuICAgIHJldHVybiB1cGRhdGVQcm9wcyhsb2dQcm9wcykubG9nR3JvdXBOYW1lITtcbiAgfVxufVxuIl19
@@ -0,0 +1,3 @@
1
+ # MDAA Core
2
+
3
+ This package provides base classes defining the common/standard behaviors of MDAA-compliant CDK Apps and Stacks. Specifically, it provides an MDAA App base class (Extends CDK App), as well as an MdaaAppConfigParser base class.
@@ -0,0 +1,20 @@
1
+ /*!
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ import { Construct } from 'constructs';
6
+ import { IMdaaResourceNaming } from '@aws-mdaa/naming';
7
+ import { IMdaaConfigValueTransformer, TransformResult } from './transformer';
8
+ export interface MdaaConfigBlueprintRefValueTransformerProps {
9
+ readonly naming: IMdaaResourceNaming;
10
+ readonly scope: Construct;
11
+ }
12
+ export declare class MdaaConfigBlueprintRefValueTransformer implements IMdaaConfigValueTransformer {
13
+ protected props: MdaaConfigBlueprintRefValueTransformerProps;
14
+ constructor(props: MdaaConfigBlueprintRefValueTransformerProps);
15
+ transformValue(value: string): TransformResult;
16
+ protected parseBlueprintRef(value: string, refMatch: string[]): string | number | object;
17
+ private substituteBlueprintReferences;
18
+ private convertToString;
19
+ private resolveBlueprintReference;
20
+ }
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ /*!
3
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.MdaaConfigBlueprintRefValueTransformer = void 0;
8
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
9
+ const XRegExp = require("xregexp");
10
+ class MdaaConfigBlueprintRefValueTransformer {
11
+ constructor(props) {
12
+ this.props = props;
13
+ }
14
+ transformValue(value) {
15
+ const refMatch = XRegExp.matchRecursive(value, '{{', '}}', 'g', {
16
+ unbalanced: 'skip',
17
+ });
18
+ if (refMatch.length > 0) {
19
+ return this.parseBlueprintRef(value, refMatch);
20
+ }
21
+ else {
22
+ return value;
23
+ }
24
+ }
25
+ parseBlueprintRef(value, refMatch) {
26
+ // Substitute all references in the string
27
+ return this.substituteBlueprintReferences(value, refMatch);
28
+ }
29
+ substituteBlueprintReferences(value, refMatch) {
30
+ return refMatch.reduce((result, ref) => {
31
+ const refInner = this.transformValue(ref).toString();
32
+ const resolvedValue = this.resolveBlueprintReference(refInner);
33
+ if (resolvedValue === undefined) {
34
+ return result;
35
+ }
36
+ const stringValue = this.convertToString(resolvedValue);
37
+ return result.replace(`{{${ref}}}`, stringValue);
38
+ }, value);
39
+ }
40
+ convertToString(value) {
41
+ if (typeof value === 'string') {
42
+ return value;
43
+ }
44
+ if (typeof value === 'number' || typeof value === 'boolean') {
45
+ return String(value);
46
+ }
47
+ // For objects, use JSON.stringify as a safe fallback
48
+ return JSON.stringify(value);
49
+ }
50
+ resolveBlueprintReference(refInner) {
51
+ if (refInner.startsWith('blueprint:')) {
52
+ if (!this.props.scope) {
53
+ throw new Error('Unable to resolve blueprint params outside of a Construct');
54
+ }
55
+ if (!this.props.naming) {
56
+ throw new Error('Unable to resolve blueprint params without a naming implementation');
57
+ }
58
+ const blueprintPath = refInner.replace(/^blueprint:/, '');
59
+ const ssmOrgPath = this.props.naming?.ssmOrgPath('', false);
60
+ const existingDzProjectParam = this.props.scope?.node.tryFindChild('datazoneEnvironmentProjectId');
61
+ const dzProjectParam = existingDzProjectParam ?? new aws_cdk_lib_1.CfnParameter(this.props.scope, 'datazoneEnvironmentProjectId');
62
+ const ssmPath = `{{resolve:ssm:${ssmOrgPath}${dzProjectParam.valueAsString}${blueprintPath}}}`;
63
+ console.log(`Resolving blueprint path: ${ssmPath}`);
64
+ return ssmPath;
65
+ }
66
+ return undefined;
67
+ }
68
+ }
69
+ exports.MdaaConfigBlueprintRefValueTransformer = MdaaConfigBlueprintRefValueTransformer;
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmx1ZXByaW50LXZhbHVlLXRyYW5zZm9ybWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYmx1ZXByaW50LXZhbHVlLXRyYW5zZm9ybWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQUVILDZDQUEyQztBQUkzQyxtQ0FBbUM7QUFRbkMsTUFBYSxzQ0FBc0M7SUFHakQsWUFBWSxLQUFrRDtRQUM1RCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBRU0sY0FBYyxDQUFDLEtBQWE7UUFDakMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUU7WUFDOUQsVUFBVSxFQUFFLE1BQU07U0FDbkIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxRQUFRLENBQW9CLENBQUM7UUFDcEUsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRVMsaUJBQWlCLENBQUMsS0FBYSxFQUFFLFFBQWtCO1FBQzNELDBDQUEwQztRQUMxQyxPQUFPLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVPLDZCQUE2QixDQUFDLEtBQWEsRUFBRSxRQUFrQjtRQUNyRSxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDckMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNyRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFL0QsSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ2hDLE9BQU8sTUFBTSxDQUFDO1lBQ2hCLENBQUM7WUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3hELE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ25ELENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNaLENBQUM7SUFFTyxlQUFlLENBQUMsS0FBYztRQUNwQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzlCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxxREFBcUQ7UUFDckQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTyx5QkFBeUIsQ0FBQyxRQUFnQjtRQUNoRCxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQywyREFBMkQsQ0FBQyxDQUFDO1lBQy9FLENBQUM7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvRUFBb0UsQ0FBQyxDQUFDO1lBQ3hGLENBQUM7WUFDRCxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMxRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzVELE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FDaEUsOEJBQThCLENBQ2YsQ0FBQztZQUNsQixNQUFNLGNBQWMsR0FDbEIsc0JBQXNCLElBQUksSUFBSSwwQkFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLDhCQUE4QixDQUFDLENBQUM7WUFDL0YsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLFVBQVUsR0FBRyxjQUFjLENBQUMsYUFBYSxHQUFHLGFBQWEsSUFBSSxDQUFDO1lBQy9GLE9BQU8sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDcEQsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7Q0FDRjtBQXRFRCx3RkFzRUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIENvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuXG5pbXBvcnQgeyBDZm5QYXJhbWV0ZXIgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbi8vIG5vc2VtZ3JlcFxuaW1wb3J0IHsgSU1kYWFSZXNvdXJjZU5hbWluZyB9IGZyb20gJ0Bhd3MtbWRhYS9uYW1pbmcnO1xuaW1wb3J0ICogYXMgWFJlZ0V4cCBmcm9tICd4cmVnZXhwJztcbmltcG9ydCB7IElNZGFhQ29uZmlnVmFsdWVUcmFuc2Zvcm1lciwgVHJhbnNmb3JtUmVzdWx0IH0gZnJvbSAnLi90cmFuc2Zvcm1lcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWRhYUNvbmZpZ0JsdWVwcmludFJlZlZhbHVlVHJhbnNmb3JtZXJQcm9wcyB7XG4gIHJlYWRvbmx5IG5hbWluZzogSU1kYWFSZXNvdXJjZU5hbWluZztcbiAgcmVhZG9ubHkgc2NvcGU6IENvbnN0cnVjdDtcbn1cblxuZXhwb3J0IGNsYXNzIE1kYWFDb25maWdCbHVlcHJpbnRSZWZWYWx1ZVRyYW5zZm9ybWVyIGltcGxlbWVudHMgSU1kYWFDb25maWdWYWx1ZVRyYW5zZm9ybWVyIHtcbiAgcHJvdGVjdGVkIHByb3BzOiBNZGFhQ29uZmlnQmx1ZXByaW50UmVmVmFsdWVUcmFuc2Zvcm1lclByb3BzO1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBNZGFhQ29uZmlnQmx1ZXByaW50UmVmVmFsdWVUcmFuc2Zvcm1lclByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICB9XG5cbiAgcHVibGljIHRyYW5zZm9ybVZhbHVlKHZhbHVlOiBzdHJpbmcpOiBUcmFuc2Zvcm1SZXN1bHQge1xuICAgIGNvbnN0IHJlZk1hdGNoID0gWFJlZ0V4cC5tYXRjaFJlY3Vyc2l2ZSh2YWx1ZSwgJ3t7JywgJ319JywgJ2cnLCB7XG4gICAgICB1bmJhbGFuY2VkOiAnc2tpcCcsXG4gICAgfSk7XG4gICAgaWYgKHJlZk1hdGNoLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlQmx1ZXByaW50UmVmKHZhbHVlLCByZWZNYXRjaCkgYXMgVHJhbnNmb3JtUmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHBhcnNlQmx1ZXByaW50UmVmKHZhbHVlOiBzdHJpbmcsIHJlZk1hdGNoOiBzdHJpbmdbXSk6IHN0cmluZyB8IG51bWJlciB8IG9iamVjdCB7XG4gICAgLy8gU3Vic3RpdHV0ZSBhbGwgcmVmZXJlbmNlcyBpbiB0aGUgc3RyaW5nXG4gICAgcmV0dXJuIHRoaXMuc3Vic3RpdHV0ZUJsdWVwcmludFJlZmVyZW5jZXModmFsdWUsIHJlZk1hdGNoKTtcbiAgfVxuXG4gIHByaXZhdGUgc3Vic3RpdHV0ZUJsdWVwcmludFJlZmVyZW5jZXModmFsdWU6IHN0cmluZywgcmVmTWF0Y2g6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVmTWF0Y2gucmVkdWNlKChyZXN1bHQsIHJlZikgPT4ge1xuICAgICAgY29uc3QgcmVmSW5uZXIgPSB0aGlzLnRyYW5zZm9ybVZhbHVlKHJlZikudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkVmFsdWUgPSB0aGlzLnJlc29sdmVCbHVlcHJpbnRSZWZlcmVuY2UocmVmSW5uZXIpO1xuXG4gICAgICBpZiAocmVzb2x2ZWRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0cmluZ1ZhbHVlID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcocmVzb2x2ZWRWYWx1ZSk7XG4gICAgICByZXR1cm4gcmVzdWx0LnJlcGxhY2UoYHt7JHtyZWZ9fX1gLCBzdHJpbmdWYWx1ZSk7XG4gICAgfSwgdmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0VG9TdHJpbmcodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gICAgLy8gRm9yIG9iamVjdHMsIHVzZSBKU09OLnN0cmluZ2lmeSBhcyBhIHNhZmUgZmFsbGJhY2tcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlQmx1ZXByaW50UmVmZXJlbmNlKHJlZklubmVyOiBzdHJpbmcpIHtcbiAgICBpZiAocmVmSW5uZXIuc3RhcnRzV2l0aCgnYmx1ZXByaW50OicpKSB7XG4gICAgICBpZiAoIXRoaXMucHJvcHMuc2NvcGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gcmVzb2x2ZSBibHVlcHJpbnQgcGFyYW1zIG91dHNpZGUgb2YgYSBDb25zdHJ1Y3QnKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5wcm9wcy5uYW1pbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gcmVzb2x2ZSBibHVlcHJpbnQgcGFyYW1zIHdpdGhvdXQgYSBuYW1pbmcgaW1wbGVtZW50YXRpb24nKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJsdWVwcmludFBhdGggPSByZWZJbm5lci5yZXBsYWNlKC9eYmx1ZXByaW50Oi8sICcnKTtcbiAgICAgIGNvbnN0IHNzbU9yZ1BhdGggPSB0aGlzLnByb3BzLm5hbWluZz8uc3NtT3JnUGF0aCgnJywgZmFsc2UpO1xuICAgICAgY29uc3QgZXhpc3RpbmdEelByb2plY3RQYXJhbSA9IHRoaXMucHJvcHMuc2NvcGU/Lm5vZGUudHJ5RmluZENoaWxkKFxuICAgICAgICAnZGF0YXpvbmVFbnZpcm9ubWVudFByb2plY3RJZCcsXG4gICAgICApIGFzIENmblBhcmFtZXRlcjtcbiAgICAgIGNvbnN0IGR6UHJvamVjdFBhcmFtID1cbiAgICAgICAgZXhpc3RpbmdEelByb2plY3RQYXJhbSA/PyBuZXcgQ2ZuUGFyYW1ldGVyKHRoaXMucHJvcHMuc2NvcGUsICdkYXRhem9uZUVudmlyb25tZW50UHJvamVjdElkJyk7XG4gICAgICBjb25zdCBzc21QYXRoID0gYHt7cmVzb2x2ZTpzc206JHtzc21PcmdQYXRofSR7ZHpQcm9qZWN0UGFyYW0udmFsdWVBc1N0cmluZ30ke2JsdWVwcmludFBhdGh9fX1gO1xuICAgICAgY29uc29sZS5sb2coYFJlc29sdmluZyBibHVlcHJpbnQgcGF0aDogJHtzc21QYXRofWApO1xuICAgICAgcmV0dXJuIHNzbVBhdGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIl19