@fjall/components-infrastructure 0.87.20 → 0.88.3

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 (100) hide show
  1. package/dist/lib/app.d.ts +14 -18
  2. package/dist/lib/app.js +58 -41
  3. package/dist/lib/config/aws/accountId.js +1 -2
  4. package/dist/lib/config/aws/backupGlobalSettings.js +1 -2
  5. package/dist/lib/config/aws/costAllocationTags.js +3 -4
  6. package/dist/lib/config/aws/identityCenter.d.ts +4 -4
  7. package/dist/lib/config/aws/identityCenter.js +17 -63
  8. package/dist/lib/config/aws/identityCenterGroupMembership.js +27 -42
  9. package/dist/lib/config/aws/index.d.ts +0 -8
  10. package/dist/lib/config/aws/index.js +1 -9
  11. package/dist/lib/config/aws/ipamDelegateAdmin.js +1 -2
  12. package/dist/lib/config/aws/ipamPoolId.js +1 -2
  13. package/dist/lib/config/aws/organisationId.js +1 -2
  14. package/dist/lib/config/aws/organisationsAccess.js +1 -2
  15. package/dist/lib/config/aws/ramSharing.js +1 -2
  16. package/dist/lib/layers/layers/secrets-resolver/bin/resolve-secrets +30 -0
  17. package/dist/lib/layers/layers/secrets-resolver/bin/resolve-secrets.mjs +212 -0
  18. package/dist/lib/layers/secrets-resolver/bin/resolve-secrets +30 -0
  19. package/dist/lib/layers/secrets-resolver/bin/resolve-secrets.mjs +212 -0
  20. package/dist/lib/patterns/aws/account.d.ts +12 -0
  21. package/dist/lib/patterns/aws/account.js +73 -0
  22. package/dist/lib/patterns/aws/buildkite.js +1 -2
  23. package/dist/lib/patterns/aws/cdn.d.ts +5 -10
  24. package/dist/lib/patterns/aws/cdn.js +5 -13
  25. package/dist/lib/patterns/aws/compute.d.ts +20 -3
  26. package/dist/lib/patterns/aws/compute.js +29 -5
  27. package/dist/lib/patterns/aws/database.d.ts +3 -3
  28. package/dist/lib/patterns/aws/database.js +18 -15
  29. package/dist/lib/patterns/aws/index.d.ts +4 -3
  30. package/dist/lib/patterns/aws/index.js +6 -4
  31. package/dist/lib/patterns/aws/interfaces/index.d.ts +2 -1
  32. package/dist/lib/patterns/aws/interfaces/index.js +8 -5
  33. package/dist/lib/patterns/aws/interfaces/organisation.d.ts +22 -0
  34. package/dist/lib/patterns/aws/interfaces/organisation.js +28 -0
  35. package/dist/lib/patterns/aws/interfaces/pattern.d.ts +5 -5
  36. package/dist/lib/patterns/aws/interfaces/pattern.js +1 -1
  37. package/dist/lib/patterns/aws/interfaces/storage.d.ts +10 -120
  38. package/dist/lib/patterns/aws/interfaces/storage.js +6 -43
  39. package/dist/lib/patterns/aws/organisation.d.ts +38 -0
  40. package/dist/lib/patterns/aws/organisation.js +92 -0
  41. package/dist/lib/patterns/aws/organisationFactory.d.ts +20 -0
  42. package/dist/lib/patterns/aws/organisationFactory.js +24 -0
  43. package/dist/lib/patterns/aws/pattern.d.ts +1 -1
  44. package/dist/lib/patterns/aws/pattern.js +1 -1
  45. package/dist/lib/patterns/aws/payload.d.ts +6 -5
  46. package/dist/lib/patterns/aws/payload.js +92 -42
  47. package/dist/lib/patterns/aws/platform.d.ts +11 -0
  48. package/dist/lib/patterns/aws/platform.js +29 -0
  49. package/dist/lib/patterns/aws/storage.d.ts +40 -125
  50. package/dist/lib/patterns/aws/storage.js +63 -191
  51. package/dist/lib/resources/aws/compute/ec2.d.ts +1 -1
  52. package/dist/lib/resources/aws/compute/ec2.js +3 -4
  53. package/dist/lib/resources/aws/compute/ecs.d.ts +6 -9
  54. package/dist/lib/resources/aws/compute/ecs.js +58 -26
  55. package/dist/lib/resources/aws/compute/lambda.d.ts +14 -1
  56. package/dist/lib/resources/aws/compute/lambda.js +45 -13
  57. package/dist/lib/resources/aws/database/rdsAurora.d.ts +1 -0
  58. package/dist/lib/resources/aws/database/rdsAurora.js +16 -16
  59. package/dist/lib/resources/aws/database/rdsAuroraGlobal.d.ts +1 -0
  60. package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +14 -10
  61. package/dist/lib/resources/aws/database/rdsInstance.d.ts +5 -4
  62. package/dist/lib/resources/aws/database/rdsInstance.js +18 -7
  63. package/dist/lib/resources/aws/iam/identityCenter/assignment.d.ts +0 -2
  64. package/dist/lib/resources/aws/iam/identityCenter/assignment.js +9 -46
  65. package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.js +1 -2
  66. package/dist/lib/resources/aws/iam/identityCenter/group.d.ts +1 -3
  67. package/dist/lib/resources/aws/iam/identityCenter/group.js +7 -85
  68. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.d.ts +1 -3
  69. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.js +9 -96
  70. package/dist/lib/resources/aws/index.d.ts +1 -0
  71. package/dist/lib/resources/aws/index.js +2 -1
  72. package/dist/lib/resources/aws/logging/cloudTrail.js +7 -4
  73. package/dist/lib/resources/aws/networking/ipamPool.js +76 -5
  74. package/dist/lib/resources/aws/organisation/index.d.ts +4 -0
  75. package/dist/lib/resources/aws/organisation/index.js +10 -0
  76. package/dist/lib/resources/aws/organisation/organisation.d.ts +12 -0
  77. package/dist/lib/resources/aws/organisation/organisation.js +14 -0
  78. package/dist/lib/resources/aws/organisation/organisationAccount.d.ts +18 -0
  79. package/dist/lib/resources/aws/organisation/organisationAccount.js +31 -0
  80. package/dist/lib/resources/aws/organisation/organisationPolicy.d.ts +13 -0
  81. package/dist/lib/resources/aws/organisation/organisationPolicy.js +32 -0
  82. package/dist/lib/resources/aws/organisation/organisationalUnit.d.ts +10 -0
  83. package/dist/lib/resources/aws/organisation/organisationalUnit.js +9 -0
  84. package/dist/lib/resources/aws/secrets/kms.js +10 -7
  85. package/dist/lib/resources/aws/secrets/parameter.js +5 -4
  86. package/dist/lib/resources/aws/storage/ecr.d.ts +3 -1
  87. package/dist/lib/resources/aws/storage/ecr.js +3 -3
  88. package/dist/lib/resources/aws/storage/s3.d.ts +6 -39
  89. package/dist/lib/resources/aws/storage/s3.js +31 -34
  90. package/dist/lib/utils/capitaliseString.d.ts +12 -0
  91. package/dist/lib/utils/capitaliseString.js +30 -0
  92. package/dist/lib/utils/capitalizeString.d.ts +11 -0
  93. package/dist/lib/utils/capitalizeString.js +24 -1
  94. package/dist/lib/utils/getConfig.d.ts +5 -1
  95. package/dist/lib/utils/getConfig.js +9 -1
  96. package/dist/lib/utils/index.d.ts +1 -0
  97. package/dist/lib/utils/index.js +2 -1
  98. package/dist/lib/utils/resourceNaming.d.ts +22 -19
  99. package/dist/lib/utils/resourceNaming.js +39 -35
  100. package/package.json +5 -6
@@ -9,10 +9,12 @@ const constructs_1 = require("constructs");
9
9
  const iam_1 = require("../iam");
10
10
  const secrets_1 = require("../secrets");
11
11
  const resourceNaming_1 = require("../../../utils/resourceNaming");
12
+ const capitaliseString_1 = require("../../../utils/capitaliseString");
12
13
  const database_1 = require("../../../patterns/aws/database");
13
14
  class RdsAurora extends constructs_1.Construct {
14
15
  constructor(scope, id, props) {
15
16
  super(scope, id);
17
+ this.constructId = id;
16
18
  this.port = props.port ?? 35255;
17
19
  // PostgreSQL fallback for direct usage - ensure engine and engineConfig match
18
20
  this.engineConfig = props.engineConfig ?? {
@@ -31,13 +33,13 @@ class RdsAurora extends constructs_1.Construct {
31
33
  // Global secondary clusters import replicated secret instead of creating new
32
34
  if (props.isGlobalSecondary) {
33
35
  this.databaseCredentials = new secrets_1.Secret(this, `${props.databaseName}Credentials`, {
34
- secretName: resourceNaming_1.ResourceNaming.credentialsSecretName(props.databaseName),
36
+ secretName: resourceNaming_1.ResourceNaming.credentialsSecretName(id),
35
37
  importExisting: true
36
38
  });
37
39
  }
38
40
  else {
39
41
  this.databaseCredentials = new secrets_1.Secret(this, `${props.databaseName}Credentials`, {
40
- secretName: resourceNaming_1.ResourceNaming.credentialsSecretName(props.databaseName),
42
+ secretName: resourceNaming_1.ResourceNaming.credentialsSecretName(id),
41
43
  generateSecretString: {
42
44
  secretStringTemplate: JSON.stringify({ username }),
43
45
  excludePunctuation: true,
@@ -75,7 +77,7 @@ class RdsAurora extends constructs_1.Construct {
75
77
  });
76
78
  const writerConfig = props.writer ?? {};
77
79
  const writerPI = writerConfig.enablePerformanceInsights ?? piEnabled;
78
- const writerSuffix = writerConfig.identifierSuffix ?? "primary-writer";
80
+ const writerSuffix = writerConfig.identifierSuffix;
79
81
  const performanceInsightsRetention = this.getPerformanceInsightRetention(piConfig?.retentionPeriod ?? 7);
80
82
  const databaseName = props.databaseName || id;
81
83
  const writer = aws_rds_1.ClusterInstance.serverlessV2(`${databaseName}Writer`, {
@@ -86,7 +88,7 @@ class RdsAurora extends constructs_1.Construct {
86
88
  performanceInsightRetention: writerPI
87
89
  ? performanceInsightsRetention
88
90
  : undefined,
89
- instanceIdentifier: resourceNaming_1.ResourceNaming.writerInstanceId(databaseName, writerSuffix),
91
+ instanceIdentifier: resourceNaming_1.ResourceNaming.writerInstanceId(id, writerSuffix),
90
92
  caCertificate: aws_rds_1.CaCertificate.RDS_CA_RSA4096_G1,
91
93
  publiclyAccessible: props.publiclyAccessible,
92
94
  ...(writerConfig.availabilityZone && {
@@ -117,8 +119,7 @@ class RdsAurora extends constructs_1.Construct {
117
119
  backup: { retention: aws_cdk_lib_1.Duration.days(props.backupRetention ?? 14) },
118
120
  storageEncrypted: true,
119
121
  ...(storageEncryptionKey && { storageEncryptionKey }),
120
- clusterIdentifier: props.clusterIdentifier?.toLowerCase() ||
121
- resourceNaming_1.ResourceNaming.clusterId(props.databaseName || id),
122
+ clusterIdentifier: props.clusterIdentifier?.toLowerCase() || resourceNaming_1.ResourceNaming.clusterId(id),
122
123
  monitoringInterval: props.monitoringInterval || aws_cdk_lib_1.Duration.minutes(1),
123
124
  preferredMaintenanceWindow: props.preferredMaintenanceWindow || "Sat:12:30-Sat:20:30",
124
125
  port: this.port,
@@ -133,7 +134,7 @@ class RdsAurora extends constructs_1.Construct {
133
134
  ? {}
134
135
  : {
135
136
  credentials: aws_rds_1.Credentials.fromSecret(this.databaseCredentials.secret),
136
- defaultDatabaseName: props.databaseName || `${id.replace("Rds", "")}`
137
+ defaultDatabaseName: (props.databaseName || id.replace("Rds", "")).replace(/[^a-zA-Z0-9_]/g, "")
137
138
  };
138
139
  if (props.snapshotIdentifier) {
139
140
  // Create from snapshot - credentials need SnapshotCredentials type
@@ -201,7 +202,7 @@ class RdsAurora extends constructs_1.Construct {
201
202
  enablePerformanceInsights: enablePI,
202
203
  performanceInsightEncryptionKey: enablePI ? piKey : undefined,
203
204
  performanceInsightRetention: enablePI ? piRetention : undefined,
204
- instanceIdentifier: resourceNaming_1.ResourceNaming.readerInstanceId(props.databaseName, index + 1, config.identifierSuffix),
205
+ instanceIdentifier: resourceNaming_1.ResourceNaming.readerInstanceId(this.constructId, index + 1, config.identifierSuffix),
205
206
  caCertificate: aws_rds_1.CaCertificate.RDS_CA_RSA4096_G1,
206
207
  publiclyAccessible: props.publiclyAccessible,
207
208
  ...(config.availabilityZone && {
@@ -216,7 +217,7 @@ class RdsAurora extends constructs_1.Construct {
216
217
  subnetType: aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS
217
218
  };
218
219
  this.databaseProxy = new aws_rds_1.DatabaseProxy(this, `${props.databaseName}DatabaseProxy`, {
219
- dbProxyName: resourceNaming_1.ResourceNaming.proxyName(props.databaseName),
220
+ dbProxyName: resourceNaming_1.ResourceNaming.proxyName(this.constructId),
220
221
  proxyTarget: aws_rds_1.ProxyTarget.fromCluster(this.databaseCluster),
221
222
  secrets: [this.databaseCredentials.secret],
222
223
  securityGroups: [securityGroup],
@@ -229,9 +230,10 @@ class RdsAurora extends constructs_1.Construct {
229
230
  maxConnectionsPercent: proxyConfig.maxConnections,
230
231
  maxIdleConnectionsPercent: proxyConfig.maxIdleConnections
231
232
  });
232
- new aws_cdk_lib_1.CfnOutput(this, `${props.databaseName}ProxyEndpointOutput`, {
233
- key: `${props.databaseName}ProxyEndpoint`,
234
- exportName: `${props.databaseName}ProxyEndpoint`,
233
+ const outputName = (0, capitaliseString_1.toPascalCase)(props.databaseName || this.constructId);
234
+ new aws_cdk_lib_1.CfnOutput(this, `${outputName}ProxyEndpointOutput`, {
235
+ key: `${outputName}ProxyEndpoint`,
236
+ exportName: `${outputName}ProxyEndpoint`,
235
237
  value: this.databaseProxy.endpoint
236
238
  });
237
239
  }
@@ -241,7 +243,7 @@ class RdsAurora extends constructs_1.Construct {
241
243
  rotationConfig?.automaticallyAfter) ||
242
244
  aws_cdk_lib_1.Duration.days(30);
243
245
  const masterSecret = new secrets_1.Secret(this, `${props.databaseName}MasterSecret`, {
244
- secretName: resourceNaming_1.ResourceNaming.masterSecretName(props.databaseName)
246
+ secretName: resourceNaming_1.ResourceNaming.masterSecretName(this.constructId)
245
247
  });
246
248
  new aws_secretsmanager_1.SecretRotation(this, `${props.databaseName}SecretRotation`, {
247
249
  application: new aws_secretsmanager_1.SecretRotationApplication(this.engineConfig.rotationAppName, "1.1.367", { isMultiUser: true }),
@@ -283,12 +285,10 @@ class RdsAurora extends constructs_1.Construct {
283
285
  return aws_rds_1.PerformanceInsightRetention.MONTHS_6;
284
286
  case 372:
285
287
  return aws_rds_1.PerformanceInsightRetention.MONTHS_12;
286
- case 731:
287
- return aws_rds_1.PerformanceInsightRetention.LONG_TERM;
288
288
  default:
289
289
  return aws_rds_1.PerformanceInsightRetention.MONTHS_1;
290
290
  }
291
291
  }
292
292
  }
293
293
  exports.RdsAurora = RdsAurora;
294
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmRzQXVyb3JhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvZGF0YWJhc2UvcmRzQXVyb3JhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUFpRTtBQUVqRSxpREFRNkI7QUFDN0IsaURBa0I2QjtBQUM3Qix1RUFHd0M7QUFDeEMsMkNBQXVDO0FBQ3ZDLGdDQUF1QztBQUN2Qyx3Q0FBd0Q7QUFDeEQsa0VBQStEO0FBQy9ELDZEQVd3QztBQTJDeEMsTUFBYSxTQUFVLFNBQVEsc0JBQVM7SUFVdEMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFlO1FBQ3ZELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQztRQUVoQyw4RUFBOEU7UUFDOUUsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxJQUFJO1lBQ3hDLGVBQWUsRUFBRSxVQUFVO1lBQzNCLGFBQWEsRUFBRSxFQUFFLGVBQWUsRUFBRSxHQUFHLEVBQUU7WUFDdkMsZUFBZSxFQUFFLDhDQUE4QztTQUNoRSxDQUFDO1FBRUYsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixLQUFLLEtBQUssQ0FBQztRQUN0RCxNQUFNLFFBQVEsR0FDWixTQUFTLElBQUksT0FBTyxLQUFLLENBQUMsbUJBQW1CLEtBQUssUUFBUTtZQUN4RCxDQUFDLENBQUMsS0FBSyxDQUFDLG1CQUFtQjtZQUMzQixDQUFDLENBQUMsU0FBUyxDQUFDO1FBRWhCLDhFQUE4RTtRQUM5RSxNQUFNLFFBQVEsR0FDWixLQUFLLENBQUMsa0JBQWtCLElBQUksS0FBSyxDQUFDLGdCQUFnQjtZQUNoRCxDQUFDLENBQUMsS0FBSyxDQUFDLGdCQUFnQjtZQUN4QixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFF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QUFDLG1CQUFtQixDQUFDO0lBQ2xDLENBQUM7SUFFRCxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFTyw4QkFBOEIsQ0FDcEMsSUFBYTtRQUViLFFBQVEsSUFBSSxFQUFFLENBQUM7WUFDYixLQUFLLENBQUM7Z0JBQ0osT0FBTyxxQ0FBMkIsQ0FBQyxPQUFPLENBQUM7WUFDN0MsS0FBSyxFQUFFO2dCQUNMLE9BQU8scUNBQTJCLENBQUMsUUFBUSxDQUFDO1lBQzlDLEtBQUssRUFBRTtnQkFDTCxPQUFPLHFDQUEyQixDQUFDLFFBQVEsQ0FBQztZQUM5QyxLQUFLLEdBQUc7Z0JBQ04sT0FBTyxxQ0FBMkIsQ0FBQyxRQUFRLENBQUM7WUFDOUMsS0FBSyxHQUFHO2dCQUNOLE9BQU8scUNBQTJCLENBQUMsU0FBUyxDQUFDO1lBQy9DLEtBQUssR0FBRztnQkFDTixPQUFPLHFDQUEyQixDQUFDLFNBQVMsQ0FBQztZQUMvQztnQkFDRSxPQUFPLHFDQUEyQixDQUFDLFFBQVEsQ0FBQztRQUNoRCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBeFpELDhCQXdaQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENmbk91dHB1dCwgRHVyYXRpb24sIFJlbW92YWxQb2xpY3kgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IHR5cGUgSUtleSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mta21zXCI7XG5pbXBvcnQge1xuICBDb25uZWN0aW9ucyxcbiAgdHlwZSBJQ29ubmVjdGFibGUsXG4gIHR5cGUgSVNlY3VyaXR5R3JvdXAsXG4gIHR5cGUgSVZwYyxcbiAgUGVlcixcbiAgUG9ydCxcbiAgU3VibmV0VHlwZVxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHtcbiAgQXVyb3JhUG9zdGdyZXNFbmdpbmVWZXJzaW9uLFxuICBDYUNlcnRpZmljYXRlLFxuICBDbHVzdGVySW5zdGFuY2UsXG4gIENyZWRlbnRpYWxzLFxuICBEYXRhYmFzZUNsdXN0ZXIsXG4gIHR5cGUgRGF0YWJhc2VDbHVzdGVyUHJvcHMsXG4gIERhdGFiYXNlQ2x1c3RlckZyb21TbmFwc2hvdCxcbiAgdHlwZSBEYXRhYmFzZUNsdXN0ZXJGcm9tU25hcHNob3RQcm9wcyxcbiAgRGF0YWJhc2VDbHVzdGVyRW5naW5lLFxuICB0eXBlIENmbkRCQ2x1c3RlcixcbiAgRGF0YWJhc2VQcm94eSxcbiAgdHlwZSBJQ2x1c3RlckVuZ2luZSxcbiAgdHlwZSBJQ2x1c3Rlckluc3RhbmNlLFxuICBQYXJhbWV0ZXJHcm91cCxcbiAgUGVyZm9ybWFuY2VJbnNpZ2h0UmV0ZW50aW9uLFxuICBQcm94eVRhcmdldCxcbiAgU25hcHNob3RDcmVkZW50aWFsc1xufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJkc1wiO1xuaW1wb3J0IHtcbiAgU2VjcmV0Um90YXRpb24sXG4gIFNlY3JldFJvdGF0aW9uQXBwbGljYXRpb25cbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlclwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IFNlY3VyaXR5R3JvdXAgfSBmcm9tIFwiLi4vaWFtXCI7XG5pbXBvcnQgeyBDdXN0b21lck1hbmFnZWRLZXksIFNlY3JldCB9IGZyb20gXCIuLi9zZWNyZXRzXCI7XG5pbXBvcnQgeyBSZXNvdXJjZU5hbWluZyB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9yZXNvdXJjZU5hbWluZ1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBFbmdpbmVDb25maWcsXG4gIHR5cGUgUHJveHlDb25maWcsXG4gIHR5cGUgQ3JlZGVudGlhbHNDb25maWcsXG4gIHR5cGUgQXVyb3JhRW5jcnlwdGlvbkNvbmZpZyxcbiAgdHlwZSBBdXJvcmFXcml0ZXJDb25maWcsXG4gIHR5cGUgQXVyb3JhUmVhZGVyc0NvbmZpZyxcbiAgdHlwZSBBdXJvcmFSZWFkZXJDb25maWcsXG4gIHR5cGUgUGVyZm9ybWFuY2VJbnNpZ2h0c0NvbmZpZyxcbiAgaXNBd3NNYW5hZ2VkS2V5LFxuICBpc0NNS1JlcXVlc3RlZFxufSBmcm9tIFwiLi4vLi4vLi4vcGF0dGVybnMvYXdzL2RhdGFiYXNlXCI7XG5cbmludGVyZmFjZSBSZHNQcm9wcyB7XG4gIHZwYzogSVZwYztcbiAgZGF0YWJhc2VOYW1lPzogc3RyaW5nO1xuICBlbmdpbmU/OiBJQ2x1c3RlckVuZ2luZTtcbiAgZW5naW5lQ29uZmlnPzogRW5naW5lQ29uZmlnO1xuICBjbHVzdGVySWRlbnRpZmllcj86IHN0cmluZztcbiAgd3JpdGVyPzogQXVyb3JhV3JpdGVyQ29uZmlnO1xuICByZWFkZXJzPzogQXVyb3JhUmVhZGVyc0NvbmZpZyB8IGZhbHNlO1xuICBwcm94eT86IFByb3h5Q29uZmlnIHwgZmFsc2U7XG4gIGNyZWRlbnRpYWxzPzogQ3JlZGVudGlhbHNDb25maWc7XG4gIGVuY3J5cHRpb24/OiBBdXJvcmFFbmNyeXB0aW9uQ29uZmlnO1xuICBiYWNrdXBSZXRlbnRpb24/OiBudW1iZXI7XG4gIG1vbml0b3JpbmdJbnRlcnZhbD86IER1cmF0aW9uO1xuICBwcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdz86IHN0cmluZztcbiAgcG9ydD86IG51bWJlcjtcbiAgcGVyZm9ybWFuY2VJbnNpZ2h0cz86IFBlcmZvcm1hbmNlSW5zaWdodHNDb25maWcgfCBmYWxzZTtcbiAgLyoqIFNraXBzIHNlY3JldCByb3RhdGlvbiBmb3Igc2Vjb25kYXJ5IGNsdXN0ZXJzIGluIGdsb2JhbCBkYXRhYmFzZSAqL1xuICBpc0dsb2JhbFNlY29uZGFyeT86IGJvb2xlYW47XG4gIHNlY3JldFJlcGxpY2FSZWdpb25zPzogc3RyaW5nW107XG4gIGRlbGV0aW9uUHJvdGVjdGlvbj86IGJvb2xlYW47XG4gIC8qKiBBUk4gb3IgaWRlbnRpZmllciBvZiBEQiBjbHVzdGVyIHNuYXBzaG90IHRvIHJlc3RvcmUgZnJvbSAqL1xuICBzbmFwc2hvdElkZW50aWZpZXI/OiBzdHJpbmc7XG4gIC8qKiBVc2VybmFtZSBmcm9tIHRoZSBzbmFwc2hvdCAocmVxdWlyZWQgd2hlbiByZXN0b3JpbmcgZnJvbSBzbmFwc2hvdCB0byByZXNldCBwYXNzd29yZCkgKi9cbiAgc25hcHNob3RVc2VybmFtZT86IHN0cmluZztcbiAgLyoqIEFsbG93IGFjY2VzcyBmcm9tIFZQQyBDSURSIChhdm9pZHMgY3Jvc3Mtc3RhY2sgY3ljbGljIGRlcGVuZGVuY2llcyB3aXRoIExhbWJkYSkgKi9cbiAgYWxsb3dWcGNBY2Nlc3M/OiBib29sZWFuO1xuICAvKipcbiAgICogTWFrZSBkYXRhYmFzZSBwdWJsaWNseSBhY2Nlc3NpYmxlIGZyb20gdGhlIGludGVybmV0LlxuICAgKiBXQVJOSU5HOiBUaGlzIGlzIGEgc2VjdXJpdHkgcmlzayBhbmQgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgZGV2ZWxvcG1lbnRcbiAgICogb3Igd2hlbiBidWlsZGluZyBQYXlsb2FkIGFwcHMgbG9jYWxseSB0aGF0IG5lZWQgZGF0YWJhc2UgYWNjZXNzLlxuICAgKiBXaGVuIGVuYWJsZWQsIHRoZSBkYXRhYmFzZSBpcyBwbGFjZWQgaW4gcHVibGljIHN1Ym5ldHMuXG4gICAqL1xuICBwdWJsaWNseUFjY2Vzc2libGU/OiBib29sZWFuO1xuICAvKipcbiAgICogSVAgYWRkcmVzcyB0byBhbGxvdyBhY2Nlc3MgZnJvbSB3aGVuIHB1YmxpY2x5QWNjZXNzaWJsZSBpcyB0cnVlLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCBhY2Nlc3MgaXMgcmVzdHJpY3RlZCB0byBWUEMgb25seSBldmVuIHdoZW4gcHVibGljLlxuICAgKiBGb3JtYXQ6IENJRFIgbm90YXRpb24gKGUuZy4sIFwiMjAzLjAuMTEzLjAvMzJcIiBmb3Igc2luZ2xlIElQKVxuICAgKi9cbiAgYWxsb3dlZElwQ2lkcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFJkc0F1cm9yYSBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElDb25uZWN0YWJsZSB7XG4gIHB1YmxpYyBjb25uZWN0aW9uczogQ29ubmVjdGlvbnM7XG5cbiAgcHJpdmF0ZSBwb3J0OiBudW1iZXI7XG4gIHByaXZhdGUgZW5naW5lQ29uZmlnOiBFbmdpbmVDb25maWc7XG4gIHByaXZhdGUgZGF0YWJhc2VDbHVzdGVyOiBEYXRhYmFzZUNsdXN0ZXI7XG4gIHByaXZhdGUgZGF0YWJhc2VQcm94eT86IERhdGFiYXNlUHJveHk7XG4gIHByaXZhdGUgZGF0YWJhc2VDcmVkZW50aWFsczogU2VjcmV0O1xuICBwcml2YXRlIGNmbkNsdXN0ZXI/OiBDZm5EQkNsdXN0ZXI7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFJkc1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMucG9ydCA9IHByb3BzLnBvcnQgPz8gMzUyNTU7XG5cbiAgICAvLyBQb3N0Z3JlU1FMIGZhbGxiYWNrIGZvciBkaXJlY3QgdXNhZ2UgLSBlbnN1cmUgZW5naW5lIGFuZCBlbmdpbmVDb25maWcgbWF0Y2hcbiAgICB0aGlzLmVuZ2luZUNvbmZpZyA9IHByb3BzLmVuZ2luZUNvbmZpZyA/PyB7XG4gICAgICBkZWZhdWx0VXNlcm5hbWU6IFwicG9zdGdyZXNcIixcbiAgICAgIHNzbFBhcmFtZXRlcnM6IHsgXCJyZHMuZm9yY2Vfc3NsXCI6IFwiMVwiIH0sXG4gICAgICByb3RhdGlvbkFwcE5hbWU6IFwiU2VjcmV0c01hbmFnZXJSRFNQb3N0Z3JlU1FMUm90YXRpb25NdWx0aVVzZXJcIlxuICAgIH07XG5cbiAgICBjb25zdCBwaUVuYWJsZWQgPSBwcm9wcy5wZXJmb3JtYW5jZUluc2lnaHRzICE9PSBmYWxzZTtcbiAgICBjb25zdCBwaUNvbmZpZyA9XG4gICAgICBwaUVuYWJsZWQgJiYgdHlwZW9mIHByb3BzLnBlcmZvcm1hbmNlSW5zaWdodHMgPT09IFwib2JqZWN0XCJcbiAgICAgICAgPyBwcm9wcy5wZXJmb3JtYW5jZUluc2lnaHRzXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gVXNlcm5hbWUgcHJpb3JpdHk6IHNuYXBzaG90VXNlcm5hbWUgPiBjcmVkZW50aWFscy51c2VybmFtZSA+IGVuZ2luZSBkZWZhdWx0XG4gICAgY29uc3QgdXNlcm5hbWUgPVxuICAgICAgcHJvcHMuc25hcHNob3RJZGVudGlmaWVyICYmIHByb3BzLnNuYXBzaG90VXNlcm5hbWVcbiAgICAgICAgPyBwcm9wcy5zbmFwc2hvdFVzZXJuYW1lXG4gICAgICAgIDogKHByb3BzLmNyZWRlbnRpYWxzPy51c2VybmFtZSA/PyB0aGlzLmVuZ2luZUNvbmZpZy5kZWZhdWx0VXNlcm5hbWUpO1xuXG4gICAgLy8gR2xvYmFsIHNlY29uZGFyeSBjbHVzdGVycyBpbXBvcnQgcmVwbGljYXRlZCBzZWNyZXQgaW5zdGVhZCBvZiBjcmVhdGluZyBuZXdcbiAgICBpZiAocHJvcHMuaXNHbG9iYWxTZWNvbmRhcnkpIHtcbiAgICAgIHRoaXMuZGF0YWJhc2VDcmVkZW50aWFscyA9IG5ldyBTZWNyZXQoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1DcmVkZW50aWFsc2AsXG4gICAgICAgIHtcbiAgICAgICAgICBzZWNyZXROYW1lOiBSZXNvdXJjZU5hbWluZy5jcmVkZW50aWFsc1NlY3JldE5hbWUocHJvcHMuZGF0YWJhc2VOYW1lISksXG4gICAgICAgICAgaW1wb3J0RXhpc3Rpbmc6IHRydWVcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRhYmFzZUNyZWRlbnRpYWxzID0gbmV3IFNlY3JldChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfUNyZWRlbnRpYWxzYCxcbiAgICAgICAge1xuICAgICAgICAgIHNlY3JldE5hbWU6IFJlc291cmNlTmFtaW5nLmNyZWRlbnRpYWxzU2VjcmV0TmFtZShwcm9wcy5kYXRhYmFzZU5hbWUhKSxcbiAgICAgICAgICBnZW5lcmF0ZVNlY3JldFN0cmluZzoge1xuICAgICAgICAgICAgc2VjcmV0U3RyaW5nVGVtcGxhdGU6IEpTT04uc3RyaW5naWZ5KHsgdXNlcm5hbWUgfSksXG4gICAgICAgICAgICBleGNsdWRlUHVuY3R1YXRpb246IHRydWUsXG4gICAgICAgICAgICBpbmNsdWRlU3BhY2U6IGZhbHNlLFxuICAgICAgICAgICAgZ2VuZXJhdGVTdHJpbmdLZXk6IFwicGFzc3dvcmRcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVwbGljYVJlZ2lvbnM6IHByb3BzLnNlY3JldFJlcGxpY2FSZWdpb25zXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RvcmFnZUVuY3J5cHRpb25LZXkgPSBpc0NNS1JlcXVlc3RlZChwcm9wcy5lbmNyeXB0aW9uPy5zdG9yYWdlS2V5KVxuICAgICAgPyBuZXcgQ3VzdG9tZXJNYW5hZ2VkS2V5KFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfUNsdXN0ZXJFbmNyeXB0aW9uS2V5YCxcbiAgICAgICAgICB7IGFsaWFzTmFtZTogYGNtay9yZHMvJHtwcm9wcy5kYXRhYmFzZU5hbWV9L2VuY3J5cHRpb25LZXlgIH1cbiAgICAgICAgKS5rZXlcbiAgICAgIDogaXNBd3NNYW5hZ2VkS2V5KHByb3BzLmVuY3J5cHRpb24/LnN0b3JhZ2VLZXkpIHx8XG4gICAgICAgICAgcHJvcHMuZW5jcnlwdGlvbj8uc3RvcmFnZUtleSA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gdW5kZWZpbmVkIC8vIEFXUyBNYW5hZ2VkIChkZWZhdWx0KVxuICAgICAgICA6IHByb3BzLmVuY3J5cHRpb24/LnN0b3JhZ2VLZXk7IC8vIFVzZSBwcm92aWRlZCBJS2V5XG5cbiAgICBjb25zdCBwZXJmb3JtYW5jZUluc2lnaHRzS2V5ID1cbiAgICAgIHBpRW5hYmxlZCAmJiBpc0NNS1JlcXVlc3RlZChwaUNvbmZpZz8uZW5jcnlwdGlvbktleSlcbiAgICAgICAgPyBuZXcgQ3VzdG9tZXJNYW5hZ2VkS2V5KFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1QZXJmb3JtYW5jZUluc2lnaHRzS2V5YCxcbiAgICAgICAgICAgIHsgYWxpYXNOYW1lOiBgY21rL3Jkcy8ke3Byb3BzLmRhdGFiYXNlTmFtZX0vSW5zaWdodHNLZXlgIH1cbiAgICAgICAgICApLmtleVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGNsdXN0ZXJTZWN1cml0eUdyb3VwID0gbmV3IFNlY3VyaXR5R3JvdXAodGhpcywgYCR7aWR9U2VjdXJpdHlHcm91cGAsIHtcbiAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgZGVzY3JpcHRpb246IGBTZWN1cml0eSBncm91cCBmb3IgQXVyb3JhIGNsdXN0ZXIgJHtwcm9wcy5kYXRhYmFzZU5hbWV9YFxuICAgIH0pO1xuXG4gICAgY2x1c3RlclNlY3VyaXR5R3JvdXAuYWRkSW5ncmVzc1J1bGUoXG4gICAgICBjbHVzdGVyU2VjdXJpdHlHcm91cCxcbiAgICAgIFBvcnQudGNwKHRoaXMucG9ydClcbiAgICApO1xuXG4gICAgLy8gQWxsb3cgVlBDLXdpZGUgYWNjZXNzIHdoZW4gZW5hYmxlZCAoYXZvaWRzIGNyb3NzLXN0YWNrIGN5Y2xpYyBkZXBlbmRlbmNpZXMpXG4gICAgaWYgKHByb3BzLmFsbG93VnBjQWNjZXNzKSB7XG4gICAgICBjbHVzdGVyU2VjdXJpdHlHcm91cC5hZGRJbmdyZXNzUnVsZShcbiAgICAgICAgUGVlci5pcHY0KHByb3BzLnZwYy52cGNDaWRyQmxvY2spLFxuICAgICAgICBQb3J0LnRjcCh0aGlzLnBvcnQpLFxuICAgICAgICBcIkFsbG93IGFjY2VzcyBmcm9tIFZQQyBDSURSXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQWxsb3cgZXh0ZXJuYWwgYWNjZXNzIHdoZW4gcHVibGljbHkgYWNjZXNzaWJsZSB3aXRoIGFsbG93ZWQgSVBcbiAgICBpZiAocHJvcHMucHVibGljbHlBY2Nlc3NpYmxlICYmIHByb3BzLmFsbG93ZWRJcENpZHIpIHtcbiAgICAgIGNsdXN0ZXJTZWN1cml0eUdyb3VwLmFkZEluZ3Jlc3NSdWxlKFxuICAgICAgICBQZWVyLmlwdjQocHJvcHMuYWxsb3dlZElwQ2lkciksXG4gICAgICAgIFBvcnQudGNwKHRoaXMucG9ydCksXG4gICAgICAgIFwiQWxsb3cgZXh0ZXJuYWwgYWNjZXNzIGZyb20gYWxsb3dlZCBJUFwiXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuY29ubmVjdGlvbnMgPSBuZXcgQ29ubmVjdGlvbnMoe1xuICAgICAgc2VjdXJpdHlHcm91cHM6IFtjbHVzdGVyU2VjdXJpdHlHcm91cF0sXG4gICAgICBkZWZhdWx0UG9ydDogUG9ydC50Y3AodGhpcy5wb3J0KVxuICAgIH0pO1xuXG4gICAgY29uc3Qgd3JpdGVyQ29uZmlnID0gcHJvcHMud3JpdGVyID8/IHt9O1xuICAgIGNvbnN0IHdyaXRlclBJID0gd3JpdGVyQ29uZmlnLmVuYWJsZVBlcmZvcm1hbmNlSW5zaWdodHMgPz8gcGlFbmFibGVkO1xuICAgIGNvbnN0IHdyaXRlclN1ZmZpeCA9IHdyaXRlckNvbmZpZy5pZGVudGlmaWVyU3VmZml4ID8/IFwicHJpbWFyeS13cml0ZXJcIjtcbiAgICBjb25zdCBwZXJmb3JtYW5jZUluc2lnaHRzUmV0ZW50aW9uID0gdGhpcy5nZXRQZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb24oXG4gICAgICBwaUNvbmZpZz8ucmV0ZW50aW9uUGVyaW9kID8/IDdcbiAgICApO1xuICAgIGNvbnN0IGRhdGFiYXNlTmFtZSA9IHByb3BzLmRhdGFiYXNlTmFtZSB8fCBpZDtcblxuICAgIGNvbnN0IHdyaXRlciA9IENsdXN0ZXJJbnN0YW5jZS5zZXJ2ZXJsZXNzVjIoYCR7ZGF0YWJhc2VOYW1lfVdyaXRlcmAsIHtcbiAgICAgIGVuYWJsZVBlcmZvcm1hbmNlSW5zaWdodHM6IHdyaXRlclBJLFxuICAgICAgcGVyZm9ybWFuY2VJbnNpZ2h0RW5jcnlwdGlvbktleTogd3JpdGVyUElcbiAgICAgICAgPyBwZXJmb3JtYW5jZUluc2lnaHRzS2V5XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgcGVyZm9ybWFuY2VJbnNpZ2h0UmV0ZW50aW9uOiB3cml0ZXJQSVxuICAgICAgICA/IHBlcmZvcm1hbmNlSW5zaWdodHNSZXRlbnRpb25cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBpbnN0YW5jZUlkZW50aWZpZXI6IFJlc291cmNlTmFtaW5nLndyaXRlckluc3RhbmNlSWQoXG4gICAgICAgIGRhdGFiYXNlTmFtZSxcbiAgICAgICAgd3JpdGVyU3VmZml4XG4gICAgICApLFxuICAgICAgY2FDZXJ0aWZpY2F0ZTogQ2FDZXJ0aWZpY2F0ZS5SRFNfQ0FfUlNBNDA5Nl9HMSxcbiAgICAgIHB1YmxpY2x5QWNjZXNzaWJsZTogcHJvcHMucHVibGljbHlBY2Nlc3NpYmxlLFxuICAgICAgLi4uKHdyaXRlckNvbmZpZy5hdmFpbGFiaWxpdHlab25lICYmIHtcbiAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogd3JpdGVyQ29uZmlnLmF2YWlsYWJpbGl0eVpvbmVcbiAgICAgIH0pXG4gICAgfSk7XG5cbiAgICBjb25zdCByZWFkZXJzID0gdGhpcy5idWlsZFJlYWRlcnMoXG4gICAgICBwcm9wcyxcbiAgICAgIHBpRW5hYmxlZCxcbiAgICAgIHBlcmZvcm1hbmNlSW5zaWdodHNLZXksXG4gICAgICBwZXJmb3JtYW5jZUluc2lnaHRzUmV0ZW50aW9uXG4gICAgKTtcblxuICAgIGNvbnN0IGVuZ2luZSA9XG4gICAgICBwcm9wcy5lbmdpbmUgfHxcbiAgICAgIERhdGFiYXNlQ2x1c3RlckVuZ2luZS5hdXJvcmFQb3N0Z3Jlcyh7XG4gICAgICAgIHZlcnNpb246IEF1cm9yYVBvc3RncmVzRW5naW5lVmVyc2lvbi5vZihcIjE2LjZcIiwgXCIxNlwiKVxuICAgICAgfSk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJHcm91cCA9IG5ldyBQYXJhbWV0ZXJHcm91cChcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9UGFyYW1ldGVyR3JvdXBgLFxuICAgICAge1xuICAgICAgICBlbmdpbmUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUGFyYW1ldGVyIGdyb3VwIGZvciAke3Byb3BzLmRhdGFiYXNlTmFtZX0gd2l0aCBzZWN1cml0eSBkZWZhdWx0c2AsXG4gICAgICAgIHBhcmFtZXRlcnM6IHRoaXMuZW5naW5lQ29uZmlnLnNzbFBhcmFtZXRlcnNcbiAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gVXNlIHB1YmxpYyBzdWJuZXRzIHdoZW4gcHVibGljbHkgYWNjZXNzaWJsZSwgb3RoZXJ3aXNlIHByaXZhdGVcbiAgICBjb25zdCB2cGNTdWJuZXRzID0gcHJvcHMucHVibGljbHlBY2Nlc3NpYmxlXG4gICAgICA/IHsgc3VibmV0VHlwZTogU3VibmV0VHlwZS5QVUJMSUMgfVxuICAgICAgOiB7IHN1Ym5ldFR5cGU6IFN1Ym5ldFR5cGUuUFJJVkFURV9XSVRIX0VHUkVTUyB9O1xuXG4gICAgLy8gQ29tbW9uIHByb3BzIHNoYXJlZCBhY3Jvc3MgYWxsIGNsdXN0ZXIgY3JlYXRpb24gcGF0aHNcbiAgICBjb25zdCBiYXNlQ2x1c3RlclByb3BzID0ge1xuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICB2cGNTdWJuZXRzLFxuICAgICAgc2VjdXJpdHlHcm91cHM6IFtjbHVzdGVyU2VjdXJpdHlHcm91cF0gYXMgSVNlY3VyaXR5R3JvdXBbXSxcbiAgICAgIGVuZ2luZSxcbiAgICAgIHBhcmFtZXRlckdyb3VwLFxuICAgICAgYmFja3VwOiB7IHJldGVudGlvbjogRHVyYXRpb24uZGF5cyhwcm9wcy5iYWNrdXBSZXRlbnRpb24gPz8gMTQpIH0sXG4gICAgICBzdG9yYWdlRW5jcnlwdGVkOiB0cnVlLFxuICAgICAgLi4uKHN0b3JhZ2VFbmNyeXB0aW9uS2V5ICYmIHsgc3RvcmFnZUVuY3J5cHRpb25LZXkgfSksXG4gICAgICBjbHVzdGVySWRlbnRpZmllcjpcbiAgICAgICAgcHJvcHMuY2x1c3RlcklkZW50aWZpZXI/LnRvTG93ZXJDYXNlKCkgfHxcbiAgICAgICAgUmVzb3VyY2VOYW1pbmcuY2x1c3RlcklkKHByb3BzLmRhdGFiYXNlTmFtZSB8fCBpZCksXG4gICAgICBtb25pdG9yaW5nSW50ZXJ2YWw6IHByb3BzLm1vbml0b3JpbmdJbnRlcnZhbCB8fCBEdXJhdGlvbi5taW51dGVzKDEpLFxuICAgICAgcHJlZmVycmVkTWFpbnRlbmFuY2VXaW5kb3c6XG4gICAgICAgIHByb3BzLnByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93IHx8IFwiU2F0OjEyOjMwLVNhdDoyMDozMFwiLFxuICAgICAgcG9ydDogdGhpcy5wb3J0LFxuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5TTkFQU0hPVCxcbiAgICAgIGRlbGV0aW9uUHJvdGVjdGlvbjogcHJvcHMuZGVsZXRpb25Qcm90ZWN0aW9uID8/IHRydWUsXG4gICAgICBpYW1BdXRoZW50aWNhdGlvbjogdHJ1ZSxcbiAgICAgIHdyaXRlcixcbiAgICAgIHJlYWRlcnNcbiAgICB9O1xuXG4gICAgLy8gQ3JlZGVudGlhbHMgYW5kIGRhdGFiYXNlIG5hbWUgZm9yIG5vbi1nbG9iYWwtc2Vjb25kYXJ5IGNsdXN0ZXJzXG4gICAgY29uc3QgcHJpbWFyeUNsdXN0ZXJQcm9wcyA9IHByb3BzLmlzR2xvYmFsU2Vjb25kYXJ5XG4gICAgICA/IHt9XG4gICAgICA6IHtcbiAgICAgICAgICBjcmVkZW50aWFsczogQ3JlZGVudGlhbHMuZnJvbVNlY3JldCh0aGlzLmRhdGFiYXNlQ3JlZGVudGlhbHMuc2VjcmV0KSxcbiAgICAgICAgICBkZWZhdWx0RGF0YWJhc2VOYW1lOiBwcm9wcy5kYXRhYmFzZU5hbWUgfHwgYCR7aWQucmVwbGFjZShcIlJkc1wiLCBcIlwiKX1gXG4gICAgICAgIH07XG5cbiAgICBpZiAocHJvcHMuc25hcHNob3RJZGVudGlmaWVyKSB7XG4gICAgICAvLyBDcmVhdGUgZnJvbSBzbmFwc2hvdCAtIGNyZWRlbnRpYWxzIG5lZWQgU25hcHNob3RDcmVkZW50aWFscyB0eXBlXG4gICAgICBjb25zdCBzbmFwc2hvdENyZWRlbnRpYWxzID0gcHJvcHMuaXNHbG9iYWxTZWNvbmRhcnlcbiAgICAgICAgPyB7fVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzOiBTbmFwc2hvdENyZWRlbnRpYWxzLmZyb21TZWNyZXQoXG4gICAgICAgICAgICAgIHRoaXMuZGF0YWJhc2VDcmVkZW50aWFscy5zZWNyZXRcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9O1xuXG4gICAgICB0aGlzLmRhdGFiYXNlQ2x1c3RlciA9IG5ldyBEYXRhYmFzZUNsdXN0ZXJGcm9tU25hcHNob3QoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGAke2lkfURhdGFiYXNlYCxcbiAgICAgICAgLy8gVHlwZSBhc3NlcnRpb246IENESydzIFNuYXBzaG90Q3JlZGVudGlhbHMudXNlcm5hbWUgaXMgc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICAgIC8vIGJ1dCBEYXRhYmFzZUNsdXN0ZXJGcm9tU25hcHNob3RQcm9wcyBleHBlY3RzIHN0cmluZy4gV29ya3MgYXQgcnVudGltZS5cbiAgICAgICAge1xuICAgICAgICAgIC4uLmJhc2VDbHVzdGVyUHJvcHMsXG4gICAgICAgICAgLi4uc25hcHNob3RDcmVkZW50aWFscyxcbiAgICAgICAgICBzbmFwc2hvdElkZW50aWZpZXI6IHByb3BzLnNuYXBzaG90SWRlbnRpZmllclxuICAgICAgICB9IGFzIERhdGFiYXNlQ2x1c3RlckZyb21TbmFwc2hvdFByb3BzXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDcmVhdGUgbmV3IGNsdXN0ZXJcbiAgICAgIHRoaXMuZGF0YWJhc2VDbHVzdGVyID0gbmV3IERhdGFiYXNlQ2x1c3RlcihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYCR7aWR9RGF0YWJhc2VgLFxuICAgICAgICAvLyBUeXBlIGFzc2VydGlvbjogc3ByZWFkIHR5cGVzIGRvbid0IHByZXNlcnZlIHJlcXVpcmVkIHByb3BlcnR5IG5hcnJvd2luZ1xuICAgICAgICB7IC4uLmJhc2VDbHVzdGVyUHJvcHMsIC4uLnByaW1hcnlDbHVzdGVyUHJvcHMgfSBhcyBEYXRhYmFzZUNsdXN0ZXJQcm9wc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmNmbkNsdXN0ZXIgPSB0aGlzLmRhdGFiYXNlQ2x1c3Rlci5ub2RlLmRlZmF1bHRDaGlsZCBhcyBDZm5EQkNsdXN0ZXI7XG5cbiAgICAvLyBHbG9iYWwgc2Vjb25kYXJ5IGNsdXN0ZXJzIGNhbid0IHNwZWNpZnkgdGhlc2UgcHJvcGVydGllc1xuICAgIGlmIChwcm9wcy5pc0dsb2JhbFNlY29uZGFyeSAmJiB0aGlzLmNmbkNsdXN0ZXIpIHtcbiAgICAgIHRoaXMuY2ZuQ2x1c3Rlci5tYXN0ZXJVc2VybmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuY2ZuQ2x1c3Rlci5tYXN0ZXJVc2VyUGFzc3dvcmQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmNmbkNsdXN0ZXIuZGF0YWJhc2VOYW1lID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHByb3h5RW5hYmxlZCA9IHByb3BzLnByb3h5ICE9PSB1bmRlZmluZWQgJiYgcHJvcHMucHJveHkgIT09IGZhbHNlO1xuICAgIGlmIChwcm94eUVuYWJsZWQpIHtcbiAgICAgIHRoaXMuYWRkUHJveHkocHJvcHMsIGNsdXN0ZXJTZWN1cml0eUdyb3VwKTtcbiAgICB9XG5cbiAgICAvLyBTZWNyZXQgcm90YXRpb24gZW5hYmxlZCBieSBkZWZhdWx0IChvcHQtb3V0IHdpdGggc2VjcmV0Um90YXRpb246IGZhbHNlKVxuICAgIGlmICghcHJvcHMuaXNHbG9iYWxTZWNvbmRhcnkpIHtcbiAgICAgIGNvbnN0IHNlY3JldFJvdGF0aW9uRGlzYWJsZWQgPVxuICAgICAgICBwcm9wcy5jcmVkZW50aWFscz8uc2VjcmV0Um90YXRpb24gPT09IGZhbHNlO1xuICAgICAgaWYgKCFzZWNyZXRSb3RhdGlvbkRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuYWRkU2VjcmV0Um90YXRpb24ocHJvcHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRSZWFkZXJzKFxuICAgIHByb3BzOiBSZHNQcm9wcyxcbiAgICBkZWZhdWx0UElFbmFibGVkOiBib29sZWFuLFxuICAgIHBpS2V5PzogSUtleSxcbiAgICBwaVJldGVudGlvbj86IFBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvblxuICApOiBJQ2x1c3Rlckluc3RhbmNlW10ge1xuICAgIGlmIChwcm9wcy5yZWFkZXJzID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGxldCByZWFkZXJDb25maWdzOiBBdXJvcmFSZWFkZXJDb25maWdbXTtcbiAgICBpZiAocHJvcHMucmVhZGVycz8uaW5zdGFuY2VzKSB7XG4gICAgICByZWFkZXJDb25maWdzID0gcHJvcHMucmVhZGVycy5pbnN0YW5jZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvdW50ID0gcHJvcHMucmVhZGVycz8uY291bnQgPz8gMTtcbiAgICAgIHJlYWRlckNvbmZpZ3MgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoXywgaSkgPT4gKHtcbiAgICAgICAgc2NhbGVXaXRoV3JpdGVyOiBpID09PSAwXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdFBJID1cbiAgICAgIHByb3BzLnJlYWRlcnMgJiYgXCJkZWZhdWx0RW5hYmxlUGVyZm9ybWFuY2VJbnNpZ2h0c1wiIGluIHByb3BzLnJlYWRlcnNcbiAgICAgICAgPyAocHJvcHMucmVhZGVycy5kZWZhdWx0RW5hYmxlUGVyZm9ybWFuY2VJbnNpZ2h0cyA/PyBkZWZhdWx0UElFbmFibGVkKVxuICAgICAgICA6IGRlZmF1bHRQSUVuYWJsZWQ7XG5cbiAgICByZXR1cm4gcmVhZGVyQ29uZmlncy5tYXAoKGNvbmZpZywgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGVuYWJsZVBJID0gY29uZmlnLmVuYWJsZVBlcmZvcm1hbmNlSW5zaWdodHMgPz8gZGVmYXVsdFBJO1xuICAgICAgY29uc3QgX2lkZW50aWZpZXIgPSBjb25maWcuaWRlbnRpZmllclN1ZmZpeCA/PyBgcmVhZGVyLSR7aW5kZXggKyAxfWA7XG5cbiAgICAgIHJldHVybiBDbHVzdGVySW5zdGFuY2Uuc2VydmVybGVzc1YyKFxuICAgICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9UmVhZGVyJHtpbmRleCArIDF9YCxcbiAgICAgICAge1xuICAgICAgICAgIHNjYWxlV2l0aFdyaXRlcjogY29uZmlnLnNjYWxlV2l0aFdyaXRlciA/PyBpbmRleCA9PT0gMCxcbiAgICAgICAgICBlbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzOiBlbmFibGVQSSxcbiAgICAgICAgICBwZXJmb3JtYW5jZUluc2lnaHRFbmNyeXB0aW9uS2V5OiBlbmFibGVQSSA/IHBpS2V5IDogdW5kZWZpbmVkLFxuICAgICAgICAgIHBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbjogZW5hYmxlUEkgPyBwaVJldGVudGlvbiA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBpbnN0YW5jZUlkZW50aWZpZXI6IFJlc291cmNlTmFtaW5nLnJlYWRlckluc3RhbmNlSWQoXG4gICAgICAgICAgICBwcm9wcy5kYXRhYmFzZU5hbWUhLFxuICAgICAgICAgICAgaW5kZXggKyAxLFxuICAgICAgICAgICAgY29uZmlnLmlkZW50aWZpZXJTdWZmaXhcbiAgICAgICAgICApLFxuICAgICAgICAgIGNhQ2VydGlmaWNhdGU6IENhQ2VydGlmaWNhdGUuUkRTX0NBX1JTQTQwOTZfRzEsXG4gICAgICAgICAgcHVibGljbHlBY2Nlc3NpYmxlOiBwcm9wcy5wdWJsaWNseUFjY2Vzc2libGUsXG4gICAgICAgICAgLi4uKGNvbmZpZy5hdmFpbGFiaWxpdHlab25lICYmIHtcbiAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmU6IGNvbmZpZy5hdmFpbGFiaWxpdHlab25lXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUHJveHkocHJvcHM6IFJkc1Byb3BzLCBzZWN1cml0eUdyb3VwOiBTZWN1cml0eUdyb3VwKTogdm9pZCB7XG4gICAgY29uc3QgcHJveHlDb25maWcgPSBwcm9wcy5wcm94eSBhcyBQcm94eUNvbmZpZztcbiAgICBjb25zdCB2cGNTdWJuZXRzID0gcHJveHlDb25maWcudnBjU3VibmV0cyA/PyB7XG4gICAgICBzdWJuZXRUeXBlOiBTdWJuZXRUeXBlLlBSSVZBVEVfV0lUSF9FR1JFU1NcbiAgICB9O1xuXG4gICAgdGhpcy5kYXRhYmFzZVByb3h5ID0gbmV3IERhdGFiYXNlUHJveHkoXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfURhdGFiYXNlUHJveHlgLFxuICAgICAge1xuICAgICAgICBkYlByb3h5TmFtZTogUmVzb3VyY2VOYW1pbmcucHJveHlOYW1lKHByb3BzLmRhdGFiYXNlTmFtZSEpLFxuICAgICAgICBwcm94eVRhcmdldDogUHJveHlUYXJnZXQuZnJvbUNsdXN0ZXIodGhpcy5kYXRhYmFzZUNsdXN0ZXIpLFxuICAgICAgICBzZWNyZXRzOiBbdGhpcy5kYXRhYmFzZUNyZWRlbnRpYWxzLnNlY3JldF0sXG4gICAgICAgIHNlY3VyaXR5R3JvdXBzOiBbc2VjdXJpdHlHcm91cF0sXG4gICAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgICB2cGNTdWJuZXRzLFxuICAgICAgICByZXF1aXJlVExTOiBwcm94eUNvbmZpZy5yZXF1aXJlVExTID8/IHRydWUsXG4gICAgICAgIGJvcnJvd1RpbWVvdXQ6IHByb3h5Q29uZmlnLmNvbm5lY3Rpb25Cb3Jyb3dUaW1lb3V0XG4gICAgICAgICAgPyBEdXJhdGlvbi5zZWNvbmRzKHByb3h5Q29uZmlnLmNvbm5lY3Rpb25Cb3Jyb3dUaW1lb3V0KVxuICAgICAgICAgIDogRHVyYXRpb24uc2Vjb25kcygxMjApLFxuICAgICAgICBtYXhDb25uZWN0aW9uc1BlcmNlbnQ6IHByb3h5Q29uZmlnLm1heENvbm5lY3Rpb25zLFxuICAgICAgICBtYXhJZGxlQ29ubmVjdGlvbnNQZXJjZW50OiBwcm94eUNvbmZpZy5tYXhJZGxlQ29ubmVjdGlvbnNcbiAgICAgIH1cbiAgICApO1xuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9UHJveHlFbmRwb2ludE91dHB1dGAsIHtcbiAgICAgIGtleTogYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVByb3h5RW5kcG9pbnRgLFxuICAgICAgZXhwb3J0TmFtZTogYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVByb3h5RW5kcG9pbnRgLFxuICAgICAgdmFsdWU6IHRoaXMuZGF0YWJhc2VQcm94eS5lbmRwb2ludFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRTZWNyZXRSb3RhdGlvbihwcm9wczogUmRzUHJvcHMpOiB2b2lkIHtcbiAgICBjb25zdCByb3RhdGlvbkNvbmZpZyA9IHByb3BzLmNyZWRlbnRpYWxzPy5zZWNyZXRSb3RhdGlvbjtcbiAgICBjb25zdCByb3RhdGlvblBlcmlvZCA9XG4gICAgICAodHlwZW9mIHJvdGF0aW9uQ29uZmlnID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIHJvdGF0aW9uQ29uZmlnPy5hdXRvbWF0aWNhbGx5QWZ0ZXIpIHx8XG4gICAgICBEdXJhdGlvbi5kYXlzKDMwKTtcblxuICAgIGNvbnN0IG1hc3RlclNlY3JldCA9IG5ldyBTZWNyZXQodGhpcywgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfU1hc3RlclNlY3JldGAsIHtcbiAgICAgIHNlY3JldE5hbWU6IFJlc291cmNlTmFtaW5nLm1hc3RlclNlY3JldE5hbWUocHJvcHMuZGF0YWJhc2VOYW1lISlcbiAgICB9KTtcblxuICAgIG5ldyBTZWNyZXRSb3RhdGlvbih0aGlzLCBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9U2VjcmV0Um90YXRpb25gLCB7XG4gICAgICBhcHBsaWNhdGlvbjogbmV3IFNlY3JldFJvdGF0aW9uQXBwbGljYXRpb24oXG4gICAgICAgIHRoaXMuZW5naW5lQ29uZmlnLnJvdGF0aW9uQXBwTmFtZSxcbiAgICAgICAgXCIxLjEuMzY3XCIsXG4gICAgICAgIHsgaXNNdWx0aVVzZXI6IHRydWUgfVxuICAgICAgKSxcbiAgICAgIHNlY3JldDogdGhpcy5kYXRhYmFzZUNyZWRlbnRpYWxzLnNlY3JldCxcbiAgICAgIG1hc3RlclNlY3JldDogbWFzdGVyU2VjcmV0LnNlY3JldCxcbiAgICAgIHRhcmdldDogdGhpcy5kYXRhYmFzZUNsdXN0ZXIsXG4gICAgICB2cGM6IHRoaXMuZGF0YWJhc2VDbHVzdGVyLnZwYyxcbiAgICAgIGF1dG9tYXRpY2FsbHlBZnRlcjogcm90YXRpb25QZXJpb2RcbiAgICB9KTtcbiAgfVxuXG4gIGdldEhvc3RFbmRwb2ludCgpOiBzdHJpbmcge1xuICAgIC8vIFJldHVybiBwcm94eSBlbmRwb2ludCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBjbHVzdGVyIGVuZHBvaW50XG4gICAgaWYgKHRoaXMuZGF0YWJhc2VQcm94eSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2VQcm94eS5lbmRwb2ludDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGF0YWJhc2VDbHVzdGVyLmNsdXN0ZXJFbmRwb2ludC5ob3N0bmFtZTtcbiAgfVxuXG4gIGdldEhvc3RQb3J0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFN0cmluZyh0aGlzLnBvcnQpO1xuICB9XG5cbiAgZ2V0Q3JlZGVudGlhbHMoKTogU2VjcmV0IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhYmFzZUNyZWRlbnRpYWxzO1xuICB9XG5cbiAgZ2V0Q2ZuQ2x1c3RlcigpOiBDZm5EQkNsdXN0ZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNmbkNsdXN0ZXI7XG4gIH1cblxuICBnZXREYXRhYmFzZUNsdXN0ZXIoKTogRGF0YWJhc2VDbHVzdGVyIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhYmFzZUNsdXN0ZXI7XG4gIH1cblxuICBwcml2YXRlIGdldFBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbihcbiAgICBkYXlzPzogbnVtYmVyXG4gICk6IFBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbiB7XG4gICAgc3dpdGNoIChkYXlzKSB7XG4gICAgICBjYXNlIDc6XG4gICAgICAgIHJldHVybiBQZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb24uREVGQVVMVDtcbiAgICAgIGNhc2UgMzE6XG4gICAgICAgIHJldHVybiBQZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb24uTU9OVEhTXzE7XG4gICAgICBjYXNlIDkzOlxuICAgICAgICByZXR1cm4gUGVyZm9ybWFuY2VJbnNpZ2h0UmV0ZW50aW9uLk1PTlRIU18zO1xuICAgICAgY2FzZSAxODY6XG4gICAgICAgIHJldHVybiBQZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb24uTU9OVEhTXzY7XG4gICAgICBjYXNlIDM3MjpcbiAgICAgICAgcmV0dXJuIFBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbi5NT05USFNfMTI7XG4gICAgICBjYXNlIDczMTpcbiAgICAgICAgcmV0dXJuIFBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbi5MT05HX1RFUk07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gUGVyZm9ybWFuY2VJbnNpZ2h0UmV0ZW50aW9uLk1PTlRIU18xO1xuICAgIH1cbiAgfVxufVxuIl19
294
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmRzQXVyb3JhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvZGF0YWJhc2UvcmRzQXVyb3JhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUFpRTtBQUVqRSxpREFRNkI7QUFDN0IsaURBa0I2QjtBQUM3Qix1RUFHd0M7QUFDeEMsMkNBQXVDO0FBQ3ZDLGdDQUF1QztBQUN2Qyx3Q0FBd0Q7QUFDeEQsa0VBQStEO0FBQy9ELHNFQUErRDtBQUMvRCw2REFXd0M7QUEyQ3hDLE1BQWEsU0FBVSxTQUFRLHNCQUFTO0lBV3RDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBZTtRQUN2RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUM7UUFFaEMsOEVBQThFO1FBQzlFLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksSUFBSTtZQUN4QyxlQUFlLEVBQUUsVUFBVTtZQUMzQixhQUFhLEVBQUUsRUFBRSxlQUFlLEVBQUUsR0FBRyxFQUFFO1lBQ3ZDLGVBQWUsRUFBRSw4Q0FBOEM7U0FDaEUsQ0FBQztRQUVGLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxtQkFBbUIsS0FBSyxLQUFLLENBQUM7UUFDdEQsTUFBTSxRQUFRLEdBQ1osU0FBUyxJQUFJLE9BQU8sS0FBSyxDQUFDLG1CQUFtQixLQUFLLFFBQVE7WUFDeEQsQ0FBQyxDQUFDLEtBQUssQ0FBQyxtQkFBbUI7WUFDM0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUVoQiw4RUFBOEU7UUFDOUUsTUFBTSxRQUFRLEdBQ1osS0FBSyxDQUFDLGtCQUFrQixJQUFJLEtBQUssQ0FBQyxnQkFBZ0I7WUFDaEQsQ0FBQyxDQUFDLEtBQUssQ0FB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QUFXO1FBQ1QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUM7SUFDbEMsQ0FBQztJQUVELGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVPLDhCQUE4QixDQUNwQyxJQUFhO1FBRWIsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUNiLEtBQUssQ0FBQztnQkFDSixPQUFPLHFDQUEyQixDQUFDLE9BQU8sQ0FBQztZQUM3QyxLQUFLLEVBQUU7Z0JBQ0wsT0FBTyxxQ0FBMkIsQ0FBQyxRQUFRLENBQUM7WUFDOUMsS0FBSyxFQUFFO2dCQUNMLE9BQU8scUNBQTJCLENBQUMsUUFBUSxDQUFDO1lBQzlDLEtBQUssR0FBRztnQkFDTixPQUFPLHFDQUEyQixDQUFDLFFBQVEsQ0FBQztZQUM5QyxLQUFLLEdBQUc7Z0JBQ04sT0FBTyxxQ0FBMkIsQ0FBQyxTQUFTLENBQUM7WUFDL0M7Z0JBQ0UsT0FBTyxxQ0FBMkIsQ0FBQyxRQUFRLENBQUM7UUFDaEQsQ0FBQztJQUNILENBQUM7Q0FDRjtBQXZaRCw4QkF1WkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZm5PdXRwdXQsIER1cmF0aW9uLCBSZW1vdmFsUG9saWN5IH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyB0eXBlIElLZXkgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWttc1wiO1xuaW1wb3J0IHtcbiAgQ29ubmVjdGlvbnMsXG4gIHR5cGUgSUNvbm5lY3RhYmxlLFxuICB0eXBlIElTZWN1cml0eUdyb3VwLFxuICB0eXBlIElWcGMsXG4gIFBlZXIsXG4gIFBvcnQsXG4gIFN1Ym5ldFR5cGVcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7XG4gIEF1cm9yYVBvc3RncmVzRW5naW5lVmVyc2lvbixcbiAgQ2FDZXJ0aWZpY2F0ZSxcbiAgQ2x1c3Rlckluc3RhbmNlLFxuICBDcmVkZW50aWFscyxcbiAgRGF0YWJhc2VDbHVzdGVyLFxuICB0eXBlIERhdGFiYXNlQ2x1c3RlclByb3BzLFxuICBEYXRhYmFzZUNsdXN0ZXJGcm9tU25hcHNob3QsXG4gIHR5cGUgRGF0YWJhc2VDbHVzdGVyRnJvbVNuYXBzaG90UHJvcHMsXG4gIERhdGFiYXNlQ2x1c3RlckVuZ2luZSxcbiAgdHlwZSBDZm5EQkNsdXN0ZXIsXG4gIERhdGFiYXNlUHJveHksXG4gIHR5cGUgSUNsdXN0ZXJFbmdpbmUsXG4gIHR5cGUgSUNsdXN0ZXJJbnN0YW5jZSxcbiAgUGFyYW1ldGVyR3JvdXAsXG4gIFBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbixcbiAgUHJveHlUYXJnZXQsXG4gIFNuYXBzaG90Q3JlZGVudGlhbHNcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yZHNcIjtcbmltcG9ydCB7XG4gIFNlY3JldFJvdGF0aW9uLFxuICBTZWNyZXRSb3RhdGlvbkFwcGxpY2F0aW9uXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBTZWN1cml0eUdyb3VwIH0gZnJvbSBcIi4uL2lhbVwiO1xuaW1wb3J0IHsgQ3VzdG9tZXJNYW5hZ2VkS2V5LCBTZWNyZXQgfSBmcm9tIFwiLi4vc2VjcmV0c1wiO1xuaW1wb3J0IHsgUmVzb3VyY2VOYW1pbmcgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvcmVzb3VyY2VOYW1pbmdcIjtcbmltcG9ydCB7IHRvUGFzY2FsQ2FzZSB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9jYXBpdGFsaXNlU3RyaW5nXCI7XG5pbXBvcnQge1xuICB0eXBlIEVuZ2luZUNvbmZpZyxcbiAgdHlwZSBQcm94eUNvbmZpZyxcbiAgdHlwZSBDcmVkZW50aWFsc0NvbmZpZyxcbiAgdHlwZSBBdXJvcmFFbmNyeXB0aW9uQ29uZmlnLFxuICB0eXBlIEF1cm9yYVdyaXRlckNvbmZpZyxcbiAgdHlwZSBBdXJvcmFSZWFkZXJzQ29uZmlnLFxuICB0eXBlIEF1cm9yYVJlYWRlckNvbmZpZyxcbiAgdHlwZSBQZXJmb3JtYW5jZUluc2lnaHRzQ29uZmlnLFxuICBpc0F3c01hbmFnZWRLZXksXG4gIGlzQ01LUmVxdWVzdGVkXG59IGZyb20gXCIuLi8uLi8uLi9wYXR0ZXJucy9hd3MvZGF0YWJhc2VcIjtcblxuaW50ZXJmYWNlIFJkc1Byb3BzIHtcbiAgdnBjOiBJVnBjO1xuICBkYXRhYmFzZU5hbWU/OiBzdHJpbmc7XG4gIGVuZ2luZT86IElDbHVzdGVyRW5naW5lO1xuICBlbmdpbmVDb25maWc/OiBFbmdpbmVDb25maWc7XG4gIGNsdXN0ZXJJZGVudGlmaWVyPzogc3RyaW5nO1xuICB3cml0ZXI/OiBBdXJvcmFXcml0ZXJDb25maWc7XG4gIHJlYWRlcnM/OiBBdXJvcmFSZWFkZXJzQ29uZmlnIHwgZmFsc2U7XG4gIHByb3h5PzogUHJveHlDb25maWcgfCBmYWxzZTtcbiAgY3JlZGVudGlhbHM/OiBDcmVkZW50aWFsc0NvbmZpZztcbiAgZW5jcnlwdGlvbj86IEF1cm9yYUVuY3J5cHRpb25Db25maWc7XG4gIGJhY2t1cFJldGVudGlvbj86IG51bWJlcjtcbiAgbW9uaXRvcmluZ0ludGVydmFsPzogRHVyYXRpb247XG4gIHByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93Pzogc3RyaW5nO1xuICBwb3J0PzogbnVtYmVyO1xuICBwZXJmb3JtYW5jZUluc2lnaHRzPzogUGVyZm9ybWFuY2VJbnNpZ2h0c0NvbmZpZyB8IGZhbHNlO1xuICAvKiogU2tpcHMgc2VjcmV0IHJvdGF0aW9uIGZvciBzZWNvbmRhcnkgY2x1c3RlcnMgaW4gZ2xvYmFsIGRhdGFiYXNlICovXG4gIGlzR2xvYmFsU2Vjb25kYXJ5PzogYm9vbGVhbjtcbiAgc2VjcmV0UmVwbGljYVJlZ2lvbnM/OiBzdHJpbmdbXTtcbiAgZGVsZXRpb25Qcm90ZWN0aW9uPzogYm9vbGVhbjtcbiAgLyoqIEFSTiBvciBpZGVudGlmaWVyIG9mIERCIGNsdXN0ZXIgc25hcHNob3QgdG8gcmVzdG9yZSBmcm9tICovXG4gIHNuYXBzaG90SWRlbnRpZmllcj86IHN0cmluZztcbiAgLyoqIFVzZXJuYW1lIGZyb20gdGhlIHNuYXBzaG90IChyZXF1aXJlZCB3aGVuIHJlc3RvcmluZyBmcm9tIHNuYXBzaG90IHRvIHJlc2V0IHBhc3N3b3JkKSAqL1xuICBzbmFwc2hvdFVzZXJuYW1lPzogc3RyaW5nO1xuICAvKiogQWxsb3cgYWNjZXNzIGZyb20gVlBDIENJRFIgKGF2b2lkcyBjcm9zcy1zdGFjayBjeWNsaWMgZGVwZW5kZW5jaWVzIHdpdGggTGFtYmRhKSAqL1xuICBhbGxvd1ZwY0FjY2Vzcz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBNYWtlIGRhdGFiYXNlIHB1YmxpY2x5IGFjY2Vzc2libGUgZnJvbSB0aGUgaW50ZXJuZXQuXG4gICAqIFdBUk5JTkc6IFRoaXMgaXMgYSBzZWN1cml0eSByaXNrIGFuZCBzaG91bGQgb25seSBiZSB1c2VkIGZvciBkZXZlbG9wbWVudFxuICAgKiBvciB3aGVuIGJ1aWxkaW5nIFBheWxvYWQgYXBwcyBsb2NhbGx5IHRoYXQgbmVlZCBkYXRhYmFzZSBhY2Nlc3MuXG4gICAqIFdoZW4gZW5hYmxlZCwgdGhlIGRhdGFiYXNlIGlzIHBsYWNlZCBpbiBwdWJsaWMgc3VibmV0cy5cbiAgICovXG4gIHB1YmxpY2x5QWNjZXNzaWJsZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBJUCBhZGRyZXNzIHRvIGFsbG93IGFjY2VzcyBmcm9tIHdoZW4gcHVibGljbHlBY2Nlc3NpYmxlIGlzIHRydWUuXG4gICAqIElmIG5vdCBzcGVjaWZpZWQsIGFjY2VzcyBpcyByZXN0cmljdGVkIHRvIFZQQyBvbmx5IGV2ZW4gd2hlbiBwdWJsaWMuXG4gICAqIEZvcm1hdDogQ0lEUiBub3RhdGlvbiAoZS5nLiwgXCIyMDMuMC4xMTMuMC8zMlwiIGZvciBzaW5nbGUgSVApXG4gICAqL1xuICBhbGxvd2VkSXBDaWRyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgUmRzQXVyb3JhIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSUNvbm5lY3RhYmxlIHtcbiAgcHVibGljIGNvbm5lY3Rpb25zOiBDb25uZWN0aW9ucztcblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnN0cnVjdElkOiBzdHJpbmc7XG4gIHByaXZhdGUgcG9ydDogbnVtYmVyO1xuICBwcml2YXRlIGVuZ2luZUNvbmZpZzogRW5naW5lQ29uZmlnO1xuICBwcml2YXRlIGRhdGFiYXNlQ2x1c3RlcjogRGF0YWJhc2VDbHVzdGVyO1xuICBwcml2YXRlIGRhdGFiYXNlUHJveHk/OiBEYXRhYmFzZVByb3h5O1xuICBwcml2YXRlIGRhdGFiYXNlQ3JlZGVudGlhbHM6IFNlY3JldDtcbiAgcHJpdmF0ZSBjZm5DbHVzdGVyPzogQ2ZuREJDbHVzdGVyO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBSZHNQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLmNvbnN0cnVjdElkID0gaWQ7XG4gICAgdGhpcy5wb3J0ID0gcHJvcHMucG9ydCA/PyAzNTI1NTtcblxuICAgIC8vIFBvc3RncmVTUUwgZmFsbGJhY2sgZm9yIGRpcmVjdCB1c2FnZSAtIGVuc3VyZSBlbmdpbmUgYW5kIGVuZ2luZUNvbmZpZyBtYXRjaFxuICAgIHRoaXMuZW5naW5lQ29uZmlnID0gcHJvcHMuZW5naW5lQ29uZmlnID8/IHtcbiAgICAgIGRlZmF1bHRVc2VybmFtZTogXCJwb3N0Z3Jlc1wiLFxuICAgICAgc3NsUGFyYW1ldGVyczogeyBcInJkcy5mb3JjZV9zc2xcIjogXCIxXCIgfSxcbiAgICAgIHJvdGF0aW9uQXBwTmFtZTogXCJTZWNyZXRzTWFuYWdlclJEU1Bvc3RncmVTUUxSb3RhdGlvbk11bHRpVXNlclwiXG4gICAgfTtcblxuICAgIGNvbnN0IHBpRW5hYmxlZCA9IHByb3BzLnBlcmZvcm1hbmNlSW5zaWdodHMgIT09IGZhbHNlO1xuICAgIGNvbnN0IHBpQ29uZmlnID1cbiAgICAgIHBpRW5hYmxlZCAmJiB0eXBlb2YgcHJvcHMucGVyZm9ybWFuY2VJbnNpZ2h0cyA9PT0gXCJvYmplY3RcIlxuICAgICAgICA/IHByb3BzLnBlcmZvcm1hbmNlSW5zaWdodHNcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBVc2VybmFtZSBwcmlvcml0eTogc25hcHNob3RVc2VybmFtZSA+IGNyZWRlbnRpYWxzLnVzZXJuYW1lID4gZW5naW5lIGRlZmF1bHRcbiAgICBjb25zdCB1c2VybmFtZSA9XG4gICAgICBwcm9wcy5zbmFwc2hvdElkZW50aWZpZXIgJiYgcHJvcHMuc25hcHNob3RVc2VybmFtZVxuICAgICAgICA/IHByb3BzLnNuYXBzaG90VXNlcm5hbWVcbiAgICAgICAgOiAocHJvcHMuY3JlZGVudGlhbHM/LnVzZXJuYW1lID8/IHRoaXMuZW5naW5lQ29uZmlnLmRlZmF1bHRVc2VybmFtZSk7XG5cbiAgICAvLyBHbG9iYWwgc2Vjb25kYXJ5IGNsdXN0ZXJzIGltcG9ydCByZXBsaWNhdGVkIHNlY3JldCBpbnN0ZWFkIG9mIGNyZWF0aW5nIG5ld1xuICAgIGlmIChwcm9wcy5pc0dsb2JhbFNlY29uZGFyeSkge1xuICAgICAgdGhpcy5kYXRhYmFzZUNyZWRlbnRpYWxzID0gbmV3IFNlY3JldChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfUNyZWRlbnRpYWxzYCxcbiAgICAgICAge1xuICAgICAgICAgIHNlY3JldE5hbWU6IFJlc291cmNlTmFtaW5nLmNyZWRlbnRpYWxzU2VjcmV0TmFtZShpZCksXG4gICAgICAgICAgaW1wb3J0RXhpc3Rpbmc6IHRydWVcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRhYmFzZUNyZWRlbnRpYWxzID0gbmV3IFNlY3JldChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfUNyZWRlbnRpYWxzYCxcbiAgICAgICAge1xuICAgICAgICAgIHNlY3JldE5hbWU6IFJlc291cmNlTmFtaW5nLmNyZWRlbnRpYWxzU2VjcmV0TmFtZShpZCksXG4gICAgICAgICAgZ2VuZXJhdGVTZWNyZXRTdHJpbmc6IHtcbiAgICAgICAgICAgIHNlY3JldFN0cmluZ1RlbXBsYXRlOiBKU09OLnN0cmluZ2lmeSh7IHVzZXJuYW1lIH0pLFxuICAgICAgICAgICAgZXhjbHVkZVB1bmN0dWF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgaW5jbHVkZVNwYWNlOiBmYWxzZSxcbiAgICAgICAgICAgIGdlbmVyYXRlU3RyaW5nS2V5OiBcInBhc3N3b3JkXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlcGxpY2FSZWdpb25zOiBwcm9wcy5zZWNyZXRSZXBsaWNhUmVnaW9uc1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHN0b3JhZ2VFbmNyeXB0aW9uS2V5ID0gaXNDTUtSZXF1ZXN0ZWQocHJvcHMuZW5jcnlwdGlvbj8uc3RvcmFnZUtleSlcbiAgICAgID8gbmV3IEN1c3RvbWVyTWFuYWdlZEtleShcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1DbHVzdGVyRW5jcnlwdGlvbktleWAsXG4gICAgICAgICAgeyBhbGlhc05hbWU6IGBjbWsvcmRzLyR7cHJvcHMuZGF0YWJhc2VOYW1lfS9lbmNyeXB0aW9uS2V5YCB9XG4gICAgICAgICkua2V5XG4gICAgICA6IGlzQXdzTWFuYWdlZEtleShwcm9wcy5lbmNyeXB0aW9uPy5zdG9yYWdlS2V5KSB8fFxuICAgICAgICAgIHByb3BzLmVuY3J5cHRpb24/LnN0b3JhZ2VLZXkgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IHVuZGVmaW5lZCAvLyBBV1MgTWFuYWdlZCAoZGVmYXVsdClcbiAgICAgICAgOiBwcm9wcy5lbmNyeXB0aW9uPy5zdG9yYWdlS2V5OyAvLyBVc2UgcHJvdmlkZWQgSUtleVxuXG4gICAgY29uc3QgcGVyZm9ybWFuY2VJbnNpZ2h0c0tleSA9XG4gICAgICBwaUVuYWJsZWQgJiYgaXNDTUtSZXF1ZXN0ZWQocGlDb25maWc/LmVuY3J5cHRpb25LZXkpXG4gICAgICAgID8gbmV3IEN1c3RvbWVyTWFuYWdlZEtleShcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9UGVyZm9ybWFuY2VJbnNpZ2h0c0tleWAsXG4gICAgICAgICAgICB7IGFsaWFzTmFtZTogYGNtay9yZHMvJHtwcm9wcy5kYXRhYmFzZU5hbWV9L0luc2lnaHRzS2V5YCB9XG4gICAgICAgICAgKS5rZXlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBjbHVzdGVyU2VjdXJpdHlHcm91cCA9IG5ldyBTZWN1cml0eUdyb3VwKHRoaXMsIGAke2lkfVNlY3VyaXR5R3JvdXBgLCB7XG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIGRlc2NyaXB0aW9uOiBgU2VjdXJpdHkgZ3JvdXAgZm9yIEF1cm9yYSBjbHVzdGVyICR7cHJvcHMuZGF0YWJhc2VOYW1lfWBcbiAgICB9KTtcblxuICAgIGNsdXN0ZXJTZWN1cml0eUdyb3VwLmFkZEluZ3Jlc3NSdWxlKFxuICAgICAgY2x1c3RlclNlY3VyaXR5R3JvdXAsXG4gICAgICBQb3J0LnRjcCh0aGlzLnBvcnQpXG4gICAgKTtcblxuICAgIC8vIEFsbG93IFZQQy13aWRlIGFjY2VzcyB3aGVuIGVuYWJsZWQgKGF2b2lkcyBjcm9zcy1zdGFjayBjeWNsaWMgZGVwZW5kZW5jaWVzKVxuICAgIGlmIChwcm9wcy5hbGxvd1ZwY0FjY2Vzcykge1xuICAgICAgY2x1c3RlclNlY3VyaXR5R3JvdXAuYWRkSW5ncmVzc1J1bGUoXG4gICAgICAgIFBlZXIuaXB2NChwcm9wcy52cGMudnBjQ2lkckJsb2NrKSxcbiAgICAgICAgUG9ydC50Y3AodGhpcy5wb3J0KSxcbiAgICAgICAgXCJBbGxvdyBhY2Nlc3MgZnJvbSBWUEMgQ0lEUlwiXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEFsbG93IGV4dGVybmFsIGFjY2VzcyB3aGVuIHB1YmxpY2x5IGFjY2Vzc2libGUgd2l0aCBhbGxvd2VkIElQXG4gICAgaWYgKHByb3BzLnB1YmxpY2x5QWNjZXNzaWJsZSAmJiBwcm9wcy5hbGxvd2VkSXBDaWRyKSB7XG4gICAgICBjbHVzdGVyU2VjdXJpdHlHcm91cC5hZGRJbmdyZXNzUnVsZShcbiAgICAgICAgUGVlci5pcHY0KHByb3BzLmFsbG93ZWRJcENpZHIpLFxuICAgICAgICBQb3J0LnRjcCh0aGlzLnBvcnQpLFxuICAgICAgICBcIkFsbG93IGV4dGVybmFsIGFjY2VzcyBmcm9tIGFsbG93ZWQgSVBcIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gbmV3IENvbm5lY3Rpb25zKHtcbiAgICAgIHNlY3VyaXR5R3JvdXBzOiBbY2x1c3RlclNlY3VyaXR5R3JvdXBdLFxuICAgICAgZGVmYXVsdFBvcnQ6IFBvcnQudGNwKHRoaXMucG9ydClcbiAgICB9KTtcblxuICAgIGNvbnN0IHdyaXRlckNvbmZpZyA9IHByb3BzLndyaXRlciA/PyB7fTtcbiAgICBjb25zdCB3cml0ZXJQSSA9IHdyaXRlckNvbmZpZy5lbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzID8/IHBpRW5hYmxlZDtcbiAgICBjb25zdCB3cml0ZXJTdWZmaXggPSB3cml0ZXJDb25maWcuaWRlbnRpZmllclN1ZmZpeDtcbiAgICBjb25zdCBwZXJmb3JtYW5jZUluc2lnaHRzUmV0ZW50aW9uID0gdGhpcy5nZXRQZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb24oXG4gICAgICBwaUNvbmZpZz8ucmV0ZW50aW9uUGVyaW9kID8/IDdcbiAgICApO1xuICAgIGNvbnN0IGRhdGFiYXNlTmFtZSA9IHByb3BzLmRhdGFiYXNlTmFtZSB8fCBpZDtcblxuICAgIGNvbnN0IHdyaXRlciA9IENsdXN0ZXJJbnN0YW5jZS5zZXJ2ZXJsZXNzVjIoYCR7ZGF0YWJhc2VOYW1lfVdyaXRlcmAsIHtcbiAgICAgIGVuYWJsZVBlcmZvcm1hbmNlSW5zaWdodHM6IHdyaXRlclBJLFxuICAgICAgcGVyZm9ybWFuY2VJbnNpZ2h0RW5jcnlwdGlvbktleTogd3JpdGVyUElcbiAgICAgICAgPyBwZXJmb3JtYW5jZUluc2lnaHRzS2V5XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgcGVyZm9ybWFuY2VJbnNpZ2h0UmV0ZW50aW9uOiB3cml0ZXJQSVxuICAgICAgICA/IHBlcmZvcm1hbmNlSW5zaWdodHNSZXRlbnRpb25cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBpbnN0YW5jZUlkZW50aWZpZXI6IFJlc291cmNlTmFtaW5nLndyaXRlckluc3RhbmNlSWQoaWQsIHdyaXRlclN1ZmZpeCksXG4gICAgICBjYUNlcnRpZmljYXRlOiBDYUNlcnRpZmljYXRlLlJEU19DQV9SU0E0MDk2X0cxLFxuICAgICAgcHVibGljbHlBY2Nlc3NpYmxlOiBwcm9wcy5wdWJsaWNseUFjY2Vzc2libGUsXG4gICAgICAuLi4od3JpdGVyQ29uZmlnLmF2YWlsYWJpbGl0eVpvbmUgJiYge1xuICAgICAgICBhdmFpbGFiaWxpdHlab25lOiB3cml0ZXJDb25maWcuYXZhaWxhYmlsaXR5Wm9uZVxuICAgICAgfSlcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlYWRlcnMgPSB0aGlzLmJ1aWxkUmVhZGVycyhcbiAgICAgIHByb3BzLFxuICAgICAgcGlFbmFibGVkLFxuICAgICAgcGVyZm9ybWFuY2VJbnNpZ2h0c0tleSxcbiAgICAgIHBlcmZvcm1hbmNlSW5zaWdodHNSZXRlbnRpb25cbiAgICApO1xuXG4gICAgY29uc3QgZW5naW5lID1cbiAgICAgIHByb3BzLmVuZ2luZSB8fFxuICAgICAgRGF0YWJhc2VDbHVzdGVyRW5naW5lLmF1cm9yYVBvc3RncmVzKHtcbiAgICAgICAgdmVyc2lvbjogQXVyb3JhUG9zdGdyZXNFbmdpbmVWZXJzaW9uLm9mKFwiMTYuNlwiLCBcIjE2XCIpXG4gICAgICB9KTtcblxuICAgIGNvbnN0IHBhcmFtZXRlckdyb3VwID0gbmV3IFBhcmFtZXRlckdyb3VwKFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1QYXJhbWV0ZXJHcm91cGAsXG4gICAgICB7XG4gICAgICAgIGVuZ2luZSxcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXJhbWV0ZXIgZ3JvdXAgZm9yICR7cHJvcHMuZGF0YWJhc2VOYW1lfSB3aXRoIHNlY3VyaXR5IGRlZmF1bHRzYCxcbiAgICAgICAgcGFyYW1ldGVyczogdGhpcy5lbmdpbmVDb25maWcuc3NsUGFyYW1ldGVyc1xuICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBVc2UgcHVibGljIHN1Ym5ldHMgd2hlbiBwdWJsaWNseSBhY2Nlc3NpYmxlLCBvdGhlcndpc2UgcHJpdmF0ZVxuICAgIGNvbnN0IHZwY1N1Ym5ldHMgPSBwcm9wcy5wdWJsaWNseUFjY2Vzc2libGVcbiAgICAgID8geyBzdWJuZXRUeXBlOiBTdWJuZXRUeXBlLlBVQkxJQyB9XG4gICAgICA6IHsgc3VibmV0VHlwZTogU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTIH07XG5cbiAgICAvLyBDb21tb24gcHJvcHMgc2hhcmVkIGFjcm9zcyBhbGwgY2x1c3RlciBjcmVhdGlvbiBwYXRoc1xuICAgIGNvbnN0IGJhc2VDbHVzdGVyUHJvcHMgPSB7XG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIHZwY1N1Ym5ldHMsXG4gICAgICBzZWN1cml0eUdyb3VwczogW2NsdXN0ZXJTZWN1cml0eUdyb3VwXSBhcyBJU2VjdXJpdHlHcm91cFtdLFxuICAgICAgZW5naW5lLFxuICAgICAgcGFyYW1ldGVyR3JvdXAsXG4gICAgICBiYWNrdXA6IHsgcmV0ZW50aW9uOiBEdXJhdGlvbi5kYXlzKHByb3BzLmJhY2t1cFJldGVudGlvbiA/PyAxNCkgfSxcbiAgICAgIHN0b3JhZ2VFbmNyeXB0ZWQ6IHRydWUsXG4gICAgICAuLi4oc3RvcmFnZUVuY3J5cHRpb25LZXkgJiYgeyBzdG9yYWdlRW5jcnlwdGlvbktleSB9KSxcbiAgICAgIGNsdXN0ZXJJZGVudGlmaWVyOlxuICAgICAgICBwcm9wcy5jbHVzdGVySWRlbnRpZmllcj8udG9Mb3dlckNhc2UoKSB8fCBSZXNvdXJjZU5hbWluZy5jbHVzdGVySWQoaWQpLFxuICAgICAgbW9uaXRvcmluZ0ludGVydmFsOiBwcm9wcy5tb25pdG9yaW5nSW50ZXJ2YWwgfHwgRHVyYXRpb24ubWludXRlcygxKSxcbiAgICAgIHByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93OlxuICAgICAgICBwcm9wcy5wcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdyB8fCBcIlNhdDoxMjozMC1TYXQ6MjA6MzBcIixcbiAgICAgIHBvcnQ6IHRoaXMucG9ydCxcbiAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuU05BUFNIT1QsXG4gICAgICBkZWxldGlvblByb3RlY3Rpb246IHByb3BzLmRlbGV0aW9uUHJvdGVjdGlvbiA/PyB0cnVlLFxuICAgICAgaWFtQXV0aGVudGljYXRpb246IHRydWUsXG4gICAgICB3cml0ZXIsXG4gICAgICByZWFkZXJzXG4gICAgfTtcblxuICAgIC8vIENyZWRlbnRpYWxzIGFuZCBkYXRhYmFzZSBuYW1lIGZvciBub24tZ2xvYmFsLXNlY29uZGFyeSBjbHVzdGVyc1xuICAgIGNvbnN0IHByaW1hcnlDbHVzdGVyUHJvcHMgPSBwcm9wcy5pc0dsb2JhbFNlY29uZGFyeVxuICAgICAgPyB7fVxuICAgICAgOiB7XG4gICAgICAgICAgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzLmZyb21TZWNyZXQodGhpcy5kYXRhYmFzZUNyZWRlbnRpYWxzLnNlY3JldCksXG4gICAgICAgICAgZGVmYXVsdERhdGFiYXNlTmFtZTogKFxuICAgICAgICAgICAgcHJvcHMuZGF0YWJhc2VOYW1lIHx8IGlkLnJlcGxhY2UoXCJSZHNcIiwgXCJcIilcbiAgICAgICAgICApLnJlcGxhY2UoL1teYS16QS1aMC05X10vZywgXCJcIilcbiAgICAgICAgfTtcblxuICAgIGlmIChwcm9wcy5zbmFwc2hvdElkZW50aWZpZXIpIHtcbiAgICAgIC8vIENyZWF0ZSBmcm9tIHNuYXBzaG90IC0gY3JlZGVudGlhbHMgbmVlZCBTbmFwc2hvdENyZWRlbnRpYWxzIHR5cGVcbiAgICAgIGNvbnN0IHNuYXBzaG90Q3JlZGVudGlhbHMgPSBwcm9wcy5pc0dsb2JhbFNlY29uZGFyeVxuICAgICAgICA/IHt9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgY3JlZGVudGlhbHM6IFNuYXBzaG90Q3JlZGVudGlhbHMuZnJvbVNlY3JldChcbiAgICAgICAgICAgICAgdGhpcy5kYXRhYmFzZUNyZWRlbnRpYWxzLnNlY3JldFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH07XG5cbiAgICAgIHRoaXMuZGF0YWJhc2VDbHVzdGVyID0gbmV3IERhdGFiYXNlQ2x1c3RlckZyb21TbmFwc2hvdChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYCR7aWR9RGF0YWJhc2VgLFxuICAgICAgICAvLyBUeXBlIGFzc2VydGlvbjogQ0RLJ3MgU25hcHNob3RDcmVkZW50aWFscy51c2VybmFtZSBpcyBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICAgICAgLy8gYnV0IERhdGFiYXNlQ2x1c3RlckZyb21TbmFwc2hvdFByb3BzIGV4cGVjdHMgc3RyaW5nLiBXb3JrcyBhdCBydW50aW1lLlxuICAgICAgICB7XG4gICAgICAgICAgLi4uYmFzZUNsdXN0ZXJQcm9wcyxcbiAgICAgICAgICAuLi5zbmFwc2hvdENyZWRlbnRpYWxzLFxuICAgICAgICAgIHNuYXBzaG90SWRlbnRpZmllcjogcHJvcHMuc25hcHNob3RJZGVudGlmaWVyXG4gICAgICAgIH0gYXMgRGF0YWJhc2VDbHVzdGVyRnJvbVNuYXBzaG90UHJvcHNcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENyZWF0ZSBuZXcgY2x1c3RlclxuICAgICAgdGhpcy5kYXRhYmFzZUNsdXN0ZXIgPSBuZXcgRGF0YWJhc2VDbHVzdGVyKFxuICAgICAgICB0aGlzLFxuICAgICAgICBgJHtpZH1EYXRhYmFzZWAsXG4gICAgICAgIC8vIFR5cGUgYXNzZXJ0aW9uOiBzcHJlYWQgdHlwZXMgZG9uJ3QgcHJlc2VydmUgcmVxdWlyZWQgcHJvcGVydHkgbmFycm93aW5nXG4gICAgICAgIHsgLi4uYmFzZUNsdXN0ZXJQcm9wcywgLi4ucHJpbWFyeUNsdXN0ZXJQcm9wcyB9IGFzIERhdGFiYXNlQ2x1c3RlclByb3BzXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuY2ZuQ2x1c3RlciA9IHRoaXMuZGF0YWJhc2VDbHVzdGVyLm5vZGUuZGVmYXVsdENoaWxkIGFzIENmbkRCQ2x1c3RlcjtcblxuICAgIC8vIEdsb2JhbCBzZWNvbmRhcnkgY2x1c3RlcnMgY2FuJ3Qgc3BlY2lmeSB0aGVzZSBwcm9wZXJ0aWVzXG4gICAgaWYgKHByb3BzLmlzR2xvYmFsU2Vjb25kYXJ5ICYmIHRoaXMuY2ZuQ2x1c3Rlcikge1xuICAgICAgdGhpcy5jZm5DbHVzdGVyLm1hc3RlclVzZXJuYW1lID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5jZm5DbHVzdGVyLm1hc3RlclVzZXJQYXNzd29yZCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuY2ZuQ2x1c3Rlci5kYXRhYmFzZU5hbWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcHJveHlFbmFibGVkID0gcHJvcHMucHJveHkgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5wcm94eSAhPT0gZmFsc2U7XG4gICAgaWYgKHByb3h5RW5hYmxlZCkge1xuICAgICAgdGhpcy5hZGRQcm94eShwcm9wcywgY2x1c3RlclNlY3VyaXR5R3JvdXApO1xuICAgIH1cblxuICAgIC8vIFNlY3JldCByb3RhdGlvbiBlbmFibGVkIGJ5IGRlZmF1bHQgKG9wdC1vdXQgd2l0aCBzZWNyZXRSb3RhdGlvbjogZmFsc2UpXG4gICAgaWYgKCFwcm9wcy5pc0dsb2JhbFNlY29uZGFyeSkge1xuICAgICAgY29uc3Qgc2VjcmV0Um90YXRpb25EaXNhYmxlZCA9XG4gICAgICAgIHByb3BzLmNyZWRlbnRpYWxzPy5zZWNyZXRSb3RhdGlvbiA9PT0gZmFsc2U7XG4gICAgICBpZiAoIXNlY3JldFJvdGF0aW9uRGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5hZGRTZWNyZXRSb3RhdGlvbihwcm9wcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFJlYWRlcnMoXG4gICAgcHJvcHM6IFJkc1Byb3BzLFxuICAgIGRlZmF1bHRQSUVuYWJsZWQ6IGJvb2xlYW4sXG4gICAgcGlLZXk/OiBJS2V5LFxuICAgIHBpUmV0ZW50aW9uPzogUGVyZm9ybWFuY2VJbnNpZ2h0UmV0ZW50aW9uXG4gICk6IElDbHVzdGVySW5zdGFuY2VbXSB7XG4gICAgaWYgKHByb3BzLnJlYWRlcnMgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgbGV0IHJlYWRlckNvbmZpZ3M6IEF1cm9yYVJlYWRlckNvbmZpZ1tdO1xuICAgIGlmIChwcm9wcy5yZWFkZXJzPy5pbnN0YW5jZXMpIHtcbiAgICAgIHJlYWRlckNvbmZpZ3MgPSBwcm9wcy5yZWFkZXJzLmluc3RhbmNlcztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY291bnQgPSBwcm9wcy5yZWFkZXJzPy5jb3VudCA/PyAxO1xuICAgICAgcmVhZGVyQ29uZmlncyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IGNvdW50IH0sIChfLCBpKSA9PiAoe1xuICAgICAgICBzY2FsZVdpdGhXcml0ZXI6IGkgPT09IDBcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0UEkgPVxuICAgICAgcHJvcHMucmVhZGVycyAmJiBcImRlZmF1bHRFbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzXCIgaW4gcHJvcHMucmVhZGVyc1xuICAgICAgICA/IChwcm9wcy5yZWFkZXJzLmRlZmF1bHRFbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzID8/IGRlZmF1bHRQSUVuYWJsZWQpXG4gICAgICAgIDogZGVmYXVsdFBJRW5hYmxlZDtcblxuICAgIHJldHVybiByZWFkZXJDb25maWdzLm1hcCgoY29uZmlnLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgZW5hYmxlUEkgPSBjb25maWcuZW5hYmxlUGVyZm9ybWFuY2VJbnNpZ2h0cyA/PyBkZWZhdWx0UEk7XG4gICAgICBjb25zdCBfaWRlbnRpZmllciA9IGNvbmZpZy5pZGVudGlmaWVyU3VmZml4ID8/IGByZWFkZXItJHtpbmRleCArIDF9YDtcblxuICAgICAgcmV0dXJuIENsdXN0ZXJJbnN0YW5jZS5zZXJ2ZXJsZXNzVjIoXG4gICAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1SZWFkZXIke2luZGV4ICsgMX1gLFxuICAgICAgICB7XG4gICAgICAgICAgc2NhbGVXaXRoV3JpdGVyOiBjb25maWcuc2NhbGVXaXRoV3JpdGVyID8/IGluZGV4ID09PSAwLFxuICAgICAgICAgIGVuYWJsZVBlcmZvcm1hbmNlSW5zaWdodHM6IGVuYWJsZVBJLFxuICAgICAgICAgIHBlcmZvcm1hbmNlSW5zaWdodEVuY3J5cHRpb25LZXk6IGVuYWJsZVBJID8gcGlLZXkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgcGVyZm9ybWFuY2VJbnNpZ2h0UmV0ZW50aW9uOiBlbmFibGVQSSA/IHBpUmV0ZW50aW9uIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGluc3RhbmNlSWRlbnRpZmllcjogUmVzb3VyY2VOYW1pbmcucmVhZGVySW5zdGFuY2VJZChcbiAgICAgICAgICAgIHRoaXMuY29uc3RydWN0SWQsXG4gICAgICAgICAgICBpbmRleCArIDEsXG4gICAgICAgICAgICBjb25maWcuaWRlbnRpZmllclN1ZmZpeFxuICAgICAgICAgICksXG4gICAgICAgICAgY2FDZXJ0aWZpY2F0ZTogQ2FDZXJ0aWZpY2F0ZS5SRFNfQ0FfUlNBNDA5Nl9HMSxcbiAgICAgICAgICBwdWJsaWNseUFjY2Vzc2libGU6IHByb3BzLnB1YmxpY2x5QWNjZXNzaWJsZSxcbiAgICAgICAgICAuLi4oY29uZmlnLmF2YWlsYWJpbGl0eVpvbmUgJiYge1xuICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogY29uZmlnLmF2YWlsYWJpbGl0eVpvbmVcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRQcm94eShwcm9wczogUmRzUHJvcHMsIHNlY3VyaXR5R3JvdXA6IFNlY3VyaXR5R3JvdXApOiB2b2lkIHtcbiAgICBjb25zdCBwcm94eUNvbmZpZyA9IHByb3BzLnByb3h5IGFzIFByb3h5Q29uZmlnO1xuICAgIGNvbnN0IHZwY1N1Ym5ldHMgPSBwcm94eUNvbmZpZy52cGNTdWJuZXRzID8/IHtcbiAgICAgIHN1Ym5ldFR5cGU6IFN1Ym5ldFR5cGUuUFJJVkFURV9XSVRIX0VHUkVTU1xuICAgIH07XG5cbiAgICB0aGlzLmRhdGFiYXNlUHJveHkgPSBuZXcgRGF0YWJhc2VQcm94eShcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9RGF0YWJhc2VQcm94eWAsXG4gICAgICB7XG4gICAgICAgIGRiUHJveHlOYW1lOiBSZXNvdXJjZU5hbWluZy5wcm94eU5hbWUodGhpcy5jb25zdHJ1Y3RJZCksXG4gICAgICAgIHByb3h5VGFyZ2V0OiBQcm94eVRhcmdldC5mcm9tQ2x1c3Rlcih0aGlzLmRhdGFiYXNlQ2x1c3RlciksXG4gICAgICAgIHNlY3JldHM6IFt0aGlzLmRhdGFiYXNlQ3JlZGVudGlhbHMuc2VjcmV0XSxcbiAgICAgICAgc2VjdXJpdHlHcm91cHM6IFtzZWN1cml0eUdyb3VwXSxcbiAgICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICAgIHZwY1N1Ym5ldHMsXG4gICAgICAgIHJlcXVpcmVUTFM6IHByb3h5Q29uZmlnLnJlcXVpcmVUTFMgPz8gdHJ1ZSxcbiAgICAgICAgYm9ycm93VGltZW91dDogcHJveHlDb25maWcuY29ubmVjdGlvbkJvcnJvd1RpbWVvdXRcbiAgICAgICAgICA/IER1cmF0aW9uLnNlY29uZHMocHJveHlDb25maWcuY29ubmVjdGlvbkJvcnJvd1RpbWVvdXQpXG4gICAgICAgICAgOiBEdXJhdGlvbi5zZWNvbmRzKDEyMCksXG4gICAgICAgIG1heENvbm5lY3Rpb25zUGVyY2VudDogcHJveHlDb25maWcubWF4Q29ubmVjdGlvbnMsXG4gICAgICAgIG1heElkbGVDb25uZWN0aW9uc1BlcmNlbnQ6IHByb3h5Q29uZmlnLm1heElkbGVDb25uZWN0aW9uc1xuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25zdCBvdXRwdXROYW1lID0gdG9QYXNjYWxDYXNlKHByb3BzLmRhdGFiYXNlTmFtZSB8fCB0aGlzLmNvbnN0cnVjdElkKTtcbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke291dHB1dE5hbWV9UHJveHlFbmRwb2ludE91dHB1dGAsIHtcbiAgICAgIGtleTogYCR7b3V0cHV0TmFtZX1Qcm94eUVuZHBvaW50YCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke291dHB1dE5hbWV9UHJveHlFbmRwb2ludGAsXG4gICAgICB2YWx1ZTogdGhpcy5kYXRhYmFzZVByb3h5LmVuZHBvaW50XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFkZFNlY3JldFJvdGF0aW9uKHByb3BzOiBSZHNQcm9wcyk6IHZvaWQge1xuICAgIGNvbnN0IHJvdGF0aW9uQ29uZmlnID0gcHJvcHMuY3JlZGVudGlhbHM/LnNlY3JldFJvdGF0aW9uO1xuICAgIGNvbnN0IHJvdGF0aW9uUGVyaW9kID1cbiAgICAgICh0eXBlb2Ygcm90YXRpb25Db25maWcgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgcm90YXRpb25Db25maWc/LmF1dG9tYXRpY2FsbHlBZnRlcikgfHxcbiAgICAgIER1cmF0aW9uLmRheXMoMzApO1xuXG4gICAgY29uc3QgbWFzdGVyU2VjcmV0ID0gbmV3IFNlY3JldCh0aGlzLCBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9TWFzdGVyU2VjcmV0YCwge1xuICAgICAgc2VjcmV0TmFtZTogUmVzb3VyY2VOYW1pbmcubWFzdGVyU2VjcmV0TmFtZSh0aGlzLmNvbnN0cnVjdElkKVxuICAgIH0pO1xuXG4gICAgbmV3IFNlY3JldFJvdGF0aW9uKHRoaXMsIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1TZWNyZXRSb3RhdGlvbmAsIHtcbiAgICAgIGFwcGxpY2F0aW9uOiBuZXcgU2VjcmV0Um90YXRpb25BcHBsaWNhdGlvbihcbiAgICAgICAgdGhpcy5lbmdpbmVDb25maWcucm90YXRpb25BcHBOYW1lLFxuICAgICAgICBcIjEuMS4zNjdcIixcbiAgICAgICAgeyBpc011bHRpVXNlcjogdHJ1ZSB9XG4gICAgICApLFxuICAgICAgc2VjcmV0OiB0aGlzLmRhdGFiYXNlQ3JlZGVudGlhbHMuc2VjcmV0LFxuICAgICAgbWFzdGVyU2VjcmV0OiBtYXN0ZXJTZWNyZXQuc2VjcmV0LFxuICAgICAgdGFyZ2V0OiB0aGlzLmRhdGFiYXNlQ2x1c3RlcixcbiAgICAgIHZwYzogdGhpcy5kYXRhYmFzZUNsdXN0ZXIudnBjLFxuICAgICAgYXV0b21hdGljYWxseUFmdGVyOiByb3RhdGlvblBlcmlvZFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0SG9zdEVuZHBvaW50KCk6IHN0cmluZyB7XG4gICAgLy8gUmV0dXJuIHByb3h5IGVuZHBvaW50IGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGNsdXN0ZXIgZW5kcG9pbnRcbiAgICBpZiAodGhpcy5kYXRhYmFzZVByb3h5KSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZVByb3h5LmVuZHBvaW50O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kYXRhYmFzZUNsdXN0ZXIuY2x1c3RlckVuZHBvaW50Lmhvc3RuYW1lO1xuICB9XG5cbiAgZ2V0SG9zdFBvcnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU3RyaW5nKHRoaXMucG9ydCk7XG4gIH1cblxuICBnZXRDcmVkZW50aWFscygpOiBTZWNyZXQge1xuICAgIHJldHVybiB0aGlzLmRhdGFiYXNlQ3JlZGVudGlhbHM7XG4gIH1cblxuICBnZXRDZm5DbHVzdGVyKCk6IENmbkRCQ2x1c3RlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY2ZuQ2x1c3RlcjtcbiAgfVxuXG4gIGdldERhdGFiYXNlQ2x1c3RlcigpOiBEYXRhYmFzZUNsdXN0ZXIge1xuICAgIHJldHVybiB0aGlzLmRhdGFiYXNlQ2x1c3RlcjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGVyZm9ybWFuY2VJbnNpZ2h0UmV0ZW50aW9uKFxuICAgIGRheXM/OiBudW1iZXJcbiAgKTogUGVyZm9ybWFuY2VJbnNpZ2h0UmV0ZW50aW9uIHtcbiAgICBzd2l0Y2ggKGRheXMpIHtcbiAgICAgIGNhc2UgNzpcbiAgICAgICAgcmV0dXJuIFBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbi5ERUZBVUxUO1xuICAgICAgY2FzZSAzMTpcbiAgICAgICAgcmV0dXJuIFBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbi5NT05USFNfMTtcbiAgICAgIGNhc2UgOTM6XG4gICAgICAgIHJldHVybiBQZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb24uTU9OVEhTXzM7XG4gICAgICBjYXNlIDE4NjpcbiAgICAgICAgcmV0dXJuIFBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbi5NT05USFNfNjtcbiAgICAgIGNhc2UgMzcyOlxuICAgICAgICByZXR1cm4gUGVyZm9ybWFuY2VJbnNpZ2h0UmV0ZW50aW9uLk1PTlRIU18xMjtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBQZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb24uTU9OVEhTXzE7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -52,6 +52,7 @@ interface RdsAuroraGlobalProps {
52
52
  }
53
53
  export declare class RdsAuroraGlobal extends Construct implements IConnectable {
54
54
  connections: Connections;
55
+ private readonly constructId;
55
56
  private globalCluster?;
56
57
  private primaryCluster?;
57
58
  private regionalCluster?;
@@ -6,14 +6,16 @@ const aws_rds_1 = require("aws-cdk-lib/aws-rds");
6
6
  const constructs_1 = require("constructs");
7
7
  const rdsAurora_1 = require("./rdsAurora");
8
8
  const resourceNaming_1 = require("../../../utils/resourceNaming");
9
+ const capitaliseString_1 = require("../../../utils/capitaliseString");
9
10
  class RdsAuroraGlobal extends constructs_1.Construct {
10
11
  constructor(scope, id, props) {
11
12
  super(scope, id);
13
+ this.constructId = id;
12
14
  this.props = props;
13
15
  this.currentRegion = aws_cdk_lib_1.Stack.of(this).region;
14
16
  this.globalId =
15
17
  props.globalClusterIdentifier?.toLowerCase() ||
16
- resourceNaming_1.ResourceNaming.globalClusterId(props.databaseName);
18
+ resourceNaming_1.ResourceNaming.globalClusterId(id);
17
19
  // create clusters / global cluster depending on region
18
20
  this.addAuroraCluster();
19
21
  this.addGlobalCluster();
@@ -24,17 +26,18 @@ class RdsAuroraGlobal extends constructs_1.Construct {
24
26
  return this.globalId;
25
27
  }
26
28
  getPrimaryClusterIdentifier() {
27
- return resourceNaming_1.ResourceNaming.primaryClusterId(this.props.databaseName);
29
+ return resourceNaming_1.ResourceNaming.primaryClusterId(this.constructId);
28
30
  }
29
31
  getGlobalClusterEngineString() {
30
- // Default to aurora-postgresql if no engine specified (matches existing behavior)
32
+ // Default to aurora-postgresql if no engine specified (matches existing behaviour)
31
33
  if (!this.props.engine)
32
34
  return "aurora-postgresql";
33
35
  // Handle different engine formats safely using unknown and type guards
34
36
  const engine = this.props.engine;
35
- // Try to extract engine type from the engine object
36
- // IClusterEngine may have properties like engineType, but we need to access
37
- // them safely since the interface doesn't guarantee all properties
37
+ // CDK's IClusterEngine interface does not expose engineType/engine/name
38
+ // properties directly, but the concrete implementations (e.g. AuroraMysqlEngineVersion)
39
+ // do have them at runtime. Cast through unknown to probe these internal fields.
40
+ // CDK engine internals — may break on CDK upgrades. See rdsAuroraGlobal unit test.
38
41
  const engineRecord = engine;
39
42
  let engineType = engineRecord.engineType ?? engineRecord.engine ?? engineRecord.name;
40
43
  // If the engine was provided as a raw string (unlikely but support it)
@@ -140,7 +143,7 @@ class RdsAuroraGlobal extends constructs_1.Construct {
140
143
  this.regionalCluster = new rdsAurora_1.RdsAurora(this, `${this.props.databaseName}Regional`, {
141
144
  vpc: this.props.vpc,
142
145
  databaseName: this.props.databaseName,
143
- clusterIdentifier: resourceNaming_1.ResourceNaming.secondaryClusterId(this.props.databaseName, this.currentRegion),
146
+ clusterIdentifier: resourceNaming_1.ResourceNaming.secondaryClusterId(this.constructId, this.currentRegion),
144
147
  isGlobalSecondary: true,
145
148
  // Secondary doesn't create credentials (uses replicated secret)
146
149
  ...commonConfig
@@ -161,9 +164,10 @@ class RdsAuroraGlobal extends constructs_1.Construct {
161
164
  }
162
165
  }
163
166
  addOutputs() {
164
- new aws_cdk_lib_1.CfnOutput(this, `${this.props.databaseName}GlobalClusterIdentifierOutput`, {
167
+ const outputName = (0, capitaliseString_1.toPascalCase)(this.props.databaseName);
168
+ new aws_cdk_lib_1.CfnOutput(this, `${outputName}GlobalClusterIdentifierOutput`, {
165
169
  value: this.globalId,
166
- exportName: `${this.props.databaseName}GlobalClusterIdentifier`
170
+ exportName: `${outputName}GlobalClusterIdentifier`
167
171
  });
168
172
  }
169
173
  getCredentials() {
@@ -189,4 +193,4 @@ class RdsAuroraGlobal extends constructs_1.Construct {
189
193
  }
190
194
  }
191
195
  exports.RdsAuroraGlobal = RdsAuroraGlobal;
192
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmRzQXVyb3JhR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvZGF0YWJhc2UvcmRzQXVyb3JhR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUFnRjtBQUNoRixpREFBMEU7QUFDMUUsMkNBQXVDO0FBT3ZDLDJDQUF3QztBQVd4QyxrRUFBK0Q7QUF1RC9ELE1BQWEsZUFBZ0IsU0FBUSxzQkFBUztJQVU1QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTJCO1FBQ25FLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDM0MsSUFBSSxDQUFDLFFBQVE7WUFDWCxLQUFLLENBQUMsdUJBQXVCLEVBQUUsV0FBVyxFQUFFO2dCQUM1QywrQkFBYyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFckQsdURBQXVEO1FBQ3ZELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQseUJBQXlCO0lBQ3pCLDBCQUEwQjtRQUN4QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELDJCQUEyQjtRQUN6QixPQUFPLCtCQUFjLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRU8sNEJBQTRCO1FBQ2xDLGtGQUFrRjtRQUNsRixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO1lBQUUs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IHsgQ2ZuT3V0cHV0LCB0eXBlIER1cmF0aW9uLCB0eXBlIElSZXNvbHZhYmxlLCBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgQ2ZuR2xvYmFsQ2x1c3RlciwgdHlwZSBDZm5EQkNsdXN0ZXIgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJkc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7XG4gIHR5cGUgSVZwYyxcbiAgdHlwZSBDb25uZWN0aW9ucyxcbiAgdHlwZSBJQ29ubmVjdGFibGVcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IHR5cGUgSUNsdXN0ZXJFbmdpbmUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJkc1wiO1xuaW1wb3J0IHsgUmRzQXVyb3JhIH0gZnJvbSBcIi4vcmRzQXVyb3JhXCI7XG5pbXBvcnQgeyB0eXBlIFNlY3JldCB9IGZyb20gXCIuLi9zZWNyZXRzXCI7XG5pbXBvcnQge1xuICB0eXBlIEVuZ2luZUNvbmZpZyxcbiAgdHlwZSBQcm94eUNvbmZpZyxcbiAgdHlwZSBDcmVkZW50aWFsc0NvbmZpZyxcbiAgdHlwZSBBdXJvcmFFbmNyeXB0aW9uQ29uZmlnLFxuICB0eXBlIEF1cm9yYVdyaXRlckNvbmZpZyxcbiAgdHlwZSBBdXJvcmFSZWFkZXJzQ29uZmlnLFxuICB0eXBlIFBlcmZvcm1hbmNlSW5zaWdodHNDb25maWdcbn0gZnJvbSBcIi4uLy4uLy4uL3BhdHRlcm5zL2F3cy9kYXRhYmFzZVwiO1xuaW1wb3J0IHsgUmVzb3VyY2VOYW1pbmcgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvcmVzb3VyY2VOYW1pbmdcIjtcblxuaW50ZXJmYWNlIFJkc0F1cm9yYUdsb2JhbFByb3BzIHtcbiAgdnBjOiBJVnBjO1xuICBkYXRhYmFzZU5hbWU6IHN0cmluZztcbiAgLyoqIFByaW1hcnkgcmVnaW9uIHdoZXJlIHRoZSBpbml0aWFsIGNsdXN0ZXIgJiBnbG9iYWwgY2x1c3RlciByZXNvdXJjZSBhcmUgY3JlYXRlZCAqL1xuICBwcmltYXJ5UmVnaW9uOiBzdHJpbmc7XG4gIC8qKiBTZWNvbmRhcnkgcmVnaW9ucyB3aGVyZSBBdXJvcmEgY2x1c3RlcnMgd2lsbCBiZSBkZXBsb3llZCAoZm9yIHNlY3JldCByZXBsaWNhdGlvbikgKi9cbiAgc2Vjb25kYXJ5UmVnaW9ucz86IHN0cmluZ1tdO1xuICAvKiogT3B0aW9uYWwgZGV0ZXJtaW5pc3RpYyBpZCBmb3IgdGhlIGdsb2JhbCBjbHVzdGVyIChzaG91bGQgYmUgc2hhcmVkIGFjcm9zcyBzdGFja3MvcmVnaW9ucykgKi9cbiAgZ2xvYmFsQ2x1c3RlcklkZW50aWZpZXI/OiBzdHJpbmc7XG4gIC8qKiBPcHRpb25hbCBlbmdpbmUgdG8gZm9yd2FyZCB0byB0aGUgdW5kZXJseWluZyBjbHVzdGVyICovXG4gIGVuZ2luZT86IElDbHVzdGVyRW5naW5lO1xuICAvKiogRW5naW5lLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gKHVzZXJuYW1lLCBTU0wgcGFyYW1zLCByb3RhdGlvbiBhcHApICovXG4gIGVuZ2luZUNvbmZpZz86IEVuZ2luZUNvbmZpZztcbiAgLyoqIEVuYWJsZSB3cml0ZSBmb3J3YXJkaW5nIG9uIHNlY29uZGFyeSBjbHVzdGVycyB0byBmb3J3YXJkIHdyaXRlcyB0byBwcmltYXJ5IHJlZ2lvbiAqL1xuICBlbmFibGVHbG9iYWxXcml0ZUZvcndhcmRpbmc/OiBib29sZWFuO1xuXG4gIC8vIEluc3RhbmNlIGNvbmZpZ3VyYXRpb24gKGFwcGxpZWQgdG8gYWxsIHJlZ2lvbmFsIGNsdXN0ZXJzKVxuICAvKiogV3JpdGVyIGluc3RhbmNlIGNvbmZpZ3VyYXRpb24gKi9cbiAgd3JpdGVyPzogQXVyb3JhV3JpdGVyQ29uZmlnO1xuICAvKipcbiAgICogUmVhZGVyIGluc3RhbmNlcyBjb25maWd1cmF0aW9uLlxuICAgKiAtIGB7IGNvdW50OiBOIH1gIC0gU2ltcGxlOiBOIHJlYWRlcnMgd2l0aCBkZWZhdWx0c1xuICAgKiAtIGB7IGluc3RhbmNlczogWy4uLl0gfWAgLSBBZHZhbmNlZDogcGVyLXJlYWRlciBjb25maWdcbiAgICogLSBgZmFsc2VgIC0gRXhwbGljaXRseSBkaXNhYmxlIHJlYWRlcnMgKHdyaXRlci1vbmx5IGNsdXN0ZXIpXG4gICAqIC0gT21pdCAtIERlZmF1bHQ6IDEgcmVhZGVyXG4gICAqL1xuICByZWFkZXJzPzogQXVyb3JhUmVhZGVyc0NvbmZpZyB8IGZhbHNlO1xuXG4gIC8vIE5lc3RlZCBjb25maWd1cmF0aW9ucyAocHJlc2VuY2UtYmFzZWQpXG4gIC8qKiBSRFMgUHJveHkgY29uZmlndXJhdGlvbi4gT21pdCA9IG5vIHByb3h5LCB7fSA9IGRlZmF1bHRzLCBmYWxzZSA9IGRpc2FibGVkICovXG4gIHByb3h5PzogUHJveHlDb25maWcgfCBmYWxzZTtcbiAgLyoqIENyZWRlbnRpYWxzIGNvbmZpZ3VyYXRpb24gaW5jbHVkaW5nIHVzZXJuYW1lIGFuZCBzZWNyZXQgcm90YXRpb24gKi9cbiAgY3JlZGVudGlhbHM/OiBDcmVkZW50aWFsc0NvbmZpZztcbiAgLyoqIEVuY3J5cHRpb24gY29uZmlndXJhdGlvbiAqL1xuICBlbmNyeXB0aW9uPzogQXVyb3JhRW5jcnlwdGlvbkNvbmZpZztcblxuICAvLyBPcGVyYXRpb25hbCBjb25maWd1cmF0aW9uXG4gIC8qKiBCYWNrdXAgcmV0ZW50aW9uIGluIGRheXMuIERlZmF1bHQ6IDE0ICovXG4gIGJhY2t1cFJldGVudGlvbj86IG51bWJlcjtcbiAgLyoqIENsb3VkV2F0Y2ggbW9uaXRvcmluZyBpbnRlcnZhbC4gRGVmYXVsdDogMSBtaW51dGUgKi9cbiAgbW9uaXRvcmluZ0ludGVydmFsPzogRHVyYXRpb247XG4gIC8qKiBQcmVmZXJyZWQgbWFpbnRlbmFuY2Ugd2luZG93LiBEZWZhdWx0OiBcIlNhdDoxMjozMC1TYXQ6MjA6MzBcIiAqL1xuICBwcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdz86IHN0cmluZztcbiAgLyoqIERhdGFiYXNlIHBvcnQuIERlZmF1bHQ6IDM1MjU1IChGSkFMTCBvbiBwaG9uZSBrZXlwYWQpICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIHBlcmZvcm1hbmNlSW5zaWdodHM/OiBQZXJmb3JtYW5jZUluc2lnaHRzQ29uZmlnIHwgZmFsc2U7XG4gIGRlbGV0aW9uUHJvdGVjdGlvbj86IGJvb2xlYW47XG4gIC8qKiBBUk4gb3IgaWRlbnRpZmllciBvZiBEQiBjbHVzdGVyIHNuYXBzaG90IHRvIHJlc3RvcmUgZnJvbSAqL1xuICBzbmFwc2hvdElkZW50aWZpZXI/OiBzdHJpbmc7XG4gIC8qKiBVc2VybmFtZSBmcm9tIHRoZSBzbmFwc2hvdCAocmVxdWlyZWQgd2hlbiByZXN0b3JpbmcgZnJvbSBzbmFwc2hvdCB0byByZXNldCBwYXNzd29yZCkgKi9cbiAgc25hcHNob3RVc2VybmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFJkc0F1cm9yYUdsb2JhbCBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElDb25uZWN0YWJsZSB7XG4gIHB1YmxpYyBjb25uZWN0aW9ucyE6IENvbm5lY3Rpb25zO1xuXG4gIHByaXZhdGUgZ2xvYmFsQ2x1c3Rlcj86IENmbkdsb2JhbENsdXN0ZXI7XG4gIHByaXZhdGUgcHJpbWFyeUNsdXN0ZXI/OiBSZHNBdXJvcmE7XG4gIHByaXZhdGUgcmVnaW9uYWxDbHVzdGVyPzogUmRzQXVyb3JhO1xuICBwcml2YXRlIHByb3BzOiBSZHNBdXJvcmFHbG9iYWxQcm9wcztcbiAgcHJpdmF0ZSBjdXJyZW50UmVnaW9uOiBzdHJpbmc7XG4gIHByaXZhdGUgZ2xvYmFsSWQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUmRzQXVyb3JhR2xvYmFsUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgIHRoaXMuY3VycmVudFJlZ2lvbiA9IFN0YWNrLm9mKHRoaXMpLnJlZ2lvbjtcbiAgICB0aGlzLmdsb2JhbElkID1cbiAgICAgIHByb3BzLmdsb2JhbENsdXN0ZXJJZGVudGlmaWVyPy50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICBSZXNvdXJjZU5hbWluZy5nbG9iYWxDbHVzdGVySWQocHJvcHMuZGF0YWJhc2VOYW1lKTtcblxuICAgIC8vIGNyZWF0ZSBjbHVzdGVycyAvIGdsb2JhbCBjbHVzdGVyIGRlcGVuZGluZyBvbiByZWdpb25cbiAgICB0aGlzLmFkZEF1cm9yYUNsdXN0ZXIoKTtcbiAgICB0aGlzLmFkZEdsb2JhbENsdXN0ZXIoKTtcbiAgICB0aGlzLmFkZE91dHB1dHMoKTtcbiAgfVxuXG4gIC8vIC0tLSBwdWJsaWMgaGVscGVycyAtLS1cbiAgZ2V0R2xvYmFsQ2x1c3RlcklkZW50aWZpZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nbG9iYWxJZDtcbiAgfVxuXG4gIGdldFByaW1hcnlDbHVzdGVySWRlbnRpZmllcigpOiBzdHJpbmcge1xuICAgIHJldHVybiBSZXNvdXJjZU5hbWluZy5wcmltYXJ5Q2x1c3RlcklkKHRoaXMucHJvcHMuZGF0YWJhc2VOYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0R2xvYmFsQ2x1c3RlckVuZ2luZVN0cmluZygpOiBzdHJpbmcge1xuICAgIC8vIERlZmF1bHQgdG8gYXVyb3JhLXBvc3RncmVzcWwgaWYgbm8gZW5naW5lIHNwZWNpZmllZCAobWF0Y2hlcyBleGlzdGluZyBiZWhhdmlvcilcbiAgICBpZiAoIXRoaXMucHJvcHMuZW5naW5lKSByZXR1cm4gXCJhdXJvcmEtcG9zdGdyZXNxbFwiO1xuXG4gICAgLy8gSGFuZGxlIGRpZmZlcmVudCBlbmdpbmUgZm9ybWF0cyBzYWZlbHkgdXNpbmcgdW5rbm93biBhbmQgdHlwZSBndWFyZHNcbiAgICBjb25zdCBlbmdpbmUgPSB0aGlzLnByb3BzLmVuZ2luZTtcblxuICAgIC8vIFRyeSB0byBleHRyYWN0IGVuZ2luZSB0eXBlIGZyb20gdGhlIGVuZ2luZSBvYmplY3RcbiAgICAvLyBJQ2x1c3RlckVuZ2luZSBtYXkgaGF2ZSBwcm9wZXJ0aWVzIGxpa2UgZW5naW5lVHlwZSwgYnV0IHdlIG5lZWQgdG8gYWNjZXNzXG4gICAgLy8gdGhlbSBzYWZlbHkgc2luY2UgdGhlIGludGVyZmFjZSBkb2Vzbid0IGd1YXJhbnRlZSBhbGwgcHJvcGVydGllc1xuICAgIGNvbnN0IGVuZ2luZVJlY29yZCA9IGVuZ2luZSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGxldCBlbmdpbmVUeXBlOiB1bmtub3duID1cbiAgICAgIGVuZ2luZVJlY29yZC5lbmdpbmVUeXBlID8/IGVuZ2luZVJlY29yZC5lbmdpbmUgPz8gZW5naW5lUmVjb3JkLm5hbWU7XG5cbiAgICAvLyBJZiB0aGUgZW5naW5lIHdhcyBwcm92aWRlZCBhcyBhIHJhdyBzdHJpbmcgKHVubGlrZWx5IGJ1dCBzdXBwb3J0IGl0KVxuICAgIGlmICh0eXBlb2YgZW5naW5lID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBlbmdpbmVUeXBlID0gZW5naW5lO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIHRvIHRvU3RyaW5nKCkgZm9yIFRva2VuLWxpa2Ugb2JqZWN0c1xuICAgIGlmICghZW5naW5lVHlwZSAmJiB0eXBlb2YgZW5naW5lUmVjb3JkLnRvU3RyaW5nID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGVuZ2luZVR5cGUgPSBlbmdpbmVSZWNvcmQudG9TdHJpbmcoKTtcbiAgICAgIH0gY2F0Y2ggKF9lKSB7XG4gICAgICAgIGVuZ2luZVR5cGUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBlbmdpbmVUeXBlICE9PSBcInN0cmluZ1wiKSByZXR1cm4gXCJhdXJvcmEtcG9zdGdyZXNxbFwiO1xuXG4gICAgLy8gTm9ybWFsaXNlIGNvbW1vbiBmb3JtczogQVVST1JBX1BPU1RHUkVTUUwgLT4gYXVyb3JhLXBvc3RncmVzcWwsIGF1cm9yYV9wb3N0Z3Jlc3FsIC0+IGF1cm9yYS1wb3N0Z3Jlc3FsXG4gICAgY29uc3Qgbm9ybWFsaXNlZCA9IGVuZ2luZVR5cGUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9fL2csIFwiLVwiKTtcblxuICAgIC8vIElmIHRoZSBub3JtYWxpc2VkIHZhbHVlIGlzIGp1c3QgJ2F1cm9yYScsIHByZWZlciB0aGUgbW9yZSBzcGVjaWZpYyBwb3N0Z3JlcyBkZWZhdWx0XG4gICAgaWYgKG5vcm1hbGlzZWQgPT09IFwiYXVyb3JhXCIpIHJldHVybiBcImF1cm9yYS1wb3N0Z3Jlc3FsXCI7XG5cbiAgICByZXR1cm4gbm9ybWFsaXNlZDtcbiAgfVxuXG4gIC8vIGNyZWF0ZSB0aGUgQ2ZuR2xvYmFsQ2x1c3RlciBvbmx5IGluIHRoZSBwcmltYXJ5IHJlZ2lvblxuICBhZGRHbG9iYWxDbHVzdGVyKCkge1xuICAgIGlmICh0aGlzLnByb3BzLnByaW1hcnlSZWdpb24gIT09IHRoaXMuY3VycmVudFJlZ2lvbikgcmV0dXJuO1xuXG4gICAgLy8gY3JlYXRlIHRoZSBnbG9iYWwgY2x1c3RlciByZXNvdXJjZSByZWZlcmVuY2luZyB0aGUgcHJpbWFyeSBjbHVzdGVyIGlkZW50aWZpZXJcbiAgICAvLyBQcmVmZXIgcmVmZXJlbmNpbmcgdGhlIEwxIERCQ2x1c3RlciBSZWYgc28gQ2xvdWRGb3JtYXRpb24gd2lsbCBjcmVhdGUgdGhlXG4gICAgLy8gREJDbHVzdGVyIGZpcnN0IGFuZCB3ZSBhdm9pZCBpZGVudGlmaWVyLWNhc2luZyBtaXNtYXRjaGVzLlxuICAgIGxldCBzb3VyY2VJZGVudGlmaWVyOiBzdHJpbmcgfCBJUmVzb2x2YWJsZSA9XG4gICAgICB0aGlzLmdldFByaW1hcnlDbHVzdGVySWRlbnRpZmllcigpO1xuICAgIGxldCBwcmltYXJ5TDE6IENmbkRCQ2x1c3RlciB8IHVuZGVmaW5lZDtcblxuICAgIGlmICh0aGlzLnByaW1hcnlDbHVzdGVyKSB7XG4gICAgICAvLyBVc2UgdGhlIGhlbHBlciBvbiBSZHNBdXJvcmEgdG8gZ2V0IHRoZSB1bmRlcmx5aW5nIEwxIERCQ2x1c3RlciAobW9yZSByZWxpYWJsZVxuICAgICAgLy8gdGhhbiByZWx5aW5nIG9uIG5vZGUuZGVmYXVsdENoaWxkIHdoaWNoIGNhbiB2YXJ5IGRlcGVuZGluZyBvbiBjb25zdHJ1Y3Qgb3JkZXJpbmcpXG4gICAgICBwcmltYXJ5TDEgPVxuICAgICAgICB0aGlzLnByaW1hcnlDbHVzdGVyLmdldENmbkNsdXN0ZXIgJiZcbiAgICAgICAgdGhpcy5wcmltYXJ5Q2x1c3Rlci5nZXRDZm5DbHVzdGVyKCk7XG4gICAgICBpZiAocHJpbWFyeUwxKSB7XG4gICAgICAgIHNvdXJjZUlkZW50aWZpZXIgPSBwcmltYXJ5TDEucmVmO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZ2xvYmFsQ2x1c3RlciA9IG5ldyBDZm5HbG9iYWxDbHVzdGVyKFxuICAgICAgdGhpcyxcbiAgICAgIGAke3RoaXMucHJvcHMuZGF0YWJhc2VOYW1lfUdsb2JhbENsdXN0ZXJgLFxuICAgICAge1xuICAgICAgICBnbG9iYWxDbHVzdGVySWRlbnRpZmllcjogdGhpcy5nbG9iYWxJZCxcbiAgICAgICAgc291cmNlRGJDbHVzdGVySWRlbnRpZmllcjogc291cmNlSWRlbnRpZmllclxuICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBlbnN1cmUgdGhlIHVuZGVybHlpbmcgcHJpbWFyeSBEQkNsdXN0ZXIgTDEgaGFzIHRoZSBnbG9iYWxDbHVzdGVySWRlbnRpZmllciBzZXRcbiAgICBpZiAocHJpbWFyeUwxKSB7XG4gICAgICAvLyBNYWtlIHRoZSBDRk4gZGVwZW5kZW5jeSBleHBsaWNpdCBzbyB0aGUgREJDbHVzdGVyIGlzIGNyZWF0ZWQgYmVmb3JlIHRoZSBHbG9iYWxDbHVzdGVyXG4gICAgICB0aGlzLmdsb2JhbENsdXN0ZXIuYWRkRGVwZW5kc09uKHByaW1hcnlMMSk7XG4gICAgICAvLyBJTVBPUlRBTlQ6IGRvIE5PVCBzZXQgdGhlIHByaW1hcnkgREJDbHVzdGVyJ3MgYGdsb2JhbENsdXN0ZXJJZGVudGlmaWVyYCBoZXJlLlxuICAgICAgLy8gSWYgd2Ugc2V0IHRoZSBwcmltYXJ5IERCQ2x1c3RlciB0byByZWZlcmVuY2UgdGhlIGdsb2JhbCBjbHVzdGVyLCBDbG91ZEZvcm1hdGlvblxuICAgICAgLy8gd2lsbCBhdHRlbXB0IHRvIHZhbGlkYXRlIHRoYXQgdGhlIGdsb2JhbCBjbHVzdGVyIGV4aXN0cyB3aGVuIGNyZWF0aW5nIHRoZVxuICAgICAgLy8gREJDbHVzdGVyIOKAlCBidXQgdGhlIGdsb2JhbCBjbHVzdGVyIGlzIGNyZWF0ZWQgYWZ0ZXJ3YXJkICh3ZSBhZGQgYVxuICAgICAgLy8gZGVwZW5kc09uKSwgd2hpY2ggY2F1c2VzIGEgXCJHbG9iYWwgY2x1c3RlciAuLi4gbm90IGZvdW5kXCIgZXJyb3IuIFRoZVxuICAgICAgLy8gY29ycmVjdCBvcmRlciBpcyB0byBjcmVhdGUgdGhlIERCQ2x1c3RlciBmaXJzdCwgdGhlbiBjcmVhdGUgdGhlXG4gICAgICAvLyBDZm5HbG9iYWxDbHVzdGVyIHdpdGggYHNvdXJjZURiQ2x1c3RlcklkZW50aWZpZXJgIHBvaW50aW5nIGF0IHRoZVxuICAgICAgLy8gcHJpbWFyeSBjbHVzdGVyJ3MgUmVmLiBMZWF2aW5nIHRoZSBwcmltYXJ5IEwxIHdpdGhvdXQgdGhlXG4gICAgICAvLyBgZ2xvYmFsQ2x1c3RlcklkZW50aWZpZXJgIGF2b2lkcyB0aGUgY2lyY3VsYXIgcmVmZXJlbmNlLlxuICAgIH1cbiAgfVxuXG4gIC8vIGNyZWF0ZSBhbiBBdXJvcmEgY2x1c3RlciBpbiB0aGlzIHJlZ2lvbiAocHJpbWFyeSBvciBzZWNvbmRhcnkpXG4gIGFkZEF1cm9yYUNsdXN0ZXIoKSB7XG4gICAgLy8gQ29tbW9uIGNvbmZpZ3VyYXRpb24gc2hhcmVkIGJldHdlZW4gcHJpbWFyeSBhbmQgc2Vjb25kYXJ5IGNsdXN0ZXJzXG4gICAgY29uc3QgY29tbW9uQ29uZmlnID0ge1xuICAgICAgZW5naW5lOiB0aGlzLnByb3BzLmVuZ2luZSxcbiAgICAgIGVuZ2luZUNvbmZpZzogdGhpcy5wcm9wcy5lbmdpbmVDb25maWcsXG4gICAgICAvLyBJbnN0YW5jZSBjb25maWd1cmF0aW9uXG4gICAgICB3cml0ZXI6IHRoaXMucHJvcHMud3JpdGVyLFxuICAgICAgcmVhZGVyczogdGhpcy5wcm9wcy5yZWFkZXJzLFxuICAgICAgLy8gTmVzdGVkIGNvbmZpZ3VyYXRpb25zXG4gICAgICBwcm94eTogdGhpcy5wcm9wcy5wcm94eSxcbiAgICAgIGVuY3J5cHRpb246IHRoaXMucHJvcHMuZW5jcnlwdGlvbixcbiAgICAgIC8vIE9wZXJhdGlvbmFsIGNvbmZpZ3VyYXRpb25cbiAgICAgIGJhY2t1cFJldGVudGlvbjogdGhpcy5wcm9wcy5iYWNrdXBSZXRlbnRpb24sXG4gICAgICBtb25pdG9yaW5nSW50ZXJ2YWw6IHRoaXMucHJvcHMubW9uaXRvcmluZ0ludGVydmFsLFxuICAgICAgcHJlZmVycmVkTWFpbnRlbmFuY2VXaW5kb3c6IHRoaXMucHJvcHMucHJlZmVycmVkTWFpbnRlbmFuY2VXaW5kb3csXG4gICAgICBwb3J0OiB0aGlzLnByb3BzLnBvcnQsXG4gICAgICBwZXJmb3JtYW5jZUluc2lnaHRzOiB0aGlzLnByb3BzLnBlcmZvcm1hbmNlSW5zaWdodHMsXG4gICAgICBkZWxldGlvblByb3RlY3Rpb246IHRoaXMucHJvcHMuZGVsZXRpb25Qcm90ZWN0aW9uLFxuICAgICAgc25hcHNob3RJZGVudGlmaWVyOiB0aGlzLnByb3BzLnNuYXBzaG90SWRlbnRpZmllcixcbiAgICAgIHNuYXBzaG90VXNlcm5hbWU6IHRoaXMucHJvcHMuc25hcHNob3RVc2VybmFtZVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5wcm9wcy5wcmltYXJ5UmVnaW9uID09PSB0aGlzLmN1cnJlbnRSZWdpb24pIHtcbiAgICAgIC8vIHByaW1hcnlcbiAgICAgIHRoaXMucHJpbWFyeUNsdXN0ZXIgPSBuZXcgUmRzQXVyb3JhKFxuICAgICAgICB0aGlzLFxuICAgICAgICBgJHt0aGlzLnByb3BzLmRhdGFiYXNlTmFtZX1QcmltYXJ5YCxcbiAgICAgICAge1xuICAgICAgICAgIHZwYzogdGhpcy5wcm9wcy52cGMsXG4gICAgICAgICAgZGF0YWJhc2VOYW1lOiB0aGlzLnByb3BzLmRhdGFiYXNlTmFtZSxcbiAgICAgICAgICBjbHVzdGVySWRlbnRpZmllcjogdGhpcy5nZXRQcmltYXJ5Q2x1c3RlcklkZW50aWZpZXIoKSxcbiAgICAgICAgICAvLyBFbmFibGUgc2VjcmV0IHJlcGxpY2F0aW9uIHRvIHNlY29uZGFyeSByZWdpb25zXG4gICAgICAgICAgc2VjcmV0UmVwbGljYVJlZ2lvbnM6IHRoaXMucHJvcHMuc2Vjb25kYXJ5UmVnaW9ucyxcbiAgICAgICAgICAvLyBQcmltYXJ5IHJlZ2lvbiBjcmVhdGVzIGNyZWRlbnRpYWxzXG4gICAgICAgICAgY3JlZGVudGlhbHM6IHRoaXMucHJvcHMuY3JlZGVudGlhbHMsXG4gICAgICAgICAgLi4uY29tbW9uQ29uZmlnXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25zID0gdGhpcy5wcmltYXJ5Q2x1c3Rlci5jb25uZWN0aW9ucztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gc2Vjb25kYXJ5IHJlZ2lvblxuICAgICAgLy8gUGFzcyBkYXRhYmFzZU5hbWUgZm9yIHJlc291cmNlIG5hbWluZywgYnV0IGZsYWcgYXMgZ2xvYmFsIHNlY29uZGFyeVxuICAgICAgLy8gVGhpcyBwcmV2ZW50cyBzZXR0aW5nIGNyZWRlbnRpYWxzIGFuZCBkZWZhdWx0RGF0YWJhc2VOYW1lIHdoaWNoIGFyZSBpbmhlcml0ZWQgZnJvbSBwcmltYXJ5XG4gICAgICB0aGlzLnJlZ2lvbmFsQ2x1c3RlciA9IG5ldyBSZHNBdXJvcmEoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGAke3RoaXMucHJvcHMuZGF0YWJhc2VOYW1lfVJlZ2lvbmFsYCxcbiAgICAgICAge1xuICAgICAgICAgIHZwYzogdGhpcy5wcm9wcy52cGMsXG4gICAgICAgICAgZGF0YWJhc2VOYW1lOiB0aGlzLnByb3BzLmRhdGFiYXNlTmFtZSxcbiAgICAgICAgICBjbHVzdGVySWRlbnRpZmllcjogUmVzb3VyY2VOYW1pbmcuc2Vjb25kYXJ5Q2x1c3RlcklkKFxuICAgICAgICAgICAgdGhpcy5wcm9wcy5kYXRhYmFzZU5hbWUsXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRSZWdpb25cbiAgICAgICAgICApLFxuICAgICAgICAgIGlzR2xvYmFsU2Vjb25kYXJ5OiB0cnVlLFxuICAgICAgICAgIC8vIFNlY29uZGFyeSBkb2Vzbid0IGNyZWF0ZSBjcmVkZW50aWFscyAodXNlcyByZXBsaWNhdGVkIHNlY3JldClcbiAgICAgICAgICAuLi5jb21tb25Db25maWdcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgLy8gc2V0IHRoZSBMMSBEQkNsdXN0ZXIgcHJvcGVydHkgc28gQ2xvdWRGb3JtYXRpb24gd2lsbCBqb2luIGl0IHRvIHRoZSBnbG9iYWwgY2x1c3RlclxuICAgICAgaWYgKHRoaXMucmVnaW9uYWxDbHVzdGVyKSB7XG4gICAgICAgIGNvbnN0IHJlZ2lvbmFsTDEgPVxuICAgICAgICAgIHRoaXMucmVnaW9uYWxDbHVzdGVyLmdldENmbkNsdXN0ZXIgJiZcbiAgICAgICAgICB0aGlzLnJlZ2lvbmFsQ2x1c3Rlci5nZXRDZm5DbHVzdGVyKCk7XG4gICAgICAgIGlmIChyZWdpb25hbEwxKSB7XG4gICAgICAgICAgcmVnaW9uYWxMMS5nbG9iYWxDbHVzdGVySWRlbnRpZmllciA9IHRoaXMuZ2xvYmFsSWQ7XG5cbiAgICAgICAgICAvLyBFbmFibGUgd3JpdGUgZm9yd2FyZGluZyBpZiByZXF1ZXN0ZWRcbiAgICAgICAgICBpZiAodGhpcy5wcm9wcy5lbmFibGVHbG9iYWxXcml0ZUZvcndhcmRpbmcpIHtcbiAgICAgICAgICAgIHJlZ2lvbmFsTDEuZW5hYmxlR2xvYmFsV3JpdGVGb3J3YXJkaW5nID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb25uZWN0aW9ucyA9IHRoaXMucmVnaW9uYWxDbHVzdGVyLmNvbm5lY3Rpb25zO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZE91dHB1dHMoKSB7XG4gICAgbmV3IENmbk91dHB1dChcbiAgICAgIHRoaXMsXG4gICAgICBgJHt0aGlzLnByb3BzLmRhdGFiYXNlTmFtZX1HbG9iYWxDbHVzdGVySWRlbnRpZmllck91dHB1dGAsXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiB0aGlzLmdsb2JhbElkLFxuICAgICAgICBleHBvcnROYW1lOiBgJHt0aGlzLnByb3BzLmRhdGFiYXNlTmFtZX1HbG9iYWxDbHVzdGVySWRlbnRpZmllcmBcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgZ2V0Q3JlZGVudGlhbHMoKTogU2VjcmV0IHtcbiAgICBpZiAodGhpcy5wcmltYXJ5Q2x1c3RlcikgcmV0dXJuIHRoaXMucHJpbWFyeUNsdXN0ZXIuZ2V0Q3JlZGVudGlhbHMoKTtcbiAgICBpZiAodGhpcy5yZWdpb25hbENsdXN0ZXIpIHJldHVybiB0aGlzLnJlZ2lvbmFsQ2x1c3Rlci5nZXRDcmVkZW50aWFscygpO1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIEF1cm9yYSBjbHVzdGVyIGF2YWlsYWJsZSB0byByZXR1cm4gY3JlZGVudGlhbHMgZnJvbVwiKTtcbiAgfVxuXG4gIGdldEhvc3RFbmRwb2ludCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnByaW1hcnlDbHVzdGVyKSByZXR1cm4gdGhpcy5wcmltYXJ5Q2x1c3Rlci5nZXRIb3N0RW5kcG9pbnQoKTtcbiAgICBpZiAodGhpcy5yZWdpb25hbENsdXN0ZXIpIHJldHVybiB0aGlzLnJlZ2lvbmFsQ2x1c3Rlci5nZXRIb3N0RW5kcG9pbnQoKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBBdXJvcmEgY2x1c3RlciBhdmFpbGFibGUgdG8gcmV0dXJuIGVuZHBvaW50IGZyb21cIik7XG4gIH1cblxuICBnZXRIb3N0UG9ydCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnByaW1hcnlDbHVzdGVyKSByZXR1cm4gdGhpcy5wcmltYXJ5Q2x1c3Rlci5nZXRIb3N0UG9ydCgpO1xuICAgIGlmICh0aGlzLnJlZ2lvbmFsQ2x1c3RlcikgcmV0dXJuIHRoaXMucmVnaW9uYWxDbHVzdGVyLmdldEhvc3RQb3J0KCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gQXVyb3JhIGNsdXN0ZXIgYXZhaWxhYmxlIHRvIHJldHVybiBwb3J0IGZyb21cIik7XG4gIH1cbn1cbiJdfQ==
196
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmRzQXVyb3JhR2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvZGF0YWJhc2UvcmRzQXVyb3JhR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUFnRjtBQUNoRixpREFBMEU7QUFDMUUsMkNBQXVDO0FBT3ZDLDJDQUF3QztBQVd4QyxrRUFBK0Q7QUFDL0Qsc0VBQStEO0FBdUQvRCxNQUFhLGVBQWdCLFNBQVEsc0JBQVM7SUFXNUMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUEyQjtRQUNuRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxhQUFhLEdBQUcsbUJBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQzNDLElBQUksQ0FBQyxRQUFRO1lBQ1gsS0FBSyxDQUFDLHVCQUF1QixFQUFFLFdBQVcsRUFBRTtnQkFDNUMsK0JBQWMsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFckMsdURBQXVEO1FBQ3ZELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQseUJBQXlCO0lBQ3pCLDBCQUEwQjtRQUN4QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELDJCQUEyQjtRQUN6QixPQUFPLCtCQUFjLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFTyw0QkFBNEI7UUFDbEMsbUZBQW1GO1FBQ25GLElBQUksQ0FBQyxJ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QUFDLENBQUM7SUFDckUsQ0FBQztDQUNGO0FBbE9ELDBDQWtPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENmbk91dHB1dCwgdHlwZSBEdXJhdGlvbiwgdHlwZSBJUmVzb2x2YWJsZSwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IENmbkdsb2JhbENsdXN0ZXIsIHR5cGUgQ2ZuREJDbHVzdGVyIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yZHNcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQge1xuICB0eXBlIElWcGMsXG4gIHR5cGUgQ29ubmVjdGlvbnMsXG4gIHR5cGUgSUNvbm5lY3RhYmxlXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5pbXBvcnQgeyB0eXBlIElDbHVzdGVyRW5naW5lIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yZHNcIjtcbmltcG9ydCB7IFJkc0F1cm9yYSB9IGZyb20gXCIuL3Jkc0F1cm9yYVwiO1xuaW1wb3J0IHsgdHlwZSBTZWNyZXQgfSBmcm9tIFwiLi4vc2VjcmV0c1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBFbmdpbmVDb25maWcsXG4gIHR5cGUgUHJveHlDb25maWcsXG4gIHR5cGUgQ3JlZGVudGlhbHNDb25maWcsXG4gIHR5cGUgQXVyb3JhRW5jcnlwdGlvbkNvbmZpZyxcbiAgdHlwZSBBdXJvcmFXcml0ZXJDb25maWcsXG4gIHR5cGUgQXVyb3JhUmVhZGVyc0NvbmZpZyxcbiAgdHlwZSBQZXJmb3JtYW5jZUluc2lnaHRzQ29uZmlnXG59IGZyb20gXCIuLi8uLi8uLi9wYXR0ZXJucy9hd3MvZGF0YWJhc2VcIjtcbmltcG9ydCB7IFJlc291cmNlTmFtaW5nIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3Jlc291cmNlTmFtaW5nXCI7XG5pbXBvcnQgeyB0b1Bhc2NhbENhc2UgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvY2FwaXRhbGlzZVN0cmluZ1wiO1xuXG5pbnRlcmZhY2UgUmRzQXVyb3JhR2xvYmFsUHJvcHMge1xuICB2cGM6IElWcGM7XG4gIGRhdGFiYXNlTmFtZTogc3RyaW5nO1xuICAvKiogUHJpbWFyeSByZWdpb24gd2hlcmUgdGhlIGluaXRpYWwgY2x1c3RlciAmIGdsb2JhbCBjbHVzdGVyIHJlc291cmNlIGFyZSBjcmVhdGVkICovXG4gIHByaW1hcnlSZWdpb246IHN0cmluZztcbiAgLyoqIFNlY29uZGFyeSByZWdpb25zIHdoZXJlIEF1cm9yYSBjbHVzdGVycyB3aWxsIGJlIGRlcGxveWVkIChmb3Igc2VjcmV0IHJlcGxpY2F0aW9uKSAqL1xuICBzZWNvbmRhcnlSZWdpb25zPzogc3RyaW5nW107XG4gIC8qKiBPcHRpb25hbCBkZXRlcm1pbmlzdGljIGlkIGZvciB0aGUgZ2xvYmFsIGNsdXN0ZXIgKHNob3VsZCBiZSBzaGFyZWQgYWNyb3NzIHN0YWNrcy9yZWdpb25zKSAqL1xuICBnbG9iYWxDbHVzdGVySWRlbnRpZmllcj86IHN0cmluZztcbiAgLyoqIE9wdGlvbmFsIGVuZ2luZSB0byBmb3J3YXJkIHRvIHRoZSB1bmRlcmx5aW5nIGNsdXN0ZXIgKi9cbiAgZW5naW5lPzogSUNsdXN0ZXJFbmdpbmU7XG4gIC8qKiBFbmdpbmUtc3BlY2lmaWMgY29uZmlndXJhdGlvbiAodXNlcm5hbWUsIFNTTCBwYXJhbXMsIHJvdGF0aW9uIGFwcCkgKi9cbiAgZW5naW5lQ29uZmlnPzogRW5naW5lQ29uZmlnO1xuICAvKiogRW5hYmxlIHdyaXRlIGZvcndhcmRpbmcgb24gc2Vjb25kYXJ5IGNsdXN0ZXJzIHRvIGZvcndhcmQgd3JpdGVzIHRvIHByaW1hcnkgcmVnaW9uICovXG4gIGVuYWJsZUdsb2JhbFdyaXRlRm9yd2FyZGluZz86IGJvb2xlYW47XG5cbiAgLy8gSW5zdGFuY2UgY29uZmlndXJhdGlvbiAoYXBwbGllZCB0byBhbGwgcmVnaW9uYWwgY2x1c3RlcnMpXG4gIC8qKiBXcml0ZXIgaW5zdGFuY2UgY29uZmlndXJhdGlvbiAqL1xuICB3cml0ZXI/OiBBdXJvcmFXcml0ZXJDb25maWc7XG4gIC8qKlxuICAgKiBSZWFkZXIgaW5zdGFuY2VzIGNvbmZpZ3VyYXRpb24uXG4gICAqIC0gYHsgY291bnQ6IE4gfWAgLSBTaW1wbGU6IE4gcmVhZGVycyB3aXRoIGRlZmF1bHRzXG4gICAqIC0gYHsgaW5zdGFuY2VzOiBbLi4uXSB9YCAtIEFkdmFuY2VkOiBwZXItcmVhZGVyIGNvbmZpZ1xuICAgKiAtIGBmYWxzZWAgLSBFeHBsaWNpdGx5IGRpc2FibGUgcmVhZGVycyAod3JpdGVyLW9ubHkgY2x1c3RlcilcbiAgICogLSBPbWl0IC0gRGVmYXVsdDogMSByZWFkZXJcbiAgICovXG4gIHJlYWRlcnM/OiBBdXJvcmFSZWFkZXJzQ29uZmlnIHwgZmFsc2U7XG5cbiAgLy8gTmVzdGVkIGNvbmZpZ3VyYXRpb25zIChwcmVzZW5jZS1iYXNlZClcbiAgLyoqIFJEUyBQcm94eSBjb25maWd1cmF0aW9uLiBPbWl0ID0gbm8gcHJveHksIHt9ID0gZGVmYXVsdHMsIGZhbHNlID0gZGlzYWJsZWQgKi9cbiAgcHJveHk/OiBQcm94eUNvbmZpZyB8IGZhbHNlO1xuICAvKiogQ3JlZGVudGlhbHMgY29uZmlndXJhdGlvbiBpbmNsdWRpbmcgdXNlcm5hbWUgYW5kIHNlY3JldCByb3RhdGlvbiAqL1xuICBjcmVkZW50aWFscz86IENyZWRlbnRpYWxzQ29uZmlnO1xuICAvKiogRW5jcnlwdGlvbiBjb25maWd1cmF0aW9uICovXG4gIGVuY3J5cHRpb24/OiBBdXJvcmFFbmNyeXB0aW9uQ29uZmlnO1xuXG4gIC8vIE9wZXJhdGlvbmFsIGNvbmZpZ3VyYXRpb25cbiAgLyoqIEJhY2t1cCByZXRlbnRpb24gaW4gZGF5cy4gRGVmYXVsdDogMTQgKi9cbiAgYmFja3VwUmV0ZW50aW9uPzogbnVtYmVyO1xuICAvKiogQ2xvdWRXYXRjaCBtb25pdG9yaW5nIGludGVydmFsLiBEZWZhdWx0OiAxIG1pbnV0ZSAqL1xuICBtb25pdG9yaW5nSW50ZXJ2YWw/OiBEdXJhdGlvbjtcbiAgLyoqIFByZWZlcnJlZCBtYWludGVuYW5jZSB3aW5kb3cuIERlZmF1bHQ6IFwiU2F0OjEyOjMwLVNhdDoyMDozMFwiICovXG4gIHByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93Pzogc3RyaW5nO1xuICAvKiogRGF0YWJhc2UgcG9ydC4gRGVmYXVsdDogMzUyNTUgKEZKQUxMIG9uIHBob25lIGtleXBhZCkgKi9cbiAgcG9ydD86IG51bWJlcjtcbiAgcGVyZm9ybWFuY2VJbnNpZ2h0cz86IFBlcmZvcm1hbmNlSW5zaWdodHNDb25maWcgfCBmYWxzZTtcbiAgZGVsZXRpb25Qcm90ZWN0aW9uPzogYm9vbGVhbjtcbiAgLyoqIEFSTiBvciBpZGVudGlmaWVyIG9mIERCIGNsdXN0ZXIgc25hcHNob3QgdG8gcmVzdG9yZSBmcm9tICovXG4gIHNuYXBzaG90SWRlbnRpZmllcj86IHN0cmluZztcbiAgLyoqIFVzZXJuYW1lIGZyb20gdGhlIHNuYXBzaG90IChyZXF1aXJlZCB3aGVuIHJlc3RvcmluZyBmcm9tIHNuYXBzaG90IHRvIHJlc2V0IHBhc3N3b3JkKSAqL1xuICBzbmFwc2hvdFVzZXJuYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgUmRzQXVyb3JhR2xvYmFsIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSUNvbm5lY3RhYmxlIHtcbiAgcHVibGljIGNvbm5lY3Rpb25zITogQ29ubmVjdGlvbnM7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjb25zdHJ1Y3RJZDogc3RyaW5nO1xuICBwcml2YXRlIGdsb2JhbENsdXN0ZXI/OiBDZm5HbG9iYWxDbHVzdGVyO1xuICBwcml2YXRlIHByaW1hcnlDbHVzdGVyPzogUmRzQXVyb3JhO1xuICBwcml2YXRlIHJlZ2lvbmFsQ2x1c3Rlcj86IFJkc0F1cm9yYTtcbiAgcHJpdmF0ZSBwcm9wczogUmRzQXVyb3JhR2xvYmFsUHJvcHM7XG4gIHByaXZhdGUgY3VycmVudFJlZ2lvbjogc3RyaW5nO1xuICBwcml2YXRlIGdsb2JhbElkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFJkc0F1cm9yYUdsb2JhbFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMuY29uc3RydWN0SWQgPSBpZDtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgdGhpcy5jdXJyZW50UmVnaW9uID0gU3RhY2sub2YodGhpcykucmVnaW9uO1xuICAgIHRoaXMuZ2xvYmFsSWQgPVxuICAgICAgcHJvcHMuZ2xvYmFsQ2x1c3RlcklkZW50aWZpZXI/LnRvTG93ZXJDYXNlKCkgfHxcbiAgICAgIFJlc291cmNlTmFtaW5nLmdsb2JhbENsdXN0ZXJJZChpZCk7XG5cbiAgICAvLyBjcmVhdGUgY2x1c3RlcnMgLyBnbG9iYWwgY2x1c3RlciBkZXBlbmRpbmcgb24gcmVnaW9uXG4gICAgdGhpcy5hZGRBdXJvcmFDbHVzdGVyKCk7XG4gICAgdGhpcy5hZGRHbG9iYWxDbHVzdGVyKCk7XG4gICAgdGhpcy5hZGRPdXRwdXRzKCk7XG4gIH1cblxuICAvLyAtLS0gcHVibGljIGhlbHBlcnMgLS0tXG4gIGdldEdsb2JhbENsdXN0ZXJJZGVudGlmaWVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2xvYmFsSWQ7XG4gIH1cblxuICBnZXRQcmltYXJ5Q2x1c3RlcklkZW50aWZpZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gUmVzb3VyY2VOYW1pbmcucHJpbWFyeUNsdXN0ZXJJZCh0aGlzLmNvbnN0cnVjdElkKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0R2xvYmFsQ2x1c3RlckVuZ2luZVN0cmluZygpOiBzdHJpbmcge1xuICAgIC8vIERlZmF1bHQgdG8gYXVyb3JhLXBvc3RncmVzcWwgaWYgbm8gZW5naW5lIHNwZWNpZmllZCAobWF0Y2hlcyBleGlzdGluZyBiZWhhdmlvdXIpXG4gICAgaWYgKCF0aGlzLnByb3BzLmVuZ2luZSkgcmV0dXJuIFwiYXVyb3JhLXBvc3RncmVzcWxcIjtcblxuICAgIC8vIEhhbmRsZSBkaWZmZXJlbnQgZW5naW5lIGZvcm1hdHMgc2FmZWx5IHVzaW5nIHVua25vd24gYW5kIHR5cGUgZ3VhcmRzXG4gICAgY29uc3QgZW5naW5lID0gdGhpcy5wcm9wcy5lbmdpbmU7XG5cbiAgICAvLyBDREsncyBJQ2x1c3RlckVuZ2luZSBpbnRlcmZhY2UgZG9lcyBub3QgZXhwb3NlIGVuZ2luZVR5cGUvZW5naW5lL25hbWVcbiAgICAvLyBwcm9wZXJ0aWVzIGRpcmVjdGx5LCBidXQgdGhlIGNvbmNyZXRlIGltcGxlbWVudGF0aW9ucyAoZS5nLiBBdXJvcmFNeXNxbEVuZ2luZVZlcnNpb24pXG4gICAgLy8gZG8gaGF2ZSB0aGVtIGF0IHJ1bnRpbWUuIENhc3QgdGhyb3VnaCB1bmtub3duIHRvIHByb2JlIHRoZXNlIGludGVybmFsIGZpZWxkcy5cbiAgICAvLyBDREsgZW5naW5lIGludGVybmFscyDigJQgbWF5IGJyZWFrIG9uIENESyB1cGdyYWRlcy4gU2VlIHJkc0F1cm9yYUdsb2JhbCB1bml0IHRlc3QuXG4gICAgY29uc3QgZW5naW5lUmVjb3JkID0gZW5naW5lIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgbGV0IGVuZ2luZVR5cGU6IHVua25vd24gPVxuICAgICAgZW5naW5lUmVjb3JkLmVuZ2luZVR5cGUgPz8gZW5naW5lUmVjb3JkLmVuZ2luZSA/PyBlbmdpbmVSZWNvcmQubmFtZTtcblxuICAgIC8vIElmIHRoZSBlbmdpbmUgd2FzIHByb3ZpZGVkIGFzIGEgcmF3IHN0cmluZyAodW5saWtlbHkgYnV0IHN1cHBvcnQgaXQpXG4gICAgaWYgKHR5cGVvZiBlbmdpbmUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGVuZ2luZVR5cGUgPSBlbmdpbmU7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgdG8gdG9TdHJpbmcoKSBmb3IgVG9rZW4tbGlrZSBvYmplY3RzXG4gICAgaWYgKCFlbmdpbmVUeXBlICYmIHR5cGVvZiBlbmdpbmVSZWNvcmQudG9TdHJpbmcgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZW5naW5lVHlwZSA9IGVuZ2luZVJlY29yZC50b1N0cmluZygpO1xuICAgICAgfSBjYXRjaCAoX2UpIHtcbiAgICAgICAgZW5naW5lVHlwZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGVuZ2luZVR5cGUgIT09IFwic3RyaW5nXCIpIHJldHVybiBcImF1cm9yYS1wb3N0Z3Jlc3FsXCI7XG5cbiAgICAvLyBOb3JtYWxpc2UgY29tbW9uIGZvcm1zOiBBVVJPUkFfUE9TVEdSRVNRTCAtPiBhdXJvcmEtcG9zdGdyZXNxbCwgYXVyb3JhX3Bvc3RncmVzcWwgLT4gYXVyb3JhLXBvc3RncmVzcWxcbiAgICBjb25zdCBub3JtYWxpc2VkID0gZW5naW5lVHlwZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL18vZywgXCItXCIpO1xuXG4gICAgLy8gSWYgdGhlIG5vcm1hbGlzZWQgdmFsdWUgaXMganVzdCAnYXVyb3JhJywgcHJlZmVyIHRoZSBtb3JlIHNwZWNpZmljIHBvc3RncmVzIGRlZmF1bHRcbiAgICBpZiAobm9ybWFsaXNlZCA9PT0gXCJhdXJvcmFcIikgcmV0dXJuIFwiYXVyb3JhLXBvc3RncmVzcWxcIjtcblxuICAgIHJldHVybiBub3JtYWxpc2VkO1xuICB9XG5cbiAgLy8gY3JlYXRlIHRoZSBDZm5HbG9iYWxDbHVzdGVyIG9ubHkgaW4gdGhlIHByaW1hcnkgcmVnaW9uXG4gIGFkZEdsb2JhbENsdXN0ZXIoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucHJpbWFyeVJlZ2lvbiAhPT0gdGhpcy5jdXJyZW50UmVnaW9uKSByZXR1cm47XG5cbiAgICAvLyBjcmVhdGUgdGhlIGdsb2JhbCBjbHVzdGVyIHJlc291cmNlIHJlZmVyZW5jaW5nIHRoZSBwcmltYXJ5IGNsdXN0ZXIgaWRlbnRpZmllclxuICAgIC8vIFByZWZlciByZWZlcmVuY2luZyB0aGUgTDEgREJDbHVzdGVyIFJlZiBzbyBDbG91ZEZvcm1hdGlvbiB3aWxsIGNyZWF0ZSB0aGVcbiAgICAvLyBEQkNsdXN0ZXIgZmlyc3QgYW5kIHdlIGF2b2lkIGlkZW50aWZpZXItY2FzaW5nIG1pc21hdGNoZXMuXG4gICAgbGV0IHNvdXJjZUlkZW50aWZpZXI6IHN0cmluZyB8IElSZXNvbHZhYmxlID1cbiAgICAgIHRoaXMuZ2V0UHJpbWFyeUNsdXN0ZXJJZGVudGlmaWVyKCk7XG4gICAgbGV0IHByaW1hcnlMMTogQ2ZuREJDbHVzdGVyIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHRoaXMucHJpbWFyeUNsdXN0ZXIpIHtcbiAgICAgIC8vIFVzZSB0aGUgaGVscGVyIG9uIFJkc0F1cm9yYSB0byBnZXQgdGhlIHVuZGVybHlpbmcgTDEgREJDbHVzdGVyIChtb3JlIHJlbGlhYmxlXG4gICAgICAvLyB0aGFuIHJlbHlpbmcgb24gbm9kZS5kZWZhdWx0Q2hpbGQgd2hpY2ggY2FuIHZhcnkgZGVwZW5kaW5nIG9uIGNvbnN0cnVjdCBvcmRlcmluZylcbiAgICAgIHByaW1hcnlMMSA9XG4gICAgICAgIHRoaXMucHJpbWFyeUNsdXN0ZXIuZ2V0Q2ZuQ2x1c3RlciAmJlxuICAgICAgICB0aGlzLnByaW1hcnlDbHVzdGVyLmdldENmbkNsdXN0ZXIoKTtcbiAgICAgIGlmIChwcmltYXJ5TDEpIHtcbiAgICAgICAgc291cmNlSWRlbnRpZmllciA9IHByaW1hcnlMMS5yZWY7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5nbG9iYWxDbHVzdGVyID0gbmV3IENmbkdsb2JhbENsdXN0ZXIoXG4gICAgICB0aGlzLFxuICAgICAgYCR7dGhpcy5wcm9wcy5kYXRhYmFzZU5hbWV9R2xvYmFsQ2x1c3RlcmAsXG4gICAgICB7XG4gICAgICAgIGdsb2JhbENsdXN0ZXJJZGVudGlmaWVyOiB0aGlzLmdsb2JhbElkLFxuICAgICAgICBzb3VyY2VEYkNsdXN0ZXJJZGVudGlmaWVyOiBzb3VyY2VJZGVudGlmaWVyXG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vIGVuc3VyZSB0aGUgdW5kZXJseWluZyBwcmltYXJ5IERCQ2x1c3RlciBMMSBoYXMgdGhlIGdsb2JhbENsdXN0ZXJJZGVudGlmaWVyIHNldFxuICAgIGlmIChwcmltYXJ5TDEpIHtcbiAgICAgIC8vIE1ha2UgdGhlIENGTiBkZXBlbmRlbmN5IGV4cGxpY2l0IHNvIHRoZSBEQkNsdXN0ZXIgaXMgY3JlYXRlZCBiZWZvcmUgdGhlIEdsb2JhbENsdXN0ZXJcbiAgICAgIHRoaXMuZ2xvYmFsQ2x1c3Rlci5hZGREZXBlbmRzT24ocHJpbWFyeUwxKTtcbiAgICAgIC8vIElNUE9SVEFOVDogZG8gTk9UIHNldCB0aGUgcHJpbWFyeSBEQkNsdXN0ZXIncyBgZ2xvYmFsQ2x1c3RlcklkZW50aWZpZXJgIGhlcmUuXG4gICAgICAvLyBJZiB3ZSBzZXQgdGhlIHByaW1hcnkgREJDbHVzdGVyIHRvIHJlZmVyZW5jZSB0aGUgZ2xvYmFsIGNsdXN0ZXIsIENsb3VkRm9ybWF0aW9uXG4gICAgICAvLyB3aWxsIGF0dGVtcHQgdG8gdmFsaWRhdGUgdGhhdCB0aGUgZ2xvYmFsIGNsdXN0ZXIgZXhpc3RzIHdoZW4gY3JlYXRpbmcgdGhlXG4gICAgICAvLyBEQkNsdXN0ZXIg4oCUIGJ1dCB0aGUgZ2xvYmFsIGNsdXN0ZXIgaXMgY3JlYXRlZCBhZnRlcndhcmQgKHdlIGFkZCBhXG4gICAgICAvLyBkZXBlbmRzT24pLCB3aGljaCBjYXVzZXMgYSBcIkdsb2JhbCBjbHVzdGVyIC4uLiBub3QgZm91bmRcIiBlcnJvci4gVGhlXG4gICAgICAvLyBjb3JyZWN0IG9yZGVyIGlzIHRvIGNyZWF0ZSB0aGUgREJDbHVzdGVyIGZpcnN0LCB0aGVuIGNyZWF0ZSB0aGVcbiAgICAgIC8vIENmbkdsb2JhbENsdXN0ZXIgd2l0aCBgc291cmNlRGJDbHVzdGVySWRlbnRpZmllcmAgcG9pbnRpbmcgYXQgdGhlXG4gICAgICAvLyBwcmltYXJ5IGNsdXN0ZXIncyBSZWYuIExlYXZpbmcgdGhlIHByaW1hcnkgTDEgd2l0aG91dCB0aGVcbiAgICAgIC8vIGBnbG9iYWxDbHVzdGVySWRlbnRpZmllcmAgYXZvaWRzIHRoZSBjaXJjdWxhciByZWZlcmVuY2UuXG4gICAgfVxuICB9XG5cbiAgLy8gY3JlYXRlIGFuIEF1cm9yYSBjbHVzdGVyIGluIHRoaXMgcmVnaW9uIChwcmltYXJ5IG9yIHNlY29uZGFyeSlcbiAgYWRkQXVyb3JhQ2x1c3RlcigpIHtcbiAgICAvLyBDb21tb24gY29uZmlndXJhdGlvbiBzaGFyZWQgYmV0d2VlbiBwcmltYXJ5IGFuZCBzZWNvbmRhcnkgY2x1c3RlcnNcbiAgICBjb25zdCBjb21tb25Db25maWcgPSB7XG4gICAgICBlbmdpbmU6IHRoaXMucHJvcHMuZW5naW5lLFxuICAgICAgZW5naW5lQ29uZmlnOiB0aGlzLnByb3BzLmVuZ2luZUNvbmZpZyxcbiAgICAgIC8vIEluc3RhbmNlIGNvbmZpZ3VyYXRpb25cbiAgICAgIHdyaXRlcjogdGhpcy5wcm9wcy53cml0ZXIsXG4gICAgICByZWFkZXJzOiB0aGlzLnByb3BzLnJlYWRlcnMsXG4gICAgICAvLyBOZXN0ZWQgY29uZmlndXJhdGlvbnNcbiAgICAgIHByb3h5OiB0aGlzLnByb3BzLnByb3h5LFxuICAgICAgZW5jcnlwdGlvbjogdGhpcy5wcm9wcy5lbmNyeXB0aW9uLFxuICAgICAgLy8gT3BlcmF0aW9uYWwgY29uZmlndXJhdGlvblxuICAgICAgYmFja3VwUmV0ZW50aW9uOiB0aGlzLnByb3BzLmJhY2t1cFJldGVudGlvbixcbiAgICAgIG1vbml0b3JpbmdJbnRlcnZhbDogdGhpcy5wcm9wcy5tb25pdG9yaW5nSW50ZXJ2YWwsXG4gICAgICBwcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdzogdGhpcy5wcm9wcy5wcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdyxcbiAgICAgIHBvcnQ6IHRoaXMucHJvcHMucG9ydCxcbiAgICAgIHBlcmZvcm1hbmNlSW5zaWdodHM6IHRoaXMucHJvcHMucGVyZm9ybWFuY2VJbnNpZ2h0cyxcbiAgICAgIGRlbGV0aW9uUHJvdGVjdGlvbjogdGhpcy5wcm9wcy5kZWxldGlvblByb3RlY3Rpb24sXG4gICAgICBzbmFwc2hvdElkZW50aWZpZXI6IHRoaXMucHJvcHMuc25hcHNob3RJZGVudGlmaWVyLFxuICAgICAgc25hcHNob3RVc2VybmFtZTogdGhpcy5wcm9wcy5zbmFwc2hvdFVzZXJuYW1lXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnByb3BzLnByaW1hcnlSZWdpb24gPT09IHRoaXMuY3VycmVudFJlZ2lvbikge1xuICAgICAgLy8gcHJpbWFyeVxuICAgICAgdGhpcy5wcmltYXJ5Q2x1c3RlciA9IG5ldyBSZHNBdXJvcmEoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGAke3RoaXMucHJvcHMuZGF0YWJhc2VOYW1lfVByaW1hcnlgLFxuICAgICAgICB7XG4gICAgICAgICAgdnBjOiB0aGlzLnByb3BzLnZwYyxcbiAgICAgICAgICBkYXRhYmFzZU5hbWU6IHRoaXMucHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgICAgIGNsdXN0ZXJJZGVudGlmaWVyOiB0aGlzLmdldFByaW1hcnlDbHVzdGVySWRlbnRpZmllcigpLFxuICAgICAgICAgIC8vIEVuYWJsZSBzZWNyZXQgcmVwbGljYXRpb24gdG8gc2Vjb25kYXJ5IHJlZ2lvbnNcbiAgICAgICAgICBzZWNyZXRSZXBsaWNhUmVnaW9uczogdGhpcy5wcm9wcy5zZWNvbmRhcnlSZWdpb25zLFxuICAgICAgICAgIC8vIFByaW1hcnkgcmVnaW9uIGNyZWF0ZXMgY3JlZGVudGlhbHNcbiAgICAgICAgICBjcmVkZW50aWFsczogdGhpcy5wcm9wcy5jcmVkZW50aWFscyxcbiAgICAgICAgICAuLi5jb21tb25Db25maWdcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHRoaXMuY29ubmVjdGlvbnMgPSB0aGlzLnByaW1hcnlDbHVzdGVyLmNvbm5lY3Rpb25zO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBzZWNvbmRhcnkgcmVnaW9uXG4gICAgICAvLyBQYXNzIGRhdGFiYXNlTmFtZSBmb3IgcmVzb3VyY2UgbmFtaW5nLCBidXQgZmxhZyBhcyBnbG9iYWwgc2Vjb25kYXJ5XG4gICAgICAvLyBUaGlzIHByZXZlbnRzIHNldHRpbmcgY3JlZGVudGlhbHMgYW5kIGRlZmF1bHREYXRhYmFzZU5hbWUgd2hpY2ggYXJlIGluaGVyaXRlZCBmcm9tIHByaW1hcnlcbiAgICAgIHRoaXMucmVnaW9uYWxDbHVzdGVyID0gbmV3IFJkc0F1cm9yYShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYCR7dGhpcy5wcm9wcy5kYXRhYmFzZU5hbWV9UmVnaW9uYWxgLFxuICAgICAgICB7XG4gICAgICAgICAgdnBjOiB0aGlzLnByb3BzLnZwYyxcbiAgICAgICAgICBkYXRhYmFzZU5hbWU6IHRoaXMucHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgICAgIGNsdXN0ZXJJZGVudGlmaWVyOiBSZXNvdXJjZU5hbWluZy5zZWNvbmRhcnlDbHVzdGVySWQoXG4gICAgICAgICAgICB0aGlzLmNvbnN0cnVjdElkLFxuICAgICAgICAgICAgdGhpcy5jdXJyZW50UmVnaW9uXG4gICAgICAgICAgKSxcbiAgICAgICAgICBpc0dsb2JhbFNlY29uZGFyeTogdHJ1ZSxcbiAgICAgICAgICAvLyBTZWNvbmRhcnkgZG9lc24ndCBjcmVhdGUgY3JlZGVudGlhbHMgKHVzZXMgcmVwbGljYXRlZCBzZWNyZXQpXG4gICAgICAgICAgLi4uY29tbW9uQ29uZmlnXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIC8vIHNldCB0aGUgTDEgREJDbHVzdGVyIHByb3BlcnR5IHNvIENsb3VkRm9ybWF0aW9uIHdpbGwgam9pbiBpdCB0byB0aGUgZ2xvYmFsIGNsdXN0ZXJcbiAgICAgIGlmICh0aGlzLnJlZ2lvbmFsQ2x1c3Rlcikge1xuICAgICAgICBjb25zdCByZWdpb25hbEwxID1cbiAgICAgICAgICB0aGlzLnJlZ2lvbmFsQ2x1c3Rlci5nZXRDZm5DbHVzdGVyICYmXG4gICAgICAgICAgdGhpcy5yZWdpb25hbENsdXN0ZXIuZ2V0Q2ZuQ2x1c3RlcigpO1xuICAgICAgICBpZiAocmVnaW9uYWxMMSkge1xuICAgICAgICAgIHJlZ2lvbmFsTDEuZ2xvYmFsQ2x1c3RlcklkZW50aWZpZXIgPSB0aGlzLmdsb2JhbElkO1xuXG4gICAgICAgICAgLy8gRW5hYmxlIHdyaXRlIGZvcndhcmRpbmcgaWYgcmVxdWVzdGVkXG4gICAgICAgICAgaWYgKHRoaXMucHJvcHMuZW5hYmxlR2xvYmFsV3JpdGVGb3J3YXJkaW5nKSB7XG4gICAgICAgICAgICByZWdpb25hbEwxLmVuYWJsZUdsb2JhbFdyaXRlRm9yd2FyZGluZyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbnMgPSB0aGlzLnJlZ2lvbmFsQ2x1c3Rlci5jb25uZWN0aW9ucztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhZGRPdXRwdXRzKCkge1xuICAgIGNvbnN0IG91dHB1dE5hbWUgPSB0b1Bhc2NhbENhc2UodGhpcy5wcm9wcy5kYXRhYmFzZU5hbWUpO1xuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7b3V0cHV0TmFtZX1HbG9iYWxDbHVzdGVySWRlbnRpZmllck91dHB1dGAsIHtcbiAgICAgIHZhbHVlOiB0aGlzLmdsb2JhbElkLFxuICAgICAgZXhwb3J0TmFtZTogYCR7b3V0cHV0TmFtZX1HbG9iYWxDbHVzdGVySWRlbnRpZmllcmBcbiAgICB9KTtcbiAgfVxuXG4gIGdldENyZWRlbnRpYWxzKCk6IFNlY3JldCB7XG4gICAgaWYgKHRoaXMucHJpbWFyeUNsdXN0ZXIpIHJldHVybiB0aGlzLnByaW1hcnlDbHVzdGVyLmdldENyZWRlbnRpYWxzKCk7XG4gICAgaWYgKHRoaXMucmVnaW9uYWxDbHVzdGVyKSByZXR1cm4gdGhpcy5yZWdpb25hbENsdXN0ZXIuZ2V0Q3JlZGVudGlhbHMoKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBBdXJvcmEgY2x1c3RlciBhdmFpbGFibGUgdG8gcmV0dXJuIGNyZWRlbnRpYWxzIGZyb21cIik7XG4gIH1cblxuICBnZXRIb3N0RW5kcG9pbnQoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5wcmltYXJ5Q2x1c3RlcikgcmV0dXJuIHRoaXMucHJpbWFyeUNsdXN0ZXIuZ2V0SG9zdEVuZHBvaW50KCk7XG4gICAgaWYgKHRoaXMucmVnaW9uYWxDbHVzdGVyKSByZXR1cm4gdGhpcy5yZWdpb25hbENsdXN0ZXIuZ2V0SG9zdEVuZHBvaW50KCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gQXVyb3JhIGNsdXN0ZXIgYXZhaWxhYmxlIHRvIHJldHVybiBlbmRwb2ludCBmcm9tXCIpO1xuICB9XG5cbiAgZ2V0SG9zdFBvcnQoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5wcmltYXJ5Q2x1c3RlcikgcmV0dXJuIHRoaXMucHJpbWFyeUNsdXN0ZXIuZ2V0SG9zdFBvcnQoKTtcbiAgICBpZiAodGhpcy5yZWdpb25hbENsdXN0ZXIpIHJldHVybiB0aGlzLnJlZ2lvbmFsQ2x1c3Rlci5nZXRIb3N0UG9ydCgpO1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIEF1cm9yYSBjbHVzdGVyIGF2YWlsYWJsZSB0byByZXR1cm4gcG9ydCBmcm9tXCIpO1xuICB9XG59XG4iXX0=
@@ -42,10 +42,11 @@ export declare class RdsInstance extends Construct implements IConnectable {
42
42
  private engineConfig;
43
43
  private databaseCredentials;
44
44
  private database;
45
- private masterSecret;
46
- private databaseProxy;
47
- private databaseProxySecurityGroup;
48
- private readReplicaSecurityGroup;
45
+ private masterSecret?;
46
+ private databaseProxy?;
47
+ private databaseProxySecurityGroup?;
48
+ private readReplicaSecurityGroup?;
49
+ private readonly constructId;
49
50
  constructor(scope: Construct, id: string, props: RdsProps);
50
51
  addDatabase(props: RdsProps): void;
51
52
  rotateSecret(props: RdsProps): void;