aws-cdk 2.1004.0 → 2.1006.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 (207) hide show
  1. package/THIRD_PARTY_LICENSES +31 -31
  2. package/build-info.json +2 -2
  3. package/db.json.gz +0 -0
  4. package/lib/api/aws-auth/account-cache.d.ts +1 -1
  5. package/lib/api/aws-auth/account-cache.js +1 -1
  6. package/lib/api/aws-auth/awscli-compatible.d.ts +1 -1
  7. package/lib/api/aws-auth/awscli-compatible.js +9 -10
  8. package/lib/api/aws-auth/credential-plugins.d.ts +1 -1
  9. package/lib/api/aws-auth/credential-plugins.js +6 -7
  10. package/lib/api/aws-auth/provider-caching.d.ts +1 -1
  11. package/lib/api/aws-auth/provider-caching.js +1 -1
  12. package/lib/api/aws-auth/sdk-logger.d.ts +2 -2
  13. package/lib/api/aws-auth/sdk-logger.js +3 -4
  14. package/lib/api/aws-auth/sdk-provider.d.ts +4 -4
  15. package/lib/api/aws-auth/sdk-provider.js +11 -13
  16. package/lib/api/aws-auth/sdk.d.ts +12 -12
  17. package/lib/api/aws-auth/sdk.js +8 -9
  18. package/lib/api/aws-auth/tracing.js +3 -4
  19. package/lib/api/aws-auth/user-agent.js +4 -5
  20. package/lib/api/bootstrap/bootstrap-environment.d.ts +2 -2
  21. package/lib/api/bootstrap/bootstrap-environment.js +42 -46
  22. package/lib/api/bootstrap/bootstrap-props.d.ts +3 -3
  23. package/lib/api/bootstrap/bootstrap-props.js +1 -1
  24. package/lib/api/bootstrap/deploy-bootstrap.d.ts +4 -4
  25. package/lib/api/bootstrap/deploy-bootstrap.js +11 -14
  26. package/lib/api/bootstrap/legacy-template.d.ts +1 -1
  27. package/lib/api/bootstrap/legacy-template.js +1 -1
  28. package/lib/api/{evaluate-cloudformation-template.d.ts → cloudformation/evaluate-cloudformation-template.d.ts} +10 -9
  29. package/lib/api/cloudformation/evaluate-cloudformation-template.js +440 -0
  30. package/lib/api/cloudformation/index.d.ts +4 -0
  31. package/lib/api/cloudformation/index.js +21 -0
  32. package/lib/api/{deployments → cloudformation}/nested-stack-helpers.d.ts +1 -1
  33. package/lib/api/cloudformation/nested-stack-helpers.js +86 -0
  34. package/lib/api/cloudformation/stack-helpers.d.ts +96 -0
  35. package/lib/api/cloudformation/stack-helpers.js +158 -0
  36. package/lib/api/{util → cloudformation}/template-body-parameter.d.ts +4 -3
  37. package/lib/api/cloudformation/template-body-parameter.js +104 -0
  38. package/lib/api/context.js +3 -3
  39. package/lib/api/cxapp/cloud-assembly.js +13 -15
  40. package/lib/api/cxapp/cloud-executable.d.ts +3 -3
  41. package/lib/api/cxapp/cloud-executable.js +4 -5
  42. package/lib/api/cxapp/environments.d.ts +3 -3
  43. package/lib/api/cxapp/environments.js +4 -4
  44. package/lib/api/cxapp/exec.d.ts +4 -4
  45. package/lib/api/cxapp/exec.js +20 -23
  46. package/lib/api/deployments/asset-publishing.d.ts +2 -4
  47. package/lib/api/deployments/asset-publishing.js +24 -31
  48. package/lib/api/deployments/assets.d.ts +3 -3
  49. package/lib/api/deployments/assets.js +12 -13
  50. package/lib/api/deployments/{cloudformation.d.ts → cfn-api.d.ts} +5 -102
  51. package/lib/api/deployments/cfn-api.js +438 -0
  52. package/lib/api/deployments/checks.d.ts +2 -2
  53. package/lib/api/deployments/checks.js +12 -13
  54. package/lib/api/deployments/deploy-stack.d.ts +6 -7
  55. package/lib/api/deployments/deploy-stack.js +69 -80
  56. package/lib/api/deployments/deployment-result.js +3 -3
  57. package/lib/api/deployments/deployments.d.ts +7 -7
  58. package/lib/api/deployments/deployments.js +35 -42
  59. package/lib/api/deployments/hotswap-deployments.d.ts +7 -5
  60. package/lib/api/deployments/hotswap-deployments.js +160 -82
  61. package/lib/api/deployments/index.d.ts +0 -2
  62. package/lib/api/deployments/index.js +1 -3
  63. package/lib/api/environment/environment-access.d.ts +6 -6
  64. package/lib/api/environment/environment-access.js +18 -20
  65. package/lib/api/environment/environment-resources.d.ts +1 -1
  66. package/lib/api/environment/environment-resources.js +17 -19
  67. package/lib/api/environment/index.d.ts +1 -0
  68. package/lib/api/environment/index.js +2 -1
  69. package/lib/api/environment/placeholders.js +23 -0
  70. package/lib/api/garbage-collection/garbage-collector.d.ts +4 -4
  71. package/lib/api/garbage-collection/garbage-collector.js +57 -67
  72. package/lib/api/garbage-collection/progress-printer.d.ts +2 -2
  73. package/lib/api/garbage-collection/progress-printer.js +7 -7
  74. package/lib/api/garbage-collection/stack-refresh.d.ts +2 -2
  75. package/lib/api/garbage-collection/stack-refresh.js +12 -15
  76. package/lib/api/hotswap/appsync-mapping-templates.d.ts +4 -3
  77. package/lib/api/hotswap/appsync-mapping-templates.js +32 -27
  78. package/lib/api/hotswap/code-build-projects.d.ts +4 -3
  79. package/lib/api/hotswap/code-build-projects.js +19 -12
  80. package/lib/api/hotswap/common.d.ts +27 -64
  81. package/lib/api/hotswap/common.js +40 -82
  82. package/lib/api/hotswap/ecs-services.d.ts +4 -3
  83. package/lib/api/hotswap/ecs-services.js +44 -25
  84. package/lib/api/hotswap/lambda-functions.d.ts +4 -3
  85. package/lib/api/hotswap/lambda-functions.js +61 -75
  86. package/lib/api/hotswap/s3-bucket-deployments.d.ts +5 -9
  87. package/lib/api/hotswap/s3-bucket-deployments.js +26 -21
  88. package/lib/api/hotswap/stepfunctions-state-machines.d.ts +4 -3
  89. package/lib/api/hotswap/stepfunctions-state-machines.js +15 -9
  90. package/lib/api/logs/find-cloudwatch-logs.d.ts +1 -1
  91. package/lib/api/logs/find-cloudwatch-logs.js +7 -9
  92. package/lib/api/logs/logs-monitor.d.ts +2 -2
  93. package/lib/api/logs/logs-monitor.js +5 -8
  94. package/lib/api/plugin/plugin.js +6 -10
  95. package/lib/api/resource-import/importer.d.ts +10 -5
  96. package/lib/api/resource-import/importer.js +23 -29
  97. package/lib/api/resource-import/migrator.d.ts +4 -4
  98. package/lib/api/resource-import/migrator.js +6 -6
  99. package/lib/api/settings.d.ts +0 -3
  100. package/lib/api/settings.js +4 -40
  101. package/lib/api/stack-events/stack-activity-monitor.d.ts +1 -2
  102. package/lib/api/stack-events/stack-activity-monitor.js +14 -37
  103. package/lib/api/stack-events/stack-event-poller.js +9 -10
  104. package/lib/api/stack-events/stack-progress-monitor.d.ts +1 -1
  105. package/lib/api/stack-events/stack-progress-monitor.js +1 -1
  106. package/lib/api/toolkit-info.d.ts +3 -3
  107. package/lib/api/toolkit-info.js +20 -24
  108. package/lib/{tree.d.ts → api/tree.d.ts} +3 -3
  109. package/lib/api/tree.js +37 -0
  110. package/lib/api/util/rwlock.js +4 -4
  111. package/lib/api/work-graph/work-graph-builder.d.ts +2 -2
  112. package/lib/api/work-graph/work-graph-builder.js +4 -4
  113. package/lib/api/work-graph/work-graph-types.d.ts +2 -2
  114. package/lib/api/work-graph/work-graph-types.js +1 -1
  115. package/lib/api/work-graph/work-graph.d.ts +2 -2
  116. package/lib/api/work-graph/work-graph.js +13 -15
  117. package/lib/cli/activity-printer/base.d.ts +3 -3
  118. package/lib/cli/activity-printer/base.js +6 -8
  119. package/lib/cli/activity-printer/current.d.ts +2 -1
  120. package/lib/cli/activity-printer/current.js +7 -11
  121. package/lib/cli/activity-printer/history.d.ts +2 -1
  122. package/lib/cli/activity-printer/history.js +2 -3
  123. package/lib/cli/cdk-toolkit.d.ts +9 -15
  124. package/lib/cli/cdk-toolkit.js +90 -73
  125. package/lib/cli/ci-systems.d.ts +29 -0
  126. package/lib/cli/ci-systems.js +61 -0
  127. package/lib/cli/cli-config.js +3 -3
  128. package/lib/cli/cli.d.ts +1 -1
  129. package/lib/cli/cli.js +69 -52
  130. package/lib/cli/convert-to-user-input.js +110 -111
  131. package/lib/{toolkit → cli/io-host}/cli-io-host.d.ts +22 -3
  132. package/lib/cli/io-host/cli-io-host.js +356 -0
  133. package/lib/cli/io-host/index.d.ts +1 -0
  134. package/lib/{toolkit/error.js → cli/io-host/index.js} +2 -2
  135. package/lib/cli/messages.d.ts +2 -2
  136. package/lib/cli/messages.js +2 -3
  137. package/lib/cli/parse-command-line-arguments.js +1 -1
  138. package/lib/cli/pretty-print-error.d.ts +1 -0
  139. package/lib/cli/pretty-print-error.js +35 -0
  140. package/lib/cli/root-dir.js +4 -4
  141. package/lib/cli/user-configuration.js +57 -14
  142. package/lib/cli/user-input.js +1 -1
  143. package/lib/cli/util/npm.js +3 -3
  144. package/lib/cli/util/yargs-helpers.d.ts +1 -1
  145. package/lib/cli/util/yargs-helpers.js +3 -3
  146. package/lib/cli/version.js +4 -4
  147. package/lib/commands/context.d.ts +1 -1
  148. package/lib/commands/context.js +7 -8
  149. package/lib/commands/diff.d.ts +50 -0
  150. package/lib/commands/diff.js +215 -0
  151. package/lib/commands/init/index.d.ts +1 -0
  152. package/lib/commands/init/index.js +18 -0
  153. package/lib/commands/init/init-hooks.js +63 -0
  154. package/lib/commands/init/init.js +435 -0
  155. package/lib/{os.js → commands/init/os.js} +4 -4
  156. package/lib/{list-stacks.d.ts → commands/list-stacks.d.ts} +1 -1
  157. package/lib/{list-stacks.js → commands/list-stacks.js} +2 -2
  158. package/lib/commands/migrate.d.ts +1 -1
  159. package/lib/commands/migrate.js +29 -32
  160. package/lib/context-providers/ami.d.ts +4 -2
  161. package/lib/context-providers/ami.js +8 -8
  162. package/lib/context-providers/availability-zones.d.ts +4 -2
  163. package/lib/context-providers/availability-zones.js +4 -4
  164. package/lib/context-providers/cc-api-provider.d.ts +9 -13
  165. package/lib/context-providers/cc-api-provider.js +88 -66
  166. package/lib/context-providers/endpoint-service-availability-zones.d.ts +4 -2
  167. package/lib/context-providers/endpoint-service-availability-zones.js +6 -6
  168. package/lib/context-providers/hosted-zones.d.ts +5 -3
  169. package/lib/context-providers/hosted-zones.js +11 -11
  170. package/lib/context-providers/index.d.ts +22 -8
  171. package/lib/context-providers/index.js +35 -17
  172. package/lib/context-providers/keys.d.ts +4 -2
  173. package/lib/context-providers/keys.js +8 -8
  174. package/lib/context-providers/load-balancers.d.ts +3 -3
  175. package/lib/context-providers/load-balancers.js +15 -18
  176. package/lib/context-providers/security-groups.js +10 -12
  177. package/lib/context-providers/ssm-parameters.d.ts +4 -2
  178. package/lib/context-providers/ssm-parameters.js +7 -7
  179. package/lib/context-providers/vpcs.d.ts +4 -2
  180. package/lib/context-providers/vpcs.js +14 -15
  181. package/lib/index.js +115212 -114237
  182. package/lib/init-templates/.init-version.json +1 -1
  183. package/lib/init-templates/.recommended-feature-flags.json +2 -1
  184. package/lib/legacy-exports-source.d.ts +4 -5
  185. package/lib/legacy-exports-source.js +6 -7
  186. package/lib/legacy-logging-source.js +1 -1
  187. package/lib/logging.d.ts +3 -3
  188. package/lib/logging.js +38 -36
  189. package/lib/notices.d.ts +22 -18
  190. package/lib/notices.js +67 -73
  191. package/package.json +18 -20
  192. package/lib/api/deployments/cloudformation.js +0 -597
  193. package/lib/api/deployments/nested-stack-helpers.js +0 -88
  194. package/lib/api/evaluate-cloudformation-template.js +0 -443
  195. package/lib/api/util/placeholders.js +0 -24
  196. package/lib/api/util/template-body-parameter.js +0 -103
  197. package/lib/diff.d.ts +0 -28
  198. package/lib/diff.js +0 -165
  199. package/lib/init-hooks.js +0 -63
  200. package/lib/init.js +0 -437
  201. package/lib/toolkit/cli-io-host.js +0 -324
  202. package/lib/toolkit/error.d.ts +0 -1
  203. package/lib/tree.js +0 -40
  204. /package/lib/api/{util → environment}/placeholders.d.ts +0 -0
  205. /package/lib/{init-hooks.d.ts → commands/init/init-hooks.d.ts} +0 -0
  206. /package/lib/{init.d.ts → commands/init/init.d.ts} +0 -0
  207. /package/lib/{os.d.ts → commands/init/os.d.ts} +0 -0
@@ -79,4 +79,4 @@ function legacyBootstrapTemplate(params) {
79
79
  },
80
80
  };
81
81
  }
82
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVnYWN5LXRlbXBsYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibGVnYWN5LXRlbXBsYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsMERBNEVDO0FBOUVELHVEQUEyRztBQUUzRyxTQUFnQix1QkFBdUIsQ0FBQyxNQUErQjtJQUNyRSxPQUFPO1FBQ0wsV0FBVyxFQUFFLDZJQUE2STtRQUMxSixVQUFVLEVBQUU7WUFDVixpQ0FBaUMsRUFBRTtnQkFDakMsWUFBWSxFQUFFO29CQUNaLE1BQU0sQ0FBQyw4QkFBOEIsSUFBSSxNQUFNLENBQUMsOEJBQThCLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU87b0JBQy9HLE1BQU07aUJBQ1A7YUFDRjtTQUNGO1FBQ0QsU0FBUyxFQUFFO1lBQ1QsYUFBYSxFQUFFO2dCQUNiLElBQUksRUFBRSxpQkFBaUI7Z0JBQ3ZCLFVBQVUsRUFBRTtvQkFDVixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7b0JBQzdCLGFBQWEsRUFBRSxTQUFTO29CQUN4QixnQkFBZ0IsRUFBRTt3QkFDaEIsaUNBQWlDLEVBQUUsQ0FBQztnQ0FDbEMsNkJBQTZCLEVBQUU7b0NBQzdCLFlBQVksRUFBRSxTQUFTO29DQUN2QixjQUFjLEVBQUUsTUFBTSxDQUFDLFFBQVE7aUNBQ2hDOzZCQUNGLENBQUM7cUJBQ0g7b0JBQ0QsOEJBQThCLEVBQUU7d0JBQzlCLFFBQVEsRUFBRTs0QkFDUixtQ0FBbUM7NEJBQ25DO2dDQUNFLGVBQWUsRUFBRSxJQUFJO2dDQUNyQixpQkFBaUIsRUFBRSxJQUFJO2dDQUN2QixnQkFBZ0IsRUFBRSxJQUFJO2dDQUN0QixxQkFBcUIsRUFBRSxJQUFJOzZCQUM1Qjs0QkFDRCxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUU7eUJBQ3hCO3FCQUNGO2lCQUNGO2FBQ0Y7WUFDRCxtQkFBbUIsRUFBRTtnQkFDbkIsSUFBSSxFQUFFLHVCQUF1QjtnQkFDN0IsVUFBVSxFQUFFO29CQUNWLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUU7b0JBQ2hDLGNBQWMsRUFBRTt3QkFDZCxFQUFFLEVBQUUsZUFBZTt3QkFDbkIsT0FBTyxFQUFFLFlBQVk7d0JBQ3JCLFNBQVMsRUFBRTs0QkFDVDtnQ0FDRSxHQUFHLEVBQUUsc0JBQXNCO2dDQUMzQixNQUFNLEVBQUUsTUFBTTtnQ0FDZCxNQUFNLEVBQUUsTUFBTTtnQ0FDZCxRQUFRLEVBQUU7b0NBQ1IsRUFBRSxTQUFTLEVBQUUsc0JBQXNCLEVBQUU7b0NBQ3JDLEVBQUUsU0FBUyxFQUFFLHdCQUF3QixFQUFFO2lDQUN4QztnQ0FDRCxTQUFTLEVBQUU7b0NBQ1QsSUFBSSxFQUFFLEVBQUUscUJBQXFCLEVBQUUsT0FBTyxFQUFFO2lDQUN6QztnQ0FDRCxTQUFTLEVBQUUsR0FBRzs2QkFDZjt5QkFDRjtxQkFDRjtpQkFDRjthQUNGO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUCxDQUFDLG9DQUFrQixDQUFDLEVBQUU7Z0JBQ3BCLFdBQVcsRUFBRSwwREFBMEQ7Z0JBQ3ZFLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUU7YUFDaEM7WUFDRCxDQUFDLDJDQUF5QixDQUFDLEVBQUU7Z0JBQzNCLFdBQVcsRUFBRSxpRUFBaUU7Z0JBQzlFLEtBQUssRUFBRSxFQUFFLFlBQVksRUFBRSxDQUFDLGVBQWUsRUFBRSxvQkFBb0IsQ0FBQyxFQUFFO2FBQ2pFO1NBQ0Y7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJvb3RzdHJhcHBpbmdQYXJhbWV0ZXJzLCBCVUNLRVRfRE9NQUlOX05BTUVfT1VUUFVULCBCVUNLRVRfTkFNRV9PVVRQVVQgfSBmcm9tICcuL2Jvb3RzdHJhcC1wcm9wcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBsZWdhY3lCb290c3RyYXBUZW1wbGF0ZShwYXJhbXM6IEJvb3RzdHJhcHBpbmdQYXJhbWV0ZXJzKTogYW55IHtcbiAgcmV0dXJuIHtcbiAgICBEZXNjcmlwdGlvbjogJ1RoZSBDREsgVG9vbGtpdCBTdGFjay4gSXQgd2FzIGNyZWF0ZWQgYnkgYGNkayBib290c3RyYXBgIGFuZCBtYW5hZ2VzIHJlc291cmNlcyBuZWNlc3NhcnkgZm9yIG1hbmFnaW5nIHlvdXIgQ2xvdWQgQXBwbGljYXRpb25zIHdpdGggQVdTIENESy4nLFxuICAgIENvbmRpdGlvbnM6IHtcbiAgICAgIFVzZVB1YmxpY0FjY2Vzc0Jsb2NrQ29uZmlndXJhdGlvbjoge1xuICAgICAgICAnRm46OkVxdWFscyc6IFtcbiAgICAgICAgICBwYXJhbXMucHVibGljQWNjZXNzQmxvY2tDb25maWd1cmF0aW9uIHx8IHBhcmFtcy5wdWJsaWNBY2Nlc3NCbG9ja0NvbmZpZ3VyYXRpb24gPT09IHVuZGVmaW5lZCA/ICd0cnVlJyA6ICdmYWxzZScsXG4gICAgICAgICAgJ3RydWUnLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIFJlc291cmNlczoge1xuICAgICAgU3RhZ2luZ0J1Y2tldDoge1xuICAgICAgICBUeXBlOiAnQVdTOjpTMzo6QnVja2V0JyxcbiAgICAgICAgUHJvcGVydGllczoge1xuICAgICAgICAgIEJ1Y2tldE5hbWU6IHBhcmFtcy5idWNrZXROYW1lLFxuICAgICAgICAgIEFjY2Vzc0NvbnRyb2w6ICdQcml2YXRlJyxcbiAgICAgICAgICBCdWNrZXRFbmNyeXB0aW9uOiB7XG4gICAgICAgICAgICBTZXJ2ZXJTaWRlRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb246IFt7XG4gICAgICAgICAgICAgIFNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgU1NFQWxnb3JpdGhtOiAnYXdzOmttcycsXG4gICAgICAgICAgICAgICAgS01TTWFzdGVyS2V5SUQ6IHBhcmFtcy5rbXNLZXlJZCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgUHVibGljQWNjZXNzQmxvY2tDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICAnRm46OklmJzogW1xuICAgICAgICAgICAgICAnVXNlUHVibGljQWNjZXNzQmxvY2tDb25maWd1cmF0aW9uJyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEJsb2NrUHVibGljQWNsczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBCbG9ja1B1YmxpY1BvbGljeTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBJZ25vcmVQdWJsaWNBY2xzOiB0cnVlLFxuICAgICAgICAgICAgICAgIFJlc3RyaWN0UHVibGljQnVja2V0czogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgeyBSZWY6ICdBV1M6Ok5vVmFsdWUnIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgU3RhZ2luZ0J1Y2tldFBvbGljeToge1xuICAgICAgICBUeXBlOiAnQVdTOjpTMzo6QnVja2V0UG9saWN5JyxcbiAgICAgICAgUHJvcGVydGllczoge1xuICAgICAgICAgIEJ1Y2tldDogeyBSZWY6ICdTdGFnaW5nQnVja2V0JyB9LFxuICAgICAgICAgIFBvbGljeURvY3VtZW50OiB7XG4gICAgICAgICAgICBJZDogJ0FjY2Vzc0NvbnRyb2wnLFxuICAgICAgICAgICAgVmVyc2lvbjogJzIwMTItMTAtMTcnLFxuICAgICAgICAgICAgU3RhdGVtZW50OiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBTaWQ6ICdBbGxvd1NTTFJlcXVlc3RzT25seScsXG4gICAgICAgICAgICAgICAgQWN0aW9uOiAnczM6KicsXG4gICAgICAgICAgICAgICAgRWZmZWN0OiAnRGVueScsXG4gICAgICAgICAgICAgICAgUmVzb3VyY2U6IFtcbiAgICAgICAgICAgICAgICAgIHsgJ0ZuOjpTdWInOiAnJHtTdGFnaW5nQnVja2V0LkFybn0nIH0sXG4gICAgICAgICAgICAgICAgICB7ICdGbjo6U3ViJzogJyR7U3RhZ2luZ0J1Y2tldC5Bcm59LyonIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBDb25kaXRpb246IHtcbiAgICAgICAgICAgICAgICAgIEJvb2w6IHsgJ2F3czpTZWN1cmVUcmFuc3BvcnQnOiAnZmFsc2UnIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBQcmluY2lwYWw6ICcqJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBPdXRwdXRzOiB7XG4gICAgICBbQlVDS0VUX05BTUVfT1VUUFVUXToge1xuICAgICAgICBEZXNjcmlwdGlvbjogJ1RoZSBuYW1lIG9mIHRoZSBTMyBidWNrZXQgb3duZWQgYnkgdGhlIENESyB0b29sa2l0IHN0YWNrJyxcbiAgICAgICAgVmFsdWU6IHsgUmVmOiAnU3RhZ2luZ0J1Y2tldCcgfSxcbiAgICAgIH0sXG4gICAgICBbQlVDS0VUX0RPTUFJTl9OQU1FX09VVFBVVF06IHtcbiAgICAgICAgRGVzY3JpcHRpb246ICdUaGUgZG9tYWluIG5hbWUgb2YgdGhlIFMzIGJ1Y2tldCBvd25lZCBieSB0aGUgQ0RLIHRvb2xraXQgc3RhY2snLFxuICAgICAgICBWYWx1ZTogeyAnRm46OkdldEF0dCc6IFsnU3RhZ2luZ0J1Y2tldCcsICdSZWdpb25hbERvbWFpbk5hbWUnXSB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuIl19
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVnYWN5LXRlbXBsYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibGVnYWN5LXRlbXBsYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0EsMERBNEVDO0FBOUVELHVEQUFrRjtBQUVsRixTQUFnQix1QkFBdUIsQ0FBQyxNQUErQjtJQUNyRSxPQUFPO1FBQ0wsV0FBVyxFQUFFLDZJQUE2STtRQUMxSixVQUFVLEVBQUU7WUFDVixpQ0FBaUMsRUFBRTtnQkFDakMsWUFBWSxFQUFFO29CQUNaLE1BQU0sQ0FBQyw4QkFBOEIsSUFBSSxNQUFNLENBQUMsOEJBQThCLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU87b0JBQy9HLE1BQU07aUJBQ1A7YUFDRjtTQUNGO1FBQ0QsU0FBUyxFQUFFO1lBQ1QsYUFBYSxFQUFFO2dCQUNiLElBQUksRUFBRSxpQkFBaUI7Z0JBQ3ZCLFVBQVUsRUFBRTtvQkFDVixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7b0JBQzdCLGFBQWEsRUFBRSxTQUFTO29CQUN4QixnQkFBZ0IsRUFBRTt3QkFDaEIsaUNBQWlDLEVBQUUsQ0FBQztnQ0FDbEMsNkJBQTZCLEVBQUU7b0NBQzdCLFlBQVksRUFBRSxTQUFTO29DQUN2QixjQUFjLEVBQUUsTUFBTSxDQUFDLFFBQVE7aUNBQ2hDOzZCQUNGLENBQUM7cUJBQ0g7b0JBQ0QsOEJBQThCLEVBQUU7d0JBQzlCLFFBQVEsRUFBRTs0QkFDUixtQ0FBbUM7NEJBQ25DO2dDQUNFLGVBQWUsRUFBRSxJQUFJO2dDQUNyQixpQkFBaUIsRUFBRSxJQUFJO2dDQUN2QixnQkFBZ0IsRUFBRSxJQUFJO2dDQUN0QixxQkFBcUIsRUFBRSxJQUFJOzZCQUM1Qjs0QkFDRCxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUU7eUJBQ3hCO3FCQUNGO2lCQUNGO2FBQ0Y7WUFDRCxtQkFBbUIsRUFBRTtnQkFDbkIsSUFBSSxFQUFFLHVCQUF1QjtnQkFDN0IsVUFBVSxFQUFFO29CQUNWLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUU7b0JBQ2hDLGNBQWMsRUFBRTt3QkFDZCxFQUFFLEVBQUUsZUFBZTt3QkFDbkIsT0FBTyxFQUFFLFlBQVk7d0JBQ3JCLFNBQVMsRUFBRTs0QkFDVDtnQ0FDRSxHQUFHLEVBQUUsc0JBQXNCO2dDQUMzQixNQUFNLEVBQUUsTUFBTTtnQ0FDZCxNQUFNLEVBQUUsTUFBTTtnQ0FDZCxRQUFRLEVBQUU7b0NBQ1IsRUFBRSxTQUFTLEVBQUUsc0JBQXNCLEVBQUU7b0NBQ3JDLEVBQUUsU0FBUyxFQUFFLHdCQUF3QixFQUFFO2lDQUN4QztnQ0FDRCxTQUFTLEVBQUU7b0NBQ1QsSUFBSSxFQUFFLEVBQUUscUJBQXFCLEVBQUUsT0FBTyxFQUFFO2lDQUN6QztnQ0FDRCxTQUFTLEVBQUUsR0FBRzs2QkFDZjt5QkFDRjtxQkFDRjtpQkFDRjthQUNGO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUCxDQUFDLG9DQUFrQixDQUFDLEVBQUU7Z0JBQ3BCLFdBQVcsRUFBRSwwREFBMEQ7Z0JBQ3ZFLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUU7YUFDaEM7WUFDRCxDQUFDLDJDQUF5QixDQUFDLEVBQUU7Z0JBQzNCLFdBQVcsRUFBRSxpRUFBaUU7Z0JBQzlFLEtBQUssRUFBRSxFQUFFLFlBQVksRUFBRSxDQUFDLGVBQWUsRUFBRSxvQkFBb0IsQ0FBQyxFQUFFO2FBQ2pFO1NBQ0Y7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQm9vdHN0cmFwcGluZ1BhcmFtZXRlcnMgfSBmcm9tICcuL2Jvb3RzdHJhcC1wcm9wcyc7XG5pbXBvcnQgeyBCVUNLRVRfRE9NQUlOX05BTUVfT1VUUFVULCBCVUNLRVRfTkFNRV9PVVRQVVQgfSBmcm9tICcuL2Jvb3RzdHJhcC1wcm9wcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBsZWdhY3lCb290c3RyYXBUZW1wbGF0ZShwYXJhbXM6IEJvb3RzdHJhcHBpbmdQYXJhbWV0ZXJzKTogYW55IHtcbiAgcmV0dXJuIHtcbiAgICBEZXNjcmlwdGlvbjogJ1RoZSBDREsgVG9vbGtpdCBTdGFjay4gSXQgd2FzIGNyZWF0ZWQgYnkgYGNkayBib290c3RyYXBgIGFuZCBtYW5hZ2VzIHJlc291cmNlcyBuZWNlc3NhcnkgZm9yIG1hbmFnaW5nIHlvdXIgQ2xvdWQgQXBwbGljYXRpb25zIHdpdGggQVdTIENESy4nLFxuICAgIENvbmRpdGlvbnM6IHtcbiAgICAgIFVzZVB1YmxpY0FjY2Vzc0Jsb2NrQ29uZmlndXJhdGlvbjoge1xuICAgICAgICAnRm46OkVxdWFscyc6IFtcbiAgICAgICAgICBwYXJhbXMucHVibGljQWNjZXNzQmxvY2tDb25maWd1cmF0aW9uIHx8IHBhcmFtcy5wdWJsaWNBY2Nlc3NCbG9ja0NvbmZpZ3VyYXRpb24gPT09IHVuZGVmaW5lZCA/ICd0cnVlJyA6ICdmYWxzZScsXG4gICAgICAgICAgJ3RydWUnLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIFJlc291cmNlczoge1xuICAgICAgU3RhZ2luZ0J1Y2tldDoge1xuICAgICAgICBUeXBlOiAnQVdTOjpTMzo6QnVja2V0JyxcbiAgICAgICAgUHJvcGVydGllczoge1xuICAgICAgICAgIEJ1Y2tldE5hbWU6IHBhcmFtcy5idWNrZXROYW1lLFxuICAgICAgICAgIEFjY2Vzc0NvbnRyb2w6ICdQcml2YXRlJyxcbiAgICAgICAgICBCdWNrZXRFbmNyeXB0aW9uOiB7XG4gICAgICAgICAgICBTZXJ2ZXJTaWRlRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb246IFt7XG4gICAgICAgICAgICAgIFNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgU1NFQWxnb3JpdGhtOiAnYXdzOmttcycsXG4gICAgICAgICAgICAgICAgS01TTWFzdGVyS2V5SUQ6IHBhcmFtcy5rbXNLZXlJZCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgUHVibGljQWNjZXNzQmxvY2tDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICAnRm46OklmJzogW1xuICAgICAgICAgICAgICAnVXNlUHVibGljQWNjZXNzQmxvY2tDb25maWd1cmF0aW9uJyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEJsb2NrUHVibGljQWNsczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBCbG9ja1B1YmxpY1BvbGljeTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBJZ25vcmVQdWJsaWNBY2xzOiB0cnVlLFxuICAgICAgICAgICAgICAgIFJlc3RyaWN0UHVibGljQnVja2V0czogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgeyBSZWY6ICdBV1M6Ok5vVmFsdWUnIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgU3RhZ2luZ0J1Y2tldFBvbGljeToge1xuICAgICAgICBUeXBlOiAnQVdTOjpTMzo6QnVja2V0UG9saWN5JyxcbiAgICAgICAgUHJvcGVydGllczoge1xuICAgICAgICAgIEJ1Y2tldDogeyBSZWY6ICdTdGFnaW5nQnVja2V0JyB9LFxuICAgICAgICAgIFBvbGljeURvY3VtZW50OiB7XG4gICAgICAgICAgICBJZDogJ0FjY2Vzc0NvbnRyb2wnLFxuICAgICAgICAgICAgVmVyc2lvbjogJzIwMTItMTAtMTcnLFxuICAgICAgICAgICAgU3RhdGVtZW50OiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBTaWQ6ICdBbGxvd1NTTFJlcXVlc3RzT25seScsXG4gICAgICAgICAgICAgICAgQWN0aW9uOiAnczM6KicsXG4gICAgICAgICAgICAgICAgRWZmZWN0OiAnRGVueScsXG4gICAgICAgICAgICAgICAgUmVzb3VyY2U6IFtcbiAgICAgICAgICAgICAgICAgIHsgJ0ZuOjpTdWInOiAnJHtTdGFnaW5nQnVja2V0LkFybn0nIH0sXG4gICAgICAgICAgICAgICAgICB7ICdGbjo6U3ViJzogJyR7U3RhZ2luZ0J1Y2tldC5Bcm59LyonIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBDb25kaXRpb246IHtcbiAgICAgICAgICAgICAgICAgIEJvb2w6IHsgJ2F3czpTZWN1cmVUcmFuc3BvcnQnOiAnZmFsc2UnIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBQcmluY2lwYWw6ICcqJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBPdXRwdXRzOiB7XG4gICAgICBbQlVDS0VUX05BTUVfT1VUUFVUXToge1xuICAgICAgICBEZXNjcmlwdGlvbjogJ1RoZSBuYW1lIG9mIHRoZSBTMyBidWNrZXQgb3duZWQgYnkgdGhlIENESyB0b29sa2l0IHN0YWNrJyxcbiAgICAgICAgVmFsdWU6IHsgUmVmOiAnU3RhZ2luZ0J1Y2tldCcgfSxcbiAgICAgIH0sXG4gICAgICBbQlVDS0VUX0RPTUFJTl9OQU1FX09VVFBVVF06IHtcbiAgICAgICAgRGVzY3JpcHRpb246ICdUaGUgZG9tYWluIG5hbWUgb2YgdGhlIFMzIGJ1Y2tldCBvd25lZCBieSB0aGUgQ0RLIHRvb2xraXQgc3RhY2snLFxuICAgICAgICBWYWx1ZTogeyAnRm46OkdldEF0dCc6IFsnU3RhZ2luZ0J1Y2tldCcsICdSZWdpb25hbERvbWFpbk5hbWUnXSB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuIl19
@@ -1,6 +1,9 @@
1
+ import type { CloudFormationStackArtifact } from '@aws-cdk/cx-api';
1
2
  import type { Export, StackResourceSummary } from '@aws-sdk/client-cloudformation';
2
- import type { SDK } from './aws-auth';
3
- import type { NestedStackTemplates } from './deployments';
3
+ import type { SDK } from '../aws-auth';
4
+ import type { NestedStackTemplates } from './nested-stack-helpers';
5
+ import type { Template } from './stack-helpers';
6
+ import type { ResourceMetadata } from '../../../../@aws-cdk/tmp-toolkit-helpers/src/api/resource-metadata';
4
7
  export interface ListStackResources {
5
8
  listStackResources(): Promise<StackResourceSummary[]>;
6
9
  }
@@ -33,8 +36,9 @@ export interface ResourceDefinition {
33
36
  };
34
37
  }
35
38
  export interface EvaluateCloudFormationTemplateProps {
36
- readonly stackName: string;
37
- readonly template: Template;
39
+ readonly stackArtifact: CloudFormationStackArtifact;
40
+ readonly stackName?: string;
41
+ readonly template?: Template;
38
42
  readonly parameters: {
39
43
  [parameterName: string]: string;
40
44
  };
@@ -47,6 +51,7 @@ export interface EvaluateCloudFormationTemplateProps {
47
51
  };
48
52
  }
49
53
  export declare class EvaluateCloudFormationTemplate {
54
+ readonly stackArtifact: CloudFormationStackArtifact;
50
55
  private readonly stackName;
51
56
  private readonly template;
52
57
  private readonly context;
@@ -68,6 +73,7 @@ export declare class EvaluateCloudFormationTemplate {
68
73
  findReferencesTo(logicalId: string): Array<ResourceDefinition>;
69
74
  evaluateCfnExpression(cfnExpression: any): Promise<any>;
70
75
  getResourceProperty(logicalId: string, propertyName: string): any;
76
+ metadataFor(logicalId: string): ResourceMetadata | undefined;
71
77
  private references;
72
78
  private parseIntrinsic;
73
79
  private findRefTarget;
@@ -77,8 +83,3 @@ export declare class EvaluateCloudFormationTemplate {
77
83
  private getServiceOfResource;
78
84
  private getResourceTypeArnPartOfResource;
79
85
  }
80
- export type Template = {
81
- [section: string]: {
82
- [headings: string]: any;
83
- };
84
- };
@@ -0,0 +1,440 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EvaluateCloudFormationTemplate = exports.CfnEvaluationException = exports.LazyLookupExport = exports.LookupExportError = exports.LazyListStackResources = void 0;
4
+ const api_1 = require("../../../../@aws-cdk/tmp-toolkit-helpers/src/api");
5
+ const resource_metadata_1 = require("../../../../@aws-cdk/tmp-toolkit-helpers/src/api/resource-metadata");
6
+ class LazyListStackResources {
7
+ constructor(sdk, stackName) {
8
+ this.sdk = sdk;
9
+ this.stackName = stackName;
10
+ }
11
+ async listStackResources() {
12
+ if (this.stackResources === undefined) {
13
+ this.stackResources = this.sdk.cloudFormation().listStackResources({
14
+ StackName: this.stackName,
15
+ });
16
+ }
17
+ return this.stackResources;
18
+ }
19
+ }
20
+ exports.LazyListStackResources = LazyListStackResources;
21
+ class LookupExportError extends Error {
22
+ }
23
+ exports.LookupExportError = LookupExportError;
24
+ class LazyLookupExport {
25
+ constructor(sdk) {
26
+ this.sdk = sdk;
27
+ this.cachedExports = {};
28
+ }
29
+ async lookupExport(name) {
30
+ if (this.cachedExports[name]) {
31
+ return this.cachedExports[name];
32
+ }
33
+ for await (const cfnExport of this.listExports()) {
34
+ if (!cfnExport.Name) {
35
+ continue; // ignore any result that omits a name
36
+ }
37
+ this.cachedExports[cfnExport.Name] = cfnExport;
38
+ if (cfnExport.Name === name) {
39
+ return cfnExport;
40
+ }
41
+ }
42
+ return undefined; // export not found
43
+ }
44
+ // TODO: Paginate
45
+ async *listExports() {
46
+ let nextToken = undefined;
47
+ while (true) {
48
+ const response = await this.sdk.cloudFormation().listExports({ NextToken: nextToken });
49
+ for (const cfnExport of response.Exports ?? []) {
50
+ yield cfnExport;
51
+ }
52
+ if (!response.NextToken) {
53
+ return;
54
+ }
55
+ nextToken = response.NextToken;
56
+ }
57
+ }
58
+ }
59
+ exports.LazyLookupExport = LazyLookupExport;
60
+ class CfnEvaluationException extends Error {
61
+ }
62
+ exports.CfnEvaluationException = CfnEvaluationException;
63
+ class EvaluateCloudFormationTemplate {
64
+ constructor(props) {
65
+ this.stackArtifact = props.stackArtifact;
66
+ this.stackName = props.stackName ?? props.stackArtifact.stackName;
67
+ this.template = props.template ?? props.stackArtifact.template;
68
+ this.context = {
69
+ 'AWS::AccountId': props.account,
70
+ 'AWS::Region': props.region,
71
+ 'AWS::Partition': props.partition,
72
+ ...props.parameters,
73
+ };
74
+ this.account = props.account;
75
+ this.region = props.region;
76
+ this.partition = props.partition;
77
+ this.sdk = props.sdk;
78
+ // We need names of nested stack so we can evaluate cross stack references
79
+ this.nestedStacks = props.nestedStacks ?? {};
80
+ // The current resources of the Stack.
81
+ // We need them to figure out the physical name of a resource in case it wasn't specified by the user.
82
+ // We fetch it lazily, to save a service call, in case all hotswapped resources have their physical names set.
83
+ this.stackResources = new LazyListStackResources(this.sdk, this.stackName);
84
+ // CloudFormation Exports lookup to be able to resolve Fn::ImportValue intrinsics in template
85
+ this.lookupExport = new LazyLookupExport(this.sdk);
86
+ }
87
+ // clones current EvaluateCloudFormationTemplate object, but updates the stack name
88
+ async createNestedEvaluateCloudFormationTemplate(stackName, nestedTemplate, nestedStackParameters) {
89
+ const evaluatedParams = await this.evaluateCfnExpression(nestedStackParameters);
90
+ return new EvaluateCloudFormationTemplate({
91
+ stackArtifact: this.stackArtifact,
92
+ stackName,
93
+ template: nestedTemplate,
94
+ parameters: evaluatedParams,
95
+ account: this.account,
96
+ region: this.region,
97
+ partition: this.partition,
98
+ sdk: this.sdk,
99
+ nestedStacks: this.nestedStacks,
100
+ });
101
+ }
102
+ async establishResourcePhysicalName(logicalId, physicalNameInCfnTemplate) {
103
+ if (physicalNameInCfnTemplate != null) {
104
+ try {
105
+ return await this.evaluateCfnExpression(physicalNameInCfnTemplate);
106
+ }
107
+ catch (e) {
108
+ // If we can't evaluate the resource's name CloudFormation expression,
109
+ // just look it up in the currently deployed Stack
110
+ if (!(e instanceof CfnEvaluationException)) {
111
+ throw e;
112
+ }
113
+ }
114
+ }
115
+ return this.findPhysicalNameFor(logicalId);
116
+ }
117
+ async findPhysicalNameFor(logicalId) {
118
+ const stackResources = await this.stackResources.listStackResources();
119
+ return stackResources.find((sr) => sr.LogicalResourceId === logicalId)?.PhysicalResourceId;
120
+ }
121
+ async findLogicalIdForPhysicalName(physicalName) {
122
+ const stackResources = await this.stackResources.listStackResources();
123
+ return stackResources.find((sr) => sr.PhysicalResourceId === physicalName)?.LogicalResourceId;
124
+ }
125
+ findReferencesTo(logicalId) {
126
+ const ret = new Array();
127
+ for (const [resourceLogicalId, resourceDef] of Object.entries(this.template?.Resources ?? {})) {
128
+ if (logicalId !== resourceLogicalId && this.references(logicalId, resourceDef)) {
129
+ ret.push({
130
+ ...resourceDef,
131
+ LogicalId: resourceLogicalId,
132
+ });
133
+ }
134
+ }
135
+ return ret;
136
+ }
137
+ async evaluateCfnExpression(cfnExpression) {
138
+ const self = this;
139
+ /**
140
+ * Evaluates CloudFormation intrinsic functions
141
+ *
142
+ * Note that supported intrinsic functions are documented in README.md -- please update
143
+ * list of supported functions when adding new evaluations
144
+ *
145
+ * See: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html
146
+ */
147
+ class CfnIntrinsics {
148
+ evaluateIntrinsic(intrinsic) {
149
+ const intrinsicFunc = this[intrinsic.name];
150
+ if (!intrinsicFunc) {
151
+ throw new CfnEvaluationException(`CloudFormation function ${intrinsic.name} is not supported`);
152
+ }
153
+ const argsAsArray = Array.isArray(intrinsic.args) ? intrinsic.args : [intrinsic.args];
154
+ return intrinsicFunc.apply(this, argsAsArray);
155
+ }
156
+ async 'Fn::Join'(separator, args) {
157
+ const evaluatedArgs = await self.evaluateCfnExpression(args);
158
+ return evaluatedArgs.join(separator);
159
+ }
160
+ async 'Fn::Split'(separator, args) {
161
+ const evaluatedArgs = await self.evaluateCfnExpression(args);
162
+ return evaluatedArgs.split(separator);
163
+ }
164
+ async 'Fn::Select'(index, args) {
165
+ const evaluatedArgs = await self.evaluateCfnExpression(args);
166
+ return evaluatedArgs[index];
167
+ }
168
+ async Ref(logicalId) {
169
+ const refTarget = await self.findRefTarget(logicalId);
170
+ if (refTarget) {
171
+ return refTarget;
172
+ }
173
+ else {
174
+ throw new CfnEvaluationException(`Parameter or resource '${logicalId}' could not be found for evaluation`);
175
+ }
176
+ }
177
+ async 'Fn::GetAtt'(logicalId, attributeName) {
178
+ // ToDo handle the 'logicalId.attributeName' form of Fn::GetAtt
179
+ const attrValue = await self.findGetAttTarget(logicalId, attributeName);
180
+ if (attrValue) {
181
+ return attrValue;
182
+ }
183
+ else {
184
+ throw new CfnEvaluationException(`Attribute '${attributeName}' of resource '${logicalId}' could not be found for evaluation`);
185
+ }
186
+ }
187
+ async 'Fn::Sub'(template, explicitPlaceholders) {
188
+ const placeholders = explicitPlaceholders ? await self.evaluateCfnExpression(explicitPlaceholders) : {};
189
+ return asyncGlobalReplace(template, /\${([^}]*)}/g, (key) => {
190
+ if (key in placeholders) {
191
+ return placeholders[key];
192
+ }
193
+ else {
194
+ const splitKey = key.split('.');
195
+ return splitKey.length === 1 ? this.Ref(key) : this['Fn::GetAtt'](splitKey[0], splitKey.slice(1).join('.'));
196
+ }
197
+ });
198
+ }
199
+ async 'Fn::ImportValue'(name) {
200
+ const exported = await self.lookupExport.lookupExport(name);
201
+ if (!exported) {
202
+ throw new CfnEvaluationException(`Export '${name}' could not be found for evaluation`);
203
+ }
204
+ if (!exported.Value) {
205
+ throw new CfnEvaluationException(`Export '${name}' exists without a value`);
206
+ }
207
+ return exported.Value;
208
+ }
209
+ }
210
+ if (cfnExpression == null) {
211
+ return cfnExpression;
212
+ }
213
+ if (Array.isArray(cfnExpression)) {
214
+ // Small arrays in practice
215
+ // eslint-disable-next-line @cdklabs/promiseall-no-unbounded-parallelism
216
+ return Promise.all(cfnExpression.map((expr) => this.evaluateCfnExpression(expr)));
217
+ }
218
+ if (typeof cfnExpression === 'object') {
219
+ const intrinsic = this.parseIntrinsic(cfnExpression);
220
+ if (intrinsic) {
221
+ return new CfnIntrinsics().evaluateIntrinsic(intrinsic);
222
+ }
223
+ else {
224
+ const ret = {};
225
+ for (const [key, val] of Object.entries(cfnExpression)) {
226
+ ret[key] = await this.evaluateCfnExpression(val);
227
+ }
228
+ return ret;
229
+ }
230
+ }
231
+ return cfnExpression;
232
+ }
233
+ getResourceProperty(logicalId, propertyName) {
234
+ return this.template.Resources?.[logicalId]?.Properties?.[propertyName];
235
+ }
236
+ metadataFor(logicalId) {
237
+ return (0, resource_metadata_1.resourceMetadata)(this.stackArtifact, logicalId);
238
+ }
239
+ references(logicalId, templateElement) {
240
+ if (typeof templateElement === 'string') {
241
+ return logicalId === templateElement;
242
+ }
243
+ if (templateElement == null) {
244
+ return false;
245
+ }
246
+ if (Array.isArray(templateElement)) {
247
+ return templateElement.some((el) => this.references(logicalId, el));
248
+ }
249
+ if (typeof templateElement === 'object') {
250
+ return Object.values(templateElement).some((el) => this.references(logicalId, el));
251
+ }
252
+ return false;
253
+ }
254
+ parseIntrinsic(x) {
255
+ const keys = Object.keys(x);
256
+ if (keys.length === 1 && (keys[0].startsWith('Fn::') || keys[0] === 'Ref')) {
257
+ return {
258
+ name: keys[0],
259
+ args: x[keys[0]],
260
+ };
261
+ }
262
+ return undefined;
263
+ }
264
+ async findRefTarget(logicalId) {
265
+ // first, check to see if the Ref is a Parameter who's value we have
266
+ if (logicalId === 'AWS::URLSuffix') {
267
+ if (!this.cachedUrlSuffix) {
268
+ this.cachedUrlSuffix = await this.sdk.getUrlSuffix(this.region);
269
+ }
270
+ return this.cachedUrlSuffix;
271
+ }
272
+ // Try finding the ref in the passed in parameters
273
+ const parameterTarget = this.context[logicalId];
274
+ if (parameterTarget) {
275
+ return parameterTarget;
276
+ }
277
+ // If not in the passed in parameters, see if there is a default value in the template parameter that was not passed in
278
+ const defaultParameterValue = this.template.Parameters?.[logicalId]?.Default;
279
+ if (defaultParameterValue) {
280
+ return defaultParameterValue;
281
+ }
282
+ // if it's not a Parameter, we need to search in the current Stack resources
283
+ return this.findGetAttTarget(logicalId);
284
+ }
285
+ async findGetAttTarget(logicalId, attribute) {
286
+ // Handle case where the attribute is referencing a stack output (used in nested stacks to share parameters)
287
+ // See https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/quickref-cloudformation.html#w2ab1c17c23c19b5
288
+ if (logicalId === 'Outputs' && attribute) {
289
+ return this.evaluateCfnExpression(this.template.Outputs[attribute]?.Value);
290
+ }
291
+ const stackResources = await this.stackResources.listStackResources();
292
+ const foundResource = stackResources.find((sr) => sr.LogicalResourceId === logicalId);
293
+ if (!foundResource) {
294
+ return undefined;
295
+ }
296
+ if (foundResource.ResourceType == 'AWS::CloudFormation::Stack' && attribute?.startsWith('Outputs.')) {
297
+ const dependantStack = this.findNestedStack(logicalId, this.nestedStacks);
298
+ if (!dependantStack || !dependantStack.physicalName) {
299
+ // this is a newly created nested stack and cannot be hotswapped
300
+ return undefined;
301
+ }
302
+ const evaluateCfnTemplate = await this.createNestedEvaluateCloudFormationTemplate(dependantStack.physicalName, dependantStack.generatedTemplate, dependantStack.generatedTemplate.Parameters);
303
+ // Split Outputs.<refName> into 'Outputs' and '<refName>' and recursively call evaluate
304
+ return evaluateCfnTemplate.evaluateCfnExpression({
305
+ 'Fn::GetAtt': attribute.split(/\.(.*)/s),
306
+ });
307
+ }
308
+ // now, we need to format the appropriate identifier depending on the resource type,
309
+ // and the requested attribute name
310
+ return this.formatResourceAttribute(foundResource, attribute);
311
+ }
312
+ findNestedStack(logicalId, nestedStacks) {
313
+ for (const nestedStackLogicalId of Object.keys(nestedStacks)) {
314
+ if (nestedStackLogicalId === logicalId) {
315
+ return nestedStacks[nestedStackLogicalId];
316
+ }
317
+ const checkInNestedChildStacks = this.findNestedStack(logicalId, nestedStacks[nestedStackLogicalId].nestedStackTemplates);
318
+ if (checkInNestedChildStacks)
319
+ return checkInNestedChildStacks;
320
+ }
321
+ return undefined;
322
+ }
323
+ formatResourceAttribute(resource, attribute) {
324
+ const physicalId = resource.PhysicalResourceId;
325
+ // no attribute means Ref expression, for which we use the physical ID directly
326
+ if (!attribute) {
327
+ return physicalId;
328
+ }
329
+ const resourceTypeFormats = RESOURCE_TYPE_ATTRIBUTES_FORMATS[resource.ResourceType];
330
+ if (!resourceTypeFormats) {
331
+ throw new CfnEvaluationException(`We don't support attributes of the '${resource.ResourceType}' resource. This is a CDK limitation. ` +
332
+ 'Please report it at https://github.com/aws/aws-cdk/issues/new/choose');
333
+ }
334
+ const attributeFmtFunc = resourceTypeFormats[attribute];
335
+ if (!attributeFmtFunc) {
336
+ throw new CfnEvaluationException(`We don't support the '${attribute}' attribute of the '${resource.ResourceType}' resource. This is a CDK limitation. ` +
337
+ 'Please report it at https://github.com/aws/aws-cdk/issues/new/choose');
338
+ }
339
+ const service = this.getServiceOfResource(resource);
340
+ const resourceTypeArnPart = this.getResourceTypeArnPartOfResource(resource);
341
+ return attributeFmtFunc({
342
+ partition: this.partition,
343
+ service,
344
+ region: this.region,
345
+ account: this.account,
346
+ resourceType: resourceTypeArnPart,
347
+ resourceName: physicalId,
348
+ });
349
+ }
350
+ getServiceOfResource(resource) {
351
+ return resource.ResourceType.split('::')[1].toLowerCase();
352
+ }
353
+ getResourceTypeArnPartOfResource(resource) {
354
+ const resourceType = resource.ResourceType;
355
+ const specialCaseResourceType = RESOURCE_TYPE_SPECIAL_NAMES[resourceType]?.resourceType;
356
+ return specialCaseResourceType
357
+ ? specialCaseResourceType
358
+ : // this is the default case
359
+ resourceType.split('::')[2].toLowerCase();
360
+ }
361
+ }
362
+ exports.EvaluateCloudFormationTemplate = EvaluateCloudFormationTemplate;
363
+ /**
364
+ * Usually, we deduce the names of the service and the resource type used to format the ARN from the CloudFormation resource type.
365
+ * For a CFN type like AWS::Service::ResourceType, the second segment becomes the service name, and the third the resource type
366
+ * (after converting both of them to lowercase).
367
+ * However, some resource types break this simple convention, and we need to special-case them.
368
+ * This map is for storing those cases.
369
+ */
370
+ const RESOURCE_TYPE_SPECIAL_NAMES = {
371
+ 'AWS::Events::EventBus': {
372
+ resourceType: 'event-bus',
373
+ },
374
+ };
375
+ const RESOURCE_TYPE_ATTRIBUTES_FORMATS = {
376
+ 'AWS::IAM::Role': { Arn: iamArnFmt },
377
+ 'AWS::IAM::User': { Arn: iamArnFmt },
378
+ 'AWS::IAM::Group': { Arn: iamArnFmt },
379
+ 'AWS::S3::Bucket': { Arn: s3ArnFmt },
380
+ 'AWS::Lambda::Function': { Arn: stdColonResourceArnFmt },
381
+ 'AWS::Events::EventBus': {
382
+ Arn: stdSlashResourceArnFmt,
383
+ // the name attribute of the EventBus is the same as the Ref
384
+ Name: (parts) => parts.resourceName,
385
+ },
386
+ 'AWS::DynamoDB::Table': { Arn: stdSlashResourceArnFmt },
387
+ 'AWS::AppSync::GraphQLApi': { ApiId: appsyncGraphQlApiApiIdFmt },
388
+ 'AWS::AppSync::FunctionConfiguration': {
389
+ FunctionId: appsyncGraphQlFunctionIDFmt,
390
+ },
391
+ 'AWS::AppSync::DataSource': { Name: appsyncGraphQlDataSourceNameFmt },
392
+ 'AWS::KMS::Key': { Arn: stdSlashResourceArnFmt },
393
+ };
394
+ function iamArnFmt(parts) {
395
+ // we skip region for IAM resources
396
+ return `arn:${parts.partition}:${parts.service}::${parts.account}:${parts.resourceType}/${parts.resourceName}`;
397
+ }
398
+ function s3ArnFmt(parts) {
399
+ // we skip account, region and resourceType for S3 resources
400
+ return `arn:${parts.partition}:${parts.service}:::${parts.resourceName}`;
401
+ }
402
+ function stdColonResourceArnFmt(parts) {
403
+ // this is a standard format for ARNs like: arn:aws:service:region:account:resourceType:resourceName
404
+ return `arn:${parts.partition}:${parts.service}:${parts.region}:${parts.account}:${parts.resourceType}:${parts.resourceName}`;
405
+ }
406
+ function stdSlashResourceArnFmt(parts) {
407
+ // this is a standard format for ARNs like: arn:aws:service:region:account:resourceType/resourceName
408
+ return `arn:${parts.partition}:${parts.service}:${parts.region}:${parts.account}:${parts.resourceType}/${parts.resourceName}`;
409
+ }
410
+ function appsyncGraphQlApiApiIdFmt(parts) {
411
+ // arn:aws:appsync:us-east-1:111111111111:apis/<apiId>
412
+ return parts.resourceName.split('/')[1];
413
+ }
414
+ function appsyncGraphQlFunctionIDFmt(parts) {
415
+ // arn:aws:appsync:us-east-1:111111111111:apis/<apiId>/functions/<functionId>
416
+ return parts.resourceName.split('/')[3];
417
+ }
418
+ function appsyncGraphQlDataSourceNameFmt(parts) {
419
+ // arn:aws:appsync:us-east-1:111111111111:apis/<apiId>/datasources/<name>
420
+ return parts.resourceName.split('/')[3];
421
+ }
422
+ async function asyncGlobalReplace(str, regex, cb) {
423
+ if (!regex.global) {
424
+ throw new api_1.ToolkitError('Regex must be created with /g flag');
425
+ }
426
+ const ret = new Array();
427
+ let start = 0;
428
+ while (true) {
429
+ const match = regex.exec(str);
430
+ if (!match) {
431
+ break;
432
+ }
433
+ ret.push(str.substring(start, match.index));
434
+ ret.push(await cb(match[1]));
435
+ start = regex.lastIndex;
436
+ }
437
+ ret.push(str.slice(start));
438
+ return ret.join('');
439
+ }
440
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZhbHVhdGUtY2xvdWRmb3JtYXRpb24tdGVtcGxhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJldmFsdWF0ZS1jbG91ZGZvcm1hdGlvbi10ZW1wbGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFLQSwwRUFBZ0Y7QUFDaEYsMEdBQXNHO0FBT3RHLE1BQWEsc0JBQXNCO0lBR2pDLFlBQ21CLEdBQVEsRUFDUixTQUFpQjtRQURqQixRQUFHLEdBQUgsR0FBRyxDQUFLO1FBQ1IsY0FBUyxHQUFULFNBQVMsQ0FBUTtJQUVwQyxDQUFDO0lBRU0sS0FBSyxDQUFDLGtCQUFrQjtRQUM3QixJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDLGtCQUFrQixDQUFDO2dCQUNqRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7YUFDMUIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0NBQ0Y7QUFqQkQsd0RBaUJDO0FBTUQsTUFBYSxpQkFBa0IsU0FBUSxLQUFLO0NBQzNDO0FBREQsOENBQ0M7QUFFRCxNQUFhLGdCQUFnQjtJQUczQixZQUE2QixHQUFRO1FBQVIsUUFBRyxHQUFILEdBQUcsQ0FBSztRQUY3QixrQkFBYSxHQUErQixFQUFFLENBQUM7SUFHdkQsQ0FBQztJQUVELEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBWTtRQUM3QixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM3QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUVELElBQUksS0FBSyxFQUFFLE1BQU0sU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQ2pELElBQUksQ0FB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Q0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBT0QsS0FBSyxVQUFVLGtCQUFrQixDQUFDLEdBQVcsRUFBRSxLQUFhLEVBQUUsRUFBa0M7SUFDOUYsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsQixNQUFNLElBQUksa0JBQVksQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO0lBQ2hDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNkLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDWixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE1BQU07UUFDUixDQUFDO1FBRUQsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUM1QyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFN0IsS0FBSyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQUNELEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBRTNCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN0QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QgfSBmcm9tICdAYXdzLWNkay9jeC1hcGknO1xuaW1wb3J0IHR5cGUgeyBFeHBvcnQsIExpc3RFeHBvcnRzQ29tbWFuZE91dHB1dCwgU3RhY2tSZXNvdXJjZVN1bW1hcnkgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHR5cGUgeyBTREsgfSBmcm9tICcuLi9hd3MtYXV0aCc7XG5pbXBvcnQgdHlwZSB7IE5lc3RlZFN0YWNrVGVtcGxhdGVzIH0gZnJvbSAnLi9uZXN0ZWQtc3RhY2staGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IFRlbXBsYXRlIH0gZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcbmltcG9ydCB7IFRvb2xraXRFcnJvciB9IGZyb20gJy4uLy4uLy4uLy4uL0Bhd3MtY2RrL3RtcC10b29sa2l0LWhlbHBlcnMvc3JjL2FwaSc7XG5pbXBvcnQgeyByZXNvdXJjZU1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vLi4vLi4vQGF3cy1jZGsvdG1wLXRvb2xraXQtaGVscGVycy9zcmMvYXBpL3Jlc291cmNlLW1ldGFkYXRhJztcbmltcG9ydCB0eXBlIHsgUmVzb3VyY2VNZXRhZGF0YSB9IGZyb20gJy4uLy4uLy4uLy4uL0Bhd3MtY2RrL3RtcC10b29sa2l0LWhlbHBlcnMvc3JjL2FwaS9yZXNvdXJjZS1tZXRhZGF0YSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdFN0YWNrUmVzb3VyY2VzIHtcbiAgbGlzdFN0YWNrUmVzb3VyY2VzKCk6IFByb21pc2U8U3RhY2tSZXNvdXJjZVN1bW1hcnlbXT47XG59XG5cbmV4cG9ydCBjbGFzcyBMYXp5TGlzdFN0YWNrUmVzb3VyY2VzIGltcGxlbWVudHMgTGlzdFN0YWNrUmVzb3VyY2VzIHtcbiAgcHJpdmF0ZSBzdGFja1Jlc291cmNlczogUHJvbWlzZTxTdGFja1Jlc291cmNlU3VtbWFyeVtdPiB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNkazogU0RLLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RhY2tOYW1lOiBzdHJpbmcsXG4gICkge1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGxpc3RTdGFja1Jlc291cmNlcygpOiBQcm9taXNlPFN0YWNrUmVzb3VyY2VTdW1tYXJ5W10+IHtcbiAgICBpZiAodGhpcy5zdGFja1Jlc291cmNlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnN0YWNrUmVzb3VyY2VzID0gdGhpcy5zZGsuY2xvdWRGb3JtYXRpb24oKS5saXN0U3RhY2tSZXNvdXJjZXMoe1xuICAgICAgICBTdGFja05hbWU6IHRoaXMuc3RhY2tOYW1lLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YWNrUmVzb3VyY2VzO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9va3VwRXhwb3J0IHtcbiAgbG9va3VwRXhwb3J0KG5hbWU6IHN0cmluZyk6IFByb21pc2U8RXhwb3J0IHwgdW5kZWZpbmVkPjtcbn1cblxuZXhwb3J0IGNsYXNzIExvb2t1cEV4cG9ydEVycm9yIGV4dGVuZHMgRXJyb3Ige1xufVxuXG5leHBvcnQgY2xhc3MgTGF6eUxvb2t1cEV4cG9ydCBpbXBsZW1lbnRzIExvb2t1cEV4cG9ydCB7XG4gIHByaXZhdGUgY2FjaGVkRXhwb3J0czogeyBbbmFtZTogc3RyaW5nXTogRXhwb3J0IH0gPSB7fTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHNkazogU0RLKSB7XG4gIH1cblxuICBhc3luYyBsb29rdXBFeHBvcnQobmFtZTogc3RyaW5nKTogUHJvbWlzZTxFeHBvcnQgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAodGhpcy5jYWNoZWRFeHBvcnRzW25hbWVdKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZWRFeHBvcnRzW25hbWVdO1xuICAgIH1cblxuICAgIGZvciBhd2FpdCAoY29uc3QgY2ZuRXhwb3J0IG9mIHRoaXMubGlzdEV4cG9ydHMoKSkge1xuICAgICAgaWYgKCFjZm5FeHBvcnQuTmFtZSkge1xuICAgICAgICBjb250aW51ZTsgLy8gaWdub3JlIGFueSByZXN1bHQgdGhhdCBvbWl0cyBhIG5hbWVcbiAgICAgIH1cbiAgICAgIHRoaXMuY2FjaGVkRXhwb3J0c1tjZm5FeHBvcnQuTmFtZV0gPSBjZm5FeHBvcnQ7XG5cbiAgICAgIGlmIChjZm5FeHBvcnQuTmFtZSA9PT0gbmFtZSkge1xuICAgICAgICByZXR1cm4gY2ZuRXhwb3J0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIGV4cG9ydCBub3QgZm91bmRcbiAgfVxuXG4gIC8vIFRPRE86IFBhZ2luYXRlXG4gIHByaXZhdGUgYXN5bmMgKmxpc3RFeHBvcnRzKCkge1xuICAgIGxldCBuZXh0VG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgcmVzcG9uc2U6IExpc3RFeHBvcnRzQ29tbWFuZE91dHB1dCA9IGF3YWl0IHRoaXMuc2RrLmNsb3VkRm9ybWF0aW9uKCkubGlzdEV4cG9ydHMoeyBOZXh0VG9rZW46IG5leHRUb2tlbiB9KTtcbiAgICAgIGZvciAoY29uc3QgY2ZuRXhwb3J0IG9mIHJlc3BvbnNlLkV4cG9ydHMgPz8gW10pIHtcbiAgICAgICAgeWllbGQgY2ZuRXhwb3J0O1xuICAgICAgfVxuXG4gICAgICBpZiAoIXJlc3BvbnNlLk5leHRUb2tlbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBuZXh0VG9rZW4gPSByZXNwb25zZS5OZXh0VG9rZW47XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDZm5FdmFsdWF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgRXJyb3Ige1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlRGVmaW5pdGlvbiB7XG4gIHJlYWRvbmx5IExvZ2ljYWxJZDogc3RyaW5nO1xuICByZWFkb25seSBUeXBlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IFByb3BlcnRpZXM6IHsgW3A6IHN0cmluZ106IGFueSB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV2YWx1YXRlQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZVByb3BzIHtcbiAgcmVhZG9ubHkgc3RhY2tBcnRpZmFjdDogQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuICByZWFkb25seSBzdGFja05hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRlbXBsYXRlPzogVGVtcGxhdGU7XG4gIHJlYWRvbmx5IHBhcmFtZXRlcnM6IHsgW3BhcmFtZXRlck5hbWU6IHN0cmluZ106IHN0cmluZyB9O1xuICByZWFkb25seSBhY2NvdW50OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlZ2lvbjogc3RyaW5nO1xuICByZWFkb25seSBwYXJ0aXRpb246IHN0cmluZztcbiAgcmVhZG9ubHkgc2RrOiBTREs7XG4gIHJlYWRvbmx5IG5lc3RlZFN0YWNrcz86IHtcbiAgICBbbmVzdGVkU3RhY2tMb2dpY2FsSWQ6IHN0cmluZ106IE5lc3RlZFN0YWNrVGVtcGxhdGVzO1xuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlIHtcbiAgcHVibGljIHJlYWRvbmx5IHN0YWNrQXJ0aWZhY3Q6IENsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdDtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFja05hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSB0ZW1wbGF0ZTogVGVtcGxhdGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29udGV4dDogeyBbazogc3RyaW5nXTogYW55IH07XG4gIHByaXZhdGUgcmVhZG9ubHkgYWNjb3VudDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lvbjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcnRpdGlvbjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHNkazogU0RLO1xuICBwcml2YXRlIHJlYWRvbmx5IG5lc3RlZFN0YWNrczoge1xuICAgIFtuZXN0ZWRTdGFja0xvZ2ljYWxJZDogc3RyaW5nXTogTmVzdGVkU3RhY2tUZW1wbGF0ZXM7XG4gIH07XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhY2tSZXNvdXJjZXM6IExpc3RTdGFja1Jlc291cmNlcztcbiAgcHJpdmF0ZSByZWFkb25seSBsb29rdXBFeHBvcnQ6IExvb2t1cEV4cG9ydDtcblxuICBwcml2YXRlIGNhY2hlZFVybFN1ZmZpeDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGVQcm9wcykge1xuICAgIHRoaXMuc3RhY2tBcnRpZmFjdCA9IHByb3BzLnN0YWNrQXJ0aWZhY3Q7XG4gICAgdGhpcy5zdGFja05hbWUgPSBwcm9wcy5zdGFja05hbWUgPz8gcHJvcHMuc3RhY2tBcnRpZmFjdC5zdGFja05hbWU7XG4gICAgdGhpcy50ZW1wbGF0ZSA9IHByb3BzLnRlbXBsYXRlID8/IHByb3BzLnN0YWNrQXJ0aWZhY3QudGVtcGxhdGU7XG4gICAgdGhpcy5jb250ZXh0ID0ge1xuICAgICAgJ0FXUzo6QWNjb3VudElkJzogcHJvcHMuYWNjb3VudCxcbiAgICAgICdBV1M6OlJlZ2lvbic6IHByb3BzLnJlZ2lvbixcbiAgICAgICdBV1M6OlBhcnRpdGlvbic6IHByb3BzLnBhcnRpdGlvbixcbiAgICAgIC4uLnByb3BzLnBhcmFtZXRlcnMsXG4gICAgfTtcbiAgICB0aGlzLmFjY291bnQgPSBwcm9wcy5hY2NvdW50O1xuICAgIHRoaXMucmVnaW9uID0gcHJvcHMucmVnaW9uO1xuICAgIHRoaXMucGFydGl0aW9uID0gcHJvcHMucGFydGl0aW9uO1xuICAgIHRoaXMuc2RrID0gcHJvcHMuc2RrO1xuXG4gICAgLy8gV2UgbmVlZCBuYW1lcyBvZiBuZXN0ZWQgc3RhY2sgc28gd2UgY2FuIGV2YWx1YXRlIGNyb3NzIHN0YWNrIHJlZmVyZW5jZXNcbiAgICB0aGlzLm5lc3RlZFN0YWNrcyA9IHByb3BzLm5lc3RlZFN0YWNrcyA/PyB7fTtcblxuICAgIC8vIFRoZSBjdXJyZW50IHJlc291cmNlcyBvZiB0aGUgU3RhY2suXG4gICAgLy8gV2UgbmVlZCB0aGVtIHRvIGZpZ3VyZSBvdXQgdGhlIHBoeXNpY2FsIG5hbWUgb2YgYSByZXNvdXJjZSBpbiBjYXNlIGl0IHdhc24ndCBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuXG4gICAgLy8gV2UgZmV0Y2ggaXQgbGF6aWx5LCB0byBzYXZlIGEgc2VydmljZSBjYWxsLCBpbiBjYXNlIGFsbCBob3Rzd2FwcGVkIHJlc291cmNlcyBoYXZlIHRoZWlyIHBoeXNpY2FsIG5hbWVzIHNldC5cbiAgICB0aGlzLnN0YWNrUmVzb3VyY2VzID0gbmV3IExhenlMaXN0U3RhY2tSZXNvdXJjZXModGhpcy5zZGssIHRoaXMuc3RhY2tOYW1lKTtcblxuICAgIC8vIENsb3VkRm9ybWF0aW9uIEV4cG9ydHMgbG9va3VwIHRvIGJlIGFibGUgdG8gcmVzb2x2ZSBGbjo6SW1wb3J0VmFsdWUgaW50cmluc2ljcyBpbiB0ZW1wbGF0ZVxuICAgIHRoaXMubG9va3VwRXhwb3J0ID0gbmV3IExhenlMb29rdXBFeHBvcnQodGhpcy5zZGspO1xuICB9XG5cbiAgLy8gY2xvbmVzIGN1cnJlbnQgRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlIG9iamVjdCwgYnV0IHVwZGF0ZXMgdGhlIHN0YWNrIG5hbWVcbiAgcHVibGljIGFzeW5jIGNyZWF0ZU5lc3RlZEV2YWx1YXRlQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZShcbiAgICBzdGFja05hbWU6IHN0cmluZyxcbiAgICBuZXN0ZWRUZW1wbGF0ZTogVGVtcGxhdGUsXG4gICAgbmVzdGVkU3RhY2tQYXJhbWV0ZXJzOiB7IFtwYXJhbWV0ZXJOYW1lOiBzdHJpbmddOiBhbnkgfSxcbiAgKSB7XG4gICAgY29uc3QgZXZhbHVhdGVkUGFyYW1zID0gYXdhaXQgdGhpcy5ldmFsdWF0ZUNmbkV4cHJlc3Npb24obmVzdGVkU3RhY2tQYXJhbWV0ZXJzKTtcbiAgICByZXR1cm4gbmV3IEV2YWx1YXRlQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZSh7XG4gICAgICBzdGFja0FydGlmYWN0OiB0aGlzLnN0YWNrQXJ0aWZhY3QsXG4gICAgICBzdGFja05hbWUsXG4gICAgICB0ZW1wbGF0ZTogbmVzdGVkVGVtcGxhdGUsXG4gICAgICBwYXJhbWV0ZXJzOiBldmFsdWF0ZWRQYXJhbXMsXG4gICAgICBhY2NvdW50OiB0aGlzLmFjY291bnQsXG4gICAgICByZWdpb246IHRoaXMucmVnaW9uLFxuICAgICAgcGFydGl0aW9uOiB0aGlzLnBhcnRpdGlvbixcbiAgICAgIHNkazogdGhpcy5zZGssXG4gICAgICBuZXN0ZWRTdGFja3M6IHRoaXMubmVzdGVkU3RhY2tzLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGVzdGFibGlzaFJlc291cmNlUGh5c2ljYWxOYW1lKFxuICAgIGxvZ2ljYWxJZDogc3RyaW5nLFxuICAgIHBoeXNpY2FsTmFtZUluQ2ZuVGVtcGxhdGU6IGFueSxcbiAgKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAocGh5c2ljYWxOYW1lSW5DZm5UZW1wbGF0ZSAhPSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ldmFsdWF0ZUNmbkV4cHJlc3Npb24ocGh5c2ljYWxOYW1lSW5DZm5UZW1wbGF0ZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIElmIHdlIGNhbid0IGV2YWx1YXRlIHRoZSByZXNvdXJjZSdzIG5hbWUgQ2xvdWRGb3JtYXRpb24gZXhwcmVzc2lvbixcbiAgICAgICAgLy8ganVzdCBsb29rIGl0IHVwIGluIHRoZSBjdXJyZW50bHkgZGVwbG95ZWQgU3RhY2tcbiAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIENmbkV2YWx1YXRpb25FeGNlcHRpb24pKSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5maW5kUGh5c2ljYWxOYW1lRm9yKGxvZ2ljYWxJZCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZmluZFBoeXNpY2FsTmFtZUZvcihsb2dpY2FsSWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qgc3RhY2tSZXNvdXJjZXMgPSBhd2FpdCB0aGlzLnN0YWNrUmVzb3VyY2VzLmxpc3RTdGFja1Jlc291cmNlcygpO1xuICAgIHJldHVybiBzdGFja1Jlc291cmNlcy5maW5kKChzcikgPT4gc3IuTG9naWNhbFJlc291cmNlSWQgPT09IGxvZ2ljYWxJZCk/LlBoeXNpY2FsUmVzb3VyY2VJZDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBmaW5kTG9naWNhbElkRm9yUGh5c2ljYWxOYW1lKHBoeXNpY2FsTmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBzdGFja1Jlc291cmNlcyA9IGF3YWl0IHRoaXMuc3RhY2tSZXNvdXJjZXMubGlzdFN0YWNrUmVzb3VyY2VzKCk7XG4gICAgcmV0dXJuIHN0YWNrUmVzb3VyY2VzLmZpbmQoKHNyKSA9PiBzci5QaHlzaWNhbFJlc291cmNlSWQgPT09IHBoeXNpY2FsTmFtZSk/LkxvZ2ljYWxSZXNvdXJjZUlkO1xuICB9XG5cbiAgcHVibGljIGZpbmRSZWZlcmVuY2VzVG8obG9naWNhbElkOiBzdHJpbmcpOiBBcnJheTxSZXNvdXJjZURlZmluaXRpb24+IHtcbiAgICBjb25zdCByZXQgPSBuZXcgQXJyYXk8UmVzb3VyY2VEZWZpbml0aW9uPigpO1xuICAgIGZvciAoY29uc3QgW3Jlc291cmNlTG9naWNhbElkLCByZXNvdXJjZURlZl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy50ZW1wbGF0ZT8uUmVzb3VyY2VzID8/IHt9KSkge1xuICAgICAgaWYgKGxvZ2ljYWxJZCAhPT0gcmVzb3VyY2VMb2dpY2FsSWQgJiYgdGhpcy5yZWZlcmVuY2VzKGxvZ2ljYWxJZCwgcmVzb3VyY2VEZWYpKSB7XG4gICAgICAgIHJldC5wdXNoKHtcbiAgICAgICAgICAuLi4ocmVzb3VyY2VEZWYgYXMgYW55KSxcbiAgICAgICAgICBMb2dpY2FsSWQ6IHJlc291cmNlTG9naWNhbElkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBldmFsdWF0ZUNmbkV4cHJlc3Npb24oY2ZuRXhwcmVzc2lvbjogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAvKipcbiAgICAgKiBFdmFsdWF0ZXMgQ2xvdWRGb3JtYXRpb24gaW50cmluc2ljIGZ1bmN0aW9uc1xuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHN1cHBvcnRlZCBpbnRyaW5zaWMgZnVuY3Rpb25zIGFyZSBkb2N1bWVudGVkIGluIFJFQURNRS5tZCAtLSBwbGVhc2UgdXBkYXRlXG4gICAgICogbGlzdCBvZiBzdXBwb3J0ZWQgZnVuY3Rpb25zIHdoZW4gYWRkaW5nIG5ldyBldmFsdWF0aW9uc1xuICAgICAqXG4gICAgICogU2VlOiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9pbnRyaW5zaWMtZnVuY3Rpb24tcmVmZXJlbmNlLmh0bWxcbiAgICAgKi9cbiAgICBjbGFzcyBDZm5JbnRyaW5zaWNzIHtcbiAgICAgIHB1YmxpYyBldmFsdWF0ZUludHJpbnNpYyhpbnRyaW5zaWM6IEludHJpbnNpYyk6IGFueSB7XG4gICAgICAgIGNvbnN0IGludHJpbnNpY0Z1bmMgPSAodGhpcyBhcyBhbnkpW2ludHJpbnNpYy5uYW1lXTtcbiAgICAgICAgaWYgKCFpbnRyaW5zaWNGdW5jKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IENmbkV2YWx1YXRpb25FeGNlcHRpb24oYENsb3VkRm9ybWF0aW9uIGZ1bmN0aW9uICR7aW50cmluc2ljLm5hbWV9IGlzIG5vdCBzdXBwb3J0ZWRgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFyZ3NBc0FycmF5ID0gQXJyYXkuaXNBcnJheShpbnRyaW5zaWMuYXJncykgPyBpbnRyaW5zaWMuYXJncyA6IFtpbnRyaW5zaWMuYXJnc107XG5cbiAgICAgICAgcmV0dXJuIGludHJpbnNpY0Z1bmMuYXBwbHkodGhpcywgYXJnc0FzQXJyYXkpO1xuICAgICAgfVxuXG4gICAgICBhc3luYyAnRm46OkpvaW4nKHNlcGFyYXRvcjogc3RyaW5nLCBhcmdzOiBhbnlbXSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGV2YWx1YXRlZEFyZ3MgPSBhd2FpdCBzZWxmLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbihhcmdzKTtcbiAgICAgICAgcmV0dXJuIGV2YWx1YXRlZEFyZ3Muam9pbihzZXBhcmF0b3IpO1xuICAgICAgfVxuXG4gICAgICBhc3luYyAnRm46OlNwbGl0JyhzZXBhcmF0b3I6IHN0cmluZywgYXJnczogYW55KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgZXZhbHVhdGVkQXJncyA9IGF3YWl0IHNlbGYuZXZhbHVhdGVDZm5FeHByZXNzaW9uKGFyZ3MpO1xuICAgICAgICByZXR1cm4gZXZhbHVhdGVkQXJncy5zcGxpdChzZXBhcmF0b3IpO1xuICAgICAgfVxuXG4gICAgICBhc3luYyAnRm46OlNlbGVjdCcoaW5kZXg6IG51bWJlciwgYXJnczogYW55W10pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBldmFsdWF0ZWRBcmdzID0gYXdhaXQgc2VsZi5ldmFsdWF0ZUNmbkV4cHJlc3Npb24oYXJncyk7XG4gICAgICAgIHJldHVybiBldmFsdWF0ZWRBcmdzW2luZGV4XTtcbiAgICAgIH1cblxuICAgICAgYXN5bmMgUmVmKGxvZ2ljYWxJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgcmVmVGFyZ2V0ID0gYXdhaXQgc2VsZi5maW5kUmVmVGFyZ2V0KGxvZ2ljYWxJZCk7XG4gICAgICAgIGlmIChyZWZUYXJnZXQpIHtcbiAgICAgICAgICByZXR1cm4gcmVmVGFyZ2V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBDZm5FdmFsdWF0aW9uRXhjZXB0aW9uKGBQYXJhbWV0ZXIgb3IgcmVzb3VyY2UgJyR7bG9naWNhbElkfScgY291bGQgbm90IGJlIGZvdW5kIGZvciBldmFsdWF0aW9uYCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXN5bmMgJ0ZuOjpHZXRBdHQnKGxvZ2ljYWxJZDogc3RyaW5nLCBhdHRyaWJ1dGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICAvLyBUb0RvIGhhbmRsZSB0aGUgJ2xvZ2ljYWxJZC5hdHRyaWJ1dGVOYW1lJyBmb3JtIG9mIEZuOjpHZXRBdHRcbiAgICAgICAgY29uc3QgYXR0clZhbHVlID0gYXdhaXQgc2VsZi5maW5kR2V0QXR0VGFyZ2V0KGxvZ2ljYWxJZCwgYXR0cmlidXRlTmFtZSk7XG4gICAgICAgIGlmIChhdHRyVmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gYXR0clZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBDZm5FdmFsdWF0aW9uRXhjZXB0aW9uKFxuICAgICAgICAgICAgYEF0dHJpYnV0ZSAnJHthdHRyaWJ1dGVOYW1lfScgb2YgcmVzb3VyY2UgJyR7bG9naWNhbElkfScgY291bGQgbm90IGJlIGZvdW5kIGZvciBldmFsdWF0aW9uYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGFzeW5jICdGbjo6U3ViJyh0ZW1wbGF0ZTogc3RyaW5nLCBleHBsaWNpdFBsYWNlaG9sZGVycz86IHsgW3ZhcmlhYmxlOiBzdHJpbmddOiBzdHJpbmcgfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVycyA9IGV4cGxpY2l0UGxhY2Vob2xkZXJzID8gYXdhaXQgc2VsZi5ldmFsdWF0ZUNmbkV4cHJlc3Npb24oZXhwbGljaXRQbGFjZWhvbGRlcnMpIDoge307XG5cbiAgICAgICAgcmV0dXJuIGFzeW5jR2xvYmFsUmVwbGFjZSh0ZW1wbGF0ZSwgL1xcJHsoW159XSopfS9nLCAoa2V5KSA9PiB7XG4gICAgICAgICAgaWYgKGtleSBpbiBwbGFjZWhvbGRlcnMpIHtcbiAgICAgICAgICAgIHJldHVybiBwbGFjZWhvbGRlcnNba2V5XTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc3BsaXRLZXkgPSBrZXkuc3BsaXQoJy4nKTtcbiAgICAgICAgICAgIHJldHVybiBzcGxpdEtleS5sZW5ndGggPT09IDEgPyB0aGlzLlJlZihrZXkpIDogdGhpc1snRm46OkdldEF0dCddKHNwbGl0S2V5WzBdLCBzcGxpdEtleS5zbGljZSgxKS5qb2luKCcuJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGFzeW5jICdGbjo6SW1wb3J0VmFsdWUnKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGV4cG9ydGVkID0gYXdhaXQgc2VsZi5sb29rdXBFeHBvcnQubG9va3VwRXhwb3J0KG5hbWUpO1xuICAgICAgICBpZiAoIWV4cG9ydGVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IENmbkV2YWx1YXRpb25FeGNlcHRpb24oYEV4cG9ydCAnJHtuYW1lfScgY291bGQgbm90IGJlIGZvdW5kIGZvciBldmFsdWF0aW9uYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFleHBvcnRlZC5WYWx1ZSkge1xuICAgICAgICAgIHRocm93IG5ldyBDZm5FdmFsdWF0aW9uRXhjZXB0aW9uKGBFeHBvcnQgJyR7bmFtZX0nIGV4aXN0cyB3aXRob3V0IGEgdmFsdWVgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhwb3J0ZWQuVmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNmbkV4cHJlc3Npb24gPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGNmbkV4cHJlc3Npb247XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY2ZuRXhwcmVzc2lvbikpIHtcbiAgICAgIC8vIFNtYWxsIGFycmF5cyBpbiBwcmFjdGljZVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBjZGtsYWJzL3Byb21pc2VhbGwtbm8tdW5ib3VuZGVkLXBhcmFsbGVsaXNtXG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwoY2ZuRXhwcmVzc2lvbi5tYXAoKGV4cHIpID0+IHRoaXMuZXZhbHVhdGVDZm5FeHByZXNzaW9uKGV4cHIpKSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjZm5FeHByZXNzaW9uID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3QgaW50cmluc2ljID0gdGhpcy5wYXJzZUludHJpbnNpYyhjZm5FeHByZXNzaW9uKTtcbiAgICAgIGlmIChpbnRyaW5zaWMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDZm5JbnRyaW5zaWNzKCkuZXZhbHVhdGVJbnRyaW5zaWMoaW50cmluc2ljKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJldDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgT2JqZWN0LmVudHJpZXMoY2ZuRXhwcmVzc2lvbikpIHtcbiAgICAgICAgICByZXRba2V5XSA9IGF3YWl0IHRoaXMuZXZhbHVhdGVDZm5FeHByZXNzaW9uKHZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2ZuRXhwcmVzc2lvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSZXNvdXJjZVByb3BlcnR5KGxvZ2ljYWxJZDogc3RyaW5nLCBwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGUuUmVzb3VyY2VzPy5bbG9naWNhbElkXT8uUHJvcGVydGllcz8uW3Byb3BlcnR5TmFtZV07XG4gIH1cblxuICBwdWJsaWMgbWV0YWRhdGFGb3IobG9naWNhbElkOiBzdHJpbmcpOiBSZXNvdXJjZU1ldGFkYXRhIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gcmVzb3VyY2VNZXRhZGF0YSh0aGlzLnN0YWNrQXJ0aWZhY3QsIGxvZ2ljYWxJZCk7XG4gIH1cblxuICBwcml2YXRlIHJlZmVyZW5jZXMobG9naWNhbElkOiBzdHJpbmcsIHRlbXBsYXRlRWxlbWVudDogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiB0ZW1wbGF0ZUVsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gbG9naWNhbElkID09PSB0ZW1wbGF0ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgaWYgKHRlbXBsYXRlRWxlbWVudCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGVtcGxhdGVFbGVtZW50KSkge1xuICAgICAgcmV0dXJuIHRlbXBsYXRlRWxlbWVudC5zb21lKChlbCkgPT4gdGhpcy5yZWZlcmVuY2VzKGxvZ2ljYWxJZCwgZWwpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRlbXBsYXRlRWxlbWVudCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRlbXBsYXRlRWxlbWVudCkuc29tZSgoZWwpID0+IHRoaXMucmVmZXJlbmNlcyhsb2dpY2FsSWQsIGVsKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUludHJpbnNpYyh4OiBhbnkpOiBJbnRyaW5zaWMgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh4KTtcbiAgICBpZiAoa2V5cy5sZW5ndGggPT09IDEgJiYgKGtleXNbMF0uc3RhcnRzV2l0aCgnRm46OicpIHx8IGtleXNbMF0gPT09ICdSZWYnKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZToga2V5c1swXSxcbiAgICAgICAgYXJnczogeFtrZXlzWzBdXSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZpbmRSZWZUYXJnZXQobG9naWNhbElkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIGZpcnN0LCBjaGVjayB0byBzZWUgaWYgdGhlIFJlZiBpcyBhIFBhcmFtZXRlciB3aG8ncyB2YWx1ZSB3ZSBoYXZlXG4gICAgaWYgKGxvZ2ljYWxJZCA9PT0gJ0FXUzo6VVJMU3VmZml4Jykge1xuICAgICAgaWYgKCF0aGlzLmNhY2hlZFVybFN1ZmZpeCkge1xuICAgICAgICB0aGlzLmNhY2hlZFVybFN1ZmZpeCA9IGF3YWl0IHRoaXMuc2RrLmdldFVybFN1ZmZpeCh0aGlzLnJlZ2lvbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNhY2hlZFVybFN1ZmZpeDtcbiAgICB9XG5cbiAgICAvLyBUcnkgZmluZGluZyB0aGUgcmVmIGluIHRoZSBwYXNzZWQgaW4gcGFyYW1ldGVyc1xuICAgIGNvbnN0IHBhcmFtZXRlclRhcmdldCA9IHRoaXMuY29udGV4dFtsb2dpY2FsSWRdO1xuICAgIGlmIChwYXJhbWV0ZXJUYXJnZXQpIHtcbiAgICAgIHJldHVybiBwYXJhbWV0ZXJUYXJnZXQ7XG4gICAgfVxuXG4gICAgLy8gSWYgbm90IGluIHRoZSBwYXNzZWQgaW4gcGFyYW1ldGVycywgc2VlIGlmIHRoZXJlIGlzIGEgZGVmYXVsdCB2YWx1ZSBpbiB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIHRoYXQgd2FzIG5vdCBwYXNzZWQgaW5cbiAgICBjb25zdCBkZWZhdWx0UGFyYW1ldGVyVmFsdWUgPSB0aGlzLnRlbXBsYXRlLlBhcmFtZXRlcnM/Lltsb2dpY2FsSWRdPy5EZWZhdWx0O1xuICAgIGlmIChkZWZhdWx0UGFyYW1ldGVyVmFsdWUpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0UGFyYW1ldGVyVmFsdWU7XG4gICAgfVxuXG4gICAgLy8gaWYgaXQncyBub3QgYSBQYXJhbWV0ZXIsIHdlIG5lZWQgdG8gc2VhcmNoIGluIHRoZSBjdXJyZW50IFN0YWNrIHJlc291cmNlc1xuICAgIHJldHVybiB0aGlzLmZpbmRHZXRBdHRUYXJnZXQobG9naWNhbElkKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmluZEdldEF0dFRhcmdldChsb2dpY2FsSWQ6IHN0cmluZywgYXR0cmlidXRlPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICAvLyBIYW5kbGUgY2FzZSB3aGVyZSB0aGUgYXR0cmlidXRlIGlzIHJlZmVyZW5jaW5nIGEgc3RhY2sgb3V0cHV0ICh1c2VkIGluIG5lc3RlZCBzdGFja3MgdG8gc2hhcmUgcGFyYW1ldGVycylcbiAgICAvLyBTZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvcXVpY2tyZWYtY2xvdWRmb3JtYXRpb24uaHRtbCN3MmFiMWMxN2MyM2MxOWI1XG4gICAgaWYgKGxvZ2ljYWxJZCA9PT0gJ091dHB1dHMnICYmIGF0dHJpYnV0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZXZhbHVhdGVDZm5FeHByZXNzaW9uKHRoaXMudGVtcGxhdGUuT3V0cHV0c1thdHRyaWJ1dGVdPy5WYWx1ZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhY2tSZXNvdXJjZXMgPSBhd2FpdCB0aGlzLnN0YWNrUmVzb3VyY2VzLmxpc3RTdGFja1Jlc291cmNlcygpO1xuICAgIGNvbnN0IGZvdW5kUmVzb3VyY2UgPSBzdGFja1Jlc291cmNlcy5maW5kKChzcikgPT4gc3IuTG9naWNhbFJlc291cmNlSWQgPT09IGxvZ2ljYWxJZCk7XG4gICAgaWYgKCFmb3VuZFJlc291cmNlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChmb3VuZFJlc291cmNlLlJlc291cmNlVHlwZSA9PSAnQVdTOjpDbG91ZEZvcm1hdGlvbjo6U3RhY2snICYmIGF0dHJpYnV0ZT8uc3RhcnRzV2l0aCgnT3V0cHV0cy4nKSkge1xuICAgICAgY29uc3QgZGVwZW5kYW50U3RhY2sgPSB0aGlzLmZpbmROZXN0ZWRTdGFjayhsb2dpY2FsSWQsIHRoaXMubmVzdGVkU3RhY2tzKTtcbiAgICAgIGlmICghZGVwZW5kYW50U3RhY2sgfHwgIWRlcGVuZGFudFN0YWNrLnBoeXNpY2FsTmFtZSkge1xuICAgICAgICAvLyB0aGlzIGlzIGEgbmV3bHkgY3JlYXRlZCBuZXN0ZWQgc3RhY2sgYW5kIGNhbm5vdCBiZSBob3Rzd2FwcGVkXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBjb25zdCBldmFsdWF0ZUNmblRlbXBsYXRlID0gYXdhaXQgdGhpcy5jcmVhdGVOZXN0ZWRFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGUoXG4gICAgICAgIGRlcGVuZGFudFN0YWNrLnBoeXNpY2FsTmFtZSxcbiAgICAgICAgZGVwZW5kYW50U3RhY2suZ2VuZXJhdGVkVGVtcGxhdGUsXG4gICAgICAgIGRlcGVuZGFudFN0YWNrLmdlbmVyYXRlZFRlbXBsYXRlLlBhcmFtZXRlcnMhLFxuICAgICAgKTtcblxuICAgICAgLy8gU3BsaXQgT3V0cHV0cy48cmVmTmFtZT4gaW50byAnT3V0cHV0cycgYW5kICc8cmVmTmFtZT4nIGFuZCByZWN1cnNpdmVseSBjYWxsIGV2YWx1YXRlXG4gICAgICByZXR1cm4gZXZhbHVhdGVDZm5UZW1wbGF0ZS5ldmFsdWF0ZUNmbkV4cHJlc3Npb24oe1xuICAgICAgICAnRm46OkdldEF0dCc6IGF0dHJpYnV0ZS5zcGxpdCgvXFwuKC4qKS9zKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBub3csIHdlIG5lZWQgdG8gZm9ybWF0IHRoZSBhcHByb3ByaWF0ZSBpZGVudGlmaWVyIGRlcGVuZGluZyBvbiB0aGUgcmVzb3VyY2UgdHlwZSxcbiAgICAvLyBhbmQgdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGUgbmFtZVxuICAgIHJldHVybiB0aGlzLmZvcm1hdFJlc291cmNlQXR0cmlidXRlKGZvdW5kUmVzb3VyY2UsIGF0dHJpYnV0ZSk7XG4gIH1cblxuICBwcml2YXRlIGZpbmROZXN0ZWRTdGFjayhcbiAgICBsb2dpY2FsSWQ6IHN0cmluZyxcbiAgICBuZXN0ZWRTdGFja3M6IHtcbiAgICAgIFtuZXN0ZWRTdGFja0xvZ2ljYWxJZDogc3RyaW5nXTogTmVzdGVkU3RhY2tUZW1wbGF0ZXM7XG4gICAgfSxcbiAgKTogTmVzdGVkU3RhY2tUZW1wbGF0ZXMgfCB1bmRlZmluZWQge1xuICAgIGZvciAoY29uc3QgbmVzdGVkU3RhY2tMb2dpY2FsSWQgb2YgT2JqZWN0LmtleXMobmVzdGVkU3RhY2tzKSkge1xuICAgICAgaWYgKG5lc3RlZFN0YWNrTG9naWNhbElkID09PSBsb2dpY2FsSWQpIHtcbiAgICAgICAgcmV0dXJuIG5lc3RlZFN0YWNrc1tuZXN0ZWRTdGFja0xvZ2ljYWxJZF07XG4gICAgICB9XG4gICAgICBjb25zdCBjaGVja0luTmVzdGVkQ2hpbGRTdGFja3MgPSB0aGlzLmZpbmROZXN0ZWRTdGFjayhcbiAgICAgICAgbG9naWNhbElkLFxuICAgICAgICBuZXN0ZWRTdGFja3NbbmVzdGVkU3RhY2tMb2dpY2FsSWRdLm5lc3RlZFN0YWNrVGVtcGxhdGVzLFxuICAgICAgKTtcbiAgICAgIGlmIChjaGVja0luTmVzdGVkQ2hpbGRTdGFja3MpIHJldHVybiBjaGVja0luTmVzdGVkQ2hpbGRTdGFja3M7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFJlc291cmNlQXR0cmlidXRlKHJlc291cmNlOiBTdGFja1Jlc291cmNlU3VtbWFyeSwgYXR0cmlidXRlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBoeXNpY2FsSWQgPSByZXNvdXJjZS5QaHlzaWNhbFJlc291cmNlSWQ7XG5cbiAgICAvLyBubyBhdHRyaWJ1dGUgbWVhbnMgUmVmIGV4cHJlc3Npb24sIGZvciB3aGljaCB3ZSB1c2UgdGhlIHBoeXNpY2FsIElEIGRpcmVjdGx5XG4gICAgaWYgKCFhdHRyaWJ1dGUpIHtcbiAgICAgIHJldHVybiBwaHlzaWNhbElkO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc291cmNlVHlwZUZvcm1hdHMgPSBSRVNPVVJDRV9UWVBFX0FUVFJJQlVURVNfRk9STUFUU1tyZXNvdXJjZS5SZXNvdXJjZVR5cGUhXTtcbiAgICBpZiAoIXJlc291cmNlVHlwZUZvcm1hdHMpIHtcbiAgICAgIHRocm93IG5ldyBDZm5FdmFsdWF0aW9uRXhjZXB0aW9uKFxuICAgICAgICBgV2UgZG9uJ3Qgc3VwcG9ydCBhdHRyaWJ1dGVzIG9mIHRoZSAnJHtyZXNvdXJjZS5SZXNvdXJjZVR5cGV9JyByZXNvdXJjZS4gVGhpcyBpcyBhIENESyBsaW1pdGF0aW9uLiBgICtcbiAgICAgICAgICAnUGxlYXNlIHJlcG9ydCBpdCBhdCBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvaXNzdWVzL25ldy9jaG9vc2UnLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgYXR0cmlidXRlRm10RnVuYyA9IHJlc291cmNlVHlwZUZvcm1hdHNbYXR0cmlidXRlXTtcbiAgICBpZiAoIWF0dHJpYnV0ZUZtdEZ1bmMpIHtcbiAgICAgIHRocm93IG5ldyBDZm5FdmFsdWF0aW9uRXhjZXB0aW9uKFxuICAgICAgICBgV2UgZG9uJ3Qgc3VwcG9ydCB0aGUgJyR7YXR0cmlidXRlfScgYXR0cmlidXRlIG9mIHRoZSAnJHtyZXNvdXJjZS5SZXNvdXJjZVR5cGV9JyByZXNvdXJjZS4gVGhpcyBpcyBhIENESyBsaW1pdGF0aW9uLiBgICtcbiAgICAgICAgICAnUGxlYXNlIHJlcG9ydCBpdCBhdCBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvaXNzdWVzL25ldy9jaG9vc2UnLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgc2VydmljZSA9IHRoaXMuZ2V0U2VydmljZU9mUmVzb3VyY2UocmVzb3VyY2UpO1xuICAgIGNvbnN0IHJlc291cmNlVHlwZUFyblBhcnQgPSB0aGlzLmdldFJlc291cmNlVHlwZUFyblBhcnRPZlJlc291cmNlKHJlc291cmNlKTtcbiAgICByZXR1cm4gYXR0cmlidXRlRm10RnVuYyh7XG4gICAgICBwYXJ0aXRpb246IHRoaXMucGFydGl0aW9uLFxuICAgICAgc2VydmljZSxcbiAgICAgIHJlZ2lvbjogdGhpcy5yZWdpb24sXG4gICAgICBhY2NvdW50OiB0aGlzLmFjY291bnQsXG4gICAgICByZXNvdXJjZVR5cGU6IHJlc291cmNlVHlwZUFyblBhcnQsXG4gICAgICByZXNvdXJjZU5hbWU6IHBoeXNpY2FsSWQhLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZXJ2aWNlT2ZSZXNvdXJjZShyZXNvdXJjZTogU3RhY2tSZXNvdXJjZVN1bW1hcnkpOiBzdHJpbmcge1xuICAgIHJldHVybiByZXNvdXJjZS5SZXNvdXJjZVR5cGUhLnNwbGl0KCc6OicpWzFdLnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICBwcml2YXRlIGdldFJlc291cmNlVHlwZUFyblBhcnRPZlJlc291cmNlKHJlc291cmNlOiBTdGFja1Jlc291cmNlU3VtbWFyeSk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVzb3VyY2VUeXBlID0gcmVzb3VyY2UuUmVzb3VyY2VUeXBlITtcbiAgICBjb25zdCBzcGVjaWFsQ2FzZVJlc291cmNlVHlwZSA9IFJFU09VUkNFX1RZUEVfU1BFQ0lBTF9OQU1FU1tyZXNvdXJjZVR5cGVdPy5yZXNvdXJjZVR5cGU7XG4gICAgcmV0dXJuIHNwZWNpYWxDYXNlUmVzb3VyY2VUeXBlXG4gICAgICA/IHNwZWNpYWxDYXNlUmVzb3VyY2VUeXBlXG4gICAgICA6IC8vIHRoaXMgaXMgdGhlIGRlZmF1bHQgY2FzZVxuICAgICAgcmVzb3VyY2VUeXBlLnNwbGl0KCc6OicpWzJdLnRvTG93ZXJDYXNlKCk7XG4gIH1cbn1cblxuaW50ZXJmYWNlIEFyblBhcnRzIHtcbiAgcmVhZG9ubHkgcGFydGl0aW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNlcnZpY2U6IHN0cmluZztcbiAgcmVhZG9ubHkgcmVnaW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFjY291bnQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcmVzb3VyY2VUeXBlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlc291cmNlTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFVzdWFsbHksIHdlIGRlZHVjZSB0aGUgbmFtZXMgb2YgdGhlIHNlcnZpY2UgYW5kIHRoZSByZXNvdXJjZSB0eXBlIHVzZWQgdG8gZm9ybWF0IHRoZSBBUk4gZnJvbSB0aGUgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2UgdHlwZS5cbiAqIEZvciBhIENGTiB0eXBlIGxpa2UgQVdTOjpTZXJ2aWNlOjpSZXNvdXJjZVR5cGUsIHRoZSBzZWNvbmQgc2VnbWVudCBiZWNvbWVzIHRoZSBzZXJ2aWNlIG5hbWUsIGFuZCB0aGUgdGhpcmQgdGhlIHJlc291cmNlIHR5cGVcbiAqIChhZnRlciBjb252ZXJ0aW5nIGJvdGggb2YgdGhlbSB0byBsb3dlcmNhc2UpLlxuICogSG93ZXZlciwgc29tZSByZXNvdXJjZSB0eXBlcyBicmVhayB0aGlzIHNpbXBsZSBjb252ZW50aW9uLCBhbmQgd2UgbmVlZCB0byBzcGVjaWFsLWNhc2UgdGhlbS5cbiAqIFRoaXMgbWFwIGlzIGZvciBzdG9yaW5nIHRob3NlIGNhc2VzLlxuICovXG5jb25zdCBSRVNPVVJDRV9UWVBFX1NQRUNJQUxfTkFNRVM6IHtcbiAgW3R5cGU6IHN0cmluZ106IHsgcmVzb3VyY2VUeXBlOiBzdHJpbmcgfTtcbn0gPSB7XG4gICdBV1M6OkV2ZW50czo6RXZlbnRCdXMnOiB7XG4gICAgcmVzb3VyY2VUeXBlOiAnZXZlbnQtYnVzJyxcbiAgfSxcbn07XG5cbmNvbnN0IFJFU09VUkNFX1RZUEVfQVRUUklCVVRFU19GT1JNQVRTOiB7XG4gIFt0eXBlOiBzdHJpbmddOiB7IFthdHRyaWJ1dGU6IHN0cmluZ106IChwYXJ0czogQXJuUGFydHMpID0+IHN0cmluZyB9O1xufSA9IHtcbiAgJ0FXUzo6SUFNOjpSb2xlJzogeyBBcm46IGlhbUFybkZtdCB9LFxuICAnQVdTOjpJQU06OlVzZXInOiB7IEFybjogaWFtQXJuRm10IH0sXG4gICdBV1M6OklBTTo6R3JvdXAnOiB7IEFybjogaWFtQXJuRm10IH0sXG4gICdBV1M6OlMzOjpCdWNrZXQnOiB7IEFybjogczNBcm5GbXQgfSxcbiAgJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbic6IHsgQXJuOiBzdGRDb2xvblJlc291cmNlQXJuRm10IH0sXG4gICdBV1M6OkV2ZW50czo6RXZlbnRCdXMnOiB7XG4gICAgQXJuOiBzdGRTbGFzaFJlc291cmNlQXJuRm10LFxuICAgIC8vIHRoZSBuYW1lIGF0dHJpYnV0ZSBvZiB0aGUgRXZlbnRCdXMgaXMgdGhlIHNhbWUgYXMgdGhlIFJlZlxuICAgIE5hbWU6IChwYXJ0cykgPT4gcGFydHMucmVzb3VyY2VOYW1lLFxuICB9LFxuICAnQVdTOjpEeW5hbW9EQjo6VGFibGUnOiB7IEFybjogc3RkU2xhc2hSZXNvdXJjZUFybkZtdCB9LFxuICAnQVdTOjpBcHBTeW5jOjpHcmFwaFFMQXBpJzogeyBBcGlJZDogYXBwc3luY0dyYXBoUWxBcGlBcGlJZEZtdCB9LFxuICAnQVdTOjpBcHBTeW5jOjpGdW5jdGlvbkNvbmZpZ3VyYXRpb24nOiB7XG4gICAgRnVuY3Rpb25JZDogYXBwc3luY0dyYXBoUWxGdW5jdGlvbklERm10LFxuICB9LFxuICAnQVdTOjpBcHBTeW5jOjpEYXRhU291cmNlJzogeyBOYW1lOiBhcHBzeW5jR3JhcGhRbERhdGFTb3VyY2VOYW1lRm10IH0sXG4gICdBV1M6OktNUzo6S2V5JzogeyBBcm46IHN0ZFNsYXNoUmVzb3VyY2VBcm5GbXQgfSxcbn07XG5cbmZ1bmN0aW9uIGlhbUFybkZtdChwYXJ0czogQXJuUGFydHMpOiBzdHJpbmcge1xuICAvLyB3ZSBza2lwIHJlZ2lvbiBmb3IgSUFNIHJlc291cmNlc1xuICByZXR1cm4gYGFybjoke3BhcnRzLnBhcnRpdGlvbn06JHtwYXJ0cy5zZXJ2aWNlfTo6JHtwYXJ0cy5hY2NvdW50fToke3BhcnRzLnJlc291cmNlVHlwZX0vJHtwYXJ0cy5yZXNvdXJjZU5hbWV9YDtcbn1cblxuZnVuY3Rpb24gczNBcm5GbXQocGFydHM6IEFyblBhcnRzKTogc3RyaW5nIHtcbiAgLy8gd2Ugc2tpcCBhY2NvdW50LCByZWdpb24gYW5kIHJlc291cmNlVHlwZSBmb3IgUzMgcmVzb3VyY2VzXG4gIHJldHVybiBgYXJuOiR7cGFydHMucGFydGl0aW9ufToke3BhcnRzLnNlcnZpY2V9Ojo6JHtwYXJ0cy5yZXNvdXJjZU5hbWV9YDtcbn1cblxuZnVuY3Rpb24gc3RkQ29sb25SZXNvdXJjZUFybkZtdChwYXJ0czogQXJuUGFydHMpOiBzdHJpbmcge1xuICAvLyB0aGlzIGlzIGEgc3RhbmRhcmQgZm9ybWF0IGZvciBBUk5zIGxpa2U6IGFybjphd3M6c2VydmljZTpyZWdpb246YWNjb3VudDpyZXNvdXJjZVR5cGU6cmVzb3VyY2VOYW1lXG4gIHJldHVybiBgYXJuOiR7cGFydHMucGFydGl0aW9ufToke3BhcnRzLnNlcnZpY2V9OiR7cGFydHMucmVnaW9ufToke3BhcnRzLmFjY291bnR9OiR7cGFydHMucmVzb3VyY2VUeXBlfToke3BhcnRzLnJlc291cmNlTmFtZX1gO1xufVxuXG5mdW5jdGlvbiBzdGRTbGFzaFJlc291cmNlQXJuRm10KHBhcnRzOiBBcm5QYXJ0cyk6IHN0cmluZyB7XG4gIC8vIHRoaXMgaXMgYSBzdGFuZGFyZCBmb3JtYXQgZm9yIEFSTnMgbGlrZTogYXJuOmF3czpzZXJ2aWNlOnJlZ2lvbjphY2NvdW50OnJlc291cmNlVHlwZS9yZXNvdXJjZU5hbWVcbiAgcmV0dXJuIGBhcm46JHtwYXJ0cy5wYXJ0aXRpb259OiR7cGFydHMuc2VydmljZX06JHtwYXJ0cy5yZWdpb259OiR7cGFydHMuYWNjb3VudH06JHtwYXJ0cy5yZXNvdXJjZVR5cGV9LyR7cGFydHMucmVzb3VyY2VOYW1lfWA7XG59XG5cbmZ1bmN0aW9uIGFwcHN5bmNHcmFwaFFsQXBpQXBpSWRGbXQocGFydHM6IEFyblBhcnRzKTogc3RyaW5nIHtcbiAgLy8gYXJuOmF3czphcHBzeW5jOnVzLWVhc3QtMToxMTExMTExMTExMTE6YXBpcy88YXBpSWQ+XG4gIHJldHVybiBwYXJ0cy5yZXNvdXJjZU5hbWUuc3BsaXQoJy8nKVsxXTtcbn1cblxuZnVuY3Rpb24gYXBwc3luY0dyYXBoUWxGdW5jdGlvbklERm10KHBhcnRzOiBBcm5QYXJ0cyk6IHN0cmluZyB7XG4gIC8vIGFybjphd3M6YXBwc3luYzp1cy1lYXN0LTE6MTExMTExMTExMTExOmFwaXMvPGFwaUlkPi9mdW5jdGlvbnMvPGZ1bmN0aW9uSWQ+XG4gIHJldHVybiBwYXJ0cy5yZXNvdXJjZU5hbWUuc3BsaXQoJy8nKVszXTtcbn1cblxuZnVuY3Rpb24gYXBwc3luY0dyYXBoUWxEYXRhU291cmNlTmFtZUZtdChwYXJ0czogQXJuUGFydHMpOiBzdHJpbmcge1xuICAvLyBhcm46YXdzOmFwcHN5bmM6dXMtZWFzdC0xOjExMTExMTExMTExMTphcGlzLzxhcGlJZD4vZGF0YXNvdXJjZXMvPG5hbWU+XG4gIHJldHVybiBwYXJ0cy5yZXNvdXJjZU5hbWUuc3BsaXQoJy8nKVszXTtcbn1cblxuaW50ZXJmYWNlIEludHJpbnNpYyB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgYXJnczogYW55O1xufVxuXG5hc3luYyBmdW5jdGlvbiBhc3luY0dsb2JhbFJlcGxhY2Uoc3RyOiBzdHJpbmcsIHJlZ2V4OiBSZWdFeHAsIGNiOiAoeDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZz4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoIXJlZ2V4Lmdsb2JhbCkge1xuICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ1JlZ2V4IG11c3QgYmUgY3JlYXRlZCB3aXRoIC9nIGZsYWcnKTtcbiAgfVxuXG4gIGNvbnN0IHJldCA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gIGxldCBzdGFydCA9IDA7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgbWF0Y2ggPSByZWdleC5leGVjKHN0cik7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0LnB1c2goc3RyLnN1YnN0cmluZyhzdGFydCwgbWF0Y2guaW5kZXgpKTtcbiAgICByZXQucHVzaChhd2FpdCBjYihtYXRjaFsxXSkpO1xuXG4gICAgc3RhcnQgPSByZWdleC5sYXN0SW5kZXg7XG4gIH1cbiAgcmV0LnB1c2goc3RyLnNsaWNlKHN0YXJ0KSk7XG5cbiAgcmV0dXJuIHJldC5qb2luKCcnKTtcbn1cbiJdfQ==
@@ -0,0 +1,4 @@
1
+ export * from './evaluate-cloudformation-template';
2
+ export * from './template-body-parameter';
3
+ export * from './nested-stack-helpers';
4
+ export * from './stack-helpers';
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./evaluate-cloudformation-template"), exports);
18
+ __exportStar(require("./template-body-parameter"), exports);
19
+ __exportStar(require("./nested-stack-helpers"), exports);
20
+ __exportStar(require("./stack-helpers"), exports);
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEscUVBQW1EO0FBQ25ELDREQUEwQztBQUMxQyx5REFBdUM7QUFDdkMsa0RBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9ldmFsdWF0ZS1jbG91ZGZvcm1hdGlvbi10ZW1wbGF0ZSc7XG5leHBvcnQgKiBmcm9tICcuL3RlbXBsYXRlLWJvZHktcGFyYW1ldGVyJztcbmV4cG9ydCAqIGZyb20gJy4vbmVzdGVkLXN0YWNrLWhlbHBlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcbiJdfQ==