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