terraconstructs 0.0.11 → 0.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +104486 -34582
- package/lib/aws/arn.js +1 -1
- package/lib/aws/aws-construct.d.ts +1 -1
- package/lib/aws/aws-construct.js +28 -2
- package/lib/aws/aws-stack.d.ts +2 -4
- package/lib/aws/aws-stack.js +21 -8
- package/lib/aws/aws-tags.d.ts +58 -0
- package/lib/aws/aws-tags.js +77 -0
- package/lib/aws/cloudwatch/actions/ec2.js +1 -1
- package/lib/aws/cloudwatch/actions/lambda.js +1 -1
- package/lib/aws/cloudwatch/alarm-base.js +1 -1
- package/lib/aws/cloudwatch/alarm-rule.js +1 -1
- package/lib/aws/cloudwatch/alarm-status-widget.js +1 -1
- package/lib/aws/cloudwatch/alarm.js +1 -1
- package/lib/aws/cloudwatch/composite-alarm.js +1 -1
- package/lib/aws/cloudwatch/dashboard.js +1 -1
- package/lib/aws/cloudwatch/data-protection-policy.js +3 -3
- package/lib/aws/cloudwatch/graph.js +8 -8
- package/lib/aws/cloudwatch/layout.js +3 -3
- package/lib/aws/cloudwatch/log-destinations/kinesis.js +1 -1
- package/lib/aws/cloudwatch/log-destinations/lambda.js +1 -1
- package/lib/aws/cloudwatch/log-group.js +1 -1
- package/lib/aws/cloudwatch/log-query.js +1 -1
- package/lib/aws/cloudwatch/log-stream.js +1 -1
- package/lib/aws/cloudwatch/metric-filter.d.ts +1 -1
- package/lib/aws/cloudwatch/metric-filter.js +4 -4
- package/lib/aws/cloudwatch/metric.js +2 -2
- package/lib/aws/cloudwatch/pattern.js +3 -3
- package/lib/aws/cloudwatch/policy.js +1 -1
- package/lib/aws/cloudwatch/private/env-tokens.js +5 -6
- package/lib/aws/cloudwatch/private/metric-util.js +4 -5
- package/lib/aws/cloudwatch/private/object.js +2 -3
- package/lib/aws/cloudwatch/private/rendering.js +3 -3
- package/lib/aws/cloudwatch/private/statistic.js +6 -7
- package/lib/aws/cloudwatch/query-definition.js +2 -2
- package/lib/aws/cloudwatch/stats.js +1 -1
- package/lib/aws/cloudwatch/subscription-filter.d.ts +1 -1
- package/lib/aws/cloudwatch/subscription-filter.js +4 -4
- package/lib/aws/cloudwatch/text.js +1 -1
- package/lib/aws/cloudwatch/variable.js +3 -3
- package/lib/aws/cloudwatch/widget.d.ts +1 -1
- package/lib/aws/cloudwatch/widget.js +4 -4
- package/lib/aws/compute/activity.js +3 -2
- package/lib/aws/compute/alb/application-listener-action.d.ts +334 -0
- package/lib/aws/compute/alb/application-listener-action.js +281 -0
- package/lib/aws/compute/alb/application-listener-certificate.d.ts +35 -0
- package/lib/aws/compute/alb/application-listener-certificate.js +35 -0
- package/lib/aws/compute/alb/application-listener-rule.d.ts +233 -0
- package/lib/aws/compute/alb/application-listener-rule.js +220 -0
- package/lib/aws/compute/alb/application-listener.d.ts +574 -0
- package/lib/aws/compute/alb/application-listener.js +538 -0
- package/lib/aws/compute/alb/application-load-balancer.d.ts +715 -0
- package/lib/aws/compute/alb/application-load-balancer.js +780 -0
- package/lib/aws/compute/alb/application-target-group.d.ts +339 -0
- package/lib/aws/compute/alb/application-target-group.js +427 -0
- package/lib/aws/compute/alb/conditions.d.ts +61 -0
- package/lib/aws/compute/alb/conditions.js +164 -0
- package/lib/aws/compute/alb/trust-store-revocation.d.ts +59 -0
- package/lib/aws/compute/alb/trust-store-revocation.js +46 -0
- package/lib/aws/compute/alb/trust-store.d.ts +86 -0
- package/lib/aws/compute/alb/trust-store.js +79 -0
- package/lib/aws/compute/architecture.js +1 -1
- package/lib/aws/compute/aspects/require-imdsv2-aspect.d.ts +75 -0
- package/lib/aws/compute/aspects/require-imdsv2-aspect.js +106 -0
- package/lib/aws/compute/bastion-host.d.ts +172 -0
- package/lib/aws/compute/bastion-host.js +114 -0
- package/lib/aws/compute/chain.js +1 -1
- package/lib/aws/compute/cidr-splits.d.ts +49 -0
- package/lib/aws/compute/cidr-splits.js +59 -0
- package/lib/aws/compute/client-vpn-authorization-rule.d.ts +43 -0
- package/lib/aws/compute/client-vpn-authorization-rule.js +30 -0
- package/lib/aws/compute/client-vpn-endpoint-types.d.ts +62 -0
- package/lib/aws/compute/client-vpn-endpoint-types.js +25 -0
- package/lib/aws/compute/client-vpn-endpoint.d.ts +239 -0
- package/lib/aws/compute/client-vpn-endpoint.js +259 -0
- package/lib/aws/compute/client-vpn-route.d.ts +67 -0
- package/lib/aws/compute/client-vpn-route.js +57 -0
- package/lib/aws/compute/condition.js +1 -1
- package/lib/aws/compute/connections.d.ts +137 -0
- package/lib/aws/compute/connections.js +208 -0
- package/lib/aws/compute/ec2-augmentations.generated.d.ts +53 -0
- package/lib/aws/compute/ec2-augmentations.generated.js +35 -0
- package/lib/aws/compute/ec2-canned-metrics.generated.d.ts +555 -0
- package/lib/aws/compute/ec2-canned-metrics.generated.js +681 -0
- package/lib/aws/compute/ec2-util-v2.d.ts +141 -0
- package/lib/aws/compute/ec2-util-v2.js +286 -0
- package/lib/aws/compute/ec2-util.d.ts +52 -0
- package/lib/aws/compute/ec2-util.js +138 -0
- package/lib/aws/compute/elasticloadbalancing-canned-metrics.generated.d.ts +176 -0
- package/lib/aws/compute/elasticloadbalancing-canned-metrics.generated.js +119 -0
- package/lib/aws/compute/elasticloadbalancingv2-canned-metrics.generated.d.ts +860 -0
- package/lib/aws/compute/elasticloadbalancingv2-canned-metrics.generated.js +597 -0
- package/lib/aws/compute/event-invoke-config.js +1 -1
- package/lib/aws/compute/event-source-filter.js +2 -2
- package/lib/aws/compute/event-source-mapping.js +1 -1
- package/lib/aws/compute/event-sources/s3-onfailure-destination.js +1 -1
- package/lib/aws/compute/event-sources/s3.js +1 -1
- package/lib/aws/compute/event-sources/sqs-dlq.js +1 -1
- package/lib/aws/compute/event-sources/sqs.js +1 -1
- package/lib/aws/compute/fields.js +4 -4
- package/lib/aws/compute/function-alias.js +1 -1
- package/lib/aws/compute/function-base.js +2 -2
- package/lib/aws/compute/function-destinations/event-bridge.js +1 -1
- package/lib/aws/compute/function-destinations/function.js +1 -1
- package/lib/aws/compute/function-destinations/sqs.js +1 -1
- package/lib/aws/compute/function-nodejs.js +1 -1
- package/lib/aws/compute/function-url.js +1 -1
- package/lib/aws/compute/function-vpc-config.generated.d.ts +3 -3
- package/lib/aws/compute/function-vpc-config.generated.js +1 -1
- package/lib/aws/compute/function.d.ts +1 -1
- package/lib/aws/compute/function.js +5 -5
- package/lib/aws/compute/index-alpha.d.ts +5 -0
- package/lib/aws/compute/index-alpha.js +22 -0
- package/lib/aws/compute/index.d.ts +60 -0
- package/lib/aws/compute/index.js +70 -2
- package/lib/aws/compute/instance-types.d.ts +1354 -0
- package/lib/aws/compute/instance-types.js +1683 -0
- package/lib/aws/compute/instance.d.ts +436 -0
- package/lib/aws/compute/instance.js +262 -0
- package/lib/aws/compute/ip-addresses.d.ts +249 -0
- package/lib/aws/compute/ip-addresses.js +248 -0
- package/lib/aws/compute/ipam.d.ts +309 -0
- package/lib/aws/compute/ipam.js +306 -0
- package/lib/aws/compute/key-pair.d.ts +178 -0
- package/lib/aws/compute/key-pair.js +194 -0
- package/lib/aws/compute/lambda-augmentations.generated.d.ts +65 -0
- package/lib/aws/compute/lambda-augmentations.generated.js +41 -0
- package/lib/aws/compute/lambda-canned-metrics.generated.d.ts +316 -0
- package/lib/aws/compute/lambda-canned-metrics.generated.js +119 -0
- package/lib/aws/compute/launch-template.d.ts +540 -0
- package/lib/aws/compute/launch-template.js +468 -0
- package/lib/aws/compute/lb-shared/access-logs-accounts.d.ts +7 -0
- package/lib/aws/compute/lb-shared/access-logs-accounts.js +46 -0
- package/lib/aws/compute/lb-shared/base-listener.d.ts +113 -0
- package/lib/aws/compute/lb-shared/base-listener.js +181 -0
- package/lib/aws/compute/lb-shared/base-load-balancer.d.ts +212 -0
- package/lib/aws/compute/lb-shared/base-load-balancer.js +290 -0
- package/lib/aws/compute/lb-shared/base-target-group.d.ts +382 -0
- package/lib/aws/compute/lb-shared/base-target-group.js +364 -0
- package/lib/aws/compute/lb-shared/enums.d.ts +282 -0
- package/lib/aws/compute/lb-shared/enums.js +301 -0
- package/lib/aws/compute/lb-shared/grid-lookup-types.d.ts +42 -0
- package/lib/aws/compute/lb-shared/grid-lookup-types.js +53 -0
- package/lib/aws/compute/lb-shared/imported.d.ts +24 -0
- package/lib/aws/compute/lb-shared/imported.js +27 -0
- package/lib/aws/compute/lb-shared/lb-listener-config.generated.d.ts +194 -0
- package/lib/aws/compute/lb-shared/lb-listener-config.generated.js +3 -0
- package/lib/aws/compute/lb-shared/lb-target-group-attachment-config.generated.d.ts +56 -0
- package/lib/aws/compute/lb-shared/lb-target-group-attachment-config.generated.js +3 -0
- package/lib/aws/compute/lb-shared/listener-action.d.ts +14 -0
- package/lib/aws/compute/lb-shared/listener-action.js +4 -0
- package/lib/aws/compute/lb-shared/listener-certificate.d.ts +28 -0
- package/lib/aws/compute/lb-shared/listener-certificate.js +29 -0
- package/lib/aws/compute/lb-shared/load-balancer-targets.d.ts +93 -0
- package/lib/aws/compute/lb-shared/load-balancer-targets.js +127 -0
- package/lib/aws/compute/lb-shared/util.d.ts +113 -0
- package/lib/aws/compute/lb-shared/util.js +264 -0
- package/lib/aws/compute/lb-targets/alb-target.d.ts +67 -0
- package/lib/aws/compute/lb-targets/alb-target.js +100 -0
- package/lib/aws/compute/lb-targets/index.d.ts +4 -0
- package/lib/aws/compute/lb-targets/index.js +22 -0
- package/lib/aws/compute/lb-targets/instance-target.d.ts +42 -0
- package/lib/aws/compute/lb-targets/instance-target.js +67 -0
- package/lib/aws/compute/lb-targets/ip-target.d.ts +55 -0
- package/lib/aws/compute/lb-targets/ip-target.js +79 -0
- package/lib/aws/compute/lb-targets/lambda-target.d.ts +25 -0
- package/lib/aws/compute/lb-targets/lambda-target.js +50 -0
- package/lib/aws/compute/load-balancer.d.ts +336 -0
- package/lib/aws/compute/load-balancer.js +287 -0
- package/lib/aws/compute/machine-image/amazon-linux-2022.d.ts +63 -0
- package/lib/aws/compute/machine-image/amazon-linux-2022.js +84 -0
- package/lib/aws/compute/machine-image/amazon-linux-2023.d.ts +63 -0
- package/lib/aws/compute/machine-image/amazon-linux-2023.js +84 -0
- package/lib/aws/compute/machine-image/amazon-linux2.d.ts +76 -0
- package/lib/aws/compute/machine-image/amazon-linux2.js +87 -0
- package/lib/aws/compute/machine-image/common.d.ts +181 -0
- package/lib/aws/compute/machine-image/common.js +122 -0
- package/lib/aws/compute/machine-image/index.d.ts +5 -0
- package/lib/aws/compute/machine-image/index.js +22 -0
- package/lib/aws/compute/machine-image/machine-image.d.ts +463 -0
- package/lib/aws/compute/machine-image/machine-image.js +566 -0
- package/lib/aws/compute/machine-image/utils.d.ts +2 -0
- package/lib/aws/compute/machine-image/utils.js +17 -0
- package/lib/aws/compute/nat.d.ts +325 -0
- package/lib/aws/compute/nat.js +455 -0
- package/lib/aws/compute/network-acl-types.d.ts +152 -0
- package/lib/aws/compute/network-acl-types.js +156 -0
- package/lib/aws/compute/network-acl.d.ts +285 -0
- package/lib/aws/compute/network-acl.js +207 -0
- package/lib/aws/compute/network-util.d.ts +116 -0
- package/lib/aws/compute/network-util.js +241 -0
- package/lib/aws/compute/nlb/network-listener-action.d.ts +92 -0
- package/lib/aws/compute/nlb/network-listener-action.js +146 -0
- package/lib/aws/compute/nlb/network-listener-certificate.d.ts +24 -0
- package/lib/aws/compute/nlb/network-listener-certificate.js +25 -0
- package/lib/aws/compute/nlb/network-listener.d.ts +248 -0
- package/lib/aws/compute/nlb/network-listener.js +217 -0
- package/lib/aws/compute/nlb/network-load-balancer.d.ts +315 -0
- package/lib/aws/compute/nlb/network-load-balancer.js +360 -0
- package/lib/aws/compute/nlb/network-target-group.d.ts +153 -0
- package/lib/aws/compute/nlb/network-target-group.js +223 -0
- package/lib/aws/compute/peer.d.ts +64 -0
- package/lib/aws/compute/peer.js +235 -0
- package/lib/aws/compute/placement-group.d.ts +161 -0
- package/lib/aws/compute/placement-group.js +133 -0
- package/lib/aws/compute/port.d.ts +287 -0
- package/lib/aws/compute/port.js +390 -0
- package/lib/aws/compute/prefix-list.d.ts +131 -0
- package/lib/aws/compute/prefix-list.js +114 -0
- package/lib/aws/compute/private/context-stub.d.ts +7 -0
- package/lib/aws/compute/private/context-stub.js +43 -0
- package/lib/aws/compute/private/ebs-util.d.ts +14 -0
- package/lib/aws/compute/private/ebs-util.js +145 -0
- package/lib/aws/compute/private/intrinstics.js +2 -1
- package/lib/aws/compute/private/json-path.js +8 -8
- package/lib/aws/compute/private/util.js +2 -3
- package/lib/aws/compute/route.d.ts +547 -0
- package/lib/aws/compute/route.js +469 -0
- package/lib/aws/compute/security-group.d.ts +414 -0
- package/lib/aws/compute/security-group.js +538 -0
- package/lib/aws/compute/state-graph.js +1 -1
- package/lib/aws/compute/state-machine-fragment.js +1 -1
- package/lib/aws/compute/state-machine.d.ts +2 -2
- package/lib/aws/compute/state-machine.js +14 -12
- package/lib/aws/compute/states/choice.js +1 -1
- package/lib/aws/compute/states/custom-state.js +1 -1
- package/lib/aws/compute/states/distributed-map/item-batcher.js +1 -1
- package/lib/aws/compute/states/distributed-map/item-reader.js +5 -5
- package/lib/aws/compute/states/distributed-map/result-writer.js +1 -1
- package/lib/aws/compute/states/distributed-map.js +1 -1
- package/lib/aws/compute/states/fail.js +1 -1
- package/lib/aws/compute/states/map-base.js +1 -1
- package/lib/aws/compute/states/map.js +1 -1
- package/lib/aws/compute/states/parallel.js +1 -1
- package/lib/aws/compute/states/pass.js +2 -2
- package/lib/aws/compute/states/state.js +5 -5
- package/lib/aws/compute/states/succeed.js +1 -1
- package/lib/aws/compute/states/task-base.js +2 -2
- package/lib/aws/compute/states/task.js +1 -1
- package/lib/aws/compute/states/wait.js +2 -2
- package/lib/aws/compute/stepfunctions-canned-metrics.generated.d.ts +83 -0
- package/lib/aws/compute/stepfunctions-canned-metrics.generated.js +127 -0
- package/lib/aws/compute/subnet-v2.d.ts +213 -0
- package/lib/aws/compute/subnet-v2.js +405 -0
- package/lib/aws/compute/subnet.d.ts +37 -0
- package/lib/aws/compute/subnet.js +181 -0
- package/lib/aws/compute/task-credentials.js +1 -1
- package/lib/aws/compute/task-input.js +1 -1
- package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +1 -1
- package/lib/aws/compute/tasks/eventbridge/put-events.js +1 -1
- package/lib/aws/compute/tasks/http/invoke.js +1 -1
- package/lib/aws/compute/tasks/lambda/invoke.js +1 -1
- package/lib/aws/compute/tasks/private/task-utils.js +3 -4
- package/lib/aws/compute/tasks/resource-arn-suffix.js +2 -3
- package/lib/aws/compute/tasks/sqs/send-message.js +1 -1
- package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +1 -1
- package/lib/aws/compute/tasks/stepfunctions/start-execution.js +1 -1
- package/lib/aws/compute/types.js +2 -2
- package/lib/aws/compute/user-data.d.ts +270 -0
- package/lib/aws/compute/user-data.js +487 -0
- package/lib/aws/compute/util.d.ts +1 -1
- package/lib/aws/compute/util.js +4 -5
- package/lib/aws/compute/volume.d.ts +480 -0
- package/lib/aws/compute/volume.js +426 -0
- package/lib/aws/compute/vpc-endpoint-service.d.ts +149 -0
- package/lib/aws/compute/vpc-endpoint-service.js +90 -0
- package/lib/aws/compute/vpc-endpoint.d.ts +742 -0
- package/lib/aws/compute/vpc-endpoint.js +811 -0
- package/lib/aws/compute/vpc-flow-logs.d.ts +551 -0
- package/lib/aws/compute/vpc-flow-logs.js +693 -0
- package/lib/aws/compute/vpc-lookup.d.ts +73 -0
- package/lib/aws/compute/vpc-lookup.js +3 -0
- package/lib/aws/compute/vpc-v2-base.d.ts +353 -0
- package/lib/aws/compute/vpc-v2-base.js +493 -0
- package/lib/aws/compute/vpc-v2.d.ts +385 -0
- package/lib/aws/compute/vpc-v2.js +408 -0
- package/lib/aws/compute/vpc.d.ts +1448 -0
- package/lib/aws/compute/vpc.js +1495 -0
- package/lib/aws/compute/vpn.d.ts +443 -0
- package/lib/aws/compute/vpn.js +397 -0
- package/lib/aws/compute/windows-versions.d.ts +418 -0
- package/lib/aws/compute/windows-versions.js +426 -0
- package/lib/aws/edge/certificate-base.d.ts +20 -0
- package/lib/aws/edge/certificate-base.js +28 -0
- package/lib/aws/edge/certificate.d.ts +23 -2
- package/lib/aws/edge/certificate.js +54 -4
- package/lib/aws/edge/distribution.js +3 -3
- package/lib/aws/edge/dns-alias-record-targets.js +2 -2
- package/lib/aws/edge/dns-record.js +16 -16
- package/lib/aws/edge/dns-zone.d.ts +20 -2
- package/lib/aws/edge/dns-zone.js +25 -10
- package/lib/aws/edge/function.js +2 -2
- package/lib/aws/edge/index.d.ts +1 -0
- package/lib/aws/edge/index.js +2 -1
- package/lib/aws/edge/key-value-store.js +4 -4
- package/lib/aws/edge/origin.js +7 -5
- package/lib/aws/edge/response-headers-policy.js +1 -1
- package/lib/aws/encryption/alias.js +1 -1
- package/lib/aws/encryption/key.js +1 -1
- package/lib/aws/encryption/via-service-principal.js +1 -1
- package/lib/aws/iam/grant.js +2 -2
- package/lib/aws/iam/index.d.ts +1 -0
- package/lib/aws/iam/index.js +2 -1
- package/lib/aws/iam/instance-profile.d.ts +155 -0
- package/lib/aws/iam/instance-profile.js +124 -0
- package/lib/aws/iam/managed-policy.js +1 -1
- package/lib/aws/iam/oidc-provider.js +1 -1
- package/lib/aws/iam/policy-document-config.generated.d.ts +8 -8
- package/lib/aws/iam/policy-document-config.generated.js +1 -1
- package/lib/aws/iam/policy-document.js +1 -1
- package/lib/aws/iam/policy-statement-props.generated.d.ts +8 -8
- package/lib/aws/iam/policy-statement-props.generated.js +1 -1
- package/lib/aws/iam/policy-statement.js +9 -9
- package/lib/aws/iam/policy.js +1 -1
- package/lib/aws/iam/principals.js +26 -26
- package/lib/aws/iam/private/assume-role-policy.js +2 -3
- package/lib/aws/iam/private/comparable-principal.js +2 -3
- package/lib/aws/iam/private/immutable-role.d.ts +2 -1
- package/lib/aws/iam/private/immutable-role.js +3 -3
- package/lib/aws/iam/private/imported-role.d.ts +1 -1
- package/lib/aws/iam/private/imported-role.js +3 -3
- package/lib/aws/iam/private/merge-statements.js +2 -3
- package/lib/aws/iam/private/util.js +4 -4
- package/lib/aws/iam/role.js +1 -1
- package/lib/aws/iam/saml-provider.d.ts +1 -1
- package/lib/aws/iam/saml-provider.js +6 -6
- package/lib/aws/iam/unknown-principal.js +1 -1
- package/lib/aws/iam/utils.js +2 -3
- package/lib/aws/index.d.ts +1 -0
- package/lib/aws/index.js +4 -1
- package/lib/aws/network/simple-ipv4-vpc.js +5 -5
- package/lib/aws/network/subnet-group.js +3 -3
- package/lib/aws/network/subnet.d.ts +1 -1
- package/lib/aws/network/subnet.js +7 -7
- package/lib/aws/notify/archive.js +3 -2
- package/lib/aws/notify/connection.js +5 -4
- package/lib/aws/notify/event-bus.js +5 -4
- package/lib/aws/notify/event-pattern.js +3 -3
- package/lib/aws/notify/index.js +3 -1
- package/lib/aws/notify/input.js +4 -3
- package/lib/aws/notify/kinesis-stream.js +3 -2
- package/lib/aws/notify/on-event-options.js +2 -1
- package/lib/aws/notify/queue-config.generated.d.ts +18 -11
- package/lib/aws/notify/queue-config.generated.js +1 -1
- package/lib/aws/notify/queue-policy.js +1 -1
- package/lib/aws/notify/queue.js +1 -1
- package/lib/aws/notify/resource-policy.js +1 -1
- package/lib/aws/notify/rule.js +3 -2
- package/lib/aws/notify/schedule.js +2 -2
- package/lib/aws/notify/sqs-augmentations.generated.d.ts +125 -0
- package/lib/aws/notify/sqs-augmentations.generated.js +74 -0
- package/lib/aws/notify/target.js +2 -1
- package/lib/aws/notify/targets/event-bus.js +1 -1
- package/lib/aws/notify/targets/function.js +1 -1
- package/lib/aws/notify/targets/log-group.js +2 -2
- package/lib/aws/notify/targets/sqs.js +1 -1
- package/lib/aws/notify/targets/state-machine.js +1 -1
- package/lib/aws/notify/targets/util.d.ts +1 -1
- package/lib/aws/notify/targets/util.js +10 -11
- package/lib/aws/notify/util.js +4 -4
- package/lib/aws/provider-config.generated.d.ts +33 -33
- package/lib/aws/provider-config.generated.js +1 -1
- package/lib/aws/storage/bucket-notifications.js +1 -1
- package/lib/aws/storage/bucket-policy.js +1 -1
- package/lib/aws/storage/bucket-source.js +1 -1
- package/lib/aws/storage/bucket.d.ts +298 -65
- package/lib/aws/storage/bucket.js +548 -225
- package/lib/aws/storage/cors-config.generated.d.ts +3 -3
- package/lib/aws/storage/cors-config.generated.js +1 -1
- package/lib/aws/storage/cors-rule-config.generated.d.ts +5 -5
- package/lib/aws/storage/cors-rule-config.generated.js +1 -1
- package/lib/aws/storage/index.d.ts +1 -0
- package/lib/aws/storage/index.js +2 -1
- package/lib/aws/storage/lifecycle-config.generated.d.ts +11 -11
- package/lib/aws/storage/lifecycle-config.generated.js +1 -1
- package/lib/aws/storage/notification-targets/function.js +6 -6
- package/lib/aws/storage/notification-targets/queue.js +1 -1
- package/lib/aws/storage/origin-access-identity.d.ts +1 -1
- package/lib/aws/storage/origin-access-identity.js +5 -4
- package/lib/aws/storage/parameter-util.d.ts +12 -0
- package/lib/aws/storage/parameter-util.js +65 -0
- package/lib/aws/storage/parameter.d.ts +526 -0
- package/lib/aws/storage/parameter.js +606 -0
- package/lib/aws/storage/s3-canned-metrics.generated.d.ts +22 -0
- package/lib/aws/storage/s3-canned-metrics.generated.js +23 -0
- package/lib/aws/storage/util.d.ts +25 -3
- package/lib/aws/storage/util.js +84 -17
- package/lib/aws/storage/website-config.generated.d.ts +5 -5
- package/lib/aws/storage/website-config.generated.js +1 -1
- package/lib/aws/util.js +2 -3
- package/lib/construct-base.d.ts +10 -1
- package/lib/construct-base.js +9 -6
- package/lib/duration.js +1 -1
- package/lib/expiration.d.ts +48 -0
- package/lib/expiration.js +68 -0
- package/lib/helpers-internal/index.d.ts +1 -0
- package/lib/helpers-internal/index.js +7 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +3 -1
- package/lib/private/md5.d.ts +4 -0
- package/lib/private/md5.js +14 -0
- package/lib/private/unique-resource-name.js +3 -4
- package/lib/size.js +2 -2
- package/lib/stack-base.d.ts +4 -23
- package/lib/stack-base.js +9 -30
- package/lib/terra-func.d.ts +103 -0
- package/lib/terra-func.js +170 -0
- package/lib/token.js +5 -5
- package/package.json +15 -8
- package/bun.lockb +0 -0
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var _a;
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.
|
|
4
|
+
exports.Effect = exports.PolicyStatement = void 0;
|
|
5
|
+
exports.deriveEstimateSizeOptions = deriveEstimateSizeOptions;
|
|
6
|
+
exports.isStringOrArrayOfStrings = isStringOrArrayOfStrings;
|
|
7
|
+
exports.fromConditionJson = fromConditionJson;
|
|
8
|
+
exports.toConditions = toConditions;
|
|
9
|
+
exports.toConditionJson = toConditionJson;
|
|
10
|
+
exports.validateConditionObject = validateConditionObject;
|
|
5
11
|
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
12
|
const cdktf_1 = require("cdktf");
|
|
7
13
|
const principals_1 = require("./principals");
|
|
@@ -679,7 +685,7 @@ class PolicyStatement {
|
|
|
679
685
|
}
|
|
680
686
|
exports.PolicyStatement = PolicyStatement;
|
|
681
687
|
_a = JSII_RTTI_SYMBOL_1;
|
|
682
|
-
PolicyStatement[_a] = { fqn: "terraconstructs.aws.iam.PolicyStatement", version: "0.0.
|
|
688
|
+
PolicyStatement[_a] = { fqn: "terraconstructs.aws.iam.PolicyStatement", version: "0.0.12" };
|
|
683
689
|
/**
|
|
684
690
|
* The Effect element of an IAM policy
|
|
685
691
|
*
|
|
@@ -719,7 +725,6 @@ function deriveEstimateSizeOptions(_scope) {
|
|
|
719
725
|
const arnEstimate = DEFAULT_ARN_SIZE_ESTIMATE;
|
|
720
726
|
return { actionEstimate, arnEstimate };
|
|
721
727
|
}
|
|
722
|
-
exports.deriveEstimateSizeOptions = deriveEstimateSizeOptions;
|
|
723
728
|
/**
|
|
724
729
|
* A class that behaves both as a set and an array
|
|
725
730
|
*
|
|
@@ -859,7 +864,6 @@ function isStringOrArrayOfStrings(value) {
|
|
|
859
864
|
}
|
|
860
865
|
return false;
|
|
861
866
|
}
|
|
862
|
-
exports.isStringOrArrayOfStrings = isStringOrArrayOfStrings;
|
|
863
867
|
/**
|
|
864
868
|
* Convert a condition JSON object to a list of Terraform AWS Policy Statement Conditions
|
|
865
869
|
*
|
|
@@ -893,7 +897,6 @@ function fromConditionJson(conditionJson) {
|
|
|
893
897
|
}
|
|
894
898
|
return result;
|
|
895
899
|
}
|
|
896
|
-
exports.fromConditionJson = fromConditionJson;
|
|
897
900
|
/**
|
|
898
901
|
* flatten Conditions mapped by test and variable to an array of Terraform AWS Policy Statement Conditions
|
|
899
902
|
* @param conditionMap The condition map
|
|
@@ -909,7 +912,6 @@ function toConditions(conditionMap) {
|
|
|
909
912
|
// }
|
|
910
913
|
// return conditions;
|
|
911
914
|
}
|
|
912
|
-
exports.toConditions = toConditions;
|
|
913
915
|
/**
|
|
914
916
|
* Convert a list of Terraform AWS Policy Statement condition objects back to a condition JSON object
|
|
915
917
|
* @param conditions The list of Terraform condition objects
|
|
@@ -931,7 +933,6 @@ function toConditionJson(...conditions) {
|
|
|
931
933
|
}
|
|
932
934
|
return conditionJson;
|
|
933
935
|
}
|
|
934
|
-
exports.toConditionJson = toConditionJson;
|
|
935
936
|
/**
|
|
936
937
|
* Validate that the given value is a valid Json Condition object
|
|
937
938
|
*
|
|
@@ -943,5 +944,4 @@ function validateConditionObject(x) {
|
|
|
943
944
|
throw new Error("A Condition should be represented as a map of operator to value");
|
|
944
945
|
}
|
|
945
946
|
}
|
|
946
|
-
exports.validateConditionObject = validateConditionObject;
|
|
947
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9saWN5LXN0YXRlbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hd3MvaWFtL3BvbGljeS1zdGF0ZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSxpQ0FBOEI7QUFHOUIsNkNBZXNCO0FBRXRCOzs7Ozs7R0FNRztBQUNILE1BQU0seUJBQXlCLEdBQUcsR0FBRyxDQUFDO0FBTXRDOztHQUVHO0FBQ0gsTUFBYSxlQUFlO0lBQzFCOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFRO1FBQzdCLHVDQUF1QztRQUN2QyxNQUFNLEdBQUcsR0FBRyxJQUFJLGVBQWUsQ0FBQztZQUM5QixHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUc7WUFDWixPQUFPLEVBQUUsc0JBQXNCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztZQUMzQyxTQUFTLEVBQUUsc0JBQXNCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztZQUMvQyxTQUFTLEVBQUUsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQztZQUMzQyxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU07WUFDbEIsVUFBVSxFQUFFLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7WUFDakQsWUFBWSxFQUFFLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7WUFDckQsVUFBVSxFQUFFLEdBQUcsQ0FBQyxTQUFTO2dCQUN2QixDQUFDLENBQUMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3BDLENBQUMsQ0FBQyxTQUFTO1lBQ2IsYUFBYSxFQUFFLEdBQUcsQ0FBQyxZQUFZO2dCQUM3QixDQUFDLENBQUMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3ZDLENBQUMsQ0FBQyxTQUFTO1NBQ2QsQ0FBQyxDQUFDO1FBRUgsMERBQTBEO1FBQzFELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzFDLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBRUQsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBa0JELFlBQVksUUFBOEIsRUFBRTtRQWhCM0IsWUFBTyxHQUFHLElBQUksVUFBVSxFQUFVLENBQUM7UUFDbkMsZUFBVSxHQUFHLElBQUksVUFBVSxFQUFVLENBQUM7UUFDdEMsZUFBVSxHQUFxQixFQUFFLENBQUM7UUFDbEMsa0JBQWEsR0FBcUIsRUFBRSxDQUFDO1FBQ3JDLGNBQVMsR0FBRyxJQUFJLFVBQVUsRUFBVSxDQUFDO1FBQ3JDLGlCQUFZLEdBQUcsSUFBSSxVQUFVLEVBQVUsQ0FBQztRQUN4QyxrQkFBYSxHQUFpQixFQUFFLENBQUM7UUFLbEQsOEJBQThCO1FBQ2IsZ0JBQVcsR0FBRyxJQUFJLFVBQVUsRUFBYyxDQUFDO1FBQzNDLG1CQUFjLEdBQUcsSUFBSSxVQUFVLEVBQWMsQ0FBQztRQUN2RCxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBR3RCLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQztRQUN0QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQztRQUU1QyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BELHNDQUFzQztRQUN0QyxJQUFJLEtBQUssQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6QyxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxHQUFHO1FBQ1osT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsR0FBRyxDQUFDLEdBQXVCO1FBQ3BDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7SUFDbEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxNQUFNO1FBQ2YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsTUFBTSxDQUFDLE1BQWM7UUFDOUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztJQUN4QixDQUFDO0lBRUQsRUFBRTtJQUNGLFVBQVU7SUFDVixFQUFFO0lBRUY7Ozs7OztPQU1HO0lBQ0ksVUFBVSxDQUFDLEdBQUcsT0FBaUI7UUFDcEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNuQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JELE1BQU0sSUFBSSxLQUFLLENBQ2IsMEVBQTBFLENBQzNFLENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxhQUFhLENBQUMsR0FBRyxVQUFvQjtRQUMxQyxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3RDLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDckQsTUFBTSxJQUFJLEtBQUssQ0FDYiwwRUFBMEUsQ0FDM0UsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsRUFBRTtJQUNGLFlBQVk7SUFDWixFQUFFO0lBRUY7O09BRUc7SUFDSCxJQUFXLFlBQVk7UUFDckIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGFBQWEsQ0FBQyxHQUFHLFVBQXdCO1FBQzlDLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDdEMsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM1RCxNQUFNLElBQUksS0FBSyxDQUNiLGdGQUFnRixDQUNqRixDQUFDO1FBQ0osQ0FBQztRQUNELDhEQUE4RDtRQUM5RCx3Q0FBd0M7UUFDeEMsNkNBQTZDO1FBQzdDLElBQUk7UUFFSixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDO1FBQ25ELEtBQUssTUFBTSxTQUFTLElBQUksS0FBSyxFQUFFLENBQUM7WUFDOUIsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQztZQUMxQyxJQUFBLDJCQUFjLEVBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3RELENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLGdCQUFnQixDQUFDLEdBQUcsYUFBMkI7UUFDcEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3pDLElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDNUQsTUFBTSxJQUFJLEtBQUssQ0FDYixnRkFBZ0YsQ0FDakYsQ0FBQztRQUNKLENBQUM7UUFDRCw4Q0FBOEM7UUFDOUMsZ0RBQWdEO1FBQ2hELElBQUk7UUFFSixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDO1FBQ3pELEtBQUssTUFBTSxZQUFZLElBQUksS0FBSyxFQUFFLENBQUM7WUFDakMsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGNBQWMsQ0FBQztZQUM3QyxJQUFBLDJCQUFjLEVBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3RELENBQUM7SUFDSCxDQUFDO0lBRU8scUJBQXFCLENBQUMsT0FBaUI7UUFDN0Msd0RBQXdEO1FBQ3hELElBQUksYUFBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUM7WUFBRSxPQUFPO1FBQ3hDLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ25DLElBQ0UsQ0FBQyxhQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztnQkFDM0IsQ0FBQyxvQ0FBb0MsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQ2xELENBQUM7Z0JBQ0QsTUFBTSxJQUFJLEtBQUssQ0FDYixXQUFXLE1BQU0seUlBQXlJLENBQzNKLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLHNCQUFzQixDQUFDLFNBQWlCO1FBQzdDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSw2QkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLGVBQWUsQ0FBQyxHQUFXO1FBQ2hDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSx5QkFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksbUJBQW1CLENBQUMsT0FBZSxFQUFFLElBQTJCO1FBQ3JFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSw2QkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0kscUJBQXFCLENBQUMsU0FBYyxFQUFFLFVBQXNCO1FBQ2pFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSwrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQ7O09BRUc7SUFDSSx1QkFBdUI7UUFDNUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLGlDQUFvQixFQUFFLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLHlCQUF5QixDQUFDLGVBQXVCO1FBQ3RELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxtQ0FBc0IsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRDs7T0FFRztJQUNJLGVBQWU7UUFDcEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLHlCQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxFQUFFO0lBQ0YsWUFBWTtJQUNaLEVBQUU7SUFFRjs7Ozs7OztPQU9HO0lBQ0ksWUFBWSxDQUFDLEdBQUcsSUFBYztRQUNuQyxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3JDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEQsTUFBTSxJQUFJLEtBQUssQ0FDYiw4RUFBOEUsQ0FDL0UsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksZUFBZSxDQUFDLEdBQUcsSUFBYztRQUN0QyxJQUFJLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDeEMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNqRCxNQUFNLElBQUksS0FBSyxDQUNiLDhFQUE4RSxDQUMvRSxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksZUFBZTtRQUNwQixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsV0FBVztRQUNwQixPQUFPLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCxFQUFFO0lBQ0YsWUFBWTtJQUNaLEVBQUU7SUFFRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQStCRztJQUNJLFlBQVksQ0FBQyxTQUFvQjtRQUN0QyxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXJDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMxQyxDQUFDO1FBRUQsTUFBTSxpQkFBaUIsR0FDckIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pELElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUc7Z0JBQ3ZELEdBQUcsaUJBQWlCO2dCQUNwQixHQUFHLFNBQVM7YUFDYixDQUFDO1FBQ0osQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsU0FBUyxDQUFDO1FBQ3JFLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BdUJHO0lBQ0ksa0JBQWtCLENBQUMsR0FBVyxFQUFFLEtBQWM7UUFDbkQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNyQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNqQyxNQUFNLElBQUksS0FBSyxDQUNiLDhEQUE4RCxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQy9FLENBQUM7WUFDSixDQUFDO1lBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQztnQkFDaEIsSUFBSSxFQUFFLEdBQUc7Z0JBQ1QsUUFBUSxFQUFFLENBQUM7Z0JBQ1gsTUFBTSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDbkMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksYUFBYSxDQUFDLEdBQUcsVUFBdUI7UUFDN0MsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLG1CQUFtQixDQUFDLFVBQW1DO1FBQzVELEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDdEQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN0QyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLG1CQUFtQixDQUFDLEdBQUcsVUFBb0I7UUFDaEQsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUNoQixJQUFJLEVBQUUsY0FBYztZQUNwQixRQUFRLEVBQUUsZ0JBQWdCO1lBQzFCLE1BQU0sRUFBRSxVQUFVO1NBQ25CLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSx5QkFBeUIsQ0FBQyxHQUFHLFVBQW9CO1FBQ3RELElBQUksQ0FBQyxZQUFZLENBQUM7WUFDaEIsSUFBSSxFQUFFLGNBQWM7WUFDcEIsUUFBUSxFQUFFLG1CQUFtQjtZQUM3QixNQUFNLEVBQUUsVUFBVTtTQUNuQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0kscUJBQXFCLENBQUMsR0FBRyxJQUFjO1FBQzVDLElBQUksQ0FBQyxZQUFZLENBQUM7WUFDaEIsSUFBSSxFQUFFLFdBQVc7WUFDakIsUUFBUSxFQUFFLGVBQWU7WUFDekIsTUFBTSxFQUFFLElBQUk7U0FDYixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksSUFBSSxDQUFDLFlBQWtDLEVBQUU7UUFDOUMsT0FBTyxJQUFJLGVBQWUsQ0FBQztZQUN6QixHQUFHLEVBQUUsU0FBUyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRztZQUM5QixNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTTtZQUN2QyxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTztZQUMxQyxVQUFVLEVBQUUsU0FBUyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVTtZQUVuRCxVQUFVLEVBQUUsU0FBUyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVTtZQUNuRCxhQUFhLEVBQUUsU0FBUyxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsYUFBYTtZQUU1RCxTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUztZQUNoRCxZQUFZLEVBQUUsU0FBUyxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWTtZQUV6RCxTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVTtTQUNsRCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxlQUFlO1FBQ3BCLE9BQU8sa0JBQWtCLENBQUM7WUFDeEIsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO1lBQzdCLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRTtZQUNuQyxTQUFTLEVBQUUsZUFBZSxDQUFDLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMvRCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsU0FBUyxFQUFFLElBQUEsNEJBQWUsRUFBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7WUFDOUMsWUFBWSxFQUFFLElBQUEsNEJBQWUsRUFBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDcEQsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFO1lBQ2pDLFdBQVcsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTtZQUN2QyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7U0FDZCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxRQUFRO1FBQ2IsT0FBTyxhQUFLLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtZQUMxQixXQUFXLEVBQUUsaUJBQWlCO1NBQy9CLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTTtRQUNYLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUN4QyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQ25DLENBQUM7UUFDRixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FDOUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUNuQyxDQUFDO1FBRUYsT0FBTztZQUNMLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztZQUNiLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDM0QsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUNwRSxVQUFVLEVBQUUsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUMxRCxhQUFhLEVBQUUsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUNuRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQ2pFLFlBQVksRUFDVixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDOUQsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUNuRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07U0FDcEIsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSyxzQkFBc0IsQ0FDNUIsR0FBRyxVQUFpRjtRQUVwRixpRUFBaUU7UUFDakUsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNuRCxJQUFJLElBQUksQ0FBQyx1QkFBdUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMvQyxpQ0FBaUM7WUFDakMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLGVBQWUsQ0FBQztRQUNqRCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksSUFBSSxDQUFDLHVCQUF1QixLQUFLLGVBQWUsRUFBRSxDQUFDO2dCQUNyRCxNQUFNLElBQUksS0FBSyxDQUNiLDJFQUEyRSxJQUFJLENBQUMsdUJBQXVCLFVBQVUsZUFBZSxzQ0FBc0MsQ0FDdkssQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksb0JBQW9CO1FBQ3pCLE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFDbkMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDOUQsTUFBTSxDQUFDLElBQUksQ0FDVCxzRUFBc0UsQ0FDdkUsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLHlCQUF5QjtRQUM5QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUMzQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN0RSxNQUFNLENBQUMsSUFBSSxDQUNULDRGQUE0RixDQUM3RixDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0kseUJBQXlCO1FBQzlCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzNDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2xFLE1BQU0sQ0FBQyxJQUFJLENBQ1QsdUZBQXVGLENBQ3hGLENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbEUsTUFBTSxDQUFDLElBQUksQ0FDVCx3RkFBd0YsQ0FDekYsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLGFBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNJLE1BQU07UUFDWCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBVyxNQUFNO1FBQ2YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksYUFBYSxDQUFDLE9BQTRCO1FBQy9DLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztRQUVaLE1BQU0sRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRWhELEdBQUcsSUFBSSxjQUFjLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUM7UUFFNUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQzlDLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUNwRCxLQUFLLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDL0MsS0FBSyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRXJELEdBQUcsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUM7UUFDNUMsR0FBRyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQztRQUUvQyxHQUFHLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDbEUsT0FBTyxHQUFHLENBQUM7UUFFWCxTQUFTLEtBQUssQ0FBQyxHQUFXLEVBQUUsTUFBZ0IsRUFBRSxTQUFpQjtZQUM3RCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RCLEdBQUc7b0JBQ0QsR0FBRyxDQUFDLE1BQU07d0JBQ1YsQ0FBQyxDQUFDLDZCQUE2Qjt3QkFDL0IsR0FBRyxDQUNELE1BQU0sQ0FBQyxHQUFHLENBQ1IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNKLENBQUMsYUFBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDOzRCQUM5QyxDQUFDLENBQUMsdUJBQXVCLENBQzVCLENBQ0YsQ0FBQztZQUNOLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssZUFBZSxDQUFDLE1BQWM7UUFDcEMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FDYixHQUFHLE1BQU0sZ0dBQWdHLENBQzFHLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQzs7QUFyd0JILDBDQXN3QkM7OztBQUVEOzs7O0dBSUc7QUFDSCxJQUFZLE1BWVg7QUFaRCxXQUFZLE1BQU07SUFDaEI7O09BRUc7SUFDSCx5QkFBZSxDQUFBO0lBRWY7Ozs7T0FJRztJQUNILHVCQUFhLENBQUE7QUFDZixDQUFDLEVBWlcsTUFBTSxzQkFBTixNQUFNLFFBWWpCO0FBb0JELHVDQUF1QztBQUV2QyxNQUFNLGFBQWMsU0FBUSwwQkFBYTtJQUl2QyxZQUFZLE9BQVksRUFBRTtRQUN4QixLQUFLLEVBQUUsQ0FBQztRQUhNLGVBQVUsR0FBcUIsRUFBRSxDQUFDO1FBSWhELElBQUksQ0FBQyxjQUFjLEdBQUcsb0NBQXVCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFTSxZQUFZO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDN0MsQ0FBQztDQUNGO0FBc0JEOzs7O0dBSUc7QUFDSCxTQUFnQix5QkFBeUIsQ0FDdkMsTUFBa0I7SUFFbEIsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDO0lBQzFCLE1BQU0sV0FBVyxHQUFHLHlCQUF5QixDQUFDO0lBQzlDLE9BQU8sRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLENBQUM7QUFDekMsQ0FBQztBQU5ELDhEQU1DO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVTtJQUFoQjtRQUNtQixRQUFHLEdBQUcsSUFBSSxHQUFHLEVBQUssQ0FBQztRQUNuQixVQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUssQ0FBQztJQXNDMUMsQ0FBQztJQXBDQzs7Ozs7O09BTUc7SUFDSSxJQUFJLENBQUMsR0FBRyxFQUFnQjtRQUM3QixNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssRUFBSyxDQUFDO1FBQzNCLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7WUFDbkIsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNwQixTQUFTO1lBQ1gsQ0FBQztZQUNELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25CLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZCxDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQsSUFBVyxNQUFNO1FBQ2YsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUMzQixDQUFDO0lBRU0sSUFBSTtRQUNULE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU07UUFDWCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztDQUNGO0FBRUQsU0FBUyxHQUFHLENBQUMsRUFBWTtJQUN2QixPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLENBQUM7QUFzQkQsU0FBUyxrQkFBa0IsQ0FBQyxDQUFrQjtJQUM1QyxPQUFPLE9BQU8sQ0FBQztRQUNiLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN6QyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDL0MsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQzdCLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUN2QixTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDdEMsWUFBWSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO1FBQzVDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUM3QyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDbkQsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0tBQ2xCLENBQUMsQ0FBQztJQUVILFNBQVMsS0FBSyxDQUNaLE1BQVcsRUFDWCxFQUFFLE1BQU0sR0FBRyxLQUFLLEtBQTBCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtRQUUzRCxJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNuQixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsSUFBSSxhQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDL0IsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDbkMsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQztZQUVELElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDeEIsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkIsQ0FBQztZQUVELE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUN2RCxDQUFDO1FBRUQsSUFBSSxNQUFNLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDekMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckMsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsU0FBUyxjQUFjLENBQ3JCLFNBQXNEO1FBRXRELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDOUQsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDcEMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBUSxFQUFFLENBQUM7UUFDdkIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2QixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdEMsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDO1lBQ3hCLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FBQyxDQUFNO0lBQ3JCLE1BQU0sR0FBRyxHQUFRLEVBQUUsQ0FBQztJQUNwQixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzdDLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDbkIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxTQUFTLHNCQUFzQixDQUFDLEtBQVU7SUFDeEMsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDeEIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3ZELE1BQU0sSUFBSSxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQzVFLE1BQU0sSUFBSSxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDaEQsQ0FBQztBQUVELFNBQWdCLHdCQUF3QixDQUN0QyxLQUFjO0lBRWQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUM1RSxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFWRCw0REFVQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxTQUFnQixpQkFBaUIsQ0FDL0IsYUFBa0Q7SUFFbEQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ25CLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBYSxDQUFDO0lBRXRDLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7UUFDOUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FDYixpQ0FBaUMsSUFBSSxLQUFLLElBQUksQ0FBQyxTQUFTLENBQ3RELFNBQVMsQ0FDVixnQ0FBZ0MsQ0FDbEMsQ0FBQztRQUNKLENBQUM7UUFDRCxLQUFLLE1BQU0sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFnQixDQUFDLEVBQUUsQ0FBQztZQUNqRSxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUNWLElBQUk7Z0JBQ0osUUFBUTtnQkFDUixNQUFNLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQzthQUMvQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUExQkQsOENBMEJDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLFlBQVksQ0FBQyxZQUEwQjtJQUNyRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FDdkQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FDekIsQ0FBQztJQUNGLHFDQUFxQztJQUNyQyw0REFBNEQ7SUFDNUQsMkRBQTJEO0lBQzNELGtDQUFrQztJQUNsQyxNQUFNO0lBQ04sSUFBSTtJQUNKLHFCQUFxQjtBQUN2QixDQUFDO0FBWEQsb0NBV0M7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsZUFBZSxDQUM3QixHQUFHLFVBQXNCO0lBRXpCLE1BQU0sYUFBYSxHQUF3QixFQUFFLENBQUM7SUFFOUMsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNuQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUM7UUFFN0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3pCLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDM0IsQ0FBQztRQUVELElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN4QixhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVDLENBQUM7YUFBTSxDQUFDO1lBQ04sYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUN6QyxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sYUFBYSxDQUFDO0FBQ3ZCLENBQUM7QUFwQkQsMENBb0JDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQix1QkFBdUIsQ0FDckMsQ0FBVTtJQUVWLElBQUksQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNwRCxNQUFNLElBQUksS0FBSyxDQUNiLGlFQUFpRSxDQUNsRSxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUM7QUFSRCwwREFRQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTYwLjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLWlhbS9saWIvcG9saWN5LXN0YXRlbWVudC50c1xuaW1wb3J0IHsgZGF0YUF3c0lhbVBvbGljeURvY3VtZW50IH0gZnJvbSBcIkBjZGt0Zi9wcm92aWRlci1hd3NcIjtcbmltcG9ydCB7IFRva2VuIH0gZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBJQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudFByb3BzIH0gZnJvbSBcIi4vcG9saWN5LXN0YXRlbWVudC1wcm9wcy5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7XG4gIEFjY291bnRQcmluY2lwYWwsXG4gIEFjY291bnRSb290UHJpbmNpcGFsLFxuICBBbnlQcmluY2lwYWwsXG4gIEFyblByaW5jaXBhbCxcbiAgQ2Fub25pY2FsVXNlclByaW5jaXBhbCxcbiAgRmVkZXJhdGVkUHJpbmNpcGFsLFxuICBQcmluY2lwYWxQb2xpY3lGcmFnbWVudCxcbiAgU2VydmljZVByaW5jaXBhbCxcbiAgU2VydmljZVByaW5jaXBhbE9wdHMsXG4gIElQcmluY2lwYWwsXG4gIFByaW5jaXBhbFByb3BzLFxuICBtZXJnZVByaW5jaXBhbCxcbiAgdG9QcmluY2lwYWxKc29uLFxuICBQcmluY2lwYWxCYXNlLFxufSBmcm9tIFwiLi9wcmluY2lwYWxzXCI7XG5cbi8qKlxuICogQW4gZXN0aW1hdGUgb24gaG93IGxvbmcgQVJOcyB0eXBpY2FsbHkgYXJlXG4gKlxuICogVGhpcyBpcyB1c2VkIHRvIGRlY2lkZSB3aGVuIHRvIHN0YXJ0IHNwbGl0dGluZyBzdGF0ZW1lbnRzIGludG8gbmV3IE1hbmFnZWQgUG9saWNpZXMuXG4gKiBCZWNhdXNlIHdlIG9mdGVuIGNhbid0IGtub3cgdGhlIGxlbmd0aCBvZiBhbiBBUk4gKGl0IG1heSBiZSBhIHRva2VuIGFuZCBvbmx5XG4gKiBhdmFpbGFibGUgYXQgZGVwbG95bWVudCB0aW1lKSB3ZSdsbCBoYXZlIHRvIGVzdGltYXRlIGl0LlxuICovXG5jb25zdCBERUZBVUxUX0FSTl9TSVpFX0VTVElNQVRFID0gMTUwO1xuXG5leHBvcnQgdHlwZSBDb25kaXRpb25NYXAgPSB7XG4gIFt0ZXN0OiBzdHJpbmddOiB7IFt2YXJpYWJsZTogc3RyaW5nXTogQ29uZGl0aW9uIH07XG59O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBzdGF0ZW1lbnQgaW4gYW4gSUFNIHBvbGljeSBkb2N1bWVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIFBvbGljeVN0YXRlbWVudCB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFRlcnJhZm9ybSBQb2xpY3lTdGF0ZW1lbnQgYmFzZWQgb24gdGhlIEFXUyBJQU0gUG9saWN5IFN0YXRlbWVudCBmb3JtYXQuXG4gICAqIFRoaXMgd2lsbCBhY2NlcHQgYW4gb2JqZWN0IGNyZWF0ZWQgZnJvbSB0aGUgYC50b1N0YXRlbWVudEpzb24oKWAgY2FsbFxuICAgKlxuICAgKiBAcGFyYW0gb2JqIHRoZSBQb2xpY3lTdGF0ZW1lbnQgaW4gb2JqZWN0IGZvcm0uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Kc29uKG9iajogYW55KSB7XG4gICAgLy8gVE9ETzogV2hhdCBpZiBvYmogaXMvaGFzIGEgVG9rZW4ocyk/XG4gICAgY29uc3QgcmV0ID0gbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICBzaWQ6IG9iai5TaWQsXG4gICAgICBhY3Rpb25zOiBlbnN1cmVBcnJheU9yVW5kZWZpbmVkKG9iai5BY3Rpb24pLFxuICAgICAgcmVzb3VyY2VzOiBlbnN1cmVBcnJheU9yVW5kZWZpbmVkKG9iai5SZXNvdXJjZSksXG4gICAgICBjb25kaXRpb246IGZyb21Db25kaXRpb25Kc29uKG9iai5Db25kaXRpb24pLFxuICAgICAgZWZmZWN0OiBvYmouRWZmZWN0LFxuICAgICAgbm90QWN0aW9uczogZW5zdXJlQXJyYXlPclVuZGVmaW5lZChvYmouTm90QWN0aW9uKSxcbiAgICAgIG5vdFJlc291cmNlczogZW5zdXJlQXJyYXlPclVuZGVmaW5lZChvYmouTm90UmVzb3VyY2UpLFxuICAgICAgcHJpbmNpcGFsczogb2JqLlByaW5jaXBhbFxuICAgICAgICA/IFtuZXcgSnNvblByaW5jaXBhbChvYmouUHJpbmNpcGFsKV1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBub3RQcmluY2lwYWxzOiBvYmouTm90UHJpbmNpcGFsXG4gICAgICAgID8gW25ldyBKc29uUHJpbmNpcGFsKG9iai5Ob3RQcmluY2lwYWwpXVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9KTtcblxuICAgIC8vIHZhbGlkYXRlIHRoYXQgdGhlIFBvbGljeVN0YXRlbWVudCBoYXMgdGhlIGNvcnJlY3Qgc2hhcGVcbiAgICBjb25zdCBlcnJvcnMgPSByZXQudmFsaWRhdGVGb3JBbnlQb2xpY3koKTtcbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkluY29ycmVjdCBQb2xpY3kgU3RhdGVtZW50OiBcIiArIGVycm9ycy5qb2luKFwiXFxuXCIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfYWN0aW9uID0gbmV3IE9yZGVyZWRTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9ub3RBY3Rpb24gPSBuZXcgT3JkZXJlZFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3ByaW5jaXBhbDogUHJpbmNpcGFsUHJvcHNbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IF9ub3RQcmluY2lwYWw6IFByaW5jaXBhbFByb3BzW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcmVzb3VyY2UgPSBuZXcgT3JkZXJlZFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX25vdFJlc291cmNlID0gbmV3IE9yZGVyZWRTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9jb25kaXRpb25NYXA6IENvbmRpdGlvbk1hcCA9IHt9O1xuICBwcml2YXRlIF9zaWQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2VmZmVjdDogRWZmZWN0O1xuICBwcml2YXRlIHByaW5jaXBhbENvbmRpdGlvbnNKc29uPzogc3RyaW5nO1xuXG4gIC8vIEhvbGQgb24gdG8gdGhvc2UgcHJpbmNpcGFsc1xuICBwcml2YXRlIHJlYWRvbmx5IF9wcmluY2lwYWxzID0gbmV3IE9yZGVyZWRTZXQ8SVByaW5jaXBhbD4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfbm90UHJpbmNpcGFscyA9IG5ldyBPcmRlcmVkU2V0PElQcmluY2lwYWw+KCk7XG4gIHByaXZhdGUgX2Zyb3plbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBQb2xpY3lTdGF0ZW1lbnRQcm9wcyA9IHt9KSB7XG4gICAgdGhpcy5fc2lkID0gcHJvcHMuc2lkO1xuICAgIHRoaXMuX2VmZmVjdCA9IHByb3BzLmVmZmVjdCB8fCBFZmZlY3QuQUxMT1c7XG5cbiAgICB0aGlzLmFkZEFjdGlvbnMoLi4uKHByb3BzLmFjdGlvbnMgfHwgW10pKTtcbiAgICB0aGlzLmFkZE5vdEFjdGlvbnMoLi4uKHByb3BzLm5vdEFjdGlvbnMgfHwgW10pKTtcbiAgICB0aGlzLmFkZFByaW5jaXBhbHMoLi4uKHByb3BzLnByaW5jaXBhbHMgfHwgW10pKTtcbiAgICB0aGlzLmFkZE5vdFByaW5jaXBhbHMoLi4uKHByb3BzLm5vdFByaW5jaXBhbHMgfHwgW10pKTtcbiAgICB0aGlzLmFkZFJlc291cmNlcyguLi4ocHJvcHMucmVzb3VyY2VzIHx8IFtdKSk7XG4gICAgdGhpcy5hZGROb3RSZXNvdXJjZXMoLi4uKHByb3BzLm5vdFJlc291cmNlcyB8fCBbXSkpO1xuICAgIC8vIFRPRE86IEhhbmRsZSBJUmVzb2x2YWJsZSBjb25kaXRpb24/XG4gICAgaWYgKHByb3BzLmNvbmRpdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmFkZENvbmRpdGlvbnMoLi4ucHJvcHMuY29uZGl0aW9uKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RhdGVtZW50IElEIGZvciB0aGlzIHN0YXRlbWVudFxuICAgKi9cbiAgcHVibGljIGdldCBzaWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBTdGF0ZW1lbnQgSUQgZm9yIHRoaXMgc3RhdGVtZW50XG4gICAqL1xuICBwdWJsaWMgc2V0IHNpZChzaWQ6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuYXNzZXJ0Tm90RnJvemVuKFwic2lkXCIpO1xuICAgIHRoaXMuX3NpZCA9IHNpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IG9yIGRlbnkgdGhlIGFjdGlvbnMgaW4gdGhpcyBzdGF0ZW1lbnRcbiAgICovXG4gIHB1YmxpYyBnZXQgZWZmZWN0KCk6IEVmZmVjdCB7XG4gICAgcmV0dXJuIHRoaXMuX2VmZmVjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZWZmZWN0IGZvciB0aGlzIHN0YXRlbWVudFxuICAgKi9cbiAgcHVibGljIHNldCBlZmZlY3QoZWZmZWN0OiBFZmZlY3QpIHtcbiAgICB0aGlzLmFzc2VydE5vdEZyb3plbihcImVmZmVjdFwiKTtcbiAgICB0aGlzLl9lZmZlY3QgPSBlZmZlY3Q7XG4gIH1cblxuICAvL1xuICAvLyBBY3Rpb25zXG4gIC8vXG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgYWxsb3dlZCBhY3Rpb25zIGludG8gdGhlIFwiQWN0aW9uXCIgc2VjdGlvbiBvZiB0aGUgcG9saWN5IHN0YXRlbWVudC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2FjdGlvbi5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBhY3Rpb25zIGFjdGlvbnMgdGhhdCB3aWxsIGJlIGFsbG93ZWQuXG4gICAqL1xuICBwdWJsaWMgYWRkQWN0aW9ucyguLi5hY3Rpb25zOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuYXNzZXJ0Tm90RnJvemVuKFwiYWRkQWN0aW9uc1wiKTtcbiAgICBpZiAoYWN0aW9ucy5sZW5ndGggPiAwICYmIHRoaXMuX25vdEFjdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiQ2Fubm90IGFkZCAnQWN0aW9ucycgdG8gcG9saWN5IHN0YXRlbWVudCBpZiAnTm90QWN0aW9ucycgaGF2ZSBiZWVuIGFkZGVkXCIsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnZhbGlkYXRlUG9saWN5QWN0aW9ucyhhY3Rpb25zKTtcbiAgICB0aGlzLl9hY3Rpb24ucHVzaCguLi5hY3Rpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBsaWNpdGx5IGFsbG93IGFsbCBhY3Rpb25zIGV4Y2VwdCB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgYWN0aW9ucyBpbnRvIHRoZSBcIk5vdEFjdGlvblwiIHNlY3Rpb25cbiAgICogb2YgdGhlIHBvbGljeSBkb2N1bWVudC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX25vdGFjdGlvbi5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBub3RBY3Rpb25zIGFjdGlvbnMgdGhhdCB3aWxsIGJlIGRlbmllZC4gQWxsIG90aGVyIGFjdGlvbnMgd2lsbCBiZSBwZXJtaXR0ZWQuXG4gICAqL1xuICBwdWJsaWMgYWRkTm90QWN0aW9ucyguLi5ub3RBY3Rpb25zOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuYXNzZXJ0Tm90RnJvemVuKFwiYWRkTm90QWN0aW9uc1wiKTtcbiAgICBpZiAobm90QWN0aW9ucy5sZW5ndGggPiAwICYmIHRoaXMuX2FjdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiQ2Fubm90IGFkZCAnTm90QWN0aW9ucycgdG8gcG9saWN5IHN0YXRlbWVudCBpZiAnQWN0aW9ucycgaGF2ZSBiZWVuIGFkZGVkXCIsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnZhbGlkYXRlUG9saWN5QWN0aW9ucyhub3RBY3Rpb25zKTtcbiAgICB0aGlzLl9ub3RBY3Rpb24ucHVzaCguLi5ub3RBY3Rpb25zKTtcbiAgfVxuXG4gIC8vXG4gIC8vIFByaW5jaXBhbFxuICAvL1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBwZXJtaXNzaW9uIGhhcyBhIFwiUHJpbmNpcGFsXCIgc2VjdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzUHJpbmNpcGFsKCkge1xuICAgIHJldHVybiB0aGlzLl9wcmluY2lwYWxzLmxlbmd0aCArIHRoaXMuX25vdFByaW5jaXBhbHMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHByaW5jaXBhbHMgdG8gdGhlIFwiUHJpbmNpcGFsXCIgc2VjdGlvbiBvZiBhIHBvbGljeSBzdGF0ZW1lbnQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19wcmluY2lwYWwuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gcHJpbmNpcGFscyBJQU0gcHJpbmNpcGFscyB0aGF0IHdpbGwgYmUgYWRkZWRcbiAgICovXG4gIHB1YmxpYyBhZGRQcmluY2lwYWxzKC4uLnByaW5jaXBhbHM6IElQcmluY2lwYWxbXSkge1xuICAgIHRoaXMuYXNzZXJ0Tm90RnJvemVuKFwiYWRkUHJpbmNpcGFsc1wiKTtcbiAgICBpZiAocHJpbmNpcGFscy5sZW5ndGggPiAwICYmIHRoaXMuX25vdFByaW5jaXBhbHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkNhbm5vdCBhZGQgJ1ByaW5jaXBhbHMnIHRvIHBvbGljeSBzdGF0ZW1lbnQgaWYgJ05vdFByaW5jaXBhbHMnIGhhdmUgYmVlbiBhZGRlZFwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gVE9ETzogQVdTQ0RLIG9ubHkgZW5zdXJlcyBQcmluY2lwYWwgaXMgbm90IGluc3RhbmNlb2YgR3JvdXBcbiAgICAvLyBmb3IgKGNvbnN0IHByaW5jaXBhbCBvZiBwcmluY2lwYWxzKSB7XG4gICAgLy8gICB0aGlzLnZhbGlkYXRlUG9saWN5UHJpbmNpcGFsKHByaW5jaXBhbCk7XG4gICAgLy8gfVxuXG4gICAgY29uc3QgYWRkZWQgPSB0aGlzLl9wcmluY2lwYWxzLnB1c2goLi4ucHJpbmNpcGFscyk7XG4gICAgZm9yIChjb25zdCBwcmluY2lwYWwgb2YgYWRkZWQpIHtcbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gcHJpbmNpcGFsLnBvbGljeUZyYWdtZW50O1xuICAgICAgbWVyZ2VQcmluY2lwYWwodGhpcy5fcHJpbmNpcGFsLCBmcmFnbWVudC5wcmluY2lwYWxzKTtcbiAgICAgIHRoaXMuYWRkUHJpbmNpcGFsQ29uZGl0aW9ucyguLi5mcmFnbWVudC5jb25kaXRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmeSBwcmluY2lwYWxzIHRoYXQgaXMgbm90IGFsbG93ZWQgb3IgZGVuaWVkIGFjY2VzcyB0byB0aGUgXCJOb3RQcmluY2lwYWxcIiBzZWN0aW9uIG9mXG4gICAqIGEgcG9saWN5IHN0YXRlbWVudC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX25vdHByaW5jaXBhbC5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBub3RQcmluY2lwYWxzIElBTSBwcmluY2lwYWxzIHRoYXQgd2lsbCBiZSBkZW5pZWQgYWNjZXNzXG4gICAqL1xuICBwdWJsaWMgYWRkTm90UHJpbmNpcGFscyguLi5ub3RQcmluY2lwYWxzOiBJUHJpbmNpcGFsW10pIHtcbiAgICB0aGlzLmFzc2VydE5vdEZyb3plbihcImFkZE5vdFByaW5jaXBhbHNcIik7XG4gICAgaWYgKG5vdFByaW5jaXBhbHMubGVuZ3RoID4gMCAmJiB0aGlzLl9wcmluY2lwYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDYW5ub3QgYWRkICdOb3RQcmluY2lwYWxzJyB0byBwb2xpY3kgc3RhdGVtZW50IGlmICdQcmluY2lwYWxzJyBoYXZlIGJlZW4gYWRkZWRcIixcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIGZvciAoY29uc3Qgbm90UHJpbmNpcGFsIG9mIG5vdFByaW5jaXBhbHMpIHtcbiAgICAvLyAgIHRoaXMudmFsaWRhdGVQb2xpY3lQcmluY2lwYWwobm90UHJpbmNpcGFsKTtcbiAgICAvLyB9XG5cbiAgICBjb25zdCBhZGRlZCA9IHRoaXMuX25vdFByaW5jaXBhbHMucHVzaCguLi5ub3RQcmluY2lwYWxzKTtcbiAgICBmb3IgKGNvbnN0IG5vdFByaW5jaXBhbCBvZiBhZGRlZCkge1xuICAgICAgY29uc3QgZnJhZ21lbnQgPSBub3RQcmluY2lwYWwucG9saWN5RnJhZ21lbnQ7XG4gICAgICBtZXJnZVByaW5jaXBhbCh0aGlzLl9ub3RQcmluY2lwYWwsIGZyYWdtZW50LnByaW5jaXBhbHMpO1xuICAgICAgdGhpcy5hZGRQcmluY2lwYWxDb25kaXRpb25zKC4uLmZyYWdtZW50LmNvbmRpdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVQb2xpY3lBY3Rpb25zKGFjdGlvbnM6IHN0cmluZ1tdKSB7XG4gICAgLy8gSW4gY2FzZSBvZiBhbiB1bnJlc29sdmVkIGxpc3Qgb2YgYWN0aW9ucyByZXR1cm4gZWFybHlcbiAgICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKGFjdGlvbnMpKSByZXR1cm47XG4gICAgZm9yIChjb25zdCBhY3Rpb24gb2YgYWN0aW9ucyB8fCBbXSkge1xuICAgICAgaWYgKFxuICAgICAgICAhVG9rZW4uaXNVbnJlc29sdmVkKGFjdGlvbikgJiZcbiAgICAgICAgIS9eKFxcKnxbYS16QS1aMC05LV0rOlthLXpBLVowLTkqXSspJC8udGVzdChhY3Rpb24pXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBBY3Rpb24gJyR7YWN0aW9ufScgaXMgaW52YWxpZC4gQW4gYWN0aW9uIHN0cmluZyBjb25zaXN0cyBvZiBhIHNlcnZpY2UgbmFtZXNwYWNlLCBhIGNvbG9uLCBhbmQgdGhlIG5hbWUgb2YgYW4gYWN0aW9uLiBBY3Rpb24gbmFtZXMgY2FuIGluY2x1ZGUgd2lsZGNhcmRzLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgQVdTIGFjY291bnQgSUQgYXMgdGhlIHByaW5jaXBhbCBlbnRpdHkgdG8gdGhlIFwiUHJpbmNpcGFsXCIgc2VjdGlvbiBvZiBhIHBvbGljeSBzdGF0ZW1lbnQuXG4gICAqL1xuICBwdWJsaWMgYWRkQXdzQWNjb3VudFByaW5jaXBhbChhY2NvdW50SWQ6IHN0cmluZykge1xuICAgIHRoaXMuYWRkUHJpbmNpcGFscyhuZXcgQWNjb3VudFByaW5jaXBhbChhY2NvdW50SWQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGEgcHJpbmNpcGFsIHVzaW5nIHRoZSBBUk4gIGlkZW50aWZpZXIgb2YgdGhlIHByaW5jaXBhbC5cbiAgICogWW91IGNhbm5vdCBzcGVjaWZ5IElBTSBncm91cHMgYW5kIGluc3RhbmNlIHByb2ZpbGVzIGFzIHByaW5jaXBhbHMuXG4gICAqXG4gICAqIEBwYXJhbSBhcm4gQVJOIGlkZW50aWZpZXIgb2YgQVdTIGFjY291bnQsIElBTSB1c2VyLCBvciBJQU0gcm9sZSAoaS5lLiBhcm46YXdzOmlhbTo6MTIzNDU2Nzg5MDEyOnVzZXIvdXNlci1uYW1lKVxuICAgKi9cbiAgcHVibGljIGFkZEFyblByaW5jaXBhbChhcm46IHN0cmluZykge1xuICAgIHRoaXMuYWRkUHJpbmNpcGFscyhuZXcgQXJuUHJpbmNpcGFsKGFybikpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBzZXJ2aWNlIHByaW5jaXBhbCB0byB0aGlzIHBvbGljeSBzdGF0ZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2aWNlIHRoZSBzZXJ2aWNlIG5hbWUgZm9yIHdoaWNoIGEgc2VydmljZSBwcmluY2lwYWwgaXMgcmVxdWVzdGVkIChlLmc6IGBzMy5hbWF6b25hd3MuY29tYCkuXG4gICAqIEBwYXJhbSBvcHRzICAgIG9wdGlvbnMgZm9yIGFkZGluZyB0aGUgc2VydmljZSBwcmluY2lwYWwgKHN1Y2ggYXMgc3BlY2lmeWluZyBhIHByaW5jaXBhbCBpbiBhIGRpZmZlcmVudCByZWdpb24pXG4gICAqL1xuICBwdWJsaWMgYWRkU2VydmljZVByaW5jaXBhbChzZXJ2aWNlOiBzdHJpbmcsIG9wdHM/OiBTZXJ2aWNlUHJpbmNpcGFsT3B0cykge1xuICAgIHRoaXMuYWRkUHJpbmNpcGFscyhuZXcgU2VydmljZVByaW5jaXBhbChzZXJ2aWNlLCBvcHRzKSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGZlZGVyYXRlZCBpZGVudGl0eSBwcm92aWRlciBzdWNoIGFzIEFtYXpvbiBDb2duaXRvIHRvIHRoaXMgcG9saWN5IHN0YXRlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGZlZGVyYXRlZCBmZWRlcmF0ZWQgaWRlbnRpdHkgcHJvdmlkZXIgKGkuZS4gJ2NvZ25pdG8taWRlbnRpdHkuYW1hem9uYXdzLmNvbScpXG4gICAqIEBwYXJhbSBjb25kaXRpb25zIFRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIHRoZSBwb2xpY3kgaXMgaW4gZWZmZWN0LlxuICAgKiAgIFNlZSBbdGhlIElBTSBkb2N1bWVudGF0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbi5odG1sKS5cbiAgICovXG4gIHB1YmxpYyBhZGRGZWRlcmF0ZWRQcmluY2lwYWwoZmVkZXJhdGVkOiBhbnksIGNvbmRpdGlvbnM6IENvbmRpdGlvbnMpIHtcbiAgICB0aGlzLmFkZFByaW5jaXBhbHMobmV3IEZlZGVyYXRlZFByaW5jaXBhbChmZWRlcmF0ZWQsIGNvbmRpdGlvbnMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIEFXUyBhY2NvdW50IHJvb3QgdXNlciBwcmluY2lwYWwgdG8gdGhpcyBwb2xpY3kgc3RhdGVtZW50XG4gICAqL1xuICBwdWJsaWMgYWRkQWNjb3VudFJvb3RQcmluY2lwYWwoKSB7XG4gICAgdGhpcy5hZGRQcmluY2lwYWxzKG5ldyBBY2NvdW50Um9vdFByaW5jaXBhbCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2Fub25pY2FsIHVzZXIgSUQgcHJpbmNpcGFsIHRvIHRoaXMgcG9saWN5IGRvY3VtZW50XG4gICAqXG4gICAqIEBwYXJhbSBjYW5vbmljYWxVc2VySWQgdW5pcXVlIGlkZW50aWZpZXIgYXNzaWduZWQgYnkgQVdTIGZvciBldmVyeSBhY2NvdW50XG4gICAqL1xuICBwdWJsaWMgYWRkQ2Fub25pY2FsVXNlclByaW5jaXBhbChjYW5vbmljYWxVc2VySWQ6IHN0cmluZykge1xuICAgIHRoaXMuYWRkUHJpbmNpcGFscyhuZXcgQ2Fub25pY2FsVXNlclByaW5jaXBhbChjYW5vbmljYWxVc2VySWQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFsbCBpZGVudGl0aWVzIGluIGFsbCBhY2NvdW50cyAoXCIqXCIpIHRvIHRoaXMgcG9saWN5IHN0YXRlbWVudFxuICAgKi9cbiAgcHVibGljIGFkZEFueVByaW5jaXBhbCgpIHtcbiAgICB0aGlzLmFkZFByaW5jaXBhbHMobmV3IEFueVByaW5jaXBhbCgpKTtcbiAgfVxuXG4gIC8vXG4gIC8vIFJlc291cmNlc1xuICAvL1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHJlc291cmNlcyB0aGF0IHRoaXMgcG9saWN5IHN0YXRlbWVudCBhcHBsaWVzIGludG8gdGhlIFwiUmVzb3VyY2VcIiBzZWN0aW9uIG9mXG4gICAqIHRoaXMgcG9saWN5IHN0YXRlbWVudC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX3Jlc291cmNlLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGFybnMgQW1hem9uIFJlc291cmNlIE5hbWVzIChBUk5zKSBvZiB0aGUgcmVzb3VyY2VzIHRoYXQgdGhpcyBwb2xpY3kgc3RhdGVtZW50IGFwcGxpZXMgdG9cbiAgICovXG4gIHB1YmxpYyBhZGRSZXNvdXJjZXMoLi4uYXJuczogc3RyaW5nW10pIHtcbiAgICB0aGlzLmFzc2VydE5vdEZyb3plbihcImFkZFJlc291cmNlc1wiKTtcbiAgICBpZiAoYXJucy5sZW5ndGggPiAwICYmIHRoaXMuX25vdFJlc291cmNlLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDYW5ub3QgYWRkICdSZXNvdXJjZXMnIHRvIHBvbGljeSBzdGF0ZW1lbnQgaWYgJ05vdFJlc291cmNlcycgaGF2ZSBiZWVuIGFkZGVkXCIsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLl9yZXNvdXJjZS5wdXNoKC4uLmFybnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgcmVzb3VyY2VzIHRoYXQgdGhpcyBwb2xpY3kgc3RhdGVtZW50IHdpbGwgbm90IGFwcGx5IHRvIGluIHRoZSBcIk5vdFJlc291cmNlXCIgc2VjdGlvblxuICAgKiBvZiB0aGlzIHBvbGljeSBzdGF0ZW1lbnQuIEFsbCByZXNvdXJjZXMgZXhjZXB0IHRoZSBzcGVjaWZpZWQgbGlzdCB3aWxsIGJlIG1hdGNoZWQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19ub3RyZXNvdXJjZS5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBhcm5zIEFtYXpvbiBSZXNvdXJjZSBOYW1lcyAoQVJOcykgb2YgdGhlIHJlc291cmNlcyB0aGF0IHRoaXMgcG9saWN5IHN0YXRlbWVudCBkb2VzIG5vdCBhcHBseSB0b1xuICAgKi9cbiAgcHVibGljIGFkZE5vdFJlc291cmNlcyguLi5hcm5zOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuYXNzZXJ0Tm90RnJvemVuKFwiYWRkTm90UmVzb3VyY2VzXCIpO1xuICAgIGlmIChhcm5zLmxlbmd0aCA+IDAgJiYgdGhpcy5fcmVzb3VyY2UubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkNhbm5vdCBhZGQgJ05vdFJlc291cmNlcycgdG8gcG9saWN5IHN0YXRlbWVudCBpZiAnUmVzb3VyY2VzJyBoYXZlIGJlZW4gYWRkZWRcIixcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuX25vdFJlc291cmNlLnB1c2goLi4uYXJucyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGBgXCIqXCJgYCByZXNvdXJjZSB0byB0aGlzIHN0YXRlbWVudC5cbiAgICovXG4gIHB1YmxpYyBhZGRBbGxSZXNvdXJjZXMoKSB7XG4gICAgdGhpcy5hZGRSZXNvdXJjZXMoXCIqXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGlzIHBlcm1pc3Npb24gaGFzIGF0IGxlYXN0IG9uZSByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggaXQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhhc1Jlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXNvdXJjZSAmJiB0aGlzLl9yZXNvdXJjZS5sZW5ndGggPiAwO1xuICB9XG5cbiAgLy9cbiAgLy8gQ29uZGl0aW9uXG4gIC8vXG5cbiAgLyoqXG4gICAqIEFkZCBhIGNvbmRpdGlvbiB0byB0aGUgUG9saWN5XG4gICAqXG4gICAqIElmIG11bHRpcGxlIGNhbGxzIGFyZSBtYWRlIHRvIGFkZCBhIGNvbmRpdGlvbiB3aXRoIHRoZSBzYW1lIHRlc3QgYW5kIHZhcmlhYmxlLCBvbmx5XG4gICAqIHRoZSBsYXN0IG9uZSB3aW5zLiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogYGBgdHNcbiAgICogZGVjbGFyZSBjb25zdCBzdG10OiBpYW0uUG9saWN5U3RhdGVtZW50O1xuICAgKlxuICAgKiBzdG10LmFkZENvbmRpdGlvbih7IHRlc3Q6ICdTdHJpbmdFcXVhbHMnLCB2YXJpYWJsZTogJ2F3czpTb21lRmllbGQnLCB2YWx1ZXM6IFsnMSddIH0pO1xuICAgKiBzdG10LmFkZENvbmRpdGlvbih7IHRlc3Q6ICdTdHJpbmdFcXVhbHMnLCB2YXJpYWJsZTogJ2F3czpTb21lRmllbGQnLCB2YWx1ZXM6IFsnMiddIH0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogV2lsbCBlbmQgdXAgd2l0aCB0aGUgc2luZ2xlIGNvbmRpdGlvblxuICAgKlxuICAgKiBgYGB0c1xuICAgKiB7XG4gICAqICAgdGVzdDogJ1N0cmluZ0VxdWFscycsXG4gICAqICAgdmFyaWFibGU6ICdhd3M6U29tZUZpZWxkJyxcbiAgICogICB2YWx1ZXM6IFsnMiddLFxuICAgKiB9XG4gICAqIGBgYC5cbiAgICpcbiAgICogSWYgeW91IG1lYW50IHRvIGFkZCBhIGNvbmRpdGlvbiB0byBzYXkgdGhhdCB0aGUgZmllbGQgY2FuIGJlICplaXRoZXIqIGAxYCBvciBgMmAsIHdyaXRlXG4gICAqIHRoaXM6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIGRlY2xhcmUgY29uc3Qgc3RtdDogaWFtLlBvbGljeVN0YXRlbWVudDtcbiAgICpcbiAgICogc3RtdC5hZGRDb25kaXRpb24oeyB0ZXN0OiAnU3RyaW5nRXF1YWxzJywgdmFyaWFibGU6ICdhd3M6U29tZUZpZWxkJywgdmFsdWVzOiBbJzEnLCAnMiddIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhZGRDb25kaXRpb24oY29uZGl0aW9uOiBDb25kaXRpb24pIHtcbiAgICB0aGlzLmFzc2VydE5vdEZyb3plbihcImFkZENvbmRpdGlvblwiKTtcblxuICAgIGlmICghdGhpcy5fY29uZGl0aW9uTWFwW2NvbmRpdGlvbi50ZXN0XSkge1xuICAgICAgdGhpcy5fY29uZGl0aW9uTWFwW2NvbmRpdGlvbi50ZXN0XSA9IHt9O1xuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nQ29uZGl0aW9uID1cbiAgICAgIHRoaXMuX2NvbmRpdGlvbk1hcFtjb25kaXRpb24udGVzdF1bY29uZGl0aW9uLnZhcmlhYmxlXTtcbiAgICBpZiAoZXhpc3RpbmdDb25kaXRpb24pIHtcbiAgICAgIHRoaXMuX2NvbmRpdGlvbk1hcFtjb25kaXRpb24udGVzdF1bY29uZGl0aW9uLnZhcmlhYmxlXSA9IHtcbiAgICAgICAgLi4uZXhpc3RpbmdDb25kaXRpb24sXG4gICAgICAgIC4uLmNvbmRpdGlvbixcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2NvbmRpdGlvbk1hcFtjb25kaXRpb24udGVzdF1bY29uZGl0aW9uLnZhcmlhYmxlXSA9IGNvbmRpdGlvbjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgY29uZGl0aW9uIHRvIHRoZSBQb2xpY3lcbiAgICpcbiAgICogSWYgbXVsdGlwbGUgY2FsbHMgYXJlIG1hZGUgdG8gYWRkIGEgY29uZGl0aW9uIHdpdGggdGhlIHNhbWUgb3BlcmF0b3IgYW5kIGZpZWxkLCBvbmx5XG4gICAqIHRoZSBsYXN0IG9uZSB3aW5zLiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogYGBgdHNcbiAgICogZGVjbGFyZSBjb25zdCBzdG10OiBpYW0uUG9saWN5U3RhdGVtZW50O1xuICAgKlxuICAgKiBzdG10LmFkZENvbmRpdGlvbignU3RyaW5nRXF1YWxzJywgeyAnYXdzOlNvbWVGaWVsZCc6ICcxJyB9KTtcbiAgICogc3RtdC5hZGRDb25kaXRpb24oJ1N0cmluZ0VxdWFscycsIHsgJ2F3czpTb21lRmllbGQnOiAnMicgfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBXaWxsIGVuZCB1cCB3aXRoIHRoZSBzaW5nbGUgY29uZGl0aW9uIGBTdHJpbmdFcXVhbHM6IHsgJ2F3czpTb21lRmllbGQnOiAnMicgfWAuXG4gICAqXG4gICAqIElmIHlvdSBtZWFudCB0byBhZGQgYSBjb25kaXRpb24gdG8gc2F5IHRoYXQgdGhlIGZpZWxkIGNhbiBiZSAqZWl0aGVyKiBgMWAgb3IgYDJgLCB3cml0ZVxuICAgKiB0aGlzOlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiBkZWNsYXJlIGNvbnN0IHN0bXQ6IGlhbS5Qb2xpY3lTdGF0ZW1lbnQ7XG4gICAqXG4gICAqIHN0bXQuYWRkQ29uZGl0aW9uKCdTdHJpbmdFcXVhbHMnLCB7ICdhd3M6U29tZUZpZWxkJzogWycxJywgJzInXSB9KTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYWRkQ29uZGl0aW9uT2JqZWN0KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuYXNzZXJ0Tm90RnJvemVuKFwiYWRkQ29uZGl0aW9uXCIpO1xuICAgIHZhbGlkYXRlQ29uZGl0aW9uT2JqZWN0KHZhbHVlKTtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgIGlmICghaXNTdHJpbmdPckFycmF5T2ZTdHJpbmdzKHYpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRmllbGRzIG11c3QgYmUgZWl0aGVyIGEgc3RyaW5nIG9yIGFuIGFycmF5IG9mIHN0cmluZ3MuIEdvdCAke3Z9IGZvciBrZXkgJHtrfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLmFkZENvbmRpdGlvbih7XG4gICAgICAgIHRlc3Q6IGtleSxcbiAgICAgICAgdmFyaWFibGU6IGssXG4gICAgICAgIHZhbHVlczogQXJyYXkuaXNBcnJheSh2KSA/IHYgOiBbdl0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIG11bHRpcGxlIGNvbmRpdGlvbnMgdG8gdGhlIFBvbGljeVxuICAgKlxuICAgKiBTZWUgdGhlIGBhZGRDb25kaXRpb25gIGZ1bmN0aW9uIGZvciBhIGNhdmVhdCBvbiBjYWxsaW5nIHRoaXMgbWV0aG9kIG11bHRpcGxlIHRpbWVzLlxuICAgKi9cbiAgcHVibGljIGFkZENvbmRpdGlvbnMoLi4uY29uZGl0aW9uczogQ29uZGl0aW9uW10pIHtcbiAgICBjb25kaXRpb25zLm1hcCgoYykgPT4ge1xuICAgICAgdGhpcy5hZGRDb25kaXRpb24oYyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIG11bHRpcGxlIGNvbmRpdGlvbk9iamVjdHMgdG8gdGhlIFBvbGljeVxuICAgKlxuICAgKiBTZWUgdGhlIGBhZGRDb25kaXRpb25PYmplY3RgIGZ1bmN0aW9uIGZvciBhIGNhdmVhdCBvbiBjYWxsaW5nIHRoaXMgbWV0aG9kIG11bHRpcGxlIHRpbWVzLlxuICAgKi9cbiAgcHVibGljIGFkZENvbmRpdGlvbk9iamVjdHMoY29uZGl0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjb25kaXRpb25zKSkge1xuICAgICAgdGhpcy5hZGRDb25kaXRpb25PYmplY3Qoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGBTdHJpbmdFcXVhbHNgIGNvbmRpdGlvbiB0aGF0IGxpbWl0cyB0byBhIGdpdmVuIGFjY291bnQgZnJvbSBgc3RzOkV4dGVybmFsSWRgLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSBjYWxsZWQgb25jZTogc3Vic2VxdWVudCBjYWxscyB3aWxsIG92ZXJ3cml0ZSBlYXJsaWVyIGNhbGxzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9pZF9yb2xlc19jcmVhdGVfZm9yLXVzZXJfZXh0ZXJuYWxpZC5odG1sXG4gICAqL1xuICBwdWJsaWMgYWRkQWNjb3VudENvbmRpdGlvbiguLi5hY2NvdW50SWRzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuYWRkQ29uZGl0aW9uKHtcbiAgICAgIHRlc3Q6IFwiU3RyaW5nRXF1YWxzXCIsXG4gICAgICB2YXJpYWJsZTogXCJzdHM6RXh0ZXJuYWxJZFwiLFxuICAgICAgdmFsdWVzOiBhY2NvdW50SWRzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBgU3RyaW5nRXF1YWxzYCBjb25kaXRpb24gdGhhdCBsaW1pdHMgdG8gYSBnaXZlbiBhY2NvdW50IGZyb20gYGF3czpTb3VyY2VBY2NvdW50YC5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2U6IHN1YnNlcXVlbnQgY2FsbHMgd2lsbCBvdmVyd3JpdGUgZWFybGllciBjYWxscy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2NvbmRpdGlvbi1rZXlzLmh0bWwjY29uZGl0aW9uLWtleXMtc291cmNlYWNjb3VudFxuICAgKi9cbiAgcHVibGljIGFkZFNvdXJjZUFjY291bnRDb25kaXRpb24oLi4uYWNjb3VudElkczogc3RyaW5nW10pIHtcbiAgICB0aGlzLmFkZENvbmRpdGlvbih7XG4gICAgICB0ZXN0OiBcIlN0cmluZ0VxdWFsc1wiLFxuICAgICAgdmFyaWFibGU6IFwiYXdzOlNvdXJjZUFjY291bnRcIixcbiAgICAgIHZhbHVlczogYWNjb3VudElkcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gYEFybkVxdWFsc2AgY29uZGl0aW9uIHRoYXQgbGltaXRzIHRvIGEgZ2l2ZW4gcmVzb3VyY2UgYXJuIGZyb20gYGF3czpTb3VyY2VBcm5gLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSBjYWxsZWQgb25jZTogc3Vic2VxdWVudCBjYWxscyB3aWxsIG92ZXJ3cml0ZSBlYXJsaWVyIGNhbGxzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfY29uZGl0aW9uLWtleXMuaHRtbCNjb25kaXRpb24ta2V5cy1zb3VyY2Vhcm5cbiAgICovXG4gIHB1YmxpYyBhZGRTb3VyY2VBcm5Db25kaXRpb24oLi4uYXJuczogc3RyaW5nW10pIHtcbiAgICB0aGlzLmFkZENvbmRpdGlvbih7XG4gICAgICB0ZXN0OiBcIkFybkVxdWFsc1wiLFxuICAgICAgdmFyaWFibGU6IFwiYXdzOlNvdXJjZUFyblwiLFxuICAgICAgdmFsdWVzOiBhcm5zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBgUG9saWN5U3RhdGVtZW50YCB3aXRoIHRoZSBzYW1lIGV4YWN0IHByb3BlcnRpZXNcbiAgICogYXMgdGhpcyBvbmUsIGV4Y2VwdCBmb3IgdGhlIG92ZXJyaWRlc1xuICAgKi9cbiAgcHVibGljIGNvcHkob3ZlcnJpZGVzOiBQb2xpY3lTdGF0ZW1lbnRQcm9wcyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgc2lkOiBvdmVycmlkZXMuc2lkID8/IHRoaXMuc2lkLFxuICAgICAgZWZmZWN0OiBvdmVycmlkZXMuZWZmZWN0ID8/IHRoaXMuZWZmZWN0LFxuICAgICAgYWN0aW9uczogb3ZlcnJpZGVzLmFjdGlvbnMgPz8gdGhpcy5hY3Rpb25zLFxuICAgICAgbm90QWN0aW9uczogb3ZlcnJpZGVzLm5vdEFjdGlvbnMgPz8gdGhpcy5ub3RBY3Rpb25zLFxuXG4gICAgICBwcmluY2lwYWxzOiBvdmVycmlkZXMucHJpbmNpcGFscyA/PyB0aGlzLnByaW5jaXBhbHMsXG4gICAgICBub3RQcmluY2lwYWxzOiBvdmVycmlkZXMubm90UHJpbmNpcGFscyA/PyB0aGlzLm5vdFByaW5jaXBhbHMsXG5cbiAgICAgIHJlc291cmNlczogb3ZlcnJpZGVzLnJlc291cmNlcyA/PyB0aGlzLnJlc291cmNlcyxcbiAgICAgIG5vdFJlc291cmNlczogb3ZlcnJpZGVzLm5vdFJlc291cmNlcyA/PyB0aGlzLm5vdFJlc291cmNlcyxcblxuICAgICAgY29uZGl0aW9uOiBvdmVycmlkZXMuY29uZGl0aW9uID8/IHRoaXMuY29uZGl0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgQVdTIElBTSBQb2xpY3kgc3RhdGVtZW50IEpTT05cbiAgICovXG4gIHB1YmxpYyB0b1N0YXRlbWVudEpzb24oKTogYW55IHtcbiAgICByZXR1cm4gbm9ybWFsaXplU3RhdGVtZW50KHtcbiAgICAgIEFjdGlvbjogdGhpcy5fYWN0aW9uLmRpcmVjdCgpLFxuICAgICAgTm90QWN0aW9uOiB0aGlzLl9ub3RBY3Rpb24uZGlyZWN0KCksXG4gICAgICBDb25kaXRpb246IHRvQ29uZGl0aW9uSnNvbiguLi50b0NvbmRpdGlvbnModGhpcy5fY29uZGl0aW9uTWFwKSksXG4gICAgICBFZmZlY3Q6IHRoaXMuZWZmZWN0LFxuICAgICAgUHJpbmNpcGFsOiB0b1ByaW5jaXBhbEpzb24oLi4udGhpcy5fcHJpbmNpcGFsKSxcbiAgICAgIE5vdFByaW5jaXBhbDogdG9QcmluY2lwYWxKc29uKC4uLnRoaXMuX25vdFByaW5jaXBhbCksXG4gICAgICBSZXNvdXJjZTogdGhpcy5fcmVzb3VyY2UuZGlyZWN0KCksXG4gICAgICBOb3RSZXNvdXJjZTogdGhpcy5fbm90UmVzb3VyY2UuZGlyZWN0KCksXG4gICAgICBTaWQ6IHRoaXMuc2lkLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHBvbGljeSBzdGF0ZW1lbnRcbiAgICovXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gVG9rZW4uYXNTdHJpbmcodGhpcywge1xuICAgICAgZGlzcGxheUhpbnQ6IFwiUG9saWN5U3RhdGVtZW50XCIsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSlNPTi1pZnkgdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBVc2VkIHdoZW4gSlNPTi5zdHJpbmdpZnkoKSBpcyBjYWxsZWRcbiAgICovXG4gIHB1YmxpYyB0b0pTT04oKTogZGF0YUF3c0lhbVBvbGljeURvY3VtZW50LkRhdGFBd3NJYW1Qb2xpY3lEb2N1bWVudFN0YXRlbWVudCB7XG4gICAgY29uc3QgcHJpbmNpcGFscyA9IHRoaXMucHJpbmNpcGFscy5mbGF0TWFwKFxuICAgICAgKHApID0+IHAucG9saWN5RnJhZ21lbnQucHJpbmNpcGFscyxcbiAgICApO1xuICAgIGNvbnN0IG5vdFByaW5jaXBhbHMgPSB0aGlzLm5vdFByaW5jaXBhbHMuZmxhdE1hcChcbiAgICAgIChwKSA9PiBwLnBvbGljeUZyYWdtZW50LnByaW5jaXBhbHMsXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzaWQ6IHRoaXMuc2lkLFxuICAgICAgYWN0aW9uczogdGhpcy5hY3Rpb25zLmxlbmd0aCA+IDAgPyB0aGlzLmFjdGlvbnMgOiB1bmRlZmluZWQsXG4gICAgICBub3RBY3Rpb25zOiB0aGlzLm5vdEFjdGlvbnMubGVuZ3RoID4gMCA/IHRoaXMubm90QWN0aW9ucyA6IHVuZGVmaW5lZCxcbiAgICAgIHByaW5jaXBhbHM6IHByaW5jaXBhbHMubGVuZ3RoID4gMCA/IHByaW5jaXBhbHMgOiB1bmRlZmluZWQsXG4gICAgICBub3RQcmluY2lwYWxzOiBub3RQcmluY2lwYWxzLmxlbmd0aCA+IDAgPyBub3RQcmluY2lwYWxzIDogdW5kZWZpbmVkLFxuICAgICAgcmVzb3VyY2VzOiB0aGlzLnJlc291cmNlcy5sZW5ndGggPiAwID8gdGhpcy5yZXNvdXJjZXMgOiB1bmRlZmluZWQsXG4gICAgICBub3RSZXNvdXJjZXM6XG4gICAgICAgIHRoaXMubm90UmVzb3VyY2VzLmxlbmd0aCA+IDAgPyB0aGlzLm5vdFJlc291cmNlcyA6IHVuZGVmaW5lZCxcbiAgICAgIGNvbmRpdGlvbjogdGhpcy5jb25kaXRpb25zLmxlbmd0aCA+IDAgPyB0aGlzLmNvbmRpdGlvbnMgOiB1bmRlZmluZWQsXG4gICAgICBlZmZlY3Q6IHRoaXMuZWZmZWN0LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgcHJpbmNpcGFsJ3MgY29uZGl0aW9uc1xuICAgKlxuICAgKiBGb3IgY29udmVuaWVuY2UsIHByaW5jaXBhbHMgaGF2ZSBiZWVuIG1vZGVsZWQgYXMgYm90aCBhIHByaW5jaXBhbFxuICAgKiBhbmQgYSBzZXQgb2YgY29uZGl0aW9ucy4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBoYXZlIGEgc2luZ2xlXG4gICAqIG9iamVjdCByZXByZXNlbnQgZS5nLiBhbiBcIlNOUyBUb3BpY1wiIChTTlMgc2VydmljZSBwcmluY2lwYWwgKyBhd3M6U291cmNBcm5cbiAgICogY29uZGl0aW9uKSBvciBhbiBPcmdhbml6YXRpb24gbWVtYmVyICgqICsgYXdzOk9yZ0lkIGNvbmRpdGlvbikuXG4gICAqXG4gICAqIEhvd2V2ZXIsIHdoZW4gdXNpbmcgbXVsdGlwbGUgcHJpbmNpcGFscyBpbiB0aGUgc2FtZSBwb2xpY3kgc3RhdGVtZW50LFxuICAgKiB0aGV5IG11c3QgYWxsIGhhdmUgdGhlIHNhbWUgY29uZGl0aW9ucyBvciB0aGUgT1Igc2FtZW50aWNzXG4gICAqIGltcGxpZWQgYnkgYSBsaXN0IG9mIHByaW5jaXBhbHMgY2Fubm90IGJlIGd1YXJhbnRlZWQgKHVzZXIgbmVlZHMgdG9cbiAgICogYWRkIG11bHRpcGxlIHN0YXRlbWVudHMgaW4gdGhhdCBjYXNlKS5cbiAgICovXG4gIHByaXZhdGUgYWRkUHJpbmNpcGFsQ29uZGl0aW9ucyhcbiAgICAuLi5jb25kaXRpb25zOiBkYXRhQXdzSWFtUG9saWN5RG9jdW1lbnQuRGF0YUF3c0lhbVBvbGljeURvY3VtZW50U3RhdGVtZW50Q29uZGl0aW9uW11cbiAgKSB7XG4gICAgLy8gU3RyaW5naWZ5aW5nIHRoZSBjb25kaXRpb25zIGlzIGFuIGVhc3kgd2F5IHRvIGRvIGRlZXAgZXF1YWxpdHlcbiAgICBjb25zdCB0aGVzZUNvbmRpdGlvbnMgPSBKU09OLnN0cmluZ2lmeShjb25kaXRpb25zKTtcbiAgICBpZiAodGhpcy5wcmluY2lwYWxDb25kaXRpb25zSnNvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBGaXJzdCBwcmluY2lwYWwsIGFueXRoaW5nIGdvZXNcbiAgICAgIHRoaXMucHJpbmNpcGFsQ29uZGl0aW9uc0pzb24gPSB0aGVzZUNvbmRpdGlvbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnByaW5jaXBhbENvbmRpdGlvbnNKc29uICE9PSB0aGVzZUNvbmRpdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBBbGwgcHJpbmNpcGFscyBpbiBhIFBvbGljeVN0YXRlbWVudCBtdXN0IGhhdmUgdGhlIHNhbWUgQ29uZGl0aW9ucyAoZ290ICcke3RoaXMucHJpbmNpcGFsQ29uZGl0aW9uc0pzb259JyBhbmQgJyR7dGhlc2VDb25kaXRpb25zfScpLiBVc2UgbXVsdGlwbGUgc3RhdGVtZW50cyBpbnN0ZWFkLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYWRkQ29uZGl0aW9ucyguLi5jb25kaXRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGF0IHRoZSBwb2xpY3kgc3RhdGVtZW50IHNhdGlzZmllcyBiYXNlIHJlcXVpcmVtZW50cyBmb3IgYSBwb2xpY3kuXG4gICAqXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMsIG9yIGFuIGVtcHR5IGFycmF5IGlmIHRoZSBzdGF0ZW1lbnQgaXMgdmFsaWQuXG4gICAqL1xuICBwdWJsaWMgdmFsaWRhdGVGb3JBbnlQb2xpY3koKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGVycm9ycyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgaWYgKHRoaXMuX2FjdGlvbi5sZW5ndGggPT09IDAgJiYgdGhpcy5fbm90QWN0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIFwiQSBQb2xpY3lTdGF0ZW1lbnQgbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSAnYWN0aW9uJyBvciAnbm90QWN0aW9uJy5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBlcnJvcnM7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhhdCB0aGUgcG9saWN5IHN0YXRlbWVudCBzYXRpc2ZpZXMgYWxsIHJlcXVpcmVtZW50cyBmb3IgYSByZXNvdXJjZS1iYXNlZCBwb2xpY3kuXG4gICAqXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMsIG9yIGFuIGVtcHR5IGFycmF5IGlmIHRoZSBzdGF0ZW1lbnQgaXMgdmFsaWQuXG4gICAqL1xuICBwdWJsaWMgdmFsaWRhdGVGb3JSZXNvdXJjZVBvbGljeSgpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZXJyb3JzID0gdGhpcy52YWxpZGF0ZUZvckFueVBvbGljeSgpO1xuICAgIGlmICh0aGlzLl9wcmluY2lwYWxzLmxlbmd0aCA9PT0gMCAmJiB0aGlzLl9ub3RQcmluY2lwYWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIFwiQSBQb2xpY3lTdGF0ZW1lbnQgdXNlZCBpbiBhIHJlc291cmNlLWJhc2VkIHBvbGljeSBtdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIElBTSBwcmluY2lwYWwuXCIsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZXJyb3JzO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoYXQgdGhlIHBvbGljeSBzdGF0ZW1lbnQgc2F0aXNmaWVzIGFsbCByZXF1aXJlbWVudHMgZm9yIGFuIGlkZW50aXR5LWJhc2VkIHBvbGljeS5cbiAgICpcbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcywgb3IgYW4gZW1wdHkgYXJyYXkgaWYgdGhlIHN0YXRlbWVudCBpcyB2YWxpZC5cbiAgICovXG4gIHB1YmxpYyB2YWxpZGF0ZUZvcklkZW50aXR5UG9saWN5KCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBlcnJvcnMgPSB0aGlzLnZhbGlkYXRlRm9yQW55UG9saWN5KCk7XG4gICAgaWYgKHRoaXMuX3ByaW5jaXBhbHMubGVuZ3RoID4gMCB8fCB0aGlzLl9ub3RQcmluY2lwYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICBcIkEgUG9saWN5U3RhdGVtZW50IHVzZWQgaW4gYW4gaWRlbnRpdHktYmFzZWQgcG9saWN5IGNhbm5vdCBzcGVjaWZ5IGFueSBJQU0gcHJpbmNpcGFscy5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9yZXNvdXJjZS5sZW5ndGggPT09IDAgJiYgdGhpcy5fbm90UmVzb3VyY2UubGVuZ3RoID09PSAwKSB7XG4gICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgXCJBIFBvbGljeVN0YXRlbWVudCB1c2VkIGluIGFuIGlkZW50aXR5LWJhc2VkIHBvbGljeSBtdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIHJlc291cmNlLlwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGVycm9ycztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgQWN0aW9ucyBhZGRlZCB0byB0aGlzIHN0YXRlbWVudFxuICAgKi9cbiAgcHVibGljIGdldCBhY3Rpb25zKCkge1xuICAgIHJldHVybiB0aGlzLl9hY3Rpb24uY29weSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBOb3RBY3Rpb25zIGFkZGVkIHRvIHRoaXMgc3RhdGVtZW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IG5vdEFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25vdEFjdGlvbi5jb3B5KCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIFByaW5jaXBhbHMgYWRkZWQgdG8gdGhpcyBzdGF0ZW1lbnRcbiAgICovXG4gIHB1YmxpYyBnZXQgcHJpbmNpcGFscygpOiBJUHJpbmNpcGFsW10ge1xuICAgIHJldHVybiB0aGlzLl9wcmluY2lwYWxzLmNvcHkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgTm90UHJpbmNpcGFscyBhZGRlZCB0byB0aGlzIHN0YXRlbWVudFxuICAgKi9cbiAgcHVibGljIGdldCBub3RQcmluY2lwYWxzKCk6IElQcmluY2lwYWxbXSB7XG4gICAgcmV0dXJuIHRoaXMuX25vdFByaW5jaXBhbHMuY29weSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBSZXNvdXJjZXMgYWRkZWQgdG8gdGhpcyBzdGF0ZW1lbnRcbiAgICovXG4gIHB1YmxpYyBnZXQgcmVzb3VyY2VzKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXNvdXJjZS5jb3B5KCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIE5vdFJlc291cmNlcyBhZGRlZCB0byB0aGlzIHN0YXRlbWVudFxuICAgKi9cbiAgcHVibGljIGdldCBub3RSZXNvdXJjZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25vdFJlc291cmNlLmNvcHkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29uZGl0aW9ucyBhZGRlZCB0byB0aGlzIHN0YXRlbWVudFxuICAgKi9cbiAgcHVibGljIGdldCBjb25kaXRpb25zKCk6IENvbmRpdGlvbnMge1xuICAgIHJldHVybiB0b0NvbmRpdGlvbnModGhpcy5fY29uZGl0aW9uTWFwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIHRoZSBQb2xpY3lTdGF0ZW1lbnQgaW1tdXRhYmxlXG4gICAqXG4gICAqIEFmdGVyIGNhbGxpbmcgdGhpcywgYW55IG9mIHRoZSBgYWRkWHh4KClgIG1ldGhvZHMgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uXG4gICAqXG4gICAqIExpYnJhcmllcyB0aGF0IGxhemlseSBnZW5lcmF0ZSBzdGF0ZW1lbnQgYm9kaWVzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0b1xuICAgKiBmaWxsIHRoZSBhY3R1YWwgUG9saWN5U3RhdGVtZW50IGZpZWxkcy4gQmUgYXdhcmUgdGhhdCB0aGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkXG4gICAqIG11bHRpcGxlIHRpbWVzLlxuICAgKi9cbiAgcHVibGljIGZyZWV6ZSgpOiBQb2xpY3lTdGF0ZW1lbnQge1xuICAgIHRoaXMuX2Zyb3plbiA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgUG9saWN5U3RhdGVtZW50IGhhcyBiZWVuIGZyb3plblxuICAgKlxuICAgKiBUaGUgc3RhdGVtZW50IG9iamVjdCBpcyBmcm96ZW4gd2hlbiBgZnJlZXplKClgIGlzIGNhbGxlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgZnJvemVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9mcm96ZW47XG4gIH1cblxuICAvKipcbiAgICogRXN0aW1hdGUgdGhlIHNpemUgb2YgdGhpcyBwb2xpY3kgc3RhdGVtZW50XG4gICAqXG4gICAqIEJ5IG5lY2Vzc2l0eSwgdGhpcyB3aWxsIG5vdCBiZSBhY2N1cmF0ZS4gV2UnbGwgZG8gb3VyIGJlc3QgdG8gb3ZlcmVzdGltYXRlXG4gICAqIHNvIHdlIHdvbid0IGhhdmUgbmFzdHkgc3VycHJpc2VzLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfZXN0aW1hdGVTaXplKG9wdGlvbnM6IEVzdGltYXRlU2l6ZU9wdGlvbnMpOiBudW1iZXIge1xuICAgIGxldCByZXQgPSAwO1xuXG4gICAgY29uc3QgeyBhY3Rpb25Fc3RpbWF0ZSwgYXJuRXN0aW1hdGUgfSA9IG9wdGlvbnM7XG5cbiAgICByZXQgKz0gYFwiRWZmZWN0XCI6IFwiJHt0aGlzLmVmZmVjdH1cIixgLmxlbmd0aDtcblxuICAgIGNvdW50KFwiQWN0aW9uXCIsIHRoaXMuYWN0aW9ucywgYWN0aW9uRXN0aW1hdGUpO1xuICAgIGNvdW50KFwiTm90QWN0aW9uXCIsIHRoaXMubm90QWN0aW9ucywgYWN0aW9uRXN0aW1hdGUpO1xuICAgIGNvdW50KFwiUmVzb3VyY2VcIiwgdGhpcy5yZXNvdXJjZXMsIGFybkVzdGltYXRlKTtcbiAgICBjb3VudChcIk5vdFJlc291cmNlXCIsIHRoaXMubm90UmVzb3VyY2VzLCBhcm5Fc3RpbWF0ZSk7XG5cbiAgICByZXQgKz0gdGhpcy5wcmluY2lwYWxzLmxlbmd0aCAqIGFybkVzdGltYXRlO1xuICAgIHJldCArPSB0aGlzLm5vdFByaW5jaXBhbHMubGVuZ3RoICogYXJuRXN0aW1hdGU7XG5cbiAgICByZXQgKz0gSlNPTi5zdHJpbmdpZnkodG9Db25kaXRpb25Kc29uKC4uLnRoaXMuY29uZGl0aW9ucykpLmxlbmd0aDtcbiAgICByZXR1cm4gcmV0O1xuXG4gICAgZnVuY3Rpb24gY291bnQoa2V5OiBzdHJpbmcsIHZhbHVlczogc3RyaW5nW10sIHRva2VuU2l6ZTogbnVtYmVyKSB7XG4gICAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0ICs9XG4gICAgICAgICAga2V5Lmxlbmd0aCArXG4gICAgICAgICAgNSAvKiBxdW90ZXMsIGNvbG9uLCBicmFja2V0cyAqLyArXG4gICAgICAgICAgc3VtKFxuICAgICAgICAgICAgdmFsdWVzLm1hcChcbiAgICAgICAgICAgICAgKHYpID0+XG4gICAgICAgICAgICAgICAgKFRva2VuLmlzVW5yZXNvbHZlZCh2KSA/IHRva2VuU2l6ZSA6IHYubGVuZ3RoKSArXG4gICAgICAgICAgICAgICAgMyAvKiBxdW90ZXMsIHNlcGFyYXRvciAqLyxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3cgYW4gZXhjZXB0aW9uIHdoZW4gdGhlIG9iamVjdCBpcyBmcm96ZW5cbiAgICovXG4gIHByaXZhdGUgYXNzZXJ0Tm90RnJvemVuKG1ldGhvZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuX2Zyb3plbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHttZXRob2R9OiBmcmVlemUoKSBoYXMgYmVlbiBjYWxsZWQgb24gdGhpcyBQb2xpY3lTdGF0ZW1lbnQgcHJldmlvdXNseSwgc28gaXQgY2FuIG5vIGxvbmdlciBiZSBtb2RpZmllZGAsXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoZSBFZmZlY3QgZWxlbWVudCBvZiBhbiBJQU0gcG9saWN5XG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2VmZmVjdC5odG1sXG4gKi9cbmV4cG9ydCBlbnVtIEVmZmVjdCB7XG4gIC8qKlxuICAgKiBBbGxvd3MgYWNjZXNzIHRvIGEgcmVzb3VyY2UgaW4gYW4gSUFNIHBvbGljeSBzdGF0ZW1lbnQuIEJ5IGRlZmF1bHQsIGFjY2VzcyB0byByZXNvdXJjZXMgYXJlIGRlbmllZC5cbiAgICovXG4gIEFMTE9XID0gXCJBbGxvd1wiLFxuXG4gIC8qKlxuICAgKiBFeHBsaWNpdGx5IGRlbnkgYWNjZXNzIHRvIGEgcmVzb3VyY2UuIEJ5IGRlZmF1bHQsIGFsbCByZXF1ZXN0cyBhcmUgZGVuaWVkIGltcGxpY2l0bHkuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19ldmFsdWF0aW9uLWxvZ2ljLmh0bWxcbiAgICovXG4gIERFTlkgPSBcIkRlbnlcIixcbn1cblxuLyoqXG4gKiBDb25kaXRpb24gZm9yIHdoZW4gYW4gSUFNIHBvbGljeSBpcyBpbiBlZmZlY3QuIE1hcHMgZnJvbSB0aGUga2V5cyBpbiBhIHJlcXVlc3QncyBjb250ZXh0IHRvXG4gKiBhIHN0cmluZyB2YWx1ZSBvciBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBTZWUgdGhlIENvbmRpdGlvbnMgaW50ZXJmYWNlIGZvciBtb3JlIGRldGFpbHMuXG4gKi9cbmV4cG9ydCB0eXBlIENvbmRpdGlvbiA9XG4gIGRhdGFBd3NJYW1Qb2xpY3lEb2N1bWVudC5EYXRhQXdzSWFtUG9saWN5RG9jdW1lbnRTdGF0ZW1lbnRDb25kaXRpb247XG5cbi8qKlxuICogQ29uZGl0aW9ucyBmb3Igd2hlbiBhbiBJQU0gUG9saWN5IGlzIGluIGVmZmVjdCwgc3BlY2lmaWVkIGluIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOlxuICpcbiAqIGB7IFwiT3BlcmF0b3JcIjogeyBcImtleUluUmVxdWVzdENvbnRleHRcIjogXCJ2YWx1ZVwiIH0gfWBcbiAqXG4gKiBUaGUgdmFsdWUgY2FuIGJlIGVpdGhlciBhIHNpbmdsZSBzdHJpbmcgdmFsdWUgb3IgYW4gYXJyYXkgb2Ygc3RyaW5nIHZhbHVlcy5cbiAqXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIHdoaWNoIG9wZXJhdG9ycyBhcmUgc3VwcG9ydGVkLCBzZWUgW3RoZSBJQU1cbiAqIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uLmh0bWwpLlxuICovXG5leHBvcnQgdHlwZSBDb25kaXRpb25zID0gQXJyYXk8Q29uZGl0aW9uPjtcbi8vIFRPRE86IFN1cHBvcnQgSVJlc29sdmFibGUgQ29uZGl0aW9uP1xuXG5jbGFzcyBKc29uUHJpbmNpcGFsIGV4dGVuZHMgUHJpbmNpcGFsQmFzZSB7XG4gIHB1YmxpYyByZWFkb25seSBwb2xpY3lGcmFnbWVudDogUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQ7XG4gIHB1YmxpYyByZWFkb25seSBwcmluY2lwYWxzOiBQcmluY2lwYWxQcm9wc1tdID0gW107XG5cbiAgY29uc3RydWN0b3IoanNvbjogYW55ID0ge30pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucG9saWN5RnJhZ21lbnQgPSBQcmluY2lwYWxQb2xpY3lGcmFnbWVudC5mcm9tSnNvbihqc29uKTtcbiAgfVxuXG4gIHB1YmxpYyBkZWR1cGVTdHJpbmcoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5wb2xpY3lGcmFnbWVudCk7XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBfZXN0aW1hdGVTaXplXG4gKlxuICogVGhlc2UgY2FuIG9wdGlvbmFsbHkgY29tZSBmcm9tIGNvbnRleHQsIGJ1dCBpdCdzIHRvbyBleHBlbnNpdmUgdG8gbG9va1xuICogdGhlbSB1cCBldmVyeSB0aW1lIHNvIHdlIGJ1bmRsZSB0aGVtIGludG8gYSBzdHJ1Y3QgZmlyc3QuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXN0aW1hdGVTaXplT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBFc3RpbWF0ZWQgc2l6ZSBvZiBhbiB1bnJlc29sdmVkIEFSTlxuICAgKi9cbiAgcmVhZG9ubHkgYXJuRXN0aW1hdGU6IG51bWJlcjtcblxuICAvKipcbiAgICogRXN0aW1hdGVkIHNpemUgb2YgYW4gdW5yZXNvbHZlZCBhY3Rpb25cbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbkVzdGltYXRlOiBudW1iZXI7XG59XG5cbi8qKlxuICogRGVyaXZlIHRoZSBzaXplIGVzdGltYXRpb24gb3B0aW9ucyBmcm9tIGNvbnRleHRcbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlcml2ZUVzdGltYXRlU2l6ZU9wdGlvbnMoXG4gIF9zY29wZTogSUNvbnN0cnVjdCxcbik6IEVzdGltYXRlU2l6ZU9wdGlvbnMge1xuICBjb25zdCBhY3Rpb25Fc3RpbWF0ZSA9IDIwO1xuICBjb25zdCBhcm5Fc3RpbWF0ZSA9IERFRkFVTFRfQVJOX1NJWkVfRVNUSU1BVEU7XG4gIHJldHVybiB7IGFjdGlvbkVzdGltYXRlLCBhcm5Fc3RpbWF0ZSB9O1xufVxuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCBiZWhhdmVzIGJvdGggYXMgYSBzZXQgYW5kIGFuIGFycmF5XG4gKlxuICogVXNlZCBmb3IgdGhlIGVsZW1lbnRzIG9mIGEgUG9saWN5U3RhdGVtZW50LiBJbiBwcmFjdGljZSB0aGV5IGJlaGF2ZSBhcyBzZXRzLFxuICogYnV0IHdlIGhhdmUgdGhvdXNhbmRzIG9mIHNuYXBzaG90IHRlc3RzIGluIGV4aXN0ZW5jZSB0aGF0IHdpbGwgcmVseSBvbiBhXG4gKiBwYXJ0aWN1bGFyIG9yZGVyIHNvIHdlIGNhbid0IGp1c3QgY2hhbmdlIHRoZSB0eXBlIHRvIGBTZXQ8PmAgd2hvbGVzYWxlIHdpdGhvdXRcbiAqIGNhdXNpbmcgYSBsb3Qgb2YgY2h1cm4uXG4gKi9cbmNsYXNzIE9yZGVyZWRTZXQ8QT4ge1xuICBwcml2YXRlIHJlYWRvbmx5IHNldCA9IG5ldyBTZXQ8QT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBhcnJheSA9IG5ldyBBcnJheTxBPigpO1xuXG4gIC8qKlxuICAgKiBBZGQgbmV3IGVsZW1lbnRzIHRvIHRoZSBzZXRcbiAgICpcbiAgICogQHBhcmFtIHhzIHRoZSBlbGVtZW50cyB0byBiZSBhZGRlZFxuICAgKlxuICAgKiBAcmV0dXJucyB0aGUgZWxlbWVudHMgYWN0dWFsbHkgYWRkZWRcbiAgICovXG4gIHB1YmxpYyBwdXNoKC4uLnhzOiByZWFkb25seSBBW10pOiBBW10ge1xuICAgIGNvbnN0IHJldCA9IG5ldyBBcnJheTxBPigpO1xuICAgIGZvciAoY29uc3QgeCBvZiB4cykge1xuICAgICAgaWYgKHRoaXMuc2V0Lmhhcyh4KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0LmFkZCh4KTtcbiAgICAgIHRoaXMuYXJyYXkucHVzaCh4KTtcbiAgICAgIHJldC5wdXNoKHgpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcHVibGljIGdldCBsZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXJyYXkubGVuZ3RoO1xuICB9XG5cbiAgcHVibGljIGNvcHkoKTogQVtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuYXJyYXldO1xuICB9XG5cbiAgLyoqXG4gICAqIERpcmVjdCAocmVhZC1vbmx5KSBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgYXJyYXlcbiAgICpcbiAgICogKFNhdmVzIGEgY29weSlcbiAgICovXG4gIHB1YmxpYyBkaXJlY3QoKTogcmVhZG9ubHkgQVtdIHtcbiAgICByZXR1cm4gdGhpcy5hcnJheTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdW0oeHM6IG51bWJlcltdKSB7XG4gIHJldHVybiB4cy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbn1cblxuLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNjAuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtaWFtL2xpYi9wcml2YXRlXG5cbi8vIEFuIElBTSB2YWx1ZSBpcyBhIHN0cmluZyBvciBhbiBpbnRyaW5zaWMgdmFsdWVcbmV4cG9ydCB0eXBlIElhbVZhbHVlID1cbiAgfCBzdHJpbmdcbiAgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gIHwgQXJyYXk8c3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55Pj47XG5cbmludGVyZmFjZSBTdGF0ZW1lbnRTY2hlbWEge1xuICByZWFkb25seSBTaWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IEVmZmVjdD86IHN0cmluZztcbiAgcmVhZG9ubHkgUHJpbmNpcGFsPzogc3RyaW5nIHwgc3RyaW5nW10gfCBSZWNvcmQ8c3RyaW5nLCBJYW1WYWx1ZT47XG4gIHJlYWRvbmx5IE5vdFByaW5jaXBhbD86IHN0cmluZyB8IHN0cmluZ1tdIHwgUmVjb3JkPHN0cmluZywgSWFtVmFsdWU+O1xuICByZWFkb25seSBSZXNvdXJjZT86IElhbVZhbHVlO1xuICByZWFkb25seSBOb3RSZXNvdXJjZT86IElhbVZhbHVlO1xuICByZWFkb25seSBBY3Rpb24/OiBJYW1WYWx1ZTtcbiAgcmVhZG9ubHkgTm90QWN0aW9uPzogSWFtVmFsdWU7XG4gIHJlYWRvbmx5IENvbmRpdGlvbj86IHVua25vd247XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN0YXRlbWVudChzOiBTdGF0ZW1lbnRTY2hlbWEpIHtcbiAgcmV0dXJuIG5vVW5kZWYoe1xuICAgIEFjdGlvbjogX25vcm0ocy5BY3Rpb24sIHsgdW5pcXVlOiB0cnVlIH0pLFxuICAgIE5vdEFjdGlvbjogX25vcm0ocy5Ob3RBY3Rpb24sIHsgdW5pcXVlOiB0cnVlIH0pLFxuICAgIENvbmRpdGlvbjogX25vcm0ocy5Db25kaXRpb24pLFxuICAgIEVmZmVjdDogX25vcm0ocy5FZmZlY3QpLFxuICAgIFByaW5jaXBhbDogX25vcm1QcmluY2lwYWwocy5QcmluY2lwYWwpLFxuICAgIE5vdFByaW5jaXBhbDogX25vcm1QcmluY2lwYWwocy5Ob3RQcmluY2lwYWwpLFxuICAgIFJlc291cmNlOiBfbm9ybShzLlJlc291cmNlLCB7IHVuaXF1ZTogdHJ1ZSB9KSxcbiAgICBOb3RSZXNvdXJjZTogX25vcm0ocy5Ob3RSZXNvdXJjZSwgeyB1bmlxdWU6IHRydWUgfSksXG4gICAgU2lkOiBfbm9ybShzLlNpZCksXG4gIH0pO1xuXG4gIGZ1bmN0aW9uIF9ub3JtKFxuICAgIHZhbHVlczogYW55LFxuICAgIHsgdW5pcXVlID0gZmFsc2UgfTogeyB1bmlxdWU6IGJvb2xlYW4gfSA9IHsgdW5pcXVlOiBmYWxzZSB9LFxuICApIHtcbiAgICBpZiAodmFsdWVzID09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZCh2YWx1ZXMpKSB7XG4gICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICAgIGlmICghdmFsdWVzIHx8IHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlc1swXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVuaXF1ZSA/IEFycmF5LmZyb20obmV3IFNldCh2YWx1ZXMpKSA6IHZhbHVlcztcbiAgICB9XG5cbiAgICBpZiAodmFsdWVzICYmIHR5cGVvZiB2YWx1ZXMgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGlmIChPYmplY3Qua2V5cyh2YWx1ZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuICBmdW5jdGlvbiBfbm9ybVByaW5jaXBhbChcbiAgICBwcmluY2lwYWw/OiBzdHJpbmcgfCBzdHJpbmdbXSB8IHsgW2tleTogc3RyaW5nXTogYW55IH0sXG4gICkge1xuICAgIGlmICghcHJpbmNpcGFsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHByaW5jaXBhbCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHByaW5jaXBhbDtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocHJpbmNpcGFsKSB8fCB0eXBlb2YgcHJpbmNpcGFsICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocHJpbmNpcGFsKTtcbiAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBjb25zdCBub3JtVmFsID0gX25vcm0ocHJpbmNpcGFsW2tleV0pO1xuICAgICAgaWYgKG5vcm1WYWwpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBub3JtVmFsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vVW5kZWYoeDogYW55KTogYW55IHtcbiAgY29uc3QgcmV0OiBhbnkgPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoeCkpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZW5zdXJlQXJyYXlPclVuZGVmaW5lZChmaWVsZDogYW55KSB7XG4gIGlmIChmaWVsZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAodHlwZW9mIGZpZWxkICE9PSBcInN0cmluZ1wiICYmICFBcnJheS5pc0FycmF5KGZpZWxkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkZpZWxkcyBtdXN0IGJlIGVpdGhlciBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzXCIpO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGZpZWxkKSAmJiAhIWZpZWxkLmZpbmQoKGY6IGFueSkgPT4gdHlwZW9mIGYgIT09IFwic3RyaW5nXCIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRmllbGRzIG11c3QgYmUgZWl0aGVyIGEgc3RyaW5nIG9yIGFuIGFycmF5IG9mIHN0cmluZ3NcIik7XG4gIH1cbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZmllbGQpID8gZmllbGQgOiBbZmllbGRdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmdPckFycmF5T2ZTdHJpbmdzKFxuICB2YWx1ZTogdW5rbm93bixcbik6IHZhbHVlIGlzIHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSBjb25kaXRpb24gSlNPTiBvYmplY3QgdG8gYSBsaXN0IG9mIFRlcnJhZm9ybSBBV1MgUG9saWN5IFN0YXRlbWVudCBDb25kaXRpb25zXG4gKlxuICogSlNPTiBvYmplY3QgaXMgc3BlY2lmaWVkIGluIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOlxuICpcbiAqIGB7IFwiT3BlcmF0b3JcIjogeyBcImtleUluUmVxdWVzdENvbnRleHRcIjogXCJ2YWx1ZVwiIH0gfWBcbiAqXG4gKiBUaGUgdmFsdWUgY2FuIGJlIGVpdGhlciBhIHNpbmdsZSBzdHJpbmcgdmFsdWUgb3IgYW4gYXJyYXkgb2Ygc3RyaW5nIHZhbHVlcy5cbiAqXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIHdoaWNoIG9wZXJhdG9ycyBhcmUgc3VwcG9ydGVkLCBzZWUgW3RoZSBJQU1cbiAqIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uLmh0bWwpLlxuICogQHBhcmFtIGNvbmRpdGlvbkpzb24gVGhlIGNvbmRpdGlvbiBKU09OIG9iamVjdFxuICogQHJldHVybnMgVGhlIGxpc3Qgb2YgVGVycmFmb3JtIGNvbmRpdGlvbiBvYmplY3RzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tQ29uZGl0aW9uSnNvbihcbiAgY29uZGl0aW9uSnNvbjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsXG4pOiBDb25kaXRpb25zIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb25kaXRpb25Kc29uKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8Q29uZGl0aW9uPigpO1xuXG4gIGZvciAoY29uc3QgW3Rlc3QsIHZhcmlhYmxlc10gb2YgT2JqZWN0LmVudHJpZXMoY29uZGl0aW9uSnNvbikpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YXJpYWJsZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGV2ZW50IHBhdHRlcm4gZmllbGQgeyAke3Rlc3R9OiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHZhcmlhYmxlcyxcbiAgICAgICAgKX0gfS4gQWxsIGZpZWxkcyBtdXN0IGJlIG9iamVjdHNgLFxuICAgICAgKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbdmFyaWFibGUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YXJpYWJsZXMgYXMgYW55KSkge1xuICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICB0ZXN0LFxuICAgICAgICB2YXJpYWJsZSxcbiAgICAgICAgdmFsdWVzOiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogZmxhdHRlbiBDb25kaXRpb25zIG1hcHBlZCBieSB0ZXN0IGFuZCB2YXJpYWJsZSB0byBhbiBhcnJheSBvZiBUZXJyYWZvcm0gQVdTIFBvbGljeSBTdGF0ZW1lbnQgQ29uZGl0aW9uc1xuICogQHBhcmFtIGNvbmRpdGlvbk1hcCBUaGUgY29uZGl0aW9uIG1hcFxuICogQHJldHVybnMgVGhlIGxpc3Qgb2YgVGVycmFmb3JtIGNvbmRpdGlvbiBvYmplY3RzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0NvbmRpdGlvbnMoY29uZGl0aW9uTWFwOiBDb25kaXRpb25NYXApOiBDb25kaXRpb25zIHtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMoY29uZGl0aW9uTWFwKS5mbGF0TWFwKCh2YXJpYWJsZXMpID0+XG4gICAgT2JqZWN0LnZhbHVlcyh2YXJpYWJsZXMpLFxuICApO1xuICAvLyBjb25zdCBjb25kaXRpb25zOiBDb25kaXRpb25zID0gW107XG4gIC8vIGZvciAoY29uc3QgdmFyaWFibGVzTWFwIG9mIE9iamVjdC52YWx1ZXMoY29uZGl0aW9uTWFwKSkge1xuICAvLyAgIGZvciAoY29uc3QgY29uZGl0aW9uIG9mIE9iamVjdC52YWx1ZXModmFyaWFibGVzTWFwKSkge1xuICAvLyAgICAgY29uZGl0aW9ucy5wdXNoKGNvbmRpdGlvbik7XG4gIC8vICAgfVxuICAvLyB9XG4gIC8vIHJldHVybiBjb25kaXRpb25zO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSBsaXN0IG9mIFRlcnJhZm9ybSBBV1MgUG9saWN5IFN0YXRlbWVudCBjb25kaXRpb24gb2JqZWN0cyBiYWNrIHRvIGEgY29uZGl0aW9uIEpTT04gb2JqZWN0XG4gKiBAcGFyYW0gY29uZGl0aW9ucyBUaGUgbGlzdCBvZiBUZXJyYWZvcm0gY29uZGl0aW9uIG9iamVjdHNcbiAqIEByZXR1cm5zIFRoZSBjb25kaXRpb24gSlNPTiBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQ29uZGl0aW9uSnNvbihcbiAgLi4uY29uZGl0aW9uczogQ29uZGl0aW9uc1xuKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIGNvbnN0IGNvbmRpdGlvbkpzb246IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblxuICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjb25kaXRpb25zKSB7XG4gICAgY29uc3QgeyB0ZXN0LCB2YXJpYWJsZSwgdmFsdWVzIH0gPSBjb25kaXRpb247XG5cbiAgICBpZiAoIWNvbmRpdGlvbkpzb25bdGVzdF0pIHtcbiAgICAgIGNvbmRpdGlvbkpzb25bdGVzdF0gPSB7fTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uZGl0aW9uSnNvblt0ZXN0XVt2YXJpYWJsZV0gPSB2YWx1ZXNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmRpdGlvbkpzb25bdGVzdF1bdmFyaWFibGVdID0gdmFsdWVzO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25kaXRpb25Kc29uO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgdGhlIGdpdmVuIHZhbHVlIGlzIGEgdmFsaWQgSnNvbiBDb25kaXRpb24gb2JqZWN0XG4gKlxuICogQVdTIENESyBJQU0gbGlicmFyeSByZWxpZXMgb24gYmVpbmcgYWJsZSB0byBwYXNzIGluIGEgYEpzb25gIGluc3RhbmNlIGZvclxuICogYSBgQ29uZGl0aW9uYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQ29uZGl0aW9uT2JqZWN0KFxuICB4OiB1bmtub3duLFxuKTogYXNzZXJ0cyB4IGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgaWYgKCF4IHx8IHR5cGVvZiB4ICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoeCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIkEgQ29uZGl0aW9uIHNob3VsZCBiZSByZXByZXNlbnRlZCBhcyBhIG1hcCBvZiBvcGVyYXRvciB0byB2YWx1ZVwiLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|
|
947
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9saWN5LXN0YXRlbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hd3MvaWFtL3BvbGljeS1zdGF0ZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQTQzQkEsOERBTUM7QUE2S0QsNERBVUM7QUFnQkQsOENBMEJDO0FBT0Qsb0NBV0M7QUFPRCwwQ0FvQkM7QUFRRCwwREFRQzs7QUE5cENELGlDQUE4QjtBQUc5Qiw2Q0Flc0I7QUFFdEI7Ozs7OztHQU1HO0FBQ0gsTUFBTSx5QkFBeUIsR0FBRyxHQUFHLENBQUM7QUFNdEM7O0dBRUc7QUFDSCxNQUFhLGVBQWU7SUFDMUI7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQVE7UUFDN0IsdUNBQXVDO1FBQ3ZDLE1BQU0sR0FBRyxHQUFHLElBQUksZUFBZSxDQUFDO1lBQzlCLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRztZQUNaLE9BQU8sRUFBRSxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO1lBQzNDLFNBQVMsRUFBRSxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1lBQy9DLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDO1lBQzNDLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTtZQUNsQixVQUFVLEVBQUUsc0JBQXNCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQztZQUNqRCxZQUFZLEVBQUUsc0JBQXNCLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQztZQUNyRCxVQUFVLEVBQUUsR0FBRyxDQUFDLFNBQVM7Z0JBQ3ZCLENBQUMsQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDcEMsQ0FBQyxDQUFDLFNBQVM7WUFDYixhQUFhLEVBQUUsR0FBRyxDQUFDLFlBQVk7Z0JBQzdCLENBQUMsQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDdkMsQ0FBQyxDQUFDLFNBQVM7U0FDZCxDQUFDLENBQUM7UUFFSCwwREFBMEQ7UUFDMUQsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDMUMsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFFRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFrQkQsWUFBWSxRQUE4QixFQUFFO1FBaEIzQixZQUFPLEdBQUcsSUFBSSxVQUFVLEVBQVUsQ0FBQztRQUNuQyxlQUFVLEdBQUcsSUFBSSxVQUFVLEVBQVUsQ0FBQztRQUN0QyxlQUFVLEdBQXFCLEVBQUUsQ0FBQztRQUNsQyxrQkFBYSxHQUFxQixFQUFFLENBQUM7UUFDckMsY0FBUyxHQUFHLElBQUksVUFBVSxFQUFVLENBQUM7UUFDckMsaUJBQVksR0FBRyxJQUFJLFVBQVUsRUFBVSxDQUFDO1FBQ3hDLGtCQUFhLEdBQWlCLEVBQUUsQ0FBQztRQUtsRCw4QkFBOEI7UUFDYixnQkFBVyxHQUFHLElBQUksVUFBVSxFQUFjLENBQUM7UUFDM0MsbUJBQWMsR0FBRyxJQUFJLFVBQVUsRUFBYyxDQUFDO1FBQ3ZELFlBQU8sR0FBRyxLQUFLLENBQUM7UUFHdEIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDO1FBRTVDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEQsc0NBQXNDO1FBQ3RDLElBQUksS0FBSyxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLEdBQUc7UUFDWixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxHQUFHLENBQUMsR0FBdUI7UUFDcEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztJQUNsQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLE1BQU07UUFDZixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxNQUFNLENBQUMsTUFBYztRQUM5QixJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxFQUFFO0lBQ0YsVUFBVTtJQUNWLEVBQUU7SUFFRjs7Ozs7O09BTUc7SUFDSSxVQUFVLENBQUMsR0FBRyxPQUFpQjtRQUNwQyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ25DLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDckQsTUFBTSxJQUFJLEtBQUssQ0FDYiwwRUFBMEUsQ0FDM0UsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLGFBQWEsQ0FBQyxHQUFHLFVBQW9CO1FBQzFDLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDdEMsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyRCxNQUFNLElBQUksS0FBSyxDQUNiLDBFQUEwRSxDQUMzRSxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxFQUFFO0lBQ0YsWUFBWTtJQUNaLEVBQUU7SUFFRjs7T0FFRztJQUNILElBQVcsWUFBWTtRQUNyQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksYUFBYSxDQUFDLEdBQUcsVUFBd0I7UUFDOUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN0QyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzVELE1BQU0sSUFBSSxLQUFLLENBQ2IsZ0ZBQWdGLENBQ2pGLENBQUM7UUFDSixDQUFDO1FBQ0QsOERBQThEO1FBQzlELHdDQUF3QztRQUN4Qyw2Q0FBNkM7UUFDN0MsSUFBSTtRQUVKLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUM7UUFDbkQsS0FBSyxNQUFNLFNBQVMsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUM5QixNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDO1lBQzFDLElBQUEsMkJBQWMsRUFBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEQsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksZ0JBQWdCLENBQUMsR0FBRyxhQUEyQjtRQUNwRCxJQUFJLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDekMsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM1RCxNQUFNLElBQUksS0FBSyxDQUNiLGdGQUFnRixDQUNqRixDQUFDO1FBQ0osQ0FBQztRQUNELDhDQUE4QztRQUM5QyxnREFBZ0Q7UUFDaEQsSUFBSTtRQUVKLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUM7UUFDekQsS0FBSyxNQUFNLFlBQVksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNqQyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsY0FBYyxDQUFDO1lBQzdDLElBQUEsMkJBQWMsRUFBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEQsQ0FBQztJQUNILENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxPQUFpQjtRQUM3Qyx3REFBd0Q7UUFDeEQsSUFBSSxhQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztZQUFFLE9BQU87UUFDeEMsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLElBQUksRUFBRSxFQUFFLENBQUM7WUFDbkMsSUFDRSxDQUFDLGFBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO2dCQUMzQixDQUFDLG9DQUFvQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFDbEQsQ0FBQztnQkFDRCxNQUFNLElBQUksS0FBSyxDQUNiLFdBQVcsTUFBTSx5SUFBeUksQ0FDM0osQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksc0JBQXNCLENBQUMsU0FBaUI7UUFDN0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLDZCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksZUFBZSxDQUFDLEdBQVc7UUFDaEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLHlCQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxtQkFBbUIsQ0FBQyxPQUFlLEVBQUUsSUFBMkI7UUFDckUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLDZCQUFnQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxxQkFBcUIsQ0FBQyxTQUFjLEVBQUUsVUFBc0I7UUFDakUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLCtCQUFrQixDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRDs7T0FFRztJQUNJLHVCQUF1QjtRQUM1QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksaUNBQW9CLEVBQUUsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7OztPQUlHO0lBQ0kseUJBQXlCLENBQUMsZUFBdUI7UUFDdEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLG1DQUFzQixDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksZUFBZTtRQUNwQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUkseUJBQVksRUFBRSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELEVBQUU7SUFDRixZQUFZO0lBQ1osRUFBRTtJQUVGOzs7Ozs7O09BT0c7SUFDSSxZQUFZLENBQUMsR0FBRyxJQUFjO1FBQ25DLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDckMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwRCxNQUFNLElBQUksS0FBSyxDQUNiLDhFQUE4RSxDQUMvRSxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxlQUFlLENBQUMsR0FBRyxJQUFjO1FBQ3RDLElBQUksQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN4QyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pELE1BQU0sSUFBSSxLQUFLLENBQ2IsOEVBQThFLENBQy9FLENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxlQUFlO1FBQ3BCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxXQUFXO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELEVBQUU7SUFDRixZQUFZO0lBQ1osRUFBRTtJQUVGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BK0JHO0lBQ0ksWUFBWSxDQUFDLFNBQW9CO1FBQ3RDLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFckMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzFDLENBQUM7UUFFRCxNQUFNLGlCQUFpQixHQUNyQixJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekQsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRztnQkFDdkQsR0FBRyxpQkFBaUI7Z0JBQ3BCLEdBQUcsU0FBUzthQUNiLENBQUM7UUFDSixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDckUsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0F1Qkc7SUFDSSxrQkFBa0IsQ0FBQyxHQUFXLEVBQUUsS0FBYztRQUNuRCxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3JDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQ2IsOERBQThELENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FDL0UsQ0FBQztZQUNKLENBQUM7WUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDO2dCQUNoQixJQUFJLEVBQUUsR0FBRztnQkFDVCxRQUFRLEVBQUUsQ0FBQztnQkFDWCxNQUFNLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNuQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxhQUFhLENBQUMsR0FBRyxVQUF1QjtRQUM3QyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksbUJBQW1CLENBQUMsVUFBbUM7UUFDNUQsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN0RCxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3RDLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksbUJBQW1CLENBQUMsR0FBRyxVQUFvQjtRQUNoRCxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQ2hCLElBQUksRUFBRSxjQUFjO1lBQ3BCLFFBQVEsRUFBRSxnQkFBZ0I7WUFDMUIsTUFBTSxFQUFFLFVBQVU7U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHlCQUF5QixDQUFDLEdBQUcsVUFBb0I7UUFDdEQsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUNoQixJQUFJLEVBQUUsY0FBYztZQUNwQixRQUFRLEVBQUUsbUJBQW1CO1lBQzdCLE1BQU0sRUFBRSxVQUFVO1NBQ25CLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxxQkFBcUIsQ0FBQyxHQUFHLElBQWM7UUFDNUMsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUNoQixJQUFJLEVBQUUsV0FBVztZQUNqQixRQUFRLEVBQUUsZUFBZTtZQUN6QixNQUFNLEVBQUUsSUFBSTtTQUNiLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSSxJQUFJLENBQUMsWUFBa0MsRUFBRTtRQUM5QyxPQUFPLElBQUksZUFBZSxDQUFDO1lBQ3pCLEdBQUcsRUFBRSxTQUFTLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHO1lBQzlCLE1BQU0sRUFBRSxTQUFTLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNO1lBQ3ZDLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPO1lBQzFDLFVBQVUsRUFBRSxTQUFTLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVO1lBRW5ELFVBQVUsRUFBRSxTQUFTLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVO1lBQ25ELGFBQWEsRUFBRSxTQUFTLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhO1lBRTVELFNBQVMsRUFBRSxTQUFTLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTO1lBQ2hELFlBQVksRUFBRSxTQUFTLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZO1lBRXpELFNBQVMsRUFBRSxTQUFTLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxVQUFVO1NBQ2xELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLGVBQWU7UUFDcEIsT0FBTyxrQkFBa0IsQ0FBQztZQUN4QixNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDN0IsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFO1lBQ25DLFNBQVMsRUFBRSxlQUFlLENBQUMsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQy9ELE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixTQUFTLEVBQUUsSUFBQSw0QkFBZSxFQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUM5QyxZQUFZLEVBQUUsSUFBQSw0QkFBZSxFQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUNwRCxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUU7WUFDakMsV0FBVyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFO1lBQ3ZDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztTQUNkLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLFFBQVE7UUFDYixPQUFPLGFBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFO1lBQzFCLFdBQVcsRUFBRSxpQkFBaUI7U0FDL0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNO1FBQ1gsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQ3hDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FDbkMsQ0FBQztRQUNGLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUM5QyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQ25DLENBQUM7UUFFRixPQUFPO1lBQ0wsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2IsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUztZQUMzRCxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQ3BFLFVBQVUsRUFBRSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQzFELGFBQWEsRUFBRSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQ25FLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDakUsWUFBWSxFQUNWLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUztZQUM5RCxTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQ25FLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtTQUNwQixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNLLHNCQUFzQixDQUM1QixHQUFHLFVBQWlGO1FBRXBGLGlFQUFpRTtRQUNqRSxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ25ELElBQUksSUFBSSxDQUFDLHVCQUF1QixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9DLGlDQUFpQztZQUNqQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsZUFBZSxDQUFDO1FBQ2pELENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxJQUFJLENBQUMsdUJBQXVCLEtBQUssZUFBZSxFQUFFLENBQUM7Z0JBQ3JELE1BQU0sSUFBSSxLQUFLLENBQ2IsMkVBQTJFLElBQUksQ0FBQyx1QkFBdUIsVUFBVSxlQUFlLHNDQUFzQyxDQUN2SyxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxvQkFBb0I7UUFDekIsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUNuQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM5RCxNQUFNLENBQUMsSUFBSSxDQUNULHNFQUFzRSxDQUN2RSxDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0kseUJBQXlCO1FBQzlCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzNDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3RFLE1BQU0sQ0FBQyxJQUFJLENBQ1QsNEZBQTRGLENBQzdGLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSx5QkFBeUI7UUFDOUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDM0MsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbEUsTUFBTSxDQUFDLElBQUksQ0FDVCx1RkFBdUYsQ0FDeEYsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNsRSxNQUFNLENBQUMsSUFBSSxDQUNULHdGQUF3RixDQUN6RixDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLFlBQVk7UUFDckIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsVUFBVTtRQUNuQixPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ksTUFBTTtRQUNYLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFXLE1BQU07UUFDZixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxhQUFhLENBQUMsT0FBNEI7UUFDL0MsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBRVosTUFBTSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFFaEQsR0FBRyxJQUFJLGNBQWMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUU1QyxLQUFLLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDOUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ3BELEtBQUssQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUMvQyxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFckQsR0FBRyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQztRQUM1QyxHQUFHLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDO1FBRS9DLEdBQUcsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNsRSxPQUFPLEdBQUcsQ0FBQztRQUVYLFNBQVMsS0FBSyxDQUFDLEdBQVcsRUFBRSxNQUFnQixFQUFFLFNBQWlCO1lBQzdELElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDdEIsR0FBRztvQkFDRCxHQUFHLENBQUMsTUFBTTt3QkFDVixDQUFDLENBQUMsNkJBQTZCO3dCQUMvQixHQUFHLENBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FDUixDQUFDLENBQUMsRUFBRSxFQUFFLENBQ0osQ0FBQyxhQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7NEJBQzlDLENBQUMsQ0FBQyx1QkFBdUIsQ0FDNUIsQ0FDRixDQUFDO1lBQ04sQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxlQUFlLENBQUMsTUFBYztRQUNwQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUNiLEdBQUcsTUFBTSxnR0FBZ0csQ0FDMUcsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDOztBQXJ3QkgsMENBc3dCQzs7O0FBRUQ7Ozs7R0FJRztBQUNILElBQVksTUFZWDtBQVpELFdBQVksTUFBTTtJQUNoQjs7T0FFRztJQUNILHlCQUFlLENBQUE7SUFFZjs7OztPQUlHO0lBQ0gsdUJBQWEsQ0FBQTtBQUNmLENBQUMsRUFaVyxNQUFNLHNCQUFOLE1BQU0sUUFZakI7QUFvQkQsdUNBQXVDO0FBRXZDLE1BQU0sYUFBYyxTQUFRLDBCQUFhO0lBSXZDLFlBQVksT0FBWSxFQUFFO1FBQ3hCLEtBQUssRUFBRSxDQUFDO1FBSE0sZUFBVSxHQUFxQixFQUFFLENBQUM7UUFJaEQsSUFBSSxDQUFDLGNBQWMsR0FBRyxvQ0FBdUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVNLFlBQVk7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM3QyxDQUFDO0NBQ0Y7QUFzQkQ7Ozs7R0FJRztBQUNILFNBQWdCLHlCQUF5QixDQUN2QyxNQUFrQjtJQUVsQixNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7SUFDMUIsTUFBTSxXQUFXLEdBQUcseUJBQXlCLENBQUM7SUFDOUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsQ0FBQztBQUN6QyxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVTtJQUFoQjtRQUNtQixRQUFHLEdBQUcsSUFBSSxHQUFHLEVBQUssQ0FBQztRQUNuQixVQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUssQ0FBQztJQXNDMUMsQ0FBQztJQXBDQzs7Ozs7O09BTUc7SUFDSSxJQUFJLENBQUMsR0FBRyxFQUFnQjtRQUM3QixNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssRUFBSyxDQUFDO1FBQzNCLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7WUFDbkIsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNwQixTQUFTO1lBQ1gsQ0FBQztZQUNELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25CLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZCxDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQsSUFBVyxNQUFNO1FBQ2YsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUMzQixDQUFDO0lBRU0sSUFBSTtRQUNULE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU07UUFDWCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztDQUNGO0FBRUQsU0FBUyxHQUFHLENBQUMsRUFBWTtJQUN2QixPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLENBQUM7QUFzQkQsU0FBUyxrQkFBa0IsQ0FBQyxDQUFrQjtJQUM1QyxPQUFPLE9BQU8sQ0FBQztRQUNiLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN6QyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDL0MsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQzdCLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUN2QixTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDdEMsWUFBWSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO1FBQzVDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUM3QyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDbkQsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0tBQ2xCLENBQUMsQ0FBQztJQUVILFNBQVMsS0FBSyxDQUNaLE1BQVcsRUFDWCxFQUFFLE1BQU0sR0FBRyxLQUFLLEtBQTBCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtRQUUzRCxJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNuQixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsSUFBSSxhQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDL0IsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDbkMsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQztZQUVELElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDeEIsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkIsQ0FBQztZQUVELE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUN2RCxDQUFDO1FBRUQsSUFBSSxNQUFNLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDekMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckMsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsU0FBUyxjQUFjLENBQ3JCLFNBQXNEO1FBRXRELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDOUQsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDcEMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBUSxFQUFFLENBQUM7UUFDdkIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2QixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdEMsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDO1lBQ3hCLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FBQyxDQUFNO0lBQ3JCLE1BQU0sR0FBRyxHQUFRLEVBQUUsQ0FBQztJQUNwQixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzdDLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDbkIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxTQUFTLHNCQUFzQixDQUFDLEtBQVU7SUFDeEMsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDeEIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3ZELE1BQU0sSUFBSSxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQzVFLE1BQU0sSUFBSSxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDaEQsQ0FBQztBQUVELFNBQWdCLHdCQUF3QixDQUN0QyxLQUFjO0lBRWQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUM1RSxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQy9CLGFBQWtEO0lBRWxELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNuQixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQWEsQ0FBQztJQUV0QyxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1FBQzlELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzdCLE1BQU0sSUFBSSxLQUFLLENBQ2IsaUNBQWlDLElBQUksS0FBSyxJQUFJLENBQUMsU0FBUyxDQUN0RCxTQUFTLENBQ1YsZ0NBQWdDLENBQ2xDLENBQUM7UUFDSixDQUFDO1FBQ0QsS0FBSyxNQUFNLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBZ0IsQ0FBQyxFQUFFLENBQUM7WUFDakUsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDVixJQUFJO2dCQUNKLFFBQVE7Z0JBQ1IsTUFBTSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7YUFDL0MsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLFlBQVksQ0FBQyxZQUEwQjtJQUNyRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FDdkQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FDekIsQ0FBQztJQUNGLHFDQUFxQztJQUNyQyw0REFBNEQ7SUFDNUQsMkRBQTJEO0lBQzNELGtDQUFrQztJQUNsQyxNQUFNO0lBQ04sSUFBSTtJQUNKLHFCQUFxQjtBQUN2QixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLGVBQWUsQ0FDN0IsR0FBRyxVQUFzQjtJQUV6QixNQUFNLGFBQWEsR0FBd0IsRUFBRSxDQUFDO0lBRTlDLEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFLENBQUM7UUFDbkMsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDO1FBRTdDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN6QixhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzNCLENBQUM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDeEIsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QyxDQUFDO2FBQU0sQ0FBQztZQUNOLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDekMsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLGFBQWEsQ0FBQztBQUN2QixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQix1QkFBdUIsQ0FDckMsQ0FBVTtJQUVWLElBQUksQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNwRCxNQUFNLElBQUksS0FBSyxDQUNiLGlFQUFpRSxDQUNsRSxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE2MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1pYW0vbGliL3BvbGljeS1zdGF0ZW1lbnQudHNcbmltcG9ydCB7IGRhdGFBd3NJYW1Qb2xpY3lEb2N1bWVudCB9IGZyb20gXCJAY2RrdGYvcHJvdmlkZXItYXdzXCI7XG5pbXBvcnQgeyBUb2tlbiB9IGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IHsgSUNvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnRQcm9wcyB9IGZyb20gXCIuL3BvbGljeS1zdGF0ZW1lbnQtcHJvcHMuZ2VuZXJhdGVkXCI7XG5pbXBvcnQge1xuICBBY2NvdW50UHJpbmNpcGFsLFxuICBBY2NvdW50Um9vdFByaW5jaXBhbCxcbiAgQW55UHJpbmNpcGFsLFxuICBBcm5QcmluY2lwYWwsXG4gIENhbm9uaWNhbFVzZXJQcmluY2lwYWwsXG4gIEZlZGVyYXRlZFByaW5jaXBhbCxcbiAgUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQsXG4gIFNlcnZpY2VQcmluY2lwYWwsXG4gIFNlcnZpY2VQcmluY2lwYWxPcHRzLFxuICBJUHJpbmNpcGFsLFxuICBQcmluY2lwYWxQcm9wcyxcbiAgbWVyZ2VQcmluY2lwYWwsXG4gIHRvUHJpbmNpcGFsSnNvbixcbiAgUHJpbmNpcGFsQmFzZSxcbn0gZnJvbSBcIi4vcHJpbmNpcGFsc1wiO1xuXG4vKipcbiAqIEFuIGVzdGltYXRlIG9uIGhvdyBsb25nIEFSTnMgdHlwaWNhbGx5IGFyZVxuICpcbiAqIFRoaXMgaXMgdXNlZCB0byBkZWNpZGUgd2hlbiB0byBzdGFydCBzcGxpdHRpbmcgc3RhdGVtZW50cyBpbnRvIG5ldyBNYW5hZ2VkIFBvbGljaWVzLlxuICogQmVjYXVzZSB3ZSBvZnRlbiBjYW4ndCBrbm93IHRoZSBsZW5ndGggb2YgYW4gQVJOIChpdCBtYXkgYmUgYSB0b2tlbiBhbmQgb25seVxuICogYXZhaWxhYmxlIGF0IGRlcGxveW1lbnQgdGltZSkgd2UnbGwgaGF2ZSB0byBlc3RpbWF0ZSBpdC5cbiAqL1xuY29uc3QgREVGQVVMVF9BUk5fU0laRV9FU1RJTUFURSA9IDE1MDtcblxuZXhwb3J0IHR5cGUgQ29uZGl0aW9uTWFwID0ge1xuICBbdGVzdDogc3RyaW5nXTogeyBbdmFyaWFibGU6IHN0cmluZ106IENvbmRpdGlvbiB9O1xufTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgc3RhdGVtZW50IGluIGFuIElBTSBwb2xpY3kgZG9jdW1lbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBQb2xpY3lTdGF0ZW1lbnQge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBUZXJyYWZvcm0gUG9saWN5U3RhdGVtZW50IGJhc2VkIG9uIHRoZSBBV1MgSUFNIFBvbGljeSBTdGF0ZW1lbnQgZm9ybWF0LlxuICAgKiBUaGlzIHdpbGwgYWNjZXB0IGFuIG9iamVjdCBjcmVhdGVkIGZyb20gdGhlIGAudG9TdGF0ZW1lbnRKc29uKClgIGNhbGxcbiAgICpcbiAgICogQHBhcmFtIG9iaiB0aGUgUG9saWN5U3RhdGVtZW50IGluIG9iamVjdCBmb3JtLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tSnNvbihvYmo6IGFueSkge1xuICAgIC8vIFRPRE86IFdoYXQgaWYgb2JqIGlzL2hhcyBhIFRva2VuKHMpP1xuICAgIGNvbnN0IHJldCA9IG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgc2lkOiBvYmouU2lkLFxuICAgICAgYWN0aW9uczogZW5zdXJlQXJyYXlPclVuZGVmaW5lZChvYmouQWN0aW9uKSxcbiAgICAgIHJlc291cmNlczogZW5zdXJlQXJyYXlPclVuZGVmaW5lZChvYmouUmVzb3VyY2UpLFxuICAgICAgY29uZGl0aW9uOiBmcm9tQ29uZGl0aW9uSnNvbihvYmouQ29uZGl0aW9uKSxcbiAgICAgIGVmZmVjdDogb2JqLkVmZmVjdCxcbiAgICAgIG5vdEFjdGlvbnM6IGVuc3VyZUFycmF5T3JVbmRlZmluZWQob2JqLk5vdEFjdGlvbiksXG4gICAgICBub3RSZXNvdXJjZXM6IGVuc3VyZUFycmF5T3JVbmRlZmluZWQob2JqLk5vdFJlc291cmNlKSxcbiAgICAgIHByaW5jaXBhbHM6IG9iai5QcmluY2lwYWxcbiAgICAgICAgPyBbbmV3IEpzb25QcmluY2lwYWwob2JqLlByaW5jaXBhbCldXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgbm90UHJpbmNpcGFsczogb2JqLk5vdFByaW5jaXBhbFxuICAgICAgICA/IFtuZXcgSnNvblByaW5jaXBhbChvYmouTm90UHJpbmNpcGFsKV1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICAvLyB2YWxpZGF0ZSB0aGF0IHRoZSBQb2xpY3lTdGF0ZW1lbnQgaGFzIHRoZSBjb3JyZWN0IHNoYXBlXG4gICAgY29uc3QgZXJyb3JzID0gcmV0LnZhbGlkYXRlRm9yQW55UG9saWN5KCk7XG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbmNvcnJlY3QgUG9saWN5IFN0YXRlbWVudDogXCIgKyBlcnJvcnMuam9pbihcIlxcblwiKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2FjdGlvbiA9IG5ldyBPcmRlcmVkU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfbm90QWN0aW9uID0gbmV3IE9yZGVyZWRTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9wcmluY2lwYWw6IFByaW5jaXBhbFByb3BzW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBfbm90UHJpbmNpcGFsOiBQcmluY2lwYWxQcm9wc1tdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgX3Jlc291cmNlID0gbmV3IE9yZGVyZWRTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9ub3RSZXNvdXJjZSA9IG5ldyBPcmRlcmVkU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfY29uZGl0aW9uTWFwOiBDb25kaXRpb25NYXAgPSB7fTtcbiAgcHJpdmF0ZSBfc2lkPzogc3RyaW5nO1xuICBwcml2YXRlIF9lZmZlY3Q6IEVmZmVjdDtcbiAgcHJpdmF0ZSBwcmluY2lwYWxDb25kaXRpb25zSnNvbj86IHN0cmluZztcblxuICAvLyBIb2xkIG9uIHRvIHRob3NlIHByaW5jaXBhbHNcbiAgcHJpdmF0ZSByZWFkb25seSBfcHJpbmNpcGFscyA9IG5ldyBPcmRlcmVkU2V0PElQcmluY2lwYWw+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX25vdFByaW5jaXBhbHMgPSBuZXcgT3JkZXJlZFNldDxJUHJpbmNpcGFsPigpO1xuICBwcml2YXRlIF9mcm96ZW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogUG9saWN5U3RhdGVtZW50UHJvcHMgPSB7fSkge1xuICAgIHRoaXMuX3NpZCA9IHByb3BzLnNpZDtcbiAgICB0aGlzLl9lZmZlY3QgPSBwcm9wcy5lZmZlY3QgfHwgRWZmZWN0LkFMTE9XO1xuXG4gICAgdGhpcy5hZGRBY3Rpb25zKC4uLihwcm9wcy5hY3Rpb25zIHx8IFtdKSk7XG4gICAgdGhpcy5hZGROb3RBY3Rpb25zKC4uLihwcm9wcy5ub3RBY3Rpb25zIHx8IFtdKSk7XG4gICAgdGhpcy5hZGRQcmluY2lwYWxzKC4uLihwcm9wcy5wcmluY2lwYWxzIHx8IFtdKSk7XG4gICAgdGhpcy5hZGROb3RQcmluY2lwYWxzKC4uLihwcm9wcy5ub3RQcmluY2lwYWxzIHx8IFtdKSk7XG4gICAgdGhpcy5hZGRSZXNvdXJjZXMoLi4uKHByb3BzLnJlc291cmNlcyB8fCBbXSkpO1xuICAgIHRoaXMuYWRkTm90UmVzb3VyY2VzKC4uLihwcm9wcy5ub3RSZXNvdXJjZXMgfHwgW10pKTtcbiAgICAvLyBUT0RPOiBIYW5kbGUgSVJlc29sdmFibGUgY29uZGl0aW9uP1xuICAgIGlmIChwcm9wcy5jb25kaXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5hZGRDb25kaXRpb25zKC4uLnByb3BzLmNvbmRpdGlvbik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRlbWVudCBJRCBmb3IgdGhpcyBzdGF0ZW1lbnRcbiAgICovXG4gIHB1YmxpYyBnZXQgc2lkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3NpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgU3RhdGVtZW50IElEIGZvciB0aGlzIHN0YXRlbWVudFxuICAgKi9cbiAgcHVibGljIHNldCBzaWQoc2lkOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmFzc2VydE5vdEZyb3plbihcInNpZFwiKTtcbiAgICB0aGlzLl9zaWQgPSBzaWQ7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBvciBkZW55IHRoZSBhY3Rpb25zIGluIHRoaXMgc3RhdGVtZW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IGVmZmVjdCgpOiBFZmZlY3Qge1xuICAgIHJldHVybiB0aGlzLl9lZmZlY3Q7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGVmZmVjdCBmb3IgdGhpcyBzdGF0ZW1lbnRcbiAgICovXG4gIHB1YmxpYyBzZXQgZWZmZWN0KGVmZmVjdDogRWZmZWN0KSB7XG4gICAgdGhpcy5hc3NlcnROb3RGcm96ZW4oXCJlZmZlY3RcIik7XG4gICAgdGhpcy5fZWZmZWN0ID0gZWZmZWN0O1xuICB9XG5cbiAgLy9cbiAgLy8gQWN0aW9uc1xuICAvL1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGFsbG93ZWQgYWN0aW9ucyBpbnRvIHRoZSBcIkFjdGlvblwiIHNlY3Rpb24gb2YgdGhlIHBvbGljeSBzdGF0ZW1lbnQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19hY3Rpb24uaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gYWN0aW9ucyBhY3Rpb25zIHRoYXQgd2lsbCBiZSBhbGxvd2VkLlxuICAgKi9cbiAgcHVibGljIGFkZEFjdGlvbnMoLi4uYWN0aW9uczogc3RyaW5nW10pIHtcbiAgICB0aGlzLmFzc2VydE5vdEZyb3plbihcImFkZEFjdGlvbnNcIik7XG4gICAgaWYgKGFjdGlvbnMubGVuZ3RoID4gMCAmJiB0aGlzLl9ub3RBY3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkNhbm5vdCBhZGQgJ0FjdGlvbnMnIHRvIHBvbGljeSBzdGF0ZW1lbnQgaWYgJ05vdEFjdGlvbnMnIGhhdmUgYmVlbiBhZGRlZFwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZVBvbGljeUFjdGlvbnMoYWN0aW9ucyk7XG4gICAgdGhpcy5fYWN0aW9uLnB1c2goLi4uYWN0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRXhwbGljaXRseSBhbGxvdyBhbGwgYWN0aW9ucyBleGNlcHQgdGhlIHNwZWNpZmllZCBsaXN0IG9mIGFjdGlvbnMgaW50byB0aGUgXCJOb3RBY3Rpb25cIiBzZWN0aW9uXG4gICAqIG9mIHRoZSBwb2xpY3kgZG9jdW1lbnQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19ub3RhY3Rpb24uaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gbm90QWN0aW9ucyBhY3Rpb25zIHRoYXQgd2lsbCBiZSBkZW5pZWQuIEFsbCBvdGhlciBhY3Rpb25zIHdpbGwgYmUgcGVybWl0dGVkLlxuICAgKi9cbiAgcHVibGljIGFkZE5vdEFjdGlvbnMoLi4ubm90QWN0aW9uczogc3RyaW5nW10pIHtcbiAgICB0aGlzLmFzc2VydE5vdEZyb3plbihcImFkZE5vdEFjdGlvbnNcIik7XG4gICAgaWYgKG5vdEFjdGlvbnMubGVuZ3RoID4gMCAmJiB0aGlzLl9hY3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkNhbm5vdCBhZGQgJ05vdEFjdGlvbnMnIHRvIHBvbGljeSBzdGF0ZW1lbnQgaWYgJ0FjdGlvbnMnIGhhdmUgYmVlbiBhZGRlZFwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZVBvbGljeUFjdGlvbnMobm90QWN0aW9ucyk7XG4gICAgdGhpcy5fbm90QWN0aW9uLnB1c2goLi4ubm90QWN0aW9ucyk7XG4gIH1cblxuICAvL1xuICAvLyBQcmluY2lwYWxcbiAgLy9cblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoaXMgcGVybWlzc2lvbiBoYXMgYSBcIlByaW5jaXBhbFwiIHNlY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhhc1ByaW5jaXBhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpbmNpcGFscy5sZW5ndGggKyB0aGlzLl9ub3RQcmluY2lwYWxzLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBwcmluY2lwYWxzIHRvIHRoZSBcIlByaW5jaXBhbFwiIHNlY3Rpb24gb2YgYSBwb2xpY3kgc3RhdGVtZW50LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfcHJpbmNpcGFsLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIHByaW5jaXBhbHMgSUFNIHByaW5jaXBhbHMgdGhhdCB3aWxsIGJlIGFkZGVkXG4gICAqL1xuICBwdWJsaWMgYWRkUHJpbmNpcGFscyguLi5wcmluY2lwYWxzOiBJUHJpbmNpcGFsW10pIHtcbiAgICB0aGlzLmFzc2VydE5vdEZyb3plbihcImFkZFByaW5jaXBhbHNcIik7XG4gICAgaWYgKHByaW5jaXBhbHMubGVuZ3RoID4gMCAmJiB0aGlzLl9ub3RQcmluY2lwYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDYW5ub3QgYWRkICdQcmluY2lwYWxzJyB0byBwb2xpY3kgc3RhdGVtZW50IGlmICdOb3RQcmluY2lwYWxzJyBoYXZlIGJlZW4gYWRkZWRcIixcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIFRPRE86IEFXU0NESyBvbmx5IGVuc3VyZXMgUHJpbmNpcGFsIGlzIG5vdCBpbnN0YW5jZW9mIEdyb3VwXG4gICAgLy8gZm9yIChjb25zdCBwcmluY2lwYWwgb2YgcHJpbmNpcGFscykge1xuICAgIC8vICAgdGhpcy52YWxpZGF0ZVBvbGljeVByaW5jaXBhbChwcmluY2lwYWwpO1xuICAgIC8vIH1cblxuICAgIGNvbnN0IGFkZGVkID0gdGhpcy5fcHJpbmNpcGFscy5wdXNoKC4uLnByaW5jaXBhbHMpO1xuICAgIGZvciAoY29uc3QgcHJpbmNpcGFsIG9mIGFkZGVkKSB7XG4gICAgICBjb25zdCBmcmFnbWVudCA9IHByaW5jaXBhbC5wb2xpY3lGcmFnbWVudDtcbiAgICAgIG1lcmdlUHJpbmNpcGFsKHRoaXMuX3ByaW5jaXBhbCwgZnJhZ21lbnQucHJpbmNpcGFscyk7XG4gICAgICB0aGlzLmFkZFByaW5jaXBhbENvbmRpdGlvbnMoLi4uZnJhZ21lbnQuY29uZGl0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgcHJpbmNpcGFscyB0aGF0IGlzIG5vdCBhbGxvd2VkIG9yIGRlbmllZCBhY2Nlc3MgdG8gdGhlIFwiTm90UHJpbmNpcGFsXCIgc2VjdGlvbiBvZlxuICAgKiBhIHBvbGljeSBzdGF0ZW1lbnQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19ub3RwcmluY2lwYWwuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gbm90UHJpbmNpcGFscyBJQU0gcHJpbmNpcGFscyB0aGF0IHdpbGwgYmUgZGVuaWVkIGFjY2Vzc1xuICAgKi9cbiAgcHVibGljIGFkZE5vdFByaW5jaXBhbHMoLi4ubm90UHJpbmNpcGFsczogSVByaW5jaXBhbFtdKSB7XG4gICAgdGhpcy5hc3NlcnROb3RGcm96ZW4oXCJhZGROb3RQcmluY2lwYWxzXCIpO1xuICAgIGlmIChub3RQcmluY2lwYWxzLmxlbmd0aCA+IDAgJiYgdGhpcy5fcHJpbmNpcGFscy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiQ2Fubm90IGFkZCAnTm90UHJpbmNpcGFscycgdG8gcG9saWN5IHN0YXRlbWVudCBpZiAnUHJpbmNpcGFscycgaGF2ZSBiZWVuIGFkZGVkXCIsXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBmb3IgKGNvbnN0IG5vdFByaW5jaXBhbCBvZiBub3RQcmluY2lwYWxzKSB7XG4gICAgLy8gICB0aGlzLnZhbGlkYXRlUG9saWN5UHJpbmNpcGFsKG5vdFByaW5jaXBhbCk7XG4gICAgLy8gfVxuXG4gICAgY29uc3QgYWRkZWQgPSB0aGlzLl9ub3RQcmluY2lwYWxzLnB1c2goLi4ubm90UHJpbmNpcGFscyk7XG4gICAgZm9yIChjb25zdCBub3RQcmluY2lwYWwgb2YgYWRkZWQpIHtcbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gbm90UHJpbmNpcGFsLnBvbGljeUZyYWdtZW50O1xuICAgICAgbWVyZ2VQcmluY2lwYWwodGhpcy5fbm90UHJpbmNpcGFsLCBmcmFnbWVudC5wcmluY2lwYWxzKTtcbiAgICAgIHRoaXMuYWRkUHJpbmNpcGFsQ29uZGl0aW9ucyguLi5mcmFnbWVudC5jb25kaXRpb25zKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlUG9saWN5QWN0aW9ucyhhY3Rpb25zOiBzdHJpbmdbXSkge1xuICAgIC8vIEluIGNhc2Ugb2YgYW4gdW5yZXNvbHZlZCBsaXN0IG9mIGFjdGlvbnMgcmV0dXJuIGVhcmx5XG4gICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChhY3Rpb25zKSkgcmV0dXJuO1xuICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIGFjdGlvbnMgfHwgW10pIHtcbiAgICAgIGlmIChcbiAgICAgICAgIVRva2VuLmlzVW5yZXNvbHZlZChhY3Rpb24pICYmXG4gICAgICAgICEvXihcXCp8W2EtekEtWjAtOS1dKzpbYS16QS1aMC05Kl0rKSQvLnRlc3QoYWN0aW9uKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQWN0aW9uICcke2FjdGlvbn0nIGlzIGludmFsaWQuIEFuIGFjdGlvbiBzdHJpbmcgY29uc2lzdHMgb2YgYSBzZXJ2aWNlIG5hbWVzcGFjZSwgYSBjb2xvbiwgYW5kIHRoZSBuYW1lIG9mIGFuIGFjdGlvbi4gQWN0aW9uIG5hbWVzIGNhbiBpbmNsdWRlIHdpbGRjYXJkcy5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IEFXUyBhY2NvdW50IElEIGFzIHRoZSBwcmluY2lwYWwgZW50aXR5IHRvIHRoZSBcIlByaW5jaXBhbFwiIHNlY3Rpb24gb2YgYSBwb2xpY3kgc3RhdGVtZW50LlxuICAgKi9cbiAgcHVibGljIGFkZEF3c0FjY291bnRQcmluY2lwYWwoYWNjb3VudElkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmFkZFByaW5jaXBhbHMobmV3IEFjY291bnRQcmluY2lwYWwoYWNjb3VudElkKSk7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmeSBhIHByaW5jaXBhbCB1c2luZyB0aGUgQVJOICBpZGVudGlmaWVyIG9mIHRoZSBwcmluY2lwYWwuXG4gICAqIFlvdSBjYW5ub3Qgc3BlY2lmeSBJQU0gZ3JvdXBzIGFuZCBpbnN0YW5jZSBwcm9maWxlcyBhcyBwcmluY2lwYWxzLlxuICAgKlxuICAgKiBAcGFyYW0gYXJuIEFSTiBpZGVudGlmaWVyIG9mIEFXUyBhY2NvdW50LCBJQU0gdXNlciwgb3IgSUFNIHJvbGUgKGkuZS4gYXJuOmF3czppYW06OjEyMzQ1Njc4OTAxMjp1c2VyL3VzZXItbmFtZSlcbiAgICovXG4gIHB1YmxpYyBhZGRBcm5QcmluY2lwYWwoYXJuOiBzdHJpbmcpIHtcbiAgICB0aGlzLmFkZFByaW5jaXBhbHMobmV3IEFyblByaW5jaXBhbChhcm4pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgc2VydmljZSBwcmluY2lwYWwgdG8gdGhpcyBwb2xpY3kgc3RhdGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gc2VydmljZSB0aGUgc2VydmljZSBuYW1lIGZvciB3aGljaCBhIHNlcnZpY2UgcHJpbmNpcGFsIGlzIHJlcXVlc3RlZCAoZS5nOiBgczMuYW1hem9uYXdzLmNvbWApLlxuICAgKiBAcGFyYW0gb3B0cyAgICBvcHRpb25zIGZvciBhZGRpbmcgdGhlIHNlcnZpY2UgcHJpbmNpcGFsIChzdWNoIGFzIHNwZWNpZnlpbmcgYSBwcmluY2lwYWwgaW4gYSBkaWZmZXJlbnQgcmVnaW9uKVxuICAgKi9cbiAgcHVibGljIGFkZFNlcnZpY2VQcmluY2lwYWwoc2VydmljZTogc3RyaW5nLCBvcHRzPzogU2VydmljZVByaW5jaXBhbE9wdHMpIHtcbiAgICB0aGlzLmFkZFByaW5jaXBhbHMobmV3IFNlcnZpY2VQcmluY2lwYWwoc2VydmljZSwgb3B0cykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBmZWRlcmF0ZWQgaWRlbnRpdHkgcHJvdmlkZXIgc3VjaCBhcyBBbWF6b24gQ29nbml0byB0byB0aGlzIHBvbGljeSBzdGF0ZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBmZWRlcmF0ZWQgZmVkZXJhdGVkIGlkZW50aXR5IHByb3ZpZGVyIChpLmUuICdjb2duaXRvLWlkZW50aXR5LmFtYXpvbmF3cy5jb20nKVxuICAgKiBAcGFyYW0gY29uZGl0aW9ucyBUaGUgY29uZGl0aW9ucyB1bmRlciB3aGljaCB0aGUgcG9saWN5IGlzIGluIGVmZmVjdC5cbiAgICogICBTZWUgW3RoZSBJQU0gZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb24uaHRtbCkuXG4gICAqL1xuICBwdWJsaWMgYWRkRmVkZXJhdGVkUHJpbmNpcGFsKGZlZGVyYXRlZDogYW55LCBjb25kaXRpb25zOiBDb25kaXRpb25zKSB7XG4gICAgdGhpcy5hZGRQcmluY2lwYWxzKG5ldyBGZWRlcmF0ZWRQcmluY2lwYWwoZmVkZXJhdGVkLCBjb25kaXRpb25zKSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBBV1MgYWNjb3VudCByb290IHVzZXIgcHJpbmNpcGFsIHRvIHRoaXMgcG9saWN5IHN0YXRlbWVudFxuICAgKi9cbiAgcHVibGljIGFkZEFjY291bnRSb290UHJpbmNpcGFsKCkge1xuICAgIHRoaXMuYWRkUHJpbmNpcGFscyhuZXcgQWNjb3VudFJvb3RQcmluY2lwYWwoKSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNhbm9uaWNhbCB1c2VyIElEIHByaW5jaXBhbCB0byB0aGlzIHBvbGljeSBkb2N1bWVudFxuICAgKlxuICAgKiBAcGFyYW0gY2Fub25pY2FsVXNlcklkIHVuaXF1ZSBpZGVudGlmaWVyIGFzc2lnbmVkIGJ5IEFXUyBmb3IgZXZlcnkgYWNjb3VudFxuICAgKi9cbiAgcHVibGljIGFkZENhbm9uaWNhbFVzZXJQcmluY2lwYWwoY2Fub25pY2FsVXNlcklkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmFkZFByaW5jaXBhbHMobmV3IENhbm9uaWNhbFVzZXJQcmluY2lwYWwoY2Fub25pY2FsVXNlcklkKSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbGwgaWRlbnRpdGllcyBpbiBhbGwgYWNjb3VudHMgKFwiKlwiKSB0byB0aGlzIHBvbGljeSBzdGF0ZW1lbnRcbiAgICovXG4gIHB1YmxpYyBhZGRBbnlQcmluY2lwYWwoKSB7XG4gICAgdGhpcy5hZGRQcmluY2lwYWxzKG5ldyBBbnlQcmluY2lwYWwoKSk7XG4gIH1cblxuICAvL1xuICAvLyBSZXNvdXJjZXNcbiAgLy9cblxuICAvKipcbiAgICogU3BlY2lmeSByZXNvdXJjZXMgdGhhdCB0aGlzIHBvbGljeSBzdGF0ZW1lbnQgYXBwbGllcyBpbnRvIHRoZSBcIlJlc291cmNlXCIgc2VjdGlvbiBvZlxuICAgKiB0aGlzIHBvbGljeSBzdGF0ZW1lbnQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19yZXNvdXJjZS5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBhcm5zIEFtYXpvbiBSZXNvdXJjZSBOYW1lcyAoQVJOcykgb2YgdGhlIHJlc291cmNlcyB0aGF0IHRoaXMgcG9saWN5IHN0YXRlbWVudCBhcHBsaWVzIHRvXG4gICAqL1xuICBwdWJsaWMgYWRkUmVzb3VyY2VzKC4uLmFybnM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5hc3NlcnROb3RGcm96ZW4oXCJhZGRSZXNvdXJjZXNcIik7XG4gICAgaWYgKGFybnMubGVuZ3RoID4gMCAmJiB0aGlzLl9ub3RSZXNvdXJjZS5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiQ2Fubm90IGFkZCAnUmVzb3VyY2VzJyB0byBwb2xpY3kgc3RhdGVtZW50IGlmICdOb3RSZXNvdXJjZXMnIGhhdmUgYmVlbiBhZGRlZFwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5fcmVzb3VyY2UucHVzaCguLi5hcm5zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHJlc291cmNlcyB0aGF0IHRoaXMgcG9saWN5IHN0YXRlbWVudCB3aWxsIG5vdCBhcHBseSB0byBpbiB0aGUgXCJOb3RSZXNvdXJjZVwiIHNlY3Rpb25cbiAgICogb2YgdGhpcyBwb2xpY3kgc3RhdGVtZW50LiBBbGwgcmVzb3VyY2VzIGV4Y2VwdCB0aGUgc3BlY2lmaWVkIGxpc3Qgd2lsbCBiZSBtYXRjaGVkLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfbm90cmVzb3VyY2UuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gYXJucyBBbWF6b24gUmVzb3VyY2UgTmFtZXMgKEFSTnMpIG9mIHRoZSByZXNvdXJjZXMgdGhhdCB0aGlzIHBvbGljeSBzdGF0ZW1lbnQgZG9lcyBub3QgYXBwbHkgdG9cbiAgICovXG4gIHB1YmxpYyBhZGROb3RSZXNvdXJjZXMoLi4uYXJuczogc3RyaW5nW10pIHtcbiAgICB0aGlzLmFzc2VydE5vdEZyb3plbihcImFkZE5vdFJlc291cmNlc1wiKTtcbiAgICBpZiAoYXJucy5sZW5ndGggPiAwICYmIHRoaXMuX3Jlc291cmNlLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJDYW5ub3QgYWRkICdOb3RSZXNvdXJjZXMnIHRvIHBvbGljeSBzdGF0ZW1lbnQgaWYgJ1Jlc291cmNlcycgaGF2ZSBiZWVuIGFkZGVkXCIsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLl9ub3RSZXNvdXJjZS5wdXNoKC4uLmFybnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBgYFwiKlwiYGAgcmVzb3VyY2UgdG8gdGhpcyBzdGF0ZW1lbnQuXG4gICAqL1xuICBwdWJsaWMgYWRkQWxsUmVzb3VyY2VzKCkge1xuICAgIHRoaXMuYWRkUmVzb3VyY2VzKFwiKlwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBwZXJtaXNzaW9uIGhhcyBhdCBsZWFzdCBvbmUgcmVzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIGl0LlxuICAgKi9cbiAgcHVibGljIGdldCBoYXNSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVzb3VyY2UgJiYgdGhpcy5fcmVzb3VyY2UubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8vXG4gIC8vIENvbmRpdGlvblxuICAvL1xuXG4gIC8qKlxuICAgKiBBZGQgYSBjb25kaXRpb24gdG8gdGhlIFBvbGljeVxuICAgKlxuICAgKiBJZiBtdWx0aXBsZSBjYWxscyBhcmUgbWFkZSB0byBhZGQgYSBjb25kaXRpb24gd2l0aCB0aGUgc2FtZSB0ZXN0IGFuZCB2YXJpYWJsZSwgb25seVxuICAgKiB0aGUgbGFzdCBvbmUgd2lucy4gRm9yIGV4YW1wbGU6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIGRlY2xhcmUgY29uc3Qgc3RtdDogaWFtLlBvbGljeVN0YXRlbWVudDtcbiAgICpcbiAgICogc3RtdC5hZGRDb25kaXRpb24oeyB0ZXN0OiAnU3RyaW5nRXF1YWxzJywgdmFyaWFibGU6ICdhd3M6U29tZUZpZWxkJywgdmFsdWVzOiBbJzEnXSB9KTtcbiAgICogc3RtdC5hZGRDb25kaXRpb24oeyB0ZXN0OiAnU3RyaW5nRXF1YWxzJywgdmFyaWFibGU6ICdhd3M6U29tZUZpZWxkJywgdmFsdWVzOiBbJzInXSB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIFdpbGwgZW5kIHVwIHdpdGggdGhlIHNpbmdsZSBjb25kaXRpb25cbiAgICpcbiAgICogYGBgdHNcbiAgICoge1xuICAgKiAgIHRlc3Q6ICdTdHJpbmdFcXVhbHMnLFxuICAgKiAgIHZhcmlhYmxlOiAnYXdzOlNvbWVGaWVsZCcsXG4gICAqICAgdmFsdWVzOiBbJzInXSxcbiAgICogfVxuICAgKiBgYGAuXG4gICAqXG4gICAqIElmIHlvdSBtZWFudCB0byBhZGQgYSBjb25kaXRpb24gdG8gc2F5IHRoYXQgdGhlIGZpZWxkIGNhbiBiZSAqZWl0aGVyKiBgMWAgb3IgYDJgLCB3cml0ZVxuICAgKiB0aGlzOlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiBkZWNsYXJlIGNvbnN0IHN0bXQ6IGlhbS5Qb2xpY3lTdGF0ZW1lbnQ7XG4gICAqXG4gICAqIHN0bXQuYWRkQ29uZGl0aW9uKHsgdGVzdDogJ1N0cmluZ0VxdWFscycsIHZhcmlhYmxlOiAnYXdzOlNvbWVGaWVsZCcsIHZhbHVlczogWycxJywgJzInXSB9KTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYWRkQ29uZGl0aW9uKGNvbmRpdGlvbjogQ29uZGl0aW9uKSB7XG4gICAgdGhpcy5hc3NlcnROb3RGcm96ZW4oXCJhZGRDb25kaXRpb25cIik7XG5cbiAgICBpZiAoIXRoaXMuX2NvbmRpdGlvbk1hcFtjb25kaXRpb24udGVzdF0pIHtcbiAgICAgIHRoaXMuX2NvbmRpdGlvbk1hcFtjb25kaXRpb24udGVzdF0gPSB7fTtcbiAgICB9XG5cbiAgICBjb25zdCBleGlzdGluZ0NvbmRpdGlvbiA9XG4gICAgICB0aGlzLl9jb25kaXRpb25NYXBbY29uZGl0aW9uLnRlc3RdW2NvbmRpdGlvbi52YXJpYWJsZV07XG4gICAgaWYgKGV4aXN0aW5nQ29uZGl0aW9uKSB7XG4gICAgICB0aGlzLl9jb25kaXRpb25NYXBbY29uZGl0aW9uLnRlc3RdW2NvbmRpdGlvbi52YXJpYWJsZV0gPSB7XG4gICAgICAgIC4uLmV4aXN0aW5nQ29uZGl0aW9uLFxuICAgICAgICAuLi5jb25kaXRpb24sXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jb25kaXRpb25NYXBbY29uZGl0aW9uLnRlc3RdW2NvbmRpdGlvbi52YXJpYWJsZV0gPSBjb25kaXRpb247XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGNvbmRpdGlvbiB0byB0aGUgUG9saWN5XG4gICAqXG4gICAqIElmIG11bHRpcGxlIGNhbGxzIGFyZSBtYWRlIHRvIGFkZCBhIGNvbmRpdGlvbiB3aXRoIHRoZSBzYW1lIG9wZXJhdG9yIGFuZCBmaWVsZCwgb25seVxuICAgKiB0aGUgbGFzdCBvbmUgd2lucy4gRm9yIGV4YW1wbGU6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIGRlY2xhcmUgY29uc3Qgc3RtdDogaWFtLlBvbGljeVN0YXRlbWVudDtcbiAgICpcbiAgICogc3RtdC5hZGRDb25kaXRpb24oJ1N0cmluZ0VxdWFscycsIHsgJ2F3czpTb21lRmllbGQnOiAnMScgfSk7XG4gICAqIHN0bXQuYWRkQ29uZGl0aW9uKCdTdHJpbmdFcXVhbHMnLCB7ICdhd3M6U29tZUZpZWxkJzogJzInIH0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogV2lsbCBlbmQgdXAgd2l0aCB0aGUgc2luZ2xlIGNvbmRpdGlvbiBgU3RyaW5nRXF1YWxzOiB7ICdhd3M6U29tZUZpZWxkJzogJzInIH1gLlxuICAgKlxuICAgKiBJZiB5b3UgbWVhbnQgdG8gYWRkIGEgY29uZGl0aW9uIHRvIHNheSB0aGF0IHRoZSBmaWVsZCBjYW4gYmUgKmVpdGhlciogYDFgIG9yIGAyYCwgd3JpdGVcbiAgICogdGhpczpcbiAgICpcbiAgICogYGBgdHNcbiAgICogZGVjbGFyZSBjb25zdCBzdG10OiBpYW0uUG9saWN5U3RhdGVtZW50O1xuICAgKlxuICAgKiBzdG10LmFkZENvbmRpdGlvbignU3RyaW5nRXF1YWxzJywgeyAnYXdzOlNvbWVGaWVsZCc6IFsnMScsICcyJ10gfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFkZENvbmRpdGlvbk9iamVjdChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLmFzc2VydE5vdEZyb3plbihcImFkZENvbmRpdGlvblwiKTtcbiAgICB2YWxpZGF0ZUNvbmRpdGlvbk9iamVjdCh2YWx1ZSk7XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICBpZiAoIWlzU3RyaW5nT3JBcnJheU9mU3RyaW5ncyh2KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZpZWxkcyBtdXN0IGJlIGVpdGhlciBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLiBHb3QgJHt2fSBmb3Iga2V5ICR7a31gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5hZGRDb25kaXRpb24oe1xuICAgICAgICB0ZXN0OiBrZXksXG4gICAgICAgIHZhcmlhYmxlOiBrLFxuICAgICAgICB2YWx1ZXM6IEFycmF5LmlzQXJyYXkodikgPyB2IDogW3ZdLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBtdWx0aXBsZSBjb25kaXRpb25zIHRvIHRoZSBQb2xpY3lcbiAgICpcbiAgICogU2VlIHRoZSBgYWRkQ29uZGl0aW9uYCBmdW5jdGlvbiBmb3IgYSBjYXZlYXQgb24gY2FsbGluZyB0aGlzIG1ldGhvZCBtdWx0aXBsZSB0aW1lcy5cbiAgICovXG4gIHB1YmxpYyBhZGRDb25kaXRpb25zKC4uLmNvbmRpdGlvbnM6IENvbmRpdGlvbltdKSB7XG4gICAgY29uZGl0aW9ucy5tYXAoKGMpID0+IHtcbiAgICAgIHRoaXMuYWRkQ29uZGl0aW9uKGMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBtdWx0aXBsZSBjb25kaXRpb25PYmplY3RzIHRvIHRoZSBQb2xpY3lcbiAgICpcbiAgICogU2VlIHRoZSBgYWRkQ29uZGl0aW9uT2JqZWN0YCBmdW5jdGlvbiBmb3IgYSBjYXZlYXQgb24gY2FsbGluZyB0aGlzIG1ldGhvZCBtdWx0aXBsZSB0aW1lcy5cbiAgICovXG4gIHB1YmxpYyBhZGRDb25kaXRpb25PYmplY3RzKGNvbmRpdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29uZGl0aW9ucykpIHtcbiAgICAgIHRoaXMuYWRkQ29uZGl0aW9uT2JqZWN0KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBgU3RyaW5nRXF1YWxzYCBjb25kaXRpb24gdGhhdCBsaW1pdHMgdG8gYSBnaXZlbiBhY2NvdW50IGZyb20gYHN0czpFeHRlcm5hbElkYC5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2U6IHN1YnNlcXVlbnQgY2FsbHMgd2lsbCBvdmVyd3JpdGUgZWFybGllciBjYWxscy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvaWRfcm9sZXNfY3JlYXRlX2Zvci11c2VyX2V4dGVybmFsaWQuaHRtbFxuICAgKi9cbiAgcHVibGljIGFkZEFjY291bnRDb25kaXRpb24oLi4uYWNjb3VudElkczogc3RyaW5nW10pIHtcbiAgICB0aGlzLmFkZENvbmRpdGlvbih7XG4gICAgICB0ZXN0OiBcIlN0cmluZ0VxdWFsc1wiLFxuICAgICAgdmFyaWFibGU6IFwic3RzOkV4dGVybmFsSWRcIixcbiAgICAgIHZhbHVlczogYWNjb3VudElkcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gYFN0cmluZ0VxdWFsc2AgY29uZGl0aW9uIHRoYXQgbGltaXRzIHRvIGEgZ2l2ZW4gYWNjb3VudCBmcm9tIGBhd3M6U291cmNlQWNjb3VudGAuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlOiBzdWJzZXF1ZW50IGNhbGxzIHdpbGwgb3ZlcndyaXRlIGVhcmxpZXIgY2FsbHMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19jb25kaXRpb24ta2V5cy5odG1sI2NvbmRpdGlvbi1rZXlzLXNvdXJjZWFjY291bnRcbiAgICovXG4gIHB1YmxpYyBhZGRTb3VyY2VBY2NvdW50Q29uZGl0aW9uKC4uLmFjY291bnRJZHM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5hZGRDb25kaXRpb24oe1xuICAgICAgdGVzdDogXCJTdHJpbmdFcXVhbHNcIixcbiAgICAgIHZhcmlhYmxlOiBcImF3czpTb3VyY2VBY2NvdW50XCIsXG4gICAgICB2YWx1ZXM6IGFjY291bnRJZHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIGBBcm5FcXVhbHNgIGNvbmRpdGlvbiB0aGF0IGxpbWl0cyB0byBhIGdpdmVuIHJlc291cmNlIGFybiBmcm9tIGBhd3M6U291cmNlQXJuYC5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2U6IHN1YnNlcXVlbnQgY2FsbHMgd2lsbCBvdmVyd3JpdGUgZWFybGllciBjYWxscy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2NvbmRpdGlvbi1rZXlzLmh0bWwjY29uZGl0aW9uLWtleXMtc291cmNlYXJuXG4gICAqL1xuICBwdWJsaWMgYWRkU291cmNlQXJuQ29uZGl0aW9uKC4uLmFybnM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5hZGRDb25kaXRpb24oe1xuICAgICAgdGVzdDogXCJBcm5FcXVhbHNcIixcbiAgICAgIHZhcmlhYmxlOiBcImF3czpTb3VyY2VBcm5cIixcbiAgICAgIHZhbHVlczogYXJucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgYFBvbGljeVN0YXRlbWVudGAgd2l0aCB0aGUgc2FtZSBleGFjdCBwcm9wZXJ0aWVzXG4gICAqIGFzIHRoaXMgb25lLCBleGNlcHQgZm9yIHRoZSBvdmVycmlkZXNcbiAgICovXG4gIHB1YmxpYyBjb3B5KG92ZXJyaWRlczogUG9saWN5U3RhdGVtZW50UHJvcHMgPSB7fSkge1xuICAgIHJldHVybiBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIHNpZDogb3ZlcnJpZGVzLnNpZCA/PyB0aGlzLnNpZCxcbiAgICAgIGVmZmVjdDogb3ZlcnJpZGVzLmVmZmVjdCA/PyB0aGlzLmVmZmVjdCxcbiAgICAgIGFjdGlvbnM6IG92ZXJyaWRlcy5hY3Rpb25zID8/IHRoaXMuYWN0aW9ucyxcbiAgICAgIG5vdEFjdGlvbnM6IG92ZXJyaWRlcy5ub3RBY3Rpb25zID8/IHRoaXMubm90QWN0aW9ucyxcblxuICAgICAgcHJpbmNpcGFsczogb3ZlcnJpZGVzLnByaW5jaXBhbHMgPz8gdGhpcy5wcmluY2lwYWxzLFxuICAgICAgbm90UHJpbmNpcGFsczogb3ZlcnJpZGVzLm5vdFByaW5jaXBhbHMgPz8gdGhpcy5ub3RQcmluY2lwYWxzLFxuXG4gICAgICByZXNvdXJjZXM6IG92ZXJyaWRlcy5yZXNvdXJjZXMgPz8gdGhpcy5yZXNvdXJjZXMsXG4gICAgICBub3RSZXNvdXJjZXM6IG92ZXJyaWRlcy5ub3RSZXNvdXJjZXMgPz8gdGhpcy5ub3RSZXNvdXJjZXMsXG5cbiAgICAgIGNvbmRpdGlvbjogb3ZlcnJpZGVzLmNvbmRpdGlvbiA/PyB0aGlzLmNvbmRpdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IEFXUyBJQU0gUG9saWN5IHN0YXRlbWVudCBKU09OXG4gICAqL1xuICBwdWJsaWMgdG9TdGF0ZW1lbnRKc29uKCk6IGFueSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVN0YXRlbWVudCh7XG4gICAgICBBY3Rpb246IHRoaXMuX2FjdGlvbi5kaXJlY3QoKSxcbiAgICAgIE5vdEFjdGlvbjogdGhpcy5fbm90QWN0aW9uLmRpcmVjdCgpLFxuICAgICAgQ29uZGl0aW9uOiB0b0NvbmRpdGlvbkpzb24oLi4udG9Db25kaXRpb25zKHRoaXMuX2NvbmRpdGlvbk1hcCkpLFxuICAgICAgRWZmZWN0OiB0aGlzLmVmZmVjdCxcbiAgICAgIFByaW5jaXBhbDogdG9QcmluY2lwYWxKc29uKC4uLnRoaXMuX3ByaW5jaXBhbCksXG4gICAgICBOb3RQcmluY2lwYWw6IHRvUHJpbmNpcGFsSnNvbiguLi50aGlzLl9ub3RQcmluY2lwYWwpLFxuICAgICAgUmVzb3VyY2U6IHRoaXMuX3Jlc291cmNlLmRpcmVjdCgpLFxuICAgICAgTm90UmVzb3VyY2U6IHRoaXMuX25vdFJlc291cmNlLmRpcmVjdCgpLFxuICAgICAgU2lkOiB0aGlzLnNpZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwb2xpY3kgc3RhdGVtZW50XG4gICAqL1xuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIFRva2VuLmFzU3RyaW5nKHRoaXMsIHtcbiAgICAgIGRpc3BsYXlIaW50OiBcIlBvbGljeVN0YXRlbWVudFwiLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTT04taWZ5IHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogVXNlZCB3aGVuIEpTT04uc3RyaW5naWZ5KCkgaXMgY2FsbGVkXG4gICAqL1xuICBwdWJsaWMgdG9KU09OKCk6IGRhdGFBd3NJYW1Qb2xpY3lEb2N1bWVudC5EYXRhQXdzSWFtUG9saWN5RG9jdW1lbnRTdGF0ZW1lbnQge1xuICAgIGNvbnN0IHByaW5jaXBhbHMgPSB0aGlzLnByaW5jaXBhbHMuZmxhdE1hcChcbiAgICAgIChwKSA9PiBwLnBvbGljeUZyYWdtZW50LnByaW5jaXBhbHMsXG4gICAgKTtcbiAgICBjb25zdCBub3RQcmluY2lwYWxzID0gdGhpcy5ub3RQcmluY2lwYWxzLmZsYXRNYXAoXG4gICAgICAocCkgPT4gcC5wb2xpY3lGcmFnbWVudC5wcmluY2lwYWxzLFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2lkOiB0aGlzLnNpZCxcbiAgICAgIGFjdGlvbnM6IHRoaXMuYWN0aW9ucy5sZW5ndGggPiAwID8gdGhpcy5hY3Rpb25zIDogdW5kZWZpbmVkLFxuICAgICAgbm90QWN0aW9uczogdGhpcy5ub3RBY3Rpb25zLmxlbmd0aCA+IDAgPyB0aGlzLm5vdEFjdGlvbnMgOiB1bmRlZmluZWQsXG4gICAgICBwcmluY2lwYWxzOiBwcmluY2lwYWxzLmxlbmd0aCA+IDAgPyBwcmluY2lwYWxzIDogdW5kZWZpbmVkLFxuICAgICAgbm90UHJpbmNpcGFsczogbm90UHJpbmNpcGFscy5sZW5ndGggPiAwID8gbm90UHJpbmNpcGFscyA6IHVuZGVmaW5lZCxcbiAgICAgIHJlc291cmNlczogdGhpcy5yZXNvdXJjZXMubGVuZ3RoID4gMCA/IHRoaXMucmVzb3VyY2VzIDogdW5kZWZpbmVkLFxuICAgICAgbm90UmVzb3VyY2VzOlxuICAgICAgICB0aGlzLm5vdFJlc291cmNlcy5sZW5ndGggPiAwID8gdGhpcy5ub3RSZXNvdXJjZXMgOiB1bmRlZmluZWQsXG4gICAgICBjb25kaXRpb246IHRoaXMuY29uZGl0aW9ucy5sZW5ndGggPiAwID8gdGhpcy5jb25kaXRpb25zIDogdW5kZWZpbmVkLFxuICAgICAgZWZmZWN0OiB0aGlzLmVmZmVjdCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHByaW5jaXBhbCdzIGNvbmRpdGlvbnNcbiAgICpcbiAgICogRm9yIGNvbnZlbmllbmNlLCBwcmluY2lwYWxzIGhhdmUgYmVlbiBtb2RlbGVkIGFzIGJvdGggYSBwcmluY2lwYWxcbiAgICogYW5kIGEgc2V0IG9mIGNvbmRpdGlvbnMuIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gaGF2ZSBhIHNpbmdsZVxuICAgKiBvYmplY3QgcmVwcmVzZW50IGUuZy4gYW4gXCJTTlMgVG9waWNcIiAoU05TIHNlcnZpY2UgcHJpbmNpcGFsICsgYXdzOlNvdXJjQXJuXG4gICAqIGNvbmRpdGlvbikgb3IgYW4gT3JnYW5pemF0aW9uIG1lbWJlciAoKiArIGF3czpPcmdJZCBjb25kaXRpb24pLlxuICAgKlxuICAgKiBIb3dldmVyLCB3aGVuIHVzaW5nIG11bHRpcGxlIHByaW5jaXBhbHMgaW4gdGhlIHNhbWUgcG9saWN5IHN0YXRlbWVudCxcbiAgICogdGhleSBtdXN0IGFsbCBoYXZlIHRoZSBzYW1lIGNvbmRpdGlvbnMgb3IgdGhlIE9SIHNhbWVudGljc1xuICAgKiBpbXBsaWVkIGJ5IGEgbGlzdCBvZiBwcmluY2lwYWxzIGNhbm5vdCBiZSBndWFyYW50ZWVkICh1c2VyIG5lZWRzIHRvXG4gICAqIGFkZCBtdWx0aXBsZSBzdGF0ZW1lbnRzIGluIHRoYXQgY2FzZSkuXG4gICAqL1xuICBwcml2YXRlIGFkZFByaW5jaXBhbENvbmRpdGlvbnMoXG4gICAgLi4uY29uZGl0aW9uczogZGF0YUF3c0lhbVBvbGljeURvY3VtZW50LkRhdGFBd3NJYW1Qb2xpY3lEb2N1bWVudFN0YXRlbWVudENvbmRpdGlvbltdXG4gICkge1xuICAgIC8vIFN0cmluZ2lmeWluZyB0aGUgY29uZGl0aW9ucyBpcyBhbiBlYXN5IHdheSB0byBkbyBkZWVwIGVxdWFsaXR5XG4gICAgY29uc3QgdGhlc2VDb25kaXRpb25zID0gSlNPTi5zdHJpbmdpZnkoY29uZGl0aW9ucyk7XG4gICAgaWYgKHRoaXMucHJpbmNpcGFsQ29uZGl0aW9uc0pzb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRmlyc3QgcHJpbmNpcGFsLCBhbnl0aGluZyBnb2VzXG4gICAgICB0aGlzLnByaW5jaXBhbENvbmRpdGlvbnNKc29uID0gdGhlc2VDb25kaXRpb25zO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5wcmluY2lwYWxDb25kaXRpb25zSnNvbiAhPT0gdGhlc2VDb25kaXRpb25zKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQWxsIHByaW5jaXBhbHMgaW4gYSBQb2xpY3lTdGF0ZW1lbnQgbXVzdCBoYXZlIHRoZSBzYW1lIENvbmRpdGlvbnMgKGdvdCAnJHt0aGlzLnByaW5jaXBhbENvbmRpdGlvbnNKc29ufScgYW5kICcke3RoZXNlQ29uZGl0aW9uc30nKS4gVXNlIG11bHRpcGxlIHN0YXRlbWVudHMgaW5zdGVhZC5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmFkZENvbmRpdGlvbnMoLi4uY29uZGl0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhhdCB0aGUgcG9saWN5IHN0YXRlbWVudCBzYXRpc2ZpZXMgYmFzZSByZXF1aXJlbWVudHMgZm9yIGEgcG9saWN5LlxuICAgKlxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzLCBvciBhbiBlbXB0eSBhcnJheSBpZiB0aGUgc3RhdGVtZW50IGlzIHZhbGlkLlxuICAgKi9cbiAgcHVibGljIHZhbGlkYXRlRm9yQW55UG9saWN5KCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBlcnJvcnMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGlmICh0aGlzLl9hY3Rpb24ubGVuZ3RoID09PSAwICYmIHRoaXMuX25vdEFjdGlvbi5sZW5ndGggPT09IDApIHtcbiAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICBcIkEgUG9saWN5U3RhdGVtZW50IG11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgJ2FjdGlvbicgb3IgJ25vdEFjdGlvbicuXCIsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZXJyb3JzO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoYXQgdGhlIHBvbGljeSBzdGF0ZW1lbnQgc2F0aXNmaWVzIGFsbCByZXF1aXJlbWVudHMgZm9yIGEgcmVzb3VyY2UtYmFzZWQgcG9saWN5LlxuICAgKlxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzLCBvciBhbiBlbXB0eSBhcnJheSBpZiB0aGUgc3RhdGVtZW50IGlzIHZhbGlkLlxuICAgKi9cbiAgcHVibGljIHZhbGlkYXRlRm9yUmVzb3VyY2VQb2xpY3koKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGVycm9ycyA9IHRoaXMudmFsaWRhdGVGb3JBbnlQb2xpY3koKTtcbiAgICBpZiAodGhpcy5fcHJpbmNpcGFscy5sZW5ndGggPT09IDAgJiYgdGhpcy5fbm90UHJpbmNpcGFscy5sZW5ndGggPT09IDApIHtcbiAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICBcIkEgUG9saWN5U3RhdGVtZW50IHVzZWQgaW4gYSByZXNvdXJjZS1iYXNlZCBwb2xpY3kgbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBJQU0gcHJpbmNpcGFsLlwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGVycm9ycztcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGF0IHRoZSBwb2xpY3kgc3RhdGVtZW50IHNhdGlzZmllcyBhbGwgcmVxdWlyZW1lbnRzIGZvciBhbiBpZGVudGl0eS1iYXNlZCBwb2xpY3kuXG4gICAqXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHZhbGlkYXRpb24gZXJyb3IgbWVzc2FnZXMsIG9yIGFuIGVtcHR5IGFycmF5IGlmIHRoZSBzdGF0ZW1lbnQgaXMgdmFsaWQuXG4gICAqL1xuICBwdWJsaWMgdmFsaWRhdGVGb3JJZGVudGl0eVBvbGljeSgpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZXJyb3JzID0gdGhpcy52YWxpZGF0ZUZvckFueVBvbGljeSgpO1xuICAgIGlmICh0aGlzLl9wcmluY2lwYWxzLmxlbmd0aCA+IDAgfHwgdGhpcy5fbm90UHJpbmNpcGFscy5sZW5ndGggPiAwKSB7XG4gICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgXCJBIFBvbGljeVN0YXRlbWVudCB1c2VkIGluIGFuIGlkZW50aXR5LWJhc2VkIHBvbGljeSBjYW5ub3Qgc3BlY2lmeSBhbnkgSUFNIHByaW5jaXBhbHMuXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcmVzb3VyY2UubGVuZ3RoID09PSAwICYmIHRoaXMuX25vdFJlc291cmNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIFwiQSBQb2xpY3lTdGF0ZW1lbnQgdXNlZCBpbiBhbiBpZGVudGl0eS1iYXNlZCBwb2xpY3kgbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSByZXNvdXJjZS5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBlcnJvcnM7XG4gIH1cblxuICAvKipcbiAgICogVGhlIEFjdGlvbnMgYWRkZWQgdG8gdGhpcyBzdGF0ZW1lbnRcbiAgICovXG4gIHB1YmxpYyBnZXQgYWN0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aW9uLmNvcHkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgTm90QWN0aW9ucyBhZGRlZCB0byB0aGlzIHN0YXRlbWVudFxuICAgKi9cbiAgcHVibGljIGdldCBub3RBY3Rpb25zKCkge1xuICAgIHJldHVybiB0aGlzLl9ub3RBY3Rpb24uY29weSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBQcmluY2lwYWxzIGFkZGVkIHRvIHRoaXMgc3RhdGVtZW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IHByaW5jaXBhbHMoKTogSVByaW5jaXBhbFtdIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpbmNpcGFscy5jb3B5KCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIE5vdFByaW5jaXBhbHMgYWRkZWQgdG8gdGhpcyBzdGF0ZW1lbnRcbiAgICovXG4gIHB1YmxpYyBnZXQgbm90UHJpbmNpcGFscygpOiBJUHJpbmNpcGFsW10ge1xuICAgIHJldHVybiB0aGlzLl9ub3RQcmluY2lwYWxzLmNvcHkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgUmVzb3VyY2VzIGFkZGVkIHRvIHRoaXMgc3RhdGVtZW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlc291cmNlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVzb3VyY2UuY29weSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBOb3RSZXNvdXJjZXMgYWRkZWQgdG8gdGhpcyBzdGF0ZW1lbnRcbiAgICovXG4gIHB1YmxpYyBnZXQgbm90UmVzb3VyY2VzKCkge1xuICAgIHJldHVybiB0aGlzLl9ub3RSZXNvdXJjZS5jb3B5KCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNvbmRpdGlvbnMgYWRkZWQgdG8gdGhpcyBzdGF0ZW1lbnRcbiAgICovXG4gIHB1YmxpYyBnZXQgY29uZGl0aW9ucygpOiBDb25kaXRpb25zIHtcbiAgICByZXR1cm4gdG9Db25kaXRpb25zKHRoaXMuX2NvbmRpdGlvbk1hcCk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZSB0aGUgUG9saWN5U3RhdGVtZW50IGltbXV0YWJsZVxuICAgKlxuICAgKiBBZnRlciBjYWxsaW5nIHRoaXMsIGFueSBvZiB0aGUgYGFkZFh4eCgpYCBtZXRob2RzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLlxuICAgKlxuICAgKiBMaWJyYXJpZXMgdGhhdCBsYXppbHkgZ2VuZXJhdGUgc3RhdGVtZW50IGJvZGllcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG9cbiAgICogZmlsbCB0aGUgYWN0dWFsIFBvbGljeVN0YXRlbWVudCBmaWVsZHMuIEJlIGF3YXJlIHRoYXQgdGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZFxuICAgKiBtdWx0aXBsZSB0aW1lcy5cbiAgICovXG4gIHB1YmxpYyBmcmVlemUoKTogUG9saWN5U3RhdGVtZW50IHtcbiAgICB0aGlzLl9mcm96ZW4gPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIFBvbGljeVN0YXRlbWVudCBoYXMgYmVlbiBmcm96ZW5cbiAgICpcbiAgICogVGhlIHN0YXRlbWVudCBvYmplY3QgaXMgZnJvemVuIHdoZW4gYGZyZWV6ZSgpYCBpcyBjYWxsZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGZyb3plbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZnJvemVuO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGltYXRlIHRoZSBzaXplIG9mIHRoaXMgcG9saWN5IHN0YXRlbWVudFxuICAgKlxuICAgKiBCeSBuZWNlc3NpdHksIHRoaXMgd2lsbCBub3QgYmUgYWNjdXJhdGUuIFdlJ2xsIGRvIG91ciBiZXN0IHRvIG92ZXJlc3RpbWF0ZVxuICAgKiBzbyB3ZSB3b24ndCBoYXZlIG5hc3R5IHN1cnByaXNlcy5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2VzdGltYXRlU2l6ZShvcHRpb25zOiBFc3RpbWF0ZVNpemVPcHRpb25zKTogbnVtYmVyIHtcbiAgICBsZXQgcmV0ID0gMDtcblxuICAgIGNvbnN0IHsgYWN0aW9uRXN0aW1hdGUsIGFybkVzdGltYXRlIH0gPSBvcHRpb25zO1xuXG4gICAgcmV0ICs9IGBcIkVmZmVjdFwiOiBcIiR7dGhpcy5lZmZlY3R9XCIsYC5sZW5ndGg7XG5cbiAgICBjb3VudChcIkFjdGlvblwiLCB0aGlzLmFjdGlvbnMsIGFjdGlvbkVzdGltYXRlKTtcbiAgICBjb3VudChcIk5vdEFjdGlvblwiLCB0aGlzLm5vdEFjdGlvbnMsIGFjdGlvbkVzdGltYXRlKTtcbiAgICBjb3VudChcIlJlc291cmNlXCIsIHRoaXMucmVzb3VyY2VzLCBhcm5Fc3RpbWF0ZSk7XG4gICAgY291bnQoXCJOb3RSZXNvdXJjZVwiLCB0aGlzLm5vdFJlc291cmNlcywgYXJuRXN0aW1hdGUpO1xuXG4gICAgcmV0ICs9IHRoaXMucHJpbmNpcGFscy5sZW5ndGggKiBhcm5Fc3RpbWF0ZTtcbiAgICByZXQgKz0gdGhpcy5ub3RQcmluY2lwYWxzLmxlbmd0aCAqIGFybkVzdGltYXRlO1xuXG4gICAgcmV0ICs9IEpTT04uc3RyaW5naWZ5KHRvQ29uZGl0aW9uSnNvbiguLi50aGlzLmNvbmRpdGlvbnMpKS5sZW5ndGg7XG4gICAgcmV0dXJuIHJldDtcblxuICAgIGZ1bmN0aW9uIGNvdW50KGtleTogc3RyaW5nLCB2YWx1ZXM6IHN0cmluZ1tdLCB0b2tlblNpemU6IG51bWJlcikge1xuICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldCArPVxuICAgICAgICAgIGtleS5sZW5ndGggK1xuICAgICAgICAgIDUgLyogcXVvdGVzLCBjb2xvbiwgYnJhY2tldHMgKi8gK1xuICAgICAgICAgIHN1bShcbiAgICAgICAgICAgIHZhbHVlcy5tYXAoXG4gICAgICAgICAgICAgICh2KSA9PlxuICAgICAgICAgICAgICAgIChUb2tlbi5pc1VucmVzb2x2ZWQodikgPyB0b2tlblNpemUgOiB2Lmxlbmd0aCkgK1xuICAgICAgICAgICAgICAgIDMgLyogcXVvdGVzLCBzZXBhcmF0b3IgKi8sXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRocm93IGFuIGV4Y2VwdGlvbiB3aGVuIHRoZSBvYmplY3QgaXMgZnJvemVuXG4gICAqL1xuICBwcml2YXRlIGFzc2VydE5vdEZyb3plbihtZXRob2Q6IHN0cmluZykge1xuICAgIGlmICh0aGlzLl9mcm96ZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYCR7bWV0aG9kfTogZnJlZXplKCkgaGFzIGJlZW4gY2FsbGVkIG9uIHRoaXMgUG9saWN5U3RhdGVtZW50IHByZXZpb3VzbHksIHNvIGl0IGNhbiBubyBsb25nZXIgYmUgbW9kaWZpZWRgLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgRWZmZWN0IGVsZW1lbnQgb2YgYW4gSUFNIHBvbGljeVxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19lZmZlY3QuaHRtbFxuICovXG5leHBvcnQgZW51bSBFZmZlY3Qge1xuICAvKipcbiAgICogQWxsb3dzIGFjY2VzcyB0byBhIHJlc291cmNlIGluIGFuIElBTSBwb2xpY3kgc3RhdGVtZW50LiBCeSBkZWZhdWx0LCBhY2Nlc3MgdG8gcmVzb3VyY2VzIGFyZSBkZW5pZWQuXG4gICAqL1xuICBBTExPVyA9IFwiQWxsb3dcIixcblxuICAvKipcbiAgICogRXhwbGljaXRseSBkZW55IGFjY2VzcyB0byBhIHJlc291cmNlLiBCeSBkZWZhdWx0LCBhbGwgcmVxdWVzdHMgYXJlIGRlbmllZCBpbXBsaWNpdGx5LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZXZhbHVhdGlvbi1sb2dpYy5odG1sXG4gICAqL1xuICBERU5ZID0gXCJEZW55XCIsXG59XG5cbi8qKlxuICogQ29uZGl0aW9uIGZvciB3aGVuIGFuIElBTSBwb2xpY3kgaXMgaW4gZWZmZWN0LiBNYXBzIGZyb20gdGhlIGtleXMgaW4gYSByZXF1ZXN0J3MgY29udGV4dCB0b1xuICogYSBzdHJpbmcgdmFsdWUgb3IgYXJyYXkgb2Ygc3RyaW5nIHZhbHVlcy4gU2VlIHRoZSBDb25kaXRpb25zIGludGVyZmFjZSBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5leHBvcnQgdHlwZSBDb25kaXRpb24gPVxuICBkYXRhQXdzSWFtUG9saWN5RG9jdW1lbnQuRGF0YUF3c0lhbVBvbGljeURvY3VtZW50U3RhdGVtZW50Q29uZGl0aW9uO1xuXG4vKipcbiAqIENvbmRpdGlvbnMgZm9yIHdoZW4gYW4gSUFNIFBvbGljeSBpcyBpbiBlZmZlY3QsIHNwZWNpZmllZCBpbiB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTpcbiAqXG4gKiBgeyBcIk9wZXJhdG9yXCI6IHsgXCJrZXlJblJlcXVlc3RDb250ZXh0XCI6IFwidmFsdWVcIiB9IH1gXG4gKlxuICogVGhlIHZhbHVlIGNhbiBiZSBlaXRoZXIgYSBzaW5nbGUgc3RyaW5nIHZhbHVlIG9yIGFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuXG4gKlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIGluY2x1ZGluZyB3aGljaCBvcGVyYXRvcnMgYXJlIHN1cHBvcnRlZCwgc2VlIFt0aGUgSUFNXG4gKiBkb2N1bWVudGF0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbi5odG1sKS5cbiAqL1xuZXhwb3J0IHR5cGUgQ29uZGl0aW9ucyA9IEFycmF5PENvbmRpdGlvbj47XG4vLyBUT0RPOiBTdXBwb3J0IElSZXNvbHZhYmxlIENvbmRpdGlvbj9cblxuY2xhc3MgSnNvblByaW5jaXBhbCBleHRlbmRzIFByaW5jaXBhbEJhc2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgcG9saWN5RnJhZ21lbnQ6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50O1xuICBwdWJsaWMgcmVhZG9ubHkgcHJpbmNpcGFsczogUHJpbmNpcGFsUHJvcHNbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKGpzb246IGFueSA9IHt9KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnBvbGljeUZyYWdtZW50ID0gUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQuZnJvbUpzb24oanNvbik7XG4gIH1cblxuICBwdWJsaWMgZGVkdXBlU3RyaW5nKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMucG9saWN5RnJhZ21lbnQpO1xuICB9XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgX2VzdGltYXRlU2l6ZVxuICpcbiAqIFRoZXNlIGNhbiBvcHRpb25hbGx5IGNvbWUgZnJvbSBjb250ZXh0LCBidXQgaXQncyB0b28gZXhwZW5zaXZlIHRvIGxvb2tcbiAqIHRoZW0gdXAgZXZlcnkgdGltZSBzbyB3ZSBidW5kbGUgdGhlbSBpbnRvIGEgc3RydWN0IGZpcnN0LlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVzdGltYXRlU2l6ZU9wdGlvbnMge1xuICAvKipcbiAgICogRXN0aW1hdGVkIHNpemUgb2YgYW4gdW5yZXNvbHZlZCBBUk5cbiAgICovXG4gIHJlYWRvbmx5IGFybkVzdGltYXRlOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEVzdGltYXRlZCBzaXplIG9mIGFuIHVucmVzb2x2ZWQgYWN0aW9uXG4gICAqL1xuICByZWFkb25seSBhY3Rpb25Fc3RpbWF0ZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIERlcml2ZSB0aGUgc2l6ZSBlc3RpbWF0aW9uIG9wdGlvbnMgZnJvbSBjb250ZXh0XG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXJpdmVFc3RpbWF0ZVNpemVPcHRpb25zKFxuICBfc2NvcGU6IElDb25zdHJ1Y3QsXG4pOiBFc3RpbWF0ZVNpemVPcHRpb25zIHtcbiAgY29uc3QgYWN0aW9uRXN0aW1hdGUgPSAyMDtcbiAgY29uc3QgYXJuRXN0aW1hdGUgPSBERUZBVUxUX0FSTl9TSVpFX0VTVElNQVRFO1xuICByZXR1cm4geyBhY3Rpb25Fc3RpbWF0ZSwgYXJuRXN0aW1hdGUgfTtcbn1cblxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgYmVoYXZlcyBib3RoIGFzIGEgc2V0IGFuZCBhbiBhcnJheVxuICpcbiAqIFVzZWQgZm9yIHRoZSBlbGVtZW50cyBvZiBhIFBvbGljeVN0YXRlbWVudC4gSW4gcHJhY3RpY2UgdGhleSBiZWhhdmUgYXMgc2V0cyxcbiAqIGJ1dCB3ZSBoYXZlIHRob3VzYW5kcyBvZiBzbmFwc2hvdCB0ZXN0cyBpbiBleGlzdGVuY2UgdGhhdCB3aWxsIHJlbHkgb24gYVxuICogcGFydGljdWxhciBvcmRlciBzbyB3ZSBjYW4ndCBqdXN0IGNoYW5nZSB0aGUgdHlwZSB0byBgU2V0PD5gIHdob2xlc2FsZSB3aXRob3V0XG4gKiBjYXVzaW5nIGEgbG90IG9mIGNodXJuLlxuICovXG5jbGFzcyBPcmRlcmVkU2V0PEE+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXQgPSBuZXcgU2V0PEE+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXJyYXkgPSBuZXcgQXJyYXk8QT4oKTtcblxuICAvKipcbiAgICogQWRkIG5ldyBlbGVtZW50cyB0byB0aGUgc2V0XG4gICAqXG4gICAqIEBwYXJhbSB4cyB0aGUgZWxlbWVudHMgdG8gYmUgYWRkZWRcbiAgICpcbiAgICogQHJldHVybnMgdGhlIGVsZW1lbnRzIGFjdHVhbGx5IGFkZGVkXG4gICAqL1xuICBwdWJsaWMgcHVzaCguLi54czogcmVhZG9ubHkgQVtdKTogQVtdIHtcbiAgICBjb25zdCByZXQgPSBuZXcgQXJyYXk8QT4oKTtcbiAgICBmb3IgKGNvbnN0IHggb2YgeHMpIHtcbiAgICAgIGlmICh0aGlzLnNldC5oYXMoeCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aGlzLnNldC5hZGQoeCk7XG4gICAgICB0aGlzLmFycmF5LnB1c2goeCk7XG4gICAgICByZXQucHVzaCh4KTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLmFycmF5Lmxlbmd0aDtcbiAgfVxuXG4gIHB1YmxpYyBjb3B5KCk6IEFbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmFycmF5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXJlY3QgKHJlYWQtb25seSkgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIGFycmF5XG4gICAqXG4gICAqIChTYXZlcyBhIGNvcHkpXG4gICAqL1xuICBwdWJsaWMgZGlyZWN0KCk6IHJlYWRvbmx5IEFbXSB7XG4gICAgcmV0dXJuIHRoaXMuYXJyYXk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3VtKHhzOiBudW1iZXJbXSkge1xuICByZXR1cm4geHMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG59XG5cbi8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvdjIuMTYwLjAvcGFja2FnZXMvYXdzLWNkay1saWIvYXdzLWlhbS9saWIvcHJpdmF0ZVxuXG4vLyBBbiBJQU0gdmFsdWUgaXMgYSBzdHJpbmcgb3IgYW4gaW50cmluc2ljIHZhbHVlXG5leHBvcnQgdHlwZSBJYW1WYWx1ZSA9XG4gIHwgc3RyaW5nXG4gIHwgUmVjb3JkPHN0cmluZywgYW55PlxuICB8IEFycmF5PHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIGFueT4+O1xuXG5pbnRlcmZhY2UgU3RhdGVtZW50U2NoZW1hIHtcbiAgcmVhZG9ubHkgU2lkPzogc3RyaW5nO1xuICByZWFkb25seSBFZmZlY3Q/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IFByaW5jaXBhbD86IHN0cmluZyB8IHN0cmluZ1tdIHwgUmVjb3JkPHN0cmluZywgSWFtVmFsdWU+O1xuICByZWFkb25seSBOb3RQcmluY2lwYWw/OiBzdHJpbmcgfCBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIElhbVZhbHVlPjtcbiAgcmVhZG9ubHkgUmVzb3VyY2U/OiBJYW1WYWx1ZTtcbiAgcmVhZG9ubHkgTm90UmVzb3VyY2U/OiBJYW1WYWx1ZTtcbiAgcmVhZG9ubHkgQWN0aW9uPzogSWFtVmFsdWU7XG4gIHJlYWRvbmx5IE5vdEFjdGlvbj86IElhbVZhbHVlO1xuICByZWFkb25seSBDb25kaXRpb24/OiB1bmtub3duO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTdGF0ZW1lbnQoczogU3RhdGVtZW50U2NoZW1hKSB7XG4gIHJldHVybiBub1VuZGVmKHtcbiAgICBBY3Rpb246IF9ub3JtKHMuQWN0aW9uLCB7IHVuaXF1ZTogdHJ1ZSB9KSxcbiAgICBOb3RBY3Rpb246IF9ub3JtKHMuTm90QWN0aW9uLCB7IHVuaXF1ZTogdHJ1ZSB9KSxcbiAgICBDb25kaXRpb246IF9ub3JtKHMuQ29uZGl0aW9uKSxcbiAgICBFZmZlY3Q6IF9ub3JtKHMuRWZmZWN0KSxcbiAgICBQcmluY2lwYWw6IF9ub3JtUHJpbmNpcGFsKHMuUHJpbmNpcGFsKSxcbiAgICBOb3RQcmluY2lwYWw6IF9ub3JtUHJpbmNpcGFsKHMuTm90UHJpbmNpcGFsKSxcbiAgICBSZXNvdXJjZTogX25vcm0ocy5SZXNvdXJjZSwgeyB1bmlxdWU6IHRydWUgfSksXG4gICAgTm90UmVzb3VyY2U6IF9ub3JtKHMuTm90UmVzb3VyY2UsIHsgdW5pcXVlOiB0cnVlIH0pLFxuICAgIFNpZDogX25vcm0ocy5TaWQpLFxuICB9KTtcblxuICBmdW5jdGlvbiBfbm9ybShcbiAgICB2YWx1ZXM6IGFueSxcbiAgICB7IHVuaXF1ZSA9IGZhbHNlIH06IHsgdW5pcXVlOiBib29sZWFuIH0gPSB7IHVuaXF1ZTogZmFsc2UgfSxcbiAgKSB7XG4gICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQodmFsdWVzKSkge1xuICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgICBpZiAoIXZhbHVlcyB8fCB2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZXNbMF07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1bmlxdWUgPyBBcnJheS5mcm9tKG5ldyBTZXQodmFsdWVzKSkgOiB2YWx1ZXM7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlcyAmJiB0eXBlb2YgdmFsdWVzID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBpZiAoT2JqZWN0LmtleXModmFsdWVzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG5cbiAgZnVuY3Rpb24gX25vcm1QcmluY2lwYWwoXG4gICAgcHJpbmNpcGFsPzogc3RyaW5nIHwgc3RyaW5nW10gfCB7IFtrZXk6IHN0cmluZ106IGFueSB9LFxuICApIHtcbiAgICBpZiAoIXByaW5jaXBhbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwcmluY2lwYWwgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBwcmluY2lwYWw7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHByaW5jaXBhbCkgfHwgdHlwZW9mIHByaW5jaXBhbCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByaW5jaXBhbCk7XG4gICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdDogYW55ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgY29uc3Qgbm9ybVZhbCA9IF9ub3JtKHByaW5jaXBhbFtrZXldKTtcbiAgICAgIGlmIChub3JtVmFsKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gbm9ybVZhbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBub1VuZGVmKHg6IGFueSk6IGFueSB7XG4gIGNvbnN0IHJldDogYW55ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHgpKSB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldFtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGVuc3VyZUFycmF5T3JVbmRlZmluZWQoZmllbGQ6IGFueSkge1xuICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKHR5cGVvZiBmaWVsZCAhPT0gXCJzdHJpbmdcIiAmJiAhQXJyYXkuaXNBcnJheShmaWVsZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaWVsZHMgbXVzdCBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5nc1wiKTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZCkgJiYgISFmaWVsZC5maW5kKChmOiBhbnkpID0+IHR5cGVvZiBmICE9PSBcInN0cmluZ1wiKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkZpZWxkcyBtdXN0IGJlIGVpdGhlciBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzXCIpO1xuICB9XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGZpZWxkKSA/IGZpZWxkIDogW2ZpZWxkXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nT3JBcnJheU9mU3RyaW5ncyhcbiAgdmFsdWU6IHVua25vd24sXG4pOiB2YWx1ZSBpcyBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgY29uZGl0aW9uIEpTT04gb2JqZWN0IHRvIGEgbGlzdCBvZiBUZXJyYWZvcm0gQVdTIFBvbGljeSBTdGF0ZW1lbnQgQ29uZGl0aW9uc1xuICpcbiAqIEpTT04gb2JqZWN0IGlzIHNwZWNpZmllZCBpbiB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTpcbiAqXG4gKiBgeyBcIk9wZXJhdG9yXCI6IHsgXCJrZXlJblJlcXVlc3RDb250ZXh0XCI6IFwidmFsdWVcIiB9IH1gXG4gKlxuICogVGhlIHZhbHVlIGNhbiBiZSBlaXRoZXIgYSBzaW5nbGUgc3RyaW5nIHZhbHVlIG9yIGFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuXG4gKlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIGluY2x1ZGluZyB3aGljaCBvcGVyYXRvcnMgYXJlIHN1cHBvcnRlZCwgc2VlIFt0aGUgSUFNXG4gKiBkb2N1bWVudGF0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbi5odG1sKS5cbiAqIEBwYXJhbSBjb25kaXRpb25Kc29uIFRoZSBjb25kaXRpb24gSlNPTiBvYmplY3RcbiAqIEByZXR1cm5zIFRoZSBsaXN0IG9mIFRlcnJhZm9ybSBjb25kaXRpb24gb2JqZWN0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbUNvbmRpdGlvbkpzb24oXG4gIGNvbmRpdGlvbkpzb246IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLFxuKTogQ29uZGl0aW9ucyB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29uZGl0aW9uSnNvbikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PENvbmRpdGlvbj4oKTtcblxuICBmb3IgKGNvbnN0IFt0ZXN0LCB2YXJpYWJsZXNdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmRpdGlvbkpzb24pKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFyaWFibGVzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBldmVudCBwYXR0ZXJuIGZpZWxkIHsgJHt0ZXN0fTogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICB2YXJpYWJsZXMsXG4gICAgICAgICl9IH0uIEFsbCBmaWVsZHMgbXVzdCBiZSBvYmplY3RzYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW3ZhcmlhYmxlLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFyaWFibGVzIGFzIGFueSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgdGVzdCxcbiAgICAgICAgdmFyaWFibGUsXG4gICAgICAgIHZhbHVlczogQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIGZsYXR0ZW4gQ29uZGl0aW9ucyBtYXBwZWQgYnkgdGVzdCBhbmQgdmFyaWFibGUgdG8gYW4gYXJyYXkgb2YgVGVycmFmb3JtIEFXUyBQb2xpY3kgU3RhdGVtZW50IENvbmRpdGlvbnNcbiAqIEBwYXJhbSBjb25kaXRpb25NYXAgVGhlIGNvbmRpdGlvbiBtYXBcbiAqIEByZXR1cm5zIFRoZSBsaXN0IG9mIFRlcnJhZm9ybSBjb25kaXRpb24gb2JqZWN0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Db25kaXRpb25zKGNvbmRpdGlvbk1hcDogQ29uZGl0aW9uTWFwKTogQ29uZGl0aW9ucyB7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKGNvbmRpdGlvbk1hcCkuZmxhdE1hcCgodmFyaWFibGVzKSA9PlxuICAgIE9iamVjdC52YWx1ZXModmFyaWFibGVzKSxcbiAgKTtcbiAgLy8gY29uc3QgY29uZGl0aW9uczogQ29uZGl0aW9ucyA9IFtdO1xuICAvLyBmb3IgKGNvbnN0IHZhcmlhYmxlc01hcCBvZiBPYmplY3QudmFsdWVzKGNvbmRpdGlvbk1hcCkpIHtcbiAgLy8gICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBPYmplY3QudmFsdWVzKHZhcmlhYmxlc01hcCkpIHtcbiAgLy8gICAgIGNvbmRpdGlvbnMucHVzaChjb25kaXRpb24pO1xuICAvLyAgIH1cbiAgLy8gfVxuICAvLyByZXR1cm4gY29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgbGlzdCBvZiBUZXJyYWZvcm0gQVdTIFBvbGljeSBTdGF0ZW1lbnQgY29uZGl0aW9uIG9iamVjdHMgYmFjayB0byBhIGNvbmRpdGlvbiBKU09OIG9iamVjdFxuICogQHBhcmFtIGNvbmRpdGlvbnMgVGhlIGxpc3Qgb2YgVGVycmFmb3JtIGNvbmRpdGlvbiBvYmplY3RzXG4gKiBAcmV0dXJucyBUaGUgY29uZGl0aW9uIEpTT04gb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0NvbmRpdGlvbkpzb24oXG4gIC4uLmNvbmRpdGlvbnM6IENvbmRpdGlvbnNcbik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICBjb25zdCBjb25kaXRpb25Kc29uOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cbiAgZm9yIChjb25zdCBjb25kaXRpb24gb2YgY29uZGl0aW9ucykge1xuICAgIGNvbnN0IHsgdGVzdCwgdmFyaWFibGUsIHZhbHVlcyB9ID0gY29uZGl0aW9uO1xuXG4gICAgaWYgKCFjb25kaXRpb25Kc29uW3Rlc3RdKSB7XG4gICAgICBjb25kaXRpb25Kc29uW3Rlc3RdID0ge307XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbmRpdGlvbkpzb25bdGVzdF1bdmFyaWFibGVdID0gdmFsdWVzWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25kaXRpb25Kc29uW3Rlc3RdW3ZhcmlhYmxlXSA9IHZhbHVlcztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uZGl0aW9uSnNvbjtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGF0IHRoZSBnaXZlbiB2YWx1ZSBpcyBhIHZhbGlkIEpzb24gQ29uZGl0aW9uIG9iamVjdFxuICpcbiAqIEFXUyBDREsgSUFNIGxpYnJhcnkgcmVsaWVzIG9uIGJlaW5nIGFibGUgdG8gcGFzcyBpbiBhIGBKc29uYCBpbnN0YW5jZSBmb3JcbiAqIGEgYENvbmRpdGlvbmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNvbmRpdGlvbk9iamVjdChcbiAgeDogdW5rbm93bixcbik6IGFzc2VydHMgeCBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGlmICgheCB8fCB0eXBlb2YgeCAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJBIENvbmRpdGlvbiBzaG91bGQgYmUgcmVwcmVzZW50ZWQgYXMgYSBtYXAgb2Ygb3BlcmF0b3IgdG8gdmFsdWVcIixcbiAgICApO1xuICB9XG59XG4iXX0=
|
package/lib/aws/iam/policy.js
CHANGED
|
@@ -165,7 +165,7 @@ class Policy extends aws_construct_1.AwsConstructBase {
|
|
|
165
165
|
}
|
|
166
166
|
exports.Policy = Policy;
|
|
167
167
|
_a = JSII_RTTI_SYMBOL_1;
|
|
168
|
-
Policy[_a] = { fqn: "terraconstructs.aws.iam.Policy", version: "0.0.
|
|
168
|
+
Policy[_a] = { fqn: "terraconstructs.aws.iam.Policy", version: "0.0.12" };
|
|
169
169
|
class PolicyGrantPrincipal {
|
|
170
170
|
constructor(_policy) {
|
|
171
171
|
this._policy = _policy;
|