terraconstructs 0.1.0 → 0.1.2

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 (271) hide show
  1. package/.jsii +344 -209
  2. package/.mise.toml +1 -1
  3. package/go.mod +1 -1
  4. package/go.sum +2 -2
  5. package/lib/asset-staging.js +1 -1
  6. package/lib/aws/arn.js +1 -1
  7. package/lib/aws/aws-asset-manager.js +1 -1
  8. package/lib/aws/aws-construct.js +1 -1
  9. package/lib/aws/aws-stack.js +1 -1
  10. package/lib/aws/aws-tags.js +2 -2
  11. package/lib/aws/cloudwatch/actions/appscaling.js +1 -1
  12. package/lib/aws/cloudwatch/actions/ec2.js +1 -1
  13. package/lib/aws/cloudwatch/actions/lambda.js +1 -1
  14. package/lib/aws/cloudwatch/actions/sns.js +1 -1
  15. package/lib/aws/cloudwatch/actions/ssm.js +2 -2
  16. package/lib/aws/cloudwatch/alarm-base.js +1 -1
  17. package/lib/aws/cloudwatch/alarm-rule.js +1 -1
  18. package/lib/aws/cloudwatch/alarm-status-widget.js +1 -1
  19. package/lib/aws/cloudwatch/alarm.js +1 -1
  20. package/lib/aws/cloudwatch/composite-alarm.js +1 -1
  21. package/lib/aws/cloudwatch/dashboard.js +1 -1
  22. package/lib/aws/cloudwatch/data-protection-policy.js +3 -3
  23. package/lib/aws/cloudwatch/graph.js +8 -8
  24. package/lib/aws/cloudwatch/layout.js +3 -3
  25. package/lib/aws/cloudwatch/log-destinations/kinesis.js +1 -1
  26. package/lib/aws/cloudwatch/log-destinations/lambda.js +1 -1
  27. package/lib/aws/cloudwatch/log-group.js +1 -1
  28. package/lib/aws/cloudwatch/log-query.js +1 -1
  29. package/lib/aws/cloudwatch/log-stream.js +1 -1
  30. package/lib/aws/cloudwatch/metric-filter.js +1 -1
  31. package/lib/aws/cloudwatch/metric.js +2 -2
  32. package/lib/aws/cloudwatch/pattern.js +3 -3
  33. package/lib/aws/cloudwatch/policy.js +1 -1
  34. package/lib/aws/cloudwatch/query-definition.js +2 -2
  35. package/lib/aws/cloudwatch/stats.js +1 -1
  36. package/lib/aws/cloudwatch/subscription-filter.js +1 -1
  37. package/lib/aws/cloudwatch/text.js +1 -1
  38. package/lib/aws/cloudwatch/variable.js +3 -3
  39. package/lib/aws/cloudwatch/widget.js +1 -1
  40. package/lib/aws/compute/access-log.js +4 -4
  41. package/lib/aws/compute/activity.js +1 -1
  42. package/lib/aws/compute/alb/application-listener-action.js +1 -1
  43. package/lib/aws/compute/alb/application-listener-certificate.js +1 -1
  44. package/lib/aws/compute/alb/application-listener-rule.js +1 -1
  45. package/lib/aws/compute/alb/application-listener.js +1 -1
  46. package/lib/aws/compute/alb/application-load-balancer.js +1 -1
  47. package/lib/aws/compute/alb/application-target-group.js +1 -1
  48. package/lib/aws/compute/alb/conditions.js +1 -1
  49. package/lib/aws/compute/alb/trust-store-revocation.js +1 -1
  50. package/lib/aws/compute/alb/trust-store.js +1 -1
  51. package/lib/aws/compute/api-definition.js +3 -3
  52. package/lib/aws/compute/api-key.js +2 -2
  53. package/lib/aws/compute/architecture.js +1 -1
  54. package/lib/aws/compute/aspects/require-imdsv2-aspect.js +2 -2
  55. package/lib/aws/compute/authorizer.js +1 -1
  56. package/lib/aws/compute/authorizers/identity-source.js +1 -1
  57. package/lib/aws/compute/authorizers/lambda.js +4 -4
  58. package/lib/aws/compute/base-path-mapping.js +1 -1
  59. package/lib/aws/compute/base-scalable-attribute.js +1 -1
  60. package/lib/aws/compute/bastion-host.js +1 -1
  61. package/lib/aws/compute/chain.js +1 -1
  62. package/lib/aws/compute/client-vpn-authorization-rule.js +1 -1
  63. package/lib/aws/compute/client-vpn-endpoint.js +2 -2
  64. package/lib/aws/compute/client-vpn-route.js +2 -2
  65. package/lib/aws/compute/code.d.ts +11 -2
  66. package/lib/aws/compute/code.js +51 -12
  67. package/lib/aws/compute/condition.js +1 -1
  68. package/lib/aws/compute/connections.js +1 -1
  69. package/lib/aws/compute/cors.js +1 -1
  70. package/lib/aws/compute/deployment.js +1 -1
  71. package/lib/aws/compute/domain-name.js +1 -1
  72. package/lib/aws/compute/event-invoke-config.js +1 -1
  73. package/lib/aws/compute/event-source-filter.js +2 -2
  74. package/lib/aws/compute/event-source-mapping.js +1 -1
  75. package/lib/aws/compute/event-sources/s3-onfailure-destination.js +1 -1
  76. package/lib/aws/compute/event-sources/s3.js +1 -1
  77. package/lib/aws/compute/event-sources/sqs-dlq.js +1 -1
  78. package/lib/aws/compute/event-sources/sqs.js +1 -1
  79. package/lib/aws/compute/fields.js +4 -4
  80. package/lib/aws/compute/function-alias.d.ts +1 -0
  81. package/lib/aws/compute/function-alias.js +8 -2
  82. package/lib/aws/compute/function-base.d.ts +8 -0
  83. package/lib/aws/compute/function-base.js +3 -3
  84. package/lib/aws/compute/function-destinations/event-bridge.js +1 -1
  85. package/lib/aws/compute/function-destinations/function.js +1 -1
  86. package/lib/aws/compute/function-destinations/sqs.js +1 -1
  87. package/lib/aws/compute/function-nodejs/function.js +1 -1
  88. package/lib/aws/compute/function-url.js +1 -1
  89. package/lib/aws/compute/function.d.ts +9 -1
  90. package/lib/aws/compute/function.js +17 -3
  91. package/lib/aws/compute/gateway-response.js +2 -2
  92. package/lib/aws/compute/handler.js +1 -1
  93. package/lib/aws/compute/instance-types.js +1 -1
  94. package/lib/aws/compute/instance.js +1 -1
  95. package/lib/aws/compute/integration.js +1 -1
  96. package/lib/aws/compute/integrations/aws.js +1 -1
  97. package/lib/aws/compute/integrations/http.js +1 -1
  98. package/lib/aws/compute/integrations/lambda.js +1 -1
  99. package/lib/aws/compute/integrations/mock.js +1 -1
  100. package/lib/aws/compute/integrations/stepfunctions.js +1 -1
  101. package/lib/aws/compute/ip-addresses.js +2 -2
  102. package/lib/aws/compute/ipam.js +1 -1
  103. package/lib/aws/compute/key-pair.js +1 -1
  104. package/lib/aws/compute/lambda-api.js +1 -1
  105. package/lib/aws/compute/launch-template.js +2 -2
  106. package/lib/aws/compute/lb-shared/base-listener.js +1 -1
  107. package/lib/aws/compute/lb-shared/base-load-balancer.js +2 -2
  108. package/lib/aws/compute/lb-shared/base-target-group.js +1 -1
  109. package/lib/aws/compute/lb-shared/listener-certificate.js +1 -1
  110. package/lib/aws/compute/lb-shared/load-balancer-targets.js +2 -2
  111. package/lib/aws/compute/lb-targets/alb-target.js +3 -3
  112. package/lib/aws/compute/lb-targets/instance-target.js +2 -2
  113. package/lib/aws/compute/lb-targets/ip-target.js +1 -1
  114. package/lib/aws/compute/lb-targets/lambda-target.js +1 -1
  115. package/lib/aws/compute/load-balancer.js +3 -3
  116. package/lib/aws/compute/machine-image/amazon-linux-2022.js +2 -2
  117. package/lib/aws/compute/machine-image/amazon-linux-2023.js +2 -2
  118. package/lib/aws/compute/machine-image/amazon-linux2.js +2 -2
  119. package/lib/aws/compute/machine-image/common.js +1 -1
  120. package/lib/aws/compute/machine-image/machine-image.js +8 -8
  121. package/lib/aws/compute/method.js +7 -4
  122. package/lib/aws/compute/model.js +3 -3
  123. package/lib/aws/compute/nat.js +5 -5
  124. package/lib/aws/compute/network-acl-types.js +2 -2
  125. package/lib/aws/compute/network-acl.js +3 -3
  126. package/lib/aws/compute/nlb/network-listener-action.js +1 -1
  127. package/lib/aws/compute/nlb/network-listener.js +1 -1
  128. package/lib/aws/compute/nlb/network-load-balancer.js +1 -1
  129. package/lib/aws/compute/nlb/network-target-group.js +1 -1
  130. package/lib/aws/compute/peer.js +1 -1
  131. package/lib/aws/compute/placement-group.js +1 -1
  132. package/lib/aws/compute/port.js +1 -1
  133. package/lib/aws/compute/prefix-list.js +1 -1
  134. package/lib/aws/compute/requestvalidator.js +1 -1
  135. package/lib/aws/compute/resource.js +3 -3
  136. package/lib/aws/compute/restapi.js +3 -3
  137. package/lib/aws/compute/route.js +8 -8
  138. package/lib/aws/compute/runtime.js +1 -1
  139. package/lib/aws/compute/scalable-target.js +1 -1
  140. package/lib/aws/compute/schedule.js +1 -1
  141. package/lib/aws/compute/security-group.js +1 -1
  142. package/lib/aws/compute/stage.js +2 -2
  143. package/lib/aws/compute/state-graph.js +1 -1
  144. package/lib/aws/compute/state-machine-fragment.js +1 -1
  145. package/lib/aws/compute/state-machine.js +4 -4
  146. package/lib/aws/compute/states/choice.js +1 -1
  147. package/lib/aws/compute/states/custom-state.js +1 -1
  148. package/lib/aws/compute/states/distributed-map/item-batcher.js +1 -1
  149. package/lib/aws/compute/states/distributed-map/item-reader.js +5 -5
  150. package/lib/aws/compute/states/distributed-map/result-writer.js +1 -1
  151. package/lib/aws/compute/states/distributed-map.js +1 -1
  152. package/lib/aws/compute/states/fail.js +1 -1
  153. package/lib/aws/compute/states/map-base.js +1 -1
  154. package/lib/aws/compute/states/map.js +1 -1
  155. package/lib/aws/compute/states/parallel.js +1 -1
  156. package/lib/aws/compute/states/pass.js +2 -2
  157. package/lib/aws/compute/states/state.js +1 -1
  158. package/lib/aws/compute/states/succeed.js +1 -1
  159. package/lib/aws/compute/states/task-base.js +2 -2
  160. package/lib/aws/compute/states/task.js +1 -1
  161. package/lib/aws/compute/states/wait.js +2 -2
  162. package/lib/aws/compute/step-scaling-action.js +1 -1
  163. package/lib/aws/compute/step-scaling-policy.js +1 -1
  164. package/lib/aws/compute/stepfunctions-api.js +1 -1
  165. package/lib/aws/compute/subnet-v2.js +2 -2
  166. package/lib/aws/compute/subnet.js +1 -1
  167. package/lib/aws/compute/target-tracking-scaling-policy.js +1 -1
  168. package/lib/aws/compute/task-credentials.js +1 -1
  169. package/lib/aws/compute/task-input.js +1 -1
  170. package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +1 -1
  171. package/lib/aws/compute/tasks/eventbridge/put-events.js +1 -1
  172. package/lib/aws/compute/tasks/http/invoke.js +1 -1
  173. package/lib/aws/compute/tasks/lambda/invoke.js +1 -1
  174. package/lib/aws/compute/tasks/sqs/send-message.js +1 -1
  175. package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +1 -1
  176. package/lib/aws/compute/tasks/stepfunctions/start-execution.js +1 -1
  177. package/lib/aws/compute/types.js +1 -1
  178. package/lib/aws/compute/usage-plan.js +1 -1
  179. package/lib/aws/compute/user-data.js +3 -3
  180. package/lib/aws/compute/volume.js +2 -2
  181. package/lib/aws/compute/vpc-endpoint-service.js +1 -1
  182. package/lib/aws/compute/vpc-endpoint.js +6 -6
  183. package/lib/aws/compute/vpc-flow-logs.js +4 -4
  184. package/lib/aws/compute/vpc-link.js +1 -1
  185. package/lib/aws/compute/vpc-v2-base.js +1 -1
  186. package/lib/aws/compute/vpc-v2.js +2 -2
  187. package/lib/aws/compute/vpc.js +4 -4
  188. package/lib/aws/compute/vpn.js +3 -3
  189. package/lib/aws/edge/certificate.js +1 -1
  190. package/lib/aws/edge/distribution.js +3 -3
  191. package/lib/aws/edge/dns-alias-record-targets.js +3 -3
  192. package/lib/aws/edge/dns-record.js +13 -13
  193. package/lib/aws/edge/dns-zone.js +1 -1
  194. package/lib/aws/edge/function.js +2 -2
  195. package/lib/aws/edge/key-value-store.js +4 -4
  196. package/lib/aws/edge/origin.js +3 -3
  197. package/lib/aws/edge/response-headers-policy.js +1 -1
  198. package/lib/aws/encryption/alias.js +1 -1
  199. package/lib/aws/encryption/key.js +1 -1
  200. package/lib/aws/encryption/via-service-principal.js +1 -1
  201. package/lib/aws/iam/grant.js +2 -2
  202. package/lib/aws/iam/group.js +1 -1
  203. package/lib/aws/iam/instance-profile.js +1 -1
  204. package/lib/aws/iam/managed-policy.js +1 -1
  205. package/lib/aws/iam/oidc-provider.js +1 -1
  206. package/lib/aws/iam/policy-document.js +1 -1
  207. package/lib/aws/iam/policy-statement.js +1 -1
  208. package/lib/aws/iam/policy.js +1 -1
  209. package/lib/aws/iam/principals.js +20 -20
  210. package/lib/aws/iam/role.js +1 -1
  211. package/lib/aws/iam/saml-provider.js +2 -2
  212. package/lib/aws/iam/unknown-principal.js +1 -1
  213. package/lib/aws/iam/user.js +1 -1
  214. package/lib/aws/network/simple-ipv4-vpc.js +1 -1
  215. package/lib/aws/network/subnet-group.js +3 -3
  216. package/lib/aws/network/subnet.js +4 -4
  217. package/lib/aws/notify/archive.js +1 -1
  218. package/lib/aws/notify/connection.js +3 -3
  219. package/lib/aws/notify/event-bus.js +3 -3
  220. package/lib/aws/notify/event-pattern.js +1 -1
  221. package/lib/aws/notify/input.js +2 -2
  222. package/lib/aws/notify/kinesis-stream.js +1 -1
  223. package/lib/aws/notify/notification-rule.js +1 -1
  224. package/lib/aws/notify/policy.js +1 -1
  225. package/lib/aws/notify/queue-policy.js +1 -1
  226. package/lib/aws/notify/queue.js +1 -1
  227. package/lib/aws/notify/resource-policy.js +1 -1
  228. package/lib/aws/notify/rule.js +1 -1
  229. package/lib/aws/notify/schedule.js +1 -1
  230. package/lib/aws/notify/subscription-filter.js +1 -1
  231. package/lib/aws/notify/subscription.js +4 -4
  232. package/lib/aws/notify/subscriptions/email.js +1 -1
  233. package/lib/aws/notify/subscriptions/lambda.js +1 -1
  234. package/lib/aws/notify/subscriptions/sms.js +1 -1
  235. package/lib/aws/notify/subscriptions/sqs.js +1 -1
  236. package/lib/aws/notify/subscriptions/url.js +1 -1
  237. package/lib/aws/notify/targets/event-bus.js +1 -1
  238. package/lib/aws/notify/targets/function.js +1 -1
  239. package/lib/aws/notify/targets/log-group.js +2 -2
  240. package/lib/aws/notify/targets/sqs.js +1 -1
  241. package/lib/aws/notify/targets/state-machine.js +1 -1
  242. package/lib/aws/notify/topic-base.js +1 -1
  243. package/lib/aws/notify/topic.js +1 -1
  244. package/lib/aws/storage/assets/image-asset.js +3 -3
  245. package/lib/aws/storage/assets/s3.js +1 -1
  246. package/lib/aws/storage/auth-token.js +2 -2
  247. package/lib/aws/storage/billing.js +1 -1
  248. package/lib/aws/storage/bucket-notifications.js +1 -1
  249. package/lib/aws/storage/bucket-policy.js +1 -1
  250. package/lib/aws/storage/bucket-source.js +1 -1
  251. package/lib/aws/storage/bucket.js +2 -2
  252. package/lib/aws/storage/capacity.js +1 -1
  253. package/lib/aws/storage/ecr-repository.js +3 -3
  254. package/lib/aws/storage/encryption.js +1 -1
  255. package/lib/aws/storage/notification-targets/function.js +1 -1
  256. package/lib/aws/storage/notification-targets/queue.js +1 -1
  257. package/lib/aws/storage/origin-access-identity.js +1 -1
  258. package/lib/aws/storage/parameter.js +2 -2
  259. package/lib/aws/storage/table.js +3 -3
  260. package/lib/bundling.js +3 -3
  261. package/lib/construct-base.js +2 -2
  262. package/lib/duration.js +1 -1
  263. package/lib/expiration.js +1 -1
  264. package/lib/fs/ignore.js +4 -4
  265. package/lib/fs/index.js +1 -1
  266. package/lib/size.js +1 -1
  267. package/lib/stack-base.d.ts +10 -0
  268. package/lib/stack-base.js +9 -2
  269. package/lib/terra-func.js +1 -1
  270. package/lib/time-zone.js +1 -1
  271. package/package.json +3 -1
@@ -144,5 +144,5 @@ class FunctionUrl extends aws_construct_1.AwsConstructBase {
144
144
  }
145
145
  exports.FunctionUrl = FunctionUrl;
146
146
  _a = JSII_RTTI_SYMBOL_1;
147
- FunctionUrl[_a] = { fqn: "terraconstructs.aws.compute.FunctionUrl", version: "0.1.0" };
147
+ FunctionUrl[_a] = { fqn: "terraconstructs.aws.compute.FunctionUrl", version: "0.1.2" };
148
148
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24tdXJsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F3cy9jb21wdXRlL2Z1bmN0aW9uLXVybC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHNEQUF3RDtBQUV4RCxvREFBbUU7QUFJbkUsOEJBQThCO0FBRTlCOztHQUVHO0FBQ0gsSUFBWSxtQkFVWDtBQVZELFdBQVksbUJBQW1CO0lBQzdCOztPQUVHO0lBQ0gsMENBQW1CLENBQUE7SUFFbkI7O09BRUc7SUFDSCxvQ0FBYSxDQUFBO0FBQ2YsQ0FBQyxFQVZXLG1CQUFtQixtQ0FBbkIsbUJBQW1CLFFBVTlCO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLFVBY1g7QUFkRCxXQUFZLFVBQVU7SUFDcEI7Ozs7T0FJRztJQUNILG1DQUFxQixDQUFBO0lBRXJCOzs7O09BSUc7SUFDSCxpREFBbUMsQ0FBQTtBQUNyQyxDQUFDLEVBZFcsVUFBVSwwQkFBVixVQUFVLFFBY3JCO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLFVBaUNYO0FBakNELFdBQVksVUFBVTtJQUNwQjs7T0FFRztJQUNILHlCQUFXLENBQUE7SUFDWDs7T0FFRztJQUNILHlCQUFXLENBQUE7SUFDWDs7T0FFRztJQUNILDJCQUFhLENBQUE7SUFDYjs7T0FFRztJQUNILDJCQUFhLENBQUE7SUFDYjs7T0FFRztJQUNILCtCQUFpQixDQUFBO0lBQ2pCOztPQUVHO0lBQ0gsNkJBQWUsQ0FBQTtJQUNmOztPQUVHO0lBQ0gsaUNBQW1CLENBQUE7SUFDbkI7O09BRUc7SUFDSCx1QkFBUyxDQUFBO0FBQ1gsQ0FBQyxFQWpDVyxVQUFVLDBCQUFWLFVBQVUsUUFpQ3JCO0FBZ0lEOzs7O0dBSUc7QUFDSCxNQUFhLFdBQVksU0FBUSxnQ0FBZ0I7SUFFL0MsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQ2pDLENBQUM7SUFtQkQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF1QjtRQUMvRCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLCtGQUErRjtRQUMvRiwwQ0FBMEM7UUFDMUMsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7WUFDcEUsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFO1lBQ2xFLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQztRQUV6RCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLElBQUksbUJBQW1CLENBQUMsT0FBTyxDQUFDO1FBRTlELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxnQ0FBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQ3hFLGlCQUFpQixFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ2hDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUMxRCxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7WUFDNUIsWUFBWSxFQUFFLGNBQWMsQ0FBQyxXQUFXLEVBQUUsNENBQTRDO1lBQ3RGLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUztTQUM1QixDQUFDLENBQUM7UUFDSCw0RkFBNEY7UUFDNUYsMkZBQTJGO1FBQzNGLElBQUksS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUVELElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUM3QyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFFL0IsSUFBSSxLQUFLLENBQUMsUUFBUSxLQUFLLG1CQUFtQixDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2hELEtBQUssQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFO2dCQUNsRCxTQUFTLEVBQUUsSUFBSSxHQUFHLENBQUMsWUFBWSxFQUFFO2dCQUNqQyxNQUFNLEVBQUUsMEJBQTBCO2dCQUNsQyxtQkFBbUIsRUFBRSxLQUFLLENBQUMsUUFBUTthQUNwQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGtCQUFrQixHQUFHO1lBQ3hCLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztZQUNiLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztTQUM5QixDQUFDO0lBQ0osQ0FBQztJQUVNLGNBQWMsQ0FBQyxPQUF1QjtRQUMzQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFTyxlQUFlLENBQUMsRUFBYTtRQUNuQyxPQUFPLFdBQVcsSUFBSSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVPLFVBQVUsQ0FDaEIsSUFBNEI7UUFFNUIsSUFDRSxJQUFJLENBQUMsTUFBTTtZQUNYLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUU7WUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsR0FBRyxLQUFLLEVBQy9CLENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUNiLDJFQUEyRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQ3RHLENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTztZQUNMLGdCQUFnQixFQUFFLElBQUksQ0FBQyxnQkFBZ0I7WUFDdkMsWUFBWSxFQUFFLElBQUksQ0FBQyxjQUFjO1lBQ2pDLFlBQVksRUFBRSxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztZQUNyRCxZQUFZLEVBQUUsSUFBSSxDQUFDLGNBQWM7WUFDakMsYUFBYSxFQUFFLElBQUksQ0FBQyxjQUFjO1lBQ2xDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRTtTQUNqQyxDQUFDO0lBQ0osQ0FBQzs7QUE3Rkgsa0NBOEZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbGFtYmRhRnVuY3Rpb25VcmwgfSBmcm9tIFwiQGNka3RmL3Byb3ZpZGVyLWF3c1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IElBd3NDb25zdHJ1Y3QsIEF3c0NvbnN0cnVjdEJhc2UgfSBmcm9tIFwiLi4vYXdzLWNvbnN0cnVjdFwiO1xuaW1wb3J0IHsgSUFsaWFzIH0gZnJvbSBcIi4vZnVuY3Rpb24tYWxpYXNcIjtcbmltcG9ydCB7IElGdW5jdGlvbiB9IGZyb20gXCIuL2Z1bmN0aW9uLWJhc2VcIjtcbmltcG9ydCB7IER1cmF0aW9uIH0gZnJvbSBcIi4uLy4uL2R1cmF0aW9uXCI7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSBcIi4uL2lhbVwiO1xuXG4vKipcbiAqIFRoZSBhdXRoIHR5cGVzIGZvciBhIGZ1bmN0aW9uIHVybFxuICovXG5leHBvcnQgZW51bSBGdW5jdGlvblVybEF1dGhUeXBlIHtcbiAgLyoqXG4gICAqIFJlc3RyaWN0IGFjY2VzcyB0byBhdXRoZW50aWNhdGVkIElBTSB1c2VycyBvbmx5XG4gICAqL1xuICBBV1NfSUFNID0gXCJBV1NfSUFNXCIsXG5cbiAgLyoqXG4gICAqIEJ5cGFzcyBJQU0gYXV0aGVudGljYXRpb24gdG8gY3JlYXRlIGEgcHVibGljIGVuZHBvaW50XG4gICAqL1xuICBOT05FID0gXCJOT05FXCIsXG59XG5cbi8qKlxuICogVGhlIGludm9rZSBtb2RlcyBmb3IgYSBMYW1iZGEgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGVudW0gSW52b2tlTW9kZSB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IG9wdGlvbi4gTGFtYmRhIGludm9rZXMgeW91ciBmdW5jdGlvbiB1c2luZyB0aGUgSW52b2tlIEFQSSBvcGVyYXRpb24uXG4gICAqIEludm9jYXRpb24gcmVzdWx0cyBhcmUgYXZhaWxhYmxlIHdoZW4gdGhlIHBheWxvYWQgaXMgY29tcGxldGUuXG4gICAqIFRoZSBtYXhpbXVtIHBheWxvYWQgc2l6ZSBpcyA2IE1CLlxuICAgKi9cbiAgQlVGRkVSRUQgPSBcIkJVRkZFUkVEXCIsXG5cbiAgLyoqXG4gICAqIFlvdXIgZnVuY3Rpb24gc3RyZWFtcyBwYXlsb2FkIHJlc3VsdHMgYXMgdGhleSBiZWNvbWUgYXZhaWxhYmxlLlxuICAgKiBMYW1iZGEgaW52b2tlcyB5b3VyIGZ1bmN0aW9uIHVzaW5nIHRoZSBJbnZva2VXaXRoUmVzcG9uc2VTdHJlYW0gQVBJIG9wZXJhdGlvbi5cbiAgICogVGhlIG1heGltdW0gcmVzcG9uc2UgcGF5bG9hZCBzaXplIGlzIDIwIE1CLCBob3dldmVyLCB5b3UgY2FuIHJlcXVlc3QgYSBxdW90YSBpbmNyZWFzZS5cbiAgICovXG4gIFJFU1BPTlNFX1NUUkVBTSA9IFwiUkVTUE9OU0VfU1RSRUFNXCIsXG59XG5cbi8qKlxuICogQWxsIGh0dHAgcmVxdWVzdCBtZXRob2RzXG4gKi9cbmV4cG9ydCBlbnVtIEh0dHBNZXRob2Qge1xuICAvKipcbiAgICogVGhlIEdFVCBtZXRob2QgcmVxdWVzdHMgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICAgKi9cbiAgR0VUID0gXCJHRVRcIixcbiAgLyoqXG4gICAqIFRoZSBQVVQgbWV0aG9kIHJlcGxhY2VzIGFsbCBjdXJyZW50IHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgdGFyZ2V0IHJlc291cmNlIHdpdGggdGhlIHJlcXVlc3QgcGF5bG9hZC5cbiAgICovXG4gIFBVVCA9IFwiUFVUXCIsXG4gIC8qKlxuICAgKiBUaGUgSEVBRCBtZXRob2QgYXNrcyBmb3IgYSByZXNwb25zZSBpZGVudGljYWwgdG8gdGhhdCBvZiBhIEdFVCByZXF1ZXN0LCBidXQgd2l0aG91dCB0aGUgcmVzcG9uc2UgYm9keS5cbiAgICovXG4gIEhFQUQgPSBcIkhFQURcIixcbiAgLyoqXG4gICAqIFRoZSBQT1NUIG1ldGhvZCBpcyB1c2VkIHRvIHN1Ym1pdCBhbiBlbnRpdHkgdG8gdGhlIHNwZWNpZmllZCByZXNvdXJjZSwgb2Z0ZW4gY2F1c2luZyBhIGNoYW5nZSBpbiBzdGF0ZSBvciBzaWRlIGVmZmVjdHMgb24gdGhlIHNlcnZlci5cbiAgICovXG4gIFBPU1QgPSBcIlBPU1RcIixcbiAgLyoqXG4gICAqIFRoZSBERUxFVEUgbWV0aG9kIGRlbGV0ZXMgdGhlIHNwZWNpZmllZCByZXNvdXJjZS5cbiAgICovXG4gIERFTEVURSA9IFwiREVMRVRFXCIsXG4gIC8qKlxuICAgKiBUaGUgUEFUQ0ggbWV0aG9kIGFwcGxpZXMgcGFydGlhbCBtb2RpZmljYXRpb25zIHRvIGEgcmVzb3VyY2UuXG4gICAqL1xuICBQQVRDSCA9IFwiUEFUQ0hcIixcbiAgLyoqXG4gICAqIFRoZSBPUFRJT05TIG1ldGhvZCBkZXNjcmliZXMgdGhlIGNvbW11bmljYXRpb24gb3B0aW9ucyBmb3IgdGhlIHRhcmdldCByZXNvdXJjZS5cbiAgICovXG4gIE9QVElPTlMgPSBcIk9QVElPTlNcIixcbiAgLyoqXG4gICAqIFRoZSB3aWxkY2FyZCBlbnRyeSB0byBhbGxvdyBhbGwgbWV0aG9kcy5cbiAgICovXG4gIEFMTCA9IFwiKlwiLFxufVxuXG4vKipcbiAqIFNwZWNpZmllcyBhIGNyb3NzLW9yaWdpbiBhY2Nlc3MgcHJvcGVydHkgZm9yIGEgZnVuY3Rpb24gVVJMXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb25VcmxDb3JzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IGNvb2tpZXMgb3Igb3RoZXIgY3JlZGVudGlhbHMgaW4gcmVxdWVzdHMgdG8geW91ciBmdW5jdGlvbiBVUkwuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBhbGxvd0NyZWRlbnRpYWxzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSGVhZGVycyB0aGF0IGFyZSBzcGVjaWZpZWQgaW4gdGhlIEFjY2Vzcy1Db250cm9sLVJlcXVlc3QtSGVhZGVycyBoZWFkZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gaGVhZGVycyBhbGxvd2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dlZEhlYWRlcnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQW4gSFRUUCBtZXRob2QgdGhhdCB5b3UgYWxsb3cgdGhlIG9yaWdpbiB0byBleGVjdXRlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFtIdHRwTWV0aG9kLkFMTF1cbiAgICovXG4gIHJlYWRvbmx5IGFsbG93ZWRNZXRob2RzPzogSHR0cE1ldGhvZFtdO1xuXG4gIC8qKlxuICAgKiBPbmUgb3IgbW9yZSBvcmlnaW5zIHlvdSB3YW50IGN1c3RvbWVycyB0byBiZSBhYmxlIHRvIGFjY2VzcyB0aGUgYnVja2V0IGZyb20uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gb3JpZ2lucyBhbGxvd2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dlZE9yaWdpbnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogT25lIG9yIG1vcmUgaGVhZGVycyBpbiB0aGUgcmVzcG9uc2UgdGhhdCB5b3Ugd2FudCBjdXN0b21lcnMgdG8gYmUgYWJsZSB0byBhY2Nlc3MgZnJvbSB0aGVpciBhcHBsaWNhdGlvbnMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gaGVhZGVycyBleHBvc2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgZXhwb3NlZEhlYWRlcnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIHRpbWUgaW4gc2Vjb25kcyB0aGF0IHlvdXIgYnJvd3NlciBpcyB0byBjYWNoZSB0aGUgcHJlZmxpZ2h0IHJlc3BvbnNlIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEJyb3dzZXIgZGVmYXVsdCBvZiA1IHNlY29uZHMuXG4gICAqL1xuICByZWFkb25seSBtYXhBZ2U/OiBEdXJhdGlvbjtcbn1cblxuLyoqXG4gKiBPdXRwdXRzIHRoYXQgY2FuIGJlIGV4cG9zZWQgdGhyb3VnaCB0aGUgZ3JpZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uVXJsT3V0cHV0cyB7XG4gIC8qKlxuICAgKiBUaGUgdXJsIG9mIHRoZSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgZnVuY3Rpb24gdGhpcyBVUkwgcmVmZXJzIHRvXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbkFybjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgTGFtYmRhIGZ1bmN0aW9uIFVybFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElGdW5jdGlvblVybCBleHRlbmRzIElBd3NDb25zdHJ1Y3Qge1xuICAvKiogc3Ryb25nbHkgdHlwZWQgRnVuY3Rpb25VcmxPdXRwdXRzICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uVXJsT3V0cHV0czogRnVuY3Rpb25VcmxPdXRwdXRzO1xuXG4gIC8qKlxuICAgKiBUaGUgdXJsIG9mIHRoZSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBhdHRyaWJ1dGUgRnVuY3Rpb25VcmxcbiAgICovXG4gIHJlYWRvbmx5IHVybDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBmdW5jdGlvbiB0aGlzIFVSTCByZWZlcnMgdG9cbiAgICpcbiAgICogQGF0dHJpYnV0ZSBGdW5jdGlvbkFyblxuICAgKi9cbiAgcmVhZG9ubHkgZnVuY3Rpb25Bcm46IHN0cmluZztcblxuICAvKipcbiAgICogR3JhbnQgdGhlIGdpdmVuIGlkZW50aXR5IHBlcm1pc3Npb25zIHRvIGludm9rZSB0aGlzIExhbWJkYSBGdW5jdGlvbiBVUkxcbiAgICovXG4gIGdyYW50SW52b2tlVXJsKGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIHRvIGFkZCBhIHVybCB0byBhIExhbWJkYSBmdW5jdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uVXJsT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBhdXRoZW50aWNhdGlvbiB0aGF0IHlvdXIgZnVuY3Rpb24gVVJMIHVzZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IEZ1bmN0aW9uVXJsQXV0aFR5cGUuQVdTX0lBTVxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aFR5cGU/OiBGdW5jdGlvblVybEF1dGhUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgY3Jvc3Mtb3JpZ2luIHJlc291cmNlIHNoYXJpbmcgKENPUlMpIHNldHRpbmdzIGZvciB5b3VyIGZ1bmN0aW9uIFVSTC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBDT1JTIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBjb3JzPzogRnVuY3Rpb25VcmxDb3JzT3B0aW9ucztcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgaW52b2NhdGlvbiBtb2RlIHRoYXQgeW91ciBMYW1iZGEgZnVuY3Rpb24gdXNlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgSW52b2tlTW9kZS5CVUZGRVJFRFxuICAgKi9cbiAgcmVhZG9ubHkgaW52b2tlTW9kZT86IEludm9rZU1vZGU7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYSBGdW5jdGlvblVybFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uVXJsUHJvcHMgZXh0ZW5kcyBGdW5jdGlvblVybE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRvIHdoaWNoIHRoaXMgdXJsIHJlZmVycy5cbiAgICogSXQgY2FuIGFsc28gYmUgYW4gYEFsaWFzYCBidXQgbm90IGEgYFZlcnNpb25gLlxuICAgKi9cbiAgcmVhZG9ubHkgZnVuY3Rpb246IElGdW5jdGlvbjtcbn1cblxuLyoqXG4gKiBEZWZpbmVzIGEgTGFtYmRhIGZ1bmN0aW9uIHVybFxuICpcbiAqIEByZXNvdXJjZSBhd3NfbGFtYmRhX2Z1bmN0aW9uX3VybFxuICovXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25VcmwgZXh0ZW5kcyBBd3NDb25zdHJ1Y3RCYXNlIGltcGxlbWVudHMgSUZ1bmN0aW9uVXJsIHtcbiAgcHVibGljIHJlYWRvbmx5IGZ1bmN0aW9uVXJsT3V0cHV0czogRnVuY3Rpb25VcmxPdXRwdXRzO1xuICBwdWJsaWMgZ2V0IG91dHB1dHMoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZnVuY3Rpb25VcmxPdXRwdXRzO1xuICB9XG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZTogbGFtYmRhRnVuY3Rpb25VcmwuTGFtYmRhRnVuY3Rpb25Vcmw7XG4gIC8qKlxuICAgKiBUaGUgdXJsIG9mIHRoZSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIGZ1bmN0aW9uIHRoaXMgVVJMIHJlZmVycyB0b1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGZ1bmN0aW9uQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBhdXRoZW50aWNhdGlvbiB0eXBlIHVzZWQgZm9yIHRoaXMgRnVuY3Rpb24gVVJMXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXV0aFR5cGU6IEZ1bmN0aW9uVXJsQXV0aFR5cGU7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBmdW5jdGlvbjogSUZ1bmN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBGdW5jdGlvblVybFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIC8vIElmIHRoZSB0YXJnZXQgZnVuY3Rpb24gaXMgYW4gYWxpYXMsIHRoZW4gaXQgbXVzdCBiZSBjb25maWd1cmVkIHVzaW5nIHRoZSB1bmRlcmx5aW5nIGZ1bmN0aW9uXG4gICAgLy8gQVJOLCBhbmQgdGhlIGFsaWFzIG5hbWUgYXMgYSBxdWFsaWZpZXIuXG4gICAgY29uc3QgeyB0YXJnZXRGdW5jdGlvbiwgYWxpYXMgfSA9IHRoaXMuaW5zdGFuY2VPZkFsaWFzKHByb3BzLmZ1bmN0aW9uKVxuICAgICAgPyB7IHRhcmdldEZ1bmN0aW9uOiBwcm9wcy5mdW5jdGlvbi5sYW1iZGEsIGFsaWFzOiBwcm9wcy5mdW5jdGlvbiB9XG4gICAgICA6IHsgdGFyZ2V0RnVuY3Rpb246IHByb3BzLmZ1bmN0aW9uLCBhbGlhczogdW5kZWZpbmVkIH07XG5cbiAgICB0aGlzLmF1dGhUeXBlID0gcHJvcHMuYXV0aFR5cGUgPz8gRnVuY3Rpb25VcmxBdXRoVHlwZS5BV1NfSUFNO1xuXG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyBsYW1iZGFGdW5jdGlvblVybC5MYW1iZGFGdW5jdGlvblVybCh0aGlzLCBcIlJlc291cmNlXCIsIHtcbiAgICAgIGF1dGhvcml6YXRpb25UeXBlOiB0aGlzLmF1dGhUeXBlLFxuICAgICAgY29yczogcHJvcHMuY29ycyA/IHRoaXMucmVuZGVyQ29ycyhwcm9wcy5jb3JzKSA6IHVuZGVmaW5lZCxcbiAgICAgIGludm9rZU1vZGU6IHByb3BzLmludm9rZU1vZGUsXG4gICAgICBmdW5jdGlvbk5hbWU6IHRhcmdldEZ1bmN0aW9uLmZ1bmN0aW9uQXJuLCAvLyBUaGUgbmFtZSAob3IgQVJOKSBvZiB0aGUgTGFtYmRhIGZ1bmN0aW9uLlxuICAgICAgcXVhbGlmaWVyOiBhbGlhcz8uYWxpYXNOYW1lLFxuICAgIH0pO1xuICAgIC8vIFRoZSBhbGlhc05hbWUgaXMgYSByZXF1aXJlZCBwaHlzaWNhbCBuYW1lLCBzbyB1c2luZyBpdCBkb2VzIG5vdCBpbXBseSBhIGRlcGVuZGVuY3ksIHNvIHdlXG4gICAgLy8gbXVzdCBcIm1hbnVhbGx5XCIgcmVnaXN0ZXIgdGhlIGRlcGVuZGVuY3ksIG9yIGVsc2UgVEYgbWF5IGF0dGVtcHQgdG8gdXNlIGJlZm9yZSBpdCBleGlzdHMuXG4gICAgaWYgKGFsaWFzPy5ub2RlLmRlZmF1bHRDaGlsZCAhPSBudWxsKSB7XG4gICAgICB0aGlzLnJlc291cmNlLm5vZGUuYWRkRGVwZW5kZW5jeShhbGlhcy5ub2RlLmRlZmF1bHRDaGlsZCk7XG4gICAgfVxuXG4gICAgdGhpcy51cmwgPSB0aGlzLnJlc291cmNlLmZ1bmN0aW9uVXJsO1xuICAgIHRoaXMuZnVuY3Rpb25Bcm4gPSB0aGlzLnJlc291cmNlLmZ1bmN0aW9uQXJuO1xuICAgIHRoaXMuZnVuY3Rpb24gPSBwcm9wcy5mdW5jdGlvbjtcblxuICAgIGlmIChwcm9wcy5hdXRoVHlwZSA9PT0gRnVuY3Rpb25VcmxBdXRoVHlwZS5OT05FKSB7XG4gICAgICBwcm9wcy5mdW5jdGlvbi5hZGRQZXJtaXNzaW9uKFwiaW52b2tlLWZ1bmN0aW9uLXVybFwiLCB7XG4gICAgICAgIHByaW5jaXBhbDogbmV3IGlhbS5BbnlQcmluY2lwYWwoKSxcbiAgICAgICAgYWN0aW9uOiBcImxhbWJkYTpJbnZva2VGdW5jdGlvblVybFwiLFxuICAgICAgICBmdW5jdGlvblVybEF1dGhUeXBlOiBwcm9wcy5hdXRoVHlwZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmZ1bmN0aW9uVXJsT3V0cHV0cyA9IHtcbiAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICBmdW5jdGlvbkFybjogdGhpcy5mdW5jdGlvbkFybixcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGdyYW50SW52b2tlVXJsKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5mdW5jdGlvbi5ncmFudEludm9rZVVybChncmFudGVlKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5zdGFuY2VPZkFsaWFzKGZuOiBJRnVuY3Rpb24pOiBmbiBpcyBJQWxpYXMge1xuICAgIHJldHVybiBcImFsaWFzTmFtZVwiIGluIGZuO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJDb3JzKFxuICAgIGNvcnM6IEZ1bmN0aW9uVXJsQ29yc09wdGlvbnMsXG4gICk6IGxhbWJkYUZ1bmN0aW9uVXJsLkxhbWJkYUZ1bmN0aW9uVXJsQ29ycyB7XG4gICAgaWYgKFxuICAgICAgY29ycy5tYXhBZ2UgJiZcbiAgICAgICFjb3JzLm1heEFnZS5pc1VucmVzb2x2ZWQoKSAmJlxuICAgICAgY29ycy5tYXhBZ2UudG9TZWNvbmRzKCkgPiA4NjQwMFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRnVuY3Rpb25VcmwgQ09SUyBtYXhBZ2Ugc2hvdWxkIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byA4NjQwMCBzZWNzIChnb3QgJHtjb3JzLm1heEFnZS50b1NlY29uZHMoKX0pYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFsbG93Q3JlZGVudGlhbHM6IGNvcnMuYWxsb3dDcmVkZW50aWFscyxcbiAgICAgIGFsbG93SGVhZGVyczogY29ycy5hbGxvd2VkSGVhZGVycyxcbiAgICAgIGFsbG93TWV0aG9kczogY29ycy5hbGxvd2VkTWV0aG9kcyA/PyBbSHR0cE1ldGhvZC5BTExdLFxuICAgICAgYWxsb3dPcmlnaW5zOiBjb3JzLmFsbG93ZWRPcmlnaW5zLFxuICAgICAgZXhwb3NlSGVhZGVyczogY29ycy5leHBvc2VkSGVhZGVycyxcbiAgICAgIG1heEFnZTogY29ycy5tYXhBZ2U/LnRvU2Vjb25kcygpLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
@@ -302,9 +302,17 @@ export declare class LambdaFunction extends LambdaFunctionBase implements IFunct
302
302
  */
303
303
  get functionQualifiedArn(): string;
304
304
  /**
305
- * The ARN fo the function.
305
+ * The Fully Qualified Invoke ARN fo the function to be used from API Gateway.
306
+ *
307
+ * NOTE: This does not seem to work with Authorizers
306
308
  */
307
309
  get functionQualifiedInvokeArn(): string;
310
+ /**
311
+ * The Invoke ARN fo the function to be used from API Gateway.
312
+ *
313
+ * NOTE: Use this for Authorizers
314
+ */
315
+ get functionInvokeArn(): string;
308
316
  /**
309
317
  * The architecture of this Lambda Function.
310
318
  */
@@ -95,6 +95,10 @@ class LambdaFunction extends function_base_1.LambdaFunctionBase {
95
95
  const { region, partition } = arn_1.Arn.split(functionArn, arn_1.ArnFormat.COLON_RESOURCE_NAME);
96
96
  return `arn:${partition}:apigateway:${region}:lambda:path/2015-03-31/functions/${functionArn}/invocations`;
97
97
  }
98
+ get functionInvokeArn() {
99
+ const { region, partition } = arn_1.Arn.split(functionArn, arn_1.ArnFormat.COLON_RESOURCE_NAME);
100
+ return `arn:${partition}:apigateway:${region}:lambda:path/2015-03-31/functions/${functionArn}/invocations`;
101
+ }
98
102
  /**
99
103
  * The version of the Lambda function returned.
100
104
  *
@@ -169,11 +173,21 @@ class LambdaFunction extends function_base_1.LambdaFunctionBase {
169
173
  return this.resource.qualifiedArn;
170
174
  }
171
175
  /**
172
- * The ARN fo the function.
176
+ * The Fully Qualified Invoke ARN fo the function to be used from API Gateway.
177
+ *
178
+ * NOTE: This does not seem to work with Authorizers
173
179
  */
174
180
  get functionQualifiedInvokeArn() {
175
181
  return this.resource.qualifiedInvokeArn;
176
182
  }
183
+ /**
184
+ * The Invoke ARN fo the function to be used from API Gateway.
185
+ *
186
+ * NOTE: Use this for Authorizers
187
+ */
188
+ get functionInvokeArn() {
189
+ return this.resource.invokeArn;
190
+ }
177
191
  // // Teraform provider for AWS Automatically manages Function Versioning through code hash..
178
192
  // // need to drop most of this version logic..
179
193
  // private readonly currentVersionOptions?: VersionOptions;
@@ -623,7 +637,7 @@ class LambdaFunction extends function_base_1.LambdaFunctionBase {
623
637
  }
624
638
  exports.LambdaFunction = LambdaFunction;
625
639
  _a = JSII_RTTI_SYMBOL_1;
626
- LambdaFunction[_a] = { fqn: "terraconstructs.aws.compute.LambdaFunction", version: "0.1.0" };
640
+ LambdaFunction[_a] = { fqn: "terraconstructs.aws.compute.LambdaFunction", version: "0.1.2" };
627
641
  /**
628
642
  * Given an opaque (token) ARN, returns a TF expression that extracts the function
629
643
  * name from the ARN.
@@ -763,4 +777,4 @@ function undefinedIfNoKeys(struct) {
763
777
  const allUndefined = Object.values(struct).every((val) => val === undefined);
764
778
  return allUndefined ? undefined : struct;
765
779
  }
766
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXdzL2NvbXB1dGUvZnVuY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQW9zQ0EsNENBOEJDOztBQWx1Q0QsNkpBQTZKO0FBQzdKLDJIQUEySDtBQUMzSCxzREFNNkI7QUFDN0IsaUNBQWtFO0FBRWxFLGdDQUF3QztBQUN4Qyw0Q0FBd0M7QUFDeEMsb0RBQWlEO0FBQ2pELGlEQUE4QztBQUs5QyxtREFLeUI7QUFHekIsdUNBQW9DO0FBQ3BDLGlDQUFrQztBQUNsQyw2Q0FBMEM7QUFDMUMseUNBQXlDO0FBQ3pDLDhCQUE4QjtBQUM5QixzQ0FBMEM7QUFDMUMsdUNBQW9DO0FBa1FwQywyQkFBMkI7QUFFM0IsTUFBTTtBQUNOLHdCQUF3QjtBQUN4QixNQUFNO0FBQ04scUVBQXFFO0FBRXJFLFFBQVE7QUFDUixxREFBcUQ7QUFDckQsUUFBUTtBQUNSLDJEQUEyRDtBQUMzRCxJQUFJO0FBRUo7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBYSxjQUFlLFNBQVEsa0NBQWtCO0lBQ3BELDZEQUE2RDtJQUU3RDs7T0FFRztJQUNILElBQVcsT0FBTztRQUNoQiwyQ0FBMkM7UUFDM0MsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsZ0JBQWdCLENBQzVCLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixZQUFvQjtRQUVwQixPQUFPLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ3RELFdBQVcsRUFBRSxvQkFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQ3BELE9BQU8sRUFBRSxRQUFRO2dCQUNqQixRQUFRLEVBQUUsVUFBVTtnQkFDcEIsWUFBWSxFQUFFLFlBQVk7Z0JBQzFCLFNBQVMsRUFBRSxlQUFTLENBQUMsbUJB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QUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQztJQUM3RSxPQUFPLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDM0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIHNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2Nka3RmLXBsdXMvY2RrdGYtcGx1cy9ibG9iLzU4NmFhYmFkM2FiMmZiMmEyZTkzZTA1ZWQzM2Y5NDQ3NGViZTkzOTcvcGFja2FnZXMvJTQwY2RrdGYtcGx1cy9hd3MvbGliL2F3cy1sYW1iZGEtZnVuY3Rpb24vaW5kZXgudHNcbi8vIHVwZGF0ZSB0byBhbGlnbiBjbG9zZXIgd2l0aCBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNTYuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtbGFtYmRhL2xpYi9mdW5jdGlvbi50c1xuaW1wb3J0IHtcbiAgbGFtYmRhRnVuY3Rpb24sXG4gIGNsb3Vkd2F0Y2hMb2dHcm91cCxcbiAgc2VjdXJpdHlHcm91cCxcbiAgbGFtYmRhRXZlbnRTb3VyY2VNYXBwaW5nLFxuICBkYXRhQXdzTGFtYmRhRnVuY3Rpb24sXG59IGZyb20gXCJAY2RrdGYvcHJvdmlkZXItYXdzXCI7XG5pbXBvcnQgeyBJUmVzb2x2ZUNvbnRleHQsIExhenksIElSZXNvbHZhYmxlLCBUb2tlbiB9IGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IEFybkZvcm1hdCwgQXJuIH0gZnJvbSBcIi4uL2FyblwiO1xuaW1wb3J0IHsgQXdzU3RhY2sgfSBmcm9tIFwiLi4vYXdzLXN0YWNrXCI7XG5pbXBvcnQgeyBSZXRlbnRpb25EYXlzIH0gZnJvbSBcIi4uL2xvZy1yZXRlbnRpb25cIjtcbmltcG9ydCB7IEFyY2hpdGVjdHVyZSB9IGZyb20gXCIuL2FyY2hpdGVjdHVyZVwiO1xuaW1wb3J0IHsgQ29kZSwgQ29kZUNvbmZpZyB9IGZyb20gXCIuL2NvZGVcIjtcbmltcG9ydCB7IEV2ZW50SW52b2tlQ29uZmlnT3B0aW9ucyB9IGZyb20gXCIuL2V2ZW50LWludm9rZS1jb25maWdcIjtcbmltcG9ydCB7IElFdmVudFNvdXJjZU1hcHBpbmcgfSBmcm9tIFwiLi9ldmVudC1zb3VyY2UtbWFwcGluZ1wiO1xuaW1wb3J0IHsgQWxpYXNPcHRpb25zLCBBbGlhcyB9IGZyb20gXCIuL2Z1bmN0aW9uLWFsaWFzXCI7XG5pbXBvcnQge1xuICBMYW1iZGFGdW5jdGlvbkJhc2UsXG4gIElGdW5jdGlvbixcbiAgRnVuY3Rpb25BdHRyaWJ1dGVzLFxuICBJRXZlbnRTb3VyY2UsXG59IGZyb20gXCIuL2Z1bmN0aW9uLWJhc2VcIjtcbmltcG9ydCB7IEZ1bmN0aW9uVXJsLCBGdW5jdGlvblVybE9wdGlvbnMgfSBmcm9tIFwiLi9mdW5jdGlvbi11cmxcIjtcbmltcG9ydCB7IFZwY0NvbmZpZyB9IGZyb20gXCIuL2Z1bmN0aW9uLXZwYy1jb25maWcuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBIYW5kbGVyIH0gZnJvbSBcIi4vaGFuZGxlclwiO1xuaW1wb3J0IHsgYWRkQWxpYXMgfSBmcm9tIFwiLi91dGlsXCI7XG5pbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gXCIuLi8uLi9kdXJhdGlvblwiO1xuLy8gaW1wb3J0IHsgRm4gfSBmcm9tIFwiLi4vLi4vdGVycmEtZnVuY1wiO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gXCIuLi9pYW1cIjtcbmltcG9ydCB7IElRdWV1ZSwgUXVldWUgfSBmcm9tIFwiLi4vbm90aWZ5XCI7XG5pbXBvcnQgeyBSdW50aW1lIH0gZnJvbSBcIi4vcnVudGltZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uT3V0cHV0cyB7XG4gIC8qKlxuICAgKiBBV1MgTGFtYmRhIGZ1bmN0aW9uIG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQVdTIExhbWJkYSBhcm4gb2YgdGhlIGZ1bmN0aW9uXG4gICAqL1xuICByZWFkb25seSBhcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElBTSBSb2xlIGFzc29jaWF0ZWQgd2l0aCB0aGUgTGFtYmRhIGZ1bmN0aW9uXG4gICAqL1xuICByZWFkb25seSByb2xlQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIFVSTCBpZiBlbmFibGVkXG4gICAqL1xuICByZWFkb25seSB1cmw/OiBzdHJpbmcgfCBJUmVzb2x2YWJsZTtcblxuICAvKipcbiAgICogU2VjdXJpdHkgZ3JvdXAgb2YgdGhlIGZ1bmN0aW9uIGlmIGNyZWF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRTZWN1cml0eUdyb3VwPzogc3RyaW5nIHwgSVJlc29sdmFibGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb25PcHRpb25zIGV4dGVuZHMgRXZlbnRJbnZva2VDb25maWdPcHRpb25zIHtcbiAgLyoqXG4gICAqIEZvcmNlIGZ1bmN0aW9uIG5hbWUgKGZvciBhZG9wdGlvbiBvZiBleGlzdGluZyByZXNvdXJjZXMpLlxuICAgKlxuICAgKiBQcmVmZXIgdG8gdXNlIGZ1bmN0aW9uTmFtZVByZWZpeC5cbiAgICpcbiAgICogVXNlIFtUZXJyYWZvcm0gUmVzb3VyY2UgTWV0YSBBcmd1bWVudHNdKGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL3Jlc291cmNlcy9zeW50YXgjbWV0YS1hcmd1bWVudHMpXG4gICAqIHRvIGNvbnRyb2wgbGlmZWN5Y2xlIHdoZW4gcmVwbGFjaW5nIHRoZSBmdW5jdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiBvbWl0dGVkLCBSZWZlciB0byBgZnVuY3Rpb25OYW1lUHJlZml4YC5cbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogQSBuYW1lIHByZWZpeCBmb3IgdGhlIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEdyaWQgZ2VuZXJhdGVzIGEgdW5pcXVlIHBoeXNpY2FsIElEIGFuZCB1c2VzIHRoYXRcbiAgICogSUQgZm9yIHRoZSBmdW5jdGlvbidzIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbk5hbWVQcmVmaXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gYmUgcGFzc2VkIHRvIHRoZSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqXG4gICAqIEtleS12YWx1ZSBwYWlycyB0aGF0IExhbWJkYSBjYWNoZXMgYW5kIG1ha2VzIGF2YWlsYWJsZSBmb3IgeW91ciBMYW1iZGFcbiAgICogZnVuY3Rpb25zLiBVc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGFwcGx5IGNvbmZpZ3VyYXRpb24gY2hhbmdlcywgc3VjaFxuICAgKiBhcyB0ZXN0IGFuZCBwcm9kdWN0aW9uIGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb25zLCB3aXRob3V0IGNoYW5naW5nIHlvdXJcbiAgICogTGFtYmRhIGZ1bmN0aW9uIHNvdXJjZSBjb2RlLlxuICAgKi9cbiAgcmVhZG9ubHkgZW52aXJvbm1lbnQ/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBEZXNjcmlwdGlvbiBvZiB3aGF0IHlvdXIgTGFtYmRhIEZ1bmN0aW9uIGRvZXMuXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHN5c3RlbSBhcmNoaXRlY3R1cmVzIGNvbXBhdGlibGUgd2l0aCB0aGlzIGxhbWJkYSBmdW5jdGlvbi5cbiAgICogQGRlZmF1bHQgQXJjaGl0ZWN0dXJlLlg4Nl82NFxuICAgKi9cbiAgcmVhZG9ubHkgYXJjaGl0ZWN0dXJlPzogQXJjaGl0ZWN0dXJlO1xuXG4gIC8qKlxuICAgKiBUaGUgdHJhY2luZyBtb2RlIGZvciB0aGUgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBUaGUgTGFtYmRhIGZ1bmN0aW9uIGlhbSByb2xlIHdpbGwgcmVjZWl2ZSBwZXJtaXNzaW9uIHRvXG4gICAqIHdyaXRlIHRvIEFXUyBYLVJheS5cbiAgICpcbiAgICogQGRlZmF1bHQgVHJhY2luZy5BQ1RJVkVcbiAgICovXG4gIHJlYWRvbmx5IHRyYWNpbmc/OiBUcmFjaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9nIHJldGVudGlvbiBwZXJpb2QgaW4gZGF5cy4gRGVmYXVsdHMgdG8gNy5cbiAgICovXG4gIHJlYWRvbmx5IGxvZ1JldGVudGlvbkluRGF5cz86IFJldGVudGlvbkRheXM7XG5cbiAgLyoqXG4gICAqIFRoZSBtZW1vcnkgbGltaXQgaW4gTUIuXG4gICAqXG4gICAqIEBkZWZhdWx0IDEyOC5cbiAgICovXG4gIHJlYWRvbmx5IG1lbW9yeVNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiBleGVjdXRpb24gdGltZSAoaW4gc2Vjb25kcykgYWZ0ZXIgd2hpY2ggTGFtYmRhIHRlcm1pbmF0ZXNcbiAgICogdGhlIGZ1bmN0aW9uLiBCZWNhdXNlIHRoZSBleGVjdXRpb24gdGltZSBhZmZlY3RzIGNvc3QsIHNldCB0aGlzIHZhbHVlXG4gICAqIGJhc2VkIG9uIHRoZSBmdW5jdGlvbidzIGV4cGVjdGVkIGV4ZWN1dGlvbiB0aW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5zZWNvbmRzKDMpXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIExheWVycyBmb3IgdGhlIExhbWJkYS5cbiAgICovXG4gIHJlYWRvbmx5IGxheWVycz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsIHBvbGljeSBzdGF0ZW1lbnRzIHRvIGFkZCB0byB0aGUgY3JlYXRlZCBMYW1iZGEgUm9sZS5cbiAgICpcbiAgICogWW91IGNhbiBjYWxsIGBhZGRUb1JvbGVQb2xpY3lgIHRvIHRoZSBjcmVhdGVkIGxhbWJkYSB0byBhZGQgc3RhdGVtZW50cyBwb3N0IGNyZWF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHBvbGljeSBzdGF0ZW1lbnRzIGFyZSBhZGRlZCB0byB0aGUgY3JlYXRlZCBMYW1iZGEgcm9sZS5cbiAgICovXG4gIHJlYWRvbmx5IGluaXRpYWxQb2xpY3k/OiBpYW0uUG9saWN5U3RhdGVtZW50W107XG5cbiAgLyoqXG4gICAqIExhbWJkYSBleGVjdXRpb24gcm9sZS5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgcm9sZSB0aGF0IHdpbGwgYmUgYXNzdW1lZCBieSB0aGUgZnVuY3Rpb24gdXBvbiBleGVjdXRpb24uXG4gICAqIEl0IGNvbnRyb2xzIHRoZSBwZXJtaXNzaW9ucyB0aGF0IHRoZSBmdW5jdGlvbiB3aWxsIGhhdmUuIFRoZSBSb2xlIG11c3RcbiAgICogYmUgYXNzdW1hYmxlIGJ5IHRoZSAnbGFtYmRhLmFtYXpvbmF3cy5jb20nIHNlcnZpY2UgcHJpbmNpcGFsLlxuICAgKlxuICAgKiBUaGUgZGVmYXVsdCBSb2xlIGF1dG9tYXRpY2FsbHkgaGFzIHBlcm1pc3Npb25zIGdyYW50ZWQgZm9yIExhbWJkYSBleGVjdXRpb24uIElmIHlvdVxuICAgKiBwcm92aWRlIGEgUm9sZSwgeW91IG11c3QgYWRkIHRoZSByZWxldmFudCBBV1MgbWFuYWdlZCBwb2xpY2llcyB5b3Vyc2VsZi5cbiAgICpcbiAgICogVGhlIHJlbGV2YW50IG1hbmFnZWQgcG9saWNpZXMgYXJlIFwic2VydmljZS1yb2xlL0FXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZVwiIGFuZFxuICAgKiBcInNlcnZpY2Utcm9sZS9BV1NMYW1iZGFWUENBY2Nlc3NFeGVjdXRpb25Sb2xlXCIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQSB1bmlxdWUgcm9sZSB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgdGhpcyBsYW1iZGEgZnVuY3Rpb24uXG4gICAqIEJvdGggc3VwcGxpZWQgYW5kIGdlbmVyYXRlZCByb2xlcyBjYW4gYWx3YXlzIGJlIGNoYW5nZWQgYnkgY2FsbGluZyBgYWRkVG9Sb2xlUG9saWN5YC5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqIENvbmZpZyBmb3IgbmV0d29yayBjb25uZWN0aXZpdHkgdG8gQVdTIHJlc291cmNlcyBpbiBhIFZQQywgc3BlY2lmeSBhIGxpc3RcbiAgICogb2Ygc3VibmV0LCBhbmQgb3B0aW9uYWxseSBzZWN1cml0eSBncm91cHMsIGluIHRoZSBWUEMuXG4gICAqXG4gICAqIFRoZSBMYW1iZGEgZnVuY3Rpb24gaWFtIHJvbGUgd2lsbCByZWNlaXZlIHBlcm1pc3Npb24gdG9cbiAgICogbWFuYWdlIEVOSXMgd2l0aGluIHRoZSBwcm92aWRlZCBuZXR3b3JrLlxuICAgKlxuICAgKiBXaGVuIHlvdSBjb25uZWN0IGEgZnVuY3Rpb24gdG8gYSBWUEMsIGl0IGNhbiBvbmx5IGFjY2VzcyByZXNvdXJjZXMgYW5kIHRoZSBpbnRlcm5ldCB0aHJvdWdoIHRoYXQgVlBDLlxuICAgKlxuICAgKiBTZWUgW1ZQQyBTZXR0aW5nc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xhbWJkYS9sYXRlc3QvZGcvY29uZmlndXJhdGlvbi12cGMuaHRtbCkuXG4gICAqL1xuICByZWFkb25seSBuZXR3b3JrQ29uZmlnPzogVnBjQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBUaGUgU1FTIERMUS5cbiAgICpcbiAgICogVGhlIExhbWJkYSBmdW5jdGlvbiBpYW0gcm9sZSB3aWxsIHJlY2VpdmUgcGVybWlzc2lvbiB0b1xuICAgKiBzZW5kIG1lc3NhZ2VzIG9uIHRoaXMgcXVldWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZGVhZGxldHRlciBxdWV1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVhZExldHRlclF1ZXVlPzogSVF1ZXVlO1xuXG4gIC8qKlxuICAgKiBFbmFibGVkIERMUS4gSWYgYGRlYWRMZXR0ZXJRdWV1ZWAgaXMgdW5kZWZpbmVkLFxuICAgKiBhbiBTUVMgcXVldWUgd2l0aCBkZWZhdWx0IG9wdGlvbnMgd2lsbCBiZSBkZWZpbmVkIGZvciB5b3VyIEZ1bmN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGZhbHNlIHVubGVzcyBgZGVhZExldHRlclF1ZXVlYCBpcyBzZXQsIHdoaWNoIGltcGxpZXMgRExRIGlzIGVuYWJsZWQuXG4gICAqL1xuICByZWFkb25seSBkZWFkTGV0dGVyUXVldWVFbmFibGVkPzogYm9vbGVhbjtcblxuICAvLyBUT0RPOiByZS1hZGQgU05TIGRlYWRMZXR0ZXJUb3BpY1xuXG4gIC8qKlxuICAgKiBFdmVudCBzb3VyY2VzIGZvciB0aGlzIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBZb3UgY2FuIGFsc28gYWRkIGV2ZW50IHNvdXJjZXMgdXNpbmcgYGFkZEV2ZW50U291cmNlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBldmVudCBzb3VyY2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgZXZlbnRzPzogSUV2ZW50U291cmNlW107XG5cbiAgLyoqXG4gICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvNS42MC4wL2RvY3MvcmVzb3VyY2VzL2xhbWJkYV9mdW5jdGlvbiNyZXNlcnZlZF9jb25jdXJyZW50X2V4ZWN1dGlvbnMgTGFtYmRhRnVuY3Rpb24jcmVzZXJ2ZWRfY29uY3VycmVudF9leGVjdXRpb25zfVxuICAgKi9cbiAgcmVhZG9ubHkgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9ucz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGFncyB0byBhcHBseSB0byB0aGUgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSBpbmZvcm1zIHRoZSBDREsgdGhhdCB0aGUgaW1wb3J0ZWQgZnVuY3Rpb24gQUxSRUFEWSBIQVMgdGhlIG5lY2Vzc2FyeSBwZXJtaXNzaW9uc1xuICAgKiBmb3Igd2hhdCB5b3UgYXJlIHRyeWluZyB0byBkby4gV2hlbiBub3QgY29uZmlndXJlZCwgdGhlIENESyBhdHRlbXB0cyB0byBhdXRvLWRldGVybWluZSB3aGV0aGVyIG9yIG5vdFxuICAgKiBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGFyZSBuZWNlc3Nhcnkgb24gdGhlIGZ1bmN0aW9uIHdoZW4gZ3JhbnQgQVBJcyBhcmUgdXNlZC4gSWYgdGhlIENESyB0cmllZCB0byBhZGRcbiAgICogcGVybWlzc2lvbnMgb24gYW4gaW1wb3J0ZWQgbGFtYmRhLCBpdCB3aWxsIGZhaWwuXG4gICAqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5ICpPTkxZIElGKiB5b3UgYXJlIGNvbW1pdHRpbmcgdG8gbWFuYWdlIHRoZSBpbXBvcnRlZCBmdW5jdGlvbidzIHBlcm1pc3Npb25zIG91dHNpZGUgb2ZcbiAgICogQ0RLLiBZb3UgYXJlIGFja25vd2xlZGdpbmcgdGhhdCB5b3VyIENESyBjb2RlIGFsb25lIHdpbGwgaGF2ZSBpbnN1ZmZpY2llbnQgcGVybWlzc2lvbnMgdG8gYWNjZXNzIHRoZVxuICAgKiBpbXBvcnRlZCBmdW5jdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHNraXBQZXJtaXNzaW9ucz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGxvZ2dpbmdGb3JtYXQgZm9yIHRoZSBmdW5jdGlvbi5cbiAgICogQGRlZmF1bHQgTG9nZ2luZ0Zvcm1hdC5URVhUXG4gICAqL1xuICByZWFkb25seSBsb2dnaW5nRm9ybWF0PzogTG9nZ2luZ0Zvcm1hdDtcblxuICAvKipcbiAgICogU2V0cyB0aGUgYXBwbGljYXRpb24gbG9nIGxldmVsIGZvciB0aGUgZnVuY3Rpb24uXG4gICAqIEBkZWZhdWx0IEFwcGxpY2F0aW9uTG9nTGV2ZWwuSU5GT1xuICAgKi9cbiAgcmVhZG9ubHkgYXBwbGljYXRpb25Mb2dMZXZlbD86IEFwcGxpY2F0aW9uTG9nTGV2ZWw7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHN5c3RlbSBsb2cgbGV2ZWwgZm9yIHRoZSBmdW5jdGlvbi5cbiAgICogQGRlZmF1bHQgU3lzdGVtTG9nTGV2ZWwuSU5GT1xuICAgKi9cbiAgcmVhZG9ubHkgc3lzdGVtTG9nTGV2ZWw/OiBTeXN0ZW1Mb2dMZXZlbDtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcHVibGlzaCBjcmVhdGlvbi9jaGFuZ2UgYXMgbmV3IExhbWJkYSBGdW5jdGlvbiBWZXJzaW9uLlxuICAgKlxuICAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzL2xhdGVzdC9kb2NzL3Jlc291cmNlcy9sYW1iZGFfZnVuY3Rpb24jcHVibGlzaCBMYW1iZGFGdW5jdGlvbiNwdWJsaXNofVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgcHVibGlzaD86IGJvb2xlYW4gfCBJUmVzb2x2YWJsZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvblByb3BzIGV4dGVuZHMgRnVuY3Rpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBydW50aW1lIGVudmlyb25tZW50IGZvciB0aGUgTGFtYmRhIGZ1bmN0aW9uIHRoYXQgeW91IGFyZSB1cGxvYWRpbmcuXG4gICAqIEZvciB2YWxpZCB2YWx1ZXMsIHNlZSB0aGUgUnVudGltZSBwcm9wZXJ0eSBpbiB0aGUgQVdTIExhbWJkYSBEZXZlbG9wZXJcbiAgICogR3VpZGUuXG4gICAqXG4gICAqIFVzZSBgUnVudGltZS5GUk9NX0lNQUdFYCB3aGVuIGRlZmluaW5nIGEgZnVuY3Rpb24gZnJvbSBhIERvY2tlciBpbWFnZS5cbiAgICovXG4gIHJlYWRvbmx5IHJ1bnRpbWU6IFJ1bnRpbWU7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgY29kZSBvZiB5b3VyIExhbWJkYSBmdW5jdGlvbi4gWW91IGNhbiBwb2ludCB0byBhIGZpbGUgaW4gYW5cbiAgICogQW1hem9uIFNpbXBsZSBTdG9yYWdlIFNlcnZpY2UgKEFtYXpvbiBTMykgYnVja2V0IG9yIHNwZWNpZnkgeW91ciBzb3VyY2VcbiAgICogY29kZSBhcyBpbmxpbmUgdGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IGNvZGU6IENvZGU7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgd2l0aGluIHlvdXIgY29kZSB0aGF0IExhbWJkYSBjYWxscyB0byBleGVjdXRlXG4gICAqIHlvdXIgZnVuY3Rpb24uIFRoZSBmb3JtYXQgaW5jbHVkZXMgdGhlIGZpbGUgbmFtZS4gSXQgY2FuIGFsc28gaW5jbHVkZVxuICAgKiBuYW1lc3BhY2VzIGFuZCBvdGhlciBxdWFsaWZpZXJzLCBkZXBlbmRpbmcgb24gdGhlIHJ1bnRpbWUuXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xhbWJkYS9sYXRlc3QvZGcvZm91bmRhdGlvbi1wcm9nbW9kZWwuaHRtbC5cbiAgICpcbiAgICogVXNlIGBIYW5kbGVyLkZST01fSU1BR0VgIHdoZW4gZGVmaW5pbmcgYSBmdW5jdGlvbiBmcm9tIGEgRG9ja2VyIGltYWdlLlxuICAgKlxuICAgKiBOT1RFOiBJZiB5b3Ugc3BlY2lmeSB5b3VyIHNvdXJjZSBjb2RlIGFzIGlubGluZSB0ZXh0IGJ5IHNwZWNpZnlpbmcgdGhlXG4gICAqIFppcEZpbGUgcHJvcGVydHkgd2l0aGluIHRoZSBDb2RlIHByb3BlcnR5LCBzcGVjaWZ5IGluZGV4LmZ1bmN0aW9uX25hbWUgYXNcbiAgICogdGhlIGhhbmRsZXIuXG4gICAqL1xuICByZWFkb25seSBoYW5kbGVyOiBzdHJpbmc7XG59XG5cbi8vIHJlLWFkZCBlYzIuSUNvbm5lY3RhYmxlP1xuXG4vLyAvKipcbi8vICAqIEEgTGFtYmRhIGZ1bmN0aW9uLlxuLy8gICovXG4vLyBleHBvcnQgaW50ZXJmYWNlIElGdW5jdGlvbiBleHRlbmRzIElBd3NDb25zdHJ1Y3QsIGlhbS5JR3JhbnRhYmxlIHtcblxuLy8gICAvKipcbi8vICAgICogQWRkIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoaXMgZnVuY3Rpb24uXG4vLyAgICAqL1xuLy8gICBhZGRFbnZpcm9ubWVudChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IElGdW5jdGlvbjtcbi8vIH1cblxuLyoqXG4gKiBQcm92aWRlcyBhIExhbWJkYSBGdW5jdGlvbiByZXNvdXJjZS4gTGFtYmRhIGFsbG93cyB5b3UgdG8gdHJpZ2dlciBleGVjdXRpb25cbiAqIG9mIGNvZGUgaW4gcmVzcG9uc2UgdG8gZXZlbnRzIGluIEFXUywgZW5hYmxpbmcgc2VydmVybGVzcyBiYWNrZW5kIHNvbHV0aW9ucy5cbiAqXG4gKiBUaGUgTGFtYmRhIEZ1bmN0aW9uIGl0c2VsZiBpbmNsdWRlcyBzb3VyY2UgY29kZSBhbmQgcnVudGltZSBjb25maWd1cmF0aW9uLlxuICpcbiAqIFRoaXMgQ29uc3RydWN0IG1hbmFnZXMgcGVybWlzc2lvbnMgYXMgcGFydCBvZiB0aGUgZnVuY3Rpb24gUHJpbmNpcGFsIGlhbSBwb2xpY3kuXG4gKiBUaGlzIHdvcmtzIGZvciBzYW1lIGFjY291bnQgcmVzb3VyY2VzLCBidXQgZm9yIGNyb3NzLWFjY291bnQgcmVzb3VyY2VzLFxuICogeW91IG1heSBuZWVkIHRvIG1hbmFnZSBhY2Nlc3MgYXMgcGFydCBvZiB0aGUgUmVzb3VyY2UgaWFtIHBvbGljeS5cbiAqXG4gKiBAcmVzb3VyY2UgYXdzX2xhbWJkYV9mdW5jdGlvblxuICogQGJlYWNvbi1jbGFzcyBjb21wdXRlLklGdW5jdGlvblxuICovXG5leHBvcnQgY2xhc3MgTGFtYmRhRnVuY3Rpb24gZXh0ZW5kcyBMYW1iZGFGdW5jdGlvbkJhc2UgaW1wbGVtZW50cyBJRnVuY3Rpb24ge1xuICAvLyBUT0RPOiBUZXJyYWZvcm0gYXdzX2xhbWJkYV9mdW5jdGlvbiA9PSBDREsgRnVuY3Rpb25WZXJzaW9uXG5cbiAgLyoqXG4gICAqIExhdGVzdCBwdWJsaXNoZWQgdmVyc2lvbiBvZiB5b3VyIExhbWJkYSBGdW5jdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgdmVyc2lvbigpOiBzdHJpbmcge1xuICAgIC8vIFRPRE86IFdoYXQgaXMgdGhpcyBpZiBwdWJsaXNoIGlzIGZhbHNlPz9cbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZS52ZXJzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhIGxhbWJkYSBmdW5jdGlvbiBpbnRvIHRoZSBUZXJyYUNvbnN0cnVjdCBzcGVjIHVzaW5nIGl0cyBuYW1lXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21GdW5jdGlvbk5hbWUoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIGZ1bmN0aW9uTmFtZTogc3RyaW5nLFxuICApOiBJRnVuY3Rpb24ge1xuICAgIHJldHVybiBMYW1iZGFGdW5jdGlvbi5mcm9tRnVuY3Rpb25BdHRyaWJ1dGVzKHNjb3BlLCBpZCwge1xuICAgICAgZnVuY3Rpb25Bcm46IEF3c1N0YWNrLm9mQXdzQ29uc3RydWN0KHNjb3BlKS5mb3JtYXRBcm4oe1xuICAgICAgICBzZXJ2aWNlOiBcImxhbWJkYVwiLFxuICAgICAgICByZXNvdXJjZTogXCJmdW5jdGlvblwiLFxuICAgICAgICByZXNvdXJjZU5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgYXJuRm9ybWF0OiBBcm5Gb3JtYXQuQ09MT05fUkVTT1VSQ0VfTkFNRSxcbiAgICAgIH0pLFxuICAgICAgc2FtZUVudmlyb25tZW50OiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhIGxhbWJkYSBmdW5jdGlvbiBpbnRvIHRoZSBUZXJyYUNvbnN0cnVjdCBzcGVjIHVzaW5nIGl0cyBBUk4uXG4gICAqXG4gICAqIEZvciBgRnVuY3Rpb24uYWRkUGVybWlzc2lvbnMoKWAgdG8gd29yayBvbiB0aGlzIGltcG9ydGVkIGxhbWJkYSwgbWFrZSBzdXJlIHRoYXQgaXNcbiAgICogaW4gdGhlIHNhbWUgYWNjb3VudCBhbmQgcmVnaW9uIGFzIHRoZSBzdGFjayB5b3UgYXJlIGltcG9ydGluZyBpdCBpbnRvLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRnVuY3Rpb25Bcm4oXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIGZ1bmN0aW9uQXJuOiBzdHJpbmcsXG4gICk6IElGdW5jdGlvbiB7XG4gICAgcmV0dXJuIExhbWJkYUZ1bmN0aW9uLmZyb21GdW5jdGlvbkF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7IGZ1bmN0aW9uQXJuIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBMYW1iZGEgZnVuY3Rpb24gb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgYSBmdW5jdGlvbiBub3QgZGVmaW5lZFxuICAgKiB3aXRoaW4gdGhpcyBzdGFjay5cbiAgICpcbiAgICogRm9yIGBGdW5jdGlvbi5hZGRQZXJtaXNzaW9ucygpYCB0byB3b3JrIG9uIHRoaXMgaW1wb3J0ZWQgbGFtYmRhLCBzZXQgdGhlIHNhbWVFbnZpcm9ubWVudCBwcm9wZXJ0eSB0byB0cnVlXG4gICAqIGlmIHRoaXMgaW1wb3J0ZWQgbGFtYmRhIGlzIGluIHRoZSBzYW1lIGFjY291bnQgYW5kIHJlZ2lvbiBhcyB0aGUgc3RhY2sgeW91IGFyZSBpbXBvcnRpbmcgaXQgaW50by5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBwYXJlbnQgY29uc3RydWN0XG4gICAqIEBwYXJhbSBpZCBUaGUgbmFtZSBvZiB0aGUgbGFtYmRhIGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gYXR0cnMgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGZ1bmN0aW9uIHRvIGltcG9ydFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRnVuY3Rpb25BdHRyaWJ1dGVzKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBhdHRyczogRnVuY3Rpb25BdHRyaWJ1dGVzLFxuICApOiBJRnVuY3Rpb24ge1xuICAgIGNvbnN0IGZ1bmN0aW9uQXJuID0gYXR0cnMuZnVuY3Rpb25Bcm47XG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gZXh0cmFjdE5hbWVGcm9tQXJuKGF0dHJzLmZ1bmN0aW9uQXJuKTtcbiAgICBjb25zdCByb2xlID0gYXR0cnMucm9sZTtcblxuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIExhbWJkYUZ1bmN0aW9uQmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgcmVzb3VyY2U6IGRhdGFBd3NMYW1iZGFGdW5jdGlvbi5EYXRhQXdzTGFtYmRhRnVuY3Rpb247XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZnVuY3Rpb25OYW1lID0gZnVuY3Rpb25OYW1lO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGZ1bmN0aW9uQXJuID0gZnVuY3Rpb25Bcm47XG4gICAgICBwdWJsaWMgZ2V0IGZ1bmN0aW9uUXVhbGlmaWVkSW52b2tlQXJuKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHsgcmVnaW9uLCBwYXJ0aXRpb24gfSA9IEFybi5zcGxpdChcbiAgICAgICAgICBmdW5jdGlvbkFybixcbiAgICAgICAgICBBcm5Gb3JtYXQuQ09MT05fUkVTT1VSQ0VfTkFNRSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGBhcm46JHtwYXJ0aXRpb259OmFwaWdhdGV3YXk6JHtyZWdpb259OmxhbWJkYTpwYXRoLzIwMTUtMDMtMzEvZnVuY3Rpb25zLyR7ZnVuY3Rpb25Bcm59L2ludm9jYXRpb25zYDtcbiAgICAgIH1cbiAgICAgIC8vIFRPRE86IFJlc29sdmUgcm9sZSBhbmQgcHJpbmNpcGFsIHJlc29sdmUgZnJvbSBURiBkYXRhIHNvdXJjZT9cbiAgICAgIHB1YmxpYyByZWFkb25seSBncmFudFByaW5jaXBhbDogaWFtLklQcmluY2lwYWw7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgcm9sZSA9IHJvbGU7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgcGVybWlzc2lvbnNOb2RlID0gdGhpcy5ub2RlO1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgTGFtYmRhIGZ1bmN0aW9uIHJldHVybmVkLlxuICAgICAgICpcbiAgICAgICAqIElmIHF1YWxpZmllciBpcyBub3Qgc2V0LCB0aGlzIHdpbGwgcmVzb2x2ZSB0byB0aGUgbW9zdCByZWNlbnQgcHVibGlzaGVkIHZlcnNpb24uXG4gICAgICAgKiBJZiBubyBwdWJsaXNoZWQgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24gZXhpc3RzLCB2ZXJzaW9uIHdpbGwgcmVzb2x2ZSB0byBgJExBVEVTVGAuXG4gICAgICAgKi9cbiAgICAgIHB1YmxpYyBnZXQgdmVyc2lvbigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZS52ZXJzaW9uO1xuICAgICAgfVxuICAgICAgLy8gRm9yY2UgdXNlciB0byBwcm92aWRlIGFyY2ggb3IgYXNzdW1lIFg4Nl82NFxuICAgICAgcHVibGljIHJlYWRvbmx5IGFyY2hpdGVjdHVyZSA9IGF0dHJzLmFyY2hpdGVjdHVyZSA/PyBBcmNoaXRlY3R1cmUuWDg2XzY0O1xuICAgICAgLy8gcHVibGljIGdldCBhcmNoaXRlY3R1cmUoKTogc3RyaW5nIHtcbiAgICAgIC8vICAgcmV0dXJuIEZuLmVsZW1lbnQodGhpcy5yZXNvdXJjZS5hcmNoaXRlY3R1cmVzLCAwKSBhcyBzdHJpbmc7XG4gICAgICAvLyB9XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgcmVzb3VyY2VBcm5zRm9yR3JhbnRJbnZva2UgPSBbXG4gICAgICAgIHRoaXMuZnVuY3Rpb25Bcm4sXG4gICAgICAgIGAke3RoaXMuZnVuY3Rpb25Bcm59OipgLFxuICAgICAgXTtcbiAgICAgIHB1YmxpYyBnZXQgZnVuY3Rpb25PdXRwdXRzKCk6IEZ1bmN0aW9uT3V0cHV0cyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogdGhpcy5mdW5jdGlvbk5hbWUsXG4gICAgICAgICAgYXJuOiB0aGlzLmZ1bmN0aW9uQXJuLFxuICAgICAgICAgIHJvbGVBcm46IHRoaXMucm9sZT8ucm9sZUFybiA/PyBcIlwiLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcHVibGljIGdldCBvdXRwdXRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mdW5jdGlvbk91dHB1dHM7XG4gICAgICB9XG4gICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2FuQ3JlYXRlUGVybWlzc2lvbnMgPVxuICAgICAgICBhdHRycy5zYW1lRW52aXJvbm1lbnQgPz8gdGhpcy5faXNTdGFja0FjY291bnQoKTtcbiAgICAgIHByb3RlY3RlZCByZWFkb25seSBfc2tpcFBlcm1pc3Npb25zID0gYXR0cnMuc2tpcFBlcm1pc3Npb25zID8/IGZhbHNlO1xuXG4gICAgICBjb25zdHJ1Y3RvcihzOiBDb25zdHJ1Y3QsIGk6IHN0cmluZykge1xuICAgICAgICBzdXBlcihzLCBpLCB7XG4gICAgICAgICAgZW52aXJvbm1lbnRGcm9tQXJuOiBmdW5jdGlvbkFybixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5ncmFudFByaW5jaXBhbCA9XG4gICAgICAgICAgcm9sZSB8fCBuZXcgaWFtLlVua25vd25QcmluY2lwYWwoeyByZXNvdXJjZTogdGhpcyB9KTtcbiAgICAgICAgdGhpcy5yZXNvdXJjZSA9IG5ldyBkYXRhQXdzTGFtYmRhRnVuY3Rpb24uRGF0YUF3c0xhbWJkYUZ1bmN0aW9uKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgXCJSZXNvdXJjZVwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogdGhpcy5mdW5jdGlvbk5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyAvLyBUT0RPOiByZS1hZGQgc3VwcG9ydCBmb3IgRUMyIGNvbm5lY3Rpb25zXG4gICAgICAgIC8vIGlmIChhdHRycy5zZWN1cml0eUdyb3VwKSB7XG4gICAgICAgIC8vICAgdGhpcy5fY29ubmVjdGlvbnMgPSBuZXcgZWMyLkNvbm5lY3Rpb25zKHtcbiAgICAgICAgLy8gICAgIHNlY3VyaXR5R3JvdXBzOiBbYXR0cnMuc2VjdXJpdHlHcm91cF0sXG4gICAgICAgIC8vICAgfSk7XG4gICAgICAgIC8vIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEltcG9ydChzY29wZSwgaWQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc291cmNlOiBsYW1iZGFGdW5jdGlvbi5MYW1iZGFGdW5jdGlvbjtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vdXRwdXRzOiBGdW5jdGlvbk91dHB1dHM7XG5cbiAgLyoqIFN0cm9uZ2x5IFR5cGVkIEZ1bmN0aW9uIE91dHB1dHMgKi9cbiAgcHVibGljIGdldCBmdW5jdGlvbk91dHB1dHMoKTogRnVuY3Rpb25PdXRwdXRzIHtcbiAgICByZXR1cm4gdGhpcy5fb3V0cHV0cztcbiAgfVxuICBwdWJsaWMgZ2V0IG91dHB1dHMoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZnVuY3Rpb25PdXRwdXRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBmdW5jdGlvbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBmbyB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGZ1bmN0aW9uQXJuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2UuYXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gZm8gdGhlIGZ1bmN0aW9uLlxuICAgKiAoaWYgdmVyc2lvbmluZyBpcyBlbmFibGVkIHZpYSBwdWJsaXNoID0gdHJ1ZSlcbiAgICovXG4gIHB1YmxpYyBnZXQgZnVuY3Rpb25RdWFsaWZpZWRBcm4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZS5xdWFsaWZpZWRBcm47XG4gIH1cblxuICAvKipcbiAgICogVGhlIEFSTiBmbyB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGZ1bmN0aW9uUXVhbGlmaWVkSW52b2tlQXJuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2UucXVhbGlmaWVkSW52b2tlQXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBhcmNoaXRlY3R1cmUgb2YgdGhpcyBMYW1iZGEgRnVuY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmU7XG5cbiAgLyoqXG4gICAqIFRoZSBwcmluY2lwYWwgdGhpcyBMYW1iZGEgRnVuY3Rpb24gaXMgcnVubmluZyBhc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBpYW0uSVByaW5jaXBhbDtcblxuICAvKipcbiAgICogVGhlIElBTSByb2xlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBVbmRlZmluZWQgaWYgdGhlIGZ1bmN0aW9uIHdhcyBpbXBvcnRlZCB3aXRob3V0IGEgcm9sZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByb2xlPzogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBUaGUgRExRIChhcyBxdWV1ZSkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgTGFtYmRhIEZ1bmN0aW9uICh0aGlzIGlzIGFuIG9wdGlvbmFsIGF0dHJpYnV0ZSkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGVhZExldHRlclF1ZXVlPzogSVF1ZXVlO1xuXG4gIC8qKlxuICAgKiBUaGUgdGltZW91dCBjb25maWd1cmVkIGZvciB0aGlzIGxhbWJkYS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0aW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBjb25zdHJ1Y3Qgbm9kZSB3aGVyZSBwZXJtaXNzaW9ucyBhcmUgYXR0YWNoZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGVybWlzc2lvbnNOb2RlID0gdGhpcy5ub2RlO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBjYW5DcmVhdGVQZXJtaXNzaW9ucyA9IHRydWU7XG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgb2YgaW52b2NhdGlvbiBwcmluY2lwYWxzIHRvIGdyYW50cy4gVXNlZCB0byBkZS1kdXBlIGBncmFudEludm9rZSgpYCBjYWxscy5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcm90ZWN0ZWQgX2ludm9jYXRpb25HcmFudHM6IFJlY29yZDxzdHJpbmcsIGlhbS5HcmFudD4gPSB7fTtcblxuICAvKipcbiAgICogTWFwcGluZyBvZiBmdWNudGlvbiBVUkwgaW52b2NhdGlvbiBwcmluY2lwYWxzIHRvIGdyYW50cy4gVXNlZCB0byBkZS1kdXBlIGBncmFudEludm9rZVVybCgpYCBjYWxscy5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcm90ZWN0ZWQgX2Z1bmN0aW9uVXJsSW52b2NhdGlvbkdyYW50czogUmVjb3JkPHN0cmluZywgaWFtLkdyYW50PiA9IHt9O1xuXG4gIC8vIC8vIFRlcmFmb3JtIHByb3ZpZGVyIGZvciBBV1MgQXV0b21hdGljYWxseSBtYW5hZ2VzIEZ1bmN0aW9uIFZlcnNpb25pbmcgdGhyb3VnaCBjb2RlIGhhc2guLlxuICAvLyAvLyBuZWVkIHRvIGRyb3AgbW9zdCBvZiB0aGlzIHZlcnNpb24gbG9naWMuLlxuXG4gIC8vIHByaXZhdGUgcmVhZG9ubHkgY3VycmVudFZlcnNpb25PcHRpb25zPzogVmVyc2lvbk9wdGlvbnM7XG4gIC8vIHByaXZhdGUgX2N1cnJlbnRWZXJzaW9uPzogVmVyc2lvbjtcbiAgLy8gLyoqXG4gIC8vICAqIFJldHVybnMgYSBgbGFtYmRhLlZlcnNpb25gIHdoaWNoIHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGlzXG4gIC8vICAqIExhbWJkYSBmdW5jdGlvbi4gQSBuZXcgdmVyc2lvbiB3aWxsIGJlIGNyZWF0ZWQgZXZlcnkgdGltZSB0aGUgZnVuY3Rpb24nc1xuICAvLyAgKiBjb25maWd1cmF0aW9uIGNoYW5nZXMuXG4gIC8vICAqXG4gIC8vICAqIFlvdSBjYW4gc3BlY2lmeSBvcHRpb25zIGZvciB0aGlzIHZlcnNpb24gdXNpbmcgdGhlIGBjdXJyZW50VmVyc2lvbk9wdGlvbnNgXG4gIC8vICAqIHByb3Agd2hlbiBpbml0aWFsaXppbmcgdGhlIGBsYW1iZGEuRnVuY3Rpb25gLlxuICAvLyAgKi9cbiAgLy8gcHVibGljIGdldCBjdXJyZW50VmVyc2lvbigpOiBWZXJzaW9uIHtcbiAgLy8gICBpZiAodGhpcy5fY3VycmVudFZlcnNpb24pIHtcbiAgLy8gICAgIHJldHVybiB0aGlzLl9jdXJyZW50VmVyc2lvbjtcbiAgLy8gICB9XG5cbiAgLy8gICAvLyBpZiAodGhpcy5fd2FybklmQ3VycmVudFZlcnNpb25DYWxsZWQpIHtcbiAgLy8gICAvLyAgIHRoaXMud2Fybkludm9rZUZ1bmN0aW9uUGVybWlzc2lvbnModGhpcyk7XG4gIC8vICAgLy8gfVxuXG4gIC8vICAgdGhpcy5fY3VycmVudFZlcnNpb24gPSBuZXcgVmVyc2lvbih0aGlzLCBcIkN1cnJlbnRWZXJzaW9uXCIsIHtcbiAgLy8gICAgIGxhbWJkYTogdGhpcyxcbiAgLy8gICAgIC4uLnRoaXMuY3VycmVudFZlcnNpb25PcHRpb25zLFxuICAvLyAgIH0pO1xuXG4gIC8vICAgLy8gb3ZlcnJpZGUgdGhlIHZlcnNpb24ncyBsb2dpY2FsIElEIHdpdGggYSBsYXp5IHN0cmluZyB3aGljaCBpbmNsdWRlcyB0aGVcbiAgLy8gICAvLyBoYXNoIG9mIHRoZSBmdW5jdGlvbiBpdHNlbGYsIHNvIGEgbmV3IHZlcnNpb24gcmVzb3VyY2UgaXMgY3JlYXRlZCB3aGVuXG4gIC8vICAgLy8gdGhlIGZ1bmN0aW9uIGNvbmZpZ3VyYXRpb24gY2hhbmdlcy5cbiAgLy8gICBjb25zdCBjZm4gPSB0aGlzLl9jdXJyZW50VmVyc2lvbi5ub2RlLmRlZmF1bHRDaGlsZCBhcyBUZXJyYWZvcm1SZXNvdXJjZTtcbiAgLy8gICBjb25zdCBvcmlnaW5hbExvZ2ljYWxJZCA9IHRoaXMuc3RhY2sucmVzb2x2ZShjZm4ubG9naWNhbElkKSBhcyBzdHJpbmc7XG5cbiAgLy8gICBjZm4ub3ZlcnJpZGVMb2dpY2FsSWQoXG4gIC8vICAgICBMYXp5LnN0cmluZ1ZhbHVlKHtcbiAgLy8gICAgICAgcHJvZHVjZTogKCkgPT4ge1xuICAvLyAgICAgICAgIGNvbnN0IGhhc2ggPSBjYWxjdWxhdGVGdW5jdGlvbkhhc2godGhpcywgdGhpcy5oYXNoTWl4aW5zLmpvaW4oXCJcIikpO1xuICAvLyAgICAgICAgIGNvbnN0IGxvZ2ljYWxJZCA9IHRyaW1Gcm9tU3RhcnQob3JpZ2luYWxMb2dpY2FsSWQsIDI1NSAtIDMyKTtcbiAgLy8gICAgICAgICByZXR1cm4gYCR7bG9naWNhbElkfSR7aGFzaH1gO1xuICAvLyAgICAgICB9LFxuICAvLyAgICAgfSksXG4gIC8vICAgKTtcblxuICAvLyAgIHJldHVybiB0aGlzLl9jdXJyZW50VmVyc2lvbjtcbiAgLy8gfVxuXG4gIC8qKlxuICAgKiBUaGUgQVJOKHMpIHRvIHB1dCBpbnRvIHRoZSByZXNvdXJjZSBmaWVsZCBvZiB0aGUgZ2VuZXJhdGVkIElBTSBwb2xpY3kgZm9yIGdyYW50SW52b2tlKClcbiAgICovXG4gIHB1YmxpYyBnZXQgcmVzb3VyY2VBcm5zRm9yR3JhbnRJbnZva2UoKSB7XG4gICAgLy8gVE9ETzogc2hvdWxkIHRoaXMgYmUgcXVhbGlmaWVkQXJuIG9yIHF1YWxpZmllZEludm9rZUFybj9cbiAgICAvLyBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81LjY4LjAvZG9jcy9yZXNvdXJjZXMvbGFtYmRhX2Z1bmN0aW9uI3F1YWxpZmllZF9hcm5cbiAgICByZXR1cm4gW3RoaXMuZnVuY3Rpb25Bcm4sIHRoaXMuZnVuY3Rpb25RdWFsaWZpZWRJbnZva2VBcm5dO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgcmVhZG9ubHkgX2xvZ0dyb3VwOiBjbG91ZHdhdGNoTG9nR3JvdXAuQ2xvdWR3YXRjaExvZ0dyb3VwO1xuXG4gIC8qKlxuICAgKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHRoaXMgZnVuY3Rpb25cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlbnZpcm9ubWVudDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuXG4gIHByaXZhdGUgX3VybD86IHN0cmluZztcbiAgLyoqXG4gICAqIEhUVFAgRW5kcG9pbnQgZm9yIHRoaXMgZnVuY3Rpb24gaWYgZGVmaW5lZC5cbiAgICpcbiAgICogdXNlIGBhZGRGdW5jdGlvblVybGAgdG8gZW5hYmxlIEVuZHBvaW50LlxuICAgKi9cbiAgcHVibGljIGdldCB1cmwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdXJsO1xuICB9XG5cbiAgcHJpdmF0ZSBfZXZlbnRTb3VyY2VzOiB7XG4gICAgW2lkOiBzdHJpbmddOiBsYW1iZGFFdmVudFNvdXJjZU1hcHBpbmcuTGFtYmRhRXZlbnRTb3VyY2VNYXBwaW5nO1xuICB9ID0ge307XG4gIHB1YmxpYyBnZXQgZXZlbnRTb3VyY2VzKCk6IGxhbWJkYUV2ZW50U291cmNlTWFwcGluZy5MYW1iZGFFdmVudFNvdXJjZU1hcHBpbmdbXSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5fZXZlbnRTb3VyY2VzKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NlY3VyaXR5R3JvdXA/OiBzZWN1cml0eUdyb3VwLlNlY3VyaXR5R3JvdXA7XG4gIHB1YmxpYyBnZXQgc2VjdXJpdHlHcm91cCgpOiBzZWN1cml0eUdyb3VwLlNlY3VyaXR5R3JvdXAgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zZWN1cml0eUdyb3VwO1xuICB9XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgbmFtZTogc3RyaW5nLCBwcm9wczogRnVuY3Rpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBuYW1lLCBwcm9wcyk7XG5cbiAgICBjb25zdCB7XG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIGVudmlyb25tZW50OiB2YXJpYWJsZXMsXG4gICAgICBsb2dSZXRlbnRpb25JbkRheXMgPSBSZXRlbnRpb25EYXlzLk9ORV9XRUVLLFxuICAgICAgbWVtb3J5U2l6ZSA9IDEyOCxcbiAgICAgIHRpbWVvdXQgPSBEdXJhdGlvbi5zZWNvbmRzKDMpLFxuICAgICAgbGF5ZXJzLFxuICAgICAgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9ucyxcbiAgICB9ID0gcHJvcHM7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvciBBUk4gb2YgdGhlIExhbWJkYSBmdW5jdGlvbi5cbiAgICAgKiBpcyBsaW1pdGVkIHRvIDY0IGNoYXJhY3RlcnMgaW4gbGVuZ3RoLlxuICAgICAqXG4gICAgICogQVJOIFBhdHRlcm46IChbYS16QS1aMC05LV9dKykoOihcXCRMQVRFU1R8W2EtekEtWjAtOS1fXSspKT9cbiAgICAgKi9cbiAgICBjb25zdCBmdW5jdGlvbk5hbWUgPVxuICAgICAgcHJvcHMuZnVuY3Rpb25OYW1lID8/XG4gICAgICB0aGlzLnN0YWNrLnVuaXF1ZVJlc291cmNlTmFtZVByZWZpeCh0aGlzLCB7XG4gICAgICAgIHByZWZpeDogcHJvcHMuZnVuY3Rpb25OYW1lUHJlZml4ID8/IHRoaXMuZ3JpZFVVSUQgKyBcIi1cIixcbiAgICAgICAgYWxsb3dlZFNwZWNpYWxDaGFyYWN0ZXJzOiBcIitcIixcbiAgICAgICAgbWF4TGVuZ3RoOiA2NCxcbiAgICAgIH0pO1xuXG4gICAgaWYgKGZ1bmN0aW9uTmFtZSAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKGZ1bmN0aW9uTmFtZSkpIHtcbiAgICAgIGlmIChmdW5jdGlvbk5hbWUubGVuZ3RoID4gNjQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBGdW5jdGlvbiBuYW1lIGNhbiBub3QgYmUgbG9uZ2VyIHRoYW4gNjQgY2hhcmFjdGVycyBidXQgaGFzICR7ZnVuY3Rpb25OYW1lLmxlbmd0aH0gY2hhcmFjdGVycy5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKCEvXlthLXpBLVowLTktX10rJC8udGVzdChmdW5jdGlvbk5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRnVuY3Rpb24gbmFtZSAke2Z1bmN0aW9uTmFtZX0gY2FuIGNvbnRhaW4gb25seSBsZXR0ZXJzLCBudW1iZXJzLCBoeXBoZW5zLCBvciB1bmRlcnNjb3JlcyB3aXRoIG5vIHNwYWNlcy5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkZXNjcmlwdGlvbiAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKGRlc2NyaXB0aW9uKSkge1xuICAgICAgaWYgKGRlc2NyaXB0aW9uLmxlbmd0aCA+IDI1Nikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZ1bmN0aW9uIGRlc2NyaXB0aW9uIGNhbiBub3QgYmUgbG9uZ2VyIHRoYW4gMjU2IGNoYXJhY3RlcnMgYnV0IGhhcyAke2Rlc2NyaXB0aW9uLmxlbmd0aH0gY2hhcmFjdGVycy5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1hbmFnZWRQb2xpY2llcyA9IG5ldyBBcnJheTxpYW0uSU1hbmFnZWRQb2xpY3k+KCk7XG4gICAgLy8gdGhlIGFybiBpcyBpbiB0aGUgZm9ybSBvZiAtIGFybjphd3M6aWFtOjphd3M6cG9saWN5L3NlcnZpY2Utcm9sZS9BV1NMYW1iZGFCYXNpY0V4ZWN1dGlvblJvbGVcbiAgICBtYW5hZ2VkUG9saWNpZXMucHVzaChcbiAgICAgIGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgXCJBV1NMYW1iZGFCYXNpY0V4ZWN1dGlvblJvbGVcIixcbiAgICAgICAgXCJzZXJ2aWNlLXJvbGUvQVdTTGFtYmRhQmFzaWNFeGVjdXRpb25Sb2xlXCIsXG4gICAgICApLFxuICAgICk7XG4gICAgaWYgKHByb3BzLm5ldHdvcmtDb25maWcpIHtcbiAgICAgIC8vIFBvbGljeSB0aGF0IHdpbGwgaGF2ZSBFTkkgY3JlYXRpb24gcGVybWlzc2lvbnNcbiAgICAgIC8vIG5vdCBzdXJlIGlmIHRpbWUuc2xlZXAgaXMgbmVjZXNzYXJ5P1xuICAgICAgLy8gcmVmOlxuICAgICAgLy8gIC0gaHR0cHM6Ly9naXRodWIuY29tL3B1bHVtaS9wdWx1bWktYXdzL2lzc3Vlcy8yMjYwI2lzc3VlY29tbWVudC0xOTc3NjA2NTA5XG4gICAgICAvLyAgLSBodHRwczovL2dpdGh1Yi5jb20vaGFzaGljb3JwL3RlcnJhZm9ybS1wcm92aWRlci1hd3MvaXNzdWVzLzI5ODI4I2lzc3VlY29tbWVudC0xNjkzMzA3NTAwXG4gICAgICBtYW5hZ2VkUG9saWNpZXMucHVzaChcbiAgICAgICAgaWFtLk1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgXCJBV1NMYW1iZGFWUENBY2Nlc3NFeGVjdXRpb25Sb2xlXCIsXG4gICAgICAgICAgXCJzZXJ2aWNlLXJvbGUvQVdTTGFtYmRhVlBDQWNjZXNzRXhlY3V0aW9uUm9sZVwiLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBBbnkgY29uY2VybiBub3Qgc2NvcGluZyB0aGUgbG9nR3JvdXAgSUFNIFBlcm1pc3Npb25zP1xuICAgIC8vIC5hbGxvdygpXG4gICAgLy8gLnRvQ3JlYXRlTG9nU3RyZWFtKClcbiAgICAvLyAudG9QdXRMb2dFdmVudHMoKVxuICAgIC8vIC5vbihsb2dHcm91cC5hcm4sIGAke2xvZ0dyb3VwLmFybn06bG9nLXN0cmVhbToqYCksXG5cbiAgICB0aGlzLnJvbGUgPVxuICAgICAgcHJvcHMucm9sZSB8fFxuICAgICAgbmV3IGlhbS5Sb2xlKHRoaXMsIFwiU2VydmljZVJvbGVcIiwge1xuICAgICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbChcImxhbWJkYS5hbWF6b25hd3MuY29tXCIpLFxuICAgICAgICBtYW5hZ2VkUG9saWNpZXMsXG4gICAgICB9KTtcbiAgICB0aGlzLmdyYW50UHJpbmNpcGFsID0gdGhpcy5yb2xlO1xuICAgIC8vIFRPRE86IFJlLWFkZCBmaWxlc3lzdGVtIC8gbG9jYWxNb3VudFBhdGggc3VwcG9ydFxuICAgIC8vIHJlZjogZmlsZXN5c3RlbS5jb25maWcucG9saWNpZXMgdG8gYmUgYWRkZWQgdG8gcHJpbmNpcGFsXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTYwLjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLWxhbWJkYS9saWIvZnVuY3Rpb24udHMjTDk0OS1MOTY1XG5cbiAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBwcm9wcy5pbml0aWFsUG9saWN5IHx8IFtdKSB7XG4gICAgICB0aGlzLnJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3koc3RhdGVtZW50KTtcbiAgICB9XG5cbiAgICBjb25zdCBjb2RlID0gcHJvcHMuY29kZS5iaW5kKHRoaXMpO1xuICAgIHZlcmlmeUNvZGVDb25maWcoY29kZSwgcHJvcHMpO1xuXG4gICAgLy8gYWRkIHN1cHBvcnQgZm9yIEFXU19DT0RFR1VSVSBQcm9maWxlIGVudiB2YXJpYWJsZXMuLi5cbiAgICBjb25zdCBlbnYgPSB2YXJpYWJsZXMgfHwge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52KSkge1xuICAgICAgdGhpcy5hZGRFbnZpcm9ubWVudChrZXksIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBETFEgY2FuIGJlIGVpdGhlciBzbnMuSVRvcGljIG9yIHNxcy5JUXVldWVcbiAgICBjb25zdCBkbHFUb3BpY09yUXVldWUgPSB0aGlzLmJ1aWxkRGVhZExldHRlclF1ZXVlKHByb3BzKTtcbiAgICBpZiAoZGxxVG9waWNPclF1ZXVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0aGlzLmlzUXVldWUoZGxxVG9waWNPclF1ZXVlKSkge1xuICAgICAgICB0aGlzLmRlYWRMZXR0ZXJRdWV1ZSA9IGRscVRvcGljT3JRdWV1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkRlYWRMZXR0ZXJUb3BpYyBpcyBub3Qgc3VwcG9ydGVkIHlldFwiKTtcbiAgICAgICAgLy8gdGhpcy5kZWFkTGV0dGVyVG9waWMgPSBkbHFUb3BpY09yUXVldWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbG9nR3JvdXAgPSBuZXcgY2xvdWR3YXRjaExvZ0dyb3VwLkNsb3Vkd2F0Y2hMb2dHcm91cChcbiAgICAgIHRoaXMsXG4gICAgICBcIkxvZ0dyb3VwXCIsXG4gICAgICB7XG4gICAgICAgIG5hbWU6IGAvYXdzL2xhbWJkYS8ke2Z1bmN0aW9uTmFtZX1gLFxuICAgICAgICByZXRlbnRpb25JbkRheXM6IGxvZ1JldGVudGlvbkluRGF5cyxcbiAgICAgIH0sXG4gICAgKTtcbiAgICB0aGlzLl9sb2dHcm91cCA9IGxvZ0dyb3VwO1xuICAgIHRoaXMucmVzb3VyY2UgPSBuZXcgbGFtYmRhRnVuY3Rpb24uTGFtYmRhRnVuY3Rpb24odGhpcywgXCJSZXNvdXJjZVwiLCB7XG4gICAgICBmdW5jdGlvbk5hbWUsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIC8vIE5PVEU6IGZvciB0aGUgdW5kZXJsYXlpbmcgcmVzb3VyY2UsIEV4YWN0bHkgb25lIG9mIGZpbGVuYW1lLCBpbWFnZV91cmksIG9yIHMzX2J1Y2tldCBtdXN0IGJlIHNwZWNpZmllZFxuICAgICAgczNCdWNrZXQ6IGNvZGUuczNMb2NhdGlvbiAmJiBjb2RlLnMzTG9jYXRpb24uYnVja2V0TmFtZSxcbiAgICAgIHMzS2V5OiBjb2RlLnMzTG9jYXRpb24gJiYgY29kZS5zM0xvY2F0aW9uLm9iamVjdEtleSxcbiAgICAgIHMzT2JqZWN0VmVyc2lvbjogY29kZS5zM0xvY2F0aW9uICYmIGNvZGUuczNMb2NhdGlvbi5vYmplY3RWZXJzaW9uLFxuICAgICAgZmlsZW5hbWU6IGNvZGUuaW5saW5lQ29kZSxcbiAgICAgIHNvdXJjZUNvZGVIYXNoOiBjb2RlLnNvdXJjZUNvZGVIYXNoLFxuICAgICAgaW1hZ2VVcmk6IGNvZGUuaW1hZ2U/LmltYWdlVXJpLFxuICAgICAgbGF5ZXJzLCAvLyBUT0RPOiBTdXBwb3J0IElMYXllciB3aXRoIExhenkgbGlzdCBvZiBhcm5zXG4gICAgICBoYW5kbGVyOiBwcm9wcy5oYW5kbGVyID09PSBIYW5kbGVyLkZST01fSU1BR0UgPyB1bmRlZmluZWQgOiBwcm9wcy5oYW5kbGVyLFxuICAgICAgdGltZW91dDogdGltZW91dC50b1NlY29uZHMoKSxcbiAgICAgIHBhY2thZ2VUeXBlOiBwcm9wcy5ydW50aW1lID09PSBSdW50aW1lLkZST01fSU1BR0UgPyBcIkltYWdlXCIgOiB1bmRlZmluZWQsXG4gICAgICBydW50aW1lOlxuICAgICAgICBwcm9wcy5ydW50aW1lID09PSBSdW50aW1lLkZST01fSU1BR0UgPyB1bmRlZmluZWQgOiBwcm9wcy5ydW50aW1lLm5hbWUsXG4gICAgICAvLyAvLyBTb3VyY2UgQ29kZSBLTVMgbm90IHN1cHBvcnRlZCBieSBUZXJyYWZvcm0gcHJvdmlkZXI/XG4gICAgICAvLyAvLyBzZWU6IGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVGVtcGxhdGVSZWZlcmVuY2UvYXdzLXByb3BlcnRpZXMtbGFtYmRhLWZ1bmN0aW9uLWNvZGUuaHRtbCNjZm4tbGFtYmRhLWZ1bmN0aW9uLWNvZGUtc291cmNla21za2V5YXJuXG4gICAgICAvLyBzb3VyY2VLbXNLZXlBcm46IGNvZGUuc291cmNlS01TS2V5QXJuLFxuICAgICAgcm9sZTogdGhpcy5yb2xlLnJvbGVBcm4sXG4gICAgICAvLyBUT0RPOiBDREsgU29ydHMgZW52aXJvbm1lbnQgdG8gbWF0Y2ggTGFtYmRhIEhhc2ggYmVoYXZpb3VyXG4gICAgICAvLyBUT0RPOiBEbyBub3Qgc2V0IHRoaXMgYXQgYWxsIGlmIG5vIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc2V0IChDb21wbGV4TGlzdCBjYW4ndCBiZSBJUmVzb2x2YWJsZSlcbiAgICAgIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTU2LjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLWxhbWJkYS9saWIvZnVuY3Rpb24udHMjTDE0NjdcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIHZhcmlhYmxlczogTGF6eS5hbnlWYWx1ZSh7XG4gICAgICAgICAgcHJvZHVjZTogKF9jb250ZXh0OiBJUmVzb2x2ZUNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVudmlyb25tZW50O1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pIGFzIGFueSxcbiAgICAgIH0sXG4gICAgICBtZW1vcnlTaXplLFxuICAgICAgLy8gVE9ETzogcmUtYWRkIGVwaGVtZXJhbFN0b3JhZ2VcbiAgICAgIHZwY0NvbmZpZzogdGhpcy5wYXJzZVZwY0NvbmZpZyhwcm9wcy5uZXR3b3JrQ29uZmlnKSxcbiAgICAgIGRlYWRMZXR0ZXJDb25maWc6IHRoaXMucGFyc2VEZWFkTGV0dGVyQ29uZmlnKGRscVRvcGljT3JRdWV1ZSksXG4gICAgICByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zLFxuICAgICAgaW1hZ2VDb25maWc6IHVuZGVmaW5lZElmTm9LZXlzKHtcbiAgICAgICAgY29tbWFuZDogY29kZS5pbWFnZT8uY21kLFxuICAgICAgICBlbnRyeVBvaW50OiBjb2RlLmltYWdlPy5lbnRyeXBvaW50LFxuICAgICAgICB3b3JraW5nRGlyZWN0b3J5OiBjb2RlLmltYWdlPy53b3JraW5nRGlyZWN0b3J5LFxuICAgICAgfSksXG4gICAgICAvLyBUT0RPOiByZS1hZGQga21zS2V5QXJuIGZvciBlbnZpcm9ubWVudCBlbmNyeXB0aW9uXG4gICAgICAvLyBUT0RPOiByZS1hZGQgZmlsZVN5c3RlbUNvbmZpZ3MgZm9yIEVGUyBzdXBwb3J0LFxuICAgICAgLy8gVE9ETzogcmUtYWRkIGNvZGVTaWduaW5nQ29uZmlnQXJuXG4gICAgICBhcmNoaXRlY3R1cmVzOiBbXG4gICAgICAgIC8vIFRoaXMgaXMgYW4gYXJyYXksIGJ1dCBtYXhpbXVtIGxlbmd0aCBpcyAxIVxuICAgICAgICAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcmVzb3VyY2UtbGFtYmRhLWZ1bmN0aW9uLmh0bWwjY2ZuLWxhbWJkYS1mdW5jdGlvbi1hcmNoaXRlY3R1cmVzXG4gICAgICAgIHByb3BzLmFyY2hpdGVjdHVyZT8udG9TdHJpbmcoKSA/PyBBcmNoaXRlY3R1cmUuWDg2XzY0LnRvU3RyaW5nKCksXG4gICAgICBdLFxuICAgICAgLy8gVE9ETzogcmUtYWRkIHJ1bnRpbWVNYW5hZ2VtZW50Q29uZmlnXG4gICAgICAvLyBUT0RPOiByZS1hZGQgc25hcFN0YXJ0XG4gICAgICBsb2dnaW5nQ29uZmlnOiB0aGlzLmdldExvZ2dpbmdDb25maWcodGhpcy5fbG9nR3JvdXAubmFtZSwgcHJvcHMpLFxuICAgICAgLy8gVE9ETzogcmUtYWRkIHJlY3Vyc2l2ZUxvb3AgZGV0ZWN0aW9uXG4gICAgICB0cmFjaW5nQ29uZmlnOiB0aGlzLnBhcnNlVHJhY2luZ0NvbmZpZyhwcm9wcy50cmFjaW5nID8/IFRyYWNpbmcuQUNUSVZFKSxcbiAgICAgIHB1Ymxpc2g6IHByb3BzLnB1Ymxpc2gsXG4gICAgICAvLyBUT0RPOiB1c2UgbG9nR3JvdXAubm9kZS5hZGREZXBlbmRlbmN5IHdoZW4gbG9nR3JvdXAgaXMgaW1wbGVtZW50ZWRcbiAgICAgIGRlcGVuZHNPbjogW2xvZ0dyb3VwXSxcbiAgICB9KTtcbiAgICAvLyBOT1RFOiBTaG91bGQgdGhpcyBiZSBmdW5jdGlvbk5hbWUgaW5wdXQgaW5zdGVhZCBvZiBUT0tFTj9cbiAgICB0aGlzLmZ1bmN0aW9uTmFtZSA9IHRoaXMucmVzb3VyY2UuZnVuY3Rpb25OYW1lO1xuXG4gICAgLy8gbWFrZSBzdXJlIGFueSByb2xlIGF0dGFjaG1lbnRzIGFyZSBhZGRlZCBhcyBkZXBlbmRlbmNpZXMgZm9yIHRoaXMgbGFtYmRhXG4gICAgLy8gdGhpcyBhY2hpZXZlZCBieSB0aGUgQ0RLVEYgQXNwZWN0IG9uIHRoZSBwYXJlbnQgU3RhY2tCYXNlXG4gICAgdGhpcy5yZXNvdXJjZS5ub2RlLmFkZERlcGVuZGVuY3kodGhpcy5yb2xlKTtcblxuICAgIHRoaXMudGltZW91dCA9IHByb3BzLnRpbWVvdXQ7XG4gICAgdGhpcy5hcmNoaXRlY3R1cmUgPSBwcm9wcy5hcmNoaXRlY3R1cmUgPz8gQXJjaGl0ZWN0dXJlLlg4Nl82NDtcblxuICAgIC8vIFRPRE86IEFkZCBhd3NfbGFtYmRhX3Byb3Zpc2lvbmVkX2NvbmN1cnJlbmN5X2NvbmZpZ1xuXG4gICAgZm9yIChjb25zdCBldmVudCBvZiBwcm9wcy5ldmVudHMgfHwgW10pIHtcbiAgICAgIHRoaXMuYWRkRXZlbnRTb3VyY2UoZXZlbnQpO1xuICAgIH1cblxuICAgIC8vIC8vIFRPRE86IHBlbmRpbmcgY3VzdG9tIENMSSB0byBtb2NrIExhbWJkYSBmdW5jdGlvbiBpbnZvY2F0aW9ucyBsb2NhbGx5XG4gICAgLy8gcHJvcHMuY29kZS5iaW5kVG9SZXNvdXJjZSh0aGlzKTtcblxuICAgIC8vIEV2ZW50IEludm9rZSBDb25maWdcbiAgICBpZiAoXG4gICAgICBwcm9wcy5vbkZhaWx1cmUgfHxcbiAgICAgIHByb3BzLm9uU3VjY2VzcyB8fFxuICAgICAgcHJvcHMubWF4RXZlbnRBZ2UgfHxcbiAgICAgIHByb3BzLnJldHJ5QXR0ZW1wdHMgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgdGhpcy5jb25maWd1cmVBc3luY0ludm9rZSh7XG4gICAgICAgIG9uRmFpbHVyZTogcHJvcHMub25GYWlsdXJlLFxuICAgICAgICBvblN1Y2Nlc3M6IHByb3BzLm9uU3VjY2VzcyxcbiAgICAgICAgbWF4RXZlbnRBZ2U6IHByb3BzLm1heEV2ZW50QWdlLFxuICAgICAgICByZXRyeUF0dGVtcHRzOiBwcm9wcy5yZXRyeUF0dGVtcHRzLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5fb3V0cHV0cyA9IHtcbiAgICAgIG5hbWU6IHRoaXMuZnVuY3Rpb25OYW1lLFxuICAgICAgYXJuOiB0aGlzLnJlc291cmNlLmFybixcbiAgICAgIHJvbGVBcm46IHRoaXMucm9sZS5yb2xlQXJuLFxuICAgICAgLy8gb25seSBrbm93biBhdCBzeW50aCB0aW1lXG4gICAgICAvLyBleHBsaWNpdCBgbnVsbGAgcmVxdWlyZWQgdG8gYXZvaWQgc3ludGF4IGVycm9ycyB3aGVuIHVzaW5nIHN0cmluZ1ZhbHVlICYmIFwidW5kZWZpbmVkXCJcbiAgICAgIHVybDogTGF6eS5hbnlWYWx1ZSh7XG4gICAgICAgIHByb2R1Y2U6ICgpID0+IHRoaXMuX3VybCA/PyBudWxsLFxuICAgICAgfSksXG4gICAgICBkZWZhdWx0U2VjdXJpdHlHcm91cDogTGF6eS5hbnlWYWx1ZSh7XG4gICAgICAgIHByb2R1Y2U6ICgpID0+IHRoaXMuX3NlY3VyaXR5R3JvdXA/LmlkID8/IG51bGwsXG4gICAgICB9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhpcyBMYW1iZGEgZnVuY3Rpb24uXG4gICAqIElmIHRoaXMgaXMgYSByZWYgdG8gYSBMYW1iZGEgZnVuY3Rpb24sIHRoaXMgb3BlcmF0aW9uIHJlc3VsdHMgaW4gYSBuby1vcC5cbiAgICogQHBhcmFtIGtleSBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUga2V5LlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlJ3MgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgYWRkRW52aXJvbm1lbnQoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBJRnVuY3Rpb24ge1xuICAgIC8vIFJlc2VydmVkIGVudmlyb25tZW50IHZhcmlhYmxlcyB3aWxsIGZhaWwgZHVyaW5nIGNsb3VkZm9ybWF0aW9uIGRlcGxveSBpZiB0aGV5J3JlIHNldC5cbiAgICAvLyBUaGlzIGNoZWNrIGlzIGp1c3QgdG8gYWxsb3cgQ0RLIHRvIGZhaWwgZmFzdGVyIHdoZW4gdGhlc2UgYXJlIHNwZWNpZmllZC5cbiAgICBjb25zdCByZXNlcnZlZEVudmlyb25tZW50VmFyaWFibGVzID0gW1xuICAgICAgXCJfSEFORExFUlwiLFxuICAgICAgXCJfWF9BTVpOX1RSQUNFX0lEXCIsXG4gICAgICBcIkFXU19ERUZBVUxUX1JFR0lPTlwiLFxuICAgICAgXCJBV1NfUkVHSU9OXCIsXG4gICAgICBcIkFXU19FWEVDVVRJT05fRU5WXCIsXG4gICAgICBcIkFXU19MQU1CREFfRlVOQ1RJT05fTkFNRVwiLFxuICAgICAgXCJBV1NfTEFNQkRBX0ZVTkNUSU9OX01FTU9SWV9TSVpFXCIsXG4gICAgICBcIkFXU19MQU1CREFfRlVOQ1RJT05fVkVSU0lPTlwiLFxuICAgICAgXCJBV1NfTEFNQkRBX0lOSVRJQUxJWkFUSU9OX1RZUEVcIixcbiAgICAgIFwiQVdTX0xBTUJEQV9MT0dfR1JPVVBfTkFNRVwiLFxuICAgICAgXCJBV1NfTEFNQkRBX0xPR19TVFJFQU1fTkFNRVwiLFxuICAgICAgXCJBV1NfQUNDRVNTX0tFWVwiLFxuICAgICAgXCJBV1NfQUNDRVNTX0tFWV9JRFwiLFxuICAgICAgXCJBV1NfU0VDUkVUX0FDQ0VTU19LRVlcIixcbiAgICAgIFwiQVdTX1NFU1NJT05fVE9LRU5cIixcbiAgICAgIFwiQVdTX0xBTUJEQV9SVU5USU1FX0FQSVwiLFxuICAgICAgXCJMQU1CREFfVEFTS19ST09UXCIsXG4gICAgICBcIkxBTUJEQV9SVU5USU1FX0RJUlwiLFxuICAgIF07XG4gICAgaWYgKHJlc2VydmVkRW52aXJvbm1lbnRWYXJpYWJsZXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtrZXl9IGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHJlc2VydmVkIGJ5IHRoZSBsYW1iZGEgcnVudGltZSBhbmQgY2FuIG5vdCBiZSBzZXQgbWFudWFsbHkuIFNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFtYmRhL2xhdGVzdC9kZy9jb25maWd1cmF0aW9uLWVudnZhcnMuaHRtbGAsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmVudmlyb25tZW50W2tleV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyBhZGRGdW5jdGlvblVybChvcHRpb25zPzogRnVuY3Rpb25VcmxPcHRpb25zKTogRnVuY3Rpb25Vcmwge1xuICAgIGNvbnN0IGVuZHBvaW50ID0gc3VwZXIuYWRkRnVuY3Rpb25Vcmwob3B0aW9ucyk7XG4gICAgdGhpcy5fdXJsID0gZW5kcG9pbnQudXJsO1xuICAgIHJldHVybiBlbmRwb2ludDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgTG9nZ2luZyBDb25maWcgcHJvcGV0eSBmb3IgdGhlIGZ1bmN0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBmdW5jdGlvbiBMb2dnaW5nQ29uZmlnIFByb3BlcnR5IGlmIHRoZSBwcm9wZXJ0eSBpcyBzZXQgb24gdGhlXG4gICAqIGZ1bmN0aW9uIGFuZCB1bmRlZmluZWQgaWYgbm90LlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRMb2dnaW5nQ29uZmlnKFxuICAgIGxvZ0dyb3VwTmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBGdW5jdGlvblByb3BzLFxuICApOiBsYW1iZGFGdW5jdGlvbi5MYW1iZGFGdW5jdGlvbkxvZ2dpbmdDb25maWcgfCB1bmRlZmluZWQge1xuICAgIGlmIChwcm9wcy5hcHBsaWNhdGlvbkxvZ0xldmVsIHx8IHByb3BzLnN5c3RlbUxvZ0xldmVsKSB7XG4gICAgICBpZiAocHJvcHMubG9nZ2luZ0Zvcm1hdCAhPT0gTG9nZ2luZ0Zvcm1hdC5KU09OKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVG8gdXNlIEFwcGxpY2F0aW9uTG9nTGV2ZWwgYW5kL29yIFN5c3RlbUxvZ0xldmVsIHlvdSBtdXN0IHNldCBMb2dnaW5nRm9ybWF0IHRvICcke0xvZ2dpbmdGb3JtYXQuSlNPTn0nLCBnb3QgJyR7cHJvcHMubG9nZ2luZ0Zvcm1hdH0nLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGxvZ2dpbmdDb25maWc6IGxhbWJkYUZ1bmN0aW9uLkxhbWJkYUZ1bmN0aW9uTG9nZ2luZ0NvbmZpZztcbiAgICBpZiAocHJvcHMubG9nZ2luZ0Zvcm1hdCkge1xuICAgICAgbG9nZ2luZ0NvbmZpZyA9IHtcbiAgICAgICAgbG9nRm9ybWF0OiBwcm9wcy5sb2dnaW5nRm9ybWF0LFxuICAgICAgICBzeXN0ZW1Mb2dMZXZlbDogcHJvcHMuc3lzdGVtTG9nTGV2ZWwsXG4gICAgICAgIGFwcGxpY2F0aW9uTG9nTGV2ZWw6IHByb3BzLmFwcGxpY2F0aW9uTG9nTGV2ZWwsXG4gICAgICAgIGxvZ0dyb3VwOiBsb2dHcm91cE5hbWUsXG4gICAgICB9O1xuICAgICAgcmV0dXJuIGxvZ2dpbmdDb25maWc7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lcyBhbiBhbGlhcyBmb3IgdGhpcyBmdW5jdGlvbi5cbiAgICpcbiAgICogVGhlIGFsaWFzIHdpbGwgYXV0b21hdGljYWxseSBiZSB1cGRhdGVkIHRvIHBvaW50IHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZlxuICAgKiB0aGUgZnVuY3Rpb24gYXMgaXQgaXMgYmVpbmcgdXBkYXRlZCBkdXJpbmcgYSBkZXBsb3ltZW50LlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiBkZWNsYXJlIGNvbnN0IGZuOiBjb21wdXRlLkxhbWJkYUZ1bmN0aW9uO1xuICAgKlxuICAgKiBmbi5hZGRBbGlhcygnTGl2ZScpO1xuICAgKlxuICAgKiAvLyBJcyBlcXVpdmFsZW50IHRvXG4gICAqXG4gICAqIG5ldyBjb21wdXRlLkFsaWFzKHRoaXMsICdBbGlhc0xpdmUnLCB7XG4gICAqICAgYWxpYXNOYW1lOiAnTGl2ZScsXG4gICAqICAgdmVyc2lvbjogZm4udmVyc2lvbixcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gYWxpYXNOYW1lIFRoZSBuYW1lIG9mIHRoZSBhbGlhc1xuICAgKiBAcGFyYW0gb3B0aW9ucyBBbGlhcyBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgYWRkQWxpYXMoYWxpYXNOYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiBBbGlhc09wdGlvbnMpOiBBbGlhcyB7XG4gICAgcmV0dXJuIGFkZEFsaWFzKHRoaXMsIHRoaXMsIHRoaXMudmVyc2lvbiwgYWxpYXNOYW1lLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcHRpb25hbGx5IGNyZWF0ZSBMYW1iZGFGdW5jdGlvblZwY0NvbmZpZ1xuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZVZwY0NvbmZpZyhcbiAgICBjb25maWc/OiBWcGNDb25maWcsXG4gICk6IGxhbWJkYUZ1bmN0aW9uLkxhbWJkYUZ1bmN0aW9uVnBjQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgbGV0IHNlY3VyaXR5R3JvdXBJZHMgPSBjb25maWcuc2VjdXJpdHlHcm91cElkcztcbiAgICBpZiAoIXNlY3VyaXR5R3JvdXBJZHMpIHtcbiAgICAgIHRoaXMuX3NlY3VyaXR5R3JvdXAgPSBuZXcgc2VjdXJpdHlHcm91cC5TZWN1cml0eUdyb3VwKFxuICAgICAgICB0aGlzLFxuICAgICAgICBcIlNlY3VyaXR5R3JvdXBcIixcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IHRoaXMuZnVuY3Rpb25OYW1lLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICB2cGNJZDogY29uZmlnLnZwY0lkLFxuXG4gICAgICAgICAgZWdyZXNzOiBjb25maWcuZWdyZXNzID8/IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZnJvbVBvcnQ6IDAsXG4gICAgICAgICAgICAgIHRvUG9ydDogMCxcbiAgICAgICAgICAgICAgcHJvdG9jb2w6IFwiLTFcIixcbiAgICAgICAgICAgICAgY2lkckJsb2NrczogW1wiMC4wLjAuMC8wXCJdLFxuICAgICAgICAgICAgICBpcHY2Q2lkckJsb2NrczogW1wiOjovMFwiXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICBzZWN1cml0eUdyb3VwSWRzID0gW3RoaXMuX3NlY3VyaXR5R3JvdXAuaWRdO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc3VibmV0SWRzOiBjb25maWcuc3VibmV0SWRzLFxuICAgICAgaXB2NkFsbG93ZWRGb3JEdWFsU3RhY2s6IGNvbmZpZy5pcHY2QWxsb3dlZEZvckR1YWxTdGFjayxcbiAgICAgIHNlY3VyaXR5R3JvdXBJZHMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgaXNRdWV1ZShkZWFkTGV0dGVyUXVldWU6IElRdWV1ZSk6IGRlYWRMZXR0ZXJRdWV1ZSBpcyBJUXVldWUge1xuICAgIHJldHVybiAoPElRdWV1ZT5kZWFkTGV0dGVyUXVldWUpLnF1ZXVlQXJuICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRGVhZExldHRlclF1ZXVlKHByb3BzOiBGdW5jdGlvblByb3BzKTogSVF1ZXVlIHwgdW5kZWZpbmVkIHtcbiAgICAvLyB8IHNucy5JVG9waWNcbiAgICBpZiAoXG4gICAgICAhcHJvcHMuZGVhZExldHRlclF1ZXVlICYmXG4gICAgICAhcHJvcHMuZGVhZExldHRlclF1ZXVlRW5hYmxlZFxuICAgICAgLy8gJiYgIXByb3BzLmRlYWRMZXR0ZXJUb3BpY1xuICAgICkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHByb3BzLmRlYWRMZXR0ZXJRdWV1ZSAmJiBwcm9wcy5kZWFkTGV0dGVyUXVldWVFbmFibGVkID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIFwiZGVhZExldHRlclF1ZXVlIGRlZmluZWQgYnV0IGRlYWRMZXR0ZXJRdWV1ZUVuYWJsZWQgZXhwbGljaXRseSBzZXQgdG8gZmFsc2VcIixcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIGlmIChcbiAgICAvLyAgIHByb3BzLmRlYWRMZXR0ZXJUb3BpYyAmJlxuICAgIC8vICAgKHByb3BzLmRlYWRMZXR0ZXJRdWV1ZSB8fCBwcm9wcy5kZWFkTGV0dGVyUXVldWVFbmFibGVkICE9PSB1bmRlZmluZWQpXG4gICAgLy8gKSB7XG4gICAgLy8gICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgLy8gICAgIFwiZGVhZExldHRlclF1ZXVlIGFuZCBkZWFkTGV0dGVyVG9waWMgY2Fubm90IGJlIHNwZWNpZmllZCB0b2dldGhlciBhdCB0aGUgc2FtZSB0aW1lXCIsXG4gICAgLy8gICApO1xuICAgIC8vIH1cblxuICAgIGxldCBkZWFkTGV0dGVyUXVldWU6IElRdWV1ZTsgLy8gfCBJVG9waWM7XG4gICAgLy8gaWYgKHByb3BzLmRlYWRMZXR0ZXJUb3BpYykge1xuICAgIC8vICAgZGVhZExldHRlclF1ZXVlID0gcHJvcHMuZGVhZExldHRlclRvcGljO1xuICAgIC8vICAgdGhpcy5hZGRUb1JvbGVQb2xpY3koXG4gICAgLy8gICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAvLyAgICAgICBhY3Rpb25zOiBbXCJzbnM6UHVibGlzaFwiXSxcbiAgICAvLyAgICAgICByZXNvdXJjZXM6IFtkZWFkTGV0dGVyUXVldWUudG9waWNBcm5dLFxuICAgIC8vICAgICB9KSxcbiAgICAvLyAgICk7XG4gICAgLy8gfSBlbHNlIHtcbiAgICBkZWFkTGV0dGVyUXVldWUgPVxuICAgICAgcHJvcHMuZGVhZExldHRlclF1ZXVlIHx8XG4gICAgICBuZXcgUXVldWUodGhpcywgXCJEZWFkTGV0dGVyUXVldWVcIiwge1xuICAgICAgICBtZXNzYWdlUmV0ZW50aW9uU2Vjb25kczogRHVyYXRpb24uZGF5cygxNCkudG9TZWNvbmRzKCksXG4gICAgICB9KTtcbiAgICB0aGlzLmFkZFRvUm9sZVBvbGljeShcbiAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogW1wic3FzOlNlbmRNZXNzYWdlXCJdLFxuICAgICAgICByZXNvdXJjZXM6IFtkZWFkTGV0dGVyUXVldWUucXVldWVBcm5dLFxuICAgICAgfSksXG4gICAgKTtcbiAgICAvLyB9XG5cbiAgICByZXR1cm4gZGVhZExldHRlclF1ZXVlO1xuICB9XG5cbiAgLy8gVE9ETzogU3VwcG9ydCBzbnMuSVRvcGljICsgc25zOlB1Ymxpc2ggdG9waWNBcm5cbiAgLyoqXG4gICAqIE9wdGlvbmFsbHkgY3JlYXRlIExhbWJkYUZ1bmN0aW9uRGVhZExldHRlckNvbmZpZ1xuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZURlYWRMZXR0ZXJDb25maWcoXG4gICAgZGVhZExldHRlclF1ZXVlPzogSVF1ZXVlLCAvLyB8IHNucy5JVG9waWNcbiAgKTogbGFtYmRhRnVuY3Rpb24uTGFtYmRhRnVuY3Rpb25EZWFkTGV0dGVyQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoZGVhZExldHRlclF1ZXVlKSB7XG4gICAgICAvLyB0aGlzLmlzUXVldWUoZGVhZExldHRlclF1ZXVlKSA/IGRlYWRMZXR0ZXJRdWV1ZS5xdWV1ZUFybiA6IC4uLlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFyZ2V0QXJuOiBkZWFkTGV0dGVyUXVldWUucXVldWVBcm4sXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VUcmFjaW5nQ29uZmlnKFxuICAgIHRyYWNpbmc6IFRyYWNpbmcsXG4gICk6IGxhbWJkYUZ1bmN0aW9uLkxhbWJkYUZ1bmN0aW9uVHJhY2luZ0NvbmZpZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRyYWNpbmcgPT09IHVuZGVmaW5lZCB8fCB0cmFjaW5nID09PSBUcmFjaW5nLkRJU0FCTEVEKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHRoaXMuYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbXCJ4cmF5OlB1dFRyYWNlU2VnbWVudHNcIiwgXCJ4cmF5OlB1dFRlbGVtZXRyeVJlY29yZHNcIl0sXG4gICAgICAgIHJlc291cmNlczogW1wiKlwiXSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbW9kZTogdHJhY2luZyxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogR2l2ZW4gYW4gb3BhcXVlICh0b2tlbikgQVJOLCByZXR1cm5zIGEgVEYgZXhwcmVzc2lvbiB0aGF0IGV4dHJhY3RzIHRoZSBmdW5jdGlvblxuICogbmFtZSBmcm9tIHRoZSBBUk4uXG4gKlxuICogRnVuY3Rpb24gQVJOcyBsb29rIGxpa2UgdGhpczpcbiAqXG4gKiAgIGFybjphd3M6bGFtYmRhOnJlZ2lvbjphY2NvdW50LWlkOmZ1bmN0aW9uOmZ1bmN0aW9uLW5hbWVcbiAqXG4gKiAuLndoaWNoIG1lYW5zIHRoYXQgaW4gb3JkZXIgdG8gZXh0cmFjdCB0aGUgYGZ1bmN0aW9uLW5hbWVgIGNvbXBvbmVudCBmcm9tIHRoZSBBUk4sIHdlIGNhblxuICogc3BsaXQgdGhlIEFSTiB1c2luZyBcIjpcIiBhbmQgc2VsZWN0IHRoZSBjb21wb25lbnQgaW4gaW5kZXggNi5cbiAqXG4gKiBAcmV0dXJucyBgZWxlbWVudChzcGxpdCgnOicsIGFybiksIDYpYFxuICovXG5mdW5jdGlvbiBleHRyYWN0TmFtZUZyb21Bcm4oYXJuOiBzdHJpbmcpIHtcbiAgY29uc3QgeyByZXNvdXJjZU5hbWUgfSA9IEFybi5zcGxpdChhcm4sIEFybkZvcm1hdC5DT0xPTl9SRVNPVVJDRV9OQU1FKTtcbiAgaWYgKCFyZXNvdXJjZU5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgTGFtYmRhIGZ1bmN0aW9uIEFSTjogJHthcm59YCk7XG4gIH1cbiAgLy8gaWYgKHJlc291cmNlTmFtZS5pbmNsdWRlcyhcIjpcIikpIHNwbGl0IG9mZiB0aGUgdmVyc2lvblxuICBpZiAocmVzb3VyY2VOYW1lLmluY2x1ZGVzKFwiOlwiKSkge1xuICAgIHJldHVybiByZXNvdXJjZU5hbWUuc3BsaXQoXCI6XCIpWzBdO1xuICB9XG4gIHJldHVybiByZXNvdXJjZU5hbWU7XG59XG5cbi8qKlxuICogWC1SYXkgVHJhY2luZyBNb2RlcyAoaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xhbWJkYS9sYXRlc3QvZGcvQVBJX1RyYWNpbmdDb25maWcuaHRtbClcbiAqL1xuZXhwb3J0IGVudW0gVHJhY2luZyB7XG4gIC8qKlxuICAgKiBMYW1iZGEgd2lsbCByZXNwZWN0IGFueSB0cmFjaW5nIGhlYWRlciBpdCByZWNlaXZlcyBmcm9tIGFuIHVwc3RyZWFtIHNlcnZpY2UuXG4gICAqIElmIG5vIHRyYWNpbmcgaGVhZGVyIGlzIHJlY2VpdmVkLCBMYW1iZGEgd2lsbCBzYW1wbGUgdGhlIHJlcXVlc3QgYmFzZWQgb24gYSBmaXhlZCByYXRlLiBQbGVhc2Ugc2VlIHRoZSBbVXNpbmcgQVdTIExhbWJkYSB3aXRoIEFXUyBYLVJheV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xhbWJkYS9sYXRlc3QvZGcvc2VydmljZXMteHJheS5odG1sKSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIG9uIHRoaXMgc2FtcGxpbmcgYmVoYXZpb3IuXG4gICAqL1xuICBBQ1RJVkUgPSBcIkFjdGl2ZVwiLFxuICAvKipcbiAgICogTGFtYmRhIHdpbGwgb25seSB0cmFjZSB0aGUgcmVxdWVzdCBmcm9tIGFuIHVwc3RyZWFtIHNlcnZpY2VcbiAgICogaWYgaXQgY29udGFpbnMgYSB0cmFjaW5nIGhlYWRlciB3aXRoIFwic2FtcGxlZD0xXCJcbiAgICovXG4gIFBBU1NfVEhST1VHSCA9IFwiUGFzc1Rocm91Z2hcIixcbiAgLyoqXG4gICAqIExhbWJkYSB3aWxsIG5vdCB0cmFjZSBhbnkgcmVxdWVzdC5cbiAgICovXG4gIERJU0FCTEVEID0gXCJEaXNhYmxlZFwiLFxufVxuXG4vKipcbiAqIExhbWJkYSBzZXJ2aWNlIHdpbGwgYXV0b21hdGljYWxseSBjYXB0dXJlcyBzeXN0ZW0gbG9ncyBhYm91dCBmdW5jdGlvbiBpbnZvY2F0aW9uXG4gKiBnZW5lcmF0ZWQgYnkgdGhlIExhbWJkYSBzZXJ2aWNlIChrbm93biBhcyBzeXN0ZW0gbG9ncykgYW5kIHNlbmRzIHRoZXNlIGxvZ3MgdG8gYVxuICogZGVmYXVsdCBDbG91ZFdhdGNoIGxvZyBncm91cCBuYW1lZCBhZnRlciB0aGUgTGFtYmRhIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZW51bSBTeXN0ZW1Mb2dMZXZlbCB7XG4gIC8qKlxuICAgKiBMYW1iZGEgd2lsbCBjYXB0dXJlIG9ubHkgbG9ncyBhdCBpbmZvIGxldmVsLlxuICAgKi9cbiAgSU5GTyA9IFwiSU5GT1wiLFxuICAvKipcbiAgICogTGFtYmRhIHdpbGwgY2FwdHVyZSBvbmx5IGxvZ3MgYXQgZGVidWcgbGV2ZWwuXG4gICAqL1xuICBERUJVRyA9IFwiREVCVUdcIixcbiAgLyoqXG4gICAqIExhbWJkYSB3aWxsIGNhcHR1cmUgb25seSBsb2dzIGF0IHdhcm4gbGV2ZWwuXG4gICAqL1xuICBXQVJOID0gXCJXQVJOXCIsXG59XG5cbi8qKlxuICogTGFtYmRhIHNlcnZpY2UgYXV0b21hdGljYWxseSBjYXB0dXJlcyBsb2dzIGdlbmVyYXRlZCBieSB0aGUgZnVuY3Rpb24gY29kZVxuICogKGtub3duIGFzIGFwcGxpY2F0aW9uIGxvZ3MpIGFuZCBzZW5kcyB0aGVzZSBsb2dzIHRvIGEgZGVmYXVsdCBDbG91ZFdhdGNoXG4gKiBsb2cgZ3JvdXAgbmFtZWQgYWZ0ZXIgdGhlIExhbWJkYSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGVudW0gQXBwbGljYXRpb25Mb2dMZXZlbCB7XG4gIC8qKlxuICAgKiBMYW1iZGEgd2lsbCBjYXB0dXJlIG9ubHkgbG9ncyBhdCBpbmZvIGxldmVsLlxuICAgKi9cbiAgSU5GTyA9IFwiSU5GT1wiLFxuICAvKipcbiAgICogTGFtYmRhIHdpbGwgY2FwdHVyZSBvbmx5IGxvZ3MgYXQgZGVidWcgbGV2ZWwuXG4gICAqL1xuICBERUJVRyA9IFwiREVCVUdcIixcbiAgLyoqXG4gICAqIExhbWJkYSB3aWxsIGNhcHR1cmUgb25seSBsb2dzIGF0IHdhcm4gbGV2ZWwuXG4gICAqL1xuICBXQVJOID0gXCJXQVJOXCIsXG4gIC8qKlxuICAgKiBMYW1iZGEgd2lsbCBjYXB0dXJlIG9ubHkgbG9ncyBhdCB0cmFjZSBsZXZlbC5cbiAgICovXG4gIFRSQUNFID0gXCJUUkFDRVwiLFxuICAvKipcbiAgICogTGFtYmRhIHdpbGwgY2FwdHVyZSBvbmx5IGxvZ3MgYXQgZXJyb3IgbGV2ZWwuXG4gICAqL1xuICBFUlJPUiA9IFwiRVJST1JcIixcbiAgLyoqXG4gICAqIExhbWJkYSB3aWxsIGNhcHR1cmUgb25seSBsb2dzIGF0IGZhdGFsIGxldmVsLlxuICAgKi9cbiAgRkFUQUwgPSBcIkZBVEFMXCIsXG59XG5cbi8qKlxuICogVGhpcyBmaWVsZCB0YWtlcyBpbiAyIHZhbHVlcyBlaXRoZXIgVGV4dCBvciBKU09OLiBCeSBzZXR0aW5nIHRoaXMgdmFsdWUgdG8gVGV4dCxcbiAqIHdpbGwgcmVzdWx0IGluIHRoZSBjdXJyZW50IHN0cnVjdHVyZSBvZiBsb2dzIGZvcm1hdCwgd2hlcmVhcywgYnkgc2V0dGluZyB0aGlzIHZhbHVlIHRvIEpTT04sXG4gKiBMYW1iZGEgd2lsbCBwcmludCB0aGUgbG9ncyBhcyBTdHJ1Y3R1cmVkIEpTT04gTG9ncywgd2l0aCB0aGUgY29ycmVzcG9uZGluZyB0aW1lc3RhbXAgYW5kIGxvZyBsZXZlbFxuICogb2YgZWFjaCBldmVudC4gU2VsZWN0aW5nIOKAmEpTT07igJkgZm9ybWF0IHdpbGwgb25seSBhbGxvdyBjdXN0b21lcuKAmXMgdG8gaGF2ZSBkaWZmZXJlbnQgbG9nIGxldmVsXG4gKiBBcHBsaWNhdGlvbiBsb2cgbGV2ZWwgYW5kIHRoZSBTeXN0ZW0gbG9nIGxldmVsLlxuICovXG5leHBvcnQgZW51bSBMb2dnaW5nRm9ybWF0IHtcbiAgLyoqXG4gICAqIExhbWJkYSBMb2dzIHRleHQgZm9ybWF0LlxuICAgKi9cbiAgVEVYVCA9IFwiVGV4dFwiLFxuICAvKipcbiAgICogTGFtYmRhIHN0cnVjdHVyZWQgbG9nZ2luZyBpbiBKc29uIGZvcm1hdC5cbiAgICovXG4gIEpTT04gPSBcIkpTT05cIixcbn1cblxuLyoqXG4gKiBBIGRlc3RpbmF0aW9uIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEbHFEZXN0aW5hdGlvbkNvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIGRlc3RpbmF0aW9uIHJlc291cmNlXG4gICAqL1xuICByZWFkb25seSBkZXN0aW5hdGlvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgRExRIGZvciBhbiBldmVudCBzb3VyY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXZlbnRTb3VyY2VEbHEge1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgRExRIGRlc3RpbmF0aW9uIGNvbmZpZyBvZiB0aGUgRExRXG4gICAqL1xuICBiaW5kKFxuICAgIHRhcmdldDogSUV2ZW50U291cmNlTWFwcGluZyxcbiAgICB0YXJnZXRIYW5kbGVyOiBJRnVuY3Rpb24sXG4gICk6IERscURlc3RpbmF0aW9uQ29uZmlnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmVyaWZ5Q29kZUNvbmZpZyhjb2RlOiBDb2RlQ29uZmlnLCBwcm9wczogRnVuY3Rpb25Qcm9wcykge1xuICAvLyBtdXR1YWxseSBleGNsdXNpdmVcbiAgY29uc3QgY29kZVR5cGUgPSBbY29kZS5pbmxpbmVDb2RlLCBjb2RlLnMzTG9jYXRpb24sIGNvZGUuaW1hZ2VdO1xuXG4gIGlmIChjb2RlVHlwZS5maWx0ZXIoKHgpID0+ICEheCkubGVuZ3RoICE9PSAxKSB7XG4gICAgLy8gdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdsYW1iZGEuQ29kZSBtdXN0IHNwZWNpZnkgZXhhY3RseSBvbmUgb2Y6IFwiaW5saW5lQ29kZVwiLCBcInMzTG9jYXRpb25cIiwgb3IgXCJpbWFnZVwiJyxcbiAgICApO1xuICB9XG5cbiAgaWYgKCEhY29kZS5pbWFnZSA9PT0gKHByb3BzLmhhbmRsZXIgIT09IEhhbmRsZXIuRlJPTV9JTUFHRSkpIHtcbiAgICAvLyB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJoYW5kbGVyIG11c3QgYmUgYEhhbmRsZXIuRlJPTV9JTUFHRWAgd2hlbiB1c2luZyBpbWFnZSBhc3NldCBmb3IgTGFtYmRhIGZ1bmN0aW9uXCIsXG4gICAgKTtcbiAgfVxuXG4gIGlmICghIWNvZGUuaW1hZ2UgPT09IChwcm9wcy5ydW50aW1lICE9PSBSdW50aW1lLkZST01fSU1BR0UpKSB7XG4gICAgLy8gdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwicnVudGltZSBtdXN0IGJlIGBSdW50aW1lLkZST01fSU1BR0VgIHdoZW4gdXNpbmcgaW1hZ2UgYXNzZXQgZm9yIExhbWJkYSBmdW5jdGlvblwiLFxuICAgICk7XG4gIH1cblxuICAvLyBpZiB0aGlzIGlzIGlubGluZSBjb2RlLCBjaGVjayB0aGF0IHRoZSBydW50aW1lIHN1cHBvcnRzXG4gIGlmIChjb2RlLmlubGluZUNvZGUgJiYgIXByb3BzLnJ1bnRpbWUuc3VwcG9ydHNJbmxpbmVDb2RlKSB7XG4gICAgLy8gdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgIHRocm93IG5ldyBFcnJvcihgSW5saW5lIHNvdXJjZSBub3QgYWxsb3dlZCBmb3IgJHtwcm9wcy5ydW50aW1lIS5uYW1lfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuZGVmaW5lZElmTm9LZXlzPEEgZXh0ZW5kcyB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfT4oXG4gIHN0cnVjdDogQSxcbik6IEEgfCB1bmRlZmluZWQge1xuICBjb25zdCBhbGxVbmRlZmluZWQgPSBPYmplY3QudmFsdWVzKHN0cnVjdCkuZXZlcnkoKHZhbCkgPT4gdmFsID09PSB1bmRlZmluZWQpO1xuICByZXR1cm4gYWxsVW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc3RydWN0O1xufVxuIl19
780
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXdzL2NvbXB1dGUvZnVuY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQXN0Q0EsNENBOEJDOztBQXB2Q0QsNkpBQTZKO0FBQzdKLDJIQUEySDtBQUMzSCxzREFNNkI7QUFDN0IsaUNBQWtFO0FBRWxFLGdDQUF3QztBQUN4Qyw0Q0FBd0M7QUFDeEMsb0RBQWlEO0FBQ2pELGlEQUE4QztBQUs5QyxtREFLeUI7QUFHekIsdUNBQW9DO0FBQ3BDLGlDQUFrQztBQUNsQyw2Q0FBMEM7QUFDMUMseUNBQXlDO0FBQ3pDLDhCQUE4QjtBQUM5QixzQ0FBMEM7QUFDMUMsdUNBQW9DO0FBa1FwQywyQkFBMkI7QUFFM0IsTUFBTTtBQUNOLHdCQUF3QjtBQUN4QixNQUFNO0FBQ04scUVBQXFFO0FBRXJFLFFBQVE7QUFDUixxREFBcUQ7QUFDckQsUUFBUTtBQUNSLDJEQUEyRDtBQUMzRCxJQUFJO0FBRUo7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBYSxjQUFlLFNBQVEsa0NBQWtCO0lBQ3BELDZEQUE2RDtJQUU3RDs7T0FFRztJQUNILElBQVcsT0FBTztRQUNoQiwyQ0FBMkM7UUFDM0MsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsZ0JBQWdCLENBQzVCLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixZQUFvQjtRQUVwQixPQUFPLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ3RELFdBQVcsRUFBRSxvQkFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQ3BELE9BQU8sRUFBRSxRQUFRO2dCQUNqQixRQUFRLEVBQUUsVUFBVTtnQkFDcEIsWUFBWSxFQUFFLFlBQVk7Z0JBQzFCLFNBQVMsRUFBRSxlQUFTLENBQUMsbUJB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QUFJLENBQUMsVUFBVSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQ3pELHFDQUFxQztRQUNyQyxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxLQUFLLENBQUMsT0FBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDMUUsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUN4QixNQUFTO0lBRVQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQztJQUM3RSxPQUFPLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDM0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIHNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2Nka3RmLXBsdXMvY2RrdGYtcGx1cy9ibG9iLzU4NmFhYmFkM2FiMmZiMmEyZTkzZTA1ZWQzM2Y5NDQ3NGViZTkzOTcvcGFja2FnZXMvJTQwY2RrdGYtcGx1cy9hd3MvbGliL2F3cy1sYW1iZGEtZnVuY3Rpb24vaW5kZXgudHNcbi8vIHVwZGF0ZSB0byBhbGlnbiBjbG9zZXIgd2l0aCBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNTYuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtbGFtYmRhL2xpYi9mdW5jdGlvbi50c1xuaW1wb3J0IHtcbiAgbGFtYmRhRnVuY3Rpb24sXG4gIGNsb3Vkd2F0Y2hMb2dHcm91cCxcbiAgc2VjdXJpdHlHcm91cCxcbiAgbGFtYmRhRXZlbnRTb3VyY2VNYXBwaW5nLFxuICBkYXRhQXdzTGFtYmRhRnVuY3Rpb24sXG59IGZyb20gXCJAY2RrdGYvcHJvdmlkZXItYXdzXCI7XG5pbXBvcnQgeyBJUmVzb2x2ZUNvbnRleHQsIExhenksIElSZXNvbHZhYmxlLCBUb2tlbiB9IGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IEFybkZvcm1hdCwgQXJuIH0gZnJvbSBcIi4uL2FyblwiO1xuaW1wb3J0IHsgQXdzU3RhY2sgfSBmcm9tIFwiLi4vYXdzLXN0YWNrXCI7XG5pbXBvcnQgeyBSZXRlbnRpb25EYXlzIH0gZnJvbSBcIi4uL2xvZy1yZXRlbnRpb25cIjtcbmltcG9ydCB7IEFyY2hpdGVjdHVyZSB9IGZyb20gXCIuL2FyY2hpdGVjdHVyZVwiO1xuaW1wb3J0IHsgQ29kZSwgQ29kZUNvbmZpZyB9IGZyb20gXCIuL2NvZGVcIjtcbmltcG9ydCB7IEV2ZW50SW52b2tlQ29uZmlnT3B0aW9ucyB9IGZyb20gXCIuL2V2ZW50LWludm9rZS1jb25maWdcIjtcbmltcG9ydCB7IElFdmVudFNvdXJjZU1hcHBpbmcgfSBmcm9tIFwiLi9ldmVudC1zb3VyY2UtbWFwcGluZ1wiO1xuaW1wb3J0IHsgQWxpYXNPcHRpb25zLCBBbGlhcyB9IGZyb20gXCIuL2Z1bmN0aW9uLWFsaWFzXCI7XG5pbXBvcnQge1xuICBMYW1iZGFGdW5jdGlvbkJhc2UsXG4gIElGdW5jdGlvbixcbiAgRnVuY3Rpb25BdHRyaWJ1dGVzLFxuICBJRXZlbnRTb3VyY2UsXG59IGZyb20gXCIuL2Z1bmN0aW9uLWJhc2VcIjtcbmltcG9ydCB7IEZ1bmN0aW9uVXJsLCBGdW5jdGlvblVybE9wdGlvbnMgfSBmcm9tIFwiLi9mdW5jdGlvbi11cmxcIjtcbmltcG9ydCB7IFZwY0NvbmZpZyB9IGZyb20gXCIuL2Z1bmN0aW9uLXZwYy1jb25maWcuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBIYW5kbGVyIH0gZnJvbSBcIi4vaGFuZGxlclwiO1xuaW1wb3J0IHsgYWRkQWxpYXMgfSBmcm9tIFwiLi91dGlsXCI7XG5pbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gXCIuLi8uLi9kdXJhdGlvblwiO1xuLy8gaW1wb3J0IHsgRm4gfSBmcm9tIFwiLi4vLi4vdGVycmEtZnVuY1wiO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gXCIuLi9pYW1cIjtcbmltcG9ydCB7IElRdWV1ZSwgUXVldWUgfSBmcm9tIFwiLi4vbm90aWZ5XCI7XG5pbXBvcnQgeyBSdW50aW1lIH0gZnJvbSBcIi4vcnVudGltZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uT3V0cHV0cyB7XG4gIC8qKlxuICAgKiBBV1MgTGFtYmRhIGZ1bmN0aW9uIG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQVdTIExhbWJkYSBhcm4gb2YgdGhlIGZ1bmN0aW9uXG4gICAqL1xuICByZWFkb25seSBhcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElBTSBSb2xlIGFzc29jaWF0ZWQgd2l0aCB0aGUgTGFtYmRhIGZ1bmN0aW9uXG4gICAqL1xuICByZWFkb25seSByb2xlQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIFVSTCBpZiBlbmFibGVkXG4gICAqL1xuICByZWFkb25seSB1cmw/OiBzdHJpbmcgfCBJUmVzb2x2YWJsZTtcblxuICAvKipcbiAgICogU2VjdXJpdHkgZ3JvdXAgb2YgdGhlIGZ1bmN0aW9uIGlmIGNyZWF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRTZWN1cml0eUdyb3VwPzogc3RyaW5nIHwgSVJlc29sdmFibGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb25PcHRpb25zIGV4dGVuZHMgRXZlbnRJbnZva2VDb25maWdPcHRpb25zIHtcbiAgLyoqXG4gICAqIEZvcmNlIGZ1bmN0aW9uIG5hbWUgKGZvciBhZG9wdGlvbiBvZiBleGlzdGluZyByZXNvdXJjZXMpLlxuICAgKlxuICAgKiBQcmVmZXIgdG8gdXNlIGZ1bmN0aW9uTmFtZVByZWZpeC5cbiAgICpcbiAgICogVXNlIFtUZXJyYWZvcm0gUmVzb3VyY2UgTWV0YSBBcmd1bWVudHNdKGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL3Jlc291cmNlcy9zeW50YXgjbWV0YS1hcmd1bWVudHMpXG4gICAqIHRvIGNvbnRyb2wgbGlmZWN5Y2xlIHdoZW4gcmVwbGFjaW5nIHRoZSBmdW5jdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiBvbWl0dGVkLCBSZWZlciB0byBgZnVuY3Rpb25OYW1lUHJlZml4YC5cbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogQSBuYW1lIHByZWZpeCBmb3IgdGhlIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEdyaWQgZ2VuZXJhdGVzIGEgdW5pcXVlIHBoeXNpY2FsIElEIGFuZCB1c2VzIHRoYXRcbiAgICogSUQgZm9yIHRoZSBmdW5jdGlvbidzIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbk5hbWVQcmVmaXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gYmUgcGFzc2VkIHRvIHRoZSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqXG4gICAqIEtleS12YWx1ZSBwYWlycyB0aGF0IExhbWJkYSBjYWNoZXMgYW5kIG1ha2VzIGF2YWlsYWJsZSBmb3IgeW91ciBMYW1iZGFcbiAgICogZnVuY3Rpb25zLiBVc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGFwcGx5IGNvbmZpZ3VyYXRpb24gY2hhbmdlcywgc3VjaFxuICAgKiBhcyB0ZXN0IGFuZCBwcm9kdWN0aW9uIGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb25zLCB3aXRob3V0IGNoYW5naW5nIHlvdXJcbiAgICogTGFtYmRhIGZ1bmN0aW9uIHNvdXJjZSBjb2RlLlxuICAgKi9cbiAgcmVhZG9ubHkgZW52aXJvbm1lbnQ/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBEZXNjcmlwdGlvbiBvZiB3aGF0IHlvdXIgTGFtYmRhIEZ1bmN0aW9uIGRvZXMuXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHN5c3RlbSBhcmNoaXRlY3R1cmVzIGNvbXBhdGlibGUgd2l0aCB0aGlzIGxhbWJkYSBmdW5jdGlvbi5cbiAgICogQGRlZmF1bHQgQXJjaGl0ZWN0dXJlLlg4Nl82NFxuICAgKi9cbiAgcmVhZG9ubHkgYXJjaGl0ZWN0dXJlPzogQXJjaGl0ZWN0dXJlO1xuXG4gIC8qKlxuICAgKiBUaGUgdHJhY2luZyBtb2RlIGZvciB0aGUgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBUaGUgTGFtYmRhIGZ1bmN0aW9uIGlhbSByb2xlIHdpbGwgcmVjZWl2ZSBwZXJtaXNzaW9uIHRvXG4gICAqIHdyaXRlIHRvIEFXUyBYLVJheS5cbiAgICpcbiAgICogQGRlZmF1bHQgVHJhY2luZy5BQ1RJVkVcbiAgICovXG4gIHJlYWRvbmx5IHRyYWNpbmc/OiBUcmFjaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9nIHJldGVudGlvbiBwZXJpb2QgaW4gZGF5cy4gRGVmYXVsdHMgdG8gNy5cbiAgICovXG4gIHJlYWRvbmx5IGxvZ1JldGVudGlvbkluRGF5cz86IFJldGVudGlvbkRheXM7XG5cbiAgLyoqXG4gICAqIFRoZSBtZW1vcnkgbGltaXQgaW4gTUIuXG4gICAqXG4gICAqIEBkZWZhdWx0IDEyOC5cbiAgICovXG4gIHJlYWRvbmx5IG1lbW9yeVNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiBleGVjdXRpb24gdGltZSAoaW4gc2Vjb25kcykgYWZ0ZXIgd2hpY2ggTGFtYmRhIHRlcm1pbmF0ZXNcbiAgICogdGhlIGZ1bmN0aW9uLiBCZWNhdXNlIHRoZSBleGVjdXRpb24gdGltZSBhZmZlY3RzIGNvc3QsIHNldCB0aGlzIHZhbHVlXG4gICAqIGJhc2VkIG9uIHRoZSBmdW5jdGlvbidzIGV4cGVjdGVkIGV4ZWN1dGlvbiB0aW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5zZWNvbmRzKDMpXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIExheWVycyBmb3IgdGhlIExhbWJkYS5cbiAgICovXG4gIHJlYWRvbmx5IGxheWVycz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsIHBvbGljeSBzdGF0ZW1lbnRzIHRvIGFkZCB0byB0aGUgY3JlYXRlZCBMYW1iZGEgUm9sZS5cbiAgICpcbiAgICogWW91IGNhbiBjYWxsIGBhZGRUb1JvbGVQb2xpY3lgIHRvIHRoZSBjcmVhdGVkIGxhbWJkYSB0byBhZGQgc3RhdGVtZW50cyBwb3N0IGNyZWF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHBvbGljeSBzdGF0ZW1lbnRzIGFyZSBhZGRlZCB0byB0aGUgY3JlYXRlZCBMYW1iZGEgcm9sZS5cbiAgICovXG4gIHJlYWRvbmx5IGluaXRpYWxQb2xpY3k/OiBpYW0uUG9saWN5U3RhdGVtZW50W107XG5cbiAgLyoqXG4gICAqIExhbWJkYSBleGVjdXRpb24gcm9sZS5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgcm9sZSB0aGF0IHdpbGwgYmUgYXNzdW1lZCBieSB0aGUgZnVuY3Rpb24gdXBvbiBleGVjdXRpb24uXG4gICAqIEl0IGNvbnRyb2xzIHRoZSBwZXJtaXNzaW9ucyB0aGF0IHRoZSBmdW5jdGlvbiB3aWxsIGhhdmUuIFRoZSBSb2xlIG11c3RcbiAgICogYmUgYXNzdW1hYmxlIGJ5IHRoZSAnbGFtYmRhLmFtYXpvbmF3cy5jb20nIHNlcnZpY2UgcHJpbmNpcGFsLlxuICAgKlxuICAgKiBUaGUgZGVmYXVsdCBSb2xlIGF1dG9tYXRpY2FsbHkgaGFzIHBlcm1pc3Npb25zIGdyYW50ZWQgZm9yIExhbWJkYSBleGVjdXRpb24uIElmIHlvdVxuICAgKiBwcm92aWRlIGEgUm9sZSwgeW91IG11c3QgYWRkIHRoZSByZWxldmFudCBBV1MgbWFuYWdlZCBwb2xpY2llcyB5b3Vyc2VsZi5cbiAgICpcbiAgICogVGhlIHJlbGV2YW50IG1hbmFnZWQgcG9saWNpZXMgYXJlIFwic2VydmljZS1yb2xlL0FXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZVwiIGFuZFxuICAgKiBcInNlcnZpY2Utcm9sZS9BV1NMYW1iZGFWUENBY2Nlc3NFeGVjdXRpb25Sb2xlXCIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQSB1bmlxdWUgcm9sZSB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgdGhpcyBsYW1iZGEgZnVuY3Rpb24uXG4gICAqIEJvdGggc3VwcGxpZWQgYW5kIGdlbmVyYXRlZCByb2xlcyBjYW4gYWx3YXlzIGJlIGNoYW5nZWQgYnkgY2FsbGluZyBgYWRkVG9Sb2xlUG9saWN5YC5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqIENvbmZpZyBmb3IgbmV0d29yayBjb25uZWN0aXZpdHkgdG8gQVdTIHJlc291cmNlcyBpbiBhIFZQQywgc3BlY2lmeSBhIGxpc3RcbiAgICogb2Ygc3VibmV0LCBhbmQgb3B0aW9uYWxseSBzZWN1cml0eSBncm91cHMsIGluIHRoZSBWUEMuXG4gICAqXG4gICAqIFRoZSBMYW1iZGEgZnVuY3Rpb24gaWFtIHJvbGUgd2lsbCByZWNlaXZlIHBlcm1pc3Npb24gdG9cbiAgICogbWFuYWdlIEVOSXMgd2l0aGluIHRoZSBwcm92aWRlZCBuZXR3b3JrLlxuICAgKlxuICAgKiBXaGVuIHlvdSBjb25uZWN0IGEgZnVuY3Rpb24gdG8gYSBWUEMsIGl0IGNhbiBvbmx5IGFjY2VzcyByZXNvdXJjZXMgYW5kIHRoZSBpbnRlcm5ldCB0aHJvdWdoIHRoYXQgVlBDLlxuICAgKlxuICAgKiBTZWUgW1ZQQyBTZXR0aW5nc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xhbWJkYS9sYXRlc3QvZGcvY29uZmlndXJhdGlvbi12cGMuaHRtbCkuXG4gICAqL1xuICByZWFkb25seSBuZXR3b3JrQ29uZmlnPzogVnBjQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBUaGUgU1FTIERMUS5cbiAgICpcbiAgICogVGhlIExhbWJkYSBmdW5jdGlvbiBpYW0gcm9sZSB3aWxsIHJlY2VpdmUgcGVybWlzc2lvbiB0b1xuICAgKiBzZW5kIG1lc3NhZ2VzIG9uIHRoaXMgcXVldWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZGVhZGxldHRlciBxdWV1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVhZExldHRlclF1ZXVlPzogSVF1ZXVlO1xuXG4gIC8qKlxuICAgKiBFbmFibGVkIERMUS4gSWYgYGRlYWRMZXR0ZXJRdWV1ZWAgaXMgdW5kZWZpbmVkLFxuICAgKiBhbiBTUVMgcXVldWUgd2l0aCBkZWZhdWx0IG9wdGlvbnMgd2lsbCBiZSBkZWZpbmVkIGZvciB5b3VyIEZ1bmN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGZhbHNlIHVubGVzcyBgZGVhZExldHRlclF1ZXVlYCBpcyBzZXQsIHdoaWNoIGltcGxpZXMgRExRIGlzIGVuYWJsZWQuXG4gICAqL1xuICByZWFkb25seSBkZWFkTGV0dGVyUXVldWVFbmFibGVkPzogYm9vbGVhbjtcblxuICAvLyBUT0RPOiByZS1hZGQgU05TIGRlYWRMZXR0ZXJUb3BpY1xuXG4gIC8qKlxuICAgKiBFdmVudCBzb3VyY2VzIGZvciB0aGlzIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBZb3UgY2FuIGFsc28gYWRkIGV2ZW50IHNvdXJjZXMgdXNpbmcgYGFkZEV2ZW50U291cmNlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBldmVudCBzb3VyY2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgZXZlbnRzPzogSUV2ZW50U291cmNlW107XG5cbiAgLyoqXG4gICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvNS42MC4wL2RvY3MvcmVzb3VyY2VzL2xhbWJkYV9mdW5jdGlvbiNyZXNlcnZlZF9jb25jdXJyZW50X2V4ZWN1dGlvbnMgTGFtYmRhRnVuY3Rpb24jcmVzZXJ2ZWRfY29uY3VycmVudF9leGVjdXRpb25zfVxuICAgKi9cbiAgcmVhZG9ubHkgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9ucz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGFncyB0byBhcHBseSB0byB0aGUgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSBpbmZvcm1zIHRoZSBDREsgdGhhdCB0aGUgaW1wb3J0ZWQgZnVuY3Rpb24gQUxSRUFEWSBIQVMgdGhlIG5lY2Vzc2FyeSBwZXJtaXNzaW9uc1xuICAgKiBmb3Igd2hhdCB5b3UgYXJlIHRyeWluZyB0byBkby4gV2hlbiBub3QgY29uZmlndXJlZCwgdGhlIENESyBhdHRlbXB0cyB0byBhdXRvLWRldGVybWluZSB3aGV0aGVyIG9yIG5vdFxuICAgKiBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGFyZSBuZWNlc3Nhcnkgb24gdGhlIGZ1bmN0aW9uIHdoZW4gZ3JhbnQgQVBJcyBhcmUgdXNlZC4gSWYgdGhlIENESyB0cmllZCB0byBhZGRcbiAgICogcGVybWlzc2lvbnMgb24gYW4gaW1wb3J0ZWQgbGFtYmRhLCBpdCB3aWxsIGZhaWwuXG4gICAqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5ICpPTkxZIElGKiB5b3UgYXJlIGNvbW1pdHRpbmcgdG8gbWFuYWdlIHRoZSBpbXBvcnRlZCBmdW5jdGlvbidzIHBlcm1pc3Npb25zIG91dHNpZGUgb2ZcbiAgICogQ0RLLiBZb3UgYXJlIGFja25vd2xlZGdpbmcgdGhhdCB5b3VyIENESyBjb2RlIGFsb25lIHdpbGwgaGF2ZSBpbnN1ZmZpY2llbnQgcGVybWlzc2lvbnMgdG8gYWNjZXNzIHRoZVxuICAgKiBpbXBvcnRlZCBmdW5jdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHNraXBQZXJtaXNzaW9ucz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGxvZ2dpbmdGb3JtYXQgZm9yIHRoZSBmdW5jdGlvbi5cbiAgICogQGRlZmF1bHQgTG9nZ2luZ0Zvcm1hdC5URVhUXG4gICAqL1xuICByZWFkb25seSBsb2dnaW5nRm9ybWF0PzogTG9nZ2luZ0Zvcm1hdDtcblxuICAvKipcbiAgICogU2V0cyB0aGUgYXBwbGljYXRpb24gbG9nIGxldmVsIGZvciB0aGUgZnVuY3Rpb24uXG4gICAqIEBkZWZhdWx0IEFwcGxpY2F0aW9uTG9nTGV2ZWwuSU5GT1xuICAgKi9cbiAgcmVhZG9ubHkgYXBwbGljYXRpb25Mb2dMZXZlbD86IEFwcGxpY2F0aW9uTG9nTGV2ZWw7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHN5c3RlbSBsb2cgbGV2ZWwgZm9yIHRoZSBmdW5jdGlvbi5cbiAgICogQGRlZmF1bHQgU3lzdGVtTG9nTGV2ZWwuSU5GT1xuICAgKi9cbiAgcmVhZG9ubHkgc3lzdGVtTG9nTGV2ZWw/OiBTeXN0ZW1Mb2dMZXZlbDtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcHVibGlzaCBjcmVhdGlvbi9jaGFuZ2UgYXMgbmV3IExhbWJkYSBGdW5jdGlvbiBWZXJzaW9uLlxuICAgKlxuICAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzL2xhdGVzdC9kb2NzL3Jlc291cmNlcy9sYW1iZGFfZnVuY3Rpb24jcHVibGlzaCBMYW1iZGFGdW5jdGlvbiNwdWJsaXNofVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgcHVibGlzaD86IGJvb2xlYW4gfCBJUmVzb2x2YWJsZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvblByb3BzIGV4dGVuZHMgRnVuY3Rpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBydW50aW1lIGVudmlyb25tZW50IGZvciB0aGUgTGFtYmRhIGZ1bmN0aW9uIHRoYXQgeW91IGFyZSB1cGxvYWRpbmcuXG4gICAqIEZvciB2YWxpZCB2YWx1ZXMsIHNlZSB0aGUgUnVudGltZSBwcm9wZXJ0eSBpbiB0aGUgQVdTIExhbWJkYSBEZXZlbG9wZXJcbiAgICogR3VpZGUuXG4gICAqXG4gICAqIFVzZSBgUnVudGltZS5GUk9NX0lNQUdFYCB3aGVuIGRlZmluaW5nIGEgZnVuY3Rpb24gZnJvbSBhIERvY2tlciBpbWFnZS5cbiAgICovXG4gIHJlYWRvbmx5IHJ1bnRpbWU6IFJ1bnRpbWU7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgY29kZSBvZiB5b3VyIExhbWJkYSBmdW5jdGlvbi4gWW91IGNhbiBwb2ludCB0byBhIGZpbGUgaW4gYW5cbiAgICogQW1hem9uIFNpbXBsZSBTdG9yYWdlIFNlcnZpY2UgKEFtYXpvbiBTMykgYnVja2V0IG9yIHNwZWNpZnkgeW91ciBzb3VyY2VcbiAgICogY29kZSBhcyBpbmxpbmUgdGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IGNvZGU6IENvZGU7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgd2l0aGluIHlvdXIgY29kZSB0aGF0IExhbWJkYSBjYWxscyB0byBleGVjdXRlXG4gICAqIHlvdXIgZnVuY3Rpb24uIFRoZSBmb3JtYXQgaW5jbHVkZXMgdGhlIGZpbGUgbmFtZS4gSXQgY2FuIGFsc28gaW5jbHVkZVxuICAgKiBuYW1lc3BhY2VzIGFuZCBvdGhlciBxdWFsaWZpZXJzLCBkZXBlbmRpbmcgb24gdGhlIHJ1bnRpbWUuXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xhbWJkYS9sYXRlc3QvZGcvZm91bmRhdGlvbi1wcm9nbW9kZWwuaHRtbC5cbiAgICpcbiAgICogVXNlIGBIYW5kbGVyLkZST01fSU1BR0VgIHdoZW4gZGVmaW5pbmcgYSBmdW5jdGlvbiBmcm9tIGEgRG9ja2VyIGltYWdlLlxuICAgKlxuICAgKiBOT1RFOiBJZiB5b3Ugc3BlY2lmeSB5b3VyIHNvdXJjZSBjb2RlIGFzIGlubGluZSB0ZXh0IGJ5IHNwZWNpZnlpbmcgdGhlXG4gICAqIFppcEZpbGUgcHJvcGVydHkgd2l0aGluIHRoZSBDb2RlIHByb3BlcnR5LCBzcGVjaWZ5IGluZGV4LmZ1bmN0aW9uX25hbWUgYXNcbiAgICogdGhlIGhhbmRsZXIuXG4gICAqL1xuICByZWFkb25seSBoYW5kbGVyOiBzdHJpbmc7XG59XG5cbi8vIHJlLWFkZCBlYzIuSUNvbm5lY3RhYmxlP1xuXG4vLyAvKipcbi8vICAqIEEgTGFtYmRhIGZ1bmN0aW9uLlxuLy8gICovXG4vLyBleHBvcnQgaW50ZXJmYWNlIElGdW5jdGlvbiBleHRlbmRzIElBd3NDb25zdHJ1Y3QsIGlhbS5JR3JhbnRhYmxlIHtcblxuLy8gICAvKipcbi8vICAgICogQWRkIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoaXMgZnVuY3Rpb24uXG4vLyAgICAqL1xuLy8gICBhZGRFbnZpcm9ubWVudChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IElGdW5jdGlvbjtcbi8vIH1cblxuLyoqXG4gKiBQcm92aWRlcyBhIExhbWJkYSBGdW5jdGlvbiByZXNvdXJjZS4gTGFtYmRhIGFsbG93cyB5b3UgdG8gdHJpZ2dlciBleGVjdXRpb25cbiAqIG9mIGNvZGUgaW4gcmVzcG9uc2UgdG8gZXZlbnRzIGluIEFXUywgZW5hYmxpbmcgc2VydmVybGVzcyBiYWNrZW5kIHNvbHV0aW9ucy5cbiAqXG4gKiBUaGUgTGFtYmRhIEZ1bmN0aW9uIGl0c2VsZiBpbmNsdWRlcyBzb3VyY2UgY29kZSBhbmQgcnVudGltZSBjb25maWd1cmF0aW9uLlxuICpcbiAqIFRoaXMgQ29uc3RydWN0IG1hbmFnZXMgcGVybWlzc2lvbnMgYXMgcGFydCBvZiB0aGUgZnVuY3Rpb24gUHJpbmNpcGFsIGlhbSBwb2xpY3kuXG4gKiBUaGlzIHdvcmtzIGZvciBzYW1lIGFjY291bnQgcmVzb3VyY2VzLCBidXQgZm9yIGNyb3NzLWFjY291bnQgcmVzb3VyY2VzLFxuICogeW91IG1heSBuZWVkIHRvIG1hbmFnZSBhY2Nlc3MgYXMgcGFydCBvZiB0aGUgUmVzb3VyY2UgaWFtIHBvbGljeS5cbiAqXG4gKiBAcmVzb3VyY2UgYXdzX2xhbWJkYV9mdW5jdGlvblxuICogQGJlYWNvbi1jbGFzcyBjb21wdXRlLklGdW5jdGlvblxuICovXG5leHBvcnQgY2xhc3MgTGFtYmRhRnVuY3Rpb24gZXh0ZW5kcyBMYW1iZGFGdW5jdGlvbkJhc2UgaW1wbGVtZW50cyBJRnVuY3Rpb24ge1xuICAvLyBUT0RPOiBUZXJyYWZvcm0gYXdzX2xhbWJkYV9mdW5jdGlvbiA9PSBDREsgRnVuY3Rpb25WZXJzaW9uXG5cbiAgLyoqXG4gICAqIExhdGVzdCBwdWJsaXNoZWQgdmVyc2lvbiBvZiB5b3VyIExhbWJkYSBGdW5jdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgdmVyc2lvbigpOiBzdHJpbmcge1xuICAgIC8vIFRPRE86IFdoYXQgaXMgdGhpcyBpZiBwdWJsaXNoIGlzIGZhbHNlPz9cbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZS52ZXJzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhIGxhbWJkYSBmdW5jdGlvbiBpbnRvIHRoZSBUZXJyYUNvbnN0cnVjdCBzcGVjIHVzaW5nIGl0cyBuYW1lXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21GdW5jdGlvbk5hbWUoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIGZ1bmN0aW9uTmFtZTogc3RyaW5nLFxuICApOiBJRnVuY3Rpb24ge1xuICAgIHJldHVybiBMYW1iZGFGdW5jdGlvbi5mcm9tRnVuY3Rpb25BdHRyaWJ1dGVzKHNjb3BlLCBpZCwge1xuICAgICAgZnVuY3Rpb25Bcm46IEF3c1N0YWNrLm9mQXdzQ29uc3RydWN0KHNjb3BlKS5mb3JtYXRBcm4oe1xuICAgICAgICBzZXJ2aWNlOiBcImxhbWJkYVwiLFxuICAgICAgICByZXNvdXJjZTogXCJmdW5jdGlvblwiLFxuICAgICAgICByZXNvdXJjZU5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgYXJuRm9ybWF0OiBBcm5Gb3JtYXQuQ09MT05fUkVTT1VSQ0VfTkFNRSxcbiAgICAgIH0pLFxuICAgICAgc2FtZUVudmlyb25tZW50OiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhIGxhbWJkYSBmdW5jdGlvbiBpbnRvIHRoZSBUZXJyYUNvbnN0cnVjdCBzcGVjIHVzaW5nIGl0cyBBUk4uXG4gICAqXG4gICAqIEZvciBgRnVuY3Rpb24uYWRkUGVybWlzc2lvbnMoKWAgdG8gd29yayBvbiB0aGlzIGltcG9ydGVkIGxhbWJkYSwgbWFrZSBzdXJlIHRoYXQgaXNcbiAgICogaW4gdGhlIHNhbWUgYWNjb3VudCBhbmQgcmVnaW9uIGFzIHRoZSBzdGFjayB5b3UgYXJlIGltcG9ydGluZyBpdCBpbnRvLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRnVuY3Rpb25Bcm4oXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIGZ1bmN0aW9uQXJuOiBzdHJpbmcsXG4gICk6IElGdW5jdGlvbiB7XG4gICAgcmV0dXJuIExhbWJkYUZ1bmN0aW9uLmZyb21GdW5jdGlvbkF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7IGZ1bmN0aW9uQXJuIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBMYW1iZGEgZnVuY3Rpb24gb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgYSBmdW5jdGlvbiBub3QgZGVmaW5lZFxuICAgKiB3aXRoaW4gdGhpcyBzdGFjay5cbiAgICpcbiAgICogRm9yIGBGdW5jdGlvbi5hZGRQZXJtaXNzaW9ucygpYCB0byB3b3JrIG9uIHRoaXMgaW1wb3J0ZWQgbGFtYmRhLCBzZXQgdGhlIHNhbWVFbnZpcm9ubWVudCBwcm9wZXJ0eSB0byB0cnVlXG4gICAqIGlmIHRoaXMgaW1wb3J0ZWQgbGFtYmRhIGlzIGluIHRoZSBzYW1lIGFjY291bnQgYW5kIHJlZ2lvbiBhcyB0aGUgc3RhY2sgeW91IGFyZSBpbXBvcnRpbmcgaXQgaW50by5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBwYXJlbnQgY29uc3RydWN0XG4gICAqIEBwYXJhbSBpZCBUaGUgbmFtZSBvZiB0aGUgbGFtYmRhIGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gYXR0cnMgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGZ1bmN0aW9uIHRvIGltcG9ydFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRnVuY3Rpb25BdHRyaWJ1dGVzKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBhdHRyczogRnVuY3Rpb25BdHRyaWJ1dGVzLFxuICApOiBJRnVuY3Rpb24ge1xuICAgIGNvbnN0IGZ1bmN0aW9uQXJuID0gYXR0cnMuZnVuY3Rpb25Bcm47XG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gZXh0cmFjdE5hbWVGcm9tQXJuKGF0dHJzLmZ1bmN0aW9uQXJuKTtcbiAgICBjb25zdCByb2xlID0gYXR0cnMucm9sZTtcblxuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIExhbWJkYUZ1bmN0aW9uQmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgcmVzb3VyY2U6IGRhdGFBd3NMYW1iZGFGdW5jdGlvbi5EYXRhQXdzTGFtYmRhRnVuY3Rpb247XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZnVuY3Rpb25OYW1lID0gZnVuY3Rpb25OYW1lO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGZ1bmN0aW9uQXJuID0gZnVuY3Rpb25Bcm47XG4gICAgICBwdWJsaWMgZ2V0IGZ1bmN0aW9uUXVhbGlmaWVkSW52b2tlQXJuKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHsgcmVnaW9uLCBwYXJ0aXRpb24gfSA9IEFybi5zcGxpdChcbiAgICAgICAgICBmdW5jdGlvbkFybixcbiAgICAgICAgICBBcm5Gb3JtYXQuQ09MT05fUkVTT1VSQ0VfTkFNRSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGBhcm46JHtwYXJ0aXRpb259OmFwaWdhdGV3YXk6JHtyZWdpb259OmxhbWJkYTpwYXRoLzIwMTUtMDMtMzEvZnVuY3Rpb25zLyR7ZnVuY3Rpb25Bcm59L2ludm9jYXRpb25zYDtcbiAgICAgIH1cbiAgICAgIHB1YmxpYyBnZXQgZnVuY3Rpb25JbnZva2VBcm4oKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgeyByZWdpb24sIHBhcnRpdGlvbiB9ID0gQXJuLnNwbGl0KFxuICAgICAgICAgIGZ1bmN0aW9uQXJuLFxuICAgICAgICAgIEFybkZvcm1hdC5DT0xPTl9SRVNPVVJDRV9OQU1FLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gYGFybjoke3BhcnRpdGlvbn06YXBpZ2F0ZXdheToke3JlZ2lvbn06bGFtYmRhOnBhdGgvMjAxNS0wMy0zMS9mdW5jdGlvbnMvJHtmdW5jdGlvbkFybn0vaW52b2NhdGlvbnNgO1xuICAgICAgfVxuICAgICAgLy8gVE9ETzogUmVzb2x2ZSByb2xlIGFuZCBwcmluY2lwYWwgcmVzb2x2ZSBmcm9tIFRGIGRhdGEgc291cmNlP1xuICAgICAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBpYW0uSVByaW5jaXBhbDtcbiAgICAgIHB1YmxpYyByZWFkb25seSByb2xlID0gcm9sZTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBwZXJtaXNzaW9uc05vZGUgPSB0aGlzLm5vZGU7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBMYW1iZGEgZnVuY3Rpb24gcmV0dXJuZWQuXG4gICAgICAgKlxuICAgICAgICogSWYgcXVhbGlmaWVyIGlzIG5vdCBzZXQsIHRoaXMgd2lsbCByZXNvbHZlIHRvIHRoZSBtb3N0IHJlY2VudCBwdWJsaXNoZWQgdmVyc2lvbi5cbiAgICAgICAqIElmIG5vIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbiBleGlzdHMsIHZlcnNpb24gd2lsbCByZXNvbHZlIHRvIGAkTEFURVNUYC5cbiAgICAgICAqL1xuICAgICAgcHVibGljIGdldCB2ZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlLnZlcnNpb247XG4gICAgICB9XG4gICAgICAvLyBGb3JjZSB1c2VyIHRvIHByb3ZpZGUgYXJjaCBvciBhc3N1bWUgWDg2XzY0XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYXJjaGl0ZWN0dXJlID0gYXR0cnMuYXJjaGl0ZWN0dXJlID8/IEFyY2hpdGVjdHVyZS5YODZfNjQ7XG4gICAgICAvLyBwdWJsaWMgZ2V0IGFyY2hpdGVjdHVyZSgpOiBzdHJpbmcge1xuICAgICAgLy8gICByZXR1cm4gRm4uZWxlbWVudCh0aGlzLnJlc291cmNlLmFyY2hpdGVjdHVyZXMsIDApIGFzIHN0cmluZztcbiAgICAgIC8vIH1cbiAgICAgIHB1YmxpYyByZWFkb25seSByZXNvdXJjZUFybnNGb3JHcmFudEludm9rZSA9IFtcbiAgICAgICAgdGhpcy5mdW5jdGlvbkFybixcbiAgICAgICAgYCR7dGhpcy5mdW5jdGlvbkFybn06KmAsXG4gICAgICBdO1xuICAgICAgcHVibGljIGdldCBmdW5jdGlvbk91dHB1dHMoKTogRnVuY3Rpb25PdXRwdXRzIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiB0aGlzLmZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICBhcm46IHRoaXMuZnVuY3Rpb25Bcm4sXG4gICAgICAgICAgcm9sZUFybjogdGhpcy5yb2xlPy5yb2xlQXJuID8/IFwiXCIsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBwdWJsaWMgZ2V0IG91dHB1dHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZ1bmN0aW9uT3V0cHV0cztcbiAgICAgIH1cbiAgICAgIHByb3RlY3RlZCByZWFkb25seSBjYW5DcmVhdGVQZXJtaXNzaW9ucyA9XG4gICAgICAgIGF0dHJzLnNhbWVFbnZpcm9ubWVudCA/PyB0aGlzLl9pc1N0YWNrQWNjb3VudCgpO1xuICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9za2lwUGVybWlzc2lvbnMgPSBhdHRycy5za2lwUGVybWlzc2lvbnMgPz8gZmFsc2U7XG5cbiAgICAgIGNvbnN0cnVjdG9yKHM6IENvbnN0cnVjdCwgaTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHMsIGksIHtcbiAgICAgICAgICBlbnZpcm9ubWVudEZyb21Bcm46IGZ1bmN0aW9uQXJuLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmdyYW50UHJpbmNpcGFsID1cbiAgICAgICAgICByb2xlIHx8IG5ldyBpYW0uVW5rbm93blByaW5jaXBhbCh7IHJlc291cmNlOiB0aGlzIH0pO1xuICAgICAgICB0aGlzLnJlc291cmNlID0gbmV3IGRhdGFBd3NMYW1iZGFGdW5jdGlvbi5EYXRhQXdzTGFtYmRhRnVuY3Rpb24oXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBcIlJlc291cmNlXCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiB0aGlzLmZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIC8vIFRPRE86IHJlLWFkZCBzdXBwb3J0IGZvciBFQzIgY29ubmVjdGlvbnNcbiAgICAgICAgLy8gaWYgKGF0dHJzLnNlY3VyaXR5R3JvdXApIHtcbiAgICAgICAgLy8gICB0aGlzLl9jb25uZWN0aW9ucyA9IG5ldyBlYzIuQ29ubmVjdGlvbnMoe1xuICAgICAgICAvLyAgICAgc2VjdXJpdHlHcm91cHM6IFthdHRycy5zZWN1cml0eUdyb3VwXSxcbiAgICAgICAgLy8gICB9KTtcbiAgICAgICAgLy8gfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb3VyY2U6IGxhbWJkYUZ1bmN0aW9uLkxhbWJkYUZ1bmN0aW9uO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX291dHB1dHM6IEZ1bmN0aW9uT3V0cHV0cztcblxuICAvKiogU3Ryb25nbHkgVHlwZWQgRnVuY3Rpb24gT3V0cHV0cyAqL1xuICBwdWJsaWMgZ2V0IGZ1bmN0aW9uT3V0cHV0cygpOiBGdW5jdGlvbk91dHB1dHMge1xuICAgIHJldHVybiB0aGlzLl9vdXRwdXRzO1xuICB9XG4gIHB1YmxpYyBnZXQgb3V0cHV0cygpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5mdW5jdGlvbk91dHB1dHM7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGZ1bmN0aW9uTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQVJOIGZvIHRoZSBmdW5jdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgZnVuY3Rpb25Bcm4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZS5hcm47XG4gIH1cblxuICAvKipcbiAgICogVGhlIEFSTiBmbyB0aGUgZnVuY3Rpb24uXG4gICAqIChpZiB2ZXJzaW9uaW5nIGlzIGVuYWJsZWQgdmlhIHB1Ymxpc2ggPSB0cnVlKVxuICAgKi9cbiAgcHVibGljIGdldCBmdW5jdGlvblF1YWxpZmllZEFybigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlLnF1YWxpZmllZEFybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgRnVsbHkgUXVhbGlmaWVkIEludm9rZSBBUk4gZm8gdGhlIGZ1bmN0aW9uIHRvIGJlIHVzZWQgZnJvbSBBUEkgR2F0ZXdheS5cbiAgICpcbiAgICogTk9URTogVGhpcyBkb2VzIG5vdCBzZWVtIHRvIHdvcmsgd2l0aCBBdXRob3JpemVyc1xuICAgKi9cbiAgcHVibGljIGdldCBmdW5jdGlvblF1YWxpZmllZEludm9rZUFybigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlLnF1YWxpZmllZEludm9rZUFybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgSW52b2tlIEFSTiBmbyB0aGUgZnVuY3Rpb24gdG8gYmUgdXNlZCBmcm9tIEFQSSBHYXRld2F5LlxuICAgKlxuICAgKiBOT1RFOiBVc2UgdGhpcyBmb3IgQXV0aG9yaXplcnNcbiAgICovXG4gIHB1YmxpYyBnZXQgZnVuY3Rpb25JbnZva2VBcm4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZS5pbnZva2VBcm47XG4gIH1cblxuICAvKipcbiAgICogVGhlIGFyY2hpdGVjdHVyZSBvZiB0aGlzIExhbWJkYSBGdW5jdGlvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZTtcblxuICAvKipcbiAgICogVGhlIHByaW5jaXBhbCB0aGlzIExhbWJkYSBGdW5jdGlvbiBpcyBydW5uaW5nIGFzXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRQcmluY2lwYWw6IGlhbS5JUHJpbmNpcGFsO1xuXG4gIC8qKlxuICAgKiBUaGUgSUFNIHJvbGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZnVuY3Rpb24uXG4gICAqXG4gICAqIFVuZGVmaW5lZCBpZiB0aGUgZnVuY3Rpb24gd2FzIGltcG9ydGVkIHdpdGhvdXQgYSByb2xlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJvbGU/OiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBETFEgKGFzIHF1ZXVlKSBhc3NvY2lhdGVkIHdpdGggdGhpcyBMYW1iZGEgRnVuY3Rpb24gKHRoaXMgaXMgYW4gb3B0aW9uYWwgYXR0cmlidXRlKS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZWFkTGV0dGVyUXVldWU/OiBJUXVldWU7XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lb3V0IGNvbmZpZ3VyZWQgZm9yIHRoaXMgbGFtYmRhLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIGNvbnN0cnVjdCBub2RlIHdoZXJlIHBlcm1pc3Npb25zIGFyZSBhdHRhY2hlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwZXJtaXNzaW9uc05vZGUgPSB0aGlzLm5vZGU7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNhbkNyZWF0ZVBlcm1pc3Npb25zID0gdHJ1ZTtcblxuICAvKipcbiAgICogTWFwcGluZyBvZiBpbnZvY2F0aW9uIHByaW5jaXBhbHMgdG8gZ3JhbnRzLiBVc2VkIHRvIGRlLWR1cGUgYGdyYW50SW52b2tlKClgIGNhbGxzLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCBfaW52b2NhdGlvbkdyYW50czogUmVjb3JkPHN0cmluZywgaWFtLkdyYW50PiA9IHt9O1xuXG4gIC8qKlxuICAgKiBNYXBwaW5nIG9mIGZ1Y250aW9uIFVSTCBpbnZvY2F0aW9uIHByaW5jaXBhbHMgdG8gZ3JhbnRzLiBVc2VkIHRvIGRlLWR1cGUgYGdyYW50SW52b2tlVXJsKClgIGNhbGxzLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCBfZnVuY3Rpb25VcmxJbnZvY2F0aW9uR3JhbnRzOiBSZWNvcmQ8c3RyaW5nLCBpYW0uR3JhbnQ+ID0ge307XG5cbiAgLy8gLy8gVGVyYWZvcm0gcHJvdmlkZXIgZm9yIEFXUyBBdXRvbWF0aWNhbGx5IG1hbmFnZXMgRnVuY3Rpb24gVmVyc2lvbmluZyB0aHJvdWdoIGNvZGUgaGFzaC4uXG4gIC8vIC8vIG5lZWQgdG8gZHJvcCBtb3N0IG9mIHRoaXMgdmVyc2lvbiBsb2dpYy4uXG5cbiAgLy8gcHJpdmF0ZSByZWFkb25seSBjdXJyZW50VmVyc2lvbk9wdGlvbnM/OiBWZXJzaW9uT3B0aW9ucztcbiAgLy8gcHJpdmF0ZSBfY3VycmVudFZlcnNpb24/OiBWZXJzaW9uO1xuICAvLyAvKipcbiAgLy8gICogUmV0dXJucyBhIGBsYW1iZGEuVmVyc2lvbmAgd2hpY2ggcmVwcmVzZW50cyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoaXNcbiAgLy8gICogTGFtYmRhIGZ1bmN0aW9uLiBBIG5ldyB2ZXJzaW9uIHdpbGwgYmUgY3JlYXRlZCBldmVyeSB0aW1lIHRoZSBmdW5jdGlvbidzXG4gIC8vICAqIGNvbmZpZ3VyYXRpb24gY2hhbmdlcy5cbiAgLy8gICpcbiAgLy8gICogWW91IGNhbiBzcGVjaWZ5IG9wdGlvbnMgZm9yIHRoaXMgdmVyc2lvbiB1c2luZyB0aGUgYGN1cnJlbnRWZXJzaW9uT3B0aW9uc2BcbiAgLy8gICogcHJvcCB3aGVuIGluaXRpYWxpemluZyB0aGUgYGxhbWJkYS5GdW5jdGlvbmAuXG4gIC8vICAqL1xuICAvLyBwdWJsaWMgZ2V0IGN1cnJlbnRWZXJzaW9uKCk6IFZlcnNpb24ge1xuICAvLyAgIGlmICh0aGlzLl9jdXJyZW50VmVyc2lvbikge1xuICAvLyAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRWZXJzaW9uO1xuICAvLyAgIH1cblxuICAvLyAgIC8vIGlmICh0aGlzLl93YXJuSWZDdXJyZW50VmVyc2lvbkNhbGxlZCkge1xuICAvLyAgIC8vICAgdGhpcy53YXJuSW52b2tlRnVuY3Rpb25QZXJtaXNzaW9ucyh0aGlzKTtcbiAgLy8gICAvLyB9XG5cbiAgLy8gICB0aGlzLl9jdXJyZW50VmVyc2lvbiA9IG5ldyBWZXJzaW9uKHRoaXMsIFwiQ3VycmVudFZlcnNpb25cIiwge1xuICAvLyAgICAgbGFtYmRhOiB0aGlzLFxuICAvLyAgICAgLi4udGhpcy5jdXJyZW50VmVyc2lvbk9wdGlvbnMsXG4gIC8vICAgfSk7XG5cbiAgLy8gICAvLyBvdmVycmlkZSB0aGUgdmVyc2lvbidzIGxvZ2ljYWwgSUQgd2l0aCBhIGxhenkgc3RyaW5nIHdoaWNoIGluY2x1ZGVzIHRoZVxuICAvLyAgIC8vIGhhc2ggb2YgdGhlIGZ1bmN0aW9uIGl0c2VsZiwgc28gYSBuZXcgdmVyc2lvbiByZXNvdXJjZSBpcyBjcmVhdGVkIHdoZW5cbiAgLy8gICAvLyB0aGUgZnVuY3Rpb24gY29uZmlndXJhdGlvbiBjaGFuZ2VzLlxuICAvLyAgIGNvbnN0IGNmbiA9IHRoaXMuX2N1cnJlbnRWZXJzaW9uLm5vZGUuZGVmYXVsdENoaWxkIGFzIFRlcnJhZm9ybVJlc291cmNlO1xuICAvLyAgIGNvbnN0IG9yaWdpbmFsTG9naWNhbElkID0gdGhpcy5zdGFjay5yZXNvbHZlKGNmbi5sb2dpY2FsSWQpIGFzIHN0cmluZztcblxuICAvLyAgIGNmbi5vdmVycmlkZUxvZ2ljYWxJZChcbiAgLy8gICAgIExhenkuc3RyaW5nVmFsdWUoe1xuICAvLyAgICAgICBwcm9kdWNlOiAoKSA9PiB7XG4gIC8vICAgICAgICAgY29uc3QgaGFzaCA9IGNhbGN1bGF0ZUZ1bmN0aW9uSGFzaCh0aGlzLCB0aGlzLmhhc2hNaXhpbnMuam9pbihcIlwiKSk7XG4gIC8vICAgICAgICAgY29uc3QgbG9naWNhbElkID0gdHJpbUZyb21TdGFydChvcmlnaW5hbExvZ2ljYWxJZCwgMjU1IC0gMzIpO1xuICAvLyAgICAgICAgIHJldHVybiBgJHtsb2dpY2FsSWR9JHtoYXNofWA7XG4gIC8vICAgICAgIH0sXG4gIC8vICAgICB9KSxcbiAgLy8gICApO1xuXG4gIC8vICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRWZXJzaW9uO1xuICAvLyB9XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4ocykgdG8gcHV0IGludG8gdGhlIHJlc291cmNlIGZpZWxkIG9mIHRoZSBnZW5lcmF0ZWQgSUFNIHBvbGljeSBmb3IgZ3JhbnRJbnZva2UoKVxuICAgKi9cbiAgcHVibGljIGdldCByZXNvdXJjZUFybnNGb3JHcmFudEludm9rZSgpIHtcbiAgICAvLyBUT0RPOiBzaG91bGQgdGhpcyBiZSBxdWFsaWZpZWRBcm4gb3IgcXVhbGlmaWVkSW52b2tlQXJuP1xuICAgIC8vIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuNjguMC9kb2NzL3Jlc291cmNlcy9sYW1iZGFfZnVuY3Rpb24jcXVhbGlmaWVkX2FyblxuICAgIHJldHVybiBbdGhpcy5mdW5jdGlvbkFybiwgdGhpcy5mdW5jdGlvblF1YWxpZmllZEludm9rZUFybl07XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyByZWFkb25seSBfbG9nR3JvdXA6IGNsb3Vkd2F0Y2hMb2dHcm91cC5DbG91ZHdhdGNoTG9nR3JvdXA7XG5cbiAgLyoqXG4gICAqIEVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhpcyBmdW5jdGlvblxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVudmlyb25tZW50OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG5cbiAgcHJpdmF0ZSBfdXJsPzogc3RyaW5nO1xuICAvKipcbiAgICogSFRUUCBFbmRwb2ludCBmb3IgdGhpcyBmdW5jdGlvbiBpZiBkZWZpbmVkLlxuICAgKlxuICAgKiB1c2UgYGFkZEZ1bmN0aW9uVXJsYCB0byBlbmFibGUgRW5kcG9pbnQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHVybCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl91cmw7XG4gIH1cblxuICBwcml2YXRlIF9ldmVudFNvdXJjZXM6IHtcbiAgICBbaWQ6IHN0cmluZ106IGxhbWJkYUV2ZW50U291cmNlTWFwcGluZy5MYW1iZGFFdmVudFNvdXJjZU1hcHBpbmc7XG4gIH0gPSB7fTtcbiAgcHVibGljIGdldCBldmVudFNvdXJjZXMoKTogbGFtYmRhRXZlbnRTb3VyY2VNYXBwaW5nLkxhbWJkYUV2ZW50U291cmNlTWFwcGluZ1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLl9ldmVudFNvdXJjZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VjdXJpdHlHcm91cD86IHNlY3VyaXR5R3JvdXAuU2VjdXJpdHlHcm91cDtcbiAgcHVibGljIGdldCBzZWN1cml0eUdyb3VwKCk6IHNlY3VyaXR5R3JvdXAuU2VjdXJpdHlHcm91cCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3NlY3VyaXR5R3JvdXA7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBuYW1lOiBzdHJpbmcsIHByb3BzOiBGdW5jdGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIG5hbWUsIHByb3BzKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgZW52aXJvbm1lbnQ6IHZhcmlhYmxlcyxcbiAgICAgIGxvZ1JldGVudGlvbkluRGF5cyA9IFJldGVudGlvbkRheXMuT05FX1dFRUssXG4gICAgICBtZW1vcnlTaXplID0gMTI4LFxuICAgICAgdGltZW91dCA9IER1cmF0aW9uLnNlY29uZHMoMyksXG4gICAgICBsYXllcnMsXG4gICAgICByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zLFxuICAgIH0gPSBwcm9wcztcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9yIEFSTiBvZiB0aGUgTGFtYmRhIGZ1bmN0aW9uLlxuICAgICAqIGlzIGxpbWl0ZWQgdG8gNjQgY2hhcmFjdGVycyBpbiBsZW5ndGguXG4gICAgICpcbiAgICAgKiBBUk4gUGF0dGVybjogKFthLXpBLVowLTktX10rKSg6KFxcJExBVEVTVHxbYS16QS1aMC05LV9dKykpP1xuICAgICAqL1xuICAgIGNvbnN0IGZ1bmN0aW9uTmFtZSA9XG4gICAgICBwcm9wcy5mdW5jdGlvbk5hbWUgPz9cbiAgICAgIHRoaXMuc3RhY2sudW5pcXVlUmVzb3VyY2VOYW1lUHJlZml4KHRoaXMsIHtcbiAgICAgICAgcHJlZml4OiBwcm9wcy5mdW5jdGlvbk5hbWVQcmVmaXggPz8gdGhpcy5ncmlkVVVJRCArIFwiLVwiLFxuICAgICAgICBhbGxvd2VkU3BlY2lhbENoYXJhY3RlcnM6IFwiK1wiLFxuICAgICAgICBtYXhMZW5ndGg6IDY0LFxuICAgICAgfSk7XG5cbiAgICBpZiAoZnVuY3Rpb25OYW1lICYmICFUb2tlbi5pc1VucmVzb2x2ZWQoZnVuY3Rpb25OYW1lKSkge1xuICAgICAgaWYgKGZ1bmN0aW9uTmFtZS5sZW5ndGggPiA2NCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZ1bmN0aW9uIG5hbWUgY2FuIG5vdCBiZSBsb25nZXIgdGhhbiA2NCBjaGFyYWN0ZXJzIGJ1dCBoYXMgJHtmdW5jdGlvbk5hbWUubGVuZ3RofSBjaGFyYWN0ZXJzLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoIS9eW2EtekEtWjAtOS1fXSskLy50ZXN0KGZ1bmN0aW9uTmFtZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBGdW5jdGlvbiBuYW1lICR7ZnVuY3Rpb25OYW1lfSBjYW4gY29udGFpbiBvbmx5IGxldHRlcnMsIG51bWJlcnMsIGh5cGhlbnMsIG9yIHVuZGVyc2NvcmVzIHdpdGggbm8gc3BhY2VzLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRlc2NyaXB0aW9uICYmICFUb2tlbi5pc1VucmVzb2x2ZWQoZGVzY3JpcHRpb24pKSB7XG4gICAgICBpZiAoZGVzY3JpcHRpb24ubGVuZ3RoID4gMjU2KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRnVuY3Rpb24gZGVzY3JpcHRpb24gY2FuIG5vdCBiZSBsb25nZXIgdGhhbiAyNTYgY2hhcmFjdGVycyBidXQgaGFzICR7ZGVzY3JpcHRpb24ubGVuZ3RofSBjaGFyYWN0ZXJzLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbWFuYWdlZFBvbGljaWVzID0gbmV3IEFycmF5PGlhbS5JTWFuYWdlZFBvbGljeT4oKTtcbiAgICAvLyB0aGUgYXJuIGlzIGluIHRoZSBmb3JtIG9mIC0gYXJuOmF3czppYW06OmF3czpwb2xpY3kvc2VydmljZS1yb2xlL0FXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZVxuICAgIG1hbmFnZWRQb2xpY2llcy5wdXNoKFxuICAgICAgaWFtLk1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKFxuICAgICAgICB0aGlzLFxuICAgICAgICBcIkFXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZVwiLFxuICAgICAgICBcInNlcnZpY2Utcm9sZS9BV1NMYW1iZGFCYXNpY0V4ZWN1dGlvblJvbGVcIixcbiAgICAgICksXG4gICAgKTtcbiAgICBpZiAocHJvcHMubmV0d29ya0NvbmZpZykge1xuICAgICAgLy8gUG9saWN5IHRoYXQgd2lsbCBoYXZlIEVOSSBjcmVhdGlvbiBwZXJtaXNzaW9uc1xuICAgICAgLy8gbm90IHN1cmUgaWYgdGltZS5zbGVlcCBpcyBuZWNlc3Nhcnk/XG4gICAgICAvLyByZWY6XG4gICAgICAvLyAgLSBodHRwczovL2dpdGh1Yi5jb20vcHVsdW1pL3B1bHVtaS1hd3MvaXNzdWVzLzIyNjAjaXNzdWVjb21tZW50LTE5Nzc2MDY1MDlcbiAgICAgIC8vICAtIGh0dHBzOi8vZ2l0aHViLmNvbS9oYXNoaWNvcnAvdGVycmFmb3JtLXByb3ZpZGVyLWF3cy9pc3N1ZXMvMjk4MjgjaXNzdWVjb21tZW50LTE2OTMzMDc1MDBcbiAgICAgIG1hbmFnZWRQb2xpY2llcy5wdXNoKFxuICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBcIkFXU0xhbWJkYVZQQ0FjY2Vzc0V4ZWN1dGlvblJvbGVcIixcbiAgICAgICAgICBcInNlcnZpY2Utcm9sZS9BV1NMYW1iZGFWUENBY2Nlc3NFeGVjdXRpb25Sb2xlXCIsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFRPRE86IEFueSBjb25jZXJuIG5vdCBzY29waW5nIHRoZSBsb2dHcm91cCBJQU0gUGVybWlzc2lvbnM/XG4gICAgLy8gLmFsbG93KClcbiAgICAvLyAudG9DcmVhdGVMb2dTdHJlYW0oKVxuICAgIC8vIC50b1B1dExvZ0V2ZW50cygpXG4gICAgLy8gLm9uKGxvZ0dyb3VwLmFybiwgYCR7bG9nR3JvdXAuYXJufTpsb2ctc3RyZWFtOipgKSxcblxuICAgIHRoaXMucm9sZSA9XG4gICAgICBwcm9wcy5yb2xlIHx8XG4gICAgICBuZXcgaWFtLlJvbGUodGhpcywgXCJTZXJ2aWNlUm9sZVwiLCB7XG4gICAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKFwibGFtYmRhLmFtYXpvbmF3cy5jb21cIiksXG4gICAgICAgIG1hbmFnZWRQb2xpY2llcyxcbiAgICAgIH0pO1xuICAgIHRoaXMuZ3JhbnRQcmluY2lwYWwgPSB0aGlzLnJvbGU7XG4gICAgLy8gVE9ETzogUmUtYWRkIGZpbGVzeXN0ZW0gLyBsb2NhbE1vdW50UGF0aCBzdXBwb3J0XG4gICAgLy8gcmVmOiBmaWxlc3lzdGVtLmNvbmZpZy5wb2xpY2llcyB0byBiZSBhZGRlZCB0byBwcmluY2lwYWxcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNjAuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtbGFtYmRhL2xpYi9mdW5jdGlvbi50cyNMOTQ5LUw5NjVcblxuICAgIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIHByb3BzLmluaXRpYWxQb2xpY3kgfHwgW10pIHtcbiAgICAgIHRoaXMucm9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvZGUgPSBwcm9wcy5jb2RlLmJpbmQodGhpcyk7XG4gICAgdmVyaWZ5Q29kZUNvbmZpZyhjb2RlLCBwcm9wcyk7XG5cbiAgICAvLyBhZGQgc3VwcG9ydCBmb3IgQVdTX0NPREVHVVJVIFByb2ZpbGUgZW52IHZhcmlhYmxlcy4uLlxuICAgIGNvbnN0IGVudiA9IHZhcmlhYmxlcyB8fCB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnYpKSB7XG4gICAgICB0aGlzLmFkZEVudmlyb25tZW50KGtleSwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8vIERMUSBjYW4gYmUgZWl0aGVyIHNucy5JVG9waWMgb3Igc3FzLklRdWV1ZVxuICAgIGNvbnN0IGRscVRvcGljT3JRdWV1ZSA9IHRoaXMuYnVpbGREZWFkTGV0dGVyUXVldWUocHJvcHMpO1xuICAgIGlmIChkbHFUb3BpY09yUXVldWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHRoaXMuaXNRdWV1ZShkbHFUb3BpY09yUXVldWUpKSB7XG4gICAgICAgIHRoaXMuZGVhZExldHRlclF1ZXVlID0gZGxxVG9waWNPclF1ZXVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGVhZExldHRlclRvcGljIGlzIG5vdCBzdXBwb3J0ZWQgeWV0XCIpO1xuICAgICAgICAvLyB0aGlzLmRlYWRMZXR0ZXJUb3BpYyA9IGRscVRvcGljT3JRdWV1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBsb2dHcm91cCA9IG5ldyBjbG91ZHdhdGNoTG9nR3JvdXAuQ2xvdWR3YXRjaExvZ0dyb3VwKFxuICAgICAgdGhpcyxcbiAgICAgIFwiTG9nR3JvdXBcIixcbiAgICAgIHtcbiAgICAgICAgbmFtZTogYC9hd3MvbGFtYmRhLyR7ZnVuY3Rpb25OYW1lfWAsXG4gICAgICAgIHJldGVudGlvbkluRGF5czogbG9nUmV0ZW50aW9uSW5EYXlzLFxuICAgICAgfSxcbiAgICApO1xuICAgIHRoaXMuX2xvZ0dyb3VwID0gbG9nR3JvdXA7XG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyBsYW1iZGFGdW5jdGlvbi5MYW1iZGFGdW5jdGlvbih0aGlzLCBcIlJlc291cmNlXCIsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgLy8gTk9URTogZm9yIHRoZSB1bmRlcmxheWluZyByZXNvdXJjZSwgRXhhY3RseSBvbmUgb2YgZmlsZW5hbWUsIGltYWdlX3VyaSwgb3IgczNfYnVja2V0IG11c3QgYmUgc3BlY2lmaWVkXG4gICAgICBzM0J1Y2tldDogY29kZS5zM0xvY2F0aW9uICYmIGNvZGUuczNMb2NhdGlvbi5idWNrZXROYW1lLFxuICAgICAgczNLZXk6IGNvZGUuczNMb2NhdGlvbiAmJiBjb2RlLnMzTG9jYXRpb24ub2JqZWN0S2V5LFxuICAgICAgczNPYmplY3RWZXJzaW9uOiBjb2RlLnMzTG9jYXRpb24gJiYgY29kZS5zM0xvY2F0aW9uLm9iamVjdFZlcnNpb24sXG4gICAgICBmaWxlbmFtZTogY29kZS5pbmxpbmVDb2RlLFxuICAgICAgc291cmNlQ29kZUhhc2g6IGNvZGUuc291cmNlQ29kZUhhc2gsXG4gICAgICBpbWFnZVVyaTogY29kZS5pbWFnZT8uaW1hZ2VVcmksXG4gICAgICBsYXllcnMsIC8vIFRPRE86IFN1cHBvcnQgSUxheWVyIHdpdGggTGF6eSBsaXN0IG9mIGFybnNcbiAgICAgIGhhbmRsZXI6IHByb3BzLmhhbmRsZXIgPT09IEhhbmRsZXIuRlJPTV9JTUFHRSA/IHVuZGVmaW5lZCA6IHByb3BzLmhhbmRsZXIsXG4gICAgICB0aW1lb3V0OiB0aW1lb3V0LnRvU2Vjb25kcygpLFxuICAgICAgcGFja2FnZVR5cGU6IHByb3BzLnJ1bnRpbWUgPT09IFJ1bnRpbWUuRlJPTV9JTUFHRSA/IFwiSW1hZ2VcIiA6IHVuZGVmaW5lZCxcbiAgICAgIHJ1bnRpbWU6XG4gICAgICAgIHByb3BzLnJ1bnRpbWUgPT09IFJ1bnRpbWUuRlJPTV9JTUFHRSA/IHVuZGVmaW5lZCA6IHByb3BzLnJ1bnRpbWUubmFtZSxcbiAgICAgIC8vIC8vIFNvdXJjZSBDb2RlIEtNUyBub3Qgc3VwcG9ydGVkIGJ5IFRlcnJhZm9ybSBwcm92aWRlcj9cbiAgICAgIC8vIC8vIHNlZTogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9UZW1wbGF0ZVJlZmVyZW5jZS9hd3MtcHJvcGVydGllcy1sYW1iZGEtZnVuY3Rpb24tY29kZS5odG1sI2Nmbi1sYW1iZGEtZnVuY3Rpb24tY29kZS1zb3VyY2VrbXNrZXlhcm5cbiAgICAgIC8vIHNvdXJjZUttc0tleUFybjogY29kZS5zb3VyY2VLTVNLZXlBcm4sXG4gICAgICByb2xlOiB0aGlzLnJvbGUucm9sZUFybixcbiAgICAgIC8vIFRPRE86IENESyBTb3J0cyBlbnZpcm9ubWVudCB0byBtYXRjaCBMYW1iZGEgSGFzaCBiZWhhdmlvdXJcbiAgICAgIC8vIFRPRE86IERvIG5vdCBzZXQgdGhpcyBhdCBhbGwgaWYgbm8gZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzZXQgKENvbXBsZXhMaXN0IGNhbid0IGJlIElSZXNvbHZhYmxlKVxuICAgICAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNTYuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtbGFtYmRhL2xpYi9mdW5jdGlvbi50cyNMMTQ2N1xuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgdmFyaWFibGVzOiBMYXp5LmFueVZhbHVlKHtcbiAgICAgICAgICBwcm9kdWNlOiAoX2NvbnRleHQ6IElSZXNvbHZlQ29udGV4dCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW52aXJvbm1lbnQ7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSkgYXMgYW55LFxuICAgICAgfSxcbiAgICAgIG1lbW9yeVNpemUsXG4gICAgICAvLyBUT0RPOiByZS1hZGQgZXBoZW1lcmFsU3RvcmFnZVxuICAgICAgdnBjQ29uZmlnOiB0aGlzLnBhcnNlVnBjQ29uZmlnKHByb3BzLm5ldHdvcmtDb25maWcpLFxuICAgICAgZGVhZExldHRlckNvbmZpZzogdGhpcy5wYXJzZURlYWRMZXR0ZXJDb25maWcoZGxxVG9waWNPclF1ZXVlKSxcbiAgICAgIHJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnMsXG4gICAgICBpbWFnZUNvbmZpZzogdW5kZWZpbmVkSWZOb0tleXMoe1xuICAgICAgICBjb21tYW5kOiBjb2RlLmltYWdlPy5jbWQsXG4gICAgICAgIGVudHJ5UG9pbnQ6IGNvZGUuaW1hZ2U/LmVudHJ5cG9pbnQsXG4gICAgICAgIHdvcmtpbmdEaXJlY3Rvcnk6IGNvZGUuaW1hZ2U/LndvcmtpbmdEaXJlY3RvcnksXG4gICAgICB9KSxcbiAgICAgIC8vIFRPRE86IHJlLWFkZCBrbXNLZXlBcm4gZm9yIGVudmlyb25tZW50IGVuY3J5cHRpb25cbiAgICAgIC8vIFRPRE86IHJlLWFkZCBmaWxlU3lzdGVtQ29uZmlncyBmb3IgRUZTIHN1cHBvcnQsXG4gICAgICAvLyBUT0RPOiByZS1hZGQgY29kZVNpZ25pbmdDb25maWdBcm5cbiAgICAgIGFyY2hpdGVjdHVyZXM6IFtcbiAgICAgICAgLy8gVGhpcyBpcyBhbiBhcnJheSwgYnV0IG1heGltdW0gbGVuZ3RoIGlzIDEhXG4gICAgICAgIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1sYW1iZGEtZnVuY3Rpb24uaHRtbCNjZm4tbGFtYmRhLWZ1bmN0aW9uLWFyY2hpdGVjdHVyZXNcbiAgICAgICAgcHJvcHMuYXJjaGl0ZWN0dXJlPy50b1N0cmluZygpID8/IEFyY2hpdGVjdHVyZS5YODZfNjQudG9TdHJpbmcoKSxcbiAgICAgIF0sXG4gICAgICAvLyBUT0RPOiByZS1hZGQgcnVudGltZU1hbmFnZW1lbnRDb25maWdcbiAgICAgIC8vIFRPRE86IHJlLWFkZCBzbmFwU3RhcnRcbiAgICAgIGxvZ2dpbmdDb25maWc6IHRoaXMuZ2V0TG9nZ2luZ0NvbmZpZyh0aGlzLl9sb2dHcm91cC5uYW1lLCBwcm9wcyksXG4gICAgICAvLyBUT0RPOiByZS1hZGQgcmVjdXJzaXZlTG9vcCBkZXRlY3Rpb25cbiAgICAgIHRyYWNpbmdDb25maWc6IHRoaXMucGFyc2VUcmFjaW5nQ29uZmlnKHByb3BzLnRyYWNpbmcgPz8gVHJhY2luZy5BQ1RJVkUpLFxuICAgICAgcHVibGlzaDogcHJvcHMucHVibGlzaCxcbiAgICAgIC8vIFRPRE86IHVzZSBsb2dHcm91cC5ub2RlLmFkZERlcGVuZGVuY3kgd2hlbiBsb2dHcm91cCBpcyBpbXBsZW1lbnRlZFxuICAgICAgZGVwZW5kc09uOiBbbG9nR3JvdXBdLFxuICAgIH0pO1xuICAgIC8vIE5PVEU6IFNob3VsZCB0aGlzIGJlIGZ1bmN0aW9uTmFtZSBpbnB1dCBpbnN0ZWFkIG9mIFRPS0VOP1xuICAgIHRoaXMuZnVuY3Rpb25OYW1lID0gdGhpcy5yZXNvdXJjZS5mdW5jdGlvbk5hbWU7XG5cbiAgICAvLyBtYWtlIHN1cmUgYW55IHJvbGUgYXR0YWNobWVudHMgYXJlIGFkZGVkIGFzIGRlcGVuZGVuY2llcyBmb3IgdGhpcyBsYW1iZGFcbiAgICAvLyB0aGlzIGFjaGlldmVkIGJ5IHRoZSBDREtURiBBc3BlY3Qgb24gdGhlIHBhcmVudCBTdGFja0Jhc2VcbiAgICB0aGlzLnJlc291cmNlLm5vZGUuYWRkRGVwZW5kZW5jeSh0aGlzLnJvbGUpO1xuXG4gICAgdGhpcy50aW1lb3V0ID0gcHJvcHMudGltZW91dDtcbiAgICB0aGlzLmFyY2hpdGVjdHVyZSA9IHByb3BzLmFyY2hpdGVjdHVyZSA/PyBBcmNoaXRlY3R1cmUuWDg2XzY0O1xuXG4gICAgLy8gVE9ETzogQWRkIGF3c19sYW1iZGFfcHJvdmlzaW9uZWRfY29uY3VycmVuY3lfY29uZmlnXG5cbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIHByb3BzLmV2ZW50cyB8fCBbXSkge1xuICAgICAgdGhpcy5hZGRFdmVudFNvdXJjZShldmVudCk7XG4gICAgfVxuXG4gICAgLy8gLy8gVE9ETzogcGVuZGluZyBjdXN0b20gQ0xJIHRvIG1vY2sgTGFtYmRhIGZ1bmN0aW9uIGludm9jYXRpb25zIGxvY2FsbHlcbiAgICAvLyBwcm9wcy5jb2RlLmJpbmRUb1Jlc291cmNlKHRoaXMpO1xuXG4gICAgLy8gRXZlbnQgSW52b2tlIENvbmZpZ1xuICAgIGlmIChcbiAgICAgIHByb3BzLm9uRmFpbHVyZSB8fFxuICAgICAgcHJvcHMub25TdWNjZXNzIHx8XG4gICAgICBwcm9wcy5tYXhFdmVudEFnZSB8fFxuICAgICAgcHJvcHMucmV0cnlBdHRlbXB0cyAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICB0aGlzLmNvbmZpZ3VyZUFzeW5jSW52b2tlKHtcbiAgICAgICAgb25GYWlsdXJlOiBwcm9wcy5vbkZhaWx1cmUsXG4gICAgICAgIG9uU3VjY2VzczogcHJvcHMub25TdWNjZXNzLFxuICAgICAgICBtYXhFdmVudEFnZTogcHJvcHMubWF4RXZlbnRBZ2UsXG4gICAgICAgIHJldHJ5QXR0ZW1wdHM6IHByb3BzLnJldHJ5QXR0ZW1wdHMsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLl9vdXRwdXRzID0ge1xuICAgICAgbmFtZTogdGhpcy5mdW5jdGlvbk5hbWUsXG4gICAgICBhcm46IHRoaXMucmVzb3VyY2UuYXJuLFxuICAgICAgcm9sZUFybjogdGhpcy5yb2xlLnJvbGVBcm4sXG4gICAgICAvLyBvbmx5IGtub3duIGF0IHN5bnRoIHRpbWVcbiAgICAgIC8vIGV4cGxpY2l0IGBudWxsYCByZXF1aXJlZCB0byBhdm9pZCBzeW50YXggZXJyb3JzIHdoZW4gdXNpbmcgc3RyaW5nVmFsdWUgJiYgXCJ1bmRlZmluZWRcIlxuICAgICAgdXJsOiBMYXp5LmFueVZhbHVlKHtcbiAgICAgICAgcHJvZHVjZTogKCkgPT4gdGhpcy5fdXJsID8/IG51bGwsXG4gICAgICB9KSxcbiAgICAgIGRlZmF1bHRTZWN1cml0eUdyb3VwOiBMYXp5LmFueVZhbHVlKHtcbiAgICAgICAgcHJvZHVjZTogKCkgPT4gdGhpcy5fc2VjdXJpdHlHcm91cD8uaWQgPz8gbnVsbCxcbiAgICAgIH0pLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGlzIExhbWJkYSBmdW5jdGlvbi5cbiAgICogSWYgdGhpcyBpcyBhIHJlZiB0byBhIExhbWJkYSBmdW5jdGlvbiwgdGhpcyBvcGVyYXRpb24gcmVzdWx0cyBpbiBhIG5vLW9wLlxuICAgKiBAcGFyYW0ga2V5IFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBrZXkuXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUncyB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBhZGRFbnZpcm9ubWVudChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IElGdW5jdGlvbiB7XG4gICAgLy8gUmVzZXJ2ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdpbGwgZmFpbCBkdXJpbmcgY2xvdWRmb3JtYXRpb24gZGVwbG95IGlmIHRoZXkncmUgc2V0LlxuICAgIC8vIFRoaXMgY2hlY2sgaXMganVzdCB0byBhbGxvdyBDREsgdG8gZmFpbCBmYXN0ZXIgd2hlbiB0aGVzZSBhcmUgc3BlY2lmaWVkLlxuICAgIGNvbnN0IHJlc2VydmVkRW52aXJvbm1lbnRWYXJpYWJsZXMgPSBbXG4gICAgICBcIl9IQU5ETEVSXCIsXG4gICAgICBcIl9YX0FNWk5fVFJBQ0VfSURcIixcbiAgICAgIFwiQVdTX0RFRkFVTFRfUkVHSU9OXCIsXG4gICAgICBcIkFXU19SRUdJT05cIixcbiAgICAgIFwiQVdTX0VYRUNVVElPTl9FTlZcIixcbiAgICAgIFwiQVdTX0xBTUJEQV9GVU5DVElPTl9OQU1FXCIsXG4gICAgICBcIkFXU19MQU1CREFfRlVOQ1RJT05fTUVNT1JZX1NJWkVcIixcbiAgICAgIFwiQVdTX0xBTUJEQV9GVU5DVElPTl9WRVJTSU9OXCIsXG4gICAgICBcIkFXU19MQU1CREFfSU5JVElBTElaQVRJT05fVFlQRVwiLFxuICAgICAgXCJBV1NfTEFNQkRBX0xPR19HUk9VUF9OQU1FXCIsXG4gICAgICBcIkFXU19MQU1CREFfTE9HX1NUUkVBTV9OQU1FXCIsXG4gICAgICBcIkFXU19BQ0NFU1NfS0VZXCIsXG4gICAgICBcIkFXU19BQ0NFU1NfS0VZX0lEXCIsXG4gICAgICBcIkFXU19TRUNSRVRfQUNDRVNTX0tFWVwiLFxuICAgICAgXCJBV1NfU0VTU0lPTl9UT0tFTlwiLFxuICAgICAgXCJBV1NfTEFNQkRBX1JVTlRJTUVfQVBJXCIsXG4gICAgICBcIkxBTUJEQV9UQVNLX1JPT1RcIixcbiAgICAgIFwiTEFNQkRBX1JVTlRJTUVfRElSXCIsXG4gICAgXTtcbiAgICBpZiAocmVzZXJ2ZWRFbnZpcm9ubWVudFZhcmlhYmxlcy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke2tleX0gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgcmVzZXJ2ZWQgYnkgdGhlIGxhbWJkYSBydW50aW1lIGFuZCBjYW4gbm90IGJlIHNldCBtYW51YWxseS4gU2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYW1iZGEvbGF0ZXN0L2RnL2NvbmZpZ3VyYXRpb24tZW52dmFycy5odG1sYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuZW52aXJvbm1lbnRba2V5XSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIGFkZEZ1bmN0aW9uVXJsKG9wdGlvbnM/OiBGdW5jdGlvblVybE9wdGlvbnMpOiBGdW5jdGlvblVybCB7XG4gICAgY29uc3QgZW5kcG9pbnQgPSBzdXBlci5hZGRGdW5jdGlvblVybChvcHRpb25zKTtcbiAgICB0aGlzLl91cmwgPSBlbmRwb2ludC51cmw7XG4gICAgcmV0dXJuIGVuZHBvaW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBMb2dnaW5nIENvbmZpZyBwcm9wZXR5IGZvciB0aGUgZnVuY3Rpb24uXG4gICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGZ1bmN0aW9uIExvZ2dpbmdDb25maWcgUHJvcGVydHkgaWYgdGhlIHByb3BlcnR5IGlzIHNldCBvbiB0aGVcbiAgICogZnVuY3Rpb24gYW5kIHVuZGVmaW5lZCBpZiBub3QuXG4gICAqL1xuICBwcml2YXRlIGdldExvZ2dpbmdDb25maWcoXG4gICAgbG9nR3JvdXBOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IEZ1bmN0aW9uUHJvcHMsXG4gICk6IGxhbWJkYUZ1bmN0aW9uLkxhbWJkYUZ1bmN0aW9uTG9nZ2luZ0NvbmZpZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHByb3BzLmFwcGxpY2F0aW9uTG9nTGV2ZWwgfHwgcHJvcHMuc3lzdGVtTG9nTGV2ZWwpIHtcbiAgICAgIGlmIChwcm9wcy5sb2dnaW5nRm9ybWF0ICE9PSBMb2dnaW5nRm9ybWF0LkpTT04pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUbyB1c2UgQXBwbGljYXRpb25Mb2dMZXZlbCBhbmQvb3IgU3lzdGVtTG9nTGV2ZWwgeW91IG11c3Qgc2V0IExvZ2dpbmdGb3JtYXQgdG8gJyR7TG9nZ2luZ0Zvcm1hdC5KU09OfScsIGdvdCAnJHtwcm9wcy5sb2dnaW5nRm9ybWF0fScuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgbG9nZ2luZ0NvbmZpZzogbGFtYmRhRnVuY3Rpb24uTGFtYmRhRnVuY3Rpb25Mb2dnaW5nQ29uZmlnO1xuICAgIGlmIChwcm9wcy5sb2dnaW5nRm9ybWF0KSB7XG4gICAgICBsb2dnaW5nQ29uZmlnID0ge1xuICAgICAgICBsb2dGb3JtYXQ6IHByb3BzLmxvZ2dpbmdGb3JtYXQsXG4gICAgICAgIHN5c3RlbUxvZ0xldmVsOiBwcm9wcy5zeXN0ZW1Mb2dMZXZlbCxcbiAgICAgICAgYXBwbGljYXRpb25Mb2dMZXZlbDogcHJvcHMuYXBwbGljYXRpb25Mb2dMZXZlbCxcbiAgICAgICAgbG9nR3JvdXA6IGxvZ0dyb3VwTmFtZSxcbiAgICAgIH07XG4gICAgICByZXR1cm4gbG9nZ2luZ0NvbmZpZztcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGFuIGFsaWFzIGZvciB0aGlzIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBUaGUgYWxpYXMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHVwZGF0ZWQgdG8gcG9pbnQgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mXG4gICAqIHRoZSBmdW5jdGlvbiBhcyBpdCBpcyBiZWluZyB1cGRhdGVkIGR1cmluZyBhIGRlcGxveW1lbnQuXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIGRlY2xhcmUgY29uc3QgZm46IGNvbXB1dGUuTGFtYmRhRnVuY3Rpb247XG4gICAqXG4gICAqIGZuLmFkZEFsaWFzKCdMaXZlJyk7XG4gICAqXG4gICAqIC8vIElzIGVxdWl2YWxlbnQgdG9cbiAgICpcbiAgICogbmV3IGNvbXB1dGUuQWxpYXModGhpcywgJ0FsaWFzTGl2ZScsIHtcbiAgICogICBhbGlhc05hbWU6ICdMaXZlJyxcbiAgICogICB2ZXJzaW9uOiBmbi52ZXJzaW9uLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBhbGlhc05hbWUgVGhlIG5hbWUgb2YgdGhlIGFsaWFzXG4gICAqIEBwYXJhbSBvcHRpb25zIEFsaWFzIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBhZGRBbGlhcyhhbGlhc05hbWU6IHN0cmluZywgb3B0aW9ucz86IEFsaWFzT3B0aW9ucyk6IEFsaWFzIHtcbiAgICByZXR1cm4gYWRkQWxpYXModGhpcywgdGhpcywgdGhpcy52ZXJzaW9uLCBhbGlhc05hbWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsbHkgY3JlYXRlIExhbWJkYUZ1bmN0aW9uVnBjQ29uZmlnXG4gICAqL1xuICBwcml2YXRlIHBhcnNlVnBjQ29uZmlnKFxuICAgIGNvbmZpZz86IFZwY0NvbmZpZyxcbiAgKTogbGFtYmRhRnVuY3Rpb24uTGFtYmRhRnVuY3Rpb25WcGNDb25maWcgfCB1bmRlZmluZWQge1xuICAgIGlmICghY29uZmlnKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXQgc2VjdXJpdHlHcm91cElkcyA9IGNvbmZpZy5zZWN1cml0eUdyb3VwSWRzO1xuICAgIGlmICghc2VjdXJpdHlHcm91cElkcykge1xuICAgICAgdGhpcy5fc2VjdXJpdHlHcm91cCA9IG5ldyBzZWN1cml0eUdyb3VwLlNlY3VyaXR5R3JvdXAoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIFwiU2VjdXJpdHlHcm91cFwiLFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogdGhpcy5mdW5jdGlvbk5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuZnVuY3Rpb25OYW1lLFxuICAgICAgICAgIHZwY0lkOiBjb25maWcudnBjSWQsXG5cbiAgICAgICAgICBlZ3Jlc3M6IGNvbmZpZy5lZ3Jlc3MgPz8gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBmcm9tUG9ydDogMCxcbiAgICAgICAgICAgICAgdG9Qb3J0OiAwLFxuICAgICAgICAgICAgICBwcm90b2NvbDogXCItMVwiLFxuICAgICAgICAgICAgICBjaWRyQmxvY2tzOiBbXCIwLjAuMC4wLzBcIl0sXG4gICAgICAgICAgICAgIGlwdjZDaWRyQmxvY2tzOiBbXCI6Oi8wXCJdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHNlY3VyaXR5R3JvdXBJZHMgPSBbdGhpcy5fc2VjdXJpdHlHcm91cC5pZF07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBzdWJuZXRJZHM6IGNvbmZpZy5zdWJuZXRJZHMsXG4gICAgICBpcHY2QWxsb3dlZEZvckR1YWxTdGFjazogY29uZmlnLmlwdjZBbGxvd2VkRm9yRHVhbFN0YWNrLFxuICAgICAgc2VjdXJpdHlHcm91cElkcyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBpc1F1ZXVlKGRlYWRMZXR0ZXJRdWV1ZTogSVF1ZXVlKTogZGVhZExldHRlclF1ZXVlIGlzIElRdWV1ZSB7XG4gICAgcmV0dXJuICg8SVF1ZXVlPmRlYWRMZXR0ZXJRdWV1ZSkucXVldWVBcm4gIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGREZWFkTGV0dGVyUXVldWUocHJvcHM6IEZ1bmN0aW9uUHJvcHMpOiBJUXVldWUgfCB1bmRlZmluZWQge1xuICAgIC8vIHwgc25zLklUb3BpY1xuICAgIGlmIChcbiAgICAgICFwcm9wcy5kZWFkTGV0dGVyUXVldWUgJiZcbiAgICAgICFwcm9wcy5kZWFkTGV0dGVyUXVldWVFbmFibGVkXG4gICAgICAvLyAmJiAhcHJvcHMuZGVhZExldHRlclRvcGljXG4gICAgKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAocHJvcHMuZGVhZExldHRlclF1ZXVlICYmIHByb3BzLmRlYWRMZXR0ZXJRdWV1ZUVuYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgXCJkZWFkTGV0dGVyUXVldWUgZGVmaW5lZCBidXQgZGVhZExldHRlclF1ZXVlRW5hYmxlZCBleHBsaWNpdGx5IHNldCB0byBmYWxzZVwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gaWYgKFxuICAgIC8vICAgcHJvcHMuZGVhZExldHRlclRvcGljICYmXG4gICAgLy8gICAocHJvcHMuZGVhZExldHRlclF1ZXVlIHx8IHByb3BzLmRlYWRMZXR0ZXJRdWV1ZUVuYWJsZWQgIT09IHVuZGVmaW5lZClcbiAgICAvLyApIHtcbiAgICAvLyAgIHRocm93IG5ldyBFcnJvcihcbiAgICAvLyAgICAgXCJkZWFkTGV0dGVyUXVldWUgYW5kIGRlYWRMZXR0ZXJUb3BpYyBjYW5ub3QgYmUgc3BlY2lmaWVkIHRvZ2V0aGVyIGF0IHRoZSBzYW1lIHRpbWVcIixcbiAgICAvLyAgICk7XG4gICAgLy8gfVxuXG4gICAgbGV0IGRlYWRMZXR0ZXJRdWV1ZTogSVF1ZXVlOyAvLyB8IElUb3BpYztcbiAgICAvLyBpZiAocHJvcHMuZGVhZExldHRlclRvcGljKSB7XG4gICAgLy8gICBkZWFkTGV0dGVyUXVldWUgPSBwcm9wcy5kZWFkTGV0dGVyVG9waWM7XG4gICAgLy8gICB0aGlzLmFkZFRvUm9sZVBvbGljeShcbiAgICAvLyAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgIC8vICAgICAgIGFjdGlvbnM6IFtcInNuczpQdWJsaXNoXCJdLFxuICAgIC8vICAgICAgIHJlc291cmNlczogW2RlYWRMZXR0ZXJRdWV1ZS50b3BpY0Fybl0sXG4gICAgLy8gICAgIH0pLFxuICAgIC8vICAgKTtcbiAgICAvLyB9IGVsc2Uge1xuICAgIGRlYWRMZXR0ZXJRdWV1ZSA9XG4gICAgICBwcm9wcy5kZWFkTGV0dGVyUXVldWUgfHxcbiAgICAgIG5ldyBRdWV1ZSh0aGlzLCBcIkRlYWRMZXR0ZXJRdWV1ZVwiLCB7XG4gICAgICAgIG1lc3NhZ2VSZXRlbnRpb25TZWNvbmRzOiBEdXJhdGlvbi5kYXlzKDE0KS50b1NlY29uZHMoKSxcbiAgICAgIH0pO1xuICAgIHRoaXMuYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbXCJzcXM6U2VuZE1lc3NhZ2VcIl0sXG4gICAgICAgIHJlc291cmNlczogW2RlYWRMZXR0ZXJRdWV1ZS5xdWV1ZUFybl0sXG4gICAgICB9KSxcbiAgICApO1xuICAgIC8vIH1cblxuICAgIHJldHVybiBkZWFkTGV0dGVyUXVldWU7XG4gIH1cblxuICAvLyBUT0RPOiBTdXBwb3J0IHNucy5JVG9waWMgKyBzbnM6UHVibGlzaCB0b3BpY0FyblxuICAvKipcbiAgICogT3B0aW9uYWxseSBjcmVhdGUgTGFtYmRhRnVuY3Rpb25EZWFkTGV0dGVyQ29uZmlnXG4gICAqL1xuICBwcml2YXRlIHBhcnNlRGVhZExldHRlckNvbmZpZyhcbiAgICBkZWFkTGV0dGVyUXVldWU/OiBJUXVldWUsIC8vIHwgc25zLklUb3BpY1xuICApOiBsYW1iZGFGdW5jdGlvbi5MYW1iZGFGdW5jdGlvbkRlYWRMZXR0ZXJDb25maWcgfCB1bmRlZmluZWQge1xuICAgIGlmIChkZWFkTGV0dGVyUXVldWUpIHtcbiAgICAgIC8vIHRoaXMuaXNRdWV1ZShkZWFkTGV0dGVyUXVldWUpID8gZGVhZExldHRlclF1ZXVlLnF1ZXVlQXJuIDogLi4uXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXRBcm46IGRlYWRMZXR0ZXJRdWV1ZS5xdWV1ZUFybixcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVRyYWNpbmdDb25maWcoXG4gICAgdHJhY2luZzogVHJhY2luZyxcbiAgKTogbGFtYmRhRnVuY3Rpb24uTGFtYmRhRnVuY3Rpb25UcmFjaW5nQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHJhY2luZyA9PT0gdW5kZWZpbmVkIHx8IHRyYWNpbmcgPT09IFRyYWNpbmcuRElTQUJMRUQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRUb1JvbGVQb2xpY3koXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtcInhyYXk6UHV0VHJhY2VTZWdtZW50c1wiLCBcInhyYXk6UHV0VGVsZW1ldHJ5UmVjb3Jkc1wiXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBtb2RlOiB0cmFjaW5nLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBHaXZlbiBhbiBvcGFxdWUgKHRva2VuKSBBUk4sIHJldHVybnMgYSBURiBleHByZXNzaW9uIHRoYXQgZXh0cmFjdHMgdGhlIGZ1bmN0aW9uXG4gKiBuYW1lIGZyb20gdGhlIEFSTi5cbiAqXG4gKiBGdW5jdGlvbiBBUk5zIGxvb2sgbGlrZSB0aGlzOlxuICpcbiAqICAgYXJuOmF3czpsYW1iZGE6cmVnaW9uOmFjY291bnQtaWQ6ZnVuY3Rpb246ZnVuY3Rpb24tbmFtZVxuICpcbiAqIC4ud2hpY2ggbWVhbnMgdGhhdCBpbiBvcmRlciB0byBleHRyYWN0IHRoZSBgZnVuY3Rpb24tbmFtZWAgY29tcG9uZW50IGZyb20gdGhlIEFSTiwgd2UgY2FuXG4gKiBzcGxpdCB0aGUgQVJOIHVzaW5nIFwiOlwiIGFuZCBzZWxlY3QgdGhlIGNvbXBvbmVudCBpbiBpbmRleCA2LlxuICpcbiAqIEByZXR1cm5zIGBlbGVtZW50KHNwbGl0KCc6JywgYXJuKSwgNilgXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3ROYW1lRnJvbUFybihhcm46IHN0cmluZykge1xuICBjb25zdCB7IHJlc291cmNlTmFtZSB9ID0gQXJuLnNwbGl0KGFybiwgQXJuRm9ybWF0LkNPTE9OX1JFU09VUkNFX05BTUUpO1xuICBpZiAoIXJlc291cmNlTmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBMYW1iZGEgZnVuY3Rpb24gQVJOOiAke2Fybn1gKTtcbiAgfVxuICAvLyBpZiAocmVzb3VyY2VOYW1lLmluY2x1ZGVzKFwiOlwiKSkgc3BsaXQgb2ZmIHRoZSB2ZXJzaW9uXG4gIGlmIChyZXNvdXJjZU5hbWUuaW5jbHVkZXMoXCI6XCIpKSB7XG4gICAgcmV0dXJuIHJlc291cmNlTmFtZS5zcGxpdChcIjpcIilbMF07XG4gIH1cbiAgcmV0dXJuIHJlc291cmNlTmFtZTtcbn1cblxuLyoqXG4gKiBYLVJheSBUcmFjaW5nIE1vZGVzIChodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFtYmRhL2xhdGVzdC9kZy9BUElfVHJhY2luZ0NvbmZpZy5odG1sKVxuICovXG5leHBvcnQgZW51bSBUcmFjaW5nIHtcbiAgLyoqXG4gICAqIExhbWJkYSB3aWxsIHJlc3BlY3QgYW55IHRyYWNpbmcgaGVhZGVyIGl0IHJlY2VpdmVzIGZyb20gYW4gdXBzdHJlYW0gc2VydmljZS5cbiAgICogSWYgbm8gdHJhY2luZyBoZWFkZXIgaXMgcmVjZWl2ZWQsIExhbWJkYSB3aWxsIHNhbXBsZSB0aGUgcmVxdWVzdCBiYXNlZCBvbiBhIGZpeGVkIHJhdGUuIFBsZWFzZSBzZWUgdGhlIFtVc2luZyBBV1MgTGFtYmRhIHdpdGggQVdTIFgtUmF5XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFtYmRhL2xhdGVzdC9kZy9zZXJ2aWNlcy14cmF5Lmh0bWwpIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgb24gdGhpcyBzYW1wbGluZyBiZWhhdmlvci5cbiAgICovXG4gIEFDVElWRSA9IFwiQWN0aXZlXCIsXG4gIC8qKlxuICAgKiBMYW1iZGEgd2lsbCBvbmx5IHRyYWNlIHRoZSByZXF1ZXN0IGZyb20gYW4gdXBzdHJlYW0gc2VydmljZVxuICAgKiBpZiBpdCBjb250YWlucyBhIHRyYWNpbmcgaGVhZGVyIHdpdGggXCJzYW1wbGVkPTFcIlxuICAgKi9cbiAgUEFTU19USFJPVUdIID0gXCJQYXNzVGhyb3VnaFwiLFxuICAvKipcbiAgICogTGFtYmRhIHdpbGwgbm90IHRyYWNlIGFueSByZXF1ZXN0LlxuICAgKi9cbiAgRElTQUJMRUQgPSBcIkRpc2FibGVkXCIsXG59XG5cbi8qKlxuICogTGFtYmRhIHNlcnZpY2Ugd2lsbCBhdXRvbWF0aWNhbGx5IGNhcHR1cmVzIHN5c3RlbSBsb2dzIGFib3V0IGZ1bmN0aW9uIGludm9jYXRpb25cbiAqIGdlbmVyYXRlZCBieSB0aGUgTGFtYmRhIHNlcnZpY2UgKGtub3duIGFzIHN5c3RlbSBsb2dzKSBhbmQgc2VuZHMgdGhlc2UgbG9ncyB0byBhXG4gKiBkZWZhdWx0IENsb3VkV2F0Y2ggbG9nIGdyb3VwIG5hbWVkIGFmdGVyIHRoZSBMYW1iZGEgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBlbnVtIFN5c3RlbUxvZ0xldmVsIHtcbiAgLyoqXG4gICAqIExhbWJkYSB3aWxsIGNhcHR1cmUgb25seSBsb2dzIGF0IGluZm8gbGV2ZWwuXG4gICAqL1xuICBJTkZPID0gXCJJTkZPXCIsXG4gIC8qKlxuICAgKiBMYW1iZGEgd2lsbCBjYXB0dXJlIG9ubHkgbG9ncyBhdCBkZWJ1ZyBsZXZlbC5cbiAgICovXG4gIERFQlVHID0gXCJERUJVR1wiLFxuICAvKipcbiAgICogTGFtYmRhIHdpbGwgY2FwdHVyZSBvbmx5IGxvZ3MgYXQgd2FybiBsZXZlbC5cbiAgICovXG4gIFdBUk4gPSBcIldBUk5cIixcbn1cblxuLyoqXG4gKiBMYW1iZGEgc2VydmljZSBhdXRvbWF0aWNhbGx5IGNhcHR1cmVzIGxvZ3MgZ2VuZXJhdGVkIGJ5IHRoZSBmdW5jdGlvbiBjb2RlXG4gKiAoa25vd24gYXMgYXBwbGljYXRpb24gbG9ncykgYW5kIHNlbmRzIHRoZXNlIGxvZ3MgdG8gYSBkZWZhdWx0IENsb3VkV2F0Y2hcbiAqIGxvZyBncm91cCBuYW1lZCBhZnRlciB0aGUgTGFtYmRhIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZW51bSBBcHBsaWNhdGlvbkxvZ0xldmVsIHtcbiAgLyoqXG4gICAqIExhbWJkYSB3aWxsIGNhcHR1cmUgb25seSBsb2dzIGF0IGluZm8gbGV2ZWwuXG4gICAqL1xuICBJTkZPID0gXCJJTkZPXCIsXG4gIC8qKlxuICAgKiBMYW1iZGEgd2lsbCBjYXB0dXJlIG9ubHkgbG9ncyBhdCBkZWJ1ZyBsZXZlbC5cbiAgICovXG4gIERFQlVHID0gXCJERUJVR1wiLFxuICAvKipcbiAgICogTGFtYmRhIHdpbGwgY2FwdHVyZSBvbmx5IGxvZ3MgYXQgd2FybiBsZXZlbC5cbiAgICovXG4gIFdBUk4gPSBcIldBUk5cIixcbiAgLyoqXG4gICAqIExhbWJkYSB3aWxsIGNhcHR1cmUgb25seSBsb2dzIGF0IHRyYWNlIGxldmVsLlxuICAgKi9cbiAgVFJBQ0UgPSBcIlRSQUNFXCIsXG4gIC8qKlxuICAgKiBMYW1iZGEgd2lsbCBjYXB0dXJlIG9ubHkgbG9ncyBhdCBlcnJvciBsZXZlbC5cbiAgICovXG4gIEVSUk9SID0gXCJFUlJPUlwiLFxuICAvKipcbiAgICogTGFtYmRhIHdpbGwgY2FwdHVyZSBvbmx5IGxvZ3MgYXQgZmF0YWwgbGV2ZWwuXG4gICAqL1xuICBGQVRBTCA9IFwiRkFUQUxcIixcbn1cblxuLyoqXG4gKiBUaGlzIGZpZWxkIHRha2VzIGluIDIgdmFsdWVzIGVpdGhlciBUZXh0IG9yIEpTT04uIEJ5IHNldHRpbmcgdGhpcyB2YWx1ZSB0byBUZXh0LFxuICogd2lsbCByZXN1bHQgaW4gdGhlIGN1cnJlbnQgc3RydWN0dXJlIG9mIGxvZ3MgZm9ybWF0LCB3aGVyZWFzLCBieSBzZXR0aW5nIHRoaXMgdmFsdWUgdG8gSlNPTixcbiAqIExhbWJkYSB3aWxsIHByaW50IHRoZSBsb2dzIGFzIFN0cnVjdHVyZWQgSlNPTiBMb2dzLCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHRpbWVzdGFtcCBhbmQgbG9nIGxldmVsXG4gKiBvZiBlYWNoIGV2ZW50LiBTZWxlY3Rpbmcg4oCYSlNPTuKAmSBmb3JtYXQgd2lsbCBvbmx5IGFsbG93IGN1c3RvbWVy4oCZcyB0byBoYXZlIGRpZmZlcmVudCBsb2cgbGV2ZWxcbiAqIEFwcGxpY2F0aW9uIGxvZyBsZXZlbCBhbmQgdGhlIFN5c3RlbSBsb2cgbGV2ZWwuXG4gKi9cbmV4cG9ydCBlbnVtIExvZ2dpbmdGb3JtYXQge1xuICAvKipcbiAgICogTGFtYmRhIExvZ3MgdGV4dCBmb3JtYXQuXG4gICAqL1xuICBURVhUID0gXCJUZXh0XCIsXG4gIC8qKlxuICAgKiBMYW1iZGEgc3RydWN0dXJlZCBsb2dnaW5nIGluIEpzb24gZm9ybWF0LlxuICAgKi9cbiAgSlNPTiA9IFwiSlNPTlwiLFxufVxuXG4vKipcbiAqIEEgZGVzdGluYXRpb24gY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIERscURlc3RpbmF0aW9uQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgZGVzdGluYXRpb24gcmVzb3VyY2VcbiAgICovXG4gIHJlYWRvbmx5IGRlc3RpbmF0aW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBETFEgZm9yIGFuIGV2ZW50IHNvdXJjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFdmVudFNvdXJjZURscSB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBETFEgZGVzdGluYXRpb24gY29uZmlnIG9mIHRoZSBETFFcbiAgICovXG4gIGJpbmQoXG4gICAgdGFyZ2V0OiBJRXZlbnRTb3VyY2VNYXBwaW5nLFxuICAgIHRhcmdldEhhbmRsZXI6IElGdW5jdGlvbixcbiAgKTogRGxxRGVzdGluYXRpb25Db25maWc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2ZXJpZnlDb2RlQ29uZmlnKGNvZGU6IENvZGVDb25maWcsIHByb3BzOiBGdW5jdGlvblByb3BzKSB7XG4gIC8vIG11dHVhbGx5IGV4Y2x1c2l2ZVxuICBjb25zdCBjb2RlVHlwZSA9IFtjb2RlLmlubGluZUNvZGUsIGNvZGUuczNMb2NhdGlvbiwgY29kZS5pbWFnZV07XG5cbiAgaWYgKGNvZGVUeXBlLmZpbHRlcigoeCkgPT4gISF4KS5sZW5ndGggIT09IDEpIHtcbiAgICAvLyB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ2xhbWJkYS5Db2RlIG11c3Qgc3BlY2lmeSBleGFjdGx5IG9uZSBvZjogXCJpbmxpbmVDb2RlXCIsIFwiczNMb2NhdGlvblwiLCBvciBcImltYWdlXCInLFxuICAgICk7XG4gIH1cblxuICBpZiAoISFjb2RlLmltYWdlID09PSAocHJvcHMuaGFuZGxlciAhPT0gSGFuZGxlci5GUk9NX0lNQUdFKSkge1xuICAgIC8vIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcImhhbmRsZXIgbXVzdCBiZSBgSGFuZGxlci5GUk9NX0lNQUdFYCB3aGVuIHVzaW5nIGltYWdlIGFzc2V0IGZvciBMYW1iZGEgZnVuY3Rpb25cIixcbiAgICApO1xuICB9XG5cbiAgaWYgKCEhY29kZS5pbWFnZSA9PT0gKHByb3BzLnJ1bnRpbWUgIT09IFJ1bnRpbWUuRlJPTV9JTUFHRSkpIHtcbiAgICAvLyB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJydW50aW1lIG11c3QgYmUgYFJ1bnRpbWUuRlJPTV9JTUFHRWAgd2hlbiB1c2luZyBpbWFnZSBhc3NldCBmb3IgTGFtYmRhIGZ1bmN0aW9uXCIsXG4gICAgKTtcbiAgfVxuXG4gIC8vIGlmIHRoaXMgaXMgaW5saW5lIGNvZGUsIGNoZWNrIHRoYXQgdGhlIHJ1bnRpbWUgc3VwcG9ydHNcbiAgaWYgKGNvZGUuaW5saW5lQ29kZSAmJiAhcHJvcHMucnVudGltZS5zdXBwb3J0c0lubGluZUNvZGUpIHtcbiAgICAvLyB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbmxpbmUgc291cmNlIG5vdCBhbGxvd2VkIGZvciAke3Byb3BzLnJ1bnRpbWUhLm5hbWV9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5kZWZpbmVkSWZOb0tleXM8QSBleHRlbmRzIHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9PihcbiAgc3RydWN0OiBBLFxuKTogQSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGFsbFVuZGVmaW5lZCA9IE9iamVjdC52YWx1ZXMoc3RydWN0KS5ldmVyeSgodmFsKSA9PiB2YWwgPT09IHVuZGVmaW5lZCk7XG4gIHJldHVybiBhbGxVbmRlZmluZWQgPyB1bmRlZmluZWQgOiBzdHJ1Y3Q7XG59XG4iXX0=
@@ -50,7 +50,7 @@ class GatewayResponse extends aws_construct_1.AwsConstructBase {
50
50
  }
51
51
  exports.GatewayResponse = GatewayResponse;
52
52
  _a = JSII_RTTI_SYMBOL_1;
53
- GatewayResponse[_a] = { fqn: "terraconstructs.aws.compute.GatewayResponse", version: "0.1.0" };
53
+ GatewayResponse[_a] = { fqn: "terraconstructs.aws.compute.GatewayResponse", version: "0.1.2" };
54
54
  /**
55
55
  * Supported types of gateway responses.
56
56
  * @see https://docs.aws.amazon.com/apigateway/latest/developerguide/supported-gateway-response-types.html
@@ -66,7 +66,7 @@ class ResponseType {
66
66
  }
67
67
  exports.ResponseType = ResponseType;
68
68
  _b = JSII_RTTI_SYMBOL_1;
69
- ResponseType[_b] = { fqn: "terraconstructs.aws.compute.ResponseType", version: "0.1.0" };
69
+ ResponseType[_b] = { fqn: "terraconstructs.aws.compute.ResponseType", version: "0.1.2" };
70
70
  /**
71
71
  * The gateway response for authorization failure.
72
72
  */
@@ -12,7 +12,7 @@ class Handler {
12
12
  }
13
13
  exports.Handler = Handler;
14
14
  _a = JSII_RTTI_SYMBOL_1;
15
- Handler[_a] = { fqn: "terraconstructs.aws.compute.Handler", version: "0.1.0" };
15
+ Handler[_a] = { fqn: "terraconstructs.aws.compute.Handler", version: "0.1.2" };
16
16
  /**
17
17
  * A special handler when the function handler is part of a Docker image.
18
18
  */