terraconstructs 0.0.10 → 0.0.12

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 (410) hide show
  1. package/.jsii +104486 -34582
  2. package/lib/aws/arn.js +1 -1
  3. package/lib/aws/aws-construct.d.ts +1 -1
  4. package/lib/aws/aws-construct.js +28 -2
  5. package/lib/aws/aws-stack.d.ts +2 -4
  6. package/lib/aws/aws-stack.js +21 -8
  7. package/lib/aws/aws-tags.d.ts +58 -0
  8. package/lib/aws/aws-tags.js +77 -0
  9. package/lib/aws/cloudwatch/actions/ec2.js +1 -1
  10. package/lib/aws/cloudwatch/actions/lambda.js +1 -1
  11. package/lib/aws/cloudwatch/alarm-base.js +1 -1
  12. package/lib/aws/cloudwatch/alarm-rule.js +1 -1
  13. package/lib/aws/cloudwatch/alarm-status-widget.js +1 -1
  14. package/lib/aws/cloudwatch/alarm.js +1 -1
  15. package/lib/aws/cloudwatch/composite-alarm.js +1 -1
  16. package/lib/aws/cloudwatch/dashboard.js +1 -1
  17. package/lib/aws/cloudwatch/data-protection-policy.js +3 -3
  18. package/lib/aws/cloudwatch/graph.js +8 -8
  19. package/lib/aws/cloudwatch/layout.js +3 -3
  20. package/lib/aws/cloudwatch/log-destinations/kinesis.js +1 -1
  21. package/lib/aws/cloudwatch/log-destinations/lambda.js +1 -1
  22. package/lib/aws/cloudwatch/log-group.js +1 -1
  23. package/lib/aws/cloudwatch/log-query.js +1 -1
  24. package/lib/aws/cloudwatch/log-stream.js +1 -1
  25. package/lib/aws/cloudwatch/metric-filter.d.ts +1 -1
  26. package/lib/aws/cloudwatch/metric-filter.js +4 -4
  27. package/lib/aws/cloudwatch/metric.js +2 -2
  28. package/lib/aws/cloudwatch/pattern.js +3 -3
  29. package/lib/aws/cloudwatch/policy.js +1 -1
  30. package/lib/aws/cloudwatch/private/env-tokens.js +5 -6
  31. package/lib/aws/cloudwatch/private/metric-util.js +4 -5
  32. package/lib/aws/cloudwatch/private/object.js +2 -3
  33. package/lib/aws/cloudwatch/private/rendering.js +3 -3
  34. package/lib/aws/cloudwatch/private/statistic.js +6 -7
  35. package/lib/aws/cloudwatch/query-definition.js +2 -2
  36. package/lib/aws/cloudwatch/stats.js +1 -1
  37. package/lib/aws/cloudwatch/subscription-filter.d.ts +1 -1
  38. package/lib/aws/cloudwatch/subscription-filter.js +4 -4
  39. package/lib/aws/cloudwatch/text.js +1 -1
  40. package/lib/aws/cloudwatch/variable.js +3 -3
  41. package/lib/aws/cloudwatch/widget.d.ts +1 -1
  42. package/lib/aws/cloudwatch/widget.js +4 -4
  43. package/lib/aws/compute/activity.js +3 -2
  44. package/lib/aws/compute/alb/application-listener-action.d.ts +334 -0
  45. package/lib/aws/compute/alb/application-listener-action.js +281 -0
  46. package/lib/aws/compute/alb/application-listener-certificate.d.ts +35 -0
  47. package/lib/aws/compute/alb/application-listener-certificate.js +35 -0
  48. package/lib/aws/compute/alb/application-listener-rule.d.ts +233 -0
  49. package/lib/aws/compute/alb/application-listener-rule.js +220 -0
  50. package/lib/aws/compute/alb/application-listener.d.ts +574 -0
  51. package/lib/aws/compute/alb/application-listener.js +538 -0
  52. package/lib/aws/compute/alb/application-load-balancer.d.ts +715 -0
  53. package/lib/aws/compute/alb/application-load-balancer.js +780 -0
  54. package/lib/aws/compute/alb/application-target-group.d.ts +339 -0
  55. package/lib/aws/compute/alb/application-target-group.js +427 -0
  56. package/lib/aws/compute/alb/conditions.d.ts +61 -0
  57. package/lib/aws/compute/alb/conditions.js +164 -0
  58. package/lib/aws/compute/alb/trust-store-revocation.d.ts +59 -0
  59. package/lib/aws/compute/alb/trust-store-revocation.js +46 -0
  60. package/lib/aws/compute/alb/trust-store.d.ts +86 -0
  61. package/lib/aws/compute/alb/trust-store.js +79 -0
  62. package/lib/aws/compute/architecture.js +1 -1
  63. package/lib/aws/compute/aspects/require-imdsv2-aspect.d.ts +75 -0
  64. package/lib/aws/compute/aspects/require-imdsv2-aspect.js +106 -0
  65. package/lib/aws/compute/bastion-host.d.ts +172 -0
  66. package/lib/aws/compute/bastion-host.js +114 -0
  67. package/lib/aws/compute/chain.js +1 -1
  68. package/lib/aws/compute/cidr-splits.d.ts +49 -0
  69. package/lib/aws/compute/cidr-splits.js +59 -0
  70. package/lib/aws/compute/client-vpn-authorization-rule.d.ts +43 -0
  71. package/lib/aws/compute/client-vpn-authorization-rule.js +30 -0
  72. package/lib/aws/compute/client-vpn-endpoint-types.d.ts +62 -0
  73. package/lib/aws/compute/client-vpn-endpoint-types.js +25 -0
  74. package/lib/aws/compute/client-vpn-endpoint.d.ts +239 -0
  75. package/lib/aws/compute/client-vpn-endpoint.js +259 -0
  76. package/lib/aws/compute/client-vpn-route.d.ts +67 -0
  77. package/lib/aws/compute/client-vpn-route.js +57 -0
  78. package/lib/aws/compute/condition.js +1 -1
  79. package/lib/aws/compute/connections.d.ts +137 -0
  80. package/lib/aws/compute/connections.js +208 -0
  81. package/lib/aws/compute/ec2-augmentations.generated.d.ts +53 -0
  82. package/lib/aws/compute/ec2-augmentations.generated.js +35 -0
  83. package/lib/aws/compute/ec2-canned-metrics.generated.d.ts +555 -0
  84. package/lib/aws/compute/ec2-canned-metrics.generated.js +681 -0
  85. package/lib/aws/compute/ec2-util-v2.d.ts +141 -0
  86. package/lib/aws/compute/ec2-util-v2.js +286 -0
  87. package/lib/aws/compute/ec2-util.d.ts +52 -0
  88. package/lib/aws/compute/ec2-util.js +138 -0
  89. package/lib/aws/compute/elasticloadbalancing-canned-metrics.generated.d.ts +176 -0
  90. package/lib/aws/compute/elasticloadbalancing-canned-metrics.generated.js +119 -0
  91. package/lib/aws/compute/elasticloadbalancingv2-canned-metrics.generated.d.ts +860 -0
  92. package/lib/aws/compute/elasticloadbalancingv2-canned-metrics.generated.js +597 -0
  93. package/lib/aws/compute/event-invoke-config.js +1 -1
  94. package/lib/aws/compute/event-source-filter.js +2 -2
  95. package/lib/aws/compute/event-source-mapping.js +1 -1
  96. package/lib/aws/compute/event-sources/s3-onfailure-destination.js +1 -1
  97. package/lib/aws/compute/event-sources/s3.js +1 -1
  98. package/lib/aws/compute/event-sources/sqs-dlq.js +1 -1
  99. package/lib/aws/compute/event-sources/sqs.js +1 -1
  100. package/lib/aws/compute/fields.js +4 -4
  101. package/lib/aws/compute/function-alias.js +1 -1
  102. package/lib/aws/compute/function-base.js +2 -2
  103. package/lib/aws/compute/function-destinations/event-bridge.js +1 -1
  104. package/lib/aws/compute/function-destinations/function.js +1 -1
  105. package/lib/aws/compute/function-destinations/sqs.js +1 -1
  106. package/lib/aws/compute/function-nodejs.js +1 -1
  107. package/lib/aws/compute/function-url.js +1 -1
  108. package/lib/aws/compute/function-vpc-config.generated.d.ts +3 -3
  109. package/lib/aws/compute/function-vpc-config.generated.js +1 -1
  110. package/lib/aws/compute/function.d.ts +1 -1
  111. package/lib/aws/compute/function.js +5 -5
  112. package/lib/aws/compute/index-alpha.d.ts +5 -0
  113. package/lib/aws/compute/index-alpha.js +22 -0
  114. package/lib/aws/compute/index.d.ts +60 -0
  115. package/lib/aws/compute/index.js +70 -2
  116. package/lib/aws/compute/instance-types.d.ts +1354 -0
  117. package/lib/aws/compute/instance-types.js +1683 -0
  118. package/lib/aws/compute/instance.d.ts +436 -0
  119. package/lib/aws/compute/instance.js +262 -0
  120. package/lib/aws/compute/ip-addresses.d.ts +249 -0
  121. package/lib/aws/compute/ip-addresses.js +248 -0
  122. package/lib/aws/compute/ipam.d.ts +309 -0
  123. package/lib/aws/compute/ipam.js +306 -0
  124. package/lib/aws/compute/key-pair.d.ts +178 -0
  125. package/lib/aws/compute/key-pair.js +194 -0
  126. package/lib/aws/compute/lambda-augmentations.generated.d.ts +65 -0
  127. package/lib/aws/compute/lambda-augmentations.generated.js +41 -0
  128. package/lib/aws/compute/lambda-canned-metrics.generated.d.ts +316 -0
  129. package/lib/aws/compute/lambda-canned-metrics.generated.js +119 -0
  130. package/lib/aws/compute/launch-template.d.ts +540 -0
  131. package/lib/aws/compute/launch-template.js +468 -0
  132. package/lib/aws/compute/lb-shared/access-logs-accounts.d.ts +7 -0
  133. package/lib/aws/compute/lb-shared/access-logs-accounts.js +46 -0
  134. package/lib/aws/compute/lb-shared/base-listener.d.ts +113 -0
  135. package/lib/aws/compute/lb-shared/base-listener.js +181 -0
  136. package/lib/aws/compute/lb-shared/base-load-balancer.d.ts +212 -0
  137. package/lib/aws/compute/lb-shared/base-load-balancer.js +290 -0
  138. package/lib/aws/compute/lb-shared/base-target-group.d.ts +382 -0
  139. package/lib/aws/compute/lb-shared/base-target-group.js +364 -0
  140. package/lib/aws/compute/lb-shared/enums.d.ts +282 -0
  141. package/lib/aws/compute/lb-shared/enums.js +301 -0
  142. package/lib/aws/compute/lb-shared/grid-lookup-types.d.ts +42 -0
  143. package/lib/aws/compute/lb-shared/grid-lookup-types.js +53 -0
  144. package/lib/aws/compute/lb-shared/imported.d.ts +24 -0
  145. package/lib/aws/compute/lb-shared/imported.js +27 -0
  146. package/lib/aws/compute/lb-shared/lb-listener-config.generated.d.ts +194 -0
  147. package/lib/aws/compute/lb-shared/lb-listener-config.generated.js +3 -0
  148. package/lib/aws/compute/lb-shared/lb-target-group-attachment-config.generated.d.ts +56 -0
  149. package/lib/aws/compute/lb-shared/lb-target-group-attachment-config.generated.js +3 -0
  150. package/lib/aws/compute/lb-shared/listener-action.d.ts +14 -0
  151. package/lib/aws/compute/lb-shared/listener-action.js +4 -0
  152. package/lib/aws/compute/lb-shared/listener-certificate.d.ts +28 -0
  153. package/lib/aws/compute/lb-shared/listener-certificate.js +29 -0
  154. package/lib/aws/compute/lb-shared/load-balancer-targets.d.ts +93 -0
  155. package/lib/aws/compute/lb-shared/load-balancer-targets.js +127 -0
  156. package/lib/aws/compute/lb-shared/util.d.ts +113 -0
  157. package/lib/aws/compute/lb-shared/util.js +264 -0
  158. package/lib/aws/compute/lb-targets/alb-target.d.ts +67 -0
  159. package/lib/aws/compute/lb-targets/alb-target.js +100 -0
  160. package/lib/aws/compute/lb-targets/index.d.ts +4 -0
  161. package/lib/aws/compute/lb-targets/index.js +22 -0
  162. package/lib/aws/compute/lb-targets/instance-target.d.ts +42 -0
  163. package/lib/aws/compute/lb-targets/instance-target.js +67 -0
  164. package/lib/aws/compute/lb-targets/ip-target.d.ts +55 -0
  165. package/lib/aws/compute/lb-targets/ip-target.js +79 -0
  166. package/lib/aws/compute/lb-targets/lambda-target.d.ts +25 -0
  167. package/lib/aws/compute/lb-targets/lambda-target.js +50 -0
  168. package/lib/aws/compute/load-balancer.d.ts +336 -0
  169. package/lib/aws/compute/load-balancer.js +287 -0
  170. package/lib/aws/compute/machine-image/amazon-linux-2022.d.ts +63 -0
  171. package/lib/aws/compute/machine-image/amazon-linux-2022.js +84 -0
  172. package/lib/aws/compute/machine-image/amazon-linux-2023.d.ts +63 -0
  173. package/lib/aws/compute/machine-image/amazon-linux-2023.js +84 -0
  174. package/lib/aws/compute/machine-image/amazon-linux2.d.ts +76 -0
  175. package/lib/aws/compute/machine-image/amazon-linux2.js +87 -0
  176. package/lib/aws/compute/machine-image/common.d.ts +181 -0
  177. package/lib/aws/compute/machine-image/common.js +122 -0
  178. package/lib/aws/compute/machine-image/index.d.ts +5 -0
  179. package/lib/aws/compute/machine-image/index.js +22 -0
  180. package/lib/aws/compute/machine-image/machine-image.d.ts +463 -0
  181. package/lib/aws/compute/machine-image/machine-image.js +566 -0
  182. package/lib/aws/compute/machine-image/utils.d.ts +2 -0
  183. package/lib/aws/compute/machine-image/utils.js +17 -0
  184. package/lib/aws/compute/nat.d.ts +325 -0
  185. package/lib/aws/compute/nat.js +455 -0
  186. package/lib/aws/compute/network-acl-types.d.ts +152 -0
  187. package/lib/aws/compute/network-acl-types.js +156 -0
  188. package/lib/aws/compute/network-acl.d.ts +285 -0
  189. package/lib/aws/compute/network-acl.js +207 -0
  190. package/lib/aws/compute/network-util.d.ts +116 -0
  191. package/lib/aws/compute/network-util.js +241 -0
  192. package/lib/aws/compute/nlb/network-listener-action.d.ts +92 -0
  193. package/lib/aws/compute/nlb/network-listener-action.js +146 -0
  194. package/lib/aws/compute/nlb/network-listener-certificate.d.ts +24 -0
  195. package/lib/aws/compute/nlb/network-listener-certificate.js +25 -0
  196. package/lib/aws/compute/nlb/network-listener.d.ts +248 -0
  197. package/lib/aws/compute/nlb/network-listener.js +217 -0
  198. package/lib/aws/compute/nlb/network-load-balancer.d.ts +315 -0
  199. package/lib/aws/compute/nlb/network-load-balancer.js +360 -0
  200. package/lib/aws/compute/nlb/network-target-group.d.ts +153 -0
  201. package/lib/aws/compute/nlb/network-target-group.js +223 -0
  202. package/lib/aws/compute/peer.d.ts +64 -0
  203. package/lib/aws/compute/peer.js +235 -0
  204. package/lib/aws/compute/placement-group.d.ts +161 -0
  205. package/lib/aws/compute/placement-group.js +133 -0
  206. package/lib/aws/compute/port.d.ts +287 -0
  207. package/lib/aws/compute/port.js +390 -0
  208. package/lib/aws/compute/prefix-list.d.ts +131 -0
  209. package/lib/aws/compute/prefix-list.js +114 -0
  210. package/lib/aws/compute/private/context-stub.d.ts +7 -0
  211. package/lib/aws/compute/private/context-stub.js +43 -0
  212. package/lib/aws/compute/private/ebs-util.d.ts +14 -0
  213. package/lib/aws/compute/private/ebs-util.js +145 -0
  214. package/lib/aws/compute/private/intrinstics.js +2 -1
  215. package/lib/aws/compute/private/json-path.js +8 -8
  216. package/lib/aws/compute/private/util.js +2 -3
  217. package/lib/aws/compute/route.d.ts +547 -0
  218. package/lib/aws/compute/route.js +469 -0
  219. package/lib/aws/compute/security-group.d.ts +414 -0
  220. package/lib/aws/compute/security-group.js +538 -0
  221. package/lib/aws/compute/state-graph.js +1 -1
  222. package/lib/aws/compute/state-machine-fragment.js +1 -1
  223. package/lib/aws/compute/state-machine.d.ts +2 -2
  224. package/lib/aws/compute/state-machine.js +14 -12
  225. package/lib/aws/compute/states/choice.js +1 -1
  226. package/lib/aws/compute/states/custom-state.js +1 -1
  227. package/lib/aws/compute/states/distributed-map/item-batcher.js +1 -1
  228. package/lib/aws/compute/states/distributed-map/item-reader.js +5 -5
  229. package/lib/aws/compute/states/distributed-map/result-writer.js +1 -1
  230. package/lib/aws/compute/states/distributed-map.js +1 -1
  231. package/lib/aws/compute/states/fail.js +1 -1
  232. package/lib/aws/compute/states/map-base.js +1 -1
  233. package/lib/aws/compute/states/map.js +1 -1
  234. package/lib/aws/compute/states/parallel.js +1 -1
  235. package/lib/aws/compute/states/pass.js +2 -2
  236. package/lib/aws/compute/states/state.js +5 -5
  237. package/lib/aws/compute/states/succeed.js +1 -1
  238. package/lib/aws/compute/states/task-base.js +2 -2
  239. package/lib/aws/compute/states/task.js +1 -1
  240. package/lib/aws/compute/states/wait.js +2 -2
  241. package/lib/aws/compute/stepfunctions-canned-metrics.generated.d.ts +83 -0
  242. package/lib/aws/compute/stepfunctions-canned-metrics.generated.js +127 -0
  243. package/lib/aws/compute/subnet-v2.d.ts +213 -0
  244. package/lib/aws/compute/subnet-v2.js +405 -0
  245. package/lib/aws/compute/subnet.d.ts +37 -0
  246. package/lib/aws/compute/subnet.js +181 -0
  247. package/lib/aws/compute/task-credentials.js +1 -1
  248. package/lib/aws/compute/task-input.js +1 -1
  249. package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +1 -1
  250. package/lib/aws/compute/tasks/eventbridge/put-events.js +1 -1
  251. package/lib/aws/compute/tasks/http/invoke.js +1 -1
  252. package/lib/aws/compute/tasks/lambda/invoke.js +1 -1
  253. package/lib/aws/compute/tasks/private/task-utils.js +3 -4
  254. package/lib/aws/compute/tasks/resource-arn-suffix.js +2 -3
  255. package/lib/aws/compute/tasks/sqs/send-message.js +1 -1
  256. package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +1 -1
  257. package/lib/aws/compute/tasks/stepfunctions/start-execution.js +1 -1
  258. package/lib/aws/compute/types.js +2 -2
  259. package/lib/aws/compute/user-data.d.ts +270 -0
  260. package/lib/aws/compute/user-data.js +487 -0
  261. package/lib/aws/compute/util.d.ts +1 -1
  262. package/lib/aws/compute/util.js +4 -5
  263. package/lib/aws/compute/volume.d.ts +480 -0
  264. package/lib/aws/compute/volume.js +426 -0
  265. package/lib/aws/compute/vpc-endpoint-service.d.ts +149 -0
  266. package/lib/aws/compute/vpc-endpoint-service.js +90 -0
  267. package/lib/aws/compute/vpc-endpoint.d.ts +742 -0
  268. package/lib/aws/compute/vpc-endpoint.js +811 -0
  269. package/lib/aws/compute/vpc-flow-logs.d.ts +551 -0
  270. package/lib/aws/compute/vpc-flow-logs.js +693 -0
  271. package/lib/aws/compute/vpc-lookup.d.ts +73 -0
  272. package/lib/aws/compute/vpc-lookup.js +3 -0
  273. package/lib/aws/compute/vpc-v2-base.d.ts +353 -0
  274. package/lib/aws/compute/vpc-v2-base.js +493 -0
  275. package/lib/aws/compute/vpc-v2.d.ts +385 -0
  276. package/lib/aws/compute/vpc-v2.js +408 -0
  277. package/lib/aws/compute/vpc.d.ts +1448 -0
  278. package/lib/aws/compute/vpc.js +1495 -0
  279. package/lib/aws/compute/vpn.d.ts +443 -0
  280. package/lib/aws/compute/vpn.js +397 -0
  281. package/lib/aws/compute/windows-versions.d.ts +418 -0
  282. package/lib/aws/compute/windows-versions.js +426 -0
  283. package/lib/aws/edge/certificate-base.d.ts +20 -0
  284. package/lib/aws/edge/certificate-base.js +28 -0
  285. package/lib/aws/edge/certificate.d.ts +23 -2
  286. package/lib/aws/edge/certificate.js +54 -4
  287. package/lib/aws/edge/distribution.js +3 -3
  288. package/lib/aws/edge/dns-alias-record-targets.js +2 -2
  289. package/lib/aws/edge/dns-record.js +16 -16
  290. package/lib/aws/edge/dns-zone.d.ts +20 -2
  291. package/lib/aws/edge/dns-zone.js +25 -10
  292. package/lib/aws/edge/function.js +2 -2
  293. package/lib/aws/edge/index.d.ts +1 -0
  294. package/lib/aws/edge/index.js +2 -1
  295. package/lib/aws/edge/key-value-store.js +4 -4
  296. package/lib/aws/edge/origin.js +8 -6
  297. package/lib/aws/edge/response-headers-policy.js +1 -1
  298. package/lib/aws/encryption/alias.js +1 -1
  299. package/lib/aws/encryption/key.js +1 -1
  300. package/lib/aws/encryption/via-service-principal.js +1 -1
  301. package/lib/aws/iam/grant.js +2 -2
  302. package/lib/aws/iam/index.d.ts +1 -0
  303. package/lib/aws/iam/index.js +2 -1
  304. package/lib/aws/iam/instance-profile.d.ts +155 -0
  305. package/lib/aws/iam/instance-profile.js +124 -0
  306. package/lib/aws/iam/managed-policy.js +1 -1
  307. package/lib/aws/iam/oidc-provider.js +1 -1
  308. package/lib/aws/iam/policy-document-config.generated.d.ts +8 -8
  309. package/lib/aws/iam/policy-document-config.generated.js +1 -1
  310. package/lib/aws/iam/policy-document.js +1 -1
  311. package/lib/aws/iam/policy-statement-props.generated.d.ts +8 -8
  312. package/lib/aws/iam/policy-statement-props.generated.js +1 -1
  313. package/lib/aws/iam/policy-statement.js +9 -9
  314. package/lib/aws/iam/policy.js +1 -1
  315. package/lib/aws/iam/principals.js +26 -26
  316. package/lib/aws/iam/private/assume-role-policy.js +2 -3
  317. package/lib/aws/iam/private/comparable-principal.js +2 -3
  318. package/lib/aws/iam/private/immutable-role.d.ts +2 -1
  319. package/lib/aws/iam/private/immutable-role.js +3 -3
  320. package/lib/aws/iam/private/imported-role.d.ts +1 -1
  321. package/lib/aws/iam/private/imported-role.js +3 -3
  322. package/lib/aws/iam/private/merge-statements.js +2 -3
  323. package/lib/aws/iam/private/util.js +4 -4
  324. package/lib/aws/iam/role.js +1 -1
  325. package/lib/aws/iam/saml-provider.d.ts +1 -1
  326. package/lib/aws/iam/saml-provider.js +6 -6
  327. package/lib/aws/iam/unknown-principal.js +1 -1
  328. package/lib/aws/iam/utils.js +2 -3
  329. package/lib/aws/index.d.ts +1 -0
  330. package/lib/aws/index.js +4 -1
  331. package/lib/aws/network/simple-ipv4-vpc.js +5 -5
  332. package/lib/aws/network/subnet-group.js +3 -3
  333. package/lib/aws/network/subnet.d.ts +1 -1
  334. package/lib/aws/network/subnet.js +7 -7
  335. package/lib/aws/notify/archive.js +3 -2
  336. package/lib/aws/notify/connection.js +5 -4
  337. package/lib/aws/notify/event-bus.js +5 -4
  338. package/lib/aws/notify/event-pattern.js +3 -3
  339. package/lib/aws/notify/index.js +3 -1
  340. package/lib/aws/notify/input.js +4 -3
  341. package/lib/aws/notify/kinesis-stream.js +3 -2
  342. package/lib/aws/notify/on-event-options.js +2 -1
  343. package/lib/aws/notify/queue-config.generated.d.ts +18 -11
  344. package/lib/aws/notify/queue-config.generated.js +1 -1
  345. package/lib/aws/notify/queue-policy.js +1 -1
  346. package/lib/aws/notify/queue.js +1 -1
  347. package/lib/aws/notify/resource-policy.js +1 -1
  348. package/lib/aws/notify/rule.js +3 -2
  349. package/lib/aws/notify/schedule.js +2 -2
  350. package/lib/aws/notify/sqs-augmentations.generated.d.ts +125 -0
  351. package/lib/aws/notify/sqs-augmentations.generated.js +74 -0
  352. package/lib/aws/notify/target.js +2 -1
  353. package/lib/aws/notify/targets/event-bus.js +1 -1
  354. package/lib/aws/notify/targets/function.js +1 -1
  355. package/lib/aws/notify/targets/log-group.js +2 -2
  356. package/lib/aws/notify/targets/sqs.js +1 -1
  357. package/lib/aws/notify/targets/state-machine.js +1 -1
  358. package/lib/aws/notify/targets/util.d.ts +1 -1
  359. package/lib/aws/notify/targets/util.js +10 -11
  360. package/lib/aws/notify/util.js +4 -4
  361. package/lib/aws/provider-config.generated.d.ts +33 -33
  362. package/lib/aws/provider-config.generated.js +1 -1
  363. package/lib/aws/storage/bucket-notifications.js +1 -1
  364. package/lib/aws/storage/bucket-policy.js +1 -1
  365. package/lib/aws/storage/bucket-source.js +1 -1
  366. package/lib/aws/storage/bucket.d.ts +298 -65
  367. package/lib/aws/storage/bucket.js +548 -225
  368. package/lib/aws/storage/cors-config.generated.d.ts +3 -3
  369. package/lib/aws/storage/cors-config.generated.js +1 -1
  370. package/lib/aws/storage/cors-rule-config.generated.d.ts +5 -5
  371. package/lib/aws/storage/cors-rule-config.generated.js +1 -1
  372. package/lib/aws/storage/index.d.ts +1 -0
  373. package/lib/aws/storage/index.js +2 -1
  374. package/lib/aws/storage/lifecycle-config.generated.d.ts +11 -11
  375. package/lib/aws/storage/lifecycle-config.generated.js +1 -1
  376. package/lib/aws/storage/notification-targets/function.js +6 -6
  377. package/lib/aws/storage/notification-targets/queue.js +1 -1
  378. package/lib/aws/storage/origin-access-identity.d.ts +1 -1
  379. package/lib/aws/storage/origin-access-identity.js +5 -4
  380. package/lib/aws/storage/parameter-util.d.ts +12 -0
  381. package/lib/aws/storage/parameter-util.js +65 -0
  382. package/lib/aws/storage/parameter.d.ts +526 -0
  383. package/lib/aws/storage/parameter.js +606 -0
  384. package/lib/aws/storage/s3-canned-metrics.generated.d.ts +22 -0
  385. package/lib/aws/storage/s3-canned-metrics.generated.js +23 -0
  386. package/lib/aws/storage/util.d.ts +25 -3
  387. package/lib/aws/storage/util.js +84 -17
  388. package/lib/aws/storage/website-config.generated.d.ts +5 -5
  389. package/lib/aws/storage/website-config.generated.js +1 -1
  390. package/lib/aws/util.js +2 -3
  391. package/lib/construct-base.d.ts +10 -1
  392. package/lib/construct-base.js +9 -6
  393. package/lib/duration.js +1 -1
  394. package/lib/expiration.d.ts +48 -0
  395. package/lib/expiration.js +68 -0
  396. package/lib/helpers-internal/index.d.ts +1 -0
  397. package/lib/helpers-internal/index.js +7 -0
  398. package/lib/index.d.ts +2 -0
  399. package/lib/index.js +3 -1
  400. package/lib/private/md5.d.ts +4 -0
  401. package/lib/private/md5.js +14 -0
  402. package/lib/private/unique-resource-name.js +3 -4
  403. package/lib/size.js +2 -2
  404. package/lib/stack-base.d.ts +4 -23
  405. package/lib/stack-base.js +9 -30
  406. package/lib/terra-func.d.ts +103 -0
  407. package/lib/terra-func.js +170 -0
  408. package/lib/token.js +5 -5
  409. package/package.json +15 -8
  410. package/bun.lockb +0 -0
@@ -0,0 +1,606 @@
1
+ "use strict";
2
+ var _a, _b;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.StringListParameter = exports.StringParameter = exports.ParameterTier = exports.ParameterDataType = exports.ParameterType = exports.ParameterValueType = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ // https://github.com/aws/aws-cdk/blob/v2.175.1/packages/aws-cdk-lib/aws-ssm/lib/parameter.ts
7
+ const provider_aws_1 = require("@cdktf/provider-aws");
8
+ const cdktf_1 = require("cdktf");
9
+ const parameter_util_1 = require("./parameter-util");
10
+ const terra_func_1 = require("../../terra-func");
11
+ const aws_construct_1 = require("../aws-construct");
12
+ const aws_stack_1 = require("../aws-stack");
13
+ const iam = require("../iam");
14
+ /**
15
+ * Basic features shared across all types of SSM Parameters.
16
+ */
17
+ class ParameterBase extends aws_construct_1.AwsConstructBase {
18
+ get parameterOutputs() {
19
+ return {
20
+ parameterArn: this.parameterArn,
21
+ parameterName: this.parameterName,
22
+ parameterType: this.parameterType,
23
+ };
24
+ }
25
+ get outputs() {
26
+ return this.parameterOutputs;
27
+ }
28
+ grantRead(grantee) {
29
+ if (this.encryptionKey) {
30
+ this.encryptionKey.grantDecrypt(grantee);
31
+ }
32
+ return iam.Grant.addToPrincipal({
33
+ grantee,
34
+ actions: [
35
+ "ssm:DescribeParameters",
36
+ "ssm:GetParameters",
37
+ "ssm:GetParameter",
38
+ "ssm:GetParameterHistory",
39
+ ],
40
+ resourceArns: [this.parameterArn],
41
+ });
42
+ }
43
+ grantWrite(grantee) {
44
+ if (this.encryptionKey) {
45
+ this.encryptionKey.grantEncrypt(grantee);
46
+ }
47
+ return iam.Grant.addToPrincipal({
48
+ grantee,
49
+ actions: ["ssm:PutParameter"],
50
+ resourceArns: [this.parameterArn],
51
+ });
52
+ }
53
+ }
54
+ /**
55
+ * The type of CFN SSM Parameter
56
+ *
57
+ * Using specific types can be helpful in catching invalid values
58
+ * at the start of creating or updating a stack. CloudFormation validates
59
+ * the values against existing values in the account.
60
+ *
61
+ * @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html#aws-ssm-parameter-types
62
+ */
63
+ var ParameterValueType;
64
+ (function (ParameterValueType) {
65
+ /**
66
+ * String
67
+ */
68
+ ParameterValueType["STRING"] = "String";
69
+ /**
70
+ * An Availability Zone, such as us-west-2a.
71
+ */
72
+ ParameterValueType["AWS_EC2_AVAILABILITYZONE_NAME"] = "AWS::EC2::AvailabilityZone::Name";
73
+ /**
74
+ * An Amazon EC2 image ID, such as ami-0ff8a91507f77f867.
75
+ */
76
+ ParameterValueType["AWS_EC2_IMAGE_ID"] = "AWS::EC2::Image::Id";
77
+ /**
78
+ * An Amazon EC2 instance ID, such as i-1e731a32.
79
+ */
80
+ ParameterValueType["AWS_EC2_INSTANCE_ID"] = "AWS::EC2::Instance::Id";
81
+ /**
82
+ * An Amazon EC2 key pair name.
83
+ */
84
+ ParameterValueType["AWS_EC2_KEYPAIR_KEYNAME"] = "AWS::EC2::KeyPair::KeyName";
85
+ /**
86
+ * An EC2-Classic or default VPC security group name, such as my-sg-abc.
87
+ */
88
+ ParameterValueType["AWS_EC2_SECURITYGROUP_GROUPNAME"] = "AWS::EC2::SecurityGroup::GroupName";
89
+ /**
90
+ * A security group ID, such as sg-a123fd85.
91
+ */
92
+ ParameterValueType["AWS_EC2_SECURITYGROUP_ID"] = "AWS::EC2::SecurityGroup::Id";
93
+ /**
94
+ * A subnet ID, such as subnet-123a351e.
95
+ */
96
+ ParameterValueType["AWS_EC2_SUBNET_ID"] = "AWS::EC2::Subnet::Id";
97
+ /**
98
+ * An Amazon EBS volume ID, such as vol-3cdd3f56.
99
+ */
100
+ ParameterValueType["AWS_EC2_VOLUME_ID"] = "AWS::EC2::Volume::Id";
101
+ /**
102
+ * A VPC ID, such as vpc-a123baa3.
103
+ */
104
+ ParameterValueType["AWS_EC2_VPC_ID"] = "AWS::EC2::VPC::Id";
105
+ /**
106
+ * An Amazon Route 53 hosted zone ID, such as Z23YXV4OVPL04A.
107
+ */
108
+ ParameterValueType["AWS_ROUTE53_HOSTEDZONE_ID"] = "AWS::Route53::HostedZone::Id";
109
+ })(ParameterValueType || (exports.ParameterValueType = ParameterValueType = {}));
110
+ // Deprecated - see https://github.com/aws/aws-cdk/issues/6039
111
+ /**
112
+ * SSM parameter type
113
+ * @deprecated these types are no longer used
114
+ */
115
+ var ParameterType;
116
+ (function (ParameterType) {
117
+ /**
118
+ * String
119
+ */
120
+ ParameterType["STRING"] = "String";
121
+ /**
122
+ * Secure String
123
+ *
124
+ * Parameter Store uses an AWS Key Management Service (KMS) customer master key (CMK) to encrypt the parameter value.
125
+ * Parameters of type SecureString cannot be created directly from a CDK application due to CFN limitations.
126
+ *
127
+ * NOTE: Terraform does not prevent creating SecureString parameters, but it is not recommended
128
+ * because the value will be stored in plain text in the state file.
129
+ */
130
+ ParameterType["SECURE_STRING"] = "SecureString";
131
+ /**
132
+ * String List
133
+ */
134
+ ParameterType["STRING_LIST"] = "StringList";
135
+ /**
136
+ * An Amazon EC2 image ID, such as ami-0ff8a91507f77f867
137
+ */
138
+ ParameterType["AWS_EC2_IMAGE_ID"] = "AWS::EC2::Image::Id";
139
+ })(ParameterType || (exports.ParameterType = ParameterType = {}));
140
+ /**
141
+ * SSM parameter data type
142
+ */
143
+ var ParameterDataType;
144
+ (function (ParameterDataType) {
145
+ /**
146
+ * Text
147
+ */
148
+ ParameterDataType["TEXT"] = "text";
149
+ /**
150
+ * Aws Ec2 Image
151
+ */
152
+ ParameterDataType["AWS_EC2_IMAGE"] = "aws:ec2:image";
153
+ })(ParameterDataType || (exports.ParameterDataType = ParameterDataType = {}));
154
+ /**
155
+ * SSM parameter tier
156
+ */
157
+ var ParameterTier;
158
+ (function (ParameterTier) {
159
+ /**
160
+ * String
161
+ */
162
+ ParameterTier["ADVANCED"] = "Advanced";
163
+ /**
164
+ * String
165
+ */
166
+ ParameterTier["INTELLIGENT_TIERING"] = "Intelligent-Tiering";
167
+ /**
168
+ * String
169
+ */
170
+ ParameterTier["STANDARD"] = "Standard";
171
+ })(ParameterTier || (exports.ParameterTier = ParameterTier = {}));
172
+ /**
173
+ * Creates a new String SSM Parameter.
174
+ * @resource aws_ssm_parameter
175
+ *
176
+ * @example
177
+ * const ssmParameter = new storage.StringParameter(this, 'mySsmParameter', {
178
+ * parameterName: 'mySsmParameter',
179
+ * stringValue: 'mySsmParameterValue',
180
+ * });
181
+ */
182
+ class StringParameter extends ParameterBase {
183
+ /**
184
+ * Imports an external string parameter by name.
185
+ */
186
+ static fromStringParameterName(scope, id, stringParameterName) {
187
+ return this.fromStringParameterAttributes(scope, id, {
188
+ parameterName: stringParameterName,
189
+ });
190
+ }
191
+ /**
192
+ * Imports an external string parameter by ARN.
193
+ *
194
+ * The unencrypted value of a SecureString will be stored in the raw state as plain-text.
195
+ * [Read more about sensitive data in state](https://www.terraform.io/docs/state/sensitive-data.html).
196
+ */
197
+ static fromStringParameterArn(scope, id, stringParameterArn) {
198
+ if (cdktf_1.Token.isUnresolved(stringParameterArn)) {
199
+ throw new Error("stringParameterArn cannot be an unresolved token");
200
+ }
201
+ // has to be the same region
202
+ // split the arn string to get the region string
203
+ // arn sample: arn:aws:ssm:us-east-1:123456789012:parameter/dummyName
204
+ const arnParts = stringParameterArn.split(":");
205
+ const stackRegion = aws_stack_1.AwsStack.ofAwsConstruct(scope).region;
206
+ if (arnParts.length !== 6) {
207
+ throw new Error("unexpected StringParameterArn format");
208
+ }
209
+ else if (cdktf_1.Token.isUnresolved(stackRegion)) {
210
+ // Region is unknown during synthesis, emit a warning for visibility
211
+ // "aws-cdk-lib/aws-ssm:crossAccountReferenceSameRegion",
212
+ cdktf_1.Annotations.of(scope).addWarning("Cross-account references will only work within the same region");
213
+ }
214
+ else if (!cdktf_1.Token.isUnresolved(stackRegion) &&
215
+ arnParts[3] !== stackRegion) {
216
+ // If the region is known, it must match the region specified in the ARN string
217
+ throw new Error("stringParameterArn must be in the same region as the stack");
218
+ }
219
+ const parameterType = ParameterValueType.STRING;
220
+ const parameterName = stringParameterArn
221
+ .split("/")
222
+ .pop()
223
+ ?.replace(/parameter\/$/, "") ?? "";
224
+ const dataSource = new provider_aws_1.dataAwsSsmParameter.DataAwsSsmParameter(scope, `${id}.Parameter`, {
225
+ name: parameterName,
226
+ // withDecryption defaults to true
227
+ });
228
+ class Import extends ParameterBase {
229
+ constructor() {
230
+ super(...arguments);
231
+ this.parameterName = parameterName;
232
+ this.parameterArn = stringParameterArn;
233
+ this.parameterType = parameterType;
234
+ // Use caution: This value is never marked as sensitive.
235
+ this.stringValue = dataSource.insecureValue;
236
+ }
237
+ }
238
+ return new Import(scope, id);
239
+ }
240
+ /**
241
+ * Imports an external string parameter with name and optional version.
242
+ */
243
+ static fromStringParameterAttributes(scope, id, attrs) {
244
+ if (!attrs.parameterName) {
245
+ throw new Error("parameterName cannot be an empty string");
246
+ }
247
+ if (attrs.type &&
248
+ ![ParameterType.STRING, ParameterType.AWS_EC2_IMAGE_ID].includes(attrs.type)) {
249
+ throw new Error(`fromStringParameterAttributes does not support ${attrs.type}. Please use ParameterType.STRING or ParameterType.AWS_EC2_IMAGE_ID`);
250
+ }
251
+ // const forceDynamicReference = attrs.forceDynamicReference ?? false;
252
+ // ref: https://github.com/aws/aws-cdk/blob/v2.143.0/packages/aws-cdk-lib/aws-ssm/lib/parameter.ts#L483
253
+ // const type = attrs.type ?? attrs.valueType ?? ParameterValueType.STRING;
254
+ let name;
255
+ if (attrs.version) {
256
+ // To query by parameter version, use "Name": "name:version".
257
+ // https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameter.html#systemsmanager-GetParameter-request-Name
258
+ name = `${attrs.parameterName}:${cdktf_1.Tokenization.stringifyNumber(attrs.version)}`;
259
+ }
260
+ else {
261
+ name = attrs.parameterName;
262
+ }
263
+ const dataSource = new provider_aws_1.dataAwsSsmParameter.DataAwsSsmParameter(scope, `${id}.Parameter`, {
264
+ name,
265
+ withDecryption: attrs.withDecryption, // defaults to true
266
+ });
267
+ class Import extends ParameterBase {
268
+ constructor() {
269
+ super(...arguments);
270
+ this.parameterName = attrs.parameterName;
271
+ this.parameterArn = (0, parameter_util_1.arnForParameterName)(this, attrs.parameterName, { simpleName: attrs.simpleName });
272
+ this.parameterType = ParameterType.STRING; // dataSource.type - instead of token use concrete
273
+ // Use caution: This value is never marked as sensitive.
274
+ this.stringValue = dataSource.insecureValue;
275
+ }
276
+ }
277
+ return new Import(scope, id);
278
+ }
279
+ /**
280
+ * Imports a secure string parameter from the SSM parameter store.
281
+ */
282
+ static fromSecureStringParameterAttributes(scope, id, attrs) {
283
+ if (!attrs.parameterName) {
284
+ throw new Error("parameterName cannot be an empty string");
285
+ }
286
+ let name;
287
+ if (attrs.version) {
288
+ name = `${attrs.parameterName}:${cdktf_1.Tokenization.stringifyNumber(attrs.version)}`;
289
+ }
290
+ else {
291
+ name = attrs.parameterName;
292
+ }
293
+ const resource = new provider_aws_1.dataAwsSsmParameter.DataAwsSsmParameter(scope, `${id}.Parameter`, {
294
+ name,
295
+ withDecryption: attrs.withDecryption, // defaults to true
296
+ });
297
+ class Import extends ParameterBase {
298
+ constructor() {
299
+ super(...arguments);
300
+ this.parameterName = attrs.parameterName;
301
+ this.parameterArn = (0, parameter_util_1.arnForParameterName)(this, attrs.parameterName, { simpleName: attrs.simpleName });
302
+ this.parameterType = ParameterType.SECURE_STRING; // resource.type - instead of token use concrete
303
+ // value is always marked as sensitive
304
+ this.stringValue = resource.value;
305
+ this.encryptionKey = attrs.encryptionKey;
306
+ }
307
+ }
308
+ return new Import(scope, id);
309
+ }
310
+ // // TODO: Use Grid as contextProvider
311
+ // /**
312
+ // * Reads the value of an SSM parameter during synthesis through an
313
+ // * environmental context provider.
314
+ // *
315
+ // * Requires that the stack this scope is defined in will have explicit
316
+ // * account/region information. Otherwise, it will fail during synthesis.
317
+ // *
318
+ // * If defaultValue is provided, it will be used as the dummyValue
319
+ // * and the ContextProvider will be told NOT to raise an error on synthesis
320
+ // * if the SSM Parameter is not found in the account at synth time.
321
+ // */
322
+ // public static valueFromLookup(
323
+ // scope: Construct,
324
+ // parameterName: string,
325
+ // defaultValue?: string,
326
+ // ): string {
327
+ // const value = ContextProvider.getValue(scope, {
328
+ // provider: cxschema.ContextProvider.SSM_PARAMETER_PROVIDER,
329
+ // props: { parameterName },
330
+ // dummyValue: defaultValue || `dummy-value-for-${parameterName}`,
331
+ // ignoreErrorOnMissingContext: defaultValue !== undefined,
332
+ // }).value;
333
+ // return value;
334
+ // }
335
+ /**
336
+ * Returns a token that will resolve (during deployment) to the string value of an SSM string parameter.
337
+ * @param scope Some scope within a stack
338
+ * @param parameterName The name of the SSM parameter.
339
+ * @param version The parameter version (recommended in order to ensure that the value won't change during deployment)
340
+ */
341
+ static valueForStringParameter(scope, parameterName, version) {
342
+ return StringParameter.valueForTypedStringParameterV2(scope, parameterName, ParameterValueType.STRING, version);
343
+ }
344
+ /**
345
+ * Returns a token that will resolve (during deployment) to the string value of an SSM string parameter.
346
+ * @param scope Some scope within a stack
347
+ * @param parameterName The name of the SSM parameter.
348
+ * @param type The type of the SSM parameter.
349
+ * @param version The parameter version (recommended in order to ensure that the value won't change during deployment)
350
+ */
351
+ static valueForTypedStringParameterV2(scope, parameterName, type = ParameterValueType.STRING, version) {
352
+ const stack = aws_stack_1.AwsStack.of(scope);
353
+ const id = makeIdentityForImportedValue(parameterName);
354
+ const exists = stack.node.tryFindChild(id);
355
+ if (exists) {
356
+ return exists.stringValue;
357
+ }
358
+ return this.fromStringParameterAttributes(stack, id, {
359
+ parameterName,
360
+ version,
361
+ valueType: type,
362
+ }).stringValue;
363
+ }
364
+ /**
365
+ * Returns a token that will resolve (during deployment) to the string value of an SSM string parameter.
366
+ * @param scope Some scope within a stack
367
+ * @param parameterName The name of the SSM parameter.
368
+ * @param type The type of the SSM parameter.
369
+ * @param version The parameter version (recommended in order to ensure that the value won't change during deployment)
370
+ * @deprecated - use valueForTypedStringParameterV2 instead
371
+ */
372
+ static valueForTypedStringParameter(scope, parameterName, type = ParameterType.STRING, version) {
373
+ if (type === ParameterType.STRING_LIST) {
374
+ throw new Error("valueForTypedStringParameter does not support STRING_LIST, " +
375
+ "use valueForTypedListParameter instead");
376
+ }
377
+ const stack = aws_stack_1.AwsStack.of(scope);
378
+ const id = makeIdentityForImportedValue(parameterName);
379
+ const exists = stack.node.tryFindChild(id);
380
+ if (exists) {
381
+ return exists.stringValue;
382
+ }
383
+ return this.fromStringParameterAttributes(stack, id, {
384
+ parameterName,
385
+ version,
386
+ type,
387
+ }).stringValue;
388
+ }
389
+ /**
390
+ * Returns a token that will resolve (during deployment)
391
+ * @param scope Some scope within a stack
392
+ * @param parameterName The name of the SSM parameter
393
+ * @param version The parameter version (required for secure strings)
394
+ * @deprecated Use `SecretValue.ssmSecure()` instead, it will correctly type the imported value as a `SecretValue` and allow importing without version. `SecretValue` lives in the core `aws-cdk-lib` module.
395
+ */
396
+ static valueForSecureStringParameter(scope, parameterName, version) {
397
+ const stack = aws_stack_1.AwsStack.of(scope);
398
+ const id = makeIdentityForImportedValue(parameterName);
399
+ const exists = stack.node.tryFindChild(id);
400
+ if (exists) {
401
+ return exists.stringValue;
402
+ }
403
+ return this.fromSecureStringParameterAttributes(stack, id, {
404
+ parameterName,
405
+ version,
406
+ }).stringValue;
407
+ }
408
+ constructor(scope, id, props) {
409
+ super(scope, id, props);
410
+ const parameterName = props.parameterName ||
411
+ this.stack.uniqueResourceName(this, {
412
+ prefix: this.gridUUID,
413
+ });
414
+ if (props.stringValue && props.sensitiveStringValue) {
415
+ throw new Error("Cannot specify both 'stringValue' and 'sensitiveStringValue'");
416
+ }
417
+ const stringValue = props.stringValue ?? props.sensitiveStringValue;
418
+ const isSensitive = !!props.sensitiveStringValue;
419
+ if (!stringValue) {
420
+ throw new Error("Either 'stringValue' or 'sensitiveStringValue' must be specified");
421
+ }
422
+ if (props.allowedPattern) {
423
+ _assertValidValue(stringValue, props.allowedPattern);
424
+ }
425
+ validateParameterName(parameterName);
426
+ if (props.description && props.description?.length > 1024) {
427
+ throw new Error("Description cannot be longer than 1024 characters.");
428
+ }
429
+ if (props.type && props.type === ParameterType.AWS_EC2_IMAGE_ID) {
430
+ throw new Error("The type must either be ParameterType.STRING or ParameterType.STRING_LIST. Did you mean to set dataType: ParameterDataType.AWS_EC2_IMAGE instead?");
431
+ }
432
+ this.resource = new provider_aws_1.ssmParameter.SsmParameter(this, "Resource", {
433
+ allowedPattern: props.allowedPattern,
434
+ description: props.description,
435
+ name: parameterName,
436
+ tier: props.tier,
437
+ type: props.type ?? ParameterType.STRING,
438
+ dataType: props.dataType,
439
+ insecureValue: props.stringValue,
440
+ value: props.sensitiveStringValue,
441
+ });
442
+ this.parameterName = this.resource.name;
443
+ this.parameterArn = (0, parameter_util_1.arnForParameterName)(this, this.parameterName, {
444
+ physicalName: parameterName,
445
+ simpleName: props.simpleName,
446
+ });
447
+ this.parameterType = this.resource.type;
448
+ this.stringValue = isSensitive
449
+ ? this.resource.value
450
+ : this.resource.insecureValue;
451
+ }
452
+ }
453
+ exports.StringParameter = StringParameter;
454
+ _a = JSII_RTTI_SYMBOL_1;
455
+ StringParameter[_a] = { fqn: "terraconstructs.aws.storage.StringParameter", version: "0.0.12" };
456
+ /**
457
+ * Creates a new StringList SSM Parameter.
458
+ * @resource AWS::SSM::Parameter
459
+ */
460
+ class StringListParameter extends ParameterBase {
461
+ /**
462
+ * Imports an external parameter of type string list.
463
+ * Returns a token and should not be parsed.
464
+ */
465
+ static fromStringListParameterName(scope, id, stringListParameterName) {
466
+ // ref: dynamic ref
467
+ // https://github.com/aws/aws-cdk/blob/v2.143.0/packages/aws-cdk-lib/aws-ssm/lib/parameter.ts#L670
468
+ return StringListParameter.fromListParameterAttributes(scope, id, {
469
+ parameterName: stringListParameterName,
470
+ });
471
+ }
472
+ /**
473
+ * Imports an external string list parameter with name and optional version.
474
+ */
475
+ static fromListParameterAttributes(scope, id, attrs) {
476
+ if (!attrs.parameterName) {
477
+ throw new Error("parameterName cannot be an empty string");
478
+ }
479
+ let name;
480
+ if (attrs.version) {
481
+ name = `${attrs.parameterName}:${cdktf_1.Tokenization.stringifyNumber(attrs.version)}`;
482
+ }
483
+ else {
484
+ name = attrs.parameterName;
485
+ }
486
+ const type = attrs.elementType ?? ParameterValueType.STRING;
487
+ const valueType = `List<${type}>`;
488
+ const resource = new provider_aws_1.dataAwsSsmParameter.DataAwsSsmParameter(scope, `${id}.Parameter`, {
489
+ name,
490
+ withDecryption: attrs.withDecryption, // defaults to true
491
+ });
492
+ class Import extends ParameterBase {
493
+ constructor() {
494
+ super(...arguments);
495
+ this.parameterName = attrs.parameterName;
496
+ this.parameterArn = (0, parameter_util_1.arnForParameterName)(this, attrs.parameterName, { simpleName: attrs.simpleName });
497
+ this.parameterType = valueType; // it doesn't really matter what this is since a CfnParameter can only be `String | StringList`
498
+ this.stringListValue = terra_func_1.Fn.split(",", resource.insecureValue);
499
+ }
500
+ }
501
+ return new Import(scope, id);
502
+ }
503
+ /**
504
+ * Returns a token that will resolve (during deployment) to the list value of an SSM StringList parameter.
505
+ * @param scope Some scope within a stack
506
+ * @param parameterName The name of the SSM parameter.
507
+ * @param type the type of the SSM list parameter
508
+ * @param version The parameter version (recommended in order to ensure that the value won't change during deployment)
509
+ */
510
+ static valueForTypedListParameter(scope, parameterName, type = ParameterValueType.STRING, version) {
511
+ const stack = aws_stack_1.AwsStack.of(scope);
512
+ const id = makeIdentityForImportedValue(parameterName);
513
+ const exists = stack.node.tryFindChild(id);
514
+ if (exists) {
515
+ return exists.stringListValue;
516
+ }
517
+ return this.fromListParameterAttributes(stack, id, {
518
+ parameterName,
519
+ elementType: type,
520
+ version,
521
+ }).stringListValue;
522
+ }
523
+ constructor(scope, id, props) {
524
+ super(scope, id, props);
525
+ const parameterName = props.parameterName ||
526
+ this.stack.uniqueResourceName(this, {
527
+ prefix: this.gridUUID,
528
+ });
529
+ if (props.stringListValue && props.sensitiveStringListValue) {
530
+ throw new Error("Cannot specify both 'stringListValue' and 'sensitiveStringListValue'");
531
+ }
532
+ const stringListValue = props.stringListValue ?? props.sensitiveStringListValue;
533
+ const isSensitive = !!props.sensitiveStringListValue;
534
+ if (!stringListValue) {
535
+ throw new Error("Either 'stringListValue' or 'sensitiveStringListValue' must be specified");
536
+ }
537
+ if (stringListValue.find((str) => !cdktf_1.Token.isUnresolved(str) && str.indexOf(",") !== -1)) {
538
+ throw new Error("Values of a StringList SSM Parameter cannot contain the ',' character. Use a string parameter instead.");
539
+ }
540
+ if (props.allowedPattern && !cdktf_1.Token.isUnresolved(stringListValue)) {
541
+ stringListValue.forEach((str) => _assertValidValue(str, props.allowedPattern));
542
+ }
543
+ validateParameterName(parameterName);
544
+ if (props.description && props.description?.length > 1024) {
545
+ throw new Error("Description cannot be longer than 1024 characters.");
546
+ }
547
+ this.resource = new provider_aws_1.ssmParameter.SsmParameter(this, "Resource", {
548
+ allowedPattern: props.allowedPattern,
549
+ description: props.description,
550
+ name: parameterName,
551
+ tier: props.tier,
552
+ type: ParameterType.STRING_LIST,
553
+ insecureValue: props.stringListValue
554
+ ? terra_func_1.Fn.join(",", props.stringListValue)
555
+ : undefined,
556
+ value: props.sensitiveStringListValue
557
+ ? terra_func_1.Fn.join(",", props.sensitiveStringListValue)
558
+ : undefined,
559
+ });
560
+ this.parameterName = this.resource.name;
561
+ this.parameterArn = (0, parameter_util_1.arnForParameterName)(this, this.parameterName, {
562
+ physicalName: parameterName,
563
+ simpleName: props.simpleName,
564
+ });
565
+ this.parameterType = this.resource.type;
566
+ this.stringListValue = isSensitive
567
+ ? terra_func_1.Fn.split(",", this.resource.value)
568
+ : terra_func_1.Fn.split(",", this.resource.insecureValue);
569
+ }
570
+ }
571
+ exports.StringListParameter = StringListParameter;
572
+ _b = JSII_RTTI_SYMBOL_1;
573
+ StringListParameter[_b] = { fqn: "terraconstructs.aws.storage.StringListParameter", version: "0.0.12" };
574
+ /**
575
+ * Validates whether a supplied value conforms to the allowedPattern, granted neither is an unresolved token.
576
+ *
577
+ * @param value the value to be validated.
578
+ * @param allowedPattern the regular expression to use for validation.
579
+ *
580
+ * @throws if the ``value`` does not conform to the ``allowedPattern`` and neither is an unresolved token (per
581
+ * ``cdk.unresolved``).
582
+ */
583
+ function _assertValidValue(value, allowedPattern) {
584
+ if (cdktf_1.Token.isUnresolved(value) || cdktf_1.Token.isUnresolved(allowedPattern)) {
585
+ // Unable to perform validations against unresolved tokens
586
+ return;
587
+ }
588
+ if (!new RegExp(allowedPattern).test(value)) {
589
+ throw new Error(`The supplied value (${value}) does not match the specified allowedPattern (${allowedPattern})`);
590
+ }
591
+ }
592
+ function makeIdentityForImportedValue(parameterName) {
593
+ return `SsmParameterValue:${parameterName}:C96584B6-F00A-464E-AD19-53AFF4B05118`;
594
+ }
595
+ function validateParameterName(parameterName) {
596
+ if (cdktf_1.Token.isUnresolved(parameterName)) {
597
+ return;
598
+ }
599
+ if (parameterName.length > 2048) {
600
+ throw new Error("name cannot be longer than 2048 characters.");
601
+ }
602
+ if (!parameterName.match(/^[\/\w.-]+$/)) {
603
+ throw new Error(`name must only contain letters, numbers, and the following 4 symbols .-_/; got ${parameterName}`);
604
+ }
605
+ }
606
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyYW1ldGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F3cy9zdG9yYWdlL3BhcmFtZXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZGQUE2RjtBQUU3RixzREFBd0U7QUFDeEUsaUNBVWU7QUFFZixxREFBdUQ7QUFDdkQsaURBQXNDO0FBQ3RDLG9EQUkwQjtBQUMxQiw0Q0FBd0M7QUFFeEMsOEJBQThCO0FBdU05Qjs7R0FFRztBQUNILE1BQWUsYUFBYyxTQUFRLGdDQUFnQjtJQUluRCxJQUFXLGdCQUFnQjtRQUN6QixPQUFPO1lBQ0wsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQy9CLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtZQUNqQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7U0FDbEMsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDL0IsQ0FBQztJQVNNLFNBQVMsQ0FBQyxPQUF1QjtRQUN0QyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQztZQUM5QixPQUFPO1lBQ1AsT0FBTyxFQUFFO2dCQUNQLHdCQUF3QjtnQkFDeEIsbUJBQW1CO2dCQUNuQixrQkFBa0I7Z0JBQ2xCLHlCQUF5QjthQUMxQjtZQUNELFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7U0FDbEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLFVBQVUsQ0FBQyxPQUF1QjtRQUN2QyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQyxD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QUFHLElBQUksRUFBRSxDQUFDO1FBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUN4QyxNQUFNLElBQUksS0FBSyxDQUNiLGtGQUFrRixhQUFhLEVBQUUsQ0FDbEcsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTc1LjEvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLXNzbS9saWIvcGFyYW1ldGVyLnRzXG5cbmltcG9ydCB7IHNzbVBhcmFtZXRlciwgZGF0YUF3c1NzbVBhcmFtZXRlciB9IGZyb20gXCJAY2RrdGYvcHJvdmlkZXItYXdzXCI7XG5pbXBvcnQge1xuICAvLyBDZm5EeW5hbWljUmVmZXJlbmNlLFxuICAvLyBDZm5EeW5hbWljUmVmZXJlbmNlU2VydmljZSxcbiAgLy8gVE9ETzogVXNlIEdyaWQgYXMgY29udGV4dFByb3ZpZGVyXG4gIC8vIENvbnRleHRQcm92aWRlcixcbiAgQW5ub3RhdGlvbnMsXG4gIC8vIEZuLFxuICBUb2tlbixcbiAgVG9rZW5pemF0aW9uLFxuICBJUmVzb2x2YWJsZSxcbn0gZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgYXJuRm9yUGFyYW1ldGVyTmFtZSB9IGZyb20gXCIuL3BhcmFtZXRlci11dGlsXCI7XG5pbXBvcnQgeyBGbiB9IGZyb20gXCIuLi8uLi90ZXJyYS1mdW5jXCI7XG5pbXBvcnQge1xuICBJQXdzQ29uc3RydWN0LFxuICBBd3NDb25zdHJ1Y3RCYXNlLFxuICBBd3NDb25zdHJ1Y3RQcm9wcyxcbn0gZnJvbSBcIi4uL2F3cy1jb25zdHJ1Y3RcIjtcbmltcG9ydCB7IEF3c1N0YWNrIH0gZnJvbSBcIi4uL2F3cy1zdGFja1wiO1xuaW1wb3J0ICogYXMgZW5jcnlwdGlvbiBmcm9tIFwiLi4vZW5jcnlwdGlvblwiO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gXCIuLi9pYW1cIjtcblxuLyoqXG4gKiBPdXRwdXRzIHdoaWNoIG1heSBiZSByZWdpc3RlcmVkIGZvciBvdXRwdXQgdmlhIHRoZSBHcmlkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcmFtZXRlck91dHB1dHMge1xuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgU1NNIFBhcmFtZXRlciByZXNvdXJjZS5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgcGFyYW1ldGVyQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBTU00gUGFyYW1ldGVyIHJlc291cmNlLlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBwYXJhbWV0ZXJOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBTU00gUGFyYW1ldGVyIHJlc291cmNlLlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBwYXJhbWV0ZXJUeXBlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQW4gU1NNIFBhcmFtZXRlciByZWZlcmVuY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVBhcmFtZXRlciBleHRlbmRzIElBd3NDb25zdHJ1Y3Qge1xuICAvKiogU3Ryb25nbHkgdHlwZWQgb3V0cHV0cyAqL1xuICByZWFkb25seSBwYXJhbWV0ZXJPdXRwdXRzOiBQYXJhbWV0ZXJPdXRwdXRzO1xuXG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBTU00gUGFyYW1ldGVyIHJlc291cmNlLlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBwYXJhbWV0ZXJBcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIFNTTSBQYXJhbWV0ZXIgcmVzb3VyY2UuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHBhcmFtZXRlck5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIFNTTSBQYXJhbWV0ZXIgcmVzb3VyY2UuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHBhcmFtZXRlclR5cGU6IHN0cmluZztcblxuICAvKipcbiAgICogR3JhbnRzIHJlYWQgKERlc2NyaWJlUGFyYW1ldGVyLCBHZXRQYXJhbWV0ZXJzLCBHZXRQYXJhbWV0ZXIsIEdldFBhcmFtZXRlckhpc3RvcnkpIHBlcm1pc3Npb25zIG9uIHRoZSBTU00gUGFyYW1ldGVyLlxuICAgKlxuICAgKiBAcGFyYW0gZ3JhbnRlZSB0aGUgcm9sZSB0byBiZSBncmFudGVkIHJlYWQtb25seSBhY2Nlc3MgdG8gdGhlIHBhcmFtZXRlci5cbiAgICovXG4gIGdyYW50UmVhZChncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudDtcblxuICAvKipcbiAgICogR3JhbnRzIHdyaXRlIChQdXRQYXJhbWV0ZXIpIHBlcm1pc3Npb25zIG9uIHRoZSBTU00gUGFyYW1ldGVyLlxuICAgKlxuICAgKiBAcGFyYW0gZ3JhbnRlZSB0aGUgcm9sZSB0byBiZSBncmFudGVkIHdyaXRlIGFjY2VzcyB0byB0aGUgcGFyYW1ldGVyLlxuICAgKi9cbiAgZ3JhbnRXcml0ZShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudDtcbn1cblxuLyoqXG4gKiBBIFN0cmluZyBTU00gUGFyYW1ldGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElTdHJpbmdQYXJhbWV0ZXIgZXh0ZW5kcyBJUGFyYW1ldGVyIHtcbiAgLyoqXG4gICAqIFRoZSBwYXJhbWV0ZXIgdmFsdWUuIFZhbHVlIG11c3Qgbm90IG5lc3QgYW5vdGhlciBwYXJhbWV0ZXIuIERvIG5vdCB1c2Uge3t9fSBpbiB0aGUgdmFsdWUuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGUgVmFsdWVcbiAgICovXG4gIHJlYWRvbmx5IHN0cmluZ1ZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBTdHJpbmdMaXN0IFNTTSBQYXJhbWV0ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVN0cmluZ0xpc3RQYXJhbWV0ZXIgZXh0ZW5kcyBJUGFyYW1ldGVyIHtcbiAgLyoqXG4gICAqIFRoZSBwYXJhbWV0ZXIgdmFsdWUuIFZhbHVlIG11c3Qgbm90IG5lc3QgYW5vdGhlciBwYXJhbWV0ZXIuIERvIG5vdCB1c2Uge3t9fSBpbiB0aGUgdmFsdWUuIFZhbHVlcyBpbiB0aGUgYXJyYXlcbiAgICogY2Fubm90IGNvbnRhaW4gY29tbWFzIChgYCxgYCkuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGUgVmFsdWVcbiAgICovXG4gIHJlYWRvbmx5IHN0cmluZ0xpc3RWYWx1ZTogc3RyaW5nW107XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBuZWVkZWQgdG8gY3JlYXRlIGEgbmV3IFNTTSBQYXJhbWV0ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyYW1ldGVyT3B0aW9ucyBleHRlbmRzIEF3c0NvbnN0cnVjdFByb3BzIHtcbiAgLyoqXG4gICAqIEEgcmVndWxhciBleHByZXNzaW9uIHVzZWQgdG8gdmFsaWRhdGUgdGhlIHBhcmFtZXRlciB2YWx1ZS4gRm9yIGV4YW1wbGUsIGZvciBTdHJpbmcgdHlwZXMgd2l0aCB2YWx1ZXMgcmVzdHJpY3RlZCB0b1xuICAgKiBudW1iZXJzLCB5b3UgY2FuIHNwZWNpZnkgdGhlIGZvbGxvd2luZzogYGBeXFxkKyRgYFxuICAgKlxuICAgKiBAZGVmYXVsdCBubyB2YWxpZGF0aW9uIGlzIHBlcmZvcm1lZFxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dlZFBhdHRlcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBwYXJhbWV0ZXIgdGhhdCB5b3Ugd2FudCB0byBhZGQgdG8gdGhlIHN5c3RlbS5cbiAgICpcbiAgICogQGRlZmF1bHQgbm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYSBuYW1lIHdpbGwgYmUgZ2VuZXJhdGVkIGJ5IENsb3VkRm9ybWF0aW9uXG4gICAqL1xuICByZWFkb25seSBwYXJhbWV0ZXJOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcGFyYW1ldGVyIG5hbWUgaXMgYSBzaW1wbGUgbmFtZS4gQSBwYXJhbWV0ZXIgbmFtZVxuICAgKiB3aXRob3V0IGFueSBcIi9cIiBpcyBjb25zaWRlcmVkIGEgc2ltcGxlIG5hbWUuIElmIHRoZSBwYXJhbWV0ZXIgbmFtZSBpbmNsdWRlc1xuICAgKiBcIi9cIiwgc2V0dGluZyBzaW1wbGVOYW1lIHRvIHRydWUgbWlnaHQgY2F1c2UgdW5pbnRlbmRlZCBpc3N1ZXMgc3VjaFxuICAgKiBhcyBkdXBsaWNhdGUgXCIvXCIgaW4gdGhlIHJlc3VsdGluZyBBUk4uXG4gICAqXG4gICAqIFRoaXMgaXMgcmVxdWlyZWQgb25seSBpZiBgcGFyYW1ldGVyTmFtZWAgaXMgYSB0b2tlbiwgd2hpY2ggbWVhbnMgd2VcbiAgICogYXJlIHVuYWJsZSB0byBkZXRlY3QgaWYgdGhlIG5hbWUgaXMgc2ltcGxlIG9yIFwicGF0aC1saWtlXCIgZm9yIHRoZSBwdXJwb3NlXG4gICAqIG9mIHJlbmRlcmluZyBTU00gcGFyYW1ldGVyIEFSTnMuXG4gICAqXG4gICAqIElmIGBwYXJhbWV0ZXJOYW1lYCBpcyBub3Qgc3BlY2lmaWVkLCBgc2ltcGxlTmFtZWAgbXVzdCBiZSBgdHJ1ZWAgKG9yXG4gICAqIHVuZGVmaW5lZCkgc2luY2UgdGhlIG5hbWUgZ2VuZXJhdGVkIGJ5IEFXUyBDbG91ZEZvcm1hdGlvbiBpcyBhbHdheXMgYVxuICAgKiBzaW1wbGUgbmFtZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhdXRvLWRldGVjdCBiYXNlZCBvbiBgcGFyYW1ldGVyTmFtZWBcbiAgICovXG4gIHJlYWRvbmx5IHNpbXBsZU5hbWU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgdGllciBvZiB0aGUgc3RyaW5nIHBhcmFtZXRlclxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgdGllcj86IFBhcmFtZXRlclRpZXI7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBuZWVkZWQgdG8gY3JlYXRlIGEgU3RyaW5nIFNTTSBwYXJhbWV0ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RyaW5nUGFyYW1ldGVyUHJvcHMgZXh0ZW5kcyBQYXJhbWV0ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyLiBJdCBtYXkgbm90IHJlZmVyZW5jZSBhbm90aGVyIHBhcmFtZXRlciBhbmQgYGB7e319YGAgY2Fubm90IGJlIHVzZWQgaW4gdGhlIHZhbHVlLlxuICAgKlxuICAgKiBUaGlzIGlzIG5ldmVyIG1hcmtlZCBhcyBzZW5zaXRpdmUuXG4gICAqXG4gICAqIGNvbmZsaWN0cyB3aXRoIGBzZW5zaXRpdmVTdHJpbmdWYWx1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHN0cmluZ1ZhbHVlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciBhbHdheXMgbWFya2VkIGFzIHNlbnNpdGl2ZS5cbiAgICpcbiAgICogSXQgbWF5IG5vdCByZWZlcmVuY2UgYW5vdGhlciBwYXJhbWV0ZXIgYW5kIGBge3t9fWBgIGNhbm5vdCBiZSB1c2VkIGluIHRoZSB2YWx1ZS5cbiAgICpcbiAgICogY29uZmxpY3RzIHdpdGggYHN0cmluZ1ZhbHVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2Vuc2l0aXZlU3RyaW5nVmFsdWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBzdHJpbmcgcGFyYW1ldGVyXG4gICAqXG4gICAqIEBkZWZhdWx0IFBhcmFtZXRlclR5cGUuU1RSSU5HXG4gICAqIEBkZXByZWNhdGVkIC0gdHlwZSB3aWxsIGFsd2F5cyBiZSAnU3RyaW5nJ1xuICAgKi9cbiAgcmVhZG9ubHkgdHlwZT86IFBhcmFtZXRlclR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHBhcmFtZXRlciwgc3VjaCBhcyBgdGV4dGAgb3IgYGF3czplYzI6aW1hZ2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBQYXJhbWV0ZXJEYXRhVHlwZS5URVhUXG4gICAqL1xuICByZWFkb25seSBkYXRhVHlwZT86IFBhcmFtZXRlckRhdGFUeXBlO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgbmVlZGVkIHRvIGNyZWF0ZSBhIFN0cmluZ0xpc3QgU1NNIFBhcmFtZXRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0cmluZ0xpc3RQYXJhbWV0ZXJQcm9wcyBleHRlbmRzIFBhcmFtZXRlck9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHZhbHVlcyBvZiB0aGUgcGFyYW1ldGVyLiBJdCBtYXkgbm90IHJlZmVyZW5jZSBhbm90aGVyIHBhcmFtZXRlciBhbmQgYGB7e319YGAgY2Fubm90IGJlIHVzZWQgaW4gdGhlIHZhbHVlLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RyaW5nTGlzdFZhbHVlPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZXMgb2YgdGhlIHBhcmFtZXRlciBhbHdheXMgbWFya2VkIGFzIHNlbnNpdGl2ZS5cbiAgICpcbiAgICogSXQgbWF5IG5vdCByZWZlcmVuY2UgYW5vdGhlciBwYXJhbWV0ZXIgYW5kIGBge3t9fWBgIGNhbm5vdCBiZSB1c2VkIGluIHRoZSB2YWx1ZS5cbiAgICpcbiAgICogY29uZmxpY3RzIHdpdGggYHN0cmluZ0xpc3RWYWx1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNlbnNpdGl2ZVN0cmluZ0xpc3RWYWx1ZT86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEJhc2ljIGZlYXR1cmVzIHNoYXJlZCBhY3Jvc3MgYWxsIHR5cGVzIG9mIFNTTSBQYXJhbWV0ZXJzLlxuICovXG5hYnN0cmFjdCBjbGFzcyBQYXJhbWV0ZXJCYXNlIGV4dGVuZHMgQXdzQ29uc3RydWN0QmFzZSBpbXBsZW1lbnRzIElQYXJhbWV0ZXIge1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgcGFyYW1ldGVyQXJuOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBwYXJhbWV0ZXJOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBwYXJhbWV0ZXJUeXBlOiBzdHJpbmc7XG4gIHB1YmxpYyBnZXQgcGFyYW1ldGVyT3V0cHV0cygpOiBQYXJhbWV0ZXJPdXRwdXRzIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFyYW1ldGVyQXJuOiB0aGlzLnBhcmFtZXRlckFybixcbiAgICAgIHBhcmFtZXRlck5hbWU6IHRoaXMucGFyYW1ldGVyTmFtZSxcbiAgICAgIHBhcmFtZXRlclR5cGU6IHRoaXMucGFyYW1ldGVyVHlwZSxcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBnZXQgb3V0cHV0cygpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJPdXRwdXRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBlbmNyeXB0aW9uIGtleSB0aGF0IGlzIHVzZWQgdG8gZW5jcnlwdCB0aGlzIHBhcmFtZXRlci5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBkZWZhdWx0IG1hc3RlciBrZXlcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlbmNyeXB0aW9uS2V5PzogZW5jcnlwdGlvbi5JS2V5O1xuXG4gIHB1YmxpYyBncmFudFJlYWQoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIGlmICh0aGlzLmVuY3J5cHRpb25LZXkpIHtcbiAgICAgIHRoaXMuZW5jcnlwdGlvbktleS5ncmFudERlY3J5cHQoZ3JhbnRlZSk7XG4gICAgfVxuICAgIHJldHVybiBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWwoe1xuICAgICAgZ3JhbnRlZSxcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgXCJzc206RGVzY3JpYmVQYXJhbWV0ZXJzXCIsXG4gICAgICAgIFwic3NtOkdldFBhcmFtZXRlcnNcIixcbiAgICAgICAgXCJzc206R2V0UGFyYW1ldGVyXCIsXG4gICAgICAgIFwic3NtOkdldFBhcmFtZXRlckhpc3RvcnlcIixcbiAgICAgIF0sXG4gICAgICByZXNvdXJjZUFybnM6IFt0aGlzLnBhcmFtZXRlckFybl0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ3JhbnRXcml0ZShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgaWYgKHRoaXMuZW5jcnlwdGlvbktleSkge1xuICAgICAgdGhpcy5lbmNyeXB0aW9uS2V5LmdyYW50RW5jcnlwdChncmFudGVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGlhbS5HcmFudC5hZGRUb1ByaW5jaXBhbCh7XG4gICAgICBncmFudGVlLFxuICAgICAgYWN0aW9uczogW1wic3NtOlB1dFBhcmFtZXRlclwiXSxcbiAgICAgIHJlc291cmNlQXJuczogW3RoaXMucGFyYW1ldGVyQXJuXSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSB0eXBlIG9mIENGTiBTU00gUGFyYW1ldGVyXG4gKlxuICogVXNpbmcgc3BlY2lmaWMgdHlwZXMgY2FuIGJlIGhlbHBmdWwgaW4gY2F0Y2hpbmcgaW52YWxpZCB2YWx1ZXNcbiAqIGF0IHRoZSBzdGFydCBvZiBjcmVhdGluZyBvciB1cGRhdGluZyBhIHN0YWNrLiBDbG91ZEZvcm1hdGlvbiB2YWxpZGF0ZXNcbiAqIHRoZSB2YWx1ZXMgYWdhaW5zdCBleGlzdGluZyB2YWx1ZXMgaW4gdGhlIGFjY291bnQuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9wYXJhbWV0ZXJzLXNlY3Rpb24tc3RydWN0dXJlLmh0bWwjYXdzLXNzbS1wYXJhbWV0ZXItdHlwZXNcbiAqL1xuZXhwb3J0IGVudW0gUGFyYW1ldGVyVmFsdWVUeXBlIHtcbiAgLyoqXG4gICAqIFN0cmluZ1xuICAgKi9cbiAgU1RSSU5HID0gXCJTdHJpbmdcIixcblxuICAvKipcbiAgICogQW4gQXZhaWxhYmlsaXR5IFpvbmUsIHN1Y2ggYXMgdXMtd2VzdC0yYS5cbiAgICovXG4gIEFXU19FQzJfQVZBSUxBQklMSVRZWk9ORV9OQU1FID0gXCJBV1M6OkVDMjo6QXZhaWxhYmlsaXR5Wm9uZTo6TmFtZVwiLFxuXG4gIC8qKlxuICAgKiBBbiBBbWF6b24gRUMyIGltYWdlIElELCBzdWNoIGFzIGFtaS0wZmY4YTkxNTA3Zjc3Zjg2Ny5cbiAgICovXG4gIEFXU19FQzJfSU1BR0VfSUQgPSBcIkFXUzo6RUMyOjpJbWFnZTo6SWRcIixcblxuICAvKipcbiAgICogQW4gQW1hem9uIEVDMiBpbnN0YW5jZSBJRCwgc3VjaCBhcyBpLTFlNzMxYTMyLlxuICAgKi9cbiAgQVdTX0VDMl9JTlNUQU5DRV9JRCA9IFwiQVdTOjpFQzI6Okluc3RhbmNlOjpJZFwiLFxuXG4gIC8qKlxuICAgKiBBbiBBbWF6b24gRUMyIGtleSBwYWlyIG5hbWUuXG4gICAqL1xuICBBV1NfRUMyX0tFWVBBSVJfS0VZTkFNRSA9IFwiQVdTOjpFQzI6OktleVBhaXI6OktleU5hbWVcIixcblxuICAvKipcbiAgICogQW4gRUMyLUNsYXNzaWMgb3IgZGVmYXVsdCBWUEMgc2VjdXJpdHkgZ3JvdXAgbmFtZSwgc3VjaCBhcyBteS1zZy1hYmMuXG4gICAqL1xuICBBV1NfRUMyX1NFQ1VSSVRZR1JPVVBfR1JPVVBOQU1FID0gXCJBV1M6OkVDMjo6U2VjdXJpdHlHcm91cDo6R3JvdXBOYW1lXCIsXG5cbiAgLyoqXG4gICAqIEEgc2VjdXJpdHkgZ3JvdXAgSUQsIHN1Y2ggYXMgc2ctYTEyM2ZkODUuXG4gICAqL1xuICBBV1NfRUMyX1NFQ1VSSVRZR1JPVVBfSUQgPSBcIkFXUzo6RUMyOjpTZWN1cml0eUdyb3VwOjpJZFwiLFxuXG4gIC8qKlxuICAgKiBBIHN1Ym5ldCBJRCwgc3VjaCBhcyBzdWJuZXQtMTIzYTM1MWUuXG4gICAqL1xuICBBV1NfRUMyX1NVQk5FVF9JRCA9IFwiQVdTOjpFQzI6OlN1Ym5ldDo6SWRcIixcblxuICAvKipcbiAgICogQW4gQW1hem9uIEVCUyB2b2x1bWUgSUQsIHN1Y2ggYXMgdm9sLTNjZGQzZjU2LlxuICAgKi9cbiAgQVdTX0VDMl9WT0xVTUVfSUQgPSBcIkFXUzo6RUMyOjpWb2x1bWU6OklkXCIsXG5cbiAgLyoqXG4gICAqIEEgVlBDIElELCBzdWNoIGFzIHZwYy1hMTIzYmFhMy5cbiAgICovXG4gIEFXU19FQzJfVlBDX0lEID0gXCJBV1M6OkVDMjo6VlBDOjpJZFwiLFxuXG4gIC8qKlxuICAgKiBBbiBBbWF6b24gUm91dGUgNTMgaG9zdGVkIHpvbmUgSUQsIHN1Y2ggYXMgWjIzWVhWNE9WUEwwNEEuXG4gICAqL1xuICBBV1NfUk9VVEU1M19IT1NURURaT05FX0lEID0gXCJBV1M6OlJvdXRlNTM6Okhvc3RlZFpvbmU6OklkXCIsXG59XG5cbi8vIERlcHJlY2F0ZWQgLSBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy82MDM5XG5cbi8qKlxuICogU1NNIHBhcmFtZXRlciB0eXBlXG4gKiBAZGVwcmVjYXRlZCB0aGVzZSB0eXBlcyBhcmUgbm8gbG9uZ2VyIHVzZWRcbiAqL1xuZXhwb3J0IGVudW0gUGFyYW1ldGVyVHlwZSB7XG4gIC8qKlxuICAgKiBTdHJpbmdcbiAgICovXG4gIFNUUklORyA9IFwiU3RyaW5nXCIsXG4gIC8qKlxuICAgKiBTZWN1cmUgU3RyaW5nXG4gICAqXG4gICAqIFBhcmFtZXRlciBTdG9yZSB1c2VzIGFuIEFXUyBLZXkgTWFuYWdlbWVudCBTZXJ2aWNlIChLTVMpIGN1c3RvbWVyIG1hc3RlciBrZXkgKENNSykgdG8gZW5jcnlwdCB0aGUgcGFyYW1ldGVyIHZhbHVlLlxuICAgKiBQYXJhbWV0ZXJzIG9mIHR5cGUgU2VjdXJlU3RyaW5nIGNhbm5vdCBiZSBjcmVhdGVkIGRpcmVjdGx5IGZyb20gYSBDREsgYXBwbGljYXRpb24gZHVlIHRvIENGTiBsaW1pdGF0aW9ucy5cbiAgICpcbiAgICogTk9URTogVGVycmFmb3JtIGRvZXMgbm90IHByZXZlbnQgY3JlYXRpbmcgU2VjdXJlU3RyaW5nIHBhcmFtZXRlcnMsIGJ1dCBpdCBpcyBub3QgcmVjb21tZW5kZWRcbiAgICogYmVjYXVzZSB0aGUgdmFsdWUgd2lsbCBiZSBzdG9yZWQgaW4gcGxhaW4gdGV4dCBpbiB0aGUgc3RhdGUgZmlsZS5cbiAgICovXG4gIFNFQ1VSRV9TVFJJTkcgPSBcIlNlY3VyZVN0cmluZ1wiLFxuICAvKipcbiAgICogU3RyaW5nIExpc3RcbiAgICovXG4gIFNUUklOR19MSVNUID0gXCJTdHJpbmdMaXN0XCIsXG4gIC8qKlxuICAgKiBBbiBBbWF6b24gRUMyIGltYWdlIElELCBzdWNoIGFzIGFtaS0wZmY4YTkxNTA3Zjc3Zjg2N1xuICAgKi9cbiAgQVdTX0VDMl9JTUFHRV9JRCA9IFwiQVdTOjpFQzI6OkltYWdlOjpJZFwiLFxufVxuXG4vKipcbiAqIFNTTSBwYXJhbWV0ZXIgZGF0YSB0eXBlXG4gKi9cbmV4cG9ydCBlbnVtIFBhcmFtZXRlckRhdGFUeXBlIHtcbiAgLyoqXG4gICAqIFRleHRcbiAgICovXG4gIFRFWFQgPSBcInRleHRcIixcbiAgLyoqXG4gICAqIEF3cyBFYzIgSW1hZ2VcbiAgICovXG4gIEFXU19FQzJfSU1BR0UgPSBcImF3czplYzI6aW1hZ2VcIixcbn1cblxuLyoqXG4gKiBTU00gcGFyYW1ldGVyIHRpZXJcbiAqL1xuZXhwb3J0IGVudW0gUGFyYW1ldGVyVGllciB7XG4gIC8qKlxuICAgKiBTdHJpbmdcbiAgICovXG4gIEFEVkFOQ0VEID0gXCJBZHZhbmNlZFwiLFxuICAvKipcbiAgICogU3RyaW5nXG4gICAqL1xuICBJTlRFTExJR0VOVF9USUVSSU5HID0gXCJJbnRlbGxpZ2VudC1UaWVyaW5nXCIsXG4gIC8qKlxuICAgKiBTdHJpbmdcbiAgICovXG4gIFNUQU5EQVJEID0gXCJTdGFuZGFyZFwiLFxufVxuXG4vKipcbiAqIENvbW1vbiBhdHRyaWJ1dGVzIGZvciBzdHJpbmcgcGFyYW1ldGVycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21tb25TdHJpbmdQYXJhbWV0ZXJBdHRyaWJ1dGVzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgc3RvcmUgdmFsdWUuXG4gICAqXG4gICAqIFRoaXMgdmFsdWUgY2FuIGJlIGEgdG9rZW4gb3IgYSBjb25jcmV0ZSBzdHJpbmcuIElmIGl0IGlzIGEgY29uY3JldGUgc3RyaW5nXG4gICAqIGFuZCBpbmNsdWRlcyBcIi9cIiBpdCBtdXN0IGFsc28gYmUgcHJlZml4ZWQgd2l0aCBhIFwiL1wiIChmdWxseS1xdWFsaWZpZWQpLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyYW1ldGVyTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcGFyYW1ldGVyIG5hbWUgaXMgYSBzaW1wbGUgbmFtZS4gQSBwYXJhbWV0ZXIgbmFtZVxuICAgKiB3aXRob3V0IGFueSBcIi9cIiBpcyBjb25zaWRlcmVkIGEgc2ltcGxlIG5hbWUuIElmIHRoZSBwYXJhbWV0ZXIgbmFtZSBpbmNsdWRlc1xuICAgKiBcIi9cIiwgc2V0dGluZyBzaW1wbGVOYW1lIHRvIHRydWUgbWlnaHQgY2F1c2UgdW5pbnRlbmRlZCBpc3N1ZXMgc3VjaFxuICAgKiBhcyBkdXBsaWNhdGUgXCIvXCIgaW4gdGhlIHJlc3VsdGluZyBBUk4uXG4gICAqXG4gICAqIFRoaXMgaXMgcmVxdWlyZWQgb25seSBpZiBgcGFyYW1ldGVyTmFtZWAgaXMgYSB0b2tlbiwgd2hpY2ggbWVhbnMgd2VcbiAgICogYXJlIHVuYWJsZSB0byBkZXRlY3QgaWYgdGhlIG5hbWUgaXMgc2ltcGxlIG9yIFwicGF0aC1saWtlXCIgZm9yIHRoZSBwdXJwb3NlXG4gICAqIG9mIHJlbmRlcmluZyBTU00gcGFyYW1ldGVyIEFSTnMuXG4gICAqXG4gICAqIElmIGBwYXJhbWV0ZXJOYW1lYCBpcyBub3Qgc3BlY2lmaWVkLCBgc2ltcGxlTmFtZWAgbXVzdCBiZSBgdHJ1ZWAgKG9yXG4gICAqIHVuZGVmaW5lZCkgc2luY2UgdGhlIG5hbWUgZ2VuZXJhdGVkIGJ5IEFXUyBDbG91ZEZvcm1hdGlvbiBpcyBhbHdheXMgYVxuICAgKiBzaW1wbGUgbmFtZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhdXRvLWRldGVjdCBiYXNlZCBvbiBgcGFyYW1ldGVyTmFtZWBcbiAgICovXG4gIHJlYWRvbmx5IHNpbXBsZU5hbWU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuNDkuMC9kb2NzL2RhdGEtc291cmNlcy9zc21fcGFyYW1ldGVyI3dpdGhfZGVjcnlwdGlvbiBEYXRhQXdzU3NtUGFyYW1ldGVyI3dpdGhfZGVjcnlwdGlvbn1cbiAgICpcbiAgICogQGRlZmF1bHQ6IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHdpdGhEZWNyeXB0aW9uPzogYm9vbGVhbiB8IElSZXNvbHZhYmxlO1xufVxuXG4vKipcbiAqIEF0dHJpYnV0ZXMgZm9yIHBhcmFtZXRlcnMgb2YgdmFyaW91cyB0eXBlcyBvZiBzdHJpbmcuXG4gKlxuICogQHNlZSBQYXJhbWV0ZXJUeXBlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RyaW5nUGFyYW1ldGVyQXR0cmlidXRlc1xuICBleHRlbmRzIENvbW1vblN0cmluZ1BhcmFtZXRlckF0dHJpYnV0ZXMge1xuICAvKipcbiAgICogVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSB2YWx1ZSB5b3Ugd2lzaCB0byByZXRyaWV2ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgVGhlIGxhdGVzdCB2ZXJzaW9uIHdpbGwgYmUgcmV0cmlldmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbj86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIHN0cmluZyBwYXJhbWV0ZXJcbiAgICpcbiAgICogQGRlZmF1bHQgUGFyYW1ldGVyVHlwZS5TVFJJTkdcbiAgICogQGRlcHJlY2F0ZWQgLSB1c2UgdmFsdWVUeXBlIGluc3RlYWRcbiAgICovXG4gIHJlYWRvbmx5IHR5cGU/OiBQYXJhbWV0ZXJUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgc3RyaW5nIHBhcmFtZXRlciB2YWx1ZVxuICAgKlxuICAgKiBVc2luZyBzcGVjaWZpYyB0eXBlcyBjYW4gYmUgaGVscGZ1bCBpbiBjYXRjaGluZyBpbnZhbGlkIHZhbHVlc1xuICAgKiBhdCB0aGUgc3RhcnQgb2YgY3JlYXRpbmcgb3IgdXBkYXRpbmcgYSBzdGFjay4gQ2xvdWRGb3JtYXRpb24gdmFsaWRhdGVzXG4gICAqIHRoZSB2YWx1ZXMgYWdhaW5zdCBleGlzdGluZyB2YWx1ZXMgaW4gdGhlIGFjY291bnQuXG4gICAqXG4gICAqIE5vdGUgLSBpZiB5b3Ugd2FudCB0byBhbGxvdyB2YWx1ZXMgZnJvbSBkaWZmZXJlbnQgQVdTIGFjY291bnRzLCB1c2VcbiAgICogUGFyYW1ldGVyVmFsdWVUeXBlLlNUUklOR1xuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL3BhcmFtZXRlcnMtc2VjdGlvbi1zdHJ1Y3R1cmUuaHRtbCNhd3Mtc3NtLXBhcmFtZXRlci10eXBlc1xuICAgKlxuICAgKiBAZGVmYXVsdCBQYXJhbWV0ZXJWYWx1ZVR5cGUuU1RSSU5HXG4gICAqL1xuICByZWFkb25seSB2YWx1ZVR5cGU/OiBQYXJhbWV0ZXJWYWx1ZVR5cGU7XG59XG5cbi8qKlxuICogQXR0cmlidXRlcyBmb3IgcGFyYW1ldGVycyBvZiBzdHJpbmcgbGlzdCB0eXBlLlxuICpcbiAqIEBzZWUgUGFyYW1ldGVyVHlwZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpc3RQYXJhbWV0ZXJBdHRyaWJ1dGVzXG4gIGV4dGVuZHMgQ29tbW9uU3RyaW5nUGFyYW1ldGVyQXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHZhbHVlIHlvdSB3aXNoIHRvIHJldHJpZXZlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBUaGUgbGF0ZXN0IHZlcnNpb24gd2lsbCBiZSByZXRyaWV2ZWQuXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgc3RyaW5nIGxpc3QgcGFyYW1ldGVyIHZhbHVlLlxuICAgKlxuICAgKiBVc2luZyBzcGVjaWZpYyB0eXBlcyBjYW4gYmUgaGVscGZ1bCBpbiBjYXRjaGluZyBpbnZhbGlkIHZhbHVlc1xuICAgKiBhdCB0aGUgc3RhcnQgb2YgY3JlYXRpbmcgb3IgdXBkYXRpbmcgYSBzdGFjay4gQ2xvdWRGb3JtYXRpb24gdmFsaWRhdGVzXG4gICAqIHRoZSB2YWx1ZXMgYWdhaW5zdCBleGlzdGluZyB2YWx1ZXMgaW4gdGhlIGFjY291bnQuXG4gICAqXG4gICAqIE5vdGUgLSBpZiB5b3Ugd2FudCB0byBhbGxvdyB2YWx1ZXMgZnJvbSBkaWZmZXJlbnQgQVdTIGFjY291bnRzLCB1c2VcbiAgICogUGFyYW1ldGVyVmFsdWVUeXBlLlNUUklOR1xuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL3BhcmFtZXRlcnMtc2VjdGlvbi1zdHJ1Y3R1cmUuaHRtbCNhd3Mtc3NtLXBhcmFtZXRlci10eXBlc1xuICAgKlxuICAgKiBAZGVmYXVsdCBQYXJhbWV0ZXJWYWx1ZVR5cGUuU1RSSU5HXG4gICAqL1xuICByZWFkb25seSBlbGVtZW50VHlwZT86IFBhcmFtZXRlclZhbHVlVHlwZTtcbn1cblxuLyoqXG4gKiBBdHRyaWJ1dGVzIGZvciBzZWN1cmUgc3RyaW5nIHBhcmFtZXRlcnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VjdXJlU3RyaW5nUGFyYW1ldGVyQXR0cmlidXRlc1xuICBleHRlbmRzIENvbW1vblN0cmluZ1BhcmFtZXRlckF0dHJpYnV0ZXMge1xuICAvKipcbiAgICogVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSB2YWx1ZSB5b3Ugd2lzaCB0byByZXRyaWV2ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBBV1MgQ2xvdWRGb3JtYXRpb24gdXNlcyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHBhcmFtZXRlclxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbj86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGVuY3J5cHRpb24ga2V5IHRoYXQgaXMgdXNlZCB0byBlbmNyeXB0IHRoaXMgcGFyYW1ldGVyXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGVmYXVsdCBtYXN0ZXIga2V5XG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uS2V5PzogZW5jcnlwdGlvbi5JS2V5O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgU3RyaW5nIFNTTSBQYXJhbWV0ZXIuXG4gKiBAcmVzb3VyY2UgYXdzX3NzbV9wYXJhbWV0ZXJcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgc3NtUGFyYW1ldGVyID0gbmV3IHN0b3JhZ2UuU3RyaW5nUGFyYW1ldGVyKHRoaXMsICdteVNzbVBhcmFtZXRlcicsIHtcbiAqICAgIHBhcmFtZXRlck5hbWU6ICdteVNzbVBhcmFtZXRlcicsXG4gKiAgICBzdHJpbmdWYWx1ZTogJ215U3NtUGFyYW1ldGVyVmFsdWUnLFxuICogfSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBTdHJpbmdQYXJhbWV0ZXIgZXh0ZW5kcyBQYXJhbWV0ZXJCYXNlIGltcGxlbWVudHMgSVN0cmluZ1BhcmFtZXRlciB7XG4gIC8qKlxuICAgKiBJbXBvcnRzIGFuIGV4dGVybmFsIHN0cmluZyBwYXJhbWV0ZXIgYnkgbmFtZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVN0cmluZ1BhcmFtZXRlck5hbWUoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHN0cmluZ1BhcmFtZXRlck5hbWU6IHN0cmluZyxcbiAgKTogSVN0cmluZ1BhcmFtZXRlciB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbVN0cmluZ1BhcmFtZXRlckF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7XG4gICAgICBwYXJhbWV0ZXJOYW1lOiBzdHJpbmdQYXJhbWV0ZXJOYW1lLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydHMgYW4gZXh0ZXJuYWwgc3RyaW5nIHBhcmFtZXRlciBieSBBUk4uXG4gICAqXG4gICAqIFRoZSB1bmVuY3J5cHRlZCB2YWx1ZSBvZiBhIFNlY3VyZVN0cmluZyB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgcmF3IHN0YXRlIGFzIHBsYWluLXRleHQuXG4gICAqIFtSZWFkIG1vcmUgYWJvdXQgc2Vuc2l0aXZlIGRhdGEgaW4gc3RhdGVdKGh0dHBzOi8vd3d3LnRlcnJhZm9ybS5pby9kb2NzL3N0YXRlL3NlbnNpdGl2ZS1kYXRhLmh0bWwpLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tU3RyaW5nUGFyYW1ldGVyQXJuKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdHJpbmdQYXJhbWV0ZXJBcm46IHN0cmluZyxcbiAgKTogSVN0cmluZ1BhcmFtZXRlciB7XG4gICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChzdHJpbmdQYXJhbWV0ZXJBcm4pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdHJpbmdQYXJhbWV0ZXJBcm4gY2Fubm90IGJlIGFuIHVucmVzb2x2ZWQgdG9rZW5cIik7XG4gICAgfVxuXG4gICAgLy8gaGFzIHRvIGJlIHRoZSBzYW1lIHJlZ2lvblxuICAgIC8vIHNwbGl0IHRoZSBhcm4gc3RyaW5nIHRvIGdldCB0aGUgcmVnaW9uIHN0cmluZ1xuICAgIC8vIGFybiBzYW1wbGU6IGFybjphd3M6c3NtOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6cGFyYW1ldGVyL2R1bW15TmFtZVxuICAgIGNvbnN0IGFyblBhcnRzID0gc3RyaW5nUGFyYW1ldGVyQXJuLnNwbGl0KFwiOlwiKTtcbiAgICBjb25zdCBzdGFja1JlZ2lvbiA9IEF3c1N0YWNrLm9mQXdzQ29uc3RydWN0KHNjb3BlKS5yZWdpb247XG4gICAgaWYgKGFyblBhcnRzLmxlbmd0aCAhPT0gNikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwidW5leHBlY3RlZCBTdHJpbmdQYXJhbWV0ZXJBcm4gZm9ybWF0XCIpO1xuICAgIH0gZWxzZSBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKHN0YWNrUmVnaW9uKSkge1xuICAgICAgLy8gUmVnaW9uIGlzIHVua25vd24gZHVyaW5nIHN5bnRoZXNpcywgZW1pdCBhIHdhcm5pbmcgZm9yIHZpc2liaWxpdHlcbiAgICAgIC8vIFwiYXdzLWNkay1saWIvYXdzLXNzbTpjcm9zc0FjY291bnRSZWZlcmVuY2VTYW1lUmVnaW9uXCIsXG4gICAgICBBbm5vdGF0aW9ucy5vZihzY29wZSkuYWRkV2FybmluZyhcbiAgICAgICAgXCJDcm9zcy1hY2NvdW50IHJlZmVyZW5jZXMgd2lsbCBvbmx5IHdvcmsgd2l0aGluIHRoZSBzYW1lIHJlZ2lvblwiLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgIVRva2VuLmlzVW5yZXNvbHZlZChzdGFja1JlZ2lvbikgJiZcbiAgICAgIGFyblBhcnRzWzNdICE9PSBzdGFja1JlZ2lvblxuICAgICkge1xuICAgICAgLy8gSWYgdGhlIHJlZ2lvbiBpcyBrbm93biwgaXQgbXVzdCBtYXRjaCB0aGUgcmVnaW9uIHNwZWNpZmllZCBpbiB0aGUgQVJOIHN0cmluZ1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcInN0cmluZ1BhcmFtZXRlckFybiBtdXN0IGJlIGluIHRoZSBzYW1lIHJlZ2lvbiBhcyB0aGUgc3RhY2tcIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1ldGVyVHlwZSA9IFBhcmFtZXRlclZhbHVlVHlwZS5TVFJJTkc7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJOYW1lID1cbiAgICAgIHN0cmluZ1BhcmFtZXRlckFyblxuICAgICAgICAuc3BsaXQoXCIvXCIpXG4gICAgICAgIC5wb3AoKVxuICAgICAgICA/LnJlcGxhY2UoL3BhcmFtZXRlclxcLyQvLCBcIlwiKSA/PyBcIlwiO1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgZGF0YUF3c1NzbVBhcmFtZXRlci5EYXRhQXdzU3NtUGFyYW1ldGVyKFxuICAgICAgc2NvcGUsXG4gICAgICBgJHtpZH0uUGFyYW1ldGVyYCxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogcGFyYW1ldGVyTmFtZSxcbiAgICAgICAgLy8gd2l0aERlY3J5cHRpb24gZGVmYXVsdHMgdG8gdHJ1ZVxuICAgICAgfSxcbiAgICApO1xuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIFBhcmFtZXRlckJhc2Uge1xuICAgICAgcHVibGljIHJlYWRvbmx5IHBhcmFtZXRlck5hbWUgPSBwYXJhbWV0ZXJOYW1lO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHBhcmFtZXRlckFybiA9IHN0cmluZ1BhcmFtZXRlckFybjtcbiAgICAgIHB1YmxpYyByZWFkb25seSBwYXJhbWV0ZXJUeXBlID0gcGFyYW1ldGVyVHlwZTtcbiAgICAgIC8vIFVzZSBjYXV0aW9uOiBUaGlzIHZhbHVlIGlzIG5ldmVyIG1hcmtlZCBhcyBzZW5zaXRpdmUuXG4gICAgICBwdWJsaWMgcmVhZG9ubHkgc3RyaW5nVmFsdWUgPSBkYXRhU291cmNlLmluc2VjdXJlVmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnRzIGFuIGV4dGVybmFsIHN0cmluZyBwYXJhbWV0ZXIgd2l0aCBuYW1lIGFuZCBvcHRpb25hbCB2ZXJzaW9uLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tU3RyaW5nUGFyYW1ldGVyQXR0cmlidXRlcyhcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgYXR0cnM6IFN0cmluZ1BhcmFtZXRlckF0dHJpYnV0ZXMsXG4gICk6IElTdHJpbmdQYXJhbWV0ZXIge1xuICAgIGlmICghYXR0cnMucGFyYW1ldGVyTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwicGFyYW1ldGVyTmFtZSBjYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nXCIpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBhdHRycy50eXBlICYmXG4gICAgICAhW1BhcmFtZXRlclR5cGUuU1RSSU5HLCBQYXJhbWV0ZXJUeXBlLkFXU19FQzJfSU1BR0VfSURdLmluY2x1ZGVzKFxuICAgICAgICBhdHRycy50eXBlLFxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgZnJvbVN0cmluZ1BhcmFtZXRlckF0dHJpYnV0ZXMgZG9lcyBub3Qgc3VwcG9ydCAke2F0dHJzLnR5cGV9LiBQbGVhc2UgdXNlIFBhcmFtZXRlclR5cGUuU1RSSU5HIG9yIFBhcmFtZXRlclR5cGUuQVdTX0VDMl9JTUFHRV9JRGAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGNvbnN0IGZvcmNlRHluYW1pY1JlZmVyZW5jZSA9IGF0dHJzLmZvcmNlRHluYW1pY1JlZmVyZW5jZSA/PyBmYWxzZTtcbiAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE0My4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1zc20vbGliL3BhcmFtZXRlci50cyNMNDgzXG4gICAgLy8gY29uc3QgdHlwZSA9IGF0dHJzLnR5cGUgPz8gYXR0cnMudmFsdWVUeXBlID8/IFBhcmFtZXRlclZhbHVlVHlwZS5TVFJJTkc7XG5cbiAgICBsZXQgbmFtZTogc3RyaW5nO1xuICAgIGlmIChhdHRycy52ZXJzaW9uKSB7XG4gICAgICAvLyBUbyBxdWVyeSBieSBwYXJhbWV0ZXIgdmVyc2lvbiwgdXNlIFwiTmFtZVwiOiBcIm5hbWU6dmVyc2lvblwiLlxuICAgICAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3N5c3RlbXMtbWFuYWdlci9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRQYXJhbWV0ZXIuaHRtbCNzeXN0ZW1zbWFuYWdlci1HZXRQYXJhbWV0ZXItcmVxdWVzdC1OYW1lXG4gICAgICBuYW1lID0gYCR7YXR0cnMucGFyYW1ldGVyTmFtZX06JHtUb2tlbml6YXRpb24uc3RyaW5naWZ5TnVtYmVyKGF0dHJzLnZlcnNpb24pfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWUgPSBhdHRycy5wYXJhbWV0ZXJOYW1lO1xuICAgIH1cbiAgICBjb25zdCBkYXRhU291cmNlID0gbmV3IGRhdGFBd3NTc21QYXJhbWV0ZXIuRGF0YUF3c1NzbVBhcmFtZXRlcihcbiAgICAgIHNjb3BlLFxuICAgICAgYCR7aWR9LlBhcmFtZXRlcmAsXG4gICAgICB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHdpdGhEZWNyeXB0aW9uOiBhdHRycy53aXRoRGVjcnlwdGlvbiwgLy8gZGVmYXVsdHMgdG8gdHJ1ZVxuICAgICAgfSxcbiAgICApO1xuXG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgUGFyYW1ldGVyQmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgcGFyYW1ldGVyTmFtZSA9IGF0dHJzLnBhcmFtZXRlck5hbWU7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgcGFyYW1ldGVyQXJuID0gYXJuRm9yUGFyYW1ldGVyTmFtZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYXR0cnMucGFyYW1ldGVyTmFtZSxcbiAgICAgICAgeyBzaW1wbGVOYW1lOiBhdHRycy5zaW1wbGVOYW1lIH0sXG4gICAgICApO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHBhcmFtZXRlclR5cGUgPSBQYXJhbWV0ZXJUeXBlLlNUUklORzsgLy8gZGF0YVNvdXJjZS50eXBlIC0gaW5zdGVhZCBvZiB0b2tlbiB1c2UgY29uY3JldGVcbiAgICAgIC8vIFVzZSBjYXV0aW9uOiBUaGlzIHZhbHVlIGlzIG5ldmVyIG1hcmtlZCBhcyBzZW5zaXRpdmUuXG4gICAgICBwdWJsaWMgcmVhZG9ubHkgc3RyaW5nVmFsdWUgPSBkYXRhU291cmNlLmluc2VjdXJlVmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnRzIGEgc2VjdXJlIHN0cmluZyBwYXJhbWV0ZXIgZnJvbSB0aGUgU1NNIHBhcmFtZXRlciBzdG9yZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVNlY3VyZVN0cmluZ1BhcmFtZXRlckF0dHJpYnV0ZXMoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIGF0dHJzOiBTZWN1cmVTdHJpbmdQYXJhbWV0ZXJBdHRyaWJ1dGVzLFxuICApOiBJU3RyaW5nUGFyYW1ldGVyIHtcbiAgICBpZiAoIWF0dHJzLnBhcmFtZXRlck5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInBhcmFtZXRlck5hbWUgY2Fubm90IGJlIGFuIGVtcHR5IHN0cmluZ1wiKTtcbiAgICB9XG4gICAgbGV0IG5hbWU6IHN0cmluZztcbiAgICBpZiAoYXR0cnMudmVyc2lvbikge1xuICAgICAgbmFtZSA9IGAke2F0dHJzLnBhcmFtZXRlck5hbWV9OiR7VG9rZW5pemF0aW9uLnN0cmluZ2lmeU51bWJlcihhdHRycy52ZXJzaW9uKX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lID0gYXR0cnMucGFyYW1ldGVyTmFtZTtcbiAgICB9XG4gICAgY29uc3QgcmVzb3VyY2UgPSBuZXcgZGF0YUF3c1NzbVBhcmFtZXRlci5EYXRhQXdzU3NtUGFyYW1ldGVyKFxuICAgICAgc2NvcGUsXG4gICAgICBgJHtpZH0uUGFyYW1ldGVyYCxcbiAgICAgIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgd2l0aERlY3J5cHRpb246IGF0dHJzLndpdGhEZWNyeXB0aW9uLCAvLyBkZWZhdWx0cyB0byB0cnVlXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBQYXJhbWV0ZXJCYXNlIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSBwYXJhbWV0ZXJOYW1lID0gYXR0cnMucGFyYW1ldGVyTmFtZTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBwYXJhbWV0ZXJBcm4gPSBhcm5Gb3JQYXJhbWV0ZXJOYW1lKFxuICAgICAgICB0aGlzLFxuICAgICAgICBhdHRycy5wYXJhbWV0ZXJOYW1lLFxuICAgICAgICB7IHNpbXBsZU5hbWU6IGF0dHJzLnNpbXBsZU5hbWUgfSxcbiAgICAgICk7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgcGFyYW1ldGVyVHlwZSA9IFBhcmFtZXRlclR5cGUuU0VDVVJFX1NUUklORzsgLy8gcmVzb3VyY2UudHlwZSAtIGluc3RlYWQgb2YgdG9rZW4gdXNlIGNvbmNyZXRlXG4gICAgICAvLyB2YWx1ZSBpcyBhbHdheXMgbWFya2VkIGFzIHNlbnNpdGl2ZVxuICAgICAgcHVibGljIHJlYWRvbmx5IHN0cmluZ1ZhbHVlID0gcmVzb3VyY2UudmFsdWU7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZW5jcnlwdGlvbktleSA9IGF0dHJzLmVuY3J5cHRpb25LZXk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8vIC8vIFRPRE86IFVzZSBHcmlkIGFzIGNvbnRleHRQcm92aWRlclxuICAvLyAvKipcbiAgLy8gICogUmVhZHMgdGhlIHZhbHVlIG9mIGFuIFNTTSBwYXJhbWV0ZXIgZHVyaW5nIHN5bnRoZXNpcyB0aHJvdWdoIGFuXG4gIC8vICAqIGVudmlyb25tZW50YWwgY29udGV4dCBwcm92aWRlci5cbiAgLy8gICpcbiAgLy8gICogUmVxdWlyZXMgdGhhdCB0aGUgc3RhY2sgdGhpcyBzY29wZSBpcyBkZWZpbmVkIGluIHdpbGwgaGF2ZSBleHBsaWNpdFxuICAvLyAgKiBhY2NvdW50L3JlZ2lvbiBpbmZvcm1hdGlvbi4gT3RoZXJ3aXNlLCBpdCB3aWxsIGZhaWwgZHVyaW5nIHN5bnRoZXNpcy5cbiAgLy8gICpcbiAgLy8gICogSWYgZGVmYXVsdFZhbHVlIGlzIHByb3ZpZGVkLCBpdCB3aWxsIGJlIHVzZWQgYXMgdGhlIGR1bW15VmFsdWVcbiAgLy8gICogYW5kIHRoZSBDb250ZXh0UHJvdmlkZXIgd2lsbCBiZSB0b2xkIE5PVCB0byByYWlzZSBhbiBlcnJvciBvbiBzeW50aGVzaXNcbiAgLy8gICogaWYgdGhlIFNTTSBQYXJhbWV0ZXIgaXMgbm90IGZvdW5kIGluIHRoZSBhY2NvdW50IGF0IHN5bnRoIHRpbWUuXG4gIC8vICAqL1xuICAvLyBwdWJsaWMgc3RhdGljIHZhbHVlRnJvbUxvb2t1cChcbiAgLy8gICBzY29wZTogQ29uc3RydWN0LFxuICAvLyAgIHBhcmFtZXRlck5hbWU6IHN0cmluZyxcbiAgLy8gICBkZWZhdWx0VmFsdWU/OiBzdHJpbmcsXG4gIC8vICk6IHN0cmluZyB7XG4gIC8vICAgY29uc3QgdmFsdWUgPSBDb250ZXh0UHJvdmlkZXIuZ2V0VmFsdWUoc2NvcGUsIHtcbiAgLy8gICAgIHByb3ZpZGVyOiBjeHNjaGVtYS5Db250ZXh0UHJvdmlkZXIuU1NNX1BBUkFNRVRFUl9QUk9WSURFUixcbiAgLy8gICAgIHByb3BzOiB7IHBhcmFtZXRlck5hbWUgfSxcbiAgLy8gICAgIGR1bW15VmFsdWU6IGRlZmF1bHRWYWx1ZSB8fCBgZHVtbXktdmFsdWUtZm9yLSR7cGFyYW1ldGVyTmFtZX1gLFxuICAvLyAgICAgaWdub3JlRXJyb3JPbk1pc3NpbmdDb250ZXh0OiBkZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCxcbiAgLy8gICB9KS52YWx1ZTtcblxuICAvLyAgIHJldHVybiB2YWx1ZTtcbiAgLy8gfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgdG9rZW4gdGhhdCB3aWxsIHJlc29sdmUgKGR1cmluZyBkZXBsb3ltZW50KSB0byB0aGUgc3RyaW5nIHZhbHVlIG9mIGFuIFNTTSBzdHJpbmcgcGFyYW1ldGVyLlxuICAgKiBAcGFyYW0gc2NvcGUgU29tZSBzY29wZSB3aXRoaW4gYSBzdGFja1xuICAgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZSBUaGUgbmFtZSBvZiB0aGUgU1NNIHBhcmFtZXRlci5cbiAgICogQHBhcmFtIHZlcnNpb24gVGhlIHBhcmFtZXRlciB2ZXJzaW9uIChyZWNvbW1lbmRlZCBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgdmFsdWUgd29uJ3QgY2hhbmdlIGR1cmluZyBkZXBsb3ltZW50KVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2YWx1ZUZvclN0cmluZ1BhcmFtZXRlcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIHBhcmFtZXRlck5hbWU6IHN0cmluZyxcbiAgICB2ZXJzaW9uPzogbnVtYmVyLFxuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBTdHJpbmdQYXJhbWV0ZXIudmFsdWVGb3JUeXBlZFN0cmluZ1BhcmFtZXRlclYyKFxuICAgICAgc2NvcGUsXG4gICAgICBwYXJhbWV0ZXJOYW1lLFxuICAgICAgUGFyYW1ldGVyVmFsdWVUeXBlLlNUUklORyxcbiAgICAgIHZlcnNpb24sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgdG9rZW4gdGhhdCB3aWxsIHJlc29sdmUgKGR1cmluZyBkZXBsb3ltZW50KSB0byB0aGUgc3RyaW5nIHZhbHVlIG9mIGFuIFNTTSBzdHJpbmcgcGFyYW1ldGVyLlxuICAgKiBAcGFyYW0gc2NvcGUgU29tZSBzY29wZSB3aXRoaW4gYSBzdGFja1xuICAgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZSBUaGUgbmFtZSBvZiB0aGUgU1NNIHBhcmFtZXRlci5cbiAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIFNTTSBwYXJhbWV0ZXIuXG4gICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBwYXJhbWV0ZXIgdmVyc2lvbiAocmVjb21tZW5kZWQgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIHZhbHVlIHdvbid0IGNoYW5nZSBkdXJpbmcgZGVwbG95bWVudClcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmFsdWVGb3JUeXBlZFN0cmluZ1BhcmFtZXRlclYyKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgcGFyYW1ldGVyTmFtZTogc3RyaW5nLFxuICAgIHR5cGUgPSBQYXJhbWV0ZXJWYWx1ZVR5cGUuU1RSSU5HLFxuICAgIHZlcnNpb24/OiBudW1iZXIsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RhY2sgPSBBd3NTdGFjay5vZihzY29wZSk7XG4gICAgY29uc3QgaWQgPSBtYWtlSWRlbnRpdHlGb3JJbXBvcnRlZFZhbHVlKHBhcmFtZXRlck5hbWUpO1xuICAgIGNvbnN0IGV4aXN0cyA9IHN0YWNrLm5vZGUudHJ5RmluZENoaWxkKGlkKSBhcyBJU3RyaW5nUGFyYW1ldGVyO1xuXG4gICAgaWYgKGV4aXN0cykge1xuICAgICAgcmV0dXJuIGV4aXN0cy5zdHJpbmdWYWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5mcm9tU3RyaW5nUGFyYW1ldGVyQXR0cmlidXRlcyhzdGFjaywgaWQsIHtcbiAgICAgIHBhcmFtZXRlck5hbWUsXG4gICAgICB2ZXJzaW9uLFxuICAgICAgdmFsdWVUeXBlOiB0eXBlLFxuICAgIH0pLnN0cmluZ1ZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSB0b2tlbiB0aGF0IHdpbGwgcmVzb2x2ZSAoZHVyaW5nIGRlcGxveW1lbnQpIHRvIHRoZSBzdHJpbmcgdmFsdWUgb2YgYW4gU1NNIHN0cmluZyBwYXJhbWV0ZXIuXG4gICAqIEBwYXJhbSBzY29wZSBTb21lIHNjb3BlIHdpdGhpbiBhIHN0YWNrXG4gICAqIEBwYXJhbSBwYXJhbWV0ZXJOYW1lIFRoZSBuYW1lIG9mIHRoZSBTU00gcGFyYW1ldGVyLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgU1NNIHBhcmFtZXRlci5cbiAgICogQHBhcmFtIHZlcnNpb24gVGhlIHBhcmFtZXRlciB2ZXJzaW9uIChyZWNvbW1lbmRlZCBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgdmFsdWUgd29uJ3QgY2hhbmdlIGR1cmluZyBkZXBsb3ltZW50KVxuICAgKiBAZGVwcmVjYXRlZCAtIHVzZSB2YWx1ZUZvclR5cGVkU3RyaW5nUGFyYW1ldGVyVjIgaW5zdGVhZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2YWx1ZUZvclR5cGVkU3RyaW5nUGFyYW1ldGVyKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgcGFyYW1ldGVyTmFtZTogc3RyaW5nLFxuICAgIHR5cGUgPSBQYXJhbWV0ZXJUeXBlLlNUUklORyxcbiAgICB2ZXJzaW9uPzogbnVtYmVyLFxuICApOiBzdHJpbmcge1xuICAgIGlmICh0eXBlID09PSBQYXJhbWV0ZXJUeXBlLlNUUklOR19MSVNUKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwidmFsdWVGb3JUeXBlZFN0cmluZ1BhcmFtZXRlciBkb2VzIG5vdCBzdXBwb3J0IFNUUklOR19MSVNULCBcIiArXG4gICAgICAgICAgXCJ1c2UgdmFsdWVGb3JUeXBlZExpc3RQYXJhbWV0ZXIgaW5zdGVhZFwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgc3RhY2sgPSBBd3NTdGFjay5vZihzY29wZSk7XG4gICAgY29uc3QgaWQgPSBtYWtlSWRlbnRpdHlGb3JJbXBvcnRlZFZhbHVlKHBhcmFtZXRlck5hbWUpO1xuICAgIGNvbnN0IGV4aXN0cyA9IHN0YWNrLm5vZGUudHJ5RmluZENoaWxkKGlkKSBhcyBJU3RyaW5nUGFyYW1ldGVyO1xuXG4gICAgaWYgKGV4aXN0cykge1xuICAgICAgcmV0dXJuIGV4aXN0cy5zdHJpbmdWYWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5mcm9tU3RyaW5nUGFyYW1ldGVyQXR0cmlidXRlcyhzdGFjaywgaWQsIHtcbiAgICAgIHBhcmFtZXRlck5hbWUsXG4gICAgICB2ZXJzaW9uLFxuICAgICAgdHlwZSxcbiAgICB9KS5zdHJpbmdWYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgdG9rZW4gdGhhdCB3aWxsIHJlc29sdmUgKGR1cmluZyBkZXBsb3ltZW50KVxuICAgKiBAcGFyYW0gc2NvcGUgU29tZSBzY29wZSB3aXRoaW4gYSBzdGFja1xuICAgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZSBUaGUgbmFtZSBvZiB0aGUgU1NNIHBhcmFtZXRlclxuICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgcGFyYW1ldGVyIHZlcnNpb24gKHJlcXVpcmVkIGZvciBzZWN1cmUgc3RyaW5ncylcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBTZWNyZXRWYWx1ZS5zc21TZWN1cmUoKWAgaW5zdGVhZCwgaXQgd2lsbCBjb3JyZWN0bHkgdHlwZSB0aGUgaW1wb3J0ZWQgdmFsdWUgYXMgYSBgU2VjcmV0VmFsdWVgIGFuZCBhbGxvdyBpbXBvcnRpbmcgd2l0aG91dCB2ZXJzaW9uLiBgU2VjcmV0VmFsdWVgIGxpdmVzIGluIHRoZSBjb3JlIGBhd3MtY2RrLWxpYmAgbW9kdWxlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2YWx1ZUZvclNlY3VyZVN0cmluZ1BhcmFtZXRlcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIHBhcmFtZXRlck5hbWU6IHN0cmluZyxcbiAgICB2ZXJzaW9uOiBudW1iZXIsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RhY2sgPSBBd3NTdGFjay5vZihzY29wZSk7XG4gICAgY29uc3QgaWQgPSBtYWtlSWRlbnRpdHlGb3JJbXBvcnRlZFZhbHVlKHBhcmFtZXRlck5hbWUpO1xuICAgIGNvbnN0IGV4aXN0cyA9IHN0YWNrLm5vZGUudHJ5RmluZENoaWxkKGlkKSBhcyBJU3RyaW5nUGFyYW1ldGVyO1xuICAgIGlmIChleGlzdHMpIHtcbiAgICAgIHJldHVybiBleGlzdHMuc3RyaW5nVmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZnJvbVNlY3VyZVN0cmluZ1BhcmFtZXRlckF0dHJpYnV0ZXMoc3RhY2ssIGlkLCB7XG4gICAgICBwYXJhbWV0ZXJOYW1lLFxuICAgICAgdmVyc2lvbixcbiAgICB9KS5zdHJpbmdWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBwYXJhbWV0ZXJBcm46IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHBhcmFtZXRlck5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHBhcmFtZXRlclR5cGU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHN0cmluZ1ZhbHVlOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZTogc3NtUGFyYW1ldGVyLlNzbVBhcmFtZXRlcjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogU3RyaW5nUGFyYW1ldGVyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcbiAgICBjb25zdCBwYXJhbWV0ZXJOYW1lID1cbiAgICAgIHByb3BzLnBhcmFtZXRlck5hbWUgfHxcbiAgICAgIHRoaXMuc3RhY2sudW5pcXVlUmVzb3VyY2VOYW1lKHRoaXMsIHtcbiAgICAgICAgcHJlZml4OiB0aGlzLmdyaWRVVUlELFxuICAgICAgfSk7XG5cbiAgICBpZiAocHJvcHMuc3RyaW5nVmFsdWUgJiYgcHJvcHMuc2Vuc2l0aXZlU3RyaW5nVmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDYW5ub3Qgc3BlY2lmeSBib3RoICdzdHJpbmdWYWx1ZScgYW5kICdzZW5zaXRpdmVTdHJpbmdWYWx1ZSdcIixcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHN0cmluZ1ZhbHVlID0gcHJvcHMuc3RyaW5nVmFsdWUgPz8gcHJvcHMuc2Vuc2l0aXZlU3RyaW5nVmFsdWU7XG4gICAgY29uc3QgaXNTZW5zaXRpdmUgPSAhIXByb3BzLnNlbnNpdGl2ZVN0cmluZ1ZhbHVlO1xuICAgIGlmICghc3RyaW5nVmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJFaXRoZXIgJ3N0cmluZ1ZhbHVlJyBvciAnc2Vuc2l0aXZlU3RyaW5nVmFsdWUnIG11c3QgYmUgc3BlY2lmaWVkXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5hbGxvd2VkUGF0dGVybikge1xuICAgICAgX2Fzc2VydFZhbGlkVmFsdWUoc3RyaW5nVmFsdWUsIHByb3BzLmFsbG93ZWRQYXR0ZXJuKTtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZVBhcmFtZXRlck5hbWUocGFyYW1ldGVyTmFtZSk7XG5cbiAgICBpZiAocHJvcHMuZGVzY3JpcHRpb24gJiYgcHJvcHMuZGVzY3JpcHRpb24/Lmxlbmd0aCA+IDEwMjQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkRlc2NyaXB0aW9uIGNhbm5vdCBiZSBsb25nZXIgdGhhbiAxMDI0IGNoYXJhY3RlcnMuXCIpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy50eXBlICYmIHByb3BzLnR5cGUgPT09IFBhcmFtZXRlclR5cGUuQVdTX0VDMl9JTUFHRV9JRCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIlRoZSB0eXBlIG11c3QgZWl0aGVyIGJlIFBhcmFtZXRlclR5cGUuU1RSSU5HIG9yIFBhcmFtZXRlclR5cGUuU1RSSU5HX0xJU1QuIERpZCB5b3UgbWVhbiB0byBzZXQgZGF0YVR5cGU6IFBhcmFtZXRlckRhdGFUeXBlLkFXU19FQzJfSU1BR0UgaW5zdGVhZD9cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyBzc21QYXJhbWV0ZXIuU3NtUGFyYW1ldGVyKHRoaXMsIFwiUmVzb3VyY2VcIiwge1xuICAgICAgYWxsb3dlZFBhdHRlcm46IHByb3BzLmFsbG93ZWRQYXR0ZXJuLFxuICAgICAgZGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgbmFtZTogcGFyYW1ldGVyTmFtZSxcbiAgICAgIHRpZXI6IHByb3BzLnRpZXIsXG4gICAgICB0eXBlOiBwcm9wcy50eXBlID8/IFBhcmFtZXRlclR5cGUuU1RSSU5HLFxuICAgICAgZGF0YVR5cGU6IHByb3BzLmRhdGFUeXBlLFxuICAgICAgaW5zZWN1cmVWYWx1ZTogcHJvcHMuc3RyaW5nVmFsdWUsXG4gICAgICB2YWx1ZTogcHJvcHMuc2Vuc2l0aXZlU3RyaW5nVmFsdWUsXG4gICAgfSk7XG5cbiAgICB0aGlzLnBhcmFtZXRlck5hbWUgPSB0aGlzLnJlc291cmNlLm5hbWU7XG4gICAgdGhpcy5wYXJhbWV0ZXJBcm4gPSBhcm5Gb3JQYXJhbWV0ZXJOYW1lKHRoaXMsIHRoaXMucGFyYW1ldGVyTmFtZSwge1xuICAgICAgcGh5c2ljYWxOYW1lOiBwYXJhbWV0ZXJOYW1lLFxuICAgICAgc2ltcGxlTmFtZTogcHJvcHMuc2ltcGxlTmFtZSxcbiAgICB9KTtcblxuICAgIHRoaXMucGFyYW1ldGVyVHlwZSA9IHRoaXMucmVzb3VyY2UudHlwZTtcbiAgICB0aGlzLnN0cmluZ1ZhbHVlID0gaXNTZW5zaXRpdmVcbiAgICAgID8gdGhpcy5yZXNvdXJjZS52YWx1ZVxuICAgICAgOiB0aGlzLnJlc291cmNlLmluc2VjdXJlVmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFN0cmluZ0xpc3QgU1NNIFBhcmFtZXRlci5cbiAqIEByZXNvdXJjZSBBV1M6OlNTTTo6UGFyYW1ldGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHJpbmdMaXN0UGFyYW1ldGVyXG4gIGV4dGVuZHMgUGFyYW1ldGVyQmFzZVxuICBpbXBsZW1lbnRzIElTdHJpbmdMaXN0UGFyYW1ldGVyXG57XG4gIC8qKlxuICAgKiBJbXBvcnRzIGFuIGV4dGVybmFsIHBhcmFtZXRlciBvZiB0eXBlIHN0cmluZyBsaXN0LlxuICAgKiBSZXR1cm5zIGEgdG9rZW4gYW5kIHNob3VsZCBub3QgYmUgcGFyc2VkLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tU3RyaW5nTGlzdFBhcmFtZXRlck5hbWUoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHN0cmluZ0xpc3RQYXJhbWV0ZXJOYW1lOiBzdHJpbmcsXG4gICk6IElTdHJpbmdMaXN0UGFyYW1ldGVyIHtcbiAgICAvLyByZWY6IGR5bmFtaWMgcmVmXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTQzLjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLXNzbS9saWIvcGFyYW1ldGVyLnRzI0w2NzBcbiAgICByZXR1cm4gU3RyaW5nTGlzdFBhcmFtZXRlci5mcm9tTGlzdFBhcmFtZXRlckF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7XG4gICAgICBwYXJhbWV0ZXJOYW1lOiBzdHJpbmdMaXN0UGFyYW1ldGVyTmFtZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnRzIGFuIGV4dGVybmFsIHN0cmluZyBsaXN0IHBhcmFtZXRlciB3aXRoIG5hbWUgYW5kIG9wdGlvbmFsIHZlcnNpb24uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21MaXN0UGFyYW1ldGVyQXR0cmlidXRlcyhcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgYXR0cnM6IExpc3RQYXJhbWV0ZXJBdHRyaWJ1dGVzLFxuICApOiBJU3RyaW5nTGlzdFBhcmFtZXRlciB7XG4gICAgaWYgKCFhdHRycy5wYXJhbWV0ZXJOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwYXJhbWV0ZXJOYW1lIGNhbm5vdCBiZSBhbiBlbXB0eSBzdHJpbmdcIik7XG4gICAgfVxuXG4gICAgbGV0IG5hbWU6IHN0cmluZztcbiAgICBpZiAoYXR0cnMudmVyc2lvbikge1xuICAgICAgbmFtZSA9IGAke2F0dHJzLnBhcmFtZXRlck5hbWV9OiR7VG9rZW5pemF0aW9uLnN0cmluZ2lmeU51bWJlcihhdHRycy52ZXJzaW9uKX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lID0gYXR0cnMucGFyYW1ldGVyTmFtZTtcbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IGF0dHJzLmVsZW1lbnRUeXBlID8/IFBhcmFtZXRlclZhbHVlVHlwZS5TVFJJTkc7XG4gICAgY29uc3QgdmFsdWVUeXBlID0gYExpc3Q8JHt0eXBlfT5gO1xuXG4gICAgY29uc3QgcmVzb3VyY2UgPSBuZXcgZGF0YUF3c1NzbVBhcmFtZXRlci5EYXRhQXdzU3NtUGFyYW1ldGVyKFxuICAgICAgc2NvcGUsXG4gICAgICBgJHtpZH0uUGFyYW1ldGVyYCxcbiAgICAgIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgd2l0aERlY3J5cHRpb246IGF0dHJzLndpdGhEZWNyeXB0aW9uLCAvLyBkZWZhdWx0cyB0byB0cnVlXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBQYXJhbWV0ZXJCYXNlIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSBwYXJhbWV0ZXJOYW1lID0gYXR0cnMucGFyYW1ldGVyTmFtZTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBwYXJhbWV0ZXJBcm4gPSBhcm5Gb3JQYXJhbWV0ZXJOYW1lKFxuICAgICAgICB0aGlzLFxuICAgICAgICBhdHRycy5wYXJhbWV0ZXJOYW1lLFxuICAgICAgICB7IHNpbXBsZU5hbWU6IGF0dHJzLnNpbXBsZU5hbWUgfSxcbiAgICAgICk7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgcGFyYW1ldGVyVHlwZSA9IHZhbHVlVHlwZTsgLy8gaXQgZG9lc24ndCByZWFsbHkgbWF0dGVyIHdoYXQgdGhpcyBpcyBzaW5jZSBhIENmblBhcmFtZXRlciBjYW4gb25seSBiZSBgU3RyaW5nIHwgU3RyaW5nTGlzdGBcbiAgICAgIHB1YmxpYyByZWFkb25seSBzdHJpbmdMaXN0VmFsdWUgPSBGbi5zcGxpdChcIixcIiwgcmVzb3VyY2UuaW5zZWN1cmVWYWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgdG9rZW4gdGhhdCB3aWxsIHJlc29sdmUgKGR1cmluZyBkZXBsb3ltZW50KSB0byB0aGUgbGlzdCB2YWx1ZSBvZiBhbiBTU00gU3RyaW5nTGlzdCBwYXJhbWV0ZXIuXG4gICAqIEBwYXJhbSBzY29wZSBTb21lIHNjb3BlIHdpdGhpbiBhIHN0YWNrXG4gICAqIEBwYXJhbSBwYXJhbWV0ZXJOYW1lIFRoZSBuYW1lIG9mIHRoZSBTU00gcGFyYW1ldGVyLlxuICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgU1NNIGxpc3QgcGFyYW1ldGVyXG4gICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBwYXJhbWV0ZXIgdmVyc2lvbiAocmVjb21tZW5kZWQgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIHZhbHVlIHdvbid0IGNoYW5nZSBkdXJpbmcgZGVwbG95bWVudClcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmFsdWVGb3JUeXBlZExpc3RQYXJhbWV0ZXIoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBwYXJhbWV0ZXJOYW1lOiBzdHJpbmcsXG4gICAgdHlwZSA9IFBhcmFtZXRlclZhbHVlVHlwZS5TVFJJTkcsXG4gICAgdmVyc2lvbj86IG51bWJlcixcbiAgKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHN0YWNrID0gQXdzU3RhY2sub2Yoc2NvcGUpO1xuICAgIGNvbnN0IGlkID0gbWFrZUlkZW50aXR5Rm9ySW1wb3J0ZWRWYWx1ZShwYXJhbWV0ZXJOYW1lKTtcbiAgICBjb25zdCBleGlzdHMgPSBzdGFjay5ub2RlLnRyeUZpbmRDaGlsZChpZCkgYXMgSVN0cmluZ0xpc3RQYXJhbWV0ZXI7XG5cbiAgICBpZiAoZXhpc3RzKSB7XG4gICAgICByZXR1cm4gZXhpc3RzLnN0cmluZ0xpc3RWYWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5mcm9tTGlzdFBhcmFtZXRlckF0dHJpYnV0ZXMoc3RhY2ssIGlkLCB7XG4gICAgICBwYXJhbWV0ZXJOYW1lLFxuICAgICAgZWxlbWVudFR5cGU6IHR5cGUsXG4gICAgICB2ZXJzaW9uLFxuICAgIH0pLnN0cmluZ0xpc3RWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBwYXJhbWV0ZXJBcm46IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHBhcmFtZXRlck5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHBhcmFtZXRlclR5cGU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHN0cmluZ0xpc3RWYWx1ZTogc3RyaW5nW107XG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZTogc3NtUGFyYW1ldGVyLlNzbVBhcmFtZXRlcjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogU3RyaW5nTGlzdFBhcmFtZXRlclByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgY29uc3QgcGFyYW1ldGVyTmFtZSA9XG4gICAgICBwcm9wcy5wYXJhbWV0ZXJOYW1lIHx8XG4gICAgICB0aGlzLnN0YWNrLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7XG4gICAgICAgIHByZWZpeDogdGhpcy5ncmlkVVVJRCxcbiAgICAgIH0pO1xuXG4gICAgaWYgKHByb3BzLnN0cmluZ0xpc3RWYWx1ZSAmJiBwcm9wcy5zZW5zaXRpdmVTdHJpbmdMaXN0VmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDYW5ub3Qgc3BlY2lmeSBib3RoICdzdHJpbmdMaXN0VmFsdWUnIGFuZCAnc2Vuc2l0aXZlU3RyaW5nTGlzdFZhbHVlJ1wiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgc3RyaW5nTGlzdFZhbHVlID1cbiAgICAgIHByb3BzLnN0cmluZ0xpc3RWYWx1ZSA/PyBwcm9wcy5zZW5zaXRpdmVTdHJpbmdMaXN0VmFsdWU7XG4gICAgY29uc3QgaXNTZW5zaXRpdmUgPSAhIXByb3BzLnNlbnNpdGl2ZVN0cmluZ0xpc3RWYWx1ZTtcbiAgICBpZiAoIXN0cmluZ0xpc3RWYWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkVpdGhlciAnc3RyaW5nTGlzdFZhbHVlJyBvciAnc2Vuc2l0aXZlU3RyaW5nTGlzdFZhbHVlJyBtdXN0IGJlIHNwZWNpZmllZFwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBzdHJpbmdMaXN0VmFsdWUuZmluZChcbiAgICAgICAgKHN0cikgPT4gIVRva2VuLmlzVW5yZXNvbHZlZChzdHIpICYmIHN0ci5pbmRleE9mKFwiLFwiKSAhPT0gLTEsXG4gICAgICApXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiVmFsdWVzIG9mIGEgU3RyaW5nTGlzdCBTU00gUGFyYW1ldGVyIGNhbm5vdCBjb250YWluIHRoZSAnLCcgY2hhcmFjdGVyLiBVc2UgYSBzdHJpbmcgcGFyYW1ldGVyIGluc3RlYWQuXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5hbGxvd2VkUGF0dGVybiAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKHN0cmluZ0xpc3RWYWx1ZSkpIHtcbiAgICAgIHN0cmluZ0xpc3RWYWx1ZS5mb3JFYWNoKChzdHIpID0+XG4gICAgICAgIF9hc3NlcnRWYWxpZFZhbHVlKHN0ciwgcHJvcHMuYWxsb3dlZFBhdHRlcm4hKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVQYXJhbWV0ZXJOYW1lKHBhcmFtZXRlck5hbWUpO1xuXG4gICAgaWYgKHByb3BzLmRlc2NyaXB0aW9uICYmIHByb3BzLmRlc2NyaXB0aW9uPy5sZW5ndGggPiAxMDI0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEZXNjcmlwdGlvbiBjYW5ub3QgYmUgbG9uZ2VyIHRoYW4gMTAyNCBjaGFyYWN0ZXJzLlwiKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlc291cmNlID0gbmV3IHNzbVBhcmFtZXRlci5Tc21QYXJhbWV0ZXIodGhpcywgXCJSZXNvdXJjZVwiLCB7XG4gICAgICBhbGxvd2VkUGF0dGVybjogcHJvcHMuYWxsb3dlZFBhdHRlcm4sXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICBuYW1lOiBwYXJhbWV0ZXJOYW1lLFxuICAgICAgdGllcjogcHJvcHMudGllcixcbiAgICAgIHR5cGU6IFBhcmFtZXRlclR5cGUuU1RSSU5HX0xJU1QsXG4gICAgICBpbnNlY3VyZVZhbHVlOiBwcm9wcy5zdHJpbmdMaXN0VmFsdWVcbiAgICAgICAgPyBGbi5qb2luKFwiLFwiLCBwcm9wcy5zdHJpbmdMaXN0VmFsdWUpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgdmFsdWU6IHByb3BzLnNlbnNpdGl2ZVN0cmluZ0xpc3RWYWx1ZVxuICAgICAgICA/IEZuLmpvaW4oXCIsXCIsIHByb3BzLnNlbnNpdGl2ZVN0cmluZ0xpc3RWYWx1ZSlcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgdGhpcy5wYXJhbWV0ZXJOYW1lID0gdGhpcy5yZXNvdXJjZS5uYW1lO1xuICAgIHRoaXMucGFyYW1ldGVyQXJuID0gYXJuRm9yUGFyYW1ldGVyTmFtZSh0aGlzLCB0aGlzLnBhcmFtZXRlck5hbWUsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTogcGFyYW1ldGVyTmFtZSxcbiAgICAgIHNpbXBsZU5hbWU6IHByb3BzLnNpbXBsZU5hbWUsXG4gICAgfSk7XG5cbiAgICB0aGlzLnBhcmFtZXRlclR5cGUgPSB0aGlzLnJlc291cmNlLnR5cGU7XG4gICAgdGhpcy5zdHJpbmdMaXN0VmFsdWUgPSBpc1NlbnNpdGl2ZVxuICAgICAgPyBGbi5zcGxpdChcIixcIiwgdGhpcy5yZXNvdXJjZS52YWx1ZSlcbiAgICAgIDogRm4uc3BsaXQoXCIsXCIsIHRoaXMucmVzb3VyY2UuaW5zZWN1cmVWYWx1ZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgd2hldGhlciBhIHN1cHBsaWVkIHZhbHVlIGNvbmZvcm1zIHRvIHRoZSBhbGxvd2VkUGF0dGVybiwgZ3JhbnRlZCBuZWl0aGVyIGlzIGFuIHVucmVzb2x2ZWQgdG9rZW4uXG4gKlxuICogQHBhcmFtIHZhbHVlICAgICAgICAgIHRoZSB2YWx1ZSB0byBiZSB2YWxpZGF0ZWQuXG4gKiBAcGFyYW0gYWxsb3dlZFBhdHRlcm4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byB1c2UgZm9yIHZhbGlkYXRpb24uXG4gKlxuICogQHRocm93cyBpZiB0aGUgYGB2YWx1ZWBgIGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIGBgYWxsb3dlZFBhdHRlcm5gYCBhbmQgbmVpdGhlciBpcyBhbiB1bnJlc29sdmVkIHRva2VuIChwZXJcbiAqICAgICAgICAgYGBjZGsudW5yZXNvbHZlZGBgKS5cbiAqL1xuZnVuY3Rpb24gX2Fzc2VydFZhbGlkVmFsdWUodmFsdWU6IHN0cmluZywgYWxsb3dlZFBhdHRlcm46IHN0cmluZyk6IHZvaWQge1xuICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKHZhbHVlKSB8fCBUb2tlbi5pc1VucmVzb2x2ZWQoYWxsb3dlZFBhdHRlcm4pKSB7XG4gICAgLy8gVW5hYmxlIHRvIHBlcmZvcm0gdmFsaWRhdGlvbnMgYWdhaW5zdCB1bnJlc29sdmVkIHRva2Vuc1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIW5ldyBSZWdFeHAoYWxsb3dlZFBhdHRlcm4pLnRlc3QodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSBzdXBwbGllZCB2YWx1ZSAoJHt2YWx1ZX0pIGRvZXMgbm90IG1hdGNoIHRoZSBzcGVjaWZpZWQgYWxsb3dlZFBhdHRlcm4gKCR7YWxsb3dlZFBhdHRlcm59KWAsXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYWtlSWRlbnRpdHlGb3JJbXBvcnRlZFZhbHVlKHBhcmFtZXRlck5hbWU6IHN0cmluZykge1xuICByZXR1cm4gYFNzbVBhcmFtZXRlclZhbHVlOiR7cGFyYW1ldGVyTmFtZX06Qzk2NTg0QjYtRjAwQS00NjRFLUFEMTktNTNBRkY0QjA1MTE4YDtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQYXJhbWV0ZXJOYW1lKHBhcmFtZXRlck5hbWU6IHN0cmluZykge1xuICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKHBhcmFtZXRlck5hbWUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwYXJhbWV0ZXJOYW1lLmxlbmd0aCA+IDIwNDgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJuYW1lIGNhbm5vdCBiZSBsb25nZXIgdGhhbiAyMDQ4IGNoYXJhY3RlcnMuXCIpO1xuICB9XG4gIGlmICghcGFyYW1ldGVyTmFtZS5tYXRjaCgvXltcXC9cXHcuLV0rJC8pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYG5hbWUgbXVzdCBvbmx5IGNvbnRhaW4gbGV0dGVycywgbnVtYmVycywgYW5kIHRoZSBmb2xsb3dpbmcgNCBzeW1ib2xzIC4tXy87IGdvdCAke3BhcmFtZXRlck5hbWV9YCxcbiAgICApO1xuICB9XG59XG4iXX0=