cdktn 0.25.0-pre.9 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/.jsii +2191 -422
  2. package/README.md +12 -0
  3. package/lib/annotations.js +1 -1
  4. package/lib/app.js +1 -1
  5. package/lib/aspect.js +1 -1
  6. package/lib/asset-hash.d.ts +75 -0
  7. package/lib/asset-hash.js +129 -0
  8. package/lib/asset-staging.d.ts +180 -0
  9. package/lib/asset-staging.js +464 -0
  10. package/lib/assets.d.ts +401 -0
  11. package/lib/assets.js +333 -0
  12. package/lib/backends/azurerm-backend.js +2 -2
  13. package/lib/backends/cloud-backend.js +10 -7
  14. package/lib/backends/consul-backend.js +2 -2
  15. package/lib/backends/cos-backend.js +2 -2
  16. package/lib/backends/gcs-backend.js +2 -2
  17. package/lib/backends/http-backend.js +2 -2
  18. package/lib/backends/local-backend.js +2 -2
  19. package/lib/backends/oss-backend.js +2 -2
  20. package/lib/backends/pg-backend.js +2 -2
  21. package/lib/backends/remote-backend.js +4 -4
  22. package/lib/backends/s3-backend.js +2 -2
  23. package/lib/backends/swift-backend.js +2 -2
  24. package/lib/complex-computed-list.js +26 -26
  25. package/lib/errors.d.ts +16 -0
  26. package/lib/errors.js +51 -3
  27. package/lib/functions/provider-function.js +1 -1
  28. package/lib/functions/terraform-functions.generated.js +1 -1
  29. package/lib/ignore-strategy.d.ts +82 -0
  30. package/lib/ignore-strategy.js +29 -0
  31. package/lib/importable-resource.js +7 -4
  32. package/lib/index.d.ts +4 -0
  33. package/lib/index.js +5 -1
  34. package/lib/manifest.js +1 -1
  35. package/lib/private/fs.d.ts +74 -2
  36. package/lib/private/fs.js +93 -14
  37. package/lib/resource.js +1 -1
  38. package/lib/synthesize/synthesizer.js +9 -22
  39. package/lib/terraform-asset.d.ts +68 -5
  40. package/lib/terraform-asset.js +86 -36
  41. package/lib/terraform-backend.js +1 -1
  42. package/lib/terraform-count.js +1 -1
  43. package/lib/terraform-data-resource.d.ts +1 -1
  44. package/lib/terraform-data-resource.js +8 -5
  45. package/lib/terraform-data-source.js +1 -1
  46. package/lib/terraform-element.js +1 -1
  47. package/lib/terraform-ephemeral-resource.js +1 -1
  48. package/lib/terraform-functions.js +1 -1
  49. package/lib/terraform-hcl-module.js +1 -1
  50. package/lib/terraform-iterator.js +6 -6
  51. package/lib/terraform-local.js +1 -1
  52. package/lib/terraform-module.js +1 -1
  53. package/lib/terraform-operators.js +1 -1
  54. package/lib/terraform-output.js +1 -1
  55. package/lib/terraform-provider.js +1 -1
  56. package/lib/terraform-provisioner.js +1 -1
  57. package/lib/terraform-remote-state.js +1 -1
  58. package/lib/terraform-resource-targets.js +1 -1
  59. package/lib/terraform-resource.js +9 -4
  60. package/lib/terraform-stack.js +1 -1
  61. package/lib/terraform-variable.js +2 -2
  62. package/lib/testing/adapters/jest.d.ts +2 -1
  63. package/lib/testing/adapters/jest.js +3 -3
  64. package/lib/testing/index.js +1 -1
  65. package/lib/testing/matchers.d.ts +34 -30
  66. package/lib/testing/matchers.js +292 -89
  67. package/lib/tokens/lazy.js +2 -2
  68. package/lib/tokens/resolvable.js +2 -2
  69. package/lib/tokens/string-fragments.js +2 -2
  70. package/lib/tokens/token.js +2 -2
  71. package/lib/upgrade-id-aspect.js +1 -1
  72. package/lib/validations/index.d.ts +0 -1
  73. package/lib/validations/index.js +1 -2
  74. package/package.json +17 -3
  75. package/scripts/pack.mjs +27 -12
  76. package/lib/validations/validate-binary-version.d.ts +0 -23
  77. package/lib/validations/validate-binary-version.js +0 -91
  78. package/lib/validations/validate-terraform-version.d.ts +0 -13
  79. package/lib/validations/validate-terraform-version.js +0 -23
package/lib/errors.js CHANGED
@@ -4,8 +4,8 @@
4
4
  * SPDX-License-Identifier: MPL-2.0
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.unableToResolveCircularReference = exports.argToIntrinsicMustBePlainValue = exports.indexTooLargeToEncode = exports.canOnlyEncodePositiveIntegers = exports.doesNotImplementDependableTrait = exports.cannotConcatenateStringsInTokenizedMap = exports.mapValueAddedToReferenceList = exports.numberValueAddedToReferenceList = exports.cannotConcatenateStringsInTokenizedStringArray = exports.stringValueAddedToReferenceList = exports.cannotCalcIdForEmptySetOfComponents = exports.functionArgumentValidationFailure = exports.functionReceivedWrongNumberOfArgs = exports.listElementIsOfWrongType = exports.valueIsInvalidNumberOrToken = exports.valueIsInvalidStringOrToken = exports.encounteredAnnotationWithLevelError = exports.valueContainsUnescapedQuotes = exports.cloudBackendWorkspaceIsNotDefinedByName = exports.constructDependencyBelowV10 = exports.sourceOrTargetNotAnObject = exports.targetNotResolvableWithOverrides = exports.invalidStack = exports.expectNotGloballyAccessible = exports.jestNotInstantiated = exports.matchersFoundErrorsInStack = exports.matchersPathIsNotDirectory = exports.stackValidationFailure = exports.stackHasCircularDependency = exports.noStackForConstruct = exports.stackIdContainsWhitespace = exports.stackContainsDisallowedChar = exports.resourceGivenTwoMoveOperationsByTarget = exports.resourceGivenTwoMoveOperationsById = exports.resourceGivenTwoMoveOperationsByTargetAndId = exports.movedToResourceOfDifferentType = exports.moveTargetNotSet = exports.moveTargetAlreadySet = exports.modulesWithSameAlias = exports.iteratorOnResourceWithoutForEach = exports.iteratorOnResourceWithCount = exports.unresolvedTokenInConstructId = exports.dynamicBlockNotSupported = exports.assetTypeNotImplemented = exports.assetExpectsDirectory = exports.assetOutOfScopeOfCDKTFJson = exports.providerVersionMismatch = exports.appValidationFailure = exports.constructsOutsideOfStacks = exports.noAppFound = void 0;
8
- exports.terraformModuleHasChildren = exports.unknownProviderFeature = exports.assetCanNotCreateZipArchive = exports.IdIncludesUnresolvedTokens = exports.unrecognizedTokenKey = exports.unknownNumberTokenFound = exports.mapKeyMustResolveToString = exports.constructsCannotBeResolved = exports.encodedMapTokenInScalarNumberContext = exports.encodedMapTokenInScalarStringContext = exports.encodedListTokenInScalarStringContext = exports.cannotResolveFunction = void 0;
7
+ exports.encounteredAnnotationWithLevelError = exports.valueContainsUnescapedQuotes = exports.cloudBackendWorkspaceIsNotDefinedByName = exports.constructDependencyBelowV10 = exports.sourceOrTargetNotAnObject = exports.targetNotResolvableWithOverrides = exports.invalidStack = exports.expectNotGloballyAccessible = exports.jestNotInstantiated = exports.matchersFoundErrorsInStack = exports.matchersPathIsNotDirectory = exports.stackValidationFailure = exports.stackHasCircularDependency = exports.noStackForConstruct = exports.stackIdContainsWhitespace = exports.stackContainsDisallowedChar = exports.resourceGivenTwoMoveOperationsByTarget = exports.resourceGivenTwoMoveOperationsById = exports.resourceGivenTwoMoveOperationsByTargetAndId = exports.movedToResourceOfDifferentType = exports.moveTargetNotSet = exports.moveTargetAlreadySet = exports.modulesWithSameAlias = exports.iteratorOnResourceWithoutForEach = exports.iteratorOnResourceWithCount = exports.unresolvedTokenInConstructId = exports.dynamicBlockNotSupported = exports.chainBundlerAllDeclined = exports.chainBundlerConflictingOutputFileName = exports.chainBundlerRequiresAtLeastOneBundler = exports.assetBundlerOutputFileNameInvalid = exports.assetStagingAlreadyStaged = exports.assetStagingBundlerDirectoryOutputNeedsDirectoryPackaging = exports.assetStagingBundlerFileOutputNeedsFilePackaging = exports.assetStagingBundlerOutputNotFile = exports.assetStagingBundlerOutputNotDirectory = exports.assetHashInvalid = exports.assetHashOutOfScopeCdktnJson = exports.assetHashTypeUnknown = exports.assetHashConflictingHashType = exports.assetHashTypeCustomRequiresHash = exports.assetStagingConflictingExcludeOptions = exports.assetHashConflictingExcludeOptions = exports.assetTypeNotImplemented = exports.assetExpectsDirectory = exports.assetOutOfScopeOfCDKTFJson = exports.providerVersionMismatch = exports.appValidationFailure = exports.constructsOutsideOfStacks = exports.noAppFound = void 0;
8
+ exports.terraformModuleHasChildren = exports.unknownProviderFeature = exports.assetCanNotCreateZipArchive = exports.IdIncludesUnresolvedTokens = exports.unrecognizedTokenKey = exports.unknownNumberTokenFound = exports.mapKeyMustResolveToString = exports.constructsCannotBeResolved = exports.encodedMapTokenInScalarNumberContext = exports.encodedMapTokenInScalarStringContext = exports.encodedListTokenInScalarStringContext = exports.cannotResolveFunction = exports.unableToResolveCircularReference = exports.argToIntrinsicMustBePlainValue = exports.indexTooLargeToEncode = exports.canOnlyEncodePositiveIntegers = exports.doesNotImplementDependableTrait = exports.cannotConcatenateStringsInTokenizedMap = exports.mapValueAddedToReferenceList = exports.numberValueAddedToReferenceList = exports.cannotConcatenateStringsInTokenizedStringArray = exports.stringValueAddedToReferenceList = exports.cannotCalcIdForEmptySetOfComponents = exports.functionArgumentValidationFailure = exports.functionReceivedWrongNumberOfArgs = exports.listElementIsOfWrongType = exports.valueIsInvalidNumberOrToken = exports.valueIsInvalidStringOrToken = void 0;
9
9
  const noAppFound = (constructPath) => new Error(`No app could be identified for the construct at path '${constructPath}' (likely a TerraformStack).
10
10
  The scope of CDKTN's TerraformStack class is a single App instance created by 'const app = new App()'. The App is your project's root, holding project configuration and validations.
11
11
  Learn more about the App: https://cdktn.io/docs/concepts/cdktn-architecture#app-class
@@ -44,6 +44,54 @@ Take one of these values from the AssetType Enum.
44
44
  Learn more about TerraformAsset: https://cdktn.io/docs/concepts/assets
45
45
  `);
46
46
  exports.assetTypeNotImplemented = assetTypeNotImplemented;
47
+ const assetHashConflictingExcludeOptions = () => new Error(`Both 'exclude' and 'ignoreStrategy' were passed to AssetHash.of(), but 'ignoreStrategy' replaces 'exclude' rather than combining with it. Pass only one.`);
48
+ exports.assetHashConflictingExcludeOptions = assetHashConflictingExcludeOptions;
49
+ const assetStagingConflictingExcludeOptions = (id) => new Error(`TerraformAsset ${id} was configured with both 'exclude' and 'ignoreStrategy', but 'ignoreStrategy' replaces 'exclude' rather than combining with it. Pass only one.
50
+ Learn more about TerraformAsset: https://cdktn.io/docs/concepts/assets`);
51
+ exports.assetStagingConflictingExcludeOptions = assetStagingConflictingExcludeOptions;
52
+ const assetHashTypeCustomRequiresHash = (id) => new Error(`TerraformAsset ${id} was configured with assetHashType 'CUSTOM' but no 'assetHash'. A custom hash type requires an explicit 'assetHash' value.
53
+ Learn more about TerraformAsset: https://cdktn.io/docs/concepts/assets`);
54
+ exports.assetHashTypeCustomRequiresHash = assetHashTypeCustomRequiresHash;
55
+ const assetHashConflictingHashType = (id) => new Error(`TerraformAsset ${id} was configured with an explicit 'assetHash', so 'assetHashType' must be undefined or 'CUSTOM'.
56
+ Learn more about TerraformAsset: https://cdktn.io/docs/concepts/assets`);
57
+ exports.assetHashConflictingHashType = assetHashConflictingHashType;
58
+ const assetHashTypeUnknown = (id, assetHashType) => new Error(`TerraformAsset ${id} was configured with an unknown assetHashType '${String(assetHashType)}'. Use one of AssetHashType.SOURCE, AssetHashType.OUTPUT, or AssetHashType.CUSTOM.
59
+ Learn more about TerraformAsset: https://cdktn.io/docs/concepts/assets`);
60
+ exports.assetHashTypeUnknown = assetHashTypeUnknown;
61
+ const assetHashOutOfScopeCdktnJson = (configPath) => new Error(`AssetHash.of() was called with a relative path '${configPath}', but we cannot find the cdktf.json above your current working directory '${process.cwd()}'
62
+
63
+ The cdktf.json file is needed to establish the base for the relative path (the '.' in './foo/bar'), so that the hash matches TerraformAsset for the same source.
64
+
65
+ Place a cdktf.json at the root of your project, or pass an absolute path. Learn more: https://cdktn.io/docs/create-and-deploy/configuration-file
66
+ `);
67
+ exports.assetHashOutOfScopeCdktnJson = assetHashOutOfScopeCdktnJson;
68
+ const assetHashInvalid = (id, assetHash) => new Error(`TerraformAsset ${id} resolved an 'assetHash' of '${assetHash}', but it names the staged asset file and so may only contain letters, digits, '_', '.' and '-'.
69
+ Learn more about TerraformAsset: https://cdktn.io/docs/concepts/assets`);
70
+ exports.assetHashInvalid = assetHashInvalid;
71
+ const assetStagingBundlerOutputNotDirectory = (id, produced) => new Error(`TerraformAsset ${id}'s bundler returned a directory result at '${produced}', which is not a directory. Return 'BundleResult.file(...)' for a single-file artifact, or write a directory into 'options.outputDir' and return 'BundleResult.directory(...)'.
72
+ Learn more about TerraformAsset: https://cdktn.io/docs/concepts/assets`);
73
+ exports.assetStagingBundlerOutputNotDirectory = assetStagingBundlerOutputNotDirectory;
74
+ const assetStagingBundlerOutputNotFile = (id, produced) => new Error(`TerraformAsset ${id}'s bundler returned a file result at '${produced}', which is not a file. Return 'BundleResult.directory(...)' for a directory artifact, or write a single file into 'options.outputDir' and return 'BundleResult.file(...)'.
75
+ Learn more about TerraformAsset: https://cdktn.io/docs/concepts/assets`);
76
+ exports.assetStagingBundlerOutputNotFile = assetStagingBundlerOutputNotFile;
77
+ const assetStagingBundlerFileOutputNeedsFilePackaging = (id) => new Error(`TerraformAsset ${id}'s bundler produced a single-file artifact (BundleResult.file), which stages verbatim and so needs AssetType.FILE. Use AssetType.FILE for a file-producing bundler, or have the bundler return a directory (BundleResult.directory) for AssetType.DIRECTORY or AssetType.ARCHIVE.
78
+ Learn more about TerraformAsset: https://cdktn.io/docs/concepts/assets`);
79
+ exports.assetStagingBundlerFileOutputNeedsFilePackaging = assetStagingBundlerFileOutputNeedsFilePackaging;
80
+ const assetStagingBundlerDirectoryOutputNeedsDirectoryPackaging = (id) => new Error(`TerraformAsset ${id}'s bundler produced a directory artifact (BundleResult.directory), but AssetType.FILE stages a single file verbatim. Use AssetType.DIRECTORY or AssetType.ARCHIVE with a directory-producing bundler, or have the bundler return a single file (BundleResult.file) for AssetType.FILE.
81
+ Learn more about TerraformAsset: https://cdktn.io/docs/concepts/assets`);
82
+ exports.assetStagingBundlerDirectoryOutputNeedsDirectoryPackaging = assetStagingBundlerDirectoryOutputNeedsDirectoryPackaging;
83
+ const assetStagingAlreadyStaged = (id) => new Error(`TerraformAsset ${id} was already staged. An AssetStaging stages exactly once — its bundler output is captured on the first call and cannot be rebuilt or restaged.
84
+ Learn more about TerraformAsset: https://cdktn.io/docs/concepts/assets`);
85
+ exports.assetStagingAlreadyStaged = assetStagingAlreadyStaged;
86
+ const assetBundlerOutputFileNameInvalid = (id, outputFileName) => new Error(`TerraformAsset ${id} was given a bundler with an invalid outputFileName '${outputFileName}'. It names the staged artifact file, so it must be a plain file name — not empty, '.', '..', absolute, or containing '/' or '\\'.
87
+ Learn more about TerraformAsset: https://cdktn.io/docs/concepts/assets`);
88
+ exports.assetBundlerOutputFileNameInvalid = assetBundlerOutputFileNameInvalid;
89
+ const chainBundlerRequiresAtLeastOneBundler = () => new Error(`ChainBundler.of() requires at least one bundler. At least one bundler must be able to run in this environment.`);
90
+ exports.chainBundlerRequiresAtLeastOneBundler = chainBundlerRequiresAtLeastOneBundler;
91
+ const chainBundlerConflictingOutputFileName = (names) => new Error(`ChainBundler legs declare conflicting outputFileName values (${names.join(", ")}). The staged name is fixed before any leg runs, so all legs that set it must agree.`);
92
+ exports.chainBundlerConflictingOutputFileName = chainBundlerConflictingOutputFileName;
93
+ const chainBundlerAllDeclined = (tried) => new Error(`Every bundler in the ChainBundler declined to run (${tried} tried). At least one must be able to run in this environment.`);
94
+ exports.chainBundlerAllDeclined = chainBundlerAllDeclined;
47
95
  const dynamicBlockNotSupported = (_foreachExpression) => new Error(`We do not support directly resolving a TerraformDynamicBlock. Dynamic blocks are only supported on block attributes of resources, data sources, and providers.
48
96
 
49
97
  You can create a TerraformDynamicBlock by calling '.dynamic' on a TerraformIterator instance.
@@ -374,4 +422,4 @@ const terraformModuleHasChildren = (pathName) => {
374
422
  return new Error(`Trying to add children to a TerraformModule at '${pathName}'. TerraformModules cannot have children, if you want to group resources or constructs in general together please use the Constructs class instead. See https://cdktn.io/docs/concepts/constructs for more details.`);
375
423
  };
376
424
  exports.terraformModuleHasChildren = terraformModuleHasChildren;
377
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOzs7O0FBS0ksTUFBTSxVQUFVLEdBQUcsQ0FBQyxhQUFxQixFQUFFLEVBQUUsQ0FDbEQsSUFBSSxLQUFLLENBQ1AseURBQXlELGFBQWE7OztLQUdyRSxDQUNGLENBQUM7QUFOUyxRQUFBLFVBQVUsY0FNbkI7QUFFRyxNQUFNLHlCQUF5QixHQUFHLENBQUMsS0FBZSxFQUFFLEVBQUU7SUFDM0QsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzRCxPQUFPLElBQUksS0FBSyxDQUNkLG1HQUFtRyxVQUFVO0NBQ2hILENBQ0UsQ0FBQztBQUNKLENBQUMsQ0FBQztBQU5XLFFBQUEseUJBQXlCLDZCQU1wQztBQUVLLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxTQUFpQixFQUFFLEVBQUUsQ0FDeEQsSUFBSSxLQUFLLENBQ1AsNkRBQTZELFNBQVM7OztLQUdyRSxDQUNGLENBQUM7QUFOUyxRQUFBLG9CQUFvQix3QkFNN0I7QUFFRyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsRUFBRSxDQUMxQyxJQUFJLEtBQUssQ0FDUDs7S0FFQyxDQUNGLENBQUM7QUFMUyxRQUFBLHVCQUF1QiwyQkFLaEM7QUFFRyxNQUFNLDBCQUEwQixHQUFHLENBQUMsRUFBVSxFQUFFLFVBQWtCLEVBQUUsRUFBRSxDQUMzRSxJQUFJLEtBQUssQ0FDUCxrQkFBa0IsRUFBRSxzQ0FBc0MsVUFBVSwrRUFBK0UsT0FBTyxDQUFDLEdBQUcsRUFBRTs7Ozs7O0NBTW5LLENBQ0UsQ0FBQztBQVRTLFFBQUEsMEJBQTBCLDhCQVNuQztBQUVHLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxFQUFVLEVBQUUs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b0Isd0JBQzBDO0FBRXBFLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxnQkFBd0IsRUFBRSxFQUFFLENBQ3JFLElBQUksS0FBSyxDQUNQLDRGQUE0RixnQkFBZ0Isb09BQW9PLENBQ2pWLENBQUM7QUFIUyxRQUFBLDBCQUEwQiw4QkFHbkM7QUFFRyxNQUFNLDJCQUEyQixHQUFHLENBQ3pDLEdBQVcsRUFDWCxJQUFZLEVBQ1osS0FBWSxFQUNaLEVBQUUsQ0FDRixJQUFJLEtBQUssQ0FDUCwyQ0FBMkMsR0FBRyxVQUFVLElBQUksWUFBWSxLQUFLLEVBQUUsQ0FDaEYsQ0FBQztBQVBTLFFBQUEsMkJBQTJCLCtCQU9wQztBQUVHLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxPQUFlLEVBQUUsRUFBRSxDQUN4RCxJQUFJLEtBQUssQ0FDUCxzQ0FBc0MsT0FBTyx5TUFBeU0sQ0FDdlAsQ0FBQztBQUhTLFFBQUEsc0JBQXNCLDBCQUcvQjtBQUVHLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxRQUFnQixFQUFFLEVBQUU7SUFDN0QsT0FBTyxJQUFJLEtBQUssQ0FDZCxtREFBbUQsUUFBUSxxTkFBcU4sQ0FDalIsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUpXLFFBQUEsMEJBQTBCLDhCQUlyQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG4gKi9cblxuaW1wb3J0IHsgSURlcGVuZGFibGUgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgVGVycmFmb3JtU3RhY2sgfSBmcm9tIFwiLi90ZXJyYWZvcm0tc3RhY2tcIjtcblxuZXhwb3J0IGNvbnN0IG5vQXBwRm91bmQgPSAoY29uc3RydWN0UGF0aDogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYE5vIGFwcCBjb3VsZCBiZSBpZGVudGlmaWVkIGZvciB0aGUgY29uc3RydWN0IGF0IHBhdGggJyR7Y29uc3RydWN0UGF0aH0nIChsaWtlbHkgYSBUZXJyYWZvcm1TdGFjaykuXG5UaGUgc2NvcGUgb2YgQ0RLVE4ncyBUZXJyYWZvcm1TdGFjayBjbGFzcyBpcyBhIHNpbmdsZSBBcHAgaW5zdGFuY2UgY3JlYXRlZCBieSAnY29uc3QgYXBwID0gbmV3IEFwcCgpJy4gVGhlIEFwcCBpcyB5b3VyIHByb2plY3QncyByb290LCBob2xkaW5nIHByb2plY3QgY29uZmlndXJhdGlvbiBhbmQgdmFsaWRhdGlvbnMuXG5MZWFybiBtb3JlIGFib3V0IHRoZSBBcHA6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9jZGt0bi1hcmNoaXRlY3R1cmUjYXBwLWNsYXNzXG4gICAgYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGNvbnN0cnVjdHNPdXRzaWRlT2ZTdGFja3MgPSAocGF0aHM6IHN0cmluZ1tdKSA9PiB7XG4gIGNvbnN0IGJ1bGxldExpc3QgPSBwYXRocy5tYXAoKHApID0+IGAgIC0gJHtwfWApLmpvaW4oXCJcXG5cIik7XG4gIHJldHVybiBuZXcgRXJyb3IoXG4gICAgYEZvdW5kIGNvbnN0cnVjdHMgb3V0c2lkZSBvZiBhIFRlcnJhZm9ybVN0YWNrIChkaWQgeW91IHBhc3Mgc2NvcGU9YXBwIGluc3RlYWQgb2Ygc2NvcGU9c3RhY2s/KTpcXG4ke2J1bGxldExpc3R9XG5gLFxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGFwcFZhbGlkYXRpb25GYWlsdXJlID0gKGVycm9yTGlzdDogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYEFwcC1sZXZlbCB2YWxpZGF0aW9uIGZhaWxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgZXJyb3JzOlxcbiAgJHtlcnJvckxpc3R9XG5WYWxpZGF0aW9ucyBhbGxvdyBmb3IgZHluYW1pYyB2ZXJpZmljYXRpb24gb2YgeW91ciBwcm9qZWN0LlxuVG8gc2tpcCB2YWxpZGF0aW9ucywgYWRkICdza2lwVmFsaWRhdGlvbjogdHJ1ZScgdG8geW91ciBBcHAgY29uZmlnLlxuICAgIGAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBwcm92aWRlclZlcnNpb25NaXNtYXRjaCA9ICgpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgVmVyc2lvbiBtaXNtYXRjaCBkZXRlY3RlZDogWW91ciBwcm92aWRlciBiaW5kaW5ncyBhcmUgYnVpbHQgZm9yIGFuIG9sZGVyIHZlcnNpb24gb2YgQ0RLVG4uXG5VcGdyYWRlIHlvdXIgcHJlLWJ1aWx0IHByb3ZpZGVyIG9yIHJlLXJ1biBjZGt0biBnZXQgd2l0aCBhIG1vcmUgcmVjZW50IHZlcnNpb24gKD49IDAuMTApIG9mIHRoZSBjZGt0bi1jbGkuXG4gICAgYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGFzc2V0T3V0T2ZTY29wZU9mQ0RLVEZKc29uID0gKGlkOiBzdHJpbmcsIGNvbmZpZ1BhdGg6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBUZXJyYWZvcm1Bc3NldCAke2lkfSB3YXMgY3JlYXRlZCB3aXRoIGEgcmVsYXRpdmUgcGF0aCAnJHtjb25maWdQYXRofScsIGJ1dCB3ZSBjYW5ub3QgZmluZCB0aGUgY2RrdGYuanNvbiB3aXRoaW4geW91ciBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5ICcke3Byb2Nlc3MuY3dkKCl9J1xuXG5UaGUgY2RrdGYuanNvbiBmaWxlIGlzIG5lZWRlZCB0byBlc3RhYmxpc2ggdGhlIGJhc2UgZm9yIHRoZSByZWxhdGl2ZSBwYXRoICh0aGUgJy4nIGluICcuL2Zvby9iYXInKS5cblxuUGxhY2UgYSBjZGt0Zi5qc29uIGF0IHRoZSByb290IG9mIHlvdXIgcHJvamVjdC4gTGVhcm4gbW9yZTogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NyZWF0ZS1hbmQtZGVwbG95L2NvbmZpZ3VyYXRpb24tZmlsZVxuTGVhcm4gbW9yZSBhYm91dCBUZXJyYWZvcm1Bc3NldDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL2Fzc2V0c1xuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGFzc2V0RXhwZWN0c0RpcmVjdG9yeSA9IChpZDogc3RyaW5nLCBjb25maWdQYXRoOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgVGVycmFmb3JtQXNzZXQgJHtpZH0gZXhwZWN0cyBwYXRoIHRvIHBvaW50IHRvIGEgZGlyZWN0b3J5LiBJbnN0ZWFkLCB0aGlzIGZpbGUgd2FzIHBhc3NlZDogJyR7Y29uZmlnUGF0aH0nLiBQbGVhc2UgY29ycmVjdCB0aGUgcGF0aCB0byBwb2ludCB0byBhIGRpcmVjdG9yeS5cbkxlYXJuIG1vcmUgYWJvdXQgVGVycmFmb3JtQXNzZXQ6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9hc3NldHNcbiAgICBgLFxuICApO1xuXG5leHBvcnQgY29uc3QgYXNzZXRUeXBlTm90SW1wbGVtZW50ZWQgPSAoKSA9PlxuICBuZXcgRXJyb3IoYEFzc2V0IHR5cGUgaXMgbm90IGltcGxlbWVudGVkLlxuUG9zc2libGUgQXNzZXQgdHlwZXMgaW5jbHVkZTogRklMRSwgRElSRUNUT1JZLCBhbmQgQVJDSElWRS5cblRha2Ugb25lIG9mIHRoZXNlIHZhbHVlcyBmcm9tIHRoZSBBc3NldFR5cGUgRW51bS5cbkxlYXJuIG1vcmUgYWJvdXQgVGVycmFmb3JtQXNzZXQ6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9hc3NldHNcbiAgYCk7XG5cbmV4cG9ydCBjb25zdCBkeW5hbWljQmxvY2tOb3RTdXBwb3J0ZWQgPSAoX2ZvcmVhY2hFeHByZXNzaW9uOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgV2UgZG8gbm90IHN1cHBvcnQgZGlyZWN0bHkgcmVzb2x2aW5nIGEgVGVycmFmb3JtRHluYW1pY0Jsb2NrLiBEeW5hbWljIGJsb2NrcyBhcmUgb25seSBzdXBwb3J0ZWQgb24gYmxvY2sgYXR0cmlidXRlcyBvZiByZXNvdXJjZXMsIGRhdGEgc291cmNlcywgYW5kIHByb3ZpZGVycy5cblxuWW91IGNhbiBjcmVhdGUgYSBUZXJyYWZvcm1EeW5hbWljQmxvY2sgYnkgY2FsbGluZyAnLmR5bmFtaWMnIG9uIGEgVGVycmFmb3JtSXRlcmF0b3IgaW5zdGFuY2UuXG5cblRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbiB3YXMgdXNlZCBmb3IgdGhlIGR5bmFtaWMgYmxvY2s6IC5keW5hbWljKHtcbiAgJHtfZm9yZWFjaEV4cHJlc3Npb259XG59KVxuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IHVucmVzb2x2ZWRUb2tlbkluQ29uc3RydWN0SWQgPSAoaWQ6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBZb3UgY2Fubm90IHVzZSBhIHRva2VuIChlLmcuLCBhIHJlZmVyZW5jZSB0byBhbiBhdHRyaWJ1dGUpIGFzIHRoZSBpZCBvZiBhIGNvbnN0cnVjdC4gSWRzIG9mIGNvbnN0cnVjdHMgbXVzdCBiZSBrbm93biBhdCBzeW50aGVzaXMgdGltZSwgYW5kIHRva2VuIHZhbHVlcyBhcmUgb25seSBrbm93biB3aGVuIFRlcnJhZm9ybSBydW5zLiBQbGVhc2UgdXNlIGEgY29uY3JldGUgdmFsdWUgZm9yIHlvdXIgY29uc3RydWN0cyBJRCBpbnN0ZWFkLlxuWW91IHBhc3NlZCB0aGUgZm9sbG93aW5nIGlkOiBcIiR7aWR9XCJcbmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBpdGVyYXRvck9uUmVzb3VyY2VXaXRoQ291bnQgPSAoKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYFlvdSBjYW5ub3QgY3JlYXRlIGFuIGl0ZXJhdG9yIGZyb20gYSByZXNvdXJjZSB3aXRoIGEgY291bnQgYXJndW1lbnQuXG5JbnN0ZWFkLCByZXVzZSB0aGlzIHJlc291cmNlJ3MgVGVycmFmb3JtQ291bnQgaW5zdGFuY2UgaW4gdGhlIHJlc291cmNlIHlvdSB3YW50IHRvIHVzZSBhcyBhbiBpdGVyYXRvci5cblxuSWYgeW91IHdhbnQgdG8gdXNlIGFuIGl0ZXJhdG9yIHRvIHBvcHVsYXRlIGEgbGlzdCBhdHRyaWJ1dGUsIHJlcGxhY2UgdGhlIGNvdW50IG9uIHRoZSByZXNvdXJjZSB3aXRoIGFuIGl0ZXJhdG9yIHBhc3NlZCBpbnRvIHRoZSBmb3JFYWNoIGFyZ3VtZW50LmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBpdGVyYXRvck9uUmVzb3VyY2VXaXRob3V0Rm9yRWFjaCA9ICgpID0+XG4gIG5ldyBFcnJvcihgQ2Fubm90IGNyZWF0ZSBhbiBpdGVyYXRvciBmcm9tIGEgcmVzb3VyY2Ugd2l0aG91dCBhIGZvckVhY2ggYXJndW1lbnQuIElmIHlvdSB3YW50IHRvIGNyZWF0ZSBtb3JlIGluc3RhbmNlcyBvZiB0aGlzIHJlc291cmNlLCBwYXNzIGFuIGl0ZXJhdG9yIHRvIHRoZSBmb3JFYWNoIGFyZ3VtZW50IG9mIHRoZSByZXNvdXJjZSBmaXJzdC5cbiAgYCk7XG5cbmV4cG9ydCBjb25zdCBtb2R1bGVzV2l0aFNhbWVBbGlhcyA9IChhbGlhczogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoYE11bHRpcGxlIHByb3ZpZGVycyBoYXZlIHRoZSBzYW1lIGFsaWFzOiBcIiR7YWxpYXN9XCJcbkVhY2ggcHJvdmlkZXIgbXVzdCBoYXZlIGEgdW5pcXVlIGFsaWFzIHdoZW4gcGFzc2luZyBtdWx0aXBsZSBwcm92aWRlcnMgb2YgdGhlIHNhbWUgdHlwZSB0byBtb2R1bGVzLlxuICBgKTtcblxuZXhwb3J0IGNvbnN0IG1vdmVUYXJnZXRBbHJlYWR5U2V0ID0gKFxuICB0YXJnZXQ6IHN0cmluZyxcbiAgZnJpZW5kbHlVbmlxdWVJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKSA9PlxuICBuZXcgRXJyb3IoYFRhcmdldCBcIiR7dGFyZ2V0fVwiIGhhcyBhbHJlYWR5IGJlZW4gdXNlZCBmb3IgdGhlIGNvbnN0cnVjdCAke2ZyaWVuZGx5VW5pcXVlSWR9LlxuVGFyZ2V0IG11c3QgYmUgYSBzdHJpbmcgdGhhdCBpcyB1bmlxdWUgYWNyb3NzIGFsbCByZXNvdXJjZXMgaW4gdGhlIHNhbWUgc3RhY2suYCk7XG5cbmV4cG9ydCBjb25zdCBtb3ZlVGFyZ2V0Tm90U2V0ID0gKHRhcmdldDogc3RyaW5nLCBlbnRyaWVzOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihgVGFyZ2V0IFwiJHt0YXJnZXR9XCIgaGFzIG5vdCBiZWVuIHNldC5cbllvdSB0cmllZCB0byBtb3ZlIGEgcmVzb3VyY2Ugd2l0aG91dCBhIHRhcmdldC5cbkNhbGwgLmFkZE1vdmVUYXJnZXQoXCIke3RhcmdldH1cIikgb24gdGhlIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZSB5b3Ugd2FudCB0byBtb3ZlIHRoaXMgcmVzb3VyY2UgdG8uXG5cbkFsdGVybmF0aXZlbHksIHlvdSBjYW4gdXNlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHRhcmdldHMgKGluIGNhc2UgeW91IGhhZCBhIHR5cG8pOlxuJHtlbnRyaWVzfVxuYCk7XG5cbmV4cG9ydCBjb25zdCBtb3ZlZFRvUmVzb3VyY2VPZkRpZmZlcmVudFR5cGUgPSAoXG4gIG1vdmVUYXJnZXQ6IHN0cmluZyxcbiAgb3JpZ2luYWxSZXNvdXJjZVR5cGU6IHN0cmluZyxcbiAgZGVzdGluYXRpb25SZXNvdXJjZVR5cGU6IHN0cmluZyxcbikgPT5cbiAgbmV3IEVycm9yKGBXZSBkbyBub3Qgc3VwcG9ydCBtb3ZpbmcgcmVzb3VyY2VzIHRvIGEgZGlmZmVyZW50IHR5cGUuXG5cblRoZSBkZXN0aW5hdGlvbiBcIiR7bW92ZVRhcmdldH1cIidzIHJlc291cmNlIHR5cGUgJHtkZXN0aW5hdGlvblJlc291cmNlVHlwZX0gZGlmZmVycyBmcm9tIHRoZSBvcmlnaW5hbCByZXNvdXJjZSB0eXBlICgke29yaWdpbmFsUmVzb3VyY2VUeXBlfSkgeW91IGFyZSB0cnlpbmcgdG8gbW92ZS5cblxuSWYgdGhpcyB3YXMgaW50ZW50aW9uYWwsIHRyeSBpbXBvcnRpbmcgdGhlIGV4aXN0aW5nIHJlc291cmNlIGludG8geW91ciB0YXJnZXQgaW5zdGVhZC4gTGVhcm4gbW9yZTpcbmh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9yZXNvdXJjZXMjaW1wb3J0aW5nLXJlc291cmNlc1xuXG5Ob3RlIHRoYXQgeW91IG11c3QgbWFudWFsbHkgcmVtb3ZlIHRoZSBvcmlnaW5hbCByZXNvdXJjZSBmcm9tIHlvdXIgc3RhdGUgZmlsZSBhZnRlciBpbXBvcnRpbmcgaXQuIFVzZSB0aGUgXCJ0ZXJyYWZvcm0gc3RhdGUgcm1cIiBjb21tYW5kIGluIHRoZSBvdXRwdXQgZGlyZWN0b3J5IG9mIHRoZSBzdGFjayB5b3UgZGVmaW5lZCB0aGlzIHJlc291cmNlIGluLiBMZWFybiBtb3JlOlxuaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vY2xpL2NvbW1hbmRzL3N0YXRlL3JtXG5gKTtcblxuZXhwb3J0IGNvbnN0IHJlc291cmNlR2l2ZW5Ud29Nb3ZlT3BlcmF0aW9uc0J5VGFyZ2V0QW5kSWQgPSAoXG4gIGlkOiBzdHJpbmcsXG4gIGV4aXN0aW5nVGFyZ2V0OiBzdHJpbmcsXG4gIG5ld01vdmU6IHsgdG86IHN0cmluZzsgZnJvbTogc3RyaW5nIH0sXG4pID0+XG4gIG5ldyBFcnJvcihgXG5UaGUgcmVzb3VyY2UgJHtpZH0gaGFzIGJlZW4gZ2l2ZW4gdHdvIGRpZmZlcmVudCBtb3ZlIG9wZXJhdGlvbnMuXG5cbk1vdmUgdGFyZ2V0OiBcIiR7ZXhpc3RpbmdUYXJnZXR9XCJcbk1vdmUgYnkgaWQ6IHtcbiAgZnJvbTogJHtuZXdNb3ZlLmZyb219XG4gIHRvOiAke25ld01vdmUudG99XG59XG5cbk9ubHkgb25lIG1vdmUgb3BlcmF0aW9uIGNhbiBvY2N1ciBwZXIgcGxhbi9hcHBseS4gUmVtb3ZlIG9uZSBvZiB0aGUgb3BlcmF0aW9ucy5cblxuTGVhcm4gbW9yZSBhYm91dCBtb3ZpbmcgcmVzb3VyY2VzOiBodHRwczovL2Nka3RuLmlvL2RvY3MvZXhhbXBsZXMtYW5kLWd1aWRlcy9yZWZhY3RvcmluZyM6fjp0ZXh0PU1vdmluZyUyMCUyNiUyMFJlbmFtaW5nJTIwUmVzb3VyY2VzJTIwV2l0aGluJTIwYSUyMFN0YWNrXG5gKTtcblxuZXhwb3J0IGNvbnN0IHJlc291cmNlR2l2ZW5Ud29Nb3ZlT3BlcmF0aW9uc0J5SWQgPSAoXG4gIGlkOiBzdHJpbmcsXG4gIGV4aXN0aW5nTW92ZTogeyB0bzogc3RyaW5nOyBmcm9tOiBzdHJpbmcgfSxcbiAgbmV3TW92ZTogeyB0bzogc3RyaW5nOyBmcm9tOiBzdHJpbmcgfSxcbikgPT5cbiAgbmV3IEVycm9yKGBcblRoZSByZXNvdXJjZSAke2lkfSBoYXMgYmVlbiBnaXZlbiB0d28gZGlmZmVyZW50IG1vdmUgb3BlcmF0aW9ucy5cblxue1xuICBmcm9tOiAke2V4aXN0aW5nTW92ZS5mcm9tfVxuICB0bzogJHtleGlzdGluZ01vdmUudG99XG59XG57XG4gIGZyb206ICR7bmV3TW92ZS5mcm9tfVxuICB0bzogJHtuZXdNb3ZlLnRvfSAoUmVzb3VyY2UgY2FsbGluZyB0aGUgbW92ZSB0byBvcGVyYXRpb24pXG59XG5cbk9ubHkgb25lIG1vdmUgb3BlcmF0aW9uIGNhbiBvY2N1ciBwZXIgcGxhbi9hcHBseS4gUmVtb3ZlIG9uZSBvZiB0aGUgb3BlcmF0aW9ucy5cblxuTGVhcm4gbW9yZSBhYm91dCBtb3ZpbmcgcmVzb3VyY2VzOiBodHRwczovL2Nka3RuLmlvL2RvY3MvZXhhbXBsZXMtYW5kLWd1aWRlcy9yZWZhY3RvcmluZyM6fjp0ZXh0PU1vdmluZyUyMCUyNiUyMFJlbmFtaW5nJTIwUmVzb3VyY2VzJTIwV2l0aGluJTIwYSUyMFN0YWNrXG5gKTtcblxuZXhwb3J0IGNvbnN0IHJlc291cmNlR2l2ZW5Ud29Nb3ZlT3BlcmF0aW9uc0J5VGFyZ2V0ID0gKFxuICByZXNvdXJjZUlkOiBzdHJpbmcsXG4gIGV4aXN0aW5nTW92ZVRhcmdldDogc3RyaW5nLFxuICBuZXdNb3ZlVGFyZ2V0OiBzdHJpbmcsXG4pID0+XG4gIG5ldyBFcnJvcihgVGhlIHJlc291cmNlICR7cmVzb3VyY2VJZH0gaGFzIGJlZW4gZ2l2ZW4gdHdvIGRpZmZlcmVudCBtb3ZlVGFyZ2V0czogXCIke25ld01vdmVUYXJnZXR9XCIgYW5kIFwiJHtleGlzdGluZ01vdmVUYXJnZXR9XCJcblxuQSByZXNvdXJjZSBjYW4gb25seSBiZSBtb3ZlZCBvbmNlIHBlciBwbGFuL2FwcGx5LlxuXG5MZWFybiBtb3JlIGFib3V0IG1vdmluZyByZXNvdXJjZXM6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9leGFtcGxlcy1hbmQtZ3VpZGVzL3JlZmFjdG9yaW5nIzp+OnRleHQ9TW92aW5nJTIwJTI2JTIwUmVuYW1pbmclMjBSZXNvdXJjZXMlMjBXaXRoaW4lMjBhJTIwU3RhY2tcbmApO1xuXG5leHBvcnQgY29uc3Qgc3RhY2tDb250YWluc0Rpc2FsbG93ZWRDaGFyID0gKFxuICBzdGFja0lkOiBzdHJpbmcsXG4gIGludmFsaWRDaGFyOiBzdHJpbmcsXG4pID0+XG4gIG5ldyBFcnJvcihgQ2Fubm90IGNyZWF0ZSBUZXJyYWZvcm0gc3RhY2sgd2l0aCBpZCBcIiR7c3RhY2tJZH1cIi4gSXQgY29udGFpbnMgYW4gaW52YWxpZCBnbG9iIGNoYXJhY3RlcjogXCIke2ludmFsaWRDaGFyfVwiLlxuXG5HbG9iIGNoYXJhY3RlcnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gc3RhY2sgbmFtZXMgYmVjYXVzZSB3ZSB1c2UgdGhlbSB0byBkZXBsb3kgYW5kIGRlc3Ryb3kgbXVsdGlwbGUgc3RhY2tzLiBGb3IgZXhhbXBsZSwgJ2Nka3RuIGRlcGxveSBcXGAqLXByb2R1Y3Rpb25cXGAnIGRlcGxveXMgYWxsIHN0YWNrcyB3aXRoIG5hbWVzIHRoYXQgZW5kIGluICctcHJvZHVjdGlvbicuXG5gKTtcblxuZXhwb3J0IGNvbnN0IHN0YWNrSWRDb250YWluc1doaXRlc3BhY2UgPSAoc3RhY2tJZDogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoYENhbm5vdCBjcmVhdGUgVGVycmFmb3JtU3RhY2sgd2l0aCBpZCBcIiR7c3RhY2tJZH1cIi4gSXQgY29udGFpbnMgYSB3aGl0ZXNwYWNlIGNoYXJhY3Rlci5cblxuUGxlYXNlIHJlbW92ZSBhbnkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGluIHlvdXIgVGVycmFmb3JtU3RhY2sgaWQsIGxpa2Ugc286IFwiJHtzdGFja0lkLnJlcGxhY2UoXG4gICAgL1xccy9nLFxuICAgIFwiXCIsXG4gICl9XCJcbmApO1xuXG5leHBvcnQgY29uc3Qgbm9TdGFja0ZvckNvbnN0cnVjdCA9IChjb25zdHJ1Y3RQYXRoOiBzdHJpbmcsIGhpbnQ6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKGBObyBzdGFjayBjb3VsZCBiZSBpZGVudGlmaWVkIGZvciB0aGUgY29uc3RydWN0IGF0IHBhdGggJyR7Y29uc3RydWN0UGF0aH0nJHtoaW50fVxuXG5Zb3UgY2FuIG9ubHkgdXNlIGNvbnN0cnVjdHMgYXMgcGFydCBvZiBhIFRlcnJhZm9ybVN0YWNrLlxuXG5UbyBsZWFybiBtb3JlIGFib3V0IENvbnN0cnVjdHMgdnMuIFRlcnJhZm9ybVN0YWNrcywgcmVmZXIgdG86IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9jb25zdHJ1Y3RzIzp+OnRleHQ9Q29uc3RydWN0cyUyMHZzLiUyMFN0YWNrc1xuYCk7XG5cbmV4cG9ydCBjb25zdCBzdGFja0hhc0NpcmN1bGFyRGVwZW5kZW5jeSA9IChcbiAgdGhpc1N0YWNrOiBUZXJyYWZvcm1TdGFjayxcbiAgZGVwZW5kZW5jeTogVGVycmFmb3JtU3RhY2ssXG4pID0+XG4gIG5ldyBFcnJvcihgQ2Fubm90IGFkZCBkZXBlbmRlbmN5ICR7ZGVwZW5kZW5jeX0gdG8gJHt0aGlzU3RhY2t9LCBiZWNhdXNlIGl0IHdvdWxkIGNhdXNlIGEgY2lyY3VsYXIgZGVwZW5kZW5jeS5cblxuVGVycmFmb3JtU3RhY2sgJHtkZXBlbmRlbmN5fSBpcyBhbHJlYWR5IGRlcGVuZGVudCBvbiAke3RoaXNTdGFja30gZGlyZWN0bHksIG9yIGRlcGVuZGVudCBvbiBhIFRlcnJhZm9ybVN0YWNrIHdpdGhpbiAke3RoaXNTdGFja30uXG5cblRvIGxlYXJuIG1vcmUgYWJvdXQgY2lyY3VsYXIgZGVwZW5kZW5jeSByZWZlcmVuY2VzLCByZWZlciB0bzogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3N0YWNrcyM6fjp0ZXh0PUNyb3NzJTJEU3RhY2slMjBSZWZlcmVuY2VzXG5gKTtcblxuZXhwb3J0IGNvbnN0IHN0YWNrVmFsaWRhdGlvbkZhaWx1cmUgPSAoZXJyb3JMaXN0OiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihgVmFsaWRhdGlvbiBmYWlsZWQgd2l0aCB0aGUgZm9sbG93aW5nIGVycm9yczpcXG4gICR7ZXJyb3JMaXN0fVxuXG5JZiB5b3Ugd2lzaCB0byBpZ25vcmUgdGhlc2UgdmFsaWRhdGlvbnMsIHBhc3MgJ3NraXBWYWxpZGF0aW9uOiB0cnVlJyB0byB5b3VyIEFwcCBjb25maWd1cmF0aW9uLlxuYCk7XG5cbmV4cG9ydCBjb25zdCBtYXRjaGVyc1BhdGhJc05vdERpcmVjdG9yeSA9IChmdW5jdGlvbk5hbWU6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKGBQYXRoIGlzIG5vdCBhIGRpcmVjdG9yeS5cblxuRW5zdXJlIHlvdSBhcmUgcGFzc2luZyB0aGUgcmVzdWx0IG9mIFRlc3RpbmcuZnVsbFN5bnRoKCdzdGFjayBpbnN0YW5jZScpIHRvICcke2Z1bmN0aW9uTmFtZX0nLCBub3QgVGVzdGluZy5zeW50aCgnc3RhY2sgaW5zdGFuY2UnKS5cblxuVGVzdGluZy5mdWxsU3ludGggcmV0dXJucyBhIGZpbGUgcGF0aCB0byBhIHRlbXBvcmFyeSB0ZXN0aW5nIGVudmlyb25tZW50LiBUZXN0aW5nLnN5bnRoIHJldHVybnMgdGhlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgeW91ciBzdGFjay5cblxuVG8gbGVhcm4gbW9yZSBhYm91dCB0ZXN0aW5nIGluIENES1ROLCByZWZlciB0bzogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL3Rlc3QvdW5pdC10ZXN0c2ApO1xuXG5leHBvcnQgY29uc3QgbWF0Y2hlcnNGb3VuZEVycm9yc0luU3RhY2sgPSAoXG4gIGVycm9yQ291bnQ6IGFueSxcbiAgc3RhY2tOYW1lOiBzdHJpbmcsXG4gIGRpYWdub3N0aWNzOiBzdHJpbmcsXG4pID0+XG4gIG5ldyBFcnJvcihgRm91bmQgJHtlcnJvckNvdW50fSBFcnJvcnMgaW4gc3RhY2sgJHtzdGFja05hbWV9OiAke2RpYWdub3N0aWNzfVxuXG5UaGVzZSBlcnJvcnMgYXJlIG5vdCB0ZXN0IGZhaWx1cmVzLCBidXQgaXNzdWVzIHdpdGggdGhlIHVuZGVybHlpbmcgVGVycmFmb3JtU3RhY2sgYmVpbmcgdGVzdGVkLiBGaXggdGhlIGFib3ZlIGlzc3VlcyBiZWZvcmUgcnVubmluZyB5b3VyIHRlc3RzIGFnYWluLlxuYCk7XG5cbmV4cG9ydCBjb25zdCBqZXN0Tm90SW5zdGFudGlhdGVkID0gKCkgPT5cbiAgbmV3IEVycm9yKGBKZXN0IHdhcyBub3QgcHJvcGVybHkgaW5zdGFudGlhdGVkLlxuXG5FbnN1cmUgeW91IGhhdmUgYSAnc2V0dXAuanMnIGZpbGUgaW4geW91ciBwcm9qZWN0J3MgZGlyZWN0b3J5IHRoYXQgY2FsbHMgJ2Nka3RuLlRlc3Rpbmcuc2V0dXBKZXN0KCknLlxuXG5UbyBsZWFybiBtb3JlIGFib3V0IHNldHRpbmcgdXAgdGVzdGluZywgcmVmZXIgdG86IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy90ZXN0L3VuaXQtdGVzdHMjOn46dGV4dD1BZGQlMjBUZXN0aW5nJTIwdG8lMjBZb3VyJTIwQXBwbGljYXRpb25cbmApO1xuXG5leHBvcnQgY29uc3QgZXhwZWN0Tm90R2xvYmFsbHlBY2Nlc3NpYmxlID0gKCkgPT5cbiAgbmV3IEVycm9yKGBUaGUgZXhwZWN0IGZ1bmN0aW9uIGlzIG5vdCBnbG9iYWxseSBhY2Nlc3NpYmxlLlxuXG5UbyBsZWFybiBtb3JlIGFib3V0IHNldHRpbmcgdXAgdGVzdGluZywgcmVmZXIgdG86IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy90ZXN0L3VuaXQtdGVzdHMjOn46dGV4dD1BZGQlMjBUZXN0aW5nJTIwdG8lMjBZb3VyJTIwQXBwbGljYXRpb25cbmApO1xuXG5leHBvcnQgY29uc3QgaW52YWxpZFN0YWNrID0gKGZ1bmN0aW9uTmFtZTogc3RyaW5nLCBzdGFja0NvbnRlbnQ6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKGBJbnZhbGlkIEpTT04gc3RyaW5nIHBhc3NlZDogJHtzdGFja0NvbnRlbnR9XG5cblxuRW5zdXJlIHlvdSBhcmUgcGFzc2luZyB0aGUgcmVzdWx0IG9mIFRlc3Rpbmcuc3ludGgoJ3N0YWNrIGluc3RhbmNlJykgdG8gJyR7ZnVuY3Rpb25OYW1lfScsIG5vdCBUZXN0aW5nLmZ1bGxTeW50aCgnc3RhY2sgaW5zdGFuY2UnKS5cblxuXG5UZXN0aW5nLnN5bnRoIHJldHVybnMgdGhlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgeW91ciBzdGFjay4gQ0RLVE4gY2FuIHVzZSBhc3NlcnRpb25zIHdpdGggdGhpcyBKU09OIHRvIGNoZWNrIHRoZSBjb21wb3NpdGlvbiBvZiB5b3VyIHN0YWNrcywgbGlrZSBzbzogXCJUZXN0aW5nLnRvSGF2ZVJlc291cmNlKFRlc3Rpbmcuc3ludGgoJ1RlcnJhZm9ybVN0YWNrIGluc3RhbmNlJyksIFMzQnVja2V0KVwiXG5cblRlc3RpbmcuZnVsbFN5bnRoIHJldHVybnMgYSBmaWxlIHBhdGggdG8gYSB0ZW1wb3JhcnkgdGVzdGluZyBlbnZpcm9ubWVudC5cblxuVG8gbGVhcm4gbW9yZSBhYm91dCB0ZXN0aW5nIGluIENES1ROLCByZWZlciB0bzogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL3Rlc3QvdW5pdC10ZXN0c1xuYCk7XG5cbmV4cG9ydCBjb25zdCB0YXJnZXROb3RSZXNvbHZhYmxlV2l0aE92ZXJyaWRlcyA9ICh0YXJnZXQ6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKGBUYXJnZXQgKCR7dGFyZ2V0fSkgY2Fubm90IGJlIGEgcmVzb2x2YWJsZSB0b2tlbiBpZiB5b3Ugc3BlY2lmaWVkIG92ZXJyaWRlcy4gUmVwbGFjZSB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIHlvdSBhcmUgb3ZlcnJpZGluZyB3aXRoIGEgc3RhdGljIHZhbHVlLlxuXG5UbyBsZWFybiBtb3JlIGFib3V0IFRva2VucywgcmVmZXIgdG86IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy90b2tlbnNcbmApO1xuXG5leHBvcnQgY29uc3Qgc291cmNlT3JUYXJnZXROb3RBbk9iamVjdCA9IChcbiAgc291cmNlOiBzdHJpbmcsXG4gIHNvdXJjZVR5cGU6IHN0cmluZyxcbiAgdGFyZ2V0OiBzdHJpbmcsXG4gIHRhcmdldFR5cGU6IHN0cmluZyxcbikgPT5cbiAgbmV3IEVycm9yKGBBbiBpc3N1ZSBvY2N1cnJlZCBkdXJpbmcgdGhlIHN5bnRoZXNpemF0aW9uIG9mIHlvdXIgVGVycmFmb3JtIGNvbmZpZ3VyYXRpb24uXG5cbkJvdGggdGhlIHNvdXJjZSBlbGVtZW50ICgke3NvdXJjZX0pIGFuZCBpdHMgY29udGFpbmluZyB0YXJnZXQgZWxlbWVudCAoJHt0YXJnZXR9KSBtdXN0IGJlIG9iamVjdHMuXG5cblR5cGUgb2Ygc291cmNlOiAke3NvdXJjZVR5cGV9XG5UeXBlIG9mIHRhcmdldDogJHt0YXJnZXRUeXBlfVxuYCk7XG5cbmV4cG9ydCBjb25zdCBjb25zdHJ1Y3REZXBlbmRlbmN5QmVsb3dWMTAgPSAoKSA9PlxuICBuZXcgRXJyb3IoYFZlcnNpb24gbWlzbWF0Y2ghIENES1ROIHZlcnNpb24gMC42IHJlcXVpcmVzIHlvdXIgY29uc3RydWN0cyB2ZXJzaW9uIHRvIGJlIHYxMCBvciBhYm92ZS5cblxuVXBkYXRlIHlvdXIgY29uc3RydWN0cyBkZXBlbmRlbmN5OiBodHRwczovL2Nka3RuLmlvL2RvY3MvcmVsZWFzZS91cGdyYWRlLWd1aWRlLXYwLTZcbmApO1xuXG5leHBvcnQgY29uc3QgY2xvdWRCYWNrZW5kV29ya3NwYWNlSXNOb3REZWZpbmVkQnlOYW1lID0gKCkgPT5cbiAgbmV3IEVycm9yKGBUaGUgQ2xvdWQgYmFja2VuZCBvbmx5IHN1cHBvcnRzIGNyb3NzLXN0YWNrIHJlZmVyZW5jZXMgaWYgdGhlIHdvcmtzcGFjZSBpcyBkZWZpbmVkIGJ5IG5hbWUgKG5vdCBieSB0YWdzKS5cblxuVG8gdXNlIGNyb3NzLXN0YWNrIHJlZmVyZW5jZXMsIHJlcGxhY2UgYWxsIG1lbnRpb25zIG9mICdUYWdnZWRDbG91ZFdvcmtzcGFjZXMnIHdpdGggJ05hbWVkQ2xvdWRXb3Jrc3BhY2UnLCBsaWtlIHNvOlxuXG5uZXcgQ2xvdWRCYWNrZW5kKHN0YWNrLCB7XG4gIC4uLlxuICB3b3Jrc3BhY2VzOiBuZXcgTmFtZWRDbG91ZFdvcmtzcGFjZShcIm15LWFwcFwiKSxcbn0pO1xuXG5UbyBsZWFybiBtb3JlIGFib3V0IFJlbW90ZSBCYWNrZW5kcywgcmVmZXIgdG86IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9yZW1vdGUtYmFja2VuZHNcbmApO1xuXG5leHBvcnQgY29uc3QgdmFsdWVDb250YWluc1VuZXNjYXBlZFF1b3RlcyA9ICh2YWx1ZTogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYFlvdXIgdmFsdWUsICcke3ZhbHVlfScsIGhhcyB1bmVzY2FwZWQgZG91YmxlIHF1b3RlcyBpbiBpdCwgc28gaXQgY2Fubm90IGJlIHVzZWQgYXMgYSB2YWx1ZS5cblxuVG8gc2FmZWx5IHVzZSB0aGUgdmFsdWUsIHVzZSBGbi5yYXdTdHJpbmcgb24geW91ciBzdHJpbmcsIGxpa2Ugc286XG5cbkZuLnJhd1N0cmluZygnJHt2YWx1ZX0nKVxuXG5Eb2luZyB0aGlzIGVuc3VyZXMgQ0RLVE4gYW5kIFRlcnJhZm9ybSBpbnRlcnByZXQgeW91ciB2YWx1ZXMgY29ycmVjdGx5LlxuXG5UbyBsZWFybiBtb3JlIGFib3V0IGJ1aWx0IGluIFRlcnJhZm9ybSBmdW5jdGlvbnMgd2l0aGluIENES1ROLCByZWZlciB0bzogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL2Z1bmN0aW9uc1xuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGVuY291bnRlcmVkQW5ub3RhdGlvbldpdGhMZXZlbEVycm9yID0gKGVycm9yczogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoYEVuY291bnRlcmVkIEFubm90YXRpb25zIHdpdGggbGV2ZWwgXCJFUlJPUlwiOlxcbiR7ZXJyb3JzfVxuXG5FaXRoZXIgZml4IHRoZSBpc3N1ZXMgYWJvdmUsIG9yIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQ0RLVEZfQ09OVElOVUVfU1lOVEhfT05fRVJST1JfQU5OT1RBVElPTlMgdG8gaWdub3JlIHRoZXNlIGFubm90YXRpb25zLlxuYCk7XG5cbmV4cG9ydCBjb25zdCB2YWx1ZUlzSW52YWxpZFN0cmluZ09yVG9rZW4gPSAodmFsdWU6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKFxuICAgIGAnJHt2YWx1ZX0nIGlzIG5vdCBhIHZhbGlkIHN0cmluZyBub3IgYSB0b2tlbi4gVGhpcyBmdW5jdGlvbiBvbmx5IGFjY2VwdHMgc3RyaW5ncyBvciB0b2tlbnMgcmVzb2x2aW5nIHRvIHN0cmluZ3MuIFBsZWFzZSBjaGFuZ2UgeW91ciBjb2RlIGFjY29yZGluZ2x5LmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCB2YWx1ZUlzSW52YWxpZE51bWJlck9yVG9rZW4gPSAodmFsdWU6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKFxuICAgIGAke3ZhbHVlfSBpcyBub3QgYSB2YWxpZCBudW1iZXIgbm9yIGEgdG9rZW4uIFRoaXMgZnVuY3Rpb24gb25seSBhY2NlcHRzIG51bWJlcnMgb3IgdG9rZW5zIHJlc29sdmluZyB0byBudW1iZXJzLiBQbGVhc2UgY2hhbmdlIHlvdXIgY29kZSBhY2NvcmRpbmdseS5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgbGlzdEVsZW1lbnRJc09mV3JvbmdUeXBlID0gKFxuICB2YWx1ZTogYW55W10sXG4gIHBvc2l0aW9uOiBudW1iZXIsXG4gIGVycm9yOiB1bmtub3duLFxuKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYEVsZW1lbnQgaW4gbGlzdCAke3ZhbHVlfSBhdCBwb3NpdGlvbiAke3Bvc2l0aW9ufSBpcyBub3QgdGhlIHJpZ2h0IHR5cGU6ICR7ZXJyb3J9LlxuICAgIFBsZWFzZSBlbnN1cmUgYWxsIGVsZW1lbnRzIGluIHRoZSBsaXN0IGFyZSB0aGUgY29ycmVjdCB0eXBlIGZvciB0aGlzIGZ1bmN0aW9uLmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBmdW5jdGlvblJlY2VpdmVkV3JvbmdOdW1iZXJPZkFyZ3MgPSAoXG4gIG5hbWU6IHN0cmluZyxcbiAgYXJnVmFsaWRhdG9yc0xlbmd0aDogbnVtYmVyLFxuICBhcmdzTGVuZ3RoOiBudW1iZXIsXG4pID0+XG4gIG5ldyBFcnJvcihcbiAgICBgRnVuY3Rpb24gJHtuYW1lfSB0YWtlcyAke2FyZ1ZhbGlkYXRvcnNMZW5ndGh9IGFyZ3VtZW50cywgYnV0ICR7YXJnc0xlbmd0aH0gd2VyZSBwcm92aWRlZC4gUGxlYXNlIGFkZCB0aGUgbWlzc2luZyBhcmd1bWVudHMgdG8gdGhlIGZ1bmN0aW9uLmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBmdW5jdGlvbkFyZ3VtZW50VmFsaWRhdGlvbkZhaWx1cmUgPSAoXG4gIGFyZ051bWJlcjogbnVtYmVyLFxuICBuYW1lOiBzdHJpbmcsXG4gIGVycm9yOiB1bmtub3duLFxuKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYEFyZ3VtZW50ICR7YXJnTnVtYmVyfSBvZiAke25hbWV9IGZhaWxlZCB0aGUgdmFsaWRhdGlvbjogJHtlcnJvcn0uIFBsZWFzZSBjaGFuZ2UgeW91ciBjb2RlIHRvIHBhc3MgYSB2YWxpZCB2YWx1ZSBmb3IgdGhpcyBhcmd1bWVudC5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgY2Fubm90Q2FsY0lkRm9yRW1wdHlTZXRPZkNvbXBvbmVudHMgPSAoKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYFVuYWJsZSB0byBjYWxjdWxhdGUgYSB1bmlxdWUgaWQgZm9yIGFuIGVtcHR5IHNldCBvZiBjb21wb25lbnRzLlxuXG4gICAgVGhpcyBoYXBwZW5zIHdoZW4geW91IGF0dGVtcHQgdG8gY3JlYXRlIGEgdW5pcXVlIGlkLCBidXQgZG8gbm90IHBhc3MgaW4gYW55IGNvbnN0cnVjdCBub2RlIGlkcy4gVGhpcyBtZWFucyB5b3VyIGNvbnN0cnVjdCBsaWtlbHkgaGFzIG5vIHBhcmVudCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuXG5cbiAgICBQbGVhc2UgbWFrZSBzdXJlIHlvdXIgY29uc3RydWN0IGhhcyBhIHBhcmVudC4gRm9yIGV4YW1wbGU6ICduZXcgQXBwKHRoaXMpJyBvciAnbmV3IFRlcnJhZm9ybVN0YWNrKHRoaXMsICdzdGFjaycpJy5gLFxuICApO1xuXG5leHBvcnQgY29uc3Qgc3RyaW5nVmFsdWVBZGRlZFRvUmVmZXJlbmNlTGlzdCA9IChsaXN0VG9rZW46IHN0cmluZ1tdKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYENhbm5vdCBhZGQgZWxlbWVudHMgdG8gbGlzdCB0b2tlbiwgZ290OiAke2xpc3RUb2tlbn0uXG5cbiAgICBXZSBleHBlY3QgdGhlIGVsZW1lbnRzIG9mIGEgdG9rZW5pemVkIHN0cmluZyBhcnJheSB0byBiZSBhIHNpbmdsZSB0b2tlbiBzdHJpbmcuIEZvciBleGFtcGxlLCBbXCIme1RmVG9rZW5bVG9rZW4uMV19XCJdLlxuXG4gICAgT25lIGVsZW1lbnQgaW4geW91ciBhcnJheSBjb25zaXN0cyBvZiBtb3JlIHRoYW4gYSBzaW5nbGUgdmFsdWUuIFRvIGFkZCB2YWx1ZXMgdG8gYSB0b2tlbml6ZWQgbGlzdCwgdXNlIFRlcnJhZm9ybSBmdW5jdGlvbnMgaW5zdGVhZC4gRm9yIGV4YW1wbGU6ICdGbi5jb25jYXQoW3lvdXJSZWZlcmVuY2VkTGlzdCwgW1wibXlcIiwgXCJuZXdcIiwgXCJpdGVtc1wiXV0pJy5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgY2Fubm90Q29uY2F0ZW5hdGVTdHJpbmdzSW5Ub2tlbml6ZWRTdHJpbmdBcnJheSA9IChcbiAgbGlzdFRva2VuOiBzdHJpbmcsXG4pID0+XG4gIG5ldyBFcnJvcihcbiAgICBgQ2Fubm90IGNvbmNhdGVuYXRlIHN0cmluZ3MgaW4gYSB0b2tlbml6ZWQgc3RyaW5nIGFycmF5LCBnb3Q6ICR7bGlzdFRva2VufS5cblxuICAgIFdlIGV4cGVjdCB0aGUgZWxlbWVudHMgb2YgYSB0b2tlbml6ZWQgc3RyaW5nIGFycmF5IHRvIGJlIGEgc2luZ2xlIHRva2VuIHN0cmluZy4gRm9yIGV4YW1wbGUsIFtcIiZ7VGZUb2tlbltUb2tlbi4xXX1cIl0uIE9uZSBlbGVtZW50IGluIHlvdXIgYXJyYXkgY29uc2lzdHMgb2Ygc29tZXRoaW5nIG90aGVyIHRoYW4gYSBzaW5nbGUgdG9rZW4uXG5cbiAgICBZb3UgYXJlIGxpa2VseSBtdXRhdGluZyB0aGUgdmFsdWUgaW5zaWRlIHlvdXIgYXJyYXksIHdoaWNoIENES1ROIGNhbm5vdCByZXNvbHZlIGludG8gdGhlIGFwcHJvcHJpYXRlIHJ1bnRpbWUgdmFsdWUuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IG51bWJlclZhbHVlQWRkZWRUb1JlZmVyZW5jZUxpc3QgPSAobGlzdFRva2VuOiBudW1iZXJbXSkgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBDYW5ub3QgYWRkIGVsZW1lbnRzIHRvIGxpc3QgdG9rZW4sIGdvdDogJHtsaXN0VG9rZW59LlxuXG4gICAgV2UgdXNlIHRva2VucyB0byByZXByZXNlbnQgcnVudGltZSB2YWx1ZXMgKGUuZy4sIHJlZmVyZW5jZXMgdG8gYXR0cmlidXRlcyBvZiByZXNvdXJjZSBvciBkYXRhIHNvdXJjZXMpLiBMaXN0IHRva2VucyBkb24ndCBjb250YWluIHRoZSBhY3R1YWwgdmFsdWVzIGJlY2F1c2UgdGhvc2UgYXJlIG9ubHkgYXZhaWxhYmxlIGF0IGFwcGx5IHRpbWUsIHdoZXJlYXMgdG9rZW5zIGFyZSBwcmVzZW50IGR1cmluZyBjb21waWxlIHRpbWUuXG5cbiAgICBJZiB5b3Ugd2FudCB0byBhZGQgYSB2YWx1ZSB0byBhIHRva2VuaXplZCBsaXN0LCB1c2UgYSBUZXJyYWZvcm0gZnVuY3Rpb24gaW5zdGVhZC4gRm9yIGV4YW1wbGU6IEZuLmNvbmNhdChbeW91clJlZmVyZW5jZWRMaXN0LCBbNDIsIDQzLCA0NF1dKS5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgbWFwVmFsdWVBZGRlZFRvUmVmZXJlbmNlTGlzdCA9IChtYXBUb2tlbjogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYENhbm5vdCBhZGQgZWxlbWVudHMgdG8gbWFwIHRva2VuLCBnb3Q6ICR7bWFwVG9rZW59LiBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IG1lcmdlIG11bHRpcGxlIG1hcHMsIG9yIGlmIHlvdSBhZGQgYSBuZXcga2V5IHZhbHVlIHBhaXIgdG8gdGhlIG1hcCB0b2tlbi5cblxuICAgIFdlIHVzZSB0b2tlbnMgdG8gcmVwcmVzZW50IHJ1bnRpbWUgdmFsdWVzIChlLmcuLCByZWZlcmVuY2VzIHRvIGF0dHJpYnV0ZXMgb2YgcmVzb3VyY2Ugb3IgZGF0YSBzb3VyY2VzKS4gTGlzdCB0b2tlbnMgZG9uJ3QgY29udGFpbiB0aGUgYWN0dWFsIHZhbHVlcyBiZWNhdXNlIHRob3NlIGFyZSBvbmx5IGF2YWlsYWJsZSBhdCBhcHBseSB0aW1lLCB3aGVyZWFzIHRva2VucyBhcmUgcHJlc2VudCBkdXJpbmcgY29tcGlsZSB0aW1lLlxuXG4gICAgSW5zdGVhZCBvZiBhZGRpbmcgdGhlIHZhbHVlIHRvIHRoZSB0b2tlbml6ZWQgbWFwLCB1c2UgYSBUZXJyYWZvcm0gZnVuY3Rpb24uIEZvciBleGFtcGxlOiBGbi5tZXJnZShbeW91clJlZmVyZW5jZWRNYXAsIHsgeW91cjogJ3ZhbHVlJyB9XSkuIFRoaXMgY3JlYXRlcyBhIG5ldyBtYXAgVG9rZW4gZm9yIGEgdmFsdWUsIHdoaWNoIGNvdWxkIGdldCByZW5kZXJlZCBhczpcbiAgICBtZXJnZShteV9yZXNvdXJjZS5yZXNvdXJjZV9uYW1lLm9uZV9zcGVjaWZpY19tYXBfYXR0cmlidXRlLCB7IHlvdXI6ICcgdmFsdWUnIH0pYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGNhbm5vdENvbmNhdGVuYXRlU3RyaW5nc0luVG9rZW5pemVkTWFwID0gKHRva2VuaXplZE1hcDogYW55KSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYENhbm5vdCBjb25jYXRlbmF0ZSBzdHJpbmdzIGluIGEgdG9rZW5pemVkIG1hcCwgZ290OiAke3Rva2VuaXplZE1hcH0uXG5cbiAgICBXZSBleHBlY3QgdGhlIGVsZW1lbnRzIG9mIGEgdG9rZW5pemVkIHN0cmluZyBhcnJheSB0byBiZSBhIHNpbmdsZSB0b2tlbiBzdHJpbmcuIEZvciBleGFtcGxlLCBbXCIme1RmVG9rZW5bVG9rZW4uMV19XCJdLiBBIGtleSBpbiB5b3VyIG1hcCBjb25zaXN0cyBvZiBtb3JlIHRoYW4gYSBzdHJpbmcgdG9rZW4gKGUuZy4sIHRoZSBUb2tlbiBhbmQgYSBzdGF0aWMgc3RyaW5nIG9yIG11bHRpcGxlIFRva2VucykuXG5cbiAgICBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IG11dGF0ZSB0aGUga2V5IG9mIHRoZSBtYXAuIERvIG5vdCBtdXRhdGUgdG9rZW5pemVkIE1hcHMsIGJlY2F1c2UgaXQgbWFrZXMgaXQgaW1wb3NzaWJsZSBmb3IgQ0RLVE4gdG8gdHJhbnNsYXRlIHRoZW0uYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGRvZXNOb3RJbXBsZW1lbnREZXBlbmRhYmxlVHJhaXQgPSAoaW5zdGFuY2U6IElEZXBlbmRhYmxlKSA9PlxuICBuZXcgRXJyb3IoYCR7aW5zdGFuY2V9IGRvZXMgbm90IGltcGxlbWVudCBEZXBlbmRhYmxlVHJhaXRgKTtcblxuZXhwb3J0IGNvbnN0IGNhbk9ubHlFbmNvZGVQb3NpdGl2ZUludGVnZXJzID0gKCkgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBDYW4gb25seSBlbmNvZGUgcG9zaXRpdmUgaW50ZWdlcnMgaW50byBUb2tlbnMuIFRoaXMgaXMgYSBidWcgaW4gQ0RLVE4sIHBsZWFzZSBmaWxlIGEgYnVnIHJlcG9ydC5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgaW5kZXhUb29MYXJnZVRvRW5jb2RlID0gKGluZGV4OiBudW1iZXIpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgUmVjZWl2ZWQgYW4gaW5kZXggdG9vIGxhcmdlIHRvIGVuY29kZSBpbnRvIGEgVG9rZW4gOiR7aW5kZXh9LlxuXG4gICAgVGhpcyBoYXBwZW5zIGlmIHlvdSBoYXZlIHRvbyBtYW55IFRva2VucyBpbiBhIHNpbmdsZSBDREtUTiBhcHBsaWNhdGlvbi4gVGhpcyBjYW4gYWxzbyBvY2N1ciBpZiB5b3UgYXJlIGFjY2lkZW50YWxseSBjcmVhdGluZyBudW1lcmljIHRva2VucyBpbiBhbiBpbmZpbml0ZSBsb29wLiBGb3IgZXhhbXBsZSwgY2FsbGluZyAnVG9rZW4uYXNOdW1iZXIoKScgdG9vIG1hbnkgdGltZXMuXG5cbiAgICBJZiB5b3UgcmVhY2ggdGhlIG1heGltdW0gbnVtYmVyIG9mIGFsbG93ZWQgVG9rZW5zIChhIGxpbWl0YXRpb24gaW1wb3NlZCBieSB0aGUgd2F5IHdlIGVuY29kZSBUb2tlbnMgYW5kIHNlcGFyYXRlIHRoZW0gZnJvbSByZWFsIG51bWVyaWMgdmFsdWVzKSB5b3UgY2FuIHdvcmsgYXJvdW5kIHRoaXMgaXNzdWUgYnkgZGl2aWRpbmcgYSBzaW5nbGUgYXBwbGljYXRpb24gaW50byBtdWx0aXBsZSBhcHBsaWNhdGlvbnMuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGFyZ1RvSW50cmluc2ljTXVzdEJlUGxhaW5WYWx1ZSA9IChcbiAgdmFsdWU6IGFueSxcbiAgY3JlYXRpb25TdGFjazogc3RyaW5nW10gfCB1bmRlZmluZWQsXG4pID0+IHtcbiAgY29uc3QgY3JlYXRlZEF0ID0gY3JlYXRpb25TdGFjaz8ubGVuZ3RoXG4gICAgPyBgIGNyZWF0ZWQgYXQ6XFxuJHtjcmVhdGlvblN0YWNrLmpvaW4oXCJcXG5cIil9YFxuICAgIDogXCJcIjtcbiAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICBgWW91IGNhbiBvbmx5IHVzZSBhIHBsYWluIHZhbHVlIChub3QgYSBmdW5jdGlvbikgd2hpbGUgY3JlYXRpbmcgYW4gSW50cmluc2ljIHRva2VuLiBXZSByZWNlaXZlZCB0aGUgdmFsdWUgJyR7dmFsdWV9JyR7Y3JlYXRlZEF0fS4gSWYgeW91IHdhbnQgdG8gdXNlIGEgZnVuY3Rpb24sIHBsZWFzZSB1c2UgdGhlIExhenkgY2xhc3MuIEZvciBleGFtcGxlOiAgTGF6eS5hbnlWYWx1ZSh7IHByb2R1Y2U6ICgpID0+IFwiSGVsbG8gV29ybGRcIiB9KS5gLFxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IHVuYWJsZVRvUmVzb2x2ZUNpcmN1bGFyUmVmZXJlbmNlID0gKHBhdGhOYW1lOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihgVW5hYmxlIHRvIHJlc29sdmUgb2JqZWN0IHRyZWUgd2l0aCBjaXJjdWxhciByZWZlcmVuY2UgYXQgJyR7cGF0aE5hbWV9Jy5cblxuVGhlIGRlcHRoIG9mIHlvdXIgb2JqZWN0IHRyZWUgaXMgb3ZlciAyMDAsIGluZGljYXRpbmcgeW91IHByb2JhYmx5IGhhdmUgYSBjeWNsaWNhbCByZWZlcmVuY2UuIEluc3BlY3QgdGhlIGNvbnN0cnVjdCBjcmVhdGluZyB0aGlzIGN5Y2xpYyByZWZlcmVuY2UgKG1vc3QgbGlrZWx5IGluICcke3BhdGhOYW1lfScpIGFuZCBlbnN1cmUgaXQgZG9lcyBub3QgaW5maW5pdGVseSBuZXN0IGNvbnN0cnVjdHMuYCk7XG5cbmV4cG9ydCBjb25zdCBjYW5ub3RSZXNvbHZlRnVuY3Rpb24gPSAocGF0aE5hbWU6IHN0cmluZywgb2JqOiBhbnkpID0+XG4gIG5ldyBFcnJvcihgVHJ5aW5nIHRvIHJlc29sdmUgYSBub24tZGF0YSBvYmplY3QgKGUuZy4sIGEgZnVuY3Rpb24pIGF0ICcke3BhdGhOYW1lfSc6ICR7b2JqfS4gT25seSB0b2tlbnMgYXJlIHN1cHBvcnRlZCBmb3IgbGF6eSBldmFsdWF0aW9uLlxuXG5JZiB5b3Ugd2FudCB0byB1c2UgYSBsYXppbHkgY29tcHV0ZWQgdmFsdWUsIHVzZSB0aGUgTGF6eSBjbGFzcy4gRm9yIGV4YW1wbGU6ICBMYXp5LnN0cmluZ1ZhbHVlKHsgcHJvZHVjZTogKCkgPT4gXCJIZWxsbyBXb3JsZFwiIH0pYCk7XG5cbmNvbnN0IExJU1RfRVJST1JfRVhQTEFOQVRJT04gPSBgSW4gQ0RLVE4sIHdlIHJlcHJlc2VudCBsaXN0cywgd2l0aCB2YWx1ZXMgdW5rbm93biB1bnRpbCBhZnRlciBydW50aW1lLCBhcyBhcnJheXMgd2l0aCBhIHNpbmdsZSBlbGVtZW504oCUIGEgc3RyaW5nIHRva2VuIChbXCJUb2tlbi4xXCJdKS5cblxuXG5XZSBkbyB0aGlzIGJlY2F1c2UgQ0RLVE4gZG9lcyBub3Qga25vdyB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IGF0IGNvbXBpbGUgdGltZSwgbWVhbmluZyBDREtUTiBoYXMgeWV0IHRvIGludm9rZSBUZXJyYWZvcm0gdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgY2xvdWQgcHJvdmlkZXIuIENES1ROIGxhdGVyIGludm9rZXMgVGVycmFmb3JtIG9uIHRoZSBzeW50aGVzaXplZCBzdGF0aWMgSlNPTiBmaWxlLlxuXG5CZWNhdXNlIHdlIGRvbid0IGtub3cgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCwgd2UgY2FuIG5vdCBkaWZmZXJlbnRpYXRlIGlmIHRoZSBsaXN0IHdhcyBhY2Nlc3NlZCBhdCB0aGUgZmlyc3Qgb3IgbGFzdCBpbmRleCwgb3IgYXMgcGFydCBvZiBhIGxvb3AuIFRvIGF2b2lkIHRoaXMgYW1iaWd1aXR5OlxuXG4tIElmIHlvdSB3YW50IHRvIGFjY2VzcyBhIHNpbmd1bGFyIGl0ZW0sIHVzZSAnRm4uZWxlbWVudChsaXN0LCAwKScuIERvIG5vdCB1c2UgJ2xpc3RbMF0nLlxuLSBJZiB5b3Ugd2FudCB0byBsb29wIG92ZXIgdGhlIGxpc3QgdXNlICdUZXJyYWZvcm1JdGVyYXRvci5mcm9tTGlzdChsaXN0KScuIERvIG5vdCB1c2UgYSAnZm9yJyBvciAnZm9yRWFjaCcgbG9vcC5cblxuTGVhcm4gbW9yZSBhYm91dCB0b2tlbnM6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy90b2tlbnNcbkxlYXJuIG1vcmUgYWJvdXQgaXRlcmF0b3JzOiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvaXRlcmF0b3JzYDtcblxuY29uc3QgTUFQX0VSUk9SX0VYUExBTkFUSU9OID0gYFxuSW4gQ0RLVE4sIHdlIHJlcHJlc2VudCBtYXBzLCB3aXRoIHZhbHVlcyB1bmtub3duIHVudGlsIGFmdGVyIHJ1bnRpbWUsIGFzIG9iamVjdHMgd2l0aCBhIHNpbmdsZSBrZXktdmFsdWUgcGFpciB3aGVyZSB0aGUgdmFsdWUgaXMgYSBzdHJpbmcgdG9rZW4uIEZvciBleGFtcGxlOiAneyBcIiZ7VGZUb2tlbltUb2tlbi4xXX1cIjogXCJTdHJpbmcgTWFwIFRva2VuIFZhbHVlXCIgfScuXG5cbldlIGRvIHRoaXMgYmVjYXVzZSBDREtUTiBkb2VzIG5vdCBrbm93IHRoZSBsZW5ndGggb2YgdGhlIGxpc3QgYXQgY29tcGlsZSB0aW1lLCBtZWFuaW5nIENES1ROIGhhcyB5ZXQgdG8gaW52b2tlIFRlcnJhZm9ybSB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBjbG91ZCBwcm92aWRlci4gQ0RLVE4gbGF0ZXIgaW52b2tlcyBUZXJyYWZvcm0gb24gdGhlIHN5bnRoZXNpemVkIHN0YXRpYyBKU09OIGZpbGUuXG5cbkJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB0aGUgY29udGVudHMgb2YgdGhlIG1hcCwgd2UgY2FuIG5vdCBkaWZmZXJlbnRpYXRlIGlmIHRoZSBtYXAgd2FzIGFjY2Vzc2VkLCBvciB1c2VkIGFzIHBhcnQgb2YgYSBsb29wLiBUbyBhdm9pZCB0aGlzIGFtYmlndWl0eTpcblxuLSBUbyBhY2Nlc3MgYSBzaW5ndWxhciBpdGVtIHVzZSAnRm4ubG9va3VwKG1hcCwga2V5KScuIERvIG5vdCB1c2UgJ21hcFtrZXldJy5cbi0gSWYgeW91IHdhbnQgdG8gbG9vcCBvdmVyIHRoZSBtYXAgdXNlICdUZXJyYWZvcm1JdGVyYXRvci5mcm9tTWFwKG1hcCknLiBEbyBub3QgdXNlIGEgJ2ZvcicgbG9vcCBvciBpdGVyYXRlIG92ZXIgJ09iamVjdC5lbnRyaWVzKG1hcCknIHdpdGggJ2ZvckVhY2gnLlxuXG5MZWFybiBtb3JlIGFib3V0IHRva2VuczogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3Rva2Vuc1xuTGVhcm4gbW9yZSBhYm91dCBpdGVyYXRvcnM6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9pdGVyYXRvcnNgO1xuXG5leHBvcnQgY29uc3QgZW5jb2RlZExpc3RUb2tlbkluU2NhbGFyU3RyaW5nQ29udGV4dCA9ICgpID0+XG4gIG5ldyBFcnJvcihgRm91bmQgYW4gZW5jb2RlZCBsaXN0IHRva2VuIHN0cmluZyBpbiBhIHNjYWxhciBzdHJpbmcgY29udGV4dC5cbiR7TElTVF9FUlJPUl9FWFBMQU5BVElPTn1gKTtcblxuZXhwb3J0IGNvbnN0IGVuY29kZWRNYXBUb2tlbkluU2NhbGFyU3RyaW5nQ29udGV4dCA9ICgpID0+XG4gIG5ldyBFcnJvcihgRm91bmQgYW4gZW5jb2RlZCBtYXAgdG9rZW4gaW4gYSBzY2FsYXIgc3RyaW5nIGNvbnRleHQuXG4ke01BUF9FUlJPUl9FWFBMQU5BVElPTn1gKTtcblxuZXhwb3J0IGNvbnN0IGVuY29kZWRNYXBUb2tlbkluU2NhbGFyTnVtYmVyQ29udGV4dCA9ICgpID0+XG4gIG5ldyBFcnJvcihgRm91bmQgYW4gZW5jb2RlZCBtYXAgdG9rZW4gaW4gYSBzY2FsYXIgbnVtYmVyIGNvbnRleHQuXG4ke01BUF9FUlJPUl9FWFBMQU5BVElPTn1gKTtcblxuZXhwb3J0IGNvbnN0IGNvbnN0cnVjdHNDYW5ub3RCZVJlc29sdmVkID0gKHBhdGhOYW1lOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihgVHJ5aW5nIHRvICdyZXNvbHZlKCknIGEgQ29uc3RydWN0IGF0ICcke3BhdGhOYW1lfScuXG5cblRoaXMgb2Z0ZW4gbWVhbnMgYW4gdW5pbnRlbmRlZCBjeWNsaWMgZGVwZW5kZW5jeSBpbiB5b3VyIGNvbnN0cnVjdCB0cmVlLCBsZWFkaW5nIHRvIHRoZSByZXNvbHV0aW9uIHN0dWNrIGluIGFuIGluZmluaXRlIGxvb3AgdGhhdCBmYWlscy5cblRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgc2NvcGUgcGFzc2VkIGludG8gdGhpcyBjb25zdHJ1Y3QgaXMgYWxzbyBwYXJ0IG9mIGl0cyBzdWJ0cmVlLlxuXG5UbyByZXNvbHZlIHRoaXMgaXNzdWUsIHJlZmFjdG9yIHlvdXIgY29kZSB0byBhdm9pZCB0aGlzIGN5Y2xpYyBkZXBlbmRlbmN5IGJ5IGNoYW5naW5nIHRoZSBzY29wZSBvZiB0aGlzIGNvbnN0cnVjdC5gKTtcblxuZXhwb3J0IGNvbnN0IG1hcEtleU11c3RSZXNvbHZlVG9TdHJpbmcgPSAoXG4gIHBhdGhOYW1lOiBzdHJpbmcsXG4gIGtleTogc3RyaW5nLFxuICByZXNvbHZlZEtleTogYW55LFxuKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYEF0IFwiJHtwYXRoTmFtZX1cIiBhIG1hcCB1c2VzIHRoZSBrZXkgXCIke2tleX1cIiwgbWVhbmluZyB0aGF0IGtleSBtdXN0IHJlc29sdmUgdG8gYSBzdHJpbmcuIEhvd2V2ZXIsIGl0IHJlc29sdmVzIHRvIGEgJHt0eXBlb2YgcmVzb2x2ZWRLZXl9IHdpdGggdGhlIHZhbHVlICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICByZXNvbHZlZEtleSxcbiAgICApfS4gVG8gZml4IHRoaXMsIGNoYW5nZSB0aGUgVG9rZW4gdG8gcmVzb2x2ZSB0byBhIHN0cmluZy5gLFxuICApO1xuXG5jb25zdCB1bmtub3duVG9rZW5FeHBsYW5hdGlvbiA9IGBUaGlzIG1lYW5zIHlvdSBhcmUgdHJ5aW5nIHRvIGFjY2VzcyBhIFRva2VuIHZhbHVlIHRoYXQgZG9lcyBub3QgZXhpc3QuIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHRoZSBUb2tlbiBpcyBmcm9tIGFub3RoZXIgQ0RLIChpLmUuLCBBV1MgQ0RLLCBDREs4cywgZXRjLikgYW5kIGlzIHVua25vd24gdG8gdGhpcyBDREtUTiBBcHBsaWNhdGlvbi4gWW91IGVpdGhlciBuZWVkIHRvIG1ha2UgdGhlIG90aGVyIENESyByZXNvbHZlIHRoaXMgVG9rZW4gYmVmb3JlIENES1ROIHRyaWVzIHRvIHJlc29sdmUgaXQsIG9yIHdvcmsgYXJvdW5kIHVzaW5nIHRoaXMgVG9rZW4gYXQgYWxsLlxuXG5JZiB0aGlzIGVycm9yIG9jY3VycyB3aXRob3V0IGFub3RoZXIgQ0RLIChvciBhIHZhbHVlIGxvb2tpbmcgbGlrZSBhIFRva2VuKSBpbnZvbHZlZCwgcGxlYXNlIGZpbGUgYSBidWcuYDtcblxuZXhwb3J0IGNvbnN0IHVua25vd25OdW1iZXJUb2tlbkZvdW5kID0gKCkgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBFbmNvZGVkIHJlcHJlc2VudGF0aW9uIG9mIHVua25vd24gbnVtYmVyIFRva2VuIGZvdW5kLiAke3Vua25vd25Ub2tlbkV4cGxhbmF0aW9ufWAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCB1bnJlY29nbml6ZWRUb2tlbktleSA9IChrZXk6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgVG9rZW4gS2V5ICcke2tleX0nLiAke3Vua25vd25Ub2tlbkV4cGxhbmF0aW9ufWApO1xuXG5leHBvcnQgY29uc3QgSWRJbmNsdWRlc1VucmVzb2x2ZWRUb2tlbnMgPSAodW5yZXNvbHZlZFRva2Vuczogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYFRoaXMgY29uc3RydWN0IChvciBpdHMgcGFyZW50IGNvbnN0cnVjdCkgaXMgY29uZmlndXJlZCB3aXRoIGFuIElEIHRoYXQgY29udGFpbnMgYSBUb2tlbjogJHt1bnJlc29sdmVkVG9rZW5zfS4gVGhpcyBpcyBub3QgYWxsb3dlZCBiZWNhdXNlIElEcyBtdXN0IGJlIGtub3duIHN0YXRpY2FsbHkgZHVyaW5nIHN5bnRoZXNpcy4gVG9rZW4gdmFsdWVzIGFyZSBvbmx5IGtub3duIGR1cmluZyB0aGUgYXBwbHkgc3RhZ2UsIHRoZXJlZm9yZSB0aGV5IGNhbm5vdCBiZSB1c2VkIGluIElEcy4gUGxlYXNlIHVzZSBhIGNvbmNyZXRlIHZhbHVlIGZvciB5b3VyIGNvbnN0cnVjdHMgSUQgaW5zdGVhZC5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgYXNzZXRDYW5Ob3RDcmVhdGVaaXBBcmNoaXZlID0gKFxuICBzcmM6IHN0cmluZyxcbiAgZGVzdDogc3RyaW5nLFxuICBlcnJvcjogRXJyb3IsXG4pID0+XG4gIG5ldyBFcnJvcihcbiAgICBgQSBUZXJyYWZvcm1Bc3NldCB0cnlpbmcgdG8gemlwIGFyY2hpdmUgJyR7c3JjfScgaW50byAke2Rlc3R9IGZhaWxlZDogJHtlcnJvcn1gLFxuICApO1xuXG5leHBvcnQgY29uc3QgdW5rbm93blByb3ZpZGVyRmVhdHVyZSA9IChmZWF0dXJlOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgVW5rbm93biBwcm92aWRlci1wcm90b2NvbCBmZWF0dXJlIFwiJHtmZWF0dXJlfVwiIHBhc3NlZCB0byByZWdpc3RlclByb3ZpZGVyRmVhdHVyZVVzYWdlLiBUaGlzIGlzIGFuIGludGVybmFsIGNka3RuIEFQSSBpbnRlbmRlZCB0byBiZSBjYWxsZWQgYnkgZ2VuZXJhdGVkIHByb3ZpZGVyIGJpbmRpbmdzLCBub3QgdXNlciBjb2RlOyBpZiB5b3UgZGlkIG5vdCBjYWxsIGl0IGRpcmVjdGx5LCBwbGVhc2UgZmlsZSBhIGJ1ZyByZXBvcnQuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IHRlcnJhZm9ybU1vZHVsZUhhc0NoaWxkcmVuID0gKHBhdGhOYW1lOiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICBgVHJ5aW5nIHRvIGFkZCBjaGlsZHJlbiB0byBhIFRlcnJhZm9ybU1vZHVsZSBhdCAnJHtwYXRoTmFtZX0nLiBUZXJyYWZvcm1Nb2R1bGVzIGNhbm5vdCBoYXZlIGNoaWxkcmVuLCBpZiB5b3Ugd2FudCB0byBncm91cCByZXNvdXJjZXMgb3IgY29uc3RydWN0cyBpbiBnZW5lcmFsIHRvZ2V0aGVyIHBsZWFzZSB1c2UgdGhlIENvbnN0cnVjdHMgY2xhc3MgaW5zdGVhZC4gU2VlIGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9jb25zdHJ1Y3RzIGZvciBtb3JlIGRldGFpbHMuYCxcbiAgKTtcbn07XG4iXX0=
425
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOzs7O0FBS0ksTUFBTSxVQUFVLEdBQUcsQ0FBQyxhQUFxQixFQUFFLEVBQUUsQ0FDbEQsSUFBSSxLQUFLLENBQ1AseURBQXlELGFBQWE7OztLQUdyRSxDQUNGLENBQUM7QUFOUyxRQUFBLFVBQVUsY0FNbkI7QUFFRyxNQUFNLHlCQUF5QixHQUFHLENBQUMsS0FBZSxFQUFFLEVBQUU7SUFDM0QsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzRCxPQUFPLElBQUksS0FBSyxDQUNkLG1HQUFtRyxVQUFVO0NBQ2hILENBQ0UsQ0FBQztBQUNKLENBQUMsQ0FBQztBQU5XLFFBQUEseUJBQXlCLDZCQU1wQztBQUVLLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxTQUFpQixFQUFFLEVBQUUsQ0FDeEQsSUFBSSxLQUFLLENBQ1AsNkRBQTZELFNBQVM7OztLQUdyRSxDQUNGLENBQUM7QUFOUyxRQUFBLG9CQUFvQix3QkFNN0I7QUFFRyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsRUFBRSxDQUMxQyxJQUFJLEtBQUssQ0FDUDs7S0FFQyxDQUNGLENBQUM7QUFMUyxRQUFBLHVCQUF1QiwyQkFLaEM7QUFFRyxNQUFNLDBCQUEwQixHQUFHLENBQUMsRUFBVSxFQUFFLFVBQWtCLEVBQUUsRUFBRSxDQUMzRSxJQUFJLEtBQUssQ0FDUCxrQkFBa0IsRUFBRSxzQ0FBc0MsVUFBVSwrRUFBK0UsT0FBTyxDQUFDLEdBQUcsRUFBRTs7Ozs7O0NBTW5LLENBQ0UsQ0FBQztBQVRTLFFBQUEsMEJBQTBCLDhCQVNuQztBQUVHLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxFQUFVLEVBQUUs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QkFBdUIsR0FBRyxHQUFHLEVBQUUsQ0FDMUMsSUFBSSxLQUFLLENBQ1AseURBQXlELHVCQUF1QixFQUFFLENBQ25GLENBQUM7QUFIUyxRQUFBLHVCQUF1QiwyQkFHaEM7QUFFRyxNQUFNLG9CQUFvQixHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FDbEQsSUFBSSxLQUFLLENBQUMsMkJBQTJCLEdBQUcsTUFBTSx1QkFBdUIsRUFBRSxDQUFDLENBQUM7QUFEOUQsUUFBQSxvQkFBb0Isd0JBQzBDO0FBRXBFLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxnQkFBd0IsRUFBRSxFQUFFLENBQ3JFLElBQUksS0FBSyxDQUNQLDRGQUE0RixnQkFBZ0Isb09BQW9PLENBQ2pWLENBQUM7QUFIUyxRQUFBLDBCQUEwQiw4QkFHbkM7QUFFRyxNQUFNLDJCQUEyQixHQUFHLENBQ3pDLEdBQVcsRUFDWCxJQUFZLEVBQ1osS0FBWSxFQUNaLEVBQUUsQ0FDRixJQUFJLEtBQUssQ0FDUCwyQ0FBMkMsR0FBRyxVQUFVLElBQUksWUFBWSxLQUFLLEVBQUUsQ0FDaEYsQ0FBQztBQVBTLFFBQUEsMkJBQTJCLCtCQU9wQztBQUVHLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxPQUFlLEVBQUUsRUFBRSxDQUN4RCxJQUFJLEtBQUssQ0FDUCxzQ0FBc0MsT0FBTyx5TUFBeU0sQ0FDdlAsQ0FBQztBQUhTLFFBQUEsc0JBQXNCLDBCQUcvQjtBQUVHLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxRQUFnQixFQUFFLEVBQUU7SUFDN0QsT0FBTyxJQUFJLEtBQUssQ0FDZCxtREFBbUQsUUFBUSxxTkFBcU4sQ0FDalIsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUpXLFFBQUEsMEJBQTBCLDhCQUlyQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG4gKi9cblxuaW1wb3J0IHsgSURlcGVuZGFibGUgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgVGVycmFmb3JtU3RhY2sgfSBmcm9tIFwiLi90ZXJyYWZvcm0tc3RhY2tcIjtcblxuZXhwb3J0IGNvbnN0IG5vQXBwRm91bmQgPSAoY29uc3RydWN0UGF0aDogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYE5vIGFwcCBjb3VsZCBiZSBpZGVudGlmaWVkIGZvciB0aGUgY29uc3RydWN0IGF0IHBhdGggJyR7Y29uc3RydWN0UGF0aH0nIChsaWtlbHkgYSBUZXJyYWZvcm1TdGFjaykuXG5UaGUgc2NvcGUgb2YgQ0RLVE4ncyBUZXJyYWZvcm1TdGFjayBjbGFzcyBpcyBhIHNpbmdsZSBBcHAgaW5zdGFuY2UgY3JlYXRlZCBieSAnY29uc3QgYXBwID0gbmV3IEFwcCgpJy4gVGhlIEFwcCBpcyB5b3VyIHByb2plY3QncyByb290LCBob2xkaW5nIHByb2plY3QgY29uZmlndXJhdGlvbiBhbmQgdmFsaWRhdGlvbnMuXG5MZWFybiBtb3JlIGFib3V0IHRoZSBBcHA6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9jZGt0bi1hcmNoaXRlY3R1cmUjYXBwLWNsYXNzXG4gICAgYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGNvbnN0cnVjdHNPdXRzaWRlT2ZTdGFja3MgPSAocGF0aHM6IHN0cmluZ1tdKSA9PiB7XG4gIGNvbnN0IGJ1bGxldExpc3QgPSBwYXRocy5tYXAoKHApID0+IGAgIC0gJHtwfWApLmpvaW4oXCJcXG5cIik7XG4gIHJldHVybiBuZXcgRXJyb3IoXG4gICAgYEZvdW5kIGNvbnN0cnVjdHMgb3V0c2lkZSBvZiBhIFRlcnJhZm9ybVN0YWNrIChkaWQgeW91IHBhc3Mgc2NvcGU9YXBwIGluc3RlYWQgb2Ygc2NvcGU9c3RhY2s/KTpcXG4ke2J1bGxldExpc3R9XG5gLFxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGFwcFZhbGlkYXRpb25GYWlsdXJlID0gKGVycm9yTGlzdDogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYEFwcC1sZXZlbCB2YWxpZGF0aW9uIGZhaWxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgZXJyb3JzOlxcbiAgJHtlcnJvckxpc3R9XG5WYWxpZGF0aW9ucyBhbGxvdyBmb3IgZHluYW1pYyB2ZXJpZmljYXRpb24gb2YgeW91ciBwcm9qZWN0LlxuVG8gc2tpcCB2YWxpZGF0aW9ucywgYWRkICdza2lwVmFsaWRhdGlvbjogdHJ1ZScgdG8geW91ciBBcHAgY29uZmlnLlxuICAgIGAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBwcm92aWRlclZlcnNpb25NaXNtYXRjaCA9ICgpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgVmVyc2lvbiBtaXNtYXRjaCBkZXRlY3RlZDogWW91ciBwcm92aWRlciBiaW5kaW5ncyBhcmUgYnVpbHQgZm9yIGFuIG9sZGVyIHZlcnNpb24gb2YgQ0RLVG4uXG5VcGdyYWRlIHlvdXIgcHJlLWJ1aWx0IHByb3ZpZGVyIG9yIHJlLXJ1biBjZGt0biBnZXQgd2l0aCBhIG1vcmUgcmVjZW50IHZlcnNpb24gKD49IDAuMTApIG9mIHRoZSBjZGt0bi1jbGkuXG4gICAgYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGFzc2V0T3V0T2ZTY29wZU9mQ0RLVEZKc29uID0gKGlkOiBzdHJpbmcsIGNvbmZpZ1BhdGg6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBUZXJyYWZvcm1Bc3NldCAke2lkfSB3YXMgY3JlYXRlZCB3aXRoIGEgcmVsYXRpdmUgcGF0aCAnJHtjb25maWdQYXRofScsIGJ1dCB3ZSBjYW5ub3QgZmluZCB0aGUgY2RrdGYuanNvbiB3aXRoaW4geW91ciBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5ICcke3Byb2Nlc3MuY3dkKCl9J1xuXG5UaGUgY2RrdGYuanNvbiBmaWxlIGlzIG5lZWRlZCB0byBlc3RhYmxpc2ggdGhlIGJhc2UgZm9yIHRoZSByZWxhdGl2ZSBwYXRoICh0aGUgJy4nIGluICcuL2Zvby9iYXInKS5cblxuUGxhY2UgYSBjZGt0Zi5qc29uIGF0IHRoZSByb290IG9mIHlvdXIgcHJvamVjdC4gTGVhcm4gbW9yZTogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NyZWF0ZS1hbmQtZGVwbG95L2NvbmZpZ3VyYXRpb24tZmlsZVxuTGVhcm4gbW9yZSBhYm91dCBUZXJyYWZvcm1Bc3NldDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL2Fzc2V0c1xuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGFzc2V0RXhwZWN0c0RpcmVjdG9yeSA9IChpZDogc3RyaW5nLCBjb25maWdQYXRoOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgVGVycmFmb3JtQXNzZXQgJHtpZH0gZXhwZWN0cyBwYXRoIHRvIHBvaW50IHRvIGEgZGlyZWN0b3J5LiBJbnN0ZWFkLCB0aGlzIGZpbGUgd2FzIHBhc3NlZDogJyR7Y29uZmlnUGF0aH0nLiBQbGVhc2UgY29ycmVjdCB0aGUgcGF0aCB0byBwb2ludCB0byBhIGRpcmVjdG9yeS5cbkxlYXJuIG1vcmUgYWJvdXQgVGVycmFmb3JtQXNzZXQ6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9hc3NldHNcbiAgICBgLFxuICApO1xuXG5leHBvcnQgY29uc3QgYXNzZXRUeXBlTm90SW1wbGVtZW50ZWQgPSAoKSA9PlxuICBuZXcgRXJyb3IoYEFzc2V0IHR5cGUgaXMgbm90IGltcGxlbWVudGVkLlxuUG9zc2libGUgQXNzZXQgdHlwZXMgaW5jbHVkZTogRklMRSwgRElSRUNUT1JZLCBhbmQgQVJDSElWRS5cblRha2Ugb25lIG9mIHRoZXNlIHZhbHVlcyBmcm9tIHRoZSBBc3NldFR5cGUgRW51bS5cbkxlYXJuIG1vcmUgYWJvdXQgVGVycmFmb3JtQXNzZXQ6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9hc3NldHNcbiAgYCk7XG5cbmV4cG9ydCBjb25zdCBhc3NldEhhc2hDb25mbGljdGluZ0V4Y2x1ZGVPcHRpb25zID0gKCkgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBCb3RoICdleGNsdWRlJyBhbmQgJ2lnbm9yZVN0cmF0ZWd5JyB3ZXJlIHBhc3NlZCB0byBBc3NldEhhc2gub2YoKSwgYnV0ICdpZ25vcmVTdHJhdGVneScgcmVwbGFjZXMgJ2V4Y2x1ZGUnIHJhdGhlciB0aGFuIGNvbWJpbmluZyB3aXRoIGl0LiBQYXNzIG9ubHkgb25lLmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBhc3NldFN0YWdpbmdDb25mbGljdGluZ0V4Y2x1ZGVPcHRpb25zID0gKGlkOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgVGVycmFmb3JtQXNzZXQgJHtpZH0gd2FzIGNvbmZpZ3VyZWQgd2l0aCBib3RoICdleGNsdWRlJyBhbmQgJ2lnbm9yZVN0cmF0ZWd5JywgYnV0ICdpZ25vcmVTdHJhdGVneScgcmVwbGFjZXMgJ2V4Y2x1ZGUnIHJhdGhlciB0aGFuIGNvbWJpbmluZyB3aXRoIGl0LiBQYXNzIG9ubHkgb25lLlxuTGVhcm4gbW9yZSBhYm91dCBUZXJyYWZvcm1Bc3NldDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL2Fzc2V0c2AsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBhc3NldEhhc2hUeXBlQ3VzdG9tUmVxdWlyZXNIYXNoID0gKGlkOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgVGVycmFmb3JtQXNzZXQgJHtpZH0gd2FzIGNvbmZpZ3VyZWQgd2l0aCBhc3NldEhhc2hUeXBlICdDVVNUT00nIGJ1dCBubyAnYXNzZXRIYXNoJy4gQSBjdXN0b20gaGFzaCB0eXBlIHJlcXVpcmVzIGFuIGV4cGxpY2l0ICdhc3NldEhhc2gnIHZhbHVlLlxuTGVhcm4gbW9yZSBhYm91dCBUZXJyYWZvcm1Bc3NldDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL2Fzc2V0c2AsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBhc3NldEhhc2hDb25mbGljdGluZ0hhc2hUeXBlID0gKGlkOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgVGVycmFmb3JtQXNzZXQgJHtpZH0gd2FzIGNvbmZpZ3VyZWQgd2l0aCBhbiBleHBsaWNpdCAnYXNzZXRIYXNoJywgc28gJ2Fzc2V0SGFzaFR5cGUnIG11c3QgYmUgdW5kZWZpbmVkIG9yICdDVVNUT00nLlxuTGVhcm4gbW9yZSBhYm91dCBUZXJyYWZvcm1Bc3NldDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL2Fzc2V0c2AsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBhc3NldEhhc2hUeXBlVW5rbm93biA9IChpZDogc3RyaW5nLCBhc3NldEhhc2hUeXBlOiB1bmtub3duKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYFRlcnJhZm9ybUFzc2V0ICR7aWR9IHdhcyBjb25maWd1cmVkIHdpdGggYW4gdW5rbm93biBhc3NldEhhc2hUeXBlICcke1N0cmluZyhhc3NldEhhc2hUeXBlKX0nLiBVc2Ugb25lIG9mIEFzc2V0SGFzaFR5cGUuU09VUkNFLCBBc3NldEhhc2hUeXBlLk9VVFBVVCwgb3IgQXNzZXRIYXNoVHlwZS5DVVNUT00uXG5MZWFybiBtb3JlIGFib3V0IFRlcnJhZm9ybUFzc2V0OiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvYXNzZXRzYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGFzc2V0SGFzaE91dE9mU2NvcGVDZGt0bkpzb24gPSAoY29uZmlnUGF0aDogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYEFzc2V0SGFzaC5vZigpIHdhcyBjYWxsZWQgd2l0aCBhIHJlbGF0aXZlIHBhdGggJyR7Y29uZmlnUGF0aH0nLCBidXQgd2UgY2Fubm90IGZpbmQgdGhlIGNka3RmLmpzb24gYWJvdmUgeW91ciBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5ICcke3Byb2Nlc3MuY3dkKCl9J1xuXG5UaGUgY2RrdGYuanNvbiBmaWxlIGlzIG5lZWRlZCB0byBlc3RhYmxpc2ggdGhlIGJhc2UgZm9yIHRoZSByZWxhdGl2ZSBwYXRoICh0aGUgJy4nIGluICcuL2Zvby9iYXInKSwgc28gdGhhdCB0aGUgaGFzaCBtYXRjaGVzIFRlcnJhZm9ybUFzc2V0IGZvciB0aGUgc2FtZSBzb3VyY2UuXG5cblBsYWNlIGEgY2RrdGYuanNvbiBhdCB0aGUgcm9vdCBvZiB5b3VyIHByb2plY3QsIG9yIHBhc3MgYW4gYWJzb2x1dGUgcGF0aC4gTGVhcm4gbW9yZTogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NyZWF0ZS1hbmQtZGVwbG95L2NvbmZpZ3VyYXRpb24tZmlsZVxuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGFzc2V0SGFzaEludmFsaWQgPSAoaWQ6IHN0cmluZywgYXNzZXRIYXNoOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgVGVycmFmb3JtQXNzZXQgJHtpZH0gcmVzb2x2ZWQgYW4gJ2Fzc2V0SGFzaCcgb2YgJyR7YXNzZXRIYXNofScsIGJ1dCBpdCBuYW1lcyB0aGUgc3RhZ2VkIGFzc2V0IGZpbGUgYW5kIHNvIG1heSBvbmx5IGNvbnRhaW4gbGV0dGVycywgZGlnaXRzLCAnXycsICcuJyBhbmQgJy0nLlxuTGVhcm4gbW9yZSBhYm91dCBUZXJyYWZvcm1Bc3NldDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL2Fzc2V0c2AsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBhc3NldFN0YWdpbmdCdW5kbGVyT3V0cHV0Tm90RGlyZWN0b3J5ID0gKFxuICBpZDogc3RyaW5nLFxuICBwcm9kdWNlZDogc3RyaW5nLFxuKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYFRlcnJhZm9ybUFzc2V0ICR7aWR9J3MgYnVuZGxlciByZXR1cm5lZCBhIGRpcmVjdG9yeSByZXN1bHQgYXQgJyR7cHJvZHVjZWR9Jywgd2hpY2ggaXMgbm90IGEgZGlyZWN0b3J5LiBSZXR1cm4gJ0J1bmRsZVJlc3VsdC5maWxlKC4uLiknIGZvciBhIHNpbmdsZS1maWxlIGFydGlmYWN0LCBvciB3cml0ZSBhIGRpcmVjdG9yeSBpbnRvICdvcHRpb25zLm91dHB1dERpcicgYW5kIHJldHVybiAnQnVuZGxlUmVzdWx0LmRpcmVjdG9yeSguLi4pJy5cbkxlYXJuIG1vcmUgYWJvdXQgVGVycmFmb3JtQXNzZXQ6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9hc3NldHNgLFxuICApO1xuXG5leHBvcnQgY29uc3QgYXNzZXRTdGFnaW5nQnVuZGxlck91dHB1dE5vdEZpbGUgPSAoXG4gIGlkOiBzdHJpbmcsXG4gIHByb2R1Y2VkOiBzdHJpbmcsXG4pID0+XG4gIG5ldyBFcnJvcihcbiAgICBgVGVycmFmb3JtQXNzZXQgJHtpZH0ncyBidW5kbGVyIHJldHVybmVkIGEgZmlsZSByZXN1bHQgYXQgJyR7cHJvZHVjZWR9Jywgd2hpY2ggaXMgbm90IGEgZmlsZS4gUmV0dXJuICdCdW5kbGVSZXN1bHQuZGlyZWN0b3J5KC4uLiknIGZvciBhIGRpcmVjdG9yeSBhcnRpZmFjdCwgb3Igd3JpdGUgYSBzaW5nbGUgZmlsZSBpbnRvICdvcHRpb25zLm91dHB1dERpcicgYW5kIHJldHVybiAnQnVuZGxlUmVzdWx0LmZpbGUoLi4uKScuXG5MZWFybiBtb3JlIGFib3V0IFRlcnJhZm9ybUFzc2V0OiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvYXNzZXRzYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGFzc2V0U3RhZ2luZ0J1bmRsZXJGaWxlT3V0cHV0TmVlZHNGaWxlUGFja2FnaW5nID0gKGlkOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgVGVycmFmb3JtQXNzZXQgJHtpZH0ncyBidW5kbGVyIHByb2R1Y2VkIGEgc2luZ2xlLWZpbGUgYXJ0aWZhY3QgKEJ1bmRsZVJlc3VsdC5maWxlKSwgd2hpY2ggc3RhZ2VzIHZlcmJhdGltIGFuZCBzbyBuZWVkcyBBc3NldFR5cGUuRklMRS4gVXNlIEFzc2V0VHlwZS5GSUxFIGZvciBhIGZpbGUtcHJvZHVjaW5nIGJ1bmRsZXIsIG9yIGhhdmUgdGhlIGJ1bmRsZXIgcmV0dXJuIGEgZGlyZWN0b3J5IChCdW5kbGVSZXN1bHQuZGlyZWN0b3J5KSBmb3IgQXNzZXRUeXBlLkRJUkVDVE9SWSBvciBBc3NldFR5cGUuQVJDSElWRS5cbkxlYXJuIG1vcmUgYWJvdXQgVGVycmFmb3JtQXNzZXQ6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9hc3NldHNgLFxuICApO1xuXG5leHBvcnQgY29uc3QgYXNzZXRTdGFnaW5nQnVuZGxlckRpcmVjdG9yeU91dHB1dE5lZWRzRGlyZWN0b3J5UGFja2FnaW5nID0gKFxuICBpZDogc3RyaW5nLFxuKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYFRlcnJhZm9ybUFzc2V0ICR7aWR9J3MgYnVuZGxlciBwcm9kdWNlZCBhIGRpcmVjdG9yeSBhcnRpZmFjdCAoQnVuZGxlUmVzdWx0LmRpcmVjdG9yeSksIGJ1dCBBc3NldFR5cGUuRklMRSBzdGFnZXMgYSBzaW5nbGUgZmlsZSB2ZXJiYXRpbS4gVXNlIEFzc2V0VHlwZS5ESVJFQ1RPUlkgb3IgQXNzZXRUeXBlLkFSQ0hJVkUgd2l0aCBhIGRpcmVjdG9yeS1wcm9kdWNpbmcgYnVuZGxlciwgb3IgaGF2ZSB0aGUgYnVuZGxlciByZXR1cm4gYSBzaW5nbGUgZmlsZSAoQnVuZGxlUmVzdWx0LmZpbGUpIGZvciBBc3NldFR5cGUuRklMRS5cbkxlYXJuIG1vcmUgYWJvdXQgVGVycmFmb3JtQXNzZXQ6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9hc3NldHNgLFxuICApO1xuXG5leHBvcnQgY29uc3QgYXNzZXRTdGFnaW5nQWxyZWFkeVN0YWdlZCA9IChpZDogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYFRlcnJhZm9ybUFzc2V0ICR7aWR9IHdhcyBhbHJlYWR5IHN0YWdlZC4gQW4gQXNzZXRTdGFnaW5nIHN0YWdlcyBleGFjdGx5IG9uY2Ug4oCUIGl0cyBidW5kbGVyIG91dHB1dCBpcyBjYXB0dXJlZCBvbiB0aGUgZmlyc3QgY2FsbCBhbmQgY2Fubm90IGJlIHJlYnVpbHQgb3IgcmVzdGFnZWQuXG5MZWFybiBtb3JlIGFib3V0IFRlcnJhZm9ybUFzc2V0OiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvYXNzZXRzYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGFzc2V0QnVuZGxlck91dHB1dEZpbGVOYW1lSW52YWxpZCA9IChcbiAgaWQ6IHN0cmluZyxcbiAgb3V0cHV0RmlsZU5hbWU6IHN0cmluZyxcbikgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBUZXJyYWZvcm1Bc3NldCAke2lkfSB3YXMgZ2l2ZW4gYSBidW5kbGVyIHdpdGggYW4gaW52YWxpZCBvdXRwdXRGaWxlTmFtZSAnJHtvdXRwdXRGaWxlTmFtZX0nLiBJdCBuYW1lcyB0aGUgc3RhZ2VkIGFydGlmYWN0IGZpbGUsIHNvIGl0IG11c3QgYmUgYSBwbGFpbiBmaWxlIG5hbWUg4oCUIG5vdCBlbXB0eSwgJy4nLCAnLi4nLCBhYnNvbHV0ZSwgb3IgY29udGFpbmluZyAnLycgb3IgJ1xcXFwnLlxuTGVhcm4gbW9yZSBhYm91dCBUZXJyYWZvcm1Bc3NldDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL2Fzc2V0c2AsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBjaGFpbkJ1bmRsZXJSZXF1aXJlc0F0TGVhc3RPbmVCdW5kbGVyID0gKCkgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBDaGFpbkJ1bmRsZXIub2YoKSByZXF1aXJlcyBhdCBsZWFzdCBvbmUgYnVuZGxlci4gQXQgbGVhc3Qgb25lIGJ1bmRsZXIgbXVzdCBiZSBhYmxlIHRvIHJ1biBpbiB0aGlzIGVudmlyb25tZW50LmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBjaGFpbkJ1bmRsZXJDb25mbGljdGluZ091dHB1dEZpbGVOYW1lID0gKG5hbWVzOiBzdHJpbmdbXSkgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBDaGFpbkJ1bmRsZXIgbGVncyBkZWNsYXJlIGNvbmZsaWN0aW5nIG91dHB1dEZpbGVOYW1lIHZhbHVlcyAoJHtuYW1lcy5qb2luKFwiLCBcIil9KS4gVGhlIHN0YWdlZCBuYW1lIGlzIGZpeGVkIGJlZm9yZSBhbnkgbGVnIHJ1bnMsIHNvIGFsbCBsZWdzIHRoYXQgc2V0IGl0IG11c3QgYWdyZWUuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGNoYWluQnVuZGxlckFsbERlY2xpbmVkID0gKHRyaWVkOiBudW1iZXIpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgRXZlcnkgYnVuZGxlciBpbiB0aGUgQ2hhaW5CdW5kbGVyIGRlY2xpbmVkIHRvIHJ1biAoJHt0cmllZH0gdHJpZWQpLiBBdCBsZWFzdCBvbmUgbXVzdCBiZSBhYmxlIHRvIHJ1biBpbiB0aGlzIGVudmlyb25tZW50LmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBkeW5hbWljQmxvY2tOb3RTdXBwb3J0ZWQgPSAoX2ZvcmVhY2hFeHByZXNzaW9uOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgV2UgZG8gbm90IHN1cHBvcnQgZGlyZWN0bHkgcmVzb2x2aW5nIGEgVGVycmFmb3JtRHluYW1pY0Jsb2NrLiBEeW5hbWljIGJsb2NrcyBhcmUgb25seSBzdXBwb3J0ZWQgb24gYmxvY2sgYXR0cmlidXRlcyBvZiByZXNvdXJjZXMsIGRhdGEgc291cmNlcywgYW5kIHByb3ZpZGVycy5cblxuWW91IGNhbiBjcmVhdGUgYSBUZXJyYWZvcm1EeW5hbWljQmxvY2sgYnkgY2FsbGluZyAnLmR5bmFtaWMnIG9uIGEgVGVycmFmb3JtSXRlcmF0b3IgaW5zdGFuY2UuXG5cblRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbiB3YXMgdXNlZCBmb3IgdGhlIGR5bmFtaWMgYmxvY2s6IC5keW5hbWljKHtcbiAgJHtfZm9yZWFjaEV4cHJlc3Npb259XG59KVxuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IHVucmVzb2x2ZWRUb2tlbkluQ29uc3RydWN0SWQgPSAoaWQ6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBZb3UgY2Fubm90IHVzZSBhIHRva2VuIChlLmcuLCBhIHJlZmVyZW5jZSB0byBhbiBhdHRyaWJ1dGUpIGFzIHRoZSBpZCBvZiBhIGNvbnN0cnVjdC4gSWRzIG9mIGNvbnN0cnVjdHMgbXVzdCBiZSBrbm93biBhdCBzeW50aGVzaXMgdGltZSwgYW5kIHRva2VuIHZhbHVlcyBhcmUgb25seSBrbm93biB3aGVuIFRlcnJhZm9ybSBydW5zLiBQbGVhc2UgdXNlIGEgY29uY3JldGUgdmFsdWUgZm9yIHlvdXIgY29uc3RydWN0cyBJRCBpbnN0ZWFkLlxuWW91IHBhc3NlZCB0aGUgZm9sbG93aW5nIGlkOiBcIiR7aWR9XCJcbmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBpdGVyYXRvck9uUmVzb3VyY2VXaXRoQ291bnQgPSAoKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYFlvdSBjYW5ub3QgY3JlYXRlIGFuIGl0ZXJhdG9yIGZyb20gYSByZXNvdXJjZSB3aXRoIGEgY291bnQgYXJndW1lbnQuXG5JbnN0ZWFkLCByZXVzZSB0aGlzIHJlc291cmNlJ3MgVGVycmFmb3JtQ291bnQgaW5zdGFuY2UgaW4gdGhlIHJlc291cmNlIHlvdSB3YW50IHRvIHVzZSBhcyBhbiBpdGVyYXRvci5cblxuSWYgeW91IHdhbnQgdG8gdXNlIGFuIGl0ZXJhdG9yIHRvIHBvcHVsYXRlIGEgbGlzdCBhdHRyaWJ1dGUsIHJlcGxhY2UgdGhlIGNvdW50IG9uIHRoZSByZXNvdXJjZSB3aXRoIGFuIGl0ZXJhdG9yIHBhc3NlZCBpbnRvIHRoZSBmb3JFYWNoIGFyZ3VtZW50LmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBpdGVyYXRvck9uUmVzb3VyY2VXaXRob3V0Rm9yRWFjaCA9ICgpID0+XG4gIG5ldyBFcnJvcihgQ2Fubm90IGNyZWF0ZSBhbiBpdGVyYXRvciBmcm9tIGEgcmVzb3VyY2Ugd2l0aG91dCBhIGZvckVhY2ggYXJndW1lbnQuIElmIHlvdSB3YW50IHRvIGNyZWF0ZSBtb3JlIGluc3RhbmNlcyBvZiB0aGlzIHJlc291cmNlLCBwYXNzIGFuIGl0ZXJhdG9yIHRvIHRoZSBmb3JFYWNoIGFyZ3VtZW50IG9mIHRoZSByZXNvdXJjZSBmaXJzdC5cbiAgYCk7XG5cbmV4cG9ydCBjb25zdCBtb2R1bGVzV2l0aFNhbWVBbGlhcyA9IChhbGlhczogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoYE11bHRpcGxlIHByb3ZpZGVycyBoYXZlIHRoZSBzYW1lIGFsaWFzOiBcIiR7YWxpYXN9XCJcbkVhY2ggcHJvdmlkZXIgbXVzdCBoYXZlIGEgdW5pcXVlIGFsaWFzIHdoZW4gcGFzc2luZyBtdWx0aXBsZSBwcm92aWRlcnMgb2YgdGhlIHNhbWUgdHlwZSB0byBtb2R1bGVzLlxuICBgKTtcblxuZXhwb3J0IGNvbnN0IG1vdmVUYXJnZXRBbHJlYWR5U2V0ID0gKFxuICB0YXJnZXQ6IHN0cmluZyxcbiAgZnJpZW5kbHlVbmlxdWVJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKSA9PlxuICBuZXcgRXJyb3IoYFRhcmdldCBcIiR7dGFyZ2V0fVwiIGhhcyBhbHJlYWR5IGJlZW4gdXNlZCBmb3IgdGhlIGNvbnN0cnVjdCAke2ZyaWVuZGx5VW5pcXVlSWR9LlxuVGFyZ2V0IG11c3QgYmUgYSBzdHJpbmcgdGhhdCBpcyB1bmlxdWUgYWNyb3NzIGFsbCByZXNvdXJjZXMgaW4gdGhlIHNhbWUgc3RhY2suYCk7XG5cbmV4cG9ydCBjb25zdCBtb3ZlVGFyZ2V0Tm90U2V0ID0gKHRhcmdldDogc3RyaW5nLCBlbnRyaWVzOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihgVGFyZ2V0IFwiJHt0YXJnZXR9XCIgaGFzIG5vdCBiZWVuIHNldC5cbllvdSB0cmllZCB0byBtb3ZlIGEgcmVzb3VyY2Ugd2l0aG91dCBhIHRhcmdldC5cbkNhbGwgLmFkZE1vdmVUYXJnZXQoXCIke3RhcmdldH1cIikgb24gdGhlIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZSB5b3Ugd2FudCB0byBtb3ZlIHRoaXMgcmVzb3VyY2UgdG8uXG5cbkFsdGVybmF0aXZlbHksIHlvdSBjYW4gdXNlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHRhcmdldHMgKGluIGNhc2UgeW91IGhhZCBhIHR5cG8pOlxuJHtlbnRyaWVzfVxuYCk7XG5cbmV4cG9ydCBjb25zdCBtb3ZlZFRvUmVzb3VyY2VPZkRpZmZlcmVudFR5cGUgPSAoXG4gIG1vdmVUYXJnZXQ6IHN0cmluZyxcbiAgb3JpZ2luYWxSZXNvdXJjZVR5cGU6IHN0cmluZyxcbiAgZGVzdGluYXRpb25SZXNvdXJjZVR5cGU6IHN0cmluZyxcbikgPT5cbiAgbmV3IEVycm9yKGBXZSBkbyBub3Qgc3VwcG9ydCBtb3ZpbmcgcmVzb3VyY2VzIHRvIGEgZGlmZmVyZW50IHR5cGUuXG5cblRoZSBkZXN0aW5hdGlvbiBcIiR7bW92ZVRhcmdldH1cIidzIHJlc291cmNlIHR5cGUgJHtkZXN0aW5hdGlvblJlc291cmNlVHlwZX0gZGlmZmVycyBmcm9tIHRoZSBvcmlnaW5hbCByZXNvdXJjZSB0eXBlICgke29yaWdpbmFsUmVzb3VyY2VUeXBlfSkgeW91IGFyZSB0cnlpbmcgdG8gbW92ZS5cblxuSWYgdGhpcyB3YXMgaW50ZW50aW9uYWwsIHRyeSBpbXBvcnRpbmcgdGhlIGV4aXN0aW5nIHJlc291cmNlIGludG8geW91ciB0YXJnZXQgaW5zdGVhZC4gTGVhcm4gbW9yZTpcbmh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9yZXNvdXJjZXMjaW1wb3J0aW5nLXJlc291cmNlc1xuXG5Ob3RlIHRoYXQgeW91IG11c3QgbWFudWFsbHkgcmVtb3ZlIHRoZSBvcmlnaW5hbCByZXNvdXJjZSBmcm9tIHlvdXIgc3RhdGUgZmlsZSBhZnRlciBpbXBvcnRpbmcgaXQuIFVzZSB0aGUgXCJ0ZXJyYWZvcm0gc3RhdGUgcm1cIiBjb21tYW5kIGluIHRoZSBvdXRwdXQgZGlyZWN0b3J5IG9mIHRoZSBzdGFjayB5b3UgZGVmaW5lZCB0aGlzIHJlc291cmNlIGluLiBMZWFybiBtb3JlOlxuaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vY2xpL2NvbW1hbmRzL3N0YXRlL3JtXG5gKTtcblxuZXhwb3J0IGNvbnN0IHJlc291cmNlR2l2ZW5Ud29Nb3ZlT3BlcmF0aW9uc0J5VGFyZ2V0QW5kSWQgPSAoXG4gIGlkOiBzdHJpbmcsXG4gIGV4aXN0aW5nVGFyZ2V0OiBzdHJpbmcsXG4gIG5ld01vdmU6IHsgdG86IHN0cmluZzsgZnJvbTogc3RyaW5nIH0sXG4pID0+XG4gIG5ldyBFcnJvcihgXG5UaGUgcmVzb3VyY2UgJHtpZH0gaGFzIGJlZW4gZ2l2ZW4gdHdvIGRpZmZlcmVudCBtb3ZlIG9wZXJhdGlvbnMuXG5cbk1vdmUgdGFyZ2V0OiBcIiR7ZXhpc3RpbmdUYXJnZXR9XCJcbk1vdmUgYnkgaWQ6IHtcbiAgZnJvbTogJHtuZXdNb3ZlLmZyb219XG4gIHRvOiAke25ld01vdmUudG99XG59XG5cbk9ubHkgb25lIG1vdmUgb3BlcmF0aW9uIGNhbiBvY2N1ciBwZXIgcGxhbi9hcHBseS4gUmVtb3ZlIG9uZSBvZiB0aGUgb3BlcmF0aW9ucy5cblxuTGVhcm4gbW9yZSBhYm91dCBtb3ZpbmcgcmVzb3VyY2VzOiBodHRwczovL2Nka3RuLmlvL2RvY3MvZXhhbXBsZXMtYW5kLWd1aWRlcy9yZWZhY3RvcmluZyM6fjp0ZXh0PU1vdmluZyUyMCUyNiUyMFJlbmFtaW5nJTIwUmVzb3VyY2VzJTIwV2l0aGluJTIwYSUyMFN0YWNrXG5gKTtcblxuZXhwb3J0IGNvbnN0IHJlc291cmNlR2l2ZW5Ud29Nb3ZlT3BlcmF0aW9uc0J5SWQgPSAoXG4gIGlkOiBzdHJpbmcsXG4gIGV4aXN0aW5nTW92ZTogeyB0bzogc3RyaW5nOyBmcm9tOiBzdHJpbmcgfSxcbiAgbmV3TW92ZTogeyB0bzogc3RyaW5nOyBmcm9tOiBzdHJpbmcgfSxcbikgPT5cbiAgbmV3IEVycm9yKGBcblRoZSByZXNvdXJjZSAke2lkfSBoYXMgYmVlbiBnaXZlbiB0d28gZGlmZmVyZW50IG1vdmUgb3BlcmF0aW9ucy5cblxue1xuICBmcm9tOiAke2V4aXN0aW5nTW92ZS5mcm9tfVxuICB0bzogJHtleGlzdGluZ01vdmUudG99XG59XG57XG4gIGZyb206ICR7bmV3TW92ZS5mcm9tfVxuICB0bzogJHtuZXdNb3ZlLnRvfSAoUmVzb3VyY2UgY2FsbGluZyB0aGUgbW92ZSB0byBvcGVyYXRpb24pXG59XG5cbk9ubHkgb25lIG1vdmUgb3BlcmF0aW9uIGNhbiBvY2N1ciBwZXIgcGxhbi9hcHBseS4gUmVtb3ZlIG9uZSBvZiB0aGUgb3BlcmF0aW9ucy5cblxuTGVhcm4gbW9yZSBhYm91dCBtb3ZpbmcgcmVzb3VyY2VzOiBodHRwczovL2Nka3RuLmlvL2RvY3MvZXhhbXBsZXMtYW5kLWd1aWRlcy9yZWZhY3RvcmluZyM6fjp0ZXh0PU1vdmluZyUyMCUyNiUyMFJlbmFtaW5nJTIwUmVzb3VyY2VzJTIwV2l0aGluJTIwYSUyMFN0YWNrXG5gKTtcblxuZXhwb3J0IGNvbnN0IHJlc291cmNlR2l2ZW5Ud29Nb3ZlT3BlcmF0aW9uc0J5VGFyZ2V0ID0gKFxuICByZXNvdXJjZUlkOiBzdHJpbmcsXG4gIGV4aXN0aW5nTW92ZVRhcmdldDogc3RyaW5nLFxuICBuZXdNb3ZlVGFyZ2V0OiBzdHJpbmcsXG4pID0+XG4gIG5ldyBFcnJvcihgVGhlIHJlc291cmNlICR7cmVzb3VyY2VJZH0gaGFzIGJlZW4gZ2l2ZW4gdHdvIGRpZmZlcmVudCBtb3ZlVGFyZ2V0czogXCIke25ld01vdmVUYXJnZXR9XCIgYW5kIFwiJHtleGlzdGluZ01vdmVUYXJnZXR9XCJcblxuQSByZXNvdXJjZSBjYW4gb25seSBiZSBtb3ZlZCBvbmNlIHBlciBwbGFuL2FwcGx5LlxuXG5MZWFybiBtb3JlIGFib3V0IG1vdmluZyByZXNvdXJjZXM6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9leGFtcGxlcy1hbmQtZ3VpZGVzL3JlZmFjdG9yaW5nIzp+OnRleHQ9TW92aW5nJTIwJTI2JTIwUmVuYW1pbmclMjBSZXNvdXJjZXMlMjBXaXRoaW4lMjBhJTIwU3RhY2tcbmApO1xuXG5leHBvcnQgY29uc3Qgc3RhY2tDb250YWluc0Rpc2FsbG93ZWRDaGFyID0gKFxuICBzdGFja0lkOiBzdHJpbmcsXG4gIGludmFsaWRDaGFyOiBzdHJpbmcsXG4pID0+XG4gIG5ldyBFcnJvcihgQ2Fubm90IGNyZWF0ZSBUZXJyYWZvcm0gc3RhY2sgd2l0aCBpZCBcIiR7c3RhY2tJZH1cIi4gSXQgY29udGFpbnMgYW4gaW52YWxpZCBnbG9iIGNoYXJhY3RlcjogXCIke2ludmFsaWRDaGFyfVwiLlxuXG5HbG9iIGNoYXJhY3RlcnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gc3RhY2sgbmFtZXMgYmVjYXVzZSB3ZSB1c2UgdGhlbSB0byBkZXBsb3kgYW5kIGRlc3Ryb3kgbXVsdGlwbGUgc3RhY2tzLiBGb3IgZXhhbXBsZSwgJ2Nka3RuIGRlcGxveSBcXGAqLXByb2R1Y3Rpb25cXGAnIGRlcGxveXMgYWxsIHN0YWNrcyB3aXRoIG5hbWVzIHRoYXQgZW5kIGluICctcHJvZHVjdGlvbicuXG5gKTtcblxuZXhwb3J0IGNvbnN0IHN0YWNrSWRDb250YWluc1doaXRlc3BhY2UgPSAoc3RhY2tJZDogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoYENhbm5vdCBjcmVhdGUgVGVycmFmb3JtU3RhY2sgd2l0aCBpZCBcIiR7c3RhY2tJZH1cIi4gSXQgY29udGFpbnMgYSB3aGl0ZXNwYWNlIGNoYXJhY3Rlci5cblxuUGxlYXNlIHJlbW92ZSBhbnkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGluIHlvdXIgVGVycmFmb3JtU3RhY2sgaWQsIGxpa2Ugc286IFwiJHtzdGFja0lkLnJlcGxhY2UoXG4gICAgL1xccy9nLFxuICAgIFwiXCIsXG4gICl9XCJcbmApO1xuXG5leHBvcnQgY29uc3Qgbm9TdGFja0ZvckNvbnN0cnVjdCA9IChjb25zdHJ1Y3RQYXRoOiBzdHJpbmcsIGhpbnQ6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKGBObyBzdGFjayBjb3VsZCBiZSBpZGVudGlmaWVkIGZvciB0aGUgY29uc3RydWN0IGF0IHBhdGggJyR7Y29uc3RydWN0UGF0aH0nJHtoaW50fVxuXG5Zb3UgY2FuIG9ubHkgdXNlIGNvbnN0cnVjdHMgYXMgcGFydCBvZiBhIFRlcnJhZm9ybVN0YWNrLlxuXG5UbyBsZWFybiBtb3JlIGFib3V0IENvbnN0cnVjdHMgdnMuIFRlcnJhZm9ybVN0YWNrcywgcmVmZXIgdG86IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9jb25zdHJ1Y3RzIzp+OnRleHQ9Q29uc3RydWN0cyUyMHZzLiUyMFN0YWNrc1xuYCk7XG5cbmV4cG9ydCBjb25zdCBzdGFja0hhc0NpcmN1bGFyRGVwZW5kZW5jeSA9IChcbiAgdGhpc1N0YWNrOiBUZXJyYWZvcm1TdGFjayxcbiAgZGVwZW5kZW5jeTogVGVycmFmb3JtU3RhY2ssXG4pID0+XG4gIG5ldyBFcnJvcihgQ2Fubm90IGFkZCBkZXBlbmRlbmN5ICR7ZGVwZW5kZW5jeX0gdG8gJHt0aGlzU3RhY2t9LCBiZWNhdXNlIGl0IHdvdWxkIGNhdXNlIGEgY2lyY3VsYXIgZGVwZW5kZW5jeS5cblxuVGVycmFmb3JtU3RhY2sgJHtkZXBlbmRlbmN5fSBpcyBhbHJlYWR5IGRlcGVuZGVudCBvbiAke3RoaXNTdGFja30gZGlyZWN0bHksIG9yIGRlcGVuZGVudCBvbiBhIFRlcnJhZm9ybVN0YWNrIHdpdGhpbiAke3RoaXNTdGFja30uXG5cblRvIGxlYXJuIG1vcmUgYWJvdXQgY2lyY3VsYXIgZGVwZW5kZW5jeSByZWZlcmVuY2VzLCByZWZlciB0bzogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3N0YWNrcyM6fjp0ZXh0PUNyb3NzJTJEU3RhY2slMjBSZWZlcmVuY2VzXG5gKTtcblxuZXhwb3J0IGNvbnN0IHN0YWNrVmFsaWRhdGlvbkZhaWx1cmUgPSAoZXJyb3JMaXN0OiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihgVmFsaWRhdGlvbiBmYWlsZWQgd2l0aCB0aGUgZm9sbG93aW5nIGVycm9yczpcXG4gICR7ZXJyb3JMaXN0fVxuXG5JZiB5b3Ugd2lzaCB0byBpZ25vcmUgdGhlc2UgdmFsaWRhdGlvbnMsIHBhc3MgJ3NraXBWYWxpZGF0aW9uOiB0cnVlJyB0byB5b3VyIEFwcCBjb25maWd1cmF0aW9uLlxuYCk7XG5cbmV4cG9ydCBjb25zdCBtYXRjaGVyc1BhdGhJc05vdERpcmVjdG9yeSA9IChmdW5jdGlvbk5hbWU6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKGBQYXRoIGlzIG5vdCBhIGRpcmVjdG9yeS5cblxuRW5zdXJlIHlvdSBhcmUgcGFzc2luZyB0aGUgcmVzdWx0IG9mIFRlc3RpbmcuZnVsbFN5bnRoKCdzdGFjayBpbnN0YW5jZScpIHRvICcke2Z1bmN0aW9uTmFtZX0nLCBub3QgVGVzdGluZy5zeW50aCgnc3RhY2sgaW5zdGFuY2UnKS5cblxuVGVzdGluZy5mdWxsU3ludGggcmV0dXJucyBhIGZpbGUgcGF0aCB0byBhIHRlbXBvcmFyeSB0ZXN0aW5nIGVudmlyb25tZW50LiBUZXN0aW5nLnN5bnRoIHJldHVybnMgdGhlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgeW91ciBzdGFjay5cblxuVG8gbGVhcm4gbW9yZSBhYm91dCB0ZXN0aW5nIGluIENES1ROLCByZWZlciB0bzogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL3Rlc3QvdW5pdC10ZXN0c2ApO1xuXG5leHBvcnQgY29uc3QgbWF0Y2hlcnNGb3VuZEVycm9yc0luU3RhY2sgPSAoXG4gIGVycm9yQ291bnQ6IGFueSxcbiAgc3RhY2tOYW1lOiBzdHJpbmcsXG4gIGRpYWdub3N0aWNzOiBzdHJpbmcsXG4pID0+XG4gIG5ldyBFcnJvcihgRm91bmQgJHtlcnJvckNvdW50fSBFcnJvcnMgaW4gc3RhY2sgJHtzdGFja05hbWV9OiAke2RpYWdub3N0aWNzfVxuXG5UaGVzZSBlcnJvcnMgYXJlIG5vdCB0ZXN0IGZhaWx1cmVzLCBidXQgaXNzdWVzIHdpdGggdGhlIHVuZGVybHlpbmcgVGVycmFmb3JtU3RhY2sgYmVpbmcgdGVzdGVkLiBGaXggdGhlIGFib3ZlIGlzc3VlcyBiZWZvcmUgcnVubmluZyB5b3VyIHRlc3RzIGFnYWluLlxuYCk7XG5cbmV4cG9ydCBjb25zdCBqZXN0Tm90SW5zdGFudGlhdGVkID0gKCkgPT5cbiAgbmV3IEVycm9yKGBKZXN0IHdhcyBub3QgcHJvcGVybHkgaW5zdGFudGlhdGVkLlxuXG5FbnN1cmUgeW91IGhhdmUgYSAnc2V0dXAuanMnIGZpbGUgaW4geW91ciBwcm9qZWN0J3MgZGlyZWN0b3J5IHRoYXQgY2FsbHMgJ2Nka3RuLlRlc3Rpbmcuc2V0dXBKZXN0KCknLlxuXG5UbyBsZWFybiBtb3JlIGFib3V0IHNldHRpbmcgdXAgdGVzdGluZywgcmVmZXIgdG86IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy90ZXN0L3VuaXQtdGVzdHMjOn46dGV4dD1BZGQlMjBUZXN0aW5nJTIwdG8lMjBZb3VyJTIwQXBwbGljYXRpb25cbmApO1xuXG5leHBvcnQgY29uc3QgZXhwZWN0Tm90R2xvYmFsbHlBY2Nlc3NpYmxlID0gKCkgPT5cbiAgbmV3IEVycm9yKGBUaGUgZXhwZWN0IGZ1bmN0aW9uIGlzIG5vdCBnbG9iYWxseSBhY2Nlc3NpYmxlLlxuXG5UbyBsZWFybiBtb3JlIGFib3V0IHNldHRpbmcgdXAgdGVzdGluZywgcmVmZXIgdG86IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy90ZXN0L3VuaXQtdGVzdHMjOn46dGV4dD1BZGQlMjBUZXN0aW5nJTIwdG8lMjBZb3VyJTIwQXBwbGljYXRpb25cbmApO1xuXG5leHBvcnQgY29uc3QgaW52YWxpZFN0YWNrID0gKGZ1bmN0aW9uTmFtZTogc3RyaW5nLCBzdGFja0NvbnRlbnQ6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKGBJbnZhbGlkIEpTT04gc3RyaW5nIHBhc3NlZDogJHtzdGFja0NvbnRlbnR9XG5cblxuRW5zdXJlIHlvdSBhcmUgcGFzc2luZyB0aGUgcmVzdWx0IG9mIFRlc3Rpbmcuc3ludGgoJ3N0YWNrIGluc3RhbmNlJykgdG8gJyR7ZnVuY3Rpb25OYW1lfScsIG5vdCBUZXN0aW5nLmZ1bGxTeW50aCgnc3RhY2sgaW5zdGFuY2UnKS5cblxuXG5UZXN0aW5nLnN5bnRoIHJldHVybnMgdGhlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgeW91ciBzdGFjay4gQ0RLVE4gY2FuIHVzZSBhc3NlcnRpb25zIHdpdGggdGhpcyBKU09OIHRvIGNoZWNrIHRoZSBjb21wb3NpdGlvbiBvZiB5b3VyIHN0YWNrcywgbGlrZSBzbzogXCJUZXN0aW5nLnRvSGF2ZVJlc291cmNlKFRlc3Rpbmcuc3ludGgoJ1RlcnJhZm9ybVN0YWNrIGluc3RhbmNlJyksIFMzQnVja2V0KVwiXG5cblRlc3RpbmcuZnVsbFN5bnRoIHJldHVybnMgYSBmaWxlIHBhdGggdG8gYSB0ZW1wb3JhcnkgdGVzdGluZyBlbnZpcm9ubWVudC5cblxuVG8gbGVhcm4gbW9yZSBhYm91dCB0ZXN0aW5nIGluIENES1ROLCByZWZlciB0bzogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL3Rlc3QvdW5pdC10ZXN0c1xuYCk7XG5cbmV4cG9ydCBjb25zdCB0YXJnZXROb3RSZXNvbHZhYmxlV2l0aE92ZXJyaWRlcyA9ICh0YXJnZXQ6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKGBUYXJnZXQgKCR7dGFyZ2V0fSkgY2Fubm90IGJlIGEgcmVzb2x2YWJsZSB0b2tlbiBpZiB5b3Ugc3BlY2lmaWVkIG92ZXJyaWRlcy4gUmVwbGFjZSB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIHlvdSBhcmUgb3ZlcnJpZGluZyB3aXRoIGEgc3RhdGljIHZhbHVlLlxuXG5UbyBsZWFybiBtb3JlIGFib3V0IFRva2VucywgcmVmZXIgdG86IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy90b2tlbnNcbmApO1xuXG5leHBvcnQgY29uc3Qgc291cmNlT3JUYXJnZXROb3RBbk9iamVjdCA9IChcbiAgc291cmNlOiBzdHJpbmcsXG4gIHNvdXJjZVR5cGU6IHN0cmluZyxcbiAgdGFyZ2V0OiBzdHJpbmcsXG4gIHRhcmdldFR5cGU6IHN0cmluZyxcbikgPT5cbiAgbmV3IEVycm9yKGBBbiBpc3N1ZSBvY2N1cnJlZCBkdXJpbmcgdGhlIHN5bnRoZXNpemF0aW9uIG9mIHlvdXIgVGVycmFmb3JtIGNvbmZpZ3VyYXRpb24uXG5cbkJvdGggdGhlIHNvdXJjZSBlbGVtZW50ICgke3NvdXJjZX0pIGFuZCBpdHMgY29udGFpbmluZyB0YXJnZXQgZWxlbWVudCAoJHt0YXJnZXR9KSBtdXN0IGJlIG9iamVjdHMuXG5cblR5cGUgb2Ygc291cmNlOiAke3NvdXJjZVR5cGV9XG5UeXBlIG9mIHRhcmdldDogJHt0YXJnZXRUeXBlfVxuYCk7XG5cbmV4cG9ydCBjb25zdCBjb25zdHJ1Y3REZXBlbmRlbmN5QmVsb3dWMTAgPSAoKSA9PlxuICBuZXcgRXJyb3IoYFZlcnNpb24gbWlzbWF0Y2ghIENES1ROIHZlcnNpb24gMC42IHJlcXVpcmVzIHlvdXIgY29uc3RydWN0cyB2ZXJzaW9uIHRvIGJlIHYxMCBvciBhYm92ZS5cblxuVXBkYXRlIHlvdXIgY29uc3RydWN0cyBkZXBlbmRlbmN5OiBodHRwczovL2Nka3RuLmlvL2RvY3MvcmVsZWFzZS91cGdyYWRlLWd1aWRlLXYwLTZcbmApO1xuXG5leHBvcnQgY29uc3QgY2xvdWRCYWNrZW5kV29ya3NwYWNlSXNOb3REZWZpbmVkQnlOYW1lID0gKCkgPT5cbiAgbmV3IEVycm9yKGBUaGUgQ2xvdWQgYmFja2VuZCBvbmx5IHN1cHBvcnRzIGNyb3NzLXN0YWNrIHJlZmVyZW5jZXMgaWYgdGhlIHdvcmtzcGFjZSBpcyBkZWZpbmVkIGJ5IG5hbWUgKG5vdCBieSB0YWdzKS5cblxuVG8gdXNlIGNyb3NzLXN0YWNrIHJlZmVyZW5jZXMsIHJlcGxhY2UgYWxsIG1lbnRpb25zIG9mICdUYWdnZWRDbG91ZFdvcmtzcGFjZXMnIHdpdGggJ05hbWVkQ2xvdWRXb3Jrc3BhY2UnLCBsaWtlIHNvOlxuXG5uZXcgQ2xvdWRCYWNrZW5kKHN0YWNrLCB7XG4gIC4uLlxuICB3b3Jrc3BhY2VzOiBuZXcgTmFtZWRDbG91ZFdvcmtzcGFjZShcIm15LWFwcFwiKSxcbn0pO1xuXG5UbyBsZWFybiBtb3JlIGFib3V0IFJlbW90ZSBCYWNrZW5kcywgcmVmZXIgdG86IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9yZW1vdGUtYmFja2VuZHNcbmApO1xuXG5leHBvcnQgY29uc3QgdmFsdWVDb250YWluc1VuZXNjYXBlZFF1b3RlcyA9ICh2YWx1ZTogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYFlvdXIgdmFsdWUsICcke3ZhbHVlfScsIGhhcyB1bmVzY2FwZWQgZG91YmxlIHF1b3RlcyBpbiBpdCwgc28gaXQgY2Fubm90IGJlIHVzZWQgYXMgYSB2YWx1ZS5cblxuVG8gc2FmZWx5IHVzZSB0aGUgdmFsdWUsIHVzZSBGbi5yYXdTdHJpbmcgb24geW91ciBzdHJpbmcsIGxpa2Ugc286XG5cbkZuLnJhd1N0cmluZygnJHt2YWx1ZX0nKVxuXG5Eb2luZyB0aGlzIGVuc3VyZXMgQ0RLVE4gYW5kIFRlcnJhZm9ybSBpbnRlcnByZXQgeW91ciB2YWx1ZXMgY29ycmVjdGx5LlxuXG5UbyBsZWFybiBtb3JlIGFib3V0IGJ1aWx0IGluIFRlcnJhZm9ybSBmdW5jdGlvbnMgd2l0aGluIENES1ROLCByZWZlciB0bzogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL2Z1bmN0aW9uc1xuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGVuY291bnRlcmVkQW5ub3RhdGlvbldpdGhMZXZlbEVycm9yID0gKGVycm9yczogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoYEVuY291bnRlcmVkIEFubm90YXRpb25zIHdpdGggbGV2ZWwgXCJFUlJPUlwiOlxcbiR7ZXJyb3JzfVxuXG5FaXRoZXIgZml4IHRoZSBpc3N1ZXMgYWJvdmUsIG9yIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQ0RLVEZfQ09OVElOVUVfU1lOVEhfT05fRVJST1JfQU5OT1RBVElPTlMgdG8gaWdub3JlIHRoZXNlIGFubm90YXRpb25zLlxuYCk7XG5cbmV4cG9ydCBjb25zdCB2YWx1ZUlzSW52YWxpZFN0cmluZ09yVG9rZW4gPSAodmFsdWU6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKFxuICAgIGAnJHt2YWx1ZX0nIGlzIG5vdCBhIHZhbGlkIHN0cmluZyBub3IgYSB0b2tlbi4gVGhpcyBmdW5jdGlvbiBvbmx5IGFjY2VwdHMgc3RyaW5ncyBvciB0b2tlbnMgcmVzb2x2aW5nIHRvIHN0cmluZ3MuIFBsZWFzZSBjaGFuZ2UgeW91ciBjb2RlIGFjY29yZGluZ2x5LmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCB2YWx1ZUlzSW52YWxpZE51bWJlck9yVG9rZW4gPSAodmFsdWU6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKFxuICAgIGAke3ZhbHVlfSBpcyBub3QgYSB2YWxpZCBudW1iZXIgbm9yIGEgdG9rZW4uIFRoaXMgZnVuY3Rpb24gb25seSBhY2NlcHRzIG51bWJlcnMgb3IgdG9rZW5zIHJlc29sdmluZyB0byBudW1iZXJzLiBQbGVhc2UgY2hhbmdlIHlvdXIgY29kZSBhY2NvcmRpbmdseS5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgbGlzdEVsZW1lbnRJc09mV3JvbmdUeXBlID0gKFxuICB2YWx1ZTogYW55W10sXG4gIHBvc2l0aW9uOiBudW1iZXIsXG4gIGVycm9yOiB1bmtub3duLFxuKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYEVsZW1lbnQgaW4gbGlzdCAke3ZhbHVlfSBhdCBwb3NpdGlvbiAke3Bvc2l0aW9ufSBpcyBub3QgdGhlIHJpZ2h0IHR5cGU6ICR7ZXJyb3J9LlxuICAgIFBsZWFzZSBlbnN1cmUgYWxsIGVsZW1lbnRzIGluIHRoZSBsaXN0IGFyZSB0aGUgY29ycmVjdCB0eXBlIGZvciB0aGlzIGZ1bmN0aW9uLmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBmdW5jdGlvblJlY2VpdmVkV3JvbmdOdW1iZXJPZkFyZ3MgPSAoXG4gIG5hbWU6IHN0cmluZyxcbiAgYXJnVmFsaWRhdG9yc0xlbmd0aDogbnVtYmVyLFxuICBhcmdzTGVuZ3RoOiBudW1iZXIsXG4pID0+XG4gIG5ldyBFcnJvcihcbiAgICBgRnVuY3Rpb24gJHtuYW1lfSB0YWtlcyAke2FyZ1ZhbGlkYXRvcnNMZW5ndGh9IGFyZ3VtZW50cywgYnV0ICR7YXJnc0xlbmd0aH0gd2VyZSBwcm92aWRlZC4gUGxlYXNlIGFkZCB0aGUgbWlzc2luZyBhcmd1bWVudHMgdG8gdGhlIGZ1bmN0aW9uLmAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCBmdW5jdGlvbkFyZ3VtZW50VmFsaWRhdGlvbkZhaWx1cmUgPSAoXG4gIGFyZ051bWJlcjogbnVtYmVyLFxuICBuYW1lOiBzdHJpbmcsXG4gIGVycm9yOiB1bmtub3duLFxuKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYEFyZ3VtZW50ICR7YXJnTnVtYmVyfSBvZiAke25hbWV9IGZhaWxlZCB0aGUgdmFsaWRhdGlvbjogJHtlcnJvcn0uIFBsZWFzZSBjaGFuZ2UgeW91ciBjb2RlIHRvIHBhc3MgYSB2YWxpZCB2YWx1ZSBmb3IgdGhpcyBhcmd1bWVudC5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgY2Fubm90Q2FsY0lkRm9yRW1wdHlTZXRPZkNvbXBvbmVudHMgPSAoKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYFVuYWJsZSB0byBjYWxjdWxhdGUgYSB1bmlxdWUgaWQgZm9yIGFuIGVtcHR5IHNldCBvZiBjb21wb25lbnRzLlxuXG4gICAgVGhpcyBoYXBwZW5zIHdoZW4geW91IGF0dGVtcHQgdG8gY3JlYXRlIGEgdW5pcXVlIGlkLCBidXQgZG8gbm90IHBhc3MgaW4gYW55IGNvbnN0cnVjdCBub2RlIGlkcy4gVGhpcyBtZWFucyB5b3VyIGNvbnN0cnVjdCBsaWtlbHkgaGFzIG5vIHBhcmVudCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuXG5cbiAgICBQbGVhc2UgbWFrZSBzdXJlIHlvdXIgY29uc3RydWN0IGhhcyBhIHBhcmVudC4gRm9yIGV4YW1wbGU6ICduZXcgQXBwKHRoaXMpJyBvciAnbmV3IFRlcnJhZm9ybVN0YWNrKHRoaXMsICdzdGFjaycpJy5gLFxuICApO1xuXG5leHBvcnQgY29uc3Qgc3RyaW5nVmFsdWVBZGRlZFRvUmVmZXJlbmNlTGlzdCA9IChsaXN0VG9rZW46IHN0cmluZ1tdKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYENhbm5vdCBhZGQgZWxlbWVudHMgdG8gbGlzdCB0b2tlbiwgZ290OiAke2xpc3RUb2tlbn0uXG5cbiAgICBXZSBleHBlY3QgdGhlIGVsZW1lbnRzIG9mIGEgdG9rZW5pemVkIHN0cmluZyBhcnJheSB0byBiZSBhIHNpbmdsZSB0b2tlbiBzdHJpbmcuIEZvciBleGFtcGxlLCBbXCIme1RmVG9rZW5bVG9rZW4uMV19XCJdLlxuXG4gICAgT25lIGVsZW1lbnQgaW4geW91ciBhcnJheSBjb25zaXN0cyBvZiBtb3JlIHRoYW4gYSBzaW5nbGUgdmFsdWUuIFRvIGFkZCB2YWx1ZXMgdG8gYSB0b2tlbml6ZWQgbGlzdCwgdXNlIFRlcnJhZm9ybSBmdW5jdGlvbnMgaW5zdGVhZC4gRm9yIGV4YW1wbGU6ICdGbi5jb25jYXQoW3lvdXJSZWZlcmVuY2VkTGlzdCwgW1wibXlcIiwgXCJuZXdcIiwgXCJpdGVtc1wiXV0pJy5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgY2Fubm90Q29uY2F0ZW5hdGVTdHJpbmdzSW5Ub2tlbml6ZWRTdHJpbmdBcnJheSA9IChcbiAgbGlzdFRva2VuOiBzdHJpbmcsXG4pID0+XG4gIG5ldyBFcnJvcihcbiAgICBgQ2Fubm90IGNvbmNhdGVuYXRlIHN0cmluZ3MgaW4gYSB0b2tlbml6ZWQgc3RyaW5nIGFycmF5LCBnb3Q6ICR7bGlzdFRva2VufS5cblxuICAgIFdlIGV4cGVjdCB0aGUgZWxlbWVudHMgb2YgYSB0b2tlbml6ZWQgc3RyaW5nIGFycmF5IHRvIGJlIGEgc2luZ2xlIHRva2VuIHN0cmluZy4gRm9yIGV4YW1wbGUsIFtcIiZ7VGZUb2tlbltUb2tlbi4xXX1cIl0uIE9uZSBlbGVtZW50IGluIHlvdXIgYXJyYXkgY29uc2lzdHMgb2Ygc29tZXRoaW5nIG90aGVyIHRoYW4gYSBzaW5nbGUgdG9rZW4uXG5cbiAgICBZb3UgYXJlIGxpa2VseSBtdXRhdGluZyB0aGUgdmFsdWUgaW5zaWRlIHlvdXIgYXJyYXksIHdoaWNoIENES1ROIGNhbm5vdCByZXNvbHZlIGludG8gdGhlIGFwcHJvcHJpYXRlIHJ1bnRpbWUgdmFsdWUuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IG51bWJlclZhbHVlQWRkZWRUb1JlZmVyZW5jZUxpc3QgPSAobGlzdFRva2VuOiBudW1iZXJbXSkgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBDYW5ub3QgYWRkIGVsZW1lbnRzIHRvIGxpc3QgdG9rZW4sIGdvdDogJHtsaXN0VG9rZW59LlxuXG4gICAgV2UgdXNlIHRva2VucyB0byByZXByZXNlbnQgcnVudGltZSB2YWx1ZXMgKGUuZy4sIHJlZmVyZW5jZXMgdG8gYXR0cmlidXRlcyBvZiByZXNvdXJjZSBvciBkYXRhIHNvdXJjZXMpLiBMaXN0IHRva2VucyBkb24ndCBjb250YWluIHRoZSBhY3R1YWwgdmFsdWVzIGJlY2F1c2UgdGhvc2UgYXJlIG9ubHkgYXZhaWxhYmxlIGF0IGFwcGx5IHRpbWUsIHdoZXJlYXMgdG9rZW5zIGFyZSBwcmVzZW50IGR1cmluZyBjb21waWxlIHRpbWUuXG5cbiAgICBJZiB5b3Ugd2FudCB0byBhZGQgYSB2YWx1ZSB0byBhIHRva2VuaXplZCBsaXN0LCB1c2UgYSBUZXJyYWZvcm0gZnVuY3Rpb24gaW5zdGVhZC4gRm9yIGV4YW1wbGU6IEZuLmNvbmNhdChbeW91clJlZmVyZW5jZWRMaXN0LCBbNDIsIDQzLCA0NF1dKS5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgbWFwVmFsdWVBZGRlZFRvUmVmZXJlbmNlTGlzdCA9IChtYXBUb2tlbjogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYENhbm5vdCBhZGQgZWxlbWVudHMgdG8gbWFwIHRva2VuLCBnb3Q6ICR7bWFwVG9rZW59LiBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IG1lcmdlIG11bHRpcGxlIG1hcHMsIG9yIGlmIHlvdSBhZGQgYSBuZXcga2V5IHZhbHVlIHBhaXIgdG8gdGhlIG1hcCB0b2tlbi5cblxuICAgIFdlIHVzZSB0b2tlbnMgdG8gcmVwcmVzZW50IHJ1bnRpbWUgdmFsdWVzIChlLmcuLCByZWZlcmVuY2VzIHRvIGF0dHJpYnV0ZXMgb2YgcmVzb3VyY2Ugb3IgZGF0YSBzb3VyY2VzKS4gTGlzdCB0b2tlbnMgZG9uJ3QgY29udGFpbiB0aGUgYWN0dWFsIHZhbHVlcyBiZWNhdXNlIHRob3NlIGFyZSBvbmx5IGF2YWlsYWJsZSBhdCBhcHBseSB0aW1lLCB3aGVyZWFzIHRva2VucyBhcmUgcHJlc2VudCBkdXJpbmcgY29tcGlsZSB0aW1lLlxuXG4gICAgSW5zdGVhZCBvZiBhZGRpbmcgdGhlIHZhbHVlIHRvIHRoZSB0b2tlbml6ZWQgbWFwLCB1c2UgYSBUZXJyYWZvcm0gZnVuY3Rpb24uIEZvciBleGFtcGxlOiBGbi5tZXJnZShbeW91clJlZmVyZW5jZWRNYXAsIHsgeW91cjogJ3ZhbHVlJyB9XSkuIFRoaXMgY3JlYXRlcyBhIG5ldyBtYXAgVG9rZW4gZm9yIGEgdmFsdWUsIHdoaWNoIGNvdWxkIGdldCByZW5kZXJlZCBhczpcbiAgICBtZXJnZShteV9yZXNvdXJjZS5yZXNvdXJjZV9uYW1lLm9uZV9zcGVjaWZpY19tYXBfYXR0cmlidXRlLCB7IHlvdXI6ICcgdmFsdWUnIH0pYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGNhbm5vdENvbmNhdGVuYXRlU3RyaW5nc0luVG9rZW5pemVkTWFwID0gKHRva2VuaXplZE1hcDogYW55KSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYENhbm5vdCBjb25jYXRlbmF0ZSBzdHJpbmdzIGluIGEgdG9rZW5pemVkIG1hcCwgZ290OiAke3Rva2VuaXplZE1hcH0uXG5cbiAgICBXZSBleHBlY3QgdGhlIGVsZW1lbnRzIG9mIGEgdG9rZW5pemVkIHN0cmluZyBhcnJheSB0byBiZSBhIHNpbmdsZSB0b2tlbiBzdHJpbmcuIEZvciBleGFtcGxlLCBbXCIme1RmVG9rZW5bVG9rZW4uMV19XCJdLiBBIGtleSBpbiB5b3VyIG1hcCBjb25zaXN0cyBvZiBtb3JlIHRoYW4gYSBzdHJpbmcgdG9rZW4gKGUuZy4sIHRoZSBUb2tlbiBhbmQgYSBzdGF0aWMgc3RyaW5nIG9yIG11bHRpcGxlIFRva2VucykuXG5cbiAgICBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IG11dGF0ZSB0aGUga2V5IG9mIHRoZSBtYXAuIERvIG5vdCBtdXRhdGUgdG9rZW5pemVkIE1hcHMsIGJlY2F1c2UgaXQgbWFrZXMgaXQgaW1wb3NzaWJsZSBmb3IgQ0RLVE4gdG8gdHJhbnNsYXRlIHRoZW0uYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGRvZXNOb3RJbXBsZW1lbnREZXBlbmRhYmxlVHJhaXQgPSAoaW5zdGFuY2U6IElEZXBlbmRhYmxlKSA9PlxuICBuZXcgRXJyb3IoYCR7aW5zdGFuY2V9IGRvZXMgbm90IGltcGxlbWVudCBEZXBlbmRhYmxlVHJhaXRgKTtcblxuZXhwb3J0IGNvbnN0IGNhbk9ubHlFbmNvZGVQb3NpdGl2ZUludGVnZXJzID0gKCkgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBDYW4gb25seSBlbmNvZGUgcG9zaXRpdmUgaW50ZWdlcnMgaW50byBUb2tlbnMuIFRoaXMgaXMgYSBidWcgaW4gQ0RLVE4sIHBsZWFzZSBmaWxlIGEgYnVnIHJlcG9ydC5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgaW5kZXhUb29MYXJnZVRvRW5jb2RlID0gKGluZGV4OiBudW1iZXIpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgUmVjZWl2ZWQgYW4gaW5kZXggdG9vIGxhcmdlIHRvIGVuY29kZSBpbnRvIGEgVG9rZW4gOiR7aW5kZXh9LlxuXG4gICAgVGhpcyBoYXBwZW5zIGlmIHlvdSBoYXZlIHRvbyBtYW55IFRva2VucyBpbiBhIHNpbmdsZSBDREtUTiBhcHBsaWNhdGlvbi4gVGhpcyBjYW4gYWxzbyBvY2N1ciBpZiB5b3UgYXJlIGFjY2lkZW50YWxseSBjcmVhdGluZyBudW1lcmljIHRva2VucyBpbiBhbiBpbmZpbml0ZSBsb29wLiBGb3IgZXhhbXBsZSwgY2FsbGluZyAnVG9rZW4uYXNOdW1iZXIoKScgdG9vIG1hbnkgdGltZXMuXG5cbiAgICBJZiB5b3UgcmVhY2ggdGhlIG1heGltdW0gbnVtYmVyIG9mIGFsbG93ZWQgVG9rZW5zIChhIGxpbWl0YXRpb24gaW1wb3NlZCBieSB0aGUgd2F5IHdlIGVuY29kZSBUb2tlbnMgYW5kIHNlcGFyYXRlIHRoZW0gZnJvbSByZWFsIG51bWVyaWMgdmFsdWVzKSB5b3UgY2FuIHdvcmsgYXJvdW5kIHRoaXMgaXNzdWUgYnkgZGl2aWRpbmcgYSBzaW5nbGUgYXBwbGljYXRpb24gaW50byBtdWx0aXBsZSBhcHBsaWNhdGlvbnMuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGFyZ1RvSW50cmluc2ljTXVzdEJlUGxhaW5WYWx1ZSA9IChcbiAgdmFsdWU6IGFueSxcbiAgY3JlYXRpb25TdGFjazogc3RyaW5nW10gfCB1bmRlZmluZWQsXG4pID0+IHtcbiAgY29uc3QgY3JlYXRlZEF0ID0gY3JlYXRpb25TdGFjaz8ubGVuZ3RoXG4gICAgPyBgIGNyZWF0ZWQgYXQ6XFxuJHtjcmVhdGlvblN0YWNrLmpvaW4oXCJcXG5cIil9YFxuICAgIDogXCJcIjtcbiAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICBgWW91IGNhbiBvbmx5IHVzZSBhIHBsYWluIHZhbHVlIChub3QgYSBmdW5jdGlvbikgd2hpbGUgY3JlYXRpbmcgYW4gSW50cmluc2ljIHRva2VuLiBXZSByZWNlaXZlZCB0aGUgdmFsdWUgJyR7dmFsdWV9JyR7Y3JlYXRlZEF0fS4gSWYgeW91IHdhbnQgdG8gdXNlIGEgZnVuY3Rpb24sIHBsZWFzZSB1c2UgdGhlIExhenkgY2xhc3MuIEZvciBleGFtcGxlOiAgTGF6eS5hbnlWYWx1ZSh7IHByb2R1Y2U6ICgpID0+IFwiSGVsbG8gV29ybGRcIiB9KS5gLFxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IHVuYWJsZVRvUmVzb2x2ZUNpcmN1bGFyUmVmZXJlbmNlID0gKHBhdGhOYW1lOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihgVW5hYmxlIHRvIHJlc29sdmUgb2JqZWN0IHRyZWUgd2l0aCBjaXJjdWxhciByZWZlcmVuY2UgYXQgJyR7cGF0aE5hbWV9Jy5cblxuVGhlIGRlcHRoIG9mIHlvdXIgb2JqZWN0IHRyZWUgaXMgb3ZlciAyMDAsIGluZGljYXRpbmcgeW91IHByb2JhYmx5IGhhdmUgYSBjeWNsaWNhbCByZWZlcmVuY2UuIEluc3BlY3QgdGhlIGNvbnN0cnVjdCBjcmVhdGluZyB0aGlzIGN5Y2xpYyByZWZlcmVuY2UgKG1vc3QgbGlrZWx5IGluICcke3BhdGhOYW1lfScpIGFuZCBlbnN1cmUgaXQgZG9lcyBub3QgaW5maW5pdGVseSBuZXN0IGNvbnN0cnVjdHMuYCk7XG5cbmV4cG9ydCBjb25zdCBjYW5ub3RSZXNvbHZlRnVuY3Rpb24gPSAocGF0aE5hbWU6IHN0cmluZywgb2JqOiBhbnkpID0+XG4gIG5ldyBFcnJvcihgVHJ5aW5nIHRvIHJlc29sdmUgYSBub24tZGF0YSBvYmplY3QgKGUuZy4sIGEgZnVuY3Rpb24pIGF0ICcke3BhdGhOYW1lfSc6ICR7b2JqfS4gT25seSB0b2tlbnMgYXJlIHN1cHBvcnRlZCBmb3IgbGF6eSBldmFsdWF0aW9uLlxuXG5JZiB5b3Ugd2FudCB0byB1c2UgYSBsYXppbHkgY29tcHV0ZWQgdmFsdWUsIHVzZSB0aGUgTGF6eSBjbGFzcy4gRm9yIGV4YW1wbGU6ICBMYXp5LnN0cmluZ1ZhbHVlKHsgcHJvZHVjZTogKCkgPT4gXCJIZWxsbyBXb3JsZFwiIH0pYCk7XG5cbmNvbnN0IExJU1RfRVJST1JfRVhQTEFOQVRJT04gPSBgSW4gQ0RLVE4sIHdlIHJlcHJlc2VudCBsaXN0cywgd2l0aCB2YWx1ZXMgdW5rbm93biB1bnRpbCBhZnRlciBydW50aW1lLCBhcyBhcnJheXMgd2l0aCBhIHNpbmdsZSBlbGVtZW504oCUIGEgc3RyaW5nIHRva2VuIChbXCJUb2tlbi4xXCJdKS5cblxuXG5XZSBkbyB0aGlzIGJlY2F1c2UgQ0RLVE4gZG9lcyBub3Qga25vdyB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IGF0IGNvbXBpbGUgdGltZSwgbWVhbmluZyBDREtUTiBoYXMgeWV0IHRvIGludm9rZSBUZXJyYWZvcm0gdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgY2xvdWQgcHJvdmlkZXIuIENES1ROIGxhdGVyIGludm9rZXMgVGVycmFmb3JtIG9uIHRoZSBzeW50aGVzaXplZCBzdGF0aWMgSlNPTiBmaWxlLlxuXG5CZWNhdXNlIHdlIGRvbid0IGtub3cgdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCwgd2UgY2FuIG5vdCBkaWZmZXJlbnRpYXRlIGlmIHRoZSBsaXN0IHdhcyBhY2Nlc3NlZCBhdCB0aGUgZmlyc3Qgb3IgbGFzdCBpbmRleCwgb3IgYXMgcGFydCBvZiBhIGxvb3AuIFRvIGF2b2lkIHRoaXMgYW1iaWd1aXR5OlxuXG4tIElmIHlvdSB3YW50IHRvIGFjY2VzcyBhIHNpbmd1bGFyIGl0ZW0sIHVzZSAnRm4uZWxlbWVudChsaXN0LCAwKScuIERvIG5vdCB1c2UgJ2xpc3RbMF0nLlxuLSBJZiB5b3Ugd2FudCB0byBsb29wIG92ZXIgdGhlIGxpc3QgdXNlICdUZXJyYWZvcm1JdGVyYXRvci5mcm9tTGlzdChsaXN0KScuIERvIG5vdCB1c2UgYSAnZm9yJyBvciAnZm9yRWFjaCcgbG9vcC5cblxuTGVhcm4gbW9yZSBhYm91dCB0b2tlbnM6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy90b2tlbnNcbkxlYXJuIG1vcmUgYWJvdXQgaXRlcmF0b3JzOiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvaXRlcmF0b3JzYDtcblxuY29uc3QgTUFQX0VSUk9SX0VYUExBTkFUSU9OID0gYFxuSW4gQ0RLVE4sIHdlIHJlcHJlc2VudCBtYXBzLCB3aXRoIHZhbHVlcyB1bmtub3duIHVudGlsIGFmdGVyIHJ1bnRpbWUsIGFzIG9iamVjdHMgd2l0aCBhIHNpbmdsZSBrZXktdmFsdWUgcGFpciB3aGVyZSB0aGUgdmFsdWUgaXMgYSBzdHJpbmcgdG9rZW4uIEZvciBleGFtcGxlOiAneyBcIiZ7VGZUb2tlbltUb2tlbi4xXX1cIjogXCJTdHJpbmcgTWFwIFRva2VuIFZhbHVlXCIgfScuXG5cbldlIGRvIHRoaXMgYmVjYXVzZSBDREtUTiBkb2VzIG5vdCBrbm93IHRoZSBsZW5ndGggb2YgdGhlIGxpc3QgYXQgY29tcGlsZSB0aW1lLCBtZWFuaW5nIENES1ROIGhhcyB5ZXQgdG8gaW52b2tlIFRlcnJhZm9ybSB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBjbG91ZCBwcm92aWRlci4gQ0RLVE4gbGF0ZXIgaW52b2tlcyBUZXJyYWZvcm0gb24gdGhlIHN5bnRoZXNpemVkIHN0YXRpYyBKU09OIGZpbGUuXG5cbkJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB0aGUgY29udGVudHMgb2YgdGhlIG1hcCwgd2UgY2FuIG5vdCBkaWZmZXJlbnRpYXRlIGlmIHRoZSBtYXAgd2FzIGFjY2Vzc2VkLCBvciB1c2VkIGFzIHBhcnQgb2YgYSBsb29wLiBUbyBhdm9pZCB0aGlzIGFtYmlndWl0eTpcblxuLSBUbyBhY2Nlc3MgYSBzaW5ndWxhciBpdGVtIHVzZSAnRm4ubG9va3VwKG1hcCwga2V5KScuIERvIG5vdCB1c2UgJ21hcFtrZXldJy5cbi0gSWYgeW91IHdhbnQgdG8gbG9vcCBvdmVyIHRoZSBtYXAgdXNlICdUZXJyYWZvcm1JdGVyYXRvci5mcm9tTWFwKG1hcCknLiBEbyBub3QgdXNlIGEgJ2ZvcicgbG9vcCBvciBpdGVyYXRlIG92ZXIgJ09iamVjdC5lbnRyaWVzKG1hcCknIHdpdGggJ2ZvckVhY2gnLlxuXG5MZWFybiBtb3JlIGFib3V0IHRva2VuczogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3Rva2Vuc1xuTGVhcm4gbW9yZSBhYm91dCBpdGVyYXRvcnM6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9pdGVyYXRvcnNgO1xuXG5leHBvcnQgY29uc3QgZW5jb2RlZExpc3RUb2tlbkluU2NhbGFyU3RyaW5nQ29udGV4dCA9ICgpID0+XG4gIG5ldyBFcnJvcihgRm91bmQgYW4gZW5jb2RlZCBsaXN0IHRva2VuIHN0cmluZyBpbiBhIHNjYWxhciBzdHJpbmcgY29udGV4dC5cbiR7TElTVF9FUlJPUl9FWFBMQU5BVElPTn1gKTtcblxuZXhwb3J0IGNvbnN0IGVuY29kZWRNYXBUb2tlbkluU2NhbGFyU3RyaW5nQ29udGV4dCA9ICgpID0+XG4gIG5ldyBFcnJvcihgRm91bmQgYW4gZW5jb2RlZCBtYXAgdG9rZW4gaW4gYSBzY2FsYXIgc3RyaW5nIGNvbnRleHQuXG4ke01BUF9FUlJPUl9FWFBMQU5BVElPTn1gKTtcblxuZXhwb3J0IGNvbnN0IGVuY29kZWRNYXBUb2tlbkluU2NhbGFyTnVtYmVyQ29udGV4dCA9ICgpID0+XG4gIG5ldyBFcnJvcihgRm91bmQgYW4gZW5jb2RlZCBtYXAgdG9rZW4gaW4gYSBzY2FsYXIgbnVtYmVyIGNvbnRleHQuXG4ke01BUF9FUlJPUl9FWFBMQU5BVElPTn1gKTtcblxuZXhwb3J0IGNvbnN0IGNvbnN0cnVjdHNDYW5ub3RCZVJlc29sdmVkID0gKHBhdGhOYW1lOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihgVHJ5aW5nIHRvICdyZXNvbHZlKCknIGEgQ29uc3RydWN0IGF0ICcke3BhdGhOYW1lfScuXG5cblRoaXMgb2Z0ZW4gbWVhbnMgYW4gdW5pbnRlbmRlZCBjeWNsaWMgZGVwZW5kZW5jeSBpbiB5b3VyIGNvbnN0cnVjdCB0cmVlLCBsZWFkaW5nIHRvIHRoZSByZXNvbHV0aW9uIHN0dWNrIGluIGFuIGluZmluaXRlIGxvb3AgdGhhdCBmYWlscy5cblRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgc2NvcGUgcGFzc2VkIGludG8gdGhpcyBjb25zdHJ1Y3QgaXMgYWxzbyBwYXJ0IG9mIGl0cyBzdWJ0cmVlLlxuXG5UbyByZXNvbHZlIHRoaXMgaXNzdWUsIHJlZmFjdG9yIHlvdXIgY29kZSB0byBhdm9pZCB0aGlzIGN5Y2xpYyBkZXBlbmRlbmN5IGJ5IGNoYW5naW5nIHRoZSBzY29wZSBvZiB0aGlzIGNvbnN0cnVjdC5gKTtcblxuZXhwb3J0IGNvbnN0IG1hcEtleU11c3RSZXNvbHZlVG9TdHJpbmcgPSAoXG4gIHBhdGhOYW1lOiBzdHJpbmcsXG4gIGtleTogc3RyaW5nLFxuICByZXNvbHZlZEtleTogYW55LFxuKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYEF0IFwiJHtwYXRoTmFtZX1cIiBhIG1hcCB1c2VzIHRoZSBrZXkgXCIke2tleX1cIiwgbWVhbmluZyB0aGF0IGtleSBtdXN0IHJlc29sdmUgdG8gYSBzdHJpbmcuIEhvd2V2ZXIsIGl0IHJlc29sdmVzIHRvIGEgJHt0eXBlb2YgcmVzb2x2ZWRLZXl9IHdpdGggdGhlIHZhbHVlICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICByZXNvbHZlZEtleSxcbiAgICApfS4gVG8gZml4IHRoaXMsIGNoYW5nZSB0aGUgVG9rZW4gdG8gcmVzb2x2ZSB0byBhIHN0cmluZy5gLFxuICApO1xuXG5jb25zdCB1bmtub3duVG9rZW5FeHBsYW5hdGlvbiA9IGBUaGlzIG1lYW5zIHlvdSBhcmUgdHJ5aW5nIHRvIGFjY2VzcyBhIFRva2VuIHZhbHVlIHRoYXQgZG9lcyBub3QgZXhpc3QuIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHRoZSBUb2tlbiBpcyBmcm9tIGFub3RoZXIgQ0RLIChpLmUuLCBBV1MgQ0RLLCBDREs4cywgZXRjLikgYW5kIGlzIHVua25vd24gdG8gdGhpcyBDREtUTiBBcHBsaWNhdGlvbi4gWW91IGVpdGhlciBuZWVkIHRvIG1ha2UgdGhlIG90aGVyIENESyByZXNvbHZlIHRoaXMgVG9rZW4gYmVmb3JlIENES1ROIHRyaWVzIHRvIHJlc29sdmUgaXQsIG9yIHdvcmsgYXJvdW5kIHVzaW5nIHRoaXMgVG9rZW4gYXQgYWxsLlxuXG5JZiB0aGlzIGVycm9yIG9jY3VycyB3aXRob3V0IGFub3RoZXIgQ0RLIChvciBhIHZhbHVlIGxvb2tpbmcgbGlrZSBhIFRva2VuKSBpbnZvbHZlZCwgcGxlYXNlIGZpbGUgYSBidWcuYDtcblxuZXhwb3J0IGNvbnN0IHVua25vd25OdW1iZXJUb2tlbkZvdW5kID0gKCkgPT5cbiAgbmV3IEVycm9yKFxuICAgIGBFbmNvZGVkIHJlcHJlc2VudGF0aW9uIG9mIHVua25vd24gbnVtYmVyIFRva2VuIGZvdW5kLiAke3Vua25vd25Ub2tlbkV4cGxhbmF0aW9ufWAsXG4gICk7XG5cbmV4cG9ydCBjb25zdCB1bnJlY29nbml6ZWRUb2tlbktleSA9IChrZXk6IHN0cmluZykgPT5cbiAgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgVG9rZW4gS2V5ICcke2tleX0nLiAke3Vua25vd25Ub2tlbkV4cGxhbmF0aW9ufWApO1xuXG5leHBvcnQgY29uc3QgSWRJbmNsdWRlc1VucmVzb2x2ZWRUb2tlbnMgPSAodW5yZXNvbHZlZFRva2Vuczogc3RyaW5nKSA9PlxuICBuZXcgRXJyb3IoXG4gICAgYFRoaXMgY29uc3RydWN0IChvciBpdHMgcGFyZW50IGNvbnN0cnVjdCkgaXMgY29uZmlndXJlZCB3aXRoIGFuIElEIHRoYXQgY29udGFpbnMgYSBUb2tlbjogJHt1bnJlc29sdmVkVG9rZW5zfS4gVGhpcyBpcyBub3QgYWxsb3dlZCBiZWNhdXNlIElEcyBtdXN0IGJlIGtub3duIHN0YXRpY2FsbHkgZHVyaW5nIHN5bnRoZXNpcy4gVG9rZW4gdmFsdWVzIGFyZSBvbmx5IGtub3duIGR1cmluZyB0aGUgYXBwbHkgc3RhZ2UsIHRoZXJlZm9yZSB0aGV5IGNhbm5vdCBiZSB1c2VkIGluIElEcy4gUGxlYXNlIHVzZSBhIGNvbmNyZXRlIHZhbHVlIGZvciB5b3VyIGNvbnN0cnVjdHMgSUQgaW5zdGVhZC5gLFxuICApO1xuXG5leHBvcnQgY29uc3QgYXNzZXRDYW5Ob3RDcmVhdGVaaXBBcmNoaXZlID0gKFxuICBzcmM6IHN0cmluZyxcbiAgZGVzdDogc3RyaW5nLFxuICBlcnJvcjogRXJyb3IsXG4pID0+XG4gIG5ldyBFcnJvcihcbiAgICBgQSBUZXJyYWZvcm1Bc3NldCB0cnlpbmcgdG8gemlwIGFyY2hpdmUgJyR7c3JjfScgaW50byAke2Rlc3R9IGZhaWxlZDogJHtlcnJvcn1gLFxuICApO1xuXG5leHBvcnQgY29uc3QgdW5rbm93blByb3ZpZGVyRmVhdHVyZSA9IChmZWF0dXJlOiBzdHJpbmcpID0+XG4gIG5ldyBFcnJvcihcbiAgICBgVW5rbm93biBwcm92aWRlci1wcm90b2NvbCBmZWF0dXJlIFwiJHtmZWF0dXJlfVwiIHBhc3NlZCB0byByZWdpc3RlclByb3ZpZGVyRmVhdHVyZVVzYWdlLiBUaGlzIGlzIGFuIGludGVybmFsIGNka3RuIEFQSSBpbnRlbmRlZCB0byBiZSBjYWxsZWQgYnkgZ2VuZXJhdGVkIHByb3ZpZGVyIGJpbmRpbmdzLCBub3QgdXNlciBjb2RlOyBpZiB5b3UgZGlkIG5vdCBjYWxsIGl0IGRpcmVjdGx5LCBwbGVhc2UgZmlsZSBhIGJ1ZyByZXBvcnQuYCxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IHRlcnJhZm9ybU1vZHVsZUhhc0NoaWxkcmVuID0gKHBhdGhOYW1lOiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICBgVHJ5aW5nIHRvIGFkZCBjaGlsZHJlbiB0byBhIFRlcnJhZm9ybU1vZHVsZSBhdCAnJHtwYXRoTmFtZX0nLiBUZXJyYWZvcm1Nb2R1bGVzIGNhbm5vdCBoYXZlIGNoaWxkcmVuLCBpZiB5b3Ugd2FudCB0byBncm91cCByZXNvdXJjZXMgb3IgY29uc3RydWN0cyBpbiBnZW5lcmFsIHRvZ2V0aGVyIHBsZWFzZSB1c2UgdGhlIENvbnN0cnVjdHMgY2xhc3MgaW5zdGVhZC4gU2VlIGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9jb25zdHJ1Y3RzIGZvciBtb3JlIGRldGFpbHMuYCxcbiAgKTtcbn07XG4iXX0=
@@ -10,7 +10,7 @@ const helpers_1 = require("./helpers");
10
10
  * through which every provider-defined function call flows.
11
11
  */
12
12
  class TerraformProviderFunction {
13
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.TerraformProviderFunction", version: "0.25.0-pre.9" };
13
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.TerraformProviderFunction", version: "0.25.0" };
14
14
  /**
15
15
  * Invokes a provider-defined function (Terraform's
16
16
  * `provider::<providerLocalName>::<functionName>(...)` syntax).
@@ -11,7 +11,7 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
11
11
  const helpers_1 = require("./helpers");
12
12
  // eslint-disable-next-line jsdoc/require-jsdoc
13
13
  class FnGenerated {
14
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.FnGenerated", version: "0.25.0-pre.9" };
14
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.FnGenerated", version: "0.25.0" };
15
15
  /**
16
16
  * {@link https://developer.hashicorp.com/terraform/language/functions/abs abs} returns the absolute value of the given number. In other words, if the number is zero or positive then it is returned as-is, but if it is negative then it is multiplied by -1 to make it positive before returning it.
17
17
  * @param {number} num
@@ -0,0 +1,82 @@
1
+ /**
2
+ * A single entry presented to an {@link IIgnoreStrategy}.
3
+ *
4
+ * A struct rather than a positional `relativePath` string so the shape can
5
+ * evolve. `isDirectory` is carried from the outset because `.gitignore` /
6
+ * `.dockerignore` semantics turn on it: a `foo/` pattern matches a
7
+ * directory but not a file named `foo`, and a matcher cannot recover
8
+ * that distinction from the path text alone.
9
+ */
10
+ export interface IgnoreQuery {
11
+ /**
12
+ * `/`-separated path relative to the asset root.
13
+ */
14
+ readonly relativePath: string;
15
+ /**
16
+ * Whether this entry is a directory rather than a file or symlink.
17
+ *
18
+ * The tree walkers set this from `lstat`, so a strategy can honor
19
+ * directory-only patterns without stat-ing the path itself (which it has
20
+ * no root to resolve against). Excluding a directory also excludes
21
+ * everything below it, since the walkers stop descending once a directory
22
+ * is excluded.
23
+ */
24
+ readonly isDirectory: boolean;
25
+ }
26
+ /**
27
+ * Decides whether a path relative to an asset root is excluded from staging
28
+ * and hashing.
29
+ *
30
+ * Core ships only the exact-path / `*.ext` / directory matcher used by
31
+ * `exclude` today (`ExcludeIgnoreStrategy`). Full glob, `.gitignore`, and
32
+ * `.dockerignore` parity can be implemented against this interface without
33
+ * core taking on a glob parser.
34
+ */
35
+ export interface IIgnoreStrategy {
36
+ /**
37
+ * Whether the given entry should be excluded.
38
+ * @param query - the entry under consideration, see {@link IgnoreQuery}
39
+ */
40
+ ignores(query: IgnoreQuery): boolean;
41
+ /**
42
+ * Whether excluding a directory also excludes everything beneath it.
43
+ *
44
+ * When `true` (the default), the walkers stop descending as soon as a
45
+ * directory is excluded — cheaper, and correct for a strategy whose
46
+ * patterns never re-include a path below an excluded parent.
47
+ *
48
+ * A strategy with negation patterns must set this to `false`:
49
+ * `.gitignore` / `.dockerignore` allow `node_modules` followed by
50
+ * `!node_modules/keep`, which is only reachable if the walk descends into
51
+ * the excluded `node_modules` and asks about `node_modules/keep`. The
52
+ * excluded directory entry itself is still omitted; only the descent
53
+ * changes. Opting out costs a full walk of excluded subtrees.
54
+ *
55
+ * @default true
56
+ */
57
+ readonly pruneExcludedDirectories?: boolean;
58
+ /**
59
+ * A value identifying this strategy's exclusion behavior, suitable for
60
+ * folding into a cache key. Two strategies that return the same
61
+ * `cacheKey` must exclude the same paths.
62
+ *
63
+ * Callers such as `AssetStaging`'s result cache key on a JSON-serializable
64
+ * representation of their inputs, which a strategy instance is not. Omit
65
+ * this when the strategy's behavior can't be summarized this way; the
66
+ * caller then has to treat every call as uncacheable.
67
+ *
68
+ * @default - this strategy cannot be represented in a cache key
69
+ */
70
+ readonly cacheKey?: string;
71
+ }
72
+ /**
73
+ * The default ignore strategy: exact paths, `*.ext` suffixes, and
74
+ * directories (with everything inside them).
75
+ */
76
+ export declare class ExcludeIgnoreStrategy implements IIgnoreStrategy {
77
+ private readonly matcher;
78
+ readonly cacheKey?: string;
79
+ readonly pruneExcludedDirectories?: boolean;
80
+ constructor(exclude: string[]);
81
+ ignores(query: IgnoreQuery): boolean;
82
+ }
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ExcludeIgnoreStrategy = void 0;
4
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
5
+ // Copyright (c) HashiCorp, Inc
6
+ // SPDX-License-Identifier: MPL-2.0
7
+ const fs_1 = require("./private/fs");
8
+ /**
9
+ * The default ignore strategy: exact paths, `*.ext` suffixes, and
10
+ * directories (with everything inside them).
11
+ */
12
+ class ExcludeIgnoreStrategy {
13
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.ExcludeIgnoreStrategy", version: "0.25.0" };
14
+ matcher;
15
+ cacheKey;
16
+ // Undefined (the interface default) prunes excluded directories, which is
17
+ // correct here since the built-in patterns have no negation form.
18
+ pruneExcludedDirectories;
19
+ constructor(exclude) {
20
+ this.matcher = (0, fs_1.excludeMatcher)(exclude);
21
+ this.cacheKey = `exclude:${JSON.stringify(exclude)}`;
22
+ }
23
+ ignores(query) {
24
+ // Path-based matching only; `isDirectory` is unused.
25
+ return this.matcher(query.relativePath);
26
+ }
27
+ }
28
+ exports.ExcludeIgnoreStrategy = ExcludeIgnoreStrategy;
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWdub3JlLXN0cmF0ZWd5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2lnbm9yZS1zdHJhdGVneS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsK0JBQStCO0FBQy9CLG1DQUFtQztBQUNuQyxxQ0FBOEM7QUE4RTlDOzs7R0FHRztBQUNILE1BQWEscUJBQXFCOztJQUNmLE9BQU8sQ0FBb0M7SUFFNUMsUUFBUSxDQUFVO0lBRWxDLDBFQUEwRTtJQUMxRSxrRUFBa0U7SUFDbEQsd0JBQXdCLENBQVc7SUFFbkQsWUFBWSxPQUFpQjtRQUMzQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUEsbUJBQWMsRUFBQyxPQUFPLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsUUFBUSxHQUFHLFdBQVcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO0lBQ3ZELENBQUM7SUFFTSxPQUFPLENBQUMsS0FBa0I7UUFDL0IscURBQXFEO1FBQ3JELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDMUMsQ0FBQzs7QUFqQkgsc0RBa0JDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCB7IGV4Y2x1ZGVNYXRjaGVyIH0gZnJvbSBcIi4vcHJpdmF0ZS9mc1wiO1xuXG4vKipcbiAqIEEgc2luZ2xlIGVudHJ5IHByZXNlbnRlZCB0byBhbiB7QGxpbmsgSUlnbm9yZVN0cmF0ZWd5fS5cbiAqXG4gKiBBIHN0cnVjdCByYXRoZXIgdGhhbiBhIHBvc2l0aW9uYWwgYHJlbGF0aXZlUGF0aGAgc3RyaW5nIHNvIHRoZSBzaGFwZSBjYW5cbiAqIGV2b2x2ZS4gYGlzRGlyZWN0b3J5YCBpcyBjYXJyaWVkIGZyb20gdGhlIG91dHNldCBiZWNhdXNlIGAuZ2l0aWdub3JlYCAvXG4gKiBgLmRvY2tlcmlnbm9yZWAgc2VtYW50aWNzIHR1cm4gb24gaXQ6IGEgYGZvby9gIHBhdHRlcm4gbWF0Y2hlcyBhXG4gKiBkaXJlY3RvcnkgYnV0IG5vdCBhIGZpbGUgbmFtZWQgYGZvb2AsIGFuZCBhIG1hdGNoZXIgY2Fubm90IHJlY292ZXJcbiAqIHRoYXQgZGlzdGluY3Rpb24gZnJvbSB0aGUgcGF0aCB0ZXh0IGFsb25lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElnbm9yZVF1ZXJ5IHtcbiAgLyoqXG4gICAqIGAvYC1zZXBhcmF0ZWQgcGF0aCByZWxhdGl2ZSB0byB0aGUgYXNzZXQgcm9vdC5cbiAgICovXG4gIHJlYWRvbmx5IHJlbGF0aXZlUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgZW50cnkgaXMgYSBkaXJlY3RvcnkgcmF0aGVyIHRoYW4gYSBmaWxlIG9yIHN5bWxpbmsuXG4gICAqXG4gICAqIFRoZSB0cmVlIHdhbGtlcnMgc2V0IHRoaXMgZnJvbSBgbHN0YXRgLCBzbyBhIHN0cmF0ZWd5IGNhbiBob25vclxuICAgKiBkaXJlY3Rvcnktb25seSBwYXR0ZXJucyB3aXRob3V0IHN0YXQtaW5nIHRoZSBwYXRoIGl0c2VsZiAod2hpY2ggaXQgaGFzXG4gICAqIG5vIHJvb3QgdG8gcmVzb2x2ZSBhZ2FpbnN0KS4gRXhjbHVkaW5nIGEgZGlyZWN0b3J5IGFsc28gZXhjbHVkZXNcbiAgICogZXZlcnl0aGluZyBiZWxvdyBpdCwgc2luY2UgdGhlIHdhbGtlcnMgc3RvcCBkZXNjZW5kaW5nIG9uY2UgYSBkaXJlY3RvcnlcbiAgICogaXMgZXhjbHVkZWQuXG4gICAqL1xuICByZWFkb25seSBpc0RpcmVjdG9yeTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEZWNpZGVzIHdoZXRoZXIgYSBwYXRoIHJlbGF0aXZlIHRvIGFuIGFzc2V0IHJvb3QgaXMgZXhjbHVkZWQgZnJvbSBzdGFnaW5nXG4gKiBhbmQgaGFzaGluZy5cbiAqXG4gKiBDb3JlIHNoaXBzIG9ubHkgdGhlIGV4YWN0LXBhdGggLyBgKi5leHRgIC8gZGlyZWN0b3J5IG1hdGNoZXIgdXNlZCBieVxuICogYGV4Y2x1ZGVgIHRvZGF5IChgRXhjbHVkZUlnbm9yZVN0cmF0ZWd5YCkuIEZ1bGwgZ2xvYiwgYC5naXRpZ25vcmVgLCBhbmRcbiAqIGAuZG9ja2VyaWdub3JlYCBwYXJpdHkgY2FuIGJlIGltcGxlbWVudGVkIGFnYWluc3QgdGhpcyBpbnRlcmZhY2Ugd2l0aG91dFxuICogY29yZSB0YWtpbmcgb24gYSBnbG9iIHBhcnNlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSWdub3JlU3RyYXRlZ3kge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgZ2l2ZW4gZW50cnkgc2hvdWxkIGJlIGV4Y2x1ZGVkLlxuICAgKiBAcGFyYW0gcXVlcnkgLSB0aGUgZW50cnkgdW5kZXIgY29uc2lkZXJhdGlvbiwgc2VlIHtAbGluayBJZ25vcmVRdWVyeX1cbiAgICovXG4gIGlnbm9yZXMocXVlcnk6IElnbm9yZVF1ZXJ5KTogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciBleGNsdWRpbmcgYSBkaXJlY3RvcnkgYWxzbyBleGNsdWRlcyBldmVyeXRoaW5nIGJlbmVhdGggaXQuXG4gICAqXG4gICAqIFdoZW4gYHRydWVgICh0aGUgZGVmYXVsdCksIHRoZSB3YWxrZXJzIHN0b3AgZGVzY2VuZGluZyBhcyBzb29uIGFzIGFcbiAgICogZGlyZWN0b3J5IGlzIGV4Y2x1ZGVkIOKAlCBjaGVhcGVyLCBhbmQgY29ycmVjdCBmb3IgYSBzdHJhdGVneSB3aG9zZVxuICAgKiBwYXR0ZXJucyBuZXZlciByZS1pbmNsdWRlIGEgcGF0aCBiZWxvdyBhbiBleGNsdWRlZCBwYXJlbnQuXG4gICAqXG4gICAqIEEgc3RyYXRlZ3kgd2l0aCBuZWdhdGlvbiBwYXR0ZXJucyBtdXN0IHNldCB0aGlzIHRvIGBmYWxzZWA6XG4gICAqIGAuZ2l0aWdub3JlYCAvIGAuZG9ja2VyaWdub3JlYCBhbGxvdyBgbm9kZV9tb2R1bGVzYCBmb2xsb3dlZCBieVxuICAgKiBgIW5vZGVfbW9kdWxlcy9rZWVwYCwgd2hpY2ggaXMgb25seSByZWFjaGFibGUgaWYgdGhlIHdhbGsgZGVzY2VuZHMgaW50b1xuICAgKiB0aGUgZXhjbHVkZWQgYG5vZGVfbW9kdWxlc2AgYW5kIGFza3MgYWJvdXQgYG5vZGVfbW9kdWxlcy9rZWVwYC4gVGhlXG4gICAqIGV4Y2x1ZGVkIGRpcmVjdG9yeSBlbnRyeSBpdHNlbGYgaXMgc3RpbGwgb21pdHRlZDsgb25seSB0aGUgZGVzY2VudFxuICAgKiBjaGFuZ2VzLiBPcHRpbmcgb3V0IGNvc3RzIGEgZnVsbCB3YWxrIG9mIGV4Y2x1ZGVkIHN1YnRyZWVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBwcnVuZUV4Y2x1ZGVkRGlyZWN0b3JpZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHZhbHVlIGlkZW50aWZ5aW5nIHRoaXMgc3RyYXRlZ3kncyBleGNsdXNpb24gYmVoYXZpb3IsIHN1aXRhYmxlIGZvclxuICAgKiBmb2xkaW5nIGludG8gYSBjYWNoZSBrZXkuIFR3byBzdHJhdGVnaWVzIHRoYXQgcmV0dXJuIHRoZSBzYW1lXG4gICAqIGBjYWNoZUtleWAgbXVzdCBleGNsdWRlIHRoZSBzYW1lIHBhdGhzLlxuICAgKlxuICAgKiBDYWxsZXJzIHN1Y2ggYXMgYEFzc2V0U3RhZ2luZ2AncyByZXN1bHQgY2FjaGUga2V5IG9uIGEgSlNPTi1zZXJpYWxpemFibGVcbiAgICogcmVwcmVzZW50YXRpb24gb2YgdGhlaXIgaW5wdXRzLCB3aGljaCBhIHN0cmF0ZWd5IGluc3RhbmNlIGlzIG5vdC4gT21pdFxuICAgKiB0aGlzIHdoZW4gdGhlIHN0cmF0ZWd5J3MgYmVoYXZpb3IgY2FuJ3QgYmUgc3VtbWFyaXplZCB0aGlzIHdheTsgdGhlXG4gICAqIGNhbGxlciB0aGVuIGhhcyB0byB0cmVhdCBldmVyeSBjYWxsIGFzIHVuY2FjaGVhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoaXMgc3RyYXRlZ3kgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIGEgY2FjaGUga2V5XG4gICAqL1xuICByZWFkb25seSBjYWNoZUtleT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgZGVmYXVsdCBpZ25vcmUgc3RyYXRlZ3k6IGV4YWN0IHBhdGhzLCBgKi5leHRgIHN1ZmZpeGVzLCBhbmRcbiAqIGRpcmVjdG9yaWVzICh3aXRoIGV2ZXJ5dGhpbmcgaW5zaWRlIHRoZW0pLlxuICovXG5leHBvcnQgY2xhc3MgRXhjbHVkZUlnbm9yZVN0cmF0ZWd5IGltcGxlbWVudHMgSUlnbm9yZVN0cmF0ZWd5IHtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXRjaGVyOiAocmVsYXRpdmVQYXRoOiBzdHJpbmcpID0+IGJvb2xlYW47XG5cbiAgcHVibGljIHJlYWRvbmx5IGNhY2hlS2V5Pzogc3RyaW5nO1xuXG4gIC8vIFVuZGVmaW5lZCAodGhlIGludGVyZmFjZSBkZWZhdWx0KSBwcnVuZXMgZXhjbHVkZWQgZGlyZWN0b3JpZXMsIHdoaWNoIGlzXG4gIC8vIGNvcnJlY3QgaGVyZSBzaW5jZSB0aGUgYnVpbHQtaW4gcGF0dGVybnMgaGF2ZSBubyBuZWdhdGlvbiBmb3JtLlxuICBwdWJsaWMgcmVhZG9ubHkgcHJ1bmVFeGNsdWRlZERpcmVjdG9yaWVzPzogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihleGNsdWRlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMubWF0Y2hlciA9IGV4Y2x1ZGVNYXRjaGVyKGV4Y2x1ZGUpO1xuICAgIHRoaXMuY2FjaGVLZXkgPSBgZXhjbHVkZToke0pTT04uc3RyaW5naWZ5KGV4Y2x1ZGUpfWA7XG4gIH1cblxuICBwdWJsaWMgaWdub3JlcyhxdWVyeTogSWdub3JlUXVlcnkpOiBib29sZWFuIHtcbiAgICAvLyBQYXRoLWJhc2VkIG1hdGNoaW5nIG9ubHk7IGBpc0RpcmVjdG9yeWAgaXMgdW51c2VkLlxuICAgIHJldHVybiB0aGlzLm1hdGNoZXIocXVlcnkucmVsYXRpdmVQYXRoKTtcbiAgfVxufVxuIl19
@@ -3,17 +3,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ImportableResource = void 0;
4
4
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
5
5
  const terraform_element_1 = require("./terraform-element");
6
- const validate_terraform_version_1 = require("./validations/validate-terraform-version");
6
+ const target_versions_1 = require("./validations/target-versions");
7
7
  /**
8
8
  * Class used to represent an importable resource.
9
9
  */
10
10
  class ImportableResource extends terraform_element_1.TerraformElement {
11
11
  config;
12
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.ImportableResource", version: "0.25.0-pre.9" };
12
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.ImportableResource", version: "0.25.0" };
13
13
  constructor(scope, name, config) {
14
14
  super(scope, name, config.terraformResourceType);
15
15
  this.config = config;
16
- this.node.addValidation(new validate_terraform_version_1.ValidateTerraformVersion(">=1.5", `Import blocks are only supported for Terraform >=1.5. Please upgrade your Terraform version.`));
16
+ this.node.addValidation(new target_versions_1.ValidateFeatureTargetSupport(this, "The import block", {
17
+ terraform: ">=1.5.0",
18
+ opentofu: ">=1.6.0",
19
+ }));
17
20
  }
18
21
  toHclTerraform() {
19
22
  const expectedResourceAddress = `${this.config.terraformResourceType}.${this.friendlyUniqueId}`;
@@ -60,4 +63,4 @@ class ImportableResource extends terraform_element_1.TerraformElement {
60
63
  }
61
64
  }
62
65
  exports.ImportableResource = ImportableResource;
63
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0YWJsZS1yZXNvdXJjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbXBvcnRhYmxlLXJlc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFNQSwyREFBdUQ7QUFFdkQseUZBQW9GO0FBUXBGOztHQUVHO0FBQ0gsTUFBYSxrQkFBbUIsU0FBUSxvQ0FBZ0I7SUFJbkM7O0lBSG5CLFlBQ0UsS0FBZ0IsRUFDaEIsSUFBWSxFQUNLLE1BQXlCO1FBRTFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBRmhDLFdBQU0sR0FBTixNQUFNLENBQW1CO1FBRzFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUNyQixJQUFJLHFEQUF3QixDQUMxQixPQUFPLEVBQ1AsOEZBQThGLENBQy9GLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTSxjQUFjO1FBQ25CLE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ2hHLE9BQU87WUFDTCxNQUFNLEVBQUU7Z0JBQ047b0JBQ0UsRUFBRSxFQUFFO3dCQUNGLEtBQUssRUFBRSx1QkFBdUI7d0JBQzlCLElBQUksRUFBRSxRQUFRO3dCQUNkLGdCQUFnQixFQUFFLFdBQVc7cUJBQzlCO29CQUNELEVBQUUsRUFBRTt3QkFDRixLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRO3dCQUMzQixJQUFJLEVBQUUsUUFBUTt3QkFDZCxnQkFBZ0IsRUFBRSxRQUFRO3FCQUMzQjtvQkFDRCxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRO3dCQUM1QixDQUFDLENBQUM7NEJBQ0UsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUc7NEJBQy9CLElBQUksRUFBRSxRQUFROzRCQUNkLGdCQUFnQixFQUFFLFdBQVc7eUJBQzlCO3dCQUNILENBQUMsQ0FBQyxTQUFTO2lCQUNkO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVNLFdBQVc7UUFDaEIsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMscUJBQXFCLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDaEcsT0FBTztZQUNMLE1BQU0sRUFBRTtnQkFDTjtvQkFDRSxFQUFFLEVBQUUsdUJBQXVCO29CQUMzQixFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRO29CQUN4QixRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUztpQkFDdEU7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU0sVUFBVTtRQUNmLE9BQU87WUFDTCw4QkFBOEIsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztTQUN4RCxDQUFDO0lBQ0osQ0FBQzs7QUEzREgsZ0RBNERDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbiAqL1xuXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgVGVycmFmb3JtRWxlbWVudCB9IGZyb20gXCIuL3RlcnJhZm9ybS1lbGVtZW50XCI7XG5pbXBvcnQgeyBUZXJyYWZvcm1Qcm92aWRlciB9IGZyb20gXCIuL3RlcnJhZm9ybS1wcm92aWRlclwiO1xuaW1wb3J0IHsgVmFsaWRhdGVUZXJyYWZvcm1WZXJzaW9uIH0gZnJvbSBcIi4vdmFsaWRhdGlvbnMvdmFsaWRhdGUtdGVycmFmb3JtLXZlcnNpb25cIjtcblxuZXhwb3J0IGludGVyZmFjZSBJSW1wb3J0YWJsZUNvbmZpZyB7XG4gIHRlcnJhZm9ybVJlc291cmNlVHlwZTogc3RyaW5nO1xuICBpbXBvcnRJZDogc3RyaW5nO1xuICBwcm92aWRlcj86IFRlcnJhZm9ybVByb3ZpZGVyO1xufVxuXG4vKipcbiAqIENsYXNzIHVzZWQgdG8gcmVwcmVzZW50IGFuIGltcG9ydGFibGUgcmVzb3VyY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbXBvcnRhYmxlUmVzb3VyY2UgZXh0ZW5kcyBUZXJyYWZvcm1FbGVtZW50IHtcbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IElJbXBvcnRhYmxlQ29uZmlnLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgbmFtZSwgY29uZmlnLnRlcnJhZm9ybVJlc291cmNlVHlwZSk7XG4gICAgdGhpcy5ub2RlLmFkZFZhbGlkYXRpb24oXG4gICAgICBuZXcgVmFsaWRhdGVUZXJyYWZvcm1WZXJzaW9uKFxuICAgICAgICBcIj49MS41XCIsXG4gICAgICAgIGBJbXBvcnQgYmxvY2tzIGFyZSBvbmx5IHN1cHBvcnRlZCBmb3IgVGVycmFmb3JtID49MS41LiBQbGVhc2UgdXBncmFkZSB5b3VyIFRlcnJhZm9ybSB2ZXJzaW9uLmAsXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgdG9IY2xUZXJyYWZvcm0oKTogYW55IHtcbiAgICBjb25zdCBleHBlY3RlZFJlc291cmNlQWRkcmVzcyA9IGAke3RoaXMuY29uZmlnLnRlcnJhZm9ybVJlc291cmNlVHlwZX0uJHt0aGlzLmZyaWVuZGx5VW5pcXVlSWR9YDtcbiAgICByZXR1cm4ge1xuICAgICAgaW1wb3J0OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0bzoge1xuICAgICAgICAgICAgdmFsdWU6IGV4cGVjdGVkUmVzb3VyY2VBZGRyZXNzLFxuICAgICAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwicmVmZXJlbmNlXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBpZDoge1xuICAgICAgICAgICAgdmFsdWU6IHRoaXMuY29uZmlnLmltcG9ydElkLFxuICAgICAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwcm92aWRlcjogdGhpcy5jb25maWcucHJvdmlkZXJcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmNvbmZpZy5wcm92aWRlci5mcW4sXG4gICAgICAgICAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInJlZmVyZW5jZVwiLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyB0b1RlcnJhZm9ybSgpOiBhbnkge1xuICAgIGNvbnN0IGV4cGVjdGVkUmVzb3VyY2VBZGRyZXNzID0gYCR7dGhpcy5jb25maWcudGVycmFmb3JtUmVzb3VyY2VUeXBlfS4ke3RoaXMuZnJpZW5kbHlVbmlxdWVJZH1gO1xuICAgIHJldHVybiB7XG4gICAgICBpbXBvcnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHRvOiBleHBlY3RlZFJlc291cmNlQWRkcmVzcyxcbiAgICAgICAgICBpZDogdGhpcy5jb25maWcuaW1wb3J0SWQsXG4gICAgICAgICAgcHJvdmlkZXI6IHRoaXMuY29uZmlnLnByb3ZpZGVyID8gdGhpcy5jb25maWcucHJvdmlkZXIuZnFuIDogdW5kZWZpbmVkLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHRvTWV0YWRhdGEoKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgaW1wb3J0c0dlbmVyYXRpbmdDb25maWd1cmF0aW9uOiBbdGhpcy5mcmllbmRseVVuaXF1ZUlkXSxcbiAgICB9O1xuICB9XG59XG4iXX0=
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0YWJsZS1yZXNvdXJjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbXBvcnRhYmxlLXJlc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFNQSwyREFBdUQ7QUFFdkQsbUVBQTZFO0FBUTdFOztHQUVHO0FBQ0gsTUFBYSxrQkFBbUIsU0FBUSxvQ0FBZ0I7SUFJbkM7O0lBSG5CLFlBQ0UsS0FBZ0IsRUFDaEIsSUFBWSxFQUNLLE1BQXlCO1FBRTFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBRmhDLFdBQU0sR0FBTixNQUFNLENBQW1CO1FBRzFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUNyQixJQUFJLDhDQUE0QixDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRTtZQUN6RCxTQUFTLEVBQUUsU0FBUztZQUNwQixRQUFRLEVBQUUsU0FBUztTQUNwQixDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFTSxjQUFjO1FBQ25CLE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ2hHLE9BQU87WUFDTCxNQUFNLEVBQUU7Z0JBQ047b0JBQ0UsRUFBRSxFQUFFO3dCQUNGLEtBQUssRUFBRSx1QkFBdUI7d0JBQzlCLElBQUksRUFBRSxRQUFRO3dCQUNkLGdCQUFnQixFQUFFLFdBQVc7cUJBQzlCO29CQUNELEVBQUUsRUFBRTt3QkFDRixLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRO3dCQUMzQixJQUFJLEVBQUUsUUFBUTt3QkFDZCxnQkFBZ0IsRUFBRSxRQUFRO3FCQUMzQjtvQkFDRCxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRO3dCQUM1QixDQUFDLENBQUM7NEJBQ0UsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUc7NEJBQy9CLElBQUksRUFBRSxRQUFROzRCQUNkLGdCQUFnQixFQUFFLFdBQVc7eUJBQzlCO3dCQUNILENBQUMsQ0FBQyxTQUFTO2lCQUNkO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVNLFdBQVc7UUFDaEIsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMscUJBQXFCLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDaEcsT0FBTztZQUNMLE1BQU0sRUFBRTtnQkFDTjtvQkFDRSxFQUFFLEVBQUUsdUJBQXVCO29CQUMzQixFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRO29CQUN4QixRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUztpQkFDdEU7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU0sVUFBVTtRQUNmLE9BQU87WUFDTCw4QkFBOEIsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztTQUN4RCxDQUFDO0lBQ0osQ0FBQzs7QUEzREgsZ0RBNERDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbiAqL1xuXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgVGVycmFmb3JtRWxlbWVudCB9IGZyb20gXCIuL3RlcnJhZm9ybS1lbGVtZW50XCI7XG5pbXBvcnQgeyBUZXJyYWZvcm1Qcm92aWRlciB9IGZyb20gXCIuL3RlcnJhZm9ybS1wcm92aWRlclwiO1xuaW1wb3J0IHsgVmFsaWRhdGVGZWF0dXJlVGFyZ2V0U3VwcG9ydCB9IGZyb20gXCIuL3ZhbGlkYXRpb25zL3RhcmdldC12ZXJzaW9uc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElJbXBvcnRhYmxlQ29uZmlnIHtcbiAgdGVycmFmb3JtUmVzb3VyY2VUeXBlOiBzdHJpbmc7XG4gIGltcG9ydElkOiBzdHJpbmc7XG4gIHByb3ZpZGVyPzogVGVycmFmb3JtUHJvdmlkZXI7XG59XG5cbi8qKlxuICogQ2xhc3MgdXNlZCB0byByZXByZXNlbnQgYW4gaW1wb3J0YWJsZSByZXNvdXJjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEltcG9ydGFibGVSZXNvdXJjZSBleHRlbmRzIFRlcnJhZm9ybUVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogSUltcG9ydGFibGVDb25maWcsXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBuYW1lLCBjb25maWcudGVycmFmb3JtUmVzb3VyY2VUeXBlKTtcbiAgICB0aGlzLm5vZGUuYWRkVmFsaWRhdGlvbihcbiAgICAgIG5ldyBWYWxpZGF0ZUZlYXR1cmVUYXJnZXRTdXBwb3J0KHRoaXMsIFwiVGhlIGltcG9ydCBibG9ja1wiLCB7XG4gICAgICAgIHRlcnJhZm9ybTogXCI+PTEuNS4wXCIsXG4gICAgICAgIG9wZW50b2Z1OiBcIj49MS42LjBcIixcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgdG9IY2xUZXJyYWZvcm0oKTogYW55IHtcbiAgICBjb25zdCBleHBlY3RlZFJlc291cmNlQWRkcmVzcyA9IGAke3RoaXMuY29uZmlnLnRlcnJhZm9ybVJlc291cmNlVHlwZX0uJHt0aGlzLmZyaWVuZGx5VW5pcXVlSWR9YDtcbiAgICByZXR1cm4ge1xuICAgICAgaW1wb3J0OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0bzoge1xuICAgICAgICAgICAgdmFsdWU6IGV4cGVjdGVkUmVzb3VyY2VBZGRyZXNzLFxuICAgICAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwicmVmZXJlbmNlXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBpZDoge1xuICAgICAgICAgICAgdmFsdWU6IHRoaXMuY29uZmlnLmltcG9ydElkLFxuICAgICAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwcm92aWRlcjogdGhpcy5jb25maWcucHJvdmlkZXJcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmNvbmZpZy5wcm92aWRlci5mcW4sXG4gICAgICAgICAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInJlZmVyZW5jZVwiLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyB0b1RlcnJhZm9ybSgpOiBhbnkge1xuICAgIGNvbnN0IGV4cGVjdGVkUmVzb3VyY2VBZGRyZXNzID0gYCR7dGhpcy5jb25maWcudGVycmFmb3JtUmVzb3VyY2VUeXBlfS4ke3RoaXMuZnJpZW5kbHlVbmlxdWVJZH1gO1xuICAgIHJldHVybiB7XG4gICAgICBpbXBvcnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHRvOiBleHBlY3RlZFJlc291cmNlQWRkcmVzcyxcbiAgICAgICAgICBpZDogdGhpcy5jb25maWcuaW1wb3J0SWQsXG4gICAgICAgICAgcHJvdmlkZXI6IHRoaXMuY29uZmlnLnByb3ZpZGVyID8gdGhpcy5jb25maWcucHJvdmlkZXIuZnFuIDogdW5kZWZpbmVkLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHRvTWV0YWRhdGEoKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgaW1wb3J0c0dlbmVyYXRpbmdDb25maWd1cmF0aW9uOiBbdGhpcy5mcmllbmRseVVuaXF1ZUlkXSxcbiAgICB9O1xuICB9XG59XG4iXX0=
package/lib/index.d.ts CHANGED
@@ -38,5 +38,9 @@ export * from "./importable-resource";
38
38
  export * from "./terraform-resource-targets";
39
39
  export * from "./upgrade-id-aspect";
40
40
  export * from "./terraform-data-resource";
41
+ export * from "./assets";
42
+ export * from "./ignore-strategy";
43
+ export * from "./asset-hash";
44
+ export * from "./asset-staging";
41
45
  export * from "./functions/terraform-functions.generated";
42
46
  export * from "./functions/provider-function";
package/lib/index.js CHANGED
@@ -83,7 +83,11 @@ __exportStar(require("./importable-resource"), exports);
83
83
  __exportStar(require("./terraform-resource-targets"), exports);
84
84
  __exportStar(require("./upgrade-id-aspect"), exports);
85
85
  __exportStar(require("./terraform-data-resource"), exports);
86
+ __exportStar(require("./assets"), exports);
87
+ __exportStar(require("./ignore-strategy"), exports);
88
+ __exportStar(require("./asset-hash"), exports);
89
+ __exportStar(require("./asset-staging"), exports);
86
90
  // required for JSII because Fn extends from it
87
91
  __exportStar(require("./functions/terraform-functions.generated"), exports);
88
92
  __exportStar(require("./functions/provider-function"), exports);
89
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0JBQStCO0FBQy9CLG1DQUFtQztBQUNuQywrREFBNEQ7QUFDNUQsSUFBQSx5Q0FBbUIsR0FBRSxDQUFDO0FBRXRCLDJDQUF5QjtBQUN6QixvREFBa0M7QUFDbEMsc0RBQW9DO0FBQ3BDLHFEQUFtQztBQUNuQyx1REFBcUM7QUFDckMsdURBQXFDO0FBQ3JDLHFGQUFxRjtBQUNyRiwrRUFBaUU7QUFBeEQsK0hBQUEsZUFBZSxPQUFBO0FBQ3hCLDBEQUF3QztBQUN4QyxpRUFBK0M7QUFDL0MscURBQW1DO0FBQ25DLDBEQUF3QztBQUN4Qyw2Q0FBMkI7QUFDM0IsNENBQTBCO0FBQzFCLHNFQUFzRDtBQUN0RCx3Q0FBc0I7QUFDdEIsc0RBQW9DO0FBQ3BDLDZDQUEyQjtBQUMzQiwyREFBeUM7QUFDekMsb0RBQWtDO0FBQ2xDLHVEQUFxQztBQUNyQyx5REFBdUM7QUFDdkMsNENBQTBCO0FBQzFCLHlEQUF1QztBQUN2Qyw2Q0FBMkI7QUFDM0Isb0RBQWtDO0FBQ2xDLCtDQUE2QjtBQUM3QixnREFBOEI7QUFDOUIsMkNBQXlCO0FBQ3pCLHdEQUFzQztBQUN0Qyx3REFBc0M7QUFDdEMsaURBQStCO0FBQy9CLDBEQUF3QztBQUN4Qyx1REFBcUM7QUFDckMsMERBQXdDO0FBQ3hDLHlEQUF1QztBQUN2QyxvREFBa0M7QUFDbEMsd0RBQXNDO0FBQ3RDLCtEQUE2QztBQUM3QyxzREFBb0M7QUFDcEMsNERBQTBDO0FBQzFDLCtDQUErQztBQUMvQyw0RUFBMEQ7QUFDMUQsZ0VBQThDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCB7IHZhbGlkYXRlRW52aXJvbm1lbnQgfSBmcm9tIFwiLi92YWxpZGF0ZUVudmlyb25tZW50XCI7XG52YWxpZGF0ZUVudmlyb25tZW50KCk7XG5cbmV4cG9ydCAqIGZyb20gXCIuL3Rva2Vuc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGVycmFmb3JtLXN0YWNrXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90ZXJyYWZvcm0tZWxlbWVudFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGVycmFmb3JtLW1vZHVsZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGVycmFmb3JtLXByb3ZpZGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90ZXJyYWZvcm0tcmVzb3VyY2VcIjtcbi8vIG5hbWVkIGV4cG9ydDogb25seSB0aGUgZW51bSBpcyBwdWJsaWMgQVBJLCB0aGUgY29uc3RyYWludC9sYWJlbCBtYXBzIHN0YXkgaW50ZXJuYWxcbmV4cG9ydCB7IFByb3ZpZGVyRmVhdHVyZSB9IGZyb20gXCIuL3Byb3ZpZGVyLWZlYXR1cmUtY29uc3RyYWludHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RlcnJhZm9ybS1kYXRhLXNvdXJjZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGVycmFmb3JtLWVwaGVtZXJhbC1yZXNvdXJjZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGVycmFmb3JtLW91dHB1dFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29tcGxleC1jb21wdXRlZC1saXN0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZXNvdXJjZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGVzdGluZ1wiO1xuZXhwb3J0ICogYXMgdGVzdGluZ01hdGNoZXJzIGZyb20gXCIuL3Rlc3RpbmcvbWF0Y2hlcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2FwcFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGVycmFmb3JtLWJhY2tlbmRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2JhY2tlbmRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90ZXJyYWZvcm0tcmVtb3RlLXN0YXRlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90ZXJyYWZvcm0tbG9jYWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RlcnJhZm9ybS12YXJpYWJsZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGVycmFmb3JtLWhjbC1tb2R1bGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3J1bnRpbWVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RlcnJhZm9ybS1kZXBlbmRhYmxlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tYW5pZmVzdFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGVycmFmb3JtLWFzc2V0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zeW50aGVzaXplXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hbm5vdGF0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vYXNwZWN0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi90ZXJyYWZvcm0tZnVuY3Rpb25zXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90ZXJyYWZvcm0tb3BlcmF0b3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90ZkV4cHJlc3Npb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RlcnJhZm9ybS1hZGRyZXNzYWJsZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGVycmFmb3JtLWl0ZXJhdG9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90ZXJyYWZvcm0tcHJvdmlzaW9uZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RlcnJhZm9ybS1jb25kaXRpb25zXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90ZXJyYWZvcm0tY291bnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ltcG9ydGFibGUtcmVzb3VyY2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RlcnJhZm9ybS1yZXNvdXJjZS10YXJnZXRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91cGdyYWRlLWlkLWFzcGVjdFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGVycmFmb3JtLWRhdGEtcmVzb3VyY2VcIjtcbi8vIHJlcXVpcmVkIGZvciBKU0lJIGJlY2F1c2UgRm4gZXh0ZW5kcyBmcm9tIGl0XG5leHBvcnQgKiBmcm9tIFwiLi9mdW5jdGlvbnMvdGVycmFmb3JtLWZ1bmN0aW9ucy5nZW5lcmF0ZWRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Z1bmN0aW9ucy9wcm92aWRlci1mdW5jdGlvblwiO1xuIl19
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0JBQStCO0FBQy9CLG1DQUFtQztBQUNuQywrREFBNEQ7QUFDNUQsSUFBQSx5Q0FBbUIsR0FBRSxDQUFDO0FBRXRCLDJDQUF5QjtBQUN6QixvREFBa0M7QUFDbEMsc0RBQW9DO0FBQ3BDLHFEQUFtQztBQUNuQyx1REFBcUM7QUFDckMsdURBQXFDO0FBQ3JDLHFGQUFxRjtBQUNyRiwrRUFBaUU7QUFBeEQsK0hBQUEsZUFBZSxPQUFBO0FBQ3hCLDBEQUF3QztBQUN4QyxpRUFBK0M7QUFDL0MscURBQW1DO0FBQ25DLDBEQUF3QztBQUN4Qyw2Q0FBMkI7QUFDM0IsNENBQTBCO0FBQzFCLHNFQUFzRDtBQUN0RCx3Q0FBc0I7QUFDdEIsc0RBQW9DO0FBQ3BDLDZDQUEyQjtBQUMzQiwyREFBeUM7QUFDekMsb0RBQWtDO0FBQ2xDLHVEQUFxQztBQUNyQyx5REFBdUM7QUFDdkMsNENBQTBCO0FBQzFCLHlEQUF1QztBQUN2Qyw2Q0FBMkI7QUFDM0Isb0RBQWtDO0FBQ2xDLCtDQUE2QjtBQUM3QixnREFBOEI7QUFDOUIsMkNBQXlCO0FBQ3pCLHdEQUFzQztBQUN0Qyx3REFBc0M7QUFDdEMsaURBQStCO0FBQy9CLDBEQUF3QztBQUN4Qyx1REFBcUM7QUFDckMsMERBQXdDO0FBQ3hDLHlEQUF1QztBQUN2QyxvREFBa0M7QUFDbEMsd0RBQXNDO0FBQ3RDLCtEQUE2QztBQUM3QyxzREFBb0M7QUFDcEMsNERBQTBDO0FBQzFDLDJDQUF5QjtBQUN6QixvREFBa0M7QUFDbEMsK0NBQTZCO0FBQzdCLGtEQUFnQztBQUNoQywrQ0FBK0M7QUFDL0MsNEVBQTBEO0FBQzFELGdFQUE4QyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG5pbXBvcnQgeyB2YWxpZGF0ZUVudmlyb25tZW50IH0gZnJvbSBcIi4vdmFsaWRhdGVFbnZpcm9ubWVudFwiO1xudmFsaWRhdGVFbnZpcm9ubWVudCgpO1xuXG5leHBvcnQgKiBmcm9tIFwiLi90b2tlbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RlcnJhZm9ybS1zdGFja1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGVycmFmb3JtLWVsZW1lbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RlcnJhZm9ybS1tb2R1bGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RlcnJhZm9ybS1wcm92aWRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGVycmFmb3JtLXJlc291cmNlXCI7XG4vLyBuYW1lZCBleHBvcnQ6IG9ubHkgdGhlIGVudW0gaXMgcHVibGljIEFQSSwgdGhlIGNvbnN0cmFpbnQvbGFiZWwgbWFwcyBzdGF5IGludGVybmFsXG5leHBvcnQgeyBQcm92aWRlckZlYXR1cmUgfSBmcm9tIFwiLi9wcm92aWRlci1mZWF0dXJlLWNvbnN0cmFpbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90ZXJyYWZvcm0tZGF0YS1zb3VyY2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RlcnJhZm9ybS1lcGhlbWVyYWwtcmVzb3VyY2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RlcnJhZm9ybS1vdXRwdXRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbXBsZXgtY29tcHV0ZWQtbGlzdFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmVzb3VyY2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Rlc3RpbmdcIjtcbmV4cG9ydCAqIGFzIHRlc3RpbmdNYXRjaGVycyBmcm9tIFwiLi90ZXN0aW5nL21hdGNoZXJzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hcHBcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RlcnJhZm9ybS1iYWNrZW5kXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9iYWNrZW5kc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGVycmFmb3JtLXJlbW90ZS1zdGF0ZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGVycmFmb3JtLWxvY2FsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90ZXJyYWZvcm0tdmFyaWFibGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RlcnJhZm9ybS1oY2wtbW9kdWxlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9ydW50aW1lXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90ZXJyYWZvcm0tZGVwZW5kYWJsZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbWFuaWZlc3RcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RlcnJhZm9ybS1hc3NldFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3ludGhlc2l6ZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vYW5ub3RhdGlvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2FzcGVjdFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGVycmFmb3JtLWZ1bmN0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGVycmFmb3JtLW9wZXJhdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGZFeHByZXNzaW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90ZXJyYWZvcm0tYWRkcmVzc2FibGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RlcnJhZm9ybS1pdGVyYXRvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGVycmFmb3JtLXByb3Zpc2lvbmVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90ZXJyYWZvcm0tY29uZGl0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGVycmFmb3JtLWNvdW50XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9pbXBvcnRhYmxlLXJlc291cmNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90ZXJyYWZvcm0tcmVzb3VyY2UtdGFyZ2V0c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXBncmFkZS1pZC1hc3BlY3RcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RlcnJhZm9ybS1kYXRhLXJlc291cmNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hc3NldHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2lnbm9yZS1zdHJhdGVneVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vYXNzZXQtaGFzaFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vYXNzZXQtc3RhZ2luZ1wiO1xuLy8gcmVxdWlyZWQgZm9yIEpTSUkgYmVjYXVzZSBGbiBleHRlbmRzIGZyb20gaXRcbmV4cG9ydCAqIGZyb20gXCIuL2Z1bmN0aW9ucy90ZXJyYWZvcm0tZnVuY3Rpb25zLmdlbmVyYXRlZFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZnVuY3Rpb25zL3Byb3ZpZGVyLWZ1bmN0aW9uXCI7XG4iXX0=
package/lib/manifest.js CHANGED
@@ -48,7 +48,7 @@ class Manifest {
48
48
  version;
49
49
  outdir;
50
50
  hclOutput;
51
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.Manifest", version: "0.25.0-pre.9" };
51
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.Manifest", version: "0.25.0" };
52
52
  static fileName = "manifest.json";
53
53
  static stacksFolder = "stacks";
54
54
  static stackMetadataPath = "metadata.json";