terraconstructs 0.0.11 → 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 +7 -5
  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,455 @@
1
+ "use strict";
2
+ var _a, _b, _c, _d, _e;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.NatInstanceImage = exports.NatInstanceProviderV2 = exports.NatInstanceProvider = exports.NatGatewayProvider = exports.NatProvider = exports.NatTrafficDirection = 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-ec2/lib/nat.ts
7
+ const cdktf_1 = require("cdktf");
8
+ const connections_1 = require("./connections");
9
+ const instance_1 = require("./instance");
10
+ const instance_types_1 = require("./instance-types");
11
+ const machine_image_1 = require("./machine-image");
12
+ const port_1 = require("./port");
13
+ const security_group_1 = require("./security-group");
14
+ const user_data_1 = require("./user-data");
15
+ const vpc_1 = require("./vpc");
16
+ const iam = require("../iam");
17
+ /**
18
+ * Direction of traffic to allow all by default.
19
+ */
20
+ var NatTrafficDirection;
21
+ (function (NatTrafficDirection) {
22
+ /**
23
+ * Allow all outbound traffic and disallow all inbound traffic.
24
+ */
25
+ NatTrafficDirection["OUTBOUND_ONLY"] = "OUTBOUND_ONLY";
26
+ /**
27
+ * Allow all outbound and inbound traffic.
28
+ */
29
+ NatTrafficDirection["INBOUND_AND_OUTBOUND"] = "INBOUND_AND_OUTBOUND";
30
+ /**
31
+ * Disallow all outbound and inbound traffic.
32
+ */
33
+ NatTrafficDirection["NONE"] = "NONE";
34
+ })(NatTrafficDirection || (exports.NatTrafficDirection = NatTrafficDirection = {}));
35
+ /**
36
+ * NAT providers
37
+ *
38
+ * Determines what type of NAT provider to create, either NAT gateways or NAT
39
+ * instance.
40
+ *
41
+ *
42
+ */
43
+ class NatProvider {
44
+ /**
45
+ * Use NAT Gateways to provide NAT services for your VPC
46
+ *
47
+ * NAT gateways are managed by AWS.
48
+ *
49
+ * @see https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html
50
+ */
51
+ static gateway(props = {}) {
52
+ return new NatGatewayProvider(props);
53
+ }
54
+ /**
55
+ * Use NAT instances to provide NAT services for your VPC
56
+ *
57
+ * NAT instances are managed by you, but in return allow more configuration.
58
+ *
59
+ * Be aware that instances created using this provider will not be
60
+ * automatically replaced if they are stopped for any reason. You should implement
61
+ * your own NatProvider based on AutoScaling groups if you need that.
62
+ *
63
+ * @see https://docs.aws.amazon.com/vpc/latest/userguide/VPC_NAT_Instance.html
64
+ *
65
+ * @deprecated use instanceV2. 'instance' is deprecated since NatInstanceProvider
66
+ * uses a instance image that has reached EOL on Dec 31 2023
67
+ */
68
+ static instance(props) {
69
+ return new NatInstanceProvider(props);
70
+ }
71
+ /**
72
+ * Use NAT instances to provide NAT services for your VPC
73
+ *
74
+ * NAT instances are managed by you, but in return allow more configuration.
75
+ *
76
+ * Be aware that instances created using this provider will not be
77
+ * automatically replaced if they are stopped for any reason. You should implement
78
+ * your own NatProvider based on AutoScaling groups if you need that.
79
+ *
80
+ * @see https://docs.aws.amazon.com/vpc/latest/userguide/VPC_NAT_Instance.html
81
+ */
82
+ static instanceV2(props) {
83
+ return new NatInstanceProviderV2(props);
84
+ }
85
+ }
86
+ exports.NatProvider = NatProvider;
87
+ _a = JSII_RTTI_SYMBOL_1;
88
+ NatProvider[_a] = { fqn: "terraconstructs.aws.compute.NatProvider", version: "0.0.12" };
89
+ /**
90
+ * Provider for NAT Gateways
91
+ */
92
+ class NatGatewayProvider extends NatProvider {
93
+ constructor(props = {}) {
94
+ super();
95
+ this.props = props;
96
+ this.gateways = new PrefSet();
97
+ }
98
+ configureNat(options) {
99
+ if (this.props.eipAllocationIds != null &&
100
+ !cdktf_1.Token.isUnresolved(this.props.eipAllocationIds) &&
101
+ this.props.eipAllocationIds.length < options.natSubnets.length) {
102
+ throw new Error(`Not enough NAT gateway EIP allocation IDs (${this.props.eipAllocationIds.length} provided) for the requested subnet count (${options.natSubnets.length} needed).`);
103
+ }
104
+ // Create the NAT gateways
105
+ let i = 0;
106
+ for (const sub of options.natSubnets) {
107
+ const eipAllocationId = this.props.eipAllocationIds
108
+ ? pickN(i, this.props.eipAllocationIds)
109
+ : undefined;
110
+ const gateway = sub.addNatGateway(eipAllocationId);
111
+ this.gateways.add(sub.availabilityZone, gateway.id);
112
+ i++;
113
+ }
114
+ // Add routes to them in the private subnets
115
+ for (const sub of options.privateSubnets) {
116
+ this.configureSubnet(sub);
117
+ }
118
+ }
119
+ configureSubnet(subnet) {
120
+ const az = subnet.availabilityZone;
121
+ const gatewayId = this.gateways.pick(az);
122
+ subnet.addRoute("DefaultRoute", {
123
+ routerType: vpc_1.RouterType.NAT_GATEWAY,
124
+ routerId: gatewayId,
125
+ enablesInternetConnectivity: true,
126
+ });
127
+ }
128
+ get configuredGateways() {
129
+ return this.gateways.values().map((x) => ({ az: x[0], gatewayId: x[1] }));
130
+ }
131
+ }
132
+ exports.NatGatewayProvider = NatGatewayProvider;
133
+ _b = JSII_RTTI_SYMBOL_1;
134
+ NatGatewayProvider[_b] = { fqn: "terraconstructs.aws.compute.NatGatewayProvider", version: "0.0.12" };
135
+ /**
136
+ * NAT provider which uses NAT Instances
137
+ *
138
+ * @deprecated use NatInstanceProviderV2. NatInstanceProvider is deprecated since
139
+ * the instance image used has reached EOL on Dec 31 2023
140
+ */
141
+ class NatInstanceProvider extends NatProvider {
142
+ constructor(props) {
143
+ super();
144
+ this.props = props;
145
+ this.gateways = new PrefSet();
146
+ if (props.defaultAllowedTraffic !== undefined &&
147
+ props.allowAllTraffic !== undefined) {
148
+ throw new Error("Can not specify both of 'defaultAllowedTraffic' and 'defaultAllowedTraffic'; prefer 'defaultAllowedTraffic'");
149
+ }
150
+ if (props.keyName && props.keyPair) {
151
+ throw new Error("Cannot specify both of 'keyName' and 'keyPair'; prefer 'keyPair'");
152
+ }
153
+ }
154
+ configureNat(options) {
155
+ const defaultDirection = this.props.defaultAllowedTraffic ??
156
+ ((this.props.allowAllTraffic ?? true)
157
+ ? NatTrafficDirection.INBOUND_AND_OUTBOUND
158
+ : NatTrafficDirection.OUTBOUND_ONLY);
159
+ // Create the NAT instances. They can share a security group and a Role.
160
+ const machineImage = this.props.machineImage ?? new NatInstanceImage();
161
+ this._securityGroup =
162
+ this.props.securityGroup ??
163
+ new security_group_1.SecurityGroup(options.vpc, "NatSecurityGroup", {
164
+ vpc: options.vpc,
165
+ description: "Security Group for NAT instances",
166
+ allowAllOutbound: isOutboundAllowed(defaultDirection),
167
+ });
168
+ this._connections = new connections_1.Connections({
169
+ securityGroups: [this._securityGroup],
170
+ });
171
+ if (isInboundAllowed(defaultDirection)) {
172
+ this.connections.allowFromAnyIpv4(port_1.Port.allTraffic());
173
+ }
174
+ // FIXME: Ideally, NAT instances don't have a role at all, but
175
+ // 'Instance' does not allow that right now.
176
+ const role = new iam.Role(options.vpc, "NatRole", {
177
+ assumedBy: new iam.ServicePrincipal("compute.amazonaws.com"),
178
+ });
179
+ for (const sub of options.natSubnets) {
180
+ const natInstance = new instance_1.Instance(sub, "NatInstance", {
181
+ instanceType: this.props.instanceType,
182
+ machineImage,
183
+ sourceDestCheck: false, // Required for NAT
184
+ vpc: options.vpc,
185
+ vpcSubnets: { subnets: [sub] },
186
+ securityGroup: this._securityGroup,
187
+ role,
188
+ keyPair: this.props.keyPair,
189
+ keyName: this.props.keyName,
190
+ creditSpecification: this.props.creditSpecification,
191
+ });
192
+ // NAT instance routes all traffic, both ways
193
+ this.gateways.add(sub.availabilityZone, natInstance);
194
+ }
195
+ // Add routes to them in the private subnets
196
+ for (const sub of options.privateSubnets) {
197
+ this.configureSubnet(sub);
198
+ }
199
+ }
200
+ /**
201
+ * The Security Group associated with the NAT instances
202
+ */
203
+ get securityGroup() {
204
+ if (!this._securityGroup) {
205
+ throw new Error("Pass the NatInstanceProvider to a Vpc before accessing 'securityGroup'");
206
+ }
207
+ return this._securityGroup;
208
+ }
209
+ /**
210
+ * Manage the Security Groups associated with the NAT instances
211
+ */
212
+ get connections() {
213
+ if (!this._connections) {
214
+ throw new Error("Pass the NatInstanceProvider to a Vpc before accessing 'connections'");
215
+ }
216
+ return this._connections;
217
+ }
218
+ get configuredGateways() {
219
+ return this.gateways
220
+ .values()
221
+ .map((x) => ({ az: x[0], gatewayId: x[1].instanceId }));
222
+ }
223
+ configureSubnet(subnet) {
224
+ const az = subnet.availabilityZone;
225
+ const gatewayInstance = this.gateways.pick(az);
226
+ // TODO: Terraform provider does not support RouterType.INSTANCE
227
+ // subnet.addRoute("DefaultRoute", {
228
+ // routerType: RouterType.INSTANCE,
229
+ // routerId: gatewayInstance.instanceId,
230
+ // enablesInternetConnectivity: true,
231
+ // });
232
+ // if (!gatewayInstance.primaryNetworkInterfaceId) {
233
+ // throw new Error(
234
+ // `Primary network interface not found for gateway instance ${gatewayInstance.node.path}`,
235
+ // );
236
+ // }
237
+ // If there is no primary network interface, the value is ""
238
+ // https://github.com/hashicorp/terraform-provider-aws/blob/v5.88.0/internal/service/ec2/ec2_instance.go#L1340
239
+ subnet.addRoute("DefaultRoute", {
240
+ routerType: vpc_1.RouterType.NETWORK_INTERFACE,
241
+ routerId: gatewayInstance.primaryNetworkInterfaceId,
242
+ enablesInternetConnectivity: true,
243
+ });
244
+ }
245
+ }
246
+ exports.NatInstanceProvider = NatInstanceProvider;
247
+ _c = JSII_RTTI_SYMBOL_1;
248
+ NatInstanceProvider[_c] = { fqn: "terraconstructs.aws.compute.NatInstanceProvider", version: "0.0.12" };
249
+ /**
250
+ * Preferential set
251
+ *
252
+ * Picks the value with the given key if available, otherwise distributes
253
+ * evenly among the available options.
254
+ */
255
+ class PrefSet {
256
+ constructor() {
257
+ this.map = {};
258
+ this.vals = new Array();
259
+ this.next = 0;
260
+ }
261
+ add(pref, value) {
262
+ this.map[pref] = value;
263
+ this.vals.push([pref, value]);
264
+ }
265
+ pick(pref) {
266
+ if (this.vals.length === 0) {
267
+ throw new Error("Cannot pick, set is empty");
268
+ }
269
+ if (pref in this.map) {
270
+ return this.map[pref];
271
+ }
272
+ return this.vals[this.next++ % this.vals.length][1];
273
+ }
274
+ values() {
275
+ return this.vals;
276
+ }
277
+ }
278
+ /**
279
+ * Modern NAT provider which uses NAT Instances.
280
+ * The instance uses Amazon Linux 2023 as the operating system.
281
+ */
282
+ class NatInstanceProviderV2 extends NatProvider {
283
+ /**
284
+ * Array of gateway instances spawned by the provider after internal configuration
285
+ */
286
+ get gatewayInstances() {
287
+ return this.gateways.values().map(([, instance]) => instance);
288
+ }
289
+ constructor(props) {
290
+ super();
291
+ this.props = props;
292
+ this.gateways = new PrefSet();
293
+ if (props.defaultAllowedTraffic !== undefined &&
294
+ props.allowAllTraffic !== undefined) {
295
+ throw new Error("Can not specify both of 'defaultAllowedTraffic' and 'defaultAllowedTraffic'; prefer 'defaultAllowedTraffic'");
296
+ }
297
+ if (props.keyName && props.keyPair) {
298
+ throw new Error("Cannot specify both of 'keyName' and 'keyPair'; prefer 'keyPair'");
299
+ }
300
+ }
301
+ configureNat(options) {
302
+ const defaultDirection = this.props.defaultAllowedTraffic ??
303
+ ((this.props.allowAllTraffic ?? true)
304
+ ? NatTrafficDirection.INBOUND_AND_OUTBOUND
305
+ : NatTrafficDirection.OUTBOUND_ONLY);
306
+ // Create the NAT instances. They can share a security group and a Role. The new NAT instance created uses latest
307
+ // Amazon Linux 2023 image. This is important since the original NatInstanceProvider uses an instance image that has
308
+ // reached EOL on Dec 31 2023
309
+ const machineImage = this.props.machineImage ||
310
+ new machine_image_1.AmazonLinuxImage({
311
+ generation: machine_image_1.AmazonLinuxGeneration.AMAZON_LINUX_2023,
312
+ cpuType: this.props.instanceType.architecture == instance_types_1.InstanceArchitecture.ARM_64
313
+ ? machine_image_1.AmazonLinuxCpuType.ARM_64
314
+ : undefined,
315
+ });
316
+ this._securityGroup =
317
+ this.props.securityGroup ??
318
+ new security_group_1.SecurityGroup(options.vpc, "NatSecurityGroup", {
319
+ vpc: options.vpc,
320
+ description: "Security Group for NAT instances",
321
+ allowAllOutbound: isOutboundAllowed(defaultDirection),
322
+ });
323
+ this._connections = new connections_1.Connections({
324
+ securityGroups: [this._securityGroup],
325
+ });
326
+ if (isInboundAllowed(defaultDirection)) {
327
+ this.connections.allowFromAnyIpv4(port_1.Port.allTraffic());
328
+ }
329
+ let userData = this.props.userData;
330
+ if (!userData) {
331
+ userData = user_data_1.UserData.forLinux();
332
+ userData.addCommands(...NatInstanceProviderV2.DEFAULT_USER_DATA_COMMANDS);
333
+ }
334
+ for (const sub of options.natSubnets) {
335
+ const natInstance = new instance_1.Instance(sub, "NatInstance", {
336
+ instanceType: this.props.instanceType,
337
+ machineImage,
338
+ sourceDestCheck: false, // Required for NAT
339
+ vpc: options.vpc,
340
+ vpcSubnets: { subnets: [sub] },
341
+ associatePublicIpAddress: this.props.associatePublicIpAddress,
342
+ securityGroup: this._securityGroup,
343
+ keyPair: this.props.keyPair,
344
+ keyName: this.props.keyName,
345
+ creditSpecification: this.props.creditSpecification,
346
+ userData,
347
+ });
348
+ // NAT instance routes all traffic, both ways
349
+ this.gateways.add(sub.availabilityZone, natInstance);
350
+ }
351
+ // Add routes to them in the private subnets
352
+ for (const sub of options.privateSubnets) {
353
+ this.configureSubnet(sub);
354
+ }
355
+ }
356
+ /**
357
+ * The Security Group associated with the NAT instances
358
+ */
359
+ get securityGroup() {
360
+ if (!this._securityGroup) {
361
+ throw new Error("Pass the NatInstanceProvider to a Vpc before accessing 'securityGroup'");
362
+ }
363
+ return this._securityGroup;
364
+ }
365
+ /**
366
+ * Manage the Security Groups associated with the NAT instances
367
+ */
368
+ get connections() {
369
+ if (!this._connections) {
370
+ throw new Error("Pass the NatInstanceProvider to a Vpc before accessing 'connections'");
371
+ }
372
+ return this._connections;
373
+ }
374
+ get configuredGateways() {
375
+ return this.gateways
376
+ .values()
377
+ .map((x) => ({ az: x[0], gatewayId: x[1].instanceId }));
378
+ }
379
+ configureSubnet(subnet) {
380
+ const az = subnet.availabilityZone;
381
+ const gatewayInstance = this.gateways.pick(az);
382
+ // TODO: Terraform provider does not support RouterType.INSTANCE
383
+ // subnet.addRoute("DefaultRoute", {
384
+ // routerType: RouterType.INSTANCE,
385
+ // routerId: gatewayInstance.instanceId,
386
+ // enablesInternetConnectivity: true,
387
+ // });
388
+ // if (!gatewayInstance.primaryNetworkInterface) {
389
+ // throw new Error(
390
+ // `Primary network interface not found for gateway instance ${gatewayInstance.node.path}`,
391
+ // );
392
+ // }
393
+ // If there is no primary network interface, the value is ""
394
+ // https://github.com/hashicorp/terraform-provider-aws/blob/v5.88.0/internal/service/ec2/ec2_instance.go#L1340
395
+ subnet.addRoute("DefaultRoute", {
396
+ routerType: vpc_1.RouterType.NETWORK_INTERFACE,
397
+ routerId: gatewayInstance.primaryNetworkInterfaceId,
398
+ enablesInternetConnectivity: true,
399
+ });
400
+ }
401
+ }
402
+ exports.NatInstanceProviderV2 = NatInstanceProviderV2;
403
+ _d = JSII_RTTI_SYMBOL_1;
404
+ NatInstanceProviderV2[_d] = { fqn: "terraconstructs.aws.compute.NatInstanceProviderV2", version: "0.0.12" };
405
+ /**
406
+ * Amazon Linux 2023 NAT instance user data commands
407
+ * Enable iptables on the instance, enable persistent IP forwarding, configure NAT on instance
408
+ * @see https://docs.aws.amazon.com/vpc/latest/userguide/VPC_NAT_Instance.html#create-nat-ami
409
+ */
410
+ NatInstanceProviderV2.DEFAULT_USER_DATA_COMMANDS = [
411
+ "yum install iptables-services -y",
412
+ "systemctl enable iptables",
413
+ "systemctl start iptables",
414
+ 'echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/custom-ip-forwarding.conf',
415
+ "sudo sysctl -p /etc/sysctl.d/custom-ip-forwarding.conf",
416
+ "sudo /sbin/iptables -t nat -A POSTROUTING -o $(route | awk '/^default/{print $NF}') -j MASQUERADE",
417
+ "sudo /sbin/iptables -F FORWARD",
418
+ "sudo service iptables save",
419
+ ];
420
+ /**
421
+ * Machine image representing the latest NAT instance image
422
+ *
423
+ *
424
+ */
425
+ class NatInstanceImage extends machine_image_1.LookupMachineImage {
426
+ constructor() {
427
+ super({
428
+ name: "amzn-ami-vpc-nat-*",
429
+ owners: ["amazon"],
430
+ });
431
+ }
432
+ }
433
+ exports.NatInstanceImage = NatInstanceImage;
434
+ _e = JSII_RTTI_SYMBOL_1;
435
+ NatInstanceImage[_e] = { fqn: "terraconstructs.aws.compute.NatInstanceImage", version: "0.0.12" };
436
+ function isOutboundAllowed(direction) {
437
+ return (direction === NatTrafficDirection.INBOUND_AND_OUTBOUND ||
438
+ direction === NatTrafficDirection.OUTBOUND_ONLY);
439
+ }
440
+ function isInboundAllowed(direction) {
441
+ return direction === NatTrafficDirection.INBOUND_AND_OUTBOUND;
442
+ }
443
+ /**
444
+ * Token-aware pick index function
445
+ */
446
+ function pickN(i, xs) {
447
+ if (cdktf_1.Token.isUnresolved(xs)) {
448
+ return cdktf_1.Fn.element(xs, i);
449
+ }
450
+ if (i >= xs.length) {
451
+ throw new Error(`Cannot get element ${i} from ${xs}`);
452
+ }
453
+ return xs[i];
454
+ }
455
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F3cy9jb21wdXRlL25hdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHVGQUF1RjtBQUV2RixpQ0FBa0M7QUFDbEMsK0NBQTBEO0FBQzFELHlDQUFzQztBQUN0QyxxREFBc0U7QUFHdEUsbURBTXlCO0FBQ3pCLGlDQUE4QjtBQUM5QixxREFBaUU7QUFDakUsMkNBQXVDO0FBQ3ZDLCtCQUFxRTtBQUNyRSw4QkFBOEI7QUFFOUI7O0dBRUc7QUFDSCxJQUFZLG1CQWVYO0FBZkQsV0FBWSxtQkFBbUI7SUFDN0I7O09BRUc7SUFDSCxzREFBK0IsQ0FBQTtJQUUvQjs7T0FFRztJQUNILG9FQUE2QyxDQUFBO0lBRTdDOztPQUVHO0lBQ0gsb0NBQWEsQ0FBQTtBQUNmLENBQUMsRUFmVyxtQkFBbUIsbUNBQW5CLG1CQUFtQixRQWU5QjtBQWlCRDs7Ozs7OztHQU9HO0FBQ0gsTUFBc0IsV0FBVztJQUMvQjs7Ozs7O09BTUc7SUFDSSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQXlCLEVBQUU7UUFDL0MsT0FBTyxJQUFJLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0ksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUF1QjtRQUM1QyxPQUFPLElBQUksbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSSxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQXVCO1FBQzlDLE9BQU8sSUFBSSxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxDQUFDOztBQTNDSCxrQ0ErREM7OztBQXNLRDs7R0FFRztBQUNILE1BQWEsa0JBQW1CLFNBQVEsV0FBVztJQUdqRCxZQUE2QixRQUF5QixFQUFFO1FBQ3RELEtBQUssRUFBRSxDQUFDO1FBRG1CLFVBQUssR0FBTCxL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TyxTQUFTLEtBQUssbUJBQW1CLENBQUMsb0JBQW9CLENBQUM7QUFDaEUsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxLQUFLLENBQUMsQ0FBUyxFQUFFLEVBQVk7SUFDcEMsSUFBSSxhQUFLLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDM0IsT0FBTyxVQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNzUuMS9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtZWMyL2xpYi9uYXQudHNcblxuaW1wb3J0IHsgRm4sIFRva2VuIH0gZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBDb25uZWN0aW9ucywgSUNvbm5lY3RhYmxlIH0gZnJvbSBcIi4vY29ubmVjdGlvbnNcIjtcbmltcG9ydCB7IEluc3RhbmNlIH0gZnJvbSBcIi4vaW5zdGFuY2VcIjtcbmltcG9ydCB7IEluc3RhbmNlQXJjaGl0ZWN0dXJlLCBJbnN0YW5jZVR5cGUgfSBmcm9tIFwiLi9pbnN0YW5jZS10eXBlc1wiO1xuaW1wb3J0IHsgSUtleVBhaXIgfSBmcm9tIFwiLi9rZXktcGFpclwiO1xuaW1wb3J0IHsgQ3B1Q3JlZGl0cyB9IGZyb20gXCIuL2xhdW5jaC10ZW1wbGF0ZVwiO1xuaW1wb3J0IHtcbiAgQW1hem9uTGludXhDcHVUeXBlLFxuICBBbWF6b25MaW51eEdlbmVyYXRpb24sXG4gIEFtYXpvbkxpbnV4SW1hZ2UsXG4gIElNYWNoaW5lSW1hZ2UsXG4gIExvb2t1cE1hY2hpbmVJbWFnZSxcbn0gZnJvbSBcIi4vbWFjaGluZS1pbWFnZVwiO1xuaW1wb3J0IHsgUG9ydCB9IGZyb20gXCIuL3BvcnRcIjtcbmltcG9ydCB7IElTZWN1cml0eUdyb3VwLCBTZWN1cml0eUdyb3VwIH0gZnJvbSBcIi4vc2VjdXJpdHktZ3JvdXBcIjtcbmltcG9ydCB7IFVzZXJEYXRhIH0gZnJvbSBcIi4vdXNlci1kYXRhXCI7XG5pbXBvcnQgeyBQcml2YXRlU3VibmV0LCBQdWJsaWNTdWJuZXQsIFJvdXRlclR5cGUsIFZwYyB9IGZyb20gXCIuL3ZwY1wiO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gXCIuLi9pYW1cIjtcblxuLyoqXG4gKiBEaXJlY3Rpb24gb2YgdHJhZmZpYyB0byBhbGxvdyBhbGwgYnkgZGVmYXVsdC5cbiAqL1xuZXhwb3J0IGVudW0gTmF0VHJhZmZpY0RpcmVjdGlvbiB7XG4gIC8qKlxuICAgKiBBbGxvdyBhbGwgb3V0Ym91bmQgdHJhZmZpYyBhbmQgZGlzYWxsb3cgYWxsIGluYm91bmQgdHJhZmZpYy5cbiAgICovXG4gIE9VVEJPVU5EX09OTFkgPSBcIk9VVEJPVU5EX09OTFlcIixcblxuICAvKipcbiAgICogQWxsb3cgYWxsIG91dGJvdW5kIGFuZCBpbmJvdW5kIHRyYWZmaWMuXG4gICAqL1xuICBJTkJPVU5EX0FORF9PVVRCT1VORCA9IFwiSU5CT1VORF9BTkRfT1VUQk9VTkRcIixcblxuICAvKipcbiAgICogRGlzYWxsb3cgYWxsIG91dGJvdW5kIGFuZCBpbmJvdW5kIHRyYWZmaWMuXG4gICAqL1xuICBOT05FID0gXCJOT05FXCIsXG59XG5cbi8qKlxuICogUGFpciByZXByZXNlbnRzIGEgZ2F0ZXdheSBjcmVhdGVkIGJ5IE5BVCBQcm92aWRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdhdGV3YXlDb25maWcge1xuICAvKipcbiAgICogQXZhaWxhYmlsaXR5IFpvbmVcbiAgICovXG4gIHJlYWRvbmx5IGF6OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElkZW50aXR5IG9mIGdhdGV3YXkgc3Bhd25lZCBieSB0aGUgcHJvdmlkZXJcbiAgICovXG4gIHJlYWRvbmx5IGdhdGV3YXlJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIE5BVCBwcm92aWRlcnNcbiAqXG4gKiBEZXRlcm1pbmVzIHdoYXQgdHlwZSBvZiBOQVQgcHJvdmlkZXIgdG8gY3JlYXRlLCBlaXRoZXIgTkFUIGdhdGV3YXlzIG9yIE5BVFxuICogaW5zdGFuY2UuXG4gKlxuICpcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE5hdFByb3ZpZGVyIHtcbiAgLyoqXG4gICAqIFVzZSBOQVQgR2F0ZXdheXMgdG8gcHJvdmlkZSBOQVQgc2VydmljZXMgZm9yIHlvdXIgVlBDXG4gICAqXG4gICAqIE5BVCBnYXRld2F5cyBhcmUgbWFuYWdlZCBieSBBV1MuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3ZwYy9sYXRlc3QvdXNlcmd1aWRlL3ZwYy1uYXQtZ2F0ZXdheS5odG1sXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdhdGV3YXkocHJvcHM6IE5hdEdhdGV3YXlQcm9wcyA9IHt9KTogTmF0UHJvdmlkZXIge1xuICAgIHJldHVybiBuZXcgTmF0R2F0ZXdheVByb3ZpZGVyKHByb3BzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2UgTkFUIGluc3RhbmNlcyB0byBwcm92aWRlIE5BVCBzZXJ2aWNlcyBmb3IgeW91ciBWUENcbiAgICpcbiAgICogTkFUIGluc3RhbmNlcyBhcmUgbWFuYWdlZCBieSB5b3UsIGJ1dCBpbiByZXR1cm4gYWxsb3cgbW9yZSBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBCZSBhd2FyZSB0aGF0IGluc3RhbmNlcyBjcmVhdGVkIHVzaW5nIHRoaXMgcHJvdmlkZXIgd2lsbCBub3QgYmVcbiAgICogYXV0b21hdGljYWxseSByZXBsYWNlZCBpZiB0aGV5IGFyZSBzdG9wcGVkIGZvciBhbnkgcmVhc29uLiBZb3Ugc2hvdWxkIGltcGxlbWVudFxuICAgKiB5b3VyIG93biBOYXRQcm92aWRlciBiYXNlZCBvbiBBdXRvU2NhbGluZyBncm91cHMgaWYgeW91IG5lZWQgdGhhdC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdnBjL2xhdGVzdC91c2VyZ3VpZGUvVlBDX05BVF9JbnN0YW5jZS5odG1sXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBpbnN0YW5jZVYyLiAnaW5zdGFuY2UnIGlzIGRlcHJlY2F0ZWQgc2luY2UgTmF0SW5zdGFuY2VQcm92aWRlclxuICAgKiB1c2VzIGEgaW5zdGFuY2UgaW1hZ2UgdGhhdCBoYXMgcmVhY2hlZCBFT0wgb24gRGVjIDMxIDIwMjNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaW5zdGFuY2UocHJvcHM6IE5hdEluc3RhbmNlUHJvcHMpOiBOYXRJbnN0YW5jZVByb3ZpZGVyIHtcbiAgICByZXR1cm4gbmV3IE5hdEluc3RhbmNlUHJvdmlkZXIocHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZSBOQVQgaW5zdGFuY2VzIHRvIHByb3ZpZGUgTkFUIHNlcnZpY2VzIGZvciB5b3VyIFZQQ1xuICAgKlxuICAgKiBOQVQgaW5zdGFuY2VzIGFyZSBtYW5hZ2VkIGJ5IHlvdSwgYnV0IGluIHJldHVybiBhbGxvdyBtb3JlIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEJlIGF3YXJlIHRoYXQgaW5zdGFuY2VzIGNyZWF0ZWQgdXNpbmcgdGhpcyBwcm92aWRlciB3aWxsIG5vdCBiZVxuICAgKiBhdXRvbWF0aWNhbGx5IHJlcGxhY2VkIGlmIHRoZXkgYXJlIHN0b3BwZWQgZm9yIGFueSByZWFzb24uIFlvdSBzaG91bGQgaW1wbGVtZW50XG4gICAqIHlvdXIgb3duIE5hdFByb3ZpZGVyIGJhc2VkIG9uIEF1dG9TY2FsaW5nIGdyb3VwcyBpZiB5b3UgbmVlZCB0aGF0LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS92cGMvbGF0ZXN0L3VzZXJndWlkZS9WUENfTkFUX0luc3RhbmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaW5zdGFuY2VWMihwcm9wczogTmF0SW5zdGFuY2VQcm9wcyk6IE5hdEluc3RhbmNlUHJvdmlkZXJWMiB7XG4gICAgcmV0dXJuIG5ldyBOYXRJbnN0YW5jZVByb3ZpZGVyVjIocHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBsaXN0IG9mIGdhdGV3YXlzIHNwYXduZWQgYnkgdGhlIHByb3ZpZGVyXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgY29uZmlndXJlZEdhdGV3YXlzOiBHYXRld2F5Q29uZmlnW107XG5cbiAgLyoqXG4gICAqIENhbGxlZCBieSB0aGUgVlBDIHRvIGNvbmZpZ3VyZSBOQVRcbiAgICpcbiAgICogRG9uJ3QgY2FsbCB0aGlzIGRpcmVjdGx5LCB0aGUgVlBDIHdpbGwgY2FsbCBpdCBhdXRvbWF0aWNhbGx5LlxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IGNvbmZpZ3VyZU5hdChvcHRpb25zOiBDb25maWd1cmVOYXRPcHRpb25zKTogdm9pZDtcblxuICAvKipcbiAgICogQ29uZmlndXJlcyBzdWJuZXQgd2l0aCB0aGUgZ2F0ZXdheVxuICAgKlxuICAgKiBEb24ndCBjYWxsIHRoaXMgZGlyZWN0bHksIHRoZSBWUEMgd2lsbCBjYWxsIGl0IGF1dG9tYXRpY2FsbHkuXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgY29uZmlndXJlU3VibmV0KHN1Ym5ldDogUHJpdmF0ZVN1Ym5ldCk6IHZvaWQ7XG59XG5cbi8qKlxuICogT3B0aW9ucyBwYXNzZWQgYnkgdGhlIFZQQyB3aGVuIE5BVCBuZWVkcyB0byBiZSBjb25maWd1cmVkXG4gKlxuICpcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25maWd1cmVOYXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBWUEMgd2UncmUgY29uZmlndXJpbmcgTkFUIGZvclxuICAgKi9cbiAgcmVhZG9ubHkgdnBjOiBWcGM7XG5cbiAgLyoqXG4gICAqIFRoZSBwdWJsaWMgc3VibmV0cyB3aGVyZSB0aGUgTkFUIHByb3ZpZGVycyBuZWVkIHRvIGJlIHBsYWNlZFxuICAgKi9cbiAgcmVhZG9ubHkgbmF0U3VibmV0czogUHVibGljU3VibmV0W107XG5cbiAgLyoqXG4gICAqIFRoZSBwcml2YXRlIHN1Ym5ldHMgdGhhdCBuZWVkIHRvIHJvdXRlIHRocm91Z2ggdGhlIE5BVCBwcm92aWRlcnMuXG4gICAqXG4gICAqIFRoZXJlIG1heSBiZSBtb3JlIHByaXZhdGUgc3VibmV0cyB0aGFuIHB1YmxpYyBzdWJuZXRzIHdpdGggTkFUIHByb3ZpZGVycy5cbiAgICovXG4gIHJlYWRvbmx5IHByaXZhdGVTdWJuZXRzOiBQcml2YXRlU3VibmV0W107XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYSBOQVQgZ2F0ZXdheVxuICpcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOYXRHYXRld2F5UHJvcHMge1xuICAvKipcbiAgICogRUlQIGFsbG9jYXRpb24gSURzIGZvciB0aGUgTkFUIGdhdGV3YXlzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gZml4ZWQgRUlQcyBhbGxvY2F0ZWQgZm9yIHRoZSBOQVQgZ2F0ZXdheXNcbiAgICovXG4gIHJlYWRvbmx5IGVpcEFsbG9jYXRpb25JZHM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhIE5BVCBpbnN0YW5jZVxuICpcbiAqXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmF0SW5zdGFuY2VQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbWFjaGluZSBpbWFnZSAoQU1JKSB0byB1c2VcbiAgICpcbiAgICogQnkgZGVmYXVsdCwgd2lsbCBkbyBhbiBBTUkgbG9va3VwIGZvciB0aGUgbGF0ZXN0IE5BVCBpbnN0YW5jZSBpbWFnZS5cbiAgICpcbiAgICogSWYgeW91IGhhdmUgYSBzcGVjaWZpYyBBTUkgSUQgeW91IHdhbnQgdG8gdXNlLCBwYXNzIGEgYEdlbmVyaWNMaW51eEltYWdlYC4gRm9yIGV4YW1wbGU6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIGNvbXB1dGUuTmF0UHJvdmlkZXIuaW5zdGFuY2Uoe1xuICAgKiAgIGluc3RhbmNlVHlwZTogbmV3IGNvbXB1dGUuSW5zdGFuY2VUeXBlKCd0My5taWNybycpLFxuICAgKiAgIG1hY2hpbmVJbWFnZTogbmV3IGNvbXB1dGUuR2VuZXJpY0xpbnV4SW1hZ2Uoe1xuICAgKiAgICAgJ3VzLWVhc3QtMic6ICdhbWktMGY5YzYxYjVhNTYyYTE2YWYnXG4gICAqICAgfSlcbiAgICogfSlcbiAgICogYGBgXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTGF0ZXN0IE5BVCBpbnN0YW5jZSBpbWFnZVxuICAgKi9cbiAgcmVhZG9ubHkgbWFjaGluZUltYWdlPzogSU1hY2hpbmVJbWFnZTtcblxuICAvKipcbiAgICogSW5zdGFuY2UgdHlwZSBvZiB0aGUgTkFUIGluc3RhbmNlXG4gICAqL1xuICByZWFkb25seSBpbnN0YW5jZVR5cGU6IEluc3RhbmNlVHlwZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhc3NvY2lhdGUgYSBwdWJsaWMgSVAgYWRkcmVzcyB0byB0aGUgcHJpbWFyeSBuZXR3b3JrIGludGVyZmFjZSBhdHRhY2hlZCB0byB0aGlzIGluc3RhbmNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWQgLSBObyBwdWJsaWMgSVAgYWRkcmVzcyBhc3NvY2lhdGVkXG4gICAqL1xuICByZWFkb25seSBhc3NvY2lhdGVQdWJsaWNJcEFkZHJlc3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIFNTSCBrZXlwYWlyIHRvIGdyYW50IGFjY2VzcyB0byBpbnN0YW5jZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIFNTSCBhY2Nlc3Mgd2lsbCBiZSBwb3NzaWJsZS5cbiAgICogQGRlcHJlY2F0ZWQgLSBVc2UgYGtleVBhaXJgIGluc3RlYWQgLSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2RrL2FwaS92Mi9kb2NzL2F3cy1jZGstbGliLmF3c19lYzItcmVhZG1lLmh0bWwjdXNpbmctYW4tZXhpc3RpbmctZWMyLWtleS1wYWlyXG4gICAqL1xuICByZWFkb25seSBrZXlOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgU1NIIGtleXBhaXIgdG8gZ3JhbnQgYWNjZXNzIHRvIHRoZSBpbnN0YW5jZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBTU0ggYWNjZXNzIHdpbGwgYmUgcG9zc2libGUuXG4gICAqL1xuICByZWFkb25seSBrZXlQYWlyPzogSUtleVBhaXI7XG5cbiAgLyoqXG4gICAqIFNlY3VyaXR5IEdyb3VwIGZvciBOQVQgaW5zdGFuY2VzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQSBuZXcgc2VjdXJpdHkgZ3JvdXAgd2lsbCBiZSBjcmVhdGVkXG4gICAqIEBkZXByZWNhdGVkIC0gQ2Fubm90IGNyZWF0ZSBhIG5ldyBzZWN1cml0eSBncm91cCBiZWZvcmUgdGhlIFZQQyBpcyBjcmVhdGVkLFxuICAgKiBhbmQgY2Fubm90IGNyZWF0ZSB0aGUgVlBDIHdpdGhvdXQgdGhlIE5BVCBwcm92aWRlci5cbiAgICogU2V0IHtAbGluayBkZWZhdWx0QWxsb3dlZFRyYWZmaWN9IHRvIHtAbGluayBOYXRUcmFmZmljRGlyZWN0aW9uLk5PTkV9XG4gICAqIGFuZCB1c2Uge0BsaW5rIE5hdEluc3RhbmNlUHJvdmlkZXJWMi5nYXRld2F5SW5zdGFuY2VzfSB0byByZXRyaWV2ZVxuICAgKiB0aGUgaW5zdGFuY2VzIG9uIHRoZSBmbHkgYW5kIGFkZCBzZWN1cml0eSBncm91cHNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgbmF0R2F0ZXdheVByb3ZpZGVyID0gY29tcHV0ZS5OYXRQcm92aWRlci5pbnN0YW5jZVYyKHtcbiAgICogICBpbnN0YW5jZVR5cGU6IG5ldyBjb21wdXRlLkluc3RhbmNlVHlwZSgndDMuc21hbGwnKSxcbiAgICogICBkZWZhdWx0QWxsb3dlZFRyYWZmaWM6IGNvbXB1dGUuTmF0VHJhZmZpY0RpcmVjdGlvbi5OT05FLFxuICAgKiB9KTtcbiAgICogY29uc3QgdnBjID0gbmV3IGNvbXB1dGUuVnBjKHRoaXMsICdWcGMnLCB7IG5hdEdhdGV3YXlQcm92aWRlciB9KTtcbiAgICpcbiAgICogY29uc3Qgc2VjdXJpdHlHcm91cCA9IG5ldyBjb21wdXRlLlNlY3VyaXR5R3JvdXAodGhpcywgJ1NlY3VyaXR5R3JvdXAnLCB7XG4gICAqICAgdnBjLFxuICAgKiAgIGFsbG93QWxsT3V0Ym91bmQ6IGZhbHNlLFxuICAgKiB9KTtcbiAgICogc2VjdXJpdHlHcm91cC5hZGRFZ3Jlc3NSdWxlKGNvbXB1dGUuUGVlci5hbnlJcHY0KCksIGNvbXB1dGUuUG9ydC50Y3AoNDQzKSk7XG4gICAqIGZvciAoY29uc3QgZ2F0ZXdheUluc3RhbmNlIG9mIG5hdEdhdGV3YXlQcm92aWRlci5nYXRld2F5SW5zdGFuY2VzKSB7XG4gICAqICAgIGdhdGV3YXlJbnN0YW5jZS5hZGRTZWN1cml0eUdyb3VwKHNlY3VyaXR5R3JvdXApO1xuICAgKiB9XG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUdyb3VwPzogSVNlY3VyaXR5R3JvdXA7XG5cbiAgLyoqXG4gICAqIEFsbG93IGFsbCBpbmJvdW5kIHRyYWZmaWMgdGhyb3VnaCB0aGUgTkFUIGluc3RhbmNlXG4gICAqXG4gICAqIElmIHlvdSBzZXQgdGhpcyB0byBmYWxzZSwgeW91IG11c3QgY29uZmlndXJlIHRoZSBOQVQgaW5zdGFuY2UncyBzZWN1cml0eVxuICAgKiBncm91cHMgaW4gYW5vdGhlciB3YXksIGVpdGhlciBieSBwYXNzaW5nIGluIGEgZnVsbHkgY29uZmlndXJlZCBTZWN1cml0eVxuICAgKiBHcm91cCB1c2luZyB0aGUgYHNlY3VyaXR5R3JvdXBgIHByb3BlcnR5LCBvciBieSBjb25maWd1cmluZyBpdCB1c2luZyB0aGVcbiAgICogYC5zZWN1cml0eUdyb3VwYCBvciBgLmNvbm5lY3Rpb25zYCBtZW1iZXJzIGFmdGVyIHBhc3NpbmcgdGhlIE5BVCBJbnN0YW5jZVxuICAgKiBQcm92aWRlciB0byBhIFZwYy5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKiBAZGVwcmVjYXRlZCAtIFVzZSBgZGVmYXVsdEFsbG93ZWRUcmFmZmljYC5cbiAgICovXG4gIHJlYWRvbmx5IGFsbG93QWxsVHJhZmZpYz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERpcmVjdGlvbiB0byBhbGxvdyBhbGwgdHJhZmZpYyB0aHJvdWdoIHRoZSBOQVQgaW5zdGFuY2UgYnkgZGVmYXVsdC5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgaW5ib3VuZCBhbmQgb3V0Ym91bmQgdHJhZmZpYyBpcyBhbGxvd2VkLlxuICAgKlxuICAgKiBJZiB5b3Ugc2V0IHRoaXMgdG8gYW5vdGhlciB2YWx1ZSB0aGFuIElOQk9VTkRfQU5EX09VVEJPVU5ELCB5b3UgbXVzdFxuICAgKiBjb25maWd1cmUgdGhlIE5BVCBpbnN0YW5jZSdzIHNlY3VyaXR5IGdyb3VwcyBpbiBhbm90aGVyIHdheSwgZWl0aGVyIGJ5XG4gICAqIHBhc3NpbmcgaW4gYSBmdWxseSBjb25maWd1cmVkIFNlY3VyaXR5IEdyb3VwIHVzaW5nIHRoZSBgc2VjdXJpdHlHcm91cGBcbiAgICogcHJvcGVydHksIG9yIGJ5IGNvbmZpZ3VyaW5nIGl0IHVzaW5nIHRoZSBgLnNlY3VyaXR5R3JvdXBgIG9yXG4gICAqIGAuY29ubmVjdGlvbnNgIG1lbWJlcnMgYWZ0ZXIgcGFzc2luZyB0aGUgTkFUIEluc3RhbmNlIFByb3ZpZGVyIHRvIGEgVnBjLlxuICAgKlxuICAgKiBAZGVmYXVsdCBOYXRUcmFmZmljRGlyZWN0aW9uLklOQk9VTkRfQU5EX09VVEJPVU5EXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0QWxsb3dlZFRyYWZmaWM/OiBOYXRUcmFmZmljRGlyZWN0aW9uO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5aW5nIHRoZSBDUFUgY3JlZGl0IHR5cGUgZm9yIGJ1cnN0YWJsZSBFQzIgaW5zdGFuY2UgdHlwZXMgKFQyLCBUMywgVDNhLCBldGMpLlxuICAgKiBUaGUgdW5saW1pdGVkIENQVSBjcmVkaXQgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFQzIGluc3RhbmNlcyB3aXRoIGRlZGljYXRlZCBob3N0IChgaG9zdGApIHRlbmFuY3kuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVDIgaW5zdGFuY2VzIGFyZSBzdGFuZGFyZCwgd2hpbGUgVDMsIFQ0ZywgYW5kIFQzYSBpbnN0YW5jZXMgYXJlIHVubGltaXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGNyZWRpdFNwZWNpZmljYXRpb24/OiBDcHVDcmVkaXRzO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gdXNlciBkYXRhIHRvIHJ1biBvbiB0aGUgTkFUIGluc3RhbmNlc1xuICAgKlxuICAgKiBAZGVmYXVsdCBVc2VyRGF0YS5mb3JMaW51eCgpLmFkZENvbW1hbmRzKC4uLk5hdEluc3RhbmNlUHJvdmlkZXJWMi5ERUZBVUxUX1VTRVJfREFUQV9DT01NQU5EUyk7ICAtIEFwcHJvcHJpYXRlIHVzZXIgZGF0YSBjb21tYW5kcyB0byBpbml0aWFsaXplIGFuZCBjb25maWd1cmUgdGhlIE5BVCBpbnN0YW5jZXNcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdnBjL2xhdGVzdC91c2VyZ3VpZGUvVlBDX05BVF9JbnN0YW5jZS5odG1sI2NyZWF0ZS1uYXQtYW1pXG4gICAqL1xuICByZWFkb25seSB1c2VyRGF0YT86IFVzZXJEYXRhO1xufVxuXG4vKipcbiAqIFByb3ZpZGVyIGZvciBOQVQgR2F0ZXdheXNcbiAqL1xuZXhwb3J0IGNsYXNzIE5hdEdhdGV3YXlQcm92aWRlciBleHRlbmRzIE5hdFByb3ZpZGVyIHtcbiAgcHJpdmF0ZSBnYXRld2F5czogUHJlZlNldDxzdHJpbmc+ID0gbmV3IFByZWZTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IE5hdEdhdGV3YXlQcm9wcyA9IHt9KSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBjb25maWd1cmVOYXQob3B0aW9uczogQ29uZmlndXJlTmF0T3B0aW9ucykge1xuICAgIGlmIChcbiAgICAgIHRoaXMucHJvcHMuZWlwQWxsb2NhdGlvbklkcyAhPSBudWxsICYmXG4gICAgICAhVG9rZW4uaXNVbnJlc29sdmVkKHRoaXMucHJvcHMuZWlwQWxsb2NhdGlvbklkcykgJiZcbiAgICAgIHRoaXMucHJvcHMuZWlwQWxsb2NhdGlvbklkcy5sZW5ndGggPCBvcHRpb25zLm5hdFN1Ym5ldHMubGVuZ3RoXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBOb3QgZW5vdWdoIE5BVCBnYXRld2F5IEVJUCBhbGxvY2F0aW9uIElEcyAoJHt0aGlzLnByb3BzLmVpcEFsbG9jYXRpb25JZHMubGVuZ3RofSBwcm92aWRlZCkgZm9yIHRoZSByZXF1ZXN0ZWQgc3VibmV0IGNvdW50ICgke29wdGlvbnMubmF0U3VibmV0cy5sZW5ndGh9IG5lZWRlZCkuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBOQVQgZ2F0ZXdheXNcbiAgICBsZXQgaSA9IDA7XG4gICAgZm9yIChjb25zdCBzdWIgb2Ygb3B0aW9ucy5uYXRTdWJuZXRzKSB7XG4gICAgICBjb25zdCBlaXBBbGxvY2F0aW9uSWQgPSB0aGlzLnByb3BzLmVpcEFsbG9jYXRpb25JZHNcbiAgICAgICAgPyBwaWNrTihpLCB0aGlzLnByb3BzLmVpcEFsbG9jYXRpb25JZHMpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgZ2F0ZXdheSA9IHN1Yi5hZGROYXRHYXRld2F5KGVpcEFsbG9jYXRpb25JZCk7XG4gICAgICB0aGlzLmdhdGV3YXlzLmFkZChzdWIuYXZhaWxhYmlsaXR5Wm9uZSwgZ2F0ZXdheS5pZCk7XG4gICAgICBpKys7XG4gICAgfVxuXG4gICAgLy8gQWRkIHJvdXRlcyB0byB0aGVtIGluIHRoZSBwcml2YXRlIHN1Ym5ldHNcbiAgICBmb3IgKGNvbnN0IHN1YiBvZiBvcHRpb25zLnByaXZhdGVTdWJuZXRzKSB7XG4gICAgICB0aGlzLmNvbmZpZ3VyZVN1Ym5ldChzdWIpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjb25maWd1cmVTdWJuZXQoc3VibmV0OiBQcml2YXRlU3VibmV0KSB7XG4gICAgY29uc3QgYXogPSBzdWJuZXQuYXZhaWxhYmlsaXR5Wm9uZTtcbiAgICBjb25zdCBnYXRld2F5SWQgPSB0aGlzLmdhdGV3YXlzLnBpY2soYXopO1xuICAgIHN1Ym5ldC5hZGRSb3V0ZShcIkRlZmF1bHRSb3V0ZVwiLCB7XG4gICAgICByb3V0ZXJUeXBlOiBSb3V0ZXJUeXBlLk5BVF9HQVRFV0FZLFxuICAgICAgcm91dGVySWQ6IGdhdGV3YXlJZCxcbiAgICAgIGVuYWJsZXNJbnRlcm5ldENvbm5lY3Rpdml0eTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29uZmlndXJlZEdhdGV3YXlzKCk6IEdhdGV3YXlDb25maWdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2F0ZXdheXMudmFsdWVzKCkubWFwKCh4KSA9PiAoeyBhejogeFswXSwgZ2F0ZXdheUlkOiB4WzFdIH0pKTtcbiAgfVxufVxuXG4vKipcbiAqIE5BVCBwcm92aWRlciB3aGljaCB1c2VzIE5BVCBJbnN0YW5jZXNcbiAqXG4gKiBAZGVwcmVjYXRlZCB1c2UgTmF0SW5zdGFuY2VQcm92aWRlclYyLiBOYXRJbnN0YW5jZVByb3ZpZGVyIGlzIGRlcHJlY2F0ZWQgc2luY2VcbiAqIHRoZSBpbnN0YW5jZSBpbWFnZSB1c2VkIGhhcyByZWFjaGVkIEVPTCBvbiBEZWMgMzEgMjAyM1xuICovXG5leHBvcnQgY2xhc3MgTmF0SW5zdGFuY2VQcm92aWRlciBleHRlbmRzIE5hdFByb3ZpZGVyIGltcGxlbWVudHMgSUNvbm5lY3RhYmxlIHtcbiAgcHJpdmF0ZSBnYXRld2F5czogUHJlZlNldDxJbnN0YW5jZT4gPSBuZXcgUHJlZlNldDxJbnN0YW5jZT4oKTtcbiAgcHJpdmF0ZSBfc2VjdXJpdHlHcm91cD86IElTZWN1cml0eUdyb3VwO1xuICBwcml2YXRlIF9jb25uZWN0aW9ucz86IENvbm5lY3Rpb25zO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IE5hdEluc3RhbmNlUHJvcHMpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgaWYgKFxuICAgICAgcHJvcHMuZGVmYXVsdEFsbG93ZWRUcmFmZmljICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHByb3BzLmFsbG93QWxsVHJhZmZpYyAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiQ2FuIG5vdCBzcGVjaWZ5IGJvdGggb2YgJ2RlZmF1bHRBbGxvd2VkVHJhZmZpYycgYW5kICdkZWZhdWx0QWxsb3dlZFRyYWZmaWMnOyBwcmVmZXIgJ2RlZmF1bHRBbGxvd2VkVHJhZmZpYydcIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLmtleU5hbWUgJiYgcHJvcHMua2V5UGFpcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkNhbm5vdCBzcGVjaWZ5IGJvdGggb2YgJ2tleU5hbWUnIGFuZCAna2V5UGFpcic7IHByZWZlciAna2V5UGFpcidcIixcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNvbmZpZ3VyZU5hdChvcHRpb25zOiBDb25maWd1cmVOYXRPcHRpb25zKSB7XG4gICAgY29uc3QgZGVmYXVsdERpcmVjdGlvbiA9XG4gICAgICB0aGlzLnByb3BzLmRlZmF1bHRBbGxvd2VkVHJhZmZpYyA/P1xuICAgICAgKCh0aGlzLnByb3BzLmFsbG93QWxsVHJhZmZpYyA/PyB0cnVlKVxuICAgICAgICA/IE5hdFRyYWZmaWNEaXJlY3Rpb24uSU5CT1VORF9BTkRfT1VUQk9VTkRcbiAgICAgICAgOiBOYXRUcmFmZmljRGlyZWN0aW9uLk9VVEJPVU5EX09OTFkpO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBOQVQgaW5zdGFuY2VzLiBUaGV5IGNhbiBzaGFyZSBhIHNlY3VyaXR5IGdyb3VwIGFuZCBhIFJvbGUuXG4gICAgY29uc3QgbWFjaGluZUltYWdlID0gdGhpcy5wcm9wcy5tYWNoaW5lSW1hZ2UgPz8gbmV3IE5hdEluc3RhbmNlSW1hZ2UoKTtcbiAgICB0aGlzLl9zZWN1cml0eUdyb3VwID1cbiAgICAgIHRoaXMucHJvcHMuc2VjdXJpdHlHcm91cCA/P1xuICAgICAgbmV3IFNlY3VyaXR5R3JvdXAob3B0aW9ucy52cGMsIFwiTmF0U2VjdXJpdHlHcm91cFwiLCB7XG4gICAgICAgIHZwYzogb3B0aW9ucy52cGMsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlNlY3VyaXR5IEdyb3VwIGZvciBOQVQgaW5zdGFuY2VzXCIsXG4gICAgICAgIGFsbG93QWxsT3V0Ym91bmQ6IGlzT3V0Ym91bmRBbGxvd2VkKGRlZmF1bHREaXJlY3Rpb24pLFxuICAgICAgfSk7XG4gICAgdGhpcy5fY29ubmVjdGlvbnMgPSBuZXcgQ29ubmVjdGlvbnMoe1xuICAgICAgc2VjdXJpdHlHcm91cHM6IFt0aGlzLl9zZWN1cml0eUdyb3VwXSxcbiAgICB9KTtcblxuICAgIGlmIChpc0luYm91bmRBbGxvd2VkKGRlZmF1bHREaXJlY3Rpb24pKSB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25zLmFsbG93RnJvbUFueUlwdjQoUG9ydC5hbGxUcmFmZmljKCkpO1xuICAgIH1cblxuICAgIC8vIEZJWE1FOiBJZGVhbGx5LCBOQVQgaW5zdGFuY2VzIGRvbid0IGhhdmUgYSByb2xlIGF0IGFsbCwgYnV0XG4gICAgLy8gJ0luc3RhbmNlJyBkb2VzIG5vdCBhbGxvdyB0aGF0IHJpZ2h0IG5vdy5cbiAgICBjb25zdCByb2xlID0gbmV3IGlhbS5Sb2xlKG9wdGlvbnMudnBjLCBcIk5hdFJvbGVcIiwge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoXCJjb21wdXRlLmFtYXpvbmF3cy5jb21cIiksXG4gICAgfSk7XG5cbiAgICBmb3IgKGNvbnN0IHN1YiBvZiBvcHRpb25zLm5hdFN1Ym5ldHMpIHtcbiAgICAgIGNvbnN0IG5hdEluc3RhbmNlID0gbmV3IEluc3RhbmNlKHN1YiwgXCJOYXRJbnN0YW5jZVwiLCB7XG4gICAgICAgIGluc3RhbmNlVHlwZTogdGhpcy5wcm9wcy5pbnN0YW5jZVR5cGUsXG4gICAgICAgIG1hY2hpbmVJbWFnZSxcbiAgICAgICAgc291cmNlRGVzdENoZWNrOiBmYWxzZSwgLy8gUmVxdWlyZWQgZm9yIE5BVFxuICAgICAgICB2cGM6IG9wdGlvbnMudnBjLFxuICAgICAgICB2cGNTdWJuZXRzOiB7IHN1Ym5ldHM6IFtzdWJdIH0sXG4gICAgICAgIHNlY3VyaXR5R3JvdXA6IHRoaXMuX3NlY3VyaXR5R3JvdXAsXG4gICAgICAgIHJvbGUsXG4gICAgICAgIGtleVBhaXI6IHRoaXMucHJvcHMua2V5UGFpcixcbiAgICAgICAga2V5TmFtZTogdGhpcy5wcm9wcy5rZXlOYW1lLFxuICAgICAgICBjcmVkaXRTcGVjaWZpY2F0aW9uOiB0aGlzLnByb3BzLmNyZWRpdFNwZWNpZmljYXRpb24sXG4gICAgICB9KTtcbiAgICAgIC8vIE5BVCBpbnN0YW5jZSByb3V0ZXMgYWxsIHRyYWZmaWMsIGJvdGggd2F5c1xuICAgICAgdGhpcy5nYXRld2F5cy5hZGQoc3ViLmF2YWlsYWJpbGl0eVpvbmUsIG5hdEluc3RhbmNlKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgcm91dGVzIHRvIHRoZW0gaW4gdGhlIHByaXZhdGUgc3VibmV0c1xuICAgIGZvciAoY29uc3Qgc3ViIG9mIG9wdGlvbnMucHJpdmF0ZVN1Ym5ldHMpIHtcbiAgICAgIHRoaXMuY29uZmlndXJlU3VibmV0KHN1Yik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBTZWN1cml0eSBHcm91cCBhc3NvY2lhdGVkIHdpdGggdGhlIE5BVCBpbnN0YW5jZXNcbiAgICovXG4gIHB1YmxpYyBnZXQgc2VjdXJpdHlHcm91cCgpOiBJU2VjdXJpdHlHcm91cCB7XG4gICAgaWYgKCF0aGlzLl9zZWN1cml0eUdyb3VwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiUGFzcyB0aGUgTmF0SW5zdGFuY2VQcm92aWRlciB0byBhIFZwYyBiZWZvcmUgYWNjZXNzaW5nICdzZWN1cml0eUdyb3VwJ1wiLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3NlY3VyaXR5R3JvdXA7XG4gIH1cblxuICAvKipcbiAgICogTWFuYWdlIHRoZSBTZWN1cml0eSBHcm91cHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBOQVQgaW5zdGFuY2VzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbm5lY3Rpb25zKCk6IENvbm5lY3Rpb25zIHtcbiAgICBpZiAoIXRoaXMuX2Nvbm5lY3Rpb25zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiUGFzcyB0aGUgTmF0SW5zdGFuY2VQcm92aWRlciB0byBhIFZwYyBiZWZvcmUgYWNjZXNzaW5nICdjb25uZWN0aW9ucydcIixcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9ucztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29uZmlndXJlZEdhdGV3YXlzKCk6IEdhdGV3YXlDb25maWdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2F0ZXdheXNcbiAgICAgIC52YWx1ZXMoKVxuICAgICAgLm1hcCgoeCkgPT4gKHsgYXo6IHhbMF0sIGdhdGV3YXlJZDogeFsxXS5pbnN0YW5jZUlkIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBjb25maWd1cmVTdWJuZXQoc3VibmV0OiBQcml2YXRlU3VibmV0KSB7XG4gICAgY29uc3QgYXogPSBzdWJuZXQuYXZhaWxhYmlsaXR5Wm9uZTtcbiAgICBjb25zdCBnYXRld2F5SW5zdGFuY2UgPSB0aGlzLmdhdGV3YXlzLnBpY2soYXopO1xuICAgIC8vIFRPRE86IFRlcnJhZm9ybSBwcm92aWRlciBkb2VzIG5vdCBzdXBwb3J0IFJvdXRlclR5cGUuSU5TVEFOQ0VcbiAgICAvLyBzdWJuZXQuYWRkUm91dGUoXCJEZWZhdWx0Um91dGVcIiwge1xuICAgIC8vICAgcm91dGVyVHlwZTogUm91dGVyVHlwZS5JTlNUQU5DRSxcbiAgICAvLyAgIHJvdXRlcklkOiBnYXRld2F5SW5zdGFuY2UuaW5zdGFuY2VJZCxcbiAgICAvLyAgIGVuYWJsZXNJbnRlcm5ldENvbm5lY3Rpdml0eTogdHJ1ZSxcbiAgICAvLyB9KTtcbiAgICAvLyBpZiAoIWdhdGV3YXlJbnN0YW5jZS5wcmltYXJ5TmV0d29ya0ludGVyZmFjZUlkKSB7XG4gICAgLy8gICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgLy8gICAgIGBQcmltYXJ5IG5ldHdvcmsgaW50ZXJmYWNlIG5vdCBmb3VuZCBmb3IgZ2F0ZXdheSBpbnN0YW5jZSAke2dhdGV3YXlJbnN0YW5jZS5ub2RlLnBhdGh9YCxcbiAgICAvLyAgICk7XG4gICAgLy8gfVxuICAgIC8vIElmIHRoZXJlIGlzIG5vIHByaW1hcnkgbmV0d29yayBpbnRlcmZhY2UsIHRoZSB2YWx1ZSBpcyBcIlwiXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2hhc2hpY29ycC90ZXJyYWZvcm0tcHJvdmlkZXItYXdzL2Jsb2IvdjUuODguMC9pbnRlcm5hbC9zZXJ2aWNlL2VjMi9lYzJfaW5zdGFuY2UuZ28jTDEzNDBcbiAgICBzdWJuZXQuYWRkUm91dGUoXCJEZWZhdWx0Um91dGVcIiwge1xuICAgICAgcm91dGVyVHlwZTogUm91dGVyVHlwZS5ORVRXT1JLX0lOVEVSRkFDRSxcbiAgICAgIHJvdXRlcklkOiBnYXRld2F5SW5zdGFuY2UucHJpbWFyeU5ldHdvcmtJbnRlcmZhY2VJZCxcbiAgICAgIGVuYWJsZXNJbnRlcm5ldENvbm5lY3Rpdml0eTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFByZWZlcmVudGlhbCBzZXRcbiAqXG4gKiBQaWNrcyB0aGUgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4ga2V5IGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGRpc3RyaWJ1dGVzXG4gKiBldmVubHkgYW1vbmcgdGhlIGF2YWlsYWJsZSBvcHRpb25zLlxuICovXG5jbGFzcyBQcmVmU2V0PEE+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXA6IFJlY29yZDxzdHJpbmcsIEE+ID0ge307XG4gIHByaXZhdGUgcmVhZG9ubHkgdmFscyA9IG5ldyBBcnJheTxbc3RyaW5nLCBBXT4oKTtcbiAgcHJpdmF0ZSBuZXh0OiBudW1iZXIgPSAwO1xuXG4gIHB1YmxpYyBhZGQocHJlZjogc3RyaW5nLCB2YWx1ZTogQSkge1xuICAgIHRoaXMubWFwW3ByZWZdID0gdmFsdWU7XG4gICAgdGhpcy52YWxzLnB1c2goW3ByZWYsIHZhbHVlXSk7XG4gIH1cblxuICBwdWJsaWMgcGljayhwcmVmOiBzdHJpbmcpOiBBIHtcbiAgICBpZiAodGhpcy52YWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHBpY2ssIHNldCBpcyBlbXB0eVwiKTtcbiAgICB9XG5cbiAgICBpZiAocHJlZiBpbiB0aGlzLm1hcCkge1xuICAgICAgcmV0dXJuIHRoaXMubWFwW3ByZWZdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy52YWxzW3RoaXMubmV4dCsrICUgdGhpcy52YWxzLmxlbmd0aF1bMV07XG4gIH1cblxuICBwdWJsaWMgdmFsdWVzKCk6IEFycmF5PFtzdHJpbmcsIEFdPiB7XG4gICAgcmV0dXJuIHRoaXMudmFscztcbiAgfVxufVxuXG4vKipcbiAqIE1vZGVybiBOQVQgcHJvdmlkZXIgd2hpY2ggdXNlcyBOQVQgSW5zdGFuY2VzLlxuICogVGhlIGluc3RhbmNlIHVzZXMgQW1hem9uIExpbnV4IDIwMjMgYXMgdGhlIG9wZXJhdGluZyBzeXN0ZW0uXG4gKi9cbmV4cG9ydCBjbGFzcyBOYXRJbnN0YW5jZVByb3ZpZGVyVjIgZXh0ZW5kcyBOYXRQcm92aWRlciBpbXBsZW1lbnRzIElDb25uZWN0YWJsZSB7XG4gIC8qKlxuICAgKiBBbWF6b24gTGludXggMjAyMyBOQVQgaW5zdGFuY2UgdXNlciBkYXRhIGNvbW1hbmRzXG4gICAqIEVuYWJsZSBpcHRhYmxlcyBvbiB0aGUgaW5zdGFuY2UsIGVuYWJsZSBwZXJzaXN0ZW50IElQIGZvcndhcmRpbmcsIGNvbmZpZ3VyZSBOQVQgb24gaW5zdGFuY2VcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vdnBjL2xhdGVzdC91c2VyZ3VpZGUvVlBDX05BVF9JbnN0YW5jZS5odG1sI2NyZWF0ZS1uYXQtYW1pXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfVVNFUl9EQVRBX0NPTU1BTkRTID0gW1xuICAgIFwieXVtIGluc3RhbGwgaXB0YWJsZXMtc2VydmljZXMgLXlcIixcbiAgICBcInN5c3RlbWN0bCBlbmFibGUgaXB0YWJsZXNcIixcbiAgICBcInN5c3RlbWN0bCBzdGFydCBpcHRhYmxlc1wiLFxuICAgICdlY2hvIFwibmV0LmlwdjQuaXBfZm9yd2FyZD0xXCIgPiAvZXRjL3N5c2N0bC5kL2N1c3RvbS1pcC1mb3J3YXJkaW5nLmNvbmYnLFxuICAgIFwic3VkbyBzeXNjdGwgLXAgL2V0Yy9zeXNjdGwuZC9jdXN0b20taXAtZm9yd2FyZGluZy5jb25mXCIsXG4gICAgXCJzdWRvIC9zYmluL2lwdGFibGVzIC10IG5hdCAtQSBQT1NUUk9VVElORyAtbyAkKHJvdXRlIHwgYXdrICcvXmRlZmF1bHQve3ByaW50ICRORn0nKSAtaiBNQVNRVUVSQURFXCIsXG4gICAgXCJzdWRvIC9zYmluL2lwdGFibGVzIC1GIEZPUldBUkRcIixcbiAgICBcInN1ZG8gc2VydmljZSBpcHRhYmxlcyBzYXZlXCIsXG4gIF07XG5cbiAgcHJpdmF0ZSBnYXRld2F5czogUHJlZlNldDxJbnN0YW5jZT4gPSBuZXcgUHJlZlNldDxJbnN0YW5jZT4oKTtcbiAgcHJpdmF0ZSBfc2VjdXJpdHlHcm91cD86IElTZWN1cml0eUdyb3VwO1xuICBwcml2YXRlIF9jb25uZWN0aW9ucz86IENvbm5lY3Rpb25zO1xuXG4gIC8qKlxuICAgKiBBcnJheSBvZiBnYXRld2F5IGluc3RhbmNlcyBzcGF3bmVkIGJ5IHRoZSBwcm92aWRlciBhZnRlciBpbnRlcm5hbCBjb25maWd1cmF0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGdhdGV3YXlJbnN0YW5jZXMoKTogSW5zdGFuY2VbXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2F0ZXdheXMudmFsdWVzKCkubWFwKChbLCBpbnN0YW5jZV0pID0+IGluc3RhbmNlKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IE5hdEluc3RhbmNlUHJvcHMpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgaWYgKFxuICAgICAgcHJvcHMuZGVmYXVsdEFsbG93ZWRUcmFmZmljICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHByb3BzLmFsbG93QWxsVHJhZmZpYyAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiQ2FuIG5vdCBzcGVjaWZ5IGJvdGggb2YgJ2RlZmF1bHRBbGxvd2VkVHJhZmZpYycgYW5kICdkZWZhdWx0QWxsb3dlZFRyYWZmaWMnOyBwcmVmZXIgJ2RlZmF1bHRBbGxvd2VkVHJhZmZpYydcIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLmtleU5hbWUgJiYgcHJvcHMua2V5UGFpcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkNhbm5vdCBzcGVjaWZ5IGJvdGggb2YgJ2tleU5hbWUnIGFuZCAna2V5UGFpcic7IHByZWZlciAna2V5UGFpcidcIixcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNvbmZpZ3VyZU5hdChvcHRpb25zOiBDb25maWd1cmVOYXRPcHRpb25zKSB7XG4gICAgY29uc3QgZGVmYXVsdERpcmVjdGlvbiA9XG4gICAgICB0aGlzLnByb3BzLmRlZmF1bHRBbGxvd2VkVHJhZmZpYyA/P1xuICAgICAgKCh0aGlzLnByb3BzLmFsbG93QWxsVHJhZmZpYyA/PyB0cnVlKVxuICAgICAgICA/IE5hdFRyYWZmaWNEaXJlY3Rpb24uSU5CT1VORF9BTkRfT1VUQk9VTkRcbiAgICAgICAgOiBOYXRUcmFmZmljRGlyZWN0aW9uLk9VVEJPVU5EX09OTFkpO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBOQVQgaW5zdGFuY2VzLiBUaGV5IGNhbiBzaGFyZSBhIHNlY3VyaXR5IGdyb3VwIGFuZCBhIFJvbGUuIFRoZSBuZXcgTkFUIGluc3RhbmNlIGNyZWF0ZWQgdXNlcyBsYXRlc3RcbiAgICAvLyBBbWF6b24gTGludXggMjAyMyBpbWFnZS4gVGhpcyBpcyBpbXBvcnRhbnQgc2luY2UgdGhlIG9yaWdpbmFsIE5hdEluc3RhbmNlUHJvdmlkZXIgdXNlcyBhbiBpbnN0YW5jZSBpbWFnZSB0aGF0IGhhc1xuICAgIC8vIHJlYWNoZWQgRU9MIG9uIERlYyAzMSAyMDIzXG4gICAgY29uc3QgbWFjaGluZUltYWdlID1cbiAgICAgIHRoaXMucHJvcHMubWFjaGluZUltYWdlIHx8XG4gICAgICBuZXcgQW1hem9uTGludXhJbWFnZSh7XG4gICAgICAgIGdlbmVyYXRpb246IEFtYXpvbkxpbnV4R2VuZXJhdGlvbi5BTUFaT05fTElOVVhfMjAyMyxcbiAgICAgICAgY3B1VHlwZTpcbiAgICAgICAgICB0aGlzLnByb3BzLmluc3RhbmNlVHlwZS5hcmNoaXRlY3R1cmUgPT0gSW5zdGFuY2VBcmNoaXRlY3R1cmUuQVJNXzY0XG4gICAgICAgICAgICA/IEFtYXpvbkxpbnV4Q3B1VHlwZS5BUk1fNjRcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgdGhpcy5fc2VjdXJpdHlHcm91cCA9XG4gICAgICB0aGlzLnByb3BzLnNlY3VyaXR5R3JvdXAgPz9cbiAgICAgIG5ldyBTZWN1cml0eUdyb3VwKG9wdGlvbnMudnBjLCBcIk5hdFNlY3VyaXR5R3JvdXBcIiwge1xuICAgICAgICB2cGM6IG9wdGlvbnMudnBjLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJTZWN1cml0eSBHcm91cCBmb3IgTkFUIGluc3RhbmNlc1wiLFxuICAgICAgICBhbGxvd0FsbE91dGJvdW5kOiBpc091dGJvdW5kQWxsb3dlZChkZWZhdWx0RGlyZWN0aW9uKSxcbiAgICAgIH0pO1xuICAgIHRoaXMuX2Nvbm5lY3Rpb25zID0gbmV3IENvbm5lY3Rpb25zKHtcbiAgICAgIHNlY3VyaXR5R3JvdXBzOiBbdGhpcy5fc2VjdXJpdHlHcm91cF0sXG4gICAgfSk7XG5cbiAgICBpZiAoaXNJbmJvdW5kQWxsb3dlZChkZWZhdWx0RGlyZWN0aW9uKSkge1xuICAgICAgdGhpcy5jb25uZWN0aW9ucy5hbGxvd0Zyb21BbnlJcHY0KFBvcnQuYWxsVHJhZmZpYygpKTtcbiAgICB9XG5cbiAgICBsZXQgdXNlckRhdGEgPSB0aGlzLnByb3BzLnVzZXJEYXRhO1xuICAgIGlmICghdXNlckRhdGEpIHtcbiAgICAgIHVzZXJEYXRhID0gVXNlckRhdGEuZm9yTGludXgoKTtcbiAgICAgIHVzZXJEYXRhLmFkZENvbW1hbmRzKC4uLk5hdEluc3RhbmNlUHJvdmlkZXJWMi5ERUZBVUxUX1VTRVJfREFUQV9DT01NQU5EUyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzdWIgb2Ygb3B0aW9ucy5uYXRTdWJuZXRzKSB7XG4gICAgICBjb25zdCBuYXRJbnN0YW5jZSA9IG5ldyBJbnN0YW5jZShzdWIsIFwiTmF0SW5zdGFuY2VcIiwge1xuICAgICAgICBpbnN0YW5jZVR5cGU6IHRoaXMucHJvcHMuaW5zdGFuY2VUeXBlLFxuICAgICAgICBtYWNoaW5lSW1hZ2UsXG4gICAgICAgIHNvdXJjZURlc3RDaGVjazogZmFsc2UsIC8vIFJlcXVpcmVkIGZvciBOQVRcbiAgICAgICAgdnBjOiBvcHRpb25zLnZwYyxcbiAgICAgICAgdnBjU3VibmV0czogeyBzdWJuZXRzOiBbc3ViXSB9LFxuICAgICAgICBhc3NvY2lhdGVQdWJsaWNJcEFkZHJlc3M6IHRoaXMucHJvcHMuYXNzb2NpYXRlUHVibGljSXBBZGRyZXNzLFxuICAgICAgICBzZWN1cml0eUdyb3VwOiB0aGlzLl9zZWN1cml0eUdyb3VwLFxuICAgICAgICBrZXlQYWlyOiB0aGlzLnByb3BzLmtleVBhaXIsXG4gICAgICAgIGtleU5hbWU6IHRoaXMucHJvcHMua2V5TmFtZSxcbiAgICAgICAgY3JlZGl0U3BlY2lmaWNhdGlvbjogdGhpcy5wcm9wcy5jcmVkaXRTcGVjaWZpY2F0aW9uLFxuICAgICAgICB1c2VyRGF0YSxcbiAgICAgIH0pO1xuICAgICAgLy8gTkFUIGluc3RhbmNlIHJvdXRlcyBhbGwgdHJhZmZpYywgYm90aCB3YXlzXG4gICAgICB0aGlzLmdhdGV3YXlzLmFkZChzdWIuYXZhaWxhYmlsaXR5Wm9uZSwgbmF0SW5zdGFuY2UpO1xuICAgIH1cblxuICAgIC8vIEFkZCByb3V0ZXMgdG8gdGhlbSBpbiB0aGUgcHJpdmF0ZSBzdWJuZXRzXG4gICAgZm9yIChjb25zdCBzdWIgb2Ygb3B0aW9ucy5wcml2YXRlU3VibmV0cykge1xuICAgICAgdGhpcy5jb25maWd1cmVTdWJuZXQoc3ViKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIFNlY3VyaXR5IEdyb3VwIGFzc29jaWF0ZWQgd2l0aCB0aGUgTkFUIGluc3RhbmNlc1xuICAgKi9cbiAgcHVibGljIGdldCBzZWN1cml0eUdyb3VwKCk6IElTZWN1cml0eUdyb3VwIHtcbiAgICBpZiAoIXRoaXMuX3NlY3VyaXR5R3JvdXApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJQYXNzIHRoZSBOYXRJbnN0YW5jZVByb3ZpZGVyIHRvIGEgVnBjIGJlZm9yZSBhY2Nlc3NpbmcgJ3NlY3VyaXR5R3JvdXAnXCIsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc2VjdXJpdHlHcm91cDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYW5hZ2UgdGhlIFNlY3VyaXR5IEdyb3VwcyBhc3NvY2lhdGVkIHdpdGggdGhlIE5BVCBpbnN0YW5jZXNcbiAgICovXG4gIHB1YmxpYyBnZXQgY29ubmVjdGlvbnMoKTogQ29ubmVjdGlvbnMge1xuICAgIGlmICghdGhpcy5fY29ubmVjdGlvbnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJQYXNzIHRoZSBOYXRJbnN0YW5jZVByb3ZpZGVyIHRvIGEgVnBjIGJlZm9yZSBhY2Nlc3NpbmcgJ2Nvbm5lY3Rpb25zJ1wiLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25zO1xuICB9XG5cbiAgcHVibGljIGdldCBjb25maWd1cmVkR2F0ZXdheXMoKTogR2F0ZXdheUNvbmZpZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5nYXRld2F5c1xuICAgICAgLnZhbHVlcygpXG4gICAgICAubWFwKCh4KSA9PiAoeyBhejogeFswXSwgZ2F0ZXdheUlkOiB4WzFdLmluc3RhbmNlSWQgfSkpO1xuICB9XG5cbiAgcHVibGljIGNvbmZpZ3VyZVN1Ym5ldChzdWJuZXQ6IFByaXZhdGVTdWJuZXQpIHtcbiAgICBjb25zdCBheiA9IHN1Ym5ldC5hdmFpbGFiaWxpdHlab25lO1xuICAgIGNvbnN0IGdhdGV3YXlJbnN0YW5jZSA9IHRoaXMuZ2F0ZXdheXMucGljayhheik7XG4gICAgLy8gVE9ETzogVGVycmFmb3JtIHByb3ZpZGVyIGRvZXMgbm90IHN1cHBvcnQgUm91dGVyVHlwZS5JTlNUQU5DRVxuICAgIC8vIHN1Ym5ldC5hZGRSb3V0ZShcIkRlZmF1bHRSb3V0ZVwiLCB7XG4gICAgLy8gICByb3V0ZXJUeXBlOiBSb3V0ZXJUeXBlLklOU1RBTkNFLFxuICAgIC8vICAgcm91dGVySWQ6IGdhdGV3YXlJbnN0YW5jZS5pbnN0YW5jZUlkLFxuICAgIC8vICAgZW5hYmxlc0ludGVybmV0Q29ubmVjdGl2aXR5OiB0cnVlLFxuICAgIC8vIH0pO1xuICAgIC8vIGlmICghZ2F0ZXdheUluc3RhbmNlLnByaW1hcnlOZXR3b3JrSW50ZXJmYWNlKSB7XG4gICAgLy8gICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgLy8gICAgIGBQcmltYXJ5IG5ldHdvcmsgaW50ZXJmYWNlIG5vdCBmb3VuZCBmb3IgZ2F0ZXdheSBpbnN0YW5jZSAke2dhdGV3YXlJbnN0YW5jZS5ub2RlLnBhdGh9YCxcbiAgICAvLyAgICk7XG4gICAgLy8gfVxuICAgIC8vIElmIHRoZXJlIGlzIG5vIHByaW1hcnkgbmV0d29yayBpbnRlcmZhY2UsIHRoZSB2YWx1ZSBpcyBcIlwiXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2hhc2hpY29ycC90ZXJyYWZvcm0tcHJvdmlkZXItYXdzL2Jsb2IvdjUuODguMC9pbnRlcm5hbC9zZXJ2aWNlL2VjMi9lYzJfaW5zdGFuY2UuZ28jTDEzNDBcbiAgICBzdWJuZXQuYWRkUm91dGUoXCJEZWZhdWx0Um91dGVcIiwge1xuICAgICAgcm91dGVyVHlwZTogUm91dGVyVHlwZS5ORVRXT1JLX0lOVEVSRkFDRSxcbiAgICAgIHJvdXRlcklkOiBnYXRld2F5SW5zdGFuY2UucHJpbWFyeU5ldHdvcmtJbnRlcmZhY2VJZCxcbiAgICAgIGVuYWJsZXNJbnRlcm5ldENvbm5lY3Rpdml0eTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIE1hY2hpbmUgaW1hZ2UgcmVwcmVzZW50aW5nIHRoZSBsYXRlc3QgTkFUIGluc3RhbmNlIGltYWdlXG4gKlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIE5hdEluc3RhbmNlSW1hZ2UgZXh0ZW5kcyBMb29rdXBNYWNoaW5lSW1hZ2Uge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih7XG4gICAgICBuYW1lOiBcImFtem4tYW1pLXZwYy1uYXQtKlwiLFxuICAgICAgb3duZXJzOiBbXCJhbWF6b25cIl0sXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNPdXRib3VuZEFsbG93ZWQoZGlyZWN0aW9uOiBOYXRUcmFmZmljRGlyZWN0aW9uKSB7XG4gIHJldHVybiAoXG4gICAgZGlyZWN0aW9uID09PSBOYXRUcmFmZmljRGlyZWN0aW9uLklOQk9VTkRfQU5EX09VVEJPVU5EIHx8XG4gICAgZGlyZWN0aW9uID09PSBOYXRUcmFmZmljRGlyZWN0aW9uLk9VVEJPVU5EX09OTFlcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNJbmJvdW5kQWxsb3dlZChkaXJlY3Rpb246IE5hdFRyYWZmaWNEaXJlY3Rpb24pIHtcbiAgcmV0dXJuIGRpcmVjdGlvbiA9PT0gTmF0VHJhZmZpY0RpcmVjdGlvbi5JTkJPVU5EX0FORF9PVVRCT1VORDtcbn1cblxuLyoqXG4gKiBUb2tlbi1hd2FyZSBwaWNrIGluZGV4IGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIHBpY2tOKGk6IG51bWJlciwgeHM6IHN0cmluZ1tdKSB7XG4gIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQoeHMpKSB7XG4gICAgcmV0dXJuIEZuLmVsZW1lbnQoeHMsIGkpO1xuICB9XG5cbiAgaWYgKGkgPj0geHMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZ2V0IGVsZW1lbnQgJHtpfSBmcm9tICR7eHN9YCk7XG4gIH1cblxuICByZXR1cm4geHNbaV07XG59XG4iXX0=