terraconstructs 0.0.8
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/.envrc +5 -0
- package/.jsii +79780 -0
- package/.mise.toml +8 -0
- package/.nvmrc +1 -0
- package/.terraform-version +1 -0
- package/.terraform.d/plugin-cache/.gitignore +5 -0
- package/LICENSE +674 -0
- package/NOTICE.txt +12 -0
- package/README.md +42 -0
- package/bun.lockb +0 -0
- package/go.mod +158 -0
- package/go.sum +1206 -0
- package/lib/aws/arn.d.ts +187 -0
- package/lib/aws/arn.js +383 -0
- package/lib/aws/aws-construct.d.ts +76 -0
- package/lib/aws/aws-construct.js +38 -0
- package/lib/aws/aws-stack.d.ts +201 -0
- package/lib/aws/aws-stack.js +303 -0
- package/lib/aws/cloudwatch/actions/ec2.d.ts +35 -0
- package/lib/aws/cloudwatch/actions/ec2.js +48 -0
- package/lib/aws/cloudwatch/actions/index.d.ts +2 -0
- package/lib/aws/cloudwatch/actions/index.js +24 -0
- package/lib/aws/cloudwatch/actions/lambda.d.ts +16 -0
- package/lib/aws/cloudwatch/actions/lambda.js +48 -0
- package/lib/aws/cloudwatch/alarm-action.d.ts +23 -0
- package/lib/aws/cloudwatch/alarm-action.js +4 -0
- package/lib/aws/cloudwatch/alarm-base.d.ts +84 -0
- package/lib/aws/cloudwatch/alarm-base.js +64 -0
- package/lib/aws/cloudwatch/alarm-rule.d.ts +61 -0
- package/lib/aws/cloudwatch/alarm-rule.js +116 -0
- package/lib/aws/cloudwatch/alarm-status-widget.d.ts +77 -0
- package/lib/aws/cloudwatch/alarm-status-widget.js +62 -0
- package/lib/aws/cloudwatch/alarm.d.ts +158 -0
- package/lib/aws/cloudwatch/alarm.js +410 -0
- package/lib/aws/cloudwatch/composite-alarm.d.ts +88 -0
- package/lib/aws/cloudwatch/composite-alarm.js +98 -0
- package/lib/aws/cloudwatch/dashboard.d.ts +137 -0
- package/lib/aws/cloudwatch/dashboard.js +141 -0
- package/lib/aws/cloudwatch/data-protection-policy.d.ts +184 -0
- package/lib/aws/cloudwatch/data-protection-policy.js +246 -0
- package/lib/aws/cloudwatch/graph.d.ts +792 -0
- package/lib/aws/cloudwatch/graph.js +537 -0
- package/lib/aws/cloudwatch/index.d.ts +26 -0
- package/lib/aws/cloudwatch/index.js +49 -0
- package/lib/aws/cloudwatch/layout.d.ts +89 -0
- package/lib/aws/cloudwatch/layout.js +147 -0
- package/lib/aws/cloudwatch/log-destinations/index.d.ts +2 -0
- package/lib/aws/cloudwatch/log-destinations/index.js +20 -0
- package/lib/aws/cloudwatch/log-destinations/kinesis.d.ts +29 -0
- package/lib/aws/cloudwatch/log-destinations/kinesis.js +52 -0
- package/lib/aws/cloudwatch/log-destinations/lambda.d.ts +22 -0
- package/lib/aws/cloudwatch/log-destinations/lambda.js +46 -0
- package/lib/aws/cloudwatch/log-group.d.ts +453 -0
- package/lib/aws/cloudwatch/log-group.js +350 -0
- package/lib/aws/cloudwatch/log-query.d.ts +91 -0
- package/lib/aws/cloudwatch/log-query.js +85 -0
- package/lib/aws/cloudwatch/log-stream.d.ts +57 -0
- package/lib/aws/cloudwatch/log-stream.js +57 -0
- package/lib/aws/cloudwatch/metric-filter.d.ts +30 -0
- package/lib/aws/cloudwatch/metric-filter.js +69 -0
- package/lib/aws/cloudwatch/metric-types.d.ts +407 -0
- package/lib/aws/cloudwatch/metric-types.js +151 -0
- package/lib/aws/cloudwatch/metric.d.ts +492 -0
- package/lib/aws/cloudwatch/metric.js +493 -0
- package/lib/aws/cloudwatch/pattern.d.ts +195 -0
- package/lib/aws/cloudwatch/pattern.js +412 -0
- package/lib/aws/cloudwatch/policy.d.ts +43 -0
- package/lib/aws/cloudwatch/policy.js +50 -0
- package/lib/aws/cloudwatch/private/drop-empty-object-at-the-end-of-an-array-token.d.ts +14 -0
- package/lib/aws/cloudwatch/private/drop-empty-object-at-the-end-of-an-array-token.js +37 -0
- package/lib/aws/cloudwatch/private/env-tokens.d.ts +8 -0
- package/lib/aws/cloudwatch/private/env-tokens.js +48 -0
- package/lib/aws/cloudwatch/private/metric-util.d.ts +60 -0
- package/lib/aws/cloudwatch/private/metric-util.js +132 -0
- package/lib/aws/cloudwatch/private/object.d.ts +1 -0
- package/lib/aws/cloudwatch/private/object.js +18 -0
- package/lib/aws/cloudwatch/private/rendering.d.ts +60 -0
- package/lib/aws/cloudwatch/private/rendering.js +181 -0
- package/lib/aws/cloudwatch/private/statistic.d.ts +51 -0
- package/lib/aws/cloudwatch/private/statistic.js +176 -0
- package/lib/aws/cloudwatch/query-definition.d.ts +150 -0
- package/lib/aws/cloudwatch/query-definition.js +114 -0
- package/lib/aws/cloudwatch/stats.d.ts +150 -0
- package/lib/aws/cloudwatch/stats.js +207 -0
- package/lib/aws/cloudwatch/subscription-filter.d.ts +75 -0
- package/lib/aws/cloudwatch/subscription-filter.js +51 -0
- package/lib/aws/cloudwatch/text.d.ts +52 -0
- package/lib/aws/cloudwatch/text.js +53 -0
- package/lib/aws/cloudwatch/variable.d.ts +156 -0
- package/lib/aws/cloudwatch/variable.js +156 -0
- package/lib/aws/cloudwatch/widget.d.ts +62 -0
- package/lib/aws/cloudwatch/widget.js +45 -0
- package/lib/aws/compute/activity.d.ts +81 -0
- package/lib/aws/compute/activity.js +132 -0
- package/lib/aws/compute/architecture.d.ts +33 -0
- package/lib/aws/compute/architecture.js +42 -0
- package/lib/aws/compute/chain.d.ts +52 -0
- package/lib/aws/compute/chain.js +68 -0
- package/lib/aws/compute/condition.d.ts +202 -0
- package/lib/aws/compute/condition.js +409 -0
- package/lib/aws/compute/event-invoke-config.d.ts +74 -0
- package/lib/aws/compute/event-invoke-config.js +63 -0
- package/lib/aws/compute/event-source-filter.d.ts +64 -0
- package/lib/aws/compute/event-source-filter.js +86 -0
- package/lib/aws/compute/event-source-mapping.d.ts +310 -0
- package/lib/aws/compute/event-source-mapping.js +267 -0
- package/lib/aws/compute/event-sources/index.d.ts +4 -0
- package/lib/aws/compute/event-sources/index.js +28 -0
- package/lib/aws/compute/event-sources/s3-onfailure-destination.d.ts +13 -0
- package/lib/aws/compute/event-sources/s3-onfailure-destination.js +26 -0
- package/lib/aws/compute/event-sources/s3.d.ts +24 -0
- package/lib/aws/compute/event-sources/s3.js +25 -0
- package/lib/aws/compute/event-sources/sqs-dlq.d.ts +13 -0
- package/lib/aws/compute/event-sources/sqs-dlq.js +26 -0
- package/lib/aws/compute/event-sources/sqs.d.ts +75 -0
- package/lib/aws/compute/event-sources/sqs.js +84 -0
- package/lib/aws/compute/fields.d.ts +367 -0
- package/lib/aws/compute/fields.js +546 -0
- package/lib/aws/compute/function-alias.d.ts +148 -0
- package/lib/aws/compute/function-alias.js +176 -0
- package/lib/aws/compute/function-base.d.ts +314 -0
- package/lib/aws/compute/function-base.js +421 -0
- package/lib/aws/compute/function-destination.d.ts +42 -0
- package/lib/aws/compute/function-destination.js +18 -0
- package/lib/aws/compute/function-destinations/event-bridge.d.ts +19 -0
- package/lib/aws/compute/function-destinations/event-bridge.js +46 -0
- package/lib/aws/compute/function-destinations/function.d.ts +34 -0
- package/lib/aws/compute/function-destinations/function.js +55 -0
- package/lib/aws/compute/function-destinations/index.d.ts +3 -0
- package/lib/aws/compute/function-destinations/index.js +22 -0
- package/lib/aws/compute/function-destinations/sqs.d.ts +14 -0
- package/lib/aws/compute/function-destinations/sqs.js +27 -0
- package/lib/aws/compute/function-nodejs.d.ts +55 -0
- package/lib/aws/compute/function-nodejs.js +70 -0
- package/lib/aws/compute/function-permission.d.ts +83 -0
- package/lib/aws/compute/function-permission.js +3 -0
- package/lib/aws/compute/function-url.d.ts +210 -0
- package/lib/aws/compute/function-url.js +148 -0
- package/lib/aws/compute/function-vpc-config.generated.d.ts +36 -0
- package/lib/aws/compute/function-vpc-config.generated.js +3 -0
- package/lib/aws/compute/function.d.ts +492 -0
- package/lib/aws/compute/function.js +692 -0
- package/lib/aws/compute/index.d.ts +42 -0
- package/lib/aws/compute/index.js +64 -0
- package/lib/aws/compute/private/intrinstics.d.ts +86 -0
- package/lib/aws/compute/private/intrinstics.js +220 -0
- package/lib/aws/compute/private/json-path.d.ts +57 -0
- package/lib/aws/compute/private/json-path.js +351 -0
- package/lib/aws/compute/private/util.d.ts +1 -0
- package/lib/aws/compute/private/util.js +38 -0
- package/lib/aws/compute/state-graph.d.ts +100 -0
- package/lib/aws/compute/state-graph.js +177 -0
- package/lib/aws/compute/state-machine-fragment.d.ts +61 -0
- package/lib/aws/compute/state-machine-fragment.js +56 -0
- package/lib/aws/compute/state-machine.d.ts +323 -0
- package/lib/aws/compute/state-machine.js +392 -0
- package/lib/aws/compute/states/choice.d.ts +94 -0
- package/lib/aws/compute/states/choice.js +81 -0
- package/lib/aws/compute/states/custom-state.d.ts +55 -0
- package/lib/aws/compute/states/custom-state.js +114 -0
- package/lib/aws/compute/states/distributed-map/item-batcher.d.ts +64 -0
- package/lib/aws/compute/states/distributed-map/item-batcher.js +58 -0
- package/lib/aws/compute/states/distributed-map/item-reader.d.ts +256 -0
- package/lib/aws/compute/states/distributed-map/item-reader.js +253 -0
- package/lib/aws/compute/states/distributed-map/result-writer.d.ts +41 -0
- package/lib/aws/compute/states/distributed-map/result-writer.js +66 -0
- package/lib/aws/compute/states/distributed-map.d.ts +153 -0
- package/lib/aws/compute/states/distributed-map.js +207 -0
- package/lib/aws/compute/states/fail.d.ts +74 -0
- package/lib/aws/compute/states/fail.js +83 -0
- package/lib/aws/compute/states/map-base.d.ts +145 -0
- package/lib/aws/compute/states/map-base.js +109 -0
- package/lib/aws/compute/states/map.d.ts +76 -0
- package/lib/aws/compute/states/map.js +110 -0
- package/lib/aws/compute/states/parallel.d.ts +113 -0
- package/lib/aws/compute/states/parallel.js +100 -0
- package/lib/aws/compute/states/pass.d.ts +122 -0
- package/lib/aws/compute/states/pass.js +99 -0
- package/lib/aws/compute/states/private/state-type.d.ts +13 -0
- package/lib/aws/compute/states/private/state-type.js +19 -0
- package/lib/aws/compute/states/state.d.ts +276 -0
- package/lib/aws/compute/states/state.js +482 -0
- package/lib/aws/compute/states/succeed.d.ts +51 -0
- package/lib/aws/compute/states/succeed.js +32 -0
- package/lib/aws/compute/states/task-base.d.ts +225 -0
- package/lib/aws/compute/states/task-base.js +160 -0
- package/lib/aws/compute/states/task.d.ts +127 -0
- package/lib/aws/compute/states/task.js +92 -0
- package/lib/aws/compute/states/wait.d.ts +78 -0
- package/lib/aws/compute/states/wait.js +90 -0
- package/lib/aws/compute/step-functions-task.d.ts +78 -0
- package/lib/aws/compute/step-functions-task.js +27 -0
- package/lib/aws/compute/task-credentials.d.ts +45 -0
- package/lib/aws/compute/task-credentials.js +52 -0
- package/lib/aws/compute/task-input.d.ts +86 -0
- package/lib/aws/compute/task-input.js +107 -0
- package/lib/aws/compute/tasks/aws-sdk/call-aws-service.d.ts +73 -0
- package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +69 -0
- package/lib/aws/compute/tasks/eventbridge/put-events.d.ts +74 -0
- package/lib/aws/compute/tasks/eventbridge/put-events.js +94 -0
- package/lib/aws/compute/tasks/http/invoke.d.ts +104 -0
- package/lib/aws/compute/tasks/http/invoke.js +117 -0
- package/lib/aws/compute/tasks/index.d.ts +7 -0
- package/lib/aws/compute/tasks/index.js +42 -0
- package/lib/aws/compute/tasks/lambda/invoke.d.ts +106 -0
- package/lib/aws/compute/tasks/lambda/invoke.js +125 -0
- package/lib/aws/compute/tasks/private/task-utils.d.ts +8 -0
- package/lib/aws/compute/tasks/private/task-utils.js +36 -0
- package/lib/aws/compute/tasks/resource-arn-suffix.d.ts +3 -0
- package/lib/aws/compute/tasks/resource-arn-suffix.js +25 -0
- package/lib/aws/compute/tasks/sqs/send-message.d.ts +62 -0
- package/lib/aws/compute/tasks/sqs/send-message.js +70 -0
- package/lib/aws/compute/tasks/stepfunctions/invoke-activity.d.ts +36 -0
- package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +45 -0
- package/lib/aws/compute/tasks/stepfunctions/start-execution.d.ts +63 -0
- package/lib/aws/compute/tasks/stepfunctions/start-execution.js +123 -0
- package/lib/aws/compute/types.d.ts +214 -0
- package/lib/aws/compute/types.js +103 -0
- package/lib/aws/compute/util.d.ts +12 -0
- package/lib/aws/compute/util.js +29 -0
- package/lib/aws/edge/certificate.d.ts +144 -0
- package/lib/aws/edge/certificate.js +191 -0
- package/lib/aws/edge/distribution.d.ts +505 -0
- package/lib/aws/edge/distribution.js +444 -0
- package/lib/aws/edge/dns-alias-record-targets.d.ts +29 -0
- package/lib/aws/edge/dns-alias-record-targets.js +46 -0
- package/lib/aws/edge/dns-record.d.ts +536 -0
- package/lib/aws/edge/dns-record.js +532 -0
- package/lib/aws/edge/dns-zone.d.ts +169 -0
- package/lib/aws/edge/dns-zone.js +149 -0
- package/lib/aws/edge/function.d.ts +185 -0
- package/lib/aws/edge/function.js +141 -0
- package/lib/aws/edge/index.d.ts +8 -0
- package/lib/aws/edge/index.js +25 -0
- package/lib/aws/edge/key-value-store.d.ts +162 -0
- package/lib/aws/edge/key-value-store.js +163 -0
- package/lib/aws/edge/origin.d.ts +160 -0
- package/lib/aws/edge/origin.js +245 -0
- package/lib/aws/encryption/alias.d.ts +137 -0
- package/lib/aws/encryption/alias.js +216 -0
- package/lib/aws/encryption/index.d.ts +4 -0
- package/lib/aws/encryption/index.js +21 -0
- package/lib/aws/encryption/key-lookup.d.ts +11 -0
- package/lib/aws/encryption/key-lookup.js +4 -0
- package/lib/aws/encryption/key.d.ts +461 -0
- package/lib/aws/encryption/key.js +586 -0
- package/lib/aws/encryption/private/perms.d.ts +5 -0
- package/lib/aws/encryption/private/perms.js +30 -0
- package/lib/aws/encryption/via-service-principal.d.ts +11 -0
- package/lib/aws/encryption/via-service-principal.js +39 -0
- package/lib/aws/iam/grant.d.ts +221 -0
- package/lib/aws/iam/grant.js +239 -0
- package/lib/aws/iam/identity-base.d.ts +20 -0
- package/lib/aws/iam/identity-base.js +3 -0
- package/lib/aws/iam/index.d.ts +16 -0
- package/lib/aws/iam/index.js +34 -0
- package/lib/aws/iam/managed-policy.d.ts +227 -0
- package/lib/aws/iam/managed-policy.js +237 -0
- package/lib/aws/iam/oidc-provider.d.ts +120 -0
- package/lib/aws/iam/oidc-provider.js +82 -0
- package/lib/aws/iam/policy-document-config.generated.d.ts +78 -0
- package/lib/aws/iam/policy-document-config.generated.js +3 -0
- package/lib/aws/iam/policy-document.d.ts +150 -0
- package/lib/aws/iam/policy-document.js +172 -0
- package/lib/aws/iam/policy-statement-props.generated.d.ts +55 -0
- package/lib/aws/iam/policy-statement-props.generated.js +3 -0
- package/lib/aws/iam/policy-statement.d.ts +451 -0
- package/lib/aws/iam/policy-statement.js +947 -0
- package/lib/aws/iam/policy.d.ts +122 -0
- package/lib/aws/iam/policy.js +192 -0
- package/lib/aws/iam/principals.d.ts +668 -0
- package/lib/aws/iam/principals.js +1032 -0
- package/lib/aws/iam/private/adapter.d.ts +21 -0
- package/lib/aws/iam/private/adapter.js +51 -0
- package/lib/aws/iam/private/assume-role-policy.d.ts +8 -0
- package/lib/aws/iam/private/assume-role-policy.js +27 -0
- package/lib/aws/iam/private/comparable-principal.d.ts +6 -0
- package/lib/aws/iam/private/comparable-principal.js +20 -0
- package/lib/aws/iam/private/immutable-role.d.ts +43 -0
- package/lib/aws/iam/private/immutable-role.js +76 -0
- package/lib/aws/iam/private/imported-role.d.ts +49 -0
- package/lib/aws/iam/private/imported-role.js +103 -0
- package/lib/aws/iam/private/merge-statements.d.ts +44 -0
- package/lib/aws/iam/private/merge-statements.js +214 -0
- package/lib/aws/iam/private/postprocess-policy-document.d.ts +15 -0
- package/lib/aws/iam/private/postprocess-policy-document.js +102 -0
- package/lib/aws/iam/private/util.d.ts +37 -0
- package/lib/aws/iam/private/util.js +87 -0
- package/lib/aws/iam/role.d.ts +425 -0
- package/lib/aws/iam/role.js +407 -0
- package/lib/aws/iam/saml-provider.d.ts +79 -0
- package/lib/aws/iam/saml-provider.js +79 -0
- package/lib/aws/iam/unknown-principal.d.ts +32 -0
- package/lib/aws/iam/unknown-principal.js +45 -0
- package/lib/aws/iam/utils.d.ts +12 -0
- package/lib/aws/iam/utils.js +41 -0
- package/lib/aws/index.d.ts +13 -0
- package/lib/aws/index.js +34 -0
- package/lib/aws/log-retention.d.ts +97 -0
- package/lib/aws/log-retention.js +103 -0
- package/lib/aws/network/index.d.ts +4 -0
- package/lib/aws/network/index.js +21 -0
- package/lib/aws/network/network.d.ts +77 -0
- package/lib/aws/network/network.js +3 -0
- package/lib/aws/network/simple-ipv4-vpc.d.ts +84 -0
- package/lib/aws/network/simple-ipv4-vpc.js +236 -0
- package/lib/aws/network/subnet-group.d.ts +42 -0
- package/lib/aws/network/subnet-group.js +72 -0
- package/lib/aws/network/subnet.d.ts +95 -0
- package/lib/aws/network/subnet.js +123 -0
- package/lib/aws/notify/archive.d.ts +77 -0
- package/lib/aws/notify/archive.js +62 -0
- package/lib/aws/notify/connection.d.ts +276 -0
- package/lib/aws/notify/connection.js +261 -0
- package/lib/aws/notify/event-bus.d.ts +298 -0
- package/lib/aws/notify/event-bus.js +326 -0
- package/lib/aws/notify/event-pattern.d.ts +220 -0
- package/lib/aws/notify/event-pattern.js +197 -0
- package/lib/aws/notify/index.d.ts +15 -0
- package/lib/aws/notify/index.js +35 -0
- package/lib/aws/notify/input.d.ts +126 -0
- package/lib/aws/notify/input.js +282 -0
- package/lib/aws/notify/kinesis-canned-metrics.generated.d.ts +68 -0
- package/lib/aws/notify/kinesis-canned-metrics.generated.js +103 -0
- package/lib/aws/notify/kinesis-fixed-canned-metrics.d.ts +195 -0
- package/lib/aws/notify/kinesis-fixed-canned-metrics.js +155 -0
- package/lib/aws/notify/kinesis-stream.d.ts +705 -0
- package/lib/aws/notify/kinesis-stream.js +541 -0
- package/lib/aws/notify/on-event-options.d.ts +54 -0
- package/lib/aws/notify/on-event-options.js +3 -0
- package/lib/aws/notify/queue-config.generated.d.ts +85 -0
- package/lib/aws/notify/queue-config.generated.js +3 -0
- package/lib/aws/notify/queue-policy.d.ts +35 -0
- package/lib/aws/notify/queue-policy.js +39 -0
- package/lib/aws/notify/queue.d.ts +355 -0
- package/lib/aws/notify/queue.js +305 -0
- package/lib/aws/notify/resource-policy.d.ts +41 -0
- package/lib/aws/notify/resource-policy.js +43 -0
- package/lib/aws/notify/rule.d.ts +153 -0
- package/lib/aws/notify/rule.js +227 -0
- package/lib/aws/notify/schedule.d.ts +83 -0
- package/lib/aws/notify/schedule.js +116 -0
- package/lib/aws/notify/target.d.ts +102 -0
- package/lib/aws/notify/target.js +3 -0
- package/lib/aws/notify/targets/event-bus.d.ts +39 -0
- package/lib/aws/notify/targets/event-bus.js +40 -0
- package/lib/aws/notify/targets/function.d.ts +31 -0
- package/lib/aws/notify/targets/function.js +36 -0
- package/lib/aws/notify/targets/index.d.ts +6 -0
- package/lib/aws/notify/targets/index.js +37 -0
- package/lib/aws/notify/targets/log-group.d.ts +89 -0
- package/lib/aws/notify/targets/log-group.js +110 -0
- package/lib/aws/notify/targets/sqs.d.ts +45 -0
- package/lib/aws/notify/targets/sqs.js +73 -0
- package/lib/aws/notify/targets/state-machine.d.ts +36 -0
- package/lib/aws/notify/targets/state-machine.js +39 -0
- package/lib/aws/notify/targets/util.d.ts +71 -0
- package/lib/aws/notify/targets/util.js +130 -0
- package/lib/aws/notify/util.d.ts +13 -0
- package/lib/aws/notify/util.js +69 -0
- package/lib/aws/provider-config.generated.d.ts +220 -0
- package/lib/aws/provider-config.generated.js +3 -0
- package/lib/aws/storage/bucket-destination.d.ts +41 -0
- package/lib/aws/storage/bucket-destination.js +13 -0
- package/lib/aws/storage/bucket-notifications.d.ts +58 -0
- package/lib/aws/storage/bucket-notifications.js +169 -0
- package/lib/aws/storage/bucket-perms.d.ts +9 -0
- package/lib/aws/storage/bucket-perms.js +33 -0
- package/lib/aws/storage/bucket-policy.d.ts +51 -0
- package/lib/aws/storage/bucket-policy.js +53 -0
- package/lib/aws/storage/bucket-source.d.ts +41 -0
- package/lib/aws/storage/bucket-source.js +79 -0
- package/lib/aws/storage/bucket.d.ts +941 -0
- package/lib/aws/storage/bucket.js +869 -0
- package/lib/aws/storage/cors-config.generated.d.ts +57 -0
- package/lib/aws/storage/cors-config.generated.js +3 -0
- package/lib/aws/storage/cors-rule-config.generated.d.ts +38 -0
- package/lib/aws/storage/cors-rule-config.generated.js +3 -0
- package/lib/aws/storage/index.d.ts +12 -0
- package/lib/aws/storage/index.js +31 -0
- package/lib/aws/storage/lifecycle-config.generated.d.ts +55 -0
- package/lib/aws/storage/lifecycle-config.generated.js +3 -0
- package/lib/aws/storage/notification-targets/function.d.ts +11 -0
- package/lib/aws/storage/notification-targets/function.js +48 -0
- package/lib/aws/storage/notification-targets/index.d.ts +2 -0
- package/lib/aws/storage/notification-targets/index.js +21 -0
- package/lib/aws/storage/notification-targets/queue.d.ts +15 -0
- package/lib/aws/storage/notification-targets/queue.js +58 -0
- package/lib/aws/storage/origin-access-identity.d.ts +91 -0
- package/lib/aws/storage/origin-access-identity.js +76 -0
- package/lib/aws/storage/util.d.ts +40 -0
- package/lib/aws/storage/util.js +85 -0
- package/lib/aws/storage/website-config.generated.d.ts +73 -0
- package/lib/aws/storage/website-config.generated.js +3 -0
- package/lib/aws/util.d.ts +4 -0
- package/lib/aws/util.js +25 -0
- package/lib/construct-base.d.ts +69 -0
- package/lib/construct-base.js +89 -0
- package/lib/duration.d.ts +160 -0
- package/lib/duration.js +327 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.js +24 -0
- package/lib/private/index.d.ts +2 -0
- package/lib/private/index.js +19 -0
- package/lib/private/terraform-dependables-aspect.d.ts +20 -0
- package/lib/private/terraform-dependables-aspect.js +95 -0
- package/lib/private/unique-resource-name.d.ts +9 -0
- package/lib/private/unique-resource-name.js +145 -0
- package/lib/size.d.ts +146 -0
- package/lib/size.js +220 -0
- package/lib/stack-base.d.ts +188 -0
- package/lib/stack-base.js +183 -0
- package/lib/token.d.ts +32 -0
- package/lib/token.js +54 -0
- package/node_modules/camel-case/LICENSE +21 -0
- package/node_modules/camel-case/README.md +47 -0
- package/node_modules/camel-case/dist/index.d.ts +5 -0
- package/node_modules/camel-case/dist/index.js +23 -0
- package/node_modules/camel-case/dist/index.js.map +1 -0
- package/node_modules/camel-case/dist/index.spec.d.ts +1 -0
- package/node_modules/camel-case/dist/index.spec.js +26 -0
- package/node_modules/camel-case/dist/index.spec.js.map +1 -0
- package/node_modules/camel-case/dist.es2015/index.d.ts +5 -0
- package/node_modules/camel-case/dist.es2015/index.js +17 -0
- package/node_modules/camel-case/dist.es2015/index.js.map +1 -0
- package/node_modules/camel-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/camel-case/dist.es2015/index.spec.js +24 -0
- package/node_modules/camel-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/camel-case/package.json +89 -0
- package/node_modules/capital-case/LICENSE +21 -0
- package/node_modules/capital-case/README.md +37 -0
- package/node_modules/capital-case/dist/index.d.ts +4 -0
- package/node_modules/capital-case/dist/index.js +16 -0
- package/node_modules/capital-case/dist/index.js.map +1 -0
- package/node_modules/capital-case/dist/index.spec.d.ts +1 -0
- package/node_modules/capital-case/dist/index.spec.js +24 -0
- package/node_modules/capital-case/dist/index.spec.js.map +1 -0
- package/node_modules/capital-case/dist.es2015/index.d.ts +4 -0
- package/node_modules/capital-case/dist.es2015/index.js +11 -0
- package/node_modules/capital-case/dist.es2015/index.js.map +1 -0
- package/node_modules/capital-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/capital-case/dist.es2015/index.spec.js +22 -0
- package/node_modules/capital-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/capital-case/package.json +90 -0
- package/node_modules/change-case/LICENSE +21 -0
- package/node_modules/change-case/README.md +44 -0
- package/node_modules/change-case/dist/index.d.ts +11 -0
- package/node_modules/change-case/dist/index.js +15 -0
- package/node_modules/change-case/dist/index.js.map +1 -0
- package/node_modules/change-case/dist/index.spec.d.ts +1 -0
- package/node_modules/change-case/dist/index.spec.js +9 -0
- package/node_modules/change-case/dist/index.spec.js.map +1 -0
- package/node_modules/change-case/dist.es2015/index.d.ts +11 -0
- package/node_modules/change-case/dist.es2015/index.js +12 -0
- package/node_modules/change-case/dist.es2015/index.js.map +1 -0
- package/node_modules/change-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/change-case/dist.es2015/index.spec.js +7 -0
- package/node_modules/change-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/change-case/package.json +101 -0
- package/node_modules/constant-case/LICENSE +21 -0
- package/node_modules/constant-case/README.md +37 -0
- package/node_modules/constant-case/dist/index.d.ts +3 -0
- package/node_modules/constant-case/dist/index.js +12 -0
- package/node_modules/constant-case/dist/index.js.map +1 -0
- package/node_modules/constant-case/dist/index.spec.d.ts +1 -0
- package/node_modules/constant-case/dist/index.spec.js +26 -0
- package/node_modules/constant-case/dist/index.spec.js.map +1 -0
- package/node_modules/constant-case/dist.es2015/index.d.ts +3 -0
- package/node_modules/constant-case/dist.es2015/index.js +8 -0
- package/node_modules/constant-case/dist.es2015/index.js.map +1 -0
- package/node_modules/constant-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/constant-case/dist.es2015/index.spec.js +24 -0
- package/node_modules/constant-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/constant-case/package.json +90 -0
- package/node_modules/dot-case/LICENSE +21 -0
- package/node_modules/dot-case/README.md +37 -0
- package/node_modules/dot-case/dist/index.d.ts +3 -0
- package/node_modules/dot-case/dist/index.js +11 -0
- package/node_modules/dot-case/dist/index.js.map +1 -0
- package/node_modules/dot-case/dist/index.spec.d.ts +1 -0
- package/node_modules/dot-case/dist/index.spec.js +26 -0
- package/node_modules/dot-case/dist/index.spec.js.map +1 -0
- package/node_modules/dot-case/dist.es2015/index.d.ts +3 -0
- package/node_modules/dot-case/dist.es2015/index.js +7 -0
- package/node_modules/dot-case/dist.es2015/index.js.map +1 -0
- package/node_modules/dot-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/dot-case/dist.es2015/index.spec.js +24 -0
- package/node_modules/dot-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/dot-case/package.json +89 -0
- package/node_modules/esbuild-wasm/LICENSE.md +21 -0
- package/node_modules/esbuild-wasm/README.md +3 -0
- package/node_modules/esbuild-wasm/bin/esbuild +91 -0
- package/node_modules/esbuild-wasm/esbuild.wasm +0 -0
- package/node_modules/esbuild-wasm/esm/browser.d.ts +705 -0
- package/node_modules/esbuild-wasm/esm/browser.js +2370 -0
- package/node_modules/esbuild-wasm/esm/browser.min.js +20 -0
- package/node_modules/esbuild-wasm/lib/browser.d.ts +705 -0
- package/node_modules/esbuild-wasm/lib/browser.js +2415 -0
- package/node_modules/esbuild-wasm/lib/browser.min.js +22 -0
- package/node_modules/esbuild-wasm/lib/main.d.ts +705 -0
- package/node_modules/esbuild-wasm/lib/main.js +2051 -0
- package/node_modules/esbuild-wasm/package.json +19 -0
- package/node_modules/esbuild-wasm/wasm_exec.js +561 -0
- package/node_modules/esbuild-wasm/wasm_exec_node.js +39 -0
- package/node_modules/header-case/LICENSE +21 -0
- package/node_modules/header-case/README.md +37 -0
- package/node_modules/header-case/dist/index.d.ts +3 -0
- package/node_modules/header-case/dist/index.js +11 -0
- package/node_modules/header-case/dist/index.js.map +1 -0
- package/node_modules/header-case/dist/index.spec.d.ts +1 -0
- package/node_modules/header-case/dist/index.spec.js +24 -0
- package/node_modules/header-case/dist/index.spec.js.map +1 -0
- package/node_modules/header-case/dist.es2015/index.d.ts +3 -0
- package/node_modules/header-case/dist.es2015/index.js +7 -0
- package/node_modules/header-case/dist.es2015/index.js.map +1 -0
- package/node_modules/header-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/header-case/dist.es2015/index.spec.js +22 -0
- package/node_modules/header-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/header-case/package.json +89 -0
- package/node_modules/lower-case/LICENSE +21 -0
- package/node_modules/lower-case/README.md +35 -0
- package/node_modules/lower-case/dist/index.d.ts +8 -0
- package/node_modules/lower-case/dist/index.js +53 -0
- package/node_modules/lower-case/dist/index.js.map +1 -0
- package/node_modules/lower-case/dist/index.spec.d.ts +1 -0
- package/node_modules/lower-case/dist/index.spec.js +36 -0
- package/node_modules/lower-case/dist/index.spec.js.map +1 -0
- package/node_modules/lower-case/dist.es2015/index.d.ts +8 -0
- package/node_modules/lower-case/dist.es2015/index.js +48 -0
- package/node_modules/lower-case/dist.es2015/index.js.map +1 -0
- package/node_modules/lower-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/lower-case/dist.es2015/index.spec.js +34 -0
- package/node_modules/lower-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/lower-case/package.json +87 -0
- package/node_modules/mime-db/HISTORY.md +507 -0
- package/node_modules/mime-db/LICENSE +23 -0
- package/node_modules/mime-db/README.md +100 -0
- package/node_modules/mime-db/db.json +8519 -0
- package/node_modules/mime-db/index.js +12 -0
- package/node_modules/mime-db/package.json +60 -0
- package/node_modules/mime-types/HISTORY.md +397 -0
- package/node_modules/mime-types/LICENSE +23 -0
- package/node_modules/mime-types/README.md +113 -0
- package/node_modules/mime-types/index.js +188 -0
- package/node_modules/mime-types/package.json +44 -0
- package/node_modules/no-case/LICENSE +21 -0
- package/node_modules/no-case/README.md +37 -0
- package/node_modules/no-case/dist/index.d.ts +10 -0
- package/node_modules/no-case/dist/index.js +35 -0
- package/node_modules/no-case/dist/index.js.map +1 -0
- package/node_modules/no-case/dist/index.spec.d.ts +1 -0
- package/node_modules/no-case/dist/index.spec.js +59 -0
- package/node_modules/no-case/dist/index.spec.js.map +1 -0
- package/node_modules/no-case/dist.es2015/index.d.ts +10 -0
- package/node_modules/no-case/dist.es2015/index.js +31 -0
- package/node_modules/no-case/dist.es2015/index.js.map +1 -0
- package/node_modules/no-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/no-case/dist.es2015/index.spec.js +57 -0
- package/node_modules/no-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/no-case/package.json +85 -0
- package/node_modules/param-case/LICENSE +21 -0
- package/node_modules/param-case/README.md +37 -0
- package/node_modules/param-case/dist/index.d.ts +3 -0
- package/node_modules/param-case/dist/index.js +11 -0
- package/node_modules/param-case/dist/index.js.map +1 -0
- package/node_modules/param-case/dist/index.spec.d.ts +1 -0
- package/node_modules/param-case/dist/index.spec.js +24 -0
- package/node_modules/param-case/dist/index.spec.js.map +1 -0
- package/node_modules/param-case/dist.es2015/index.d.ts +3 -0
- package/node_modules/param-case/dist.es2015/index.js +7 -0
- package/node_modules/param-case/dist.es2015/index.js.map +1 -0
- package/node_modules/param-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/param-case/dist.es2015/index.spec.js +22 -0
- package/node_modules/param-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/param-case/package.json +91 -0
- package/node_modules/pascal-case/LICENSE +21 -0
- package/node_modules/pascal-case/README.md +47 -0
- package/node_modules/pascal-case/dist/index.d.ts +5 -0
- package/node_modules/pascal-case/dist/index.js +24 -0
- package/node_modules/pascal-case/dist/index.js.map +1 -0
- package/node_modules/pascal-case/dist/index.spec.d.ts +1 -0
- package/node_modules/pascal-case/dist/index.spec.js +25 -0
- package/node_modules/pascal-case/dist/index.spec.js.map +1 -0
- package/node_modules/pascal-case/dist.es2015/index.d.ts +5 -0
- package/node_modules/pascal-case/dist.es2015/index.js +18 -0
- package/node_modules/pascal-case/dist.es2015/index.js.map +1 -0
- package/node_modules/pascal-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/pascal-case/dist.es2015/index.spec.js +23 -0
- package/node_modules/pascal-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/pascal-case/package.json +90 -0
- package/node_modules/path-case/LICENSE +21 -0
- package/node_modules/path-case/README.md +37 -0
- package/node_modules/path-case/dist/index.d.ts +3 -0
- package/node_modules/path-case/dist/index.js +11 -0
- package/node_modules/path-case/dist/index.js.map +1 -0
- package/node_modules/path-case/dist/index.spec.d.ts +1 -0
- package/node_modules/path-case/dist/index.spec.js +24 -0
- package/node_modules/path-case/dist/index.spec.js.map +1 -0
- package/node_modules/path-case/dist.es2015/index.d.ts +3 -0
- package/node_modules/path-case/dist.es2015/index.js +7 -0
- package/node_modules/path-case/dist.es2015/index.js.map +1 -0
- package/node_modules/path-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/path-case/dist.es2015/index.spec.js +22 -0
- package/node_modules/path-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/path-case/package.json +88 -0
- package/node_modules/sentence-case/LICENSE +21 -0
- package/node_modules/sentence-case/README.md +37 -0
- package/node_modules/sentence-case/dist/index.d.ts +4 -0
- package/node_modules/sentence-case/dist/index.js +19 -0
- package/node_modules/sentence-case/dist/index.js.map +1 -0
- package/node_modules/sentence-case/dist/index.spec.d.ts +1 -0
- package/node_modules/sentence-case/dist/index.spec.js +24 -0
- package/node_modules/sentence-case/dist/index.spec.js.map +1 -0
- package/node_modules/sentence-case/dist.es2015/index.d.ts +4 -0
- package/node_modules/sentence-case/dist.es2015/index.js +14 -0
- package/node_modules/sentence-case/dist.es2015/index.js.map +1 -0
- package/node_modules/sentence-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/sentence-case/dist.es2015/index.spec.js +22 -0
- package/node_modules/sentence-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/sentence-case/package.json +89 -0
- package/node_modules/snake-case/LICENSE +21 -0
- package/node_modules/snake-case/README.md +37 -0
- package/node_modules/snake-case/dist/index.d.ts +3 -0
- package/node_modules/snake-case/dist/index.js +11 -0
- package/node_modules/snake-case/dist/index.js.map +1 -0
- package/node_modules/snake-case/dist/index.spec.d.ts +1 -0
- package/node_modules/snake-case/dist/index.spec.js +25 -0
- package/node_modules/snake-case/dist/index.spec.js.map +1 -0
- package/node_modules/snake-case/dist.es2015/index.d.ts +3 -0
- package/node_modules/snake-case/dist.es2015/index.js +7 -0
- package/node_modules/snake-case/dist.es2015/index.js.map +1 -0
- package/node_modules/snake-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/snake-case/dist.es2015/index.spec.js +23 -0
- package/node_modules/snake-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/snake-case/package.json +90 -0
- package/node_modules/tslib/CopyrightNotice.txt +15 -0
- package/node_modules/tslib/LICENSE.txt +12 -0
- package/node_modules/tslib/README.md +164 -0
- package/node_modules/tslib/SECURITY.md +41 -0
- package/node_modules/tslib/modules/index.d.ts +37 -0
- package/node_modules/tslib/modules/index.js +68 -0
- package/node_modules/tslib/modules/package.json +3 -0
- package/node_modules/tslib/package.json +47 -0
- package/node_modules/tslib/tslib.d.ts +453 -0
- package/node_modules/tslib/tslib.es6.html +1 -0
- package/node_modules/tslib/tslib.es6.js +374 -0
- package/node_modules/tslib/tslib.es6.mjs +373 -0
- package/node_modules/tslib/tslib.html +1 -0
- package/node_modules/tslib/tslib.js +424 -0
- package/node_modules/upper-case/README.md +34 -0
- package/node_modules/upper-case/dist/index.d.ts +8 -0
- package/node_modules/upper-case/dist/index.js +49 -0
- package/node_modules/upper-case/dist/index.js.map +1 -0
- package/node_modules/upper-case/dist/index.spec.d.ts +1 -0
- package/node_modules/upper-case/dist/index.spec.js +34 -0
- package/node_modules/upper-case/dist/index.spec.js.map +1 -0
- package/node_modules/upper-case/dist.es2015/index.d.ts +8 -0
- package/node_modules/upper-case/dist.es2015/index.js +44 -0
- package/node_modules/upper-case/dist.es2015/index.js.map +1 -0
- package/node_modules/upper-case/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/upper-case/dist.es2015/index.spec.js +32 -0
- package/node_modules/upper-case/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/upper-case/package.json +86 -0
- package/node_modules/upper-case-first/LICENSE +21 -0
- package/node_modules/upper-case-first/README.md +32 -0
- package/node_modules/upper-case-first/dist/index.d.ts +4 -0
- package/node_modules/upper-case-first/dist/index.js +11 -0
- package/node_modules/upper-case-first/dist/index.js.map +1 -0
- package/node_modules/upper-case-first/dist/index.spec.d.ts +1 -0
- package/node_modules/upper-case-first/dist/index.spec.js +20 -0
- package/node_modules/upper-case-first/dist/index.spec.js.map +1 -0
- package/node_modules/upper-case-first/dist.es2015/index.d.ts +4 -0
- package/node_modules/upper-case-first/dist.es2015/index.js +7 -0
- package/node_modules/upper-case-first/dist.es2015/index.js.map +1 -0
- package/node_modules/upper-case-first/dist.es2015/index.spec.d.ts +1 -0
- package/node_modules/upper-case-first/dist.es2015/index.spec.js +18 -0
- package/node_modules/upper-case-first/dist.es2015/index.spec.js.map +1 -0
- package/node_modules/upper-case-first/package.json +87 -0
- package/package.json +152 -0
- package/setup.js +2 -0
|
@@ -0,0 +1,1032 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.mergePrincipal = exports.defaultAddPrincipalToAssumeRole = exports.SessionTagsPrincipal = exports.PrincipalWithConditions = exports.ComparablePrincipal = exports.CompositePrincipal = exports.StarPrincipal = exports.Anyone = exports.AnyPrincipal = exports.AccountRootPrincipal = exports.SamlConsolePrincipal = exports.SamlPrincipal = exports.OpenIdConnectPrincipal = exports.WebIdentityPrincipal = exports.FederatedPrincipal = exports.CanonicalUserPrincipal = exports.OrganizationPrincipal = exports.ServicePrincipal = exports.AccountPrincipal = exports.ArnPrincipal = exports.PrincipalBase = exports.toPrincipalJson = exports.fromPrincipalJson = exports.PrincipalPolicyFragment = exports.PrincipalType = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
const cdktf_1 = require("cdktf");
|
|
7
|
+
const aws_stack_1 = require("../aws-stack");
|
|
8
|
+
const policy_statement_1 = require("./policy-statement");
|
|
9
|
+
var PrincipalType;
|
|
10
|
+
(function (PrincipalType) {
|
|
11
|
+
PrincipalType["AWS"] = "AWS";
|
|
12
|
+
PrincipalType["FEDERATED"] = "Federated";
|
|
13
|
+
PrincipalType["SERVICE"] = "Service";
|
|
14
|
+
PrincipalType["CANONICALUSER"] = "CanonicalUser";
|
|
15
|
+
PrincipalType["ANY"] = "*";
|
|
16
|
+
})(PrincipalType || (exports.PrincipalType = PrincipalType = {}));
|
|
17
|
+
function isValidPrincipalType(value) {
|
|
18
|
+
const upperCaseValue = value.toUpperCase();
|
|
19
|
+
return upperCaseValue in PrincipalType;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* A collection of the fields in a PolicyStatement that can be used to identify a principal.
|
|
23
|
+
*
|
|
24
|
+
* This consists of the Terraform PrincipalProps representing the
|
|
25
|
+
* `principals` block(s) in a policy statement.
|
|
26
|
+
*
|
|
27
|
+
* Generally, AWS principal JSON looks like:
|
|
28
|
+
*
|
|
29
|
+
* { '<TYPE>': ['ID', 'ID', ...] }
|
|
30
|
+
*
|
|
31
|
+
* And this is also the type of the field `principalJson`.
|
|
32
|
+
*
|
|
33
|
+
* However, there is a special type of principal that is just the string '*',
|
|
34
|
+
* which is treated differently by some services.
|
|
35
|
+
*
|
|
36
|
+
* To represent that principal, `principalJson` should contain `*`.
|
|
37
|
+
* To represent that principal in Terraform principals block(s), the
|
|
38
|
+
* type should be `PrincipalType.ANY` and the identifiers should be `['*']`.
|
|
39
|
+
*/
|
|
40
|
+
class PrincipalPolicyFragment {
|
|
41
|
+
/**
|
|
42
|
+
* Parses a JSON object with the AWS IAM Principal structure
|
|
43
|
+
*
|
|
44
|
+
* Refer to the `fromPrincipalJson` and `fromConditionJson` functions for more information
|
|
45
|
+
*/
|
|
46
|
+
static fromJson(principalJson, conditionsJson = {}) {
|
|
47
|
+
return new PrincipalPolicyFragment(fromPrincipalJson(principalJson), (0, policy_statement_1.fromConditionJson)(conditionsJson));
|
|
48
|
+
}
|
|
49
|
+
// TODO: Should this actually be used anywhere?
|
|
50
|
+
get principalJson() {
|
|
51
|
+
return toPrincipalJson(...this.principals);
|
|
52
|
+
}
|
|
53
|
+
get conditionsJson() {
|
|
54
|
+
return (0, policy_statement_1.toConditionJson)(...this.conditions);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
*
|
|
58
|
+
* @param principals Array of "principals" block in a policy statement
|
|
59
|
+
* @param conditions conditions that need to be applied to this policy
|
|
60
|
+
*/
|
|
61
|
+
constructor(principals,
|
|
62
|
+
/**
|
|
63
|
+
* The conditions under which the policy is in effect.
|
|
64
|
+
* See [the IAM documentation](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html).
|
|
65
|
+
*/
|
|
66
|
+
conditions = []) {
|
|
67
|
+
this.principals = principals;
|
|
68
|
+
this.conditions = conditions;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
exports.PrincipalPolicyFragment = PrincipalPolicyFragment;
|
|
72
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
73
|
+
PrincipalPolicyFragment[_a] = { fqn: "terraconstructs.aws.iam.PrincipalPolicyFragment", version: "0.0.8" };
|
|
74
|
+
/**
|
|
75
|
+
* Read from AWS Principal JSON to Terraform principals block(s)
|
|
76
|
+
*
|
|
77
|
+
* Handles special case: if principal is "*" and turns it into the `StarPrincipal`,
|
|
78
|
+
*
|
|
79
|
+
* Even though the IAM Documentation states that "Principal": "*" and "Principal": {"AWS": "*"} are equivalent,
|
|
80
|
+
* those principal elements have different behavior in some situations, e.g., IAM Role Trust Policy.
|
|
81
|
+
*
|
|
82
|
+
* To have Terraform render JSON containing "Principal": "*", use type = "*" and identifiers = ["*"].
|
|
83
|
+
* To have Terraform render JSON containing "Principal": {"AWS": "*"}, use type = "AWS" and identifiers = ["*"].
|
|
84
|
+
*/
|
|
85
|
+
function fromPrincipalJson(principalJson = {}) {
|
|
86
|
+
if (typeof principalJson === "string") {
|
|
87
|
+
if (principalJson === "*") {
|
|
88
|
+
return [{ type: PrincipalType.ANY, identifiers: ["*"] }];
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
// TODO: Should this handle other scenarios (i.e. Tokens?)
|
|
92
|
+
throw new Error(`Invalid principal type: ${principalJson}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (typeof principalJson !== "object") {
|
|
96
|
+
throw new Error(`JSON IAM principal should be an object, got ${JSON.stringify(principalJson)}`);
|
|
97
|
+
}
|
|
98
|
+
const result = new Array();
|
|
99
|
+
for (const [key, identifiers] of Object.entries(principalJson)) {
|
|
100
|
+
if (!isValidPrincipalType(key)) {
|
|
101
|
+
throw new Error(`Invalid principal type: ${key}, valid values are: ${Object.values(PrincipalType)}`);
|
|
102
|
+
}
|
|
103
|
+
result.push({
|
|
104
|
+
identifiers: Array.isArray(identifiers) ? identifiers : [identifiers],
|
|
105
|
+
type: key,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
return result;
|
|
109
|
+
}
|
|
110
|
+
exports.fromPrincipalJson = fromPrincipalJson;
|
|
111
|
+
/**
|
|
112
|
+
* Convert Terraform principals blocks back to AWS Principal JSON
|
|
113
|
+
*/
|
|
114
|
+
function toPrincipalJson(...principalProps) {
|
|
115
|
+
if (principalProps.length === 1 &&
|
|
116
|
+
principalProps[0].type === PrincipalType.ANY &&
|
|
117
|
+
principalProps[0].identifiers.length === 1 &&
|
|
118
|
+
principalProps[0].identifiers[0] === "*")
|
|
119
|
+
return "*";
|
|
120
|
+
const result = {};
|
|
121
|
+
for (const principal of principalProps) {
|
|
122
|
+
result[principal.type] =
|
|
123
|
+
principal.identifiers.length === 1
|
|
124
|
+
? principal.identifiers[0]
|
|
125
|
+
: principal.identifiers;
|
|
126
|
+
}
|
|
127
|
+
return result;
|
|
128
|
+
}
|
|
129
|
+
exports.toPrincipalJson = toPrincipalJson;
|
|
130
|
+
/**
|
|
131
|
+
* Base class for policy principals
|
|
132
|
+
*/
|
|
133
|
+
class PrincipalBase {
|
|
134
|
+
constructor() {
|
|
135
|
+
this.grantPrincipal = this;
|
|
136
|
+
this.principalAccount = undefined;
|
|
137
|
+
/**
|
|
138
|
+
* When this Principal is used in an AssumeRole policy, the action to use.
|
|
139
|
+
*/
|
|
140
|
+
this.assumeRoleAction = "sts:AssumeRole";
|
|
141
|
+
}
|
|
142
|
+
addToPolicy(statement) {
|
|
143
|
+
return this.addToPrincipalPolicy(statement).statementAdded;
|
|
144
|
+
}
|
|
145
|
+
addToPrincipalPolicy(_statement) {
|
|
146
|
+
// This base class is used for non-identity principals. None of them
|
|
147
|
+
// have a PolicyDocument to add to.
|
|
148
|
+
return { statementAdded: false };
|
|
149
|
+
}
|
|
150
|
+
addToAssumeRolePolicy(document) {
|
|
151
|
+
// Default implementation of this protocol
|
|
152
|
+
document.addStatements(new policy_statement_1.PolicyStatement({
|
|
153
|
+
actions: [this.assumeRoleAction],
|
|
154
|
+
principals: [this],
|
|
155
|
+
}));
|
|
156
|
+
}
|
|
157
|
+
toString() {
|
|
158
|
+
// This is a first pass to make the object readable. Descendant principals
|
|
159
|
+
// should return something nicer.
|
|
160
|
+
return JSON.stringify(this.policyFragment.principalJson);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* JSON-ify the principal
|
|
164
|
+
*
|
|
165
|
+
* Used when JSON.stringify() is called
|
|
166
|
+
*/
|
|
167
|
+
toJSON() {
|
|
168
|
+
// Have to implement toJSON() because the default will lead to infinite recursion.
|
|
169
|
+
return this.policyFragment.principalJson;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Returns a new PrincipalWithConditions using this principal as the base, with the
|
|
173
|
+
* passed conditions added.
|
|
174
|
+
*
|
|
175
|
+
* When there is a value for the same operator and key in both the principal and the
|
|
176
|
+
* conditions parameter, the value from the conditions parameter will be used.
|
|
177
|
+
*
|
|
178
|
+
* @returns a new PrincipalWithConditions object.
|
|
179
|
+
*/
|
|
180
|
+
withConditions(...conditions) {
|
|
181
|
+
return new PrincipalWithConditions(this, conditions);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Returns a new principal using this principal as the base, with session tags enabled.
|
|
185
|
+
*
|
|
186
|
+
* @returns a new SessionTagsPrincipal object.
|
|
187
|
+
*/
|
|
188
|
+
withSessionTags() {
|
|
189
|
+
return new SessionTagsPrincipal(this);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
exports.PrincipalBase = PrincipalBase;
|
|
193
|
+
_b = JSII_RTTI_SYMBOL_1;
|
|
194
|
+
PrincipalBase[_b] = { fqn: "terraconstructs.aws.iam.PrincipalBase", version: "0.0.8" };
|
|
195
|
+
/**
|
|
196
|
+
* Specify a principal by the Amazon Resource Name (ARN).
|
|
197
|
+
* You can specify AWS accounts, IAM users, Federated SAML users, IAM roles, and specific assumed-role sessions.
|
|
198
|
+
* You cannot specify IAM groups or instance profiles as principals
|
|
199
|
+
*
|
|
200
|
+
* @see https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html
|
|
201
|
+
*/
|
|
202
|
+
class ArnPrincipal extends PrincipalBase {
|
|
203
|
+
/**
|
|
204
|
+
*
|
|
205
|
+
* @param arn Amazon Resource Name (ARN) of the principal entity (i.e. arn:aws:iam::123456789012:user/user-name)
|
|
206
|
+
*/
|
|
207
|
+
constructor(arn) {
|
|
208
|
+
super();
|
|
209
|
+
this.arn = arn;
|
|
210
|
+
}
|
|
211
|
+
get policyFragment() {
|
|
212
|
+
return new PrincipalPolicyFragment([
|
|
213
|
+
{
|
|
214
|
+
type: PrincipalType.AWS,
|
|
215
|
+
identifiers: [this.arn],
|
|
216
|
+
},
|
|
217
|
+
]);
|
|
218
|
+
}
|
|
219
|
+
toString() {
|
|
220
|
+
return `ArnPrincipal(${this.arn})`;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* A convenience method for adding a condition that the principal is part of the specified
|
|
224
|
+
* AWS Organization.
|
|
225
|
+
*/
|
|
226
|
+
inOrganization(organizationId) {
|
|
227
|
+
return this.withConditions({
|
|
228
|
+
test: "StringEquals",
|
|
229
|
+
variable: "aws:PrincipalOrgID",
|
|
230
|
+
values: [organizationId],
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
dedupeString() {
|
|
234
|
+
return `ArnPrincipal:${this.arn}`;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
exports.ArnPrincipal = ArnPrincipal;
|
|
238
|
+
_c = JSII_RTTI_SYMBOL_1;
|
|
239
|
+
ArnPrincipal[_c] = { fqn: "terraconstructs.aws.iam.ArnPrincipal", version: "0.0.8" };
|
|
240
|
+
/**
|
|
241
|
+
* Specify AWS account ID as the principal entity in a policy to delegate authority to the account.
|
|
242
|
+
*/
|
|
243
|
+
class AccountPrincipal extends ArnPrincipal {
|
|
244
|
+
/**
|
|
245
|
+
*
|
|
246
|
+
* @param accountId AWS account ID (i.e. '123456789012')
|
|
247
|
+
*/
|
|
248
|
+
constructor(accountId) {
|
|
249
|
+
super(new AwsStackDependentToken((awsStack) => `arn:${awsStack.partition}:iam::${accountId}:root`).toString());
|
|
250
|
+
this.accountId = accountId;
|
|
251
|
+
if (!cdktf_1.Token.isUnresolved(accountId) && typeof accountId !== "string") {
|
|
252
|
+
throw new Error("accountId should be of type string");
|
|
253
|
+
}
|
|
254
|
+
this.principalAccount = accountId;
|
|
255
|
+
}
|
|
256
|
+
toString() {
|
|
257
|
+
return `AccountPrincipal(${this.accountId})`;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
exports.AccountPrincipal = AccountPrincipal;
|
|
261
|
+
_d = JSII_RTTI_SYMBOL_1;
|
|
262
|
+
AccountPrincipal[_d] = { fqn: "terraconstructs.aws.iam.AccountPrincipal", version: "0.0.8" };
|
|
263
|
+
/**
|
|
264
|
+
* An IAM principal that represents an AWS service (i.e. `sqs.amazonaws.com`).
|
|
265
|
+
*/
|
|
266
|
+
class ServicePrincipal extends PrincipalBase {
|
|
267
|
+
/**
|
|
268
|
+
* Return the service principal name based on the region it's used in.
|
|
269
|
+
*
|
|
270
|
+
* Some service principal names used to be different for different partitions,
|
|
271
|
+
* and some were not.
|
|
272
|
+
*
|
|
273
|
+
* These days all service principal names are standardized, and they are all
|
|
274
|
+
* of the form `<servicename>.amazonaws.com`.
|
|
275
|
+
*
|
|
276
|
+
* To avoid breaking changes, handling is provided for services added with the formats below,
|
|
277
|
+
* however, no additional handling will be added for new regions or partitions.
|
|
278
|
+
* - s3
|
|
279
|
+
* - s3.amazonaws.com
|
|
280
|
+
* - s3.amazonaws.com.cn
|
|
281
|
+
* - s3.c2s.ic.gov
|
|
282
|
+
* - s3.sc2s.sgov.gov
|
|
283
|
+
*
|
|
284
|
+
* @example
|
|
285
|
+
* const principalName = iam.ServicePrincipal.servicePrincipalName('ec2');
|
|
286
|
+
*/
|
|
287
|
+
static servicePrincipalName(service) {
|
|
288
|
+
return new ServicePrincipalToken(service, {}).toString();
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Reference an AWS service, optionally in a given region
|
|
292
|
+
*
|
|
293
|
+
* @param service AWS service (i.e. sqs.amazonaws.com)
|
|
294
|
+
*/
|
|
295
|
+
constructor(service, opts = {}) {
|
|
296
|
+
super();
|
|
297
|
+
this.service = service;
|
|
298
|
+
this.opts = opts;
|
|
299
|
+
}
|
|
300
|
+
get policyFragment() {
|
|
301
|
+
return new PrincipalPolicyFragment([
|
|
302
|
+
{
|
|
303
|
+
type: PrincipalType.SERVICE,
|
|
304
|
+
identifiers: [
|
|
305
|
+
new ServicePrincipalToken(this.service, this.opts).toString(),
|
|
306
|
+
],
|
|
307
|
+
},
|
|
308
|
+
], this.opts.conditions);
|
|
309
|
+
}
|
|
310
|
+
toString() {
|
|
311
|
+
return `ServicePrincipal(${this.service})`;
|
|
312
|
+
}
|
|
313
|
+
dedupeString() {
|
|
314
|
+
return `ServicePrincipal:${this.service}:${JSON.stringify(this.opts)}`;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
exports.ServicePrincipal = ServicePrincipal;
|
|
318
|
+
_e = JSII_RTTI_SYMBOL_1;
|
|
319
|
+
ServicePrincipal[_e] = { fqn: "terraconstructs.aws.iam.ServicePrincipal", version: "0.0.8" };
|
|
320
|
+
/**
|
|
321
|
+
* A principal that represents an AWS Organization
|
|
322
|
+
*/
|
|
323
|
+
class OrganizationPrincipal extends PrincipalBase {
|
|
324
|
+
/**
|
|
325
|
+
*
|
|
326
|
+
* @param organizationId The unique identifier (ID) of an organization (i.e. o-12345abcde)
|
|
327
|
+
*/
|
|
328
|
+
constructor(organizationId) {
|
|
329
|
+
super();
|
|
330
|
+
this.organizationId = organizationId;
|
|
331
|
+
}
|
|
332
|
+
get policyFragment() {
|
|
333
|
+
return new PrincipalPolicyFragment([{ type: PrincipalType.AWS, identifiers: ["*"] }], [
|
|
334
|
+
{
|
|
335
|
+
test: "StringEquals",
|
|
336
|
+
variable: "aws:PrincipalOrgID",
|
|
337
|
+
values: [this.organizationId],
|
|
338
|
+
},
|
|
339
|
+
]);
|
|
340
|
+
}
|
|
341
|
+
toString() {
|
|
342
|
+
return `OrganizationPrincipal(${this.organizationId})`;
|
|
343
|
+
}
|
|
344
|
+
dedupeString() {
|
|
345
|
+
return `OrganizationPrincipal:${this.organizationId}`;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
exports.OrganizationPrincipal = OrganizationPrincipal;
|
|
349
|
+
_f = JSII_RTTI_SYMBOL_1;
|
|
350
|
+
OrganizationPrincipal[_f] = { fqn: "terraconstructs.aws.iam.OrganizationPrincipal", version: "0.0.8" };
|
|
351
|
+
/**
|
|
352
|
+
* A policy principal for canonicalUserIds - useful for S3 bucket policies that use
|
|
353
|
+
* Origin Access identities.
|
|
354
|
+
*
|
|
355
|
+
* See https://docs.aws.amazon.com/general/latest/gr/acct-identifiers.html
|
|
356
|
+
*
|
|
357
|
+
* and
|
|
358
|
+
*
|
|
359
|
+
* https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html
|
|
360
|
+
*
|
|
361
|
+
* for more details.
|
|
362
|
+
*
|
|
363
|
+
*/
|
|
364
|
+
class CanonicalUserPrincipal extends PrincipalBase {
|
|
365
|
+
/**
|
|
366
|
+
*
|
|
367
|
+
* @param canonicalUserId unique identifier assigned by AWS for every account.
|
|
368
|
+
* root user and IAM users for an account all see the same ID.
|
|
369
|
+
* (i.e. 79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be)
|
|
370
|
+
*/
|
|
371
|
+
constructor(canonicalUserId) {
|
|
372
|
+
super();
|
|
373
|
+
this.canonicalUserId = canonicalUserId;
|
|
374
|
+
}
|
|
375
|
+
get policyFragment() {
|
|
376
|
+
return new PrincipalPolicyFragment([
|
|
377
|
+
{
|
|
378
|
+
type: PrincipalType.CANONICALUSER,
|
|
379
|
+
identifiers: [this.canonicalUserId],
|
|
380
|
+
},
|
|
381
|
+
]);
|
|
382
|
+
}
|
|
383
|
+
toString() {
|
|
384
|
+
return `CanonicalUserPrincipal(${this.canonicalUserId})`;
|
|
385
|
+
}
|
|
386
|
+
dedupeString() {
|
|
387
|
+
return `CanonicalUserPrincipal:${this.canonicalUserId}`;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
exports.CanonicalUserPrincipal = CanonicalUserPrincipal;
|
|
391
|
+
_g = JSII_RTTI_SYMBOL_1;
|
|
392
|
+
CanonicalUserPrincipal[_g] = { fqn: "terraconstructs.aws.iam.CanonicalUserPrincipal", version: "0.0.8" };
|
|
393
|
+
/**
|
|
394
|
+
* Principal entity that represents a federated identity provider such as Amazon Cognito,
|
|
395
|
+
* that can be used to provide temporary security credentials to users who have been authenticated.
|
|
396
|
+
* Additional condition keys are available when the temporary security credentials are used to make a request.
|
|
397
|
+
* You can use these keys to write policies that limit the access of federated users.
|
|
398
|
+
*
|
|
399
|
+
* @see https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html#condition-keys-wif
|
|
400
|
+
*/
|
|
401
|
+
class FederatedPrincipal extends PrincipalBase {
|
|
402
|
+
/**
|
|
403
|
+
*
|
|
404
|
+
* @param federated federated identity provider (i.e. 'cognito-identity.amazonaws.com' for users authenticated through Cognito)
|
|
405
|
+
* @param sessionTags Whether to enable session tagging (see https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html)
|
|
406
|
+
*/
|
|
407
|
+
constructor(federated, conditions = [], assumeRoleAction = "sts:AssumeRole") {
|
|
408
|
+
super();
|
|
409
|
+
this.federated = federated;
|
|
410
|
+
this.conditions = conditions;
|
|
411
|
+
this.assumeRoleAction = assumeRoleAction;
|
|
412
|
+
}
|
|
413
|
+
get policyFragment() {
|
|
414
|
+
return new PrincipalPolicyFragment([{ type: PrincipalType.FEDERATED, identifiers: [this.federated] }], this.conditions);
|
|
415
|
+
}
|
|
416
|
+
toString() {
|
|
417
|
+
return `FederatedPrincipal(${this.federated})`;
|
|
418
|
+
}
|
|
419
|
+
dedupeString() {
|
|
420
|
+
return `FederatedPrincipal:${this.federated}:${this.assumeRoleAction}:${JSON.stringify(this.conditions)}`;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
exports.FederatedPrincipal = FederatedPrincipal;
|
|
424
|
+
_h = JSII_RTTI_SYMBOL_1;
|
|
425
|
+
FederatedPrincipal[_h] = { fqn: "terraconstructs.aws.iam.FederatedPrincipal", version: "0.0.8" };
|
|
426
|
+
/**
|
|
427
|
+
* A principal that represents a federated identity provider as Web Identity such as Cognito, Amazon,
|
|
428
|
+
* Facebook, Google, etc.
|
|
429
|
+
*/
|
|
430
|
+
class WebIdentityPrincipal extends FederatedPrincipal {
|
|
431
|
+
/**
|
|
432
|
+
*
|
|
433
|
+
* @param identityProvider identity provider (i.e. 'cognito-identity.amazonaws.com' for users authenticated through Cognito)
|
|
434
|
+
* @param conditions The conditions under which the policy is in effect.
|
|
435
|
+
* See [the IAM documentation](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html).
|
|
436
|
+
* @param sessionTags Whether to enable session tagging (see https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html)
|
|
437
|
+
*/
|
|
438
|
+
constructor(identityProvider, conditions = []) {
|
|
439
|
+
super(identityProvider, conditions ?? {}, "sts:AssumeRoleWithWebIdentity");
|
|
440
|
+
}
|
|
441
|
+
get policyFragment() {
|
|
442
|
+
return new PrincipalPolicyFragment([{ type: PrincipalType.FEDERATED, identifiers: [this.federated] }], this.conditions);
|
|
443
|
+
}
|
|
444
|
+
toString() {
|
|
445
|
+
return `WebIdentityPrincipal(${this.federated})`;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
exports.WebIdentityPrincipal = WebIdentityPrincipal;
|
|
449
|
+
_j = JSII_RTTI_SYMBOL_1;
|
|
450
|
+
WebIdentityPrincipal[_j] = { fqn: "terraconstructs.aws.iam.WebIdentityPrincipal", version: "0.0.8" };
|
|
451
|
+
/**
|
|
452
|
+
* A principal that represents a federated identity provider as from a OpenID Connect provider.
|
|
453
|
+
*/
|
|
454
|
+
class OpenIdConnectPrincipal extends WebIdentityPrincipal {
|
|
455
|
+
/**
|
|
456
|
+
*
|
|
457
|
+
* @param openIdConnectProvider OpenID Connect provider
|
|
458
|
+
* @param conditions The conditions under which the policy is in effect.
|
|
459
|
+
* See [the IAM documentation](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html).
|
|
460
|
+
*/
|
|
461
|
+
constructor(openIdConnectProvider, conditions = []) {
|
|
462
|
+
super(openIdConnectProvider.openIdConnectProviderArn, conditions);
|
|
463
|
+
}
|
|
464
|
+
get policyFragment() {
|
|
465
|
+
return new PrincipalPolicyFragment([{ type: PrincipalType.FEDERATED, identifiers: [this.federated] }], this.conditions);
|
|
466
|
+
}
|
|
467
|
+
toString() {
|
|
468
|
+
return `OpenIdConnectPrincipal(${this.federated})`;
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
exports.OpenIdConnectPrincipal = OpenIdConnectPrincipal;
|
|
472
|
+
_k = JSII_RTTI_SYMBOL_1;
|
|
473
|
+
OpenIdConnectPrincipal[_k] = { fqn: "terraconstructs.aws.iam.OpenIdConnectPrincipal", version: "0.0.8" };
|
|
474
|
+
/**
|
|
475
|
+
* Principal entity that represents a SAML federated identity provider
|
|
476
|
+
*/
|
|
477
|
+
class SamlPrincipal extends FederatedPrincipal {
|
|
478
|
+
constructor(samlProvider, conditions) {
|
|
479
|
+
super(samlProvider.samlProviderArn, conditions, "sts:AssumeRoleWithSAML");
|
|
480
|
+
}
|
|
481
|
+
toString() {
|
|
482
|
+
return `SamlPrincipal(${this.federated})`;
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
exports.SamlPrincipal = SamlPrincipal;
|
|
486
|
+
_l = JSII_RTTI_SYMBOL_1;
|
|
487
|
+
SamlPrincipal[_l] = { fqn: "terraconstructs.aws.iam.SamlPrincipal", version: "0.0.8" };
|
|
488
|
+
/**
|
|
489
|
+
* Principal entity that represents a SAML federated identity provider for
|
|
490
|
+
* programmatic and AWS Management Console access.
|
|
491
|
+
*/
|
|
492
|
+
class SamlConsolePrincipal extends SamlPrincipal {
|
|
493
|
+
/**
|
|
494
|
+
* enum Partition {
|
|
495
|
+
* Default = 'aws',
|
|
496
|
+
* Cn = 'aws-cn',
|
|
497
|
+
* UsGov = 'aws-us-gov',
|
|
498
|
+
* UsIso = 'aws-iso',
|
|
499
|
+
* UsIsoB = 'aws-iso-b',
|
|
500
|
+
* UsIsoF = 'aws-iso-f',
|
|
501
|
+
* EuIsoE = 'aws-iso-e',
|
|
502
|
+
* }
|
|
503
|
+
* SAML Sign On urls could be...
|
|
504
|
+
* [Partition.Default]: 'https://signin.aws.amazon.com/saml',
|
|
505
|
+
* [Partition.Cn]: 'https://signin.amazonaws.cn/saml',
|
|
506
|
+
* [Partition.UsGov]: 'https://signin.amazonaws-us-gov.com/saml',
|
|
507
|
+
* [Partition.UsIso]: 'https://signin.c2shome.ic.gov/saml',
|
|
508
|
+
* [Partition.UsIsoB]: 'https://signin.sc2shome.sgov.gov/saml',
|
|
509
|
+
*/
|
|
510
|
+
/**
|
|
511
|
+
* @param samlProvider The SAML provider
|
|
512
|
+
*/
|
|
513
|
+
constructor(samlProvider, conditions = []) {
|
|
514
|
+
super(samlProvider, [
|
|
515
|
+
...conditions,
|
|
516
|
+
// TODO: handle collisions on "SAML:aud"?
|
|
517
|
+
{
|
|
518
|
+
test: "StringEquals",
|
|
519
|
+
variable: "SAML:aud",
|
|
520
|
+
values: ["https://signin.aws.amazon.com/saml"],
|
|
521
|
+
},
|
|
522
|
+
]);
|
|
523
|
+
}
|
|
524
|
+
toString() {
|
|
525
|
+
return `SamlConsolePrincipal(${this.federated})`;
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
exports.SamlConsolePrincipal = SamlConsolePrincipal;
|
|
529
|
+
_m = JSII_RTTI_SYMBOL_1;
|
|
530
|
+
SamlConsolePrincipal[_m] = { fqn: "terraconstructs.aws.iam.SamlConsolePrincipal", version: "0.0.8" };
|
|
531
|
+
/**
|
|
532
|
+
* Use the AWS account into which a stack is deployed as the principal entity in a policy
|
|
533
|
+
*/
|
|
534
|
+
class AccountRootPrincipal extends AccountPrincipal {
|
|
535
|
+
constructor() {
|
|
536
|
+
super(new AwsStackDependentToken((awsStack) => awsStack.account).toString());
|
|
537
|
+
}
|
|
538
|
+
toString() {
|
|
539
|
+
return "AccountRootPrincipal()";
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
exports.AccountRootPrincipal = AccountRootPrincipal;
|
|
543
|
+
_o = JSII_RTTI_SYMBOL_1;
|
|
544
|
+
AccountRootPrincipal[_o] = { fqn: "terraconstructs.aws.iam.AccountRootPrincipal", version: "0.0.8" };
|
|
545
|
+
/**
|
|
546
|
+
* A principal representing all AWS identities in all accounts
|
|
547
|
+
*
|
|
548
|
+
* Some services behave differently when you specify `Principal: '*'`
|
|
549
|
+
* or `Principal: { AWS: "*" }` in their resource policy.
|
|
550
|
+
*
|
|
551
|
+
* `AnyPrincipal` renders to `Principal: { AWS: "*" }`. This is correct
|
|
552
|
+
* most of the time, but in cases where you need the other principal,
|
|
553
|
+
* use `StarPrincipal` instead.
|
|
554
|
+
*/
|
|
555
|
+
class AnyPrincipal extends ArnPrincipal {
|
|
556
|
+
constructor() {
|
|
557
|
+
super("*");
|
|
558
|
+
}
|
|
559
|
+
toString() {
|
|
560
|
+
return "AnyPrincipal()";
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
exports.AnyPrincipal = AnyPrincipal;
|
|
564
|
+
_p = JSII_RTTI_SYMBOL_1;
|
|
565
|
+
AnyPrincipal[_p] = { fqn: "terraconstructs.aws.iam.AnyPrincipal", version: "0.0.8" };
|
|
566
|
+
/**
|
|
567
|
+
* A principal representing all identities in all accounts
|
|
568
|
+
* @deprecated use `AnyPrincipal`
|
|
569
|
+
*/
|
|
570
|
+
class Anyone extends AnyPrincipal {
|
|
571
|
+
}
|
|
572
|
+
exports.Anyone = Anyone;
|
|
573
|
+
_q = JSII_RTTI_SYMBOL_1;
|
|
574
|
+
Anyone[_q] = { fqn: "terraconstructs.aws.iam.Anyone", version: "0.0.8" };
|
|
575
|
+
/**
|
|
576
|
+
* A principal that uses a literal '*' in the IAM JSON language
|
|
577
|
+
*
|
|
578
|
+
* Some services behave differently when you specify `Principal: "*"`
|
|
579
|
+
* or `Principal: { AWS: "*" }` in their resource policy.
|
|
580
|
+
*
|
|
581
|
+
* `StarPrincipal` renders to `Principal: *`. Most of the time, you
|
|
582
|
+
* should use `AnyPrincipal` instead.
|
|
583
|
+
*/
|
|
584
|
+
class StarPrincipal extends PrincipalBase {
|
|
585
|
+
constructor() {
|
|
586
|
+
super(...arguments);
|
|
587
|
+
this.policyFragment = new PrincipalPolicyFragment([
|
|
588
|
+
{
|
|
589
|
+
type: PrincipalType.ANY,
|
|
590
|
+
identifiers: ["*"],
|
|
591
|
+
},
|
|
592
|
+
]);
|
|
593
|
+
}
|
|
594
|
+
toString() {
|
|
595
|
+
return "StarPrincipal()";
|
|
596
|
+
}
|
|
597
|
+
dedupeString() {
|
|
598
|
+
return "StarPrincipal";
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
exports.StarPrincipal = StarPrincipal;
|
|
602
|
+
_r = JSII_RTTI_SYMBOL_1;
|
|
603
|
+
StarPrincipal[_r] = { fqn: "terraconstructs.aws.iam.StarPrincipal", version: "0.0.8" };
|
|
604
|
+
/**
|
|
605
|
+
* Represents a principal that has multiple types of principals. A composite principal cannot
|
|
606
|
+
* have conditions. i.e. multiple ServicePrincipals that form a composite principal
|
|
607
|
+
*/
|
|
608
|
+
class CompositePrincipal extends PrincipalBase {
|
|
609
|
+
constructor(...principals) {
|
|
610
|
+
super();
|
|
611
|
+
this._principals = new Array();
|
|
612
|
+
if (principals.length === 0) {
|
|
613
|
+
throw new Error("CompositePrincipals must be constructed with at least 1 Principal but none were passed.");
|
|
614
|
+
}
|
|
615
|
+
this.assumeRoleAction = principals[0].assumeRoleAction;
|
|
616
|
+
this.addPrincipals(...principals);
|
|
617
|
+
}
|
|
618
|
+
/**
|
|
619
|
+
* Adds IAM principals to the composite principal. Composite principals cannot have
|
|
620
|
+
* conditions.
|
|
621
|
+
*
|
|
622
|
+
* @param principals IAM principals that will be added to the composite principal
|
|
623
|
+
*/
|
|
624
|
+
addPrincipals(...principals) {
|
|
625
|
+
this._principals.push(...principals);
|
|
626
|
+
return this;
|
|
627
|
+
}
|
|
628
|
+
addToAssumeRolePolicy(doc) {
|
|
629
|
+
for (const p of this._principals) {
|
|
630
|
+
defaultAddPrincipalToAssumeRole(p, doc);
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
get policyFragment() {
|
|
634
|
+
// We only have a problem with conditions if we are trying to render composite
|
|
635
|
+
// principals into a single statement (which is when `policyFragment` would get called)
|
|
636
|
+
for (const p of this._principals) {
|
|
637
|
+
const fragment = p.policyFragment;
|
|
638
|
+
if (fragment.conditions && fragment.conditions.length > 0) {
|
|
639
|
+
throw new Error("Components of a CompositePrincipal must not have conditions. " +
|
|
640
|
+
`Tried to add the following fragment: ${JSON.stringify(fragment)}`);
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
const principals = new Array();
|
|
644
|
+
for (const p of this._principals) {
|
|
645
|
+
mergePrincipal(principals, p.policyFragment.principals);
|
|
646
|
+
}
|
|
647
|
+
return new PrincipalPolicyFragment(principals);
|
|
648
|
+
}
|
|
649
|
+
toString() {
|
|
650
|
+
return `CompositePrincipal(${this._principals})`;
|
|
651
|
+
}
|
|
652
|
+
dedupeString() {
|
|
653
|
+
const inner = this._principals.map(ComparablePrincipal.dedupeStringFor);
|
|
654
|
+
if (inner.some((x) => x === undefined)) {
|
|
655
|
+
return undefined;
|
|
656
|
+
}
|
|
657
|
+
return `CompositePrincipal[${inner.join(",")}]`;
|
|
658
|
+
}
|
|
659
|
+
/**
|
|
660
|
+
* Returns the principals that make up the CompositePrincipal
|
|
661
|
+
*/
|
|
662
|
+
get principals() {
|
|
663
|
+
return this._principals;
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
exports.CompositePrincipal = CompositePrincipal;
|
|
667
|
+
_s = JSII_RTTI_SYMBOL_1;
|
|
668
|
+
CompositePrincipal[_s] = { fqn: "terraconstructs.aws.iam.CompositePrincipal", version: "0.0.8" };
|
|
669
|
+
/**
|
|
670
|
+
* Base class for Principals that wrap other principals
|
|
671
|
+
*/
|
|
672
|
+
class PrincipalAdapter extends PrincipalBase {
|
|
673
|
+
constructor(wrapped) {
|
|
674
|
+
super();
|
|
675
|
+
this.wrapped = wrapped;
|
|
676
|
+
this.assumeRoleAction = this.wrapped.assumeRoleAction;
|
|
677
|
+
this.principalAccount = this.wrapped.principalAccount;
|
|
678
|
+
}
|
|
679
|
+
get policyFragment() {
|
|
680
|
+
return this.wrapped.policyFragment;
|
|
681
|
+
}
|
|
682
|
+
addToPrincipalPolicy(statement) {
|
|
683
|
+
return this.wrapped.addToPrincipalPolicy(statement);
|
|
684
|
+
}
|
|
685
|
+
/**
|
|
686
|
+
* Append the given string to the wrapped principal's dedupe string (if available)
|
|
687
|
+
*/
|
|
688
|
+
appendDedupe(append) {
|
|
689
|
+
const inner = ComparablePrincipal.dedupeStringFor(this.wrapped);
|
|
690
|
+
return inner !== undefined
|
|
691
|
+
? `${this.constructor.name}:${inner}:${append}`
|
|
692
|
+
: undefined;
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
/**
|
|
696
|
+
* Helper class for working with `IComparablePrincipal`s
|
|
697
|
+
*/
|
|
698
|
+
class ComparablePrincipal {
|
|
699
|
+
/**
|
|
700
|
+
* Whether or not the given principal is a comparable principal
|
|
701
|
+
*/
|
|
702
|
+
static isComparablePrincipal(x) {
|
|
703
|
+
return "dedupeString" in x;
|
|
704
|
+
}
|
|
705
|
+
/**
|
|
706
|
+
* Return the dedupeString of the given principal, if available
|
|
707
|
+
*/
|
|
708
|
+
static dedupeStringFor(x) {
|
|
709
|
+
return ComparablePrincipal.isComparablePrincipal(x)
|
|
710
|
+
? x.dedupeString()
|
|
711
|
+
: undefined;
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
exports.ComparablePrincipal = ComparablePrincipal;
|
|
715
|
+
_t = JSII_RTTI_SYMBOL_1;
|
|
716
|
+
ComparablePrincipal[_t] = { fqn: "terraconstructs.aws.iam.ComparablePrincipal", version: "0.0.8" };
|
|
717
|
+
/**
|
|
718
|
+
* An IAM principal with additional conditions specifying when the policy is in effect.
|
|
719
|
+
*
|
|
720
|
+
* For more information about conditions, see:
|
|
721
|
+
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html
|
|
722
|
+
*/
|
|
723
|
+
class PrincipalWithConditions extends PrincipalAdapter {
|
|
724
|
+
constructor(principal, conditions) {
|
|
725
|
+
super(principal);
|
|
726
|
+
this.additionalConditions = {};
|
|
727
|
+
for (const c of conditions) {
|
|
728
|
+
this.addCondition(c);
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
// ref: https://github.com/aws/aws-cdk/pull/28510/files#diff-50248f671e9b13a9cb35a62441d72832dca89b6c7ad4a88aa4fb2ec8e676b7cd
|
|
732
|
+
addToAssumeRolePolicy(doc) {
|
|
733
|
+
if (doc.node.scope === undefined) {
|
|
734
|
+
throw new Error("Cannot add a condition to a principal outside of a stack scope");
|
|
735
|
+
}
|
|
736
|
+
// Lazy import to avoid circular import dependencies during startup
|
|
737
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
738
|
+
const adapter = require("./private/adapter");
|
|
739
|
+
defaultAddPrincipalToAssumeRole(this.wrapped, new adapter.MutatingPolicyDocumentAdapter(doc, (statement) => {
|
|
740
|
+
statement.addActions(this.assumeRoleAction);
|
|
741
|
+
statement.addConditions(...this.conditions);
|
|
742
|
+
return statement;
|
|
743
|
+
}));
|
|
744
|
+
}
|
|
745
|
+
/**
|
|
746
|
+
* Add a condition to the principal
|
|
747
|
+
*/
|
|
748
|
+
addCondition(condition) {
|
|
749
|
+
if (!this.additionalConditions[condition.test]) {
|
|
750
|
+
this.additionalConditions[condition.test] = {};
|
|
751
|
+
}
|
|
752
|
+
const existingCondition = this.additionalConditions[condition.test][condition.variable];
|
|
753
|
+
if (existingCondition) {
|
|
754
|
+
this.additionalConditions[condition.test][condition.variable] = {
|
|
755
|
+
...existingCondition,
|
|
756
|
+
...condition,
|
|
757
|
+
};
|
|
758
|
+
}
|
|
759
|
+
else {
|
|
760
|
+
this.additionalConditions[condition.test][condition.variable] = condition;
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
/**
|
|
764
|
+
* Add a conditionObject to the principal
|
|
765
|
+
*
|
|
766
|
+
* A conditionObject has the format of test: { variable: value | values[] }
|
|
767
|
+
*
|
|
768
|
+
* For example:
|
|
769
|
+
*
|
|
770
|
+
* ```ts
|
|
771
|
+
* const condition1 = {'StringEquals', { 'aws:SomeField': '1' }};
|
|
772
|
+
* // or
|
|
773
|
+
* const condition2 = {'StringEquals', { 'aws:SomeField': ['1', '2'] }};
|
|
774
|
+
* ```
|
|
775
|
+
*/
|
|
776
|
+
addConditionObject(key, value) {
|
|
777
|
+
(0, policy_statement_1.validateConditionObject)(value);
|
|
778
|
+
for (const [k, v] of Object.entries(value)) {
|
|
779
|
+
if (!(0, policy_statement_1.isStringOrArrayOfStrings)(v)) {
|
|
780
|
+
throw new Error(`Fields must be either a string or an array of strings. Got ${v} for key ${k}`);
|
|
781
|
+
}
|
|
782
|
+
this.addCondition({
|
|
783
|
+
test: key,
|
|
784
|
+
variable: k,
|
|
785
|
+
values: Array.isArray(v) ? v : [v],
|
|
786
|
+
});
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
/**
|
|
790
|
+
* Adds multiple conditions to the principal
|
|
791
|
+
*
|
|
792
|
+
* Values from the conditions parameter will overwrite existing values with the same operator
|
|
793
|
+
* and key.
|
|
794
|
+
*/
|
|
795
|
+
addConditions(conditions) {
|
|
796
|
+
conditions.map((c) => {
|
|
797
|
+
this.addCondition(c);
|
|
798
|
+
});
|
|
799
|
+
}
|
|
800
|
+
/**
|
|
801
|
+
* Adds multiple conditionObjects to the principal
|
|
802
|
+
*
|
|
803
|
+
* Values from the conditions parameter will overwrite existing values with the same operator
|
|
804
|
+
* and key.
|
|
805
|
+
*/
|
|
806
|
+
addConditionObjects(conditions) {
|
|
807
|
+
for (const [key, value] of Object.entries(conditions)) {
|
|
808
|
+
this.addConditionObject(key, value);
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
/**
|
|
812
|
+
* The conditions under which the policy is in effect.
|
|
813
|
+
* See [the IAM documentation](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html).
|
|
814
|
+
*/
|
|
815
|
+
get conditions() {
|
|
816
|
+
return this.mergeConditions(this.wrapped.policyFragment.conditions, this.additionalConditions);
|
|
817
|
+
}
|
|
818
|
+
get policyFragment() {
|
|
819
|
+
return new PrincipalPolicyFragment(this.wrapped.policyFragment.principals, this.conditions);
|
|
820
|
+
}
|
|
821
|
+
toString() {
|
|
822
|
+
return this.wrapped.toString();
|
|
823
|
+
}
|
|
824
|
+
/**
|
|
825
|
+
* JSON-ify the principal
|
|
826
|
+
*
|
|
827
|
+
* Used when JSON.stringify() is called
|
|
828
|
+
*/
|
|
829
|
+
toJSON() {
|
|
830
|
+
// Have to implement toJSON() because the default will lead to infinite recursion.
|
|
831
|
+
return this.policyFragment.principalJson;
|
|
832
|
+
}
|
|
833
|
+
dedupeString() {
|
|
834
|
+
return this.appendDedupe(JSON.stringify(this.conditions));
|
|
835
|
+
}
|
|
836
|
+
mergeConditions(principalConditions, additionalConditions) {
|
|
837
|
+
const mergedConditions = {};
|
|
838
|
+
principalConditions.forEach((c) => {
|
|
839
|
+
if (!mergedConditions[c.test]) {
|
|
840
|
+
mergedConditions[c.test] = {};
|
|
841
|
+
}
|
|
842
|
+
mergedConditions[c.test][c.variable] = c;
|
|
843
|
+
});
|
|
844
|
+
Object.entries(additionalConditions).forEach(([test, condition]) => {
|
|
845
|
+
// merge the conditions if one of the additional conditions uses an
|
|
846
|
+
// operator that's already used by the principal's conditions merge the
|
|
847
|
+
// inner structure.
|
|
848
|
+
const existing = mergedConditions[test];
|
|
849
|
+
if (!existing) {
|
|
850
|
+
mergedConditions[test] = condition;
|
|
851
|
+
return; // continue
|
|
852
|
+
}
|
|
853
|
+
// TODO: Support IResolvable Condition?
|
|
854
|
+
// // if either the existing condition or the new one contain unresolved
|
|
855
|
+
// // tokens, fail the merge. this is as far as we go at this point.
|
|
856
|
+
// if (Token.isUnresolved(condition) || Token.isUnresolved(existing)) {
|
|
857
|
+
// throw new Error(
|
|
858
|
+
// `multiple "${test}" conditions cannot be merged if one of them contains an unresolved token`,
|
|
859
|
+
// );
|
|
860
|
+
// }
|
|
861
|
+
// TODO: Validate condition?
|
|
862
|
+
// validateConditionObject(existing);
|
|
863
|
+
// validateConditionObject(condition);
|
|
864
|
+
mergedConditions[test] = { ...existing, ...condition };
|
|
865
|
+
});
|
|
866
|
+
return (0, policy_statement_1.toConditions)(mergedConditions);
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
exports.PrincipalWithConditions = PrincipalWithConditions;
|
|
870
|
+
_u = JSII_RTTI_SYMBOL_1;
|
|
871
|
+
PrincipalWithConditions[_u] = { fqn: "terraconstructs.aws.iam.PrincipalWithConditions", version: "0.0.8" };
|
|
872
|
+
/**
|
|
873
|
+
* Enables session tags on role assumptions from a principal
|
|
874
|
+
*
|
|
875
|
+
* For more information on session tags, see:
|
|
876
|
+
* https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html
|
|
877
|
+
*/
|
|
878
|
+
class SessionTagsPrincipal extends PrincipalAdapter {
|
|
879
|
+
constructor(principal) {
|
|
880
|
+
super(principal);
|
|
881
|
+
}
|
|
882
|
+
// ref: https://github.com/aws/aws-cdk/pull/28510/files#diff-50248f671e9b13a9cb35a62441d72832dca89b6c7ad4a88aa4fb2ec8e676b7cd
|
|
883
|
+
addToAssumeRolePolicy(doc) {
|
|
884
|
+
// Lazy import to avoid circular import dependencies during startup
|
|
885
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
886
|
+
const adapter = require("./private/adapter");
|
|
887
|
+
defaultAddPrincipalToAssumeRole(this.wrapped, new adapter.MutatingPolicyDocumentAdapter(doc, (statement) => {
|
|
888
|
+
statement.addActions("sts:TagSession");
|
|
889
|
+
return statement;
|
|
890
|
+
}));
|
|
891
|
+
}
|
|
892
|
+
dedupeString() {
|
|
893
|
+
return this.appendDedupe("");
|
|
894
|
+
}
|
|
895
|
+
}
|
|
896
|
+
exports.SessionTagsPrincipal = SessionTagsPrincipal;
|
|
897
|
+
_v = JSII_RTTI_SYMBOL_1;
|
|
898
|
+
SessionTagsPrincipal[_v] = { fqn: "terraconstructs.aws.iam.SessionTagsPrincipal", version: "0.0.8" };
|
|
899
|
+
/**
|
|
900
|
+
* Add a principal to an AssumeRolePolicyDocument in the right way
|
|
901
|
+
*
|
|
902
|
+
* Delegate to the principal if it can do the job itself, do a default job if it can't.
|
|
903
|
+
*/
|
|
904
|
+
function defaultAddPrincipalToAssumeRole(principal, doc) {
|
|
905
|
+
if (isAssumeRolePrincipal(principal)) {
|
|
906
|
+
// Principal knows how to add itself
|
|
907
|
+
principal.addToAssumeRolePolicy(doc);
|
|
908
|
+
}
|
|
909
|
+
else {
|
|
910
|
+
// Principal can't add itself, we do it for them
|
|
911
|
+
doc.addStatements(new policy_statement_1.PolicyStatement({
|
|
912
|
+
actions: [principal.assumeRoleAction],
|
|
913
|
+
principals: [principal],
|
|
914
|
+
}));
|
|
915
|
+
}
|
|
916
|
+
}
|
|
917
|
+
exports.defaultAddPrincipalToAssumeRole = defaultAddPrincipalToAssumeRole;
|
|
918
|
+
function isAssumeRolePrincipal(principal) {
|
|
919
|
+
return !!principal.addToAssumeRolePolicy;
|
|
920
|
+
}
|
|
921
|
+
/**
|
|
922
|
+
* A lazy token that requires an instance of Stack to evaluate
|
|
923
|
+
*/
|
|
924
|
+
class AwsStackDependentToken {
|
|
925
|
+
constructor(fn) {
|
|
926
|
+
this.fn = fn;
|
|
927
|
+
// TODO: Implement stack traces
|
|
928
|
+
// ref: https://github.com/hashicorp/terraform-cdk/blob/v0.20.9/packages/cdktf/lib/tokens/private/stack-trace.ts#L9
|
|
929
|
+
// ref: https://github.com/aws/aws-cdk/blob/v2.160.0/packages/aws-cdk-lib/core/lib/stack-trace.ts#L22
|
|
930
|
+
this.creationStack = ["stack traces disabled"];
|
|
931
|
+
}
|
|
932
|
+
resolve(context) {
|
|
933
|
+
return this.fn(aws_stack_1.AwsStack.ofAwsConstruct(context.scope));
|
|
934
|
+
}
|
|
935
|
+
toString() {
|
|
936
|
+
return cdktf_1.Token.asString(this);
|
|
937
|
+
}
|
|
938
|
+
/**
|
|
939
|
+
* JSON-ify the token
|
|
940
|
+
*
|
|
941
|
+
* Used when JSON.stringify() is called
|
|
942
|
+
*/
|
|
943
|
+
toJSON() {
|
|
944
|
+
return "<unresolved-token>";
|
|
945
|
+
}
|
|
946
|
+
}
|
|
947
|
+
class ServicePrincipalToken {
|
|
948
|
+
constructor(service, opts) {
|
|
949
|
+
this.service = service;
|
|
950
|
+
this.opts = opts;
|
|
951
|
+
// TODO: Implement stack traces
|
|
952
|
+
// ref: https://github.com/hashicorp/terraform-cdk/blob/v0.20.9/packages/cdktf/lib/tokens/private/stack-trace.ts#L9
|
|
953
|
+
// ref: https://github.com/aws/aws-cdk/blob/v2.160.0/packages/aws-cdk-lib/core/lib/stack-trace.ts#L22
|
|
954
|
+
this.creationStack = ["stack traces disabled"];
|
|
955
|
+
}
|
|
956
|
+
resolve(ctx) {
|
|
957
|
+
const awsStack = aws_stack_1.AwsStack.ofAwsConstruct(ctx.scope);
|
|
958
|
+
// TODO: Does this work for Opt-In regions??
|
|
959
|
+
// https://github.com/aws/aws-cdk/blob/v2.160.0/packages/aws-cdk-lib/aws-iam/lib/principals.ts#L506-L510
|
|
960
|
+
return awsStack.servicePrincipalName(this.service, this.opts.region);
|
|
961
|
+
}
|
|
962
|
+
toString() {
|
|
963
|
+
return cdktf_1.Token.asString(this, {
|
|
964
|
+
displayHint: this.service,
|
|
965
|
+
});
|
|
966
|
+
}
|
|
967
|
+
/**
|
|
968
|
+
* JSON-ify the token
|
|
969
|
+
*
|
|
970
|
+
* Used when JSON.stringify() is called
|
|
971
|
+
*/
|
|
972
|
+
toJSON() {
|
|
973
|
+
return `<${this.service}>`;
|
|
974
|
+
}
|
|
975
|
+
}
|
|
976
|
+
/**
|
|
977
|
+
* Merge two arrays that represent IAM principals
|
|
978
|
+
*
|
|
979
|
+
* Does an in-place merge into target.
|
|
980
|
+
*/
|
|
981
|
+
function mergePrincipal(target, source) {
|
|
982
|
+
// if one represents the starPrincipal the other one must be empty
|
|
983
|
+
if ((hasStarPrincipal(target) && source.length > 0) ||
|
|
984
|
+
(hasStarPrincipal(source) && target.length > 0)) {
|
|
985
|
+
throw new Error(`Cannot merge principals ${JSON.stringify(target)} and ${JSON.stringify(source)}; if one uses a the StarPrincipal string the other one must be empty`);
|
|
986
|
+
}
|
|
987
|
+
const targetMap = new Map();
|
|
988
|
+
for (const principal of target) {
|
|
989
|
+
targetMap.set(principal.type, principal);
|
|
990
|
+
}
|
|
991
|
+
for (const sourcePrincipal of source) {
|
|
992
|
+
const { type, identifiers: sourceIdentifiers } = sourcePrincipal;
|
|
993
|
+
if (targetMap.has(type)) {
|
|
994
|
+
const targetIndentifierSet = new Set(targetMap.get(type).identifiers);
|
|
995
|
+
for (const id of sourceIdentifiers) {
|
|
996
|
+
targetIndentifierSet.add(id);
|
|
997
|
+
}
|
|
998
|
+
// Update the target identifiers in-place
|
|
999
|
+
const index = target.findIndex((principal) => principal.type === type);
|
|
1000
|
+
if (index !== -1) {
|
|
1001
|
+
target[index] = {
|
|
1002
|
+
type,
|
|
1003
|
+
identifiers: Array.from(targetIndentifierSet),
|
|
1004
|
+
};
|
|
1005
|
+
}
|
|
1006
|
+
}
|
|
1007
|
+
else {
|
|
1008
|
+
target.push({
|
|
1009
|
+
type,
|
|
1010
|
+
identifiers: [...sourceIdentifiers],
|
|
1011
|
+
});
|
|
1012
|
+
}
|
|
1013
|
+
}
|
|
1014
|
+
}
|
|
1015
|
+
exports.mergePrincipal = mergePrincipal;
|
|
1016
|
+
/**
|
|
1017
|
+
* Detect if the PrincipalProps array contains the StarPrincipal:
|
|
1018
|
+
* type = PrincipalType.ANY and identifiers = ["*"]
|
|
1019
|
+
*/
|
|
1020
|
+
function hasStarPrincipal(principals) {
|
|
1021
|
+
// TODO: Does having more than 1 principal make sense if one of them is the StarPrincipal?
|
|
1022
|
+
for (let index = 0; index < principals.length; index++) {
|
|
1023
|
+
const principal = principals[index];
|
|
1024
|
+
if (principal.type === PrincipalType.ANY &&
|
|
1025
|
+
principal.identifiers.length === 1 &&
|
|
1026
|
+
principal.identifiers[0] === "*") {
|
|
1027
|
+
return true;
|
|
1028
|
+
}
|
|
1029
|
+
}
|
|
1030
|
+
return false;
|
|
1031
|
+
}
|
|
1032
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbmNpcGFscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hd3MvaWFtL3ByaW5jaXBhbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxpQ0FBNEQ7QUFFNUQsNENBQXdDO0FBR3hDLHlEQVU0QjtBQWlDNUIsSUFBWSxhQU1YO0FBTkQsV0FBWSxhQUFhO0lBQ3ZCLDRCQUFXLENBQUE7SUFDWCx3Q0FBdUIsQ0FBQTtJQUN2QixvQ0FBbUIsQ0FBQTtJQUNuQixnREFBK0IsQ0FBQTtJQUMvQiwwQkFBUyxDQUFBO0FBQ1gsQ0FBQyxFQU5XLGFBQWEsNkJBQWIsYUFBYSxRQU14QjtBQUVELFNBQVMsb0JBQW9CLENBQUMsS0FBYTtJQUN6QyxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDM0MsT0FBTyxjQUFjLElBQUksYUFBYSxDQUFDO0FBQ3pDLENBQUM7QUFpRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQWEsdUJBQXVCO0lBQ2xDOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsUUFBUSxDQUNwQixhQUFrQixFQUNsQixpQkFBeUMsRUFBRTtRQUUzQyxPQUFPLElBQUksdUJBQXVCLENBQ2hDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxFQUNoQyxJQUFBLG9DQUFpQixFQUFDLGNBQWMsQ0FBQyxDQUNsQyxDQUFDO0lBQ0osQ0FBQztJQUVELCtDQUErQztJQUMvQyxJQUFXLGFBQWE7UUFDdEIsT0FBTyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUNELElBQVcsY0FBYztRQUN2QixPQUFPLElBQUEsa0NBQWUsRUFBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFlBQ2tCLFVBQWlDO0lBQ2pEOzs7T0FHRztJQUNhLGFBQXlCLEVBQUU7UUFMM0IsZUFBVSxHQUFW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RSxDQUFDLEdBQUcsaUJBQWlCLENBQUM7YUFDcEMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBekNELHdDQXlDQztBQUVEOzs7R0FHRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsVUFBNEI7SUFDcEQsMEZBQTBGO0lBQzFGLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDdkQsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLElBQ0UsU0FBUyxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsR0FBRztZQUNwQyxTQUFTLENBQUMsV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ2xDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUNoQyxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRva2VuLCBJUmVzb2x2YWJsZSwgSVJlc29sdmVDb250ZXh0IH0gZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBJRGVwZW5kYWJsZSB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBBd3NTdGFjayB9IGZyb20gXCIuLi9hd3Mtc3RhY2tcIjtcbmltcG9ydCB7IElPcGVuSWRDb25uZWN0UHJvdmlkZXIgfSBmcm9tIFwiLi9vaWRjLXByb3ZpZGVyXCI7XG5pbXBvcnQgeyBJUG9saWN5RG9jdW1lbnQgfSBmcm9tIFwiLi9wb2xpY3ktZG9jdW1lbnRcIjtcbmltcG9ydCB7XG4gIFBvbGljeVN0YXRlbWVudCxcbiAgQ29uZGl0aW9uLFxuICBDb25kaXRpb25zLFxuICBpc1N0cmluZ09yQXJyYXlPZlN0cmluZ3MsXG4gIHRvQ29uZGl0aW9uSnNvbixcbiAgZnJvbUNvbmRpdGlvbkpzb24sXG4gIHZhbGlkYXRlQ29uZGl0aW9uT2JqZWN0LFxuICBDb25kaXRpb25NYXAsXG4gIHRvQ29uZGl0aW9ucyxcbn0gZnJvbSBcIi4vcG9saWN5LXN0YXRlbWVudFwiO1xuaW1wb3J0IHsgSVNhbWxQcm92aWRlciB9IGZyb20gXCIuL3NhbWwtcHJvdmlkZXJcIjtcbi8qKlxuICogVGVycmFmb3JtIFByaW5jaXBhbCBQcm9wc1xuICpcbiAqIFRoZSBgcHJpbmNpcGFsc2AgYW5kIGBub3RfcHJpbmNpcGFsc2AgYmxvY2tzIG9mIGEgcG9saWN5IHN0YXRlbWVudFxuICpcbiAqIFJlZjogaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL2hhc2hpY29ycC9hd3MvbGF0ZXN0L2RvY3MvZGF0YS1zb3VyY2VzL2lhbV9wb2xpY3lfZG9jdW1lbnQjcHJpbmNpcGFscy1hbmQtbm90X3ByaW5jaXBhbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmluY2lwYWxQcm9wcyB7XG4gIC8qKlxuICAgKiBMaXN0IG9mIGlkZW50aWZpZXJzIGZvciBwcmluY2lwYWxzLlxuICAgKlxuICAgKiBXaGVuIHR5cGUgaXMgQVdTLCB0aGVzZSBhcmUgSUFNIHByaW5jaXBhbCBBUk5zLCBlLmcuLCBhcm46YXdzOmlhbTo6MTIzNDU2Nzg5MDE6cm9sZS95YWstcm9sZS5cbiAgICpcbiAgICogV2hlbiB0eXBlIGlzIFNlcnZpY2UsIHRoZXNlIGFyZSBBV1MgU2VydmljZSByb2xlcywgZS5nLiwgbGFtYmRhLmFtYXpvbmF3cy5jb20uXG4gICAqXG4gICAqIFdoZW4gdHlwZSBpcyBGZWRlcmF0ZWQsIHRoZXNlIGFyZSB3ZWIgaWRlbnRpdHkgdXNlcnMgb3IgU0FNTCBwcm92aWRlciBBUk5zLFxuICAgKiBlLmcuLCBhY2NvdW50cy5nb29nbGUuY29tIG9yIGFybjphd3M6aWFtOjoxMjM0NTY3ODkwMTpzYW1sLXByb3ZpZGVyL3lhay1zYW1sLXByb3ZpZGVyLlxuICAgKlxuICAgKiBXaGVuIHR5cGUgaXMgQ2Fub25pY2FsVXNlciwgdGhlc2UgYXJlIGNhbm9uaWNhbCB1c2VyIElEcyxcbiAgICogZS5nLiwgNzlhNTlkZjkwMGI5NDllNTVkOTZhMWU2OThmYmFjZWRmZDZlMDlkOThlYWNmOGY4ZDUyMThlN2NkNDdlZjJiZS5cbiAgICpcbiAgICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81LjY4LjAvZG9jcy9kYXRhLXNvdXJjZXMvaWFtX3BvbGljeV9kb2N1bWVudCNpZGVudGlmaWVycyBEYXRhQXdzSWFtUG9saWN5RG9jdW1lbnQjaWRlbnRpZmllcnN9XG4gICAqL1xuICByZWFkb25seSBpZGVudGlmaWVyczogc3RyaW5nW107XG4gIC8qKlxuICAgKiBUeXBlIG9mIHByaW5jaXBhbC5cbiAgICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvaGFzaGljb3JwL2F3cy81LjY4LjAvZG9jcy9kYXRhLXNvdXJjZXMvaWFtX3BvbGljeV9kb2N1bWVudCN0eXBlIERhdGFBd3NJYW1Qb2xpY3lEb2N1bWVudCN0eXBlfVxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogUHJpbmNpcGFsVHlwZTtcbn1cblxuZXhwb3J0IGVudW0gUHJpbmNpcGFsVHlwZSB7XG4gIEFXUyA9IFwiQVdTXCIsXG4gIEZFREVSQVRFRCA9IFwiRmVkZXJhdGVkXCIsXG4gIFNFUlZJQ0UgPSBcIlNlcnZpY2VcIixcbiAgQ0FOT05JQ0FMVVNFUiA9IFwiQ2Fub25pY2FsVXNlclwiLFxuICBBTlkgPSBcIipcIixcbn1cblxuZnVuY3Rpb24gaXNWYWxpZFByaW5jaXBhbFR5cGUodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB1cHBlckNhc2VWYWx1ZSA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7XG4gIHJldHVybiB1cHBlckNhc2VWYWx1ZSBpbiBQcmluY2lwYWxUeXBlO1xufVxuXG4vKipcbiAqIEFueSBvYmplY3QgdGhhdCBoYXMgYW4gYXNzb2NpYXRlZCBwcmluY2lwYWwgdGhhdCBhIHBlcm1pc3Npb24gY2FuIGJlIGdyYW50ZWQgdG9cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJR3JhbnRhYmxlIHtcbiAgLyoqXG4gICAqIFRoZSBwcmluY2lwYWwgdG8gZ3JhbnQgcGVybWlzc2lvbnMgdG9cbiAgICovXG4gIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBJUHJpbmNpcGFsO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBsb2dpY2FsIElBTSBwcmluY2lwYWwuXG4gKlxuICogQW4gSVByaW5jaXBhbCBkZXNjcmliZXMgYSBsb2dpY2FsIGVudGl0eSB0aGF0IGNhbiBwZXJmb3JtIEFXUyBBUEkgY2FsbHNcbiAqIGFnYWluc3Qgc2V0cyBvZiByZXNvdXJjZXMsIG9wdGlvbmFsbHkgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zLlxuICpcbiAqIEV4YW1wbGVzIG9mIHNpbXBsZSBwcmluY2lwYWxzIGFyZSBJQU0gb2JqZWN0cyB0aGF0IHlvdSBjcmVhdGUsIHN1Y2hcbiAqIGFzIFVzZXJzIG9yIFJvbGVzLlxuICpcbiAqIEFuIGV4YW1wbGUgb2YgYSBtb3JlIGNvbXBsZXggcHJpbmNpcGFscyBpcyBhIGBTZXJ2aWNlUHJpbmNpcGFsYCAoc3VjaCBhc1xuICogYG5ldyBTZXJ2aWNlUHJpbmNpcGFsKFwic25zLmFtYXpvbmF3cy5jb21cIilgLCB3aGljaCByZXByZXNlbnRzIHRoZSBTaW1wbGVcbiAqIE5vdGlmaWNhdGlvbnMgU2VydmljZSkuXG4gKlxuICogQSBzaW5nbGUgbG9naWNhbCBQcmluY2lwYWwgbWF5IGFsc28gbWFwIHRvIGEgc2V0IG9mIHBoeXNpY2FsIHByaW5jaXBhbHMuXG4gKiBGb3IgZXhhbXBsZSwgYG5ldyBPcmdhbml6YXRpb25QcmluY2lwYWwoJ28tMTIzNCcpYCByZXByZXNlbnRzIGFsbFxuICogaWRlbnRpdGllcyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBnaXZlbiBBV1MgT3JnYW5pemF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElQcmluY2lwYWwgZXh0ZW5kcyBJR3JhbnRhYmxlIHtcbiAgLyoqXG4gICAqIFdoZW4gdGhpcyBQcmluY2lwYWwgaXMgdXNlZCBpbiBhbiBBc3N1bWVSb2xlIHBvbGljeSwgdGhlIGFjdGlvbiB0byB1c2UuXG4gICAqL1xuICByZWFkb25seSBhc3N1bWVSb2xlQWN0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgcG9saWN5IGZyYWdtZW50IHRoYXQgaWRlbnRpZmllcyB0aGlzIHByaW5jaXBhbCBpbiBhIFBvbGljeS5cbiAgICovXG4gIHJlYWRvbmx5IHBvbGljeUZyYWdtZW50OiBQcmluY2lwYWxQb2xpY3lGcmFnbWVudDtcblxuICAvKipcbiAgICogVGhlIEFXUyBhY2NvdW50IElEIG9mIHRoaXMgcHJpbmNpcGFsLlxuICAgKiBDYW4gYmUgdW5kZWZpbmVkIHdoZW4gdGhlIGFjY291bnQgaXMgbm90IGtub3duXG4gICAqIChmb3IgZXhhbXBsZSwgZm9yIHNlcnZpY2UgcHJpbmNpcGFscykuXG4gICAqIENhbiBiZSBhIFRva2VuIC0gaW4gdGhhdCBjYXNlLFxuICAgKiBpdCdzIGFzc3VtZWQgdG8gYmUgYSByZWZlcmVuY2UgdG8gdGhlIERhdGFBd3NDYWxsZXJJZGVudGl0eVxuICAgKi9cbiAgcmVhZG9ubHkgcHJpbmNpcGFsQWNjb3VudD86IHN0cmluZztcblxuICAvKipcbiAgICogQWRkIHRvIHRoZSBwb2xpY3kgb2YgdGhpcyBwcmluY2lwYWwuXG4gICAqXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHN0YXRlbWVudCB3YXMgYWRkZWQsIGZhbHNlIGlmIHRoZSBwcmluY2lwYWwgaW5cbiAgICogcXVlc3Rpb24gZG9lcyBub3QgaGF2ZSBhIHBvbGljeSBkb2N1bWVudCB0byBhZGQgdGhlIHN0YXRlbWVudCB0by5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBhZGRUb1ByaW5jaXBhbFBvbGljeWAgaW5zdGVhZC5cbiAgICovXG4gIGFkZFRvUG9saWN5KHN0YXRlbWVudDogUG9saWN5U3RhdGVtZW50KTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQWRkIHRvIHRoZSBwb2xpY3kgb2YgdGhpcyBwcmluY2lwYWwuXG4gICAqL1xuICBhZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQ6IFBvbGljeVN0YXRlbWVudCk6IEFkZFRvUHJpbmNpcGFsUG9saWN5UmVzdWx0O1xufVxuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiB0aGUgZmllbGRzIGluIGEgUG9saWN5U3RhdGVtZW50IHRoYXQgY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgYSBwcmluY2lwYWwuXG4gKlxuICogVGhpcyBjb25zaXN0cyBvZiB0aGUgVGVycmFmb3JtIFByaW5jaXBhbFByb3BzIHJlcHJlc2VudGluZyB0aGVcbiAqIGBwcmluY2lwYWxzYCBibG9jayhzKSBpbiBhIHBvbGljeSBzdGF0ZW1lbnQuXG4gKlxuICogR2VuZXJhbGx5LCBBV1MgcHJpbmNpcGFsIEpTT04gbG9va3MgbGlrZTpcbiAqXG4gKiAgICAgeyAnPFRZUEU+JzogWydJRCcsICdJRCcsIC4uLl0gfVxuICpcbiAqIEFuZCB0aGlzIGlzIGFsc28gdGhlIHR5cGUgb2YgdGhlIGZpZWxkIGBwcmluY2lwYWxKc29uYC5cbiAqXG4gKiBIb3dldmVyLCB0aGVyZSBpcyBhIHNwZWNpYWwgdHlwZSBvZiBwcmluY2lwYWwgdGhhdCBpcyBqdXN0IHRoZSBzdHJpbmcgJyonLFxuICogd2hpY2ggaXMgdHJlYXRlZCBkaWZmZXJlbnRseSBieSBzb21lIHNlcnZpY2VzLlxuICpcbiAqIFRvIHJlcHJlc2VudCB0aGF0IHByaW5jaXBhbCwgYHByaW5jaXBhbEpzb25gIHNob3VsZCBjb250YWluIGAqYC5cbiAqIFRvIHJlcHJlc2VudCB0aGF0IHByaW5jaXBhbCBpbiBUZXJyYWZvcm0gcHJpbmNpcGFscyBibG9jayhzKSwgdGhlXG4gKiB0eXBlIHNob3VsZCBiZSBgUHJpbmNpcGFsVHlwZS5BTllgIGFuZCB0aGUgaWRlbnRpZmllcnMgc2hvdWxkIGJlIGBbJyonXWAuXG4gKi9cbmV4cG9ydCBjbGFzcyBQcmluY2lwYWxQb2xpY3lGcmFnbWVudCB7XG4gIC8qKlxuICAgKiBQYXJzZXMgYSBKU09OIG9iamVjdCB3aXRoIHRoZSBBV1MgSUFNIFByaW5jaXBhbCBzdHJ1Y3R1cmVcbiAgICpcbiAgICogUmVmZXIgdG8gdGhlIGBmcm9tUHJpbmNpcGFsSnNvbmAgYW5kIGBmcm9tQ29uZGl0aW9uSnNvbmAgZnVuY3Rpb25zIGZvciBtb3JlIGluZm9ybWF0aW9uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Kc29uKFxuICAgIHByaW5jaXBhbEpzb246IGFueSxcbiAgICBjb25kaXRpb25zSnNvbjogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9LFxuICApOiBQcmluY2lwYWxQb2xpY3lGcmFnbWVudCB7XG4gICAgcmV0dXJuIG5ldyBQcmluY2lwYWxQb2xpY3lGcmFnbWVudChcbiAgICAgIGZyb21QcmluY2lwYWxKc29uKHByaW5jaXBhbEpzb24pLFxuICAgICAgZnJvbUNvbmRpdGlvbkpzb24oY29uZGl0aW9uc0pzb24pLFxuICAgICk7XG4gIH1cblxuICAvLyBUT0RPOiBTaG91bGQgdGhpcyBhY3R1YWxseSBiZSB1c2VkIGFueXdoZXJlP1xuICBwdWJsaWMgZ2V0IHByaW5jaXBhbEpzb24oKTogQXdzUHJpbmNpcGFsSnNvbiB7XG4gICAgcmV0dXJuIHRvUHJpbmNpcGFsSnNvbiguLi50aGlzLnByaW5jaXBhbHMpO1xuICB9XG4gIHB1YmxpYyBnZXQgY29uZGl0aW9uc0pzb24oKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG4gICAgcmV0dXJuIHRvQ29uZGl0aW9uSnNvbiguLi50aGlzLmNvbmRpdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBwcmluY2lwYWxzIEFycmF5IG9mIFwicHJpbmNpcGFsc1wiIGJsb2NrIGluIGEgcG9saWN5IHN0YXRlbWVudFxuICAgKiBAcGFyYW0gY29uZGl0aW9ucyBjb25kaXRpb25zIHRoYXQgbmVlZCB0byBiZSBhcHBsaWVkIHRvIHRoaXMgcG9saWN5XG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgcHJpbmNpcGFsczogQXJyYXk8UHJpbmNpcGFsUHJvcHM+LFxuICAgIC8qKlxuICAgICAqIFRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIHRoZSBwb2xpY3kgaXMgaW4gZWZmZWN0LlxuICAgICAqIFNlZSBbdGhlIElBTSBkb2N1bWVudGF0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbi5odG1sKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgY29uZGl0aW9uczogQ29uZGl0aW9ucyA9IFtdLFxuICApIHt9XG59XG5cbi8qKlxuICogVHlwZWQgcmVwcmVzZW50YXRpb24gb2YgQVdTIFByaW5jaXBhbCBKU09OXG4gKi9cbmV4cG9ydCB0eXBlIEF3c1ByaW5jaXBhbEpzb24gPSBzdHJpbmcgfCB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdIH07XG5cbi8qKlxuICogUmVhZCBmcm9tIEFXUyBQcmluY2lwYWwgSlNPTiB0byBUZXJyYWZvcm0gcHJpbmNpcGFscyBibG9jayhzKVxuICpcbiAqIEhhbmRsZXMgc3BlY2lhbCBjYXNlOiBpZiBwcmluY2lwYWwgaXMgXCIqXCIgYW5kIHR1cm5zIGl0IGludG8gdGhlIGBTdGFyUHJpbmNpcGFsYCxcbiAqXG4gKiBFdmVuIHRob3VnaCB0aGUgSUFNIERvY3VtZW50YXRpb24gc3RhdGVzIHRoYXQgXCJQcmluY2lwYWxcIjogXCIqXCIgYW5kIFwiUHJpbmNpcGFsXCI6IHtcIkFXU1wiOiBcIipcIn0gYXJlIGVxdWl2YWxlbnQsXG4gKiB0aG9zZSBwcmluY2lwYWwgZWxlbWVudHMgaGF2ZSBkaWZmZXJlbnQgYmVoYXZpb3IgaW4gc29tZSBzaXR1YXRpb25zLCBlLmcuLCBJQU0gUm9sZSBUcnVzdCBQb2xpY3kuXG4gKlxuICogVG8gaGF2ZSBUZXJyYWZvcm0gcmVuZGVyIEpTT04gY29udGFpbmluZyBcIlByaW5jaXBhbFwiOiBcIipcIiwgdXNlIHR5cGUgPSBcIipcIiBhbmQgaWRlbnRpZmllcnMgPSBbXCIqXCJdLlxuICogVG8gaGF2ZSBUZXJyYWZvcm0gcmVuZGVyIEpTT04gY29udGFpbmluZyBcIlByaW5jaXBhbFwiOiB7XCJBV1NcIjogXCIqXCJ9LCB1c2UgdHlwZSA9IFwiQVdTXCIgYW5kIGlkZW50aWZpZXJzID0gW1wiKlwiXS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21QcmluY2lwYWxKc29uKHByaW5jaXBhbEpzb246IGFueSA9IHt9KTogUHJpbmNpcGFsUHJvcHNbXSB7XG4gIGlmICh0eXBlb2YgcHJpbmNpcGFsSnNvbiA9PT0gXCJzdHJpbmdcIikge1xuICAgIGlmIChwcmluY2lwYWxKc29uID09PSBcIipcIikge1xuICAgICAgcmV0dXJuIFt7IHR5cGU6IFByaW5jaXBhbFR5cGUuQU5ZLCBpZGVudGlmaWVyczogW1wiKlwiXSB9XTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVE9ETzogU2hvdWxkIHRoaXMgaGFuZGxlIG90aGVyIHNjZW5hcmlvcyAoaS5lLiBUb2tlbnM/KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHByaW5jaXBhbCB0eXBlOiAke3ByaW5jaXBhbEpzb259YCk7XG4gICAgfVxuICB9XG4gIGlmICh0eXBlb2YgcHJpbmNpcGFsSnNvbiAhPT0gXCJvYmplY3RcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBKU09OIElBTSBwcmluY2lwYWwgc2hvdWxkIGJlIGFuIG9iamVjdCwgZ290ICR7SlNPTi5zdHJpbmdpZnkocHJpbmNpcGFsSnNvbil9YCxcbiAgICApO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxQcmluY2lwYWxQcm9wcz4oKTtcbiAgZm9yIChjb25zdCBba2V5LCBpZGVudGlmaWVyc10gb2YgT2JqZWN0LmVudHJpZXMocHJpbmNpcGFsSnNvbikpIHtcbiAgICBpZiAoIWlzVmFsaWRQcmluY2lwYWxUeXBlKGtleSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgcHJpbmNpcGFsIHR5cGU6ICR7a2V5fSwgdmFsaWQgdmFsdWVzIGFyZTogJHtPYmplY3QudmFsdWVzKFByaW5jaXBhbFR5cGUpfWAsXG4gICAgICApO1xuICAgIH1cbiAgICByZXN1bHQucHVzaCh7XG4gICAgICBpZGVudGlmaWVyczogQXJyYXkuaXNBcnJheShpZGVudGlmaWVycykgPyBpZGVudGlmaWVycyA6IFtpZGVudGlmaWVyc10sXG4gICAgICB0eXBlOiBrZXkgYXMgUHJpbmNpcGFsVHlwZSxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENvbnZlcnQgVGVycmFmb3JtIHByaW5jaXBhbHMgYmxvY2tzIGJhY2sgdG8gQVdTIFByaW5jaXBhbCBKU09OXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1ByaW5jaXBhbEpzb24oXG4gIC4uLnByaW5jaXBhbFByb3BzOiBQcmluY2lwYWxQcm9wc1tdXG4pOiBBd3NQcmluY2lwYWxKc29uIHtcbiAgaWYgKFxuICAgIHByaW5jaXBhbFByb3BzLmxlbmd0aCA9PT0gMSAmJlxuICAgIHByaW5jaXBhbFByb3BzWzBdLnR5cGUgPT09IFByaW5jaXBhbFR5cGUuQU5ZICYmXG4gICAgcHJpbmNpcGFsUHJvcHNbMF0uaWRlbnRpZmllcnMubGVuZ3RoID09PSAxICYmXG4gICAgcHJpbmNpcGFsUHJvcHNbMF0uaWRlbnRpZmllcnNbMF0gPT09IFwiKlwiXG4gIClcbiAgICByZXR1cm4gXCIqXCI7XG5cbiAgY29uc3QgcmVzdWx0OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdIH0gPSB7fTtcbiAgZm9yIChjb25zdCBwcmluY2lwYWwgb2YgcHJpbmNpcGFsUHJvcHMpIHtcbiAgICByZXN1bHRbcHJpbmNpcGFsLnR5cGVdID1cbiAgICAgIHByaW5jaXBhbC5pZGVudGlmaWVycy5sZW5ndGggPT09IDFcbiAgICAgICAgPyBwcmluY2lwYWwuaWRlbnRpZmllcnNbMF1cbiAgICAgICAgOiBwcmluY2lwYWwuaWRlbnRpZmllcnM7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBBIHR5cGUgb2YgcHJpbmNpcGFsIHRoYXQgaGFzIG1vcmUgY29udHJvbCBvdmVyIGl0cyBvd24gcmVwcmVzZW50YXRpb24gaW4gQXNzdW1lUm9sZVBvbGljeURvY3VtZW50c1xuICpcbiAqIE1vcmUgY29tcGxleCB0eXBlcyBvZiBpZGVudGl0eSBwcm92aWRlcnMgbmVlZCBtb3JlIGNvbnRyb2wgb3ZlciBSb2xlJ3MgcG9saWN5IGRvY3VtZW50c1xuICogdGhhbiBzaW1wbHkgYHsgRWZmZWN0OiAnQWxsb3cnLCBBY3Rpb246ICdBc3N1bWVSb2xlJywgUHJpbmNpcGFsOiA8V2hhdGV2ZXI+IH1gLlxuICpcbiAqIElmIHRoYXQgY29udHJvbCBpcyBuZWNlc3NhcnksIHRoZXkgY2FuIGltcGxlbWVudCBgSUFzc3VtZVJvbGVQcmluY2lwYWxgIHRvIGdldCBmdWxsXG4gKiBhY2Nlc3MgdG8gYSBSb2xlJ3MgQXNzdW1lUm9sZVBvbGljeURvY3VtZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElBc3N1bWVSb2xlUHJpbmNpcGFsIGV4dGVuZHMgSVByaW5jaXBhbCB7XG4gIC8qKlxuICAgKiBBZGQgdGhlIHByaW5jaXBhbCB0byB0aGUgQXNzdW1lUm9sZVBvbGljeURvY3VtZW50XG4gICAqXG4gICAqIEFkZCB0aGUgc3RhdGVtZW50cyB0byB0aGUgQXNzdW1lUm9sZVBvbGljeURvY3VtZW50IG5lY2Vzc2FyeSB0byBnaXZlIHRoaXMgcHJpbmNpcGFsXG4gICAqIHBlcm1pc3Npb25zIHRvIGFzc3VtZSB0aGUgZ2l2ZW4gcm9sZS5cbiAgICovXG4gIGFkZFRvQXNzdW1lUm9sZVBvbGljeShkb2N1bWVudDogSVBvbGljeURvY3VtZW50KTogdm9pZDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgY2FsbGluZyBgYWRkVG9QcmluY2lwYWxQb2xpY3lgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkVG9QcmluY2lwYWxQb2xpY3lSZXN1bHQge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgc3RhdGVtZW50IHdhcyBhZGRlZCB0byB0aGUgaWRlbnRpdHkncyBwb2xpY2llcy5cbiAgICpcbiAgICovXG4gIHJlYWRvbmx5IHN0YXRlbWVudEFkZGVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEZXBlbmRhYmxlIHdoaWNoIGFsbG93cyBkZXBlbmRpbmcgb24gdGhlIHBvbGljeSBjaGFuZ2UgYmVpbmcgYXBwbGllZFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFJlcXVpcmVkIGlmIGBzdGF0ZW1lbnRBZGRlZGAgaXMgdHJ1ZS5cbiAgICovXG4gIHJlYWRvbmx5IHBvbGljeURlcGVuZGFibGU/OiBJRGVwZW5kYWJsZTtcbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBwb2xpY3kgcHJpbmNpcGFsc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUHJpbmNpcGFsQmFzZSBpbXBsZW1lbnRzIElBc3N1bWVSb2xlUHJpbmNpcGFsIHtcbiAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBJUHJpbmNpcGFsID0gdGhpcztcbiAgcHVibGljIHJlYWRvbmx5IHByaW5jaXBhbEFjY291bnQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBwb2xpY3kgZnJhZ21lbnQgdGhhdCBpZGVudGlmaWVzIHRoaXMgcHJpbmNpcGFsIGluIGEgUG9saWN5LlxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHBvbGljeUZyYWdtZW50OiBQcmluY2lwYWxQb2xpY3lGcmFnbWVudDtcblxuICAvKipcbiAgICogV2hlbiB0aGlzIFByaW5jaXBhbCBpcyB1c2VkIGluIGFuIEFzc3VtZVJvbGUgcG9saWN5LCB0aGUgYWN0aW9uIHRvIHVzZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhc3N1bWVSb2xlQWN0aW9uOiBzdHJpbmcgPSBcInN0czpBc3N1bWVSb2xlXCI7XG5cbiAgcHVibGljIGFkZFRvUG9saWN5KHN0YXRlbWVudDogUG9saWN5U3RhdGVtZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWRkVG9QcmluY2lwYWxQb2xpY3koc3RhdGVtZW50KS5zdGF0ZW1lbnRBZGRlZDtcbiAgfVxuXG4gIHB1YmxpYyBhZGRUb1ByaW5jaXBhbFBvbGljeShcbiAgICBfc3RhdGVtZW50OiBQb2xpY3lTdGF0ZW1lbnQsXG4gICk6IEFkZFRvUHJpbmNpcGFsUG9saWN5UmVzdWx0IHtcbiAgICAvLyBUaGlzIGJhc2UgY2xhc3MgaXMgdXNlZCBmb3Igbm9uLWlkZW50aXR5IHByaW5jaXBhbHMuIE5vbmUgb2YgdGhlbVxuICAgIC8vIGhhdmUgYSBQb2xpY3lEb2N1bWVudCB0byBhZGQgdG8uXG4gICAgcmV0dXJuIHsgc3RhdGVtZW50QWRkZWQ6IGZhbHNlIH07XG4gIH1cblxuICBwdWJsaWMgYWRkVG9Bc3N1bWVSb2xlUG9saWN5KGRvY3VtZW50OiBJUG9saWN5RG9jdW1lbnQpOiB2b2lkIHtcbiAgICAvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgcHJvdG9jb2xcbiAgICBkb2N1bWVudC5hZGRTdGF0ZW1lbnRzKFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFt0aGlzLmFzc3VtZVJvbGVBY3Rpb25dLFxuICAgICAgICBwcmluY2lwYWxzOiBbdGhpc10sXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgIC8vIFRoaXMgaXMgYSBmaXJzdCBwYXNzIHRvIG1ha2UgdGhlIG9iamVjdCByZWFkYWJsZS4gRGVzY2VuZGFudCBwcmluY2lwYWxzXG4gICAgLy8gc2hvdWxkIHJldHVybiBzb21ldGhpbmcgbmljZXIuXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMucG9saWN5RnJhZ21lbnQucHJpbmNpcGFsSnNvbik7XG4gIH1cblxuICAvKipcbiAgICogSlNPTi1pZnkgdGhlIHByaW5jaXBhbFxuICAgKlxuICAgKiBVc2VkIHdoZW4gSlNPTi5zdHJpbmdpZnkoKSBpcyBjYWxsZWRcbiAgICovXG4gIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgLy8gSGF2ZSB0byBpbXBsZW1lbnQgdG9KU09OKCkgYmVjYXVzZSB0aGUgZGVmYXVsdCB3aWxsIGxlYWQgdG8gaW5maW5pdGUgcmVjdXJzaW9uLlxuICAgIHJldHVybiB0aGlzLnBvbGljeUZyYWdtZW50LnByaW5jaXBhbEpzb247XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIG5ldyBQcmluY2lwYWxXaXRoQ29uZGl0aW9ucyB1c2luZyB0aGlzIHByaW5jaXBhbCBhcyB0aGUgYmFzZSwgd2l0aCB0aGVcbiAgICogcGFzc2VkIGNvbmRpdGlvbnMgYWRkZWQuXG4gICAqXG4gICAqIFdoZW4gdGhlcmUgaXMgYSB2YWx1ZSBmb3IgdGhlIHNhbWUgb3BlcmF0b3IgYW5kIGtleSBpbiBib3RoIHRoZSBwcmluY2lwYWwgYW5kIHRoZVxuICAgKiBjb25kaXRpb25zIHBhcmFtZXRlciwgdGhlIHZhbHVlIGZyb20gdGhlIGNvbmRpdGlvbnMgcGFyYW1ldGVyIHdpbGwgYmUgdXNlZC5cbiAgICpcbiAgICogQHJldHVybnMgYSBuZXcgUHJpbmNpcGFsV2l0aENvbmRpdGlvbnMgb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIHdpdGhDb25kaXRpb25zKC4uLmNvbmRpdGlvbnM6IENvbmRpdGlvbnMpOiBQcmluY2lwYWxCYXNlIHtcbiAgICByZXR1cm4gbmV3IFByaW5jaXBhbFdpdGhDb25kaXRpb25zKHRoaXMsIGNvbmRpdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBuZXcgcHJpbmNpcGFsIHVzaW5nIHRoaXMgcHJpbmNpcGFsIGFzIHRoZSBiYXNlLCB3aXRoIHNlc3Npb24gdGFncyBlbmFibGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyBhIG5ldyBTZXNzaW9uVGFnc1ByaW5jaXBhbCBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgd2l0aFNlc3Npb25UYWdzKCk6IFByaW5jaXBhbEJhc2Uge1xuICAgIHJldHVybiBuZXcgU2Vzc2lvblRhZ3NQcmluY2lwYWwodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoaXMgcHJpbmNpcGFsIGlzIGVxdWFsIHRvIHRoZSBnaXZlbiBwcmluY2lwYWxcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBkZWR1cGVTdHJpbmcoKTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFNwZWNpZnkgYSBwcmluY2lwYWwgYnkgdGhlIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pLlxuICogWW91IGNhbiBzcGVjaWZ5IEFXUyBhY2NvdW50cywgSUFNIHVzZXJzLCBGZWRlcmF0ZWQgU0FNTCB1c2VycywgSUFNIHJvbGVzLCBhbmQgc3BlY2lmaWMgYXNzdW1lZC1yb2xlIHNlc3Npb25zLlxuICogWW91IGNhbm5vdCBzcGVjaWZ5IElBTSBncm91cHMgb3IgaW5zdGFuY2UgcHJvZmlsZXMgYXMgcHJpbmNpcGFsc1xuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19wcmluY2lwYWwuaHRtbFxuICovXG5leHBvcnQgY2xhc3MgQXJuUHJpbmNpcGFsIGV4dGVuZHMgUHJpbmNpcGFsQmFzZSB7XG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gYXJuIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pIG9mIHRoZSBwcmluY2lwYWwgZW50aXR5IChpLmUuIGFybjphd3M6aWFtOjoxMjM0NTY3ODkwMTI6dXNlci91c2VyLW5hbWUpXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgYXJuOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIGdldCBwb2xpY3lGcmFnbWVudCgpOiBQcmluY2lwYWxQb2xpY3lGcmFnbWVudCB7XG4gICAgcmV0dXJuIG5ldyBQcmluY2lwYWxQb2xpY3lGcmFnbWVudChbXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFByaW5jaXBhbFR5cGUuQVdTLFxuICAgICAgICBpZGVudGlmaWVyczogW3RoaXMuYXJuXSxcbiAgICAgIH0sXG4gICAgXSk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGBBcm5QcmluY2lwYWwoJHt0aGlzLmFybn0pYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgYWRkaW5nIGEgY29uZGl0aW9uIHRoYXQgdGhlIHByaW5jaXBhbCBpcyBwYXJ0IG9mIHRoZSBzcGVjaWZpZWRcbiAgICogQVdTIE9yZ2FuaXphdGlvbi5cbiAgICovXG4gIHB1YmxpYyBpbk9yZ2FuaXphdGlvbihvcmdhbml6YXRpb25JZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMud2l0aENvbmRpdGlvbnMoe1xuICAgICAgdGVzdDogXCJTdHJpbmdFcXVhbHNcIixcbiAgICAgIHZhcmlhYmxlOiBcImF3czpQcmluY2lwYWxPcmdJRFwiLFxuICAgICAgdmFsdWVzOiBbb3JnYW5pemF0aW9uSWRdLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGRlZHVwZVN0cmluZygpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBgQXJuUHJpbmNpcGFsOiR7dGhpcy5hcm59YDtcbiAgfVxufVxuXG4vKipcbiAqIFNwZWNpZnkgQVdTIGFjY291bnQgSUQgYXMgdGhlIHByaW5jaXBhbCBlbnRpdHkgaW4gYSBwb2xpY3kgdG8gZGVsZWdhdGUgYXV0aG9yaXR5IHRvIHRoZSBhY2NvdW50LlxuICovXG5leHBvcnQgY2xhc3MgQWNjb3VudFByaW5jaXBhbCBleHRlbmRzIEFyblByaW5jaXBhbCB7XG4gIHB1YmxpYyByZWFkb25seSBwcmluY2lwYWxBY2NvdW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBhY2NvdW50SWQgQVdTIGFjY291bnQgSUQgKGkuZS4gJzEyMzQ1Njc4OTAxMicpXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgYWNjb3VudElkOiBhbnkpIHtcbiAgICBzdXBlcihcbiAgICAgIG5ldyBBd3NTdGFja0RlcGVuZGVudFRva2VuKFxuICAgICAgICAoYXdzU3RhY2spID0+IGBhcm46JHthd3NTdGFjay5wYXJ0aXRpb259OmlhbTo6JHthY2NvdW50SWR9OnJvb3RgLFxuICAgICAgKS50b1N0cmluZygpLFxuICAgICk7XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQoYWNjb3VudElkKSAmJiB0eXBlb2YgYWNjb3VudElkICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhY2NvdW50SWQgc2hvdWxkIGJlIG9mIHR5cGUgc3RyaW5nXCIpO1xuICAgIH1cbiAgICB0aGlzLnByaW5jaXBhbEFjY291bnQgPSBhY2NvdW50SWQ7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGBBY2NvdW50UHJpbmNpcGFsKCR7dGhpcy5hY2NvdW50SWR9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBhIHNlcnZpY2UgcHJpbmNpcGFsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VQcmluY2lwYWxPcHRzIHtcbiAgLyoqXG4gICAqIFRoZSByZWdpb24gaW4gd2hpY2ggeW91IHdhbnQgdG8gcmVmZXJlbmNlIHRoZSBzZXJ2aWNlXG4gICAqXG4gICAqIFRoaXMgaXMgb25seSBuZWNlc3NhcnkgZm9yICpjcm9zcy1yZWdpb24qIHJlZmVyZW5jZXMuXG4gICAqXG4gICAqIE5vdGU6IFdlIGFsd2F5cyByZXR1cm4gdGhlIGZ1bGwgc2VydmljZSBwcmluY2lwYWwgbmFtZSwgaW5jbHVkaW5nIHRoZSByZWdpb24uXG4gICAqIE5vcm1hbGx5LCB0aGUgcmVnaW9uIGlzIG9ubHkgcmVxdWlyZWQgZm9yICpvcHQtaW4qIHJlZ2lvbnMuIEluIHRob3NlXG4gICAqIGNhc2VzLCB0aGUgcmVnaW9uIG5hbWUgbmVlZHMgdG8gYmUgaW5jbHVkZWQgdG8gcmVmZXJlbmNlIHRoZSBjb3JyZWN0IHNlcnZpY2UgcHJpbmNpcGFsLlxuICAgKiBJbiBhbGwgb3RoZXIgY2FzZXMsIHRoZSBnbG9iYWwgc2VydmljZSBwcmluY2lwYWwgbmFtZSBpcyBzdWZmaWNpZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSByZXNvbHZpbmcgU3RhY2sncyByZWdpb24uXG4gICAqL1xuICByZWFkb25seSByZWdpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgY29uZGl0aW9ucyB0byBhZGQgdG8gdGhlIFNlcnZpY2UgUHJpbmNpcGFsXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gY29uZGl0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgY29uZGl0aW9ucz86IENvbmRpdGlvbnM7XG59XG5cbi8qKlxuICogQW4gSUFNIHByaW5jaXBhbCB0aGF0IHJlcHJlc2VudHMgYW4gQVdTIHNlcnZpY2UgKGkuZS4gYHNxcy5hbWF6b25hd3MuY29tYCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJ2aWNlUHJpbmNpcGFsIGV4dGVuZHMgUHJpbmNpcGFsQmFzZSB7XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHNlcnZpY2UgcHJpbmNpcGFsIG5hbWUgYmFzZWQgb24gdGhlIHJlZ2lvbiBpdCdzIHVzZWQgaW4uXG4gICAqXG4gICAqIFNvbWUgc2VydmljZSBwcmluY2lwYWwgbmFtZXMgdXNlZCB0byBiZSBkaWZmZXJlbnQgZm9yIGRpZmZlcmVudCBwYXJ0aXRpb25zLFxuICAgKiBhbmQgc29tZSB3ZXJlIG5vdC5cbiAgICpcbiAgICogVGhlc2UgZGF5cyBhbGwgc2VydmljZSBwcmluY2lwYWwgbmFtZXMgYXJlIHN0YW5kYXJkaXplZCwgYW5kIHRoZXkgYXJlIGFsbFxuICAgKiBvZiB0aGUgZm9ybSBgPHNlcnZpY2VuYW1lPi5hbWF6b25hd3MuY29tYC5cbiAgICpcbiAgICogVG8gYXZvaWQgYnJlYWtpbmcgY2hhbmdlcywgaGFuZGxpbmcgaXMgcHJvdmlkZWQgZm9yIHNlcnZpY2VzIGFkZGVkIHdpdGggdGhlIGZvcm1hdHMgYmVsb3csXG4gICAqIGhvd2V2ZXIsIG5vIGFkZGl0aW9uYWwgaGFuZGxpbmcgd2lsbCBiZSBhZGRlZCBmb3IgbmV3IHJlZ2lvbnMgb3IgcGFydGl0aW9ucy5cbiAgICogICAtIHMzXG4gICAqICAgLSBzMy5hbWF6b25hd3MuY29tXG4gICAqICAgLSBzMy5hbWF6b25hd3MuY29tLmNuXG4gICAqICAgLSBzMy5jMnMuaWMuZ292XG4gICAqICAgLSBzMy5zYzJzLnNnb3YuZ292XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IHByaW5jaXBhbE5hbWUgPSBpYW0uU2VydmljZVByaW5jaXBhbC5zZXJ2aWNlUHJpbmNpcGFsTmFtZSgnZWMyJyk7XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNlcnZpY2VQcmluY2lwYWxOYW1lKHNlcnZpY2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5ldyBTZXJ2aWNlUHJpbmNpcGFsVG9rZW4oc2VydmljZSwge30pLnRvU3RyaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVmZXJlbmNlIGFuIEFXUyBzZXJ2aWNlLCBvcHRpb25hbGx5IGluIGEgZ2l2ZW4gcmVnaW9uXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2aWNlIEFXUyBzZXJ2aWNlIChpLmUuIHNxcy5hbWF6b25hd3MuY29tKVxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IHNlcnZpY2U6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdHM6IFNlcnZpY2VQcmluY2lwYWxPcHRzID0ge30sXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvbGljeUZyYWdtZW50KCk6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50IHtcbiAgICByZXR1cm4gbmV3IFByaW5jaXBhbFBvbGljeUZyYWdtZW50KFxuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogUHJpbmNpcGFsVHlwZS5TRVJWSUNFLFxuICAgICAgICAgIGlkZW50aWZpZXJzOiBbXG4gICAgICAgICAgICBuZXcgU2VydmljZVByaW5jaXBhbFRva2VuKHRoaXMuc2VydmljZSwgdGhpcy5vcHRzKS50b1N0cmluZygpLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgdGhpcy5vcHRzLmNvbmRpdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYFNlcnZpY2VQcmluY2lwYWwoJHt0aGlzLnNlcnZpY2V9KWA7XG4gIH1cblxuICBwdWJsaWMgZGVkdXBlU3RyaW5nKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGBTZXJ2aWNlUHJpbmNpcGFsOiR7dGhpcy5zZXJ2aWNlfToke0pTT04uc3RyaW5naWZ5KHRoaXMub3B0cyl9YDtcbiAgfVxufVxuXG4vKipcbiAqIEEgcHJpbmNpcGFsIHRoYXQgcmVwcmVzZW50cyBhbiBBV1MgT3JnYW5pemF0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBPcmdhbml6YXRpb25QcmluY2lwYWwgZXh0ZW5kcyBQcmluY2lwYWxCYXNlIHtcbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBvcmdhbml6YXRpb25JZCBUaGUgdW5pcXVlIGlkZW50aWZpZXIgKElEKSBvZiBhbiBvcmdhbml6YXRpb24gKGkuZS4gby0xMjM0NWFiY2RlKVxuICAgKi9cbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IG9yZ2FuaXphdGlvbklkOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIGdldCBwb2xpY3lGcmFnbWVudCgpOiBQcmluY2lwYWxQb2xpY3lGcmFnbWVudCB7XG4gICAgcmV0dXJuIG5ldyBQcmluY2lwYWxQb2xpY3lGcmFnbWVudChcbiAgICAgIFt7IHR5cGU6IFByaW5jaXBhbFR5cGUuQVdTLCBpZGVudGlmaWVyczogW1wiKlwiXSB9XSxcbiAgICAgIFtcbiAgICAgICAge1xuICAgICAgICAgIHRlc3Q6IFwiU3RyaW5nRXF1YWxzXCIsXG4gICAgICAgICAgdmFyaWFibGU6IFwiYXdzOlByaW5jaXBhbE9yZ0lEXCIsXG4gICAgICAgICAgdmFsdWVzOiBbdGhpcy5vcmdhbml6YXRpb25JZF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGBPcmdhbml6YXRpb25QcmluY2lwYWwoJHt0aGlzLm9yZ2FuaXphdGlvbklkfSlgO1xuICB9XG5cbiAgcHVibGljIGRlZHVwZVN0cmluZygpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBgT3JnYW5pemF0aW9uUHJpbmNpcGFsOiR7dGhpcy5vcmdhbml6YXRpb25JZH1gO1xuICB9XG59XG5cbi8qKlxuICogQSBwb2xpY3kgcHJpbmNpcGFsIGZvciBjYW5vbmljYWxVc2VySWRzIC0gdXNlZnVsIGZvciBTMyBidWNrZXQgcG9saWNpZXMgdGhhdCB1c2VcbiAqIE9yaWdpbiBBY2Nlc3MgaWRlbnRpdGllcy5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dlbmVyYWwvbGF0ZXN0L2dyL2FjY3QtaWRlbnRpZmllcnMuaHRtbFxuICpcbiAqIGFuZFxuICpcbiAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9wcml2YXRlLWNvbnRlbnQtcmVzdHJpY3RpbmctYWNjZXNzLXRvLXMzLmh0bWxcbiAqXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIENhbm9uaWNhbFVzZXJQcmluY2lwYWwgZXh0ZW5kcyBQcmluY2lwYWxCYXNlIHtcbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBjYW5vbmljYWxVc2VySWQgdW5pcXVlIGlkZW50aWZpZXIgYXNzaWduZWQgYnkgQVdTIGZvciBldmVyeSBhY2NvdW50LlxuICAgKiAgIHJvb3QgdXNlciBhbmQgSUFNIHVzZXJzIGZvciBhbiBhY2NvdW50IGFsbCBzZWUgdGhlIHNhbWUgSUQuXG4gICAqICAgKGkuZS4gNzlhNTlkZjkwMGI5NDllNTVkOTZhMWU2OThmYmFjZWRmZDZlMDlkOThlYWNmOGY4ZDUyMThlN2NkNDdlZjJiZSlcbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBjYW5vbmljYWxVc2VySWQ6IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvbGljeUZyYWdtZW50KCk6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50IHtcbiAgICByZXR1cm4gbmV3IFByaW5jaXBhbFBvbGljeUZyYWdtZW50KFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogUHJpbmNpcGFsVHlwZS5DQU5PTklDQUxVU0VSLFxuICAgICAgICBpZGVudGlmaWVyczogW3RoaXMuY2Fub25pY2FsVXNlcklkXSxcbiAgICAgIH0sXG4gICAgXSk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGBDYW5vbmljYWxVc2VyUHJpbmNpcGFsKCR7dGhpcy5jYW5vbmljYWxVc2VySWR9KWA7XG4gIH1cblxuICBwdWJsaWMgZGVkdXBlU3RyaW5nKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGBDYW5vbmljYWxVc2VyUHJpbmNpcGFsOiR7dGhpcy5jYW5vbmljYWxVc2VySWR9YDtcbiAgfVxufVxuXG4vKipcbiAqIFByaW5jaXBhbCBlbnRpdHkgdGhhdCByZXByZXNlbnRzIGEgZmVkZXJhdGVkIGlkZW50aXR5IHByb3ZpZGVyIHN1Y2ggYXMgQW1hem9uIENvZ25pdG8sXG4gKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgdGVtcG9yYXJ5IHNlY3VyaXR5IGNyZWRlbnRpYWxzIHRvIHVzZXJzIHdobyBoYXZlIGJlZW4gYXV0aGVudGljYXRlZC5cbiAqIEFkZGl0aW9uYWwgY29uZGl0aW9uIGtleXMgYXJlIGF2YWlsYWJsZSB3aGVuIHRoZSB0ZW1wb3Jhcnkgc2VjdXJpdHkgY3JlZGVudGlhbHMgYXJlIHVzZWQgdG8gbWFrZSBhIHJlcXVlc3QuXG4gKiBZb3UgY2FuIHVzZSB0aGVzZSBrZXlzIHRvIHdyaXRlIHBvbGljaWVzIHRoYXQgbGltaXQgdGhlIGFjY2VzcyBvZiBmZWRlcmF0ZWQgdXNlcnMuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2lhbS1jb25kaXRpb24ta2V5cy5odG1sI2NvbmRpdGlvbi1rZXlzLXdpZlxuICovXG5leHBvcnQgY2xhc3MgRmVkZXJhdGVkUHJpbmNpcGFsIGV4dGVuZHMgUHJpbmNpcGFsQmFzZSB7XG4gIHB1YmxpYyByZWFkb25seSBhc3N1bWVSb2xlQWN0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIHRoZSBwb2xpY3kgaXMgaW4gZWZmZWN0LlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb25kaXRpb25zOiBDb25kaXRpb25zO1xuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gZmVkZXJhdGVkIGZlZGVyYXRlZCBpZGVudGl0eSBwcm92aWRlciAoaS5lLiAnY29nbml0by1pZGVudGl0eS5hbWF6b25hd3MuY29tJyBmb3IgdXNlcnMgYXV0aGVudGljYXRlZCB0aHJvdWdoIENvZ25pdG8pXG4gICAqIEBwYXJhbSBzZXNzaW9uVGFncyBXaGV0aGVyIHRvIGVuYWJsZSBzZXNzaW9uIHRhZ2dpbmcgKHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvaWRfc2Vzc2lvbi10YWdzLmh0bWwpXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgZmVkZXJhdGVkOiBzdHJpbmcsXG4gICAgY29uZGl0aW9uczogQ29uZGl0aW9ucyA9IFtdLFxuICAgIGFzc3VtZVJvbGVBY3Rpb246IHN0cmluZyA9IFwic3RzOkFzc3VtZVJvbGVcIixcbiAgKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuY29uZGl0aW9ucyA9IGNvbmRpdGlvbnM7XG4gICAgdGhpcy5hc3N1bWVSb2xlQWN0aW9uID0gYXNzdW1lUm9sZUFjdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcG9saWN5RnJhZ21lbnQoKTogUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQge1xuICAgIHJldHVybiBuZXcgUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQoXG4gICAgICBbeyB0eXBlOiBQcmluY2lwYWxUeXBlLkZFREVSQVRFRCwgaWRlbnRpZmllcnM6IFt0aGlzLmZlZGVyYXRlZF0gfV0sXG4gICAgICB0aGlzLmNvbmRpdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYEZlZGVyYXRlZFByaW5jaXBhbCgke3RoaXMuZmVkZXJhdGVkfSlgO1xuICB9XG5cbiAgcHVibGljIGRlZHVwZVN0cmluZygpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBgRmVkZXJhdGVkUHJpbmNpcGFsOiR7dGhpcy5mZWRlcmF0ZWR9OiR7dGhpcy5hc3N1bWVSb2xlQWN0aW9ufToke0pTT04uc3RyaW5naWZ5KHRoaXMuY29uZGl0aW9ucyl9YDtcbiAgfVxufVxuXG4vKipcbiAqIEEgcHJpbmNpcGFsIHRoYXQgcmVwcmVzZW50cyBhIGZlZGVyYXRlZCBpZGVudGl0eSBwcm92aWRlciBhcyBXZWIgSWRlbnRpdHkgc3VjaCBhcyBDb2duaXRvLCBBbWF6b24sXG4gKiBGYWNlYm9vaywgR29vZ2xlLCBldGMuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJJZGVudGl0eVByaW5jaXBhbCBleHRlbmRzIEZlZGVyYXRlZFByaW5jaXBhbCB7XG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpdHlQcm92aWRlciBpZGVudGl0eSBwcm92aWRlciAoaS5lLiAnY29nbml0by1pZGVudGl0eS5hbWF6b25hd3MuY29tJyBmb3IgdXNlcnMgYXV0aGVudGljYXRlZCB0aHJvdWdoIENvZ25pdG8pXG4gICAqIEBwYXJhbSBjb25kaXRpb25zIFRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIHRoZSBwb2xpY3kgaXMgaW4gZWZmZWN0LlxuICAgKiAgIFNlZSBbdGhlIElBTSBkb2N1bWVudGF0aW9uXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbi5odG1sKS5cbiAgICogQHBhcmFtIHNlc3Npb25UYWdzIFdoZXRoZXIgdG8gZW5hYmxlIHNlc3Npb24gdGFnZ2luZyAoc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9pZF9zZXNzaW9uLXRhZ3MuaHRtbClcbiAgICovXG4gIGNvbnN0cnVjdG9yKGlkZW50aXR5UHJvdmlkZXI6IHN0cmluZywgY29uZGl0aW9uczogQ29uZGl0aW9ucyA9IFtdKSB7XG4gICAgc3VwZXIoaWRlbnRpdHlQcm92aWRlciwgY29uZGl0aW9ucyA/PyB7fSwgXCJzdHM6QXNzdW1lUm9sZVdpdGhXZWJJZGVudGl0eVwiKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcG9saWN5RnJhZ21lbnQoKTogUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQge1xuICAgIHJldHVybiBuZXcgUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQoXG4gICAgICBbeyB0eXBlOiBQcmluY2lwYWxUeXBlLkZFREVSQVRFRCwgaWRlbnRpZmllcnM6IFt0aGlzLmZlZGVyYXRlZF0gfV0sXG4gICAgICB0aGlzLmNvbmRpdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gYFdlYklkZW50aXR5UHJpbmNpcGFsKCR7dGhpcy5mZWRlcmF0ZWR9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHByaW5jaXBhbCB0aGF0IHJlcHJlc2VudHMgYSBmZWRlcmF0ZWQgaWRlbnRpdHkgcHJvdmlkZXIgYXMgZnJvbSBhIE9wZW5JRCBDb25uZWN0IHByb3ZpZGVyLlxuICovXG5leHBvcnQgY2xhc3MgT3BlbklkQ29ubmVjdFByaW5jaXBhbCBleHRlbmRzIFdlYklkZW50aXR5UHJpbmNpcGFsIHtcbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBvcGVuSWRDb25uZWN0UHJvdmlkZXIgT3BlbklEIENvbm5lY3QgcHJvdmlkZXJcbiAgICogQHBhcmFtIGNvbmRpdGlvbnMgVGhlIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggdGhlIHBvbGljeSBpcyBpbiBlZmZlY3QuXG4gICAqICAgU2VlIFt0aGUgSUFNIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uLmh0bWwpLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgb3BlbklkQ29ubmVjdFByb3ZpZGVyOiBJT3BlbklkQ29ubmVjdFByb3ZpZGVyLFxuICAgIGNvbmRpdGlvbnM6IENvbmRpdGlvbnMgPSBbXSxcbiAgKSB7XG4gICAgc3VwZXIob3BlbklkQ29ubmVjdFByb3ZpZGVyLm9wZW5JZENvbm5lY3RQcm92aWRlckFybiwgY29uZGl0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvbGljeUZyYWdtZW50KCk6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50IHtcbiAgICByZXR1cm4gbmV3IFByaW5jaXBhbFBvbGljeUZyYWdtZW50KFxuICAgICAgW3sgdHlwZTogUHJpbmNpcGFsVHlwZS5GRURFUkFURUQsIGlkZW50aWZpZXJzOiBbdGhpcy5mZWRlcmF0ZWRdIH1dLFxuICAgICAgdGhpcy5jb25kaXRpb25zLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGBPcGVuSWRDb25uZWN0UHJpbmNpcGFsKCR7dGhpcy5mZWRlcmF0ZWR9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBQcmluY2lwYWwgZW50aXR5IHRoYXQgcmVwcmVzZW50cyBhIFNBTUwgZmVkZXJhdGVkIGlkZW50aXR5IHByb3ZpZGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBTYW1sUHJpbmNpcGFsIGV4dGVuZHMgRmVkZXJhdGVkUHJpbmNpcGFsIHtcbiAgY29uc3RydWN0b3Ioc2FtbFByb3ZpZGVyOiBJU2FtbFByb3ZpZGVyLCBjb25kaXRpb25zOiBDb25kaXRpb25zKSB7XG4gICAgc3VwZXIoc2FtbFByb3ZpZGVyLnNhbWxQcm92aWRlckFybiwgY29uZGl0aW9ucywgXCJzdHM6QXNzdW1lUm9sZVdpdGhTQU1MXCIpO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBgU2FtbFByaW5jaXBhbCgke3RoaXMuZmVkZXJhdGVkfSlgO1xuICB9XG59XG5cbi8qKlxuICogUHJpbmNpcGFsIGVudGl0eSB0aGF0IHJlcHJlc2VudHMgYSBTQU1MIGZlZGVyYXRlZCBpZGVudGl0eSBwcm92aWRlciBmb3JcbiAqIHByb2dyYW1tYXRpYyBhbmQgQVdTIE1hbmFnZW1lbnQgQ29uc29sZSBhY2Nlc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBTYW1sQ29uc29sZVByaW5jaXBhbCBleHRlbmRzIFNhbWxQcmluY2lwYWwge1xuICAvKipcbiAgICogZW51bSBQYXJ0aXRpb24ge1xuICAgKiAgIERlZmF1bHQgPSAnYXdzJyxcbiAgICogICBDbiA9ICdhd3MtY24nLFxuICAgKiAgIFVzR292ID0gJ2F3cy11cy1nb3YnLFxuICAgKiAgIFVzSXNvID0gJ2F3cy1pc28nLFxuICAgKiAgIFVzSXNvQiA9ICdhd3MtaXNvLWInLFxuICAgKiAgIFVzSXNvRiA9ICdhd3MtaXNvLWYnLFxuICAgKiAgIEV1SXNvRSA9ICdhd3MtaXNvLWUnLFxuICAgKiB9XG4gICAqIFNBTUwgU2lnbiBPbiB1cmxzIGNvdWxkIGJlLi4uXG4gICAqIFtQYXJ0aXRpb24uRGVmYXVsdF06ICdodHRwczovL3NpZ25pbi5hd3MuYW1hem9uLmNvbS9zYW1sJyxcbiAgICogW1BhcnRpdGlvbi5Dbl06ICdodHRwczovL3NpZ25pbi5hbWF6b25hd3MuY24vc2FtbCcsXG4gICAqIFtQYXJ0aXRpb24uVXNHb3ZdOiAnaHR0cHM6Ly9zaWduaW4uYW1hem9uYXdzLXVzLWdvdi5jb20vc2FtbCcsXG4gICAqIFtQYXJ0aXRpb24uVXNJc29dOiAnaHR0cHM6Ly9zaWduaW4uYzJzaG9tZS5pYy5nb3Yvc2FtbCcsXG4gICAqIFtQYXJ0aXRpb24uVXNJc29CXTogJ2h0dHBzOi8vc2lnbmluLnNjMnNob21lLnNnb3YuZ292L3NhbWwnLFxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHNhbWxQcm92aWRlciBUaGUgU0FNTCBwcm92aWRlclxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2FtbFByb3ZpZGVyOiBJU2FtbFByb3ZpZGVyLCBjb25kaXRpb25zOiBDb25kaXRpb25zID0gW10pIHtcbiAgICBzdXBlcihzYW1sUHJvdmlkZXIsIFtcbiAgICAgIC4uLmNvbmRpdGlvbnMsXG4gICAgICAvLyBUT0RPOiBoYW5kbGUgY29sbGlzaW9ucyBvbiBcIlNBTUw6YXVkXCI/XG4gICAgICB7XG4gICAgICAgIHRlc3Q6IFwiU3RyaW5nRXF1YWxzXCIsXG4gICAgICAgIHZhcmlhYmxlOiBcIlNBTUw6YXVkXCIsXG4gICAgICAgIHZhbHVlczogW1wiaHR0cHM6Ly9zaWduaW4uYXdzLmFtYXpvbi5jb20vc2FtbFwiXSxcbiAgICAgIH0sXG4gICAgXSk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGBTYW1sQ29uc29sZVByaW5jaXBhbCgke3RoaXMuZmVkZXJhdGVkfSlgO1xuICB9XG59XG5cbi8qKlxuICogVXNlIHRoZSBBV1MgYWNjb3VudCBpbnRvIHdoaWNoIGEgc3RhY2sgaXMgZGVwbG95ZWQgYXMgdGhlIHByaW5jaXBhbCBlbnRpdHkgaW4gYSBwb2xpY3lcbiAqL1xuZXhwb3J0IGNsYXNzIEFjY291bnRSb290UHJpbmNpcGFsIGV4dGVuZHMgQWNjb3VudFByaW5jaXBhbCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFxuICAgICAgbmV3IEF3c1N0YWNrRGVwZW5kZW50VG9rZW4oKGF3c1N0YWNrKSA9PiBhd3NTdGFjay5hY2NvdW50KS50b1N0cmluZygpLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIFwiQWNjb3VudFJvb3RQcmluY2lwYWwoKVwiO1xuICB9XG59XG5cbi8qKlxuICogQSBwcmluY2lwYWwgcmVwcmVzZW50aW5nIGFsbCBBV1MgaWRlbnRpdGllcyBpbiBhbGwgYWNjb3VudHNcbiAqXG4gKiBTb21lIHNlcnZpY2VzIGJlaGF2ZSBkaWZmZXJlbnRseSB3aGVuIHlvdSBzcGVjaWZ5IGBQcmluY2lwYWw6ICcqJ2BcbiAqIG9yIGBQcmluY2lwYWw6IHsgQVdTOiBcIipcIiB9YCBpbiB0aGVpciByZXNvdXJjZSBwb2xpY3kuXG4gKlxuICogYEFueVByaW5jaXBhbGAgcmVuZGVycyB0byBgUHJpbmNpcGFsOiB7IEFXUzogXCIqXCIgfWAuIFRoaXMgaXMgY29ycmVjdFxuICogbW9zdCBvZiB0aGUgdGltZSwgYnV0IGluIGNhc2VzIHdoZXJlIHlvdSBuZWVkIHRoZSBvdGhlciBwcmluY2lwYWwsXG4gKiB1c2UgYFN0YXJQcmluY2lwYWxgIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBBbnlQcmluY2lwYWwgZXh0ZW5kcyBBcm5QcmluY2lwYWwge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIipcIik7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIFwiQW55UHJpbmNpcGFsKClcIjtcbiAgfVxufVxuXG4vKipcbiAqIEEgcHJpbmNpcGFsIHJlcHJlc2VudGluZyBhbGwgaWRlbnRpdGllcyBpbiBhbGwgYWNjb3VudHNcbiAqIEBkZXByZWNhdGVkIHVzZSBgQW55UHJpbmNpcGFsYFxuICovXG5leHBvcnQgY2xhc3MgQW55b25lIGV4dGVuZHMgQW55UHJpbmNpcGFsIHt9XG5cbi8qKlxuICogQSBwcmluY2lwYWwgdGhhdCB1c2VzIGEgbGl0ZXJhbCAnKicgaW4gdGhlIElBTSBKU09OIGxhbmd1YWdlXG4gKlxuICogU29tZSBzZXJ2aWNlcyBiZWhhdmUgZGlmZmVyZW50bHkgd2hlbiB5b3Ugc3BlY2lmeSBgUHJpbmNpcGFsOiBcIipcImBcbiAqIG9yIGBQcmluY2lwYWw6IHsgQVdTOiBcIipcIiB9YCBpbiB0aGVpciByZXNvdXJjZSBwb2xpY3kuXG4gKlxuICogYFN0YXJQcmluY2lwYWxgIHJlbmRlcnMgdG8gYFByaW5jaXBhbDogKmAuIE1vc3Qgb2YgdGhlIHRpbWUsIHlvdVxuICogc2hvdWxkIHVzZSBgQW55UHJpbmNpcGFsYCBpbnN0ZWFkLlxuICovXG5leHBvcnQgY2xhc3MgU3RhclByaW5jaXBhbCBleHRlbmRzIFByaW5jaXBhbEJhc2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgcG9saWN5RnJhZ21lbnQ6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50ID1cbiAgICBuZXcgUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQoW1xuICAgICAge1xuICAgICAgICB0eXBlOiBQcmluY2lwYWxUeXBlLkFOWSxcbiAgICAgICAgaWRlbnRpZmllcnM6IFtcIipcIl0sXG4gICAgICB9LFxuICAgIF0pO1xuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gXCJTdGFyUHJpbmNpcGFsKClcIjtcbiAgfVxuXG4gIHB1YmxpYyBkZWR1cGVTdHJpbmcoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gXCJTdGFyUHJpbmNpcGFsXCI7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcHJpbmNpcGFsIHRoYXQgaGFzIG11bHRpcGxlIHR5cGVzIG9mIHByaW5jaXBhbHMuIEEgY29tcG9zaXRlIHByaW5jaXBhbCBjYW5ub3RcbiAqIGhhdmUgY29uZGl0aW9ucy4gaS5lLiBtdWx0aXBsZSBTZXJ2aWNlUHJpbmNpcGFscyB0aGF0IGZvcm0gYSBjb21wb3NpdGUgcHJpbmNpcGFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21wb3NpdGVQcmluY2lwYWwgZXh0ZW5kcyBQcmluY2lwYWxCYXNlIHtcbiAgcHVibGljIHJlYWRvbmx5IGFzc3VtZVJvbGVBY3Rpb246IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBfcHJpbmNpcGFscyA9IG5ldyBBcnJheTxJUHJpbmNpcGFsPigpO1xuXG4gIGNvbnN0cnVjdG9yKC4uLnByaW5jaXBhbHM6IElQcmluY2lwYWxbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgaWYgKHByaW5jaXBhbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiQ29tcG9zaXRlUHJpbmNpcGFscyBtdXN0IGJlIGNvbnN0cnVjdGVkIHdpdGggYXQgbGVhc3QgMSBQcmluY2lwYWwgYnV0IG5vbmUgd2VyZSBwYXNzZWQuXCIsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmFzc3VtZVJvbGVBY3Rpb24gPSBwcmluY2lwYWxzWzBdLmFzc3VtZVJvbGVBY3Rpb247XG4gICAgdGhpcy5hZGRQcmluY2lwYWxzKC4uLnByaW5jaXBhbHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgSUFNIHByaW5jaXBhbHMgdG8gdGhlIGNvbXBvc2l0ZSBwcmluY2lwYWwuIENvbXBvc2l0ZSBwcmluY2lwYWxzIGNhbm5vdCBoYXZlXG4gICAqIGNvbmRpdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBwcmluY2lwYWxzIElBTSBwcmluY2lwYWxzIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgY29tcG9zaXRlIHByaW5jaXBhbFxuICAgKi9cbiAgcHVibGljIGFkZFByaW5jaXBhbHMoLi4ucHJpbmNpcGFsczogSVByaW5jaXBhbFtdKTogdGhpcyB7XG4gICAgdGhpcy5fcHJpbmNpcGFscy5wdXNoKC4uLnByaW5jaXBhbHMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIGFkZFRvQXNzdW1lUm9sZVBvbGljeShkb2M6IElQb2xpY3lEb2N1bWVudCkge1xuICAgIGZvciAoY29uc3QgcCBvZiB0aGlzLl9wcmluY2lwYWxzKSB7XG4gICAgICBkZWZhdWx0QWRkUHJpbmNpcGFsVG9Bc3N1bWVSb2xlKHAsIGRvYyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBwb2xpY3lGcmFnbWVudCgpOiBQcmluY2lwYWxQb2xpY3lGcmFnbWVudCB7XG4gICAgLy8gV2Ugb25seSBoYXZlIGEgcHJvYmxlbSB3aXRoIGNvbmRpdGlvbnMgaWYgd2UgYXJlIHRyeWluZyB0byByZW5kZXIgY29tcG9zaXRlXG4gICAgLy8gcHJpbmNpcGFscyBpbnRvIGEgc2luZ2xlIHN0YXRlbWVudCAod2hpY2ggaXMgd2hlbiBgcG9saWN5RnJhZ21lbnRgIHdvdWxkIGdldCBjYWxsZWQpXG4gICAgZm9yIChjb25zdCBwIG9mIHRoaXMuX3ByaW5jaXBhbHMpIHtcbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gcC5wb2xpY3lGcmFnbWVudDtcbiAgICAgIGlmIChmcmFnbWVudC5jb25kaXRpb25zICYmIGZyYWdtZW50LmNvbmRpdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJDb21wb25lbnRzIG9mIGEgQ29tcG9zaXRlUHJpbmNpcGFsIG11c3Qgbm90IGhhdmUgY29uZGl0aW9ucy4gXCIgK1xuICAgICAgICAgICAgYFRyaWVkIHRvIGFkZCB0aGUgZm9sbG93aW5nIGZyYWdtZW50OiAke0pTT04uc3RyaW5naWZ5KGZyYWdtZW50KX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHByaW5jaXBhbHMgPSBuZXcgQXJyYXk8UHJpbmNpcGFsUHJvcHM+KCk7XG4gICAgZm9yIChjb25zdCBwIG9mIHRoaXMuX3ByaW5jaXBhbHMpIHtcbiAgICAgIG1lcmdlUHJpbmNpcGFsKHByaW5jaXBhbHMsIHAucG9saWN5RnJhZ21lbnQucHJpbmNpcGFscyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUHJpbmNpcGFsUG9saWN5RnJhZ21lbnQocHJpbmNpcGFscyk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGBDb21wb3NpdGVQcmluY2lwYWwoJHt0aGlzLl9wcmluY2lwYWxzfSlgO1xuICB9XG5cbiAgcHVibGljIGRlZHVwZVN0cmluZygpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGlubmVyID0gdGhpcy5fcHJpbmNpcGFscy5tYXAoQ29tcGFyYWJsZVByaW5jaXBhbC5kZWR1cGVTdHJpbmdGb3IpO1xuICAgIGlmIChpbm5lci5zb21lKCh4KSA9PiB4ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gYENvbXBvc2l0ZVByaW5jaXBhbFske2lubmVyLmpvaW4oXCIsXCIpfV1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHByaW5jaXBhbHMgdGhhdCBtYWtlIHVwIHRoZSBDb21wb3NpdGVQcmluY2lwYWxcbiAgICovXG4gIHB1YmxpYyBnZXQgcHJpbmNpcGFscygpOiBJUHJpbmNpcGFsW10ge1xuICAgIHJldHVybiB0aGlzLl9wcmluY2lwYWxzO1xuICB9XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgUHJpbmNpcGFscyB0aGF0IHdyYXAgb3RoZXIgcHJpbmNpcGFsc1xuICovXG5hYnN0cmFjdCBjbGFzcyBQcmluY2lwYWxBZGFwdGVyIGV4dGVuZHMgUHJpbmNpcGFsQmFzZSB7XG4gIHB1YmxpYyByZWFkb25seSBhc3N1bWVSb2xlQWN0aW9uID0gdGhpcy53cmFwcGVkLmFzc3VtZVJvbGVBY3Rpb247XG4gIHB1YmxpYyByZWFkb25seSBwcmluY2lwYWxBY2NvdW50ID0gdGhpcy53cmFwcGVkLnByaW5jaXBhbEFjY291bnQ7XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IHdyYXBwZWQ6IElQcmluY2lwYWwpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIGdldCBwb2xpY3lGcmFnbWVudCgpOiBQcmluY2lwYWxQb2xpY3lGcmFnbWVudCB7XG4gICAgcmV0dXJuIHRoaXMud3JhcHBlZC5wb2xpY3lGcmFnbWVudDtcbiAgfVxuXG4gIHB1YmxpYyBhZGRUb1ByaW5jaXBhbFBvbGljeShcbiAgICBzdGF0ZW1lbnQ6IFBvbGljeVN0YXRlbWVudCxcbiAgKTogQWRkVG9QcmluY2lwYWxQb2xpY3lSZXN1bHQge1xuICAgIHJldHVybiB0aGlzLndyYXBwZWQuYWRkVG9QcmluY2lwYWxQb2xpY3koc3RhdGVtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmQgdGhlIGdpdmVuIHN0cmluZyB0byB0aGUgd3JhcHBlZCBwcmluY2lwYWwncyBkZWR1cGUgc3RyaW5nIChpZiBhdmFpbGFibGUpXG4gICAqL1xuICBwcm90ZWN0ZWQgYXBwZW5kRGVkdXBlKGFwcGVuZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBpbm5lciA9IENvbXBhcmFibGVQcmluY2lwYWwuZGVkdXBlU3RyaW5nRm9yKHRoaXMud3JhcHBlZCk7XG4gICAgcmV0dXJuIGlubmVyICE9PSB1bmRlZmluZWRcbiAgICAgID8gYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfToke2lubmVyfToke2FwcGVuZH1gXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgcHJpbmNpcGFscyB0aGF0IGNhbiBiZSBjb21wYXJlZC5cbiAqXG4gKiBUaGlzIG9ubHkgbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWQgZm9yIHByaW5jaXBhbHMgdGhhdCBjb3VsZCBwb3RlbnRpYWxseSBiZSB2YWx1ZS1lcXVhbC5cbiAqIElkZW50aXR5LWVxdWFsIHByaW5jaXBhbHMgd2lsbCBiZSBoYW5kbGVkIGNvcnJlY3RseSBieSBkZWZhdWx0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElDb21wYXJhYmxlUHJpbmNpcGFsIGV4dGVuZHMgSVByaW5jaXBhbCB7XG4gIC8qKlxuICAgKiBSZXR1cm4gYSBzdHJpbmcgZm9ybWF0IG9mIHRoaXMgcHJpbmNpcGFsIHdoaWNoIHNob3VsZCBiZSBpZGVudGljYWwgaWYgdGhlIHR3b1xuICAgKiBwcmluY2lwYWxzIGFyZSB0aGUgc2FtZS5cbiAgICovXG4gIGRlZHVwZVN0cmluZygpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogSGVscGVyIGNsYXNzIGZvciB3b3JraW5nIHdpdGggYElDb21wYXJhYmxlUHJpbmNpcGFsYHNcbiAqL1xuZXhwb3J0IGNsYXNzIENvbXBhcmFibGVQcmluY2lwYWwge1xuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIGdpdmVuIHByaW5jaXBhbCBpcyBhIGNvbXBhcmFibGUgcHJpbmNpcGFsXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlzQ29tcGFyYWJsZVByaW5jaXBhbChcbiAgICB4OiBJUHJpbmNpcGFsLFxuICApOiB4IGlzIElDb21wYXJhYmxlUHJpbmNpcGFsIHtcbiAgICByZXR1cm4gXCJkZWR1cGVTdHJpbmdcIiBpbiB4O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgZGVkdXBlU3RyaW5nIG9mIHRoZSBnaXZlbiBwcmluY2lwYWwsIGlmIGF2YWlsYWJsZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBkZWR1cGVTdHJpbmdGb3IoeDogSVByaW5jaXBhbCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIENvbXBhcmFibGVQcmluY2lwYWwuaXNDb21wYXJhYmxlUHJpbmNpcGFsKHgpXG4gICAgICA/IHguZGVkdXBlU3RyaW5nKClcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogQW4gSUFNIHByaW5jaXBhbCB3aXRoIGFkZGl0aW9uYWwgY29uZGl0aW9ucyBzcGVjaWZ5aW5nIHdoZW4gdGhlIHBvbGljeSBpcyBpbiBlZmZlY3QuXG4gKlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY29uZGl0aW9ucywgc2VlOlxuICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb24uaHRtbFxuICovXG5leHBvcnQgY2xhc3MgUHJpbmNpcGFsV2l0aENvbmRpdGlvbnMgZXh0ZW5kcyBQcmluY2lwYWxBZGFwdGVyIHtcbiAgcHJpdmF0ZSBhZGRpdGlvbmFsQ29uZGl0aW9uczogQ29uZGl0aW9uTWFwID0ge307XG5cbiAgY29uc3RydWN0b3IocHJpbmNpcGFsOiBJUHJpbmNpcGFsLCBjb25kaXRpb25zOiBDb25kaXRpb25zKSB7XG4gICAgc3VwZXIocHJpbmNpcGFsKTtcbiAgICBmb3IgKGNvbnN0IGMgb2YgY29uZGl0aW9ucykge1xuICAgICAgdGhpcy5hZGRDb25kaXRpb24oYyk7XG4gICAgfVxuICB9XG5cbiAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvcHVsbC8yODUxMC9maWxlcyNkaWZmLTUwMjQ4ZjY3MWU5YjEzYTljYjM1YTYyNDQxZDcyODMyZGNhODliNmM3YWQ0YTg4YWE0ZmIyZWM4ZTY3NmI3Y2RcbiAgcHVibGljIGFkZFRvQXNzdW1lUm9sZVBvbGljeShkb2M6IElQb2xpY3lEb2N1bWVudCkge1xuICAgIGlmIChkb2Mubm9kZS5zY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiQ2Fubm90IGFkZCBhIGNvbmRpdGlvbiB0byBhIHByaW5jaXBhbCBvdXRzaWRlIG9mIGEgc3RhY2sgc2NvcGVcIixcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIExhenkgaW1wb3J0IHRvIGF2b2lkIGNpcmN1bGFyIGltcG9ydCBkZXBlbmRlbmNpZXMgZHVyaW5nIHN0YXJ0dXBcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgY29uc3QgYWRhcHRlcjogdHlwZW9mIGltcG9ydChcIi4vcHJpdmF0ZS9hZGFwdGVyXCIpID0gcmVxdWlyZShcIi4vcHJpdmF0ZS9hZGFwdGVyXCIpO1xuICAgIGRlZmF1bHRBZGRQcmluY2lwYWxUb0Fzc3VtZVJvbGUoXG4gICAgICB0aGlzLndyYXBwZWQsXG4gICAgICBuZXcgYWRhcHRlci5NdXRhdGluZ1BvbGljeURvY3VtZW50QWRhcHRlcihkb2MsIChzdGF0ZW1lbnQpID0+IHtcbiAgICAgICAgc3RhdGVtZW50LmFkZEFjdGlvbnModGhpcy5hc3N1bWVSb2xlQWN0aW9uKTtcbiAgICAgICAgc3RhdGVtZW50LmFkZENvbmRpdGlvbnMoLi4udGhpcy5jb25kaXRpb25zKTtcbiAgICAgICAgcmV0dXJuIHN0YXRlbWVudDtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgY29uZGl0aW9uIHRvIHRoZSBwcmluY2lwYWxcbiAgICovXG4gIHB1YmxpYyBhZGRDb25kaXRpb24oY29uZGl0aW9uOiBDb25kaXRpb24pIHtcbiAgICBpZiAoIXRoaXMuYWRkaXRpb25hbENvbmRpdGlvbnNbY29uZGl0aW9uLnRlc3RdKSB7XG4gICAgICB0aGlzLmFkZGl0aW9uYWxDb25kaXRpb25zW2NvbmRpdGlvbi50ZXN0XSA9IHt9O1xuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nQ29uZGl0aW9uID1cbiAgICAgIHRoaXMuYWRkaXRpb25hbENvbmRpdGlvbnNbY29uZGl0aW9uLnRlc3RdW2NvbmRpdGlvbi52YXJpYWJsZV07XG4gICAgaWYgKGV4aXN0aW5nQ29uZGl0aW9uKSB7XG4gICAgICB0aGlzLmFkZGl0aW9uYWxDb25kaXRpb25zW2NvbmRpdGlvbi50ZXN0XVtjb25kaXRpb24udmFyaWFibGVdID0ge1xuICAgICAgICAuLi5leGlzdGluZ0NvbmRpdGlvbixcbiAgICAgICAgLi4uY29uZGl0aW9uLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hZGRpdGlvbmFsQ29uZGl0aW9uc1tjb25kaXRpb24udGVzdF1bY29uZGl0aW9uLnZhcmlhYmxlXSA9IGNvbmRpdGlvbjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgY29uZGl0aW9uT2JqZWN0IHRvIHRoZSBwcmluY2lwYWxcbiAgICpcbiAgICogQSBjb25kaXRpb25PYmplY3QgaGFzIHRoZSBmb3JtYXQgb2YgdGVzdDogeyB2YXJpYWJsZTogdmFsdWUgfCB2YWx1ZXNbXSB9XG4gICAqXG4gICAqIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiBjb25zdCBjb25kaXRpb24xID0geydTdHJpbmdFcXVhbHMnLCB7ICdhd3M6U29tZUZpZWxkJzogJzEnIH19O1xuICAgKiAvLyBvclxuICAgKiBjb25zdCBjb25kaXRpb24yID0geydTdHJpbmdFcXVhbHMnLCB7ICdhd3M6U29tZUZpZWxkJzogWycxJywgJzInXSB9fTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYWRkQ29uZGl0aW9uT2JqZWN0KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHZhbGlkYXRlQ29uZGl0aW9uT2JqZWN0KHZhbHVlKTtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgIGlmICghaXNTdHJpbmdPckFycmF5T2ZTdHJpbmdzKHYpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRmllbGRzIG11c3QgYmUgZWl0aGVyIGEgc3RyaW5nIG9yIGFuIGFycmF5IG9mIHN0cmluZ3MuIEdvdCAke3Z9IGZvciBrZXkgJHtrfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLmFkZENvbmRpdGlvbih7XG4gICAgICAgIHRlc3Q6IGtleSxcbiAgICAgICAgdmFyaWFibGU6IGssXG4gICAgICAgIHZhbHVlczogQXJyYXkuaXNBcnJheSh2KSA/IHYgOiBbdl0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBtdWx0aXBsZSBjb25kaXRpb25zIHRvIHRoZSBwcmluY2lwYWxcbiAgICpcbiAgICogVmFsdWVzIGZyb20gdGhlIGNvbmRpdGlvbnMgcGFyYW1ldGVyIHdpbGwgb3ZlcndyaXRlIGV4aXN0aW5nIHZhbHVlcyB3aXRoIHRoZSBzYW1lIG9wZXJhdG9yXG4gICAqIGFuZCBrZXkuXG4gICAqL1xuICBwdWJsaWMgYWRkQ29uZGl0aW9ucyhjb25kaXRpb25zOiBDb25kaXRpb25zKSB7XG4gICAgY29uZGl0aW9ucy5tYXAoKGMpID0+IHtcbiAgICAgIHRoaXMuYWRkQ29uZGl0aW9uKGMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgbXVsdGlwbGUgY29uZGl0aW9uT2JqZWN0cyB0byB0aGUgcHJpbmNpcGFsXG4gICAqXG4gICAqIFZhbHVlcyBmcm9tIHRoZSBjb25kaXRpb25zIHBhcmFtZXRlciB3aWxsIG92ZXJ3cml0ZSBleGlzdGluZyB2YWx1ZXMgd2l0aCB0aGUgc2FtZSBvcGVyYXRvclxuICAgKiBhbmQga2V5LlxuICAgKi9cbiAgcHVibGljIGFkZENvbmRpdGlvbk9iamVjdHMoY29uZGl0aW9uczogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0pIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjb25kaXRpb25zKSkge1xuICAgICAgdGhpcy5hZGRDb25kaXRpb25PYmplY3Qoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIHRoZSBwb2xpY3kgaXMgaW4gZWZmZWN0LlxuICAgKiBTZWUgW3RoZSBJQU0gZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb24uaHRtbCkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbmRpdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWVyZ2VDb25kaXRpb25zKFxuICAgICAgdGhpcy53cmFwcGVkLnBvbGljeUZyYWdtZW50LmNvbmRpdGlvbnMsXG4gICAgICB0aGlzLmFkZGl0aW9uYWxDb25kaXRpb25zLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvbGljeUZyYWdtZW50KCk6IFByaW5jaXBhbFBvbGljeUZyYWdtZW50IHtcbiAgICByZXR1cm4gbmV3IFByaW5jaXBhbFBvbGljeUZyYWdtZW50KFxuICAgICAgdGhpcy53cmFwcGVkLnBvbGljeUZyYWdtZW50LnByaW5jaXBhbHMsXG4gICAgICB0aGlzLmNvbmRpdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy53cmFwcGVkLnRvU3RyaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogSlNPTi1pZnkgdGhlIHByaW5jaXBhbFxuICAgKlxuICAgKiBVc2VkIHdoZW4gSlNPTi5zdHJpbmdpZnkoKSBpcyBjYWxsZWRcbiAgICovXG4gIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgLy8gSGF2ZSB0byBpbXBsZW1lbnQgdG9KU09OKCkgYmVjYXVzZSB0aGUgZGVmYXVsdCB3aWxsIGxlYWQgdG8gaW5maW5pdGUgcmVjdXJzaW9uLlxuICAgIHJldHVybiB0aGlzLnBvbGljeUZyYWdtZW50LnByaW5jaXBhbEpzb247XG4gIH1cblxuICBwdWJsaWMgZGVkdXBlU3RyaW5nKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYXBwZW5kRGVkdXBlKEpTT04uc3RyaW5naWZ5KHRoaXMuY29uZGl0aW9ucykpO1xuICB9XG5cbiAgcHJpdmF0ZSBtZXJnZUNvbmRpdGlvbnMoXG4gICAgcHJpbmNpcGFsQ29uZGl0aW9uczogQ29uZGl0aW9ucyxcbiAgICBhZGRpdGlvbmFsQ29uZGl0aW9uczogQ29uZGl0aW9uTWFwLFxuICApOiBDb25kaXRpb25zIHtcbiAgICBjb25zdCBtZXJnZWRDb25kaXRpb25zOiBDb25kaXRpb25NYXAgPSB7fTtcbiAgICBwcmluY2lwYWxDb25kaXRpb25zLmZvckVhY2goKGMpID0+IHtcbiAgICAgIGlmICghbWVyZ2VkQ29uZGl0aW9uc1tjLnRlc3RdKSB7XG4gICAgICAgIG1lcmdlZENvbmRpdGlvbnNbYy50ZXN0XSA9IHt9O1xuICAgICAgfVxuICAgICAgbWVyZ2VkQ29uZGl0aW9uc1tjLnRlc3RdW2MudmFyaWFibGVdID0gYztcbiAgICB9KTtcblxuICAgIE9iamVjdC5lbnRyaWVzKGFkZGl0aW9uYWxDb25kaXRpb25zKS5mb3JFYWNoKChbdGVzdCwgY29uZGl0aW9uXSkgPT4ge1xuICAgICAgLy8gbWVyZ2UgdGhlIGNvbmRpdGlvbnMgaWYgb25lIG9mIHRoZSBhZGRpdGlvbmFsIGNvbmRpdGlvbnMgdXNlcyBhblxuICAgICAgLy8gb3BlcmF0b3IgdGhhdCdzIGFscmVhZHkgdXNlZCBieSB0aGUgcHJpbmNpcGFsJ3MgY29uZGl0aW9ucyBtZXJnZSB0aGVcbiAgICAgIC8vIGlubmVyIHN0cnVjdHVyZS5cbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gbWVyZ2VkQ29uZGl0aW9uc1t0ZXN0XTtcbiAgICAgIGlmICghZXhpc3RpbmcpIHtcbiAgICAgICAgbWVyZ2VkQ29uZGl0aW9uc1t0ZXN0XSA9IGNvbmRpdGlvbjtcbiAgICAgICAgcmV0dXJuOyAvLyBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyBUT0RPOiBTdXBwb3J0IElSZXNvbHZhYmxlIENvbmRpdGlvbj9cbiAgICAgIC8vIC8vIGlmIGVpdGhlciB0aGUgZXhpc3RpbmcgY29uZGl0aW9uIG9yIHRoZSBuZXcgb25lIGNvbnRhaW4gdW5yZXNvbHZlZFxuICAgICAgLy8gLy8gdG9rZW5zLCBmYWlsIHRoZSBtZXJnZS4gdGhpcyBpcyBhcyBmYXIgYXMgd2UgZ28gYXQgdGhpcyBwb2ludC5cbiAgICAgIC8vIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQoY29uZGl0aW9uKSB8fCBUb2tlbi5pc1VucmVzb2x2ZWQoZXhpc3RpbmcpKSB7XG4gICAgICAvLyAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIC8vICAgICBgbXVsdGlwbGUgXCIke3Rlc3R9XCIgY29uZGl0aW9ucyBjYW5ub3QgYmUgbWVyZ2VkIGlmIG9uZSBvZiB0aGVtIGNvbnRhaW5zIGFuIHVucmVzb2x2ZWQgdG9rZW5gLFxuICAgICAgLy8gICApO1xuICAgICAgLy8gfVxuXG4gICAgICAvLyBUT0RPOiBWYWxpZGF0ZSBjb25kaXRpb24/XG4gICAgICAvLyB2YWxpZGF0ZUNvbmRpdGlvbk9iamVjdChleGlzdGluZyk7XG4gICAgICAvLyB2YWxpZGF0ZUNvbmRpdGlvbk9iamVjdChjb25kaXRpb24pO1xuXG4gICAgICBtZXJnZWRDb25kaXRpb25zW3Rlc3RdID0geyAuLi5leGlzdGluZywgLi4uY29uZGl0aW9uIH07XG4gICAgfSk7XG4gICAgcmV0dXJuIHRvQ29uZGl0aW9ucyhtZXJnZWRDb25kaXRpb25zKTtcbiAgfVxufVxuXG4vKipcbiAqIEVuYWJsZXMgc2Vzc2lvbiB0YWdzIG9uIHJvbGUgYXNzdW1wdGlvbnMgZnJvbSBhIHByaW5jaXBhbFxuICpcbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHNlc3Npb24gdGFncywgc2VlOlxuICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL2lkX3Nlc3Npb24tdGFncy5odG1sXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXNzaW9uVGFnc1ByaW5jaXBhbCBleHRlbmRzIFByaW5jaXBhbEFkYXB0ZXIge1xuICBjb25zdHJ1Y3RvcihwcmluY2lwYWw6IElQcmluY2lwYWwpIHtcbiAgICBzdXBlcihwcmluY2lwYWwpO1xuICB9XG5cbiAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvcHVsbC8yODUxMC9maWxlcyNkaWZmLTUwMjQ4ZjY3MWU5YjEzYTljYjM1YTYyNDQxZDcyODMyZGNhODliNmM3YWQ0YTg4YWE0ZmIyZWM4ZTY3NmI3Y2RcbiAgcHVibGljIGFkZFRvQXNzdW1lUm9sZVBvbGljeShkb2M6IElQb2xpY3lEb2N1bWVudCkge1xuICAgIC8vIExhenkgaW1wb3J0IHRvIGF2b2lkIGNpcmN1bGFyIGltcG9ydCBkZXBlbmRlbmNpZXMgZHVyaW5nIHN0YXJ0dXBcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgY29uc3QgYWRhcHRlcjogdHlwZW9mIGltcG9ydChcIi4vcHJpdmF0ZS9hZGFwdGVyXCIpID0gcmVxdWlyZShcIi4vcHJpdmF0ZS9hZGFwdGVyXCIpO1xuICAgIGRlZmF1bHRBZGRQcmluY2lwYWxUb0Fzc3VtZVJvbGUoXG4gICAgICB0aGlzLndyYXBwZWQsXG4gICAgICBuZXcgYWRhcHRlci5NdXRhdGluZ1BvbGljeURvY3VtZW50QWRhcHRlcihkb2MsIChzdGF0ZW1lbnQpID0+IHtcbiAgICAgICAgc3RhdGVtZW50LmFkZEFjdGlvbnMoXCJzdHM6VGFnU2Vzc2lvblwiKTtcbiAgICAgICAgcmV0dXJuIHN0YXRlbWVudDtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZGVkdXBlU3RyaW5nKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYXBwZW5kRGVkdXBlKFwiXCIpO1xuICB9XG59XG5cbi8qKlxuICogQWRkIGEgcHJpbmNpcGFsIHRvIGFuIEFzc3VtZVJvbGVQb2xpY3lEb2N1bWVudCBpbiB0aGUgcmlnaHQgd2F5XG4gKlxuICogRGVsZWdhdGUgdG8gdGhlIHByaW5jaXBhbCBpZiBpdCBjYW4gZG8gdGhlIGpvYiBpdHNlbGYsIGRvIGEgZGVmYXVsdCBqb2IgaWYgaXQgY2FuJ3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0QWRkUHJpbmNpcGFsVG9Bc3N1bWVSb2xlKFxuICBwcmluY2lwYWw6IElQcmluY2lwYWwsXG4gIGRvYzogSVBvbGljeURvY3VtZW50LFxuKSB7XG4gIGlmIChpc0Fzc3VtZVJvbGVQcmluY2lwYWwocHJpbmNpcGFsKSkge1xuICAgIC8vIFByaW5jaXBhbCBrbm93cyBob3cgdG8gYWRkIGl0c2VsZlxuICAgIHByaW5jaXBhbC5hZGRUb0Fzc3VtZVJvbGVQb2xpY3koZG9jKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBQcmluY2lwYWwgY2FuJ3QgYWRkIGl0c2VsZiwgd2UgZG8gaXQgZm9yIHRoZW1cbiAgICBkb2MuYWRkU3RhdGVtZW50cyhcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbcHJpbmNpcGFsLmFzc3VtZVJvbGVBY3Rpb25dLFxuICAgICAgICBwcmluY2lwYWxzOiBbcHJpbmNpcGFsXSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNBc3N1bWVSb2xlUHJpbmNpcGFsKFxuICBwcmluY2lwYWw6IElQcmluY2lwYWwsXG4pOiBwcmluY2lwYWwgaXMgSUFzc3VtZVJvbGVQcmluY2lwYWwge1xuICByZXR1cm4gISEocHJpbmNpcGFsIGFzIElBc3N1bWVSb2xlUHJpbmNpcGFsKS5hZGRUb0Fzc3VtZVJvbGVQb2xpY3k7XG59XG5cbi8qKlxuICogQSBsYXp5IHRva2VuIHRoYXQgcmVxdWlyZXMgYW4gaW5zdGFuY2Ugb2YgU3RhY2sgdG8gZXZhbHVhdGVcbiAqL1xuY2xhc3MgQXdzU3RhY2tEZXBlbmRlbnRUb2tlbiBpbXBsZW1lbnRzIElSZXNvbHZhYmxlIHtcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0aW9uU3RhY2s6IHN0cmluZ1tdO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGZuOiAoc3BlYzogQXdzU3RhY2spID0+IGFueSkge1xuICAgIC8vIFRPRE86IEltcGxlbWVudCBzdGFjayB0cmFjZXNcbiAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9oYXNoaWNvcnAvdGVycmFmb3JtLWNkay9ibG9iL3YwLjIwLjkvcGFja2FnZXMvY2RrdGYvbGliL3Rva2Vucy9wcml2YXRlL3N0YWNrLXRyYWNlLnRzI0w5XG4gICAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNjAuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9jb3JlL2xpYi9zdGFjay10cmFjZS50cyNMMjJcbiAgICB0aGlzLmNyZWF0aW9uU3RhY2sgPSBbXCJzdGFjayB0cmFjZXMgZGlzYWJsZWRcIl07XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZShjb250ZXh0OiBJUmVzb2x2ZUNvbnRleHQpIHtcbiAgICByZXR1cm4gdGhpcy5mbihBd3NTdGFjay5vZkF3c0NvbnN0cnVjdChjb250ZXh0LnNjb3BlKSk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIFRva2VuLmFzU3RyaW5nKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTT04taWZ5IHRoZSB0b2tlblxuICAgKlxuICAgKiBVc2VkIHdoZW4gSlNPTi5zdHJpbmdpZnkoKSBpcyBjYWxsZWRcbiAgICovXG4gIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgcmV0dXJuIFwiPHVucmVzb2x2ZWQtdG9rZW4+XCI7XG4gIH1cbn1cblxuY2xhc3MgU2VydmljZVByaW5jaXBhbFRva2VuIGltcGxlbWVudHMgSVJlc29sdmFibGUge1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRpb25TdGFjazogc3RyaW5nW107XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2VydmljZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0czogU2VydmljZVByaW5jaXBhbE9wdHMsXG4gICkge1xuICAgIC8vIFRPRE86IEltcGxlbWVudCBzdGFjayB0cmFjZXNcbiAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9oYXNoaWNvcnAvdGVycmFmb3JtLWNkay9ibG9iL3YwLjIwLjkvcGFja2FnZXMvY2RrdGYvbGliL3Rva2Vucy9wcml2YXRlL3N0YWNrLXRyYWNlLnRzI0w5XG4gICAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi92Mi4xNjAuMC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9jb3JlL2xpYi9zdGFjay10cmFjZS50cyNMMjJcbiAgICB0aGlzLmNyZWF0aW9uU3RhY2sgPSBbXCJzdGFjayB0cmFjZXMgZGlzYWJsZWRcIl07XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZShjdHg6IElSZXNvbHZlQ29udGV4dCkge1xuICAgIGNvbnN0IGF3c1N0YWNrID0gQXdzU3RhY2sub2ZBd3NDb25zdHJ1Y3QoY3R4LnNjb3BlKTtcbiAgICAvLyBUT0RPOiBEb2VzIHRoaXMgd29yayBmb3IgT3B0LUluIHJlZ2lvbnM/P1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL3YyLjE2MC4wL3BhY2thZ2VzL2F3cy1jZGstbGliL2F3cy1pYW0vbGliL3ByaW5jaXBhbHMudHMjTDUwNi1MNTEwXG4gICAgcmV0dXJuIGF3c1N0YWNrLnNlcnZpY2VQcmluY2lwYWxOYW1lKHRoaXMuc2VydmljZSwgdGhpcy5vcHRzLnJlZ2lvbik7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIFRva2VuLmFzU3RyaW5nKHRoaXMsIHtcbiAgICAgIGRpc3BsYXlIaW50OiB0aGlzLnNlcnZpY2UsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSlNPTi1pZnkgdGhlIHRva2VuXG4gICAqXG4gICAqIFVzZWQgd2hlbiBKU09OLnN0cmluZ2lmeSgpIGlzIGNhbGxlZFxuICAgKi9cbiAgcHVibGljIHRvSlNPTigpIHtcbiAgICByZXR1cm4gYDwke3RoaXMuc2VydmljZX0+YDtcbiAgfVxufVxuXG4vKipcbiAqIE1lcmdlIHR3byBhcnJheXMgdGhhdCByZXByZXNlbnQgSUFNIHByaW5jaXBhbHNcbiAqXG4gKiBEb2VzIGFuIGluLXBsYWNlIG1lcmdlIGludG8gdGFyZ2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VQcmluY2lwYWwoXG4gIHRhcmdldDogUHJpbmNpcGFsUHJvcHNbXSxcbiAgc291cmNlOiBQcmluY2lwYWxQcm9wc1tdLFxuKSB7XG4gIC8vIGlmIG9uZSByZXByZXNlbnRzIHRoZSBzdGFyUHJpbmNpcGFsIHRoZSBvdGhlciBvbmUgbXVzdCBiZSBlbXB0eVxuICBpZiAoXG4gICAgKGhhc1N0YXJQcmluY2lwYWwodGFyZ2V0KSAmJiBzb3VyY2UubGVuZ3RoID4gMCkgfHxcbiAgICAoaGFzU3RhclByaW5jaXBhbChzb3VyY2UpICYmIHRhcmdldC5sZW5ndGggPiAwKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ2Fubm90IG1lcmdlIHByaW5jaXBhbHMgJHtKU09OLnN0cmluZ2lmeSh0YXJnZXQpfSBhbmQgJHtKU09OLnN0cmluZ2lmeShzb3VyY2UpfTsgaWYgb25lIHVzZXMgYSB0aGUgU3RhclByaW5jaXBhbCBzdHJpbmcgdGhlIG90aGVyIG9uZSBtdXN0IGJlIGVtcHR5YCxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgdGFyZ2V0TWFwOiBNYXA8UHJpbmNpcGFsVHlwZSwgUHJpbmNpcGFsUHJvcHM+ID0gbmV3IE1hcCgpO1xuICBmb3IgKGNvbnN0IHByaW5jaXBhbCBvZiB0YXJnZXQpIHtcbiAgICB0YXJnZXRNYXAuc2V0KHByaW5jaXBhbC50eXBlLCBwcmluY2lwYWwpO1xuICB9XG5cbiAgZm9yIChjb25zdCBzb3VyY2VQcmluY2lwYWwgb2Ygc291cmNlKSB7XG4gICAgY29uc3QgeyB0eXBlLCBpZGVudGlmaWVyczogc291cmNlSWRlbnRpZmllcnMgfSA9IHNvdXJjZVByaW5jaXBhbDtcbiAgICBpZiAodGFyZ2V0TWFwLmhhcyh0eXBlKSkge1xuICAgICAgY29uc3QgdGFyZ2V0SW5kZW50aWZpZXJTZXQgPSBuZXcgU2V0KHRhcmdldE1hcC5nZXQodHlwZSkhLmlkZW50aWZpZXJzKTtcbiAgICAgIGZvciAoY29uc3QgaWQgb2Ygc291cmNlSWRlbnRpZmllcnMpIHtcbiAgICAgICAgdGFyZ2V0SW5kZW50aWZpZXJTZXQuYWRkKGlkKTtcbiAgICAgIH1cbiAgICAgIC8vIFVwZGF0ZSB0aGUgdGFyZ2V0IGlkZW50aWZpZXJzIGluLXBsYWNlXG4gICAgICBjb25zdCBpbmRleCA9IHRhcmdldC5maW5kSW5kZXgoKHByaW5jaXBhbCkgPT4gcHJpbmNpcGFsLnR5cGUgPT09IHR5cGUpO1xuICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICB0YXJnZXRbaW5kZXhdID0ge1xuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgaWRlbnRpZmllcnM6IEFycmF5LmZyb20odGFyZ2V0SW5kZW50aWZpZXJTZXQpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQucHVzaCh7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIGlkZW50aWZpZXJzOiBbLi4uc291cmNlSWRlbnRpZmllcnNdLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRGV0ZWN0IGlmIHRoZSBQcmluY2lwYWxQcm9wcyBhcnJheSBjb250YWlucyB0aGUgU3RhclByaW5jaXBhbDpcbiAqIHR5cGUgPSBQcmluY2lwYWxUeXBlLkFOWSBhbmQgaWRlbnRpZmllcnMgPSBbXCIqXCJdXG4gKi9cbmZ1bmN0aW9uIGhhc1N0YXJQcmluY2lwYWwocHJpbmNpcGFsczogUHJpbmNpcGFsUHJvcHNbXSkge1xuICAvLyBUT0RPOiBEb2VzIGhhdmluZyBtb3JlIHRoYW4gMSBwcmluY2lwYWwgbWFrZSBzZW5zZSBpZiBvbmUgb2YgdGhlbSBpcyB0aGUgU3RhclByaW5jaXBhbD9cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHByaW5jaXBhbHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgcHJpbmNpcGFsID0gcHJpbmNpcGFsc1tpbmRleF07XG4gICAgaWYgKFxuICAgICAgcHJpbmNpcGFsLnR5cGUgPT09IFByaW5jaXBhbFR5cGUuQU5ZICYmXG4gICAgICBwcmluY2lwYWwuaWRlbnRpZmllcnMubGVuZ3RoID09PSAxICYmXG4gICAgICBwcmluY2lwYWwuaWRlbnRpZmllcnNbMF0gPT09IFwiKlwiXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuIl19
|