cdk-opennext 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +34 -14
- package/API.md +23 -1
- package/README.md +79 -1
- package/lib/open-next.d.ts +15 -1
- package/lib/open-next.js +18 -9
- package/package.json +1 -1
package/.jsii
CHANGED
|
@@ -8426,7 +8426,7 @@
|
|
|
8426
8426
|
},
|
|
8427
8427
|
"name": "cdk-opennext",
|
|
8428
8428
|
"readme": {
|
|
8429
|
-
"markdown": "# About\n\nCDK construct to deploy a NextJs 15 or higher application using the\n[OpenNext AWS adapter](https://github.com/opennextjs/opennextjs-aws).\n\nIt works best if [deployed in an Nx\nmonorepo](https://opennext.js.org/aws/config/nx).\n\nThis OpenNext CDK construct is based on [the reference\nconstruct](https://opennext.js.org/aws/reference-implementation)\nprovided by OpenNext. The example has been modernised, and the deploy\nto ECS option has been removed.\n\n# Usage\n\n1. Install:\n\n```sh\nnpm install esbuild @opennextjs/aws cdk-opennext\n```\n\n2. Build your app: `npx next build`\n\n3. Build with open-next: `npx open-next build`\n\n4. Add the `NextjsSite` construct:\n\n```typescript\nimport { NextjsSite } from \"cdk-opennext\"\n\nconst site = new NextjsSite(this, \"NextjsSite\", {\n openNextPath: \".open-next\",\n})\n```\n\n`openNextPath` is optional and defaults to \".open-next\".\n\nYou can customize the Lambda function configuration using `defaultFunctionProps`:\n\n```typescript\nimport { NextjsSite } from \"cdk-opennext\"\nimport { Duration } from \"aws-cdk-lib/core\"\n\nconst site = new NextjsSite(this, \"NextjsSite\", {\n defaultFunctionProps: {\n memorySize: 2048,\n timeout: Duration.seconds(30),\n environment: {\n MY_ENV_VAR: \"value\",\n },\n },\n})\n```\n\n# How it works\n\nThis package assumes that the Next and OpenNext build are done outside\nof this construct. Therefore this package does not pull in the\n`@opennextjs/aws` package, but it should be a dependency of your package.\n\nObviously you don't wantt to build this manually all the time, that's\nwhere Nx comes in.\n\n## Use with Nx\n\nConfiguring Nx is also covered in [the OpeNext documentation](https://opennext.js.org/aws/config/nx).\n\nIn your Nx `project.json` add a \"build\" target to build next:\n\n```json\n\"build\": {\n \"options\": {\n \"command\": \"next build\"\n },\n \"inputs\": [\n \"default\",\n \"^production\",\n \"!{projectRoot}/.next\",\n \"!{projectRoot}/.open-next\",\n \"!{projectRoot}/open-next.config.ts\",\n \"!{projectRoot}/cdk.json\",\n \"!{projectRoot}/cdk.context.json\"\n ],\n \"outputs\": [\"{projectRoot}/.next\"]\n},\n```\n\nIf you enable caching, it will only build when your NextJs app has actually changed.\n\nThen add a target to build OpenNext:\n\n```json\n\"build-open-next\": {\n \"executor\": \"nx:run-commands\",\n \"dependsOn\": [\"build\"],\n \"cache\": true,\n \"inputs\": [\"{projectRoot}/open-next.config.ts\", \"{projectRoot}/.next\"],\n \"outputs\": [\"{projectRoot}/.open-next\"],\n \"options\": {\n \"cwd\": \"{projectRoot}\",\n \"command\": \"open-next build\"\n }\n},\n```\n\nAnd finally for your cdk deploy target, depend on the open next build:\n\n```json\n\"deploy\": {\n \"dependsOn\": [\"build-open-next\"]\n}\n```\n\nSet the output to standalone in `next.config.ts`, this is key:\n\n```ts\nconst nextConfig: NextConfig = {\n output: \"standalone\",\n ...\n}\n```\n\nYour `open-next.config.ts` can look like this:\n\n```ts\nimport type { OpenNextConfig } from \"@opennextjs/aws/types/open-next\"\n\nconst config = {\n default: {\n install: {\n packages: [\"@swc/helpers@0.5.15\", \"styled-jsx@5.1.6\", \"@next/env@16.0.1\", \"pg\"],\n arch: \"arm64\",\n },\n },\n buildCommand: \"exit 0\", // Nx builds Next for us\n packageJsonPath: \"../../\", // Root directory of monorepo\n} satisfies OpenNextConfig\n\nexport default config\n```\n\nThe packages to install depend on your particular config. If you don't\nuse postgres for example, remove \"pg\".\n\n# SST v2 compatibility\n\nSwitching to this construct is a fairly major update. All functions will be replaced.\n\nNot yet implemented functionality:\n\n- [ ] Warmer function\n\n# Comparison to other implementations\n\n- [SST v2](https://github.com/sst/v2): this is what I used in the\n past, but it's now community supported, PRs are being merged slowly,\n and it's getting very hard to integrate in modern monorepos.\n- [cdk-nextjs-standalone](https://github.com/jetbridge/cdk-nextjs/):\n seems actively maintained, but README.md feels very dated. It's now\n also based on OpenNext but unclear how it tracks against OpenNext.\n- [cdklabs/cdk-nextjs](https://github.com/cdklabs/cdk-nextjs): not\n based on the OpenNext adapter. Needs NAT gateway and EFS, so very\n expensive to run.\n- [open-next-cdk](https://github.com/datasprayio/open-next-cdk): no\n longer maintained it seems\n"
|
|
8429
|
+
"markdown": "# About\n\nCDK construct to deploy a NextJs 15 or higher application using the\n[OpenNext AWS adapter](https://github.com/opennextjs/opennextjs-aws).\n\nIt works best if [deployed in an Nx\nmonorepo](https://opennext.js.org/aws/config/nx).\n\nThis OpenNext CDK construct is based on [the reference\nconstruct](https://opennext.js.org/aws/reference-implementation)\nprovided by OpenNext. The example has been modernised, and the deploy\nto ECS option has been removed.\n\n# Usage\n\n1. Install:\n\n```sh\nnpm install --save-dev esbuild @opennextjs/aws cdk-opennext\n```\n\n2. Build your app: `npx next build`\n\n3. Build with open-next: `npx open-next build`\n\n4. Add the `NextjsSite` construct:\n\n```typescript\nimport { NextjsSite } from \"cdk-opennext\"\n\nconst site = new NextjsSite(this, \"NextjsSite\", {\n openNextPath: \".open-next\",\n})\n```\n\n`openNextPath` is optional and defaults to \".open-next\".\n\nYou can customize the Lambda function configuration using `defaultFunctionProps`:\n\n```typescript\nimport { NextjsSite } from \"cdk-opennext\"\nimport { Duration } from \"aws-cdk-lib/core\"\n\nconst site = new NextjsSite(this, \"NextjsSite\", {\n defaultFunctionProps: {\n memorySize: 2048,\n timeout: Duration.seconds(30),\n environment: {\n MY_ENV_VAR: \"value\",\n },\n },\n})\n```\n\n## Custom Domain\n\nYou can configure a custom domain in three ways:\n\n### Option 1: Route 53 Hosted Zone (automatic certificate and DNS)\n\nProvide a hosted zone and the construct will automatically create a DNS-validated\ncertificate and set up A/AAAA records:\n\n```typescript\nimport { NextjsSite } from \"cdk-opennext\"\nimport { HostedZone } from \"aws-cdk-lib/aws-route53\"\n\nconst hostedZone = HostedZone.fromLookup(this, \"HostedZone\", {\n domainName: \"example.com\",\n})\n\nconst site = new NextjsSite(this, \"NextjsSite\", {\n customDomain: {\n domainName: \"app.example.com\",\n hostedZone: hostedZone,\n },\n})\n```\n\n### Option 2: Bring Your Own Certificate (external DNS)\n\nProvide your own ACM certificate when DNS is managed externally. The certificate\nmust be in us-east-1 for CloudFront:\n\n```typescript\nimport { NextjsSite } from \"cdk-opennext\"\nimport { Certificate } from \"aws-cdk-lib/aws-certificatemanager\"\n\nconst certificate = Certificate.fromCertificateArn(\n this,\n \"Certificate\",\n \"arn:aws:acm:us-east-1:123456789012:certificate/...\"\n)\n\nconst site = new NextjsSite(this, \"NextjsSite\", {\n customDomain: {\n domainName: \"app.example.com\",\n certificate: certificate,\n },\n})\n// Configure your DNS provider to point app.example.com to site.distribution.distributionDomainName\n```\n\n### Option 3: Bring Your Own Certificate with Route 53 DNS\n\nProvide both a certificate and hosted zone to use your own certificate while\nstill having the construct manage DNS records:\n\n```typescript\nimport { NextjsSite } from \"cdk-opennext\"\nimport { Certificate } from \"aws-cdk-lib/aws-certificatemanager\"\nimport { HostedZone } from \"aws-cdk-lib/aws-route53\"\n\nconst hostedZone = HostedZone.fromLookup(this, \"HostedZone\", {\n domainName: \"example.com\",\n})\n\nconst certificate = Certificate.fromCertificateArn(\n this,\n \"Certificate\",\n \"arn:aws:acm:us-east-1:123456789012:certificate/...\"\n)\n\nconst site = new NextjsSite(this, \"NextjsSite\", {\n customDomain: {\n domainName: \"app.example.com\",\n hostedZone: hostedZone,\n certificate: certificate,\n },\n})\n```\n\n# How it works\n\nThis package assumes that the Next and OpenNext build are done outside\nof this construct. Therefore this package does not pull in the\n`@opennextjs/aws` package, but it should be a dependency of your package.\n\nObviously you don't wantt to build this manually all the time, that's\nwhere Nx comes in.\n\n## Use with Nx\n\nConfiguring Nx is also covered in [the OpeNext documentation](https://opennext.js.org/aws/config/nx).\n\nIn your Nx `project.json` add a \"build\" target to build next:\n\n```json\n\"build\": {\n \"options\": {\n \"command\": \"next build\"\n },\n \"inputs\": [\n \"default\",\n \"^production\",\n \"!{projectRoot}/.next\",\n \"!{projectRoot}/.open-next\",\n \"!{projectRoot}/open-next.config.ts\",\n \"!{projectRoot}/cdk.json\",\n \"!{projectRoot}/cdk.context.json\"\n ],\n \"outputs\": [\"{projectRoot}/.next\"]\n},\n```\n\nIf you enable caching, it will only build when your NextJs app has actually changed.\n\nThen add a target to build OpenNext:\n\n```json\n\"build-open-next\": {\n \"executor\": \"nx:run-commands\",\n \"dependsOn\": [\"build\"],\n \"cache\": true,\n \"inputs\": [\"{projectRoot}/open-next.config.ts\", \"{projectRoot}/.next\"],\n \"outputs\": [\"{projectRoot}/.open-next\"],\n \"options\": {\n \"cwd\": \"{projectRoot}\",\n \"command\": \"open-next build\"\n }\n},\n```\n\nAnd finally for your cdk deploy target, depend on the open next build:\n\n```json\n\"deploy\": {\n \"dependsOn\": [\"build-open-next\"]\n}\n```\n\nSet the output to standalone in `next.config.ts`, this is key:\n\n```ts\nconst nextConfig: NextConfig = {\n output: \"standalone\",\n ...\n}\n```\n\nYour `open-next.config.ts` can look like this:\n\n```ts\nimport type { OpenNextConfig } from \"@opennextjs/aws/types/open-next\"\n\nconst config = {\n default: {\n install: {\n packages: [\"@swc/helpers@0.5.15\", \"styled-jsx@5.1.6\", \"@next/env@16.0.1\", \"pg\"],\n arch: \"arm64\",\n },\n },\n buildCommand: \"exit 0\", // Nx builds Next for us\n packageJsonPath: \"../../\", // Root directory of monorepo\n} satisfies OpenNextConfig\n\nexport default config\n```\n\nThe packages to install depend on your particular config. If you don't\nuse postgres for example, remove \"pg\".\n\n# SST v2 compatibility\n\nSwitching to this construct is a fairly major update. All functions will be replaced.\n\nNot yet implemented functionality:\n\n- [ ] Warmer function\n\n# Comparison to other implementations\n\n- [SST v2](https://github.com/sst/v2): this is what I used in the\n past, but it's now community supported, PRs are being merged slowly,\n and it's getting very hard to integrate in modern monorepos.\n- [cdk-nextjs-standalone](https://github.com/jetbridge/cdk-nextjs/):\n seems actively maintained, but README.md feels very dated. It's now\n also based on OpenNext but unclear how it tracks against OpenNext.\n- [cdklabs/cdk-nextjs](https://github.com/cdklabs/cdk-nextjs): not\n based on the OpenNext adapter. Needs NAT gateway and EFS, so very\n expensive to run.\n- [open-next-cdk](https://github.com/datasprayio/open-next-cdk): no\n longer maintained it seems\n"
|
|
8430
8430
|
},
|
|
8431
8431
|
"repository": {
|
|
8432
8432
|
"type": "git",
|
|
@@ -8513,15 +8513,35 @@
|
|
|
8513
8513
|
{
|
|
8514
8514
|
"abstract": true,
|
|
8515
8515
|
"docs": {
|
|
8516
|
+
"remarks": "Required if `hostedZone` is not provided. The certificate must be in\nus-east-1 for CloudFront distributions.\n\nWhen provided without `hostedZone`, no DNS aliases will be created\nand you must configure DNS records externally.",
|
|
8517
|
+
"stability": "stable",
|
|
8518
|
+
"summary": "The ACM certificate to use for the custom domain."
|
|
8519
|
+
},
|
|
8520
|
+
"immutable": true,
|
|
8521
|
+
"locationInModule": {
|
|
8522
|
+
"filename": "src/open-next.ts",
|
|
8523
|
+
"line": 129
|
|
8524
|
+
},
|
|
8525
|
+
"name": "certificate",
|
|
8526
|
+
"optional": true,
|
|
8527
|
+
"type": {
|
|
8528
|
+
"fqn": "aws-cdk-lib.aws_certificatemanager.ICertificate"
|
|
8529
|
+
}
|
|
8530
|
+
},
|
|
8531
|
+
{
|
|
8532
|
+
"abstract": true,
|
|
8533
|
+
"docs": {
|
|
8534
|
+
"remarks": "Required if `certificate` is not provided. When provided, a DNS-validated\ncertificate will be created automatically and DNS aliases will be set up.",
|
|
8516
8535
|
"stability": "stable",
|
|
8517
8536
|
"summary": "Import the underlying Route 53 hosted zone."
|
|
8518
8537
|
},
|
|
8519
8538
|
"immutable": true,
|
|
8520
8539
|
"locationInModule": {
|
|
8521
8540
|
"filename": "src/open-next.ts",
|
|
8522
|
-
"line":
|
|
8541
|
+
"line": 118
|
|
8523
8542
|
},
|
|
8524
8543
|
"name": "hostedZone",
|
|
8544
|
+
"optional": true,
|
|
8525
8545
|
"type": {
|
|
8526
8546
|
"fqn": "aws-cdk-lib.aws_route53.IHostedZone"
|
|
8527
8547
|
}
|
|
@@ -8542,7 +8562,7 @@
|
|
|
8542
8562
|
},
|
|
8543
8563
|
"locationInModule": {
|
|
8544
8564
|
"filename": "src/open-next.ts",
|
|
8545
|
-
"line":
|
|
8565
|
+
"line": 186
|
|
8546
8566
|
},
|
|
8547
8567
|
"parameters": [
|
|
8548
8568
|
{
|
|
@@ -8568,7 +8588,7 @@
|
|
|
8568
8588
|
"kind": "class",
|
|
8569
8589
|
"locationInModule": {
|
|
8570
8590
|
"filename": "src/open-next.ts",
|
|
8571
|
-
"line":
|
|
8591
|
+
"line": 157
|
|
8572
8592
|
},
|
|
8573
8593
|
"name": "NextjsSite",
|
|
8574
8594
|
"properties": [
|
|
@@ -8579,7 +8599,7 @@
|
|
|
8579
8599
|
"immutable": true,
|
|
8580
8600
|
"locationInModule": {
|
|
8581
8601
|
"filename": "src/open-next.ts",
|
|
8582
|
-
"line":
|
|
8602
|
+
"line": 180
|
|
8583
8603
|
},
|
|
8584
8604
|
"name": "customDomainUrl",
|
|
8585
8605
|
"type": {
|
|
@@ -8593,7 +8613,7 @@
|
|
|
8593
8613
|
"immutable": true,
|
|
8594
8614
|
"locationInModule": {
|
|
8595
8615
|
"filename": "src/open-next.ts",
|
|
8596
|
-
"line":
|
|
8616
|
+
"line": 172
|
|
8597
8617
|
},
|
|
8598
8618
|
"name": "defaultServerFunction",
|
|
8599
8619
|
"type": {
|
|
@@ -8607,7 +8627,7 @@
|
|
|
8607
8627
|
"immutable": true,
|
|
8608
8628
|
"locationInModule": {
|
|
8609
8629
|
"filename": "src/open-next.ts",
|
|
8610
|
-
"line":
|
|
8630
|
+
"line": 168
|
|
8611
8631
|
},
|
|
8612
8632
|
"name": "distribution",
|
|
8613
8633
|
"type": {
|
|
@@ -8621,7 +8641,7 @@
|
|
|
8621
8641
|
"immutable": true,
|
|
8622
8642
|
"locationInModule": {
|
|
8623
8643
|
"filename": "src/open-next.ts",
|
|
8624
|
-
"line":
|
|
8644
|
+
"line": 176
|
|
8625
8645
|
},
|
|
8626
8646
|
"name": "url",
|
|
8627
8647
|
"type": {
|
|
@@ -8641,7 +8661,7 @@
|
|
|
8641
8661
|
"kind": "interface",
|
|
8642
8662
|
"locationInModule": {
|
|
8643
8663
|
"filename": "src/open-next.ts",
|
|
8644
|
-
"line":
|
|
8664
|
+
"line": 132
|
|
8645
8665
|
},
|
|
8646
8666
|
"name": "NextjsSiteProps",
|
|
8647
8667
|
"properties": [
|
|
@@ -8655,7 +8675,7 @@
|
|
|
8655
8675
|
"immutable": true,
|
|
8656
8676
|
"locationInModule": {
|
|
8657
8677
|
"filename": "src/open-next.ts",
|
|
8658
|
-
"line":
|
|
8678
|
+
"line": 141
|
|
8659
8679
|
},
|
|
8660
8680
|
"name": "customDomain",
|
|
8661
8681
|
"optional": true,
|
|
@@ -8673,7 +8693,7 @@
|
|
|
8673
8693
|
"immutable": true,
|
|
8674
8694
|
"locationInModule": {
|
|
8675
8695
|
"filename": "src/open-next.ts",
|
|
8676
|
-
"line":
|
|
8696
|
+
"line": 154
|
|
8677
8697
|
},
|
|
8678
8698
|
"name": "defaultFunctionProps",
|
|
8679
8699
|
"optional": true,
|
|
@@ -8691,7 +8711,7 @@
|
|
|
8691
8711
|
"immutable": true,
|
|
8692
8712
|
"locationInModule": {
|
|
8693
8713
|
"filename": "src/open-next.ts",
|
|
8694
|
-
"line":
|
|
8714
|
+
"line": 148
|
|
8695
8715
|
},
|
|
8696
8716
|
"name": "openNextPath",
|
|
8697
8717
|
"optional": true,
|
|
@@ -8703,6 +8723,6 @@
|
|
|
8703
8723
|
"symbolId": "src/open-next:NextjsSiteProps"
|
|
8704
8724
|
}
|
|
8705
8725
|
},
|
|
8706
|
-
"version": "0.3.
|
|
8707
|
-
"fingerprint": "
|
|
8726
|
+
"version": "0.3.1",
|
|
8727
|
+
"fingerprint": "PIAnQ66gq+87dLJ8DrR96JBoqL3lnOQ6ptbChHnNj8w="
|
|
8708
8728
|
}
|
package/API.md
CHANGED
|
@@ -1063,6 +1063,7 @@ const distributionDomainProps: DistributionDomainProps = { ... }
|
|
|
1063
1063
|
| **Name** | **Type** | **Description** |
|
|
1064
1064
|
| --- | --- | --- |
|
|
1065
1065
|
| <code><a href="#cdk-opennext.DistributionDomainProps.property.domainName">domainName</a></code> | <code>string</code> | The domain to be assigned to the website URL (ie. domain.com). |
|
|
1066
|
+
| <code><a href="#cdk-opennext.DistributionDomainProps.property.certificate">certificate</a></code> | <code>aws-cdk-lib.aws_certificatemanager.ICertificate</code> | The ACM certificate to use for the custom domain. |
|
|
1066
1067
|
| <code><a href="#cdk-opennext.DistributionDomainProps.property.hostedZone">hostedZone</a></code> | <code>aws-cdk-lib.aws_route53.IHostedZone</code> | Import the underlying Route 53 hosted zone. |
|
|
1067
1068
|
|
|
1068
1069
|
---
|
|
@@ -1081,7 +1082,25 @@ Supports domains that are hosted either on [Route 53](https://aws.amazon.com/rou
|
|
|
1081
1082
|
|
|
1082
1083
|
---
|
|
1083
1084
|
|
|
1084
|
-
##### `
|
|
1085
|
+
##### `certificate`<sup>Optional</sup> <a name="certificate" id="cdk-opennext.DistributionDomainProps.property.certificate"></a>
|
|
1086
|
+
|
|
1087
|
+
```typescript
|
|
1088
|
+
public readonly certificate: ICertificate;
|
|
1089
|
+
```
|
|
1090
|
+
|
|
1091
|
+
- *Type:* aws-cdk-lib.aws_certificatemanager.ICertificate
|
|
1092
|
+
|
|
1093
|
+
The ACM certificate to use for the custom domain.
|
|
1094
|
+
|
|
1095
|
+
Required if `hostedZone` is not provided. The certificate must be in
|
|
1096
|
+
us-east-1 for CloudFront distributions.
|
|
1097
|
+
|
|
1098
|
+
When provided without `hostedZone`, no DNS aliases will be created
|
|
1099
|
+
and you must configure DNS records externally.
|
|
1100
|
+
|
|
1101
|
+
---
|
|
1102
|
+
|
|
1103
|
+
##### `hostedZone`<sup>Optional</sup> <a name="hostedZone" id="cdk-opennext.DistributionDomainProps.property.hostedZone"></a>
|
|
1085
1104
|
|
|
1086
1105
|
```typescript
|
|
1087
1106
|
public readonly hostedZone: IHostedZone;
|
|
@@ -1091,6 +1110,9 @@ public readonly hostedZone: IHostedZone;
|
|
|
1091
1110
|
|
|
1092
1111
|
Import the underlying Route 53 hosted zone.
|
|
1093
1112
|
|
|
1113
|
+
Required if `certificate` is not provided. When provided, a DNS-validated
|
|
1114
|
+
certificate will be created automatically and DNS aliases will be set up.
|
|
1115
|
+
|
|
1094
1116
|
---
|
|
1095
1117
|
|
|
1096
1118
|
### NextjsSiteProps <a name="NextjsSiteProps" id="cdk-opennext.NextjsSiteProps"></a>
|
package/README.md
CHANGED
|
@@ -16,7 +16,7 @@ to ECS option has been removed.
|
|
|
16
16
|
1. Install:
|
|
17
17
|
|
|
18
18
|
```sh
|
|
19
|
-
npm install esbuild @opennextjs/aws cdk-opennext
|
|
19
|
+
npm install --save-dev esbuild @opennextjs/aws cdk-opennext
|
|
20
20
|
```
|
|
21
21
|
|
|
22
22
|
2. Build your app: `npx next build`
|
|
@@ -52,6 +52,84 @@ const site = new NextjsSite(this, "NextjsSite", {
|
|
|
52
52
|
})
|
|
53
53
|
```
|
|
54
54
|
|
|
55
|
+
## Custom Domain
|
|
56
|
+
|
|
57
|
+
You can configure a custom domain in three ways:
|
|
58
|
+
|
|
59
|
+
### Option 1: Route 53 Hosted Zone (automatic certificate and DNS)
|
|
60
|
+
|
|
61
|
+
Provide a hosted zone and the construct will automatically create a DNS-validated
|
|
62
|
+
certificate and set up A/AAAA records:
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
import { NextjsSite } from "cdk-opennext"
|
|
66
|
+
import { HostedZone } from "aws-cdk-lib/aws-route53"
|
|
67
|
+
|
|
68
|
+
const hostedZone = HostedZone.fromLookup(this, "HostedZone", {
|
|
69
|
+
domainName: "example.com",
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
const site = new NextjsSite(this, "NextjsSite", {
|
|
73
|
+
customDomain: {
|
|
74
|
+
domainName: "app.example.com",
|
|
75
|
+
hostedZone: hostedZone,
|
|
76
|
+
},
|
|
77
|
+
})
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Option 2: Bring Your Own Certificate (external DNS)
|
|
81
|
+
|
|
82
|
+
Provide your own ACM certificate when DNS is managed externally. The certificate
|
|
83
|
+
must be in us-east-1 for CloudFront:
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
import { NextjsSite } from "cdk-opennext"
|
|
87
|
+
import { Certificate } from "aws-cdk-lib/aws-certificatemanager"
|
|
88
|
+
|
|
89
|
+
const certificate = Certificate.fromCertificateArn(
|
|
90
|
+
this,
|
|
91
|
+
"Certificate",
|
|
92
|
+
"arn:aws:acm:us-east-1:123456789012:certificate/..."
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
const site = new NextjsSite(this, "NextjsSite", {
|
|
96
|
+
customDomain: {
|
|
97
|
+
domainName: "app.example.com",
|
|
98
|
+
certificate: certificate,
|
|
99
|
+
},
|
|
100
|
+
})
|
|
101
|
+
// Configure your DNS provider to point app.example.com to site.distribution.distributionDomainName
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Option 3: Bring Your Own Certificate with Route 53 DNS
|
|
105
|
+
|
|
106
|
+
Provide both a certificate and hosted zone to use your own certificate while
|
|
107
|
+
still having the construct manage DNS records:
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
import { NextjsSite } from "cdk-opennext"
|
|
111
|
+
import { Certificate } from "aws-cdk-lib/aws-certificatemanager"
|
|
112
|
+
import { HostedZone } from "aws-cdk-lib/aws-route53"
|
|
113
|
+
|
|
114
|
+
const hostedZone = HostedZone.fromLookup(this, "HostedZone", {
|
|
115
|
+
domainName: "example.com",
|
|
116
|
+
})
|
|
117
|
+
|
|
118
|
+
const certificate = Certificate.fromCertificateArn(
|
|
119
|
+
this,
|
|
120
|
+
"Certificate",
|
|
121
|
+
"arn:aws:acm:us-east-1:123456789012:certificate/..."
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
const site = new NextjsSite(this, "NextjsSite", {
|
|
125
|
+
customDomain: {
|
|
126
|
+
domainName: "app.example.com",
|
|
127
|
+
hostedZone: hostedZone,
|
|
128
|
+
certificate: certificate,
|
|
129
|
+
},
|
|
130
|
+
})
|
|
131
|
+
```
|
|
132
|
+
|
|
55
133
|
# How it works
|
|
56
134
|
|
|
57
135
|
This package assumes that the Next and OpenNext build are done outside
|
package/lib/open-next.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ICertificate } from "aws-cdk-lib/aws-certificatemanager";
|
|
1
2
|
import { Distribution } from "aws-cdk-lib/aws-cloudfront";
|
|
2
3
|
import { Function as CdkFunction, type FunctionOptions, Runtime } from "aws-cdk-lib/aws-lambda";
|
|
3
4
|
import { IHostedZone } from "aws-cdk-lib/aws-route53";
|
|
@@ -23,8 +24,21 @@ export interface DistributionDomainProps {
|
|
|
23
24
|
readonly domainName: string;
|
|
24
25
|
/**
|
|
25
26
|
* Import the underlying Route 53 hosted zone.
|
|
27
|
+
*
|
|
28
|
+
* Required if `certificate` is not provided. When provided, a DNS-validated
|
|
29
|
+
* certificate will be created automatically and DNS aliases will be set up.
|
|
30
|
+
*/
|
|
31
|
+
readonly hostedZone?: IHostedZone;
|
|
32
|
+
/**
|
|
33
|
+
* The ACM certificate to use for the custom domain.
|
|
34
|
+
*
|
|
35
|
+
* Required if `hostedZone` is not provided. The certificate must be in
|
|
36
|
+
* us-east-1 for CloudFront distributions.
|
|
37
|
+
*
|
|
38
|
+
* When provided without `hostedZone`, no DNS aliases will be created
|
|
39
|
+
* and you must configure DNS records externally.
|
|
26
40
|
*/
|
|
27
|
-
readonly
|
|
41
|
+
readonly certificate?: ICertificate;
|
|
28
42
|
}
|
|
29
43
|
export interface NextjsSiteProps {
|
|
30
44
|
/**
|
package/lib/open-next.js
CHANGED
|
@@ -37,6 +37,14 @@ class NextjsSite extends constructs_1.Construct {
|
|
|
37
37
|
this.openNextPath = props.openNextPath ?? ".open-next";
|
|
38
38
|
this.openNextOutput = JSON.parse((0, fs_1.readFileSync)(path.join(this.openNextPath, "open-next.output.json"), "utf-8"));
|
|
39
39
|
this._customDomainName = props.customDomain?.domainName;
|
|
40
|
+
// Validate customDomain props: either certificate or hostedZone must be provided
|
|
41
|
+
if (props.customDomain &&
|
|
42
|
+
!props.customDomain.certificate &&
|
|
43
|
+
!props.customDomain.hostedZone) {
|
|
44
|
+
throw new Error("customDomain requires either a certificate or a hostedZone. " +
|
|
45
|
+
"Provide a hostedZone to automatically create a DNS-validated certificate, " +
|
|
46
|
+
"or provide your own certificate.");
|
|
47
|
+
}
|
|
40
48
|
this.bucket = new aws_s3_1.Bucket(this, "S3Bucket", {
|
|
41
49
|
publicReadAccess: false,
|
|
42
50
|
blockPublicAccess: aws_s3_1.BlockPublicAccess.BLOCK_ALL,
|
|
@@ -46,10 +54,11 @@ class NextjsSite extends constructs_1.Construct {
|
|
|
46
54
|
});
|
|
47
55
|
this.table = this.createRevalidationTable();
|
|
48
56
|
this.queue = this.createRevalidationQueue();
|
|
49
|
-
//
|
|
50
|
-
const certificate = props.customDomain
|
|
51
|
-
|
|
52
|
-
|
|
57
|
+
// Use provided certificate or create one if hostedZone is available
|
|
58
|
+
const certificate = props.customDomain?.certificate ??
|
|
59
|
+
(props.customDomain?.hostedZone
|
|
60
|
+
? this.createCertificate(props.customDomain.domainName, props.customDomain.hostedZone)
|
|
61
|
+
: undefined);
|
|
53
62
|
const origins = this.createOrigins(props.defaultFunctionProps);
|
|
54
63
|
this.serverCachePolicy = this.createServerCachePolicy();
|
|
55
64
|
this.staticCachePolicy = this.createStaticCachePolicy();
|
|
@@ -67,12 +76,12 @@ class NextjsSite extends constructs_1.Construct {
|
|
|
67
76
|
});
|
|
68
77
|
}
|
|
69
78
|
}
|
|
70
|
-
createCertificate(
|
|
79
|
+
createCertificate(domainName, hostedZone) {
|
|
71
80
|
// CloudFront requires certificates to be in us-east-1
|
|
72
81
|
// DnsValidatedCertificate handles cross-region certificate creation automatically
|
|
73
82
|
return new aws_certificatemanager_1.DnsValidatedCertificate(this, "Certificate", {
|
|
74
|
-
domainName
|
|
75
|
-
hostedZone
|
|
83
|
+
domainName,
|
|
84
|
+
hostedZone,
|
|
76
85
|
region: "us-east-1",
|
|
77
86
|
});
|
|
78
87
|
}
|
|
@@ -281,5 +290,5 @@ class NextjsSite extends constructs_1.Construct {
|
|
|
281
290
|
}
|
|
282
291
|
exports.NextjsSite = NextjsSite;
|
|
283
292
|
_a = JSII_RTTI_SYMBOL_1;
|
|
284
|
-
NextjsSite[_a] = { fqn: "cdk-opennext.NextjsSite", version: "0.3.
|
|
285
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3Blbi1uZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL29wZW4tbmV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDJCQUFpQztBQUNqQyw2QkFBNEI7QUFDNUIsK0VBQTRFO0FBQzVFLCtEQWdCbUM7QUFDbkMsK0VBQStFO0FBQy9FLDJEQUFtRjtBQUVuRix1REFRK0I7QUFDL0IsbUZBQXFFO0FBQ3JFLG1EQUE4RDtBQUM5RCx5REFBd0Y7QUFDeEYseUVBQWtFO0FBQ2xFLCtDQUE4RDtBQUM5RCxxRUFBd0U7QUFDeEUsaURBQTJDO0FBQzNDLDJDQUFxRjtBQUNyRixtRUFBdUQ7QUFDdkQsMkNBQXNDO0FBcUd0QyxNQUFhLFVBQVcsU0FBUSxzQkFBUztJQWV2QyxJQUFXLHFCQUFxQjtRQUM5QixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQTtJQUNwQyxDQUFDO0lBRUQsSUFBVyxHQUFHO1FBQ1osT0FBTyxXQUFXLElBQUksQ0FBQyxZQUFZLENBQUMsc0JBQXNCLEVBQUUsQ0FBQTtJQUM5RCxDQUFDO0lBRUQsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQjtZQUMzQixDQUFDLENBQUMsV0FBVyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDckMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsRUFBRSxDQUFBO0lBQzNELENBQUM7SUFFRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXNCO1FBQzlELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDaEIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQTtRQUN0RCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQzlCLElBQUEsaUJBQVksRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsdUJBQXVC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QUN2QyxPQUFPLEdBQUcsQ0FBQTtZQUNaLENBQUMsRUFDRCxFQUFxQyxDQUN0QztTQUNKLENBQUMsQ0FBQTtRQUNGLE9BQU8sWUFBWSxDQUFBO0lBQ3JCLENBQUM7SUFFTyx1QkFBdUI7UUFDN0IsT0FBTyxJQUFJLDRCQUFXLENBQUMsSUFBSSxFQUFFLDJCQUEyQixFQUFFO1lBQ3hELG1CQUFtQixFQUFFLHlDQUF3QixDQUFDLEdBQUcsRUFBRTtZQUNuRCxjQUFjLEVBQUUsb0NBQW1CLENBQUMsU0FBUyxDQUMzQyxRQUFRLEVBQ1IsaUJBQWlCLEVBQ2pCLEtBQUssRUFDTCxzQkFBc0IsRUFDdEIsd0JBQXdCLEVBQ3hCLFVBQVUsRUFDVix3QkFBd0IsQ0FDekI7WUFDRCxjQUFjLEVBQUUsb0NBQW1CLENBQUMsSUFBSSxFQUFFO1lBQzFDLFVBQVUsRUFBRSxlQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUM1QixNQUFNLEVBQUUsZUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDMUIsTUFBTSxFQUFFLGVBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ3pCLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFTyx1QkFBdUI7UUFDN0IsT0FBTyw0QkFBVyxDQUFDLGlCQUFpQixDQUFBO0lBQ3RDLENBQUM7O0FBelZILGdDQTBWQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gXCJmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCB7IERuc1ZhbGlkYXRlZENlcnRpZmljYXRlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jZXJ0aWZpY2F0ZW1hbmFnZXJcIlxuaW1wb3J0IHtcbiAgQWxsb3dlZE1ldGhvZHMsXG4gIHR5cGUgQmVoYXZpb3JPcHRpb25zLFxuICBDYWNoZUNvb2tpZUJlaGF2aW9yLFxuICBDYWNoZUhlYWRlckJlaGF2aW9yLFxuICBDYWNoZVBvbGljeSxcbiAgQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLFxuICBDYWNoZWRNZXRob2RzLFxuICBEaXN0cmlidXRpb24sXG4gIHR5cGUgSUNhY2hlUG9saWN5LFxuICB0eXBlIElPcmlnaW4sXG4gIFZpZXdlclByb3RvY29sUG9saWN5LFxuICBGdW5jdGlvbkV2ZW50VHlwZSxcbiAgT3JpZ2luUmVxdWVzdFBvbGljeSxcbiAgRnVuY3Rpb24gYXMgQ2xvdWRmcm9udEZ1bmN0aW9uLFxuICBGdW5jdGlvbkNvZGUsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udFwiXG5pbXBvcnQgeyBIdHRwT3JpZ2luLCBTM0J1Y2tldE9yaWdpbiB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udC1vcmlnaW5zXCJcbmltcG9ydCB7IFRhYmxlVjIgYXMgVGFibGUsIEF0dHJpYnV0ZVR5cGUsIEJpbGxpbmcgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWR5bmFtb2RiXCJcbmltcG9ydCB7IHR5cGUgSUdyYW50YWJsZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCJcbmltcG9ydCB7XG4gIENvZGUsXG4gIEZ1bmN0aW9uIGFzIENka0Z1bmN0aW9uLFxuICB0eXBlIEZ1bmN0aW9uT3B0aW9ucyxcbiAgRnVuY3Rpb25VcmxBdXRoVHlwZSxcbiAgSW52b2tlTW9kZSxcbiAgUnVudGltZSxcbiAgQXJjaGl0ZWN0dXJlLFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiXG5pbXBvcnQgeyBTcXNFdmVudFNvdXJjZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLWV2ZW50LXNvdXJjZXNcIlxuaW1wb3J0IHsgTG9nR3JvdXAsIFJldGVudGlvbkRheXMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIlxuaW1wb3J0IHsgQWFhYVJlY29yZCwgQVJlY29yZCwgSUhvc3RlZFpvbmUsIFJlY29yZFRhcmdldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtcm91dGU1M1wiXG5pbXBvcnQgeyBDbG91ZEZyb250VGFyZ2V0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yb3V0ZTUzLXRhcmdldHNcIlxuaW1wb3J0IHsgQmxvY2tQdWJsaWNBY2Nlc3MsIEJ1Y2tldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIlxuaW1wb3J0IHsgQnVja2V0RGVwbG95bWVudCwgU291cmNlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zMy1kZXBsb3ltZW50XCJcbmltcG9ydCB7IFF1ZXVlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zcXNcIlxuaW1wb3J0IHsgQ3VzdG9tUmVzb3VyY2UsIER1cmF0aW9uLCBGbiwgUmVtb3ZhbFBvbGljeSwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWIvY29yZVwiXG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gXCJhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzXCJcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCJcblxudHlwZSBCYXNlRnVuY3Rpb24gPSB7XG4gIGhhbmRsZXI6IHN0cmluZ1xuICBidW5kbGU6IHN0cmluZ1xufVxuXG50eXBlIE9wZW5OZXh0RnVuY3Rpb25PcmlnaW4gPSB7XG4gIHR5cGU6IFwiZnVuY3Rpb25cIlxuICBzdHJlYW1pbmc/OiBib29sZWFuXG59ICYgQmFzZUZ1bmN0aW9uXG5cbnR5cGUgT3Blbk5leHRTM09yaWdpbiA9IHtcbiAgdHlwZTogXCJzM1wiXG4gIG9yaWdpblBhdGg6IHN0cmluZ1xuICBjb3B5OiB7XG4gICAgZnJvbTogc3RyaW5nXG4gICAgdG86IHN0cmluZ1xuICAgIGNhY2hlZDogYm9vbGVhblxuICAgIHZlcnNpb25lZFN1YkRpcj86IHN0cmluZ1xuICB9W11cbn1cblxudHlwZSBPcGVuTmV4dE9yaWdpbnMgPSBPcGVuTmV4dEZ1bmN0aW9uT3JpZ2luIHwgT3Blbk5leHRTM09yaWdpblxuXG5pbnRlcmZhY2UgT3Blbk5leHRPdXRwdXQge1xuICBlZGdlRnVuY3Rpb25zOiB7XG4gICAgW2tleTogc3RyaW5nXTogQmFzZUZ1bmN0aW9uXG4gIH1cbiAgb3JpZ2luczoge1xuICAgIHMzOiBPcGVuTmV4dFMzT3JpZ2luXG4gICAgZGVmYXVsdDogT3Blbk5leHRGdW5jdGlvbk9yaWdpblxuICAgIGltYWdlT3B0aW1pemVyOiBPcGVuTmV4dEZ1bmN0aW9uT3JpZ2luXG4gICAgW2tleTogc3RyaW5nXTogT3Blbk5leHRPcmlnaW5zXG4gIH1cbiAgYmVoYXZpb3JzOiB7XG4gICAgcGF0dGVybjogc3RyaW5nXG4gICAgb3JpZ2luPzogc3RyaW5nXG4gICAgZWRnZUZ1bmN0aW9uPzogc3RyaW5nXG4gIH1bXVxuICBhZGRpdGlvbmFsUHJvcHM/OiB7XG4gICAgZGlzYWJsZUluY3JlbWVudGFsQ2FjaGU/OiBib29sZWFuXG4gICAgZGlzYWJsZVRhZ0NhY2hlPzogYm9vbGVhblxuICAgIGluaXRpYWxpemF0aW9uRnVuY3Rpb24/OiBCYXNlRnVuY3Rpb25cbiAgICB3YXJtZXI/OiBCYXNlRnVuY3Rpb25cbiAgICByZXZhbGlkYXRpb25GdW5jdGlvbj86IEJhc2VGdW5jdGlvblxuICB9XG59XG5cbi8qKlxuICogUHJvcHMgZm9yIExhbWJkYSBmdW5jdGlvbnMsIGV4Y2x1ZGluZyBoYW5kbGVyIGFuZCBjb2RlIHdoaWNoIGFyZSBzZXQgYnkgdGhlIGNvbnN0cnVjdC5cbiAqIEV4dGVuZHMgRnVuY3Rpb25PcHRpb25zIGFuZCBhZGRzIHJ1bnRpbWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVmYXVsdEZ1bmN0aW9uUHJvcHMgZXh0ZW5kcyBGdW5jdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHJ1bnRpbWUgZW52aXJvbm1lbnQgZm9yIHRoZSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IFJ1bnRpbWUuTk9ERUpTXzI0X1hcbiAgICovXG4gIHJlYWRvbmx5IHJ1bnRpbWU/OiBSdW50aW1lXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlzdHJpYnV0aW9uRG9tYWluUHJvcHMge1xuICAvKipcbiAgICogVGhlIGRvbWFpbiB0byBiZSBhc3NpZ25lZCB0byB0aGUgd2Vic2l0ZSBVUkwgKGllLiBkb21haW4uY29tKS5cbiAgICpcbiAgICogU3VwcG9ydHMgZG9tYWlucyB0aGF0IGFyZSBob3N0ZWQgZWl0aGVyIG9uIFtSb3V0ZSA1M10oaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9yb3V0ZTUzLykgb3IgZXh0ZXJuYWxseS5cbiAgICovXG4gIHJlYWRvbmx5IGRvbWFpbk5hbWU6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBJbXBvcnQgdGhlIHVuZGVybHlpbmcgUm91dGUgNTMgaG9zdGVkIHpvbmUuXG4gICAqL1xuICByZWFkb25seSBob3N0ZWRab25lOiBJSG9zdGVkWm9uZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc1NpdGVQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgY3VzdG9tRG9tYWluIGZvciB0aGlzIHdlYnNpdGUuIFRoaXMgZG9tYWluIG11c3QgYmUgaG9zdGVkIGluXG4gICAqIHJvdXRlNTMsIGFuZCB3ZSBtdXN0IGJlIGFibGUgdG8gY3JlYXRlIGFuIEFDTSBjZXJ0aWZpY2F0ZSBmb3IgdGhpc1xuICAgKiBkb21haW4uXG4gICAqXG4gICAqIE5vdGUgdGhhdCB5b3UgY2FuIGFsc28gbWlncmF0ZSBleHRlcm5hbGx5IGhvc3RlZCBkb21haW5zIHRvIFJvdXRlIDUzIGJ5XG4gICAqIFtmb2xsb3dpbmcgdGhpcyBndWlkZV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL1JvdXRlNTMvbGF0ZXN0L0RldmVsb3Blckd1aWRlL01pZ3JhdGluZ0ROUy5odG1sKS5cbiAgICovXG4gIHJlYWRvbmx5IGN1c3RvbURvbWFpbj86IERpc3RyaWJ1dGlvbkRvbWFpblByb3BzXG5cbiAgLyoqXG4gICAqIFNob3VsZCBwb2ludCB0byB0aGUgLm9wZW4tbmV4dCBkaXJlY3RvcnkuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiLm9wZW4tbmV4dFwiXG4gICAqL1xuICByZWFkb25seSBvcGVuTmV4dFBhdGg/OiBzdHJpbmcgfCB1bmRlZmluZWRcblxuICAvKipcbiAgICogRGVmYXVsdCBwcm9wcyB0byBhcHBseSB0byBhbGwgTGFtYmRhIGZ1bmN0aW9ucyBjcmVhdGVkIGJ5IHRoaXMgY29uc3RydWN0LlxuICAgKiBUaGVzZSBjYW4gYmUgb3ZlcnJpZGRlbiBieSBzcGVjaWZpYyBmdW5jdGlvbiBjb25maWd1cmF0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRGdW5jdGlvblByb3BzPzogRGVmYXVsdEZ1bmN0aW9uUHJvcHNcbn1cblxuZXhwb3J0IGNsYXNzIE5leHRqc1NpdGUgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwcml2YXRlIG9wZW5OZXh0T3V0cHV0OiBPcGVuTmV4dE91dHB1dFxuICBwcml2YXRlIGJ1Y2tldDogQnVja2V0XG4gIHByaXZhdGUgdGFibGU6IFRhYmxlXG4gIHByaXZhdGUgcXVldWU6IFF1ZXVlXG5cbiAgcHJpdmF0ZSBzdGF0aWNDYWNoZVBvbGljeTogSUNhY2hlUG9saWN5XG4gIHByaXZhdGUgc2VydmVyQ2FjaGVQb2xpY3k6IENhY2hlUG9saWN5XG5cbiAgcHJpdmF0ZSBvcGVuTmV4dFBhdGg6IHN0cmluZ1xuXG4gIHB1YmxpYyByZWFkb25seSBkaXN0cmlidXRpb246IERpc3RyaWJ1dGlvblxuICBwcml2YXRlIF9kZWZhdWx0U2VydmVyRnVuY3Rpb24hOiBDZGtGdW5jdGlvblxuICBwcml2YXRlIF9jdXN0b21Eb21haW5OYW1lPzogc3RyaW5nXG5cbiAgcHVibGljIGdldCBkZWZhdWx0U2VydmVyRnVuY3Rpb24oKTogQ2RrRnVuY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl9kZWZhdWx0U2VydmVyRnVuY3Rpb25cbiAgfVxuXG4gIHB1YmxpYyBnZXQgdXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBodHRwczovLyR7dGhpcy5kaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uRG9tYWluTmFtZX1gXG4gIH1cblxuICBwdWJsaWMgZ2V0IGN1c3RvbURvbWFpblVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jdXN0b21Eb21haW5OYW1lXG4gICAgICA/IGBodHRwczovLyR7dGhpcy5fY3VzdG9tRG9tYWluTmFtZX1gXG4gICAgICA6IGBodHRwczovLyR7dGhpcy5kaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uRG9tYWluTmFtZX1gXG4gIH1cblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTmV4dGpzU2l0ZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuICAgIHRoaXMub3Blbk5leHRQYXRoID0gcHJvcHMub3Blbk5leHRQYXRoID8/IFwiLm9wZW4tbmV4dFwiXG4gICAgdGhpcy5vcGVuTmV4dE91dHB1dCA9IEpTT04ucGFyc2UoXG4gICAgICByZWFkRmlsZVN5bmMocGF0aC5qb2luKHRoaXMub3Blbk5leHRQYXRoLCBcIm9wZW4tbmV4dC5vdXRwdXQuanNvblwiKSwgXCJ1dGYtOFwiKVxuICAgICkgYXMgT3Blbk5leHRPdXRwdXRcblxuICAgIHRoaXMuX2N1c3RvbURvbWFpbk5hbWUgPSBwcm9wcy5jdXN0b21Eb21haW4/LmRvbWFpbk5hbWVcblxuICAgIHRoaXMuYnVja2V0ID0gbmV3IEJ1Y2tldCh0aGlzLCBcIlMzQnVja2V0XCIsIHtcbiAgICAgIHB1YmxpY1JlYWRBY2Nlc3M6IGZhbHNlLFxuICAgICAgYmxvY2tQdWJsaWNBY2Nlc3M6IEJsb2NrUHVibGljQWNjZXNzLkJMT0NLX0FMTCxcbiAgICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgZW5mb3JjZVNTTDogdHJ1ZSxcbiAgICB9KVxuICAgIHRoaXMudGFibGUgPSB0aGlzLmNyZWF0ZVJldmFsaWRhdGlvblRhYmxlKClcbiAgICB0aGlzLnF1ZXVlID0gdGhpcy5jcmVhdGVSZXZhbGlkYXRpb25RdWV1ZSgpXG5cbiAgICAvLyBDcmVhdGUgY2VydGlmaWNhdGUgaW4gdXMtZWFzdC0xIGZvciBDbG91ZEZyb250IChyZXF1aXJlZCBmb3IgQ2xvdWRGcm9udClcbiAgICBjb25zdCBjZXJ0aWZpY2F0ZSA9IHByb3BzLmN1c3RvbURvbWFpblxuICAgICAgPyB0aGlzLmNyZWF0ZUNlcnRpZmljYXRlKHByb3BzLmN1c3RvbURvbWFpbilcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgICBjb25zdCBvcmlnaW5zID0gdGhpcy5jcmVhdGVPcmlnaW5zKHByb3BzLmRlZmF1bHRGdW5jdGlvblByb3BzKVxuICAgIHRoaXMuc2VydmVyQ2FjaGVQb2xpY3kgPSB0aGlzLmNyZWF0ZVNlcnZlckNhY2hlUG9saWN5KClcbiAgICB0aGlzLnN0YXRpY0NhY2hlUG9saWN5ID0gdGhpcy5jcmVhdGVTdGF0aWNDYWNoZVBvbGljeSgpXG4gICAgdGhpcy5kaXN0cmlidXRpb24gPSB0aGlzLmNyZWF0ZURpc3RyaWJ1dGlvbihvcmlnaW5zLCBwcm9wcywgY2VydGlmaWNhdGUpXG4gICAgaWYgKHByb3BzLmN1c3RvbURvbWFpbiAmJiBwcm9wcy5jdXN0b21Eb21haW4uaG9zdGVkWm9uZSkge1xuICAgICAgbmV3IEFSZWNvcmQodGhpcywgXCJBbGlhc1JlY29yZFwiLCB7XG4gICAgICAgIHpvbmU6IHByb3BzLmN1c3RvbURvbWFpbi5ob3N0ZWRab25lLFxuICAgICAgICByZWNvcmROYW1lOiBwcm9wcy5jdXN0b21Eb21haW4uZG9tYWluTmFtZSxcbiAgICAgICAgdGFyZ2V0OiBSZWNvcmRUYXJnZXQuZnJvbUFsaWFzKG5ldyBDbG91ZEZyb250VGFyZ2V0KHRoaXMuZGlzdHJpYnV0aW9uKSksXG4gICAgICB9KVxuXG4gICAgICBuZXcgQWFhYVJlY29yZCh0aGlzLCBcIkFsaWFzUmVjb3JkQUFBQVwiLCB7XG4gICAgICAgIHpvbmU6IHByb3BzLmN1c3RvbURvbWFpbi5ob3N0ZWRab25lLFxuICAgICAgICByZWNvcmROYW1lOiBwcm9wcy5jdXN0b21Eb21haW4uZG9tYWluTmFtZSxcbiAgICAgICAgdGFyZ2V0OiBSZWNvcmRUYXJnZXQuZnJvbUFsaWFzKG5ldyBDbG91ZEZyb250VGFyZ2V0KHRoaXMuZGlzdHJpYnV0aW9uKSksXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ2VydGlmaWNhdGUoZG9tYWluUHJvcHM6IERpc3RyaWJ1dGlvbkRvbWFpblByb3BzKSB7XG4gICAgLy8gQ2xvdWRGcm9udCByZXF1aXJlcyBjZXJ0aWZpY2F0ZXMgdG8gYmUgaW4gdXMtZWFzdC0xXG4gICAgLy8gRG5zVmFsaWRhdGVkQ2VydGlmaWNhdGUgaGFuZGxlcyBjcm9zcy1yZWdpb24gY2VydGlmaWNhdGUgY3JlYXRpb24gYXV0b21hdGljYWxseVxuICAgIHJldHVybiBuZXcgRG5zVmFsaWRhdGVkQ2VydGlmaWNhdGUodGhpcywgXCJDZXJ0aWZpY2F0ZVwiLCB7XG4gICAgICBkb21haW5OYW1lOiBkb21haW5Qcm9wcy5kb21haW5OYW1lLFxuICAgICAgaG9zdGVkWm9uZTogZG9tYWluUHJvcHMuaG9zdGVkWm9uZSxcbiAgICAgIHJlZ2lvbjogXCJ1cy1lYXN0LTFcIixcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVSZXZhbGlkYXRpb25UYWJsZSgpIHtcbiAgICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZSh0aGlzLCBcIlJldmFsaWRhdGlvblRhYmxlXCIsIHtcbiAgICAgIHBhcnRpdGlvbktleTogeyBuYW1lOiBcInRhZ1wiLCB0eXBlOiBBdHRyaWJ1dGVUeXBlLlNUUklORyB9LFxuICAgICAgc29ydEtleTogeyBuYW1lOiBcInBhdGhcIiwgdHlwZTogQXR0cmlidXRlVHlwZS5TVFJJTkcgfSxcbiAgICAgIHBvaW50SW5UaW1lUmVjb3ZlcnlTcGVjaWZpY2F0aW9uOiB7XG4gICAgICAgIHBvaW50SW5UaW1lUmVjb3ZlcnlFbmFibGVkOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIGJpbGxpbmc6IEJpbGxpbmcub25EZW1hbmQoKSxcbiAgICAgIGdsb2JhbFNlY29uZGFyeUluZGV4ZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGluZGV4TmFtZTogXCJyZXZhbGlkYXRlXCIsXG4gICAgICAgICAgcGFydGl0aW9uS2V5OiB7IG5hbWU6IFwicGF0aFwiLCB0eXBlOiBBdHRyaWJ1dGVUeXBlLlNUUklORyB9LFxuICAgICAgICAgIHNvcnRLZXk6IHsgbmFtZTogXCJyZXZhbGlkYXRlZEF0XCIsIHR5cGU6IEF0dHJpYnV0ZVR5cGUuTlVNQkVSIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgIH0pXG5cbiAgICBjb25zdCBpbml0Rm4gPSB0aGlzLm9wZW5OZXh0T3V0cHV0LmFkZGl0aW9uYWxQcm9wcz8uaW5pdGlhbGl6YXRpb25GdW5jdGlvblxuXG4gICAgY29uc3QgaW5zZXJ0Rm4gPSBuZXcgQ2RrRnVuY3Rpb24odGhpcywgXCJSZXZhbGlkYXRpb25JbnNlcnRGdW5jdGlvblwiLCB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJOZXh0LmpzIHJldmFsaWRhdGlvbiBkYXRhIGluc2VydFwiLFxuICAgICAgaGFuZGxlcjogaW5pdEZuPy5oYW5kbGVyID8/IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgLy8gY29kZTogQ29kZS5mcm9tQXNzZXQoaW5pdEZuPy5idW5kbGUgPz8gXCJcIiksXG4gICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChwYXRoLmpvaW4odGhpcy5vcGVuTmV4dFBhdGgsIFwiZHluYW1vZGItcHJvdmlkZXJcIikpLFxuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjRfWCxcbiAgICAgIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoMTUpLFxuICAgICAgbWVtb3J5U2l6ZTogMTI4LFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgQ0FDSEVfRFlOQU1PX1RBQkxFOiB0YWJsZS50YWJsZU5hbWUsXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBjb25zdCBwcm92aWRlckxvZ0dyb3VwID0gbmV3IExvZ0dyb3VwKHRoaXMsIFwiUmV2YWxpZGF0aW9uUHJvdmlkZXJMb2dHcm91cFwiLCB7XG4gICAgICByZXRlbnRpb246IFJldGVudGlvbkRheXMuT05FX0RBWSxcbiAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICB9KVxuXG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgUHJvdmlkZXIodGhpcywgXCJSZXZhbGlkYXRpb25Qcm92aWRlclwiLCB7XG4gICAgICBvbkV2ZW50SGFuZGxlcjogaW5zZXJ0Rm4sXG4gICAgICBsb2dHcm91cDogcHJvdmlkZXJMb2dHcm91cCxcbiAgICB9KVxuXG4gICAgbmV3IEN1c3RvbVJlc291cmNlKHRoaXMsIFwiUmV2YWxpZGF0aW9uUmVzb3VyY2VcIiwge1xuICAgICAgc2VydmljZVRva2VuOiBwcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIHZlcnNpb246IERhdGUubm93KCkudG9TdHJpbmcoKSxcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIHJldHVybiB0YWJsZVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVPcmlnaW5zKGRlZmF1bHRGdW5jdGlvblByb3BzPzogRGVmYXVsdEZ1bmN0aW9uUHJvcHMpIHtcbiAgICBjb25zdCB7XG4gICAgICBzMzogczNPcmlnaW4sXG4gICAgICBkZWZhdWx0OiBkZWZhdWx0T3JpZ2luLFxuICAgICAgaW1hZ2VPcHRpbWl6ZXI6IGltYWdlT3JpZ2luLFxuICAgICAgLi4ucmVzdE9yaWdpbnNcbiAgICB9ID0gdGhpcy5vcGVuTmV4dE91dHB1dC5vcmlnaW5zXG4gICAgZm9yIChjb25zdCBjb3B5IG9mIHMzT3JpZ2luLmNvcHkpIHtcbiAgICAgIG5ldyBCdWNrZXREZXBsb3ltZW50KHRoaXMsIGBPcGVuTmV4dEJ1Y2tldERlcGxveW1lbnQke2NvcHkuZnJvbX1gLCB7XG4gICAgICAgIHNvdXJjZXM6IFtTb3VyY2UuYXNzZXQocGF0aC5qb2luKHRoaXMub3Blbk5leHRQYXRoLCBcIi4uXCIsIGNvcHkuZnJvbSkpXSxcbiAgICAgICAgZGVzdGluYXRpb25CdWNrZXQ6IHRoaXMuYnVja2V0LFxuICAgICAgICBkZXN0aW5hdGlvbktleVByZWZpeDogY29weS50byxcbiAgICAgICAgcHJ1bmU6IGZhbHNlLFxuICAgICAgfSlcbiAgICB9XG4gICAgY29uc3Qgb3JpZ2lucyA9IHtcbiAgICAgIHMzOiBTM0J1Y2tldE9yaWdpbi53aXRoT3JpZ2luQWNjZXNzQ29udHJvbCh0aGlzLmJ1Y2tldCwge1xuICAgICAgICBvcmlnaW5JZDogXCJTM0J1Y2tldFwiLFxuICAgICAgICBvcmlnaW5QYXRoOiBzM09yaWdpbi5vcmlnaW5QYXRoLFxuICAgICAgfSksXG4gICAgICBkZWZhdWx0OiB0aGlzLmNyZWF0ZUZ1bmN0aW9uT3JpZ2luKFxuICAgICAgICBcImRlZmF1bHRcIixcbiAgICAgICAgZGVmYXVsdE9yaWdpbixcbiAgICAgICAgXCJOZXh0SnNTZXJ2ZXJcIixcbiAgICAgICAgZGVmYXVsdEZ1bmN0aW9uUHJvcHNcbiAgICAgICksXG4gICAgICBpbWFnZU9wdGltaXplcjogdGhpcy5jcmVhdGVGdW5jdGlvbk9yaWdpbihcbiAgICAgICAgXCJpbWFnZU9wdGltaXplclwiLFxuICAgICAgICBpbWFnZU9yaWdpbixcbiAgICAgICAgXCJJbWFnZU9wdGltaXplclwiXG4gICAgICApLFxuICAgICAgLi4uT2JqZWN0LmVudHJpZXMocmVzdE9yaWdpbnMpLnJlZHVjZShcbiAgICAgICAgKGFjYywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgY29uc3Qgb3JpZ2luSWQgPSBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc2xpY2UoMSlcbiAgICAgICAgICBpZiAodmFsdWUudHlwZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IHRoaXMuY3JlYXRlRnVuY3Rpb25PcmlnaW4oa2V5LCB2YWx1ZSwgb3JpZ2luSWQpXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2NcbiAgICAgICAgfSxcbiAgICAgICAge30gYXMgUmVjb3JkPHN0cmluZywgSHR0cE9yaWdpbj5cbiAgICAgICksXG4gICAgfVxuICAgIHJldHVybiBvcmlnaW5zXG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJldmFsaWRhdGlvblF1ZXVlKCkge1xuICAgIGNvbnN0IHF1ZXVlID0gbmV3IFF1ZXVlKHRoaXMsIFwiUmV2YWxpZGF0aW9uUXVldWVcIiwge1xuICAgICAgZmlmbzogdHJ1ZSxcbiAgICAgIHJlY2VpdmVNZXNzYWdlV2FpdFRpbWU6IER1cmF0aW9uLnNlY29uZHMoMjApLFxuICAgIH0pXG4gICAgY29uc3QgY29uc3VtZXIgPSBuZXcgQ2RrRnVuY3Rpb24odGhpcywgXCJSZXZhbGlkYXRpb25GdW5jdGlvblwiLCB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJOZXh0LmpzIHJldmFsaWRhdG9yXCIsXG4gICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KFxuICAgICAgICB0aGlzLm9wZW5OZXh0T3V0cHV0LmFkZGl0aW9uYWxQcm9wcz8ucmV2YWxpZGF0aW9uRnVuY3Rpb24/LmJ1bmRsZVxuICAgICAgICAgID8gcGF0aC5qb2luKFxuICAgICAgICAgICAgICB0aGlzLm9wZW5OZXh0UGF0aCxcbiAgICAgICAgICAgICAgXCIuLlwiLFxuICAgICAgICAgICAgICB0aGlzLm9wZW5OZXh0T3V0cHV0LmFkZGl0aW9uYWxQcm9wcz8ucmV2YWxpZGF0aW9uRnVuY3Rpb24/LmJ1bmRsZVxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogXCJcIlxuICAgICAgKSxcbiAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZS5BUk1fNjQsXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDMwKSxcbiAgICB9KVxuICAgIGNvbnN1bWVyLmFkZEV2ZW50U291cmNlKG5ldyBTcXNFdmVudFNvdXJjZShxdWV1ZSwgeyBiYXRjaFNpemU6IDUgfSkpXG4gICAgcmV0dXJuIHF1ZXVlXG4gIH1cblxuICBwcml2YXRlIGdldEVudmlyb25tZW50KCkge1xuICAgIHJldHVybiB7XG4gICAgICBDQUNIRV9CVUNLRVRfTkFNRTogdGhpcy5idWNrZXQuYnVja2V0TmFtZSxcbiAgICAgIENBQ0hFX0JVQ0tFVF9LRVlfUFJFRklYOiBcIl9jYWNoZVwiLFxuICAgICAgQ0FDSEVfQlVDS0VUX1JFR0lPTjogU3RhY2sub2YodGhpcykucmVnaW9uLFxuICAgICAgUkVWQUxJREFUSU9OX1FVRVVFX1VSTDogdGhpcy5xdWV1ZS5xdWV1ZVVybCxcbiAgICAgIFJFVkFMSURBVElPTl9RVUVVRV9SRUdJT046IFN0YWNrLm9mKHRoaXMpLnJlZ2lvbixcbiAgICAgIENBQ0hFX0RZTkFNT19UQUJMRTogdGhpcy50YWJsZS50YWJsZU5hbWUsXG4gICAgICAvLyBUaG9zZSAyIGFyZSB1c2VkIG9ubHkgZm9yIGltYWdlIG9wdGltaXplclxuICAgICAgQlVDS0VUX05BTUU6IHRoaXMuYnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgICBCVUNLRVRfS0VZX1BSRUZJWDogXCJfYXNzZXRzXCIsXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBncmFudFBlcm1pc3Npb25zKGdyYW50YWJsZTogSUdyYW50YWJsZSkge1xuICAgIHRoaXMuYnVja2V0LmdyYW50UmVhZFdyaXRlKGdyYW50YWJsZSlcbiAgICB0aGlzLnRhYmxlLmdyYW50UmVhZFdyaXRlRGF0YShncmFudGFibGUpXG4gICAgdGhpcy5xdWV1ZS5ncmFudFNlbmRNZXNzYWdlcyhncmFudGFibGUpXG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZ1bmN0aW9uT3JpZ2luKFxuICAgIGtleTogc3RyaW5nLFxuICAgIG9yaWdpbjogT3Blbk5leHRGdW5jdGlvbk9yaWdpbixcbiAgICBvcmlnaW5JZD86IHN0cmluZyxcbiAgICBmblByb3BzPzogRGVmYXVsdEZ1bmN0aW9uUHJvcHNcbiAgKSB7XG4gICAgY29uc3QgZW52aXJvbm1lbnQgPSB0aGlzLmdldEVudmlyb25tZW50KClcbiAgICBjb25zdCBmbiA9IG5ldyBDZGtGdW5jdGlvbih0aGlzLCBgJHtrZXl9RnVuY3Rpb25gLCB7XG4gICAgICAuLi5mblByb3BzLFxuICAgICAgcnVudGltZTogZm5Qcm9wcz8ucnVudGltZSA/PyBSdW50aW1lLk5PREVKU18yNF9YLFxuICAgICAgYXJjaGl0ZWN0dXJlOiBmblByb3BzPy5hcmNoaXRlY3R1cmUgPz8gQXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgIG1lbW9yeVNpemU6IGZuUHJvcHM/Lm1lbW9yeVNpemUgPz8gMTAyNCxcbiAgICAgIGhhbmRsZXI6IG9yaWdpbi5oYW5kbGVyLFxuICAgICAgY29kZTogQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKHRoaXMub3Blbk5leHRQYXRoLCBcIi4uXCIsIG9yaWdpbi5idW5kbGUpKSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIC4uLmZuUHJvcHM/LmVudmlyb25tZW50LFxuICAgICAgICAuLi5lbnZpcm9ubWVudCxcbiAgICAgIH0sXG4gICAgfSlcbiAgICBjb25zdCBmblVybCA9IGZuLmFkZEZ1bmN0aW9uVXJsKHtcbiAgICAgIGF1dGhUeXBlOiBGdW5jdGlvblVybEF1dGhUeXBlLk5PTkUsXG4gICAgICBpbnZva2VNb2RlOiBvcmlnaW4uc3RyZWFtaW5nID8gSW52b2tlTW9kZS5SRVNQT05TRV9TVFJFQU0gOiBJbnZva2VNb2RlLkJVRkZFUkVELFxuICAgIH0pXG4gICAgdGhpcy5ncmFudFBlcm1pc3Npb25zKGZuKVxuXG4gICAgLy8gU3RvcmUgcmVmZXJlbmNlIHRvIGRlZmF1bHQgc2VydmVyIGZ1bmN0aW9uXG4gICAgaWYgKGtleSA9PT0gXCJkZWZhdWx0XCIpIHtcbiAgICAgIHRoaXMuX2RlZmF1bHRTZXJ2ZXJGdW5jdGlvbiA9IGZuXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBIdHRwT3JpZ2luKEZuLnBhcnNlRG9tYWluTmFtZShmblVybC51cmwpLCB7XG4gICAgICAuLi4ob3JpZ2luSWQgPyB7IG9yaWdpbklkIH0gOiB7fSksXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRGlzdHJpYnV0aW9uKFxuICAgIG9yaWdpbnM6IFJlY29yZDxzdHJpbmcsIElPcmlnaW4+LFxuICAgIHByb3BzOiBOZXh0anNTaXRlUHJvcHMsXG4gICAgY2VydGlmaWNhdGU/OiBEbnNWYWxpZGF0ZWRDZXJ0aWZpY2F0ZVxuICApIHtcbiAgICBjb25zdCBjbG91ZGZyb250RnVuY3Rpb24gPSBuZXcgQ2xvdWRmcm9udEZ1bmN0aW9uKHRoaXMsIFwiQ2xvdWRGcm9udEZ1bmN0aW9uXCIsIHtcbiAgICAgIGNvZGU6IEZ1bmN0aW9uQ29kZS5mcm9tSW5saW5lKGBcblx0XHRcdGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQpIHtcblx0XHRcdFx0dmFyIHJlcXVlc3QgPSBldmVudC5yZXF1ZXN0O1xuXHRcdFx0XHRyZXF1ZXN0LmhlYWRlcnNbXCJ4LWZvcndhcmRlZC1ob3N0XCJdID0gcmVxdWVzdC5oZWFkZXJzLmhvc3Q7XG5cdFx0XHRcdHJldHVybiByZXF1ZXN0O1xuXHRcdFx0fVxuXHRcdFx0YCksXG4gICAgfSlcbiAgICBjb25zdCBmbkFzc29jaWF0aW9ucyA9IFtcbiAgICAgIHtcbiAgICAgICAgZnVuY3Rpb246IGNsb3VkZnJvbnRGdW5jdGlvbixcbiAgICAgICAgZXZlbnRUeXBlOiBGdW5jdGlvbkV2ZW50VHlwZS5WSUVXRVJfUkVRVUVTVCxcbiAgICAgIH0sXG4gICAgXVxuXG4gICAgY29uc3QgZGlzdHJpYnV0aW9uID0gbmV3IERpc3RyaWJ1dGlvbih0aGlzLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICBkb21haW5OYW1lczogcHJvcHMuY3VzdG9tRG9tYWluID8gW3Byb3BzLmN1c3RvbURvbWFpbi5kb21haW5OYW1lXSA6IHVuZGVmaW5lZCxcbiAgICAgIGNlcnRpZmljYXRlLFxuICAgICAgZGVmYXVsdEJlaGF2aW9yOiB7XG4gICAgICAgIG9yaWdpbjogb3JpZ2lucy5kZWZhdWx0ISwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICAgICAgYWxsb3dlZE1ldGhvZHM6IEFsbG93ZWRNZXRob2RzLkFMTE9XX0FMTCxcbiAgICAgICAgY2FjaGVkTWV0aG9kczogQ2FjaGVkTWV0aG9kcy5DQUNIRV9HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgICBjYWNoZVBvbGljeTogdGhpcy5zZXJ2ZXJDYWNoZVBvbGljeSxcbiAgICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeTogT3JpZ2luUmVxdWVzdFBvbGljeS5BTExfVklFV0VSX0VYQ0VQVF9IT1NUX0hFQURFUixcbiAgICAgICAgZnVuY3Rpb25Bc3NvY2lhdGlvbnM6IGZuQXNzb2NpYXRpb25zLFxuICAgICAgfSxcbiAgICAgIGFkZGl0aW9uYWxCZWhhdmlvcnM6IHRoaXMub3Blbk5leHRPdXRwdXQuYmVoYXZpb3JzXG4gICAgICAgIC5maWx0ZXIoKGIpID0+IGIucGF0dGVybiAhPT0gXCIqXCIpXG4gICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgKGFjYywgYmVoYXZpb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJlaGF2aW9yT3B0aW9uczogQmVoYXZpb3JPcHRpb25zID0ge1xuICAgICAgICAgICAgICBvcmlnaW46IChiZWhhdmlvci5vcmlnaW4gPyBvcmlnaW5zW2JlaGF2aW9yLm9yaWdpbl0gOiBvcmlnaW5zLmRlZmF1bHQpISwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICAgICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICAgICAgICAgICAgYWxsb3dlZE1ldGhvZHM6IEFsbG93ZWRNZXRob2RzLkFMTE9XX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICAgICAgICAgIGNhY2hlZE1ldGhvZHM6IENhY2hlZE1ldGhvZHMuQ0FDSEVfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgICAgICAgICAgY2FjaGVQb2xpY3k6XG4gICAgICAgICAgICAgICAgYmVoYXZpb3Iub3JpZ2luID09PSBcInMzXCJcbiAgICAgICAgICAgICAgICAgID8gdGhpcy5zdGF0aWNDYWNoZVBvbGljeVxuICAgICAgICAgICAgICAgICAgOiB0aGlzLnNlcnZlckNhY2hlUG9saWN5LFxuICAgICAgICAgICAgICAuLi4oYmVoYXZpb3Iub3JpZ2luID09PSBcInMzXCJcbiAgICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblJlcXVlc3RQb2xpY3k6XG4gICAgICAgICAgICAgICAgICAgICAgT3JpZ2luUmVxdWVzdFBvbGljeS5BTExfVklFV0VSX0VYQ0VQVF9IT1NUX0hFQURFUixcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBmdW5jdGlvbkFzc29jaWF0aW9uczogZm5Bc3NvY2lhdGlvbnMsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhY2NbYmVoYXZpb3IucGF0dGVybl0gPSBiZWhhdmlvck9wdGlvbnNcbiAgICAgICAgICAgIHJldHVybiBhY2NcbiAgICAgICAgICB9LFxuICAgICAgICAgIHt9IGFzIFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz5cbiAgICAgICAgKSxcbiAgICB9KVxuICAgIHJldHVybiBkaXN0cmlidXRpb25cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU2VydmVyQ2FjaGVQb2xpY3koKSB7XG4gICAgcmV0dXJuIG5ldyBDYWNoZVBvbGljeSh0aGlzLCBcIk9wZW5OZXh0U2VydmVyQ2FjaGVQb2xpY3lcIiwge1xuICAgICAgcXVlcnlTdHJpbmdCZWhhdmlvcjogQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLmFsbCgpLFxuICAgICAgaGVhZGVyQmVoYXZpb3I6IENhY2hlSGVhZGVyQmVoYXZpb3IuYWxsb3dMaXN0KFxuICAgICAgICBcImFjY2VwdFwiLFxuICAgICAgICBcImFjY2VwdC1lbmNvZGluZ1wiLFxuICAgICAgICBcInJzY1wiLFxuICAgICAgICBcIm5leHQtcm91dGVyLXByZWZldGNoXCIsXG4gICAgICAgIFwibmV4dC1yb3V0ZXItc3RhdGUtdHJlZVwiLFxuICAgICAgICBcIm5leHQtdXJsXCIsXG4gICAgICAgIFwieC1wcmVyZW5kZXItcmV2YWxpZGF0ZVwiXG4gICAgICApLFxuICAgICAgY29va2llQmVoYXZpb3I6IENhY2hlQ29va2llQmVoYXZpb3Iubm9uZSgpLFxuICAgICAgZGVmYXVsdFR0bDogRHVyYXRpb24uZGF5cygwKSxcbiAgICAgIG1heFR0bDogRHVyYXRpb24uZGF5cygzNjUpLFxuICAgICAgbWluVHRsOiBEdXJhdGlvbi5kYXlzKDApLFxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVN0YXRpY0NhY2hlUG9saWN5KCkge1xuICAgIHJldHVybiBDYWNoZVBvbGljeS5DQUNISU5HX09QVElNSVpFRFxuICB9XG59XG4iXX0=
|
|
293
|
+
NextjsSite[_a] = { fqn: "cdk-opennext.NextjsSite", version: "0.3.1" };
|
|
294
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3Blbi1uZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL29wZW4tbmV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDJCQUFpQztBQUNqQyw2QkFBNEI7QUFDNUIsK0VBQTBGO0FBQzFGLCtEQWdCbUM7QUFDbkMsK0VBQStFO0FBQy9FLDJEQUFtRjtBQUVuRix1REFRK0I7QUFDL0IsbUZBQXFFO0FBQ3JFLG1EQUE4RDtBQUM5RCx5REFBd0Y7QUFDeEYseUVBQWtFO0FBQ2xFLCtDQUE4RDtBQUM5RCxxRUFBd0U7QUFDeEUsaURBQTJDO0FBQzNDLDJDQUFxRjtBQUNyRixtRUFBdUQ7QUFDdkQsMkNBQXNDO0FBbUh0QyxNQUFhLFVBQVcsU0FBUSxzQkFBUztJQWV2QyxJQUFXLHFCQUFxQjtRQUM5QixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQTtJQUNwQyxDQUFDO0lBRUQsSUFBVyxHQUFHO1FBQ1osT0FBTyxXQUFXLElBQUksQ0FBQyxZQUFZLENBQUMsc0JBQXNCLEVBQUUsQ0FBQTtJQUM5RCxDQUFDO0lBRUQsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQjtZQUMzQixDQUFDLENBQUMsV0FBVyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDckMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsRUFBRSxDQUFBO0lBQzNELENBQUM7SUFFRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXNCO1FBQzlELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDaEIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQTtRQUN0RCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQzlCLElBQUEsaUJBQVksRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsdUJBQXVC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b20gXCJmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCB7IERuc1ZhbGlkYXRlZENlcnRpZmljYXRlLCBJQ2VydGlmaWNhdGUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlclwiXG5pbXBvcnQge1xuICBBbGxvd2VkTWV0aG9kcyxcbiAgdHlwZSBCZWhhdmlvck9wdGlvbnMsXG4gIENhY2hlQ29va2llQmVoYXZpb3IsXG4gIENhY2hlSGVhZGVyQmVoYXZpb3IsXG4gIENhY2hlUG9saWN5LFxuICBDYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IsXG4gIENhY2hlZE1ldGhvZHMsXG4gIERpc3RyaWJ1dGlvbixcbiAgdHlwZSBJQ2FjaGVQb2xpY3ksXG4gIHR5cGUgSU9yaWdpbixcbiAgVmlld2VyUHJvdG9jb2xQb2xpY3ksXG4gIEZ1bmN0aW9uRXZlbnRUeXBlLFxuICBPcmlnaW5SZXF1ZXN0UG9saWN5LFxuICBGdW5jdGlvbiBhcyBDbG91ZGZyb250RnVuY3Rpb24sXG4gIEZ1bmN0aW9uQ29kZSxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250XCJcbmltcG9ydCB7IEh0dHBPcmlnaW4sIFMzQnVja2V0T3JpZ2luIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250LW9yaWdpbnNcIlxuaW1wb3J0IHsgVGFibGVWMiBhcyBUYWJsZSwgQXR0cmlidXRlVHlwZSwgQmlsbGluZyB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGJcIlxuaW1wb3J0IHsgdHlwZSBJR3JhbnRhYmxlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIlxuaW1wb3J0IHtcbiAgQ29kZSxcbiAgRnVuY3Rpb24gYXMgQ2RrRnVuY3Rpb24sXG4gIHR5cGUgRnVuY3Rpb25PcHRpb25zLFxuICBGdW5jdGlvblVybEF1dGhUeXBlLFxuICBJbnZva2VNb2RlLFxuICBSdW50aW1lLFxuICBBcmNoaXRlY3R1cmUsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCJcbmltcG9ydCB7IFNxc0V2ZW50U291cmNlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGEtZXZlbnQtc291cmNlc1wiXG5pbXBvcnQgeyBMb2dHcm91cCwgUmV0ZW50aW9uRGF5cyB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbG9nc1wiXG5pbXBvcnQgeyBBYWFhUmVjb3JkLCBBUmVjb3JkLCBJSG9zdGVkWm9uZSwgUmVjb3JkVGFyZ2V0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yb3V0ZTUzXCJcbmltcG9ydCB7IENsb3VkRnJvbnRUYXJnZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTMtdGFyZ2V0c1wiXG5pbXBvcnQgeyBCbG9ja1B1YmxpY0FjY2VzcywgQnVja2V0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiXG5pbXBvcnQgeyBCdWNrZXREZXBsb3ltZW50LCBTb3VyY2UgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzLWRlcGxveW1lbnRcIlxuaW1wb3J0IHsgUXVldWUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNxc1wiXG5pbXBvcnQgeyBDdXN0b21SZXNvdXJjZSwgRHVyYXRpb24sIEZuLCBSZW1vdmFsUG9saWN5LCBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYi9jb3JlXCJcbmltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSBcImF3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXNcIlxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIlxuXG50eXBlIEJhc2VGdW5jdGlvbiA9IHtcbiAgaGFuZGxlcjogc3RyaW5nXG4gIGJ1bmRsZTogc3RyaW5nXG59XG5cbnR5cGUgT3Blbk5leHRGdW5jdGlvbk9yaWdpbiA9IHtcbiAgdHlwZTogXCJmdW5jdGlvblwiXG4gIHN0cmVhbWluZz86IGJvb2xlYW5cbn0gJiBCYXNlRnVuY3Rpb25cblxudHlwZSBPcGVuTmV4dFMzT3JpZ2luID0ge1xuICB0eXBlOiBcInMzXCJcbiAgb3JpZ2luUGF0aDogc3RyaW5nXG4gIGNvcHk6IHtcbiAgICBmcm9tOiBzdHJpbmdcbiAgICB0bzogc3RyaW5nXG4gICAgY2FjaGVkOiBib29sZWFuXG4gICAgdmVyc2lvbmVkU3ViRGlyPzogc3RyaW5nXG4gIH1bXVxufVxuXG50eXBlIE9wZW5OZXh0T3JpZ2lucyA9IE9wZW5OZXh0RnVuY3Rpb25PcmlnaW4gfCBPcGVuTmV4dFMzT3JpZ2luXG5cbmludGVyZmFjZSBPcGVuTmV4dE91dHB1dCB7XG4gIGVkZ2VGdW5jdGlvbnM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBCYXNlRnVuY3Rpb25cbiAgfVxuICBvcmlnaW5zOiB7XG4gICAgczM6IE9wZW5OZXh0UzNPcmlnaW5cbiAgICBkZWZhdWx0OiBPcGVuTmV4dEZ1bmN0aW9uT3JpZ2luXG4gICAgaW1hZ2VPcHRpbWl6ZXI6IE9wZW5OZXh0RnVuY3Rpb25PcmlnaW5cbiAgICBba2V5OiBzdHJpbmddOiBPcGVuTmV4dE9yaWdpbnNcbiAgfVxuICBiZWhhdmlvcnM6IHtcbiAgICBwYXR0ZXJuOiBzdHJpbmdcbiAgICBvcmlnaW4/OiBzdHJpbmdcbiAgICBlZGdlRnVuY3Rpb24/OiBzdHJpbmdcbiAgfVtdXG4gIGFkZGl0aW9uYWxQcm9wcz86IHtcbiAgICBkaXNhYmxlSW5jcmVtZW50YWxDYWNoZT86IGJvb2xlYW5cbiAgICBkaXNhYmxlVGFnQ2FjaGU/OiBib29sZWFuXG4gICAgaW5pdGlhbGl6YXRpb25GdW5jdGlvbj86IEJhc2VGdW5jdGlvblxuICAgIHdhcm1lcj86IEJhc2VGdW5jdGlvblxuICAgIHJldmFsaWRhdGlvbkZ1bmN0aW9uPzogQmFzZUZ1bmN0aW9uXG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wcyBmb3IgTGFtYmRhIGZ1bmN0aW9ucywgZXhjbHVkaW5nIGhhbmRsZXIgYW5kIGNvZGUgd2hpY2ggYXJlIHNldCBieSB0aGUgY29uc3RydWN0LlxuICogRXh0ZW5kcyBGdW5jdGlvbk9wdGlvbnMgYW5kIGFkZHMgcnVudGltZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWZhdWx0RnVuY3Rpb25Qcm9wcyBleHRlbmRzIEZ1bmN0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgcnVudGltZSBlbnZpcm9ubWVudCBmb3IgdGhlIExhbWJkYSBmdW5jdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgUnVudGltZS5OT0RFSlNfMjRfWFxuICAgKi9cbiAgcmVhZG9ubHkgcnVudGltZT86IFJ1bnRpbWVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEaXN0cmlidXRpb25Eb21haW5Qcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgZG9tYWluIHRvIGJlIGFzc2lnbmVkIHRvIHRoZSB3ZWJzaXRlIFVSTCAoaWUuIGRvbWFpbi5jb20pLlxuICAgKlxuICAgKiBTdXBwb3J0cyBkb21haW5zIHRoYXQgYXJlIGhvc3RlZCBlaXRoZXIgb24gW1JvdXRlIDUzXShodHRwczovL2F3cy5hbWF6b24uY29tL3JvdXRlNTMvKSBvciBleHRlcm5hbGx5LlxuICAgKi9cbiAgcmVhZG9ubHkgZG9tYWluTmFtZTogc3RyaW5nXG5cbiAgLyoqXG4gICAqIEltcG9ydCB0aGUgdW5kZXJseWluZyBSb3V0ZSA1MyBob3N0ZWQgem9uZS5cbiAgICpcbiAgICogUmVxdWlyZWQgaWYgYGNlcnRpZmljYXRlYCBpcyBub3QgcHJvdmlkZWQuIFdoZW4gcHJvdmlkZWQsIGEgRE5TLXZhbGlkYXRlZFxuICAgKiBjZXJ0aWZpY2F0ZSB3aWxsIGJlIGNyZWF0ZWQgYXV0b21hdGljYWxseSBhbmQgRE5TIGFsaWFzZXMgd2lsbCBiZSBzZXQgdXAuXG4gICAqL1xuICByZWFkb25seSBob3N0ZWRab25lPzogSUhvc3RlZFpvbmVcblxuICAvKipcbiAgICogVGhlIEFDTSBjZXJ0aWZpY2F0ZSB0byB1c2UgZm9yIHRoZSBjdXN0b20gZG9tYWluLlxuICAgKlxuICAgKiBSZXF1aXJlZCBpZiBgaG9zdGVkWm9uZWAgaXMgbm90IHByb3ZpZGVkLiBUaGUgY2VydGlmaWNhdGUgbXVzdCBiZSBpblxuICAgKiB1cy1lYXN0LTEgZm9yIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9ucy5cbiAgICpcbiAgICogV2hlbiBwcm92aWRlZCB3aXRob3V0IGBob3N0ZWRab25lYCwgbm8gRE5TIGFsaWFzZXMgd2lsbCBiZSBjcmVhdGVkXG4gICAqIGFuZCB5b3UgbXVzdCBjb25maWd1cmUgRE5TIHJlY29yZHMgZXh0ZXJuYWxseS5cbiAgICovXG4gIHJlYWRvbmx5IGNlcnRpZmljYXRlPzogSUNlcnRpZmljYXRlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzU2l0ZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBjdXN0b21Eb21haW4gZm9yIHRoaXMgd2Vic2l0ZS4gVGhpcyBkb21haW4gbXVzdCBiZSBob3N0ZWQgaW5cbiAgICogcm91dGU1MywgYW5kIHdlIG11c3QgYmUgYWJsZSB0byBjcmVhdGUgYW4gQUNNIGNlcnRpZmljYXRlIGZvciB0aGlzXG4gICAqIGRvbWFpbi5cbiAgICpcbiAgICogTm90ZSB0aGF0IHlvdSBjYW4gYWxzbyBtaWdyYXRlIGV4dGVybmFsbHkgaG9zdGVkIGRvbWFpbnMgdG8gUm91dGUgNTMgYnlcbiAgICogW2ZvbGxvd2luZyB0aGlzIGd1aWRlXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vUm91dGU1My9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvTWlncmF0aW5nRE5TLmh0bWwpLlxuICAgKi9cbiAgcmVhZG9ubHkgY3VzdG9tRG9tYWluPzogRGlzdHJpYnV0aW9uRG9tYWluUHJvcHNcblxuICAvKipcbiAgICogU2hvdWxkIHBvaW50IHRvIHRoZSAub3Blbi1uZXh0IGRpcmVjdG9yeS5cbiAgICpcbiAgICogQGRlZmF1bHQgXCIub3Blbi1uZXh0XCJcbiAgICovXG4gIHJlYWRvbmx5IG9wZW5OZXh0UGF0aD86IHN0cmluZyB8IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHByb3BzIHRvIGFwcGx5IHRvIGFsbCBMYW1iZGEgZnVuY3Rpb25zIGNyZWF0ZWQgYnkgdGhpcyBjb25zdHJ1Y3QuXG4gICAqIFRoZXNlIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHNwZWNpZmljIGZ1bmN0aW9uIGNvbmZpZ3VyYXRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdEZ1bmN0aW9uUHJvcHM/OiBEZWZhdWx0RnVuY3Rpb25Qcm9wc1xufVxuXG5leHBvcnQgY2xhc3MgTmV4dGpzU2l0ZSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHByaXZhdGUgb3Blbk5leHRPdXRwdXQ6IE9wZW5OZXh0T3V0cHV0XG4gIHByaXZhdGUgYnVja2V0OiBCdWNrZXRcbiAgcHJpdmF0ZSB0YWJsZTogVGFibGVcbiAgcHJpdmF0ZSBxdWV1ZTogUXVldWVcblxuICBwcml2YXRlIHN0YXRpY0NhY2hlUG9saWN5OiBJQ2FjaGVQb2xpY3lcbiAgcHJpdmF0ZSBzZXJ2ZXJDYWNoZVBvbGljeTogQ2FjaGVQb2xpY3lcblxuICBwcml2YXRlIG9wZW5OZXh0UGF0aDogc3RyaW5nXG5cbiAgcHVibGljIHJlYWRvbmx5IGRpc3RyaWJ1dGlvbjogRGlzdHJpYnV0aW9uXG4gIHByaXZhdGUgX2RlZmF1bHRTZXJ2ZXJGdW5jdGlvbiE6IENka0Z1bmN0aW9uXG4gIHByaXZhdGUgX2N1c3RvbURvbWFpbk5hbWU/OiBzdHJpbmdcblxuICBwdWJsaWMgZ2V0IGRlZmF1bHRTZXJ2ZXJGdW5jdGlvbigpOiBDZGtGdW5jdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRTZXJ2ZXJGdW5jdGlvblxuICB9XG5cbiAgcHVibGljIGdldCB1cmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGh0dHBzOi8vJHt0aGlzLmRpc3RyaWJ1dGlvbi5kaXN0cmlidXRpb25Eb21haW5OYW1lfWBcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY3VzdG9tRG9tYWluVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2N1c3RvbURvbWFpbk5hbWVcbiAgICAgID8gYGh0dHBzOi8vJHt0aGlzLl9jdXN0b21Eb21haW5OYW1lfWBcbiAgICAgIDogYGh0dHBzOi8vJHt0aGlzLmRpc3RyaWJ1dGlvbi5kaXN0cmlidXRpb25Eb21haW5OYW1lfWBcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBOZXh0anNTaXRlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG4gICAgdGhpcy5vcGVuTmV4dFBhdGggPSBwcm9wcy5vcGVuTmV4dFBhdGggPz8gXCIub3Blbi1uZXh0XCJcbiAgICB0aGlzLm9wZW5OZXh0T3V0cHV0ID0gSlNPTi5wYXJzZShcbiAgICAgIHJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5vcGVuTmV4dFBhdGgsIFwib3Blbi1uZXh0Lm91dHB1dC5qc29uXCIpLCBcInV0Zi04XCIpXG4gICAgKSBhcyBPcGVuTmV4dE91dHB1dFxuXG4gICAgdGhpcy5fY3VzdG9tRG9tYWluTmFtZSA9IHByb3BzLmN1c3RvbURvbWFpbj8uZG9tYWluTmFtZVxuXG4gICAgLy8gVmFsaWRhdGUgY3VzdG9tRG9tYWluIHByb3BzOiBlaXRoZXIgY2VydGlmaWNhdGUgb3IgaG9zdGVkWm9uZSBtdXN0IGJlIHByb3ZpZGVkXG4gICAgaWYgKFxuICAgICAgcHJvcHMuY3VzdG9tRG9tYWluICYmXG4gICAgICAhcHJvcHMuY3VzdG9tRG9tYWluLmNlcnRpZmljYXRlICYmXG4gICAgICAhcHJvcHMuY3VzdG9tRG9tYWluLmhvc3RlZFpvbmVcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJjdXN0b21Eb21haW4gcmVxdWlyZXMgZWl0aGVyIGEgY2VydGlmaWNhdGUgb3IgYSBob3N0ZWRab25lLiBcIiArXG4gICAgICAgICAgXCJQcm92aWRlIGEgaG9zdGVkWm9uZSB0byBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBhIEROUy12YWxpZGF0ZWQgY2VydGlmaWNhdGUsIFwiICtcbiAgICAgICAgICBcIm9yIHByb3ZpZGUgeW91ciBvd24gY2VydGlmaWNhdGUuXCJcbiAgICAgIClcbiAgICB9XG5cbiAgICB0aGlzLmJ1Y2tldCA9IG5ldyBCdWNrZXQodGhpcywgXCJTM0J1Y2tldFwiLCB7XG4gICAgICBwdWJsaWNSZWFkQWNjZXNzOiBmYWxzZSxcbiAgICAgIGJsb2NrUHVibGljQWNjZXNzOiBCbG9ja1B1YmxpY0FjY2Vzcy5CTE9DS19BTEwsXG4gICAgICBhdXRvRGVsZXRlT2JqZWN0czogdHJ1ZSxcbiAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgIGVuZm9yY2VTU0w6IHRydWUsXG4gICAgfSlcbiAgICB0aGlzLnRhYmxlID0gdGhpcy5jcmVhdGVSZXZhbGlkYXRpb25UYWJsZSgpXG4gICAgdGhpcy5xdWV1ZSA9IHRoaXMuY3JlYXRlUmV2YWxpZGF0aW9uUXVldWUoKVxuXG4gICAgLy8gVXNlIHByb3ZpZGVkIGNlcnRpZmljYXRlIG9yIGNyZWF0ZSBvbmUgaWYgaG9zdGVkWm9uZSBpcyBhdmFpbGFibGVcbiAgICBjb25zdCBjZXJ0aWZpY2F0ZSA9XG4gICAgICBwcm9wcy5jdXN0b21Eb21haW4/LmNlcnRpZmljYXRlID8/XG4gICAgICAocHJvcHMuY3VzdG9tRG9tYWluPy5ob3N0ZWRab25lXG4gICAgICAgID8gdGhpcy5jcmVhdGVDZXJ0aWZpY2F0ZShcbiAgICAgICAgICAgIHByb3BzLmN1c3RvbURvbWFpbi5kb21haW5OYW1lLFxuICAgICAgICAgICAgcHJvcHMuY3VzdG9tRG9tYWluLmhvc3RlZFpvbmVcbiAgICAgICAgICApXG4gICAgICAgIDogdW5kZWZpbmVkKVxuXG4gICAgY29uc3Qgb3JpZ2lucyA9IHRoaXMuY3JlYXRlT3JpZ2lucyhwcm9wcy5kZWZhdWx0RnVuY3Rpb25Qcm9wcylcbiAgICB0aGlzLnNlcnZlckNhY2hlUG9saWN5ID0gdGhpcy5jcmVhdGVTZXJ2ZXJDYWNoZVBvbGljeSgpXG4gICAgdGhpcy5zdGF0aWNDYWNoZVBvbGljeSA9IHRoaXMuY3JlYXRlU3RhdGljQ2FjaGVQb2xpY3koKVxuICAgIHRoaXMuZGlzdHJpYnV0aW9uID0gdGhpcy5jcmVhdGVEaXN0cmlidXRpb24ob3JpZ2lucywgcHJvcHMsIGNlcnRpZmljYXRlKVxuICAgIGlmIChwcm9wcy5jdXN0b21Eb21haW4gJiYgcHJvcHMuY3VzdG9tRG9tYWluLmhvc3RlZFpvbmUpIHtcbiAgICAgIG5ldyBBUmVjb3JkKHRoaXMsIFwiQWxpYXNSZWNvcmRcIiwge1xuICAgICAgICB6b25lOiBwcm9wcy5jdXN0b21Eb21haW4uaG9zdGVkWm9uZSxcbiAgICAgICAgcmVjb3JkTmFtZTogcHJvcHMuY3VzdG9tRG9tYWluLmRvbWFpbk5hbWUsXG4gICAgICAgIHRhcmdldDogUmVjb3JkVGFyZ2V0LmZyb21BbGlhcyhuZXcgQ2xvdWRGcm9udFRhcmdldCh0aGlzLmRpc3RyaWJ1dGlvbikpLFxuICAgICAgfSlcblxuICAgICAgbmV3IEFhYWFSZWNvcmQodGhpcywgXCJBbGlhc1JlY29yZEFBQUFcIiwge1xuICAgICAgICB6b25lOiBwcm9wcy5jdXN0b21Eb21haW4uaG9zdGVkWm9uZSxcbiAgICAgICAgcmVjb3JkTmFtZTogcHJvcHMuY3VzdG9tRG9tYWluLmRvbWFpbk5hbWUsXG4gICAgICAgIHRhcmdldDogUmVjb3JkVGFyZ2V0LmZyb21BbGlhcyhuZXcgQ2xvdWRGcm9udFRhcmdldCh0aGlzLmRpc3RyaWJ1dGlvbikpLFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNlcnRpZmljYXRlKGRvbWFpbk5hbWU6IHN0cmluZywgaG9zdGVkWm9uZTogSUhvc3RlZFpvbmUpIHtcbiAgICAvLyBDbG91ZEZyb250IHJlcXVpcmVzIGNlcnRpZmljYXRlcyB0byBiZSBpbiB1cy1lYXN0LTFcbiAgICAvLyBEbnNWYWxpZGF0ZWRDZXJ0aWZpY2F0ZSBoYW5kbGVzIGNyb3NzLXJlZ2lvbiBjZXJ0aWZpY2F0ZSBjcmVhdGlvbiBhdXRvbWF0aWNhbGx5XG4gICAgcmV0dXJuIG5ldyBEbnNWYWxpZGF0ZWRDZXJ0aWZpY2F0ZSh0aGlzLCBcIkNlcnRpZmljYXRlXCIsIHtcbiAgICAgIGRvbWFpbk5hbWUsXG4gICAgICBob3N0ZWRab25lLFxuICAgICAgcmVnaW9uOiBcInVzLWVhc3QtMVwiLFxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJldmFsaWRhdGlvblRhYmxlKCkge1xuICAgIGNvbnN0IHRhYmxlID0gbmV3IFRhYmxlKHRoaXMsIFwiUmV2YWxpZGF0aW9uVGFibGVcIiwge1xuICAgICAgcGFydGl0aW9uS2V5OiB7IG5hbWU6IFwidGFnXCIsIHR5cGU6IEF0dHJpYnV0ZVR5cGUuU1RSSU5HIH0sXG4gICAgICBzb3J0S2V5OiB7IG5hbWU6IFwicGF0aFwiLCB0eXBlOiBBdHRyaWJ1dGVUeXBlLlNUUklORyB9LFxuICAgICAgcG9pbnRJblRpbWVSZWNvdmVyeVNwZWNpZmljYXRpb246IHtcbiAgICAgICAgcG9pbnRJblRpbWVSZWNvdmVyeUVuYWJsZWQ6IHRydWUsXG4gICAgICB9LFxuICAgICAgYmlsbGluZzogQmlsbGluZy5vbkRlbWFuZCgpLFxuICAgICAgZ2xvYmFsU2Vjb25kYXJ5SW5kZXhlczogW1xuICAgICAgICB7XG4gICAgICAgICAgaW5kZXhOYW1lOiBcInJldmFsaWRhdGVcIixcbiAgICAgICAgICBwYXJ0aXRpb25LZXk6IHsgbmFtZTogXCJwYXRoXCIsIHR5cGU6IEF0dHJpYnV0ZVR5cGUuU1RSSU5HIH0sXG4gICAgICAgICAgc29ydEtleTogeyBuYW1lOiBcInJldmFsaWRhdGVkQXRcIiwgdHlwZTogQXR0cmlidXRlVHlwZS5OVU1CRVIgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgfSlcblxuICAgIGNvbnN0IGluaXRGbiA9IHRoaXMub3Blbk5leHRPdXRwdXQuYWRkaXRpb25hbFByb3BzPy5pbml0aWFsaXphdGlvbkZ1bmN0aW9uXG5cbiAgICBjb25zdCBpbnNlcnRGbiA9IG5ldyBDZGtGdW5jdGlvbih0aGlzLCBcIlJldmFsaWRhdGlvbkluc2VydEZ1bmN0aW9uXCIsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIk5leHQuanMgcmV2YWxpZGF0aW9uIGRhdGEgaW5zZXJ0XCIsXG4gICAgICBoYW5kbGVyOiBpbml0Rm4/LmhhbmRsZXIgPz8gXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICAvLyBjb2RlOiBDb2RlLmZyb21Bc3NldChpbml0Rm4/LmJ1bmRsZSA/PyBcIlwiKSxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KHBhdGguam9pbih0aGlzLm9wZW5OZXh0UGF0aCwgXCJkeW5hbW9kYi1wcm92aWRlclwiKSksXG4gICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yNF9YLFxuICAgICAgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUuQVJNXzY0LFxuICAgICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcygxNSksXG4gICAgICBtZW1vcnlTaXplOiAxMjgsXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBDQUNIRV9EWU5BTU9fVEFCTEU6IHRhYmxlLnRhYmxlTmFtZSxcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IHByb3ZpZGVyTG9nR3JvdXAgPSBuZXcgTG9nR3JvdXAodGhpcywgXCJSZXZhbGlkYXRpb25Qcm92aWRlckxvZ0dyb3VwXCIsIHtcbiAgICAgIHJldGVudGlvbjogUmV0ZW50aW9uRGF5cy5PTkVfREFZLFxuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgIH0pXG5cbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBQcm92aWRlcih0aGlzLCBcIlJldmFsaWRhdGlvblByb3ZpZGVyXCIsIHtcbiAgICAgIG9uRXZlbnRIYW5kbGVyOiBpbnNlcnRGbixcbiAgICAgIGxvZ0dyb3VwOiBwcm92aWRlckxvZ0dyb3VwLFxuICAgIH0pXG5cbiAgICBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgXCJSZXZhbGlkYXRpb25SZXNvdXJjZVwiLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IHByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgdmVyc2lvbjogRGF0ZS5ub3coKS50b1N0cmluZygpLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgcmV0dXJuIHRhYmxlXG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU9yaWdpbnMoZGVmYXVsdEZ1bmN0aW9uUHJvcHM/OiBEZWZhdWx0RnVuY3Rpb25Qcm9wcykge1xuICAgIGNvbnN0IHtcbiAgICAgIHMzOiBzM09yaWdpbixcbiAgICAgIGRlZmF1bHQ6IGRlZmF1bHRPcmlnaW4sXG4gICAgICBpbWFnZU9wdGltaXplcjogaW1hZ2VPcmlnaW4sXG4gICAgICAuLi5yZXN0T3JpZ2luc1xuICAgIH0gPSB0aGlzLm9wZW5OZXh0T3V0cHV0Lm9yaWdpbnNcbiAgICBmb3IgKGNvbnN0IGNvcHkgb2YgczNPcmlnaW4uY29weSkge1xuICAgICAgbmV3IEJ1Y2tldERlcGxveW1lbnQodGhpcywgYE9wZW5OZXh0QnVja2V0RGVwbG95bWVudCR7Y29weS5mcm9tfWAsIHtcbiAgICAgICAgc291cmNlczogW1NvdXJjZS5hc3NldChwYXRoLmpvaW4odGhpcy5vcGVuTmV4dFBhdGgsIFwiLi5cIiwgY29weS5mcm9tKSldLFxuICAgICAgICBkZXN0aW5hdGlvbkJ1Y2tldDogdGhpcy5idWNrZXQsXG4gICAgICAgIGRlc3RpbmF0aW9uS2V5UHJlZml4OiBjb3B5LnRvLFxuICAgICAgICBwcnVuZTogZmFsc2UsXG4gICAgICB9KVxuICAgIH1cbiAgICBjb25zdCBvcmlnaW5zID0ge1xuICAgICAgczM6IFMzQnVja2V0T3JpZ2luLndpdGhPcmlnaW5BY2Nlc3NDb250cm9sKHRoaXMuYnVja2V0LCB7XG4gICAgICAgIG9yaWdpbklkOiBcIlMzQnVja2V0XCIsXG4gICAgICAgIG9yaWdpblBhdGg6IHMzT3JpZ2luLm9yaWdpblBhdGgsXG4gICAgICB9KSxcbiAgICAgIGRlZmF1bHQ6IHRoaXMuY3JlYXRlRnVuY3Rpb25PcmlnaW4oXG4gICAgICAgIFwiZGVmYXVsdFwiLFxuICAgICAgICBkZWZhdWx0T3JpZ2luLFxuICAgICAgICBcIk5leHRKc1NlcnZlclwiLFxuICAgICAgICBkZWZhdWx0RnVuY3Rpb25Qcm9wc1xuICAgICAgKSxcbiAgICAgIGltYWdlT3B0aW1pemVyOiB0aGlzLmNyZWF0ZUZ1bmN0aW9uT3JpZ2luKFxuICAgICAgICBcImltYWdlT3B0aW1pemVyXCIsXG4gICAgICAgIGltYWdlT3JpZ2luLFxuICAgICAgICBcIkltYWdlT3B0aW1pemVyXCJcbiAgICAgICksXG4gICAgICAuLi5PYmplY3QuZW50cmllcyhyZXN0T3JpZ2lucykucmVkdWNlKFxuICAgICAgICAoYWNjLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICBjb25zdCBvcmlnaW5JZCA9IGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zbGljZSgxKVxuICAgICAgICAgIGlmICh2YWx1ZS50eXBlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGFjY1trZXldID0gdGhpcy5jcmVhdGVGdW5jdGlvbk9yaWdpbihrZXksIHZhbHVlLCBvcmlnaW5JZClcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgICB9LFxuICAgICAgICB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBIdHRwT3JpZ2luPlxuICAgICAgKSxcbiAgICB9XG4gICAgcmV0dXJuIG9yaWdpbnNcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUmV2YWxpZGF0aW9uUXVldWUoKSB7XG4gICAgY29uc3QgcXVldWUgPSBuZXcgUXVldWUodGhpcywgXCJSZXZhbGlkYXRpb25RdWV1ZVwiLCB7XG4gICAgICBmaWZvOiB0cnVlLFxuICAgICAgcmVjZWl2ZU1lc3NhZ2VXYWl0VGltZTogRHVyYXRpb24uc2Vjb25kcygyMCksXG4gICAgfSlcbiAgICBjb25zdCBjb25zdW1lciA9IG5ldyBDZGtGdW5jdGlvbih0aGlzLCBcIlJldmFsaWRhdGlvbkZ1bmN0aW9uXCIsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIk5leHQuanMgcmV2YWxpZGF0b3JcIixcbiAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgY29kZTogQ29kZS5mcm9tQXNzZXQoXG4gICAgICAgIHRoaXMub3Blbk5leHRPdXRwdXQuYWRkaXRpb25hbFByb3BzPy5yZXZhbGlkYXRpb25GdW5jdGlvbj8uYnVuZGxlXG4gICAgICAgICAgPyBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgIHRoaXMub3Blbk5leHRQYXRoLFxuICAgICAgICAgICAgICBcIi4uXCIsXG4gICAgICAgICAgICAgIHRoaXMub3Blbk5leHRPdXRwdXQuYWRkaXRpb25hbFByb3BzPy5yZXZhbGlkYXRpb25GdW5jdGlvbj8uYnVuZGxlXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBcIlwiXG4gICAgICApLFxuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMzApLFxuICAgIH0pXG4gICAgY29uc3VtZXIuYWRkRXZlbnRTb3VyY2UobmV3IFNxc0V2ZW50U291cmNlKHF1ZXVlLCB7IGJhdGNoU2l6ZTogNSB9KSlcbiAgICByZXR1cm4gcXVldWVcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RW52aXJvbm1lbnQoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIENBQ0hFX0JVQ0tFVF9OQU1FOiB0aGlzLmJ1Y2tldC5idWNrZXROYW1lLFxuICAgICAgQ0FDSEVfQlVDS0VUX0tFWV9QUkVGSVg6IFwiX2NhY2hlXCIsXG4gICAgICBDQUNIRV9CVUNLRVRfUkVHSU9OOiBTdGFjay5vZih0aGlzKS5yZWdpb24sXG4gICAgICBSRVZBTElEQVRJT05fUVVFVUVfVVJMOiB0aGlzLnF1ZXVlLnF1ZXVlVXJsLFxuICAgICAgUkVWQUxJREFUSU9OX1FVRVVFX1JFR0lPTjogU3RhY2sub2YodGhpcykucmVnaW9uLFxuICAgICAgQ0FDSEVfRFlOQU1PX1RBQkxFOiB0aGlzLnRhYmxlLnRhYmxlTmFtZSxcbiAgICAgIC8vIFRob3NlIDIgYXJlIHVzZWQgb25seSBmb3IgaW1hZ2Ugb3B0aW1pemVyXG4gICAgICBCVUNLRVRfTkFNRTogdGhpcy5idWNrZXQuYnVja2V0TmFtZSxcbiAgICAgIEJVQ0tFVF9LRVlfUFJFRklYOiBcIl9hc3NldHNcIixcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdyYW50UGVybWlzc2lvbnMoZ3JhbnRhYmxlOiBJR3JhbnRhYmxlKSB7XG4gICAgdGhpcy5idWNrZXQuZ3JhbnRSZWFkV3JpdGUoZ3JhbnRhYmxlKVxuICAgIHRoaXMudGFibGUuZ3JhbnRSZWFkV3JpdGVEYXRhKGdyYW50YWJsZSlcbiAgICB0aGlzLnF1ZXVlLmdyYW50U2VuZE1lc3NhZ2VzKGdyYW50YWJsZSlcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRnVuY3Rpb25PcmlnaW4oXG4gICAga2V5OiBzdHJpbmcsXG4gICAgb3JpZ2luOiBPcGVuTmV4dEZ1bmN0aW9uT3JpZ2luLFxuICAgIG9yaWdpbklkPzogc3RyaW5nLFxuICAgIGZuUHJvcHM/OiBEZWZhdWx0RnVuY3Rpb25Qcm9wc1xuICApIHtcbiAgICBjb25zdCBlbnZpcm9ubWVudCA9IHRoaXMuZ2V0RW52aXJvbm1lbnQoKVxuICAgIGNvbnN0IGZuID0gbmV3IENka0Z1bmN0aW9uKHRoaXMsIGAke2tleX1GdW5jdGlvbmAsIHtcbiAgICAgIC4uLmZuUHJvcHMsXG4gICAgICBydW50aW1lOiBmblByb3BzPy5ydW50aW1lID8/IFJ1bnRpbWUuTk9ERUpTXzI0X1gsXG4gICAgICBhcmNoaXRlY3R1cmU6IGZuUHJvcHM/LmFyY2hpdGVjdHVyZSA/PyBBcmNoaXRlY3R1cmUuQVJNXzY0LFxuICAgICAgbWVtb3J5U2l6ZTogZm5Qcm9wcz8ubWVtb3J5U2l6ZSA/PyAxMDI0LFxuICAgICAgaGFuZGxlcjogb3JpZ2luLmhhbmRsZXIsXG4gICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChwYXRoLmpvaW4odGhpcy5vcGVuTmV4dFBhdGgsIFwiLi5cIiwgb3JpZ2luLmJ1bmRsZSkpLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgLi4uZm5Qcm9wcz8uZW52aXJvbm1lbnQsXG4gICAgICAgIC4uLmVudmlyb25tZW50LFxuICAgICAgfSxcbiAgICB9KVxuICAgIGNvbnN0IGZuVXJsID0gZm4uYWRkRnVuY3Rpb25Vcmwoe1xuICAgICAgYXV0aFR5cGU6IEZ1bmN0aW9uVXJsQXV0aFR5cGUuTk9ORSxcbiAgICAgIGludm9rZU1vZGU6IG9yaWdpbi5zdHJlYW1pbmcgPyBJbnZva2VNb2RlLlJFU1BPTlNFX1NUUkVBTSA6IEludm9rZU1vZGUuQlVGRkVSRUQsXG4gICAgfSlcbiAgICB0aGlzLmdyYW50UGVybWlzc2lvbnMoZm4pXG5cbiAgICAvLyBTdG9yZSByZWZlcmVuY2UgdG8gZGVmYXVsdCBzZXJ2ZXIgZnVuY3Rpb25cbiAgICBpZiAoa2V5ID09PSBcImRlZmF1bHRcIikge1xuICAgICAgdGhpcy5fZGVmYXVsdFNlcnZlckZ1bmN0aW9uID0gZm5cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEh0dHBPcmlnaW4oRm4ucGFyc2VEb21haW5OYW1lKGZuVXJsLnVybCksIHtcbiAgICAgIC4uLihvcmlnaW5JZCA/IHsgb3JpZ2luSWQgfSA6IHt9KSxcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEaXN0cmlidXRpb24oXG4gICAgb3JpZ2luczogUmVjb3JkPHN0cmluZywgSU9yaWdpbj4sXG4gICAgcHJvcHM6IE5leHRqc1NpdGVQcm9wcyxcbiAgICBjZXJ0aWZpY2F0ZT86IElDZXJ0aWZpY2F0ZVxuICApIHtcbiAgICBjb25zdCBjbG91ZGZyb250RnVuY3Rpb24gPSBuZXcgQ2xvdWRmcm9udEZ1bmN0aW9uKHRoaXMsIFwiQ2xvdWRGcm9udEZ1bmN0aW9uXCIsIHtcbiAgICAgIGNvZGU6IEZ1bmN0aW9uQ29kZS5mcm9tSW5saW5lKGBcblx0XHRcdGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQpIHtcblx0XHRcdFx0dmFyIHJlcXVlc3QgPSBldmVudC5yZXF1ZXN0O1xuXHRcdFx0XHRyZXF1ZXN0LmhlYWRlcnNbXCJ4LWZvcndhcmRlZC1ob3N0XCJdID0gcmVxdWVzdC5oZWFkZXJzLmhvc3Q7XG5cdFx0XHRcdHJldHVybiByZXF1ZXN0O1xuXHRcdFx0fVxuXHRcdFx0YCksXG4gICAgfSlcbiAgICBjb25zdCBmbkFzc29jaWF0aW9ucyA9IFtcbiAgICAgIHtcbiAgICAgICAgZnVuY3Rpb246IGNsb3VkZnJvbnRGdW5jdGlvbixcbiAgICAgICAgZXZlbnRUeXBlOiBGdW5jdGlvbkV2ZW50VHlwZS5WSUVXRVJfUkVRVUVTVCxcbiAgICAgIH0sXG4gICAgXVxuXG4gICAgY29uc3QgZGlzdHJpYnV0aW9uID0gbmV3IERpc3RyaWJ1dGlvbih0aGlzLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICBkb21haW5OYW1lczogcHJvcHMuY3VzdG9tRG9tYWluID8gW3Byb3BzLmN1c3RvbURvbWFpbi5kb21haW5OYW1lXSA6IHVuZGVmaW5lZCxcbiAgICAgIGNlcnRpZmljYXRlLFxuICAgICAgZGVmYXVsdEJlaGF2aW9yOiB7XG4gICAgICAgIG9yaWdpbjogb3JpZ2lucy5kZWZhdWx0ISwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICAgICAgYWxsb3dlZE1ldGhvZHM6IEFsbG93ZWRNZXRob2RzLkFMTE9XX0FMTCxcbiAgICAgICAgY2FjaGVkTWV0aG9kczogQ2FjaGVkTWV0aG9kcy5DQUNIRV9HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgICBjYWNoZVBvbGljeTogdGhpcy5zZXJ2ZXJDYWNoZVBvbGljeSxcbiAgICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeTogT3JpZ2luUmVxdWVzdFBvbGljeS5BTExfVklFV0VSX0VYQ0VQVF9IT1NUX0hFQURFUixcbiAgICAgICAgZnVuY3Rpb25Bc3NvY2lhdGlvbnM6IGZuQXNzb2NpYXRpb25zLFxuICAgICAgfSxcbiAgICAgIGFkZGl0aW9uYWxCZWhhdmlvcnM6IHRoaXMub3Blbk5leHRPdXRwdXQuYmVoYXZpb3JzXG4gICAgICAgIC5maWx0ZXIoKGIpID0+IGIucGF0dGVybiAhPT0gXCIqXCIpXG4gICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgKGFjYywgYmVoYXZpb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJlaGF2aW9yT3B0aW9uczogQmVoYXZpb3JPcHRpb25zID0ge1xuICAgICAgICAgICAgICBvcmlnaW46IChiZWhhdmlvci5vcmlnaW4gPyBvcmlnaW5zW2JlaGF2aW9yLm9yaWdpbl0gOiBvcmlnaW5zLmRlZmF1bHQpISwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICAgICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICAgICAgICAgICAgYWxsb3dlZE1ldGhvZHM6IEFsbG93ZWRNZXRob2RzLkFMTE9XX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICAgICAgICAgIGNhY2hlZE1ldGhvZHM6IENhY2hlZE1ldGhvZHMuQ0FDSEVfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgICAgICAgICAgY2FjaGVQb2xpY3k6XG4gICAgICAgICAgICAgICAgYmVoYXZpb3Iub3JpZ2luID09PSBcInMzXCJcbiAgICAgICAgICAgICAgICAgID8gdGhpcy5zdGF0aWNDYWNoZVBvbGljeVxuICAgICAgICAgICAgICAgICAgOiB0aGlzLnNlcnZlckNhY2hlUG9saWN5LFxuICAgICAgICAgICAgICAuLi4oYmVoYXZpb3Iub3JpZ2luID09PSBcInMzXCJcbiAgICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblJlcXVlc3RQb2xpY3k6XG4gICAgICAgICAgICAgICAgICAgICAgT3JpZ2luUmVxdWVzdFBvbGljeS5BTExfVklFV0VSX0VYQ0VQVF9IT1NUX0hFQURFUixcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBmdW5jdGlvbkFzc29jaWF0aW9uczogZm5Bc3NvY2lhdGlvbnMsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhY2NbYmVoYXZpb3IucGF0dGVybl0gPSBiZWhhdmlvck9wdGlvbnNcbiAgICAgICAgICAgIHJldHVybiBhY2NcbiAgICAgICAgICB9LFxuICAgICAgICAgIHt9IGFzIFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz5cbiAgICAgICAgKSxcbiAgICB9KVxuICAgIHJldHVybiBkaXN0cmlidXRpb25cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU2VydmVyQ2FjaGVQb2xpY3koKSB7XG4gICAgcmV0dXJuIG5ldyBDYWNoZVBvbGljeSh0aGlzLCBcIk9wZW5OZXh0U2VydmVyQ2FjaGVQb2xpY3lcIiwge1xuICAgICAgcXVlcnlTdHJpbmdCZWhhdmlvcjogQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLmFsbCgpLFxuICAgICAgaGVhZGVyQmVoYXZpb3I6IENhY2hlSGVhZGVyQmVoYXZpb3IuYWxsb3dMaXN0KFxuICAgICAgICBcImFjY2VwdFwiLFxuICAgICAgICBcImFjY2VwdC1lbmNvZGluZ1wiLFxuICAgICAgICBcInJzY1wiLFxuICAgICAgICBcIm5leHQtcm91dGVyLXByZWZldGNoXCIsXG4gICAgICAgIFwibmV4dC1yb3V0ZXItc3RhdGUtdHJlZVwiLFxuICAgICAgICBcIm5leHQtdXJsXCIsXG4gICAgICAgIFwieC1wcmVyZW5kZXItcmV2YWxpZGF0ZVwiXG4gICAgICApLFxuICAgICAgY29va2llQmVoYXZpb3I6IENhY2hlQ29va2llQmVoYXZpb3Iubm9uZSgpLFxuICAgICAgZGVmYXVsdFR0bDogRHVyYXRpb24uZGF5cygwKSxcbiAgICAgIG1heFR0bDogRHVyYXRpb24uZGF5cygzNjUpLFxuICAgICAgbWluVHRsOiBEdXJhdGlvbi5kYXlzKDApLFxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVN0YXRpY0NhY2hlUG9saWN5KCkge1xuICAgIHJldHVybiBDYWNoZVBvbGljeS5DQUNISU5HX09QVElNSVpFRFxuICB9XG59XG4iXX0=
|