@aws-cdk/toolkit-lib 1.25.0 → 1.25.2

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 (34) hide show
  1. package/build-info.json +2 -2
  2. package/db.json.gz +0 -0
  3. package/lib/actions/diff/private/helpers.js +3 -3
  4. package/lib/api/aws-auth/sdk.d.ts +16 -0
  5. package/lib/api/aws-auth/sdk.js +22 -3
  6. package/lib/api/deployments/cfn-api.d.ts +10 -10
  7. package/lib/api/deployments/cfn-api.js +51 -43
  8. package/lib/api/deployments/deploy-stack.js +51 -48
  9. package/lib/api/deployments/deployments.d.ts +9 -1
  10. package/lib/api/deployments/deployments.js +20 -12
  11. package/lib/api/diagnosing/{early-validation.d.ts → changeset-error-fetcher.d.ts} +10 -8
  12. package/lib/api/diagnosing/changeset-error-fetcher.js +83 -0
  13. package/lib/api/diagnosing/diagnosis-formatting.js +7 -6
  14. package/lib/api/diagnosing/stack-diagnoser.d.ts +7 -0
  15. package/lib/api/diagnosing/stack-diagnoser.js +64 -48
  16. package/lib/api/diagnosing/tree-builder.d.ts +2 -1
  17. package/lib/api/diagnosing/tree-builder.js +5 -5
  18. package/lib/api/diagnosing/tree.d.ts +10 -4
  19. package/lib/api/diagnosing/tree.js +23 -12
  20. package/lib/api/io/private/span.d.ts +1 -1
  21. package/lib/api/io/private/span.js +3 -3
  22. package/lib/api/logs-monitor/logs-monitor.js +4 -4
  23. package/lib/api/stack-events/stack-activity-monitor.d.ts +4 -4
  24. package/lib/api/stack-events/stack-activity-monitor.js +14 -13
  25. package/lib/api/stack-events/stack-event-poller.d.ts +1 -1
  26. package/lib/api/stack-events/stack-event-poller.js +5 -4
  27. package/lib/api/stack-events/stack-progress-monitor.d.ts +2 -2
  28. package/lib/api/stack-events/stack-progress-monitor.js +8 -2
  29. package/lib/index_bg.wasm +0 -0
  30. package/lib/toolkit/toolkit.js +2 -2
  31. package/lib/util/cloudformation.d.ts +14 -0
  32. package/lib/util/cloudformation.js +27 -1
  33. package/package.json +11 -12
  34. package/lib/api/diagnosing/early-validation.js +0 -81
@@ -260,7 +260,15 @@ export declare class Deployments {
260
260
  * If the stack was created in REVIEW_IN_PROGRESS state (new stack), delete the stack too.
261
261
  */
262
262
  cleanupChangeSet(stack: cxapi.CloudFormationStackArtifact, changeSetName: string): Promise<void>;
263
- describeChangeSet(stack: cxapi.CloudFormationStackArtifact, changeSetName: string): Promise<DescribeChangeSetCommandOutput>;
263
+ /**
264
+ * Describe a specific change set for a stack.
265
+ *
266
+ * @param stack - The Stack artifact
267
+ * @param changeSetName - The name of the change set
268
+ * @param stackArn - Optional the exact arn of the stack. Prefer this if you have it available.
269
+ * @returns the DescribeChangeSet response
270
+ */
271
+ describeChangeSet(stack: cxapi.CloudFormationStackArtifact, changeSetName: string, stackArn?: string): Promise<DescribeChangeSetCommandOutput>;
264
272
  rollbackStack(options: RollbackStackOptions): Promise<RollbackStackResult>;
265
273
  destroyStack(options: DestroyStackOptions): Promise<import("./deploy-stack").DestroyStackResult>;
266
274
  stackExists(options: StackExistsOptions): Promise<boolean>;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Deployments = void 0;
4
- const crypto_1 = require("crypto");
4
+ const node_crypto_1 = require("node:crypto");
5
5
  const cdk_assets = require("@aws-cdk/cdk-assets-lib");
6
6
  const chalk = require("chalk");
7
7
  const asset_manifest_builder_1 = require("./asset-manifest-builder");
@@ -172,14 +172,22 @@ class Deployments {
172
172
  // If the stack was newly created for this change set, it will be in REVIEW_IN_PROGRESS.
173
173
  // Delete it and wait for the deletion to complete so we don't leave an empty stack behind.
174
174
  if (cloudFormationStack.stackStatus.name === 'REVIEW_IN_PROGRESS') {
175
- await cfn.deleteStack({ StackName: deployName });
175
+ await cfn.deleteStack({ StackName: deployName, ClientRequestToken: (0, node_crypto_1.randomUUID)() });
176
176
  await (0, cfn_api_1.waitForStackDelete)(cfn, this.ioHelper, deployName);
177
177
  }
178
178
  }
179
- async describeChangeSet(stack, changeSetName) {
179
+ /**
180
+ * Describe a specific change set for a stack.
181
+ *
182
+ * @param stack - The Stack artifact
183
+ * @param changeSetName - The name of the change set
184
+ * @param stackArn - Optional the exact arn of the stack. Prefer this if you have it available.
185
+ * @returns the DescribeChangeSet response
186
+ */
187
+ async describeChangeSet(stack, changeSetName, stackArn) {
180
188
  const env = await this.envs.accessStackForMutableStackOperations(stack);
181
189
  const cfn = env.sdk.cloudFormation();
182
- return (0, cfn_api_1.waitForChangeSet)(cfn, this.ioHelper, stack.stackName, changeSetName, {
190
+ return (0, cfn_api_1.waitForChangeSet)(cfn, this.ioHelper, stackArn ?? stack.stackName, changeSetName, {
183
191
  fetchAll: true,
184
192
  diagnoser: new stack_diagnoser_1.CloudFormationStackDiagnoser({
185
193
  sdk: env.sdk,
@@ -211,13 +219,13 @@ class Deployments {
211
219
  switch (cloudFormationStack.stackStatus.rollbackChoice) {
212
220
  case stack_events_1.RollbackChoice.NONE:
213
221
  await this.ioHelper.defaults.warn(`Stack ${deployName} does not need a rollback: ${cloudFormationStack.stackStatus}`);
214
- return { stackArn: cloudFormationStack.stackId, notInRollbackableState: true };
222
+ return { stackArn, notInRollbackableState: true };
215
223
  case stack_events_1.RollbackChoice.START_ROLLBACK:
216
224
  await this.ioHelper.defaults.debug(`Initiating rollback of stack ${deployName}`);
217
225
  await cfn.rollbackStack({
218
- StackName: deployName,
226
+ StackName: stackArn,
219
227
  RoleARN: executionRoleArn,
220
- ClientRequestToken: (0, crypto_1.randomUUID)(),
228
+ ClientRequestToken: (0, node_crypto_1.randomUUID)(),
221
229
  // Enabling this is just the better overall default, the only reason it isn't the upstream default is backwards compatibility
222
230
  RetainExceptOnCreate: true,
223
231
  });
@@ -228,7 +236,7 @@ class Deployments {
228
236
  // (Using deployment log because we definitely have `DescribeStackEvents` permissions, and we might not have
229
237
  // `DescribeStackResources` permissions).
230
238
  const poller = new stack_events_1.StackEventPoller(cfn, {
231
- stackName: deployName,
239
+ stackArn,
232
240
  initialPollRange: stack_events_1.PollRange.sinceStackStatus(['ROLLBACK_IN_PROGRESS', 'UPDATE_ROLLBACK_IN_PROGRESS']),
233
241
  });
234
242
  await poller.poll();
@@ -240,8 +248,8 @@ class Deployments {
240
248
  const skipDescription = resourcesToSkip.length > 0 ? ` (orphaning: ${resourcesToSkip.join(', ')})` : '';
241
249
  await this.ioHelper.defaults.warn(`Continuing rollback of stack ${deployName}${skipDescription}`);
242
250
  await cfn.continueUpdateRollback({
243
- StackName: deployName,
244
- ClientRequestToken: (0, crypto_1.randomUUID)(),
251
+ StackName: stackArn,
252
+ ClientRequestToken: (0, node_crypto_1.randomUUID)(),
245
253
  RoleARN: executionRoleArn,
246
254
  ResourcesToSkip: resourcesToSkip,
247
255
  });
@@ -255,7 +263,7 @@ class Deployments {
255
263
  const monitor = new stack_events_1.StackActivityMonitor({
256
264
  cfn,
257
265
  stack: options.stack,
258
- stackName: deployName,
266
+ stackArn,
259
267
  ioHelper: this.ioHelper,
260
268
  });
261
269
  await monitor.start();
@@ -408,4 +416,4 @@ class ParallelSafeAssetProgress extends asset_publishing_1.BasePublishProgressLi
408
416
  function suffixWithErrors(msg, errors) {
409
417
  return errors && errors.length > 0 ? `${msg}: ${errors.join(', ')}` : msg;
410
418
  }
411
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95bWVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkZXBsb3ltZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBb0M7QUFDcEMsc0RBQXNEO0FBR3RELCtCQUErQjtBQUMvQixxRUFBZ0U7QUFDaEUseURBRzRCO0FBQzVCLHVDQUttQjtBQUNuQixxQ0FBcUU7QUFFckUsaURBQTJEO0FBRzNELHNGQUFnRztBQUNoRywrREFBNEU7QUFDNUUscUNBQWdEO0FBTWhELHNEQUsyQjtBQUMzQixtRUFBNkU7QUFDN0UsZ0RBQThFO0FBRzlFLHlGQUEyRjtBQUMzRixrREFBb0c7QUFFcEcsa0RBQTZEO0FBRTdELE1BQU0sb0NBQW9DLEdBQUcsRUFBRSxDQUFDO0FBc09oRDs7OztHQUlHO0FBQ0gsTUFBYSxXQUFXO0lBNkJPO0lBNUJiLElBQUksQ0FBb0I7SUFFeEM7Ozs7Ozs7T0FPRztJQUNjLGdCQUFnQixDQUFjO0lBRS9DOzs7Ozs7O09BT0c7SUFDYyxzQkFBc0IsQ0FBYztJQUVwQyxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQXdELENBQUM7SUFFMUYsaUNBQWlDLENBQXNCO0lBRTlDLFFBQVEsQ0FBVztJQUVwQyxZQUE2QixLQUF1QjtRQUF2QixVQUFLLEdBQUwsS0FBSyxDQUFrQjtRQUNsRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztRQUMxQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztRQUNoRCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDL0IsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLCtCQUFpQixDQUMvQixLQUFLLENBQUMsV0FBVyxFQUNqQixLQUFLLENBQUMsZ0JBQWdCLElBQUkseUNBQTBCLEVBQ3BELElBQUksQ0FBQyxRQUFRLENBQ2QsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FB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O0lBRWhDLFlBQVksTUFBYyxFQUFFLFFBQWtCO1FBQzVDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRVMsVUFBVSxDQUFDLElBQTBCLEVBQUUsS0FBa0M7UUFDakYsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxLQUFLLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0NBQ0Y7QUFFRCxTQUFTLGdCQUFnQixDQUFDLEdBQVcsRUFBRSxNQUFpQjtJQUN0RCxPQUFPLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDNUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0ICogYXMgY2RrX2Fzc2V0cyBmcm9tICdAYXdzLWNkay9jZGstYXNzZXRzLWxpYic7XG5pbXBvcnQgdHlwZSAqIGFzIGN4YXBpIGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LWFwaSc7XG5pbXBvcnQgdHlwZSB7IERlc2NyaWJlQ2hhbmdlU2V0Q29tbWFuZE91dHB1dCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBBc3NldE1hbmlmZXN0QnVpbGRlciB9IGZyb20gJy4vYXNzZXQtbWFuaWZlc3QtYnVpbGRlcic7XG5pbXBvcnQge1xuICBCYXNlUHVibGlzaFByb2dyZXNzTGlzdGVuZXIsXG4gIFB1Ymxpc2hpbmdBd3MsXG59IGZyb20gJy4vYXNzZXQtcHVibGlzaGluZyc7XG5pbXBvcnQge1xuICBzdGFiaWxpemVTdGFjayxcbiAgdXBsb2FkU3RhY2tUZW1wbGF0ZUFzc2V0cyxcbiAgd2FpdEZvckNoYW5nZVNldCxcbiAgd2FpdEZvclN0YWNrRGVsZXRlLFxufSBmcm9tICcuL2Nmbi1hcGknO1xuaW1wb3J0IHsgZGV0ZXJtaW5lQWxsb3dDcm9zc0FjY291bnRBc3NldFB1Ymxpc2hpbmcgfSBmcm9tICcuL2NoZWNrcyc7XG5cbmltcG9ydCB7IGRlcGxveVN0YWNrLCBkZXN0cm95U3RhY2sgfSBmcm9tICcuL2RlcGxveS1zdGFjayc7XG5pbXBvcnQgdHlwZSB7IERlcGxveVN0YWNrUmVzdWx0LCBTdWNjZXNzZnVsRGVwbG95U3RhY2tSZXN1bHQgfSBmcm9tICcuL2RlcGxveW1lbnQtcmVzdWx0JztcbmltcG9ydCB0eXBlIHsgQ2hhbmdlU2V0RGVwbG95bWVudCwgRGVwbG95bWVudE1ldGhvZCB9IGZyb20gJy4uLy4uL2FjdGlvbnMvZGVwbG95JztcbmltcG9ydCB7IERFRkFVTFRfREVQTE9ZX0NIQU5HRV9TRVRfTkFNRSB9IGZyb20gJy4uLy4uL2FjdGlvbnMvZGVwbG95L3ByaXZhdGUvZGVwbG95bWVudC1tZXRob2QnO1xuaW1wb3J0IHsgRGVwbG95bWVudEVycm9yLCBUb29sa2l0RXJyb3IgfSBmcm9tICcuLi8uLi90b29sa2l0L3Rvb2xraXQtZXJyb3InO1xuaW1wb3J0IHsgZm9ybWF0RXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgdHlwZSB7IFNka1Byb3ZpZGVyIH0gZnJvbSAnLi4vYXdzLWF1dGgvcHJpdmF0ZSc7XG5pbXBvcnQgdHlwZSB7XG4gIFRlbXBsYXRlLFxuICBSb290VGVtcGxhdGVXaXRoTmVzdGVkU3RhY2tzLFxufSBmcm9tICcuLi9jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQge1xuICBDbG91ZEZvcm1hdGlvblN0YWNrLFxuICBsb2FkQ3VycmVudFRlbXBsYXRlLFxuICBsb2FkQ3VycmVudFRlbXBsYXRlV2l0aE5lc3RlZFN0YWNrcyxcbiAgbWFrZUJvZHlQYXJhbWV0ZXIsXG59IGZyb20gJy4uL2Nsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB7IENsb3VkRm9ybWF0aW9uU3RhY2tEaWFnbm9zZXIgfSBmcm9tICcuLi9kaWFnbm9zaW5nL3N0YWNrLWRpYWdub3Nlcic7XG5pbXBvcnQgeyB0eXBlIEVudmlyb25tZW50UmVzb3VyY2VzLCBFbnZpcm9ubWVudEFjY2VzcyB9IGZyb20gJy4uL2Vudmlyb25tZW50JztcbmltcG9ydCB0eXBlIHsgSW9IZWxwZXIgfSBmcm9tICcuLi9pby9wcml2YXRlJztcbmltcG9ydCB0eXBlIHsgUmVzb3VyY2VJZGVudGlmaWVyU3VtbWFyaWVzLCBSZXNvdXJjZXNUb0ltcG9ydCB9IGZyb20gJy4uL3Jlc291cmNlLWltcG9ydCc7XG5pbXBvcnQgeyBTdGFja0FydGlmYWN0U291cmNlVHJhY2VyIH0gZnJvbSAnLi4vc291cmNlLXRyYWNpbmcvcHJpdmF0ZS9zdGFjay1zb3VyY2UtdHJhY2luZyc7XG5pbXBvcnQgeyBTdGFja0FjdGl2aXR5TW9uaXRvciwgU3RhY2tFdmVudFBvbGxlciwgUm9sbGJhY2tDaG9pY2UsIFBvbGxSYW5nZSB9IGZyb20gJy4uL3N0YWNrLWV2ZW50cyc7XG5pbXBvcnQgdHlwZSB7IFRhZyB9IGZyb20gJy4uL3RhZ3MnO1xuaW1wb3J0IHsgREVGQVVMVF9UT09MS0lUX1NUQUNLX05BTUUgfSBmcm9tICcuLi90b29sa2l0LWluZm8nO1xuXG5jb25zdCBCT09UU1RSQVBfU1RBQ0tfVkVSU0lPTl9GT1JfUk9MTEJBQ0sgPSAyMztcblxuZXhwb3J0IGludGVyZmFjZSBEZXBsb3lTdGFja09wdGlvbnMge1xuICAvKipcbiAgICogU3RhY2sgdG8gZGVwbG95XG4gICAqL1xuICByZWFkb25seSBzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuXG4gIC8qKlxuICAgKiBFeGVjdXRpb24gcm9sZSBmb3IgdGhlIGRlcGxveW1lbnQgKHBhc3MgdGhyb3VnaCB0byBDbG91ZEZvcm1hdGlvbilcbiAgICpcbiAgICogQGRlZmF1bHQgLSBDdXJyZW50IHJvbGVcbiAgICovXG4gIHJlYWRvbmx5IHJvbGVBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRvcGljIEFSTnMgdG8gc2VuZCBhIG1lc3NhZ2Ugd2hlbiBkZXBsb3ltZW50IGZpbmlzaGVzIChwYXNzIHRocm91Z2ggdG8gQ2xvdWRGb3JtYXRpb24pXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gbm90aWZpY2F0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbm90aWZpY2F0aW9uQXJucz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBuYW1lIHVuZGVyIHdoaWNoIHN0YWNrIHdpbGwgYmUgZGVwbG95ZWRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBVc2UgYXJ0aWZhY3QgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgdG9vbGtpdCBzdGFjaywgaWYgbm90IHRoZSBkZWZhdWx0IG5hbWVcbiAgICpcbiAgICogQGRlZmF1bHQgJ0NES1Rvb2xraXQnXG4gICAqL1xuICByZWFkb25seSB0b29sa2l0U3RhY2tOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGFzc2V0IElEcyB3aGljaCBzaG91bGQgTk9UIGJlIGJ1aWx0IG9yIHVwbG9hZGVkXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQnVpbGQgYWxsIGFzc2V0c1xuICAgKi9cbiAgcmVhZG9ubHkgcmV1c2VBc3NldHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogU3RhY2sgdGFncyAocGFzcyB0aHJvdWdoIHRvIENsb3VkRm9ybWF0aW9uKVxuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IFRhZ1tdO1xuXG4gIC8qKlxuICAgKiBTZWxlY3QgdGhlIGRlcGxveW1lbnQgbWV0aG9kIChkaXJlY3Qgb3IgdXNpbmcgYSBjaGFuZ2Ugc2V0KVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIENoYW5nZSBzZXQgd2l0aCBkZWZhdWx0IG9wdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveW1lbnRNZXRob2Q/OiBEZXBsb3ltZW50TWV0aG9kO1xuXG4gIC8qKlxuICAgKiBGb3JjZSBkZXBsb3ltZW50LCBldmVuIGlmIHRoZSBkZXBsb3llZCB0ZW1wbGF0ZSBpcyBpZGVudGljYWwgdG8gdGhlIG9uZSB3ZSBhcmUgYWJvdXQgdG8gZGVwbG95LlxuICAgKiBAZGVmYXVsdCBmYWxzZSBkZXBsb3ltZW50IHdpbGwgYmUgc2tpcHBlZCBpZiB0aGUgdGVtcGxhdGUgaXMgaWRlbnRpY2FsXG4gICAqL1xuICByZWFkb25seSBmb3JjZURlcGxveW1lbnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFeHRyYSBwYXJhbWV0ZXJzIGZvciBDbG91ZEZvcm1hdGlvblxuICAgKiBAZGVmYXVsdCAtIE5vIGFkZGl0aW9uYWwgcGFyYW1ldGVycyB3aWxsIGJlIHBhc3NlZCB0byB0aGUgdGVtcGxhdGVcbiAgICovXG4gIHJlYWRvbmx5IHBhcmFtZXRlcnM/OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCB1bmRlZmluZWQgfTtcblxuICAvKipcbiAgICogVXNlIHByZXZpb3VzIHZhbHVlcyBmb3IgdW5zcGVjaWZpZWQgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBJZiBub3Qgc2V0LCBhbGwgcGFyYW1ldGVycyBtdXN0IGJlIHNwZWNpZmllZCBmb3IgZXZlcnkgZGVwbG95bWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgdXNlUHJldmlvdXNQYXJhbWV0ZXJzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUm9sbGJhY2sgZmFpbGVkIGRlcGxveW1lbnRzXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHJvbGxiYWNrPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGV4dHJhIHN0cmluZyB0byBhcHBlbmQgdG8gdGhlIFVzZXItQWdlbnQgaGVhZGVyIHdoZW4gcGVyZm9ybWluZyBBV1MgU0RLIGNhbGxzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vdGhpbmcgZXh0cmEgaXMgYXBwZW5kZWQgdG8gdGhlIFVzZXItQWdlbnQgaGVhZGVyXG4gICAqL1xuICByZWFkb25seSBleHRyYVVzZXJBZ2VudD86IHN0cmluZztcblxuICAvKipcbiAgICogTGlzdCBvZiBleGlzdGluZyByZXNvdXJjZXMgdG8gYmUgSU1QT1JURUQgaW50byB0aGUgc3RhY2ssIGluc3RlYWQgb2YgYmVpbmcgQ1JFQVRFRFxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VzVG9JbXBvcnQ/OiBSZXNvdXJjZXNUb0ltcG9ydDtcblxuICAvKipcbiAgICogSWYgcHJlc2VudCwgdXNlIHRoaXMgZ2l2ZW4gdGVtcGxhdGUgaW5zdGVhZCBvZiB0aGUgc3RvcmVkIG9uZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFVzZSB0aGUgc3RvcmVkIHRlbXBsYXRlXG4gICAqL1xuICByZWFkb25seSBvdmVycmlkZVRlbXBsYXRlPzogYW55O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGJ1aWxkL3B1Ymxpc2ggYXNzZXRzIGluIHBhcmFsbGVsXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWUgVG8gcmVtYWluIGJhY2t3YXJkIGNvbXBhdGlibGUuXG4gICAqL1xuICByZWFkb25seSBhc3NldFBhcmFsbGVsaXNtPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmVwYXJlU3RhY2tPcHRpb25zIGV4dGVuZHMgT21pdDxEZXBsb3lTdGFja09wdGlvbnMsICdkZXBsb3ltZW50TWV0aG9kJz4ge1xuICAvKipcbiAgICogVGhlIGNoYW5nZS1zZXQgZGVwbG95bWVudCBtZXRob2QgdG8gdXNlLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95bWVudE1ldGhvZDogQ2hhbmdlU2V0RGVwbG95bWVudDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBjbGVhbiB1cCB0aGUgY2hhbmdlIHNldCBpZiBpdCBoYXMgbm8gY2hhbmdlcy5cbiAgICpcbiAgICogU2V0IHRvIHRydWUgd2hlbiB0aGUgY2FsbGVyIGZvcmNlZCBleGVjdXRlOiBmYWxzZSBpbnRlcm5hbGx5XG4gICAqICh0d28tcGhhc2UgZGVwbG95KS4gU2V0IHRvIGZhbHNlIHdoZW4gdGhlIHVzZXIgZXhwbGljaXRseVxuICAgKiBhc2tlZCBmb3IgLS1uby1leGVjdXRlIChwcmVwYXJlLWNoYW5nZS1zZXQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgY2xlYW51cE9uTm9PcD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9sbGJhY2tTdGFja09wdGlvbnMge1xuICAvKipcbiAgICogU3RhY2sgdG8gcm9sbCBiYWNrXG4gICAqL1xuICByZWFkb25seSBzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuXG4gIC8qKlxuICAgKiBFeGVjdXRpb24gcm9sZSBmb3IgdGhlIGRlcGxveW1lbnQgKHBhc3MgdGhyb3VnaCB0byBDbG91ZEZvcm1hdGlvbilcbiAgICpcbiAgICogQGRlZmF1bHQgLSBDdXJyZW50IHJvbGVcbiAgICovXG4gIHJlYWRvbmx5IHJvbGVBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHRvb2xraXQgc3RhY2ssIGlmIG5vdCB0aGUgZGVmYXVsdCBuYW1lXG4gICAqXG4gICAqIEBkZWZhdWx0ICdDREtUb29sa2l0J1xuICAgKi9cbiAgcmVhZG9ubHkgdG9vbGtpdFN0YWNrTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBhdXRvbWF0aWNhbGx5IG9ycGhhbiBhbGwgZmFpbGVkIHJlc291cmNlcyBkdXJpbmcgdGhlIHJvbGxiYWNrXG4gICAqXG4gICAqIFRoaXMgd2lsbCBmb3JjZSBhIHJvbGxiYWNrIHRoYXQgb3RoZXJ3aXNlIHdvdWxkIGhhdmUgZmFpbGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgb3JwaGFuRmFpbGVkUmVzb3VyY2VzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3JwaGFuIHRoZSByZXNvdXJjZXMgd2l0aCB0aGUgZ2l2ZW4gbG9naWNhbCBJRHNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBvcnBoYW5pbmdcbiAgICovXG4gIHJlYWRvbmx5IG9ycGhhbkxvZ2ljYWxJZHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogV2hldGhlciB0byB2YWxpZGF0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgYm9vdHN0cmFwIHN0YWNrIHBlcm1pc3Npb25zXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHZhbGlkYXRlQm9vdHN0cmFwU3RhY2tWZXJzaW9uPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgUm9sbGJhY2tTdGFja1Jlc3VsdCA9IHsgcmVhZG9ubHkgc3RhY2tBcm46IHN0cmluZyB9ICYgKFxuICB8IHsgcmVhZG9ubHkgbm90SW5Sb2xsYmFja2FibGVTdGF0ZTogdHJ1ZSB9XG4gIHwgeyByZWFkb25seSBzdWNjZXNzOiB0cnVlOyBub3RJblJvbGxiYWNrYWJsZVN0YXRlPzogdW5kZWZpbmVkIH1cbik7XG5cbmludGVyZmFjZSBBc3NldE9wdGlvbnMge1xuICAvKipcbiAgICogU3RhY2sgd2l0aCBhc3NldHMgdG8gYnVpbGQuXG4gICAqL1xuICByZWFkb25seSBzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuXG4gIC8qKlxuICAgKiBFeGVjdXRpb24gcm9sZSBmb3IgdGhlIGJ1aWxkaW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEN1cnJlbnQgcm9sZVxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZUFybj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZFN0YWNrQXNzZXRzT3B0aW9ucyBleHRlbmRzIEFzc2V0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTdGFjayBuYW1lIHRoaXMgYXNzZXQgaXMgZm9yXG4gICAqL1xuICByZWFkb25seSBzdGFja05hbWU/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBQdWJsaXNoU3RhY2tBc3NldHNPcHRpb25zIGV4dGVuZHMgQXNzZXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFN0YWNrIG5hbWUgdGhpcyBhc3NldCBpcyBmb3JcbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogQWx3YXlzIHB1Ymxpc2gsIGV2ZW4gaWYgaXQgYWxyZWFkeSBleGlzdHNcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGZvcmNlUHVibGlzaD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVzdHJveVN0YWNrT3B0aW9ucyB7XG4gIHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Q7XG4gIGRlcGxveU5hbWU/OiBzdHJpbmc7XG4gIHJvbGVBcm4/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhY2tFeGlzdHNPcHRpb25zIHtcbiAgc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdDtcbiAgZGVwbG95TmFtZT86IHN0cmluZztcbiAgdHJ5TG9va3VwUm9sZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVwbG95bWVudHNQcm9wcyB7XG4gIHJlYWRvbmx5IHNka1Byb3ZpZGVyOiBTZGtQcm92aWRlcjtcbiAgcmVhZG9ubHkgdG9vbGtpdFN0YWNrTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgaW9IZWxwZXI6IElvSGVscGVyO1xufVxuXG4vKipcbiAqIFNjb3BlIGZvciBhIHNpbmdsZSBzZXQgb2YgZGVwbG95bWVudHMgZnJvbSBhIHNldCBvZiBDbG91ZCBBc3NlbWJseSBBcnRpZmFjdHNcbiAqXG4gKiBNYW5hZ2VzIGxvb2t1cCBvZiBTREtzLCBCb290c3RyYXAgc3RhY2tzLCBldGMuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXBsb3ltZW50cyB7XG4gIHB1YmxpYyByZWFkb25seSBlbnZzOiBFbnZpcm9ubWVudEFjY2VzcztcblxuICAvKipcbiAgICogU0RLIHByb3ZpZGVyIGZvciBhc3NldCBwdWJsaXNoaW5nIChkbyBub3QgdXNlIGZvciBhbnl0aGluZyBlbHNlKS5cbiAgICpcbiAgICogVGhpcyBTREsgcHJvdmlkZXIgaXMgb25seSBhbGxvd2VkIHRvIGJlIHVzZWQgZm9yIHRoYXQgcHVycG9zZSwgbm90aGluZyBlbHNlLlxuICAgKlxuICAgKiBJdCdzIG5vdCBhIGRpZmZlcmVudCBvYmplY3QsIGJ1dCB0aGUgZmllbGQgbmFtZSBzaG91bGQgaW1wbHkgdGhhdCB0aGlzXG4gICAqIG9iamVjdCBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHksIGV4Y2VwdCB0byBwYXNzIHRvIGFzc2V0IGhhbmRsaW5nIHJvdXRpbmVzLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBhc3NldFNka1Byb3ZpZGVyOiBTZGtQcm92aWRlcjtcblxuICAvKipcbiAgICogU0RLIHByb3ZpZGVyIGZvciBwYXNzaW5nIHRvIGRlcGxveVN0YWNrXG4gICAqXG4gICAqIFRoaXMgU0RLIHByb3ZpZGVyIGlzIG9ubHkgYWxsb3dlZCB0byBiZSB1c2VkIGZvciB0aGF0IHB1cnBvc2UsIG5vdGhpbmcgZWxzZS5cbiAgICpcbiAgICogSXQncyBub3QgYSBkaWZmZXJlbnQgb2JqZWN0LCBidXQgdGhlIGZpZWxkIG5hbWUgc2hvdWxkIGltcGx5IHRoYXQgdGhpc1xuICAgKiBvYmplY3Qgc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5LCBleGNlcHQgdG8gcGFzcyB0byBgZGVwbG95U3RhY2tgLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBkZXBsb3lTdGFja1Nka1Byb3ZpZGVyOiBTZGtQcm92aWRlcjtcblxuICBwcml2YXRlIHJlYWRvbmx5IHB1Ymxpc2hlckNhY2hlID0gbmV3IE1hcDxjZGtfYXNzZXRzLkFzc2V0TWFuaWZlc3QsIGNka19hc3NldHMuQXNzZXRQdWJsaXNoaW5nPigpO1xuXG4gIHByaXZhdGUgX2FsbG93Q3Jvc3NBY2NvdW50QXNzZXRQdWJsaXNoaW5nOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW9IZWxwZXI6IElvSGVscGVyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IERlcGxveW1lbnRzUHJvcHMpIHtcbiAgICB0aGlzLmFzc2V0U2RrUHJvdmlkZXIgPSBwcm9wcy5zZGtQcm92aWRlcjtcbiAgICB0aGlzLmRlcGxveVN0YWNrU2RrUHJvdmlkZXIgPSBwcm9wcy5zZGtQcm92aWRlcjtcbiAgICB0aGlzLmlvSGVscGVyID0gcHJvcHMuaW9IZWxwZXI7XG4gICAgdGhpcy5lbnZzID0gbmV3IEVudmlyb25tZW50QWNjZXNzKFxuICAgICAgcHJvcHMuc2RrUHJvdmlkZXIsXG4gICAgICBwcm9wcy50b29sa2l0U3RhY2tOYW1lID8/IERFRkFVTFRfVE9PTEtJVF9TVEFDS19OQU1FLFxuICAgICAgdGhpcy5pb0hlbHBlcixcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBlbnZpcm9ubWVudCBmb3IgYSBzdGFjay5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXNvbHZlRW52aXJvbm1lbnQoc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCk6IFByb21pc2U8Y3hhcGkuRW52aXJvbm1lbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5lbnZzLnJlc29sdmVTdGFja0Vudmlyb25tZW50KHN0YWNrKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByZWFkQ3VycmVudFRlbXBsYXRlV2l0aE5lc3RlZFN0YWNrcyhcbiAgICByb290U3RhY2tBcnRpZmFjdDogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0LFxuICAgIHJldHJpZXZlUHJvY2Vzc2VkVGVtcGxhdGU6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKTogUHJvbWlzZTxSb290VGVtcGxhdGVXaXRoTmVzdGVkU3RhY2tzPiB7XG4gICAgY29uc3QgZW52ID0gYXdhaXQgdGhpcy5lbnZzLmFjY2Vzc1N0YWNrRm9yTG9va3VwQmVzdEVmZm9ydChyb290U3RhY2tBcnRpZmFjdCk7XG4gICAgcmV0dXJuIGxvYWRDdXJyZW50VGVtcGxhdGVXaXRoTmVzdGVkU3RhY2tzKHJvb3RTdGFja0FydGlmYWN0LCBlbnYuc2RrLCByZXRyaWV2ZVByb2Nlc3NlZFRlbXBsYXRlKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByZWFkQ3VycmVudFRlbXBsYXRlKHN0YWNrQXJ0aWZhY3Q6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCk6IFByb21pc2U8VGVtcGxhdGU+IHtcbiAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmRlYnVnKGBSZWFkaW5nIGV4aXN0aW5nIHRlbXBsYXRlIGZvciBzdGFjayAke3N0YWNrQXJ0aWZhY3QuZGlzcGxheU5hbWV9LmApO1xuICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0Zvckxvb2t1cEJlc3RFZmZvcnQoc3RhY2tBcnRpZmFjdCk7XG4gICAgcmV0dXJuIGxvYWRDdXJyZW50VGVtcGxhdGUoc3RhY2tBcnRpZmFjdCwgZW52LnNkayk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVzb3VyY2VJZGVudGlmaWVyU3VtbWFyaWVzKFxuICAgIHN0YWNrQXJ0aWZhY3Q6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCxcbiAgKTogUHJvbWlzZTxSZXNvdXJjZUlkZW50aWZpZXJTdW1tYXJpZXM+IHtcbiAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmRlYnVnKGBSZXRyaWV2aW5nIHRlbXBsYXRlIHN1bW1hcnkgZm9yIHN0YWNrICR7c3RhY2tBcnRpZmFjdC5kaXNwbGF5TmFtZX0uYCk7XG4gICAgLy8gQ3VycmVudGx5LCBuZWVkcyB0byB1c2UgYGRlcGxveS1yb2xlYCBzaW5jZSBpdCBtYXkgbmVlZCB0byByZWFkIHRlbXBsYXRlcyBpbiB0aGUgc3RhZ2luZ1xuICAgIC8vIGJ1Y2tldCB3aGljaCBoYXZlIGJlZW4gZW5jcnlwdGVkIHdpdGggYSBLTVMga2V5IChhbmQgbG9va3VwLXJvbGUgbWF5IG5vdCByZWFkIGVuY3J5cHRlZCB0aGluZ3MpXG4gICAgY29uc3QgZW52ID0gYXdhaXQgdGhpcy5lbnZzLmFjY2Vzc1N0YWNrRm9yUmVhZE9ubHlTdGFja09wZXJhdGlvbnMoc3RhY2tBcnRpZmFjdCk7XG4gICAgY29uc3QgY2ZuID0gZW52LnNkay5jbG91ZEZvcm1hdGlvbigpO1xuXG4gICAgYXdhaXQgdXBsb2FkU3RhY2tUZW1wbGF0ZUFzc2V0cyhzdGFja0FydGlmYWN0LCB0aGlzKTtcblxuICAgIC8vIFVwbG9hZCB0aGUgdGVtcGxhdGUsIGlmIG5lY2Vzc2FyeSwgYmVmb3JlIHBhc3NpbmcgaXQgdG8gQ0ZOXG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyBBc3NldE1hbmlmZXN0QnVpbGRlcigpO1xuICAgIGNvbnN0IGNmblBhcmFtID0gYXdhaXQgbWFrZUJvZHlQYXJhbWV0ZXIoXG4gICAgICB0aGlzLmlvSGVscGVyLFxuICAgICAgc3RhY2tBcnRpZmFjdCxcbiAgICAgIGVudi5yZXNvbHZlZEVudmlyb25tZW50LFxuICAgICAgYnVpbGRlcixcbiAgICAgIGVudi5yZXNvdXJjZXMsXG4gICAgKTtcblxuICAgIC8vIElmIHRoZSBgbWFrZUJvZHlQYXJhbWV0ZXJgIGJlZm9yZSB0aGlzIGFkZGVkIGFzc2V0cywgbWFrZSBzdXJlIHRvIHB1Ymxpc2ggdGhlbSBiZWZvcmVcbiAgICAvLyBjYWxsaW5nIHRoZSBBUEkuXG4gICAgY29uc3QgYWRkZWRBc3NldHMgPSBidWlsZGVyLnRvTWFuaWZlc3Qoc3RhY2tBcnRpZmFjdC5hc3NlbWJseS5kaXJlY3RvcnkpO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgYWRkZWRBc3NldHMuZW50cmllcykge1xuICAgICAgYXdhaXQgdGhpcy5idWlsZFNpbmdsZUFzc2V0KCduby12ZXJzaW9uLXZhbGlkYXRpb24nLCBhZGRlZEFzc2V0cywgZW50cnksIHtcbiAgICAgICAgc3RhY2s6IHN0YWNrQXJ0aWZhY3QsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHRoaXMucHVibGlzaFNpbmdsZUFzc2V0KGFkZGVkQXNzZXRzLCBlbnRyeSwge1xuICAgICAgICBzdGFjazogc3RhY2tBcnRpZmFjdCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2ZuLmdldFRlbXBsYXRlU3VtbWFyeShjZm5QYXJhbSk7XG4gICAgaWYgKCFyZXNwb25zZS5SZXNvdXJjZUlkZW50aWZpZXJTdW1tYXJpZXMpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMuZGVidWcoJ0dldFRlbXBsYXRlU3VtbWFyeSBBUEkgY2FsbCBkaWQgbm90IHJldHVybiBcIlJlc291cmNlSWRlbnRpZmllclN1bW1hcmllc1wiJyk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZS5SZXNvdXJjZUlkZW50aWZpZXJTdW1tYXJpZXMgPz8gW107XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVwbG95U3RhY2sob3B0aW9uczogRGVwbG95U3RhY2tPcHRpb25zKTogUHJvbWlzZTxEZXBsb3lTdGFja1Jlc3VsdD4ge1xuICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0Zvck11dGFibGVTdGFja09wZXJhdGlvbnMob3B0aW9ucy5zdGFjayk7XG5cbiAgICAvLyBEbyBhIHZlcmlmaWNhdGlvbiBvZiB0aGUgYm9vdHN0cmFwIHN0YWNrIHZlcnNpb25cbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlQm9vdHN0cmFwU3RhY2tWZXJzaW9uKFxuICAgICAgb3B0aW9ucy5zdGFjay5zdGFja05hbWUsXG4gICAgICBvcHRpb25zLnN0YWNrLnJlcXVpcmVzQm9vdHN0cmFwU3RhY2tWZXJzaW9uLFxuICAgICAgb3B0aW9ucy5zdGFjay5ib290c3RyYXBTdGFja1ZlcnNpb25Tc21QYXJhbWV0ZXIsXG4gICAgICBlbnYucmVzb3VyY2VzKTtcblxuICAgIGNvbnN0IGV4ZWN1dGlvblJvbGVBcm4gPSBhd2FpdCBlbnYucmVwbGFjZVBsYWNlaG9sZGVycyhvcHRpb25zLnJvbGVBcm4gPz8gb3B0aW9ucy5zdGFjay5jbG91ZEZvcm1hdGlvbkV4ZWN1dGlvblJvbGVBcm4pO1xuXG4gICAgcmV0dXJuIGRlcGxveVN0YWNrKHtcbiAgICAgIHN0YWNrOiBvcHRpb25zLnN0YWNrLFxuICAgICAgcmVzb2x2ZWRFbnZpcm9ubWVudDogZW52LnJlc29sdmVkRW52aXJvbm1lbnQsXG4gICAgICBkZXBsb3lOYW1lOiBvcHRpb25zLmRlcGxveU5hbWUsXG4gICAgICBub3RpZmljYXRpb25Bcm5zOiBvcHRpb25zLm5vdGlmaWNhdGlvbkFybnMsXG4gICAgICBzZGs6IGVudi5zZGssXG4gICAgICBzZGtQcm92aWRlcjogdGhpcy5kZXBsb3lTdGFja1Nka1Byb3ZpZGVyLFxuICAgICAgcm9sZUFybjogZXhlY3V0aW9uUm9sZUFybixcbiAgICAgIHJldXNlQXNzZXRzOiBvcHRpb25zLnJldXNlQXNzZXRzLFxuICAgICAgZW52UmVzb3VyY2VzOiBlbnYucmVzb3VyY2VzLFxuICAgICAgdGFnczogb3B0aW9ucy50YWdzLFxuICAgICAgZGVwbG95bWVudE1ldGhvZDogb3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kLFxuICAgICAgZm9yY2VEZXBsb3ltZW50OiBvcHRpb25zLmZvcmNlRGVwbG95bWVudCxcbiAgICAgIHBhcmFtZXRlcnM6IG9wdGlvbnMucGFyYW1ldGVycyxcbiAgICAgIHVzZVByZXZpb3VzUGFyYW1ldGVyczogb3B0aW9ucy51c2VQcmV2aW91c1BhcmFtZXRlcnMsXG4gICAgICByb2xsYmFjazogb3B0aW9ucy5yb2xsYmFjayxcbiAgICAgIGV4dHJhVXNlckFnZW50OiBvcHRpb25zLmV4dHJhVXNlckFnZW50LFxuICAgICAgcmVzb3VyY2VzVG9JbXBvcnQ6IG9wdGlvbnMucmVzb3VyY2VzVG9JbXBvcnQsXG4gICAgICBvdmVycmlkZVRlbXBsYXRlOiBvcHRpb25zLm92ZXJyaWRlVGVtcGxhdGUsXG4gICAgICBhc3NldFBhcmFsbGVsaXNtOiBvcHRpb25zLmFzc2V0UGFyYWxsZWxpc20sXG4gICAgICBkaWFnbm9zZXI6IG5ldyBDbG91ZEZvcm1hdGlvblN0YWNrRGlhZ25vc2VyKHtcbiAgICAgICAgc2RrOiBlbnYuc2RrLFxuICAgICAgICBlbnZSZXNvdXJjZXM6IGVudi5yZXNvdXJjZXMsXG4gICAgICAgIHNvdXJjZVRyYWNlcjogbmV3IFN0YWNrQXJ0aWZhY3RTb3VyY2VUcmFjZXIob3B0aW9ucy5zdGFjayksXG4gICAgICAgIGlvSGVscGVyOiB0aGlzLmlvSGVscGVyLFxuICAgICAgICB0b3BMZXZlbFN0YWNrSGllcmFyY2hpY2FsSWQ6IG9wdGlvbnMuc3RhY2suaGllcmFyY2hpY2FsSWQsXG4gICAgICB9KSxcbiAgICB9LCB0aGlzLmlvSGVscGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBjaGFuZ2Ugc2V0IGZvciBhIHN0YWNrIHdpdGhvdXQgZXhlY3V0aW5nIGl0LlxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgaWYgdGhlIGNoYW5nZSBzZXQgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLCBvciB1bmRlZmluZWRcbiAgICogaWYgdGhlIHByZXBhcmUgcmV0dXJuZWQgYSBub24tc3VjY2VzcyByZXN1bHQgKGUuZy4gcm9sbGJhY2sgbmVlZGVkKS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBwcmVwYXJlU3RhY2soXG4gICAgb3B0aW9uczogUHJlcGFyZVN0YWNrT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxTdWNjZXNzZnVsRGVwbG95U3RhY2tSZXN1bHQgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmRlcGxveVN0YWNrKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBkZXBsb3ltZW50TWV0aG9kOiB7IC4uLm9wdGlvbnMuZGVwbG95bWVudE1ldGhvZCwgZXhlY3V0ZTogZmFsc2UgfSxcbiAgICB9KTtcblxuICAgIC8vIFdpdGggZXhlY3V0ZTogZmFsc2UsIHRoZSBvbmx5IHBvc3NpYmxlIHJlc3VsdCB0eXBlIGlzIGRpZC1kZXBsb3ktc3RhY2tcbiAgICAvLyAoZWl0aGVyIG5vT3AgZm9yIGVtcHR5IGNoYW5nZSBzZXRzLCBvciB3aXRoIGEgY2hhbmdlU2V0IGRlc2NyaXB0aW9uKS5cbiAgICAvLyBSb2xsYmFjay9yZXBsYWNlbWVudCBjaGVja3MgYXJlIG9ubHkgcmVhY2hlZCB3aGVuIGV4ZWN1dGluZy5cbiAgICBpZiAocmVzdWx0LnR5cGUgIT09ICdkaWQtZGVwbG95LXN0YWNrJykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBDbGVhbiB1cCBlbXB0eSBjaGFuZ2Ugc2V0cyBpZiByZXF1ZXN0ZWQgKGkuZS4gd2hlbiB0aGUgY2FsbGVyIGZvcmNlZFxuICAgIC8vIGV4ZWN1dGU6IGZhbHNlIGludGVybmFsbHksIG5vdCB3aGVuIHRoZSB1c2VyIGV4cGxpY2l0bHkgYXNrZWQgZm9yIC0tbm8tZXhlY3V0ZSkuXG4gICAgaWYgKHJlc3VsdC5ub09wICYmIG9wdGlvbnMuY2xlYW51cE9uTm9PcCkge1xuICAgICAgY29uc3QgY2hhbmdlU2V0TmFtZSA9IG9wdGlvbnMuZGVwbG95bWVudE1ldGhvZC5jaGFuZ2VTZXROYW1lID8/IERFRkFVTFRfREVQTE9ZX0NIQU5HRV9TRVRfTkFNRTtcbiAgICAgIGF3YWl0IHRoaXMuY2xlYW51cENoYW5nZVNldChvcHRpb25zLnN0YWNrLCBjaGFuZ2VTZXROYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFuIHVwIGEgY2hhbmdlIHNldCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHByZXBhcmVTdGFjayBidXQgbmV2ZXIgZXhlY3V0ZWQuXG4gICAqIElmIHRoZSBzdGFjayB3YXMgY3JlYXRlZCBpbiBSRVZJRVdfSU5fUFJPR1JFU1Mgc3RhdGUgKG5ldyBzdGFjayksIGRlbGV0ZSB0aGUgc3RhY2sgdG9vLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNsZWFudXBDaGFuZ2VTZXQoc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCwgY2hhbmdlU2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZW52ID0gYXdhaXQgdGhpcy5lbnZzLmFjY2Vzc1N0YWNrRm9yTXV0YWJsZVN0YWNrT3BlcmF0aW9ucyhzdGFjayk7XG4gICAgY29uc3QgY2ZuID0gZW52LnNkay5jbG91ZEZvcm1hdGlvbigpO1xuICAgIGNvbnN0IGRlcGxveU5hbWUgPSBzdGFjay5zdGFja05hbWU7XG5cbiAgICBjb25zdCBjbG91ZEZvcm1hdGlvblN0YWNrID0gYXdhaXQgQ2xvdWRGb3JtYXRpb25TdGFjay5sb29rdXAoY2ZuLCBkZXBsb3lOYW1lKTtcbiAgICBpZiAoIWNsb3VkRm9ybWF0aW9uU3RhY2suZXhpc3RzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgY2ZuLmRlbGV0ZUNoYW5nZVNldCh7IFN0YWNrTmFtZTogZGVwbG95TmFtZSwgQ2hhbmdlU2V0TmFtZTogY2hhbmdlU2V0TmFtZSB9KTtcblxuICAgIC8vIElmIHRoZSBzdGFjayB3YXMgbmV3bHkgY3JlYXRlZCBmb3IgdGhpcyBjaGFuZ2Ugc2V0LCBpdCB3aWxsIGJlIGluIFJFVklFV19JTl9QUk9HUkVTUy5cbiAgICAvLyBEZWxldGUgaXQgYW5kIHdhaXQgZm9yIHRoZSBkZWxldGlvbiB0byBjb21wbGV0ZSBzbyB3ZSBkb24ndCBsZWF2ZSBhbiBlbXB0eSBzdGFjayBiZWhpbmQuXG4gICAgaWYgKGNsb3VkRm9ybWF0aW9uU3RhY2suc3RhY2tTdGF0dXMubmFtZSA9PT0gJ1JFVklFV19JTl9QUk9HUkVTUycpIHtcbiAgICAgIGF3YWl0IGNmbi5kZWxldGVTdGFjayh7IFN0YWNrTmFtZTogZGVwbG95TmFtZSB9KTtcbiAgICAgIGF3YWl0IHdhaXRGb3JTdGFja0RlbGV0ZShjZm4sIHRoaXMuaW9IZWxwZXIsIGRlcGxveU5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkZXNjcmliZUNoYW5nZVNldChzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0LCBjaGFuZ2VTZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPERlc2NyaWJlQ2hhbmdlU2V0Q29tbWFuZE91dHB1dD4ge1xuICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0Zvck11dGFibGVTdGFja09wZXJhdGlvbnMoc3RhY2spO1xuICAgIGNvbnN0IGNmbiA9IGVudi5zZGsuY2xvdWRGb3JtYXRpb24oKTtcbiAgICByZXR1cm4gd2FpdEZvckNoYW5nZVNldChjZm4sIHRoaXMuaW9IZWxwZXIsIHN0YWNrLnN0YWNrTmFtZSwgY2hhbmdlU2V0TmFtZSwge1xuICAgICAgZmV0Y2hBbGw6IHRydWUsXG4gICAgICBkaWFnbm9zZXI6IG5ldyBDbG91ZEZvcm1hdGlvblN0YWNrRGlhZ25vc2VyKHtcbiAgICAgICAgc2RrOiBlbnYuc2RrLFxuICAgICAgICBlbnZSZXNvdXJjZXM6IGVudi5yZXNvdXJjZXMsXG4gICAgICAgIHNvdXJjZVRyYWNlcjogbmV3IFN0YWNrQXJ0aWZhY3RTb3VyY2VUcmFjZXIoc3RhY2spLFxuICAgICAgICBpb0hlbHBlcjogdGhpcy5pb0hlbHBlcixcbiAgICAgICAgdG9wTGV2ZWxTdGFja0hpZXJhcmNoaWNhbElkOiBzdGFjay5oaWVyYXJjaGljYWxJZCxcbiAgICAgIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHJvbGxiYWNrU3RhY2sob3B0aW9uczogUm9sbGJhY2tTdGFja09wdGlvbnMpOiBQcm9taXNlPFJvbGxiYWNrU3RhY2tSZXN1bHQ+IHtcbiAgICBsZXQgcmVzb3VyY2VzVG9Ta2lwOiBzdHJpbmdbXSA9IG9wdGlvbnMub3JwaGFuTG9naWNhbElkcyA/PyBbXTtcbiAgICBpZiAob3B0aW9ucy5vcnBoYW5GYWlsZWRSZXNvdXJjZXMgJiYgcmVzb3VyY2VzVG9Ta2lwLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0NvbmZsaWN0aW5nUm9sbGJhY2tPcHRpb25zJywgJ0Nhbm5vdCBjb21iaW5lIC0tZm9yY2Ugd2l0aCAtLW9ycGhhbicpO1xuICAgIH1cblxuICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0Zvck11dGFibGVTdGFja09wZXJhdGlvbnMob3B0aW9ucy5zdGFjayk7XG5cbiAgICBpZiAob3B0aW9ucy52YWxpZGF0ZUJvb3RzdHJhcFN0YWNrVmVyc2lvbiA/PyB0cnVlKSB7XG4gICAgICAvLyBEbyBhIHZlcmlmaWNhdGlvbiBvZiB0aGUgYm9vdHN0cmFwIHN0YWNrIHZlcnNpb25cbiAgICAgIGF3YWl0IHRoaXMudmFsaWRhdGVCb290c3RyYXBTdGFja1ZlcnNpb24oXG4gICAgICAgIG9wdGlvbnMuc3RhY2suc3RhY2tOYW1lLFxuICAgICAgICBCT09UU1RSQVBfU1RBQ0tfVkVSU0lPTl9GT1JfUk9MTEJBQ0ssXG4gICAgICAgIG9wdGlvbnMuc3RhY2suYm9vdHN0cmFwU3RhY2tWZXJzaW9uU3NtUGFyYW1ldGVyLFxuICAgICAgICBlbnYucmVzb3VyY2VzKTtcbiAgICB9XG5cbiAgICBjb25zdCBjZm4gPSBlbnYuc2RrLmNsb3VkRm9ybWF0aW9uKCk7XG4gICAgY29uc3QgZGVwbG95TmFtZSA9IG9wdGlvbnMuc3RhY2suc3RhY2tOYW1lO1xuXG4gICAgLy8gV2UgbG9vcCBpbiBjYXNlIG9mIGAtLWZvcmNlYCBhbmQgdGhlIHN0YWNrIGVuZHMgdXAgaW4gYENPTlRJTlVFX1VQREFURV9ST0xMQkFDS2AuXG4gICAgbGV0IG1heExvb3BzID0gMTA7XG4gICAgd2hpbGUgKG1heExvb3BzLS0pIHtcbiAgICAgIGNvbnN0IGNsb3VkRm9ybWF0aW9uU3RhY2sgPSBhd2FpdCBDbG91ZEZvcm1hdGlvblN0YWNrLmxvb2t1cChjZm4sIGRlcGxveU5hbWUpO1xuICAgICAgY29uc3Qgc3RhY2tBcm4gPSBjbG91ZEZvcm1hdGlvblN0YWNrLnN0YWNrSWQ7XG5cbiAgICAgIGNvbnN0IGV4ZWN1dGlvblJvbGVBcm4gPSBhd2FpdCBlbnYucmVwbGFjZVBsYWNlaG9sZGVycyhvcHRpb25zLnJvbGVBcm4gPz8gb3B0aW9ucy5zdGFjay5jbG91ZEZvcm1hdGlvbkV4ZWN1dGlvblJvbGVBcm4pO1xuXG4gICAgICBzd2l0Y2ggKGNsb3VkRm9ybWF0aW9uU3RhY2suc3RhY2tTdGF0dXMucm9sbGJhY2tDaG9pY2UpIHtcbiAgICAgICAgY2FzZSBSb2xsYmFja0Nob2ljZS5OT05FOlxuICAgICAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMud2FybihgU3RhY2sgJHtkZXBsb3lOYW1lfSBkb2VzIG5vdCBuZWVkIGEgcm9sbGJhY2s6ICR7Y2xvdWRGb3JtYXRpb25TdGFjay5zdGFja1N0YXR1c31gKTtcbiAgICAgICAgICByZXR1cm4geyBzdGFja0FybjogY2xvdWRGb3JtYXRpb25TdGFjay5zdGFja0lkLCBub3RJblJvbGxiYWNrYWJsZVN0YXRlOiB0cnVlIH07XG5cbiAgICAgICAgY2FzZSBSb2xsYmFja0Nob2ljZS5TVEFSVF9ST0xMQkFDSzpcbiAgICAgICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmRlYnVnKGBJbml0aWF0aW5nIHJvbGxiYWNrIG9mIHN0YWNrICR7ZGVwbG95TmFtZX1gKTtcbiAgICAgICAgICBhd2FpdCBjZm4ucm9sbGJhY2tTdGFjayh7XG4gICAgICAgICAgICBTdGFja05hbWU6IGRlcGxveU5hbWUsXG4gICAgICAgICAgICBSb2xlQVJOOiBleGVjdXRpb25Sb2xlQXJuLFxuICAgICAgICAgICAgQ2xpZW50UmVxdWVzdFRva2VuOiByYW5kb21VVUlEKCksXG4gICAgICAgICAgICAvLyBFbmFibGluZyB0aGlzIGlzIGp1c3QgdGhlIGJldHRlciBvdmVyYWxsIGRlZmF1bHQsIHRoZSBvbmx5IHJlYXNvbiBpdCBpc24ndCB0aGUgdXBzdHJlYW0gZGVmYXVsdCBpcyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgUmV0YWluRXhjZXB0T25DcmVhdGU6IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBSb2xsYmFja0Nob2ljZS5DT05USU5VRV9VUERBVEVfUk9MTEJBQ0s6XG4gICAgICAgICAgaWYgKG9wdGlvbnMub3JwaGFuRmFpbGVkUmVzb3VyY2VzKSB7XG4gICAgICAgICAgICAvLyBGaW5kIHRoZSBmYWlsZWQgcmVzb3VyY2VzIGZyb20gdGhlIGRlcGxveW1lbnQgYW5kIGF1dG9tYXRpY2FsbHkgc2tpcCB0aGVtXG4gICAgICAgICAgICAvLyAoVXNpbmcgZGVwbG95bWVudCBsb2cgYmVjYXVzZSB3ZSBkZWZpbml0ZWx5IGhhdmUgYERlc2NyaWJlU3RhY2tFdmVudHNgIHBlcm1pc3Npb25zLCBhbmQgd2UgbWlnaHQgbm90IGhhdmVcbiAgICAgICAgICAgIC8vIGBEZXNjcmliZVN0YWNrUmVzb3VyY2VzYCBwZXJtaXNzaW9ucykuXG4gICAgICAgICAgICBjb25zdCBwb2xsZXIgPSBuZXcgU3RhY2tFdmVudFBvbGxlcihjZm4sIHtcbiAgICAgICAgICAgICAgc3RhY2tOYW1lOiBkZXBsb3lOYW1lLFxuICAgICAgICAgICAgICBpbml0aWFsUG9sbFJhbmdlOiBQb2xsUmFuZ2Uuc2luY2VTdGFja1N0YXR1cyhbJ1JPTExCQUNLX0lOX1BST0dSRVNTJywgJ1VQREFURV9ST0xMQkFDS19JTl9QUk9HUkVTUyddKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXdhaXQgcG9sbGVyLnBvbGwoKTtcbiAgICAgICAgICAgIHJlc291cmNlc1RvU2tpcCA9IHBvbGxlci5yZXNvdXJjZUVycm9yc1xuICAgICAgICAgICAgICAuZmlsdGVyKChyKSA9PiByLnBhcmVudFN0YWNrTG9naWNhbElkcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgIC5tYXAoKHIpID0+IHIubG9naWNhbElkKVxuICAgICAgICAgICAgICAuZmlsdGVyKChpZCkgPT4gdHlwZW9mIGlkID09PSAnc3RyaW5nJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgc2tpcERlc2NyaXB0aW9uID0gcmVzb3VyY2VzVG9Ta2lwLmxlbmd0aCA+IDAgPyBgIChvcnBoYW5pbmc6ICR7cmVzb3VyY2VzVG9Ta2lwLmpvaW4oJywgJyl9KWAgOiAnJztcbiAgICAgICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLndhcm4oYENvbnRpbnVpbmcgcm9sbGJhY2sgb2Ygc3RhY2sgJHtkZXBsb3lOYW1lfSR7c2tpcERlc2NyaXB0aW9ufWApO1xuICAgICAgICAgIGF3YWl0IGNmbi5jb250aW51ZVVwZGF0ZVJvbGxiYWNrKHtcbiAgICAgICAgICAgIFN0YWNrTmFtZTogZGVwbG95TmFtZSxcbiAgICAgICAgICAgIENsaWVudFJlcXVlc3RUb2tlbjogcmFuZG9tVVVJRCgpLFxuICAgICAgICAgICAgUm9sZUFSTjogZXhlY3V0aW9uUm9sZUFybixcbiAgICAgICAgICAgIFJlc291cmNlc1RvU2tpcDogcmVzb3VyY2VzVG9Ta2lwLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUm9sbGJhY2tDaG9pY2UuUk9MTEJBQ0tfRkFJTEVEOlxuICAgICAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIuZGVmYXVsdHMud2FybihcbiAgICAgICAgICAgIGBTdGFjayAke2RlcGxveU5hbWV9IGZhaWxlZCBjcmVhdGlvbiBhbmQgcm9sbGJhY2suIFRoaXMgc3RhdGUgY2Fubm90IGJlIHJvbGxlZCBiYWNrLiBZb3UgY2FuIHJlY3JlYXRlIHRoaXMgc3RhY2sgYnkgcnVubmluZyAnY2RrIGRlcGxveScuYCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB7IHN0YWNrQXJuLCBub3RJblJvbGxiYWNrYWJsZVN0YXRlOiB0cnVlIH07XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdVbmV4cGVjdGVkUm9sbGJhY2tDaG9pY2UnLCBgVW5leHBlY3RlZCByb2xsYmFjayBjaG9pY2U6ICR7Y2xvdWRGb3JtYXRpb25TdGFjay5zdGFja1N0YXR1cy5yb2xsYmFja0Nob2ljZX1gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbW9uaXRvciA9IG5ldyBTdGFja0FjdGl2aXR5TW9uaXRvcih7XG4gICAgICAgIGNmbixcbiAgICAgICAgc3RhY2s6IG9wdGlvbnMuc3RhY2ssXG4gICAgICAgIHN0YWNrTmFtZTogZGVwbG95TmFtZSxcbiAgICAgICAgaW9IZWxwZXI6IHRoaXMuaW9IZWxwZXIsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IG1vbml0b3Iuc3RhcnQoKTtcblxuICAgICAgbGV0IHN0YWNrRXJyb3JNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICBsZXQgZmluYWxTdGFja1N0YXRlID0gY2xvdWRGb3JtYXRpb25TdGFjaztcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN1Y2Nlc3NTdGFjayA9IGF3YWl0IHN0YWJpbGl6ZVN0YWNrKGNmbiwgdGhpcy5pb0hlbHBlciwgZGVwbG95TmFtZSk7XG5cbiAgICAgICAgLy8gVGhpcyBzaG91bGRuJ3QgcmVhbGx5IGhhcHBlbiwgYnV0IGNhdGNoIGl0IGFueXdheS4gWW91IG5ldmVyIGtub3cuXG4gICAgICAgIGlmICghc3VjY2Vzc1N0YWNrKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignU3RhY2tEaXNhcHBlYXJlZCcsICdTdGFjayBkZXBsb3kgZmFpbGVkICh0aGUgc3RhY2sgZGlzYXBwZWFyZWQgd2hpbGUgd2Ugd2VyZSByb2xsaW5nIGl0IGJhY2spJyk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxTdGFja1N0YXRlID0gc3VjY2Vzc1N0YWNrO1xuXG4gICAgICAgIGNvbnN0IGVycm9ycyA9IG1vbml0b3IuZXJyb3JzLmFsbEVycm9yTWVzc2FnZXMuam9pbignLCAnKTtcbiAgICAgICAgaWYgKGVycm9ycykge1xuICAgICAgICAgIHN0YWNrRXJyb3JNZXNzYWdlID0gZXJyb3JzO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgc3RhY2tFcnJvck1lc3NhZ2UgPSBzdWZmaXhXaXRoRXJyb3JzKGZvcm1hdEVycm9yTWVzc2FnZShlKSwgbW9uaXRvci5lcnJvcnMuYWxsRXJyb3JNZXNzYWdlcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCBtb25pdG9yLnN0b3AoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpbmFsU3RhY2tTdGF0ZS5zdGFja1N0YXR1cy5pc1JvbGxiYWNrU3VjY2VzcyB8fCAhc3RhY2tFcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHsgc3RhY2tBcm4sIHN1Y2Nlc3M6IHRydWUgfTtcbiAgICAgIH1cblxuICAgICAgLy8gRWl0aGVyIHdlIG5lZWQgdG8gaWdub3JlIHNvbWUgcmVzb3VyY2VzIHRvIGNvbnRpbnVlIHRoZSByb2xsYmFjaywgb3Igc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICAgIGlmIChmaW5hbFN0YWNrU3RhdGUuc3RhY2tTdGF0dXMucm9sbGJhY2tDaG9pY2UgPT09IFJvbGxiYWNrQ2hvaWNlLkNPTlRJTlVFX1VQREFURV9ST0xMQkFDSyAmJiBvcHRpb25zLm9ycGhhbkZhaWxlZFJlc291cmNlcykge1xuICAgICAgICAvLyBEbyBhbm90aGVyIGxvb3AtZGUtbG9vcFxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFcnJvcihcbiAgICAgICAgYCR7c3RhY2tFcnJvck1lc3NhZ2V9IChmaXggcHJvYmxlbSBhbmQgcmV0cnksIG9yIG9ycGhhbiB0aGVzZSByZXNvdXJjZXMgdXNpbmcgLS1vcnBoYW4gb3IgLS1mb3JjZSlgLFxuICAgICAgICBtb25pdG9yLmVycm9ycy5yb290Q2F1c2VFcnJvckNvZGUgPz8gJ1JvbGxiYWNrRmFpbGVkJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoXG4gICAgICAnUm9sbGJhY2tTdGFsbGVkJyxcbiAgICAgIFwiUm9sbGJhY2sgZGlkIG5vdCBmaW5pc2ggYWZ0ZXIgYSBsYXJnZSBudW1iZXIgb2YgaXRlcmF0aW9uczsgc3RvcHBpbmcgYmVjYXVzZSBpdCBsb29rcyBsaWtlIHdlJ3JlIG5vdCBtYWtpbmcgcHJvZ3Jlc3MgYW55bW9yZS4gWW91IGNhbiByZXRyeSBpZiByb2xsYmFjayB3YXMgcHJvZ3Jlc3NpbmcgYXMgZXhwZWN0ZWQuXCIsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkZXN0cm95U3RhY2sob3B0aW9uczogRGVzdHJveVN0YWNrT3B0aW9ucykge1xuICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0Zvck11dGFibGVTdGFja09wZXJhdGlvbnMob3B0aW9ucy5zdGFjayk7XG4gICAgY29uc3QgZXhlY3V0aW9uUm9sZUFybiA9IGF3YWl0IGVudi5yZXBsYWNlUGxhY2Vob2xkZXJzKG9wdGlvbnMucm9sZUFybiA/PyBvcHRpb25zLnN0YWNrLmNsb3VkRm9ybWF0aW9uRXhlY3V0aW9uUm9sZUFybik7XG5cbiAgICByZXR1cm4gZGVzdHJveVN0YWNrKHtcbiAgICAgIHNkazogZW52LnNkayxcbiAgICAgIHJvbGVBcm46IGV4ZWN1dGlvblJvbGVBcm4sXG4gICAgICBzdGFjazogb3B0aW9ucy5zdGFjayxcbiAgICAgIGRlcGxveU5hbWU6IG9wdGlvbnMuZGVwbG95TmFtZSxcbiAgICB9LCB0aGlzLmlvSGVscGVyKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzdGFja0V4aXN0cyhvcHRpb25zOiBTdGFja0V4aXN0c09wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBsZXQgZW52O1xuICAgIGlmIChvcHRpb25zLnRyeUxvb2t1cFJvbGUpIHtcbiAgICAgIGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0Zvckxvb2t1cEJlc3RFZmZvcnQob3B0aW9ucy5zdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0ZvclJlYWRPbmx5U3RhY2tPcGVyYXRpb25zKG9wdGlvbnMuc3RhY2spO1xuICAgIH1cbiAgICBjb25zdCBzdGFjayA9IGF3YWl0IENsb3VkRm9ybWF0aW9uU3RhY2subG9va3VwKGVudi5zZGsuY2xvdWRGb3JtYXRpb24oKSwgb3B0aW9ucy5kZXBsb3lOYW1lID8/IG9wdGlvbnMuc3RhY2suc3RhY2tOYW1lKTtcbiAgICByZXR1cm4gc3RhY2suZXhpc3RzO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgc2luZ2xlIGFzc2V0IGZyb20gYW4gYXNzZXQgbWFuaWZlc3RcbiAgICpcbiAgICogSWYgYW4gYXNzZXJ0IG1hbmlmZXN0IGFydGlmYWN0IGlzIGdpdmVuLCB0aGUgYm9vdHN0cmFwIHN0YWNrIHZlcnNpb25cbiAgICogd2lsbCBiZSB2YWxpZGF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBjb25zdHJhaW50cyBpbiB0aGF0IG1hbmlmZXN0IGFydGlmYWN0LlxuICAgKiBJZiB0aGF0IGlzIG5vdCBuZWNlc3NhcnksIGAnbm8tdmVyc2lvbi12YWxpZGF0aW9uJ2AgY2FuIGJlIHBhc3NlZC5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAc3R5bGlzdGljL21heC1sZW5cbiAgcHVibGljIGFzeW5jIGJ1aWxkU2luZ2xlQXNzZXQoXG4gICAgYXNzZXRBcnRpZmFjdDogY3hhcGkuQXNzZXRNYW5pZmVzdEFydGlmYWN0IHwgJ25vLXZlcnNpb24tdmFsaWRhdGlvbicsXG4gICAgYXNzZXRNYW5pZmVzdDogY2RrX2Fzc2V0cy5Bc3NldE1hbmlmZXN0LFxuICAgIGFzc2V0OiBjZGtfYXNzZXRzLklNYW5pZmVzdEVudHJ5LFxuICAgIG9wdGlvbnM6IEJ1aWxkU3RhY2tBc3NldHNPcHRpb25zLFxuICApIHtcbiAgICBpZiAoYXNzZXRBcnRpZmFjdCAhPT0gJ25vLXZlcnNpb24tdmFsaWRhdGlvbicpIHtcbiAgICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0ZvclJlYWRPbmx5U3RhY2tPcGVyYXRpb25zKG9wdGlvbnMuc3RhY2spO1xuICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZUJvb3RzdHJhcFN0YWNrVmVyc2lvbihcbiAgICAgICAgb3B0aW9ucy5zdGFjay5zdGFja05hbWUsXG4gICAgICAgIGFzc2V0QXJ0aWZhY3QucmVxdWlyZXNCb290c3RyYXBTdGFja1ZlcnNpb24sXG4gICAgICAgIGFzc2V0QXJ0aWZhY3QuYm9vdHN0cmFwU3RhY2tWZXJzaW9uU3NtUGFyYW1ldGVyLFxuICAgICAgICBlbnYucmVzb3VyY2VzKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlZEVudmlyb25tZW50ID0gYXdhaXQgdGhpcy5lbnZzLnJlc29sdmVTdGFja0Vudmlyb25tZW50KG9wdGlvbnMuc3RhY2spO1xuXG4gICAgY29uc3QgcHVibGlzaGVyID0gdGhpcy5jYWNoZWRQdWJsaXNoZXIoYXNzZXRNYW5pZmVzdCwgcmVzb2x2ZWRFbnZpcm9ubWVudCwgb3B0aW9ucy5zdGFja05hbWUpO1xuICAgIGF3YWl0IHB1Ymxpc2hlci5idWlsZEVudHJ5KGFzc2V0KTtcbiAgICBpZiAocHVibGlzaGVyLmhhc0ZhaWx1cmVzKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdBc3NldEJ1aWxkRmFpbGVkJywgYEZhaWxlZCB0byBidWlsZCBhc3NldCAke2Fzc2V0LmRpc3BsYXlOYW1lKGZhbHNlKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHVibGlzaCBhIHNpbmdsZSBhc3NldCBmcm9tIGFuIGFzc2V0IG1hbmlmZXN0XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHVibGlzaFNpbmdsZUFzc2V0KFxuICAgIGFzc2V0TWFuaWZlc3Q6IGNka19hc3NldHMuQXNzZXRNYW5pZmVzdCxcbiAgICBhc3NldDogY2RrX2Fzc2V0cy5JTWFuaWZlc3RFbnRyeSxcbiAgICBvcHRpb25zOiBQdWJsaXNoU3RhY2tBc3NldHNPcHRpb25zLFxuICApIHtcbiAgICBjb25zdCBzdGFja0VudiA9IGF3YWl0IHRoaXMuZW52cy5yZXNvbHZlU3RhY2tFbnZpcm9ubWVudChvcHRpb25zLnN0YWNrKTtcblxuICAgIC8vIE5vIG5lZWQgdG8gdmFsaWRhdGUgYW55bW9yZSwgd2UgYWxyZWFkeSBkaWQgdGhhdCBkdXJpbmcgYnVpbGRcbiAgICBjb25zdCBwdWJsaXNoZXIgPSB0aGlzLmNhY2hlZFB1Ymxpc2hlcihhc3NldE1hbmlmZXN0LCBzdGFja0Vudiwgb3B0aW9ucy5zdGFja05hbWUpO1xuICAgIGF3YWl0IHB1Ymxpc2hlci5wdWJsaXNoRW50cnkoYXNzZXQsIHtcbiAgICAgIGFsbG93Q3Jvc3NBY2NvdW50OiBhd2FpdCB0aGlzLmFsbG93Q3Jvc3NBY2NvdW50QXNzZXRQdWJsaXNoaW5nRm9yRW52KG9wdGlvbnMuc3RhY2spLFxuICAgICAgZm9yY2U6IG9wdGlvbnMuZm9yY2VQdWJsaXNoLFxuICAgIH0pO1xuICAgIGlmIChwdWJsaXNoZXIuaGFzRmFpbHVyZXMpIHtcbiAgICAgIHRocm93IFRvb2xraXRFcnJvci53aXRoQ2F1c2UoJ0Fzc2V0UHVibGlzaEZhaWxlZCcsIGBGYWlsZWQgdG8gcHVibGlzaCBhc3NldCAke2Fzc2V0LmRpc3BsYXlOYW1lKHRydWUpfWAsIG5ldyBBZ2dyZWdhdGVFcnJvcihwdWJsaXNoZXIuZmFpbHVyZXMubWFwKGYgPT4gZi5lcnJvcikpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFsbG93Q3Jvc3NBY2NvdW50QXNzZXRQdWJsaXNoaW5nRm9yRW52KHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodGhpcy5fYWxsb3dDcm9zc0FjY291bnRBc3NldFB1Ymxpc2hpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZW52ID0gYXdhaXQgdGhpcy5lbnZzLmFjY2Vzc1N0YWNrRm9yUmVhZE9ubHlTdGFja09wZXJhdGlvbnMoc3RhY2spO1xuICAgICAgdGhpcy5fYWxsb3dDcm9zc0FjY291bnRBc3NldFB1Ymxpc2hpbmcgPSBhd2FpdCBkZXRlcm1pbmVBbGxvd0Nyb3NzQWNjb3VudEFzc2V0UHVibGlzaGluZyhlbnYuc2RrLCB0aGlzLmlvSGVscGVyLCB0aGlzLnByb3BzLnRvb2xraXRTdGFja05hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYWxsb3dDcm9zc0FjY291bnRBc3NldFB1Ymxpc2hpbmc7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgYSBzaW5nbGUgYXNzZXQgaGFzIGJlZW4gcHVibGlzaGVkIGFscmVhZHlcbiAgICovXG4gIHB1YmxpYyBhc3luYyBpc1NpbmdsZUFzc2V0UHVibGlzaGVkKFxuICAgIGFzc2V0TWFuaWZlc3Q6IGNka19hc3NldHMuQXNzZXRNYW5pZmVzdCxcbiAgICBhc3NldDogY2RrX2Fzc2V0cy5JTWFuaWZlc3RFbnRyeSxcbiAgICBvcHRpb25zOiBQdWJsaXNoU3RhY2tBc3NldHNPcHRpb25zLFxuICApIHtcbiAgICBjb25zdCBzdGFja0VudiA9IGF3YWl0IHRoaXMuZW52cy5yZXNvbHZlU3RhY2tFbnZpcm9ubWVudChvcHRpb25zLnN0YWNrKTtcbiAgICBjb25zdCBwdWJsaXNoZXIgPSB0aGlzLmNhY2hlZFB1Ymxpc2hlcihhc3NldE1hbmlmZXN0LCBzdGFja0Vudiwgb3B0aW9ucy5zdGFja05hbWUpO1xuICAgIHJldHVybiBwdWJsaXNoZXIuaXNFbnRyeVB1Ymxpc2hlZChhc3NldCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhhdCB0aGUgYm9vdHN0cmFwIHN0YWNrIGhhcyB0aGUgcmlnaHQgdmVyc2lvbiBmb3IgdGhpcyBzdGFja1xuICAgKlxuICAgKiBDYWxsIGludG8gZW52UmVzb3VyY2VzLnZhbGlkYXRlVmVyc2lvbiwgYnV0IHByZXBlbmQgdGhlIHN0YWNrIG5hbWUgaW4gY2FzZSBvZiBmYWlsdXJlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZUJvb3RzdHJhcFN0YWNrVmVyc2lvbihcbiAgICBzdGFja05hbWU6IHN0cmluZyxcbiAgICByZXF1aXJlc0Jvb3RzdHJhcFN0YWNrVmVyc2lvbjogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIGJvb3RzdHJhcFN0YWNrVmVyc2lvblNzbVBhcmFtZXRlcjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGVudlJlc291cmNlczogRW52aXJvbm1lbnRSZXNvdXJjZXMsXG4gICkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBlbnZSZXNvdXJjZXMudmFsaWRhdGVWZXJzaW9uKHJlcXVpcmVzQm9vdHN0cmFwU3RhY2tWZXJzaW9uLCBib290c3RyYXBTdGFja1ZlcnNpb25Tc21QYXJhbWV0ZXIpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignQm9vdHN0cmFwVmVyc2lvblZhbGlkYXRpb24nLCBgJHtzdGFja05hbWV9OiAke2Zvcm1hdEVycm9yTWVzc2FnZShlKX1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNhY2hlZFB1Ymxpc2hlcihhc3NldE1hbmlmZXN0OiBjZGtfYXNzZXRzLkFzc2V0TWFuaWZlc3QsIGVudjogY3hhcGkuRW52aXJvbm1lbnQsIHN0YWNrTmFtZT86IHN0cmluZykge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5wdWJsaXNoZXJDYWNoZS5nZXQoYXNzZXRNYW5pZmVzdCk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuICAgIGNvbnN0IHByZWZpeCA9IHN0YWNrTmFtZSA/IGAke2NoYWxrLmJvbGQoc3RhY2tOYW1lKX06IGAgOiAnJztcbiAgICBjb25zdCBwdWJsaXNoZXIgPSBuZXcgY2RrX2Fzc2V0cy5Bc3NldFB1Ymxpc2hpbmcoYXNzZXRNYW5pZmVzdCwge1xuICAgICAgLy8gVGhlIEFzc2V0UHVibGlzaGluZyBjbGFzcyB0YWtlcyBjYXJlIG9mIHJvbGUgYXNzdW1pbmcgZXRjLCBzbyBpdCdzIG9rYXkgdG9cbiAgICAgIC8vIGdpdmUgaXQgYSBkaXJlY3QgYFNka1Byb3ZpZGVyYC5cbiAgICAgIGF3czogbmV3IFB1Ymxpc2hpbmdBd3ModGhpcy5hc3NldFNka1Byb3ZpZGVyLCBlbnYpLFxuICAgICAgcHJvZ3Jlc3NMaXN0ZW5lcjogbmV3IFBhcmFsbGVsU2FmZUFzc2V0UHJvZ3Jlc3MocHJlZml4LCB0aGlzLmlvSGVscGVyKSxcbiAgICB9KTtcbiAgICB0aGlzLnB1Ymxpc2hlckNhY2hlLnNldChhc3NldE1hbmlmZXN0LCBwdWJsaXNoZXIpO1xuICAgIHJldHVybiBwdWJsaXNoZXI7XG4gIH1cbn1cblxuLyoqXG4gKiBBc3NldCBwcm9ncmVzcyB0aGF0IGRvZXNuJ3QgZG8gYW55dGhpbmcgd2l0aCBwZXJjZW50YWdlcyAoY3VycmVudGx5KVxuICovXG5jbGFzcyBQYXJhbGxlbFNhZmVBc3NldFByb2dyZXNzIGV4dGVuZHMgQmFzZVB1Ymxpc2hQcm9ncmVzc0xpc3RlbmVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBwcmVmaXg6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihwcmVmaXg6IHN0cmluZywgaW9IZWxwZXI6IElvSGVscGVyKSB7XG4gICAgc3VwZXIoaW9IZWxwZXIpO1xuICAgIHRoaXMucHJlZml4ID0gcHJlZml4O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldE1lc3NhZ2UodHlwZTogY2RrX2Fzc2V0cy5FdmVudFR5cGUsIGV2ZW50OiBjZGtfYXNzZXRzLklQdWJsaXNoUHJvZ3Jlc3MpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnByZWZpeH0ke3R5cGV9OiAke2V2ZW50Lm1lc3NhZ2V9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdWZmaXhXaXRoRXJyb3JzKG1zZzogc3RyaW5nLCBlcnJvcnM/OiBzdHJpbmdbXSkge1xuICByZXR1cm4gZXJyb3JzICYmIGVycm9ycy5sZW5ndGggPiAwID8gYCR7bXNnfTogJHtlcnJvcnMuam9pbignLCAnKX1gIDogbXNnO1xufVxuIl19
419
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95bWVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkZXBsb3ltZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBeUM7QUFDekMsc0RBQXNEO0FBR3RELCtCQUErQjtBQUMvQixxRUFBZ0U7QUFDaEUseURBRzRCO0FBQzVCLHVDQUttQjtBQUNuQixxQ0FBcUU7QUFFckUsaURBQTJEO0FBRzNELHNGQUFnRztBQUNoRywrREFBNEU7QUFDNUUscUNBQWdEO0FBTWhELHNEQUsyQjtBQUMzQixtRUFBNkU7QUFDN0UsZ0RBQThFO0FBRzlFLHlGQUEyRjtBQUMzRixrREFBb0c7QUFFcEcsa0RBQTZEO0FBRTdELE1BQU0sb0NBQW9DLEdBQUcsRUFBRSxDQUFDO0FBc09oRDs7OztHQUlHO0FBQ0gsTUFBYSxXQUFXO0lBNkJPO0lBNUJiLElBQUksQ0FBb0I7SUFFeEM7Ozs7Ozs7T0FPRztJQUNjLGdCQUFnQixDQUFjO0lBRS9DOzs7Ozs7O09BT0c7SUFDYyxzQkFBc0IsQ0FBYztJQUVwQyxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQXdELENBQUM7SUFFMUYsaUNBQWlDLENBQXNCO0lBRTlDLFFBQVEsQ0FBVztJQUVwQyxZQUE2QixLQUF1QjtRQUF2QixVQUFLLEdBQUwsS0FBSyxDQUFrQjtRQUNsRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztRQUMxQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztRQUNoRCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDL0IsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLCtCQUFpQixDQUMvQixLQUFLLENBQUMsV0FBVyxFQUNqQixLQUFLLENBQUMsZ0JBQWdCLElBQUkseUNBQTBCLEVBQ3BELElBQUksQ0FBQyxRQUFRLENBQ2QsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FB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QixTQUFRLDhDQUEyQjtJQUNoRCxNQUFNLENBQVM7SUFFaEMsWUFBWSxNQUFjLEVBQUUsUUFBa0I7UUFDNUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFUyxVQUFVLENBQUMsSUFBMEIsRUFBRSxLQUFrQztRQUNqRixPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLEtBQUssS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ25ELENBQUM7Q0FDRjtBQUVELFNBQVMsZ0JBQWdCLENBQUMsR0FBVyxFQUFFLE1BQWlCO0lBQ3RELE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUM1RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCAqIGFzIGNka19hc3NldHMgZnJvbSAnQGF3cy1jZGsvY2RrLWFzc2V0cy1saWInO1xuaW1wb3J0IHR5cGUgKiBhcyBjeGFwaSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1hcGknO1xuaW1wb3J0IHR5cGUgeyBEZXNjcmliZUNoYW5nZVNldENvbW1hbmRPdXRwdXQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0ICogYXMgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgQXNzZXRNYW5pZmVzdEJ1aWxkZXIgfSBmcm9tICcuL2Fzc2V0LW1hbmlmZXN0LWJ1aWxkZXInO1xuaW1wb3J0IHtcbiAgQmFzZVB1Ymxpc2hQcm9ncmVzc0xpc3RlbmVyLFxuICBQdWJsaXNoaW5nQXdzLFxufSBmcm9tICcuL2Fzc2V0LXB1Ymxpc2hpbmcnO1xuaW1wb3J0IHtcbiAgc3RhYmlsaXplU3RhY2ssXG4gIHVwbG9hZFN0YWNrVGVtcGxhdGVBc3NldHMsXG4gIHdhaXRGb3JDaGFuZ2VTZXQsXG4gIHdhaXRGb3JTdGFja0RlbGV0ZSxcbn0gZnJvbSAnLi9jZm4tYXBpJztcbmltcG9ydCB7IGRldGVybWluZUFsbG93Q3Jvc3NBY2NvdW50QXNzZXRQdWJsaXNoaW5nIH0gZnJvbSAnLi9jaGVja3MnO1xuXG5pbXBvcnQgeyBkZXBsb3lTdGFjaywgZGVzdHJveVN0YWNrIH0gZnJvbSAnLi9kZXBsb3ktc3RhY2snO1xuaW1wb3J0IHR5cGUgeyBEZXBsb3lTdGFja1Jlc3VsdCwgU3VjY2Vzc2Z1bERlcGxveVN0YWNrUmVzdWx0IH0gZnJvbSAnLi9kZXBsb3ltZW50LXJlc3VsdCc7XG5pbXBvcnQgdHlwZSB7IENoYW5nZVNldERlcGxveW1lbnQsIERlcGxveW1lbnRNZXRob2QgfSBmcm9tICcuLi8uLi9hY3Rpb25zL2RlcGxveSc7XG5pbXBvcnQgeyBERUZBVUxUX0RFUExPWV9DSEFOR0VfU0VUX05BTUUgfSBmcm9tICcuLi8uLi9hY3Rpb25zL2RlcGxveS9wcml2YXRlL2RlcGxveW1lbnQtbWV0aG9kJztcbmltcG9ydCB7IERlcGxveW1lbnRFcnJvciwgVG9vbGtpdEVycm9yIH0gZnJvbSAnLi4vLi4vdG9vbGtpdC90b29sa2l0LWVycm9yJztcbmltcG9ydCB7IGZvcm1hdEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHR5cGUgeyBTZGtQcm92aWRlciB9IGZyb20gJy4uL2F3cy1hdXRoL3ByaXZhdGUnO1xuaW1wb3J0IHR5cGUge1xuICBUZW1wbGF0ZSxcbiAgUm9vdFRlbXBsYXRlV2l0aE5lc3RlZFN0YWNrcyxcbn0gZnJvbSAnLi4vY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHtcbiAgQ2xvdWRGb3JtYXRpb25TdGFjayxcbiAgbG9hZEN1cnJlbnRUZW1wbGF0ZSxcbiAgbG9hZEN1cnJlbnRUZW1wbGF0ZVdpdGhOZXN0ZWRTdGFja3MsXG4gIG1ha2VCb2R5UGFyYW1ldGVyLFxufSBmcm9tICcuLi9jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBDbG91ZEZvcm1hdGlvblN0YWNrRGlhZ25vc2VyIH0gZnJvbSAnLi4vZGlhZ25vc2luZy9zdGFjay1kaWFnbm9zZXInO1xuaW1wb3J0IHsgdHlwZSBFbnZpcm9ubWVudFJlc291cmNlcywgRW52aXJvbm1lbnRBY2Nlc3MgfSBmcm9tICcuLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgdHlwZSB7IElvSGVscGVyIH0gZnJvbSAnLi4vaW8vcHJpdmF0ZSc7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlSWRlbnRpZmllclN1bW1hcmllcywgUmVzb3VyY2VzVG9JbXBvcnQgfSBmcm9tICcuLi9yZXNvdXJjZS1pbXBvcnQnO1xuaW1wb3J0IHsgU3RhY2tBcnRpZmFjdFNvdXJjZVRyYWNlciB9IGZyb20gJy4uL3NvdXJjZS10cmFjaW5nL3ByaXZhdGUvc3RhY2stc291cmNlLXRyYWNpbmcnO1xuaW1wb3J0IHsgU3RhY2tBY3Rpdml0eU1vbml0b3IsIFN0YWNrRXZlbnRQb2xsZXIsIFJvbGxiYWNrQ2hvaWNlLCBQb2xsUmFuZ2UgfSBmcm9tICcuLi9zdGFjay1ldmVudHMnO1xuaW1wb3J0IHR5cGUgeyBUYWcgfSBmcm9tICcuLi90YWdzJztcbmltcG9ydCB7IERFRkFVTFRfVE9PTEtJVF9TVEFDS19OQU1FIH0gZnJvbSAnLi4vdG9vbGtpdC1pbmZvJztcblxuY29uc3QgQk9PVFNUUkFQX1NUQUNLX1ZFUlNJT05fRk9SX1JPTExCQUNLID0gMjM7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVwbG95U3RhY2tPcHRpb25zIHtcbiAgLyoqXG4gICAqIFN0YWNrIHRvIGRlcGxveVxuICAgKi9cbiAgcmVhZG9ubHkgc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdDtcblxuICAvKipcbiAgICogRXhlY3V0aW9uIHJvbGUgZm9yIHRoZSBkZXBsb3ltZW50IChwYXNzIHRocm91Z2ggdG8gQ2xvdWRGb3JtYXRpb24pXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQ3VycmVudCByb2xlXG4gICAqL1xuICByZWFkb25seSByb2xlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUb3BpYyBBUk5zIHRvIHNlbmQgYSBtZXNzYWdlIHdoZW4gZGVwbG95bWVudCBmaW5pc2hlcyAocGFzcyB0aHJvdWdoIHRvIENsb3VkRm9ybWF0aW9uKVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIG5vdGlmaWNhdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IG5vdGlmaWNhdGlvbkFybnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogT3ZlcnJpZGUgbmFtZSB1bmRlciB3aGljaCBzdGFjayB3aWxsIGJlIGRlcGxveWVkXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVXNlIGFydGlmYWN0IGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHRvb2xraXQgc3RhY2ssIGlmIG5vdCB0aGUgZGVmYXVsdCBuYW1lXG4gICAqXG4gICAqIEBkZWZhdWx0ICdDREtUb29sa2l0J1xuICAgKi9cbiAgcmVhZG9ubHkgdG9vbGtpdFN0YWNrTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogTGlzdCBvZiBhc3NldCBJRHMgd2hpY2ggc2hvdWxkIE5PVCBiZSBidWlsdCBvciB1cGxvYWRlZFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEJ1aWxkIGFsbCBhc3NldHNcbiAgICovXG4gIHJlYWRvbmx5IHJldXNlQXNzZXRzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFN0YWNrIHRhZ3MgKHBhc3MgdGhyb3VnaCB0byBDbG91ZEZvcm1hdGlvbilcbiAgICovXG4gIHJlYWRvbmx5IHRhZ3M/OiBUYWdbXTtcblxuICAvKipcbiAgICogU2VsZWN0IHRoZSBkZXBsb3ltZW50IG1ldGhvZCAoZGlyZWN0IG9yIHVzaW5nIGEgY2hhbmdlIHNldClcbiAgICpcbiAgICogQGRlZmF1bHQgLSBDaGFuZ2Ugc2V0IHdpdGggZGVmYXVsdCBvcHRpb25zXG4gICAqL1xuICByZWFkb25seSBkZXBsb3ltZW50TWV0aG9kPzogRGVwbG95bWVudE1ldGhvZDtcblxuICAvKipcbiAgICogRm9yY2UgZGVwbG95bWVudCwgZXZlbiBpZiB0aGUgZGVwbG95ZWQgdGVtcGxhdGUgaXMgaWRlbnRpY2FsIHRvIHRoZSBvbmUgd2UgYXJlIGFib3V0IHRvIGRlcGxveS5cbiAgICogQGRlZmF1bHQgZmFsc2UgZGVwbG95bWVudCB3aWxsIGJlIHNraXBwZWQgaWYgdGhlIHRlbXBsYXRlIGlzIGlkZW50aWNhbFxuICAgKi9cbiAgcmVhZG9ubHkgZm9yY2VEZXBsb3ltZW50PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRXh0cmEgcGFyYW1ldGVycyBmb3IgQ2xvdWRGb3JtYXRpb25cbiAgICogQGRlZmF1bHQgLSBObyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHRlbXBsYXRlXG4gICAqL1xuICByZWFkb25seSBwYXJhbWV0ZXJzPzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkIH07XG5cbiAgLyoqXG4gICAqIFVzZSBwcmV2aW91cyB2YWx1ZXMgZm9yIHVuc3BlY2lmaWVkIHBhcmFtZXRlcnNcbiAgICpcbiAgICogSWYgbm90IHNldCwgYWxsIHBhcmFtZXRlcnMgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIGV2ZXJ5IGRlcGxveW1lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHVzZVByZXZpb3VzUGFyYW1ldGVycz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFJvbGxiYWNrIGZhaWxlZCBkZXBsb3ltZW50c1xuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSByb2xsYmFjaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBleHRyYSBzdHJpbmcgdG8gYXBwZW5kIHRvIHRoZSBVc2VyLUFnZW50IGhlYWRlciB3aGVuIHBlcmZvcm1pbmcgQVdTIFNESyBjYWxscy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBOb3RoaW5nIGV4dHJhIGlzIGFwcGVuZGVkIHRvIHRoZSBVc2VyLUFnZW50IGhlYWRlclxuICAgKi9cbiAgcmVhZG9ubHkgZXh0cmFVc2VyQWdlbnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgZXhpc3RpbmcgcmVzb3VyY2VzIHRvIGJlIElNUE9SVEVEIGludG8gdGhlIHN0YWNrLCBpbnN0ZWFkIG9mIGJlaW5nIENSRUFURURcbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlc1RvSW1wb3J0PzogUmVzb3VyY2VzVG9JbXBvcnQ7XG5cbiAgLyoqXG4gICAqIElmIHByZXNlbnQsIHVzZSB0aGlzIGdpdmVuIHRlbXBsYXRlIGluc3RlYWQgb2YgdGhlIHN0b3JlZCBvbmVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBVc2UgdGhlIHN0b3JlZCB0ZW1wbGF0ZVxuICAgKi9cbiAgcmVhZG9ubHkgb3ZlcnJpZGVUZW1wbGF0ZT86IGFueTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBidWlsZC9wdWJsaXNoIGFzc2V0cyBpbiBwYXJhbGxlbFxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlIFRvIHJlbWFpbiBiYWNrd2FyZCBjb21wYXRpYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXNzZXRQYXJhbGxlbGlzbT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJlcGFyZVN0YWNrT3B0aW9ucyBleHRlbmRzIE9taXQ8RGVwbG95U3RhY2tPcHRpb25zLCAnZGVwbG95bWVudE1ldGhvZCc+IHtcbiAgLyoqXG4gICAqIFRoZSBjaGFuZ2Utc2V0IGRlcGxveW1lbnQgbWV0aG9kIHRvIHVzZS5cbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveW1lbnRNZXRob2Q6IENoYW5nZVNldERlcGxveW1lbnQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gY2xlYW4gdXAgdGhlIGNoYW5nZSBzZXQgaWYgaXQgaGFzIG5vIGNoYW5nZXMuXG4gICAqXG4gICAqIFNldCB0byB0cnVlIHdoZW4gdGhlIGNhbGxlciBmb3JjZWQgZXhlY3V0ZTogZmFsc2UgaW50ZXJuYWxseVxuICAgKiAodHdvLXBoYXNlIGRlcGxveSkuIFNldCB0byBmYWxzZSB3aGVuIHRoZSB1c2VyIGV4cGxpY2l0bHlcbiAgICogYXNrZWQgZm9yIC0tbm8tZXhlY3V0ZSAocHJlcGFyZS1jaGFuZ2Utc2V0KS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGNsZWFudXBPbk5vT3A/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvbGxiYWNrU3RhY2tPcHRpb25zIHtcbiAgLyoqXG4gICAqIFN0YWNrIHRvIHJvbGwgYmFja1xuICAgKi9cbiAgcmVhZG9ubHkgc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdDtcblxuICAvKipcbiAgICogRXhlY3V0aW9uIHJvbGUgZm9yIHRoZSBkZXBsb3ltZW50IChwYXNzIHRocm91Z2ggdG8gQ2xvdWRGb3JtYXRpb24pXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQ3VycmVudCByb2xlXG4gICAqL1xuICByZWFkb25seSByb2xlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSB0b29sa2l0IHN0YWNrLCBpZiBub3QgdGhlIGRlZmF1bHQgbmFtZVxuICAgKlxuICAgKiBAZGVmYXVsdCAnQ0RLVG9vbGtpdCdcbiAgICovXG4gIHJlYWRvbmx5IHRvb2xraXRTdGFja05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBvcnBoYW4gYWxsIGZhaWxlZCByZXNvdXJjZXMgZHVyaW5nIHRoZSByb2xsYmFja1xuICAgKlxuICAgKiBUaGlzIHdpbGwgZm9yY2UgYSByb2xsYmFjayB0aGF0IG90aGVyd2lzZSB3b3VsZCBoYXZlIGZhaWxlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IG9ycGhhbkZhaWxlZFJlc291cmNlcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE9ycGhhbiB0aGUgcmVzb3VyY2VzIHdpdGggdGhlIGdpdmVuIGxvZ2ljYWwgSURzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gb3JwaGFuaW5nXG4gICAqL1xuICByZWFkb25seSBvcnBoYW5Mb2dpY2FsSWRzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdmFsaWRhdGUgdGhlIHZlcnNpb24gb2YgdGhlIGJvb3RzdHJhcCBzdGFjayBwZXJtaXNzaW9uc1xuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSB2YWxpZGF0ZUJvb3RzdHJhcFN0YWNrVmVyc2lvbj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIFJvbGxiYWNrU3RhY2tSZXN1bHQgPSB7IHJlYWRvbmx5IHN0YWNrQXJuOiBzdHJpbmcgfSAmIChcbiAgfCB7IHJlYWRvbmx5IG5vdEluUm9sbGJhY2thYmxlU3RhdGU6IHRydWUgfVxuICB8IHsgcmVhZG9ubHkgc3VjY2VzczogdHJ1ZTsgbm90SW5Sb2xsYmFja2FibGVTdGF0ZT86IHVuZGVmaW5lZCB9XG4pO1xuXG5pbnRlcmZhY2UgQXNzZXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFN0YWNrIHdpdGggYXNzZXRzIHRvIGJ1aWxkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdDtcblxuICAvKipcbiAgICogRXhlY3V0aW9uIHJvbGUgZm9yIHRoZSBidWlsZGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBDdXJyZW50IHJvbGVcbiAgICovXG4gIHJlYWRvbmx5IHJvbGVBcm4/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRTdGFja0Fzc2V0c09wdGlvbnMgZXh0ZW5kcyBBc3NldE9wdGlvbnMge1xuICAvKipcbiAgICogU3RhY2sgbmFtZSB0aGlzIGFzc2V0IGlzIGZvclxuICAgKi9cbiAgcmVhZG9ubHkgc3RhY2tOYW1lPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUHVibGlzaFN0YWNrQXNzZXRzT3B0aW9ucyBleHRlbmRzIEFzc2V0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTdGFjayBuYW1lIHRoaXMgYXNzZXQgaXMgZm9yXG4gICAqL1xuICByZWFkb25seSBzdGFja05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFsd2F5cyBwdWJsaXNoLCBldmVuIGlmIGl0IGFscmVhZHkgZXhpc3RzXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBmb3JjZVB1Ymxpc2g/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlc3Ryb3lTdGFja09wdGlvbnMge1xuICBzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuICBkZXBsb3lOYW1lPzogc3RyaW5nO1xuICByb2xlQXJuPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YWNrRXhpc3RzT3B0aW9ucyB7XG4gIHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Q7XG4gIGRlcGxveU5hbWU/OiBzdHJpbmc7XG4gIHRyeUxvb2t1cFJvbGU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlcGxveW1lbnRzUHJvcHMge1xuICByZWFkb25seSBzZGtQcm92aWRlcjogU2RrUHJvdmlkZXI7XG4gIHJlYWRvbmx5IHRvb2xraXRTdGFja05hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGlvSGVscGVyOiBJb0hlbHBlcjtcbn1cblxuLyoqXG4gKiBTY29wZSBmb3IgYSBzaW5nbGUgc2V0IG9mIGRlcGxveW1lbnRzIGZyb20gYSBzZXQgb2YgQ2xvdWQgQXNzZW1ibHkgQXJ0aWZhY3RzXG4gKlxuICogTWFuYWdlcyBsb29rdXAgb2YgU0RLcywgQm9vdHN0cmFwIHN0YWNrcywgZXRjLlxuICovXG5leHBvcnQgY2xhc3MgRGVwbG95bWVudHMge1xuICBwdWJsaWMgcmVhZG9ubHkgZW52czogRW52aXJvbm1lbnRBY2Nlc3M7XG5cbiAgLyoqXG4gICAqIFNESyBwcm92aWRlciBmb3IgYXNzZXQgcHVibGlzaGluZyAoZG8gbm90IHVzZSBmb3IgYW55dGhpbmcgZWxzZSkuXG4gICAqXG4gICAqIFRoaXMgU0RLIHByb3ZpZGVyIGlzIG9ubHkgYWxsb3dlZCB0byBiZSB1c2VkIGZvciB0aGF0IHB1cnBvc2UsIG5vdGhpbmcgZWxzZS5cbiAgICpcbiAgICogSXQncyBub3QgYSBkaWZmZXJlbnQgb2JqZWN0LCBidXQgdGhlIGZpZWxkIG5hbWUgc2hvdWxkIGltcGx5IHRoYXQgdGhpc1xuICAgKiBvYmplY3Qgc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5LCBleGNlcHQgdG8gcGFzcyB0byBhc3NldCBoYW5kbGluZyByb3V0aW5lcy5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgYXNzZXRTZGtQcm92aWRlcjogU2RrUHJvdmlkZXI7XG5cbiAgLyoqXG4gICAqIFNESyBwcm92aWRlciBmb3IgcGFzc2luZyB0byBkZXBsb3lTdGFja1xuICAgKlxuICAgKiBUaGlzIFNESyBwcm92aWRlciBpcyBvbmx5IGFsbG93ZWQgdG8gYmUgdXNlZCBmb3IgdGhhdCBwdXJwb3NlLCBub3RoaW5nIGVsc2UuXG4gICAqXG4gICAqIEl0J3Mgbm90IGEgZGlmZmVyZW50IG9iamVjdCwgYnV0IHRoZSBmaWVsZCBuYW1lIHNob3VsZCBpbXBseSB0aGF0IHRoaXNcbiAgICogb2JqZWN0IHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseSwgZXhjZXB0IHRvIHBhc3MgdG8gYGRlcGxveVN0YWNrYC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVwbG95U3RhY2tTZGtQcm92aWRlcjogU2RrUHJvdmlkZXI7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwdWJsaXNoZXJDYWNoZSA9IG5ldyBNYXA8Y2RrX2Fzc2V0cy5Bc3NldE1hbmlmZXN0LCBjZGtfYXNzZXRzLkFzc2V0UHVibGlzaGluZz4oKTtcblxuICBwcml2YXRlIF9hbGxvd0Nyb3NzQWNjb3VudEFzc2V0UHVibGlzaGluZzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGlvSGVscGVyOiBJb0hlbHBlcjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBEZXBsb3ltZW50c1Byb3BzKSB7XG4gICAgdGhpcy5hc3NldFNka1Byb3ZpZGVyID0gcHJvcHMuc2RrUHJvdmlkZXI7XG4gICAgdGhpcy5kZXBsb3lTdGFja1Nka1Byb3ZpZGVyID0gcHJvcHMuc2RrUHJvdmlkZXI7XG4gICAgdGhpcy5pb0hlbHBlciA9IHByb3BzLmlvSGVscGVyO1xuICAgIHRoaXMuZW52cyA9IG5ldyBFbnZpcm9ubWVudEFjY2VzcyhcbiAgICAgIHByb3BzLnNka1Byb3ZpZGVyLFxuICAgICAgcHJvcHMudG9vbGtpdFN0YWNrTmFtZSA/PyBERUZBVUxUX1RPT0xLSVRfU1RBQ0tfTkFNRSxcbiAgICAgIHRoaXMuaW9IZWxwZXIsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgZW52aXJvbm1lbnQgZm9yIGEgc3RhY2suXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVzb2x2ZUVudmlyb25tZW50KHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QpOiBQcm9taXNlPGN4YXBpLkVudmlyb25tZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuZW52cy5yZXNvbHZlU3RhY2tFbnZpcm9ubWVudChzdGFjayk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVhZEN1cnJlbnRUZW1wbGF0ZVdpdGhOZXN0ZWRTdGFja3MoXG4gICAgcm9vdFN0YWNrQXJ0aWZhY3Q6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCxcbiAgICByZXRyaWV2ZVByb2Nlc3NlZFRlbXBsYXRlOiBib29sZWFuID0gZmFsc2UsXG4gICk6IFByb21pc2U8Um9vdFRlbXBsYXRlV2l0aE5lc3RlZFN0YWNrcz4ge1xuICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0Zvckxvb2t1cEJlc3RFZmZvcnQocm9vdFN0YWNrQXJ0aWZhY3QpO1xuICAgIHJldHVybiBsb2FkQ3VycmVudFRlbXBsYXRlV2l0aE5lc3RlZFN0YWNrcyhyb290U3RhY2tBcnRpZmFjdCwgZW52LnNkaywgcmV0cmlldmVQcm9jZXNzZWRUZW1wbGF0ZSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVhZEN1cnJlbnRUZW1wbGF0ZShzdGFja0FydGlmYWN0OiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QpOiBQcm9taXNlPFRlbXBsYXRlPiB7XG4gICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5kZWJ1ZyhgUmVhZGluZyBleGlzdGluZyB0ZW1wbGF0ZSBmb3Igc3RhY2sgJHtzdGFja0FydGlmYWN0LmRpc3BsYXlOYW1lfS5gKTtcbiAgICBjb25zdCBlbnYgPSBhd2FpdCB0aGlzLmVudnMuYWNjZXNzU3RhY2tGb3JMb29rdXBCZXN0RWZmb3J0KHN0YWNrQXJ0aWZhY3QpO1xuICAgIHJldHVybiBsb2FkQ3VycmVudFRlbXBsYXRlKHN0YWNrQXJ0aWZhY3QsIGVudi5zZGspO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHJlc291cmNlSWRlbnRpZmllclN1bW1hcmllcyhcbiAgICBzdGFja0FydGlmYWN0OiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QsXG4gICk6IFByb21pc2U8UmVzb3VyY2VJZGVudGlmaWVyU3VtbWFyaWVzPiB7XG4gICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy5kZWJ1ZyhgUmV0cmlldmluZyB0ZW1wbGF0ZSBzdW1tYXJ5IGZvciBzdGFjayAke3N0YWNrQXJ0aWZhY3QuZGlzcGxheU5hbWV9LmApO1xuICAgIC8vIEN1cnJlbnRseSwgbmVlZHMgdG8gdXNlIGBkZXBsb3ktcm9sZWAgc2luY2UgaXQgbWF5IG5lZWQgdG8gcmVhZCB0ZW1wbGF0ZXMgaW4gdGhlIHN0YWdpbmdcbiAgICAvLyBidWNrZXQgd2hpY2ggaGF2ZSBiZWVuIGVuY3J5cHRlZCB3aXRoIGEgS01TIGtleSAoYW5kIGxvb2t1cC1yb2xlIG1heSBub3QgcmVhZCBlbmNyeXB0ZWQgdGhpbmdzKVxuICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0ZvclJlYWRPbmx5U3RhY2tPcGVyYXRpb25zKHN0YWNrQXJ0aWZhY3QpO1xuICAgIGNvbnN0IGNmbiA9IGVudi5zZGsuY2xvdWRGb3JtYXRpb24oKTtcblxuICAgIGF3YWl0IHVwbG9hZFN0YWNrVGVtcGxhdGVBc3NldHMoc3RhY2tBcnRpZmFjdCwgdGhpcyk7XG5cbiAgICAvLyBVcGxvYWQgdGhlIHRlbXBsYXRlLCBpZiBuZWNlc3NhcnksIGJlZm9yZSBwYXNzaW5nIGl0IHRvIENGTlxuICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQXNzZXRNYW5pZmVzdEJ1aWxkZXIoKTtcbiAgICBjb25zdCBjZm5QYXJhbSA9IGF3YWl0IG1ha2VCb2R5UGFyYW1ldGVyKFxuICAgICAgdGhpcy5pb0hlbHBlcixcbiAgICAgIHN0YWNrQXJ0aWZhY3QsXG4gICAgICBlbnYucmVzb2x2ZWRFbnZpcm9ubWVudCxcbiAgICAgIGJ1aWxkZXIsXG4gICAgICBlbnYucmVzb3VyY2VzLFxuICAgICk7XG5cbiAgICAvLyBJZiB0aGUgYG1ha2VCb2R5UGFyYW1ldGVyYCBiZWZvcmUgdGhpcyBhZGRlZCBhc3NldHMsIG1ha2Ugc3VyZSB0byBwdWJsaXNoIHRoZW0gYmVmb3JlXG4gICAgLy8gY2FsbGluZyB0aGUgQVBJLlxuICAgIGNvbnN0IGFkZGVkQXNzZXRzID0gYnVpbGRlci50b01hbmlmZXN0KHN0YWNrQXJ0aWZhY3QuYXNzZW1ibHkuZGlyZWN0b3J5KTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGFkZGVkQXNzZXRzLmVudHJpZXMpIHtcbiAgICAgIGF3YWl0IHRoaXMuYnVpbGRTaW5nbGVBc3NldCgnbm8tdmVyc2lvbi12YWxpZGF0aW9uJywgYWRkZWRBc3NldHMsIGVudHJ5LCB7XG4gICAgICAgIHN0YWNrOiBzdGFja0FydGlmYWN0LFxuICAgICAgfSk7XG4gICAgICBhd2FpdCB0aGlzLnB1Ymxpc2hTaW5nbGVBc3NldChhZGRlZEFzc2V0cywgZW50cnksIHtcbiAgICAgICAgc3RhY2s6IHN0YWNrQXJ0aWZhY3QsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNmbi5nZXRUZW1wbGF0ZVN1bW1hcnkoY2ZuUGFyYW0pO1xuICAgIGlmICghcmVzcG9uc2UuUmVzb3VyY2VJZGVudGlmaWVyU3VtbWFyaWVzKSB7XG4gICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmRlYnVnKCdHZXRUZW1wbGF0ZVN1bW1hcnkgQVBJIGNhbGwgZGlkIG5vdCByZXR1cm4gXCJSZXNvdXJjZUlkZW50aWZpZXJTdW1tYXJpZXNcIicpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2UuUmVzb3VyY2VJZGVudGlmaWVyU3VtbWFyaWVzID8/IFtdO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGRlcGxveVN0YWNrKG9wdGlvbnM6IERlcGxveVN0YWNrT3B0aW9ucyk6IFByb21pc2U8RGVwbG95U3RhY2tSZXN1bHQ+IHtcbiAgICBjb25zdCBlbnYgPSBhd2FpdCB0aGlzLmVudnMuYWNjZXNzU3RhY2tGb3JNdXRhYmxlU3RhY2tPcGVyYXRpb25zKG9wdGlvbnMuc3RhY2spO1xuXG4gICAgLy8gRG8gYSB2ZXJpZmljYXRpb24gb2YgdGhlIGJvb3RzdHJhcCBzdGFjayB2ZXJzaW9uXG4gICAgYXdhaXQgdGhpcy52YWxpZGF0ZUJvb3RzdHJhcFN0YWNrVmVyc2lvbihcbiAgICAgIG9wdGlvbnMuc3RhY2suc3RhY2tOYW1lLFxuICAgICAgb3B0aW9ucy5zdGFjay5yZXF1aXJlc0Jvb3RzdHJhcFN0YWNrVmVyc2lvbixcbiAgICAgIG9wdGlvbnMuc3RhY2suYm9vdHN0cmFwU3RhY2tWZXJzaW9uU3NtUGFyYW1ldGVyLFxuICAgICAgZW52LnJlc291cmNlcyk7XG5cbiAgICBjb25zdCBleGVjdXRpb25Sb2xlQXJuID0gYXdhaXQgZW52LnJlcGxhY2VQbGFjZWhvbGRlcnMob3B0aW9ucy5yb2xlQXJuID8/IG9wdGlvbnMuc3RhY2suY2xvdWRGb3JtYXRpb25FeGVjdXRpb25Sb2xlQXJuKTtcblxuICAgIHJldHVybiBkZXBsb3lTdGFjayh7XG4gICAgICBzdGFjazogb3B0aW9ucy5zdGFjayxcbiAgICAgIHJlc29sdmVkRW52aXJvbm1lbnQ6IGVudi5yZXNvbHZlZEVudmlyb25tZW50LFxuICAgICAgZGVwbG95TmFtZTogb3B0aW9ucy5kZXBsb3lOYW1lLFxuICAgICAgbm90aWZpY2F0aW9uQXJuczogb3B0aW9ucy5ub3RpZmljYXRpb25Bcm5zLFxuICAgICAgc2RrOiBlbnYuc2RrLFxuICAgICAgc2RrUHJvdmlkZXI6IHRoaXMuZGVwbG95U3RhY2tTZGtQcm92aWRlcixcbiAgICAgIHJvbGVBcm46IGV4ZWN1dGlvblJvbGVBcm4sXG4gICAgICByZXVzZUFzc2V0czogb3B0aW9ucy5yZXVzZUFzc2V0cyxcbiAgICAgIGVudlJlc291cmNlczogZW52LnJlc291cmNlcyxcbiAgICAgIHRhZ3M6IG9wdGlvbnMudGFncyxcbiAgICAgIGRlcGxveW1lbnRNZXRob2Q6IG9wdGlvbnMuZGVwbG95bWVudE1ldGhvZCxcbiAgICAgIGZvcmNlRGVwbG95bWVudDogb3B0aW9ucy5mb3JjZURlcGxveW1lbnQsXG4gICAgICBwYXJhbWV0ZXJzOiBvcHRpb25zLnBhcmFtZXRlcnMsXG4gICAgICB1c2VQcmV2aW91c1BhcmFtZXRlcnM6IG9wdGlvbnMudXNlUHJldmlvdXNQYXJhbWV0ZXJzLFxuICAgICAgcm9sbGJhY2s6IG9wdGlvbnMucm9sbGJhY2ssXG4gICAgICBleHRyYVVzZXJBZ2VudDogb3B0aW9ucy5leHRyYVVzZXJBZ2VudCxcbiAgICAgIHJlc291cmNlc1RvSW1wb3J0OiBvcHRpb25zLnJlc291cmNlc1RvSW1wb3J0LFxuICAgICAgb3ZlcnJpZGVUZW1wbGF0ZTogb3B0aW9ucy5vdmVycmlkZVRlbXBsYXRlLFxuICAgICAgYXNzZXRQYXJhbGxlbGlzbTogb3B0aW9ucy5hc3NldFBhcmFsbGVsaXNtLFxuICAgICAgZGlhZ25vc2VyOiBuZXcgQ2xvdWRGb3JtYXRpb25TdGFja0RpYWdub3Nlcih7XG4gICAgICAgIHNkazogZW52LnNkayxcbiAgICAgICAgZW52UmVzb3VyY2VzOiBlbnYucmVzb3VyY2VzLFxuICAgICAgICBzb3VyY2VUcmFjZXI6IG5ldyBTdGFja0FydGlmYWN0U291cmNlVHJhY2VyKG9wdGlvbnMuc3RhY2spLFxuICAgICAgICBpb0hlbHBlcjogdGhpcy5pb0hlbHBlcixcbiAgICAgICAgdG9wTGV2ZWxTdGFja0hpZXJhcmNoaWNhbElkOiBvcHRpb25zLnN0YWNrLmhpZXJhcmNoaWNhbElkLFxuICAgICAgfSksXG4gICAgfSwgdGhpcy5pb0hlbHBlcik7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgY2hhbmdlIHNldCBmb3IgYSBzdGFjayB3aXRob3V0IGV4ZWN1dGluZyBpdC5cbiAgICpcbiAgICogUmV0dXJucyB0aGUgcmVzdWx0IGlmIHRoZSBjaGFuZ2Ugc2V0IHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCwgb3IgdW5kZWZpbmVkXG4gICAqIGlmIHRoZSBwcmVwYXJlIHJldHVybmVkIGEgbm9uLXN1Y2Nlc3MgcmVzdWx0IChlLmcuIHJvbGxiYWNrIG5lZWRlZCkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHJlcGFyZVN0YWNrKFxuICAgIG9wdGlvbnM6IFByZXBhcmVTdGFja09wdGlvbnMsXG4gICk6IFByb21pc2U8U3VjY2Vzc2Z1bERlcGxveVN0YWNrUmVzdWx0IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5kZXBsb3lTdGFjayh7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgZGVwbG95bWVudE1ldGhvZDogeyAuLi5vcHRpb25zLmRlcGxveW1lbnRNZXRob2QsIGV4ZWN1dGU6IGZhbHNlIH0sXG4gICAgfSk7XG5cbiAgICAvLyBXaXRoIGV4ZWN1dGU6IGZhbHNlLCB0aGUgb25seSBwb3NzaWJsZSByZXN1bHQgdHlwZSBpcyBkaWQtZGVwbG95LXN0YWNrXG4gICAgLy8gKGVpdGhlciBub09wIGZvciBlbXB0eSBjaGFuZ2Ugc2V0cywgb3Igd2l0aCBhIGNoYW5nZVNldCBkZXNjcmlwdGlvbikuXG4gICAgLy8gUm9sbGJhY2svcmVwbGFjZW1lbnQgY2hlY2tzIGFyZSBvbmx5IHJlYWNoZWQgd2hlbiBleGVjdXRpbmcuXG4gICAgaWYgKHJlc3VsdC50eXBlICE9PSAnZGlkLWRlcGxveS1zdGFjaycpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gdXAgZW1wdHkgY2hhbmdlIHNldHMgaWYgcmVxdWVzdGVkIChpLmUuIHdoZW4gdGhlIGNhbGxlciBmb3JjZWRcbiAgICAvLyBleGVjdXRlOiBmYWxzZSBpbnRlcm5hbGx5LCBub3Qgd2hlbiB0aGUgdXNlciBleHBsaWNpdGx5IGFza2VkIGZvciAtLW5vLWV4ZWN1dGUpLlxuICAgIGlmIChyZXN1bHQubm9PcCAmJiBvcHRpb25zLmNsZWFudXBPbk5vT3ApIHtcbiAgICAgIGNvbnN0IGNoYW5nZVNldE5hbWUgPSBvcHRpb25zLmRlcGxveW1lbnRNZXRob2QuY2hhbmdlU2V0TmFtZSA/PyBERUZBVUxUX0RFUExPWV9DSEFOR0VfU0VUX05BTUU7XG4gICAgICBhd2FpdCB0aGlzLmNsZWFudXBDaGFuZ2VTZXQob3B0aW9ucy5zdGFjaywgY2hhbmdlU2V0TmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbiB1cCBhIGNoYW5nZSBzZXQgdGhhdCB3YXMgY3JlYXRlZCBieSBwcmVwYXJlU3RhY2sgYnV0IG5ldmVyIGV4ZWN1dGVkLlxuICAgKiBJZiB0aGUgc3RhY2sgd2FzIGNyZWF0ZWQgaW4gUkVWSUVXX0lOX1BST0dSRVNTIHN0YXRlIChuZXcgc3RhY2spLCBkZWxldGUgdGhlIHN0YWNrIHRvby5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjbGVhbnVwQ2hhbmdlU2V0KHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QsIGNoYW5nZVNldE5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0Zvck11dGFibGVTdGFja09wZXJhdGlvbnMoc3RhY2spO1xuICAgIGNvbnN0IGNmbiA9IGVudi5zZGsuY2xvdWRGb3JtYXRpb24oKTtcbiAgICBjb25zdCBkZXBsb3lOYW1lID0gc3RhY2suc3RhY2tOYW1lO1xuXG4gICAgY29uc3QgY2xvdWRGb3JtYXRpb25TdGFjayA9IGF3YWl0IENsb3VkRm9ybWF0aW9uU3RhY2subG9va3VwKGNmbiwgZGVwbG95TmFtZSk7XG4gICAgaWYgKCFjbG91ZEZvcm1hdGlvblN0YWNrLmV4aXN0cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IGNmbi5kZWxldGVDaGFuZ2VTZXQoeyBTdGFja05hbWU6IGRlcGxveU5hbWUsIENoYW5nZVNldE5hbWU6IGNoYW5nZVNldE5hbWUgfSk7XG5cbiAgICAvLyBJZiB0aGUgc3RhY2sgd2FzIG5ld2x5IGNyZWF0ZWQgZm9yIHRoaXMgY2hhbmdlIHNldCwgaXQgd2lsbCBiZSBpbiBSRVZJRVdfSU5fUFJPR1JFU1MuXG4gICAgLy8gRGVsZXRlIGl0IGFuZCB3YWl0IGZvciB0aGUgZGVsZXRpb24gdG8gY29tcGxldGUgc28gd2UgZG9uJ3QgbGVhdmUgYW4gZW1wdHkgc3RhY2sgYmVoaW5kLlxuICAgIGlmIChjbG91ZEZvcm1hdGlvblN0YWNrLnN0YWNrU3RhdHVzLm5hbWUgPT09ICdSRVZJRVdfSU5fUFJPR1JFU1MnKSB7XG4gICAgICBhd2FpdCBjZm4uZGVsZXRlU3RhY2soeyBTdGFja05hbWU6IGRlcGxveU5hbWUsIENsaWVudFJlcXVlc3RUb2tlbjogcmFuZG9tVVVJRCgpIH0pO1xuICAgICAgYXdhaXQgd2FpdEZvclN0YWNrRGVsZXRlKGNmbiwgdGhpcy5pb0hlbHBlciwgZGVwbG95TmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlc2NyaWJlIGEgc3BlY2lmaWMgY2hhbmdlIHNldCBmb3IgYSBzdGFjay5cbiAgICpcbiAgICogQHBhcmFtIHN0YWNrIC0gVGhlIFN0YWNrIGFydGlmYWN0XG4gICAqIEBwYXJhbSBjaGFuZ2VTZXROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGNoYW5nZSBzZXRcbiAgICogQHBhcmFtIHN0YWNrQXJuIC0gT3B0aW9uYWwgdGhlIGV4YWN0IGFybiBvZiB0aGUgc3RhY2suIFByZWZlciB0aGlzIGlmIHlvdSBoYXZlIGl0IGF2YWlsYWJsZS5cbiAgICogQHJldHVybnMgdGhlIERlc2NyaWJlQ2hhbmdlU2V0IHJlc3BvbnNlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVzY3JpYmVDaGFuZ2VTZXQoXG4gICAgc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCxcbiAgICBjaGFuZ2VTZXROYW1lOiBzdHJpbmcsXG4gICAgc3RhY2tBcm4/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8RGVzY3JpYmVDaGFuZ2VTZXRDb21tYW5kT3V0cHV0PiB7XG4gICAgY29uc3QgZW52ID0gYXdhaXQgdGhpcy5lbnZzLmFjY2Vzc1N0YWNrRm9yTXV0YWJsZVN0YWNrT3BlcmF0aW9ucyhzdGFjayk7XG4gICAgY29uc3QgY2ZuID0gZW52LnNkay5jbG91ZEZvcm1hdGlvbigpO1xuICAgIHJldHVybiB3YWl0Rm9yQ2hhbmdlU2V0KGNmbiwgdGhpcy5pb0hlbHBlciwgc3RhY2tBcm4gPz8gc3RhY2suc3RhY2tOYW1lLCBjaGFuZ2VTZXROYW1lLCB7XG4gICAgICBmZXRjaEFsbDogdHJ1ZSxcbiAgICAgIGRpYWdub3NlcjogbmV3IENsb3VkRm9ybWF0aW9uU3RhY2tEaWFnbm9zZXIoe1xuICAgICAgICBzZGs6IGVudi5zZGssXG4gICAgICAgIGVudlJlc291cmNlczogZW52LnJlc291cmNlcyxcbiAgICAgICAgc291cmNlVHJhY2VyOiBuZXcgU3RhY2tBcnRpZmFjdFNvdXJjZVRyYWNlcihzdGFjayksXG4gICAgICAgIGlvSGVscGVyOiB0aGlzLmlvSGVscGVyLFxuICAgICAgICB0b3BMZXZlbFN0YWNrSGllcmFyY2hpY2FsSWQ6IHN0YWNrLmhpZXJhcmNoaWNhbElkLFxuICAgICAgfSksXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcm9sbGJhY2tTdGFjayhvcHRpb25zOiBSb2xsYmFja1N0YWNrT3B0aW9ucyk6IFByb21pc2U8Um9sbGJhY2tTdGFja1Jlc3VsdD4ge1xuICAgIGxldCByZXNvdXJjZXNUb1NraXA6IHN0cmluZ1tdID0gb3B0aW9ucy5vcnBoYW5Mb2dpY2FsSWRzID8/IFtdO1xuICAgIGlmIChvcHRpb25zLm9ycGhhbkZhaWxlZFJlc291cmNlcyAmJiByZXNvdXJjZXNUb1NraXAubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignQ29uZmxpY3RpbmdSb2xsYmFja09wdGlvbnMnLCAnQ2Fubm90IGNvbWJpbmUgLS1mb3JjZSB3aXRoIC0tb3JwaGFuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZW52ID0gYXdhaXQgdGhpcy5lbnZzLmFjY2Vzc1N0YWNrRm9yTXV0YWJsZVN0YWNrT3BlcmF0aW9ucyhvcHRpb25zLnN0YWNrKTtcblxuICAgIGlmIChvcHRpb25zLnZhbGlkYXRlQm9vdHN0cmFwU3RhY2tWZXJzaW9uID8/IHRydWUpIHtcbiAgICAgIC8vIERvIGEgdmVyaWZpY2F0aW9uIG9mIHRoZSBib290c3RyYXAgc3RhY2sgdmVyc2lvblxuICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZUJvb3RzdHJhcFN0YWNrVmVyc2lvbihcbiAgICAgICAgb3B0aW9ucy5zdGFjay5zdGFja05hbWUsXG4gICAgICAgIEJPT1RTVFJBUF9TVEFDS19WRVJTSU9OX0ZPUl9ST0xMQkFDSyxcbiAgICAgICAgb3B0aW9ucy5zdGFjay5ib290c3RyYXBTdGFja1ZlcnNpb25Tc21QYXJhbWV0ZXIsXG4gICAgICAgIGVudi5yZXNvdXJjZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IGNmbiA9IGVudi5zZGsuY2xvdWRGb3JtYXRpb24oKTtcbiAgICBjb25zdCBkZXBsb3lOYW1lID0gb3B0aW9ucy5zdGFjay5zdGFja05hbWU7XG5cbiAgICAvLyBXZSBsb29wIGluIGNhc2Ugb2YgYC0tZm9yY2VgIGFuZCB0aGUgc3RhY2sgZW5kcyB1cCBpbiBgQ09OVElOVUVfVVBEQVRFX1JPTExCQUNLYC5cbiAgICBsZXQgbWF4TG9vcHMgPSAxMDtcbiAgICB3aGlsZSAobWF4TG9vcHMtLSkge1xuICAgICAgY29uc3QgY2xvdWRGb3JtYXRpb25TdGFjayA9IGF3YWl0IENsb3VkRm9ybWF0aW9uU3RhY2subG9va3VwKGNmbiwgZGVwbG95TmFtZSk7XG4gICAgICBjb25zdCBzdGFja0FybiA9IGNsb3VkRm9ybWF0aW9uU3RhY2suc3RhY2tJZDtcblxuICAgICAgY29uc3QgZXhlY3V0aW9uUm9sZUFybiA9IGF3YWl0IGVudi5yZXBsYWNlUGxhY2Vob2xkZXJzKG9wdGlvbnMucm9sZUFybiA/PyBvcHRpb25zLnN0YWNrLmNsb3VkRm9ybWF0aW9uRXhlY3V0aW9uUm9sZUFybik7XG5cbiAgICAgIHN3aXRjaCAoY2xvdWRGb3JtYXRpb25TdGFjay5zdGFja1N0YXR1cy5yb2xsYmFja0Nob2ljZSkge1xuICAgICAgICBjYXNlIFJvbGxiYWNrQ2hvaWNlLk5PTkU6XG4gICAgICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5kZWZhdWx0cy53YXJuKGBTdGFjayAke2RlcGxveU5hbWV9IGRvZXMgbm90IG5lZWQgYSByb2xsYmFjazogJHtjbG91ZEZvcm1hdGlvblN0YWNrLnN0YWNrU3RhdHVzfWApO1xuICAgICAgICAgIHJldHVybiB7IHN0YWNrQXJuLCBub3RJblJvbGxiYWNrYWJsZVN0YXRlOiB0cnVlIH07XG5cbiAgICAgICAgY2FzZSBSb2xsYmFja0Nob2ljZS5TVEFSVF9ST0xMQkFDSzpcbiAgICAgICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLmRlYnVnKGBJbml0aWF0aW5nIHJvbGxiYWNrIG9mIHN0YWNrICR7ZGVwbG95TmFtZX1gKTtcbiAgICAgICAgICBhd2FpdCBjZm4ucm9sbGJhY2tTdGFjayh7XG4gICAgICAgICAgICBTdGFja05hbWU6IHN0YWNrQXJuLFxuICAgICAgICAgICAgUm9sZUFSTjogZXhlY3V0aW9uUm9sZUFybixcbiAgICAgICAgICAgIENsaWVudFJlcXVlc3RUb2tlbjogcmFuZG9tVVVJRCgpLFxuICAgICAgICAgICAgLy8gRW5hYmxpbmcgdGhpcyBpcyBqdXN0IHRoZSBiZXR0ZXIgb3ZlcmFsbCBkZWZhdWx0LCB0aGUgb25seSByZWFzb24gaXQgaXNuJ3QgdGhlIHVwc3RyZWFtIGRlZmF1bHQgaXMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgIFJldGFpbkV4Y2VwdE9uQ3JlYXRlOiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUm9sbGJhY2tDaG9pY2UuQ09OVElOVUVfVVBEQVRFX1JPTExCQUNLOlxuICAgICAgICAgIGlmIChvcHRpb25zLm9ycGhhbkZhaWxlZFJlc291cmNlcykge1xuICAgICAgICAgICAgLy8gRmluZCB0aGUgZmFpbGVkIHJlc291cmNlcyBmcm9tIHRoZSBkZXBsb3ltZW50IGFuZCBhdXRvbWF0aWNhbGx5IHNraXAgdGhlbVxuICAgICAgICAgICAgLy8gKFVzaW5nIGRlcGxveW1lbnQgbG9nIGJlY2F1c2Ugd2UgZGVmaW5pdGVseSBoYXZlIGBEZXNjcmliZVN0YWNrRXZlbnRzYCBwZXJtaXNzaW9ucywgYW5kIHdlIG1pZ2h0IG5vdCBoYXZlXG4gICAgICAgICAgICAvLyBgRGVzY3JpYmVTdGFja1Jlc291cmNlc2AgcGVybWlzc2lvbnMpLlxuICAgICAgICAgICAgY29uc3QgcG9sbGVyID0gbmV3IFN0YWNrRXZlbnRQb2xsZXIoY2ZuLCB7XG4gICAgICAgICAgICAgIHN0YWNrQXJuLFxuICAgICAgICAgICAgICBpbml0aWFsUG9sbFJhbmdlOiBQb2xsUmFuZ2Uuc2luY2VTdGFja1N0YXR1cyhbJ1JPTExCQUNLX0lOX1BST0dSRVNTJywgJ1VQREFURV9ST0xMQkFDS19JTl9QUk9HUkVTUyddKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXdhaXQgcG9sbGVyLnBvbGwoKTtcbiAgICAgICAgICAgIHJlc291cmNlc1RvU2tpcCA9IHBvbGxlci5yZXNvdXJjZUVycm9yc1xuICAgICAgICAgICAgICAuZmlsdGVyKChyKSA9PiByLnBhcmVudFN0YWNrTG9naWNhbElkcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgIC5tYXAoKHIpID0+IHIubG9naWNhbElkKVxuICAgICAgICAgICAgICAuZmlsdGVyKChpZCkgPT4gdHlwZW9mIGlkID09PSAnc3RyaW5nJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgc2tpcERlc2NyaXB0aW9uID0gcmVzb3VyY2VzVG9Ta2lwLmxlbmd0aCA+IDAgPyBgIChvcnBoYW5pbmc6ICR7cmVzb3VyY2VzVG9Ta2lwLmpvaW4oJywgJyl9KWAgOiAnJztcbiAgICAgICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLndhcm4oYENvbnRpbnVpbmcgcm9sbGJhY2sgb2Ygc3RhY2sgJHtkZXBsb3lOYW1lfSR7c2tpcERlc2NyaXB0aW9ufWApO1xuICAgICAgICAgIGF3YWl0IGNmbi5jb250aW51ZVVwZGF0ZVJvbGxiYWNrKHtcbiAgICAgICAgICAgIFN0YWNrTmFtZTogc3RhY2tBcm4sXG4gICAgICAgICAgICBDbGllbnRSZXF1ZXN0VG9rZW46IHJhbmRvbVVVSUQoKSxcbiAgICAgICAgICAgIFJvbGVBUk46IGV4ZWN1dGlvblJvbGVBcm4sXG4gICAgICAgICAgICBSZXNvdXJjZXNUb1NraXA6IHJlc291cmNlc1RvU2tpcCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFJvbGxiYWNrQ2hvaWNlLlJPTExCQUNLX0ZBSUxFRDpcbiAgICAgICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLmRlZmF1bHRzLndhcm4oXG4gICAgICAgICAgICBgU3RhY2sgJHtkZXBsb3lOYW1lfSBmYWlsZWQgY3JlYXRpb24gYW5kIHJvbGxiYWNrLiBUaGlzIHN0YXRlIGNhbm5vdCBiZSByb2xsZWQgYmFjay4gWW91IGNhbiByZWNyZWF0ZSB0aGlzIHN0YWNrIGJ5IHJ1bm5pbmcgJ2NkayBkZXBsb3knLmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4geyBzdGFja0Fybiwgbm90SW5Sb2xsYmFja2FibGVTdGF0ZTogdHJ1ZSB9O1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignVW5leHBlY3RlZFJvbGxiYWNrQ2hvaWNlJywgYFVuZXhwZWN0ZWQgcm9sbGJhY2sgY2hvaWNlOiAke2Nsb3VkRm9ybWF0aW9uU3RhY2suc3RhY2tTdGF0dXMucm9sbGJhY2tDaG9pY2V9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1vbml0b3IgPSBuZXcgU3RhY2tBY3Rpdml0eU1vbml0b3Ioe1xuICAgICAgICBjZm4sXG4gICAgICAgIHN0YWNrOiBvcHRpb25zLnN0YWNrLFxuICAgICAgICBzdGFja0FybixcbiAgICAgICAgaW9IZWxwZXI6IHRoaXMuaW9IZWxwZXIsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IG1vbml0b3Iuc3RhcnQoKTtcblxuICAgICAgbGV0IHN0YWNrRXJyb3JNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICBsZXQgZmluYWxTdGFja1N0YXRlID0gY2xvdWRGb3JtYXRpb25TdGFjaztcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN1Y2Nlc3NTdGFjayA9IGF3YWl0IHN0YWJpbGl6ZVN0YWNrKGNmbiwgdGhpcy5pb0hlbHBlciwgZGVwbG95TmFtZSk7XG5cbiAgICAgICAgLy8gVGhpcyBzaG91bGRuJ3QgcmVhbGx5IGhhcHBlbiwgYnV0IGNhdGNoIGl0IGFueXdheS4gWW91IG5ldmVyIGtub3cuXG4gICAgICAgIGlmICghc3VjY2Vzc1N0YWNrKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignU3RhY2tEaXNhcHBlYXJlZCcsICdTdGFjayBkZXBsb3kgZmFpbGVkICh0aGUgc3RhY2sgZGlzYXBwZWFyZWQgd2hpbGUgd2Ugd2VyZSByb2xsaW5nIGl0IGJhY2spJyk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxTdGFja1N0YXRlID0gc3VjY2Vzc1N0YWNrO1xuXG4gICAgICAgIGNvbnN0IGVycm9ycyA9IG1vbml0b3IuZXJyb3JzLmFsbEVycm9yTWVzc2FnZXMuam9pbignLCAnKTtcbiAgICAgICAgaWYgKGVycm9ycykge1xuICAgICAgICAgIHN0YWNrRXJyb3JNZXNzYWdlID0gZXJyb3JzO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgc3RhY2tFcnJvck1lc3NhZ2UgPSBzdWZmaXhXaXRoRXJyb3JzKGZvcm1hdEVycm9yTWVzc2FnZShlKSwgbW9uaXRvci5lcnJvcnMuYWxsRXJyb3JNZXNzYWdlcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCBtb25pdG9yLnN0b3AoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpbmFsU3RhY2tTdGF0ZS5zdGFja1N0YXR1cy5pc1JvbGxiYWNrU3VjY2VzcyB8fCAhc3RhY2tFcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHsgc3RhY2tBcm4sIHN1Y2Nlc3M6IHRydWUgfTtcbiAgICAgIH1cblxuICAgICAgLy8gRWl0aGVyIHdlIG5lZWQgdG8gaWdub3JlIHNvbWUgcmVzb3VyY2VzIHRvIGNvbnRpbnVlIHRoZSByb2xsYmFjaywgb3Igc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICAgIGlmIChmaW5hbFN0YWNrU3RhdGUuc3RhY2tTdGF0dXMucm9sbGJhY2tDaG9pY2UgPT09IFJvbGxiYWNrQ2hvaWNlLkNPTlRJTlVFX1VQREFURV9ST0xMQkFDSyAmJiBvcHRpb25zLm9ycGhhbkZhaWxlZFJlc291cmNlcykge1xuICAgICAgICAvLyBEbyBhbm90aGVyIGxvb3AtZGUtbG9vcFxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFcnJvcihcbiAgICAgICAgYCR7c3RhY2tFcnJvck1lc3NhZ2V9IChmaXggcHJvYmxlbSBhbmQgcmV0cnksIG9yIG9ycGhhbiB0aGVzZSByZXNvdXJjZXMgdXNpbmcgLS1vcnBoYW4gb3IgLS1mb3JjZSlgLFxuICAgICAgICBtb25pdG9yLmVycm9ycy5yb290Q2F1c2VFcnJvckNvZGUgPz8gJ1JvbGxiYWNrRmFpbGVkJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoXG4gICAgICAnUm9sbGJhY2tTdGFsbGVkJyxcbiAgICAgIFwiUm9sbGJhY2sgZGlkIG5vdCBmaW5pc2ggYWZ0ZXIgYSBsYXJnZSBudW1iZXIgb2YgaXRlcmF0aW9uczsgc3RvcHBpbmcgYmVjYXVzZSBpdCBsb29rcyBsaWtlIHdlJ3JlIG5vdCBtYWtpbmcgcHJvZ3Jlc3MgYW55bW9yZS4gWW91IGNhbiByZXRyeSBpZiByb2xsYmFjayB3YXMgcHJvZ3Jlc3NpbmcgYXMgZXhwZWN0ZWQuXCIsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkZXN0cm95U3RhY2sob3B0aW9uczogRGVzdHJveVN0YWNrT3B0aW9ucykge1xuICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0Zvck11dGFibGVTdGFja09wZXJhdGlvbnMob3B0aW9ucy5zdGFjayk7XG4gICAgY29uc3QgZXhlY3V0aW9uUm9sZUFybiA9IGF3YWl0IGVudi5yZXBsYWNlUGxhY2Vob2xkZXJzKG9wdGlvbnMucm9sZUFybiA/PyBvcHRpb25zLnN0YWNrLmNsb3VkRm9ybWF0aW9uRXhlY3V0aW9uUm9sZUFybik7XG5cbiAgICByZXR1cm4gZGVzdHJveVN0YWNrKHtcbiAgICAgIHNkazogZW52LnNkayxcbiAgICAgIHJvbGVBcm46IGV4ZWN1dGlvblJvbGVBcm4sXG4gICAgICBzdGFjazogb3B0aW9ucy5zdGFjayxcbiAgICAgIGRlcGxveU5hbWU6IG9wdGlvbnMuZGVwbG95TmFtZSxcbiAgICB9LCB0aGlzLmlvSGVscGVyKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzdGFja0V4aXN0cyhvcHRpb25zOiBTdGFja0V4aXN0c09wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBsZXQgZW52O1xuICAgIGlmIChvcHRpb25zLnRyeUxvb2t1cFJvbGUpIHtcbiAgICAgIGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0Zvckxvb2t1cEJlc3RFZmZvcnQob3B0aW9ucy5zdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0ZvclJlYWRPbmx5U3RhY2tPcGVyYXRpb25zKG9wdGlvbnMuc3RhY2spO1xuICAgIH1cbiAgICBjb25zdCBzdGFjayA9IGF3YWl0IENsb3VkRm9ybWF0aW9uU3RhY2subG9va3VwKGVudi5zZGsuY2xvdWRGb3JtYXRpb24oKSwgb3B0aW9ucy5kZXBsb3lOYW1lID8/IG9wdGlvbnMuc3RhY2suc3RhY2tOYW1lKTtcbiAgICByZXR1cm4gc3RhY2suZXhpc3RzO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgc2luZ2xlIGFzc2V0IGZyb20gYW4gYXNzZXQgbWFuaWZlc3RcbiAgICpcbiAgICogSWYgYW4gYXNzZXJ0IG1hbmlmZXN0IGFydGlmYWN0IGlzIGdpdmVuLCB0aGUgYm9vdHN0cmFwIHN0YWNrIHZlcnNpb25cbiAgICogd2lsbCBiZSB2YWxpZGF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBjb25zdHJhaW50cyBpbiB0aGF0IG1hbmlmZXN0IGFydGlmYWN0LlxuICAgKiBJZiB0aGF0IGlzIG5vdCBuZWNlc3NhcnksIGAnbm8tdmVyc2lvbi12YWxpZGF0aW9uJ2AgY2FuIGJlIHBhc3NlZC5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAc3R5bGlzdGljL21heC1sZW5cbiAgcHVibGljIGFzeW5jIGJ1aWxkU2luZ2xlQXNzZXQoXG4gICAgYXNzZXRBcnRpZmFjdDogY3hhcGkuQXNzZXRNYW5pZmVzdEFydGlmYWN0IHwgJ25vLXZlcnNpb24tdmFsaWRhdGlvbicsXG4gICAgYXNzZXRNYW5pZmVzdDogY2RrX2Fzc2V0cy5Bc3NldE1hbmlmZXN0LFxuICAgIGFzc2V0OiBjZGtfYXNzZXRzLklNYW5pZmVzdEVudHJ5LFxuICAgIG9wdGlvbnM6IEJ1aWxkU3RhY2tBc3NldHNPcHRpb25zLFxuICApIHtcbiAgICBpZiAoYXNzZXRBcnRpZmFjdCAhPT0gJ25vLXZlcnNpb24tdmFsaWRhdGlvbicpIHtcbiAgICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0ZvclJlYWRPbmx5U3RhY2tPcGVyYXRpb25zKG9wdGlvbnMuc3RhY2spO1xuICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZUJvb3RzdHJhcFN0YWNrVmVyc2lvbihcbiAgICAgICAgb3B0aW9ucy5zdGFjay5zdGFja05hbWUsXG4gICAgICAgIGFzc2V0QXJ0aWZhY3QucmVxdWlyZXNCb290c3RyYXBTdGFja1ZlcnNpb24sXG4gICAgICAgIGFzc2V0QXJ0aWZhY3QuYm9vdHN0cmFwU3RhY2tWZXJzaW9uU3NtUGFyYW1ldGVyLFxuICAgICAgICBlbnYucmVzb3VyY2VzKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlZEVudmlyb25tZW50ID0gYXdhaXQgdGhpcy5lbnZzLnJlc29sdmVTdGFja0Vudmlyb25tZW50KG9wdGlvbnMuc3RhY2spO1xuXG4gICAgY29uc3QgcHVibGlzaGVyID0gdGhpcy5jYWNoZWRQdWJsaXNoZXIoYXNzZXRNYW5pZmVzdCwgcmVzb2x2ZWRFbnZpcm9ubWVudCwgb3B0aW9ucy5zdGFja05hbWUpO1xuICAgIGF3YWl0IHB1Ymxpc2hlci5idWlsZEVudHJ5KGFzc2V0KTtcbiAgICBpZiAocHVibGlzaGVyLmhhc0ZhaWx1cmVzKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdBc3NldEJ1aWxkRmFpbGVkJywgYEZhaWxlZCB0byBidWlsZCBhc3NldCAke2Fzc2V0LmRpc3BsYXlOYW1lKGZhbHNlKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHVibGlzaCBhIHNpbmdsZSBhc3NldCBmcm9tIGFuIGFzc2V0IG1hbmlmZXN0XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHVibGlzaFNpbmdsZUFzc2V0KFxuICAgIGFzc2V0TWFuaWZlc3Q6IGNka19hc3NldHMuQXNzZXRNYW5pZmVzdCxcbiAgICBhc3NldDogY2RrX2Fzc2V0cy5JTWFuaWZlc3RFbnRyeSxcbiAgICBvcHRpb25zOiBQdWJsaXNoU3RhY2tBc3NldHNPcHRpb25zLFxuICApIHtcbiAgICBjb25zdCBzdGFja0VudiA9IGF3YWl0IHRoaXMuZW52cy5yZXNvbHZlU3RhY2tFbnZpcm9ubWVudChvcHRpb25zLnN0YWNrKTtcblxuICAgIC8vIE5vIG5lZWQgdG8gdmFsaWRhdGUgYW55bW9yZSwgd2UgYWxyZWFkeSBkaWQgdGhhdCBkdXJpbmcgYnVpbGRcbiAgICBjb25zdCBwdWJsaXNoZXIgPSB0aGlzLmNhY2hlZFB1Ymxpc2hlcihhc3NldE1hbmlmZXN0LCBzdGFja0Vudiwgb3B0aW9ucy5zdGFja05hbWUpO1xuICAgIGF3YWl0IHB1Ymxpc2hlci5wdWJsaXNoRW50cnkoYXNzZXQsIHtcbiAgICAgIGFsbG93Q3Jvc3NBY2NvdW50OiBhd2FpdCB0aGlzLmFsbG93Q3Jvc3NBY2NvdW50QXNzZXRQdWJsaXNoaW5nRm9yRW52KG9wdGlvbnMuc3RhY2spLFxuICAgICAgZm9yY2U6IG9wdGlvbnMuZm9yY2VQdWJsaXNoLFxuICAgIH0pO1xuICAgIGlmIChwdWJsaXNoZXIuaGFzRmFpbHVyZXMpIHtcbiAgICAgIHRocm93IFRvb2xraXRFcnJvci53aXRoQ2F1c2UoJ0Fzc2V0UHVibGlzaEZhaWxlZCcsIGBGYWlsZWQgdG8gcHVibGlzaCBhc3NldCAke2Fzc2V0LmRpc3BsYXlOYW1lKHRydWUpfWAsIG5ldyBBZ2dyZWdhdGVFcnJvcihwdWJsaXNoZXIuZmFpbHVyZXMubWFwKGYgPT4gZi5lcnJvcikpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFsbG93Q3Jvc3NBY2NvdW50QXNzZXRQdWJsaXNoaW5nRm9yRW52KHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodGhpcy5fYWxsb3dDcm9zc0FjY291bnRBc3NldFB1Ymxpc2hpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZW52ID0gYXdhaXQgdGhpcy5lbnZzLmFjY2Vzc1N0YWNrRm9yUmVhZE9ubHlTdGFja09wZXJhdGlvbnMoc3RhY2spO1xuICAgICAgdGhpcy5fYWxsb3dDcm9zc0FjY291bnRBc3NldFB1Ymxpc2hpbmcgPSBhd2FpdCBkZXRlcm1pbmVBbGxvd0Nyb3NzQWNjb3VudEFzc2V0UHVibGlzaGluZyhlbnYuc2RrLCB0aGlzLmlvSGVscGVyLCB0aGlzLnByb3BzLnRvb2xraXRTdGFja05hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYWxsb3dDcm9zc0FjY291bnRBc3NldFB1Ymxpc2hpbmc7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgYSBzaW5nbGUgYXNzZXQgaGFzIGJlZW4gcHVibGlzaGVkIGFscmVhZHlcbiAgICovXG4gIHB1YmxpYyBhc3luYyBpc1NpbmdsZUFzc2V0UHVibGlzaGVkKFxuICAgIGFzc2V0TWFuaWZlc3Q6IGNka19hc3NldHMuQXNzZXRNYW5pZmVzdCxcbiAgICBhc3NldDogY2RrX2Fzc2V0cy5JTWFuaWZlc3RFbnRyeSxcbiAgICBvcHRpb25zOiBQdWJsaXNoU3RhY2tBc3NldHNPcHRpb25zLFxuICApIHtcbiAgICBjb25zdCBzdGFja0VudiA9IGF3YWl0IHRoaXMuZW52cy5yZXNvbHZlU3RhY2tFbnZpcm9ubWVudChvcHRpb25zLnN0YWNrKTtcbiAgICBjb25zdCBwdWJsaXNoZXIgPSB0aGlzLmNhY2hlZFB1Ymxpc2hlcihhc3NldE1hbmlmZXN0LCBzdGFja0Vudiwgb3B0aW9ucy5zdGFja05hbWUpO1xuICAgIHJldHVybiBwdWJsaXNoZXIuaXNFbnRyeVB1Ymxpc2hlZChhc3NldCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhhdCB0aGUgYm9vdHN0cmFwIHN0YWNrIGhhcyB0aGUgcmlnaHQgdmVyc2lvbiBmb3IgdGhpcyBzdGFja1xuICAgKlxuICAgKiBDYWxsIGludG8gZW52UmVzb3VyY2VzLnZhbGlkYXRlVmVyc2lvbiwgYnV0IHByZXBlbmQgdGhlIHN0YWNrIG5hbWUgaW4gY2FzZSBvZiBmYWlsdXJlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZUJvb3RzdHJhcFN0YWNrVmVyc2lvbihcbiAgICBzdGFja05hbWU6IHN0cmluZyxcbiAgICByZXF1aXJlc0Jvb3RzdHJhcFN0YWNrVmVyc2lvbjogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIGJvb3RzdHJhcFN0YWNrVmVyc2lvblNzbVBhcmFtZXRlcjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGVudlJlc291cmNlczogRW52aXJvbm1lbnRSZXNvdXJjZXMsXG4gICkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBlbnZSZXNvdXJjZXMudmFsaWRhdGVWZXJzaW9uKHJlcXVpcmVzQm9vdHN0cmFwU3RhY2tWZXJzaW9uLCBib290c3RyYXBTdGFja1ZlcnNpb25Tc21QYXJhbWV0ZXIpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignQm9vdHN0cmFwVmVyc2lvblZhbGlkYXRpb24nLCBgJHtzdGFja05hbWV9OiAke2Zvcm1hdEVycm9yTWVzc2FnZShlKX1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNhY2hlZFB1Ymxpc2hlcihhc3NldE1hbmlmZXN0OiBjZGtfYXNzZXRzLkFzc2V0TWFuaWZlc3QsIGVudjogY3hhcGkuRW52aXJvbm1lbnQsIHN0YWNrTmFtZT86IHN0cmluZykge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5wdWJsaXNoZXJDYWNoZS5nZXQoYXNzZXRNYW5pZmVzdCk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuICAgIGNvbnN0IHByZWZpeCA9IHN0YWNrTmFtZSA/IGAke2NoYWxrLmJvbGQoc3RhY2tOYW1lKX06IGAgOiAnJztcbiAgICBjb25zdCBwdWJsaXNoZXIgPSBuZXcgY2RrX2Fzc2V0cy5Bc3NldFB1Ymxpc2hpbmcoYXNzZXRNYW5pZmVzdCwge1xuICAgICAgLy8gVGhlIEFzc2V0UHVibGlzaGluZyBjbGFzcyB0YWtlcyBjYXJlIG9mIHJvbGUgYXNzdW1pbmcgZXRjLCBzbyBpdCdzIG9rYXkgdG9cbiAgICAgIC8vIGdpdmUgaXQgYSBkaXJlY3QgYFNka1Byb3ZpZGVyYC5cbiAgICAgIGF3czogbmV3IFB1Ymxpc2hpbmdBd3ModGhpcy5hc3NldFNka1Byb3ZpZGVyLCBlbnYpLFxuICAgICAgcHJvZ3Jlc3NMaXN0ZW5lcjogbmV3IFBhcmFsbGVsU2FmZUFzc2V0UHJvZ3Jlc3MocHJlZml4LCB0aGlzLmlvSGVscGVyKSxcbiAgICB9KTtcbiAgICB0aGlzLnB1Ymxpc2hlckNhY2hlLnNldChhc3NldE1hbmlmZXN0LCBwdWJsaXNoZXIpO1xuICAgIHJldHVybiBwdWJsaXNoZXI7XG4gIH1cbn1cblxuLyoqXG4gKiBBc3NldCBwcm9ncmVzcyB0aGF0IGRvZXNuJ3QgZG8gYW55dGhpbmcgd2l0aCBwZXJjZW50YWdlcyAoY3VycmVudGx5KVxuICovXG5jbGFzcyBQYXJhbGxlbFNhZmVBc3NldFByb2dyZXNzIGV4dGVuZHMgQmFzZVB1Ymxpc2hQcm9ncmVzc0xpc3RlbmVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBwcmVmaXg6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihwcmVmaXg6IHN0cmluZywgaW9IZWxwZXI6IElvSGVscGVyKSB7XG4gICAgc3VwZXIoaW9IZWxwZXIpO1xuICAgIHRoaXMucHJlZml4ID0gcHJlZml4O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldE1lc3NhZ2UodHlwZTogY2RrX2Fzc2V0cy5FdmVudFR5cGUsIGV2ZW50OiBjZGtfYXNzZXRzLklQdWJsaXNoUHJvZ3Jlc3MpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnByZWZpeH0ke3R5cGV9OiAke2V2ZW50Lm1lc3NhZ2V9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdWZmaXhXaXRoRXJyb3JzKG1zZzogc3RyaW5nLCBlcnJvcnM/OiBzdHJpbmdbXSkge1xuICByZXR1cm4gZXJyb3JzICYmIGVycm9ycy5sZW5ndGggPiAwID8gYCR7bXNnfTogJHtlcnJvcnMuam9pbignLCAnKX1gIDogbXNnO1xufVxuIl19
@@ -2,10 +2,9 @@ import type { SDK } from '../aws-auth/sdk';
2
2
  import type { EnvironmentResources } from '../environment';
3
3
  import type { IoHelper } from '../io/private/io-helper';
4
4
  /**
5
- * A ValidationReporter that checks for early validation errors right after
6
- * creating the change set.
5
+ * Uses `DescribeEvents` to get the detailed reasons for why a changeset failed to create, if available.
7
6
  */
8
- export declare class EarlyValidationReporter {
7
+ export declare class ChangeSetResourceErrorFetcher {
9
8
  private readonly sdk;
10
9
  private readonly envResources?;
11
10
  constructor(sdk: SDK, envResources?: EnvironmentResources | undefined);
@@ -13,22 +12,25 @@ export declare class EarlyValidationReporter {
13
12
  * Fetch the details and return them as a string.
14
13
  *
15
14
  * If the details could not be fetched, log that as a warning using the IoHelper.
15
+ *
16
+ * (This method will only ever be used for early validation, so we are not generalizing
17
+ * the error message in here).
16
18
  */
17
19
  fetchDetailsString(changeSetName: string, stackName: string, ioHelper: IoHelper): Promise<string>;
18
20
  /**
19
21
  * Fetch the details and return them in structured form.
20
22
  */
21
- fetchDetailsStructured(changeSetName: string, stackName: string): Promise<EarlyValidationCheckResult>;
23
+ fetchDetailsStructured(changeSetName: string, stackName: string): Promise<ChangeSetErrorCheckResult>;
22
24
  private getFailedEvents;
23
25
  }
24
- export type EarlyValidationCheckResult = {
26
+ export type ChangeSetErrorCheckResult = {
25
27
  type: 'could-not-check';
26
28
  message: string;
27
29
  } | {
28
30
  type: 'resource-errors';
29
- errors: EarlyValidationError[];
31
+ errors: ChangeSetResourceError[];
30
32
  };
31
- export interface EarlyValidationError {
33
+ export interface ChangeSetResourceError {
32
34
  readonly logicalId: string;
33
35
  readonly physicalId?: string;
34
36
  readonly message: string;
@@ -46,4 +48,4 @@ export interface EarlyValidationError {
46
48
  */
47
49
  readonly documentPath: string;
48
50
  }
49
- //# sourceMappingURL=early-validation.d.ts.map
51
+ //# sourceMappingURL=changeset-error-fetcher.d.ts.map
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ChangeSetResourceErrorFetcher = void 0;
4
+ /**
5
+ * Uses `DescribeEvents` to get the detailed reasons for why a changeset failed to create, if available.
6
+ */
7
+ class ChangeSetResourceErrorFetcher {
8
+ sdk;
9
+ envResources;
10
+ constructor(sdk, envResources) {
11
+ this.sdk = sdk;
12
+ this.envResources = envResources;
13
+ }
14
+ /**
15
+ * Fetch the details and return them as a string.
16
+ *
17
+ * If the details could not be fetched, log that as a warning using the IoHelper.
18
+ *
19
+ * (This method will only ever be used for early validation, so we are not generalizing
20
+ * the error message in here).
21
+ */
22
+ async fetchDetailsString(changeSetName, stackName, ioHelper) {
23
+ const summary = `Early validation failed for stack '${stackName}' (ChangeSet '${changeSetName}')`;
24
+ const result = await this.fetchDetailsStructured(changeSetName, stackName);
25
+ switch (result.type) {
26
+ case 'could-not-check':
27
+ await ioHelper.defaults.warn(result.message);
28
+ return summary;
29
+ case 'resource-errors':
30
+ if (result.errors.length === 0) {
31
+ return summary;
32
+ }
33
+ return [
34
+ `${summary}:`,
35
+ ...result.errors.map(e => ` - ${e.message} (at ${e.documentPath})`),
36
+ ].join('\n');
37
+ }
38
+ }
39
+ /**
40
+ * Fetch the details and return them in structured form.
41
+ */
42
+ async fetchDetailsStructured(changeSetName, stackName) {
43
+ let operationEvents = [];
44
+ try {
45
+ operationEvents = await this.getFailedEvents(stackName, changeSetName);
46
+ }
47
+ catch (error) {
48
+ let currentVersion = undefined;
49
+ try {
50
+ currentVersion = (await this.envResources?.lookupToolkit())?.version;
51
+ }
52
+ catch (e) {
53
+ }
54
+ return {
55
+ type: 'could-not-check',
56
+ message: `Could not retrieve additional details about change set creation errors (${error}). Make sure you have permissions to call the DescribeEvents API, or re-bootstrap your environment by running 'cdk bootstrap' to update the Bootstrap CDK Toolkit stack. Bootstrap toolkit stack version 30 or later is needed; current version: ${currentVersion ?? 'unknown'}.`,
57
+ };
58
+ }
59
+ return {
60
+ type: 'resource-errors',
61
+ errors: operationEvents.map((ev) => ({
62
+ eventType: ev.EventType ?? '',
63
+ logicalId: ev.LogicalResourceId ?? '',
64
+ message: ev.ValidationStatusReason ?? '',
65
+ physicalId: ev.PhysicalResourceId ? ev.PhysicalResourceId : undefined,
66
+ validationName: ev.ValidationName ?? '',
67
+ documentPath: ev.ValidationPath ?? '',
68
+ resourceType: ev.ResourceType,
69
+ })),
70
+ };
71
+ }
72
+ async getFailedEvents(stackName, changeSetName) {
73
+ return this.sdk.cloudFormation().paginatedDescribeEvents({
74
+ StackName: stackName,
75
+ ChangeSetName: changeSetName,
76
+ Filters: {
77
+ FailedEvents: true,
78
+ },
79
+ });
80
+ }
81
+ }
82
+ exports.ChangeSetResourceErrorFetcher = ChangeSetResourceErrorFetcher;
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbmdlc2V0LWVycm9yLWZldGNoZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjaGFuZ2VzZXQtZXJyb3ItZmV0Y2hlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFLQTs7R0FFRztBQUNILE1BQWEsNkJBQTZCO0lBQ1g7SUFBMkI7SUFBeEQsWUFBNkIsR0FBUSxFQUFtQixZQUFtQztRQUE5RCxRQUFHLEdBQUgsR0FBRyxDQUFLO1FBQW1CLGlCQUFZLEdBQVosWUFBWSxDQUF1QjtJQUMzRixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxhQUFxQixFQUFFLFNBQWlCLEVBQUUsUUFBa0I7UUFDMUYsTUFBTSxPQUFPLEdBQUcsc0NBQXNDLFNBQVMsaUJBQWlCLGFBQWEsSUFBSSxDQUFDO1FBQ2xHLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUUzRSxRQUFRLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNwQixLQUFLLGlCQUFpQjtnQkFDcEIsTUFBTSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzdDLE9BQU8sT0FBTyxDQUFDO1lBRWpCLEtBQUssaUJBQWlCO2dCQUNwQixJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUMvQixPQUFPLE9BQU8sQ0FBQztnQkFDakIsQ0FBQztnQkFDRCxPQUFPO29CQUNMLEdBQUcsT0FBTyxHQUFHO29CQUNiLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLFFBQVEsQ0FBQyxDQUFDLFlBQVksR0FBRyxDQUFDO2lCQUNyRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLHNCQUFzQixDQUFDLGFBQXFCLEVBQUUsU0FBaUI7UUFDMUUsSUFBSSxlQUFlLEdBQXFCLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUM7WUFDSCxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksY0FBYyxHQUF1QixTQUFTLENBQUM7WUFDbkQsSUFBSSxDQUFDO2dCQUNILGNBQWMsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQztZQUN2RSxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNiLENBQUM7WUFFRCxPQUFPO2dCQUNMLElBQUksRUFBRSxpQkFBaUI7Z0JBQ3ZCLE9BQU8sRUFBRSwyRUFBMkUsS0FBSyxvUEFBb1AsY0FBYyxJQUFJLFNBQVMsR0FBRzthQUM1VyxDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU87WUFDTCxJQUFJLEVBQUUsaUJBQWlCO1lBQ3ZCLE1BQU0sRUFBRSxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNuQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsSUFBSSxFQUFFO2dCQUM3QixTQUFTLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixJQUFJLEVBQUU7Z0JBQ3JDLE9BQU8sRUFBRSxFQUFFLENBQUMsc0JBQXNCLElBQUksRUFBRTtnQkFDeEMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxTQUFTO2dCQUNyRSxjQUFjLEVBQUUsRUFBRSxDQUFDLGNBQWMsSUFBSSxFQUFFO2dCQUN2QyxZQUFZLEVBQUUsRUFBRSxDQUFDLGNBQWMsSUFBSSxFQUFFO2dCQUNyQyxZQUFZLEVBQUUsRUFBRSxDQUFDLFlBQVk7YUFDSSxDQUFBLENBQUM7U0FDckMsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsZUFBZSxDQUFDLFNBQWlCLEVBQUUsYUFBcUI7UUFDcEUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDLHVCQUF1QixDQUFDO1lBQ3ZELFNBQVMsRUFBRSxTQUFTO1lBQ3BCLGFBQWEsRUFBRSxhQUFhO1lBQzVCLE9BQU8sRUFBRTtnQkFDUCxZQUFZLEVBQUUsSUFBSTthQUNuQjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQTNFRCxzRUEyRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IE9wZXJhdGlvbkV2ZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWNsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB0eXBlIHsgU0RLIH0gZnJvbSAnLi4vYXdzLWF1dGgvc2RrJztcbmltcG9ydCB0eXBlIHsgRW52aXJvbm1lbnRSZXNvdXJjZXMgfSBmcm9tICcuLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgdHlwZSB7IElvSGVscGVyIH0gZnJvbSAnLi4vaW8vcHJpdmF0ZS9pby1oZWxwZXInO1xuXG4vKipcbiAqIFVzZXMgYERlc2NyaWJlRXZlbnRzYCB0byBnZXQgdGhlIGRldGFpbGVkIHJlYXNvbnMgZm9yIHdoeSBhIGNoYW5nZXNldCBmYWlsZWQgdG8gY3JlYXRlLCBpZiBhdmFpbGFibGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBDaGFuZ2VTZXRSZXNvdXJjZUVycm9yRmV0Y2hlciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgc2RrOiBTREssIHByaXZhdGUgcmVhZG9ubHkgZW52UmVzb3VyY2VzPzogRW52aXJvbm1lbnRSZXNvdXJjZXMpIHtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCB0aGUgZGV0YWlscyBhbmQgcmV0dXJuIHRoZW0gYXMgYSBzdHJpbmcuXG4gICAqXG4gICAqIElmIHRoZSBkZXRhaWxzIGNvdWxkIG5vdCBiZSBmZXRjaGVkLCBsb2cgdGhhdCBhcyBhIHdhcm5pbmcgdXNpbmcgdGhlIElvSGVscGVyLlxuICAgKlxuICAgKiAoVGhpcyBtZXRob2Qgd2lsbCBvbmx5IGV2ZXIgYmUgdXNlZCBmb3IgZWFybHkgdmFsaWRhdGlvbiwgc28gd2UgYXJlIG5vdCBnZW5lcmFsaXppbmdcbiAgICogdGhlIGVycm9yIG1lc3NhZ2UgaW4gaGVyZSkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZmV0Y2hEZXRhaWxzU3RyaW5nKGNoYW5nZVNldE5hbWU6IHN0cmluZywgc3RhY2tOYW1lOiBzdHJpbmcsIGlvSGVscGVyOiBJb0hlbHBlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgc3VtbWFyeSA9IGBFYXJseSB2YWxpZGF0aW9uIGZhaWxlZCBmb3Igc3RhY2sgJyR7c3RhY2tOYW1lfScgKENoYW5nZVNldCAnJHtjaGFuZ2VTZXROYW1lfScpYDtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmZldGNoRGV0YWlsc1N0cnVjdHVyZWQoY2hhbmdlU2V0TmFtZSwgc3RhY2tOYW1lKTtcblxuICAgIHN3aXRjaCAocmVzdWx0LnR5cGUpIHtcbiAgICAgIGNhc2UgJ2NvdWxkLW5vdC1jaGVjayc6XG4gICAgICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLndhcm4ocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gc3VtbWFyeTtcblxuICAgICAgY2FzZSAncmVzb3VyY2UtZXJyb3JzJzpcbiAgICAgICAgaWYgKHJlc3VsdC5lcnJvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHN1bW1hcnk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBgJHtzdW1tYXJ5fTpgLFxuICAgICAgICAgIC4uLnJlc3VsdC5lcnJvcnMubWFwKGUgPT4gYCAgLSAke2UubWVzc2FnZX0gKGF0ICR7ZS5kb2N1bWVudFBhdGh9KWApLFxuICAgICAgICBdLmpvaW4oJ1xcbicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCB0aGUgZGV0YWlscyBhbmQgcmV0dXJuIHRoZW0gaW4gc3RydWN0dXJlZCBmb3JtLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGZldGNoRGV0YWlsc1N0cnVjdHVyZWQoY2hhbmdlU2V0TmFtZTogc3RyaW5nLCBzdGFja05hbWU6IHN0cmluZyk6IFByb21pc2U8Q2hhbmdlU2V0RXJyb3JDaGVja1Jlc3VsdD4ge1xuICAgIGxldCBvcGVyYXRpb25FdmVudHM6IE9wZXJhdGlvbkV2ZW50W10gPSBbXTtcbiAgICB0cnkge1xuICAgICAgb3BlcmF0aW9uRXZlbnRzID0gYXdhaXQgdGhpcy5nZXRGYWlsZWRFdmVudHMoc3RhY2tOYW1lLCBjaGFuZ2VTZXROYW1lKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbGV0IGN1cnJlbnRWZXJzaW9uOiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBjdXJyZW50VmVyc2lvbiA9IChhd2FpdCB0aGlzLmVudlJlc291cmNlcz8ubG9va3VwVG9vbGtpdCgpKT8udmVyc2lvbjtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2NvdWxkLW5vdC1jaGVjaycsXG4gICAgICAgIG1lc3NhZ2U6IGBDb3VsZCBub3QgcmV0cmlldmUgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IGNoYW5nZSBzZXQgY3JlYXRpb24gZXJyb3JzICgke2Vycm9yfSkuIE1ha2Ugc3VyZSB5b3UgaGF2ZSBwZXJtaXNzaW9ucyB0byBjYWxsIHRoZSBEZXNjcmliZUV2ZW50cyBBUEksIG9yIHJlLWJvb3RzdHJhcCB5b3VyIGVudmlyb25tZW50IGJ5IHJ1bm5pbmcgJ2NkayBib290c3RyYXAnIHRvIHVwZGF0ZSB0aGUgQm9vdHN0cmFwIENESyBUb29sa2l0IHN0YWNrLiBCb290c3RyYXAgdG9vbGtpdCBzdGFjayB2ZXJzaW9uIDMwIG9yIGxhdGVyIGlzIG5lZWRlZDsgY3VycmVudCB2ZXJzaW9uOiAke2N1cnJlbnRWZXJzaW9uID8/ICd1bmtub3duJ30uYCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdyZXNvdXJjZS1lcnJvcnMnLFxuICAgICAgZXJyb3JzOiBvcGVyYXRpb25FdmVudHMubWFwKChldikgPT4gKHtcbiAgICAgICAgZXZlbnRUeXBlOiBldi5FdmVudFR5cGUgPz8gJycsXG4gICAgICAgIGxvZ2ljYWxJZDogZXYuTG9naWNhbFJlc291cmNlSWQgPz8gJycsXG4gICAgICAgIG1lc3NhZ2U6IGV2LlZhbGlkYXRpb25TdGF0dXNSZWFzb24gPz8gJycsXG4gICAgICAgIHBoeXNpY2FsSWQ6IGV2LlBoeXNpY2FsUmVzb3VyY2VJZCA/IGV2LlBoeXNpY2FsUmVzb3VyY2VJZCA6IHVuZGVmaW5lZCxcbiAgICAgICAgdmFsaWRhdGlvbk5hbWU6IGV2LlZhbGlkYXRpb25OYW1lID8/ICcnLFxuICAgICAgICBkb2N1bWVudFBhdGg6IGV2LlZhbGlkYXRpb25QYXRoID8/ICcnLFxuICAgICAgICByZXNvdXJjZVR5cGU6IGV2LlJlc291cmNlVHlwZSxcbiAgICAgIH0gc2F0aXNmaWVzIENoYW5nZVNldFJlc291cmNlRXJyb3IpKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRGYWlsZWRFdmVudHMoc3RhY2tOYW1lOiBzdHJpbmcsIGNoYW5nZVNldE5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnNkay5jbG91ZEZvcm1hdGlvbigpLnBhZ2luYXRlZERlc2NyaWJlRXZlbnRzKHtcbiAgICAgIFN0YWNrTmFtZTogc3RhY2tOYW1lLFxuICAgICAgQ2hhbmdlU2V0TmFtZTogY2hhbmdlU2V0TmFtZSxcbiAgICAgIEZpbHRlcnM6IHtcbiAgICAgICAgRmFpbGVkRXZlbnRzOiB0cnVlLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBDaGFuZ2VTZXRFcnJvckNoZWNrUmVzdWx0ID1cbiAgfCB7IHR5cGU6ICdjb3VsZC1ub3QtY2hlY2snOyBtZXNzYWdlOiBzdHJpbmcgfVxuICB8IHsgdHlwZTogJ3Jlc291cmNlLWVycm9ycyc7IGVycm9yczogQ2hhbmdlU2V0UmVzb3VyY2VFcnJvcltdIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhbmdlU2V0UmVzb3VyY2VFcnJvciB7XG4gIHJlYWRvbmx5IGxvZ2ljYWxJZDogc3RyaW5nO1xuICByZWFkb25seSBwaHlzaWNhbElkPzogc3RyaW5nO1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG5cbiAgcmVhZG9ubHkgcmVzb3VyY2VUeXBlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFeGFtcGxlOiBgVkFMSURBVElPTl9FUlJPUmBcbiAgICovXG4gIHJlYWRvbmx5IGV2ZW50VHlwZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFeGFtcGxlOiBgTkFNRV9DT05GTElDVF9WQUxJREFUSU9OYFxuICAgKi9cbiAgcmVhZG9ubHkgdmFsaWRhdGlvbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogRXhhbXBsZTogYC9SZXNvdXJjZXMvU29tZUJ1Y2tldEQ1QjcwNzA0YFxuICAgKi9cbiAgcmVhZG9ubHkgZG9jdW1lbnRQYXRoOiBzdHJpbmc7XG59XG4iXX0=
@@ -103,11 +103,12 @@ function formatResourceErrors(es) {
103
103
  for (const e of es) {
104
104
  const p = locateResourceError(e);
105
105
  const lastPart = p.split('/').slice(-1)[0];
106
- b.setNodeText(p, [
107
- `${lastPart} ${addendum(' ', e.resourceType, e.logicalId)}`.trim(),
108
- ...(0, tree_builder_1.sideBySide)(['🛑'], ' ', (0, tree_builder_1.wrapText)(120, e.message)),
109
- ...e.sourceTrace?.creationStackTrace ? (0, tree_builder_1.sideBySide)(['Source Location:'], ' ', e.sourceTrace?.creationStackTrace) : [],
110
- ].join('\n'));
106
+ const nodeText = b.nodeText(p);
107
+ nodeText.header = [`${lastPart} ${addendum(' ', e.resourceType, e.logicalId)}`.trim()];
108
+ nodeText.body.push(...(0, tree_builder_1.sideBySide)(['🛑'], ' ', (0, tree_builder_1.wrapText)(120, e.message)));
109
+ nodeText.footer = e.sourceTrace?.creationStackTrace
110
+ ? (0, tree_builder_1.sideBySide)(['Source Location:'], ' ', e.sourceTrace?.creationStackTrace)
111
+ : [];
111
112
  }
112
113
  return b.render();
113
114
  }
@@ -136,4 +137,4 @@ function addendum(sep, ...xs) {
136
137
  return '';
137
138
  }
138
139
  }
139
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhZ25vc2lzLWZvcm1hdHRpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkaWFnbm9zaXMtZm9ybWF0dGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVlBLDREQWFDO0FBS0QsOEVBMkJDO0FBekRELGlEQUFtRTtBQUVuRSwrREFBNEU7QUFDNUUscUNBQXVDO0FBRXZDLDJDQUFtQztBQUVuQzs7OztHQUlHO0FBQ0gsU0FBZ0Isd0JBQXdCLENBQUMsS0FBcUI7SUFDNUQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUUvQixRQUFRLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixLQUFLLFlBQVk7WUFDZixPQUFPLFlBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRWpGLEtBQUssU0FBUztZQUNaLE9BQU8sWUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFL0UsS0FBSyxrQkFBa0I7WUFDckIsT0FBTyxZQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN4RixDQUFDO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsaUNBQWlDLENBQUMsSUFBb0I7SUFDcEUsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEIsS0FBSyxZQUFZO1lBQ2YsTUFBTSxJQUFJLDRCQUFZLENBQUMseUJBQXlCLEVBQUUsbURBQW1ELENBQUMsQ0FBQztRQUV6RyxLQUFLLGtCQUFrQjtZQUNyQixNQUFNLElBQUksK0JBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLHNCQUFzQixDQUFDLENB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QUNOLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzaWRlQnlTaWRlLCBUcmVlQnVpbGRlciwgd3JhcFRleHQgfSBmcm9tICcuL3RyZWUtYnVpbGRlcic7XG5pbXBvcnQgdHlwZSB7IERpYWdub3NlZFN0YWNrLCBTdGFja0RpYWdub3NpcywgU3RhY2tQcm9ibGVtU291cmNlLCBUcmFjZWRSZXNvdXJjZUVycm9yIH0gZnJvbSAnLi4vLi4vYWN0aW9ucy9kaWFnbm9zZSc7XG5pbXBvcnQgeyBEZXBsb3ltZW50RXJyb3IsIFRvb2xraXRFcnJvciB9IGZyb20gJy4uLy4uL3Rvb2xraXQvdG9vbGtpdC1lcnJvcic7XG5pbXBvcnQgeyBzb3J0QnlLZXkgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB0eXBlIHsgQWN0aW9uTGVzc01lc3NhZ2UgfSBmcm9tICcuLi9pby9wcml2YXRlJztcbmltcG9ydCB7IElPIH0gZnJvbSAnLi4vaW8vcHJpdmF0ZSc7XG5cbi8qKlxuICogVHVybiB0aGUgZ2l2ZW4gc3RhY2sgZGlhZ25vc2lzIHJlc3VsdCBpbnRvIGFuIElPIG1lc3NhZ2UsIHdpdGggZGVmYXVsdCBtZXNzYWdlIGZvcm1hdHRpbmdcbiAqXG4gKiBUaGUgZGVmYXVsdCBtZXNzYWdlIGZvcm1hdHRpbmcgaXMgd2hhdCB0aGUgQ0xJIHdpbGwgcHJpbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBob3N0TWVzc2FnZUZyb21EaWFnbm9zaXMoc3RhY2s6IERpYWdub3NlZFN0YWNrKTogQWN0aW9uTGVzc01lc3NhZ2U8YW55PiB7XG4gIGNvbnN0IGRpYWdub3NpcyA9IHN0YWNrLnJlc3VsdDtcblxuICBzd2l0Y2ggKGRpYWdub3Npcy50eXBlKSB7XG4gICAgY2FzZSAnbm8tcHJvYmxlbSc6XG4gICAgICByZXR1cm4gSU8uQ0RLX1RPT0xLSVRfSTk1MDAubXNnKGZvcm1hdE5vUHJvYmxlbVN0YWNrKHN0YWNrLCBkaWFnbm9zaXMpLCBzdGFjayk7XG5cbiAgICBjYXNlICdwcm9ibGVtJzpcbiAgICAgIHJldHVybiBJTy5DREtfVE9PTEtJVF9FOTUwMC5tc2coZm9ybWF0UHJvYmxlbVN0YWNrKHN0YWNrLCBkaWFnbm9zaXMpLCBzdGFjayk7XG5cbiAgICBjYXNlICdlcnJvci1kaWFnbm9zaW5nJzpcbiAgICAgIHJldHVybiBJTy5DREtfVE9PTEtJVF9XOTUwMS5tc2coZm9ybWF0RGlhZ25vc2lzRXJyb3JTdGFjayhzdGFjaywgZGlhZ25vc2lzKSwgc3RhY2spO1xuICB9XG59XG5cbi8qKlxuICogVHVybiB0aGUgZ2l2ZW4gZGlhZ25vc2lzIGludG8gYSBEZXBsb3ltZW50RXJyb3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRocm93RGVwbG95bWVudEVycm9yRnJvbURpYWdub3NpcyhkaWFnOiBTdGFja0RpYWdub3Npcyk6IG5ldmVyIHtcbiAgc3dpdGNoIChkaWFnLnR5cGUpIHtcbiAgICBjYXNlICduby1wcm9ibGVtJzpcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0RlcGxveW1lbnRFcnJvck5vdEVycm9yJywgJ0RpYWdub3NpcyBzaG91bGQgcmVwcmVzZW50IGFuIGVycm9yLCBidXQgZG9lcyBub3QnKTtcblxuICAgIGNhc2UgJ2Vycm9yLWRpYWdub3NpbmcnOlxuICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFcnJvcihkaWFnLm1lc3NhZ2UsICdFcnJvckRpYWdub3Npc0ZhaWxlZCcpO1xuICB9XG4gIC8vIEd1YXJhbnRlZWQgJ3R5cGU9cHJvYmxlbScgaGVyZVxuXG4gIGNvbnN0IGVycm9yQ29kZSA9IGRpYWcucHJvYmxlbXNbMF0/LmVycm9yQ29kZTtcbiAgbGV0IGRlZmF1bHRFcnJvckNvZGU7XG4gIHN3aXRjaCAoZGlhZy5kZXRlY3RlZEJ5LnR5cGUpIHtcbiAgICBjYXNlICdjaGFuZ2Utc2V0JzpcbiAgICAgIGRlZmF1bHRFcnJvckNvZGUgPSAnQ2hhbmdlU2V0Q3JlYXRpb25GYWlsZWQnO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdlYXJseS12YWxpZGF0aW9uJzpcbiAgICAgIGRlZmF1bHRFcnJvckNvZGUgPSAnRWFybHlWYWxpZGF0aW9uRmFpbHVyZSc7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RlcGxveW1lbnQnOlxuICAgICAgZGVmYXVsdEVycm9yQ29kZSA9ICdTdGFja0RlcGxveUZhaWxlZCc7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHRocm93IG5ldyBEZXBsb3ltZW50RXJyb3IoZm9ybWF0UHJvYmxlbURpYWdub3NpcyhkaWFnKSwgZXJyb3JDb2RlID8/IGRlZmF1bHRFcnJvckNvZGUpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRQcm9ibGVtRGlhZ25vc2lzKGRpYWc6IEV4dHJhY3Q8U3RhY2tEaWFnbm9zaXMsIHsgdHlwZTogJ3Byb2JsZW0nIH0+KTogc3RyaW5nIHtcbiAgc3dpdGNoIChkaWFnLmRldGVjdGVkQnkudHlwZSkge1xuICAgIGNhc2UgJ2NoYW5nZS1zZXQnOlxuICAgICAgcmV0dXJuIGZvcm1hdENoYW5nZVNldFByb2JsZW1zKGRpYWcucHJvYmxlbXMsIGRpYWcuZGV0ZWN0ZWRCeSk7XG5cbiAgICBjYXNlICdlYXJseS12YWxpZGF0aW9uJzpcbiAgICAgIHJldHVybiBmb3JtYXRFYXJseVZhbGlkYXRpb25Qcm9ibGVtcyhkaWFnLnByb2JsZW1zLCBkaWFnLmRldGVjdGVkQnkpO1xuXG4gICAgY2FzZSAnZGVwbG95bWVudCc6XG4gICAgICByZXR1cm4gZm9ybWF0RGVwbG95bWVudFByb2JsZW1zKGRpYWcucHJvYmxlbXMsIGRpYWcuZGV0ZWN0ZWRCeSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0Q2hhbmdlU2V0UHJvYmxlbXMocHJvYmxlbXM6IFRyYWNlZFJlc291cmNlRXJyb3JbXSwgZGV0ZWN0ZWRCeTogRXh0cmFjdDxTdGFja1Byb2JsZW1Tb3VyY2UsIHsgdHlwZTogJ2NoYW5nZS1zZXQnIH0+KTogc3RyaW5nIHtcbiAgY29uc3QgY2FwdGlvbiA9IGBGYWlsZWQgdG8gY3JlYXRlIGNoYW5nZSBzZXQgJHtkZXRlY3RlZEJ5LmNoYW5nZVNldE5hbWV9YDtcblxuICBpZiAocHJvYmxlbXMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBgJHtjYXB0aW9ufTpcXG4ke2Zvcm1hdFJlc291cmNlRXJyb3JzKHByb2JsZW1zKX1gO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBgJHtjYXB0aW9ufTogJHtkZXRlY3RlZEJ5LnN0YXR1c1JlYXNvbn1gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEVhcmx5VmFsaWRhdGlvblByb2JsZW1zKHByb2JsZW1zOiBUcmFjZWRSZXNvdXJjZUVycm9yW10sIGRldGVjdGVkQnk6IEV4dHJhY3Q8U3RhY2tQcm9ibGVtU291cmNlLCB7IHR5cGU6ICdlYXJseS12YWxpZGF0aW9uJyB9Pik6IHN0cmluZyB7XG4gIGNvbnN0IGNhcHRpb24gPSBgRWFybHkgdmFsaWRhdGlvbiBmYWlsZWQgZm9yIGNoYW5nZSBzZXQgJHtkZXRlY3RlZEJ5LmNoYW5nZVNldE5hbWV9YDtcbiAgaWYgKHByb2JsZW1zLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gYCR7Y2FwdGlvbn06XFxuJHtmb3JtYXRSZXNvdXJjZUVycm9ycyhwcm9ibGVtcyl9YDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY2FwdGlvbjtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXREZXBsb3ltZW50UHJvYmxlbXMocHJvYmxlbXM6IFRyYWNlZFJlc291cmNlRXJyb3JbXSwgZGV0ZWN0ZWRCeTogRXh0cmFjdDxTdGFja1Byb2JsZW1Tb3VyY2UsIHsgdHlwZTogJ2RlcGxveW1lbnQnIH0+KTogc3RyaW5nIHtcbiAgY29uc3QgY2FwdGlvbiA9ICdSZXNvdXJjZSB1cGRhdGVzIGZhaWxlZCc7XG5cbiAgaWYgKHByb2JsZW1zLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gYCR7Y2FwdGlvbn06XFxuJHtmb3JtYXRSZXNvdXJjZUVycm9ycyhwcm9ibGVtcyl9YDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYCR7Y2FwdGlvbn0gKCR7ZGV0ZWN0ZWRCeS5zdGFja1N0YXR1c30pOiAke2RldGVjdGVkQnkuc3RhdHVzUmVhc29ufWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0Tm9Qcm9ibGVtU3RhY2soc3RhY2s6IERpYWdub3NlZFN0YWNrLCBfbTogRXh0cmFjdDxTdGFja0RpYWdub3NpcywgeyB0eXBlOiAnbm8tcHJvYmxlbScgfT4pIHtcbiAgLy8gVE9ETzogcHJpbnQgc3RhY2sgYnkgY29uc3RydWN0IHBhdGgsIG5vdCBuYW1lXG4gIHJldHVybiBg4pyFIFN0YWNrICR7c3RhY2suc3RhY2tOYW1lfTogbm8gaXNzdWVzIGZvdW5kLmA7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFByb2JsZW1TdGFjayhzdGFjazogRGlhZ25vc2VkU3RhY2ssIG06IEV4dHJhY3Q8U3RhY2tEaWFnbm9zaXMsIHsgdHlwZTogJ3Byb2JsZW0nIH0+KSB7XG4gIC8vIFRPRE86IHByaW50IHN0YWNrIGJ5IGNvbnN0cnVjdCBwYXRoLCBub3QgbmFtZVxuICByZXR1cm4gYOKdjCBTdGFjayAke3N0YWNrLnN0YWNrTmFtZX06XFxuJHtmb3JtYXRQcm9ibGVtRGlhZ25vc2lzKG0pfWA7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdERpYWdub3Npc0Vycm9yU3RhY2soc3RhY2s6IERpYWdub3NlZFN0YWNrLCBtOiBFeHRyYWN0PFN0YWNrRGlhZ25vc2lzLCB7IHR5cGU6ICdlcnJvci1kaWFnbm9zaW5nJyB9Pikge1xuICAvLyBUT0RPOiBwcmludCBzdGFjayBieSBjb25zdHJ1Y3QgcGF0aCwgbm90IG5hbWVcbiAgcmV0dXJuIGDimqDvuI8gQ291bGQgbm90IGRpYWdub3NlIHN0YWNrICR7c3RhY2suc3RhY2tOYW1lfTogJHttLm1lc3NhZ2V9YDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UmVzb3VyY2VFcnJvcnMoZXM6IFRyYWNlZFJlc291cmNlRXJyb3JbXSkge1xuICBzb3J0QnlLZXkoZXMsIChlKSA9PiBbbG9jYXRlUmVzb3VyY2VFcnJvcihlKV0pO1xuXG4gIGNvbnN0IGIgPSBuZXcgVHJlZUJ1aWxkZXIoJycpO1xuICBmb3IgKGNvbnN0IGUgb2YgZXMpIHtcbiAgICBjb25zdCBwID0gbG9jYXRlUmVzb3VyY2VFcnJvcihlKTtcbiAgICBjb25zdCBsYXN0UGFydCA9IHAuc3BsaXQoJy8nKS5zbGljZSgtMSlbMF07XG4gICAgYi5zZXROb2RlVGV4dChwLCBbXG4gICAgICBgJHtsYXN0UGFydH0gICR7YWRkZW5kdW0oJyAnLCBlLnJlc291cmNlVHlwZSwgZS5sb2dpY2FsSWQpfWAudHJpbSgpLFxuICAgICAgLi4uc2lkZUJ5U2lkZShbJ/Cfm5EnXSwgJyAnLCB3cmFwVGV4dCgxMjAsIGUubWVzc2FnZSkpLFxuICAgICAgLi4uZS5zb3VyY2VUcmFjZT8uY3JlYXRpb25TdGFja1RyYWNlID8gc2lkZUJ5U2lkZShbJ1NvdXJjZSBMb2NhdGlvbjonXSwgJyAnLCBlLnNvdXJjZVRyYWNlPy5jcmVhdGlvblN0YWNrVHJhY2UpIDogW10sXG4gICAgXS5qb2luKCdcXG4nKSk7XG4gIH1cbiAgcmV0dXJuIGIucmVuZGVyKCk7XG59XG5cbi8qKlxuICogUmV0dXJuIGEgLy1zZXBhcmF0ZWQgY29uc3RydWN0IHBhdGggZm9yIHRoZSBnaXZlbiBlcnJvciwgb3IgdHJ5IHRvIGJ1aWxkIGFzIGNsb3NlIGEgcmVwcmVzZW50aW9uIGFzIHBvc3NpYmxlIGlmIHdlIGRvbid0IGhhdmUgYSBjb25zdHJ1Y3QgcGF0aFxuICpcbiAqIFRoZSByb290IHdpbGwgYmUgdGhlIFwiYXBwXCJcbiAqL1xuZnVuY3Rpb24gbG9jYXRlUmVzb3VyY2VFcnJvcihlOiBUcmFjZWRSZXNvdXJjZUVycm9yKTogc3RyaW5nIHtcbiAgaWYgKGUuc291cmNlVHJhY2U/LmNvbnN0cnVjdFBhdGgpIHtcbiAgICByZXR1cm4gZS5zb3VyY2VUcmFjZT8uY29uc3RydWN0UGF0aDtcbiAgfVxuXG4gIGNvbnN0IG5lc3RlZFN0YWNrUGFydHMgPSBlLnBhcmVudFN0YWNrTG9naWNhbElkcy5tYXAoKGwpID0+IGBOZXN0ZWQgc3RhY2sgJHtsfWApO1xuICBpZiAoZS5sb2dpY2FsSWQpIHtcbiAgICByZXR1cm4gW2UudG9wTGV2ZWxTdGFja0hpZXJhcmNoaWNhbElkLCAuLi5uZXN0ZWRTdGFja1BhcnRzLCBlLmxvZ2ljYWxJZF0uam9pbignLycpO1xuICB9XG4gIC8vIE5vIGxvZ2ljYWwgSUQgbWVhbnMgd2UgYXJlIHRhcmdldGluZyB0aGUgc3RhY2sgaXRzZWxmXG4gIHJldHVybiBbZS50b3BMZXZlbFN0YWNrSGllcmFyY2hpY2FsSWQsIG5lc3RlZFN0YWNrUGFydHNdLmpvaW4oJy8nKTtcbn1cblxuZnVuY3Rpb24gYWRkZW5kdW0oc2VwOiBzdHJpbmcsIC4uLnhzOiBBcnJheTxzdHJpbmcgfCB1bmRlZmluZWQ+KTogc3RyaW5nIHtcbiAgeHMgPSB4cy5maWx0ZXIoeCA9PiB4ICYmIHR5cGVvZiB4ID09PSAnc3RyaW5nJyk7XG4gIGlmICh4cy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGAoJHt4cy5qb2luKHNlcCl9KWA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG59XG4iXX0=
140
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhZ25vc2lzLWZvcm1hdHRpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkaWFnbm9zaXMtZm9ybWF0dGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVlBLDREQWFDO0FBS0QsOEVBMkJDO0FBekRELGlEQUFtRTtBQUVuRSwrREFBNEU7QUFDNUUscUNBQXVDO0FBRXZDLDJDQUFtQztBQUVuQzs7OztHQUlHO0FBQ0gsU0FBZ0Isd0JBQXdCLENBQUMsS0FBcUI7SUFDNUQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUUvQixRQUFRLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixLQUFLLFlBQVk7WUFDZixPQUFPLFlBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRWpGLEtBQUssU0FBUztZQUNaLE9BQU8sWUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFL0UsS0FBSyxrQkFBa0I7WUFDckIsT0FBTyxZQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN4RixDQUFDO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsaUNBQWlDLENBQUMsSUFBb0I7SUFDcEUsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEIsS0FBSyxZQUFZO1lBQ2YsTUFBTSxJQUFJLDRCQUFZLENBQUMseUJBQXlCLEVBQUUsbURBQW1ELENBQUMsQ0FBQztRQUV6RyxLQUFLLGtCQUFrQjtZQUNyQixNQUFNLElBQUksK0JBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLHNCQUFzQixDQUFDLENB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Q2xCLE9BQU8sSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7SUFDN0IsQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc2lkZUJ5U2lkZSwgVHJlZUJ1aWxkZXIsIHdyYXBUZXh0IH0gZnJvbSAnLi90cmVlLWJ1aWxkZXInO1xuaW1wb3J0IHR5cGUgeyBEaWFnbm9zZWRTdGFjaywgU3RhY2tEaWFnbm9zaXMsIFN0YWNrUHJvYmxlbVNvdXJjZSwgVHJhY2VkUmVzb3VyY2VFcnJvciB9IGZyb20gJy4uLy4uL2FjdGlvbnMvZGlhZ25vc2UnO1xuaW1wb3J0IHsgRGVwbG95bWVudEVycm9yLCBUb29sa2l0RXJyb3IgfSBmcm9tICcuLi8uLi90b29sa2l0L3Rvb2xraXQtZXJyb3InO1xuaW1wb3J0IHsgc29ydEJ5S2V5IH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgdHlwZSB7IEFjdGlvbkxlc3NNZXNzYWdlIH0gZnJvbSAnLi4vaW8vcHJpdmF0ZSc7XG5pbXBvcnQgeyBJTyB9IGZyb20gJy4uL2lvL3ByaXZhdGUnO1xuXG4vKipcbiAqIFR1cm4gdGhlIGdpdmVuIHN0YWNrIGRpYWdub3NpcyByZXN1bHQgaW50byBhbiBJTyBtZXNzYWdlLCB3aXRoIGRlZmF1bHQgbWVzc2FnZSBmb3JtYXR0aW5nXG4gKlxuICogVGhlIGRlZmF1bHQgbWVzc2FnZSBmb3JtYXR0aW5nIGlzIHdoYXQgdGhlIENMSSB3aWxsIHByaW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaG9zdE1lc3NhZ2VGcm9tRGlhZ25vc2lzKHN0YWNrOiBEaWFnbm9zZWRTdGFjayk6IEFjdGlvbkxlc3NNZXNzYWdlPGFueT4ge1xuICBjb25zdCBkaWFnbm9zaXMgPSBzdGFjay5yZXN1bHQ7XG5cbiAgc3dpdGNoIChkaWFnbm9zaXMudHlwZSkge1xuICAgIGNhc2UgJ25vLXByb2JsZW0nOlxuICAgICAgcmV0dXJuIElPLkNES19UT09MS0lUX0k5NTAwLm1zZyhmb3JtYXROb1Byb2JsZW1TdGFjayhzdGFjaywgZGlhZ25vc2lzKSwgc3RhY2spO1xuXG4gICAgY2FzZSAncHJvYmxlbSc6XG4gICAgICByZXR1cm4gSU8uQ0RLX1RPT0xLSVRfRTk1MDAubXNnKGZvcm1hdFByb2JsZW1TdGFjayhzdGFjaywgZGlhZ25vc2lzKSwgc3RhY2spO1xuXG4gICAgY2FzZSAnZXJyb3ItZGlhZ25vc2luZyc6XG4gICAgICByZXR1cm4gSU8uQ0RLX1RPT0xLSVRfVzk1MDEubXNnKGZvcm1hdERpYWdub3Npc0Vycm9yU3RhY2soc3RhY2ssIGRpYWdub3NpcyksIHN0YWNrKTtcbiAgfVxufVxuXG4vKipcbiAqIFR1cm4gdGhlIGdpdmVuIGRpYWdub3NpcyBpbnRvIGEgRGVwbG95bWVudEVycm9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aHJvd0RlcGxveW1lbnRFcnJvckZyb21EaWFnbm9zaXMoZGlhZzogU3RhY2tEaWFnbm9zaXMpOiBuZXZlciB7XG4gIHN3aXRjaCAoZGlhZy50eXBlKSB7XG4gICAgY2FzZSAnbm8tcHJvYmxlbSc6XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdEZXBsb3ltZW50RXJyb3JOb3RFcnJvcicsICdEaWFnbm9zaXMgc2hvdWxkIHJlcHJlc2VudCBhbiBlcnJvciwgYnV0IGRvZXMgbm90Jyk7XG5cbiAgICBjYXNlICdlcnJvci1kaWFnbm9zaW5nJzpcbiAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXJyb3IoZGlhZy5tZXNzYWdlLCAnRXJyb3JEaWFnbm9zaXNGYWlsZWQnKTtcbiAgfVxuICAvLyBHdWFyYW50ZWVkICd0eXBlPXByb2JsZW0nIGhlcmVcblxuICBjb25zdCBlcnJvckNvZGUgPSBkaWFnLnByb2JsZW1zWzBdPy5lcnJvckNvZGU7XG4gIGxldCBkZWZhdWx0RXJyb3JDb2RlO1xuICBzd2l0Y2ggKGRpYWcuZGV0ZWN0ZWRCeS50eXBlKSB7XG4gICAgY2FzZSAnY2hhbmdlLXNldCc6XG4gICAgICBkZWZhdWx0RXJyb3JDb2RlID0gJ0NoYW5nZVNldENyZWF0aW9uRmFpbGVkJztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZWFybHktdmFsaWRhdGlvbic6XG4gICAgICBkZWZhdWx0RXJyb3JDb2RlID0gJ0Vhcmx5VmFsaWRhdGlvbkZhaWx1cmUnO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdkZXBsb3ltZW50JzpcbiAgICAgIGRlZmF1bHRFcnJvckNvZGUgPSAnU3RhY2tEZXBsb3lGYWlsZWQnO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICB0aHJvdyBuZXcgRGVwbG95bWVudEVycm9yKGZvcm1hdFByb2JsZW1EaWFnbm9zaXMoZGlhZyksIGVycm9yQ29kZSA/PyBkZWZhdWx0RXJyb3JDb2RlKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UHJvYmxlbURpYWdub3NpcyhkaWFnOiBFeHRyYWN0PFN0YWNrRGlhZ25vc2lzLCB7IHR5cGU6ICdwcm9ibGVtJyB9Pik6IHN0cmluZyB7XG4gIHN3aXRjaCAoZGlhZy5kZXRlY3RlZEJ5LnR5cGUpIHtcbiAgICBjYXNlICdjaGFuZ2Utc2V0JzpcbiAgICAgIHJldHVybiBmb3JtYXRDaGFuZ2VTZXRQcm9ibGVtcyhkaWFnLnByb2JsZW1zLCBkaWFnLmRldGVjdGVkQnkpO1xuXG4gICAgY2FzZSAnZWFybHktdmFsaWRhdGlvbic6XG4gICAgICByZXR1cm4gZm9ybWF0RWFybHlWYWxpZGF0aW9uUHJvYmxlbXMoZGlhZy5wcm9ibGVtcywgZGlhZy5kZXRlY3RlZEJ5KTtcblxuICAgIGNhc2UgJ2RlcGxveW1lbnQnOlxuICAgICAgcmV0dXJuIGZvcm1hdERlcGxveW1lbnRQcm9ibGVtcyhkaWFnLnByb2JsZW1zLCBkaWFnLmRldGVjdGVkQnkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcm1hdENoYW5nZVNldFByb2JsZW1zKHByb2JsZW1zOiBUcmFjZWRSZXNvdXJjZUVycm9yW10sIGRldGVjdGVkQnk6IEV4dHJhY3Q8U3RhY2tQcm9ibGVtU291cmNlLCB7IHR5cGU6ICdjaGFuZ2Utc2V0JyB9Pik6IHN0cmluZyB7XG4gIGNvbnN0IGNhcHRpb24gPSBgRmFpbGVkIHRvIGNyZWF0ZSBjaGFuZ2Ugc2V0ICR7ZGV0ZWN0ZWRCeS5jaGFuZ2VTZXROYW1lfWA7XG5cbiAgaWYgKHByb2JsZW1zLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gYCR7Y2FwdGlvbn06XFxuJHtmb3JtYXRSZXNvdXJjZUVycm9ycyhwcm9ibGVtcyl9YDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYCR7Y2FwdGlvbn06ICR7ZGV0ZWN0ZWRCeS5zdGF0dXNSZWFzb259YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXRFYXJseVZhbGlkYXRpb25Qcm9ibGVtcyhwcm9ibGVtczogVHJhY2VkUmVzb3VyY2VFcnJvcltdLCBkZXRlY3RlZEJ5OiBFeHRyYWN0PFN0YWNrUHJvYmxlbVNvdXJjZSwgeyB0eXBlOiAnZWFybHktdmFsaWRhdGlvbicgfT4pOiBzdHJpbmcge1xuICBjb25zdCBjYXB0aW9uID0gYEVhcmx5IHZhbGlkYXRpb24gZmFpbGVkIGZvciBjaGFuZ2Ugc2V0ICR7ZGV0ZWN0ZWRCeS5jaGFuZ2VTZXROYW1lfWA7XG4gIGlmIChwcm9ibGVtcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGAke2NhcHRpb259OlxcbiR7Zm9ybWF0UmVzb3VyY2VFcnJvcnMocHJvYmxlbXMpfWA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNhcHRpb247XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0RGVwbG95bWVudFByb2JsZW1zKHByb2JsZW1zOiBUcmFjZWRSZXNvdXJjZUVycm9yW10sIGRldGVjdGVkQnk6IEV4dHJhY3Q8U3RhY2tQcm9ibGVtU291cmNlLCB7IHR5cGU6ICdkZXBsb3ltZW50JyB9Pik6IHN0cmluZyB7XG4gIGNvbnN0IGNhcHRpb24gPSAnUmVzb3VyY2UgdXBkYXRlcyBmYWlsZWQnO1xuXG4gIGlmIChwcm9ibGVtcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGAke2NhcHRpb259OlxcbiR7Zm9ybWF0UmVzb3VyY2VFcnJvcnMocHJvYmxlbXMpfWA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGAke2NhcHRpb259ICgke2RldGVjdGVkQnkuc3RhY2tTdGF0dXN9KTogJHtkZXRlY3RlZEJ5LnN0YXR1c1JlYXNvbn1gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcm1hdE5vUHJvYmxlbVN0YWNrKHN0YWNrOiBEaWFnbm9zZWRTdGFjaywgX206IEV4dHJhY3Q8U3RhY2tEaWFnbm9zaXMsIHsgdHlwZTogJ25vLXByb2JsZW0nIH0+KSB7XG4gIC8vIFRPRE86IHByaW50IHN0YWNrIGJ5IGNvbnN0cnVjdCBwYXRoLCBub3QgbmFtZVxuICByZXR1cm4gYOKchSBTdGFjayAke3N0YWNrLnN0YWNrTmFtZX06IG5vIGlzc3VlcyBmb3VuZC5gO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRQcm9ibGVtU3RhY2soc3RhY2s6IERpYWdub3NlZFN0YWNrLCBtOiBFeHRyYWN0PFN0YWNrRGlhZ25vc2lzLCB7IHR5cGU6ICdwcm9ibGVtJyB9Pikge1xuICAvLyBUT0RPOiBwcmludCBzdGFjayBieSBjb25zdHJ1Y3QgcGF0aCwgbm90IG5hbWVcbiAgcmV0dXJuIGDinYwgU3RhY2sgJHtzdGFjay5zdGFja05hbWV9OlxcbiR7Zm9ybWF0UHJvYmxlbURpYWdub3NpcyhtKX1gO1xufVxuXG5mdW5jdGlvbiBmb3JtYXREaWFnbm9zaXNFcnJvclN0YWNrKHN0YWNrOiBEaWFnbm9zZWRTdGFjaywgbTogRXh0cmFjdDxTdGFja0RpYWdub3NpcywgeyB0eXBlOiAnZXJyb3ItZGlhZ25vc2luZycgfT4pIHtcbiAgLy8gVE9ETzogcHJpbnQgc3RhY2sgYnkgY29uc3RydWN0IHBhdGgsIG5vdCBuYW1lXG4gIHJldHVybiBg4pqg77iPIENvdWxkIG5vdCBkaWFnbm9zZSBzdGFjayAke3N0YWNrLnN0YWNrTmFtZX06ICR7bS5tZXNzYWdlfWA7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFJlc291cmNlRXJyb3JzKGVzOiBUcmFjZWRSZXNvdXJjZUVycm9yW10pIHtcbiAgc29ydEJ5S2V5KGVzLCAoZSkgPT4gW2xvY2F0ZVJlc291cmNlRXJyb3IoZSldKTtcblxuICBjb25zdCBiID0gbmV3IFRyZWVCdWlsZGVyKCcnKTtcbiAgZm9yIChjb25zdCBlIG9mIGVzKSB7XG4gICAgY29uc3QgcCA9IGxvY2F0ZVJlc291cmNlRXJyb3IoZSk7XG4gICAgY29uc3QgbGFzdFBhcnQgPSBwLnNwbGl0KCcvJykuc2xpY2UoLTEpWzBdO1xuXG4gICAgY29uc3Qgbm9kZVRleHQgPSBiLm5vZGVUZXh0KHApO1xuICAgIG5vZGVUZXh0LmhlYWRlciA9IFtgJHtsYXN0UGFydH0gICR7YWRkZW5kdW0oJyAnLCBlLnJlc291cmNlVHlwZSwgZS5sb2dpY2FsSWQpfWAudHJpbSgpXTtcbiAgICBub2RlVGV4dC5ib2R5LnB1c2goLi4uc2lkZUJ5U2lkZShbJ/Cfm5EnXSwgJyAnLCB3cmFwVGV4dCgxMjAsIGUubWVzc2FnZSkpKTtcbiAgICBub2RlVGV4dC5mb290ZXIgPSBlLnNvdXJjZVRyYWNlPy5jcmVhdGlvblN0YWNrVHJhY2VcbiAgICAgID8gc2lkZUJ5U2lkZShbJ1NvdXJjZSBMb2NhdGlvbjonXSwgJyAnLCBlLnNvdXJjZVRyYWNlPy5jcmVhdGlvblN0YWNrVHJhY2UpXG4gICAgICA6IFtdO1xuICB9XG4gIHJldHVybiBiLnJlbmRlcigpO1xufVxuXG4vKipcbiAqIFJldHVybiBhIC8tc2VwYXJhdGVkIGNvbnN0cnVjdCBwYXRoIGZvciB0aGUgZ2l2ZW4gZXJyb3IsIG9yIHRyeSB0byBidWlsZCBhcyBjbG9zZSBhIHJlcHJlc2VudGlvbiBhcyBwb3NzaWJsZSBpZiB3ZSBkb24ndCBoYXZlIGEgY29uc3RydWN0IHBhdGhcbiAqXG4gKiBUaGUgcm9vdCB3aWxsIGJlIHRoZSBcImFwcFwiXG4gKi9cbmZ1bmN0aW9uIGxvY2F0ZVJlc291cmNlRXJyb3IoZTogVHJhY2VkUmVzb3VyY2VFcnJvcik6IHN0cmluZyB7XG4gIGlmIChlLnNvdXJjZVRyYWNlPy5jb25zdHJ1Y3RQYXRoKSB7XG4gICAgcmV0dXJuIGUuc291cmNlVHJhY2U/LmNvbnN0cnVjdFBhdGg7XG4gIH1cblxuICBjb25zdCBuZXN0ZWRTdGFja1BhcnRzID0gZS5wYXJlbnRTdGFja0xvZ2ljYWxJZHMubWFwKChsKSA9PiBgTmVzdGVkIHN0YWNrICR7bH1gKTtcbiAgaWYgKGUubG9naWNhbElkKSB7XG4gICAgcmV0dXJuIFtlLnRvcExldmVsU3RhY2tIaWVyYXJjaGljYWxJZCwgLi4ubmVzdGVkU3RhY2tQYXJ0cywgZS5sb2dpY2FsSWRdLmpvaW4oJy8nKTtcbiAgfVxuICAvLyBObyBsb2dpY2FsIElEIG1lYW5zIHdlIGFyZSB0YXJnZXRpbmcgdGhlIHN0YWNrIGl0c2VsZlxuICByZXR1cm4gW2UudG9wTGV2ZWxTdGFja0hpZXJhcmNoaWNhbElkLCBuZXN0ZWRTdGFja1BhcnRzXS5qb2luKCcvJyk7XG59XG5cbmZ1bmN0aW9uIGFkZGVuZHVtKHNlcDogc3RyaW5nLCAuLi54czogQXJyYXk8c3RyaW5nIHwgdW5kZWZpbmVkPik6IHN0cmluZyB7XG4gIHhzID0geHMuZmlsdGVyKHggPT4geCAmJiB0eXBlb2YgeCA9PT0gJ3N0cmluZycpO1xuICBpZiAoeHMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBgKCR7eHMuam9pbihzZXApfSlgO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAnJztcbiAgfVxufVxuIl19
@@ -58,6 +58,13 @@ export declare class CloudFormationStackDiagnoser {
58
58
  * and then potentially going to fetch additional information using additional API calls.
59
59
  */
60
60
  private _diagnoseChangeSetFailure;
61
+ /**
62
+ * Try to read the resource-specific reasons for a changeset failure from `DescribeEvents`.
63
+ *
64
+ * If we couldn't read the events or there are 0 errors returned by that API, return a generic
65
+ * error.
66
+ */
67
+ private _reportChangeSetFailureFromEvents;
61
68
  private addErrorTraces;
62
69
  private addErrorTrace;
63
70
  /**