terraconstructs 0.1.9 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (303) hide show
  1. package/.jsii +1693 -955
  2. package/lib/asset-staging.js +1 -1
  3. package/lib/aws/arn.js +4 -3
  4. package/lib/aws/aws-asset-manager.js +1 -1
  5. package/lib/aws/aws-construct.js +1 -1
  6. package/lib/aws/aws-stack.d.ts +28 -4
  7. package/lib/aws/aws-stack.js +80 -22
  8. package/lib/aws/aws-tags.js +2 -2
  9. package/lib/aws/cloudwatch/actions/appscaling.js +1 -1
  10. package/lib/aws/cloudwatch/actions/ec2.js +1 -1
  11. package/lib/aws/cloudwatch/actions/lambda.js +1 -1
  12. package/lib/aws/cloudwatch/actions/sns.js +1 -1
  13. package/lib/aws/cloudwatch/actions/ssm.js +2 -2
  14. package/lib/aws/cloudwatch/alarm-base.js +1 -1
  15. package/lib/aws/cloudwatch/alarm-rule.js +1 -1
  16. package/lib/aws/cloudwatch/alarm-status-widget.js +1 -1
  17. package/lib/aws/cloudwatch/alarm.js +1 -1
  18. package/lib/aws/cloudwatch/composite-alarm.js +1 -1
  19. package/lib/aws/cloudwatch/dashboard.js +1 -1
  20. package/lib/aws/cloudwatch/data-protection-policy.js +3 -3
  21. package/lib/aws/cloudwatch/graph.js +8 -8
  22. package/lib/aws/cloudwatch/layout.js +3 -3
  23. package/lib/aws/cloudwatch/log-destinations/kinesis.js +1 -1
  24. package/lib/aws/cloudwatch/log-destinations/lambda.js +1 -1
  25. package/lib/aws/cloudwatch/log-group.js +1 -1
  26. package/lib/aws/cloudwatch/log-query.js +1 -1
  27. package/lib/aws/cloudwatch/log-stream.js +1 -1
  28. package/lib/aws/cloudwatch/metric-filter.js +1 -1
  29. package/lib/aws/cloudwatch/metric.js +2 -2
  30. package/lib/aws/cloudwatch/pattern.js +3 -3
  31. package/lib/aws/cloudwatch/policy.js +1 -1
  32. package/lib/aws/cloudwatch/query-definition.js +2 -2
  33. package/lib/aws/cloudwatch/stats.js +1 -1
  34. package/lib/aws/cloudwatch/subscription-filter.js +1 -1
  35. package/lib/aws/cloudwatch/text.js +1 -1
  36. package/lib/aws/cloudwatch/variable.js +3 -3
  37. package/lib/aws/cloudwatch/widget.js +1 -1
  38. package/lib/aws/compute/access-log.js +4 -4
  39. package/lib/aws/compute/activity.js +1 -1
  40. package/lib/aws/compute/alb/application-listener-action.js +1 -1
  41. package/lib/aws/compute/alb/application-listener-certificate.js +1 -1
  42. package/lib/aws/compute/alb/application-listener-rule.js +1 -1
  43. package/lib/aws/compute/alb/application-listener.js +1 -1
  44. package/lib/aws/compute/alb/application-load-balancer.js +1 -1
  45. package/lib/aws/compute/alb/application-target-group.js +1 -1
  46. package/lib/aws/compute/alb/conditions.js +1 -1
  47. package/lib/aws/compute/alb/trust-store-revocation.js +1 -1
  48. package/lib/aws/compute/alb/trust-store.js +1 -1
  49. package/lib/aws/compute/api-definition.js +3 -3
  50. package/lib/aws/compute/api-key.js +2 -2
  51. package/lib/aws/compute/architecture.js +1 -1
  52. package/lib/aws/compute/aspects/require-imdsv2-aspect.js +2 -2
  53. package/lib/aws/compute/authorizer.js +1 -1
  54. package/lib/aws/compute/authorizers/identity-source.js +1 -1
  55. package/lib/aws/compute/authorizers/lambda.js +2 -2
  56. package/lib/aws/compute/base-path-mapping.js +1 -1
  57. package/lib/aws/compute/base-scalable-attribute.js +1 -1
  58. package/lib/aws/compute/bastion-host.js +1 -1
  59. package/lib/aws/compute/chain.js +1 -1
  60. package/lib/aws/compute/client-vpn-authorization-rule.js +1 -1
  61. package/lib/aws/compute/client-vpn-endpoint.js +2 -2
  62. package/lib/aws/compute/client-vpn-route.js +2 -2
  63. package/lib/aws/compute/code.js +8 -8
  64. package/lib/aws/compute/condition.js +1 -1
  65. package/lib/aws/compute/connections.js +1 -1
  66. package/lib/aws/compute/cors.js +1 -1
  67. package/lib/aws/compute/deployment.js +1 -1
  68. package/lib/aws/compute/domain-name.js +1 -1
  69. package/lib/aws/compute/event-invoke-config.js +1 -1
  70. package/lib/aws/compute/event-source-filter.js +2 -2
  71. package/lib/aws/compute/event-source-mapping.d.ts +10 -0
  72. package/lib/aws/compute/event-source-mapping.js +20 -23
  73. package/lib/aws/compute/event-sources/s3-onfailure-destination.js +1 -1
  74. package/lib/aws/compute/event-sources/s3.js +1 -1
  75. package/lib/aws/compute/event-sources/sqs-dlq.js +1 -1
  76. package/lib/aws/compute/event-sources/sqs.d.ts +10 -0
  77. package/lib/aws/compute/event-sources/sqs.js +3 -3
  78. package/lib/aws/compute/fields.js +4 -4
  79. package/lib/aws/compute/function-alias.js +1 -1
  80. package/lib/aws/compute/function-base.js +2 -2
  81. package/lib/aws/compute/function-destinations/event-bridge.js +1 -1
  82. package/lib/aws/compute/function-destinations/function.js +1 -1
  83. package/lib/aws/compute/function-destinations/sqs.js +1 -1
  84. package/lib/aws/compute/function-nodejs/function.js +1 -1
  85. package/lib/aws/compute/function-url.js +1 -1
  86. package/lib/aws/compute/function.js +3 -3
  87. package/lib/aws/compute/gateway-response.js +2 -2
  88. package/lib/aws/compute/handler.js +1 -1
  89. package/lib/aws/compute/instance-types.js +1 -1
  90. package/lib/aws/compute/instance.js +1 -1
  91. package/lib/aws/compute/integration.js +1 -1
  92. package/lib/aws/compute/integrations/aws.js +1 -1
  93. package/lib/aws/compute/integrations/http.js +1 -1
  94. package/lib/aws/compute/integrations/lambda.js +1 -1
  95. package/lib/aws/compute/integrations/mock.js +1 -1
  96. package/lib/aws/compute/integrations/stepfunctions.js +1 -1
  97. package/lib/aws/compute/ip-addresses.js +2 -2
  98. package/lib/aws/compute/ipam.js +1 -1
  99. package/lib/aws/compute/key-pair.js +1 -1
  100. package/lib/aws/compute/lambda-api.js +1 -1
  101. package/lib/aws/compute/launch-template.js +2 -2
  102. package/lib/aws/compute/lb-shared/base-listener.js +1 -1
  103. package/lib/aws/compute/lb-shared/base-load-balancer.js +5 -7
  104. package/lib/aws/compute/lb-shared/base-target-group.js +1 -1
  105. package/lib/aws/compute/lb-shared/listener-certificate.js +1 -1
  106. package/lib/aws/compute/lb-shared/load-balancer-targets.js +2 -2
  107. package/lib/aws/compute/lb-targets/alb-target.js +3 -3
  108. package/lib/aws/compute/lb-targets/instance-target.js +2 -2
  109. package/lib/aws/compute/lb-targets/ip-target.js +1 -1
  110. package/lib/aws/compute/lb-targets/lambda-target.js +1 -1
  111. package/lib/aws/compute/load-balancer.js +3 -3
  112. package/lib/aws/compute/machine-image/amazon-linux-2022.js +2 -2
  113. package/lib/aws/compute/machine-image/amazon-linux-2023.js +2 -2
  114. package/lib/aws/compute/machine-image/amazon-linux2.js +2 -2
  115. package/lib/aws/compute/machine-image/common.js +1 -1
  116. package/lib/aws/compute/machine-image/machine-image.js +8 -8
  117. package/lib/aws/compute/method.js +1 -1
  118. package/lib/aws/compute/model.js +3 -3
  119. package/lib/aws/compute/nat.js +5 -5
  120. package/lib/aws/compute/network-acl-types.js +2 -2
  121. package/lib/aws/compute/network-acl.js +3 -3
  122. package/lib/aws/compute/nlb/network-listener-action.js +1 -1
  123. package/lib/aws/compute/nlb/network-listener.js +1 -1
  124. package/lib/aws/compute/nlb/network-load-balancer.js +1 -1
  125. package/lib/aws/compute/nlb/network-target-group.js +1 -1
  126. package/lib/aws/compute/peer.js +1 -1
  127. package/lib/aws/compute/placement-group.js +1 -1
  128. package/lib/aws/compute/port.js +1 -1
  129. package/lib/aws/compute/prefix-list.js +1 -1
  130. package/lib/aws/compute/requestvalidator.js +1 -1
  131. package/lib/aws/compute/resource.js +3 -3
  132. package/lib/aws/compute/restapi.js +3 -3
  133. package/lib/aws/compute/route.js +8 -8
  134. package/lib/aws/compute/runtime.d.ts +0 -1
  135. package/lib/aws/compute/runtime.js +5 -36
  136. package/lib/aws/compute/scalable-target.js +1 -1
  137. package/lib/aws/compute/schedule.js +1 -1
  138. package/lib/aws/compute/security-group.js +1 -1
  139. package/lib/aws/compute/stage.js +2 -2
  140. package/lib/aws/compute/state-graph.js +1 -1
  141. package/lib/aws/compute/state-machine-fragment.js +1 -1
  142. package/lib/aws/compute/state-machine.js +4 -4
  143. package/lib/aws/compute/states/choice.js +1 -1
  144. package/lib/aws/compute/states/custom-state.js +1 -1
  145. package/lib/aws/compute/states/distributed-map/item-batcher.js +1 -1
  146. package/lib/aws/compute/states/distributed-map/item-reader.js +5 -5
  147. package/lib/aws/compute/states/distributed-map/result-writer.js +1 -1
  148. package/lib/aws/compute/states/distributed-map.js +1 -1
  149. package/lib/aws/compute/states/fail.js +1 -1
  150. package/lib/aws/compute/states/map-base.js +1 -1
  151. package/lib/aws/compute/states/map.js +1 -1
  152. package/lib/aws/compute/states/parallel.js +1 -1
  153. package/lib/aws/compute/states/pass.js +2 -2
  154. package/lib/aws/compute/states/state.js +1 -1
  155. package/lib/aws/compute/states/succeed.js +1 -1
  156. package/lib/aws/compute/states/task-base.js +2 -2
  157. package/lib/aws/compute/states/task.js +1 -1
  158. package/lib/aws/compute/states/wait.js +2 -2
  159. package/lib/aws/compute/step-scaling-action.js +1 -1
  160. package/lib/aws/compute/step-scaling-policy.js +1 -1
  161. package/lib/aws/compute/stepfunctions-api.js +1 -1
  162. package/lib/aws/compute/subnet-v2.js +2 -2
  163. package/lib/aws/compute/subnet.js +1 -1
  164. package/lib/aws/compute/target-tracking-scaling-policy.js +1 -1
  165. package/lib/aws/compute/task-credentials.js +1 -1
  166. package/lib/aws/compute/task-input.js +1 -1
  167. package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +1 -1
  168. package/lib/aws/compute/tasks/eventbridge/put-events.js +1 -1
  169. package/lib/aws/compute/tasks/http/invoke.js +1 -1
  170. package/lib/aws/compute/tasks/lambda/invoke.js +1 -1
  171. package/lib/aws/compute/tasks/sqs/send-message.js +10 -13
  172. package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +1 -1
  173. package/lib/aws/compute/tasks/stepfunctions/start-execution.js +1 -1
  174. package/lib/aws/compute/types.js +1 -1
  175. package/lib/aws/compute/usage-plan.js +1 -1
  176. package/lib/aws/compute/user-data.js +3 -3
  177. package/lib/aws/compute/volume.js +2 -2
  178. package/lib/aws/compute/vpc-endpoint-service.js +1 -1
  179. package/lib/aws/compute/vpc-endpoint.js +6 -6
  180. package/lib/aws/compute/vpc-flow-logs.js +4 -4
  181. package/lib/aws/compute/vpc-link.js +1 -1
  182. package/lib/aws/compute/vpc-v2-base.js +1 -1
  183. package/lib/aws/compute/vpc-v2.js +2 -2
  184. package/lib/aws/compute/vpc.js +4 -4
  185. package/lib/aws/compute/vpn.js +3 -3
  186. package/lib/aws/cx-api.d.ts +1 -0
  187. package/lib/aws/cx-api.js +6 -0
  188. package/lib/aws/edge/certificate.js +1 -1
  189. package/lib/aws/edge/distribution.js +3 -3
  190. package/lib/aws/edge/dns-alias-record-targets.js +6 -6
  191. package/lib/aws/edge/dns-record.js +13 -13
  192. package/lib/aws/edge/dns-zone.js +1 -1
  193. package/lib/aws/edge/function.js +2 -2
  194. package/lib/aws/edge/key-value-store.js +4 -4
  195. package/lib/aws/edge/origin.js +3 -3
  196. package/lib/aws/edge/response-headers-policy.js +1 -1
  197. package/lib/aws/encryption/alias.js +1 -1
  198. package/lib/aws/encryption/key.js +1 -1
  199. package/lib/aws/encryption/via-service-principal.js +1 -1
  200. package/lib/aws/environment-aware.d.ts +41 -0
  201. package/lib/aws/environment-aware.js +3 -0
  202. package/lib/aws/iam/grant.d.ts +34 -0
  203. package/lib/aws/iam/grant.js +27 -6
  204. package/lib/aws/iam/group.js +1 -1
  205. package/lib/aws/iam/instance-profile.js +1 -1
  206. package/lib/aws/iam/managed-policy.js +1 -1
  207. package/lib/aws/iam/oidc-provider.js +1 -1
  208. package/lib/aws/iam/policy-document.js +1 -1
  209. package/lib/aws/iam/policy-statement.js +1 -1
  210. package/lib/aws/iam/policy.js +1 -1
  211. package/lib/aws/iam/principals.js +20 -20
  212. package/lib/aws/iam/role.js +1 -1
  213. package/lib/aws/iam/saml-provider.js +2 -2
  214. package/lib/aws/iam/unknown-principal.js +1 -1
  215. package/lib/aws/iam/user.js +1 -1
  216. package/lib/aws/index.d.ts +1 -0
  217. package/lib/aws/index.js +2 -1
  218. package/lib/aws/network/simple-ipv4-vpc.js +1 -1
  219. package/lib/aws/network/subnet-group.js +3 -3
  220. package/lib/aws/network/subnet.js +4 -4
  221. package/lib/aws/notify/archive.js +1 -1
  222. package/lib/aws/notify/connection.js +3 -3
  223. package/lib/aws/notify/event-bus.d.ts +1 -1
  224. package/lib/aws/notify/event-bus.js +4 -4
  225. package/lib/aws/notify/event-pattern.js +1 -1
  226. package/lib/aws/notify/index.d.ts +3 -1
  227. package/lib/aws/notify/index.js +5 -5
  228. package/lib/aws/notify/input.js +2 -2
  229. package/lib/aws/notify/kinesis-stream.js +1 -1
  230. package/lib/aws/notify/notification-rule.js +1 -1
  231. package/lib/aws/notify/policy.js +1 -1
  232. package/lib/aws/notify/queue-base.d.ts +241 -0
  233. package/lib/aws/notify/queue-base.js +161 -0
  234. package/lib/aws/notify/queue-policy.js +1 -1
  235. package/lib/aws/notify/queue.d.ts +157 -190
  236. package/lib/aws/notify/queue.js +239 -186
  237. package/lib/aws/notify/resource-policy.js +1 -1
  238. package/lib/aws/notify/rule.js +1 -1
  239. package/lib/aws/notify/schedule.js +1 -1
  240. package/lib/aws/notify/sqs-augmentations.generated.d.ts +3 -3
  241. package/lib/aws/notify/sqs-augmentations.generated.js +23 -26
  242. package/lib/aws/notify/sqs-grants.generated.d.ts +72 -0
  243. package/lib/aws/notify/sqs-grants.generated.js +139 -0
  244. package/lib/aws/notify/subscription-filter.js +1 -1
  245. package/lib/aws/notify/subscription.js +4 -4
  246. package/lib/aws/notify/subscriptions/email.js +1 -1
  247. package/lib/aws/notify/subscriptions/lambda.js +1 -1
  248. package/lib/aws/notify/subscriptions/sms.js +1 -1
  249. package/lib/aws/notify/subscriptions/sqs.js +30 -27
  250. package/lib/aws/notify/subscriptions/subscription.d.ts +1 -1
  251. package/lib/aws/notify/subscriptions/subscription.js +1 -1
  252. package/lib/aws/notify/subscriptions/url.js +1 -1
  253. package/lib/aws/notify/targets/event-bus.d.ts +1 -1
  254. package/lib/aws/notify/targets/event-bus.js +2 -2
  255. package/lib/aws/notify/targets/function.js +1 -1
  256. package/lib/aws/notify/targets/log-group.js +2 -2
  257. package/lib/aws/notify/targets/sqs.js +12 -14
  258. package/lib/aws/notify/targets/state-machine.js +1 -1
  259. package/lib/aws/notify/topic-base.js +1 -1
  260. package/lib/aws/notify/topic.js +1 -1
  261. package/lib/aws/region-lookup.d.ts +8 -0
  262. package/lib/aws/region-lookup.js +104 -0
  263. package/lib/aws/storage/assets/image-asset.js +3 -3
  264. package/lib/aws/storage/assets/s3.js +1 -1
  265. package/lib/aws/storage/auth-token.js +2 -2
  266. package/lib/aws/storage/billing.js +1 -1
  267. package/lib/aws/storage/bucket-notifications.js +1 -1
  268. package/lib/aws/storage/bucket-policy.js +1 -1
  269. package/lib/aws/storage/bucket-source.js +1 -1
  270. package/lib/aws/storage/bucket.js +27 -24
  271. package/lib/aws/storage/capacity.js +1 -1
  272. package/lib/aws/storage/ecr-repository.js +3 -3
  273. package/lib/aws/storage/encryption.js +1 -1
  274. package/lib/aws/storage/notification-targets/function.js +1 -1
  275. package/lib/aws/storage/notification-targets/queue.js +17 -21
  276. package/lib/aws/storage/origin-access-identity.js +1 -1
  277. package/lib/aws/storage/parameter.js +2 -2
  278. package/lib/aws/storage/table.js +3 -3
  279. package/lib/aws/storage/util.d.ts +0 -10
  280. package/lib/aws/storage/util.js +4 -91
  281. package/lib/bundling.js +3 -3
  282. package/lib/construct-base.js +2 -2
  283. package/lib/duration.js +1 -1
  284. package/lib/errors.js +1 -1
  285. package/lib/expiration.js +1 -1
  286. package/lib/fs/ignore.js +4 -4
  287. package/lib/fs/index.js +1 -1
  288. package/lib/helpers-internal/index.d.ts +1 -0
  289. package/lib/helpers-internal/index.js +16 -1
  290. package/lib/helpers-internal/validate-all-props.d.ts +29 -0
  291. package/lib/helpers-internal/validate-all-props.js +23 -0
  292. package/lib/size.js +1 -1
  293. package/lib/stack-base.d.ts +21 -5
  294. package/lib/stack-base.js +68 -5
  295. package/lib/terra-func.js +1 -1
  296. package/lib/time-zone.js +1 -1
  297. package/package.json +3 -1
  298. package/lib/aws/compute/lb-shared/access-logs-accounts.d.ts +0 -7
  299. package/lib/aws/compute/lb-shared/access-logs-accounts.js +0 -46
  300. package/lib/aws/notify/queue-config.generated.d.ts +0 -98
  301. package/lib/aws/notify/queue-config.generated.js +0 -3
  302. package/lib/aws/partition.d.ts +0 -21
  303. package/lib/aws/partition.js +0 -42
@@ -422,7 +422,7 @@ class AssetStaging extends constructs_1.Construct {
422
422
  }
423
423
  exports.AssetStaging = AssetStaging;
424
424
  _a = JSII_RTTI_SYMBOL_1;
425
- AssetStaging[_a] = { fqn: "terraconstructs.AssetStaging", version: "0.1.9" };
425
+ AssetStaging[_a] = { fqn: "terraconstructs.AssetStaging", version: "0.2.0" };
426
426
  /**
427
427
  * The directory inside the bundling container into which the asset sources will be mounted.
428
428
  */
package/lib/aws/arn.js CHANGED
@@ -6,6 +6,7 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
6
  // ref: https://github.com/aws/aws-cdk/blob/v2.150.0/packages/aws-cdk-lib/core/lib/arn.ts
7
7
  const cdktf = require("cdktf");
8
8
  const util_1 = require("./util");
9
+ const errors_1 = require("../errors");
9
10
  const terra_func_1 = require("../terra-func");
10
11
  /**
11
12
  * An enum representing the various ARN formats that different services use.
@@ -72,7 +73,7 @@ class Arn {
72
73
  const account = components.account ?? stack?.account;
73
74
  // Catch both 'null' and 'undefined'
74
75
  if (partition == null || region == null || account == null) {
75
- throw new Error(`Arn.format: partition (${partition}), region (${region}), and account (${account}) must all be passed if stack is not passed.`);
76
+ throw new errors_1.UnscopedValidationError(`Arn.format: partition (${partition}), region (${region}), and account (${account}) must all be passed if stack is not passed.`);
76
77
  }
77
78
  const sep = components.sep ??
78
79
  (components.arnFormat === ArnFormat.COLON_RESOURCE_NAME ? ":" : "/");
@@ -273,7 +274,7 @@ class Arn {
273
274
  }
274
275
  exports.Arn = Arn;
275
276
  _a = JSII_RTTI_SYMBOL_1;
276
- Arn[_a] = { fqn: "terraconstructs.aws.Arn", version: "0.1.9" };
277
+ Arn[_a] = { fqn: "terraconstructs.aws.Arn", version: "0.2.0" };
277
278
  /**
278
279
  * Given a Token evaluating to ARN, parses it and returns components.
279
280
  *
@@ -381,4 +382,4 @@ function parseArnShape(arn) {
381
382
  // Account can be missing in some ARN types (such as used for S3 buckets)
382
383
  return components;
383
384
  }
384
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F3cy9hcm4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx5RkFBeUY7QUFFekYsK0JBQStCO0FBRS9CLGlDQUF5QztBQUN6Qyw4Q0FBbUM7QUFFbkM7O0dBRUc7QUFDSCxJQUFZLFNBdUNYO0FBdkNELFdBQVksU0FBUztJQUNuQjs7Ozs7OztPQU9HO0lBQ0gseUVBQTRELENBQUE7SUFFNUQ7Ozs7Ozs7T0FPRztJQUNILHlGQUE0RSxDQUFBO0lBRTVFOzs7Ozs7O09BT0c7SUFDSCx5RkFBNEUsQ0FBQTtJQUU1RTs7Ozs7O09BTUc7SUFDSCx5R0FBNEYsQ0FBQTtBQUM5RixDQUFDLEVBdkNXLFNBQVMseUJBQVQsU0FBUyxRQXVDcEI7QUFtRUQsTUFBYSxHQUFHO0lBQ2Q7Ozs7Ozs7Ozs7Ozs7Ozs7T0FnQkc7SUFDSSxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQXlCLEVBQUUsS0FBaUI7UUFDL0QsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLFNBQVMsSUFBSSxLQUFLLEVBQUUsU0FBUyxDQUFDO1FBQzNELE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLElBQUksS0FBSyxFQUFFLE1BQU0sQ0FBQztRQUNsRCxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxJQUFJLEtBQUssRUFBRSxPQUFPLENBQUM7UUFFckQsb0NBQW9DO1FBQ3BDLElBQUksU0FBUyxJQUFJLElBQUksSUFBSSxNQUFNLElBQUksSUFBSSxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUMzRCxNQUFNLElBQUksS0FBSyxDQUNiLDBCQUEwQixTQUFTLGNBQWMsTUFBTSxtQkFBbUIsT0FBTyw4Q0FBOEMsQ0FDaEksQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLEdBQUcsR0FDUCxVQUFVLENBQUMsR0FBRztZQUNkLENBQUMsVUFBVSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsbUJB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VSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDbkUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsTUFBTSxJQUFJLEtBQUssQ0FDYixrRUFBa0UsR0FBRyxHQUFHLENBQ3pFLENBQUM7SUFDSixDQUFDO0lBRUQsNkRBQTZEO0lBRTdELHlFQUF5RTtJQUV6RSxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNTAuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9jb3JlL2xpYi9hcm4udHNcblxuaW1wb3J0ICogYXMgY2RrdGYgZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBJQXdzU3RhY2sgfSBmcm9tIFwiLi9hd3Mtc3RhY2tcIjtcbmltcG9ydCB7IGZpbHRlclVuZGVmaW5lZCB9IGZyb20gXCIuL3V0aWxcIjtcbmltcG9ydCB7IEZuIH0gZnJvbSBcIi4uL3RlcnJhLWZ1bmNcIjtcblxuLyoqXG4gKiBBbiBlbnVtIHJlcHJlc2VudGluZyB0aGUgdmFyaW91cyBBUk4gZm9ybWF0cyB0aGF0IGRpZmZlcmVudCBzZXJ2aWNlcyB1c2UuXG4gKi9cbmV4cG9ydCBlbnVtIEFybkZvcm1hdCB7XG4gIC8qKlxuICAgKiBUaGlzIHJlcHJlc2VudHMgYSBmb3JtYXQgd2hlcmUgdGhlcmUgaXMgbm8gJ3Jlc291cmNlTmFtZScgcGFydC5cbiAgICogVGhpcyBmb3JtYXQgaXMgdXNlZCBmb3IgUzMgcmVzb3VyY2VzLFxuICAgKiBsaWtlICdhcm46YXdzOnMzOjo6YnVja2V0Jy5cbiAgICogRXZlcnl0aGluZyBhZnRlciB0aGUgbGFzdCBjb2xvbiBpcyBjb25zaWRlcmVkIHRoZSAncmVzb3VyY2UnLFxuICAgKiBldmVuIGlmIGl0IGNvbnRhaW5zIHNsYXNoZXMsXG4gICAqIGxpa2UgaW4gJ2Fybjphd3M6czM6OjpidWNrZXQvb2JqZWN0LnppcCcuXG4gICAqL1xuICBOT19SRVNPVVJDRV9OQU1FID0gXCJhcm46YXdzOnNlcnZpY2U6cmVnaW9uOmFjY291bnQ6cmVzb3VyY2VcIixcblxuICAvKipcbiAgICogVGhpcyByZXByZXNlbnRzIGEgZm9ybWF0IHdoZXJlIHRoZSAncmVzb3VyY2UnIGFuZCAncmVzb3VyY2VOYW1lJ1xuICAgKiBwYXJ0cyBhcmUgc2VwYXJhdGVkIHdpdGggYSBjb2xvbi5cbiAgICogTGlrZSBpbjogJ2Fybjphd3M6c2VydmljZTpyZWdpb246YWNjb3VudDpyZXNvdXJjZTpyZXNvdXJjZU5hbWUnLlxuICAgKiBFdmVyeXRoaW5nIGFmdGVyIHRoZSBsYXN0IGNvbG9uIGlzIGNvbnNpZGVyZWQgdGhlICdyZXNvdXJjZU5hbWUnLFxuICAgKiBldmVuIGlmIGl0IGNvbnRhaW5zIHNsYXNoZXMsXG4gICAqIGxpa2UgaW4gJ2Fybjphd3M6YXBpZ2F0ZXdheTpyZWdpb246YWNjb3VudDpyZXNvdXJjZTovdGVzdC9teWRlbW9yZXNvdXJjZS8qJy5cbiAgICovXG4gIENPTE9OX1JFU09VUkNFX05BTUUgPSBcImFybjphd3M6c2VydmljZTpyZWdpb246YWNjb3VudDpyZXNvdXJjZTpyZXNvdXJjZU5hbWVcIixcblxuICAvKipcbiAgICogVGhpcyByZXByZXNlbnRzIGEgZm9ybWF0IHdoZXJlIHRoZSAncmVzb3VyY2UnIGFuZCAncmVzb3VyY2VOYW1lJ1xuICAgKiBwYXJ0cyBhcmUgc2VwYXJhdGVkIHdpdGggYSBzbGFzaC5cbiAgICogTGlrZSBpbjogJ2Fybjphd3M6c2VydmljZTpyZWdpb246YWNjb3VudDpyZXNvdXJjZS9yZXNvdXJjZU5hbWUnLlxuICAgKiBFdmVyeXRoaW5nIGFmdGVyIHRoZSBzZXBhcmF0aW5nIHNsYXNoIGlzIGNvbnNpZGVyZWQgdGhlICdyZXNvdXJjZU5hbWUnLFxuICAgKiBldmVuIGlmIGl0IGNvbnRhaW5zIGNvbG9ucyxcbiAgICogbGlrZSBpbiAnYXJuOmF3czpjb2duaXRvLXN5bmM6cmVnaW9uOmFjY291bnQ6aWRlbnRpdHlwb29sL3VzLWVhc3QtMToxYTFhMWExYS1mZmZmLTExMTEtOTk5OS0xMjM0NTY3ODpibGEnLlxuICAgKi9cbiAgU0xBU0hfUkVTT1VSQ0VfTkFNRSA9IFwiYXJuOmF3czpzZXJ2aWNlOnJlZ2lvbjphY2NvdW50OnJlc291cmNlL3Jlc291cmNlTmFtZVwiLFxuXG4gIC8qKlxuICAgKiBUaGlzIHJlcHJlc2VudHMgYSBmb3JtYXQgd2hlcmUgdGhlICdyZXNvdXJjZScgYW5kICdyZXNvdXJjZU5hbWUnXG4gICAqIHBhcnRzIGFyZSBzZXBlcmF0ZWQgd2l0aCBhIHNsYXNoLFxuICAgKiBidXQgdGhlcmUgaXMgYWxzbyBhbiBhZGRpdGlvbmFsIHNsYXNoIGFmdGVyIHRoZSBjb2xvbiBzZXBhcmF0aW5nICdhY2NvdW50JyBmcm9tICdyZXNvdXJjZScuXG4gICAqIExpa2UgaW46ICdhcm46YXdzOnNlcnZpY2U6cmVnaW9uOmFjY291bnQ6L3Jlc291cmNlL3Jlc291cmNlTmFtZScuXG4gICAqIE5vdGUgdGhhdCB0aGUgbGVhZGluZyBzbGFzaCBpcyBfbm90XyBpbmNsdWRlZCBpbiB0aGUgcGFyc2VkICdyZXNvdXJjZScgcGFydC5cbiAgICovXG4gIFNMQVNIX1JFU09VUkNFX1NMQVNIX1JFU09VUkNFX05BTUUgPSBcImFybjphd3M6c2VydmljZTpyZWdpb246YWNjb3VudDovcmVzb3VyY2UvcmVzb3VyY2VOYW1lXCIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXJuQ29tcG9uZW50cyB7XG4gIC8qKlxuICAgKiBUaGUgcGFydGl0aW9uIHRoYXQgdGhlIHJlc291cmNlIGlzIGluLiBGb3Igc3RhbmRhcmQgQVdTIHJlZ2lvbnMsIHRoZVxuICAgKiBwYXJ0aXRpb24gaXMgYXdzLiBJZiB5b3UgaGF2ZSByZXNvdXJjZXMgaW4gb3RoZXIgcGFydGl0aW9ucywgdGhlXG4gICAqIHBhcnRpdGlvbiBpcyBhd3MtcGFydGl0aW9ubmFtZS4gRm9yIGV4YW1wbGUsIHRoZSBwYXJ0aXRpb24gZm9yIHJlc291cmNlc1xuICAgKiBpbiB0aGUgQ2hpbmEgKEJlaWppbmcpIHJlZ2lvbiBpcyBhd3MtY24uXG4gICAqXG4gICAqIEBkZWZhdWx0IFRoZSBBV1MgcGFydGl0aW9uIHRoZSBzdGFjayBpcyBkZXBsb3llZCB0by5cbiAgICovXG4gIHJlYWRvbmx5IHBhcnRpdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNlcnZpY2UgbmFtZXNwYWNlIHRoYXQgaWRlbnRpZmllcyB0aGUgQVdTIHByb2R1Y3QgKGZvciBleGFtcGxlLFxuICAgKiAnczMnLCAnaWFtJywgJ2NvZGVwaXBsaW5lJykuXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpb24gdGhlIHJlc291cmNlIHJlc2lkZXMgaW4uIE5vdGUgdGhhdCB0aGUgQVJOcyBmb3Igc29tZSByZXNvdXJjZXNcbiAgICogZG8gbm90IHJlcXVpcmUgYSByZWdpb24sIHNvIHRoaXMgY29tcG9uZW50IG1pZ2h0IGJlIG9taXR0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IFRoZSByZWdpb24gdGhlIHN0YWNrIGlzIGRlcGxveWVkIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIEFXUyBhY2NvdW50IHRoYXQgb3ducyB0aGUgcmVzb3VyY2UsIHdpdGhvdXQgdGhlIGh5cGhlbnMuXG4gICAqIEZvciBleGFtcGxlLCAxMjM0NTY3ODkwMTIuIE5vdGUgdGhhdCB0aGUgQVJOcyBmb3Igc29tZSByZXNvdXJjZXMgZG9uJ3RcbiAgICogcmVxdWlyZSBhbiBhY2NvdW50IG51bWJlciwgc28gdGhpcyBjb21wb25lbnQgbWlnaHQgYmUgb21pdHRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgVGhlIGFjY291bnQgdGhlIHN0YWNrIGlzIGRlcGxveWVkIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgYWNjb3VudD86IHN0cmluZztcblxuICAvKipcbiAgICogUmVzb3VyY2UgdHlwZSAoZS5nLiBcInRhYmxlXCIsIFwiYXV0b1NjYWxpbmdHcm91cFwiLCBcImNlcnRpZmljYXRlXCIpLlxuICAgKiBGb3Igc29tZSByZXNvdXJjZSB0eXBlcywgZS5nLiBTMyBidWNrZXRzLCB0aGlzIGZpZWxkIGRlZmluZXMgdGhlIGJ1Y2tldCBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2U6IHN0cmluZztcblxuICAvKipcbiAgICogU2VwYXJhdG9yIGJldHdlZW4gcmVzb3VyY2UgdHlwZSBhbmQgdGhlIHJlc291cmNlLlxuICAgKlxuICAgKiBDYW4gYmUgZWl0aGVyICcvJywgJzonIG9yIGFuIGVtcHR5IHN0cmluZy4gV2lsbCBvbmx5IGJlIHVzZWQgaWYgcmVzb3VyY2VOYW1lIGlzIGRlZmluZWQuXG4gICAqIEBkZWZhdWx0ICcvJ1xuICAgKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgYXJuRm9ybWF0IGluc3RlYWRcbiAgICovXG4gIHJlYWRvbmx5IHNlcD86IHN0cmluZztcblxuICAvKipcbiAgICogUmVzb3VyY2UgbmFtZSBvciBwYXRoIHdpdGhpbiB0aGUgcmVzb3VyY2UgKGkuZS4gUzMgYnVja2V0IG9iamVjdCBrZXkpIG9yXG4gICAqIGEgd2lsZGNhcmQgc3VjaCBhcyBgYFwiKlwiYGAuIFRoaXMgaXMgc2VydmljZS1kZXBlbmRlbnQuXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzcGVjaWZpYyBBUk4gZm9ybWF0IHRvIHVzZSBmb3IgdGhpcyBBUk4gdmFsdWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdXNlcyB2YWx1ZSBvZiBgc2VwYCBhcyB0aGUgc2VwYXJhdG9yIGZvciBmb3JtYXR0aW5nLFxuICAgKiAgIGBBcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRWAgaWYgdGhhdCBwcm9wZXJ0eSB3YXMgYWxzbyBub3RkXG4gICAqL1xuICByZWFkb25seSBhcm5Gb3JtYXQ/OiBBcm5Gb3JtYXQ7XG59XG5cbmV4cG9ydCBjbGFzcyBBcm4ge1xuICAvKipcbiAgICogQ3JlYXRlcyBhbiBBUk4gZnJvbSBjb21wb25lbnRzLlxuICAgKlxuICAgKiBJZiBgcGFydGl0aW9uYCwgYHJlZ2lvbmAgb3IgYGFjY291bnRgIGFyZSBub3Qgc3BlY2lmaWVkLCB0aGUgc3RhY2snc1xuICAgKiBwYXJ0aXRpb24sIHJlZ2lvbiBhbmQgYWNjb3VudCB3aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIElmIGFueSBjb21wb25lbnQgaXMgdGhlIGVtcHR5IHN0cmluZywgYW4gZW1wdHkgc3RyaW5nIHdpbGwgYmUgaW5zZXJ0ZWRcbiAgICogaW50byB0aGUgZ2VuZXJhdGVkIEFSTiBhdCB0aGUgbG9jYXRpb24gdGhhdCBjb21wb25lbnQgY29ycmVzcG9uZHMgdG8uXG4gICAqXG4gICAqIFRoZSBBUk4gd2lsbCBiZSBmb3JtYXR0ZWQgYXMgZm9sbG93czpcbiAgICpcbiAgICogICBhcm46e3BhcnRpdGlvbn06e3NlcnZpY2V9OntyZWdpb259OnthY2NvdW50fTp7cmVzb3VyY2V9e3NlcH17cmVzb3VyY2UtbmFtZX1cbiAgICpcbiAgICogVGhlIHJlcXVpcmVkIEFSTiBwaWVjZXMgdGhhdCBhcmUgb21pdHRlZCB3aWxsIGJlIHRha2VuIGZyb20gdGhlIHN0YWNrIHRoYXRcbiAgICogdGhlICdzY29wZScgaXMgYXR0YWNoZWQgdG8uIElmIGFsbCBBUk4gcGllY2VzIGFyZSBzdXBwbGllZCwgdGhlIHN1cHBsaWVkIHNjb3BlXG4gICAqIGNhbiBiZSAndW5kZWZpbmVkJy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZm9ybWF0KGNvbXBvbmVudHM6IEFybkNvbXBvbmVudHMsIHN0YWNrPzogSUF3c1N0YWNrKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJ0aXRpb24gPSBjb21wb25lbnRzLnBhcnRpdGlvbiA/PyBzdGFjaz8ucGFydGl0aW9uO1xuICAgIGNvbnN0IHJlZ2lvbiA9IGNvbXBvbmVudHMucmVnaW9uID8/IHN0YWNrPy5yZWdpb247XG4gICAgY29uc3QgYWNjb3VudCA9IGNvbXBvbmVudHMuYWNjb3VudCA/PyBzdGFjaz8uYWNjb3VudDtcblxuICAgIC8vIENhdGNoIGJvdGggJ251bGwnIGFuZCAndW5kZWZpbmVkJ1xuICAgIGlmIChwYXJ0aXRpb24gPT0gbnVsbCB8fCByZWdpb24gPT0gbnVsbCB8fCBhY2NvdW50ID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEFybi5mb3JtYXQ6IHBhcnRpdGlvbiAoJHtwYXJ0aXRpb259KSwgcmVnaW9uICgke3JlZ2lvbn0pLCBhbmQgYWNjb3VudCAoJHthY2NvdW50fSkgbXVzdCBhbGwgYmUgcGFzc2VkIGlmIHN0YWNrIGlzIG5vdCBwYXNzZWQuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VwID1cbiAgICAgIGNvbXBvbmVudHMuc2VwID8/XG4gICAgICAoY29tcG9uZW50cy5hcm5Gb3JtYXQgPT09IEFybkZvcm1hdC5DT0xPTl9SRVNPVVJDRV9OQU1FID8gXCI6XCIgOiBcIi9cIik7XG5cbiAgICBjb25zdCB2YWx1ZXMgPSBbXG4gICAgICBcImFyblwiLFxuICAgICAgXCI6XCIsXG4gICAgICBwYXJ0aXRpb24sXG4gICAgICBcIjpcIixcbiAgICAgIGNvbXBvbmVudHMuc2VydmljZSxcbiAgICAgIFwiOlwiLFxuICAgICAgcmVnaW9uLFxuICAgICAgXCI6XCIsXG4gICAgICBhY2NvdW50LFxuICAgICAgXCI6XCIsXG4gICAgICAuLi4oY29tcG9uZW50cy5hcm5Gb3JtYXQgPT09IEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9TTEFTSF9SRVNPVVJDRV9OQU1FXG4gICAgICAgID8gW1wiL1wiXVxuICAgICAgICA6IFtdKSxcbiAgICAgIGNvbXBvbmVudHMucmVzb3VyY2UsXG4gICAgXTtcblxuICAgIGlmIChzZXAgIT09IFwiL1wiICYmIHNlcCAhPT0gXCI6XCIgJiYgc2VwICE9PSBcIlwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdyZXNvdXJjZVBhdGhTZXAgbWF5IG9ubHkgYmUgXCI6XCIsIFwiL1wiIG9yIGFuIGVtcHR5IHN0cmluZycsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChjb21wb25lbnRzLnJlc291cmNlTmFtZSAhPSBudWxsKSB7XG4gICAgICB2YWx1ZXMucHVzaChzZXApO1xuICAgICAgdmFsdWVzLnB1c2goY29tcG9uZW50cy5yZXNvdXJjZU5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXMuam9pbihcIlwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhbiBBUk4sIHBhcnNlcyBpdCBhbmQgcmV0dXJucyBjb21wb25lbnRzLlxuICAgKlxuICAgKiBJRiBUSEUgQVJOIElTIEEgQ09OQ1JFVEUgU1RSSU5HLi4uXG4gICAqXG4gICAqIC4uLml0IHdpbGwgYmUgcGFyc2VkIGFuZCB2YWxpZGF0ZWQuIFRoZSBzZXBhcmF0b3IgKGBzZXBgKSB3aWxsIGJlIHNldCB0byAnLydcbiAgICogaWYgdGhlIDZ0aCBjb21wb25lbnQgaW5jbHVkZXMgYSAnLycsIGluIHdoaWNoIGNhc2UsIGByZXNvdXJjZWAgd2lsbCBiZSBzZXRcbiAgICogdG8gdGhlIHZhbHVlIGJlZm9yZSB0aGUgJy8nIGFuZCBgcmVzb3VyY2VOYW1lYCB3aWxsIGJlIHRoZSByZXN0LiBJbiBjYXNlXG4gICAqIHRoZXJlIGlzIG5vICcvJywgYHJlc291cmNlYCB3aWxsIGJlIHNldCB0byB0aGUgNnRoIGNvbXBvbmVudHMgYW5kXG4gICAqIGByZXNvdXJjZU5hbWVgIHdpbGwgYmUgc2V0IHRvIHRoZSByZXN0IG9mIHRoZSBzdHJpbmcuXG4gICAqXG4gICAqIElGIFRIRSBBUk4gSVMgQSBUT0tFTi4uLlxuICAgKlxuICAgKiAuLi5pdCBjYW5ub3QgYmUgdmFsaWRhdGVkLCBzaW5jZSB3ZSBkb24ndCBoYXZlIHRoZSBhY3R1YWwgdmFsdWUgeWV0IGF0IHRoZVxuICAgKiB0aW1lIG9mIHRoaXMgZnVuY3Rpb24gY2FsbC4gWW91IHdpbGwgaGF2ZSB0byBzdXBwbHkgYHNlcElmVG9rZW5gIGFuZFxuICAgKiB3aGV0aGVyIG9yIG5vdCBBUk5zIG9mIHRoZSBleHBlY3RlZCBmb3JtYXQgdXN1YWxseSBoYXZlIHJlc291cmNlIG5hbWVzXG4gICAqIGluIG9yZGVyIHRvIHBhcnNlIGl0IHByb3Blcmx5LiBUaGUgcmVzdWx0aW5nIGBBcm5Db21wb25lbnRzYCBvYmplY3Qgd2lsbFxuICAgKiBjb250YWluIHRva2VucyBmb3IgdGhlIHN1YmV4cHJlc3Npb25zIG9mIHRoZSBBUk4sIG5vdCBzdHJpbmcgbGl0ZXJhbHMuXG4gICAqXG4gICAqIElmIHRoZSByZXNvdXJjZSBuYW1lIGNvdWxkIHBvc3NpYmx5IGNvbnRhaW4gdGhlIHNlcGFyYXRvciBjaGFyLCB0aGUgYWN0dWFsXG4gICAqIHJlc291cmNlIG5hbWUgY2Fubm90IGJlIHByb3Blcmx5IHBhcnNlZC4gVGhpcyBvbmx5IG9jY3VycyBpZiB0aGUgc2VwYXJhdG9yXG4gICAqIGNoYXIgaXMgJy8nLCBhbmQgaGFwcGVucyBmb3IgZXhhbXBsZSBmb3IgUzMgb2JqZWN0IEFSTnMsIElBTSBSb2xlIEFSTnMsXG4gICAqIElBTSBPSURDIFByb3ZpZGVyIEFSTnMsIGV0Yy4gVG8gcHJvcGVybHkgZXh0cmFjdCB0aGUgcmVzb3VyY2UgbmFtZSBmcm9tIGFcbiAgICogVG9rZW5pemVkIEFSTiwgeW91IG11c3Qga25vdyB0aGUgcmVzb3VyY2UgdHlwZSBhbmQgY2FsbFxuICAgKiBgQXJuLmV4dHJhY3RSZXNvdXJjZU5hbWVgLlxuICAgKlxuICAgKiBAcGFyYW0gYXJuIFRoZSBBUk4gdG8gcGFyc2VcbiAgICogQHBhcmFtIHNlcElmVG9rZW4gVGhlIHNlcGFyYXRvciB1c2VkIHRvIHNlcGFyYXRlIHJlc291cmNlIGZyb20gcmVzb3VyY2VOYW1lXG4gICAqIEBwYXJhbSBoYXNOYW1lIFdoZXRoZXIgdGhlcmUgaXMgYSBuYW1lIGNvbXBvbmVudCBpbiB0aGUgQVJOIGF0IGFsbC4gRm9yXG4gICAqIGV4YW1wbGUsIFNOUyBUb3BpY3MgQVJOcyBoYXZlIHRoZSAncmVzb3VyY2UnIGNvbXBvbmVudCBjb250YWluIHRoZSB0b3BpY1xuICAgKiBuYW1lLCBhbmQgbm8gJ3Jlc291cmNlTmFtZScgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcmV0dXJucyBhbiBBcm5Db21wb25lbnRzIG9iamVjdCB3aGljaCBhbGxvd3MgYWNjZXNzIHRvIHRoZSB2YXJpb3VzXG4gICAqIGNvbXBvbmVudHMgb2YgdGhlIEFSTi5cbiAgICpcbiAgICogQHJldHVybnMgYW4gQXJuQ29tcG9uZW50cyBvYmplY3Qgd2hpY2ggYWxsb3dzIGFjY2VzcyB0byB0aGUgdmFyaW91c1xuICAgKiAgICAgIGNvbXBvbmVudHMgb2YgdGhlIEFSTi5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgdXNlIHNwbGl0IGluc3RlYWRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcGFyc2UoXG4gICAgYXJuOiBzdHJpbmcsXG4gICAgc2VwSWZUb2tlbjogc3RyaW5nID0gXCIvXCIsXG4gICAgaGFzTmFtZTogYm9vbGVhbiA9IHRydWUsXG4gICk6IEFybkNvbXBvbmVudHMge1xuICAgIGxldCBhcm5Gb3JtYXQ6IEFybkZvcm1hdDtcbiAgICBpZiAoIWhhc05hbWUpIHtcbiAgICAgIGFybkZvcm1hdCA9IEFybkZvcm1hdC5OT19SRVNPVVJDRV9OQU1FO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcm5Gb3JtYXQgPVxuICAgICAgICBzZXBJZlRva2VuID09PSBcIi9cIlxuICAgICAgICAgID8gQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUVcbiAgICAgICAgICA6IEFybkZvcm1hdC5DT0xPTl9SRVNPVVJDRV9OQU1FO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zcGxpdChhcm4sIGFybkZvcm1hdCk7XG4gIH1cblxuICAvKipcbiAgICogU3BsaXRzIHRoZSBwcm92aWRlZCBBUk4gaW50byBpdHMgY29tcG9uZW50cy5cbiAgICogV29ya3MgYm90aCBpZiAnYXJuJyBpcyBhIHN0cmluZyBsaWtlICdhcm46YXdzOnMzOjo6YnVja2V0JyxcbiAgICogYW5kIGEgVG9rZW4gcmVwcmVzZW50aW5nIGEgZHluYW1pYyBDbG91ZEZvcm1hdGlvbiBleHByZXNzaW9uXG4gICAqIChpbiB3aGljaCBjYXNlIHRoZSByZXR1cm5lZCBjb21wb25lbnRzIHdpbGwgYWxzbyBiZSBkeW5hbWljIENsb3VkRm9ybWF0aW9uIGV4cHJlc3Npb25zLFxuICAgKiBlbmNvZGVkIGFzIFRva2VucykuXG4gICAqXG4gICAqIEBwYXJhbSBhcm4gdGhlIEFSTiB0byBzcGxpdCBpbnRvIGl0cyBjb21wb25lbnRzXG4gICAqIEBwYXJhbSBhcm5Gb3JtYXQgdGhlIGV4cGVjdGVkIGZvcm1hdCBvZiAnYXJuJyAtIGRlcGVuZHMgb24gd2hhdCBmb3JtYXQgdGhlIHNlcnZpY2UgJ2FybicgcmVwcmVzZW50cyB1c2VzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNwbGl0KGFybjogc3RyaW5nLCBhcm5Gb3JtYXQ6IEFybkZvcm1hdCk6IEFybkNvbXBvbmVudHMge1xuICAgIGNvbnN0IGNvbXBvbmVudHMgPSBwYXJzZUFyblNoYXBlKGFybik7XG4gICAgaWYgKGNvbXBvbmVudHMgPT09IFwidG9rZW5cIikge1xuICAgICAgcmV0dXJuIHBhcnNlVG9rZW5Bcm4oYXJuLCBhcm5Gb3JtYXQpO1xuICAgIH1cblxuICAgIGNvbnN0IFssIHBhcnRpdGlvbiwgc2VydmljZSwgcmVnaW9uLCBhY2NvdW50LCByZXNvdXJjZVR5cGVPck5hbWUsIC4uLnJlc3RdID1cbiAgICAgIGNvbXBvbmVudHM7XG5cbiAgICBsZXQgcmVzb3VyY2U6IHN0cmluZztcbiAgICBsZXQgcmVzb3VyY2VOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHNlcDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCByZXNvdXJjZVBhcnRTdGFydEluZGV4ID0gMDtcbiAgICBsZXQgZGV0ZWN0ZWRBcm5Gb3JtYXQ6IEFybkZvcm1hdDtcblxuICAgIGxldCBzbGFzaEluZGV4ID0gcmVzb3VyY2VUeXBlT3JOYW1lLmluZGV4T2YoXCIvXCIpO1xuICAgIGlmIChzbGFzaEluZGV4ID09PSAwKSB7XG4gICAgICAvLyBuZXctc3R5bGUgQVJOcyBhcmUgb2YgdGhlIGZvcm0gJ2Fybjphd3M6czQ6dXMtd2VzdC0xOjEyMzQ1Oi9yZXNvdXJjZS10eXBlL3Jlc291cmNlLW5hbWUnXG4gICAgICBzbGFzaEluZGV4ID0gcmVzb3VyY2VUeXBlT3JOYW1lLmluZGV4T2YoXCIvXCIsIDEpO1xuICAgICAgcmVzb3VyY2VQYXJ0U3RhcnRJbmRleCA9IDE7XG4gICAgICBkZXRlY3RlZEFybkZvcm1hdCA9IEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9TTEFTSF9SRVNPVVJDRV9OQU1FO1xuICAgIH1cbiAgICBpZiAoc2xhc2hJbmRleCAhPT0gLTEpIHtcbiAgICAgIC8vIHRoZSBzbGFzaCBpcyBvbmx5IGEgc2VwYXJhdG9yIGlmIEFybkZvcm1hdCBpcyBub3QgTk9fUkVTT1VSQ0VfTkFNRVxuICAgICAgaWYgKGFybkZvcm1hdCA9PT0gQXJuRm9ybWF0Lk5PX1JFU09VUkNFX05BTUUpIHtcbiAgICAgICAgc2VwID0gdW5kZWZpbmVkO1xuICAgICAgICBzbGFzaEluZGV4ID0gLTE7XG4gICAgICAgIGRldGVjdGVkQXJuRm9ybWF0ID0gQXJuRm9ybWF0Lk5PX1JFU09VUkNFX05BTUU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXAgPSBcIi9cIjtcbiAgICAgICAgZGV0ZWN0ZWRBcm5Gb3JtYXQgPVxuICAgICAgICAgIHJlc291cmNlUGFydFN0YXJ0SW5kZXggPT09IDBcbiAgICAgICAgICAgID8gQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUVcbiAgICAgICAgICAgIDogLy8gbmVlZCB0byByZXBlYXQgdGhpcyBoZXJlLCBhcyBvdGhlcndpc2UgdGhlIGNvbXBpbGVyIHRoaW5rcyAnZGV0ZWN0ZWRBcm5Gb3JtYXQnIGlzIG5vdCBpbml0aWFsaXplZCBpbiBhbGwgcGF0aHNcbiAgICAgICAgICAgICAgQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX1NMQVNIX1JFU09VUkNFX05BTUU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyZXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIHNlcCA9IFwiOlwiO1xuICAgICAgc2xhc2hJbmRleCA9IC0xO1xuICAgICAgZGV0ZWN0ZWRBcm5Gb3JtYXQgPSBBcm5Gb3JtYXQuQ09MT05fUkVTT1VSQ0VfTkFNRTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VwID0gdW5kZWZpbmVkO1xuICAgICAgZGV0ZWN0ZWRBcm5Gb3JtYXQgPSBBcm5Gb3JtYXQuTk9fUkVTT1VSQ0VfTkFNRTtcbiAgICB9XG5cbiAgICBpZiAoc2xhc2hJbmRleCAhPT0gLTEpIHtcbiAgICAgIHJlc291cmNlID0gcmVzb3VyY2VUeXBlT3JOYW1lLnN1YnN0cmluZyhcbiAgICAgICAgcmVzb3VyY2VQYXJ0U3RhcnRJbmRleCxcbiAgICAgICAgc2xhc2hJbmRleCxcbiAgICAgICk7XG4gICAgICByZXNvdXJjZU5hbWUgPSByZXNvdXJjZVR5cGVPck5hbWUuc3Vic3RyaW5nKHNsYXNoSW5kZXggKyAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb3VyY2UgPSByZXNvdXJjZVR5cGVPck5hbWU7XG4gICAgfVxuXG4gICAgaWYgKHJlc3QubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKCFyZXNvdXJjZU5hbWUpIHtcbiAgICAgICAgcmVzb3VyY2VOYW1lID0gXCJcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc291cmNlTmFtZSArPSBcIjpcIjtcbiAgICAgIH1cblxuICAgICAgcmVzb3VyY2VOYW1lICs9IHJlc3Quam9pbihcIjpcIik7XG4gICAgfVxuXG4gICAgLy8gXCJ8fCB1bmRlZmluZWRcIiB3aWxsIGNhdXNlIGVtcHR5IHN0cmluZ3MgdG8gYmUgdHJlYXRlZCBhcyBcInVuZGVmaW5lZFwiLlxuICAgIC8vIE9wdGlvbmFsIEFSTiBhdHRyaWJ1dGVzIChlLmcuIHJlZ2lvbiwgYWNjb3VudCkgc2hvdWxkIHJldHVybiBhcyBlbXB0eSBzdHJpbmdcbiAgICAvLyBpZiB0aGV5IGFyZSBwcm92aWRlZCBhcyBzdWNoLlxuICAgIHJldHVybiBmaWx0ZXJVbmRlZmluZWQoe1xuICAgICAgc2VydmljZTogc2VydmljZSB8fCB1bmRlZmluZWQsXG4gICAgICByZXNvdXJjZTogcmVzb3VyY2UgfHwgdW5kZWZpbmVkLFxuICAgICAgcGFydGl0aW9uOiBwYXJ0aXRpb24gfHwgdW5kZWZpbmVkLFxuICAgICAgcmVnaW9uLFxuICAgICAgYWNjb3VudCxcbiAgICAgIHJlc291cmNlTmFtZSxcbiAgICAgIHNlcCxcbiAgICAgIGFybkZvcm1hdDogZGV0ZWN0ZWRBcm5Gb3JtYXQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCB0aGUgZnVsbCByZXNvdXJjZSBuYW1lIGZyb20gYW4gQVJOXG4gICAqXG4gICAqIE5lY2Vzc2FyeSBmb3IgcmVzb3VyY2UgbmFtZXMgKHBhdGhzKSB0aGF0IG1heSBjb250YWluIHRoZSBzZXBhcmF0b3IsIGxpa2VcbiAgICogYGFybjphd3M6aWFtOjoxMTExMTExMTExMTE6cm9sZS9wYXRoL3RvL3JvbGUvbmFtZWAuXG4gICAqXG4gICAqIE9ubHkgd29ya3MgaWYgd2Ugc3RhdGljYWxseSBrbm93IHRoZSBleHBlY3RlZCBgcmVzb3VyY2VUeXBlYCBiZWZvcmVoYW5kLCBzaW5jZSB3ZSdyZSBnb2luZ1xuICAgKiB0byB1c2UgdGhhdCB0byBzcGxpdCB0aGUgc3RyaW5nIG9uICc6PHJlc291cmNlVHlwZT4vJyAoYW5kIHRha2UgdGhlIHJpZ2h0LWhhbmQgc2lkZSkuXG4gICAqXG4gICAqIFdlIGNhbid0IGV4dHJhY3QgdGhlICdyZXNvdXJjZVR5cGUnIGZyb20gdGhlIEFSTiBhdCBoYW5kLCBiZWNhdXNlIENsb3VkRm9ybWF0aW9uIEV4cHJlc3Npb25zXG4gICAqIG9ubHkgYWxsb3cgbGl0ZXJhbHMgaW4gdGhlICdzZXBhcmF0b3InIGFyZ3VtZW50IHRvIGB7IEZuOjpTcGxpdCB9YCwgYW5kIHNvIGl0IGNhbid0IGJlXG4gICAqIGB7IEZuOjpTZWxlY3Q6IFs1LCB7IEZuOjpTcGxpdDogWyc6JywgQVJOXSB9fWAuXG4gICAqXG4gICAqIE9ubHkgbmVjZXNzYXJ5IGZvciBBUk4gZm9ybWF0cyBmb3Igd2hpY2ggdGhlIHR5cGUtbmFtZSBzZXBhcmF0b3IgaXMgYC9gLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBleHRyYWN0UmVzb3VyY2VOYW1lKGFybjogc3RyaW5nLCByZXNvdXJjZVR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgY29tcG9uZW50cyA9IHBhcnNlQXJuU2hhcGUoYXJuKTtcbiAgICBpZiAoY29tcG9uZW50cyA9PT0gXCJ0b2tlblwiKSB7XG4gICAgICByZXR1cm4gRm4uc2VsZWN0KDEsIEZuLnNwbGl0djIoYDoke3Jlc291cmNlVHlwZX0vYCwgYXJuKSk7XG4gICAgfVxuXG4gICAgLy8gQXBwYXJlbnRseSB3ZSBjb3VsZCBqdXN0IHBhcnNlIHRoaXMgcmlnaHQgYXdheS4gVmFsaWRhdGUgdGhhdCB3ZSBnb3QgdGhlIHJpZ2h0XG4gICAgLy8gcmVzb3VyY2UgdHlwZSAodG8gbm90aWZ5IGF1dGhvcnMgb2YgaW5jb3JyZWN0IGFzc3VtcHRpb25zIHJpZ2h0IGF3YXkpLlxuICAgIGNvbnN0IHBhcnNlZCA9IEFybi5zcGxpdChhcm4sIEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FKTtcbiAgICBpZiAoXG4gICAgICAhY2RrdGYuVG9rZW4uaXNVbnJlc29sdmVkKHBhcnNlZC5yZXNvdXJjZSkgJiZcbiAgICAgIHBhcnNlZC5yZXNvdXJjZSAhPT0gcmVzb3VyY2VUeXBlXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBFeHBlY3RlZCByZXNvdXJjZSB0eXBlICcke3Jlc291cmNlVHlwZX0nIGluIEFSTiwgZ290ICcke3BhcnNlZC5yZXNvdXJjZX0nIGluICcke2Fybn0nYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghcGFyc2VkLnJlc291cmNlTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRXhwZWN0ZWQgcmVzb3VyY2UgbmFtZSBpbiBBUk4sIGRpZG4ndCBmaW5kIG9uZTogJyR7YXJufSdgLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZC5yZXNvdXJjZU5hbWU7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cbn1cblxuLyoqXG4gKiBHaXZlbiBhIFRva2VuIGV2YWx1YXRpbmcgdG8gQVJOLCBwYXJzZXMgaXQgYW5kIHJldHVybnMgY29tcG9uZW50cy5cbiAqXG4gKiBUaGUgQVJOIGNhbm5vdCBiZSB2YWxpZGF0ZWQsIHNpbmNlIHdlIGRvbid0IGhhdmUgdGhlIGFjdHVhbCB2YWx1ZSB5ZXRcbiAqIGF0IHRoZSB0aW1lIG9mIHRoaXMgZnVuY3Rpb24gY2FsbC4gWW91IHdpbGwgaGF2ZSB0byBrbm93IHRoZSBzZXBhcmF0b3JcbiAqIGFuZCB0aGUgdHlwZSBvZiBBUk4uXG4gKlxuICogVGhlIHJlc3VsdGluZyBgQXJuQ29tcG9uZW50c2Agb2JqZWN0IHdpbGwgY29udGFpbiB0b2tlbnMgZm9yIHRoZVxuICogc3ViZXhwcmVzc2lvbnMgb2YgdGhlIEFSTiwgbm90IHN0cmluZyBsaXRlcmFscy5cbiAqXG4gKiBXQVJOSU5HOiB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBwcm9wZXJseSBwYXJzZSB0aGUgY29tcGxldGUgZmluYWxcbiAqICdyZXNvdXJjZU5hbWUnIHBhcnQgaWYgaXQgY29udGFpbnMgY29sb25zLFxuICogbGlrZSAnYXJuOmF3czpjb2duaXRvLXN5bmM6cmVnaW9uOmFjY291bnQ6aWRlbnRpdHlwb29sL3VzLWVhc3QtMToxYTFhMWExYS1mZmZmLTExMTEtOTk5OS0xMjM0NTY3ODpibGEnLlxuICpcbiAqIEBwYXJhbSBhcm5Ub2tlbiBUaGUgaW5wdXQgdG9rZW4gdGhhdCBjb250YWlucyBhbiBBUk5cbiAqIEBwYXJhbSBhcm5Gb3JtYXQgdGhlIGV4cGVjdGVkIGZvcm1hdCBvZiAnYXJuJyAtIGRlcGVuZHMgb24gd2hhdCBmb3JtYXQgdGhlIHNlcnZpY2UgdGhlIEFSTiByZXByZXNlbnRzIHVzZXNcbiAqL1xuZnVuY3Rpb24gcGFyc2VUb2tlbkFybihhcm5Ub2tlbjogc3RyaW5nLCBhcm5Gb3JtYXQ6IEFybkZvcm1hdCk6IEFybkNvbXBvbmVudHMge1xuICAvLyBBUk4gbG9va3MgbGlrZTpcbiAgLy8gYXJuOnBhcnRpdGlvbjpzZXJ2aWNlOnJlZ2lvbjphY2NvdW50OnJlc291cmNlXG4gIC8vIGFybjpwYXJ0aXRpb246c2VydmljZTpyZWdpb246YWNjb3VudDpyZXNvdXJjZTpyZXNvdXJjZU5hbWVcbiAgLy8gYXJuOnBhcnRpdGlvbjpzZXJ2aWNlOnJlZ2lvbjphY2NvdW50OnJlc291cmNlL3Jlc291cmNlTmFtZVxuICAvLyBhcm46cGFydGl0aW9uOnNlcnZpY2U6cmVnaW9uOmFjY291bnQ6L3Jlc291cmNlL3Jlc291cmNlTmFtZVxuXG4gIGNvbnN0IGNvbXBvbmVudHMgPSBGbi5zcGxpdHYyKFwiOlwiLCBhcm5Ub2tlbik7XG5cbiAgY29uc3QgcGFydGl0aW9uID0gRm4uc2VsZWN0KDEsIGNvbXBvbmVudHMpLnRvU3RyaW5nKCk7XG4gIGNvbnN0IHNlcnZpY2UgPSBGbi5zZWxlY3QoMiwgY29tcG9uZW50cykudG9TdHJpbmcoKTtcbiAgY29uc3QgcmVnaW9uID0gRm4uc2VsZWN0KDMsIGNvbXBvbmVudHMpLnRvU3RyaW5nKCk7XG4gIGNvbnN0IGFjY291bnQgPSBGbi5zZWxlY3QoNCwgY29tcG9uZW50cykudG9TdHJpbmcoKTtcbiAgbGV0IHJlc291cmNlOiBzdHJpbmc7XG4gIGxldCByZXNvdXJjZU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHNlcDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGlmIChcbiAgICBhcm5Gb3JtYXQgPT09IEFybkZvcm1hdC5OT19SRVNPVVJDRV9OQU1FIHx8XG4gICAgYXJuRm9ybWF0ID09PSBBcm5Gb3JtYXQuQ09MT05fUkVTT1VSQ0VfTkFNRVxuICApIHtcbiAgICAvLyB3ZSBrbm93IHRoYXQgdGhlICdyZXNvdXJjZScgcGFydCB3aWxsIGFsd2F5cyBiZSB0aGUgNnRoIHNlZ21lbnQgaW4gdGhpcyBjYXNlXG4gICAgcmVzb3VyY2UgPSBGbi5zZWxlY3QoNSwgY29tcG9uZW50cyk7XG4gICAgaWYgKGFybkZvcm1hdCA9PT0gQXJuRm9ybWF0LkNPTE9OX1JFU09VUkNFX05BTUUpIHtcbiAgICAgIHJlc291cmNlTmFtZSA9IEZuLnNlbGVjdCg2LCBjb21wb25lbnRzKTtcbiAgICAgIHNlcCA9IFwiOlwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNvdXJjZU5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICBzZXAgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIHdlIGtub3cgdGhhdCB0aGUgJ3Jlc291cmNlJyBhbmQgJ3Jlc291cmNlTmFtZScgcGFydHMgYXJlIHNlcGFyYXRlZCBieSBzbGFzaCBoZXJlLFxuICAgIC8vIHNvIHdlIHNwbGl0IHRoZSA2dGggc2VnbWVudCBmcm9tIHRoZSBjb2xvbi1zZXBhcmF0ZWQgb25lcyB3aXRoIGEgc2xhc2hcbiAgICBjb25zdCBsYXN0Q29tcG9uZW50cyA9IEZuLnNwbGl0KFwiL1wiLCBGbi5zZWxlY3QoNSwgY29tcG9uZW50cykpO1xuXG4gICAgaWYgKGFybkZvcm1hdCA9PT0gQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUpIHtcbiAgICAgIHJlc291cmNlID0gRm4uc2VsZWN0KDAsIGxhc3RDb21wb25lbnRzKTtcbiAgICAgIHJlc291cmNlTmFtZSA9IEZuLnNlbGVjdCgxLCBsYXN0Q29tcG9uZW50cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGFybkZvcm1hdCBpcyBBcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfU0xBU0hfUkVTT1VSQ0VfTkFNRSxcbiAgICAgIC8vIHdoaWNoIG1lYW5zIHRoZXJlJ3MgYW4gZXh0cmEgc2xhc2ggdGhlcmUgYXQgdGhlIGJlZ2lubmluZyB0aGF0IHdlIG5lZWQgdG8gc2tpcFxuICAgICAgcmVzb3VyY2UgPSBGbi5zZWxlY3QoMSwgbGFzdENvbXBvbmVudHMpO1xuICAgICAgcmVzb3VyY2VOYW1lID0gRm4uc2VsZWN0KDIsIGxhc3RDb21wb25lbnRzKTtcbiAgICB9XG4gICAgc2VwID0gXCIvXCI7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBhcnRpdGlvbixcbiAgICBzZXJ2aWNlLFxuICAgIHJlZ2lvbixcbiAgICBhY2NvdW50LFxuICAgIHJlc291cmNlLFxuICAgIHJlc291cmNlTmFtZSxcbiAgICBzZXAsXG4gICAgYXJuRm9ybWF0LFxuICB9O1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgYSBzdHJpbmcgaXMgZWl0aGVyIHVucGFyc2VhYmxlIG9yIGxvb2tzIG1vc3RseSBsaWtlIGFuIEFSTlxuICovXG5mdW5jdGlvbiBwYXJzZUFyblNoYXBlKGFybjogc3RyaW5nKTogXCJ0b2tlblwiIHwgc3RyaW5nW10ge1xuICAvLyBhc3N1bWUgYW55dGhpbmcgdGhhdCBzdGFydHMgd2l0aCAnYXJuOicgaXMgYW4gQVJOLFxuICAvLyBzbyB3ZSBjYW4gcmVwb3J0IGJldHRlciBlcnJvcnNcbiAgY29uc3QgbG9va3NMaWtlQXJuID0gYXJuLnN0YXJ0c1dpdGgoXCJhcm46XCIpO1xuXG4gIGlmICghbG9va3NMaWtlQXJuKSB7XG4gICAgaWYgKGNka3RmLlRva2VuLmlzVW5yZXNvbHZlZChhcm4pKSB7XG4gICAgICByZXR1cm4gXCJ0b2tlblwiO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBBUk5zIG11c3Qgc3RhcnQgd2l0aCBcImFybjpcIiBhbmQgaGF2ZSBhdCBsZWFzdCA2IGNvbXBvbmVudHM6ICR7YXJufWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIElmIHRoZSBBUk4gbWVyZWx5IGNvbnRhaW5zIFRva2VucywgYnV0IG90aGVyd2lzZSAqbG9va3MqIG1vc3RseSBsaWtlIGFuIEFSTixcbiAgLy8gaXQncyBhIHN0cmluZyBvZiB0aGUgZm9ybSAnYXJuOiR7cGFydGl0aW9ufTpzZXJ2aWNlOiR7cmVnaW9ufToke2FjY291bnR9OnJlc291cmNlL3h5eicuXG4gIC8vIFBhcnNlIGZpZWxkcyBvdXQgdG8gdGhlIGJlc3Qgb2Ygb3VyIGFiaWxpdHkuXG4gIC8vIFRva2VucyB3b24ndCBjb250YWluIFwiOlwiLCBzbyB0aGlzIHdvbid0IGJyZWFrIHRoZW0uXG4gIGNvbnN0IGNvbXBvbmVudHMgPSBhcm4uc3BsaXQoXCI6XCIpO1xuXG4gIGNvbnN0IHBhcnRpdGlvbiA9IGNvbXBvbmVudHMubGVuZ3RoID4gMSA/IGNvbXBvbmVudHNbMV0gOiB1bmRlZmluZWQ7XG4gIGlmICghcGFydGl0aW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJUaGUgYHBhcnRpdGlvbmAgY29tcG9uZW50ICgybmQgY29tcG9uZW50KSBvZiBhbiBBUk4gaXMgcmVxdWlyZWQ6IFwiICsgYXJuLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBzZXJ2aWNlID0gY29tcG9uZW50cy5sZW5ndGggPiAyID8gY29tcG9uZW50c1syXSA6IHVuZGVmaW5lZDtcbiAgaWYgKCFzZXJ2aWNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJUaGUgYHNlcnZpY2VgIGNvbXBvbmVudCAoM3JkIGNvbXBvbmVudCkgb2YgYW4gQVJOIGlzIHJlcXVpcmVkOiBcIiArIGFybixcbiAgICApO1xuICB9XG5cbiAgY29uc3QgcmVzb3VyY2UgPSBjb21wb25lbnRzLmxlbmd0aCA+IDUgPyBjb21wb25lbnRzWzVdIDogdW5kZWZpbmVkO1xuICBpZiAoIXJlc291cmNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJUaGUgYHJlc291cmNlYCBjb21wb25lbnQgKDZ0aCBjb21wb25lbnQpIG9mIGFuIEFSTiBpcyByZXF1aXJlZDogXCIgKyBhcm4sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlZ2lvbiBjYW4gYmUgbWlzc2luZyBpbiBnbG9iYWwgQVJOcyAoc3VjaCBhcyB1c2VkIGJ5IElBTSlcblxuICAvLyBBY2NvdW50IGNhbiBiZSBtaXNzaW5nIGluIHNvbWUgQVJOIHR5cGVzIChzdWNoIGFzIHVzZWQgZm9yIFMzIGJ1Y2tldHMpXG5cbiAgcmV0dXJuIGNvbXBvbmVudHM7XG59XG4iXX0=
385
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F3cy9hcm4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx5RkFBeUY7QUFFekYsK0JBQStCO0FBRS9CLGlDQUF5QztBQUN6QyxzQ0FBb0Q7QUFDcEQsOENBQW1DO0FBRW5DOztHQUVHO0FBQ0gsSUFBWSxTQXVDWDtBQXZDRCxXQUFZLFNBQVM7SUFDbkI7Ozs7Ozs7T0FPRztJQUNILHlFQUE0RCxDQUFBO0lBRTVEOzs7Ozs7O09BT0c7SUFDSCx5RkFBNEUsQ0FBQTtJQUU1RTs7Ozs7OztPQU9HO0lBQ0gseUZBQTRFLENBQUE7SUFFNUU7Ozs7OztPQU1HO0lBQ0gseUdBQTRGLENBQUE7QUFDOUYsQ0FBQyxFQXZDVyxTQUFTLHlCQUFULFNBQVMsUUF1Q3BCO0FBbUVELE1BQWEsR0FBRztJQUNkOzs7Ozs7Ozs7Ozs7Ozs7O09BZ0JHO0lBQ0ksTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUF5QixFQUFFLEtBQWlCO1FBQy9ELE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxTQUFTLElBQUksS0FBSyxFQUFFLFNBQVMsQ0FBQztRQUMzRCxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxJQUFJLEtBQUssRUFBRSxNQUFNLENBQUM7UUFDbEQsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sSUFBSSxLQUFLLEVBQUUsT0FBTyxDQUFDO1FBRXJELG9DQUFvQztRQUNwQyxJQUFJLFNBQVMsSUFBSSxJQUFJLElBQUksTUFBTSxJQUFJLElBQUksSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFLENBQUM7WUFDM0QsTUFBTSxJQUFJLGdDQUF1QixDQUMvQiwwQkFBMEIsU0FBUyxjQUFjLE1BQU0sbUJBQW1CLE9BQU8sOENBQThDLENBQ2hJLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxHQUFHLEdBQ1AsVUFBVSxDQUFDLEdBQUc7WUFDZCxDQUFDLFVBQVUsQ0FBQyxTQUFTLEtB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QUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ25FLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE1BQU0sSUFBSSxLQUFLLENBQ2Isa0VBQWtFLEdBQUcsR0FBRyxDQUN6RSxDQUFDO0lBQ0osQ0FBQztJQUVELDZEQUE2RDtJQUU3RCx5RUFBeUU7SUFFekUsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTUwLjAvcGFja2FnZXMvYXdzLWNkay1saWIvY29yZS9saWIvYXJuLnRzXG5cbmltcG9ydCAqIGFzIGNka3RmIGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IHsgSUF3c1N0YWNrIH0gZnJvbSBcIi4vYXdzLXN0YWNrXCI7XG5pbXBvcnQgeyBmaWx0ZXJVbmRlZmluZWQgfSBmcm9tIFwiLi91dGlsXCI7XG5pbXBvcnQgeyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCB7IEZuIH0gZnJvbSBcIi4uL3RlcnJhLWZ1bmNcIjtcblxuLyoqXG4gKiBBbiBlbnVtIHJlcHJlc2VudGluZyB0aGUgdmFyaW91cyBBUk4gZm9ybWF0cyB0aGF0IGRpZmZlcmVudCBzZXJ2aWNlcyB1c2UuXG4gKi9cbmV4cG9ydCBlbnVtIEFybkZvcm1hdCB7XG4gIC8qKlxuICAgKiBUaGlzIHJlcHJlc2VudHMgYSBmb3JtYXQgd2hlcmUgdGhlcmUgaXMgbm8gJ3Jlc291cmNlTmFtZScgcGFydC5cbiAgICogVGhpcyBmb3JtYXQgaXMgdXNlZCBmb3IgUzMgcmVzb3VyY2VzLFxuICAgKiBsaWtlICdhcm46YXdzOnMzOjo6YnVja2V0Jy5cbiAgICogRXZlcnl0aGluZyBhZnRlciB0aGUgbGFzdCBjb2xvbiBpcyBjb25zaWRlcmVkIHRoZSAncmVzb3VyY2UnLFxuICAgKiBldmVuIGlmIGl0IGNvbnRhaW5zIHNsYXNoZXMsXG4gICAqIGxpa2UgaW4gJ2Fybjphd3M6czM6OjpidWNrZXQvb2JqZWN0LnppcCcuXG4gICAqL1xuICBOT19SRVNPVVJDRV9OQU1FID0gXCJhcm46YXdzOnNlcnZpY2U6cmVnaW9uOmFjY291bnQ6cmVzb3VyY2VcIixcblxuICAvKipcbiAgICogVGhpcyByZXByZXNlbnRzIGEgZm9ybWF0IHdoZXJlIHRoZSAncmVzb3VyY2UnIGFuZCAncmVzb3VyY2VOYW1lJ1xuICAgKiBwYXJ0cyBhcmUgc2VwYXJhdGVkIHdpdGggYSBjb2xvbi5cbiAgICogTGlrZSBpbjogJ2Fybjphd3M6c2VydmljZTpyZWdpb246YWNjb3VudDpyZXNvdXJjZTpyZXNvdXJjZU5hbWUnLlxuICAgKiBFdmVyeXRoaW5nIGFmdGVyIHRoZSBsYXN0IGNvbG9uIGlzIGNvbnNpZGVyZWQgdGhlICdyZXNvdXJjZU5hbWUnLFxuICAgKiBldmVuIGlmIGl0IGNvbnRhaW5zIHNsYXNoZXMsXG4gICAqIGxpa2UgaW4gJ2Fybjphd3M6YXBpZ2F0ZXdheTpyZWdpb246YWNjb3VudDpyZXNvdXJjZTovdGVzdC9teWRlbW9yZXNvdXJjZS8qJy5cbiAgICovXG4gIENPTE9OX1JFU09VUkNFX05BTUUgPSBcImFybjphd3M6c2VydmljZTpyZWdpb246YWNjb3VudDpyZXNvdXJjZTpyZXNvdXJjZU5hbWVcIixcblxuICAvKipcbiAgICogVGhpcyByZXByZXNlbnRzIGEgZm9ybWF0IHdoZXJlIHRoZSAncmVzb3VyY2UnIGFuZCAncmVzb3VyY2VOYW1lJ1xuICAgKiBwYXJ0cyBhcmUgc2VwYXJhdGVkIHdpdGggYSBzbGFzaC5cbiAgICogTGlrZSBpbjogJ2Fybjphd3M6c2VydmljZTpyZWdpb246YWNjb3VudDpyZXNvdXJjZS9yZXNvdXJjZU5hbWUnLlxuICAgKiBFdmVyeXRoaW5nIGFmdGVyIHRoZSBzZXBhcmF0aW5nIHNsYXNoIGlzIGNvbnNpZGVyZWQgdGhlICdyZXNvdXJjZU5hbWUnLFxuICAgKiBldmVuIGlmIGl0IGNvbnRhaW5zIGNvbG9ucyxcbiAgICogbGlrZSBpbiAnYXJuOmF3czpjb2duaXRvLXN5bmM6cmVnaW9uOmFjY291bnQ6aWRlbnRpdHlwb29sL3VzLWVhc3QtMToxYTFhMWExYS1mZmZmLTExMTEtOTk5OS0xMjM0NTY3ODpibGEnLlxuICAgKi9cbiAgU0xBU0hfUkVTT1VSQ0VfTkFNRSA9IFwiYXJuOmF3czpzZXJ2aWNlOnJlZ2lvbjphY2NvdW50OnJlc291cmNlL3Jlc291cmNlTmFtZVwiLFxuXG4gIC8qKlxuICAgKiBUaGlzIHJlcHJlc2VudHMgYSBmb3JtYXQgd2hlcmUgdGhlICdyZXNvdXJjZScgYW5kICdyZXNvdXJjZU5hbWUnXG4gICAqIHBhcnRzIGFyZSBzZXBlcmF0ZWQgd2l0aCBhIHNsYXNoLFxuICAgKiBidXQgdGhlcmUgaXMgYWxzbyBhbiBhZGRpdGlvbmFsIHNsYXNoIGFmdGVyIHRoZSBjb2xvbiBzZXBhcmF0aW5nICdhY2NvdW50JyBmcm9tICdyZXNvdXJjZScuXG4gICAqIExpa2UgaW46ICdhcm46YXdzOnNlcnZpY2U6cmVnaW9uOmFjY291bnQ6L3Jlc291cmNlL3Jlc291cmNlTmFtZScuXG4gICAqIE5vdGUgdGhhdCB0aGUgbGVhZGluZyBzbGFzaCBpcyBfbm90XyBpbmNsdWRlZCBpbiB0aGUgcGFyc2VkICdyZXNvdXJjZScgcGFydC5cbiAgICovXG4gIFNMQVNIX1JFU09VUkNFX1NMQVNIX1JFU09VUkNFX05BTUUgPSBcImFybjphd3M6c2VydmljZTpyZWdpb246YWNjb3VudDovcmVzb3VyY2UvcmVzb3VyY2VOYW1lXCIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXJuQ29tcG9uZW50cyB7XG4gIC8qKlxuICAgKiBUaGUgcGFydGl0aW9uIHRoYXQgdGhlIHJlc291cmNlIGlzIGluLiBGb3Igc3RhbmRhcmQgQVdTIHJlZ2lvbnMsIHRoZVxuICAgKiBwYXJ0aXRpb24gaXMgYXdzLiBJZiB5b3UgaGF2ZSByZXNvdXJjZXMgaW4gb3RoZXIgcGFydGl0aW9ucywgdGhlXG4gICAqIHBhcnRpdGlvbiBpcyBhd3MtcGFydGl0aW9ubmFtZS4gRm9yIGV4YW1wbGUsIHRoZSBwYXJ0aXRpb24gZm9yIHJlc291cmNlc1xuICAgKiBpbiB0aGUgQ2hpbmEgKEJlaWppbmcpIHJlZ2lvbiBpcyBhd3MtY24uXG4gICAqXG4gICAqIEBkZWZhdWx0IFRoZSBBV1MgcGFydGl0aW9uIHRoZSBzdGFjayBpcyBkZXBsb3llZCB0by5cbiAgICovXG4gIHJlYWRvbmx5IHBhcnRpdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNlcnZpY2UgbmFtZXNwYWNlIHRoYXQgaWRlbnRpZmllcyB0aGUgQVdTIHByb2R1Y3QgKGZvciBleGFtcGxlLFxuICAgKiAnczMnLCAnaWFtJywgJ2NvZGVwaXBsaW5lJykuXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpb24gdGhlIHJlc291cmNlIHJlc2lkZXMgaW4uIE5vdGUgdGhhdCB0aGUgQVJOcyBmb3Igc29tZSByZXNvdXJjZXNcbiAgICogZG8gbm90IHJlcXVpcmUgYSByZWdpb24sIHNvIHRoaXMgY29tcG9uZW50IG1pZ2h0IGJlIG9taXR0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IFRoZSByZWdpb24gdGhlIHN0YWNrIGlzIGRlcGxveWVkIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIEFXUyBhY2NvdW50IHRoYXQgb3ducyB0aGUgcmVzb3VyY2UsIHdpdGhvdXQgdGhlIGh5cGhlbnMuXG4gICAqIEZvciBleGFtcGxlLCAxMjM0NTY3ODkwMTIuIE5vdGUgdGhhdCB0aGUgQVJOcyBmb3Igc29tZSByZXNvdXJjZXMgZG9uJ3RcbiAgICogcmVxdWlyZSBhbiBhY2NvdW50IG51bWJlciwgc28gdGhpcyBjb21wb25lbnQgbWlnaHQgYmUgb21pdHRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgVGhlIGFjY291bnQgdGhlIHN0YWNrIGlzIGRlcGxveWVkIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgYWNjb3VudD86IHN0cmluZztcblxuICAvKipcbiAgICogUmVzb3VyY2UgdHlwZSAoZS5nLiBcInRhYmxlXCIsIFwiYXV0b1NjYWxpbmdHcm91cFwiLCBcImNlcnRpZmljYXRlXCIpLlxuICAgKiBGb3Igc29tZSByZXNvdXJjZSB0eXBlcywgZS5nLiBTMyBidWNrZXRzLCB0aGlzIGZpZWxkIGRlZmluZXMgdGhlIGJ1Y2tldCBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2U6IHN0cmluZztcblxuICAvKipcbiAgICogU2VwYXJhdG9yIGJldHdlZW4gcmVzb3VyY2UgdHlwZSBhbmQgdGhlIHJlc291cmNlLlxuICAgKlxuICAgKiBDYW4gYmUgZWl0aGVyICcvJywgJzonIG9yIGFuIGVtcHR5IHN0cmluZy4gV2lsbCBvbmx5IGJlIHVzZWQgaWYgcmVzb3VyY2VOYW1lIGlzIGRlZmluZWQuXG4gICAqIEBkZWZhdWx0ICcvJ1xuICAgKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgYXJuRm9ybWF0IGluc3RlYWRcbiAgICovXG4gIHJlYWRvbmx5IHNlcD86IHN0cmluZztcblxuICAvKipcbiAgICogUmVzb3VyY2UgbmFtZSBvciBwYXRoIHdpdGhpbiB0aGUgcmVzb3VyY2UgKGkuZS4gUzMgYnVja2V0IG9iamVjdCBrZXkpIG9yXG4gICAqIGEgd2lsZGNhcmQgc3VjaCBhcyBgYFwiKlwiYGAuIFRoaXMgaXMgc2VydmljZS1kZXBlbmRlbnQuXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzcGVjaWZpYyBBUk4gZm9ybWF0IHRvIHVzZSBmb3IgdGhpcyBBUk4gdmFsdWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdXNlcyB2YWx1ZSBvZiBgc2VwYCBhcyB0aGUgc2VwYXJhdG9yIGZvciBmb3JtYXR0aW5nLFxuICAgKiAgIGBBcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRWAgaWYgdGhhdCBwcm9wZXJ0eSB3YXMgYWxzbyBub3RkXG4gICAqL1xuICByZWFkb25seSBhcm5Gb3JtYXQ/OiBBcm5Gb3JtYXQ7XG59XG5cbmV4cG9ydCBjbGFzcyBBcm4ge1xuICAvKipcbiAgICogQ3JlYXRlcyBhbiBBUk4gZnJvbSBjb21wb25lbnRzLlxuICAgKlxuICAgKiBJZiBgcGFydGl0aW9uYCwgYHJlZ2lvbmAgb3IgYGFjY291bnRgIGFyZSBub3Qgc3BlY2lmaWVkLCB0aGUgc3RhY2snc1xuICAgKiBwYXJ0aXRpb24sIHJlZ2lvbiBhbmQgYWNjb3VudCB3aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIElmIGFueSBjb21wb25lbnQgaXMgdGhlIGVtcHR5IHN0cmluZywgYW4gZW1wdHkgc3RyaW5nIHdpbGwgYmUgaW5zZXJ0ZWRcbiAgICogaW50byB0aGUgZ2VuZXJhdGVkIEFSTiBhdCB0aGUgbG9jYXRpb24gdGhhdCBjb21wb25lbnQgY29ycmVzcG9uZHMgdG8uXG4gICAqXG4gICAqIFRoZSBBUk4gd2lsbCBiZSBmb3JtYXR0ZWQgYXMgZm9sbG93czpcbiAgICpcbiAgICogICBhcm46e3BhcnRpdGlvbn06e3NlcnZpY2V9OntyZWdpb259OnthY2NvdW50fTp7cmVzb3VyY2V9e3NlcH17cmVzb3VyY2UtbmFtZX1cbiAgICpcbiAgICogVGhlIHJlcXVpcmVkIEFSTiBwaWVjZXMgdGhhdCBhcmUgb21pdHRlZCB3aWxsIGJlIHRha2VuIGZyb20gdGhlIHN0YWNrIHRoYXRcbiAgICogdGhlICdzY29wZScgaXMgYXR0YWNoZWQgdG8uIElmIGFsbCBBUk4gcGllY2VzIGFyZSBzdXBwbGllZCwgdGhlIHN1cHBsaWVkIHNjb3BlXG4gICAqIGNhbiBiZSAndW5kZWZpbmVkJy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZm9ybWF0KGNvbXBvbmVudHM6IEFybkNvbXBvbmVudHMsIHN0YWNrPzogSUF3c1N0YWNrKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJ0aXRpb24gPSBjb21wb25lbnRzLnBhcnRpdGlvbiA/PyBzdGFjaz8ucGFydGl0aW9uO1xuICAgIGNvbnN0IHJlZ2lvbiA9IGNvbXBvbmVudHMucmVnaW9uID8/IHN0YWNrPy5yZWdpb247XG4gICAgY29uc3QgYWNjb3VudCA9IGNvbXBvbmVudHMuYWNjb3VudCA/PyBzdGFjaz8uYWNjb3VudDtcblxuICAgIC8vIENhdGNoIGJvdGggJ251bGwnIGFuZCAndW5kZWZpbmVkJ1xuICAgIGlmIChwYXJ0aXRpb24gPT0gbnVsbCB8fCByZWdpb24gPT0gbnVsbCB8fCBhY2NvdW50ID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgYEFybi5mb3JtYXQ6IHBhcnRpdGlvbiAoJHtwYXJ0aXRpb259KSwgcmVnaW9uICgke3JlZ2lvbn0pLCBhbmQgYWNjb3VudCAoJHthY2NvdW50fSkgbXVzdCBhbGwgYmUgcGFzc2VkIGlmIHN0YWNrIGlzIG5vdCBwYXNzZWQuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VwID1cbiAgICAgIGNvbXBvbmVudHMuc2VwID8/XG4gICAgICAoY29tcG9uZW50cy5hcm5Gb3JtYXQgPT09IEFybkZvcm1hdC5DT0xPTl9SRVNPVVJDRV9OQU1FID8gXCI6XCIgOiBcIi9cIik7XG5cbiAgICBjb25zdCB2YWx1ZXMgPSBbXG4gICAgICBcImFyblwiLFxuICAgICAgXCI6XCIsXG4gICAgICBwYXJ0aXRpb24sXG4gICAgICBcIjpcIixcbiAgICAgIGNvbXBvbmVudHMuc2VydmljZSxcbiAgICAgIFwiOlwiLFxuICAgICAgcmVnaW9uLFxuICAgICAgXCI6XCIsXG4gICAgICBhY2NvdW50LFxuICAgICAgXCI6XCIsXG4gICAgICAuLi4oY29tcG9uZW50cy5hcm5Gb3JtYXQgPT09IEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9TTEFTSF9SRVNPVVJDRV9OQU1FXG4gICAgICAgID8gW1wiL1wiXVxuICAgICAgICA6IFtdKSxcbiAgICAgIGNvbXBvbmVudHMucmVzb3VyY2UsXG4gICAgXTtcblxuICAgIGlmIChzZXAgIT09IFwiL1wiICYmIHNlcCAhPT0gXCI6XCIgJiYgc2VwICE9PSBcIlwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdyZXNvdXJjZVBhdGhTZXAgbWF5IG9ubHkgYmUgXCI6XCIsIFwiL1wiIG9yIGFuIGVtcHR5IHN0cmluZycsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChjb21wb25lbnRzLnJlc291cmNlTmFtZSAhPSBudWxsKSB7XG4gICAgICB2YWx1ZXMucHVzaChzZXApO1xuICAgICAgdmFsdWVzLnB1c2goY29tcG9uZW50cy5yZXNvdXJjZU5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXMuam9pbihcIlwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhbiBBUk4sIHBhcnNlcyBpdCBhbmQgcmV0dXJucyBjb21wb25lbnRzLlxuICAgKlxuICAgKiBJRiBUSEUgQVJOIElTIEEgQ09OQ1JFVEUgU1RSSU5HLi4uXG4gICAqXG4gICAqIC4uLml0IHdpbGwgYmUgcGFyc2VkIGFuZCB2YWxpZGF0ZWQuIFRoZSBzZXBhcmF0b3IgKGBzZXBgKSB3aWxsIGJlIHNldCB0byAnLydcbiAgICogaWYgdGhlIDZ0aCBjb21wb25lbnQgaW5jbHVkZXMgYSAnLycsIGluIHdoaWNoIGNhc2UsIGByZXNvdXJjZWAgd2lsbCBiZSBzZXRcbiAgICogdG8gdGhlIHZhbHVlIGJlZm9yZSB0aGUgJy8nIGFuZCBgcmVzb3VyY2VOYW1lYCB3aWxsIGJlIHRoZSByZXN0LiBJbiBjYXNlXG4gICAqIHRoZXJlIGlzIG5vICcvJywgYHJlc291cmNlYCB3aWxsIGJlIHNldCB0byB0aGUgNnRoIGNvbXBvbmVudHMgYW5kXG4gICAqIGByZXNvdXJjZU5hbWVgIHdpbGwgYmUgc2V0IHRvIHRoZSByZXN0IG9mIHRoZSBzdHJpbmcuXG4gICAqXG4gICAqIElGIFRIRSBBUk4gSVMgQSBUT0tFTi4uLlxuICAgKlxuICAgKiAuLi5pdCBjYW5ub3QgYmUgdmFsaWRhdGVkLCBzaW5jZSB3ZSBkb24ndCBoYXZlIHRoZSBhY3R1YWwgdmFsdWUgeWV0IGF0IHRoZVxuICAgKiB0aW1lIG9mIHRoaXMgZnVuY3Rpb24gY2FsbC4gWW91IHdpbGwgaGF2ZSB0byBzdXBwbHkgYHNlcElmVG9rZW5gIGFuZFxuICAgKiB3aGV0aGVyIG9yIG5vdCBBUk5zIG9mIHRoZSBleHBlY3RlZCBmb3JtYXQgdXN1YWxseSBoYXZlIHJlc291cmNlIG5hbWVzXG4gICAqIGluIG9yZGVyIHRvIHBhcnNlIGl0IHByb3Blcmx5LiBUaGUgcmVzdWx0aW5nIGBBcm5Db21wb25lbnRzYCBvYmplY3Qgd2lsbFxuICAgKiBjb250YWluIHRva2VucyBmb3IgdGhlIHN1YmV4cHJlc3Npb25zIG9mIHRoZSBBUk4sIG5vdCBzdHJpbmcgbGl0ZXJhbHMuXG4gICAqXG4gICAqIElmIHRoZSByZXNvdXJjZSBuYW1lIGNvdWxkIHBvc3NpYmx5IGNvbnRhaW4gdGhlIHNlcGFyYXRvciBjaGFyLCB0aGUgYWN0dWFsXG4gICAqIHJlc291cmNlIG5hbWUgY2Fubm90IGJlIHByb3Blcmx5IHBhcnNlZC4gVGhpcyBvbmx5IG9jY3VycyBpZiB0aGUgc2VwYXJhdG9yXG4gICAqIGNoYXIgaXMgJy8nLCBhbmQgaGFwcGVucyBmb3IgZXhhbXBsZSBmb3IgUzMgb2JqZWN0IEFSTnMsIElBTSBSb2xlIEFSTnMsXG4gICAqIElBTSBPSURDIFByb3ZpZGVyIEFSTnMsIGV0Yy4gVG8gcHJvcGVybHkgZXh0cmFjdCB0aGUgcmVzb3VyY2UgbmFtZSBmcm9tIGFcbiAgICogVG9rZW5pemVkIEFSTiwgeW91IG11c3Qga25vdyB0aGUgcmVzb3VyY2UgdHlwZSBhbmQgY2FsbFxuICAgKiBgQXJuLmV4dHJhY3RSZXNvdXJjZU5hbWVgLlxuICAgKlxuICAgKiBAcGFyYW0gYXJuIFRoZSBBUk4gdG8gcGFyc2VcbiAgICogQHBhcmFtIHNlcElmVG9rZW4gVGhlIHNlcGFyYXRvciB1c2VkIHRvIHNlcGFyYXRlIHJlc291cmNlIGZyb20gcmVzb3VyY2VOYW1lXG4gICAqIEBwYXJhbSBoYXNOYW1lIFdoZXRoZXIgdGhlcmUgaXMgYSBuYW1lIGNvbXBvbmVudCBpbiB0aGUgQVJOIGF0IGFsbC4gRm9yXG4gICAqIGV4YW1wbGUsIFNOUyBUb3BpY3MgQVJOcyBoYXZlIHRoZSAncmVzb3VyY2UnIGNvbXBvbmVudCBjb250YWluIHRoZSB0b3BpY1xuICAgKiBuYW1lLCBhbmQgbm8gJ3Jlc291cmNlTmFtZScgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcmV0dXJucyBhbiBBcm5Db21wb25lbnRzIG9iamVjdCB3aGljaCBhbGxvd3MgYWNjZXNzIHRvIHRoZSB2YXJpb3VzXG4gICAqIGNvbXBvbmVudHMgb2YgdGhlIEFSTi5cbiAgICpcbiAgICogQHJldHVybnMgYW4gQXJuQ29tcG9uZW50cyBvYmplY3Qgd2hpY2ggYWxsb3dzIGFjY2VzcyB0byB0aGUgdmFyaW91c1xuICAgKiAgICAgIGNvbXBvbmVudHMgb2YgdGhlIEFSTi5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgdXNlIHNwbGl0IGluc3RlYWRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcGFyc2UoXG4gICAgYXJuOiBzdHJpbmcsXG4gICAgc2VwSWZUb2tlbjogc3RyaW5nID0gXCIvXCIsXG4gICAgaGFzTmFtZTogYm9vbGVhbiA9IHRydWUsXG4gICk6IEFybkNvbXBvbmVudHMge1xuICAgIGxldCBhcm5Gb3JtYXQ6IEFybkZvcm1hdDtcbiAgICBpZiAoIWhhc05hbWUpIHtcbiAgICAgIGFybkZvcm1hdCA9IEFybkZvcm1hdC5OT19SRVNPVVJDRV9OQU1FO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcm5Gb3JtYXQgPVxuICAgICAgICBzZXBJZlRva2VuID09PSBcIi9cIlxuICAgICAgICAgID8gQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUVcbiAgICAgICAgICA6IEFybkZvcm1hdC5DT0xPTl9SRVNPVVJDRV9OQU1FO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zcGxpdChhcm4sIGFybkZvcm1hdCk7XG4gIH1cblxuICAvKipcbiAgICogU3BsaXRzIHRoZSBwcm92aWRlZCBBUk4gaW50byBpdHMgY29tcG9uZW50cy5cbiAgICogV29ya3MgYm90aCBpZiAnYXJuJyBpcyBhIHN0cmluZyBsaWtlICdhcm46YXdzOnMzOjo6YnVja2V0JyxcbiAgICogYW5kIGEgVG9rZW4gcmVwcmVzZW50aW5nIGEgZHluYW1pYyBDbG91ZEZvcm1hdGlvbiBleHByZXNzaW9uXG4gICAqIChpbiB3aGljaCBjYXNlIHRoZSByZXR1cm5lZCBjb21wb25lbnRzIHdpbGwgYWxzbyBiZSBkeW5hbWljIENsb3VkRm9ybWF0aW9uIGV4cHJlc3Npb25zLFxuICAgKiBlbmNvZGVkIGFzIFRva2VucykuXG4gICAqXG4gICAqIEBwYXJhbSBhcm4gdGhlIEFSTiB0byBzcGxpdCBpbnRvIGl0cyBjb21wb25lbnRzXG4gICAqIEBwYXJhbSBhcm5Gb3JtYXQgdGhlIGV4cGVjdGVkIGZvcm1hdCBvZiAnYXJuJyAtIGRlcGVuZHMgb24gd2hhdCBmb3JtYXQgdGhlIHNlcnZpY2UgJ2FybicgcmVwcmVzZW50cyB1c2VzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNwbGl0KGFybjogc3RyaW5nLCBhcm5Gb3JtYXQ6IEFybkZvcm1hdCk6IEFybkNvbXBvbmVudHMge1xuICAgIGNvbnN0IGNvbXBvbmVudHMgPSBwYXJzZUFyblNoYXBlKGFybik7XG4gICAgaWYgKGNvbXBvbmVudHMgPT09IFwidG9rZW5cIikge1xuICAgICAgcmV0dXJuIHBhcnNlVG9rZW5Bcm4oYXJuLCBhcm5Gb3JtYXQpO1xuICAgIH1cblxuICAgIGNvbnN0IFssIHBhcnRpdGlvbiwgc2VydmljZSwgcmVnaW9uLCBhY2NvdW50LCByZXNvdXJjZVR5cGVPck5hbWUsIC4uLnJlc3RdID1cbiAgICAgIGNvbXBvbmVudHM7XG5cbiAgICBsZXQgcmVzb3VyY2U6IHN0cmluZztcbiAgICBsZXQgcmVzb3VyY2VOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHNlcDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCByZXNvdXJjZVBhcnRTdGFydEluZGV4ID0gMDtcbiAgICBsZXQgZGV0ZWN0ZWRBcm5Gb3JtYXQ6IEFybkZvcm1hdDtcblxuICAgIGxldCBzbGFzaEluZGV4ID0gcmVzb3VyY2VUeXBlT3JOYW1lLmluZGV4T2YoXCIvXCIpO1xuICAgIGlmIChzbGFzaEluZGV4ID09PSAwKSB7XG4gICAgICAvLyBuZXctc3R5bGUgQVJOcyBhcmUgb2YgdGhlIGZvcm0gJ2Fybjphd3M6czQ6dXMtd2VzdC0xOjEyMzQ1Oi9yZXNvdXJjZS10eXBlL3Jlc291cmNlLW5hbWUnXG4gICAgICBzbGFzaEluZGV4ID0gcmVzb3VyY2VUeXBlT3JOYW1lLmluZGV4T2YoXCIvXCIsIDEpO1xuICAgICAgcmVzb3VyY2VQYXJ0U3RhcnRJbmRleCA9IDE7XG4gICAgICBkZXRlY3RlZEFybkZvcm1hdCA9IEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9TTEFTSF9SRVNPVVJDRV9OQU1FO1xuICAgIH1cbiAgICBpZiAoc2xhc2hJbmRleCAhPT0gLTEpIHtcbiAgICAgIC8vIHRoZSBzbGFzaCBpcyBvbmx5IGEgc2VwYXJhdG9yIGlmIEFybkZvcm1hdCBpcyBub3QgTk9fUkVTT1VSQ0VfTkFNRVxuICAgICAgaWYgKGFybkZvcm1hdCA9PT0gQXJuRm9ybWF0Lk5PX1JFU09VUkNFX05BTUUpIHtcbiAgICAgICAgc2VwID0gdW5kZWZpbmVkO1xuICAgICAgICBzbGFzaEluZGV4ID0gLTE7XG4gICAgICAgIGRldGVjdGVkQXJuRm9ybWF0ID0gQXJuRm9ybWF0Lk5PX1JFU09VUkNFX05BTUU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXAgPSBcIi9cIjtcbiAgICAgICAgZGV0ZWN0ZWRBcm5Gb3JtYXQgPVxuICAgICAgICAgIHJlc291cmNlUGFydFN0YXJ0SW5kZXggPT09IDBcbiAgICAgICAgICAgID8gQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUVcbiAgICAgICAgICAgIDogLy8gbmVlZCB0byByZXBlYXQgdGhpcyBoZXJlLCBhcyBvdGhlcndpc2UgdGhlIGNvbXBpbGVyIHRoaW5rcyAnZGV0ZWN0ZWRBcm5Gb3JtYXQnIGlzIG5vdCBpbml0aWFsaXplZCBpbiBhbGwgcGF0aHNcbiAgICAgICAgICAgICAgQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX1NMQVNIX1JFU09VUkNFX05BTUU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyZXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIHNlcCA9IFwiOlwiO1xuICAgICAgc2xhc2hJbmRleCA9IC0xO1xuICAgICAgZGV0ZWN0ZWRBcm5Gb3JtYXQgPSBBcm5Gb3JtYXQuQ09MT05fUkVTT1VSQ0VfTkFNRTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VwID0gdW5kZWZpbmVkO1xuICAgICAgZGV0ZWN0ZWRBcm5Gb3JtYXQgPSBBcm5Gb3JtYXQuTk9fUkVTT1VSQ0VfTkFNRTtcbiAgICB9XG5cbiAgICBpZiAoc2xhc2hJbmRleCAhPT0gLTEpIHtcbiAgICAgIHJlc291cmNlID0gcmVzb3VyY2VUeXBlT3JOYW1lLnN1YnN0cmluZyhcbiAgICAgICAgcmVzb3VyY2VQYXJ0U3RhcnRJbmRleCxcbiAgICAgICAgc2xhc2hJbmRleCxcbiAgICAgICk7XG4gICAgICByZXNvdXJjZU5hbWUgPSByZXNvdXJjZVR5cGVPck5hbWUuc3Vic3RyaW5nKHNsYXNoSW5kZXggKyAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb3VyY2UgPSByZXNvdXJjZVR5cGVPck5hbWU7XG4gICAgfVxuXG4gICAgaWYgKHJlc3QubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKCFyZXNvdXJjZU5hbWUpIHtcbiAgICAgICAgcmVzb3VyY2VOYW1lID0gXCJcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc291cmNlTmFtZSArPSBcIjpcIjtcbiAgICAgIH1cblxuICAgICAgcmVzb3VyY2VOYW1lICs9IHJlc3Quam9pbihcIjpcIik7XG4gICAgfVxuXG4gICAgLy8gXCJ8fCB1bmRlZmluZWRcIiB3aWxsIGNhdXNlIGVtcHR5IHN0cmluZ3MgdG8gYmUgdHJlYXRlZCBhcyBcInVuZGVmaW5lZFwiLlxuICAgIC8vIE9wdGlvbmFsIEFSTiBhdHRyaWJ1dGVzIChlLmcuIHJlZ2lvbiwgYWNjb3VudCkgc2hvdWxkIHJldHVybiBhcyBlbXB0eSBzdHJpbmdcbiAgICAvLyBpZiB0aGV5IGFyZSBwcm92aWRlZCBhcyBzdWNoLlxuICAgIHJldHVybiBmaWx0ZXJVbmRlZmluZWQoe1xuICAgICAgc2VydmljZTogc2VydmljZSB8fCB1bmRlZmluZWQsXG4gICAgICByZXNvdXJjZTogcmVzb3VyY2UgfHwgdW5kZWZpbmVkLFxuICAgICAgcGFydGl0aW9uOiBwYXJ0aXRpb24gfHwgdW5kZWZpbmVkLFxuICAgICAgcmVnaW9uLFxuICAgICAgYWNjb3VudCxcbiAgICAgIHJlc291cmNlTmFtZSxcbiAgICAgIHNlcCxcbiAgICAgIGFybkZvcm1hdDogZGV0ZWN0ZWRBcm5Gb3JtYXQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCB0aGUgZnVsbCByZXNvdXJjZSBuYW1lIGZyb20gYW4gQVJOXG4gICAqXG4gICAqIE5lY2Vzc2FyeSBmb3IgcmVzb3VyY2UgbmFtZXMgKHBhdGhzKSB0aGF0IG1heSBjb250YWluIHRoZSBzZXBhcmF0b3IsIGxpa2VcbiAgICogYGFybjphd3M6aWFtOjoxMTExMTExMTExMTE6cm9sZS9wYXRoL3RvL3JvbGUvbmFtZWAuXG4gICAqXG4gICAqIE9ubHkgd29ya3MgaWYgd2Ugc3RhdGljYWxseSBrbm93IHRoZSBleHBlY3RlZCBgcmVzb3VyY2VUeXBlYCBiZWZvcmVoYW5kLCBzaW5jZSB3ZSdyZSBnb2luZ1xuICAgKiB0byB1c2UgdGhhdCB0byBzcGxpdCB0aGUgc3RyaW5nIG9uICc6PHJlc291cmNlVHlwZT4vJyAoYW5kIHRha2UgdGhlIHJpZ2h0LWhhbmQgc2lkZSkuXG4gICAqXG4gICAqIFdlIGNhbid0IGV4dHJhY3QgdGhlICdyZXNvdXJjZVR5cGUnIGZyb20gdGhlIEFSTiBhdCBoYW5kLCBiZWNhdXNlIENsb3VkRm9ybWF0aW9uIEV4cHJlc3Npb25zXG4gICAqIG9ubHkgYWxsb3cgbGl0ZXJhbHMgaW4gdGhlICdzZXBhcmF0b3InIGFyZ3VtZW50IHRvIGB7IEZuOjpTcGxpdCB9YCwgYW5kIHNvIGl0IGNhbid0IGJlXG4gICAqIGB7IEZuOjpTZWxlY3Q6IFs1LCB7IEZuOjpTcGxpdDogWyc6JywgQVJOXSB9fWAuXG4gICAqXG4gICAqIE9ubHkgbmVjZXNzYXJ5IGZvciBBUk4gZm9ybWF0cyBmb3Igd2hpY2ggdGhlIHR5cGUtbmFtZSBzZXBhcmF0b3IgaXMgYC9gLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBleHRyYWN0UmVzb3VyY2VOYW1lKGFybjogc3RyaW5nLCByZXNvdXJjZVR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgY29tcG9uZW50cyA9IHBhcnNlQXJuU2hhcGUoYXJuKTtcbiAgICBpZiAoY29tcG9uZW50cyA9PT0gXCJ0b2tlblwiKSB7XG4gICAgICByZXR1cm4gRm4uc2VsZWN0KDEsIEZuLnNwbGl0djIoYDoke3Jlc291cmNlVHlwZX0vYCwgYXJuKSk7XG4gICAgfVxuXG4gICAgLy8gQXBwYXJlbnRseSB3ZSBjb3VsZCBqdXN0IHBhcnNlIHRoaXMgcmlnaHQgYXdheS4gVmFsaWRhdGUgdGhhdCB3ZSBnb3QgdGhlIHJpZ2h0XG4gICAgLy8gcmVzb3VyY2UgdHlwZSAodG8gbm90aWZ5IGF1dGhvcnMgb2YgaW5jb3JyZWN0IGFzc3VtcHRpb25zIHJpZ2h0IGF3YXkpLlxuICAgIGNvbnN0IHBhcnNlZCA9IEFybi5zcGxpdChhcm4sIEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FKTtcbiAgICBpZiAoXG4gICAgICAhY2RrdGYuVG9rZW4uaXNVbnJlc29sdmVkKHBhcnNlZC5yZXNvdXJjZSkgJiZcbiAgICAgIHBhcnNlZC5yZXNvdXJjZSAhPT0gcmVzb3VyY2VUeXBlXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBFeHBlY3RlZCByZXNvdXJjZSB0eXBlICcke3Jlc291cmNlVHlwZX0nIGluIEFSTiwgZ290ICcke3BhcnNlZC5yZXNvdXJjZX0nIGluICcke2Fybn0nYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghcGFyc2VkLnJlc291cmNlTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRXhwZWN0ZWQgcmVzb3VyY2UgbmFtZSBpbiBBUk4sIGRpZG4ndCBmaW5kIG9uZTogJyR7YXJufSdgLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZC5yZXNvdXJjZU5hbWU7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cbn1cblxuLyoqXG4gKiBHaXZlbiBhIFRva2VuIGV2YWx1YXRpbmcgdG8gQVJOLCBwYXJzZXMgaXQgYW5kIHJldHVybnMgY29tcG9uZW50cy5cbiAqXG4gKiBUaGUgQVJOIGNhbm5vdCBiZSB2YWxpZGF0ZWQsIHNpbmNlIHdlIGRvbid0IGhhdmUgdGhlIGFjdHVhbCB2YWx1ZSB5ZXRcbiAqIGF0IHRoZSB0aW1lIG9mIHRoaXMgZnVuY3Rpb24gY2FsbC4gWW91IHdpbGwgaGF2ZSB0byBrbm93IHRoZSBzZXBhcmF0b3JcbiAqIGFuZCB0aGUgdHlwZSBvZiBBUk4uXG4gKlxuICogVGhlIHJlc3VsdGluZyBgQXJuQ29tcG9uZW50c2Agb2JqZWN0IHdpbGwgY29udGFpbiB0b2tlbnMgZm9yIHRoZVxuICogc3ViZXhwcmVzc2lvbnMgb2YgdGhlIEFSTiwgbm90IHN0cmluZyBsaXRlcmFscy5cbiAqXG4gKiBXQVJOSU5HOiB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBwcm9wZXJseSBwYXJzZSB0aGUgY29tcGxldGUgZmluYWxcbiAqICdyZXNvdXJjZU5hbWUnIHBhcnQgaWYgaXQgY29udGFpbnMgY29sb25zLFxuICogbGlrZSAnYXJuOmF3czpjb2duaXRvLXN5bmM6cmVnaW9uOmFjY291bnQ6aWRlbnRpdHlwb29sL3VzLWVhc3QtMToxYTFhMWExYS1mZmZmLTExMTEtOTk5OS0xMjM0NTY3ODpibGEnLlxuICpcbiAqIEBwYXJhbSBhcm5Ub2tlbiBUaGUgaW5wdXQgdG9rZW4gdGhhdCBjb250YWlucyBhbiBBUk5cbiAqIEBwYXJhbSBhcm5Gb3JtYXQgdGhlIGV4cGVjdGVkIGZvcm1hdCBvZiAnYXJuJyAtIGRlcGVuZHMgb24gd2hhdCBmb3JtYXQgdGhlIHNlcnZpY2UgdGhlIEFSTiByZXByZXNlbnRzIHVzZXNcbiAqL1xuZnVuY3Rpb24gcGFyc2VUb2tlbkFybihhcm5Ub2tlbjogc3RyaW5nLCBhcm5Gb3JtYXQ6IEFybkZvcm1hdCk6IEFybkNvbXBvbmVudHMge1xuICAvLyBBUk4gbG9va3MgbGlrZTpcbiAgLy8gYXJuOnBhcnRpdGlvbjpzZXJ2aWNlOnJlZ2lvbjphY2NvdW50OnJlc291cmNlXG4gIC8vIGFybjpwYXJ0aXRpb246c2VydmljZTpyZWdpb246YWNjb3VudDpyZXNvdXJjZTpyZXNvdXJjZU5hbWVcbiAgLy8gYXJuOnBhcnRpdGlvbjpzZXJ2aWNlOnJlZ2lvbjphY2NvdW50OnJlc291cmNlL3Jlc291cmNlTmFtZVxuICAvLyBhcm46cGFydGl0aW9uOnNlcnZpY2U6cmVnaW9uOmFjY291bnQ6L3Jlc291cmNlL3Jlc291cmNlTmFtZVxuXG4gIGNvbnN0IGNvbXBvbmVudHMgPSBGbi5zcGxpdHYyKFwiOlwiLCBhcm5Ub2tlbik7XG5cbiAgY29uc3QgcGFydGl0aW9uID0gRm4uc2VsZWN0KDEsIGNvbXBvbmVudHMpLnRvU3RyaW5nKCk7XG4gIGNvbnN0IHNlcnZpY2UgPSBGbi5zZWxlY3QoMiwgY29tcG9uZW50cykudG9TdHJpbmcoKTtcbiAgY29uc3QgcmVnaW9uID0gRm4uc2VsZWN0KDMsIGNvbXBvbmVudHMpLnRvU3RyaW5nKCk7XG4gIGNvbnN0IGFjY291bnQgPSBGbi5zZWxlY3QoNCwgY29tcG9uZW50cykudG9TdHJpbmcoKTtcbiAgbGV0IHJlc291cmNlOiBzdHJpbmc7XG4gIGxldCByZXNvdXJjZU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHNlcDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGlmIChcbiAgICBhcm5Gb3JtYXQgPT09IEFybkZvcm1hdC5OT19SRVNPVVJDRV9OQU1FIHx8XG4gICAgYXJuRm9ybWF0ID09PSBBcm5Gb3JtYXQuQ09MT05fUkVTT1VSQ0VfTkFNRVxuICApIHtcbiAgICAvLyB3ZSBrbm93IHRoYXQgdGhlICdyZXNvdXJjZScgcGFydCB3aWxsIGFsd2F5cyBiZSB0aGUgNnRoIHNlZ21lbnQgaW4gdGhpcyBjYXNlXG4gICAgcmVzb3VyY2UgPSBGbi5zZWxlY3QoNSwgY29tcG9uZW50cyk7XG4gICAgaWYgKGFybkZvcm1hdCA9PT0gQXJuRm9ybWF0LkNPTE9OX1JFU09VUkNFX05BTUUpIHtcbiAgICAgIHJlc291cmNlTmFtZSA9IEZuLnNlbGVjdCg2LCBjb21wb25lbnRzKTtcbiAgICAgIHNlcCA9IFwiOlwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNvdXJjZU5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICBzZXAgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIHdlIGtub3cgdGhhdCB0aGUgJ3Jlc291cmNlJyBhbmQgJ3Jlc291cmNlTmFtZScgcGFydHMgYXJlIHNlcGFyYXRlZCBieSBzbGFzaCBoZXJlLFxuICAgIC8vIHNvIHdlIHNwbGl0IHRoZSA2dGggc2VnbWVudCBmcm9tIHRoZSBjb2xvbi1zZXBhcmF0ZWQgb25lcyB3aXRoIGEgc2xhc2hcbiAgICBjb25zdCBsYXN0Q29tcG9uZW50cyA9IEZuLnNwbGl0KFwiL1wiLCBGbi5zZWxlY3QoNSwgY29tcG9uZW50cykpO1xuXG4gICAgaWYgKGFybkZvcm1hdCA9PT0gQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUpIHtcbiAgICAgIHJlc291cmNlID0gRm4uc2VsZWN0KDAsIGxhc3RDb21wb25lbnRzKTtcbiAgICAgIHJlc291cmNlTmFtZSA9IEZuLnNlbGVjdCgxLCBsYXN0Q29tcG9uZW50cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGFybkZvcm1hdCBpcyBBcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfU0xBU0hfUkVTT1VSQ0VfTkFNRSxcbiAgICAgIC8vIHdoaWNoIG1lYW5zIHRoZXJlJ3MgYW4gZXh0cmEgc2xhc2ggdGhlcmUgYXQgdGhlIGJlZ2lubmluZyB0aGF0IHdlIG5lZWQgdG8gc2tpcFxuICAgICAgcmVzb3VyY2UgPSBGbi5zZWxlY3QoMSwgbGFzdENvbXBvbmVudHMpO1xuICAgICAgcmVzb3VyY2VOYW1lID0gRm4uc2VsZWN0KDIsIGxhc3RDb21wb25lbnRzKTtcbiAgICB9XG4gICAgc2VwID0gXCIvXCI7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBhcnRpdGlvbixcbiAgICBzZXJ2aWNlLFxuICAgIHJlZ2lvbixcbiAgICBhY2NvdW50LFxuICAgIHJlc291cmNlLFxuICAgIHJlc291cmNlTmFtZSxcbiAgICBzZXAsXG4gICAgYXJuRm9ybWF0LFxuICB9O1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgYSBzdHJpbmcgaXMgZWl0aGVyIHVucGFyc2VhYmxlIG9yIGxvb2tzIG1vc3RseSBsaWtlIGFuIEFSTlxuICovXG5mdW5jdGlvbiBwYXJzZUFyblNoYXBlKGFybjogc3RyaW5nKTogXCJ0b2tlblwiIHwgc3RyaW5nW10ge1xuICAvLyBhc3N1bWUgYW55dGhpbmcgdGhhdCBzdGFydHMgd2l0aCAnYXJuOicgaXMgYW4gQVJOLFxuICAvLyBzbyB3ZSBjYW4gcmVwb3J0IGJldHRlciBlcnJvcnNcbiAgY29uc3QgbG9va3NMaWtlQXJuID0gYXJuLnN0YXJ0c1dpdGgoXCJhcm46XCIpO1xuXG4gIGlmICghbG9va3NMaWtlQXJuKSB7XG4gICAgaWYgKGNka3RmLlRva2VuLmlzVW5yZXNvbHZlZChhcm4pKSB7XG4gICAgICByZXR1cm4gXCJ0b2tlblwiO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBBUk5zIG11c3Qgc3RhcnQgd2l0aCBcImFybjpcIiBhbmQgaGF2ZSBhdCBsZWFzdCA2IGNvbXBvbmVudHM6ICR7YXJufWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIElmIHRoZSBBUk4gbWVyZWx5IGNvbnRhaW5zIFRva2VucywgYnV0IG90aGVyd2lzZSAqbG9va3MqIG1vc3RseSBsaWtlIGFuIEFSTixcbiAgLy8gaXQncyBhIHN0cmluZyBvZiB0aGUgZm9ybSAnYXJuOiR7cGFydGl0aW9ufTpzZXJ2aWNlOiR7cmVnaW9ufToke2FjY291bnR9OnJlc291cmNlL3h5eicuXG4gIC8vIFBhcnNlIGZpZWxkcyBvdXQgdG8gdGhlIGJlc3Qgb2Ygb3VyIGFiaWxpdHkuXG4gIC8vIFRva2VucyB3b24ndCBjb250YWluIFwiOlwiLCBzbyB0aGlzIHdvbid0IGJyZWFrIHRoZW0uXG4gIGNvbnN0IGNvbXBvbmVudHMgPSBhcm4uc3BsaXQoXCI6XCIpO1xuXG4gIGNvbnN0IHBhcnRpdGlvbiA9IGNvbXBvbmVudHMubGVuZ3RoID4gMSA/IGNvbXBvbmVudHNbMV0gOiB1bmRlZmluZWQ7XG4gIGlmICghcGFydGl0aW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJUaGUgYHBhcnRpdGlvbmAgY29tcG9uZW50ICgybmQgY29tcG9uZW50KSBvZiBhbiBBUk4gaXMgcmVxdWlyZWQ6IFwiICsgYXJuLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBzZXJ2aWNlID0gY29tcG9uZW50cy5sZW5ndGggPiAyID8gY29tcG9uZW50c1syXSA6IHVuZGVmaW5lZDtcbiAgaWYgKCFzZXJ2aWNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJUaGUgYHNlcnZpY2VgIGNvbXBvbmVudCAoM3JkIGNvbXBvbmVudCkgb2YgYW4gQVJOIGlzIHJlcXVpcmVkOiBcIiArIGFybixcbiAgICApO1xuICB9XG5cbiAgY29uc3QgcmVzb3VyY2UgPSBjb21wb25lbnRzLmxlbmd0aCA+IDUgPyBjb21wb25lbnRzWzVdIDogdW5kZWZpbmVkO1xuICBpZiAoIXJlc291cmNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJUaGUgYHJlc291cmNlYCBjb21wb25lbnQgKDZ0aCBjb21wb25lbnQpIG9mIGFuIEFSTiBpcyByZXF1aXJlZDogXCIgKyBhcm4sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlZ2lvbiBjYW4gYmUgbWlzc2luZyBpbiBnbG9iYWwgQVJOcyAoc3VjaCBhcyB1c2VkIGJ5IElBTSlcblxuICAvLyBBY2NvdW50IGNhbiBiZSBtaXNzaW5nIGluIHNvbWUgQVJOIHR5cGVzIChzdWNoIGFzIHVzZWQgZm9yIFMzIGJ1Y2tldHMpXG5cbiAgcmV0dXJuIGNvbXBvbmVudHM7XG59XG4iXX0=
@@ -219,7 +219,7 @@ class AwsAssetManager {
219
219
  }
220
220
  exports.AwsAssetManager = AwsAssetManager;
221
221
  _a = JSII_RTTI_SYMBOL_1;
222
- AwsAssetManager[_a] = { fqn: "terraconstructs.aws.AwsAssetManager", version: "0.1.9" };
222
+ AwsAssetManager[_a] = { fqn: "terraconstructs.aws.AwsAssetManager", version: "0.2.0" };
223
223
  /**
224
224
  * Convert the Docker cache options to a format suitable for the buildx cacheFrom flag.
225
225
  */
@@ -60,5 +60,5 @@ class AwsConstructBase extends construct_base_1.TerraConstructBase {
60
60
  }
61
61
  exports.AwsConstructBase = AwsConstructBase;
62
62
  _a = JSII_RTTI_SYMBOL_1;
63
- AwsConstructBase[_a] = { fqn: "terraconstructs.aws.AwsConstructBase", version: "0.1.9" };
63
+ AwsConstructBase[_a] = { fqn: "terraconstructs.aws.AwsConstructBase", version: "0.2.0" };
64
64
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWNvbnN0cnVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hd3MvYXdzLWNvbnN0cnVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLCtCQUFrQztBQUNsQywyQ0FBdUM7QUFDdkMsc0RBQXNEO0FBQ3RELHNEQUkyQjtBQUUzQixrR0FBa0c7QUFDbEcsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0FBc0YzRSx3QkFBd0I7QUFDeEIsUUFBUTtBQUNSLDBEQUEwRDtBQUMxRCxRQUFRO0FBQ1IsOEJBQThCO0FBQzlCLFFBQVE7QUFDUix3RUFBd0U7QUFDeEUsUUFBUTtBQUNSLCtDQUErQztBQUMvQyxRQUFRO0FBQ1IseURBQXlEO0FBQ3pELFFBQVE7QUFDUiwrQkFBK0I7QUFDL0IsUUFBUTtBQUNSLGtEQUFrRDtBQUNsRCxRQUFRO0FBQ1IsNEJBQTRCO0FBQzVCLGtDQUFrQztBQUNsQyxJQUFJO0FBRUosbUdBQW1HO0FBRW5HOztHQUVHO0FBQ0gsTUFBc0IsZ0JBQ3BCLFNBQVEsbUNBQWtCO0lBSzFCLDZDQUE2QztJQUU3QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLFFBQTJCLEVBQUU7UUFDckUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsSUFDRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDO1lBQzNELEtBQUssQ0FBQyxrQkFBa0IsS0FBSyxTQUFTLEVBQ3RDLENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUNiLDZDQUE2QyxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxNQUFNLCtCQUErQixLQUFLLENBQUMsa0JBQWtCLEdBQUcsQ0FDckksQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUU5RCxJQUFJLENBQUMsS0FBSyxHQUFHLG9CQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTNDLHVDQUF1QztRQUN2QyxzQkFBc0I7UUFDdEIsb0JBQW9CO1FBQ3BCLGdCQUFnQjtRQUNoQixLQUFLO1FBQ0wsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLGtCQUFrQjtZQUN4QyxDQUFDLENBQUMsNkVBQTZFO2dCQUM3RSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FDakIsS0FBSyxDQUFDLGtCQUFrQixFQUN4QixlQUFTLENBQUMsZ0JBQWdCLENBQzNCO1lBQ0gsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNkLElBQUksQ0FBQyxHQUFHLEdBQUc7WUFDVCxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVM7WUFDdkQsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLElBQUksU0FBUyxFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU87WUFDbEUsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLElBQUksU0FBUyxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU07U0FDL0QsQ0FBQztJQUNKLENBQUM7O0FBekNILDRDQTBDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBBcm5Gb3JtYXQgfSBmcm9tIFwiLi9hcm5cIjtcbmltcG9ydCB7IEF3c1N0YWNrIH0gZnJvbSBcIi4vYXdzLXN0YWNrXCI7XG4vLyBpbXBvcnQgeyBUYWdNYW5hZ2VyLCBBd3NUYWcgfSBmcm9tIFwiLi90YWctbWFuYWdlclwiO1xuaW1wb3J0IHtcbiAgVGVycmFDb25zdHJ1Y3RCYXNlLFxuICBUZXJyYUNvbnN0cnVjdFByb3BzLFxuICBJVGVycmFDb25zdHJ1Y3QsXG59IGZyb20gXCIuLi9jb25zdHJ1Y3QtYmFzZVwiO1xuXG4vLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE1MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2NvcmUvbGliL3Jlc291cmNlLnRzI0wxNVxuY29uc3QgUkVTT1VSQ0VfU1lNQk9MID0gU3ltYm9sLmZvcihcInRlcnJhY29uc3RydWN0cy9saWIvYXdzLkF3c0NvbnN0cnVjdFwiKTtcblxuLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNTAuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9jb3JlL2xpYi9yZXNvdXJjZS50cyNMMjFcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBlbnZpcm9ubWVudCBhIGdpdmVuIEF3c0NvbnN0cnVjdCBsaXZlcyBpbi5cbiAqIFVzZWQgYXMgdGhlIHJldHVybiB2YWx1ZSBmb3IgdGhlIGBJUmVzb3VyY2UuZW52YCBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBd3NFbnZpcm9ubWVudCB7XG4gIC8qKlxuICAgKiBUaGUgQVdTIHBhcnRpdGlvbiB0aGF0IHRoaXMgcmVzb3VyY2UgYmVsb25ncyB0by5cbiAgICovXG4gIHJlYWRvbmx5IHBhcnRpdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQVdTIGFjY291bnQgSUQgdGhhdCB0aGlzIHJlc291cmNlIGJlbG9uZ3MgdG8uXG4gICAqL1xuICByZWFkb25seSBhY2NvdW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBV1MgcmVnaW9uIHRoYXQgdGhpcyByZXNvdXJjZSBiZWxvbmdzIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9uOiBzdHJpbmc7XG59XG5cbi8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTUwLjAvcGFja2FnZXMvYXdzLWNkay1saWIvY29yZS9saWIvcmVzb3VyY2UudHMjTDQ0XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBBV1MgcmVzb3VyY2Ugc2ltaWxhciB0byB0aGUgQVdTIENESyBgUmVzb3VyY2VgIGNsYXNzIGJ1dCBiYWNrZWQgYnkgQ0RLVEYuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUF3c0NvbnN0cnVjdCBleHRlbmRzIElUZXJyYUNvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBUaGUgc3RhY2sgaW50byB3aGljaCB0aGlzIHJlc291cmNlIGlzIGNvbnN0cnVjdGVkIGJ5IHRoZSBUZXJyYUNvbnN0cnVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrOiBBd3NTdGFjaztcblxuICAvKipcbiAgICogVGhlIGVudmlyb25tZW50IHRoaXMgcmVzb3VyY2UgYmVsb25ncyB0by5cbiAgICogRm9yIHJlc291cmNlcyB0aGF0IGFyZSBjcmVhdGVkIGFuZCBtYW5hZ2VkIGJ5IHRoZSBDREtURlxuICAgKiAoZ2VuZXJhbGx5LCB0aG9zZSBjcmVhdGVkIGJ5IGNyZWF0aW5nIG5ldyBjbGFzcyBpbnN0YW5jZXMgbGlrZSBFbnZpcm9ubWVudCwgRWNzRGVwbG95bWVudCwgZXRjLiksXG4gICAqIHRoaXMgaXMgYWx3YXlzIHRoZSBzYW1lIGFzIHRoZSBlbnZpcm9ubWVudCBvZiB0aGUgc3RhY2sgdGhleSBiZWxvbmcgdG87XG4gICAqIGhvd2V2ZXIsIGZvciBpbXBvcnRlZCByZXNvdXJjZXNcbiAgICogKHRob3NlIG9idGFpbmVkIGZyb20gc3RhdGljIG1ldGhvZHMgbGlrZSBmcm9tUm9sZUFybiwgZnJvbUJ1Y2tldE5hbWUsIGV0Yy4pLFxuICAgKiB0aGF0IG1pZ2h0IGJlIGRpZmZlcmVudCB0aGFuIHRoZSBzdGFjayB0aGV5IHdlcmUgaW1wb3J0ZWQgaW50by5cbiAgICovXG4gIHJlYWRvbmx5IGVudjogQXdzRW52aXJvbm1lbnQ7XG5cbiAgLy8gLyoqXG4gIC8vICAqIFRhZyBNYW5hZ2VyIHdoaWNoIG1hbmFnZXMgdGhlIHRhZ3MgZm9yIHRoaXMgcmVzb3VyY2VcbiAgLy8gICovXG4gIC8vIHJlYWRvbmx5IGNka1RhZ01hbmFnZXI6IFRhZ01hbmFnZXI7XG59XG5cbi8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTUwLjAvcGFja2FnZXMvYXdzLWNkay1saWIvY29yZS9saWIvcmVzb3VyY2UudHMjTDc4XG5cbi8qKlxuICogQ29uc3RydWN0aW9uIHByb3BlcnRpZXMgZm9yIGBSZXNvdXJjZWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXdzQ29uc3RydWN0UHJvcHMgZXh0ZW5kcyBUZXJyYUNvbnN0cnVjdFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBBV1MgYWNjb3VudCBJRCB0aGlzIHJlc291cmNlIGJlbG9uZ3MgdG8uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIHJlc291cmNlIGlzIGluIHRoZSBzYW1lIGFjY291bnQgYXMgdGhlIHN0YWNrIGl0IGJlbG9uZ3MgdG9cbiAgICovXG4gIHJlYWRvbmx5IGFjY291bnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBV1MgcmVnaW9uIHRoaXMgcmVzb3VyY2UgYmVsb25ncyB0by5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgcmVzb3VyY2UgaXMgaW4gdGhlIHNhbWUgcmVnaW9uIGFzIHRoZSBzdGFjayBpdCBiZWxvbmdzIHRvXG4gICAqL1xuICByZWFkb25seSByZWdpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFSTiB0byBkZWR1Y2UgcmVnaW9uIGFuZCBhY2NvdW50IGZyb21cbiAgICpcbiAgICogVGhlIEFSTiBpcyBwYXJzZWQgYW5kIHRoZSBhY2NvdW50IGFuZCByZWdpb24gYXJlIHRha2VuIGZyb20gdGhlIEFSTi5cbiAgICogVGhpcyBzaG91bGQgYmUgdXNlZCBmb3IgaW1wb3J0ZWQgcmVzb3VyY2VzLlxuICAgKlxuICAgKiBDYW5ub3QgYmUgc3VwcGxpZWQgdG9nZXRoZXIgd2l0aCBlaXRoZXIgYGFjY291bnRgIG9yIGByZWdpb25gLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRha2UgZW52aXJvbm1lbnQgZnJvbSBgYWNjb3VudGAsIGByZWdpb25gIHBhcmFtZXRlcnMsIG9yIHVzZSBTdGFjayBlbnZpcm9ubWVudC5cbiAgICovXG4gIHJlYWRvbmx5IGVudmlyb25tZW50RnJvbUFybj86IHN0cmluZztcbn1cblxuLy8gZXhwb3J0IGVudW0gVGFnVHlwZSB7XG4vLyAgIC8qKlxuLy8gICAgKiBTdGFuZGFyZCB0YWdzIGFyZSBhIGxpc3Qgb2YgeyBrZXksIHZhbHVlIH0gb2JqZWN0c1xuLy8gICAgKi9cbi8vICAgU1RBTkRBUkQgPSBcIlN0YW5kYXJkVGFnXCIsXG4vLyAgIC8qKlxuLy8gICAgKiBBU0cgdGFncyBhcmUgYSBsaXN0IG9mIHsga2V5LCB2YWx1ZSwgcHJvcGFnYXRlQXRMYXVuY2ggfSBvYmplY3RzXG4vLyAgICAqL1xuLy8gICBBVVRPU0NBTElOR19HUk9VUCA9IFwiQXV0b1NjYWxpbmdHcm91cFRhZ1wiLFxuLy8gICAvKipcbi8vICAgICogU29tZSBjb25zdHJ1Y3RzIHVzZSBhIHsga2V5OiB2YWx1ZSB9IG1hcCBmb3IgdGFnc1xuLy8gICAgKi9cbi8vICAgTUFQID0gXCJTdHJpbmdUb1N0cmluZ01hcFwiLFxuLy8gICAvKipcbi8vICAgICogU3RhY2tUYWdzIGFyZSBvZiB0aGUgZm9ybWF0IHsga2V5OiB2YWx1ZSB9XG4vLyAgICAqL1xuLy8gICBLRVlfVkFMVUUgPSBcIktleVZhbHVlXCIsXG4vLyAgIE5PVF9UQUdHQUJMRSA9IFwiTm90VGFnZ2FibGVcIixcbi8vIH1cblxuLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNTAuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9jb3JlL2xpYi9yZXNvdXJjZS50cyNMMTIyXG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBBV1MgcmVzb3VyY2Ugc2ltaWxhciB0byB0aGUgQVdTIENESyBgUmVzb3VyY2VgIGNsYXNzIGJ1dCBiYWNrZWQgYnkgQ0RLVEYuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBd3NDb25zdHJ1Y3RCYXNlXG4gIGV4dGVuZHMgVGVycmFDb25zdHJ1Y3RCYXNlXG4gIGltcGxlbWVudHMgSUF3c0NvbnN0cnVjdFxue1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhY2s6IEF3c1N0YWNrO1xuICBwdWJsaWMgcmVhZG9ubHkgZW52OiBBd3NFbnZpcm9ubWVudDtcbiAgLy8gcHVibGljIHJlYWRvbmx5IGNka1RhZ01hbmFnZXI6IFRhZ01hbmFnZXI7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEF3c0NvbnN0cnVjdFByb3BzID0ge30pIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIGlmIChcbiAgICAgIChwcm9wcy5hY2NvdW50ICE9PSB1bmRlZmluZWQgfHwgcHJvcHMucmVnaW9uICE9PSB1bmRlZmluZWQpICYmXG4gICAgICBwcm9wcy5lbnZpcm9ubWVudEZyb21Bcm4gIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgU3VwcGx5IGF0IG1vc3Qgb25lIG9mICdhY2NvdW50Jy8ncmVnaW9uJyAoJHtwcm9wcy5hY2NvdW50fS8ke3Byb3BzLnJlZ2lvbn0pIGFuZCAnZW52aXJvbm1lbnRGcm9tQXJuJyAoJHtwcm9wcy5lbnZpcm9ubWVudEZyb21Bcm59KWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBSRVNPVVJDRV9TWU1CT0wsIHsgdmFsdWU6IHRydWUgfSk7XG5cbiAgICB0aGlzLnN0YWNrID0gQXdzU3RhY2sub2ZBd3NDb25zdHJ1Y3QodGhpcyk7XG5cbiAgICAvLyB0aGlzLmNka1RhZ01hbmFnZXIgPSBuZXcgVGFnTWFuYWdlcihcbiAgICAvLyAgIFRhZ1R5cGUuU1RBTkRBUkQsXG4gICAgLy8gICBcIkF3c0NvbnN0cnVjdFwiLFxuICAgIC8vICAgcHJvcHMudGFncyxcbiAgICAvLyApO1xuICAgIGNvbnN0IHBhcnNlZEFybiA9IHByb3BzLmVudmlyb25tZW50RnJvbUFyblxuICAgICAgPyAvLyBTaW5jZSB3ZSBvbmx5IHdhbnQgdGhlIHJlZ2lvbiBhbmQgYWNjb3VudCwgTk9fUkVTT1VSQ0VfTkFNRSBpcyBnb29kIGVub3VnaFxuICAgICAgICB0aGlzLnN0YWNrLnNwbGl0QXJuKFxuICAgICAgICAgIHByb3BzLmVudmlyb25tZW50RnJvbUFybixcbiAgICAgICAgICBBcm5Gb3JtYXQuTk9fUkVTT1VSQ0VfTkFNRSxcbiAgICAgICAgKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5lbnYgPSB7XG4gICAgICBwYXJ0aXRpb246IHBhcnNlZEFybj8ucGFydGl0aW9uID8/IHRoaXMuc3RhY2sucGFydGl0aW9uLFxuICAgICAgYWNjb3VudDogcHJvcHMuYWNjb3VudCA/PyBwYXJzZWRBcm4/LmFjY291bnQgPz8gdGhpcy5zdGFjay5hY2NvdW50LFxuICAgICAgcmVnaW9uOiBwcm9wcy5yZWdpb24gPz8gcGFyc2VkQXJuPy5yZWdpb24gPz8gdGhpcy5zdGFjay5yZWdpb24sXG4gICAgfTtcbiAgfVxufVxuIl19
@@ -11,7 +11,7 @@ export interface AwsStackProps extends StackBaseProps {
11
11
  /**
12
12
  * The AWS Provider configuration (without the alias field)
13
13
  */
14
- readonly providerConfig: AwsProviderConfig;
14
+ readonly providerConfig?: AwsProviderConfig;
15
15
  /**
16
16
  * Asset manager for handling file and Docker image assets
17
17
  *
@@ -74,8 +74,8 @@ export declare class AwsStack extends StackBase implements IAwsStack {
74
74
  /**
75
75
  * Asset manager for handling file and Docker image assets
76
76
  */
77
- private readonly assetManager;
78
- private readonly lookup;
77
+ private _assetManager?;
78
+ private _lookup?;
79
79
  private regionalAwsProviders;
80
80
  /**
81
81
  * Cache these tokens for reliable comparisons.
@@ -89,10 +89,14 @@ export declare class AwsStack extends StackBase implements IAwsStack {
89
89
  * - https://github.com/hashicorp/terraform-cdk/blob/v0.20.10/packages/cdktf/lib/terraform-data-source.ts#L68
90
90
  * - https://github.com/hashicorp/terraform-cdk/blob/v0.20.10/packages/cdktf/lib/tokens/private/token-map.ts#L50-L66
91
91
  */
92
+ private readonly _providerConfig;
93
+ private readonly _assetOptions;
92
94
  private _accountIdToken;
93
95
  private _paritionToken;
94
96
  private _urlSuffixToken;
95
- constructor(scope: Construct, id: string, props: AwsStackProps);
97
+ constructor(scope?: Construct, id?: string, props?: AwsStackProps);
98
+ private get lookup();
99
+ private get assetManager();
96
100
  get provider(): provider.AwsProvider;
97
101
  /**
98
102
  * Get the Region of the AWS Stack
@@ -233,4 +237,24 @@ export declare class AwsStack extends StackBase implements IAwsStack {
233
237
  * Register a docker image asset on this Stack
234
238
  */
235
239
  addDockerImageAsset(asset: DockerImageAssetSource): DockerImageAssetLocation;
240
+ /**
241
+ * Look up a fact value for the given fact for the region of this stack
242
+ *
243
+ * Will return a definite value only if the region of the current stack is resolved.
244
+ * If not, a lookup map will be added to the stack and the lookup will be done at
245
+ * CDK deployment time.
246
+ *
247
+ * What regions will be included in the lookup map is controlled by the
248
+ * `terraconstructs/core:target-partitions` context value: it must be set to a list
249
+ * of partitions, and only regions from the given partitions will be included.
250
+ * If no such context key is set, all regions will be included.
251
+ *
252
+ * This function is intended to be used by construct library authors. Application
253
+ * builders can rely on the abstractions offered by construct libraries and do
254
+ * not have to worry about regional facts.
255
+ *
256
+ * If `defaultValue` is not given, it is an error if the fact is unknown for
257
+ * the given region.
258
+ */
259
+ regionalFact(factName: string, defaultValue?: string): string;
236
260
  }
@@ -3,13 +3,17 @@ var _a;
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.AwsStack = void 0;
5
5
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const region_info_1 = require("@aws-cdk/region-info");
6
7
  const provider_aws_1 = require("@cdktf/provider-aws");
7
8
  const cdktf_1 = require("cdktf");
8
9
  const arn_1 = require("./arn");
9
- const terraform_dependables_aspect_1 = require("../private/terraform-dependables-aspect");
10
+ const cxapi = require("./cx-api");
10
11
  const stack_base_1 = require("../stack-base");
11
12
  const aws_asset_manager_1 = require("./aws-asset-manager");
12
13
  const util_1 = require("./util");
14
+ const errors_1 = require("../errors");
15
+ const region_lookup_1 = require("./region-lookup");
16
+ const terraform_dependables_aspect_1 = require("../private/terraform-dependables-aspect");
13
17
  // import { TagType } from "./aws-construct";
14
18
  // import { TagManager, ITaggableV2 } from "./tag-manager";
15
19
  const AWS_STACK_SYMBOL = Symbol.for("terraconstructs/lib/aws.AwsStack");
@@ -36,9 +40,9 @@ class AwsStack extends stack_base_1.StackBase {
36
40
  if (AwsStack.isAwsStack(s)) {
37
41
  return s;
38
42
  }
39
- throw new Error(`Resource '${construct.constructor?.name}' at '${construct.node.path}' should be created in the scope of an AwsStack, but no AwsStack found`);
43
+ throw new errors_1.ValidationError(`Resource '${construct.constructor?.name}' at '${construct.node.path}' should be created in the scope of an AwsStack, but no AwsStack found`, construct);
40
44
  }
41
- constructor(scope, id, props) {
45
+ constructor(scope, id, props = {}) {
42
46
  super(scope, id, props);
43
47
  this.regionalAwsProviders = {};
44
48
  // this.cdkTagManager = new TagManager(
@@ -46,26 +50,34 @@ class AwsStack extends stack_base_1.StackBase {
46
50
  // "cdktf:stack",
47
51
  // props.providerConfig.defaultTags,
48
52
  // );
49
- this.lookup = {
53
+ this._providerConfig = props.providerConfig;
54
+ this._assetOptions = props.assetOptions;
55
+ this._assetManager = props.assetManager;
56
+ // these should never depend on anything (HACK to avoid cycles)
57
+ Object.defineProperty(this, AWS_STACK_SYMBOL, { value: true });
58
+ }
59
+ get lookup() {
60
+ // Initialize default AWS provider
61
+ this._lookup ?? (this._lookup = {
50
62
  awsProvider: new provider_aws_1.provider.AwsProvider(this, "defaultAwsProvider", {
51
63
  // defaultTags: this.cdkTagManager.renderedTags,
52
- ...props.providerConfig,
64
+ ...(this._providerConfig ?? {}),
53
65
  }),
54
66
  dataAwsServicePrincipals: {},
55
- };
56
- // these should never depend on anything (HACK to avoid cycles)
57
- Object.defineProperty(this, AWS_STACK_SYMBOL, { value: true });
67
+ });
68
+ return this._lookup;
69
+ }
70
+ get assetManager() {
58
71
  // Initialize asset manager
59
- this.assetManager =
60
- props.assetManager ??
61
- new aws_asset_manager_1.AwsAssetManager(this, {
62
- region: this.region,
63
- account: this.account,
64
- partition: this.partition,
65
- urlSuffix: this.urlSuffix,
66
- qualifier: this.gridUUID,
67
- ...(props.assetOptions || {}),
68
- });
72
+ this._assetManager ?? (this._assetManager = new aws_asset_manager_1.AwsAssetManager(this, {
73
+ region: this.region,
74
+ account: this.account,
75
+ partition: this.partition,
76
+ urlSuffix: this.urlSuffix,
77
+ qualifier: this.gridUUID,
78
+ ...(this._assetOptions || {}),
79
+ }));
80
+ return this._assetManager;
69
81
  }
70
82
  get provider() {
71
83
  return this.lookup.awsProvider;
@@ -188,8 +200,8 @@ class AwsStack extends stack_base_1.StackBase {
188
200
  region = DEFAULT_REGION_KEY;
189
201
  }
190
202
  if (cdktf_1.Token.isUnresolved(region)) {
191
- throw new Error("Cannot determine the service principal ID because the region is a token. " +
192
- "You must specify the region explicitly.");
203
+ throw new errors_1.ValidationError("Cannot determine the service principal ID because the region is a token. " +
204
+ "You must specify the region explicitly.", this);
193
205
  }
194
206
  // if full service name is provided, extract just the service name
195
207
  // for supported cases (as required by Terraform aws_service_principal Data Source)
@@ -330,8 +342,54 @@ class AwsStack extends stack_base_1.StackBase {
330
342
  addDockerImageAsset(asset) {
331
343
  return this.assetManager.addDockerImageAsset(asset);
332
344
  }
345
+ // /**
346
+ // * Resolve a tokenized value in the context of the current stack.
347
+ // */
348
+ // public resolve<T>(obj: T): T {
349
+ // // ref: https://github.com/hashicorp/terraform-cdk/blob/v0.20.7/packages/cdktf/lib/terraform-stack.ts#L151
350
+ // // ref: https://github.com/aws/aws-cdk/blob/v2.150.0/packages/aws-cdk-lib/core/lib/stack.ts#L572
351
+ // return resolve(this, obj);
352
+ // }
353
+ /**
354
+ * Look up a fact value for the given fact for the region of this stack
355
+ *
356
+ * Will return a definite value only if the region of the current stack is resolved.
357
+ * If not, a lookup map will be added to the stack and the lookup will be done at
358
+ * CDK deployment time.
359
+ *
360
+ * What regions will be included in the lookup map is controlled by the
361
+ * `terraconstructs/core:target-partitions` context value: it must be set to a list
362
+ * of partitions, and only regions from the given partitions will be included.
363
+ * If no such context key is set, all regions will be included.
364
+ *
365
+ * This function is intended to be used by construct library authors. Application
366
+ * builders can rely on the abstractions offered by construct libraries and do
367
+ * not have to worry about regional facts.
368
+ *
369
+ * If `defaultValue` is not given, it is an error if the fact is unknown for
370
+ * the given region.
371
+ */
372
+ regionalFact(factName, defaultValue) {
373
+ if (!cdktf_1.Token.isUnresolved(this.region)) {
374
+ const ret = region_info_1.Fact.find(this.region, factName) ?? defaultValue;
375
+ if (ret === undefined) {
376
+ throw new errors_1.ValidationError(`region-info: don't know ${factName} for region ${this.region}. Use 'Fact.register' to provide this value.`, this);
377
+ }
378
+ return ret;
379
+ }
380
+ const partitions = this.node.tryGetContext(cxapi.TARGET_PARTITIONS);
381
+ if (partitions !== undefined &&
382
+ partitions !== "undefined" &&
383
+ !Array.isArray(partitions)) {
384
+ throw new errors_1.ValidationError(`Context value '${cxapi.TARGET_PARTITIONS}' should be a list of strings, got: ${JSON.stringify(partitions)}`, this);
385
+ }
386
+ const lookupMap = partitions !== undefined && partitions !== "undefined"
387
+ ? region_info_1.RegionInfo.limitedRegionMap(factName, partitions)
388
+ : region_info_1.RegionInfo.regionMap(factName);
389
+ return (0, region_lookup_1.deployTimeLookup)(this, factName, lookupMap, defaultValue);
390
+ }
333
391
  }
334
392
  exports.AwsStack = AwsStack;
335
393
  _a = JSII_RTTI_SYMBOL_1;
336
- AwsStack[_a] = { fqn: "terraconstructs.aws.AwsStack", version: "0.1.9" };
337
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLXN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F3cy9hd3Mtc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxzREFPNkI7QUFDN0IsaUNBTWU7QUFFZiwrQkFBc0Q7QUFTdEQsMEZBQXNGO0FBQ3RGLDhDQUFrRTtBQUNsRSwyREFBOEU7QUFDOUUsaUNBQStDO0FBQy9DLDZDQUE2QztBQUM3QywyREFBMkQ7QUFFM0QsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7QUE0RXhFOztHQUVHO0FBQ0gsTUFBYSxRQUFTLFNBQVEsc0JBQVM7SUFDckMsZ0dBQWdHO0lBRWhHOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQU07UUFDN0IsT0FBTyxDQUFDLEtBQUssSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxnQkFBZ0IsSUFBSSxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVELGdHQUFnRztJQUVoRzs7O09BR0c7SUFDSSxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQXFCO1FBQ2hELE1BQU0sQ0FBQyxHQUFHLHNCQUFjLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzNCLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQ2IsYUFBYSxTQUFTLENBQUMsV0FBVyxFQUFFLElBQUksU0FBUyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksd0VBQXdFLENBQzdJLENBQUM7SUFDSixDQUFDO0lBK0JELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBb0I7UUFDNUQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFuQmxCLHlCQUFvQixHQUErQyxFQUFF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O1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksWUFBWSxDQUFDLEtBQXNCO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVEOztPQUVHO0lBQ0ksbUJBQW1CLENBQ3hCLEtBQTZCO1FBRTdCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0RCxDQUFDOztBQTlZSCw0QkF3WkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBkYXRhQXdzQXZhaWxhYmlsaXR5Wm9uZXMsXG4gIGRhdGFBd3NDYWxsZXJJZGVudGl0eSxcbiAgZGF0YUF3c1BhcnRpdGlvbixcbiAgZGF0YUF3c1JlZ2lvbixcbiAgZGF0YUF3c1NlcnZpY2VQcmluY2lwYWwsXG4gIHByb3ZpZGVyLFxufSBmcm9tIFwiQGNka3RmL3Byb3ZpZGVyLWF3c1wiO1xuaW1wb3J0IHtcbiAgVGVycmFmb3JtU3RhY2ssXG4gIFRlcnJhZm9ybUl0ZXJhdG9yLFxuICBUb2tlbixcbiAgRm4sXG4gIFJlc291cmNlVGVycmFmb3JtSXRlcmF0b3IsXG59IGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0LCBJQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IEFybiwgQXJuQ29tcG9uZW50cywgQXJuRm9ybWF0IH0gZnJvbSBcIi4vYXJuXCI7XG5pbXBvcnQgeyBBd3NQcm92aWRlckNvbmZpZyB9IGZyb20gXCIuL3Byb3ZpZGVyLWNvbmZpZy5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IElBc3NldE1hbmFnZXIgfSBmcm9tIFwiLi4vYXNzZXQtbWFuYWdlclwiO1xuaW1wb3J0IHtcbiAgRG9ja2VySW1hZ2VBc3NldExvY2F0aW9uLFxuICBEb2NrZXJJbWFnZUFzc2V0U291cmNlLFxuICBGaWxlQXNzZXRMb2NhdGlvbixcbiAgRmlsZUFzc2V0U291cmNlLFxufSBmcm9tIFwiLi4vYXNzZXRzXCI7XG5pbXBvcnQgeyBTS0lQX0RFUEVOREVOQ1lfUFJPUEFHQVRJT04gfSBmcm9tIFwiLi4vcHJpdmF0ZS90ZXJyYWZvcm0tZGVwZW5kYWJsZXMtYXNwZWN0XCI7XG5pbXBvcnQgeyBTdGFja0Jhc2VQcm9wcywgU3RhY2tCYXNlLCBJU3RhY2sgfSBmcm9tIFwiLi4vc3RhY2stYmFzZVwiO1xuaW1wb3J0IHsgQXdzQXNzZXRNYW5hZ2VyT3B0aW9ucywgQXdzQXNzZXRNYW5hZ2VyIH0gZnJvbSBcIi4vYXdzLWFzc2V0LW1hbmFnZXJcIjtcbmltcG9ydCB7IHRvVGVycmFmb3JtSWRlbnRpZmllciB9IGZyb20gXCIuL3V0aWxcIjtcbi8vIGltcG9ydCB7IFRhZ1R5cGUgfSBmcm9tIFwiLi9hd3MtY29uc3RydWN0XCI7XG4vLyBpbXBvcnQgeyBUYWdNYW5hZ2VyLCBJVGFnZ2FibGVWMiB9IGZyb20gXCIuL3RhZy1tYW5hZ2VyXCI7XG5cbmNvbnN0IEFXU19TVEFDS19TWU1CT0wgPSBTeW1ib2wuZm9yKFwidGVycmFjb25zdHJ1Y3RzL2xpYi9hd3MuQXdzU3RhY2tcIik7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXdzU3RhY2tQcm9wcyBleHRlbmRzIFN0YWNrQmFzZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBBV1MgUHJvdmlkZXIgY29uZmlndXJhdGlvbiAod2l0aG91dCB0aGUgYWxpYXMgZmllbGQpXG4gICAqL1xuICByZWFkb25seSBwcm92aWRlckNvbmZpZzogQXdzUHJvdmlkZXJDb25maWc7XG5cbiAgLyoqXG4gICAqIEFzc2V0IG1hbmFnZXIgZm9yIGhhbmRsaW5nIGZpbGUgYW5kIERvY2tlciBpbWFnZSBhc3NldHNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBBd3NBc3NldE1hbmFnZXIgd2l0aCBkZWZhdWx0IHNldHRpbmdzXG4gICAqL1xuICByZWFkb25seSBhc3NldE1hbmFnZXI/OiBJQXNzZXRNYW5hZ2VyO1xuXG4gIC8qKlxuICAgKiBBc3NldCBNYW5hZ2VtZW50IG9wdGlvbnNcbiAgICpcbiAgICogVXNlIHRoaXMgdG8gcmVmZXJlbmNlIGV4aXN0aW5nIFMzIEJ1Y2tldCBhbmQgRUNSIFJlcG9zaXRvcnkgZm9yIGFzc2V0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBTdGFjayBjcmVhdGVzIEJ1Y2tldCBhbmQgUmVwb3NpdG9yeSBvbiBkZW1hbmRcbiAgICovXG4gIHJlYWRvbmx5IGFzc2V0T3B0aW9ucz86IEF3c0Fzc2V0TWFuYWdlck9wdGlvbnM7XG59XG5cbi8vIFRPRE86IFJlLWFkZCBJVGFnZ2FibGVWMlxuZXhwb3J0IGludGVyZmFjZSBJQXdzU3RhY2sgZXh0ZW5kcyBJU3RhY2sge1xuICAvKipcbiAgICogVGhlIEFXUyBSZWdpb24gZm9yIHRoZSBUZXJyYUNvbnN0cnVjdFxuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgQVdTIEFjY291bnQgZm9yIHRoZSBUZXJyYUNvbnN0cnVjdFxuICAgKi9cbiAgcmVhZG9ubHkgYWNjb3VudDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIEFXUyBQYXJ0aXRpb24gZm9yIHRoZSBUZXJyYUNvbnN0cnVjdFxuICAgKi9cbiAgcmVhZG9ubHkgcGFydGl0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2aWNlIFByaW5jaXBhbCBJZCBmb3IgYSBzcGVjaWZpYyBzZXJ2aWNlXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSBUaGUgc2VydmljZSBuYW1lIHRvIGdldCB0aGUgc2VydmljZSBwcmluY2lwYWwgSUQgZm9yXG4gICAqIEBwYXJhbSByZWdpb24gVGhlIHJlZ2lvbiB0byBnZXQgdGhlIHNlcnZpY2UgcHJpbmNpcGFsIElEIGZvclxuICAgKi9cbiAgc2VydmljZVByaW5jaXBhbE5hbWUoc2VydmljZU5hbWU6IHN0cmluZywgcmVnaW9uPzogc3RyaW5nKTogc3RyaW5nO1xuICAvLyAvKipcbiAgLy8gICogUHJvZHVjZSB0aGUgVG9rZW4ncyB2YWx1ZSBhdCByZXNvbHV0aW9uIHRpbWVcbiAgLy8gICovXG4gIC8vIHJlc29sdmU8VD4ob2JqOiBUKTogVDtcblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBmaWxlIGFzc2V0IG9uIHRoaXMgU3RhY2tcbiAgICovXG4gIGFkZEZpbGVBc3NldChhc3NldDogRmlsZUFzc2V0U291cmNlKTogRmlsZUFzc2V0TG9jYXRpb247XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgZG9ja2VyIGltYWdlIGFzc2V0IG9uIHRoaXMgU3RhY2tcbiAgICovXG4gIGFkZERvY2tlckltYWdlQXNzZXQoYXNzZXQ6IERvY2tlckltYWdlQXNzZXRTb3VyY2UpOiBEb2NrZXJJbWFnZUFzc2V0TG9jYXRpb247XG59XG5cbmludGVyZmFjZSBBd3NMb29rdXAge1xuICBhd3NQcm92aWRlcjogcHJvdmlkZXIuQXdzUHJvdmlkZXI7XG4gIGRhdGFBd3NSZWdpb24/OiBkYXRhQXdzUmVnaW9uLkRhdGFBd3NSZWdpb247XG4gIGRhdGFBd3NDYWxsZXJJZGVudGl0eT86IGRhdGFBd3NDYWxsZXJJZGVudGl0eS5EYXRhQXdzQ2FsbGVySWRlbnRpdHk7XG4gIGRhdGFBd3NQYXJ0aXRpb24/OiBkYXRhQXdzUGFydGl0aW9uLkRhdGFBd3NQYXJ0aXRpb247XG4gIGRhdGFBd3NBdmFpbGFiaWxpdHlab25lcz86IGRhdGFBd3NBdmFpbGFiaWxpdHlab25lcy5EYXRhQXdzQXZhaWxhYmlsaXR5Wm9uZXM7XG4gIC8vIEFXUyBTZXJ2aWNlIFByaW5jaXBhbHMgYnkgcmVnaW9uIGFuZCBieSBzZXJ2aWNlXG4gIGRhdGFBd3NTZXJ2aWNlUHJpbmNpcGFsczogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBSZWNvcmQ8c3RyaW5nLCBkYXRhQXdzU2VydmljZVByaW5jaXBhbC5EYXRhQXdzU2VydmljZVByaW5jaXBhbD5cbiAgPjtcbn1cblxuLyoqXG4gKiBBIFRlcnJhZm9ybSBzdGFjayBjb25zdHJhaW5lZCB0byBhIHNpbmdsZSBBV1MgQWNjb3VudC9SZWdpb24gdG8gc2ltdWxhdGUgQ0ZOIGJlaGF2aW9yLlxuICovXG5leHBvcnQgY2xhc3MgQXdzU3RhY2sgZXh0ZW5kcyBTdGFja0Jhc2UgaW1wbGVtZW50cyBJQXdzU3RhY2sge1xuICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE1MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2NvcmUvbGliL3N0YWNrLnRzI0wyMDRcblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCBpcyBhIFN0YWNrLlxuICAgKlxuICAgKiBhdHRyaWJ1dGUgZGV0ZWN0aW9uIHNpbmNlIGFzICdpbnN0YW5jZW9mJyBwb3RlbnRpYWxseSBmYWlscyBhY3Jvc3MgTGlicmFyeSByZWxlYXNlcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXNBd3NTdGFjayh4OiBhbnkpOiB4IGlzIEF3c1N0YWNrIHtcbiAgICByZXR1cm4geCAhPT0gbnVsbCAmJiB0eXBlb2YgeCA9PT0gXCJvYmplY3RcIiAmJiBBV1NfU1RBQ0tfU1lNQk9MIGluIHg7XG4gIH1cblxuICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE1MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2NvcmUvbGliL3N0YWNrLnRzI0wyMTJcblxuICAvKipcbiAgICogTG9va3MgdXAgdGhlIGZpcnN0IHN0YWNrIHNjb3BlIGluIHdoaWNoIGBjb25zdHJ1Y3RgIGlzIGRlZmluZWQuIEZhaWxzIGlmIHRoZXJlIGlzIG5vIHN0YWNrIHVwIHRoZSB0cmVlIG9yIHRoZSBzdGFjayBpcyBub3QgYW4gQXdzU3RhY2suXG4gICAqIEBwYXJhbSBjb25zdHJ1Y3QgVGhlIGNvbnN0cnVjdCB0byBzdGFydCB0aGUgc2VhcmNoIGZyb20uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG9mQXdzQ29uc3RydWN0KGNvbnN0cnVjdDogSUNvbnN0cnVjdCk6IEF3c1N0YWNrIHtcbiAgICBjb25zdCBzID0gVGVycmFmb3JtU3RhY2sub2YoY29uc3RydWN0KTtcbiAgICBpZiAoQXdzU3RhY2suaXNBd3NTdGFjayhzKSkge1xuICAgICAgcmV0dXJuIHM7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBSZXNvdXJjZSAnJHtjb25zdHJ1Y3QuY29uc3RydWN0b3I/Lm5hbWV9JyBhdCAnJHtjb25zdHJ1Y3Qubm9kZS5wYXRofScgc2hvdWxkIGJlIGNyZWF0ZWQgaW4gdGhlIHNjb3BlIG9mIGFuIEF3c1N0YWNrLCBidXQgbm8gQXdzU3RhY2sgZm91bmRgLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQXNzZXQgbWFuYWdlciBmb3IgaGFuZGxpbmcgZmlsZSBhbmQgRG9ja2VyIGltYWdlIGFzc2V0c1xuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBhc3NldE1hbmFnZXI6IElBc3NldE1hbmFnZXI7XG5cbiAgLy8gLyoqXG4gIC8vICAqIFRhZ3MgdG8gYmUgYXBwbGllZCB0byB0aGUgc3RhY2suXG4gIC8vICAqL1xuICAvLyBwdWJsaWMgcmVhZG9ubHkgY2RrVGFnTWFuYWdlcjogVGFnTWFuYWdlcjtcblxuICBwcml2YXRlIHJlYWRvbmx5IGxvb2t1cDogQXdzTG9va3VwO1xuICBwcml2YXRlIHJlZ2lvbmFsQXdzUHJvdmlkZXJzOiB7IFtyZWdpb246IHN0cmluZ106IHByb3ZpZGVyLkF3c1Byb3ZpZGVyIH0gPSB7fTtcblxuICAvKipcbiAgICogQ2FjaGUgdGhlc2UgdG9rZW5zIGZvciByZWxpYWJsZSBjb21wYXJpc29ucy5cbiAgICpcbiAgICogRXZlcnkgY2FsbCBmb3IgdGhlIHNhbWUgVG9rZW4gd2lsbCBwcm9kdWNlIGEgbmV3IHVuaXF1ZSBzdHJpbmcsIG5vXG4gICAqIGF0dGVtcHQgaXMgbWFkZSB0byBkZWR1cGxpY2F0ZS4gVG9rZW4gb2JqZWN0cyBzaG91bGQgY2FjaGUgdGhlXG4gICAqIHZhbHVlIHRoZW1zZWx2ZXMsIGlmIHJlcXVpcmVkLlxuICAgKlxuICAgKiBkYXRhU291cmNlLmdldFNUcmluZ2F0dHJpYnV0ZSAtPiBUb2tlbi5hc1N0cmluZyAtPiB0b2tlbk1hcC5yZWdpc3RlclN0cmluZ1xuICAgKiByZWY6XG4gICAqIC0gaHR0cHM6Ly9naXRodWIuY29tL2hhc2hpY29ycC90ZXJyYWZvcm0tY2RrL2Jsb2IvdjAuMjAuMTAvcGFja2FnZXMvY2RrdGYvbGliL3RlcnJhZm9ybS1kYXRhLXNvdXJjZS50cyNMNjhcbiAgICogLSBodHRwczovL2dpdGh1Yi5jb20vaGFzaGljb3JwL3RlcnJhZm9ybS1jZGsvYmxvYi92MC4yMC4xMC9wYWNrYWdlcy9jZGt0Zi9saWIvdG9rZW5zL3ByaXZhdGUvdG9rZW4tbWFwLnRzI0w1MC1MNjZcbiAgICovXG4gIHByaXZhdGUgX2FjY291bnRJZFRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3Bhcml0aW9uVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfdXJsU3VmZml4VG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQXdzU3RhY2tQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgIC8vIHRoaXMuY2RrVGFnTWFuYWdlciA9IG5ldyBUYWdNYW5hZ2VyKFxuICAgIC8vICAgVGFnVHlwZS5LRVlfVkFMVUUsXG4gICAgLy8gICBcImNka3RmOnN0YWNrXCIsXG4gICAgLy8gICBwcm9wcy5wcm92aWRlckNvbmZpZy5kZWZhdWx0VGFncyxcbiAgICAvLyApO1xuICAgIHRoaXMubG9va3VwID0ge1xuICAgICAgYXdzUHJvdmlkZXI6IG5ldyBwcm92aWRlci5Bd3NQcm92aWRlcih0aGlzLCBcImRlZmF1bHRBd3NQcm92aWRlclwiLCB7XG4gICAgICAgIC8vIGRlZmF1bHRUYWdzOiB0aGlzLmNka1RhZ01hbmFnZXIucmVuZGVyZWRUYWdzLFxuICAgICAgICAuLi5wcm9wcy5wcm92aWRlckNvbmZpZyxcbiAgICAgIH0pLFxuICAgICAgZGF0YUF3c1NlcnZpY2VQcmluY2lwYWxzOiB7fSxcbiAgICB9O1xuICAgIC8vIHRoZXNlIHNob3VsZCBuZXZlciBkZXBlbmQgb24gYW55dGhpbmcgKEhBQ0sgdG8gYXZvaWQgY3ljbGVzKVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBBV1NfU1RBQ0tfU1lNQk9MLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBhc3NldCBtYW5hZ2VyXG4gICAgdGhpcy5hc3NldE1hbmFnZXIgPVxuICAgICAgcHJvcHMuYXNzZXRNYW5hZ2VyID8/XG4gICAgICBuZXcgQXdzQXNzZXRNYW5hZ2VyKHRoaXMsIHtcbiAgICAgICAgcmVnaW9uOiB0aGlzLnJlZ2lvbixcbiAgICAgICAgYWNjb3VudDogdGhpcy5hY2NvdW50LFxuICAgICAgICBwYXJ0aXRpb246IHRoaXMucGFydGl0aW9uLFxuICAgICAgICB1cmxTdWZmaXg6IHRoaXMudXJsU3VmZml4LFxuICAgICAgICBxdWFsaWZpZXI6IHRoaXMuZ3JpZFVVSUQsXG4gICAgICAgIC4uLihwcm9wcy5hc3NldE9wdGlvbnMgfHwge30pLFxuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHByb3ZpZGVyKCk6IHByb3ZpZGVyLkF3c1Byb3ZpZGVyIHtcbiAgICByZXR1cm4gdGhpcy5sb29rdXAuYXdzUHJvdmlkZXI7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBSZWdpb24gb2YgdGhlIEFXUyBTdGFja1xuICAgKi9cbiAgcHVibGljIGdldCByZWdpb24oKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5sb29rdXAuYXdzUHJvdmlkZXIucmVnaW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb29rdXAuYXdzUHJvdmlkZXIucmVnaW9uO1xuICAgIH1cbiAgICBpZiAoIXRoaXMubG9va3VwLmRhdGFBd3NSZWdpb24pIHtcbiAgICAgIGNvbnN0IHJlZ2lvbiA9IG5ldyBkYXRhQXdzUmVnaW9uLkRhdGFBd3NSZWdpb24odGhpcywgXCJSZWdpb25cIiwge1xuICAgICAgICBwcm92aWRlcjogdGhpcy5sb29rdXAuYXdzUHJvdmlkZXIsXG4gICAgICB9KTtcbiAgICAgIC8vIHRoZXNlIHNob3VsZCBuZXZlciBkZXBlbmQgb24gYW55dGhpbmcgKEhBQ0sgdG8gYXZvaWQgY3ljbGVzKVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlZ2lvbiwgU0tJUF9ERVBFTkRFTkNZX1BST1BBR0FUSU9OLCB7XG4gICAgICAgIHZhbHVlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmxvb2t1cC5kYXRhQXdzUmVnaW9uID0gcmVnaW9uO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5sb29rdXAuZGF0YUF3c1JlZ2lvbi5uYW1lO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgZGF0YUF3c0NhbGxlcklkZW50aXR5KCk6IGRhdGFBd3NDYWxsZXJJZGVudGl0eS5EYXRhQXdzQ2FsbGVySWRlbnRpdHkge1xuICAgIGlmICghdGhpcy5sb29rdXAuZGF0YUF3c0NhbGxlcklkZW50aXR5KSB7XG4gICAgICBjb25zdCBpZGVudGl0eSA9IG5ldyBkYXRhQXdzQ2FsbGVySWRlbnRpdHkuRGF0YUF3c0NhbGxlcklkZW50aXR5KFxuICAgICAgICB0aGlzLFxuICAgICAgICBcIkNhbGxlcklkZW50aXR5XCIsXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlcjogdGhpcy5sb29rdXAuYXdzUHJvdmlkZXIsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgLy8gdGhlc2Ugc2hvdWxkIG5ldmVyIGRlcGVuZCBvbiBhbnl0aGluZyAoSEFDSyB0byBhdm9pZCBjeWNsZXMpXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaWRlbnRpdHksIFNLSVBfREVQRU5ERU5DWV9QUk9QQUdBVElPTiwge1xuICAgICAgICB2YWx1ZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5sb29rdXAuZGF0YUF3c0NhbGxlcklkZW50aXR5ID0gaWRlbnRpdHk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxvb2t1cC5kYXRhQXdzQ2FsbGVySWRlbnRpdHk7XG4gIH1cblxuICBwcml2YXRlIGdldCBkYXRhQXdzQXZhaWxhYmlsaXR5Wm9uZXMoKTogZGF0YUF3c0F2YWlsYWJpbGl0eVpvbmVzLkRhdGFBd3NBdmFpbGFiaWxpdHlab25lcyB7XG4gICAgaWYgKCF0aGlzLmxvb2t1cC5kYXRhQXdzQXZhaWxhYmlsaXR5Wm9uZXMpIHtcbiAgICAgIGNvbnN0IGF6cyA9IG5ldyBkYXRhQXdzQXZhaWxhYmlsaXR5Wm9uZXMuRGF0YUF3c0F2YWlsYWJpbGl0eVpvbmVzKFxuICAgICAgICB0aGlzLFxuICAgICAgICBcIkF2YWlsYWJpbGl0eVpvbmVzXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlcjogdGhpcy5sb29rdXAuYXdzUHJvdmlkZXIsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgLy8gdGhlc2Ugc2hvdWxkIG5ldmVyIGRlcGVuZCBvbiBhbnl0aGluZyAoSEFDSyB0byBhdm9pZCBjeWNsZXMpXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXpzLCBTS0lQX0RFUEVOREVOQ1lfUFJPUEFHQVRJT04sIHsgdmFsdWU6IHRydWUgfSk7XG4gICAgICB0aGlzLmxvb2t1cC5kYXRhQXdzQXZhaWxhYmlsaXR5Wm9uZXMgPSBhenM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxvb2t1cC5kYXRhQXdzQXZhaWxhYmlsaXR5Wm9uZXM7XG4gIH1cblxuICBwcml2YXRlIGdldCBkYXRhQXdzUGFydGl0aW9uKCk6IGRhdGFBd3NQYXJ0aXRpb24uRGF0YUF3c1BhcnRpdGlvbiB7XG4gICAgaWYgKCF0aGlzLmxvb2t1cC5kYXRhQXdzUGFydGl0aW9uKSB7XG4gICAgICBjb25zdCBwYXJ0aXRpb24gPSBuZXcgZGF0YUF3c1BhcnRpdGlvbi5EYXRhQXdzUGFydGl0aW9uKFxuICAgICAgICB0aGlzLFxuICAgICAgICBcIlBhcnRpdGl0aW9uXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlcjogdGhpcy5sb29rdXAuYXdzUHJvdmlkZXIsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgLy8gdGhlc2Ugc2hvdWxkIG5ldmVyIGRlcGVuZCBvbiBhbnl0aGluZyAoSEFDSyB0byBhdm9pZCBjeWNsZXMpXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocGFydGl0aW9uLCBTS0lQX0RFUEVOREVOQ1lfUFJPUEFHQVRJT04sIHtcbiAgICAgICAgdmFsdWU6IHRydWUsXG4gICAgICB9KTtcbiAgICAgIHRoaXMubG9va3VwLmRhdGFBd3NQYXJ0aXRpb24gPSBwYXJ0aXRpb247XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxvb2t1cC5kYXRhQXdzUGFydGl0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZWdpb25hbEF3c1Byb3ZpZGVyKHJlZ2lvbjogc3RyaW5nKTogcHJvdmlkZXIuQXdzUHJvdmlkZXIge1xuICAgIGlmICghdGhpcy5yZWdpb25hbEF3c1Byb3ZpZGVyc1tyZWdpb25dKSB7XG4gICAgICB0aGlzLnJlZ2lvbmFsQXdzUHJvdmlkZXJzW3JlZ2lvbl0gPSBuZXcgcHJvdmlkZXIuQXdzUHJvdmlkZXIoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGBhd3NfJHt0b1RlcnJhZm9ybUlkZW50aWZpZXIocmVnaW9uKX1gLFxuICAgICAgICB7XG4gICAgICAgICAgcmVnaW9uLFxuICAgICAgICAgIGFsaWFzOiB0b1RlcnJhZm9ybUlkZW50aWZpZXIocmVnaW9uKSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlZ2lvbmFsQXdzUHJvdmlkZXJzW3JlZ2lvbl07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBBY2NvdW50IG9mIHRoZSBBV1MgU3RhY2tcbiAgICovXG4gIHB1YmxpYyBnZXQgYWNjb3VudCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5fYWNjb3VudElkVG9rZW4pIHtcbiAgICAgIHRoaXMuX2FjY291bnRJZFRva2VuID0gdGhpcy5kYXRhQXdzQ2FsbGVySWRlbnRpdHkuYWNjb3VudElkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYWNjb3VudElkVG9rZW47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBTdGFja1xuICAgKi9cbiAgcHVibGljIGdldCBwYXJ0aXRpb24oKSB7XG4gICAgaWYgKCF0aGlzLl9wYXJpdGlvblRva2VuKSB7XG4gICAgICB0aGlzLl9wYXJpdGlvblRva2VuID0gdGhpcy5kYXRhQXdzUGFydGl0aW9uLnBhcnRpdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3Bhcml0aW9uVG9rZW47XG4gIH1cblxuICAvKipcbiAgICogQmFzZSBETlMgZG9tYWluIG5hbWUgZm9yIHRoZSBjdXJyZW50IHBhcnRpdGlvbiAoZS5nLiwgYW1hem9uYXdzLmNvbSBpbiBBV1MgQ29tbWVyY2lhbCwgYW1hem9uYXdzLmNvbS5jbiBpbiBBV1MgQ2hpbmEpLlxuICAgKi9cbiAgcHVibGljIGdldCB1cmxTdWZmaXgoKSB7XG4gICAgaWYgKCF0aGlzLl91cmxTdWZmaXhUb2tlbikge1xuICAgICAgdGhpcy5fdXJsU3VmZml4VG9rZW4gPSB0aGlzLmRhdGFBd3NQYXJ0aXRpb24uZG5zU3VmZml4O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdXJsU3VmZml4VG9rZW47XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBzZXJ2aWNlIHByaW5jaXBhbCBuYW1lIGJhc2VkIG9uIHRoZSByZWdpb24gaXQncyB1c2VkIGluLlxuICAgKlxuICAgKiBTb21lIHNlcnZpY2UgcHJpbmNpcGFsIG5hbWVzIHVzZWQgdG8gYmUgZGlmZmVyZW50IGZvciBkaWZmZXJlbnQgcGFydGl0aW9ucyxcbiAgICogYW5kIHNvbWUgd2VyZSBub3QuXG4gICAqXG4gICAqIFRoZXNlIGRheXMgYWxsIHNlcnZpY2UgcHJpbmNpcGFsIG5hbWVzIGFyZSBzdGFuZGFyZGl6ZWQsIGFuZCB0aGV5IGFyZSBhbGxcbiAgICogb2YgdGhlIGZvcm0gYDxzZXJ2aWNlbmFtZT4uYW1hem9uYXdzLmNvbWAuXG4gICAqXG4gICAqIFRvIGF2b2lkIGJyZWFraW5nIGNoYW5nZXMsIGhhbmRsaW5nIGlzIHByb3ZpZGVkIGZvciBzZXJ2aWNlcyBhZGRlZCB3aXRoIHRoZSBmb3JtYXRzIGJlbG93LFxuICAgKiBob3dldmVyLCBubyBhZGRpdGlvbmFsIGhhbmRsaW5nIHdpbGwgYmUgYWRkZWQgZm9yIG5ldyByZWdpb25zIG9yIHBhcnRpdGlvbnMuXG4gICAqICAgLSBzM1xuICAgKiAgIC0gczMuYW1hem9uYXdzLmNvbVxuICAgKiAgIC0gczMuYW1hem9uYXdzLmNvbS5jblxuICAgKiAgIC0gczMuYzJzLmljLmdvdlxuICAgKiAgIC0gczMuc2Mycy5zZ292LmdvdlxuICAgKlxuICAgKiBAcGFyYW0gc2VydmljZSBUaGUgc2VydmljZSBuYW1lIHRvIGdldCB0aGUgc2VydmljZSBwcmluY2lwYWwgSUQgZm9yXG4gICAqIEBwYXJhbSByZWdpb24gVGhlIHJlZ2lvbiB0byBnZXQgdGhlIHNlcnZpY2UgcHJpbmNpcGFsIElEIGZvclxuICAgKi9cbiAgcHVibGljIHNlcnZpY2VQcmluY2lwYWxOYW1lKHNlcnZpY2U6IHN0cmluZywgcmVnaW9uPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBERUZBVUxUX1JFR0lPTl9LRVkgPSBcImRlZmF1bHRfcmVnaW9uXCI7XG4gICAgaWYgKCFyZWdpb24pIHtcbiAgICAgIHJlZ2lvbiA9IERFRkFVTFRfUkVHSU9OX0tFWTtcbiAgICB9XG5cbiAgICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKHJlZ2lvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDYW5ub3QgZGV0ZXJtaW5lIHRoZSBzZXJ2aWNlIHByaW5jaXBhbCBJRCBiZWNhdXNlIHRoZSByZWdpb24gaXMgYSB0b2tlbi4gXCIgK1xuICAgICAgICAgIFwiWW91IG11c3Qgc3BlY2lmeSB0aGUgcmVnaW9uIGV4cGxpY2l0bHkuXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGlmIGZ1bGwgc2VydmljZSBuYW1lIGlzIHByb3ZpZGVkLCBleHRyYWN0IGp1c3QgdGhlIHNlcnZpY2UgbmFtZVxuICAgIC8vIGZvciBzdXBwb3J0ZWQgY2FzZXMgKGFzIHJlcXVpcmVkIGJ5IFRlcnJhZm9ybSBhd3Nfc2VydmljZV9wcmluY2lwYWwgRGF0YSBTb3VyY2UpXG4gICAgY29uc3QgbWF0Y2ggPSBzZXJ2aWNlLm1hdGNoKFxuICAgICAgL14oW14uXSspKD86KD86XFwuYW1hem9uYXdzXFwuY29tKD86XFwuY24pPyl8KD86XFwuYzJzXFwuaWNcXC5nb3YpfCg/OlxcLnNjMnNcXC5zZ292XFwuZ292KSk/JC8sXG4gICAgKTtcbiAgICBjb25zdCBzZXJ2aWNlTmFtZSA9IG1hdGNoID8gbWF0Y2hbMV0gOiBzZXJ2aWNlO1xuICAgIGlmICghdGhpcy5sb29rdXAuZGF0YUF3c1NlcnZpY2VQcmluY2lwYWxzW3JlZ2lvbl0pIHtcbiAgICAgIHRoaXMubG9va3VwLmRhdGFBd3NTZXJ2aWNlUHJpbmNpcGFsc1tyZWdpb25dID0ge307XG4gICAgfVxuICAgIGlmICghdGhpcy5sb29rdXAuZGF0YUF3c1NlcnZpY2VQcmluY2lwYWxzW3JlZ2lvbl1bc2VydmljZU5hbWVdKSB7XG4gICAgICBjb25zdCBzdmNwID0gbmV3IGRhdGFBd3NTZXJ2aWNlUHJpbmNpcGFsLkRhdGFBd3NTZXJ2aWNlUHJpbmNpcGFsKFxuICAgICAgICB0aGlzLFxuICAgICAgICBgYXdzX3N2Y3BfJHt0b1RlcnJhZm9ybUlkZW50aWZpZXIocmVnaW9uKX1fJHtzZXJ2aWNlTmFtZX19YCxcbiAgICAgICAge1xuICAgICAgICAgIHNlcnZpY2VOYW1lLFxuICAgICAgICAgIHByb3ZpZGVyOlxuICAgICAgICAgICAgcmVnaW9uID09PSBERUZBVUxUX1JFR0lPTl9LRVlcbiAgICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgOiB0aGlzLmdldFJlZ2lvbmFsQXdzUHJvdmlkZXIocmVnaW9uKSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICAvLyB0aGVzZSBzaG91bGQgbmV2ZXIgZGVwZW5kIG9uIGFueXRoaW5nIChIQUNLIHRvIGF2b2lkIGN5Y2xlcylcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdmNwLCBTS0lQX0RFUEVOREVOQ1lfUFJPUEFHQVRJT04sIHsgdmFsdWU6IHRydWUgfSk7XG4gICAgICB0aGlzLmxvb2t1cC5kYXRhQXdzU2VydmljZVByaW5jaXBhbHNbcmVnaW9uXVtzZXJ2aWNlTmFtZV0gPSBzdmNwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5sb29rdXAuZGF0YUF3c1NlcnZpY2VQcmluY2lwYWxzW3JlZ2lvbl1bc2VydmljZU5hbWVdLm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBBUk4gZnJvbSBjb21wb25lbnRzLlxuICAgKlxuICAgKiBJZiBgcGFydGl0aW9uYCwgYHJlZ2lvbmAgb3IgYGFjY291bnRgIGFyZSBub3Qgc3BlY2lmaWVkLCB0aGUgc3RhY2snc1xuICAgKiBwYXJ0aXRpb24sIHJlZ2lvbiBhbmQgYWNjb3VudCB3aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIElmIGFueSBjb21wb25lbnQgaXMgdGhlIGVtcHR5IHN0cmluZywgYW4gZW1wdHkgc3RyaW5nIHdpbGwgYmUgaW5zZXJ0ZWRcbiAgICogaW50byB0aGUgZ2VuZXJhdGVkIEFSTiBhdCB0aGUgbG9jYXRpb24gdGhhdCBjb21wb25lbnQgY29ycmVzcG9uZHMgdG8uXG4gICAqXG4gICAqIFRoZSBBUk4gd2lsbCBiZSBmb3JtYXR0ZWQgYXMgZm9sbG93czpcbiAgICpcbiAgICogICBhcm46e3BhcnRpdGlvbn06e3NlcnZpY2V9OntyZWdpb259OnthY2NvdW50fTp7cmVzb3VyY2V9e3NlcH17cmVzb3VyY2UtbmFtZX1cbiAgICpcbiAgICogVGhlIHJlcXVpcmVkIEFSTiBwaWVjZXMgdGhhdCBhcmUgb21pdHRlZCB3aWxsIGJlIHRha2VuIGZyb20gdGhlIHN0YWNrIHRoYXRcbiAgICogdGhlICdzY29wZScgaXMgYXR0YWNoZWQgdG8uIElmIGFsbCBBUk4gcGllY2VzIGFyZSBzdXBwbGllZCwgdGhlIHN1cHBsaWVkIHNjb3BlXG4gICAqIGNhbiBiZSAndW5kZWZpbmVkJy5cbiAgICovXG4gIHB1YmxpYyBmb3JtYXRBcm4oY29tcG9uZW50czogQXJuQ29tcG9uZW50cyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEFybi5mb3JtYXQoY29tcG9uZW50cywgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYW4gQVJOLCBwYXJzZXMgaXQgYW5kIHJldHVybnMgY29tcG9uZW50cy5cbiAgICpcbiAgICogSUYgVEhFIEFSTiBJUyBBIENPTkNSRVRFIFNUUklORy4uLlxuICAgKlxuICAgKiAuLi5pdCB3aWxsIGJlIHBhcnNlZCBhbmQgdmFsaWRhdGVkLiBUaGUgc2VwYXJhdG9yIChgc2VwYCkgd2lsbCBiZSBzZXQgdG8gJy8nXG4gICAqIGlmIHRoZSA2dGggY29tcG9uZW50IGluY2x1ZGVzIGEgJy8nLCBpbiB3aGljaCBjYXNlLCBgcmVzb3VyY2VgIHdpbGwgYmUgc2V0XG4gICAqIHRvIHRoZSB2YWx1ZSBiZWZvcmUgdGhlICcvJyBhbmQgYHJlc291cmNlTmFtZWAgd2lsbCBiZSB0aGUgcmVzdC4gSW4gY2FzZVxuICAgKiB0aGVyZSBpcyBubyAnLycsIGByZXNvdXJjZWAgd2lsbCBiZSBzZXQgdG8gdGhlIDZ0aCBjb21wb25lbnRzIGFuZFxuICAgKiBgcmVzb3VyY2VOYW1lYCB3aWxsIGJlIHNldCB0byB0aGUgcmVzdCBvZiB0aGUgc3RyaW5nLlxuICAgKlxuICAgKiBJRiBUSEUgQVJOIElTIEEgVE9LRU4uLi5cbiAgICpcbiAgICogLi4uaXQgY2Fubm90IGJlIHZhbGlkYXRlZCwgc2luY2Ugd2UgZG9uJ3QgaGF2ZSB0aGUgYWN0dWFsIHZhbHVlIHlldCBhdCB0aGVcbiAgICogdGltZSBvZiB0aGlzIGZ1bmN0aW9uIGNhbGwuIFlvdSB3aWxsIGhhdmUgdG8gc3VwcGx5IGBzZXBJZlRva2VuYCBhbmRcbiAgICogd2hldGhlciBvciBub3QgQVJOcyBvZiB0aGUgZXhwZWN0ZWQgZm9ybWF0IHVzdWFsbHkgaGF2ZSByZXNvdXJjZSBuYW1lc1xuICAgKiBpbiBvcmRlciB0byBwYXJzZSBpdCBwcm9wZXJseS4gVGhlIHJlc3VsdGluZyBgQXJuQ29tcG9uZW50c2Agb2JqZWN0IHdpbGxcbiAgICogY29udGFpbiB0b2tlbnMgZm9yIHRoZSBzdWJleHByZXNzaW9ucyBvZiB0aGUgQVJOLCBub3Qgc3RyaW5nIGxpdGVyYWxzLlxuICAgKlxuICAgKiBJZiB0aGUgcmVzb3VyY2UgbmFtZSBjb3VsZCBwb3NzaWJseSBjb250YWluIHRoZSBzZXBhcmF0b3IgY2hhciwgdGhlIGFjdHVhbFxuICAgKiByZXNvdXJjZSBuYW1lIGNhbm5vdCBiZSBwcm9wZXJseSBwYXJzZWQuIFRoaXMgb25seSBvY2N1cnMgaWYgdGhlIHNlcGFyYXRvclxuICAgKiBjaGFyIGlzICcvJywgYW5kIGhhcHBlbnMgZm9yIGV4YW1wbGUgZm9yIFMzIG9iamVjdCBBUk5zLCBJQU0gUm9sZSBBUk5zLFxuICAgKiBJQU0gT0lEQyBQcm92aWRlciBBUk5zLCBldGMuIFRvIHByb3Blcmx5IGV4dHJhY3QgdGhlIHJlc291cmNlIG5hbWUgZnJvbSBhXG4gICAqIFRva2VuaXplZCBBUk4sIHlvdSBtdXN0IGtub3cgdGhlIHJlc291cmNlIHR5cGUgYW5kIGNhbGxcbiAgICogYEFybi5leHRyYWN0UmVzb3VyY2VOYW1lYC5cbiAgICpcbiAgICogQHBhcmFtIGFybiBUaGUgQVJOIHN0cmluZyB0byBwYXJzZVxuICAgKiBAcGFyYW0gc2VwSWZUb2tlbiBUaGUgc2VwYXJhdG9yIHVzZWQgdG8gc2VwYXJhdGUgcmVzb3VyY2UgZnJvbSByZXNvdXJjZU5hbWVcbiAgICogQHBhcmFtIGhhc05hbWUgV2hldGhlciB0aGVyZSBpcyBhIG5hbWUgY29tcG9uZW50IGluIHRoZSBBUk4gYXQgYWxsLiBGb3JcbiAgICogZXhhbXBsZSwgU05TIFRvcGljcyBBUk5zIGhhdmUgdGhlICdyZXNvdXJjZScgY29tcG9uZW50IGNvbnRhaW4gdGhlIHRvcGljXG4gICAqIG5hbWUsIGFuZCBubyAncmVzb3VyY2VOYW1lJyBjb21wb25lbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIGFuIEFybkNvbXBvbmVudHMgb2JqZWN0IHdoaWNoIGFsbG93cyBhY2Nlc3MgdG8gdGhlIHZhcmlvdXNcbiAgICogY29tcG9uZW50cyBvZiB0aGUgQVJOLlxuICAgKlxuICAgKiBAcmV0dXJucyBhbiBBcm5Db21wb25lbnRzIG9iamVjdCB3aGljaCBhbGxvd3MgYWNjZXNzIHRvIHRoZSB2YXJpb3VzXG4gICAqICAgICAgY29tcG9uZW50cyBvZiB0aGUgQVJOLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCB1c2Ugc3BsaXRBcm4gaW5zdGVhZFxuICAgKi9cbiAgcHVibGljIHBhcnNlQXJuKFxuICAgIGFybjogc3RyaW5nLFxuICAgIHNlcElmVG9rZW46IHN0cmluZyA9IFwiL1wiLFxuICAgIGhhc05hbWU6IGJvb2xlYW4gPSB0cnVlLFxuICApOiBBcm5Db21wb25lbnRzIHtcbiAgICByZXR1cm4gQXJuLnBhcnNlKGFybiwgc2VwSWZUb2tlbiwgaGFzTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogU3BsaXRzIHRoZSBwcm92aWRlZCBBUk4gaW50byBpdHMgY29tcG9uZW50cy5cbiAgICogV29ya3MgYm90aCBpZiAnYXJuJyBpcyBhIHN0cmluZyBsaWtlICdhcm46YXdzOnMzOjo6YnVja2V0JyxcbiAgICogYW5kIGEgVG9rZW4gcmVwcmVzZW50aW5nIGEgZHluYW1pYyBDbG91ZEZvcm1hdGlvbiBleHByZXNzaW9uXG4gICAqIChpbiB3aGljaCBjYXNlIHRoZSByZXR1cm5lZCBjb21wb25lbnRzIHdpbGwgYWxzbyBiZSBkeW5hbWljIENsb3VkRm9ybWF0aW9uIGV4cHJlc3Npb25zLFxuICAgKiBlbmNvZGVkIGFzIFRva2VucykuXG4gICAqXG4gICAqIEBwYXJhbSBhcm4gdGhlIEFSTiB0byBzcGxpdCBpbnRvIGl0cyBjb21wb25lbnRzXG4gICAqIEBwYXJhbSBhcm5Gb3JtYXQgdGhlIGV4cGVjdGVkIGZvcm1hdCBvZiAnYXJuJyAtIGRlcGVuZHMgb24gd2hhdCBmb3JtYXQgdGhlIHNlcnZpY2UgJ2FybicgcmVwcmVzZW50cyB1c2VzXG4gICAqL1xuICBwdWJsaWMgc3BsaXRBcm4oYXJuOiBzdHJpbmcsIGFybkZvcm1hdDogQXJuRm9ybWF0KTogQXJuQ29tcG9uZW50cyB7XG4gICAgcmV0dXJuIEFybi5zcGxpdChhcm4sIGFybkZvcm1hdCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBpdGVyYXRvciBmb3IgYWxsIEFacyB0aGF0IGFyZSBhdmFpbGFibGUgaW4gdGhlIEFXUyBlbnZpcm9ubWVudFxuICAgKiAoYWNjb3VudC9yZWdpb24pIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN0YWNrIChkZWZhdWx0IG9yIGFsaWFzZWQgcHJvdmlkZXIpLlxuICAgKlxuICAgKiB0aGlzIHdpbGwgcmV0dXJuIGEgY2RrdGYgaXRlcmF0b3JcbiAgICpcbiAgICogaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vY2RrdGYvY29uY2VwdHMvaXRlcmF0b3JzI2RlZmluZS1pdGVyYXRvcnNcbiAgICpcbiAgICogVG8gc3BlY2lmeSBhIGRpZmZlcmVudCBzdHJhdGVneSBmb3Igc2VsZWN0aW5nIGF2YWlsYWJpbGl0eSB6b25lcyBvdmVycmlkZSB0aGlzIG1ldGhvZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgYXZhaWxhYmlsaXR5Wm9uZUl0ZXJhdG9yKCk6IFJlc291cmNlVGVycmFmb3JtSXRlcmF0b3Ige1xuICAgIGNvbnN0IGF6cyA9IHRoaXMuZGF0YUF3c0F2YWlsYWJpbGl0eVpvbmVzO1xuICAgIHJldHVybiBUZXJyYWZvcm1JdGVyYXRvci5mcm9tRGF0YVNvdXJjZXMoYXpzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgTGlzdCBvZiBUb2tlbnMgZm9yIEFaIG5hbWVzIGF2YWlsYWJsZSBpbiB0aGUgc3RhY2snc1xuICAgKiBBV1MgZW52aXJvbm1lbnQgKGFjY291bnQvcmVnaW9uKS5cbiAgICpcbiAgICogVGhlIGxpc3QgbGVuZ3RoIGlzIGBtYXhDb3VudGAgd2hpY2ggZGVmYXVsdHMgdG8gMi5cbiAgICpcbiAgICogQHBhcmFtIG1heENvdW50IHRoZSBtYXhpbXVtIG51bWJlciBvZiBBWnMgdG8gcmV0dXJuXG4gICAqL1xuICBwdWJsaWMgYXZhaWxhYmlsaXR5Wm9uZXMobWF4Q291bnQ6IG51bWJlciA9IDIpOiBzdHJpbmdbXSB7XG4gICAgLy8gVE9ETzogSW1wbGVtZW50IENvbnRleHRQcm92aWRlclxuICAgIGNvbnN0IGF6cyA9IHRoaXMuZGF0YUF3c0F2YWlsYWJpbGl0eVpvbmVzO1xuICAgIGNvbnN0IGF6TG9va3VwczogYW55W10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1heENvdW50OyBpKyspIHtcbiAgICAgIGF6TG9va3Vwcy5wdXNoKEZuLmVsZW1lbnQoYXpzLm5hbWVzLCBpKSk7XG4gICAgfVxuICAgIHJldHVybiBhekxvb2t1cHM7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBmaWxlIGFzc2V0IG9uIHRoaXMgU3RhY2tcbiAgICovXG4gIHB1YmxpYyBhZGRGaWxlQXNzZXQoYXNzZXQ6IEZpbGVBc3NldFNvdXJjZSk6IEZpbGVBc3NldExvY2F0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5hc3NldE1hbmFnZXIuYWRkRmlsZUFzc2V0KGFzc2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGRvY2tlciBpbWFnZSBhc3NldCBvbiB0aGlzIFN0YWNrXG4gICAqL1xuICBwdWJsaWMgYWRkRG9ja2VySW1hZ2VBc3NldChcbiAgICBhc3NldDogRG9ja2VySW1hZ2VBc3NldFNvdXJjZSxcbiAgKTogRG9ja2VySW1hZ2VBc3NldExvY2F0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5hc3NldE1hbmFnZXIuYWRkRG9ja2VySW1hZ2VBc3NldChhc3NldCk7XG4gIH1cblxuICAvLyAvKipcbiAgLy8gICogUmVzb2x2ZSBhIHRva2VuaXplZCB2YWx1ZSBpbiB0aGUgY29udGV4dCBvZiB0aGUgY3VycmVudCBzdGFjay5cbiAgLy8gICovXG4gIC8vIHB1YmxpYyByZXNvbHZlPFQ+KG9iajogVCk6IFQge1xuICAvLyAgIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2hhc2hpY29ycC90ZXJyYWZvcm0tY2RrL2Jsb2IvdjAuMjAuNy9wYWNrYWdlcy9jZGt0Zi9saWIvdGVycmFmb3JtLXN0YWNrLnRzI0wxNTFcbiAgLy8gICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE1MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2NvcmUvbGliL3N0YWNrLnRzI0w1NzJcbiAgLy8gICByZXR1cm4gcmVzb2x2ZSh0aGlzLCBvYmopO1xuICAvLyB9XG59XG4iXX0=
394
+ AwsStack[_a] = { fqn: "terraconstructs.aws.AwsStack", version: "0.2.0" };
395
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLXN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F3cy9hd3Mtc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxzREFBd0Q7QUFDeEQsc0RBTzZCO0FBQzdCLGlDQU1lO0FBRWYsK0JBQXNEO0FBQ3RELGtDQUFrQztBQVNsQyw4Q0FBa0U7QUFDbEUsMkRBQThFO0FBQzlFLGlDQUErQztBQUMvQyxzQ0FBNEM7QUFDNUMsbURBQW1EO0FBQ25ELDBGQUFzRjtBQUN0Riw2Q0FBNkM7QUFDN0MsMkRBQTJEO0FBRTNELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0FBNEV4RTs7R0FFRztBQUNILE1BQWEsUUFBUyxTQUFRLHNCQUFTO0lBQ3JDLGdHQUFnRztJQUVoRzs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFNO1FBQzdCLE9BQU8sQ0FBQyxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksZ0JBQWdCLElBQUksQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRCxnR0FBZ0c7SUFFaEc7OztPQUdHO0lBQ0ksTUFBTSxDQUFDLGNBQWMsQ0FBQyxTQUFxQjtRQUNoRCxNQUFNLENBQUMsR0FBRyxzQkFBYyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2QyxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMzQixPQUFPLENBQUMsQ0FBQztRQUNYLENBQUM7UUFDRCxNQUFNLElBQUksd0JBQWUsQ0FDdkIsYUFBYSxTQUFTLENBQUMsV0FBVyxFQUFFLElBQUksU0FBUyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksd0VBQXdFLEVBQzVJLFNBQVMsQ0FDVixDQUFDO0lBQ0osQ0FBQztJQWlDRCxZQUFZLEtBQWlCLEVBQUUsRUFBVyxFQUFFLFFBQXVCLEVBQUU7UUFDbkUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFyQmxCLHlCQUFvQixHQUErQyxFQUFFLENBQUM7UUFzQjVFLHVDQUF1QztRQUN2Qyx1QkFBdUI7UUFDdkIsbUJBQW1CO1FBQ25CLHNDQUFzQztRQUN0QyxLQUFLO1FBQ0wsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDO1FBQzVDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQztRQUN4QyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7UUFFeEMsK0RBQStEO1FBQy9ELE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELElBQVksTUFBTTtRQUNoQixrQ0FBa0M7UUFDbEMsSUFBSSxDQUFDLE9BQU8sS0FBWixJQUFJLENBQUMsT0FBTyxHQUFLO1lBQ2YsV0FBVyxFQUFFLElBQUksdUJBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLG9CQUFvQixFQUFFO2dCQUNoRSxnREFBZ0Q7Z0JBQ2hELEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxJQUFJLEVBQUUsQ0FBQzthQUNoQyxDQUFDO1lBQ0Ysd0JBQXdCLEVBQUUsRUFBRTtTQUM3QixFQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUFZLFlBQVk7UUFDdEIsMkJBQTJCO1FBQzNCLElBQUksQ0FBQyxhQUFhLEtBQWxCLElBQUksQ0FBQyxhQUFhLEdBQUssSUFBSSxtQ0FBZSxDQUFDLElBQUksRUFBRTtZQUMvQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztZQUN6QixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDekIsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3hCLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQztTQUM5QixDQUFDLEVBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsTUFBTTtRQUNmLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFDeEMsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQy9CLE1BQU0sTUFBTSxHQUFHLElBQUksNEJBQWEsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtnQkFDN0QsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVzthQUNsQyxDQUFDLENBQUM7WUFDSCwrREFBK0Q7WUFDL0QsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsMERBQTJCLEVBQUU7Z0JBQ3pELEtBQUssRUFBRSxJQUFJO2FBQ1osQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDO1FBQ3JDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztJQUN4QyxDQUFDO0lBRUQsSUFBWSxxQkFBcUI7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUN2QyxNQUFNLFFBQVEsR0FBRyxJQUFJLG9DQUFxQixDQUFDLHFCQUFxQixDQUM5RCxJQUFJLEVBQ0osZ0JBQWdCLEVBQ2hCO2dCQUNFLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVc7YUFDbEMsQ0FDRixDQUFDO1lBQ0YsK0RBQStEO1lBQy9ELE1BQU0sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLDBEQUEyQixFQUFFO2dCQUMzRCxLQUFLLEVBQUUsSUFBSTthQUNaLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxNQUFNLENBQUMscUJBQXFCLEdBQUcsUUFBUSxDQUFDO1FBQy9DLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUM7SUFDM0MsQ0FBQztJQUVELElBQVksd0JBQXdCO1FBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDMUMsTUFBTSxHQUFHLEdBQUcsSUFBSSx1Q0FBd0IsQ0FBQyx3QkFBd0IsQ0FDL0QsSUFBSSxFQUNKLG1CQUFtQixFQUNuQjtnQkFDRSxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXO2FBQ2xDLENBQ0YsQ0FBQztZQUNGLCtEQUErRDtZQUMvRCxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSwwREFBMkIsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3pFLElBQUksQ0FBQyxNQUFNLENBQUMsd0JBQXdCLEdBQUcsR0FBRyxDQUFDO1FBQzdDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsd0JBQXdCLENBQUM7SUFDOUMsQ0FBQztJQUVELElBQVksZ0JBQWdCO1FBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDbEMsTUFBTSxTQUFTLEdBQUcsSUFBSSwrQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FDckQsSUFBSSxFQUNKLGFBQWEsRUFDYjtnQkFDRSxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXO2FBQ2xDLENBQ0YsQ0FBQztZQUNGLCtEQUErRDtZQUMvRCxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSwwREFBMkIsRUFBRTtnQkFDNUQsS0FBSyxFQUFFLElBQUk7YUFDWixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQztRQUMzQyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDO0lBQ3RDLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxNQUFjO1FBQzNDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSx1QkFBUSxDQUFDLFdBQVcsQ0FDMUQsSUFBSSxFQUNKLE9BQU8sSUFBQSw0QkFBcUIsRUFBQyxNQUFNLENBQUMsRUFBRSxFQUN0QztnQkFDRSxNQUFNO2dCQUNOLEtBQUssRUFBRSxJQUFBLDRCQUFxQixFQUFDLE1BQU0sQ0FBQzthQUNyQyxDQUNGLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxPQUFPO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDO1FBQzlELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxTQUFTO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDO1FBQ3hELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxTQUFTO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDO1FBQ3pELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BbUJHO0lBQ0ksb0JBQW9CLENBQUMsT0FBZSxFQUFFLE1BQWU7UUFDMUQsTUFBTSxrQkFBa0IsR0FBRyxnQkFBZ0IsQ0FBQztRQUM1QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLEdBQUcsa0JBQWtCLENBQUM7UUFDOUIsQ0FBQztRQUVELElBQUksYUFBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQy9CLE1BQU0sSUFBSSx3QkFBZSxDQUN2QiwyRUFBMkU7Z0JBQ3pFLHlDQUF5QyxFQUMzQyxJQUFJLENBQ0wsQ0FBQztRQUNKLENBQUM7UUFFRCxrRUFBa0U7UUFDbEUsbUZBQW1GO1FBQ25GLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQ3pCLHNGQUFzRixDQUN2RixDQUFDO1FBQ0YsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUMvQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ2xELElBQUksQ0FBQyxNQUFNLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3BELENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQy9ELE1BQU0sSUFBSSxHQUFHLElBQUksc0NBQXVCLENBQUMsdUJBQXVCLENBQzlELElBQUksRUFDSixZQUFZLElBQUEsNEJBQXFCLEVBQUMsTUFBTSxDQUFDLElBQUksV0FBVyxHQUFHLEVBQzNEO2dCQUNFLFdBQVc7Z0JBQ1gsUUFBUSxFQUNOLE1BQU0sS0FBSyxrQkFBa0I7b0JBQzNCLENBQUMsQ0FBQyxTQUFTO29CQUNYLENBQUMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDO2FBQzFDLENBQ0YsQ0FBQztZQUNGLCtEQUErRDtZQUMvRCxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSwwREFBMkIsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzFFLElBQUksQ0FBQyxNQUFNLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ25FLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3hFLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7OztPQWdCRztJQUNJLFNBQVMsQ0FBQyxVQUF5QjtRQUN4QyxPQUFPLFNBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BdUNHO0lBQ0ksUUFBUSxDQUNiLEdBQVcsRUFDWCxhQUFxQixHQUFHLEVBQ3hCLFVBQW1CLElBQUk7UUFFdkIsT0FBTyxTQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNJLFFBQVEsQ0FBQyxHQUFXLEVBQUUsU0FBb0I7UUFDL0MsT0FBTyxTQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsSUFBVyx3QkFBd0I7UUFDakMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDO1FBQzFDLE9BQU8seUJBQWlCLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksaUJBQWlCLENBQUMsV0FBbUIsQ0FBQztRQUMzQyxrQ0FBa0M7UUFDbEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDO1FBQzFDLE1BQU0sU0FBUyxHQUFVLEVBQUUsQ0FBQztRQUM1QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDbEMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksWUFBWSxDQUFDLEtBQXNCO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVEOztPQUVHO0lBQ0ksbUJBQW1CLENBQ3hCLEtBQTZCO1FBRTdCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsTUFBTTtJQUNOLG9FQUFvRTtJQUNwRSxNQUFNO0lBQ04saUNBQWlDO0lBQ2pDLCtHQUErRztJQUMvRyxxR0FBcUc7SUFDckcsK0JBQStCO0lBQy9CLElBQUk7SUFFSjs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Ba0JHO0lBQ0ksWUFBWSxDQUFDLFFBQWdCLEVBQUUsWUFBcUI7UUFDekQsSUFBSSxDQUFDLGFBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDckMsTUFBTSxHQUFHLEdBQUcsa0JBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSSxZQUFZLENBQUM7WUFDN0QsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sSUFBSSx3QkFBZSxDQUN2QiwyQkFBMkIsUUFBUSxlQUFlLElBQUksQ0FBQyxNQUFNLDhDQUE4QyxFQUMzRyxJQUFJLENBQ0wsQ0FBQztZQUNKLENBQUM7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNwRSxJQUNFLFVBQVUsS0FBSyxTQUFTO1lBQ3hCLFVBQVUsS0FBSyxXQUFXO1lBQzFCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFDMUIsQ0FBQztZQUNELE1BQU0sSUFBSSx3QkFBZSxDQUN2QixrQkFBa0IsS0FBSyxDQUFDLGlCQUFpQix1Q0FBdUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUM1RyxJQUFJLENBQ0wsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FDYixVQUFVLEtBQUssU0FBUyxJQUFJLFVBQVUsS0FBSyxXQUFXO1lBQ3BELENBQUMsQ0FBQyx3QkFBVSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7WUFDbkQsQ0FBQyxDQUFDLHdCQUFVLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXJDLE9BQU8sSUFBQSxnQ0FBZ0IsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNuRSxDQUFDOztBQXhkSCw0QkF5ZEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGYWN0LCBSZWdpb25JbmZvIH0gZnJvbSBcIkBhd3MtY2RrL3JlZ2lvbi1pbmZvXCI7XG5pbXBvcnQge1xuICBkYXRhQXdzQXZhaWxhYmlsaXR5Wm9uZXMsXG4gIGRhdGFBd3NDYWxsZXJJZGVudGl0eSxcbiAgZGF0YUF3c1BhcnRpdGlvbixcbiAgZGF0YUF3c1JlZ2lvbixcbiAgZGF0YUF3c1NlcnZpY2VQcmluY2lwYWwsXG4gIHByb3ZpZGVyLFxufSBmcm9tIFwiQGNka3RmL3Byb3ZpZGVyLWF3c1wiO1xuaW1wb3J0IHtcbiAgVGVycmFmb3JtU3RhY2ssXG4gIFRlcnJhZm9ybUl0ZXJhdG9yLFxuICBUb2tlbixcbiAgRm4sXG4gIFJlc291cmNlVGVycmFmb3JtSXRlcmF0b3IsXG59IGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0LCBJQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IEFybiwgQXJuQ29tcG9uZW50cywgQXJuRm9ybWF0IH0gZnJvbSBcIi4vYXJuXCI7XG5pbXBvcnQgKiBhcyBjeGFwaSBmcm9tIFwiLi9jeC1hcGlcIjtcbmltcG9ydCB7IEF3c1Byb3ZpZGVyQ29uZmlnIH0gZnJvbSBcIi4vcHJvdmlkZXItY29uZmlnLmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgSUFzc2V0TWFuYWdlciB9IGZyb20gXCIuLi9hc3NldC1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBEb2NrZXJJbWFnZUFzc2V0TG9jYXRpb24sXG4gIERvY2tlckltYWdlQXNzZXRTb3VyY2UsXG4gIEZpbGVBc3NldExvY2F0aW9uLFxuICBGaWxlQXNzZXRTb3VyY2UsXG59IGZyb20gXCIuLi9hc3NldHNcIjtcbmltcG9ydCB7IFN0YWNrQmFzZVByb3BzLCBTdGFja0Jhc2UsIElTdGFjayB9IGZyb20gXCIuLi9zdGFjay1iYXNlXCI7XG5pbXBvcnQgeyBBd3NBc3NldE1hbmFnZXJPcHRpb25zLCBBd3NBc3NldE1hbmFnZXIgfSBmcm9tIFwiLi9hd3MtYXNzZXQtbWFuYWdlclwiO1xuaW1wb3J0IHsgdG9UZXJyYWZvcm1JZGVudGlmaWVyIH0gZnJvbSBcIi4vdXRpbFwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IHsgZGVwbG95VGltZUxvb2t1cCB9IGZyb20gXCIuL3JlZ2lvbi1sb29rdXBcIjtcbmltcG9ydCB7IFNLSVBfREVQRU5ERU5DWV9QUk9QQUdBVElPTiB9IGZyb20gXCIuLi9wcml2YXRlL3RlcnJhZm9ybS1kZXBlbmRhYmxlcy1hc3BlY3RcIjtcbi8vIGltcG9ydCB7IFRhZ1R5cGUgfSBmcm9tIFwiLi9hd3MtY29uc3RydWN0XCI7XG4vLyBpbXBvcnQgeyBUYWdNYW5hZ2VyLCBJVGFnZ2FibGVWMiB9IGZyb20gXCIuL3RhZy1tYW5hZ2VyXCI7XG5cbmNvbnN0IEFXU19TVEFDS19TWU1CT0wgPSBTeW1ib2wuZm9yKFwidGVycmFjb25zdHJ1Y3RzL2xpYi9hd3MuQXdzU3RhY2tcIik7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXdzU3RhY2tQcm9wcyBleHRlbmRzIFN0YWNrQmFzZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBBV1MgUHJvdmlkZXIgY29uZmlndXJhdGlvbiAod2l0aG91dCB0aGUgYWxpYXMgZmllbGQpXG4gICAqL1xuICByZWFkb25seSBwcm92aWRlckNvbmZpZz86IEF3c1Byb3ZpZGVyQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBBc3NldCBtYW5hZ2VyIGZvciBoYW5kbGluZyBmaWxlIGFuZCBEb2NrZXIgaW1hZ2UgYXNzZXRzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQXdzQXNzZXRNYW5hZ2VyIHdpdGggZGVmYXVsdCBzZXR0aW5nc1xuICAgKi9cbiAgcmVhZG9ubHkgYXNzZXRNYW5hZ2VyPzogSUFzc2V0TWFuYWdlcjtcblxuICAvKipcbiAgICogQXNzZXQgTWFuYWdlbWVudCBvcHRpb25zXG4gICAqXG4gICAqIFVzZSB0aGlzIHRvIHJlZmVyZW5jZSBleGlzdGluZyBTMyBCdWNrZXQgYW5kIEVDUiBSZXBvc2l0b3J5IGZvciBhc3NldHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gU3RhY2sgY3JlYXRlcyBCdWNrZXQgYW5kIFJlcG9zaXRvcnkgb24gZGVtYW5kXG4gICAqL1xuICByZWFkb25seSBhc3NldE9wdGlvbnM/OiBBd3NBc3NldE1hbmFnZXJPcHRpb25zO1xufVxuXG4vLyBUT0RPOiBSZS1hZGQgSVRhZ2dhYmxlVjJcbmV4cG9ydCBpbnRlcmZhY2UgSUF3c1N0YWNrIGV4dGVuZHMgSVN0YWNrIHtcbiAgLyoqXG4gICAqIFRoZSBBV1MgUmVnaW9uIGZvciB0aGUgVGVycmFDb25zdHJ1Y3RcbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIEFXUyBBY2NvdW50IGZvciB0aGUgVGVycmFDb25zdHJ1Y3RcbiAgICovXG4gIHJlYWRvbmx5IGFjY291bnQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBBV1MgUGFydGl0aW9uIGZvciB0aGUgVGVycmFDb25zdHJ1Y3RcbiAgICovXG4gIHJlYWRvbmx5IHBhcnRpdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VydmljZSBQcmluY2lwYWwgSWQgZm9yIGEgc3BlY2lmaWMgc2VydmljZVxuICAgKlxuICAgKiBAcGFyYW0gc2VydmljZU5hbWUgVGhlIHNlcnZpY2UgbmFtZSB0byBnZXQgdGhlIHNlcnZpY2UgcHJpbmNpcGFsIElEIGZvclxuICAgKiBAcGFyYW0gcmVnaW9uIFRoZSByZWdpb24gdG8gZ2V0IHRoZSBzZXJ2aWNlIHByaW5jaXBhbCBJRCBmb3JcbiAgICovXG4gIHNlcnZpY2VQcmluY2lwYWxOYW1lKHNlcnZpY2VOYW1lOiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZyk6IHN0cmluZztcbiAgLy8gLyoqXG4gIC8vICAqIFByb2R1Y2UgdGhlIFRva2VuJ3MgdmFsdWUgYXQgcmVzb2x1dGlvbiB0aW1lXG4gIC8vICAqL1xuICAvLyByZXNvbHZlPFQ+KG9iajogVCk6IFQ7XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgZmlsZSBhc3NldCBvbiB0aGlzIFN0YWNrXG4gICAqL1xuICBhZGRGaWxlQXNzZXQoYXNzZXQ6IEZpbGVBc3NldFNvdXJjZSk6IEZpbGVBc3NldExvY2F0aW9uO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGRvY2tlciBpbWFnZSBhc3NldCBvbiB0aGlzIFN0YWNrXG4gICAqL1xuICBhZGREb2NrZXJJbWFnZUFzc2V0KGFzc2V0OiBEb2NrZXJJbWFnZUFzc2V0U291cmNlKTogRG9ja2VySW1hZ2VBc3NldExvY2F0aW9uO1xufVxuXG5pbnRlcmZhY2UgQXdzTG9va3VwIHtcbiAgYXdzUHJvdmlkZXI6IHByb3ZpZGVyLkF3c1Byb3ZpZGVyO1xuICBkYXRhQXdzUmVnaW9uPzogZGF0YUF3c1JlZ2lvbi5EYXRhQXdzUmVnaW9uO1xuICBkYXRhQXdzQ2FsbGVySWRlbnRpdHk/OiBkYXRhQXdzQ2FsbGVySWRlbnRpdHkuRGF0YUF3c0NhbGxlcklkZW50aXR5O1xuICBkYXRhQXdzUGFydGl0aW9uPzogZGF0YUF3c1BhcnRpdGlvbi5EYXRhQXdzUGFydGl0aW9uO1xuICBkYXRhQXdzQXZhaWxhYmlsaXR5Wm9uZXM/OiBkYXRhQXdzQXZhaWxhYmlsaXR5Wm9uZXMuRGF0YUF3c0F2YWlsYWJpbGl0eVpvbmVzO1xuICAvLyBBV1MgU2VydmljZSBQcmluY2lwYWxzIGJ5IHJlZ2lvbiBhbmQgYnkgc2VydmljZVxuICBkYXRhQXdzU2VydmljZVByaW5jaXBhbHM6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgUmVjb3JkPHN0cmluZywgZGF0YUF3c1NlcnZpY2VQcmluY2lwYWwuRGF0YUF3c1NlcnZpY2VQcmluY2lwYWw+XG4gID47XG59XG5cbi8qKlxuICogQSBUZXJyYWZvcm0gc3RhY2sgY29uc3RyYWluZWQgdG8gYSBzaW5nbGUgQVdTIEFjY291bnQvUmVnaW9uIHRvIHNpbXVsYXRlIENGTiBiZWhhdmlvci5cbiAqL1xuZXhwb3J0IGNsYXNzIEF3c1N0YWNrIGV4dGVuZHMgU3RhY2tCYXNlIGltcGxlbWVudHMgSUF3c1N0YWNrIHtcbiAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNTAuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9jb3JlL2xpYi9zdGFjay50cyNMMjA0XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgaXMgYSBTdGFjay5cbiAgICpcbiAgICogYXR0cmlidXRlIGRldGVjdGlvbiBzaW5jZSBhcyAnaW5zdGFuY2VvZicgcG90ZW50aWFsbHkgZmFpbHMgYWNyb3NzIExpYnJhcnkgcmVsZWFzZXMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlzQXdzU3RhY2soeDogYW55KTogeCBpcyBBd3NTdGFjayB7XG4gICAgcmV0dXJuIHggIT09IG51bGwgJiYgdHlwZW9mIHggPT09IFwib2JqZWN0XCIgJiYgQVdTX1NUQUNLX1NZTUJPTCBpbiB4O1xuICB9XG5cbiAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNTAuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9jb3JlL2xpYi9zdGFjay50cyNMMjEyXG5cbiAgLyoqXG4gICAqIExvb2tzIHVwIHRoZSBmaXJzdCBzdGFjayBzY29wZSBpbiB3aGljaCBgY29uc3RydWN0YCBpcyBkZWZpbmVkLiBGYWlscyBpZiB0aGVyZSBpcyBubyBzdGFjayB1cCB0aGUgdHJlZSBvciB0aGUgc3RhY2sgaXMgbm90IGFuIEF3c1N0YWNrLlxuICAgKiBAcGFyYW0gY29uc3RydWN0IFRoZSBjb25zdHJ1Y3QgdG8gc3RhcnQgdGhlIHNlYXJjaCBmcm9tLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBvZkF3c0NvbnN0cnVjdChjb25zdHJ1Y3Q6IElDb25zdHJ1Y3QpOiBBd3NTdGFjayB7XG4gICAgY29uc3QgcyA9IFRlcnJhZm9ybVN0YWNrLm9mKGNvbnN0cnVjdCk7XG4gICAgaWYgKEF3c1N0YWNrLmlzQXdzU3RhY2socykpIHtcbiAgICAgIHJldHVybiBzO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFJlc291cmNlICcke2NvbnN0cnVjdC5jb25zdHJ1Y3Rvcj8ubmFtZX0nIGF0ICcke2NvbnN0cnVjdC5ub2RlLnBhdGh9JyBzaG91bGQgYmUgY3JlYXRlZCBpbiB0aGUgc2NvcGUgb2YgYW4gQXdzU3RhY2ssIGJ1dCBubyBBd3NTdGFjayBmb3VuZGAsXG4gICAgICBjb25zdHJ1Y3QsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NldCBtYW5hZ2VyIGZvciBoYW5kbGluZyBmaWxlIGFuZCBEb2NrZXIgaW1hZ2UgYXNzZXRzXG4gICAqL1xuICBwcml2YXRlIF9hc3NldE1hbmFnZXI/OiBJQXNzZXRNYW5hZ2VyO1xuXG4gIC8vIC8qKlxuICAvLyAgKiBUYWdzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHN0YWNrLlxuICAvLyAgKi9cbiAgLy8gcHVibGljIHJlYWRvbmx5IGNka1RhZ01hbmFnZXI6IFRhZ01hbmFnZXI7XG5cbiAgcHJpdmF0ZSBfbG9va3VwPzogQXdzTG9va3VwO1xuICBwcml2YXRlIHJlZ2lvbmFsQXdzUHJvdmlkZXJzOiB7IFtyZWdpb246IHN0cmluZ106IHByb3ZpZGVyLkF3c1Byb3ZpZGVyIH0gPSB7fTtcblxuICAvKipcbiAgICogQ2FjaGUgdGhlc2UgdG9rZW5zIGZvciByZWxpYWJsZSBjb21wYXJpc29ucy5cbiAgICpcbiAgICogRXZlcnkgY2FsbCBmb3IgdGhlIHNhbWUgVG9rZW4gd2lsbCBwcm9kdWNlIGEgbmV3IHVuaXF1ZSBzdHJpbmcsIG5vXG4gICAqIGF0dGVtcHQgaXMgbWFkZSB0byBkZWR1cGxpY2F0ZS4gVG9rZW4gb2JqZWN0cyBzaG91bGQgY2FjaGUgdGhlXG4gICAqIHZhbHVlIHRoZW1zZWx2ZXMsIGlmIHJlcXVpcmVkLlxuICAgKlxuICAgKiBkYXRhU291cmNlLmdldFNUcmluZ2F0dHJpYnV0ZSAtPiBUb2tlbi5hc1N0cmluZyAtPiB0b2tlbk1hcC5yZWdpc3RlclN0cmluZ1xuICAgKiByZWY6XG4gICAqIC0gaHR0cHM6Ly9naXRodWIuY29tL2hhc2hpY29ycC90ZXJyYWZvcm0tY2RrL2Jsb2IvdjAuMjAuMTAvcGFja2FnZXMvY2RrdGYvbGliL3RlcnJhZm9ybS1kYXRhLXNvdXJjZS50cyNMNjhcbiAgICogLSBodHRwczovL2dpdGh1Yi5jb20vaGFzaGljb3JwL3RlcnJhZm9ybS1jZGsvYmxvYi92MC4yMC4xMC9wYWNrYWdlcy9jZGt0Zi9saWIvdG9rZW5zL3ByaXZhdGUvdG9rZW4tbWFwLnRzI0w1MC1MNjZcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3Byb3ZpZGVyQ29uZmlnOiBBd3NQcm92aWRlckNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBfYXNzZXRPcHRpb25zOiBBd3NBc3NldE1hbmFnZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9hY2NvdW50SWRUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9wYXJpdGlvblRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3VybFN1ZmZpeFRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU/OiBDb25zdHJ1Y3QsIGlkPzogc3RyaW5nLCBwcm9wczogQXdzU3RhY2tQcm9wcyA9IHt9KSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgLy8gdGhpcy5jZGtUYWdNYW5hZ2VyID0gbmV3IFRhZ01hbmFnZXIoXG4gICAgLy8gICBUYWdUeXBlLktFWV9WQUxVRSxcbiAgICAvLyAgIFwiY2RrdGY6c3RhY2tcIixcbiAgICAvLyAgIHByb3BzLnByb3ZpZGVyQ29uZmlnLmRlZmF1bHRUYWdzLFxuICAgIC8vICk7XG4gICAgdGhpcy5fcHJvdmlkZXJDb25maWcgPSBwcm9wcy5wcm92aWRlckNvbmZpZztcbiAgICB0aGlzLl9hc3NldE9wdGlvbnMgPSBwcm9wcy5hc3NldE9wdGlvbnM7XG4gICAgdGhpcy5fYXNzZXRNYW5hZ2VyID0gcHJvcHMuYXNzZXRNYW5hZ2VyO1xuXG4gICAgLy8gdGhlc2Ugc2hvdWxkIG5ldmVyIGRlcGVuZCBvbiBhbnl0aGluZyAoSEFDSyB0byBhdm9pZCBjeWNsZXMpXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIEFXU19TVEFDS19TWU1CT0wsIHsgdmFsdWU6IHRydWUgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldCBsb29rdXAoKTogQXdzTG9va3VwIHtcbiAgICAvLyBJbml0aWFsaXplIGRlZmF1bHQgQVdTIHByb3ZpZGVyXG4gICAgdGhpcy5fbG9va3VwID8/PSB7XG4gICAgICBhd3NQcm92aWRlcjogbmV3IHByb3ZpZGVyLkF3c1Byb3ZpZGVyKHRoaXMsIFwiZGVmYXVsdEF3c1Byb3ZpZGVyXCIsIHtcbiAgICAgICAgLy8gZGVmYXVsdFRhZ3M6IHRoaXMuY2RrVGFnTWFuYWdlci5yZW5kZXJlZFRhZ3MsXG4gICAgICAgIC4uLih0aGlzLl9wcm92aWRlckNvbmZpZyA/PyB7fSksXG4gICAgICB9KSxcbiAgICAgIGRhdGFBd3NTZXJ2aWNlUHJpbmNpcGFsczoge30sXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5fbG9va3VwO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgYXNzZXRNYW5hZ2VyKCk6IElBc3NldE1hbmFnZXIge1xuICAgIC8vIEluaXRpYWxpemUgYXNzZXQgbWFuYWdlclxuICAgIHRoaXMuX2Fzc2V0TWFuYWdlciA/Pz0gbmV3IEF3c0Fzc2V0TWFuYWdlcih0aGlzLCB7XG4gICAgICByZWdpb246IHRoaXMucmVnaW9uLFxuICAgICAgYWNjb3VudDogdGhpcy5hY2NvdW50LFxuICAgICAgcGFydGl0aW9uOiB0aGlzLnBhcnRpdGlvbixcbiAgICAgIHVybFN1ZmZpeDogdGhpcy51cmxTdWZmaXgsXG4gICAgICBxdWFsaWZpZXI6IHRoaXMuZ3JpZFVVSUQsXG4gICAgICAuLi4odGhpcy5fYXNzZXRPcHRpb25zIHx8IHt9KSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5fYXNzZXRNYW5hZ2VyO1xuICB9XG5cbiAgcHVibGljIGdldCBwcm92aWRlcigpOiBwcm92aWRlci5Bd3NQcm92aWRlciB7XG4gICAgcmV0dXJuIHRoaXMubG9va3VwLmF3c1Byb3ZpZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgUmVnaW9uIG9mIHRoZSBBV1MgU3RhY2tcbiAgICovXG4gIHB1YmxpYyBnZXQgcmVnaW9uKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMubG9va3VwLmF3c1Byb3ZpZGVyLnJlZ2lvbikge1xuICAgICAgcmV0dXJuIHRoaXMubG9va3VwLmF3c1Byb3ZpZGVyLnJlZ2lvbjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmxvb2t1cC5kYXRhQXdzUmVnaW9uKSB7XG4gICAgICBjb25zdCByZWdpb24gPSBuZXcgZGF0YUF3c1JlZ2lvbi5EYXRhQXdzUmVnaW9uKHRoaXMsIFwiUmVnaW9uXCIsIHtcbiAgICAgICAgcHJvdmlkZXI6IHRoaXMubG9va3VwLmF3c1Byb3ZpZGVyLFxuICAgICAgfSk7XG4gICAgICAvLyB0aGVzZSBzaG91bGQgbmV2ZXIgZGVwZW5kIG9uIGFueXRoaW5nIChIQUNLIHRvIGF2b2lkIGN5Y2xlcylcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZWdpb24sIFNLSVBfREVQRU5ERU5DWV9QUk9QQUdBVElPTiwge1xuICAgICAgICB2YWx1ZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5sb29rdXAuZGF0YUF3c1JlZ2lvbiA9IHJlZ2lvbjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubG9va3VwLmRhdGFBd3NSZWdpb24ubmFtZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGRhdGFBd3NDYWxsZXJJZGVudGl0eSgpOiBkYXRhQXdzQ2FsbGVySWRlbnRpdHkuRGF0YUF3c0NhbGxlcklkZW50aXR5IHtcbiAgICBpZiAoIXRoaXMubG9va3VwLmRhdGFBd3NDYWxsZXJJZGVudGl0eSkge1xuICAgICAgY29uc3QgaWRlbnRpdHkgPSBuZXcgZGF0YUF3c0NhbGxlcklkZW50aXR5LkRhdGFBd3NDYWxsZXJJZGVudGl0eShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgXCJDYWxsZXJJZGVudGl0eVwiLFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZXI6IHRoaXMubG9va3VwLmF3c1Byb3ZpZGVyLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIC8vIHRoZXNlIHNob3VsZCBuZXZlciBkZXBlbmQgb24gYW55dGhpbmcgKEhBQ0sgdG8gYXZvaWQgY3ljbGVzKVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGlkZW50aXR5LCBTS0lQX0RFUEVOREVOQ1lfUFJPUEFHQVRJT04sIHtcbiAgICAgICAgdmFsdWU6IHRydWUsXG4gICAgICB9KTtcbiAgICAgIHRoaXMubG9va3VwLmRhdGFBd3NDYWxsZXJJZGVudGl0eSA9IGlkZW50aXR5O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5sb29rdXAuZGF0YUF3c0NhbGxlcklkZW50aXR5O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgZGF0YUF3c0F2YWlsYWJpbGl0eVpvbmVzKCk6IGRhdGFBd3NBdmFpbGFiaWxpdHlab25lcy5EYXRhQXdzQXZhaWxhYmlsaXR5Wm9uZXMge1xuICAgIGlmICghdGhpcy5sb29rdXAuZGF0YUF3c0F2YWlsYWJpbGl0eVpvbmVzKSB7XG4gICAgICBjb25zdCBhenMgPSBuZXcgZGF0YUF3c0F2YWlsYWJpbGl0eVpvbmVzLkRhdGFBd3NBdmFpbGFiaWxpdHlab25lcyhcbiAgICAgICAgdGhpcyxcbiAgICAgICAgXCJBdmFpbGFiaWxpdHlab25lc1wiLFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZXI6IHRoaXMubG9va3VwLmF3c1Byb3ZpZGVyLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIC8vIHRoZXNlIHNob3VsZCBuZXZlciBkZXBlbmQgb24gYW55dGhpbmcgKEhBQ0sgdG8gYXZvaWQgY3ljbGVzKVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGF6cywgU0tJUF9ERVBFTkRFTkNZX1BST1BBR0FUSU9OLCB7IHZhbHVlOiB0cnVlIH0pO1xuICAgICAgdGhpcy5sb29rdXAuZGF0YUF3c0F2YWlsYWJpbGl0eVpvbmVzID0gYXpzO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5sb29rdXAuZGF0YUF3c0F2YWlsYWJpbGl0eVpvbmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgZGF0YUF3c1BhcnRpdGlvbigpOiBkYXRhQXdzUGFydGl0aW9uLkRhdGFBd3NQYXJ0aXRpb24ge1xuICAgIGlmICghdGhpcy5sb29rdXAuZGF0YUF3c1BhcnRpdGlvbikge1xuICAgICAgY29uc3QgcGFydGl0aW9uID0gbmV3IGRhdGFBd3NQYXJ0aXRpb24uRGF0YUF3c1BhcnRpdGlvbihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgXCJQYXJ0aXRpdGlvblwiLFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZXI6IHRoaXMubG9va3VwLmF3c1Byb3ZpZGVyLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIC8vIHRoZXNlIHNob3VsZCBuZXZlciBkZXBlbmQgb24gYW55dGhpbmcgKEhBQ0sgdG8gYXZvaWQgY3ljbGVzKVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHBhcnRpdGlvbiwgU0tJUF9ERVBFTkRFTkNZX1BST1BBR0FUSU9OLCB7XG4gICAgICAgIHZhbHVlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmxvb2t1cC5kYXRhQXdzUGFydGl0aW9uID0gcGFydGl0aW9uO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5sb29rdXAuZGF0YUF3c1BhcnRpdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmVnaW9uYWxBd3NQcm92aWRlcihyZWdpb246IHN0cmluZyk6IHByb3ZpZGVyLkF3c1Byb3ZpZGVyIHtcbiAgICBpZiAoIXRoaXMucmVnaW9uYWxBd3NQcm92aWRlcnNbcmVnaW9uXSkge1xuICAgICAgdGhpcy5yZWdpb25hbEF3c1Byb3ZpZGVyc1tyZWdpb25dID0gbmV3IHByb3ZpZGVyLkF3c1Byb3ZpZGVyKFxuICAgICAgICB0aGlzLFxuICAgICAgICBgYXdzXyR7dG9UZXJyYWZvcm1JZGVudGlmaWVyKHJlZ2lvbil9YCxcbiAgICAgICAge1xuICAgICAgICAgIHJlZ2lvbixcbiAgICAgICAgICBhbGlhczogdG9UZXJyYWZvcm1JZGVudGlmaWVyKHJlZ2lvbiksXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZWdpb25hbEF3c1Byb3ZpZGVyc1tyZWdpb25dO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgQWNjb3VudCBvZiB0aGUgQVdTIFN0YWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFjY291bnQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuX2FjY291bnRJZFRva2VuKSB7XG4gICAgICB0aGlzLl9hY2NvdW50SWRUb2tlbiA9IHRoaXMuZGF0YUF3c0NhbGxlcklkZW50aXR5LmFjY291bnRJZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2FjY291bnRJZFRva2VuO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgUGFydGl0aW9uIG9mIHRoZSBBV1MgU3RhY2tcbiAgICovXG4gIHB1YmxpYyBnZXQgcGFydGl0aW9uKCkge1xuICAgIGlmICghdGhpcy5fcGFyaXRpb25Ub2tlbikge1xuICAgICAgdGhpcy5fcGFyaXRpb25Ub2tlbiA9IHRoaXMuZGF0YUF3c1BhcnRpdGlvbi5wYXJ0aXRpb247XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9wYXJpdGlvblRva2VuO1xuICB9XG5cbiAgLyoqXG4gICAqIEJhc2UgRE5TIGRvbWFpbiBuYW1lIGZvciB0aGUgY3VycmVudCBwYXJ0aXRpb24gKGUuZy4sIGFtYXpvbmF3cy5jb20gaW4gQVdTIENvbW1lcmNpYWwsIGFtYXpvbmF3cy5jb20uY24gaW4gQVdTIENoaW5hKS5cbiAgICovXG4gIHB1YmxpYyBnZXQgdXJsU3VmZml4KCkge1xuICAgIGlmICghdGhpcy5fdXJsU3VmZml4VG9rZW4pIHtcbiAgICAgIHRoaXMuX3VybFN1ZmZpeFRva2VuID0gdGhpcy5kYXRhQXdzUGFydGl0aW9uLmRuc1N1ZmZpeDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3VybFN1ZmZpeFRva2VuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgc2VydmljZSBwcmluY2lwYWwgbmFtZSBiYXNlZCBvbiB0aGUgcmVnaW9uIGl0J3MgdXNlZCBpbi5cbiAgICpcbiAgICogU29tZSBzZXJ2aWNlIHByaW5jaXBhbCBuYW1lcyB1c2VkIHRvIGJlIGRpZmZlcmVudCBmb3IgZGlmZmVyZW50IHBhcnRpdGlvbnMsXG4gICAqIGFuZCBzb21lIHdlcmUgbm90LlxuICAgKlxuICAgKiBUaGVzZSBkYXlzIGFsbCBzZXJ2aWNlIHByaW5jaXBhbCBuYW1lcyBhcmUgc3RhbmRhcmRpemVkLCBhbmQgdGhleSBhcmUgYWxsXG4gICAqIG9mIHRoZSBmb3JtIGA8c2VydmljZW5hbWU+LmFtYXpvbmF3cy5jb21gLlxuICAgKlxuICAgKiBUbyBhdm9pZCBicmVha2luZyBjaGFuZ2VzLCBoYW5kbGluZyBpcyBwcm92aWRlZCBmb3Igc2VydmljZXMgYWRkZWQgd2l0aCB0aGUgZm9ybWF0cyBiZWxvdyxcbiAgICogaG93ZXZlciwgbm8gYWRkaXRpb25hbCBoYW5kbGluZyB3aWxsIGJlIGFkZGVkIGZvciBuZXcgcmVnaW9ucyBvciBwYXJ0aXRpb25zLlxuICAgKiAgIC0gczNcbiAgICogICAtIHMzLmFtYXpvbmF3cy5jb21cbiAgICogICAtIHMzLmFtYXpvbmF3cy5jb20uY25cbiAgICogICAtIHMzLmMycy5pYy5nb3ZcbiAgICogICAtIHMzLnNjMnMuc2dvdi5nb3ZcbiAgICpcbiAgICogQHBhcmFtIHNlcnZpY2UgVGhlIHNlcnZpY2UgbmFtZSB0byBnZXQgdGhlIHNlcnZpY2UgcHJpbmNpcGFsIElEIGZvclxuICAgKiBAcGFyYW0gcmVnaW9uIFRoZSByZWdpb24gdG8gZ2V0IHRoZSBzZXJ2aWNlIHByaW5jaXBhbCBJRCBmb3JcbiAgICovXG4gIHB1YmxpYyBzZXJ2aWNlUHJpbmNpcGFsTmFtZShzZXJ2aWNlOiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgREVGQVVMVF9SRUdJT05fS0VZID0gXCJkZWZhdWx0X3JlZ2lvblwiO1xuICAgIGlmICghcmVnaW9uKSB7XG4gICAgICByZWdpb24gPSBERUZBVUxUX1JFR0lPTl9LRVk7XG4gICAgfVxuXG4gICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChyZWdpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBcIkNhbm5vdCBkZXRlcm1pbmUgdGhlIHNlcnZpY2UgcHJpbmNpcGFsIElEIGJlY2F1c2UgdGhlIHJlZ2lvbiBpcyBhIHRva2VuLiBcIiArXG4gICAgICAgICAgXCJZb3UgbXVzdCBzcGVjaWZ5IHRoZSByZWdpb24gZXhwbGljaXRseS5cIixcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gaWYgZnVsbCBzZXJ2aWNlIG5hbWUgaXMgcHJvdmlkZWQsIGV4dHJhY3QganVzdCB0aGUgc2VydmljZSBuYW1lXG4gICAgLy8gZm9yIHN1cHBvcnRlZCBjYXNlcyAoYXMgcmVxdWlyZWQgYnkgVGVycmFmb3JtIGF3c19zZXJ2aWNlX3ByaW5jaXBhbCBEYXRhIFNvdXJjZSlcbiAgICBjb25zdCBtYXRjaCA9IHNlcnZpY2UubWF0Y2goXG4gICAgICAvXihbXi5dKykoPzooPzpcXC5hbWF6b25hd3NcXC5jb20oPzpcXC5jbik/KXwoPzpcXC5jMnNcXC5pY1xcLmdvdil8KD86XFwuc2Myc1xcLnNnb3ZcXC5nb3YpKT8kLyxcbiAgICApO1xuICAgIGNvbnN0IHNlcnZpY2VOYW1lID0gbWF0Y2ggPyBtYXRjaFsxXSA6IHNlcnZpY2U7XG4gICAgaWYgKCF0aGlzLmxvb2t1cC5kYXRhQXdzU2VydmljZVByaW5jaXBhbHNbcmVnaW9uXSkge1xuICAgICAgdGhpcy5sb29rdXAuZGF0YUF3c1NlcnZpY2VQcmluY2lwYWxzW3JlZ2lvbl0gPSB7fTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmxvb2t1cC5kYXRhQXdzU2VydmljZVByaW5jaXBhbHNbcmVnaW9uXVtzZXJ2aWNlTmFtZV0pIHtcbiAgICAgIGNvbnN0IHN2Y3AgPSBuZXcgZGF0YUF3c1NlcnZpY2VQcmluY2lwYWwuRGF0YUF3c1NlcnZpY2VQcmluY2lwYWwoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGBhd3Nfc3ZjcF8ke3RvVGVycmFmb3JtSWRlbnRpZmllcihyZWdpb24pfV8ke3NlcnZpY2VOYW1lfX1gLFxuICAgICAgICB7XG4gICAgICAgICAgc2VydmljZU5hbWUsXG4gICAgICAgICAgcHJvdmlkZXI6XG4gICAgICAgICAgICByZWdpb24gPT09IERFRkFVTFRfUkVHSU9OX0tFWVxuICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA6IHRoaXMuZ2V0UmVnaW9uYWxBd3NQcm92aWRlcihyZWdpb24pLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIC8vIHRoZXNlIHNob3VsZCBuZXZlciBkZXBlbmQgb24gYW55dGhpbmcgKEhBQ0sgdG8gYXZvaWQgY3ljbGVzKVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHN2Y3AsIFNLSVBfREVQRU5ERU5DWV9QUk9QQUdBVElPTiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbiAgICAgIHRoaXMubG9va3VwLmRhdGFBd3NTZXJ2aWNlUHJpbmNpcGFsc1tyZWdpb25dW3NlcnZpY2VOYW1lXSA9IHN2Y3A7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxvb2t1cC5kYXRhQXdzU2VydmljZVByaW5jaXBhbHNbcmVnaW9uXVtzZXJ2aWNlTmFtZV0ubmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIEFSTiBmcm9tIGNvbXBvbmVudHMuXG4gICAqXG4gICAqIElmIGBwYXJ0aXRpb25gLCBgcmVnaW9uYCBvciBgYWNjb3VudGAgYXJlIG5vdCBzcGVjaWZpZWQsIHRoZSBzdGFjaydzXG4gICAqIHBhcnRpdGlvbiwgcmVnaW9uIGFuZCBhY2NvdW50IHdpbGwgYmUgdXNlZC5cbiAgICpcbiAgICogSWYgYW55IGNvbXBvbmVudCBpcyB0aGUgZW1wdHkgc3RyaW5nLCBhbiBlbXB0eSBzdHJpbmcgd2lsbCBiZSBpbnNlcnRlZFxuICAgKiBpbnRvIHRoZSBnZW5lcmF0ZWQgQVJOIGF0IHRoZSBsb2NhdGlvbiB0aGF0IGNvbXBvbmVudCBjb3JyZXNwb25kcyB0by5cbiAgICpcbiAgICogVGhlIEFSTiB3aWxsIGJlIGZvcm1hdHRlZCBhcyBmb2xsb3dzOlxuICAgKlxuICAgKiAgIGFybjp7cGFydGl0aW9ufTp7c2VydmljZX06e3JlZ2lvbn06e2FjY291bnR9OntyZXNvdXJjZX17c2VwfXtyZXNvdXJjZS1uYW1lfVxuICAgKlxuICAgKiBUaGUgcmVxdWlyZWQgQVJOIHBpZWNlcyB0aGF0IGFyZSBvbWl0dGVkIHdpbGwgYmUgdGFrZW4gZnJvbSB0aGUgc3RhY2sgdGhhdFxuICAgKiB0aGUgJ3Njb3BlJyBpcyBhdHRhY2hlZCB0by4gSWYgYWxsIEFSTiBwaWVjZXMgYXJlIHN1cHBsaWVkLCB0aGUgc3VwcGxpZWQgc2NvcGVcbiAgICogY2FuIGJlICd1bmRlZmluZWQnLlxuICAgKi9cbiAgcHVibGljIGZvcm1hdEFybihjb21wb25lbnRzOiBBcm5Db21wb25lbnRzKTogc3RyaW5nIHtcbiAgICByZXR1cm4gQXJuLmZvcm1hdChjb21wb25lbnRzLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhbiBBUk4sIHBhcnNlcyBpdCBhbmQgcmV0dXJucyBjb21wb25lbnRzLlxuICAgKlxuICAgKiBJRiBUSEUgQVJOIElTIEEgQ09OQ1JFVEUgU1RSSU5HLi4uXG4gICAqXG4gICAqIC4uLml0IHdpbGwgYmUgcGFyc2VkIGFuZCB2YWxpZGF0ZWQuIFRoZSBzZXBhcmF0b3IgKGBzZXBgKSB3aWxsIGJlIHNldCB0byAnLydcbiAgICogaWYgdGhlIDZ0aCBjb21wb25lbnQgaW5jbHVkZXMgYSAnLycsIGluIHdoaWNoIGNhc2UsIGByZXNvdXJjZWAgd2lsbCBiZSBzZXRcbiAgICogdG8gdGhlIHZhbHVlIGJlZm9yZSB0aGUgJy8nIGFuZCBgcmVzb3VyY2VOYW1lYCB3aWxsIGJlIHRoZSByZXN0LiBJbiBjYXNlXG4gICAqIHRoZXJlIGlzIG5vICcvJywgYHJlc291cmNlYCB3aWxsIGJlIHNldCB0byB0aGUgNnRoIGNvbXBvbmVudHMgYW5kXG4gICAqIGByZXNvdXJjZU5hbWVgIHdpbGwgYmUgc2V0IHRvIHRoZSByZXN0IG9mIHRoZSBzdHJpbmcuXG4gICAqXG4gICAqIElGIFRIRSBBUk4gSVMgQSBUT0tFTi4uLlxuICAgKlxuICAgKiAuLi5pdCBjYW5ub3QgYmUgdmFsaWRhdGVkLCBzaW5jZSB3ZSBkb24ndCBoYXZlIHRoZSBhY3R1YWwgdmFsdWUgeWV0IGF0IHRoZVxuICAgKiB0aW1lIG9mIHRoaXMgZnVuY3Rpb24gY2FsbC4gWW91IHdpbGwgaGF2ZSB0byBzdXBwbHkgYHNlcElmVG9rZW5gIGFuZFxuICAgKiB3aGV0aGVyIG9yIG5vdCBBUk5zIG9mIHRoZSBleHBlY3RlZCBmb3JtYXQgdXN1YWxseSBoYXZlIHJlc291cmNlIG5hbWVzXG4gICAqIGluIG9yZGVyIHRvIHBhcnNlIGl0IHByb3Blcmx5LiBUaGUgcmVzdWx0aW5nIGBBcm5Db21wb25lbnRzYCBvYmplY3Qgd2lsbFxuICAgKiBjb250YWluIHRva2VucyBmb3IgdGhlIHN1YmV4cHJlc3Npb25zIG9mIHRoZSBBUk4sIG5vdCBzdHJpbmcgbGl0ZXJhbHMuXG4gICAqXG4gICAqIElmIHRoZSByZXNvdXJjZSBuYW1lIGNvdWxkIHBvc3NpYmx5IGNvbnRhaW4gdGhlIHNlcGFyYXRvciBjaGFyLCB0aGUgYWN0dWFsXG4gICAqIHJlc291cmNlIG5hbWUgY2Fubm90IGJlIHByb3Blcmx5IHBhcnNlZC4gVGhpcyBvbmx5IG9jY3VycyBpZiB0aGUgc2VwYXJhdG9yXG4gICAqIGNoYXIgaXMgJy8nLCBhbmQgaGFwcGVucyBmb3IgZXhhbXBsZSBmb3IgUzMgb2JqZWN0IEFSTnMsIElBTSBSb2xlIEFSTnMsXG4gICAqIElBTSBPSURDIFByb3ZpZGVyIEFSTnMsIGV0Yy4gVG8gcHJvcGVybHkgZXh0cmFjdCB0aGUgcmVzb3VyY2UgbmFtZSBmcm9tIGFcbiAgICogVG9rZW5pemVkIEFSTiwgeW91IG11c3Qga25vdyB0aGUgcmVzb3VyY2UgdHlwZSBhbmQgY2FsbFxuICAgKiBgQXJuLmV4dHJhY3RSZXNvdXJjZU5hbWVgLlxuICAgKlxuICAgKiBAcGFyYW0gYXJuIFRoZSBBUk4gc3RyaW5nIHRvIHBhcnNlXG4gICAqIEBwYXJhbSBzZXBJZlRva2VuIFRoZSBzZXBhcmF0b3IgdXNlZCB0byBzZXBhcmF0ZSByZXNvdXJjZSBmcm9tIHJlc291cmNlTmFtZVxuICAgKiBAcGFyYW0gaGFzTmFtZSBXaGV0aGVyIHRoZXJlIGlzIGEgbmFtZSBjb21wb25lbnQgaW4gdGhlIEFSTiBhdCBhbGwuIEZvclxuICAgKiBleGFtcGxlLCBTTlMgVG9waWNzIEFSTnMgaGF2ZSB0aGUgJ3Jlc291cmNlJyBjb21wb25lbnQgY29udGFpbiB0aGUgdG9waWNcbiAgICogbmFtZSwgYW5kIG5vICdyZXNvdXJjZU5hbWUnIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHJldHVybnMgYW4gQXJuQ29tcG9uZW50cyBvYmplY3Qgd2hpY2ggYWxsb3dzIGFjY2VzcyB0byB0aGUgdmFyaW91c1xuICAgKiBjb21wb25lbnRzIG9mIHRoZSBBUk4uXG4gICAqXG4gICAqIEByZXR1cm5zIGFuIEFybkNvbXBvbmVudHMgb2JqZWN0IHdoaWNoIGFsbG93cyBhY2Nlc3MgdG8gdGhlIHZhcmlvdXNcbiAgICogICAgICBjb21wb25lbnRzIG9mIHRoZSBBUk4uXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBzcGxpdEFybiBpbnN0ZWFkXG4gICAqL1xuICBwdWJsaWMgcGFyc2VBcm4oXG4gICAgYXJuOiBzdHJpbmcsXG4gICAgc2VwSWZUb2tlbjogc3RyaW5nID0gXCIvXCIsXG4gICAgaGFzTmFtZTogYm9vbGVhbiA9IHRydWUsXG4gICk6IEFybkNvbXBvbmVudHMge1xuICAgIHJldHVybiBBcm4ucGFyc2UoYXJuLCBzZXBJZlRva2VuLCBoYXNOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdHMgdGhlIHByb3ZpZGVkIEFSTiBpbnRvIGl0cyBjb21wb25lbnRzLlxuICAgKiBXb3JrcyBib3RoIGlmICdhcm4nIGlzIGEgc3RyaW5nIGxpa2UgJ2Fybjphd3M6czM6OjpidWNrZXQnLFxuICAgKiBhbmQgYSBUb2tlbiByZXByZXNlbnRpbmcgYSBkeW5hbWljIENsb3VkRm9ybWF0aW9uIGV4cHJlc3Npb25cbiAgICogKGluIHdoaWNoIGNhc2UgdGhlIHJldHVybmVkIGNvbXBvbmVudHMgd2lsbCBhbHNvIGJlIGR5bmFtaWMgQ2xvdWRGb3JtYXRpb24gZXhwcmVzc2lvbnMsXG4gICAqIGVuY29kZWQgYXMgVG9rZW5zKS5cbiAgICpcbiAgICogQHBhcmFtIGFybiB0aGUgQVJOIHRvIHNwbGl0IGludG8gaXRzIGNvbXBvbmVudHNcbiAgICogQHBhcmFtIGFybkZvcm1hdCB0aGUgZXhwZWN0ZWQgZm9ybWF0IG9mICdhcm4nIC0gZGVwZW5kcyBvbiB3aGF0IGZvcm1hdCB0aGUgc2VydmljZSAnYXJuJyByZXByZXNlbnRzIHVzZXNcbiAgICovXG4gIHB1YmxpYyBzcGxpdEFybihhcm46IHN0cmluZywgYXJuRm9ybWF0OiBBcm5Gb3JtYXQpOiBBcm5Db21wb25lbnRzIHtcbiAgICByZXR1cm4gQXJuLnNwbGl0KGFybiwgYXJuRm9ybWF0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGl0ZXJhdG9yIGZvciBhbGwgQVpzIHRoYXQgYXJlIGF2YWlsYWJsZSBpbiB0aGUgQVdTIGVudmlyb25tZW50XG4gICAqIChhY2NvdW50L3JlZ2lvbikgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3RhY2sgKGRlZmF1bHQgb3IgYWxpYXNlZCBwcm92aWRlcikuXG4gICAqXG4gICAqIHRoaXMgd2lsbCByZXR1cm4gYSBjZGt0ZiBpdGVyYXRvclxuICAgKlxuICAgKiBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9jZGt0Zi9jb25jZXB0cy9pdGVyYXRvcnMjZGVmaW5lLWl0ZXJhdG9yc1xuICAgKlxuICAgKiBUbyBzcGVjaWZ5IGEgZGlmZmVyZW50IHN0cmF0ZWd5IGZvciBzZWxlY3RpbmcgYXZhaWxhYmlsaXR5IHpvbmVzIG92ZXJyaWRlIHRoaXMgbWV0aG9kLlxuICAgKi9cbiAgcHVibGljIGdldCBhdmFpbGFiaWxpdHlab25lSXRlcmF0b3IoKTogUmVzb3VyY2VUZXJyYWZvcm1JdGVyYXRvciB7XG4gICAgY29uc3QgYXpzID0gdGhpcy5kYXRhQXdzQXZhaWxhYmlsaXR5Wm9uZXM7XG4gICAgcmV0dXJuIFRlcnJhZm9ybUl0ZXJhdG9yLmZyb21EYXRhU291cmNlcyhhenMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBMaXN0IG9mIFRva2VucyBmb3IgQVogbmFtZXMgYXZhaWxhYmxlIGluIHRoZSBzdGFjaydzXG4gICAqIEFXUyBlbnZpcm9ubWVudCAoYWNjb3VudC9yZWdpb24pLlxuICAgKlxuICAgKiBUaGUgbGlzdCBsZW5ndGggaXMgYG1heENvdW50YCB3aGljaCBkZWZhdWx0cyB0byAyLlxuICAgKlxuICAgKiBAcGFyYW0gbWF4Q291bnQgdGhlIG1heGltdW0gbnVtYmVyIG9mIEFacyB0byByZXR1cm5cbiAgICovXG4gIHB1YmxpYyBhdmFpbGFiaWxpdHlab25lcyhtYXhDb3VudDogbnVtYmVyID0gMik6IHN0cmluZ1tdIHtcbiAgICAvLyBUT0RPOiBJbXBsZW1lbnQgQ29udGV4dFByb3ZpZGVyXG4gICAgY29uc3QgYXpzID0gdGhpcy5kYXRhQXdzQXZhaWxhYmlsaXR5Wm9uZXM7XG4gICAgY29uc3QgYXpMb29rdXBzOiBhbnlbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF4Q291bnQ7IGkrKykge1xuICAgICAgYXpMb29rdXBzLnB1c2goRm4uZWxlbWVudChhenMubmFtZXMsIGkpKTtcbiAgICB9XG4gICAgcmV0dXJuIGF6TG9va3VwcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGZpbGUgYXNzZXQgb24gdGhpcyBTdGFja1xuICAgKi9cbiAgcHVibGljIGFkZEZpbGVBc3NldChhc3NldDogRmlsZUFzc2V0U291cmNlKTogRmlsZUFzc2V0TG9jYXRpb24ge1xuICAgIHJldHVybiB0aGlzLmFzc2V0TWFuYWdlci5hZGRGaWxlQXNzZXQoYXNzZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgZG9ja2VyIGltYWdlIGFzc2V0IG9uIHRoaXMgU3RhY2tcbiAgICovXG4gIHB1YmxpYyBhZGREb2NrZXJJbWFnZUFzc2V0KFxuICAgIGFzc2V0OiBEb2NrZXJJbWFnZUFzc2V0U291cmNlLFxuICApOiBEb2NrZXJJbWFnZUFzc2V0TG9jYXRpb24ge1xuICAgIHJldHVybiB0aGlzLmFzc2V0TWFuYWdlci5hZGREb2NrZXJJbWFnZUFzc2V0KGFzc2V0KTtcbiAgfVxuXG4gIC8vIC8qKlxuICAvLyAgKiBSZXNvbHZlIGEgdG9rZW5pemVkIHZhbHVlIGluIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IHN0YWNrLlxuICAvLyAgKi9cbiAgLy8gcHVibGljIHJlc29sdmU8VD4ob2JqOiBUKTogVCB7XG4gIC8vICAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vaGFzaGljb3JwL3RlcnJhZm9ybS1jZGsvYmxvYi92MC4yMC43L3BhY2thZ2VzL2Nka3RmL2xpYi90ZXJyYWZvcm0tc3RhY2sudHMjTDE1MVxuICAvLyAgIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTUwLjAvcGFja2FnZXMvYXdzLWNkay1saWIvY29yZS9saWIvc3RhY2sudHMjTDU3MlxuICAvLyAgIHJldHVybiByZXNvbHZlKHRoaXMsIG9iaik7XG4gIC8vIH1cblxuICAvKipcbiAgICogTG9vayB1cCBhIGZhY3QgdmFsdWUgZm9yIHRoZSBnaXZlbiBmYWN0IGZvciB0aGUgcmVnaW9uIG9mIHRoaXMgc3RhY2tcbiAgICpcbiAgICogV2lsbCByZXR1cm4gYSBkZWZpbml0ZSB2YWx1ZSBvbmx5IGlmIHRoZSByZWdpb24gb2YgdGhlIGN1cnJlbnQgc3RhY2sgaXMgcmVzb2x2ZWQuXG4gICAqIElmIG5vdCwgYSBsb29rdXAgbWFwIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHN0YWNrIGFuZCB0aGUgbG9va3VwIHdpbGwgYmUgZG9uZSBhdFxuICAgKiBDREsgZGVwbG95bWVudCB0aW1lLlxuICAgKlxuICAgKiBXaGF0IHJlZ2lvbnMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgbG9va3VwIG1hcCBpcyBjb250cm9sbGVkIGJ5IHRoZVxuICAgKiBgdGVycmFjb25zdHJ1Y3RzL2NvcmU6dGFyZ2V0LXBhcnRpdGlvbnNgIGNvbnRleHQgdmFsdWU6IGl0IG11c3QgYmUgc2V0IHRvIGEgbGlzdFxuICAgKiBvZiBwYXJ0aXRpb25zLCBhbmQgb25seSByZWdpb25zIGZyb20gdGhlIGdpdmVuIHBhcnRpdGlvbnMgd2lsbCBiZSBpbmNsdWRlZC5cbiAgICogSWYgbm8gc3VjaCBjb250ZXh0IGtleSBpcyBzZXQsIGFsbCByZWdpb25zIHdpbGwgYmUgaW5jbHVkZWQuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBjb25zdHJ1Y3QgbGlicmFyeSBhdXRob3JzLiBBcHBsaWNhdGlvblxuICAgKiBidWlsZGVycyBjYW4gcmVseSBvbiB0aGUgYWJzdHJhY3Rpb25zIG9mZmVyZWQgYnkgY29uc3RydWN0IGxpYnJhcmllcyBhbmQgZG9cbiAgICogbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgcmVnaW9uYWwgZmFjdHMuXG4gICAqXG4gICAqIElmIGBkZWZhdWx0VmFsdWVgIGlzIG5vdCBnaXZlbiwgaXQgaXMgYW4gZXJyb3IgaWYgdGhlIGZhY3QgaXMgdW5rbm93biBmb3JcbiAgICogdGhlIGdpdmVuIHJlZ2lvbi5cbiAgICovXG4gIHB1YmxpYyByZWdpb25hbEZhY3QoZmFjdE5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZCh0aGlzLnJlZ2lvbikpIHtcbiAgICAgIGNvbnN0IHJldCA9IEZhY3QuZmluZCh0aGlzLnJlZ2lvbiwgZmFjdE5hbWUpID8/IGRlZmF1bHRWYWx1ZTtcbiAgICAgIGlmIChyZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGByZWdpb24taW5mbzogZG9uJ3Qga25vdyAke2ZhY3ROYW1lfSBmb3IgcmVnaW9uICR7dGhpcy5yZWdpb259LiBVc2UgJ0ZhY3QucmVnaXN0ZXInIHRvIHByb3ZpZGUgdGhpcyB2YWx1ZS5gLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnRpdGlvbnMgPSB0aGlzLm5vZGUudHJ5R2V0Q29udGV4dChjeGFwaS5UQVJHRVRfUEFSVElUSU9OUyk7XG4gICAgaWYgKFxuICAgICAgcGFydGl0aW9ucyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBwYXJ0aXRpb25zICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAhQXJyYXkuaXNBcnJheShwYXJ0aXRpb25zKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgYENvbnRleHQgdmFsdWUgJyR7Y3hhcGkuVEFSR0VUX1BBUlRJVElPTlN9JyBzaG91bGQgYmUgYSBsaXN0IG9mIHN0cmluZ3MsIGdvdDogJHtKU09OLnN0cmluZ2lmeShwYXJ0aXRpb25zKX1gLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBsb29rdXBNYXAgPVxuICAgICAgcGFydGl0aW9ucyAhPT0gdW5kZWZpbmVkICYmIHBhcnRpdGlvbnMgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgPyBSZWdpb25JbmZvLmxpbWl0ZWRSZWdpb25NYXAoZmFjdE5hbWUsIHBhcnRpdGlvbnMpXG4gICAgICAgIDogUmVnaW9uSW5mby5yZWdpb25NYXAoZmFjdE5hbWUpO1xuXG4gICAgcmV0dXJuIGRlcGxveVRpbWVMb29rdXAodGhpcywgZmFjdE5hbWUsIGxvb2t1cE1hcCwgZGVmYXVsdFZhbHVlKTtcbiAgfVxufVxuIl19