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,538 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.SecurityGroup = 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/security-group.ts
7
+ const provider_aws_1 = require("@cdktf/provider-aws");
8
+ const cdktf_1 = require("cdktf");
9
+ const connections_1 = require("./connections");
10
+ const peer_1 = require("./peer");
11
+ const port_1 = require("./port");
12
+ const aws_construct_1 = require("../aws-construct");
13
+ const aws_stack_1 = require("../aws-stack");
14
+ // import { allowAllOutboundLocal } from "./private/context-stub";
15
+ const SECURITY_GROUP_SYMBOL = Symbol.for("terraconstructs/lib/aws/compute.SecurityGroup");
16
+ const SECURITY_GROUP_DISABLE_INLINE_RULES_CONTEXT_KEY = "terraconstructs/aws/compute.securityGroupDisableInlineRules";
17
+ /**
18
+ * A SecurityGroup that is not created in this template
19
+ */
20
+ class SecurityGroupBase extends aws_construct_1.AwsConstructBase {
21
+ /**
22
+ * Return whether the indicated object is a security group
23
+ */
24
+ static isSecurityGroup(x) {
25
+ return SECURITY_GROUP_SYMBOL in x;
26
+ }
27
+ get securityGroupOutputs() {
28
+ return {
29
+ securityGroupId: this.securityGroupId,
30
+ };
31
+ }
32
+ get outputs() {
33
+ return this.securityGroupOutputs;
34
+ }
35
+ constructor(scope, id, props) {
36
+ super(scope, id, props);
37
+ this.canInlineRule = false;
38
+ this.connections = new connections_1.Connections({
39
+ securityGroups: [this],
40
+ });
41
+ this.peerAsTokenCount = 0;
42
+ Object.defineProperty(this, SECURITY_GROUP_SYMBOL, { value: true });
43
+ }
44
+ get uniqueId() {
45
+ return aws_stack_1.AwsStack.uniqueId(this.node);
46
+ }
47
+ addIngressRule(peer, connection, description, remoteRule) {
48
+ if (description === undefined) {
49
+ description = `from ${peer.uniqueId}:${connection}`;
50
+ }
51
+ const { scope, id } = this.determineRuleScope(peer, connection, "from", remoteRule);
52
+ // Skip duplicates
53
+ if (scope.node.tryFindChild(id) === undefined) {
54
+ new provider_aws_1.vpcSecurityGroupIngressRule.VpcSecurityGroupIngressRule(scope, id, {
55
+ securityGroupId: this.securityGroupId,
56
+ ...peer.toIngressRuleConfig(),
57
+ ...connection.toRuleJson(),
58
+ description,
59
+ });
60
+ }
61
+ }
62
+ addEgressRule(peer, connection, description, remoteRule) {
63
+ if (description === undefined) {
64
+ description = `to ${peer.uniqueId}:${connection}`;
65
+ }
66
+ const { scope, id } = this.determineRuleScope(peer, connection, "to", remoteRule);
67
+ // Skip duplicates
68
+ if (scope.node.tryFindChild(id) === undefined) {
69
+ new provider_aws_1.vpcSecurityGroupEgressRule.VpcSecurityGroupEgressRule(scope, id, {
70
+ securityGroupId: this.securityGroupId,
71
+ ...peer.toEgressRuleConfig(),
72
+ ...connection.toRuleJson(),
73
+ description,
74
+ });
75
+ }
76
+ }
77
+ toIngressRuleConfig() {
78
+ return this.toRuleConfig();
79
+ }
80
+ toEgressRuleConfig() {
81
+ return this.toRuleConfig();
82
+ }
83
+ // Terraform does not use different properties between ingress and egress rules
84
+ toRuleConfig() {
85
+ return { referencedSecurityGroupId: this.securityGroupId };
86
+ }
87
+ /**
88
+ * Determine where to parent a new ingress/egress rule
89
+ *
90
+ * A SecurityGroup rule is parented under the group it's related to, UNLESS
91
+ * we're in a cross-stack scenario with another Security Group. In that case,
92
+ * we respect the 'remoteRule' flag and will parent under the other security
93
+ * group.
94
+ *
95
+ * This is necessary to avoid cyclic dependencies between stacks, since both
96
+ * ingress and egress rules will reference both security groups, and a naive
97
+ * parenting will lead to the following situation:
98
+ *
99
+ * ╔════════════════════╗ ╔════════════════════╗
100
+ * ║ ┌───────────┐ ║ ║ ┌───────────┐ ║
101
+ * ║ │ GroupA │◀────╬─┐ ┌───╬───▶│ GroupB │ ║
102
+ * ║ └───────────┘ ║ │ │ ║ └───────────┘ ║
103
+ * ║ ▲ ║ │ │ ║ ▲ ║
104
+ * ║ │ ║ │ │ ║ │ ║
105
+ * ║ │ ║ │ │ ║ │ ║
106
+ * ║ ┌───────────┐ ║ └───┼───╬────┌───────────┐ ║
107
+ * ║ │ EgressA │─────╬─────┘ ║ │ IngressB │ ║
108
+ * ║ └───────────┘ ║ ║ └───────────┘ ║
109
+ * ║ ║ ║ ║
110
+ * ╚════════════════════╝ ╚════════════════════╝
111
+ *
112
+ * By having the ability to switch the parent, we avoid the cyclic reference by
113
+ * keeping all rules in a single stack.
114
+ *
115
+ * If this happens, we also have to change the construct ID, because
116
+ * otherwise we might have two objects with the same ID if we have
117
+ * multiple reversed security group relationships.
118
+ *
119
+ * ╔═══════════════════════════════════╗
120
+ * ║┌───────────┐ ║
121
+ * ║│ GroupB │ ║
122
+ * ║└───────────┘ ║
123
+ * ║ ▲ ║
124
+ * ║ │ ┌───────────┐ ║
125
+ * ║ ├────"from A"──│ IngressB │ ║
126
+ * ║ │ └───────────┘ ║
127
+ * ║ │ ┌───────────┐ ║
128
+ * ║ ├─────"to B"───│ EgressA │ ║
129
+ * ║ │ └───────────┘ ║
130
+ * ║ │ ┌───────────┐ ║
131
+ * ║ └─────"to B"───│ EgressC │ ║ <-- oops
132
+ * ║ └───────────┘ ║
133
+ * ╚═══════════════════════════════════╝
134
+ */
135
+ determineRuleScope(peer, connection, fromTo, remoteRule) {
136
+ if (remoteRule &&
137
+ SecurityGroupBase.isSecurityGroup(peer) &&
138
+ differentStacks(this, peer)) {
139
+ // Reversed
140
+ const reversedFromTo = fromTo === "from" ? "to" : "from";
141
+ return {
142
+ scope: peer,
143
+ id: `${this.uniqueId}:${connection} ${reversedFromTo}`,
144
+ };
145
+ }
146
+ else {
147
+ // Regular (do old ID escaping in order to not disturb existing deployments)
148
+ return {
149
+ scope: this,
150
+ id: `${fromTo} ${this.renderPeer(peer)}:${connection}`.replace("/", "_"),
151
+ };
152
+ }
153
+ }
154
+ renderPeer(peer) {
155
+ if (cdktf_1.Token.isUnresolved(peer.uniqueId)) {
156
+ // Need to return a unique value each time a peer
157
+ // is an unresolved token, else the duplicate skipper
158
+ // in `sg.addXxxRule` can detect unique rules as duplicates
159
+ return this.peerAsTokenCount++
160
+ ? `'{IndirectPeer${this.peerAsTokenCount}}'`
161
+ : "{IndirectPeer}";
162
+ }
163
+ else {
164
+ return peer.uniqueId;
165
+ }
166
+ }
167
+ }
168
+ function differentStacks(group1, group2) {
169
+ return aws_stack_1.AwsStack.of(group1) !== aws_stack_1.AwsStack.of(group2);
170
+ }
171
+ /**
172
+ * Creates an Amazon EC2 security group within a VPC.
173
+ *
174
+ * Security Groups act like a firewall with a set of rules, and are associated
175
+ * with any AWS resource that has or creates Elastic Network Interfaces (ENIs).
176
+ * A typical example of a resource that has a security group is an Instance (or
177
+ * Auto Scaling Group of instances)
178
+ *
179
+ * If you are defining new infrastructure in CDK, there is a good chance you
180
+ * won't have to interact with this class at all. Like IAM Roles, Security
181
+ * Groups need to exist to control access between AWS resources, but CDK will
182
+ * automatically generate and populate them with least-privilege permissions
183
+ * for you so you can concentrate on your business logic.
184
+ *
185
+ * All Constructs that require Security Groups will create one for you if you
186
+ * don't specify one at construction. After construction, you can selectively
187
+ * allow connections to and between constructs via--for example-- the `instance.connections`
188
+ * object. Think of it as "allowing connections to your instance", rather than
189
+ * "adding ingress rules a security group". See the [Allowing
190
+ * Connections](https://docs.aws.amazon.com/cdk/api/latest/docs/aws-cdk-lib.aws_ec2-readme.html#allowing-connections)
191
+ * section in the library documentation for examples.
192
+ *
193
+ * Direct manipulation of the Security Group through `addIngressRule` and
194
+ * `addEgressRule` is possible, but mutation through the `.connections` object
195
+ * is recommended. If you peer two constructs with security groups this way,
196
+ * appropriate rules will be created in both.
197
+ *
198
+ * If you have an existing security group you want to use in your CDK application,
199
+ * you would import it like this:
200
+ *
201
+ * ```ts
202
+ * const securityGroup = compute.SecurityGroup.fromSecurityGroupId(this, 'SG', 'sg-12345', {
203
+ * mutable: false
204
+ * });
205
+ * ```
206
+ */
207
+ class SecurityGroup extends SecurityGroupBase {
208
+ /**
209
+ * Look up a security group by id.
210
+ */
211
+ static fromLookupById(scope, id, securityGroupId, allowAllOutbound) {
212
+ return this.fromLookupAttributes(scope, id, {
213
+ securityGroupId,
214
+ allowAllOutbound,
215
+ });
216
+ }
217
+ /**
218
+ * Look up a security group by name.
219
+ */
220
+ static fromLookupByName(scope, id, securityGroupName, vpc, allowAllOutbound) {
221
+ return this.fromLookupAttributes(scope, id, {
222
+ securityGroupName,
223
+ vpc,
224
+ allowAllOutbound,
225
+ });
226
+ }
227
+ /**
228
+ * Import an existing security group into this app.
229
+ *
230
+ * This method will assume that the Security Group has a rule in it which allows
231
+ * all outbound traffic, and so will not add egress rules to the imported Security
232
+ * Group (only ingress rules).
233
+ *
234
+ * If your existing Security Group needs to have egress rules added, pass the
235
+ * `allowAllOutbound: false` option on import.
236
+ */
237
+ static fromSecurityGroupId(scope, id, securityGroupId, options = {}) {
238
+ class MutableImport extends SecurityGroupBase {
239
+ constructor() {
240
+ super(...arguments);
241
+ this.securityGroupId = securityGroupId;
242
+ this.allowAllOutbound = options.allowAllOutbound ?? true;
243
+ this.allowAllIpv6Outbound = options.allowAllIpv6Outbound ?? false;
244
+ }
245
+ addEgressRule(peer, connection, description, remoteRule) {
246
+ // Only if allowAllOutbound has been disabled
247
+ if (options.allowAllOutbound === false) {
248
+ super.addEgressRule(peer, connection, description, remoteRule);
249
+ }
250
+ }
251
+ }
252
+ class ImmutableImport extends SecurityGroupBase {
253
+ constructor() {
254
+ super(...arguments);
255
+ this.securityGroupId = securityGroupId;
256
+ this.allowAllOutbound = options.allowAllOutbound ?? true;
257
+ this.allowAllIpv6Outbound = options.allowAllIpv6Outbound ?? false;
258
+ }
259
+ addEgressRule(_peer, _connection, _description, _remoteRule) {
260
+ // do nothing
261
+ }
262
+ addIngressRule(_peer, _connection, _description, _remoteRule) {
263
+ // do nothing
264
+ }
265
+ }
266
+ return options.mutable !== false
267
+ ? new MutableImport(scope, id)
268
+ : new ImmutableImport(scope, id);
269
+ }
270
+ /**
271
+ * Look up a security group.
272
+ */
273
+ static fromLookupAttributes(scope, id, options) {
274
+ if (cdktf_1.Token.isUnresolved(options.securityGroupId) ||
275
+ cdktf_1.Token.isUnresolved(options.securityGroupName) ||
276
+ cdktf_1.Token.isUnresolved(options.vpc?.vpcId)) {
277
+ throw new Error("All arguments to look up a security group must be concrete (no Tokens)");
278
+ }
279
+ const data = new provider_aws_1.dataAwsSecurityGroup.DataAwsSecurityGroup(scope, id, {
280
+ vpcId: options.vpc?.vpcId,
281
+ id: options.securityGroupId,
282
+ name: options.securityGroupName,
283
+ });
284
+ // TODO: Use Grid as contextProvider
285
+ // Warning: using data source to determine if the security group allows
286
+ // all outbound with allowAllOutboundLocal(scope, id, data.id)
287
+ // would force all depending code to deal with Tokens
288
+ return SecurityGroup.fromSecurityGroupId(scope, id, data.id, {
289
+ allowAllOutbound: options.allowAllOutbound ?? true,
290
+ mutable: true,
291
+ });
292
+ }
293
+ constructor(scope, id, props) {
294
+ super(scope, id, props);
295
+ this.directIngressRules = [];
296
+ this.directEgressRules = [];
297
+ const groupName = props.securityGroupName ||
298
+ this.stack.uniqueResourceName(this, {
299
+ prefix: this.gridUUID,
300
+ });
301
+ const groupDescription = props.description || this.node.path;
302
+ this.allowAllOutbound = props.allowAllOutbound !== false;
303
+ this.allowAllIpv6Outbound = props.allowAllIpv6Outbound ?? false;
304
+ this.disableInlineRules =
305
+ props.disableInlineRules !== undefined
306
+ ? !!props.disableInlineRules
307
+ : !!this.node.tryGetContext(SECURITY_GROUP_DISABLE_INLINE_RULES_CONTEXT_KEY);
308
+ this.securityGroup = new provider_aws_1.securityGroup.SecurityGroup(this, "Resource", {
309
+ name: groupName,
310
+ description: groupDescription,
311
+ ingress: cdktf_1.Lazy.anyValue({
312
+ produce: () => this.directIngressRules.map(provider_aws_1.securityGroup.securityGroupIngressToTerraform),
313
+ }, { omitEmptyArray: true }),
314
+ egress: cdktf_1.Lazy.anyValue({
315
+ produce: () => this.directEgressRules.map(provider_aws_1.securityGroup.securityGroupEgressToTerraform),
316
+ }, { omitEmptyArray: true }),
317
+ vpcId: props.vpc.vpcId,
318
+ });
319
+ this.securityGroupId = this.securityGroup.id;
320
+ this.securityGroupVpcId = this.securityGroup.vpcId;
321
+ this.addDefaultEgressRule();
322
+ this.addDefaultIpv6EgressRule();
323
+ }
324
+ addIngressRule(peer, connection, description, remoteRule) {
325
+ if (!peer.canInlineRule ||
326
+ !connection.canInlineRule ||
327
+ this.disableInlineRules) {
328
+ super.addIngressRule(peer, connection, description, remoteRule);
329
+ return;
330
+ }
331
+ if (description === undefined) {
332
+ description = `from ${peer.uniqueId}:${connection}`;
333
+ }
334
+ this.addDirectIngressRule({
335
+ ...peer.toIngressRuleConfig(),
336
+ ...connection.toRuleJson(),
337
+ description,
338
+ });
339
+ }
340
+ addEgressRule(peer, connection, description, remoteRule) {
341
+ const isIpv6 = peer.toEgressRuleConfig().hasOwnProperty("cidrIpv6");
342
+ if (!isIpv6 && this.allowAllOutbound) {
343
+ // In the case of "allowAllOutbound", we don't add any more rules. There
344
+ // is only one rule which allows all traffic and that subsumes any other
345
+ // rule.
346
+ if (!remoteRule) {
347
+ // Warn only if addEgressRule() was explicitely called
348
+ // "@aws-cdk/aws-ec2:ipv4IgnoreEgressRule",
349
+ cdktf_1.Annotations.of(this).addWarning("Ignoring Egress rule since 'allowAllOutbound' is set to true; To add customized rules, set allowAllOutbound=false on the SecurityGroup");
350
+ }
351
+ return;
352
+ }
353
+ if (isIpv6 && this.allowAllIpv6Outbound) {
354
+ // In the case of "allowAllIpv6Outbound", we don't add any more rules. There
355
+ // is only one rule which allows all traffic and that subsumes any other
356
+ // rule.
357
+ if (!remoteRule) {
358
+ // Warn only if addEgressRule() was explicitely called
359
+ // "@aws-cdk/aws-ec2:ipv6IgnoreEgressRule",
360
+ cdktf_1.Annotations.of(this).addWarning("Ignoring Egress rule since 'allowAllIpv6Outbound' is set to true; To add customized rules, set allowAllIpv6Outbound=false on the SecurityGroup");
361
+ }
362
+ return;
363
+ }
364
+ if (!peer.canInlineRule ||
365
+ !connection.canInlineRule ||
366
+ this.disableInlineRules) {
367
+ super.addEgressRule(peer, connection, description, remoteRule);
368
+ return;
369
+ }
370
+ if (description === undefined) {
371
+ description = `from ${peer.uniqueId}:${connection}`;
372
+ }
373
+ const rule = {
374
+ ...peer.toEgressRuleConfig(),
375
+ ...connection.toRuleJson(),
376
+ description,
377
+ };
378
+ if (isAllTrafficRule(rule)) {
379
+ // We cannot allow this; if someone adds the rule in this way, it will be
380
+ // removed again if they add other rules. We also can't automatically switch
381
+ // to "allOutbound=true" mode, because we might have already emitted
382
+ // EgressRule objects (which count as rules added later) and there's no way
383
+ // to recall those. Better to prevent this for now.
384
+ throw new Error('Cannot add an "all traffic" egress rule in this way; set allowAllOutbound=true (for ipv6) or allowAllIpv6Outbound=true (for ipv6) on the SecurityGroup instead.');
385
+ }
386
+ this.addDirectEgressRule(rule);
387
+ }
388
+ /**
389
+ * Add a direct ingress rule
390
+ */
391
+ addDirectIngressRule(rule) {
392
+ let r = normalizeDirectRule(rule);
393
+ if (!this.hasIngressRule(r)) {
394
+ this.directIngressRules.push(r);
395
+ }
396
+ }
397
+ /**
398
+ * Return whether the given ingress rule exists on the group
399
+ */
400
+ hasIngressRule(rule) {
401
+ return (this.directIngressRules.findIndex((r) => ingressRulesEqual(r, rule)) > -1);
402
+ }
403
+ /**
404
+ * Add a direct egress rule
405
+ */
406
+ addDirectEgressRule(rule) {
407
+ let r = normalizeDirectRule(rule);
408
+ if (!this.hasEgressRule(r)) {
409
+ this.directEgressRules.push(r);
410
+ }
411
+ }
412
+ /**
413
+ * Return whether the given egress rule exists on the group
414
+ */
415
+ hasEgressRule(rule) {
416
+ return (this.directEgressRules.findIndex((r) => egressRulesEqual(r, rule)) > -1);
417
+ }
418
+ /**
419
+ * Add the default egress rule to the securityGroup
420
+ *
421
+ * By default, AWS creates an `ALLOW ALL` egress rule when creating a new Security Group inside of a VPC.
422
+ * When creating a new Security Group inside a VPC, Terraform will remove this default rule, and require
423
+ * you specifically re-create it if you desire that rule.
424
+ *
425
+ * This depends on allowAllOutbound
426
+ *
427
+ * - If allowAllOutbound is true, we will add an allow all rule.
428
+ * - If allowAllOutbound is false, we don't do anything since TF does not add
429
+ * a default allow all ipv4 rule.
430
+ */
431
+ addDefaultEgressRule() {
432
+ if (!this.allowAllOutbound) {
433
+ return;
434
+ }
435
+ if (this.disableInlineRules) {
436
+ super.addEgressRule(ALL_TRAFFIC_PEER, ALL_TRAFFIC_PORT, ALLOW_ALL_RULE.description, false);
437
+ }
438
+ else {
439
+ this.directEgressRules.push(ALLOW_ALL_RULE);
440
+ }
441
+ }
442
+ /**
443
+ * Add a allow all ipv6 egress rule to the securityGroup
444
+ *
445
+ * This depends on allowAllIpv6Outbound:
446
+ *
447
+ * - If allowAllIpv6Outbound is true, we will add an allow all rule.
448
+ * - If allowAllOutbound is false, we don't do anything since EC2 does not add
449
+ * a default allow all ipv6 rule.
450
+ */
451
+ addDefaultIpv6EgressRule() {
452
+ const description = "Allow all outbound ipv6 traffic by default";
453
+ const peer = peer_1.Peer.anyIpv6();
454
+ if (this.allowAllIpv6Outbound) {
455
+ if (this.disableInlineRules) {
456
+ super.addEgressRule(peer, port_1.Port.allTraffic(), description, false);
457
+ }
458
+ else {
459
+ this.directEgressRules.push({
460
+ protocol: "-1",
461
+ fromPort: 0,
462
+ toPort: 0,
463
+ ipv6CidrBlocks: [peer.uniqueId],
464
+ description,
465
+ });
466
+ }
467
+ }
468
+ }
469
+ }
470
+ exports.SecurityGroup = SecurityGroup;
471
+ _a = JSII_RTTI_SYMBOL_1;
472
+ SecurityGroup[_a] = { fqn: "terraconstructs.aws.compute.SecurityGroup", version: "0.0.12" };
473
+ /**
474
+ * Fix up a direct rule to have fromPort/toPort defined
475
+ */
476
+ function normalizeDirectRule(rule) {
477
+ // Unlike security_group_(in|e)gress_rule, TF Security Group direct rules
478
+ // can't have fromPort/toPort undefined.
479
+ // refs:
480
+ // - https://registry.terraform.io/providers/hashicorp/aws/5.88.0/docs/resources/vpc_security_group_egress_rule#ip_protocol-1
481
+ // vs
482
+ // - https://registry.terraform.io/providers/hashicorp/aws/5.88.0/docs/resources/security_group#protocol-1
483
+ return {
484
+ ...rule,
485
+ fromPort: rule.fromPort ?? 0,
486
+ toPort: rule.toPort ?? 0,
487
+ };
488
+ }
489
+ /**
490
+ * Egress rule that matches all traffic
491
+ */
492
+ const ALLOW_ALL_RULE = {
493
+ cidrBlocks: ["0.0.0.0/0"],
494
+ description: "Allow all outbound traffic by default",
495
+ /**
496
+ * If you select a protocol of -1 (semantically equivalent to all, which is not a valid value here),
497
+ * you must specify a from_port and to_port equal to 0.
498
+ */
499
+ protocol: "-1",
500
+ fromPort: 0,
501
+ toPort: 0,
502
+ };
503
+ const ALL_TRAFFIC_PEER = peer_1.Peer.anyIpv4();
504
+ const ALL_TRAFFIC_PORT = port_1.Port.allTraffic();
505
+ /**
506
+ * Compare two ingress rules for equality the same way CloudFormation would (discarding description)
507
+ */
508
+ function ingressRulesEqual(a, b) {
509
+ return (a.cidrBlocks === b.cidrBlocks &&
510
+ a.ipv6CidrBlocks === b.ipv6CidrBlocks &&
511
+ a.fromPort === b.fromPort &&
512
+ a.toPort === b.toPort &&
513
+ a.protocol === b.protocol &&
514
+ a.prefixListIds === b.prefixListIds &&
515
+ a.securityGroups === b.securityGroups);
516
+ }
517
+ /**
518
+ * Compare two egress rules for equality the same way CloudFormation would (discarding description)
519
+ */
520
+ function egressRulesEqual(a, b) {
521
+ return (a.cidrBlocks === b.cidrBlocks &&
522
+ a.ipv6CidrBlocks === b.ipv6CidrBlocks &&
523
+ a.fromPort === b.fromPort &&
524
+ a.toPort === b.toPort &&
525
+ a.protocol === b.protocol &&
526
+ a.prefixListIds === b.prefixListIds &&
527
+ a.securityGroups === b.securityGroups);
528
+ }
529
+ /**
530
+ * Whether this rule refers to all traffic
531
+ */
532
+ function isAllTrafficRule(rule) {
533
+ return ((rule.cidrIpv4 === "0.0.0.0/0" ||
534
+ (rule.cidrBlocks && rule.cidrBlocks[0] === "0.0.0.0/0") ||
535
+ rule.cidrIpv6 === "::/0") &&
536
+ rule.ipProtocol === "-1");
537
+ }
538
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHktZ3JvdXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXdzL2NvbXB1dGUvc2VjdXJpdHktZ3JvdXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrR0FBa0c7QUFFbEcsc0RBSzZCO0FBQzdCLGlDQUFpRDtBQUVqRCwrQ0FBNEM7QUFDNUMsaUNBQXFDO0FBQ3JDLGlDQUE4QjtBQUU5QixvREFJMEI7QUFDMUIsNENBQXdDO0FBQ3hDLGtFQUFrRTtBQUVsRSxNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQ3RDLCtDQUErQyxDQUNoRCxDQUFDO0FBRUYsTUFBTSwrQ0FBK0MsR0FDbkQsNkRBQTZELENBQUM7QUFnRWhFOztHQUVHO0FBQ0gsTUFBZSxpQkFDYixTQUFRLGdDQUFnQjtJQUd4Qjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBTTtRQUNsQyxPQUFPLHFCQUFxQixJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBR0QsSUFBVyxvQkFBb0I7UUFDN0IsT0FBTztZQUNMLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZTtTQUN0QyxDQUFDO0lBQ0osQ0FBQztJQUNELElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztJQUNuQyxDQUFDO0lBWUQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF5QjtRQUNqRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQVRWLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLGdCQUFXLEdBQWdCLElBQUkseUJBQVcsQ0FBQztZQUN6RCxjQUFjLEVBQUUsQ0FBQyxJQUFJLENBQUM7U0FDdkIsQ0FBQyxDQUFDO1FBR0sscUJBQWdCLEdBQVcsQ0FBQyxDQUFDO1FBS25DLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLHFCQUFxQixFQUFFLEVBQUUsS0FBSyxF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QyxRQUFRLEtBQUssQ0FBQyxDQUFDLFFBQVE7UUFDekIsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsTUFBTTtRQUNyQixDQUFDLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyxRQUFRO1FBQ3pCLENBQUMsQ0FBQyxhQUFhLEtBQUssQ0FBQyxDQUFDLGFBQWE7UUFDbkMsQ0FBQyxDQUFDLGNBQWMsS0FBSyxDQUFDLENBQUMsY0FBYyxDQUN0QyxDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FDdkIsQ0FBb0MsRUFDcEMsQ0FBb0M7SUFFcEMsT0FBTyxDQUNMLENBQUMsQ0FBQyxVQUFVLEtBQUssQ0FBQyxDQUFDLFVBQVU7UUFDN0IsQ0FBQyxDQUFDLGNBQWMsS0FBSyxDQUFDLENBQUMsY0FBYztRQUNyQyxDQUFDLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyxRQUFRO1FBQ3pCLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLE1BQU07UUFDckIsQ0FBQyxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsUUFBUTtRQUN6QixDQUFDLENBQUMsYUFBYSxLQUFLLENBQUMsQ0FBQyxhQUFhO1FBQ25DLENBQUMsQ0FBQyxjQUFjLEtBQUssQ0FBQyxDQUFDLGNBQWMsQ0FDdEMsQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsSUFBUztJQUNqQyxPQUFPLENBQ0wsQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLFdBQVc7UUFDNUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssV0FBVyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxRQUFRLEtBQUssTUFBTSxDQUFDO1FBQzNCLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUN6QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE3NS4xL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1lYzIvbGliL3NlY3VyaXR5LWdyb3VwLnRzXG5cbmltcG9ydCB7XG4gIGRhdGFBd3NTZWN1cml0eUdyb3VwLFxuICBzZWN1cml0eUdyb3VwLFxuICB2cGNTZWN1cml0eUdyb3VwRWdyZXNzUnVsZSxcbiAgdnBjU2VjdXJpdHlHcm91cEluZ3Jlc3NSdWxlLFxufSBmcm9tIFwiQGNka3RmL3Byb3ZpZGVyLWF3c1wiO1xuaW1wb3J0IHsgQW5ub3RhdGlvbnMsIExhenksIFRva2VuIH0gZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbnMgfSBmcm9tIFwiLi9jb25uZWN0aW9uc1wiO1xuaW1wb3J0IHsgSVBlZXIsIFBlZXIgfSBmcm9tIFwiLi9wZWVyXCI7XG5pbXBvcnQgeyBQb3J0IH0gZnJvbSBcIi4vcG9ydFwiO1xuaW1wb3J0IHsgSVZwYyB9IGZyb20gXCIuL3ZwY1wiO1xuaW1wb3J0IHtcbiAgQXdzQ29uc3RydWN0QmFzZSxcbiAgSUF3c0NvbnN0cnVjdCxcbiAgQXdzQ29uc3RydWN0UHJvcHMsXG59IGZyb20gXCIuLi9hd3MtY29uc3RydWN0XCI7XG5pbXBvcnQgeyBBd3NTdGFjayB9IGZyb20gXCIuLi9hd3Mtc3RhY2tcIjtcbi8vIGltcG9ydCB7IGFsbG93QWxsT3V0Ym91bmRMb2NhbCB9IGZyb20gXCIuL3ByaXZhdGUvY29udGV4dC1zdHViXCI7XG5cbmNvbnN0IFNFQ1VSSVRZX0dST1VQX1NZTUJPTCA9IFN5bWJvbC5mb3IoXG4gIFwidGVycmFjb25zdHJ1Y3RzL2xpYi9hd3MvY29tcHV0ZS5TZWN1cml0eUdyb3VwXCIsXG4pO1xuXG5jb25zdCBTRUNVUklUWV9HUk9VUF9ESVNBQkxFX0lOTElORV9SVUxFU19DT05URVhUX0tFWSA9XG4gIFwidGVycmFjb25zdHJ1Y3RzL2F3cy9jb21wdXRlLnNlY3VyaXR5R3JvdXBEaXNhYmxlSW5saW5lUnVsZXNcIjtcblxuLyoqXG4gKiBPdXRwdXRzIHdoaWNoIG1heSBiZSByZWdpc3RlcmVkIGZvciBvdXRwdXQgdmlhIHRoZSBHcmlkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlY3VyaXR5R3JvdXBPdXRwdXRzIHtcbiAgLyoqXG4gICAqIElEIGZvciB0aGUgY3VycmVudCBzZWN1cml0eSBncm91cFxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUdyb3VwSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIHNlY3VyaXR5IGdyb3VwLWxpa2Ugb2JqZWN0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElTZWN1cml0eUdyb3VwIGV4dGVuZHMgSUF3c0NvbnN0cnVjdCwgSVBlZXIge1xuICAvKiogU3Ryb25nbHkgdHlwZWQgb3V0cHV0cyAqL1xuICByZWFkb25seSBzZWN1cml0eUdyb3VwT3V0cHV0czogU2VjdXJpdHlHcm91cE91dHB1dHM7XG5cbiAgLyoqXG4gICAqIElEIGZvciB0aGUgY3VycmVudCBzZWN1cml0eSBncm91cFxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUdyb3VwSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgU2VjdXJpdHlHcm91cCBoYXMgYmVlbiBjb25maWd1cmVkIHRvIGFsbG93IGFsbCBvdXRib3VuZCB0cmFmZmljXG4gICAqL1xuICByZWFkb25seSBhbGxvd0FsbE91dGJvdW5kOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBZGQgYW4gaW5ncmVzcyBydWxlIGZvciB0aGUgY3VycmVudCBzZWN1cml0eSBncm91cFxuICAgKlxuICAgKiBgcmVtb3RlUnVsZWAgY29udHJvbHMgd2hlcmUgdGhlIFJ1bGUgb2JqZWN0IGlzIGNyZWF0ZWQgaWYgdGhlIHBlZXIgaXMgYWxzbyBhXG4gICAqIHNlY3VyaXR5R3JvdXAgYW5kIHRoZXkgYXJlIGluIGRpZmZlcmVudCBzdGFjay4gSWYgZmFsc2UgKGRlZmF1bHQpIHRoZVxuICAgKiBydWxlIG9iamVjdCBpcyBjcmVhdGVkIHVuZGVyIHRoZSBjdXJyZW50IFNlY3VyaXR5R3JvdXAgb2JqZWN0LiBJZiB0cnVlIGFuZCB0aGVcbiAgICogcGVlciBpcyBhbHNvIGEgU2VjdXJpdHlHcm91cCwgdGhlIHJ1bGUgb2JqZWN0IGlzIGNyZWF0ZWQgdW5kZXIgdGhlIHJlbW90ZVxuICAgKiBTZWN1cml0eUdyb3VwIG9iamVjdC5cbiAgICovXG4gIGFkZEluZ3Jlc3NSdWxlKFxuICAgIHBlZXI6IElQZWVyLFxuICAgIGNvbm5lY3Rpb246IFBvcnQsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgcmVtb3RlUnVsZT86IGJvb2xlYW4sXG4gICk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBlZ3Jlc3MgcnVsZSBmb3IgdGhlIGN1cnJlbnQgc2VjdXJpdHkgZ3JvdXBcbiAgICpcbiAgICogYHJlbW90ZVJ1bGVgIGNvbnRyb2xzIHdoZXJlIHRoZSBSdWxlIG9iamVjdCBpcyBjcmVhdGVkIGlmIHRoZSBwZWVyIGlzIGFsc28gYVxuICAgKiBzZWN1cml0eUdyb3VwIGFuZCB0aGV5IGFyZSBpbiBkaWZmZXJlbnQgc3RhY2suIElmIGZhbHNlIChkZWZhdWx0KSB0aGVcbiAgICogcnVsZSBvYmplY3QgaXMgY3JlYXRlZCB1bmRlciB0aGUgY3VycmVudCBTZWN1cml0eUdyb3VwIG9iamVjdC4gSWYgdHJ1ZSBhbmQgdGhlXG4gICAqIHBlZXIgaXMgYWxzbyBhIFNlY3VyaXR5R3JvdXAsIHRoZSBydWxlIG9iamVjdCBpcyBjcmVhdGVkIHVuZGVyIHRoZSByZW1vdGVcbiAgICogU2VjdXJpdHlHcm91cCBvYmplY3QuXG4gICAqL1xuICBhZGRFZ3Jlc3NSdWxlKFxuICAgIHBlZXI6IElQZWVyLFxuICAgIGNvbm5lY3Rpb246IFBvcnQsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgcmVtb3RlUnVsZT86IGJvb2xlYW4sXG4gICk6IHZvaWQ7XG59XG5cbi8qKlxuICogQSBTZWN1cml0eUdyb3VwIHRoYXQgaXMgbm90IGNyZWF0ZWQgaW4gdGhpcyB0ZW1wbGF0ZVxuICovXG5hYnN0cmFjdCBjbGFzcyBTZWN1cml0eUdyb3VwQmFzZVxuICBleHRlbmRzIEF3c0NvbnN0cnVjdEJhc2VcbiAgaW1wbGVtZW50cyBJU2VjdXJpdHlHcm91cFxue1xuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGluZGljYXRlZCBvYmplY3QgaXMgYSBzZWN1cml0eSBncm91cFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpc1NlY3VyaXR5R3JvdXAoeDogYW55KTogeCBpcyBTZWN1cml0eUdyb3VwQmFzZSB7XG4gICAgcmV0dXJuIFNFQ1VSSVRZX0dST1VQX1NZTUJPTCBpbiB4O1xuICB9XG5cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHNlY3VyaXR5R3JvdXBJZDogc3RyaW5nO1xuICBwdWJsaWMgZ2V0IHNlY3VyaXR5R3JvdXBPdXRwdXRzKCk6IFNlY3VyaXR5R3JvdXBPdXRwdXRzIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2VjdXJpdHlHcm91cElkOiB0aGlzLnNlY3VyaXR5R3JvdXBJZCxcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBnZXQgb3V0cHV0cygpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5zZWN1cml0eUdyb3VwT3V0cHV0cztcbiAgfVxuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgYWxsb3dBbGxPdXRib3VuZDogYm9vbGVhbjtcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGFsbG93QWxsSXB2Nk91dGJvdW5kOiBib29sZWFuO1xuXG4gIHB1YmxpYyByZWFkb25seSBjYW5JbmxpbmVSdWxlID0gZmFsc2U7XG4gIHB1YmxpYyByZWFkb25seSBjb25uZWN0aW9uczogQ29ubmVjdGlvbnMgPSBuZXcgQ29ubmVjdGlvbnMoe1xuICAgIHNlY3VyaXR5R3JvdXBzOiBbdGhpc10sXG4gIH0pO1xuICBwdWJsaWMgcmVhZG9ubHkgZGVmYXVsdFBvcnQ/OiBQb3J0O1xuXG4gIHByaXZhdGUgcGVlckFzVG9rZW5Db3VudDogbnVtYmVyID0gMDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wcz86IEF3c0NvbnN0cnVjdFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgU0VDVVJJVFlfR1JPVVBfU1lNQk9MLCB7IHZhbHVlOiB0cnVlIH0pO1xuICB9XG5cbiAgcHVibGljIGdldCB1bmlxdWVJZCgpIHtcbiAgICByZXR1cm4gQXdzU3RhY2sudW5pcXVlSWQodGhpcy5ub2RlKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRJbmdyZXNzUnVsZShcbiAgICBwZWVyOiBJUGVlcixcbiAgICBjb25uZWN0aW9uOiBQb3J0LFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIHJlbW90ZVJ1bGU/OiBib29sZWFuLFxuICApIHtcbiAgICBpZiAoZGVzY3JpcHRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVzY3JpcHRpb24gPSBgZnJvbSAke3BlZXIudW5pcXVlSWR9OiR7Y29ubmVjdGlvbn1gO1xuICAgIH1cblxuICAgIGNvbnN0IHsgc2NvcGUsIGlkIH0gPSB0aGlzLmRldGVybWluZVJ1bGVTY29wZShcbiAgICAgIHBlZXIsXG4gICAgICBjb25uZWN0aW9uLFxuICAgICAgXCJmcm9tXCIsXG4gICAgICByZW1vdGVSdWxlLFxuICAgICk7XG5cbiAgICAvLyBTa2lwIGR1cGxpY2F0ZXNcbiAgICBpZiAoc2NvcGUubm9kZS50cnlGaW5kQ2hpbGQoaWQpID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG5ldyB2cGNTZWN1cml0eUdyb3VwSW5ncmVzc1J1bGUuVnBjU2VjdXJpdHlHcm91cEluZ3Jlc3NSdWxlKHNjb3BlLCBpZCwge1xuICAgICAgICBzZWN1cml0eUdyb3VwSWQ6IHRoaXMuc2VjdXJpdHlHcm91cElkLFxuICAgICAgICAuLi5wZWVyLnRvSW5ncmVzc1J1bGVDb25maWcoKSxcbiAgICAgICAgLi4uY29ubmVjdGlvbi50b1J1bGVKc29uKCksXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFkZEVncmVzc1J1bGUoXG4gICAgcGVlcjogSVBlZXIsXG4gICAgY29ubmVjdGlvbjogUG9ydCxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICByZW1vdGVSdWxlPzogYm9vbGVhbixcbiAgKSB7XG4gICAgaWYgKGRlc2NyaXB0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlc2NyaXB0aW9uID0gYHRvICR7cGVlci51bmlxdWVJZH06JHtjb25uZWN0aW9ufWA7XG4gICAgfVxuXG4gICAgY29uc3QgeyBzY29wZSwgaWQgfSA9IHRoaXMuZGV0ZXJtaW5lUnVsZVNjb3BlKFxuICAgICAgcGVlcixcbiAgICAgIGNvbm5lY3Rpb24sXG4gICAgICBcInRvXCIsXG4gICAgICByZW1vdGVSdWxlLFxuICAgICk7XG5cbiAgICAvLyBTa2lwIGR1cGxpY2F0ZXNcbiAgICBpZiAoc2NvcGUubm9kZS50cnlGaW5kQ2hpbGQoaWQpID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG5ldyB2cGNTZWN1cml0eUdyb3VwRWdyZXNzUnVsZS5WcGNTZWN1cml0eUdyb3VwRWdyZXNzUnVsZShzY29wZSwgaWQsIHtcbiAgICAgICAgc2VjdXJpdHlHcm91cElkOiB0aGlzLnNlY3VyaXR5R3JvdXBJZCxcbiAgICAgICAgLi4ucGVlci50b0VncmVzc1J1bGVDb25maWcoKSxcbiAgICAgICAgLi4uY29ubmVjdGlvbi50b1J1bGVKc29uKCksXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHRvSW5ncmVzc1J1bGVDb25maWcoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy50b1J1bGVDb25maWcoKTtcbiAgfVxuXG4gIHB1YmxpYyB0b0VncmVzc1J1bGVDb25maWcoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy50b1J1bGVDb25maWcoKTtcbiAgfVxuXG4gIC8vIFRlcnJhZm9ybSBkb2VzIG5vdCB1c2UgZGlmZmVyZW50IHByb3BlcnRpZXMgYmV0d2VlbiBpbmdyZXNzIGFuZCBlZ3Jlc3MgcnVsZXNcbiAgcHJpdmF0ZSB0b1J1bGVDb25maWcoKTogYW55IHtcbiAgICByZXR1cm4geyByZWZlcmVuY2VkU2VjdXJpdHlHcm91cElkOiB0aGlzLnNlY3VyaXR5R3JvdXBJZCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZSB3aGVyZSB0byBwYXJlbnQgYSBuZXcgaW5ncmVzcy9lZ3Jlc3MgcnVsZVxuICAgKlxuICAgKiBBIFNlY3VyaXR5R3JvdXAgcnVsZSBpcyBwYXJlbnRlZCB1bmRlciB0aGUgZ3JvdXAgaXQncyByZWxhdGVkIHRvLCBVTkxFU1NcbiAgICogd2UncmUgaW4gYSBjcm9zcy1zdGFjayBzY2VuYXJpbyB3aXRoIGFub3RoZXIgU2VjdXJpdHkgR3JvdXAuIEluIHRoYXQgY2FzZSxcbiAgICogd2UgcmVzcGVjdCB0aGUgJ3JlbW90ZVJ1bGUnIGZsYWcgYW5kIHdpbGwgcGFyZW50IHVuZGVyIHRoZSBvdGhlciBzZWN1cml0eVxuICAgKiBncm91cC5cbiAgICpcbiAgICogVGhpcyBpcyBuZWNlc3NhcnkgdG8gYXZvaWQgY3ljbGljIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHN0YWNrcywgc2luY2UgYm90aFxuICAgKiBpbmdyZXNzIGFuZCBlZ3Jlc3MgcnVsZXMgd2lsbCByZWZlcmVuY2UgYm90aCBzZWN1cml0eSBncm91cHMsIGFuZCBhIG5haXZlXG4gICAqIHBhcmVudGluZyB3aWxsIGxlYWQgdG8gdGhlIGZvbGxvd2luZyBzaXR1YXRpb246XG4gICAqXG4gICAqICAg4pWU4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWXICAgICAgICAg4pWU4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWXXG4gICAqICAg4pWRICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJAgICAgIOKVkSAgICAgICAgIOKVkSAgICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJAgICDilZFcbiAgICogICDilZEgIOKUgiAgR3JvdXBBICAg4pSC4peA4pSA4pSA4pSA4pSA4pWs4pSA4pSQICAg4pSM4pSA4pSA4pSA4pWs4pSA4pSA4pSA4pa24pSCICBHcm91cEIgICDilIIgICDilZFcbiAgICogICDilZEgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgICAg4pWRIOKUgiAgIOKUgiAgIOKVkSAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJggICDilZFcbiAgICogICDilZEgICAgICAgIOKWsiAgICAgICAgICAg4pWRIOKUgiAgIOKUgiAgIOKVkSAgICAgICAgICDilrIgICAgICAgICDilZFcbiAgICogICDilZEgICAgICAgIOKUgiAgICAgICAgICAg4pWRIOKUgiAgIOKUgiAgIOKVkSAgICAgICAgICDilIIgICAgICAgICDilZFcbiAgICogICDilZEgICAgICAgIOKUgiAgICAgICAgICAg4pWRIOKUgiAgIOKUgiAgIOKVkSAgICAgICAgICDilIIgICAgICAgICDilZFcbiAgICogICDilZEgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgICAg4pWRIOKUlOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKVrOKUgOKUgOKUgOKUgOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgIOKVkVxuICAgKiAgIOKVkSAg4pSCICBFZ3Jlc3NBICDilILilIDilIDilIDilIDilIDilazilIDilIDilIDilIDilIDilJggICDilZEgICAg4pSCIEluZ3Jlc3NCICDilIIgICDilZFcbiAgICogICDilZEgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgICAg4pWRICAgICAgICAg4pWRICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgIOKVkVxuICAgKiAgIOKVkSAgICAgICAgICAgICAgICAgICAg4pWRICAgICAgICAg4pWRICAgICAgICAgICAgICAgICAgICDilZFcbiAgICogICDilZrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZ0gICAgICAgICDilZrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZ1cbiAgICpcbiAgICogQnkgaGF2aW5nIHRoZSBhYmlsaXR5IHRvIHN3aXRjaCB0aGUgcGFyZW50LCB3ZSBhdm9pZCB0aGUgY3ljbGljIHJlZmVyZW5jZSBieVxuICAgKiBrZWVwaW5nIGFsbCBydWxlcyBpbiBhIHNpbmdsZSBzdGFjay5cbiAgICpcbiAgICogSWYgdGhpcyBoYXBwZW5zLCB3ZSBhbHNvIGhhdmUgdG8gY2hhbmdlIHRoZSBjb25zdHJ1Y3QgSUQsIGJlY2F1c2VcbiAgICogb3RoZXJ3aXNlIHdlIG1pZ2h0IGhhdmUgdHdvIG9iamVjdHMgd2l0aCB0aGUgc2FtZSBJRCBpZiB3ZSBoYXZlXG4gICAqIG11bHRpcGxlIHJldmVyc2VkIHNlY3VyaXR5IGdyb3VwIHJlbGF0aW9uc2hpcHMuXG4gICAqXG4gICAqICAg4pWU4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWXXG4gICAqICAg4pWR4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQICAgICAgICAgICAgICAgICAgICAgIOKVkVxuICAgKiAgIOKVkeKUgiAgR3JvdXBCICAg4pSCICAgICAgICAgICAgICAgICAgICAgIOKVkVxuICAgKiAgIOKVkeKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgICAgICAgICAgICAgICAgICAgICDilZFcbiAgICogICDilZEgICAgICDilrIgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pWRXG4gICAqICAg4pWRICAgICAg4pSCICAgICAgICAgICAgICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJAg4pWRXG4gICAqICAg4pWRICAgICAg4pSc4pSA4pSA4pSA4pSAXCJmcm9tIEFcIuKUgOKUgOKUgiBJbmdyZXNzQiAg4pSCIOKVkVxuICAgKiAgIOKVkSAgICAgIOKUgiAgICAgICAgICAgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYIOKVkVxuICAgKiAgIOKVkSAgICAgIOKUgiAgICAgICAgICAgICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQIOKVkVxuICAgKiAgIOKVkSAgICAgIOKUnOKUgOKUgOKUgOKUgOKUgFwidG8gQlwi4pSA4pSA4pSA4pSCICBFZ3Jlc3NBICDilIIg4pWRXG4gICAqICAg4pWRICAgICAg4pSCICAgICAgICAgICAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJgg4pWRXG4gICAqICAg4pWRICAgICAg4pSCICAgICAgICAgICAgICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJAg4pWRXG4gICAqICAg4pWRICAgICAg4pSU4pSA4pSA4pSA4pSA4pSAXCJ0byBCXCLilIDilIDilIDilIIgIEVncmVzc0MgIOKUgiDilZEgIDwtLSBvb3BzXG4gICAqICAg4pWRICAgICAgICAgICAgICAgICAgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYIOKVkVxuICAgKiAgIOKVmuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVnVxuICAgKi9cblxuICBwcm90ZWN0ZWQgZGV0ZXJtaW5lUnVsZVNjb3BlKFxuICAgIHBlZXI6IElQZWVyLFxuICAgIGNvbm5lY3Rpb246IFBvcnQsXG4gICAgZnJvbVRvOiBcImZyb21cIiB8IFwidG9cIixcbiAgICByZW1vdGVSdWxlPzogYm9vbGVhbixcbiAgKTogUnVsZVNjb3BlIHtcbiAgICBpZiAoXG4gICAgICByZW1vdGVSdWxlICYmXG4gICAgICBTZWN1cml0eUdyb3VwQmFzZS5pc1NlY3VyaXR5R3JvdXAocGVlcikgJiZcbiAgICAgIGRpZmZlcmVudFN0YWNrcyh0aGlzLCBwZWVyKVxuICAgICkge1xuICAgICAgLy8gUmV2ZXJzZWRcbiAgICAgIGNvbnN0IHJldmVyc2VkRnJvbVRvID0gZnJvbVRvID09PSBcImZyb21cIiA/IFwidG9cIiA6IFwiZnJvbVwiO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2NvcGU6IHBlZXIsXG4gICAgICAgIGlkOiBgJHt0aGlzLnVuaXF1ZUlkfToke2Nvbm5lY3Rpb259ICR7cmV2ZXJzZWRGcm9tVG99YCxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlZ3VsYXIgKGRvIG9sZCBJRCBlc2NhcGluZyBpbiBvcmRlciB0byBub3QgZGlzdHVyYiBleGlzdGluZyBkZXBsb3ltZW50cylcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNjb3BlOiB0aGlzLFxuICAgICAgICBpZDogYCR7ZnJvbVRvfSAke3RoaXMucmVuZGVyUGVlcihwZWVyKX06JHtjb25uZWN0aW9ufWAucmVwbGFjZShcbiAgICAgICAgICBcIi9cIixcbiAgICAgICAgICBcIl9cIixcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJQZWVyKHBlZXI6IElQZWVyKSB7XG4gICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChwZWVyLnVuaXF1ZUlkKSkge1xuICAgICAgLy8gTmVlZCB0byByZXR1cm4gYSB1bmlxdWUgdmFsdWUgZWFjaCB0aW1lIGEgcGVlclxuICAgICAgLy8gaXMgYW4gdW5yZXNvbHZlZCB0b2tlbiwgZWxzZSB0aGUgZHVwbGljYXRlIHNraXBwZXJcbiAgICAgIC8vIGluIGBzZy5hZGRYeHhSdWxlYCBjYW4gZGV0ZWN0IHVuaXF1ZSBydWxlcyBhcyBkdXBsaWNhdGVzXG4gICAgICByZXR1cm4gdGhpcy5wZWVyQXNUb2tlbkNvdW50KytcbiAgICAgICAgPyBgJ3tJbmRpcmVjdFBlZXIke3RoaXMucGVlckFzVG9rZW5Db3VudH19J2BcbiAgICAgICAgOiBcIntJbmRpcmVjdFBlZXJ9XCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwZWVyLnVuaXF1ZUlkO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoZSBzY29wZSBhbmQgaWQgaW4gd2hpY2ggYSBnaXZlbiBTZWN1cml0eUdyb3VwIHJ1bGUgc2hvdWxkIGJlIGRlZmluZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZVNjb3BlIHtcbiAgLyoqXG4gICAqIFRoZSBTZWN1cml0eUdyb3VwIGluIHdoaWNoIGEgcnVsZSBzaG91bGQgYmUgc2NvcGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2NvcGU6IElTZWN1cml0eUdyb3VwO1xuICAvKipcbiAgICogVGhlIGNvbnN0cnVjdCBJRCB0byB1c2UgZm9yIHRoZSBydWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gZGlmZmVyZW50U3RhY2tzKGdyb3VwMTogU2VjdXJpdHlHcm91cEJhc2UsIGdyb3VwMjogU2VjdXJpdHlHcm91cEJhc2UpIHtcbiAgcmV0dXJuIEF3c1N0YWNrLm9mKGdyb3VwMSkgIT09IEF3c1N0YWNrLm9mKGdyb3VwMik7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VjdXJpdHlHcm91cFByb3BzIGV4dGVuZHMgQXdzQ29uc3RydWN0UHJvcHMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHNlY3VyaXR5IGdyb3VwLiBGb3IgdmFsaWQgdmFsdWVzLCBzZWUgdGhlIEdyb3VwTmFtZVxuICAgKiBwYXJhbWV0ZXIgb2YgdGhlIENyZWF0ZVNlY3VyaXR5R3JvdXAgYWN0aW9uIGluIHRoZSBBbWF6b24gRUMyIEFQSVxuICAgKiBSZWZlcmVuY2UuXG4gICAqXG4gICAqIEl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byB1c2UgYW4gZXhwbGljaXQgZ3JvdXAgbmFtZS5cbiAgICpcbiAgICogQGRlZmF1bHQgSWYgeW91IGRvbid0IHNwZWNpZnkgYSBHcm91cE5hbWUsIEFXUyBDbG91ZEZvcm1hdGlvbiBnZW5lcmF0ZXMgYVxuICAgKiB1bmlxdWUgcGh5c2ljYWwgSUQgYW5kIHVzZXMgdGhhdCBJRCBmb3IgdGhlIGdyb3VwIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUdyb3VwTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogQSBkZXNjcmlwdGlvbiBvZiB0aGUgc2VjdXJpdHkgZ3JvdXAuXG4gICAqXG4gICAqIEZvcmNlcyBuZXcgcmVzb3VyY2VcbiAgICpcbiAgICogU2VjdXJpdHkgZ3JvdXAgZGVzY3JpcHRpb24uIERlZmF1bHRzIHRvIGBNYW5hZ2VkIGJ5IFRlcnJhZm9ybWAuIENhbm5vdCBiZSBgXCJcImAuXG4gICAqXG4gICAqIE5PVEU6IFRoaXMgZmllbGQgbWFwcyB0byB0aGUgQVdTIGBHcm91cERlc2NyaXB0aW9uYCBhdHRyaWJ1dGUsIGZvciB3aGljaCB0aGVyZSBpcyBubyBVcGRhdGUgQVBJLlxuICAgKiBJZiB5b3UnZCBsaWtlIHRvIGNsYXNzaWZ5IHlvdXIgc2VjdXJpdHkgZ3JvdXBzIGluIGEgd2F5IHRoYXQgY2FuIGJlIHVwZGF0ZWQsIHVzZSB0YWdzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBUaGUgZGVmYXVsdCBuYW1lIHdpbGwgYmUgdGhlIGNvbnN0cnVjdCdzIENESyBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBWUEMgaW4gd2hpY2ggdG8gY3JlYXRlIHRoZSBzZWN1cml0eSBncm91cC5cbiAgICovXG4gIHJlYWRvbmx5IHZwYzogSVZwYztcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBhbGwgb3V0Ym91bmQgdHJhZmZpYyBieSBkZWZhdWx0LlxuICAgKlxuICAgKiBJZiB0aGlzIGlzIHNldCB0byB0cnVlLCB0aGVyZSB3aWxsIG9ubHkgYmUgYSBzaW5nbGUgZWdyZXNzIHJ1bGUgd2hpY2ggYWxsb3dzIGFsbFxuICAgKiBvdXRib3VuZCB0cmFmZmljLiBJZiB0aGlzIGlzIHNldCB0byBmYWxzZSwgbm8gb3V0Ym91bmQgdHJhZmZpYyB3aWxsIGJlIGFsbG93ZWQgYnlcbiAgICogZGVmYXVsdCBhbmQgYWxsIGVncmVzcyB0cmFmZmljIG11c3QgYmUgZXhwbGljaXRseSBhdXRob3JpemVkLlxuICAgKlxuICAgKiBUbyBhbGxvdyBhbGwgaXB2NiB0cmFmZmljIHVzZSBhbGxvd0FsbElwdjZPdXRib3VuZFxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBhbGxvd0FsbE91dGJvdW5kPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBhbGwgb3V0Ym91bmQgaXB2NiB0cmFmZmljIGJ5IGRlZmF1bHQuXG4gICAqXG4gICAqIElmIHRoaXMgaXMgc2V0IHRvIHRydWUsIHRoZXJlIHdpbGwgb25seSBiZSBhIHNpbmdsZSBlZ3Jlc3MgcnVsZSB3aGljaCBhbGxvd3MgYWxsXG4gICAqIG91dGJvdW5kIGlwdjYgdHJhZmZpYy4gSWYgdGhpcyBpcyBzZXQgdG8gZmFsc2UsIG5vIG91dGJvdW5kIHRyYWZmaWMgd2lsbCBiZSBhbGxvd2VkIGJ5XG4gICAqIGRlZmF1bHQgYW5kIGFsbCBlZ3Jlc3MgaXB2NiB0cmFmZmljIG11c3QgYmUgZXhwbGljaXRseSBhdXRob3JpemVkLlxuICAgKlxuICAgKiBUbyBhbGxvdyBhbGwgaXB2NCB0cmFmZmljIHVzZSBhbGxvd0FsbE91dGJvdW5kXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBhbGxvd0FsbElwdjZPdXRib3VuZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGlzYWJsZSBpbmxpbmUgaW5ncmVzcyBhbmQgZWdyZXNzIHJ1bGUgb3B0aW1pemF0aW9uLlxuICAgKlxuICAgKiBJZiB0aGlzIGlzIHNldCB0byB0cnVlLCBpbmdyZXNzIGFuZCBlZ3Jlc3MgcnVsZXMgd2lsbCBub3QgYmUgZGVjbGFyZWQgdW5kZXIgdGhlXG4gICAqIFNlY3VyaXR5R3JvdXAgaW4gY2xvdWRmb3JtYXRpb24sIGJ1dCB3aWxsIGJlIHNlcGFyYXRlIGVsZW1lbnRzLlxuICAgKlxuICAgKiBJbmxpbmluZyBydWxlcyBpcyBhbiBvcHRpbWl6YXRpb24gZm9yIHByb2R1Y2luZyBzbWFsbGVyIHN0YWNrIHRlbXBsYXRlcy4gU29tZXRpbWVzXG4gICAqIHRoaXMgaXMgbm90IGRlc2lyYWJsZSwgZm9yIGV4YW1wbGUgd2hlbiBzZWN1cml0eSBncm91cCBhY2Nlc3MgaXMgbWFuYWdlZCB2aWEgdGFncy5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgdmFsdWUgY2FuIGJlIG92ZXJyaWRlbiBnbG9iYWxseSBieSBzZXR0aW5nIHRoZSBjb250ZXh0IHZhcmlhYmxlXG4gICAqICdAYXdzLWNkay9hd3MtZWMyLnNlY3VyaXR5R3JvdXBEaXNhYmxlSW5saW5lUnVsZXMnLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZGlzYWJsZUlubGluZVJ1bGVzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIGltcG9ydGVkIHNlY3VyaXR5IGdyb3Vwc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlY3VyaXR5R3JvdXBJbXBvcnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIE1hcmsgdGhlIFNlY3VyaXR5R3JvdXAgYXMgaGF2aW5nIGJlZW4gY3JlYXRlZCBhbGxvd2luZyBhbGwgb3V0Ym91bmQgdHJhZmZpY1xuICAgKlxuICAgKiBPbmx5IGlmIHRoaXMgaXMgc2V0IHRvIGZhbHNlIHdpbGwgZWdyZXNzIHJ1bGVzIGJlIGFkZGVkIHRvIHRoaXMgc2VjdXJpdHlcbiAgICogZ3JvdXAuIEJlIGF3YXJlLCB0aGlzIHdvdWxkIHVuZG8gYW55IHBvdGVudGlhbCBcImFsbCBvdXRib3VuZCB0cmFmZmljXCJcbiAgICogZGVmYXVsdC5cbiAgICpcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dBbGxPdXRib3VuZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE1hcmsgdGhlIFNlY3VyaXR5R3JvdXAgYXMgaGF2aW5nIGJlZW4gY3JlYXRlZCBhbGxvd2luZyBhbGwgb3V0Ym91bmQgaXB2NiB0cmFmZmljXG4gICAqXG4gICAqIE9ubHkgaWYgdGhpcyBpcyBzZXQgdG8gZmFsc2Ugd2lsbCBlZ3Jlc3MgcnVsZXMgZm9yIGlwdjYgYmUgYWRkZWQgdG8gdGhpcyBzZWN1cml0eVxuICAgKiBncm91cC4gQmUgYXdhcmUsIHRoaXMgd291bGQgdW5kbyBhbnkgcG90ZW50aWFsIFwiYWxsIG91dGJvdW5kIHRyYWZmaWNcIlxuICAgKiBkZWZhdWx0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dBbGxJcHY2T3V0Ym91bmQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJZiBhIFNlY3VyaXR5R3JvdXAgaXMgbXV0YWJsZSBDREsgY2FuIGFkZCBydWxlcyB0byBleGlzdGluZyBncm91cHNcbiAgICpcbiAgICogQmV3YXJlIHRoYXQgbWFraW5nIGEgU2VjdXJpdHlHcm91cCBpbW11dGFibGUgbWlnaHQgbGVhZCB0byBpc3N1ZVxuICAgKiBkdWUgdG8gbWlzc2luZyBpbmdyZXNzL2VncmVzcyBydWxlcyBmb3IgbmV3IHJlc291cmNlcy5cbiAgICpcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgbXV0YWJsZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBBbWF6b24gRUMyIHNlY3VyaXR5IGdyb3VwIHdpdGhpbiBhIFZQQy5cbiAqXG4gKiBTZWN1cml0eSBHcm91cHMgYWN0IGxpa2UgYSBmaXJld2FsbCB3aXRoIGEgc2V0IG9mIHJ1bGVzLCBhbmQgYXJlIGFzc29jaWF0ZWRcbiAqIHdpdGggYW55IEFXUyByZXNvdXJjZSB0aGF0IGhhcyBvciBjcmVhdGVzIEVsYXN0aWMgTmV0d29yayBJbnRlcmZhY2VzIChFTklzKS5cbiAqIEEgdHlwaWNhbCBleGFtcGxlIG9mIGEgcmVzb3VyY2UgdGhhdCBoYXMgYSBzZWN1cml0eSBncm91cCBpcyBhbiBJbnN0YW5jZSAob3JcbiAqIEF1dG8gU2NhbGluZyBHcm91cCBvZiBpbnN0YW5jZXMpXG4gKlxuICogSWYgeW91IGFyZSBkZWZpbmluZyBuZXcgaW5mcmFzdHJ1Y3R1cmUgaW4gQ0RLLCB0aGVyZSBpcyBhIGdvb2QgY2hhbmNlIHlvdVxuICogd29uJ3QgaGF2ZSB0byBpbnRlcmFjdCB3aXRoIHRoaXMgY2xhc3MgYXQgYWxsLiBMaWtlIElBTSBSb2xlcywgU2VjdXJpdHlcbiAqIEdyb3VwcyBuZWVkIHRvIGV4aXN0IHRvIGNvbnRyb2wgYWNjZXNzIGJldHdlZW4gQVdTIHJlc291cmNlcywgYnV0IENESyB3aWxsXG4gKiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIGFuZCBwb3B1bGF0ZSB0aGVtIHdpdGggbGVhc3QtcHJpdmlsZWdlIHBlcm1pc3Npb25zXG4gKiBmb3IgeW91IHNvIHlvdSBjYW4gY29uY2VudHJhdGUgb24geW91ciBidXNpbmVzcyBsb2dpYy5cbiAqXG4gKiBBbGwgQ29uc3RydWN0cyB0aGF0IHJlcXVpcmUgU2VjdXJpdHkgR3JvdXBzIHdpbGwgY3JlYXRlIG9uZSBmb3IgeW91IGlmIHlvdVxuICogZG9uJ3Qgc3BlY2lmeSBvbmUgYXQgY29uc3RydWN0aW9uLiBBZnRlciBjb25zdHJ1Y3Rpb24sIHlvdSBjYW4gc2VsZWN0aXZlbHlcbiAqIGFsbG93IGNvbm5lY3Rpb25zIHRvIGFuZCBiZXR3ZWVuIGNvbnN0cnVjdHMgdmlhLS1mb3IgZXhhbXBsZS0tIHRoZSBgaW5zdGFuY2UuY29ubmVjdGlvbnNgXG4gKiBvYmplY3QuIFRoaW5rIG9mIGl0IGFzIFwiYWxsb3dpbmcgY29ubmVjdGlvbnMgdG8geW91ciBpbnN0YW5jZVwiLCByYXRoZXIgdGhhblxuICogXCJhZGRpbmcgaW5ncmVzcyBydWxlcyBhIHNlY3VyaXR5IGdyb3VwXCIuIFNlZSB0aGUgW0FsbG93aW5nXG4gKiBDb25uZWN0aW9uc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nkay9hcGkvbGF0ZXN0L2RvY3MvYXdzLWNkay1saWIuYXdzX2VjMi1yZWFkbWUuaHRtbCNhbGxvd2luZy1jb25uZWN0aW9ucylcbiAqIHNlY3Rpb24gaW4gdGhlIGxpYnJhcnkgZG9jdW1lbnRhdGlvbiBmb3IgZXhhbXBsZXMuXG4gKlxuICogRGlyZWN0IG1hbmlwdWxhdGlvbiBvZiB0aGUgU2VjdXJpdHkgR3JvdXAgdGhyb3VnaCBgYWRkSW5ncmVzc1J1bGVgIGFuZFxuICogYGFkZEVncmVzc1J1bGVgIGlzIHBvc3NpYmxlLCBidXQgbXV0YXRpb24gdGhyb3VnaCB0aGUgYC5jb25uZWN0aW9uc2Agb2JqZWN0XG4gKiBpcyByZWNvbW1lbmRlZC4gSWYgeW91IHBlZXIgdHdvIGNvbnN0cnVjdHMgd2l0aCBzZWN1cml0eSBncm91cHMgdGhpcyB3YXksXG4gKiBhcHByb3ByaWF0ZSBydWxlcyB3aWxsIGJlIGNyZWF0ZWQgaW4gYm90aC5cbiAqXG4gKiBJZiB5b3UgaGF2ZSBhbiBleGlzdGluZyBzZWN1cml0eSBncm91cCB5b3Ugd2FudCB0byB1c2UgaW4geW91ciBDREsgYXBwbGljYXRpb24sXG4gKiB5b3Ugd291bGQgaW1wb3J0IGl0IGxpa2UgdGhpczpcbiAqXG4gKiBgYGB0c1xuICogY29uc3Qgc2VjdXJpdHlHcm91cCA9IGNvbXB1dGUuU2VjdXJpdHlHcm91cC5mcm9tU2VjdXJpdHlHcm91cElkKHRoaXMsICdTRycsICdzZy0xMjM0NScsIHtcbiAqICAgbXV0YWJsZTogZmFsc2VcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWN1cml0eUdyb3VwIGV4dGVuZHMgU2VjdXJpdHlHcm91cEJhc2Uge1xuICAvKipcbiAgICogTG9vayB1cCBhIHNlY3VyaXR5IGdyb3VwIGJ5IGlkLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tTG9va3VwQnlJZChcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgc2VjdXJpdHlHcm91cElkOiBzdHJpbmcsXG4gICAgYWxsb3dBbGxPdXRib3VuZD86IGJvb2xlYW4sXG4gICkge1xuICAgIHJldHVybiB0aGlzLmZyb21Mb29rdXBBdHRyaWJ1dGVzKHNjb3BlLCBpZCwge1xuICAgICAgc2VjdXJpdHlHcm91cElkLFxuICAgICAgYWxsb3dBbGxPdXRib3VuZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb29rIHVwIGEgc2VjdXJpdHkgZ3JvdXAgYnkgbmFtZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUxvb2t1cEJ5TmFtZShcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgc2VjdXJpdHlHcm91cE5hbWU6IHN0cmluZyxcbiAgICB2cGM6IElWcGMsXG4gICAgYWxsb3dBbGxPdXRib3VuZD86IGJvb2xlYW4sXG4gICkge1xuICAgIHJldHVybiB0aGlzLmZyb21Mb29rdXBBdHRyaWJ1dGVzKHNjb3BlLCBpZCwge1xuICAgICAgc2VjdXJpdHlHcm91cE5hbWUsXG4gICAgICB2cGMsXG4gICAgICBhbGxvd0FsbE91dGJvdW5kLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleGlzdGluZyBzZWN1cml0eSBncm91cCBpbnRvIHRoaXMgYXBwLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIGFzc3VtZSB0aGF0IHRoZSBTZWN1cml0eSBHcm91cCBoYXMgYSBydWxlIGluIGl0IHdoaWNoIGFsbG93c1xuICAgKiBhbGwgb3V0Ym91bmQgdHJhZmZpYywgYW5kIHNvIHdpbGwgbm90IGFkZCBlZ3Jlc3MgcnVsZXMgdG8gdGhlIGltcG9ydGVkIFNlY3VyaXR5XG4gICAqIEdyb3VwIChvbmx5IGluZ3Jlc3MgcnVsZXMpLlxuICAgKlxuICAgKiBJZiB5b3VyIGV4aXN0aW5nIFNlY3VyaXR5IEdyb3VwIG5lZWRzIHRvIGhhdmUgZWdyZXNzIHJ1bGVzIGFkZGVkLCBwYXNzIHRoZVxuICAgKiBgYWxsb3dBbGxPdXRib3VuZDogZmFsc2VgIG9wdGlvbiBvbiBpbXBvcnQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21TZWN1cml0eUdyb3VwSWQoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHNlY3VyaXR5R3JvdXBJZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFNlY3VyaXR5R3JvdXBJbXBvcnRPcHRpb25zID0ge30sXG4gICk6IElTZWN1cml0eUdyb3VwIHtcbiAgICBjbGFzcyBNdXRhYmxlSW1wb3J0IGV4dGVuZHMgU2VjdXJpdHlHcm91cEJhc2Uge1xuICAgICAgcHVibGljIHNlY3VyaXR5R3JvdXBJZCA9IHNlY3VyaXR5R3JvdXBJZDtcbiAgICAgIHB1YmxpYyBhbGxvd0FsbE91dGJvdW5kID0gb3B0aW9ucy5hbGxvd0FsbE91dGJvdW5kID8/IHRydWU7XG4gICAgICBwdWJsaWMgYWxsb3dBbGxJcHY2T3V0Ym91bmQgPSBvcHRpb25zLmFsbG93QWxsSXB2Nk91dGJvdW5kID8/IGZhbHNlO1xuXG4gICAgICBwdWJsaWMgYWRkRWdyZXNzUnVsZShcbiAgICAgICAgcGVlcjogSVBlZXIsXG4gICAgICAgIGNvbm5lY3Rpb246IFBvcnQsXG4gICAgICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgICAgICByZW1vdGVSdWxlPzogYm9vbGVhbixcbiAgICAgICkge1xuICAgICAgICAvLyBPbmx5IGlmIGFsbG93QWxsT3V0Ym91bmQgaGFzIGJlZW4gZGlzYWJsZWRcbiAgICAgICAgaWYgKG9wdGlvbnMuYWxsb3dBbGxPdXRib3VuZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBzdXBlci5hZGRFZ3Jlc3NSdWxlKHBlZXIsIGNvbm5lY3Rpb24sIGRlc2NyaXB0aW9uLCByZW1vdGVSdWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNsYXNzIEltbXV0YWJsZUltcG9ydCBleHRlbmRzIFNlY3VyaXR5R3JvdXBCYXNlIHtcbiAgICAgIHB1YmxpYyBzZWN1cml0eUdyb3VwSWQgPSBzZWN1cml0eUdyb3VwSWQ7XG4gICAgICBwdWJsaWMgYWxsb3dBbGxPdXRib3VuZCA9IG9wdGlvbnMuYWxsb3dBbGxPdXRib3VuZCA/PyB0cnVlO1xuICAgICAgcHVibGljIGFsbG93QWxsSXB2Nk91dGJvdW5kID0gb3B0aW9ucy5hbGxvd0FsbElwdjZPdXRib3VuZCA/PyBmYWxzZTtcblxuICAgICAgcHVibGljIGFkZEVncmVzc1J1bGUoXG4gICAgICAgIF9wZWVyOiBJUGVlcixcbiAgICAgICAgX2Nvbm5lY3Rpb246IFBvcnQsXG4gICAgICAgIF9kZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICAgICAgX3JlbW90ZVJ1bGU/OiBib29sZWFuLFxuICAgICAgKSB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgIH1cblxuICAgICAgcHVibGljIGFkZEluZ3Jlc3NSdWxlKFxuICAgICAgICBfcGVlcjogSVBlZXIsXG4gICAgICAgIF9jb25uZWN0aW9uOiBQb3J0LFxuICAgICAgICBfZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgICAgIF9yZW1vdGVSdWxlPzogYm9vbGVhbixcbiAgICAgICkge1xuICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdGlvbnMubXV0YWJsZSAhPT0gZmFsc2VcbiAgICAgID8gbmV3IE11dGFibGVJbXBvcnQoc2NvcGUsIGlkKVxuICAgICAgOiBuZXcgSW1tdXRhYmxlSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogTG9vayB1cCBhIHNlY3VyaXR5IGdyb3VwLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZnJvbUxvb2t1cEF0dHJpYnV0ZXMoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFNlY3VyaXR5R3JvdXBMb29rdXBPcHRpb25zLFxuICApIHtcbiAgICBpZiAoXG4gICAgICBUb2tlbi5pc1VucmVzb2x2ZWQob3B0aW9ucy5zZWN1cml0eUdyb3VwSWQpIHx8XG4gICAgICBUb2tlbi5pc1VucmVzb2x2ZWQob3B0aW9ucy5zZWN1cml0eUdyb3VwTmFtZSkgfHxcbiAgICAgIFRva2VuLmlzVW5yZXNvbHZlZChvcHRpb25zLnZwYz8udnBjSWQpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiQWxsIGFyZ3VtZW50cyB0byBsb29rIHVwIGEgc2VjdXJpdHkgZ3JvdXAgbXVzdCBiZSBjb25jcmV0ZSAobm8gVG9rZW5zKVwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gbmV3IGRhdGFBd3NTZWN1cml0eUdyb3VwLkRhdGFBd3NTZWN1cml0eUdyb3VwKHNjb3BlLCBpZCwge1xuICAgICAgdnBjSWQ6IG9wdGlvbnMudnBjPy52cGNJZCxcbiAgICAgIGlkOiBvcHRpb25zLnNlY3VyaXR5R3JvdXBJZCxcbiAgICAgIG5hbWU6IG9wdGlvbnMuc2VjdXJpdHlHcm91cE5hbWUsXG4gICAgfSk7XG5cbiAgICAvLyBUT0RPOiBVc2UgR3JpZCBhcyBjb250ZXh0UHJvdmlkZXJcbiAgICAvLyBXYXJuaW5nOiB1c2luZyBkYXRhIHNvdXJjZSB0byBkZXRlcm1pbmUgaWYgdGhlIHNlY3VyaXR5IGdyb3VwIGFsbG93c1xuICAgIC8vIGFsbCBvdXRib3VuZCB3aXRoIGFsbG93QWxsT3V0Ym91bmRMb2NhbChzY29wZSwgaWQsIGRhdGEuaWQpXG4gICAgLy8gd291bGQgZm9yY2UgYWxsIGRlcGVuZGluZyBjb2RlIHRvIGRlYWwgd2l0aCBUb2tlbnNcbiAgICByZXR1cm4gU2VjdXJpdHlHcm91cC5mcm9tU2VjdXJpdHlHcm91cElkKHNjb3BlLCBpZCwgZGF0YS5pZCwge1xuICAgICAgYWxsb3dBbGxPdXRib3VuZDogb3B0aW9ucy5hbGxvd0FsbE91dGJvdW5kID8/IHRydWUsXG4gICAgICBtdXRhYmxlOiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgc2VjdXJpdHkgZ3JvdXBcbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNlY3VyaXR5R3JvdXBJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgVlBDIElEIHRoaXMgc2VjdXJpdHkgZ3JvdXAgaXMgcGFydCBvZi5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNlY3VyaXR5R3JvdXBWcGNJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBTZWN1cml0eUdyb3VwIGhhcyBiZWVuIGNvbmZpZ3VyZWQgdG8gYWxsb3cgYWxsIG91dGJvdW5kIHRyYWZmaWNcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhbGxvd0FsbE91dGJvdW5kOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBTZWN1cml0eUdyb3VwIGhhcyBiZWVuIGNvbmZpZ3VyZWQgdG8gYWxsb3cgYWxsIG91dGJvdW5kIGlwdjYgdHJhZmZpY1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFsbG93QWxsSXB2Nk91dGJvdW5kOiBib29sZWFuO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VjdXJpdHlHcm91cDogc2VjdXJpdHlHcm91cC5TZWN1cml0eUdyb3VwO1xuICBwcml2YXRlIHJlYWRvbmx5IGRpcmVjdEluZ3Jlc3NSdWxlczogc2VjdXJpdHlHcm91cC5TZWN1cml0eUdyb3VwSW5ncmVzc1tdID1cbiAgICBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBkaXJlY3RFZ3Jlc3NSdWxlczogc2VjdXJpdHlHcm91cC5TZWN1cml0eUdyb3VwRWdyZXNzW10gPSBbXTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBkaXNhYmxlIG9wdGltaXphdGlvbiBmb3IgaW5saW5lIHNlY3VyaXR5IGdyb3VwIHJ1bGVzLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBkaXNhYmxlSW5saW5lUnVsZXM6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFNlY3VyaXR5R3JvdXBQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgIGNvbnN0IGdyb3VwTmFtZSA9XG4gICAgICBwcm9wcy5zZWN1cml0eUdyb3VwTmFtZSB8fFxuICAgICAgdGhpcy5zdGFjay51bmlxdWVSZXNvdXJjZU5hbWUodGhpcywge1xuICAgICAgICBwcmVmaXg6IHRoaXMuZ3JpZFVVSUQsXG4gICAgICB9KTtcblxuICAgIGNvbnN0IGdyb3VwRGVzY3JpcHRpb24gPSBwcm9wcy5kZXNjcmlwdGlvbiB8fCB0aGlzLm5vZGUucGF0aDtcblxuICAgIHRoaXMuYWxsb3dBbGxPdXRib3VuZCA9IHByb3BzLmFsbG93QWxsT3V0Ym91bmQgIT09IGZhbHNlO1xuICAgIHRoaXMuYWxsb3dBbGxJcHY2T3V0Ym91bmQgPSBwcm9wcy5hbGxvd0FsbElwdjZPdXRib3VuZCA/PyBmYWxzZTtcblxuICAgIHRoaXMuZGlzYWJsZUlubGluZVJ1bGVzID1cbiAgICAgIHByb3BzLmRpc2FibGVJbmxpbmVSdWxlcyAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gISFwcm9wcy5kaXNhYmxlSW5saW5lUnVsZXNcbiAgICAgICAgOiAhIXRoaXMubm9kZS50cnlHZXRDb250ZXh0KFxuICAgICAgICAgICAgU0VDVVJJVFlfR1JPVVBfRElTQUJMRV9JTkxJTkVfUlVMRVNfQ09OVEVYVF9LRVksXG4gICAgICAgICAgKTtcblxuICAgIHRoaXMuc2VjdXJpdHlHcm91cCA9IG5ldyBzZWN1cml0eUdyb3VwLlNlY3VyaXR5R3JvdXAodGhpcywgXCJSZXNvdXJjZVwiLCB7XG4gICAgICBuYW1lOiBncm91cE5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogZ3JvdXBEZXNjcmlwdGlvbixcbiAgICAgIGluZ3Jlc3M6IExhenkuYW55VmFsdWUoXG4gICAgICAgIHtcbiAgICAgICAgICBwcm9kdWNlOiAoKSA9PlxuICAgICAgICAgICAgdGhpcy5kaXJlY3RJbmdyZXNzUnVsZXMubWFwKFxuICAgICAgICAgICAgICBzZWN1cml0eUdyb3VwLnNlY3VyaXR5R3JvdXBJbmdyZXNzVG9UZXJyYWZvcm0sXG4gICAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICB7IG9taXRFbXB0eUFycmF5OiB0cnVlIH0sXG4gICAgICApLFxuICAgICAgZWdyZXNzOiBMYXp5LmFueVZhbHVlKFxuICAgICAgICB7XG4gICAgICAgICAgcHJvZHVjZTogKCkgPT5cbiAgICAgICAgICAgIHRoaXMuZGlyZWN0RWdyZXNzUnVsZXMubWFwKFxuICAgICAgICAgICAgICBzZWN1cml0eUdyb3VwLnNlY3VyaXR5R3JvdXBFZ3Jlc3NUb1RlcnJhZm9ybSxcbiAgICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIHsgb21pdEVtcHR5QXJyYXk6IHRydWUgfSxcbiAgICAgICksXG4gICAgICB2cGNJZDogcHJvcHMudnBjLnZwY0lkLFxuICAgIH0pO1xuXG4gICAgdGhpcy5zZWN1cml0eUdyb3VwSWQgPSB0aGlzLnNlY3VyaXR5R3JvdXAuaWQ7XG4gICAgdGhpcy5zZWN1cml0eUdyb3VwVnBjSWQgPSB0aGlzLnNlY3VyaXR5R3JvdXAudnBjSWQ7XG5cbiAgICB0aGlzLmFkZERlZmF1bHRFZ3Jlc3NSdWxlKCk7XG4gICAgdGhpcy5hZGREZWZhdWx0SXB2NkVncmVzc1J1bGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRJbmdyZXNzUnVsZShcbiAgICBwZWVyOiBJUGVlcixcbiAgICBjb25uZWN0aW9uOiBQb3J0LFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIHJlbW90ZVJ1bGU/OiBib29sZWFuLFxuICApIHtcbiAgICBpZiAoXG4gICAgICAhcGVlci5jYW5JbmxpbmVSdWxlIHx8XG4gICAgICAhY29ubmVjdGlvbi5jYW5JbmxpbmVSdWxlIHx8XG4gICAgICB0aGlzLmRpc2FibGVJbmxpbmVSdWxlc1xuICAgICkge1xuICAgICAgc3VwZXIuYWRkSW5ncmVzc1J1bGUocGVlciwgY29ubmVjdGlvbiwgZGVzY3JpcHRpb24sIHJlbW90ZVJ1bGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChkZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZXNjcmlwdGlvbiA9IGBmcm9tICR7cGVlci51bmlxdWVJZH06JHtjb25uZWN0aW9ufWA7XG4gICAgfVxuXG4gICAgdGhpcy5hZGREaXJlY3RJbmdyZXNzUnVsZSh7XG4gICAgICAuLi5wZWVyLnRvSW5ncmVzc1J1bGVDb25maWcoKSxcbiAgICAgIC4uLmNvbm5lY3Rpb24udG9SdWxlSnNvbigpLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYWRkRWdyZXNzUnVsZShcbiAgICBwZWVyOiBJUGVlcixcbiAgICBjb25uZWN0aW9uOiBQb3J0LFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIHJlbW90ZVJ1bGU/OiBib29sZWFuLFxuICApIHtcbiAgICBjb25zdCBpc0lwdjYgPSBwZWVyLnRvRWdyZXNzUnVsZUNvbmZpZygpLmhhc093blByb3BlcnR5KFwiY2lkcklwdjZcIik7XG5cbiAgICBpZiAoIWlzSXB2NiAmJiB0aGlzLmFsbG93QWxsT3V0Ym91bmQpIHtcbiAgICAgIC8vIEluIHRoZSBjYXNlIG9mIFwiYWxsb3dBbGxPdXRib3VuZFwiLCB3ZSBkb24ndCBhZGQgYW55IG1vcmUgcnVsZXMuIFRoZXJlXG4gICAgICAvLyBpcyBvbmx5IG9uZSBydWxlIHdoaWNoIGFsbG93cyBhbGwgdHJhZmZpYyBhbmQgdGhhdCBzdWJzdW1lcyBhbnkgb3RoZXJcbiAgICAgIC8vIHJ1bGUuXG4gICAgICBpZiAoIXJlbW90ZVJ1bGUpIHtcbiAgICAgICAgLy8gV2FybiBvbmx5IGlmIGFkZEVncmVzc1J1bGUoKSB3YXMgZXhwbGljaXRlbHkgY2FsbGVkXG4gICAgICAgIC8vIFwiQGF3cy1jZGsvYXdzLWVjMjppcHY0SWdub3JlRWdyZXNzUnVsZVwiLFxuICAgICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nKFxuICAgICAgICAgIFwiSWdub3JpbmcgRWdyZXNzIHJ1bGUgc2luY2UgJ2FsbG93QWxsT3V0Ym91bmQnIGlzIHNldCB0byB0cnVlOyBUbyBhZGQgY3VzdG9taXplZCBydWxlcywgc2V0IGFsbG93QWxsT3V0Ym91bmQ9ZmFsc2Ugb24gdGhlIFNlY3VyaXR5R3JvdXBcIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNJcHY2ICYmIHRoaXMuYWxsb3dBbGxJcHY2T3V0Ym91bmQpIHtcbiAgICAgIC8vIEluIHRoZSBjYXNlIG9mIFwiYWxsb3dBbGxJcHY2T3V0Ym91bmRcIiwgd2UgZG9uJ3QgYWRkIGFueSBtb3JlIHJ1bGVzLiBUaGVyZVxuICAgICAgLy8gaXMgb25seSBvbmUgcnVsZSB3aGljaCBhbGxvd3MgYWxsIHRyYWZmaWMgYW5kIHRoYXQgc3Vic3VtZXMgYW55IG90aGVyXG4gICAgICAvLyBydWxlLlxuICAgICAgaWYgKCFyZW1vdGVSdWxlKSB7XG4gICAgICAgIC8vIFdhcm4gb25seSBpZiBhZGRFZ3Jlc3NSdWxlKCkgd2FzIGV4cGxpY2l0ZWx5IGNhbGxlZFxuICAgICAgICAvLyBcIkBhd3MtY2RrL2F3cy1lYzI6aXB2Nklnbm9yZUVncmVzc1J1bGVcIixcbiAgICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZyhcbiAgICAgICAgICBcIklnbm9yaW5nIEVncmVzcyBydWxlIHNpbmNlICdhbGxvd0FsbElwdjZPdXRib3VuZCcgaXMgc2V0IHRvIHRydWU7IFRvIGFkZCBjdXN0b21pemVkIHJ1bGVzLCBzZXQgYWxsb3dBbGxJcHY2T3V0Ym91bmQ9ZmFsc2Ugb24gdGhlIFNlY3VyaXR5R3JvdXBcIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAhcGVlci5jYW5JbmxpbmVSdWxlIHx8XG4gICAgICAhY29ubmVjdGlvbi5jYW5JbmxpbmVSdWxlIHx8XG4gICAgICB0aGlzLmRpc2FibGVJbmxpbmVSdWxlc1xuICAgICkge1xuICAgICAgc3VwZXIuYWRkRWdyZXNzUnVsZShwZWVyLCBjb25uZWN0aW9uLCBkZXNjcmlwdGlvbiwgcmVtb3RlUnVsZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGRlc2NyaXB0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlc2NyaXB0aW9uID0gYGZyb20gJHtwZWVyLnVuaXF1ZUlkfToke2Nvbm5lY3Rpb259YDtcbiAgICB9XG5cbiAgICBjb25zdCBydWxlID0ge1xuICAgICAgLi4ucGVlci50b0VncmVzc1J1bGVDb25maWcoKSxcbiAgICAgIC4uLmNvbm5lY3Rpb24udG9SdWxlSnNvbigpLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgfTtcblxuICAgIGlmIChpc0FsbFRyYWZmaWNSdWxlKHJ1bGUpKSB7XG4gICAgICAvLyBXZSBjYW5ub3QgYWxsb3cgdGhpczsgaWYgc29tZW9uZSBhZGRzIHRoZSBydWxlIGluIHRoaXMgd2F5LCBpdCB3aWxsIGJlXG4gICAgICAvLyByZW1vdmVkIGFnYWluIGlmIHRoZXkgYWRkIG90aGVyIHJ1bGVzLiBXZSBhbHNvIGNhbid0IGF1dG9tYXRpY2FsbHkgc3dpdGNoXG4gICAgICAvLyB0byBcImFsbE91dGJvdW5kPXRydWVcIiBtb2RlLCBiZWNhdXNlIHdlIG1pZ2h0IGhhdmUgYWxyZWFkeSBlbWl0dGVkXG4gICAgICAvLyBFZ3Jlc3NSdWxlIG9iamVjdHMgKHdoaWNoIGNvdW50IGFzIHJ1bGVzIGFkZGVkIGxhdGVyKSBhbmQgdGhlcmUncyBubyB3YXlcbiAgICAgIC8vIHRvIHJlY2FsbCB0aG9zZS4gQmV0dGVyIHRvIHByZXZlbnQgdGhpcyBmb3Igbm93LlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQ2Fubm90IGFkZCBhbiBcImFsbCB0cmFmZmljXCIgZWdyZXNzIHJ1bGUgaW4gdGhpcyB3YXk7IHNldCBhbGxvd0FsbE91dGJvdW5kPXRydWUgKGZvciBpcHY2KSBvciBhbGxvd0FsbElwdjZPdXRib3VuZD10cnVlIChmb3IgaXB2Nikgb24gdGhlIFNlY3VyaXR5R3JvdXAgaW5zdGVhZC4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERpcmVjdEVncmVzc1J1bGUocnVsZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgZGlyZWN0IGluZ3Jlc3MgcnVsZVxuICAgKi9cbiAgcHJpdmF0ZSBhZGREaXJlY3RJbmdyZXNzUnVsZShydWxlOiBzZWN1cml0eUdyb3VwLlNlY3VyaXR5R3JvdXBJbmdyZXNzKSB7XG4gICAgbGV0IHIgPSBub3JtYWxpemVEaXJlY3RSdWxlKHJ1bGUpO1xuICAgIGlmICghdGhpcy5oYXNJbmdyZXNzUnVsZShyKSkge1xuICAgICAgdGhpcy5kaXJlY3RJbmdyZXNzUnVsZXMucHVzaChyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIGluZ3Jlc3MgcnVsZSBleGlzdHMgb24gdGhlIGdyb3VwXG4gICAqL1xuICBwcml2YXRlIGhhc0luZ3Jlc3NSdWxlKHJ1bGU6IHNlY3VyaXR5R3JvdXAuU2VjdXJpdHlHcm91cEluZ3Jlc3MpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5kaXJlY3RJbmdyZXNzUnVsZXMuZmluZEluZGV4KChyKSA9PiBpbmdyZXNzUnVsZXNFcXVhbChyLCBydWxlKSkgPiAtMVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgZGlyZWN0IGVncmVzcyBydWxlXG4gICAqL1xuICBwcml2YXRlIGFkZERpcmVjdEVncmVzc1J1bGUocnVsZTogc2VjdXJpdHlHcm91cC5TZWN1cml0eUdyb3VwRWdyZXNzKSB7XG4gICAgbGV0IHIgPSBub3JtYWxpemVEaXJlY3RSdWxlKHJ1bGUpO1xuICAgIGlmICghdGhpcy5oYXNFZ3Jlc3NSdWxlKHIpKSB7XG4gICAgICB0aGlzLmRpcmVjdEVncmVzc1J1bGVzLnB1c2gocik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBlZ3Jlc3MgcnVsZSBleGlzdHMgb24gdGhlIGdyb3VwXG4gICAqL1xuICBwcml2YXRlIGhhc0VncmVzc1J1bGUocnVsZTogc2VjdXJpdHlHcm91cC5TZWN1cml0eUdyb3VwRWdyZXNzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuZGlyZWN0RWdyZXNzUnVsZXMuZmluZEluZGV4KChyKSA9PiBlZ3Jlc3NSdWxlc0VxdWFsKHIsIHJ1bGUpKSA+IC0xXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdGhlIGRlZmF1bHQgZWdyZXNzIHJ1bGUgdG8gdGhlIHNlY3VyaXR5R3JvdXBcbiAgICpcbiAgICogQnkgZGVmYXVsdCwgQVdTIGNyZWF0ZXMgYW4gYEFMTE9XIEFMTGAgZWdyZXNzIHJ1bGUgd2hlbiBjcmVhdGluZyBhIG5ldyBTZWN1cml0eSBHcm91cCBpbnNpZGUgb2YgYSBWUEMuXG4gICAqIFdoZW4gY3JlYXRpbmcgYSBuZXcgU2VjdXJpdHkgR3JvdXAgaW5zaWRlIGEgVlBDLCBUZXJyYWZvcm0gd2lsbCByZW1vdmUgdGhpcyBkZWZhdWx0IHJ1bGUsIGFuZCByZXF1aXJlXG4gICAqIHlvdSBzcGVjaWZpY2FsbHkgcmUtY3JlYXRlIGl0IGlmIHlvdSBkZXNpcmUgdGhhdCBydWxlLlxuICAgKlxuICAgKiBUaGlzIGRlcGVuZHMgb24gYWxsb3dBbGxPdXRib3VuZFxuICAgKlxuICAgKiAtIElmIGFsbG93QWxsT3V0Ym91bmQgaXMgdHJ1ZSwgd2Ugd2lsbCBhZGQgYW4gYWxsb3cgYWxsIHJ1bGUuXG4gICAqIC0gSWYgYWxsb3dBbGxPdXRib3VuZCBpcyBmYWxzZSwgd2UgZG9uJ3QgZG8gYW55dGhpbmcgc2luY2UgVEYgZG9lcyBub3QgYWRkXG4gICAqICAgYSBkZWZhdWx0IGFsbG93IGFsbCBpcHY0IHJ1bGUuXG4gICAqL1xuICBwcml2YXRlIGFkZERlZmF1bHRFZ3Jlc3NSdWxlKCkge1xuICAgIGlmICghdGhpcy5hbGxvd0FsbE91dGJvdW5kKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmRpc2FibGVJbmxpbmVSdWxlcykge1xuICAgICAgc3VwZXIuYWRkRWdyZXNzUnVsZShcbiAgICAgICAgQUxMX1RSQUZGSUNfUEVFUixcbiAgICAgICAgQUxMX1RSQUZGSUNfUE9SVCxcbiAgICAgICAgQUxMT1dfQUxMX1JVTEUuZGVzY3JpcHRpb24sXG4gICAgICAgIGZhbHNlLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXJlY3RFZ3Jlc3NSdWxlcy5wdXNoKEFMTE9XX0FMTF9SVUxFKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgYWxsb3cgYWxsIGlwdjYgZWdyZXNzIHJ1bGUgdG8gdGhlIHNlY3VyaXR5R3JvdXBcbiAgICpcbiAgICogVGhpcyBkZXBlbmRzIG9uIGFsbG93QWxsSXB2Nk91dGJvdW5kOlxuICAgKlxuICAgKiAtIElmIGFsbG93QWxsSXB2Nk91dGJvdW5kIGlzIHRydWUsIHdlIHdpbGwgYWRkIGFuIGFsbG93IGFsbCBydWxlLlxuICAgKiAtIElmIGFsbG93QWxsT3V0Ym91bmQgaXMgZmFsc2UsIHdlIGRvbid0IGRvIGFueXRoaW5nIHNpbmNlIEVDMiBkb2VzIG5vdCBhZGRcbiAgICogICBhIGRlZmF1bHQgYWxsb3cgYWxsIGlwdjYgcnVsZS5cbiAgICovXG4gIHByaXZhdGUgYWRkRGVmYXVsdElwdjZFZ3Jlc3NSdWxlKCkge1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gXCJBbGxvdyBhbGwgb3V0Ym91bmQgaXB2NiB0cmFmZmljIGJ5IGRlZmF1bHRcIjtcbiAgICBjb25zdCBwZWVyID0gUGVlci5hbnlJcHY2KCk7XG4gICAgaWYgKHRoaXMuYWxsb3dBbGxJcHY2T3V0Ym91bmQpIHtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVJbmxpbmVSdWxlcykge1xuICAgICAgICBzdXBlci5hZGRFZ3Jlc3NSdWxlKHBlZXIsIFBvcnQuYWxsVHJhZmZpYygpLCBkZXNjcmlwdGlvbiwgZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kaXJlY3RFZ3Jlc3NSdWxlcy5wdXNoKHtcbiAgICAgICAgICBwcm90b2NvbDogXCItMVwiLFxuICAgICAgICAgIGZyb21Qb3J0OiAwLFxuICAgICAgICAgIHRvUG9ydDogMCxcbiAgICAgICAgICBpcHY2Q2lkckJsb2NrczogW3BlZXIudW5pcXVlSWRdLFxuICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBGaXggdXAgYSBkaXJlY3QgcnVsZSB0byBoYXZlIGZyb21Qb3J0L3RvUG9ydCBkZWZpbmVkXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZURpcmVjdFJ1bGUoXG4gIHJ1bGU6IHNlY3VyaXR5R3JvdXAuU2VjdXJpdHlHcm91cEVncmVzcyB8IHNlY3VyaXR5R3JvdXAuU2VjdXJpdHlHcm91cEluZ3Jlc3MsXG4pOiBzZWN1cml0eUdyb3VwLlNlY3VyaXR5R3JvdXBFZ3Jlc3MgfCBzZWN1cml0eUdyb3VwLlNlY3VyaXR5R3JvdXBJbmdyZXNzIHtcbiAgLy8gVW5saWtlIHNlY3VyaXR5X2dyb3VwXyhpbnxlKWdyZXNzX3J1bGUsIFRGIFNlY3VyaXR5IEdyb3VwIGRpcmVjdCBydWxlc1xuICAvLyBjYW4ndCBoYXZlIGZyb21Qb3J0L3RvUG9ydCB1bmRlZmluZWQuXG4gIC8vIHJlZnM6XG4gIC8vIC0gaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvNS44OC4wL2RvY3MvcmVzb3VyY2VzL3ZwY19zZWN1cml0eV9ncm91cF9lZ3Jlc3NfcnVsZSNpcF9wcm90b2NvbC0xXG4gIC8vICAgdnNcbiAgLy8gLSBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81Ljg4LjAvZG9jcy9yZXNvdXJjZXMvc2VjdXJpdHlfZ3JvdXAjcHJvdG9jb2wtMVxuICByZXR1cm4ge1xuICAgIC4uLnJ1bGUsXG4gICAgZnJvbVBvcnQ6IHJ1bGUuZnJvbVBvcnQgPz8gMCxcbiAgICB0b1BvcnQ6IHJ1bGUudG9Qb3J0ID8/IDAsXG4gIH07XG59XG5cbi8qKlxuICogRWdyZXNzIHJ1bGUgdGhhdCBtYXRjaGVzIGFsbCB0cmFmZmljXG4gKi9cbmNvbnN0IEFMTE9XX0FMTF9SVUxFOiBzZWN1cml0eUdyb3VwLlNlY3VyaXR5R3JvdXBFZ3Jlc3MgPSB7XG4gIGNpZHJCbG9ja3M6IFtcIjAuMC4wLjAvMFwiXSxcbiAgZGVzY3JpcHRpb246IFwiQWxsb3cgYWxsIG91dGJvdW5kIHRyYWZmaWMgYnkgZGVmYXVsdFwiLFxuICAvKipcbiAgICogSWYgeW91IHNlbGVjdCBhIHByb3RvY29sIG9mIC0xIChzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0byBhbGwsIHdoaWNoIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGhlcmUpLFxuICAgKiB5b3UgbXVzdCBzcGVjaWZ5IGEgZnJvbV9wb3J0IGFuZCB0b19wb3J0IGVxdWFsIHRvIDAuXG4gICAqL1xuICBwcm90b2NvbDogXCItMVwiLFxuICBmcm9tUG9ydDogMCxcbiAgdG9Qb3J0OiAwLFxufTtcblxuY29uc3QgQUxMX1RSQUZGSUNfUEVFUiA9IFBlZXIuYW55SXB2NCgpO1xuY29uc3QgQUxMX1RSQUZGSUNfUE9SVCA9IFBvcnQuYWxsVHJhZmZpYygpO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3Rpb25SdWxlIHtcbiAgLyoqXG4gICAqIFRoZSBJUCBwcm90b2NvbCBuYW1lICh0Y3AsIHVkcCwgaWNtcCkgb3IgbnVtYmVyIChzZWUgUHJvdG9jb2wgTnVtYmVycykuXG4gICAqIFVzZSAtMSB0byBzcGVjaWZ5IGFsbCBwcm90b2NvbHMuIElmIHlvdSBzcGVjaWZ5IC0xLCBvciBhIHByb3RvY29sIG51bWJlclxuICAgKiBvdGhlciB0aGFuIHRjcCwgdWRwLCBpY21wLCBvciA1OCAoSUNNUHY2KSwgdHJhZmZpYyBvbiBhbGwgcG9ydHMgaXNcbiAgICogYWxsb3dlZCwgcmVnYXJkbGVzcyBvZiBhbnkgcG9ydHMgeW91IHNwZWNpZnkuIEZvciB0Y3AsIHVkcCwgYW5kIGljbXAsIHlvdVxuICAgKiBtdXN0IHNwZWNpZnkgYSBwb3J0IHJhbmdlLiBGb3IgcHJvdG9jb2wgNTggKElDTVB2NiksIHlvdSBjYW4gb3B0aW9uYWxseVxuICAgKiBzcGVjaWZ5IGEgcG9ydCByYW5nZTsgaWYgeW91IGRvbid0LCB0cmFmZmljIGZvciBhbGwgdHlwZXMgYW5kIGNvZGVzIGlzXG4gICAqIGFsbG93ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRjcFxuICAgKi9cbiAgcmVhZG9ubHkgcHJvdG9jb2w/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFN0YXJ0IG9mIHBvcnQgcmFuZ2UgZm9yIHRoZSBUQ1AgYW5kIFVEUCBwcm90b2NvbHMsIG9yIGFuIElDTVAgdHlwZSBudW1iZXIuXG4gICAqXG4gICAqIElmIHlvdSBzcGVjaWZ5IGljbXAgZm9yIHRoZSBJcFByb3RvY29sIHByb3BlcnR5LCB5b3UgY2FuIHNwZWNpZnlcbiAgICogLTEgYXMgYSB3aWxkY2FyZCAoaS5lLiwgYW55IElDTVAgdHlwZSBudW1iZXIpLlxuICAgKi9cbiAgcmVhZG9ubHkgZnJvbVBvcnQ6IG51bWJlcjtcblxuICAvKipcbiAgICogRW5kIG9mIHBvcnQgcmFuZ2UgZm9yIHRoZSBUQ1AgYW5kIFVEUCBwcm90b2NvbHMsIG9yIGFuIElDTVAgY29kZS5cbiAgICpcbiAgICogSWYgeW91IHNwZWNpZnkgaWNtcCBmb3IgdGhlIElwUHJvdG9jb2wgcHJvcGVydHksIHlvdSBjYW4gc3BlY2lmeSAtMSBhcyBhXG4gICAqIHdpbGRjYXJkIChpLmUuLCBhbnkgSUNNUCBjb2RlKS5cbiAgICpcbiAgICogQGRlZmF1bHQgSWYgdG9Qb3J0IGlzIG5vdCBzcGVjaWZpZWQsIGl0IHdpbGwgYmUgdGhlIHNhbWUgYXMgZnJvbVBvcnQuXG4gICAqL1xuICByZWFkb25seSB0b1BvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIERlc2NyaXB0aW9uIG9mIHRoaXMgY29ubmVjdGlvbi4gSXQgaXMgYXBwbGllZCB0byBib3RoIHRoZSBpbmdyZXNzIHJ1bGVcbiAgICogYW5kIHRoZSBlZ3Jlc3MgcnVsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgTm8gZGVzY3JpcHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbXBhcmUgdHdvIGluZ3Jlc3MgcnVsZXMgZm9yIGVxdWFsaXR5IHRoZSBzYW1lIHdheSBDbG91ZEZvcm1hdGlvbiB3b3VsZCAoZGlzY2FyZGluZyBkZXNjcmlwdGlvbilcbiAqL1xuZnVuY3Rpb24gaW5ncmVzc1J1bGVzRXF1YWwoXG4gIGE6IHNlY3VyaXR5R3JvdXAuU2VjdXJpdHlHcm91cEluZ3Jlc3MsXG4gIGI6IHNlY3VyaXR5R3JvdXAuU2VjdXJpdHlHcm91cEluZ3Jlc3MsXG4pIHtcbiAgcmV0dXJuIChcbiAgICBhLmNpZHJCbG9ja3MgPT09IGIuY2lkckJsb2NrcyAmJlxuICAgIGEuaXB2NkNpZHJCbG9ja3MgPT09IGIuaXB2NkNpZHJCbG9ja3MgJiZcbiAgICBhLmZyb21Qb3J0ID09PSBiLmZyb21Qb3J0ICYmXG4gICAgYS50b1BvcnQgPT09IGIudG9Qb3J0ICYmXG4gICAgYS5wcm90b2NvbCA9PT0gYi5wcm90b2NvbCAmJlxuICAgIGEucHJlZml4TGlzdElkcyA9PT0gYi5wcmVmaXhMaXN0SWRzICYmXG4gICAgYS5zZWN1cml0eUdyb3VwcyA9PT0gYi5zZWN1cml0eUdyb3Vwc1xuICApO1xufVxuXG4vKipcbiAqIENvbXBhcmUgdHdvIGVncmVzcyBydWxlcyBmb3IgZXF1YWxpdHkgdGhlIHNhbWUgd2F5IENsb3VkRm9ybWF0aW9uIHdvdWxkIChkaXNjYXJkaW5nIGRlc2NyaXB0aW9uKVxuICovXG5mdW5jdGlvbiBlZ3Jlc3NSdWxlc0VxdWFsKFxuICBhOiBzZWN1cml0eUdyb3VwLlNlY3VyaXR5R3JvdXBFZ3Jlc3MsXG4gIGI6IHNlY3VyaXR5R3JvdXAuU2VjdXJpdHlHcm91cEVncmVzcyxcbikge1xuICByZXR1cm4gKFxuICAgIGEuY2lkckJsb2NrcyA9PT0gYi5jaWRyQmxvY2tzICYmXG4gICAgYS5pcHY2Q2lkckJsb2NrcyA9PT0gYi5pcHY2Q2lkckJsb2NrcyAmJlxuICAgIGEuZnJvbVBvcnQgPT09IGIuZnJvbVBvcnQgJiZcbiAgICBhLnRvUG9ydCA9PT0gYi50b1BvcnQgJiZcbiAgICBhLnByb3RvY29sID09PSBiLnByb3RvY29sICYmXG4gICAgYS5wcmVmaXhMaXN0SWRzID09PSBiLnByZWZpeExpc3RJZHMgJiZcbiAgICBhLnNlY3VyaXR5R3JvdXBzID09PSBiLnNlY3VyaXR5R3JvdXBzXG4gICk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGlzIHJ1bGUgcmVmZXJzIHRvIGFsbCB0cmFmZmljXG4gKi9cbmZ1bmN0aW9uIGlzQWxsVHJhZmZpY1J1bGUocnVsZTogYW55KSB7XG4gIHJldHVybiAoXG4gICAgKHJ1bGUuY2lkcklwdjQgPT09IFwiMC4wLjAuMC8wXCIgfHxcbiAgICAgIChydWxlLmNpZHJCbG9ja3MgJiYgcnVsZS5jaWRyQmxvY2tzWzBdID09PSBcIjAuMC4wLjAvMFwiKSB8fFxuICAgICAgcnVsZS5jaWRySXB2NiA9PT0gXCI6Oi8wXCIpICYmXG4gICAgcnVsZS5pcFByb3RvY29sID09PSBcIi0xXCJcbiAgKTtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBsb29raW5nIHVwIGFuIGV4aXN0aW5nIFNlY3VyaXR5R3JvdXAuXG4gKlxuICogRWl0aGVyIGBzZWN1cml0eUdyb3VwTmFtZWAgb3IgYHNlY3VyaXR5R3JvdXBJZGAgaGFzIHRvIGJlIHNwZWNpZmllZC5cbiAqL1xuaW50ZXJmYWNlIFNlY3VyaXR5R3JvdXBMb29rdXBPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBzZWN1cml0eSBncm91cFxuICAgKlxuICAgKiBJZiBnaXZlbiwgd2lsbCBpbXBvcnQgdGhlIFNlY3VyaXR5R3JvdXAgd2l0aCB0aGlzIG5hbWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IERvbid0IGZpbHRlciBvbiBzZWN1cml0eUdyb3VwTmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlHcm91cE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgc2VjdXJpdHkgZ3JvdXBcbiAgICpcbiAgICogSWYgZ2l2ZW4sIHdpbGwgaW1wb3J0IHRoZSBTZWN1cml0eUdyb3VwIHdpdGggdGhpcyBJRC5cbiAgICpcbiAgICogQGRlZmF1bHQgRG9uJ3QgZmlsdGVyIG9uIHNlY3VyaXR5R3JvdXBJZFxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlHcm91cElkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgVlBDIG9mIHRoZSBzZWN1cml0eSBncm91cFxuICAgKlxuICAgKiBJZiBnaXZlbiwgd2lsbCBmaWx0ZXIgdGhlIFNlY3VyaXR5R3JvdXAgYmFzZWQgb24gdGhlIFZQQy5cbiAgICpcbiAgICogQGRlZmF1bHQgRG9uJ3QgZmlsdGVyIG9uIFZQQ1xuICAgKi9cbiAgcmVhZG9ubHkgdnBjPzogSVZwYztcblxuICAvKipcbiAgICogTWFyayB0aGUgU2VjdXJpdHlHcm91cCBhcyBhbGxvd2luZyBhbGwgb3V0Ym91bmQgdHJhZmZpY1xuICAgKlxuICAgKiBPbmx5IGlmIHRoaXMgaXMgc2V0IHRvIGZhbHNlIHdpbGwgZWdyZXNzIHJ1bGVzIGJlIGFkZGVkIHRvIHRoaXMgc2VjdXJpdHlcbiAgICogZ3JvdXAuIEJlIGF3YXJlLCB0aGlzIHdvdWxkIHVuZG8gYW55IHBvdGVudGlhbCBcImFsbCBvdXRib3VuZCB0cmFmZmljXCJcbiAgICogZGVmYXVsdC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dBbGxPdXRib3VuZD86IGJvb2xlYW47IC8vIFRPRE86IFVzZSBHcmlkIGFzIGNvbnRleHRQcm92aWRlclxufVxuIl19