@mavogel/mvc-projen 0.0.33 → 0.0.35
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/.claude/rules/mvc-projen-toolchain-maintenance.md +17 -10
- package/.jsii +11 -10
- package/README.md +17 -18
- package/assets/cdk-construct/src_crd-example.lambda.ts +5 -8
- package/assets/common/github_readme_cta.md +14 -14
- package/lib/projects/cdk-construct.js +82 -6
- package/mavogelmvcprojen/MvcCdkConstructLibraryOptions.go +9 -0
- package/mavogelmvcprojen/go.mod +2 -2
- package/mavogelmvcprojen/jsii/jsii.go +2 -2
- package/mavogelmvcprojen/version +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Toolchain Maintenance: projen / jsii / typescript
|
|
2
2
|
|
|
3
|
-
**Last Updated:** 2026-
|
|
3
|
+
**Last Updated:** 2026-09-12
|
|
4
4
|
|
|
5
5
|
This repo's own build (`.projenrc.ts`, a `cdk.JsiiProject`) pins several versions as literals. These pins exist for specific reasons — don't remove them without understanding why.
|
|
6
6
|
|
|
@@ -9,9 +9,15 @@ This repo's own build (`.projenrc.ts`, a `cdk.JsiiProject`) pins several version
|
|
|
9
9
|
| Setting | Value | Why pinned |
|
|
10
10
|
|---|---|---|
|
|
11
11
|
| `projenVersion` (const, top of file) | `0.101.17` | Source of truth for `package.json`'s `projen` entry — see below |
|
|
12
|
-
| `jsiiVersion` | `~
|
|
12
|
+
| `jsiiVersion` | `~6.0.0` | Compiler compatibility |
|
|
13
13
|
| `typescriptVersion` | `^6.0.2` | **Prevents drifting onto TypeScript 7** (see gotcha below) |
|
|
14
14
|
|
|
15
|
+
## Use Node 24 locally, matching `.nvmrc`
|
|
16
|
+
|
|
17
|
+
This repo's `.nvmrc` pins Node `24` — the version jsii's compiler actually supports (jsii's supported list: `^24.0.0`, `^22.0.0`, `^20.0.0` [deprecated]). Before running `npx projen`, `npm run build`, `npm install`, or any other repo command, switch to it: `nvm use` (reads `.nvmrc` automatically) or `nvm use 24`.
|
|
18
|
+
|
|
19
|
+
Running under a newer Node (e.g. Node 26, the current non-LTS release as of this writing) doesn't break the build, but every `jsii`/`jsii-pacmak` invocation prints an "untested node version" warning and clutters output — annoying to read through and easy to mistake for a real problem. If a shell's default Node is already 26+, run `nvm use 24` first rather than ignoring the warning.
|
|
20
|
+
|
|
15
21
|
## ⚠️ Gotcha: unpinned `typescript` devDependency drifts onto breaking majors
|
|
16
22
|
|
|
17
23
|
If `typescriptVersion` is ever removed from the `JsiiProject` options, projen adds `typescript` as a devDependency with **no version range** (`node_modules/projen/lib/typescript/typescript.js` — `tsDep = options.typescriptVersion ? "typescript@${...}" : "typescript"`). npm then resolves it to whatever is latest at synth time.
|
|
@@ -22,22 +28,23 @@ This broke the build on 2026-07-21: TypeScript 7.0.2 (the new Go-ported compiler
|
|
|
22
28
|
|
|
23
29
|
**Known gap:** `src/projects/cdk-construct.ts` (`MvcCdkConstructLibrary`, what this module scaffolds for *consumers*) does NOT set `typescriptVersion` in its own projen options. Generated consumer projects are exposed to the same drift/break. Worth fixing in `cdk-construct.ts` as a follow-up — not yet done.
|
|
24
30
|
|
|
25
|
-
## Keeping `projen`
|
|
31
|
+
## Keeping `projen` and `jsii` current
|
|
32
|
+
|
|
33
|
+
`projenVersion` and `jsiiVersion` are hardcoded literals, not normal devDependency ranges — they're the source of truth that regenerates `package.json`'s `projen`/`jsii`/`jsii-rosetta` entries on every `npx projen` run. This is why `dependabotOptions.groups.default.excludePatterns`/`ignore` exclude `projen`, `jsii`, and `jsii-rosetta`: a Dependabot PR that only edits `package.json` would get silently reverted by the `self_mutation_happened` check in `.github/workflows/build.yml` (`npx projen` would just re-derive the old pinned literal). `typescriptVersion` doesn't need this — it's a caret range, so `npm update`/Dependabot can already advance it within the current major via lockfile-only changes.
|
|
26
34
|
|
|
27
|
-
|
|
35
|
+
Two generated workflows automate the literal bumps instead (both weekly cron, Monday 06:00 UTC, + manual `workflow_dispatch`), sharing the `addSelfUpgradeWorkflow()` builder in `.projenrc.ts`:
|
|
28
36
|
|
|
29
|
-
**`.github/workflows/upgrade-projen.yml
|
|
37
|
+
- **`.github/workflows/upgrade-projen.yml`**: compares `package.json`'s current `devDependencies.projen` against `npm view projen version`.
|
|
38
|
+
- **`.github/workflows/upgrade-jsii.yml`**: reads the `jsiiVersion` literal out of `.projenrc.ts` and compares it against the latest version *within the current major only* (`npm view jsii@<major>`) — crossing to the next jsii major stays a deliberate, human-reviewed bump, same as the `typescriptVersion` pin.
|
|
30
39
|
|
|
31
|
-
|
|
32
|
-
2. If different: `sed`-updates the `projenVersion` const in `.projenrc.ts`, runs `npx projen` to re-synth everything, then `npm run build` as a gate
|
|
33
|
-
3. Only if the build passes: commits to a `chore/upgrade-projen-<version>` branch and opens a PR via `gh pr create` (labeled `dependencies`, `auto-approve`)
|
|
40
|
+
Both, if the versions differ: `sed`-update the literal in `.projenrc.ts`, run `npx projen` to re-synth everything, then `npm run build` as a gate. Only if the build passes: commit to a `chore/upgrade-<projen|jsii>-<version>` branch and open a PR via `gh pr create` (labeled `dependencies`, `auto-approve`) — auto-approved by a Mergify rule (since the PR is opened by `mvc-bot` via `PROJEN_GITHUB_TOKEN`, and GitHub rejects a PR review from the same account that authored the PR) and merged once required checks pass.
|
|
34
41
|
|
|
35
42
|
To bump manually instead of waiting for the cron (or to debug it):
|
|
36
43
|
|
|
37
44
|
```bash
|
|
38
|
-
npm view projen version
|
|
45
|
+
npm view projen version # check latest
|
|
39
46
|
# edit the `projenVersion` const in .projenrc.ts
|
|
40
|
-
npx projen && npm run build
|
|
47
|
+
npx projen && npm run build # re-synth + verify
|
|
41
48
|
```
|
|
42
49
|
|
|
43
50
|
Same procedure applies to bumping `jsiiVersion` or `typescriptVersion` — always re-run the full build afterward; jsii/projen major bumps can change generated file layout (e.g. the 0.99→0.101 bump split `tsconfig.dev.json` into `tsconfig.json` + `test/tsconfig.json` + `projenrc/tsconfig.json`).
|
package/.jsii
CHANGED
|
@@ -86,7 +86,7 @@
|
|
|
86
86
|
"stability": "stable"
|
|
87
87
|
},
|
|
88
88
|
"homepage": "https://github.com/mavogel/mvc-projen",
|
|
89
|
-
"jsiiVersion": "6.0.
|
|
89
|
+
"jsiiVersion": "6.0.13 (build 5c05d06)",
|
|
90
90
|
"keywords": [
|
|
91
91
|
"aws",
|
|
92
92
|
"cdk",
|
|
@@ -100,11 +100,12 @@
|
|
|
100
100
|
"hasDefaultInterfaces": true
|
|
101
101
|
}
|
|
102
102
|
},
|
|
103
|
-
"
|
|
103
|
+
"tscOutDir": "lib",
|
|
104
|
+
"tscRootDir": "src"
|
|
104
105
|
},
|
|
105
106
|
"name": "@mavogel/mvc-projen",
|
|
106
107
|
"readme": {
|
|
107
|
-
"markdown": "\n[](https://github.com/mavogel/mvc-projen/actions/workflows/build.yml)\n[](https://eslint.org)\n[](https://github.com/mavogel/mvc-projen/releases)\n\n[](https://www.npmjs.com/package/@mavogel/mvc-projen)\n[](https://www.npmjs.com/package/@mavogel/mvc-projen)\n\n# mvc-projen\n\nThe [projen](https://projen.io/) baseline for all [MV Consulting](https://manuel-vogel.de/) projects.\n\n## Table of Contents\n\n- [Features](#features)\n- [Usage](#usage)\n- [Inspiration](#inspiration)\n\n## Features\n- 📏 **Best Practice and unified Setup**: All the scaffolders we need are in one place and tested. From `cdk-constructs` to later `clis` with [golang](https://go.dev/)\n- 🏗️ **Extensibility**: Pass in customized options for the scaffolder templates\n\n## Usage\n\n```bash\n# 1. create a new project directory\nmkdir my-new-construct && cd my-new-construct\n\n# 2. set up the project using the projen new command\nnpx projen new
|
|
108
|
+
"markdown": "\n[](https://github.com/mavogel/mvc-projen/actions/workflows/build.yml)\n[](https://eslint.org)\n[](https://github.com/mavogel/mvc-projen/releases)\n\n[](https://www.npmjs.com/package/@mavogel/mvc-projen)\n[](https://www.npmjs.com/package/@mavogel/mvc-projen)\n\n# mvc-projen\n\nThe [projen](https://projen.io/) baseline for all [MV Consulting](https://manuel-vogel.de/) projects.\n\n## Table of Contents\n\n- [Features](#features)\n- [Usage](#usage)\n- [Inspiration](#inspiration)\n\n## Features\n- 📏 **Best Practice and unified Setup**: All the scaffolders we need are in one place and tested. From `cdk-constructs` to later `clis` with [golang](https://go.dev/)\n- 🏗️ **Extensibility**: Pass in customized options for the scaffolder templates\n\n## Usage\n\n```bash\n# 1. create a new project directory\nmkdir my-new-construct && cd my-new-construct\n\n# 2. set up the project using the projen new command\nnpx projen new --from @mavogel/mvc-projen@~0\n```\n\nBy default this uses npm and a recent AWS CDK version; pass `--cdkVersion=x.y.z` or `--package-manager=<pnpm|yarn|...>` to override either.\n\n## Inspiration\nThis project was created based on the following inspiration\n- [taimos-projen](https://github.com/taimos/taimos-projen): code from [Thorsten Höger](https://www.taimos.de/) has always been an inspiration for my `cdk` and [projen](https://projen.io/) projects.\n- [projen-cdk-hugo-pipeline](https://github.com/MV-Consulting/projen-cdk-hugo-pipeline/): a previous projen baseline we built, during which we learned a lot about the internal of projen. We could build up on this knowledge.\n\n## Unlock the Full Potential of Your AWS Cloud Infrastructure\n\nHi, I’m Manuel, an AWS expert passionate about empowering businesses with **scalable, resilient, and cost-optimized cloud solutions**. I specialize in crafting **tailored AWS architectures** and **DevOps-driven workflows** that not only meet your current needs but grow with you.\n\n---\n\n### Why Work With Me?\n\n✔️ **Tailored AWS Solutions:** Every business is unique, so I design custom solutions that fit your goals and challenges.\n✔️ **Well-Architected Designs:** From scalability to security, my solutions align with AWS Well-Architected Framework.\n✔️ **Cloud-Native Focus:** I specialize in modern, cloud-native systems that embrace the full potential of AWS.\n✔️ **Business-Driven Tech:** Technology should serve your business, not the other way around.\n\n---\n\n### What I Bring to the Table\n\n**AWS Certifications**\nI’m **AWS Certified Solutions Architect and DevOps – Professional** and hold numerous additional certifications, so you can trust I’ll bring industry best practices to your projects. Feel free to explose by [badges](https://www.credly.com/users/manuel-vogel)\n\n**Infrastructure as Code (IaC)**\nWith deep expertise in **AWS CDK** and **Terraform**, I ensure your infrastructure is automated, maintainable, and scalable.\n\n**DevOps Expertise**\nFrom CI/CD pipelines with **GitHub Actions** and **GitLab CI** to container orchestration **Kubernetes** and others, I deliver workflows that are smooth and efficient.\n\n**Hands-On Experience**\nWith over **8 years of AWS experience** and a decade in the tech world, I’ve delivered solutions for companies large and small. My open-source contributions showcase my commitment to transparency and innovation. Feel free to explore my [GitHub profile](https://github.com/mavogel)\n\n---\n\n### Let’s Build Something Great Together\n\nI know that choosing the right partner is critical to your success. When you work with me, you’re not just contracting an engineer – you’re gaining a trusted advisor and hands-on expert who cares about your business as much as you do.\n\n✔️ **Direct Collaboration**: No middlemen or red tape – you work with me directly.\n✔️ **Transparent Process**: Expect open communication, clear timelines, and visible results.\n✔️ **Real Value**: My solutions focus on delivering measurable impact for your business.\n\n\n<a href=\"https://calendar.app.google/7aahUfGifBUvgX62A\"><img alt=\"Schedule your call\" src=\"https://img.shields.io/badge/schedule%20your%20call-success.svg?style=for-the-badge\"/></a>\n\n---\n\n## Acknowledgements\n\nBig shoutout to the amazing team behind [Projen](https://github.com/projen/projen)!\nTheir groundbreaking work simplifies cloud infrastructure projects and inspires us every day. 💡\n\n## Author\n\n[Manuel Vogel-Johnson](https://vogel-johnson.com/about/)\n\n[](https://www.linkedin.com/in/manuel-vogel-johnson)\n[](https://github.com/mavogel)"
|
|
108
109
|
},
|
|
109
110
|
"repository": {
|
|
110
111
|
"type": "git",
|
|
@@ -141,7 +142,7 @@
|
|
|
141
142
|
},
|
|
142
143
|
"locationInModule": {
|
|
143
144
|
"filename": "src/projects/cdk-construct.ts",
|
|
144
|
-
"line":
|
|
145
|
+
"line": 66
|
|
145
146
|
},
|
|
146
147
|
"parameters": [
|
|
147
148
|
{
|
|
@@ -155,7 +156,7 @@
|
|
|
155
156
|
"kind": "class",
|
|
156
157
|
"locationInModule": {
|
|
157
158
|
"filename": "src/projects/cdk-construct.ts",
|
|
158
|
-
"line":
|
|
159
|
+
"line": 64
|
|
159
160
|
},
|
|
160
161
|
"name": "MvcCdkConstructLibrary",
|
|
161
162
|
"symbolId": "src/projects/cdk-construct:MvcCdkConstructLibrary"
|
|
@@ -174,7 +175,7 @@
|
|
|
174
175
|
"kind": "interface",
|
|
175
176
|
"locationInModule": {
|
|
176
177
|
"filename": "src/projects/cdk-construct.ts",
|
|
177
|
-
"line":
|
|
178
|
+
"line": 43
|
|
178
179
|
},
|
|
179
180
|
"name": "MvcCdkConstructLibraryOptions",
|
|
180
181
|
"properties": [
|
|
@@ -188,7 +189,7 @@
|
|
|
188
189
|
"immutable": true,
|
|
189
190
|
"locationInModule": {
|
|
190
191
|
"filename": "src/projects/cdk-construct.ts",
|
|
191
|
-
"line":
|
|
192
|
+
"line": 49
|
|
192
193
|
},
|
|
193
194
|
"name": "baseAssetsDirectory",
|
|
194
195
|
"optional": true,
|
|
@@ -206,7 +207,7 @@
|
|
|
206
207
|
"immutable": true,
|
|
207
208
|
"locationInModule": {
|
|
208
209
|
"filename": "src/projects/cdk-construct.ts",
|
|
209
|
-
"line":
|
|
210
|
+
"line": 56
|
|
210
211
|
},
|
|
211
212
|
"name": "integTestRegions",
|
|
212
213
|
"optional": true,
|
|
@@ -223,6 +224,6 @@
|
|
|
223
224
|
"symbolId": "src/projects/cdk-construct:MvcCdkConstructLibraryOptions"
|
|
224
225
|
}
|
|
225
226
|
},
|
|
226
|
-
"version": "0.0.
|
|
227
|
-
"fingerprint": "
|
|
227
|
+
"version": "0.0.35",
|
|
228
|
+
"fingerprint": "92/HpNqbFi5a9BNHDFI7eHa8H9HkA89N4NQu/IqkvG4="
|
|
228
229
|
}
|
package/README.md
CHANGED
|
@@ -27,24 +27,23 @@ The [projen](https://projen.io/) baseline for all [MV Consulting](https://manuel
|
|
|
27
27
|
mkdir my-new-construct && cd my-new-construct
|
|
28
28
|
|
|
29
29
|
# 2. set up the project using the projen new command
|
|
30
|
-
npx projen new
|
|
31
|
-
--from @mavogel/mvc-projen@~0 \
|
|
32
|
-
--cdkVersion=2.261.0 \
|
|
33
|
-
--package-manager=npm
|
|
30
|
+
npx projen new --from @mavogel/mvc-projen@~0
|
|
34
31
|
```
|
|
35
32
|
|
|
33
|
+
By default this uses npm and a recent AWS CDK version; pass `--cdkVersion=x.y.z` or `--package-manager=<pnpm|yarn|...>` to override either.
|
|
34
|
+
|
|
36
35
|
## Inspiration
|
|
37
36
|
This project was created based on the following inspiration
|
|
38
37
|
- [taimos-projen](https://github.com/taimos/taimos-projen): code from [Thorsten Höger](https://www.taimos.de/) has always been an inspiration for my `cdk` and [projen](https://projen.io/) projects.
|
|
39
38
|
- [projen-cdk-hugo-pipeline](https://github.com/MV-Consulting/projen-cdk-hugo-pipeline/): a previous projen baseline we built, during which we learned a lot about the internal of projen. We could build up on this knowledge.
|
|
40
39
|
|
|
41
|
-
##
|
|
40
|
+
## Unlock the Full Potential of Your AWS Cloud Infrastructure
|
|
42
41
|
|
|
43
|
-
Hi, I’m Manuel, an AWS expert passionate about empowering businesses with **scalable, resilient, and cost-optimized cloud solutions**.
|
|
42
|
+
Hi, I’m Manuel, an AWS expert passionate about empowering businesses with **scalable, resilient, and cost-optimized cloud solutions**. I specialize in crafting **tailored AWS architectures** and **DevOps-driven workflows** that not only meet your current needs but grow with you.
|
|
44
43
|
|
|
45
44
|
---
|
|
46
45
|
|
|
47
|
-
###
|
|
46
|
+
### Why Work With Me?
|
|
48
47
|
|
|
49
48
|
✔️ **Tailored AWS Solutions:** Every business is unique, so I design custom solutions that fit your goals and challenges.
|
|
50
49
|
✔️ **Well-Architected Designs:** From scalability to security, my solutions align with AWS Well-Architected Framework.
|
|
@@ -53,23 +52,23 @@ Hi, I’m Manuel, an AWS expert passionate about empowering businesses with **sc
|
|
|
53
52
|
|
|
54
53
|
---
|
|
55
54
|
|
|
56
|
-
###
|
|
55
|
+
### What I Bring to the Table
|
|
57
56
|
|
|
58
|
-
|
|
57
|
+
**AWS Certifications**
|
|
59
58
|
I’m **AWS Certified Solutions Architect and DevOps – Professional** and hold numerous additional certifications, so you can trust I’ll bring industry best practices to your projects. Feel free to explose by [badges](https://www.credly.com/users/manuel-vogel)
|
|
60
59
|
|
|
61
|
-
|
|
60
|
+
**Infrastructure as Code (IaC)**
|
|
62
61
|
With deep expertise in **AWS CDK** and **Terraform**, I ensure your infrastructure is automated, maintainable, and scalable.
|
|
63
62
|
|
|
64
|
-
|
|
63
|
+
**DevOps Expertise**
|
|
65
64
|
From CI/CD pipelines with **GitHub Actions** and **GitLab CI** to container orchestration **Kubernetes** and others, I deliver workflows that are smooth and efficient.
|
|
66
65
|
|
|
67
|
-
|
|
68
|
-
With over **
|
|
66
|
+
**Hands-On Experience**
|
|
67
|
+
With over **8 years of AWS experience** and a decade in the tech world, I’ve delivered solutions for companies large and small. My open-source contributions showcase my commitment to transparency and innovation. Feel free to explore my [GitHub profile](https://github.com/mavogel)
|
|
69
68
|
|
|
70
69
|
---
|
|
71
70
|
|
|
72
|
-
###
|
|
71
|
+
### Let’s Build Something Great Together
|
|
73
72
|
|
|
74
73
|
I know that choosing the right partner is critical to your success. When you work with me, you’re not just contracting an engineer – you’re gaining a trusted advisor and hands-on expert who cares about your business as much as you do.
|
|
75
74
|
|
|
@@ -78,18 +77,18 @@ I know that choosing the right partner is critical to your success. When you wor
|
|
|
78
77
|
✔️ **Real Value**: My solutions focus on delivering measurable impact for your business.
|
|
79
78
|
|
|
80
79
|
|
|
81
|
-
<a href="https://
|
|
80
|
+
<a href="https://calendar.app.google/7aahUfGifBUvgX62A"><img alt="Schedule your call" src="https://img.shields.io/badge/schedule%20your%20call-success.svg?style=for-the-badge"/></a>
|
|
82
81
|
|
|
83
82
|
---
|
|
84
83
|
|
|
85
|
-
##
|
|
84
|
+
## Acknowledgements
|
|
86
85
|
|
|
87
86
|
Big shoutout to the amazing team behind [Projen](https://github.com/projen/projen)!
|
|
88
87
|
Their groundbreaking work simplifies cloud infrastructure projects and inspires us every day. 💡
|
|
89
88
|
|
|
90
89
|
## Author
|
|
91
90
|
|
|
92
|
-
[Manuel Vogel](https://
|
|
91
|
+
[Manuel Vogel-Johnson](https://vogel-johnson.com/about/)
|
|
93
92
|
|
|
94
|
-
[](https://www.linkedin.com/in/manuel-vogel)
|
|
93
|
+
[](https://www.linkedin.com/in/manuel-vogel-johnson)
|
|
95
94
|
[](https://github.com/mavogel)
|
|
@@ -1,16 +1,13 @@
|
|
|
1
1
|
// import { SecretsManager } from "@aws-sdk/client-secrets-manager"; <- UNCOMMENT
|
|
2
|
-
// @ts-ignore
|
|
3
|
-
import type {
|
|
4
|
-
OnEventRequest,
|
|
5
|
-
OnEventResponse,
|
|
6
|
-
} from 'aws-cdk-lib/custom-resources/lib/provider-framework/types';
|
|
7
2
|
// import { Secret } from "./crd-example"; // <- UNCOMMENT
|
|
8
3
|
|
|
9
4
|
// const secretsManager = new SecretsManager(); <- UNCOMMENT
|
|
10
5
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
6
|
+
// aws-cdk-lib's OnEventRequest/OnEventResponse (custom-resources/lib/provider-framework/types)
|
|
7
|
+
// aren't part of its public exports map, so they can't be imported directly -
|
|
8
|
+
// see https://github.com/aws/aws-cdk/blob/main/packages/aws-cdk-lib/package.json.
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
10
|
+
export const handler = async (event: any): Promise<any> => {
|
|
14
11
|
console.log('Event: %j', { ...event, ResponseURL: '...' });
|
|
15
12
|
|
|
16
13
|
if (event.RequestType === 'Delete') {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
##
|
|
1
|
+
## Unlock the Full Potential of Your AWS Cloud Infrastructure
|
|
2
2
|
|
|
3
|
-
Hi, I’m Manuel, an AWS expert passionate about empowering businesses with **scalable, resilient, and cost-optimized cloud solutions**.
|
|
3
|
+
Hi, I’m Manuel, an AWS expert passionate about empowering businesses with **scalable, resilient, and cost-optimized cloud solutions**. I specialize in crafting **tailored AWS architectures** and **DevOps-driven workflows** that not only meet your current needs but grow with you.
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
###
|
|
7
|
+
### Why Work With Me?
|
|
8
8
|
|
|
9
9
|
✔️ **Tailored AWS Solutions:** Every business is unique, so I design custom solutions that fit your goals and challenges.
|
|
10
10
|
✔️ **Well-Architected Designs:** From scalability to security, my solutions align with AWS Well-Architected Framework.
|
|
@@ -13,23 +13,23 @@ Hi, I’m Manuel, an AWS expert passionate about empowering businesses with **sc
|
|
|
13
13
|
|
|
14
14
|
---
|
|
15
15
|
|
|
16
|
-
###
|
|
16
|
+
### What I Bring to the Table
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
**AWS Certifications**
|
|
19
19
|
I’m **AWS Certified Solutions Architect and DevOps – Professional** and hold numerous additional certifications, so you can trust I’ll bring industry best practices to your projects. Feel free to explose by [badges](https://www.credly.com/users/manuel-vogel)
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
**Infrastructure as Code (IaC)**
|
|
22
22
|
With deep expertise in **AWS CDK** and **Terraform**, I ensure your infrastructure is automated, maintainable, and scalable.
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
**DevOps Expertise**
|
|
25
25
|
From CI/CD pipelines with **GitHub Actions** and **GitLab CI** to container orchestration **Kubernetes** and others, I deliver workflows that are smooth and efficient.
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
With over **
|
|
27
|
+
**Hands-On Experience**
|
|
28
|
+
With over **8 years of AWS experience** and a decade in the tech world, I’ve delivered solutions for companies large and small. My open-source contributions showcase my commitment to transparency and innovation. Feel free to explore my [GitHub profile](https://github.com/mavogel)
|
|
29
29
|
|
|
30
30
|
---
|
|
31
31
|
|
|
32
|
-
###
|
|
32
|
+
### Let’s Build Something Great Together
|
|
33
33
|
|
|
34
34
|
I know that choosing the right partner is critical to your success. When you work with me, you’re not just contracting an engineer – you’re gaining a trusted advisor and hands-on expert who cares about your business as much as you do.
|
|
35
35
|
|
|
@@ -38,18 +38,18 @@ I know that choosing the right partner is critical to your success. When you wor
|
|
|
38
38
|
✔️ **Real Value**: My solutions focus on delivering measurable impact for your business.
|
|
39
39
|
|
|
40
40
|
|
|
41
|
-
<a href="https://
|
|
41
|
+
<a href="https://calendar.app.google/7aahUfGifBUvgX62A"><img alt="Schedule your call" src="https://img.shields.io/badge/schedule%20your%20call-success.svg?style=for-the-badge"/></a>
|
|
42
42
|
|
|
43
43
|
---
|
|
44
44
|
|
|
45
|
-
##
|
|
45
|
+
## Acknowledgements
|
|
46
46
|
|
|
47
47
|
Big shoutout to the amazing team behind [Projen](https://github.com/projen/projen)!
|
|
48
48
|
Their groundbreaking work simplifies cloud infrastructure projects and inspires us every day. 💡
|
|
49
49
|
|
|
50
50
|
## Author
|
|
51
51
|
|
|
52
|
-
[Manuel Vogel](https://
|
|
52
|
+
[Manuel Vogel-Johnson](https://vogel-johnson.com/about/)
|
|
53
53
|
|
|
54
|
-
[](https://www.linkedin.com/in/manuel-vogel)
|
|
54
|
+
[](https://www.linkedin.com/in/manuel-vogel-johnson)
|
|
55
55
|
[](https://github.com/mavogel)
|
|
@@ -51,16 +51,65 @@ const lambdaNodeVersion = awscdk_1.LambdaRuntime.NODEJS_24_X;
|
|
|
51
51
|
// `npm view @aws-cdk/integ-runner versions --json` and bump this if aws-cdk-lib
|
|
52
52
|
// has released newer versions than this one.
|
|
53
53
|
const LAST_INTEG_RUNNER_VERSION = '2.203.0';
|
|
54
|
+
// AwsCdkConstructLibraryOptions.cdkVersion's own upstream `@default`
|
|
55
|
+
// (node_modules/projen/lib/awscdk/awscdk-deps.d.ts) - what `projen new`
|
|
56
|
+
// fills in when `--cdkVersion` is omitted. jsii forbids a derived options
|
|
57
|
+
// interface from re-declaring an inherited member (JSII5015: "results in
|
|
58
|
+
// invalid C#"), so we can't override the `@default` doc the CLI reflects
|
|
59
|
+
// on to change that. Detecting this exact value below and substituting our
|
|
60
|
+
// own default is the only remaining lever.
|
|
61
|
+
const UPSTREAM_DEFAULT_CDK_VERSION = '2.189.1';
|
|
62
|
+
// Our default `cdkVersion` when the caller (or `projen new`) doesn't pass
|
|
63
|
+
// one. Must stay >= 2.257.0: cdk-nag v3 (forced below via addDeps) requires
|
|
64
|
+
// it as a peer, and the upstream default above fails `npm install` with an
|
|
65
|
+
// ERESOLVE conflict on a fresh scaffold.
|
|
66
|
+
// SHORTCUT: both hardcoded versions require manual re-verification -- run
|
|
67
|
+
// `npm view aws-cdk-lib version` and re-check awscdk-deps.d.ts's `@default`
|
|
68
|
+
// periodically (it may drift on a projen upgrade).
|
|
69
|
+
const DEFAULT_CDK_VERSION = '2.261.0';
|
|
54
70
|
/**
|
|
55
71
|
* TypeScript library
|
|
56
72
|
*
|
|
57
73
|
* @pjid mvc-awscdk-construct
|
|
58
74
|
*/
|
|
59
75
|
class MvcCdkConstructLibrary extends awscdk_1.AwsCdkConstructLibrary {
|
|
60
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@mavogel/mvc-projen.MvcCdkConstructLibrary", version: "0.0.
|
|
76
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@mavogel/mvc-projen.MvcCdkConstructLibrary", version: "0.0.35" };
|
|
61
77
|
constructor(options) {
|
|
62
78
|
const baseAssetsDirectory = options.baseAssetsDirectory ?? `${process.cwd()}/node_modules/@mavogel/mvc-projen/assets`;
|
|
63
79
|
const integTestRegions = options.integTestRegions ?? ['eu-west-1', 'eu-west-2'];
|
|
80
|
+
// `options.cdkVersion` is typed as required, but `projen new` always
|
|
81
|
+
// supplies a value via jsii reflection - either a real user override,
|
|
82
|
+
// or (if --cdkVersion was omitted) the upstream `@default` literal
|
|
83
|
+
// itself. Substitute ours only in the latter case, verified below.
|
|
84
|
+
const cdkVersion = (!options.cdkVersion || options.cdkVersion === UPSTREAM_DEFAULT_CDK_VERSION)
|
|
85
|
+
? DEFAULT_CDK_VERSION
|
|
86
|
+
: options.cdkVersion;
|
|
87
|
+
// AwsCdkConstructLibrary's `super()` call below wires up an AutoDiscover
|
|
88
|
+
// component whose constructor synchronously globs `srcdir` for
|
|
89
|
+
// `*.lambda.ts` entrypoints - it never re-scans later. SampleCode (added
|
|
90
|
+
// at the end of this constructor) writes the sample crd-example.lambda.ts
|
|
91
|
+
// during the project's synthesize() phase, which runs after every
|
|
92
|
+
// component's constructor, including AutoDiscover's - so the file never
|
|
93
|
+
// existed for AutoDiscover to find, no LambdaFunction/Bundler ever got
|
|
94
|
+
// created for it, and the generated crd-example.ts was left importing a
|
|
95
|
+
// './crd-example-function' construct file that no one wrote, breaking
|
|
96
|
+
// eslint on every scaffold. Write just this one file early enough for
|
|
97
|
+
// AutoDiscover to see it; SampleCode still owns everything else.
|
|
98
|
+
// Skip under Jest (NODE_ENV=test, matching projen's own IS_TEST_RUN
|
|
99
|
+
// check): when options.outdir is unset (true for every test in this
|
|
100
|
+
// repo), projen's base Project class - constructed via super() below -
|
|
101
|
+
// redirects the *real* outdir to a fresh temp directory instead of cwd.
|
|
102
|
+
// This early write runs before that redirect exists, so without this
|
|
103
|
+
// guard it would write straight into this repo's own working tree
|
|
104
|
+
// instead of the test's temp dir.
|
|
105
|
+
if ((options.sampleCode ?? true) && process.env.NODE_ENV !== 'test') {
|
|
106
|
+
const outdir = path.resolve(options.outdir ?? '.');
|
|
107
|
+
const lambdaEntrypoint = path.join(outdir, 'src', 'crd-example', 'crd-example.lambda.ts');
|
|
108
|
+
if (!fs.existsSync(lambdaEntrypoint)) {
|
|
109
|
+
fs.mkdirSync(path.dirname(lambdaEntrypoint), { recursive: true });
|
|
110
|
+
fs.writeFileSync(lambdaEntrypoint, fs.readFileSync(`${baseAssetsDirectory}/cdk-construct/src_crd-example.lambda.ts`).toString());
|
|
111
|
+
}
|
|
112
|
+
}
|
|
64
113
|
super({
|
|
65
114
|
authorOrganization: true,
|
|
66
115
|
copyrightOwner: 'MV Consulting GmbH',
|
|
@@ -78,12 +127,18 @@ class MvcCdkConstructLibrary extends awscdk_1.AwsCdkConstructLibrary {
|
|
|
78
127
|
awsSdkConnectionReuse: false, // doesn't exist in AWS SDK JS v3
|
|
79
128
|
},
|
|
80
129
|
autoApproveOptions: {
|
|
130
|
+
// 'mvc-bot' (the PROJEN_GITHUB_TOKEN identity) is deliberately
|
|
131
|
+
// excluded: GitHub rejects a PR review from the same account that
|
|
132
|
+
// authored the PR ("Can not approve your own pull request"), and
|
|
133
|
+
// this token can also author PRs against generated projects (e.g.
|
|
134
|
+
// scaffolder-driven automation). Those PRs are auto-approved via
|
|
135
|
+
// Mergify instead, below, which posts the review as the Mergify
|
|
136
|
+
// app - a different actor. See mavogel/mvc-projen#74.
|
|
81
137
|
allowedUsernames: [
|
|
82
138
|
'dependabot',
|
|
83
139
|
'dependabot[bot]',
|
|
84
140
|
'github-bot',
|
|
85
141
|
'github-actions[bot]',
|
|
86
|
-
'mvc-bot',
|
|
87
142
|
],
|
|
88
143
|
// The name of the secret that has the GitHub PAT for auto-approving PRs with permissions repo, workflow, write:packages
|
|
89
144
|
// Generate a new PAT (https://github.com/settings/tokens/new) and add it to your repo's secrets
|
|
@@ -253,6 +308,9 @@ add tools or links which inspired you
|
|
|
253
308
|
},
|
|
254
309
|
// NOTE: keep all the passed in options which can override the existing ones!
|
|
255
310
|
...options,
|
|
311
|
+
// applied after ...options so the DEFAULT_CDK_VERSION fallback above
|
|
312
|
+
// always wins over an undefined options.cdkVersion
|
|
313
|
+
cdkVersion,
|
|
256
314
|
});
|
|
257
315
|
// TypeScript 6 no longer auto-discovers @types/* packages
|
|
258
316
|
this.tsconfigDev.file.addOverride('compilerOptions.types', ['node', 'jest']);
|
|
@@ -262,6 +320,23 @@ add tools or links which inspired you
|
|
|
262
320
|
// delete head branches on merge (renovate/dependabot manage their own).
|
|
263
321
|
// see https://github.com/MV-Consulting/cdk-vscode-server/pull/112
|
|
264
322
|
this.tryFindObjectFile('.mergify.yml')?.addDeletionOverride('pull_request_rules.0.actions.delete_head_branch');
|
|
323
|
+
// Auto-approve PRs authored by 'mvc-bot' itself (see the
|
|
324
|
+
// autoApproveOptions comment above for why this can't go through the
|
|
325
|
+
// GitHub Actions auto-approve path) via Mergify instead: it posts the
|
|
326
|
+
// review as the Mergify app, a different actor. See mavogel/mvc-projen#74.
|
|
327
|
+
this.tryFindObjectFile('.mergify.yml')?.addOverride('pull_request_rules.1', {
|
|
328
|
+
name: 'Auto-approve self-authored mvc-bot PRs',
|
|
329
|
+
conditions: [
|
|
330
|
+
'author=mvc-bot',
|
|
331
|
+
'label=auto-approve',
|
|
332
|
+
],
|
|
333
|
+
actions: {
|
|
334
|
+
review: {
|
|
335
|
+
type: 'APPROVE',
|
|
336
|
+
message: 'Automatically approved: self-authored automation PR.',
|
|
337
|
+
},
|
|
338
|
+
},
|
|
339
|
+
});
|
|
265
340
|
// gitignore
|
|
266
341
|
const filesPatternToGitignore = [
|
|
267
342
|
'tmp',
|
|
@@ -351,8 +426,7 @@ class SampleCode extends projen_1.Component {
|
|
|
351
426
|
synthesize() {
|
|
352
427
|
const outdir = this.project.outdir;
|
|
353
428
|
const srcdir = path.join(outdir, this.library.srcdir);
|
|
354
|
-
if (fs.existsSync(srcdir) &&
|
|
355
|
-
fs.readdirSync(srcdir).filter((x) => x.endsWith('.ts')) &&
|
|
429
|
+
if (fs.existsSync(`${srcdir}/index.ts`) &&
|
|
356
430
|
!fs.readFileSync(`${srcdir}/index.ts`).toString().includes('export class Hello') // Note: from parent
|
|
357
431
|
) {
|
|
358
432
|
return;
|
|
@@ -361,9 +435,11 @@ class SampleCode extends projen_1.Component {
|
|
|
361
435
|
fs.writeFileSync(path.join(srcdir, 'index.ts'), fs.readFileSync(`${this.options.baseAssetsDirectory}/cdk-construct/src_index.ts`).toString());
|
|
362
436
|
fs.writeFileSync(path.join(srcdir, 'placeholder.ts'), fs.readFileSync(`${this.options.baseAssetsDirectory}/cdk-construct/src_placeholder.ts`).toString());
|
|
363
437
|
// crd with lambda generation
|
|
438
|
+
// Note: crd-example.lambda.ts is written earlier, before `super()`, so
|
|
439
|
+
// AutoDiscover's constructor-time glob can find it - see the comment in
|
|
440
|
+
// the constructor above.
|
|
364
441
|
fs.mkdirSync(`${srcdir}/crd-example`, { recursive: true });
|
|
365
442
|
fs.writeFileSync(path.join(`${srcdir}/crd-example`, 'crd-example.ts'), fs.readFileSync(`${this.options.baseAssetsDirectory}/cdk-construct/src_crd-example.ts`).toString());
|
|
366
|
-
fs.writeFileSync(path.join(`${srcdir}/crd-example`, 'crd-example.lambda.ts'), fs.readFileSync(`${this.options.baseAssetsDirectory}/cdk-construct/src_crd-example.lambda.ts`).toString());
|
|
367
443
|
const testdir = path.join(outdir, this.library.testdir);
|
|
368
444
|
if (fs.existsSync(testdir) &&
|
|
369
445
|
fs.readdirSync(testdir).filter((x) => x.endsWith('.ts')) &&
|
|
@@ -408,4 +484,4 @@ class SampleCode extends projen_1.Component {
|
|
|
408
484
|
fs.writeFileSync(path.join(examplesdir, 'main.ts'), fs.readFileSync(`${this.options.baseAssetsDirectory}/cdk-construct/examples_simple_main.ts`).toString());
|
|
409
485
|
}
|
|
410
486
|
}
|
|
411
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWNvbnN0cnVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm9qZWN0cy9jZGstY29uc3RydWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx1Q0FBeUI7QUFDekIsMkNBQTZCO0FBRTdCLG1DQUFzRjtBQUN0Riw4Q0FBeUc7QUFDekcsOENBQStEO0FBRy9ELDJFQUEyRTtBQUMzRSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUM7QUFDM0IsTUFBTSxpQkFBaUIsR0FBRyxzQkFBYSxDQUFDLFdBQVcsQ0FBQztBQUVwRCxvRkFBb0Y7QUFDcEYsb0ZBQW9GO0FBQ3BGLG1FQUFtRTtBQUNuRSxxRkFBcUY7QUFDckYsaUVBQWlFO0FBQ2pFLGdGQUFnRjtBQUNoRiw2Q0FBNkM7QUFDN0MsTUFBTSx5QkFBeUIsR0FBRyxTQUFTLENBQUM7QUFxQjVDOzs7O0dBSUc7QUFDSCxNQUFhLHNCQUF1QixTQUFRLCtCQUFzQjs7SUFFaEUsWUFBWSxPQUFzQztRQUNoRCxNQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsMENBQTBDLENBQUM7UUFDdEgsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFaEYsS0FBSyxDQUFDO1lBQ0osa0JBQWtCLEVBQUUsSUFBSTtZQUN4QixjQUFjLEVBQUUsb0JBQW9CO1lBQ3BDLE9BQU8sRUFBRSxZQUFZO1lBQ3JCLFdBQVcsRUFBRSxRQUFRO1lBQ3JCLGlCQUFpQixFQUFFLFFBQVE7WUFDM0IsY0FBYyxFQUFFLFdBQVc7WUFDM0IsbUJBQW1CLEVBQUUsV0FBVztZQUNoQyxTQUFTLEVBQUUsY0FBYztZQUN6QixZQUFZLEVBQUUsSUFBSTtZQUNsQixjQUFjLEVBQUUsbUJBQVUsQ0FBQyxr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LElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLGlDQUFpQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUU3SixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDNUQsSUFDRSxFQUFFLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztZQUMxQixFQUFFLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUNoRSxDQUFDO1lBQ0QsT0FBTztRQUNULENBQUM7UUFDRCxFQUFFLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLHdDQUF3QyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUMvSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIGphdmFzY3JpcHQsIFJlbGVhc2FibGVDb21taXRzLCBUZXh0RmlsZSwgWWFtbEZpbGUgfSBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgQXdzQ2RrQ29uc3RydWN0TGlicmFyeSwgQXdzQ2RrQ29uc3RydWN0TGlicmFyeU9wdGlvbnMsIExhbWJkYVJ1bnRpbWUgfSBmcm9tICdwcm9qZW4vbGliL2F3c2Nkayc7XG5pbXBvcnQgeyBEZXBlbmRhYm90U2NoZWR1bGVJbnRlcnZhbCB9IGZyb20gJ3Byb2plbi9saWIvZ2l0aHViJztcbmltcG9ydCB7IEpvYlN0ZXAgfSBmcm9tICdwcm9qZW4vbGliL2dpdGh1Yi93b3JrZmxvd3MtbW9kZWwnO1xuXG4vLyBTZXQgdGhlIG1pbmltdW0gbm9kZSB2ZXJzaW9uIGZvciBBV1MgQ0RLIGFuZCB0aGUgR2l0SHViIGFjdGlvbnMgd29ya2Zsb3dcbmNvbnN0IG5vZGVWZXJzaW9uID0gJzI0LngnO1xuY29uc3QgbGFtYmRhTm9kZVZlcnNpb24gPSBMYW1iZGFSdW50aW1lLk5PREVKU18yNF9YO1xuXG4vLyBUaGUgbGFzdCBAYXdzLWNkay9pbnRlZy1ydW5uZXIgdmVyc2lvbiB2ZXJpZmllZCBhZ2FpbnN0IG5wbSAoY2hlY2tlZCAyMDI2LTA3LTIxKS5cbi8vIGludGVnLXJ1bm5lciB1c2VzIHBsYWluIHZlcnNpb25zIChubyAtYWxwaGEuMCBzdWZmaXgpIGFuZCBoYXMgaGlzdG9yaWNhbGx5IGxhZ2dlZFxuLy8gb3Igc3RvcHBlZCB0cmFja2luZyBhd3MtY2RrLWxpYidzIHZlcnNpb24gZm9yIHN0cmV0Y2hlcyBvZiB0aW1lLlxuLy8gQGF3cy1jZGsvaW50ZWctdGVzdHMtYWxwaGEgYW5kIGF3c2xpbnQgY29udGludWUgdG8gcHVibGlzaCBhbmQgdHJhY2sgQ0RLIHZlcnNpb25zLlxuLy8gU0hPUlRDVVQ6IGhhcmRjb2RlZCBjYXAgcmVxdWlyZXMgbWFudWFsIHJlLXZlcmlmaWNhdGlvbiAtLSBydW5cbi8vIGBucG0gdmlldyBAYXdzLWNkay9pbnRlZy1ydW5uZXIgdmVyc2lvbnMgLS1qc29uYCBhbmQgYnVtcCB0aGlzIGlmIGF3cy1jZGstbGliXG4vLyBoYXMgcmVsZWFzZWQgbmV3ZXIgdmVyc2lvbnMgdGhhbiB0aGlzIG9uZS5cbmNvbnN0IExBU1RfSU5URUdfUlVOTkVSX1ZFUlNJT04gPSAnMi4yMDMuMCc7XG5cbi8qKlxuICogVGhlIG9wdGlvbnMgZm9yIHRoZSBjb25zdHJ1Y3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNdmNDZGtDb25zdHJ1Y3RMaWJyYXJ5T3B0aW9ucyBleHRlbmRzIEF3c0Nka0NvbnN0cnVjdExpYnJhcnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIEJhc2UgZGlyZWN0b3J5IGZvciB0aGUgYXNzZXRzXG4gICAqXG4gICAqIEBkZWZhdWx0ICR7cHJvY2Vzcy5jd2QoKX0vbm9kZV9tb2R1bGVzL212Yy1wcm9qZW4vYXNzZXRzXG4gICAqL1xuICByZWFkb25seSBiYXNlQXNzZXRzRGlyZWN0b3J5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaW9ucyB0byBydW4gdGhlIGludGVnIHRlc3RzIGluXG4gICAqXG4gICAqIEBkZWZhdWx0IGV1LXdlc3QtMSBhbmQgZXUtd2VzdC0yXG4gICAqL1xuICByZWFkb25seSBpbnRlZ1Rlc3RSZWdpb25zPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogVHlwZVNjcmlwdCBsaWJyYXJ5XG4gKlxuICogQHBqaWQgbXZjLWF3c2Nkay1jb25zdHJ1Y3RcbiAqL1xuZXhwb3J0IGNsYXNzIE12Y0Nka0NvbnN0cnVjdExpYnJhcnkgZXh0ZW5kcyBBd3NDZGtDb25zdHJ1Y3RMaWJyYXJ5IHtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBNdmNDZGtDb25zdHJ1Y3RMaWJyYXJ5T3B0aW9ucykge1xuICAgIGNvbnN0IGJhc2VBc3NldHNEaXJlY3RvcnkgPSBvcHRpb25zLmJhc2VBc3NldHNEaXJlY3RvcnkgPz8gYCR7cHJvY2Vzcy5jd2QoKX0vbm9kZV9tb2R1bGVzL0BtYXZvZ2VsL212Yy1wcm9qZW4vYXNzZXRzYDtcbiAgICBjb25zdCBpbnRlZ1Rlc3RSZWdpb25zID0gb3B0aW9ucy5pbnRlZ1Rlc3RSZWdpb25zID8/IFsnZXUtd2VzdC0xJywgJ2V1LXdlc3QtMiddO1xuXG4gICAgc3VwZXIoe1xuICAgICAgYXV0aG9yT3JnYW5pemF0aW9uOiB0cnVlLFxuICAgICAgY29weXJpZ2h0T3duZXI6ICdNViBDb25zdWx0aW5nIEdtYkgnLFxuICAgICAgbGljZW5zZTogJ0FwYWNoZS0yLjAnLFxuICAgICAganNpaVZlcnNpb246ICd+Ni4wLjAnLFxuICAgICAgdHlwZXNjcmlwdFZlcnNpb246ICdeNi4wLjInLFxuICAgICAgbWluTm9kZVZlcnNpb246IG5vZGVWZXJzaW9uLFxuICAgICAgd29ya2Zsb3dOb2RlVmVyc2lvbjogbm9kZVZlcnNpb24sXG4gICAgICBzdGFiaWxpdHk6ICdleHBlcmltZW50YWwnLFxuICAgICAgcmVsZWFzZVRvTnBtOiB0cnVlLFxuICAgICAgcGFja2FnZU1hbmFnZXI6IGphdmFzY3JpcHQuTm9kZVBhY2thZ2VNYW5hZ2VyLk5QTSxcbiAgICAgIG5wbUFjY2VzczogamF2YXNjcmlwdC5OcG1BY2Nlc3MuUFVCTElDLFxuICAgICAgbGFtYmRhT3B0aW9uczoge1xuICAgICAgICBydW50aW1lOiBsYW1iZGFOb2RlVmVyc2lvbixcbiAgICAgICAgYXdzU2RrQ29ubmVjdGlvblJldXNlOiBmYWxzZSwgLy8gZG9lc24ndCBleGlzdCBpbiBBV1MgU0RLIEpTIHYzXG4gICAgICB9LFxuICAgICAgYXV0b0FwcHJvdmVPcHRpb25zOiB7XG4gICAgICAgIGFsbG93ZWRVc2VybmFtZXM6IFtcbiAgICAgICAgICAnZGVwZW5kYWJvdCcsXG4gICAgICAgICAgJ2RlcGVuZGFib3RbYm90XScsXG4gICAgICAgICAgJ2dpdGh1Yi1ib3QnLFxuICAgICAgICAgICdnaXRodWItYWN0aW9uc1tib3RdJyxcbiAgICAgICAgICAnbXZjLWJvdCcsXG4gICAgICAgIF0sXG4gICAgICAgIC8vIFRoZSBuYW1lIG9mIHRoZSBzZWNyZXQgdGhhdCBoYXMgdGhlIEdpdEh1YiBQQVQgZm9yIGF1dG8tYXBwcm92aW5nIFBScyB3aXRoIHBlcm1pc3Npb25zIHJlcG8sIHdvcmtmbG93LCB3cml0ZTpwYWNrYWdlc1xuICAgICAgICAvLyBHZW5lcmF0ZSBhIG5ldyBQQVQgKGh0dHBzOi8vZ2l0aHViLmNvbS9zZXR0aW5ncy90b2tlbnMvbmV3KSBhbmQgYWRkIGl0IHRvIHlvdXIgcmVwbydzIHNlY3JldHNcbiAgICAgICAgLy8gTk9URTogY29tZXMgZnJvbSBNVi1Db25zdWx0aW5nIE9yZ1xuICAgICAgICBzZWNyZXQ6ICdQUk9KRU5fR0lUSFVCX1RPS0VOJyxcbiAgICAgIH0sXG4gICAgICBkZXBlbmRhYm90OiB0cnVlLFxuICAgICAgZGVwZW5kYWJvdE9wdGlvbnM6IHtcbiAgICAgICAgc2NoZWR1bGVJbnRlcnZhbDogRGVwZW5kYWJvdFNjaGVkdWxlSW50ZXJ2YWwuV0VFS0xZLFxuICAgICAgICBsYWJlbHM6IFsnZGVwZW5kZW5jaWVzJywgJ2F1dG8tYXBwcm92ZSddLFxuICAgICAgICBncm91cHM6IHtcbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBwYXR0ZXJuczogWycqJ10sXG4gICAgICAgICAgICBleGNsdWRlUGF0dGVybnM6IFsnYXdzLWNkayonLCAncHJvamVuJ10sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgaWdub3JlOiBbeyBkZXBlbmRlbmN5TmFtZTogJ2F3cy1jZGstbGliJyB9LCB7IGRlcGVuZGVuY3lOYW1lOiAnYXdzLWNkaycgfV0sXG4gICAgICB9LFxuICAgICAgLy8gLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9qZW4vcHJvamVuL2Rpc2N1c3Npb25zLzQwNDAjZGlzY3Vzc2lvbmNvbW1lbnQtMTE5MDU2MjhcbiAgICAgIHJlbGVhc2FibGVDb21taXRzOiBSZWxlYXNhYmxlQ29tbWl0cy5vZlR5cGUoW1xuICAgICAgICAnZmVhdCcsXG4gICAgICAgICdmaXgnLFxuICAgICAgICAnY2hvcmUnLFxuICAgICAgICAncmVmYWN0b3InLFxuICAgICAgICAncGVyZicsXG4gICAgICBdKSxcbiAgICAgIGdpdGh1Yk9wdGlvbnM6IHtcbiAgICAgICAgcHVsbFJlcXVlc3RMaW50T3B0aW9uczoge1xuICAgICAgICAgIHNlbWFudGljVGl0bGVPcHRpb25zOiB7XG4gICAgICAgICAgICAvLyBzZWUgY29tbWl0IHR5cGVzIGhlcmU6IGh0dHBzOi8vd3d3LmNvbnZlbnRpb25hbGNvbW1pdHMub3JnL2VuL3YxLjAuMC8jc3VtbWFyeVxuICAgICAgICAgICAgdHlwZXM6IFtcbiAgICAgICAgICAgICAgJ2ZlYXQnLFxuICAgICAgICAgICAgICAnZml4JyxcbiAgICAgICAgICAgICAgJ2Nob3JlJyxcbiAgICAgICAgICAgICAgJ3JlZmFjdG9yJyxcbiAgICAgICAgICAgICAgJ3BlcmYnLFxuICAgICAgICAgICAgICAnZG9jcycsXG4gICAgICAgICAgICAgICdzdHlsZScsXG4gICAgICAgICAgICAgICd0ZXN0JyxcbiAgICAgICAgICAgICAgJ2J1aWxkJyxcbiAgICAgICAgICAgICAgJ2NpJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB2ZXJzaW9ucmNPcHRpb25zOiB7XG4gICAgICAgIHR5cGVzOiBbXG4gICAgICAgICAgeyB0eXBlOiAnZmVhdCcsIHNlY3Rpb246ICdGZWF0dXJlcycgfSxcbiAgICAgICAgICB7IHR5cGU6ICdmaXgnLCBzZWN0aW9uOiAnQnVnIEZpeGVzJyB9LFxuICAgICAgICAgIHsgdHlwZTogJ2Nob3JlJywgc2VjdGlvbjogJ0Nob3JlcycgfSxcbiAgICAgICAgICB7IHR5cGU6ICdkb2NzJywgc2VjdGlvbjogJ0RvY3MnIH0sXG4gICAgICAgICAgeyB0eXBlOiAnc3R5bGUnLCBoaWRkZW46IHRydWUgfSxcbiAgICAgICAgICB7IHR5cGU6ICdyZWZhY3RvcicsIGhpZGRlbjogdHJ1ZSB9LFxuICAgICAgICAgIHsgdHlwZTogJ3BlcmYnLCBzZWN0aW9uOiAnUGVyZm9ybWFuY2UnIH0sXG4gICAgICAgICAgeyB0eXBlOiAndGVzdCcsIGhpZGRlbjogdHJ1ZSB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIGVzbGludE9wdGlvbnM6IHtcbiAgICAgICAgcHJldHRpZXI6IGZhbHNlLFxuICAgICAgICBkaXJzOiBbJ3NyYyddLFxuICAgICAgICBpZ25vcmVQYXR0ZXJuczogWycqKi8qLWZ1bmN0aW9uLnRzJywgJ2V4YW1wbGVzLyddLFxuICAgICAgfSxcbiAgICAgIC8vIGV4cGVyaW1lbnRhbEludGVnUnVubmVyOiB0cnVlLFxuICAgICAgLy8gbWFudWFsIGludGVnIHRlc3Qgc2V0dXBcbiAgICAgIHRzY29uZmlnRGV2OiB7XG4gICAgICAgIGNvbXBpbGVyT3B0aW9uczoge1xuICAgICAgICAgIHR5cGVzOiBbJ25vZGUnLCAnamVzdCddLFxuICAgICAgICB9LFxuICAgICAgICBpbmNsdWRlOiBbJ2ludGVnLXRlc3RzLyoqLyoudHMnXSxcbiAgICAgIH0sXG4gICAgICBwdWxsUmVxdWVzdFRlbXBsYXRlQ29udGVudHM6IFtmcy5yZWFkRmlsZVN5bmMoYCR7YmFzZUFzc2V0c0RpcmVjdG9yeX0vY29tbW9uL2dpdGh1Yl9wdWxsX3JlcXVlc3QubWRgKS50b1N0cmluZygpXSxcbiAgICAgIC8vIE5PVEU6IGlzc3VlIHRlbXBsYXRlcyBhcmUgbm90IHN1cHBvcnRlZCB5ZXQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHJvamVuL3Byb2plbi9wdWxsLzM2NDhcbiAgICAgIC8vIGlzc3VlVGVtcGxhdGVzOiB7fVxuICAgICAgcmVhZG1lOiB7XG4gICAgICAgIGNvbnRlbnRzOiBbXG4gICAgICAgICAgYFxuIVtTb3VyY2VdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vZ2l0aHViL3N0YXJzL01WLUNvbnN1bHRpbmcvJHtvcHRpb25zLm5hbWV9P2xvZ289Z2l0aHViJmxhYmVsPUdpdEh1YiUyMFN0YXJzKVxuWyFbQnVpbGQgU3RhdHVzXShodHRwczovL2dpdGh1Yi5jb20vTVYtQ29uc3VsdGluZy8ke29wdGlvbnMubmFtZX0vYWN0aW9ucy93b3JrZmxvd3MvYnVpbGQueW1sL2JhZGdlLnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS9NVi1Db25zdWx0aW5nLyR7b3B0aW9ucy5uYW1lfS9hY3Rpb25zL3dvcmtmbG93cy9idWlsZC55bWwpXG5bIVtFU0xpbnQgQ29kZSBGb3JtYXR0aW5nXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL2NvZGVfc3R5bGUtZXNsaW50LWJyaWdodGdyZWVuLnN2ZyldKGh0dHBzOi8vZXNsaW50Lm9yZylcblshW0xhdGVzdCByZWxlYXNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2dpdGh1Yi9yZWxlYXNlL01WLUNvbnN1bHRpbmcvJHtvcHRpb25zLm5hbWV9LnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS9NVi1Db25zdWx0aW5nLyR7b3B0aW9ucy5uYW1lfS9yZWxlYXNlcylcbiFbR2l0SHViXShodHRwczovL2ltZy5zaGllbGRzLmlvL2dpdGh1Yi9saWNlbnNlL01WLUNvbnN1bHRpbmcvJHtvcHRpb25zLm5hbWV9KVxuWyFbbnBtXShodHRwczovL2ltZy5zaGllbGRzLmlvL25wbS9kdC9AbWF2b2dlbC8ke29wdGlvbnMubmFtZX0/bGFiZWw9bnBtJmNvbG9yPW9yYW5nZSldKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL0BtYXZvZ2VsLyR7b3B0aW9ucy5uYW1lfSlcblshW3R5cGVzY3JpcHRdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvanNpaS10eXBlc2NyaXB0LWJsdWV2aW9sZXQuc3ZnKV0oaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvQG1hdm9nZWwvJHtvcHRpb25zLm5hbWV9KVxuICAgICAgICAgIGAsXG4gICAgICAgICAgYCMgJHtvcHRpb25zLm5hbWV9YCxcbiAgICAgICAgICAnTXkgYXdlc29tZSBkZXNjcmlwdGlvbi4uLicsXG4gICAgICAgICAgYFxuIyMgVGFibGUgb2YgQ29udGVudHNcblxuLSBbRmVhdHVyZXNdKCNmZWF0dXJlcylcbi0gW1VzYWdlXSgjdXNhZ2UpXG4tIFtTb2x1dGlvbiBEZXNpZ25dKCNzb2x1dGlvbi1kZXNpZ24pXG4tIFtJbnNwaXJhdGlvbl0oI2luc3BpcmF0aW9uKVxuXG4jIyBGZWF0dXJlc1xuXG4tIOKaoSAqKlF1aWNrIFNldHVwKio6IFRCRFxuLSDwn5OPICoqQmVzdCBQcmFjdGljZSBTZXR1cCoqOiBUQkRcbi0g8J+kueKAjeKZgu+4jyAqKlByZS1pbnN0YWxsZWQgcGFja2FnZXMqKjogVEJEXG4tIPCfj5fvuI8gKipFeHRlbnNpYmlsaXR5Kio6IFRCRFxuXG4jIyBVc2FnZVxuVGhlIGZvbGxvd2luZyBzdGVwcyBnZXQgeW91IHN0YXJ0ZWQ6XG5cbjEuIENyZWF0ZSBhIG5ldyBcXGBhd3NjZGstYXBwXFxgIHZpYVxuXFxgXFxgXFxgYmFzaFxubnB4IHByb2plbiBuZXcgYXdzY2RrLWFwcC10cyAtLWNka1ZlcnNpb249Mi4yNjEuMCAtLXBhY2thZ2UtbWFuYWdlcj1ucG1cblxcYFxcYFxcYFxuMy4gQWRkIFxcYEBtYXZvZ2VsLyR7b3B0aW9ucy5uYW1lfVxcYCBhcyBhIGRlcGVuZGVuY3kgdG8geW91ciBwcm9qZWN0IGluIHRoZSBcXGAucHJvamVucmMudHNcXGAgZmlsZVxuNC4gUnVuIFxcYG5weCBwcm9qZW5cXGAgdG8gaW5zdGFsbCBpdFxuNS4gQWRkIHRoZSBmb2xsb3dpbmcgdG8gdGhlIFxcYHNyYy9tYWluLnRzXFxgIGZpbGU6XG5cXGBcXGBcXGB0c1xuaW1wb3J0IHsgQXBwLCBTdGFjaywgU3RhY2tQcm9wcyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGVjMiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgUGxhY2Vob2xkZXIgfSBmcm9tICdAbWF2b2dlbC8ke29wdGlvbnMubmFtZX0nO1xuXG5leHBvcnQgY2xhc3MgTXlTdGFjayBleHRlbmRzIFN0YWNrIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFN0YWNrUHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgbmV3IFBsYWNlaG9sZGVyKHRoaXMsICdwbGFjZWhvbGRlcicsIHtcbiAgICAgIC8vIGFuZCBtb3JlLi4uIPCfkqFcbiAgICB9KTtcbiAgfVxufVxuXG5jb25zdCBlbnYgPSB7XG4gIGFjY291bnQ6ICcxMjM0NTY3ODk5MTInLFxuICByZWdpb246ICdldS1jZW50cmFsLTEnLFxufTtcblxuY29uc3QgYXBwID0gbmV3IEFwcCgpO1xubmV3IE15U3RhY2soYXBwLCAncGxhY2Vob2xkZXInLCB7IGVudiB9KTtcbmFwcC5zeW50aCgpO1xuXFxgXFxgXFxgXG5cbmFuZCBkZXBsb3kgaXRcblxcYFxcYFxcYGJhc2hcbm5weCBwcm9qZW4gYnVpbGRcbm5weCBwcm9qZW4gZGVwbG95XG5cXGBcXGBcXGBcblxud2l0aCB0aGUgb3V0cHV0XG5cXGBcXGBcXGBjb25zb2xlXG5UQkRcblxcYFxcYFxcYFxuXG5TZWUgdGhlIFtleGFtcGxlc10oLi9leGFtcGxlcykgZm9sZGVyIGZvciBtb3JlIGluc3BpcmF0aW9uLlxuXG4jIyBTb2x1dGlvbiBEZXNpZ25cblxuPGRldGFpbHM+XG4gIDxzdW1tYXJ5Pi4uLiBpZiB5b3UncmUgY3VyaW91cyBhYm91dCBjbGljayBoZXJlIGZvciB0aGUgZGV0YWlsczwvc3VtbWFyeT5cblxuIVtwbGFjZWhvbGRlcl0oZG9jcy9pbWcvcGxhY2Vob2xkZXIuZHJhd2lvLW1pbi5wbmcpXG5cbjwvZGV0YWlscz5cblxuIyMgSW5zcGlyYXRpb25cblxuYWRkIHRvb2xzIG9yIGxpbmtzIHdoaWNoIGluc3BpcmVkIHlvdVxuICAgICAgICAgIGAsXG4gICAgICAgICAgZnMucmVhZEZpbGVTeW5jKGAke2Jhc2VBc3NldHNEaXJlY3Rvcnl9L2NvbW1vbi9naXRodWJfcmVhZG1lX2N0YS5tZGApLnRvU3RyaW5nKCksXG4gICAgICAgIF0uam9pbignXFxuJyksXG4gICAgICB9LFxuICAgICAgLy8gTk9URToga2VlcCBhbGwgdGhlIHBhc3NlZCBpbiBvcHRpb25zIHdoaWNoIGNhbiBvdmVycmlkZSB0aGUgZXhpc3Rpbmcgb25lcyFcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG5cbiAgICAvLyBUeXBlU2NyaXB0IDYgbm8gbG9uZ2VyIGF1dG8tZGlzY292ZXJzIEB0eXBlcy8qIHBhY2thZ2VzXG4gICAgdGhpcy50c2NvbmZpZ0Rldi5maWxlLmFkZE92ZXJyaWRlKCdjb21waWxlck9wdGlvbnMudHlwZXMnLCBbJ25vZGUnLCAnamVzdCddKTtcbiAgICB0aGlzLnRzY29uZmlnPy5maWxlLmFkZE92ZXJyaWRlKCdjb21waWxlck9wdGlvbnMudHlwZXMnLCBbJ25vZGUnXSk7XG5cbiAgICAvLyBwcm9qZW4ncyBBdXRvTWVyZ2UgY29tcG9uZW50IGhhcmRjb2RlcyBgZGVsZXRlX2hlYWRfYnJhbmNoOiB7fWAgaW4gdGhlXG4gICAgLy8gbWVyZ2lmeSBydWxlIHdpdGggbm8gb3B0aW9uIHRvIGRpc2FibGUgaXQuIFN0cmlwIGl0IHNvIE1lcmdpZnkgZG9lcyBub3RcbiAgICAvLyBkZWxldGUgaGVhZCBicmFuY2hlcyBvbiBtZXJnZSAocmVub3ZhdGUvZGVwZW5kYWJvdCBtYW5hZ2UgdGhlaXIgb3duKS5cbiAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL01WLUNvbnN1bHRpbmcvY2RrLXZzY29kZS1zZXJ2ZXIvcHVsbC8xMTJcbiAgICB0aGlzLnRyeUZpbmRPYmplY3RGaWxlKCcubWVyZ2lmeS55bWwnKT8uYWRkRGVsZXRpb25PdmVycmlkZShcbiAgICAgICdwdWxsX3JlcXVlc3RfcnVsZXMuMC5hY3Rpb25zLmRlbGV0ZV9oZWFkX2JyYW5jaCcsXG4gICAgKTtcblxuICAgIC8vIGdpdGlnbm9yZVxuICAgIGNvbnN0IGZpbGVzUGF0dGVyblRvR2l0aWdub3JlID0gW1xuICAgICAgJ3RtcCcsXG4gICAgICAnLmNvZGVncHQnLFxuICAgIF07XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzUGF0dGVyblRvR2l0aWdub3JlKSB7XG4gICAgICB0aGlzLmdpdGlnbm9yZS5leGNsdWRlKGZpbGUpO1xuICAgIH1cbiAgICB0aGlzLmFkZERlcHMoXG4gICAgICAvLyBjZGstbmFnIHYzIHJlcXVpcmVzIGF3cy1jZGstbGliID49IDIuMjU3LjAgKHNlZSBjZGstbmFnIE1JR1JBVElPTi5tZClcbiAgICAgICdjZGstbmFnQF4zLjAuMScsXG4gICAgKTtcbiAgICAvLyBDYXAgaW50ZWctcnVubmVyIGF0IExBU1RfSU5URUdfUlVOTkVSX1ZFUlNJT04gc2luY2UgaXQgc3RvcHBlZCBwdWJsaXNoaW5nIGFmdGVyIHRoYXQgdmVyc2lvbi5cbiAgICAvLyBpbnRlZy1ydW5uZXIgdXNlcyBwbGFpbiB2ZXJzaW9ucyAobm8gLWFscGhhLjAgc3VmZml4KS5cbiAgICAvLyBpbnRlZy10ZXN0cy1hbHBoYSBhbmQgYXdzbGludCBvbmx5IHB1Ymxpc2ggYXQgbWlub3IgdmVyc2lvbnMgKGUuZy4gMi4xOTcuMC1hbHBoYS4wLCBub3QgMi4xOTcuNC1hbHBoYS4wKS5cbiAgICBjb25zdCByYXdDZGtWZXJzaW9uID0gdGhpcy5jZGtWZXJzaW9uLnJlcGxhY2UoL1tcXF5+XS8sICcnKTtcbiAgICBjb25zdCBpbnRlZ1J1bm5lclZlcnNpb24gPSByYXdDZGtWZXJzaW9uLmxvY2FsZUNvbXBhcmUoTEFTVF9JTlRFR19SVU5ORVJfVkVSU0lPTiwgdW5kZWZpbmVkLCB7IG51bWVyaWM6IHRydWUsIHNlbnNpdGl2aXR5OiAnYmFzZScgfSkgPiAwXG4gICAgICA/IExBU1RfSU5URUdfUlVOTkVSX1ZFUlNJT05cbiAgICAgIDogcmF3Q2RrVmVyc2lvbjtcbiAgICAvLyBBbHBoYSBwYWNrYWdlcyBvbmx5IHB1Ymxpc2ggYXQgLjAgcGF0Y2ggdmVyc2lvbnMg4oCUIG5vcm1hbGl6ZSB0byBtaW5vciB2ZXJzaW9uXG4gICAgY29uc3QgW21ham9yLCBtaW5vcl0gPSByYXdDZGtWZXJzaW9uLnNwbGl0KCcuJyk7XG4gICAgY29uc3QgYWxwaGFWZXJzaW9uID0gYCR7bWFqb3J9LiR7bWlub3J9LjBgO1xuICAgIHRoaXMuYWRkRGV2RGVwcyhcbiAgICAgIGBAYXdzLWNkay9pbnRlZy1ydW5uZXJAJHtpbnRlZ1J1bm5lclZlcnNpb259YCxcbiAgICAgIGBAYXdzLWNkay9pbnRlZy10ZXN0cy1hbHBoYUAke2FscGhhVmVyc2lvbn0tYWxwaGEuMGAsXG4gICAgICAnQGNvbW1pdGxpbnQvY2xpQF4yMC4xLjAnLFxuICAgICAgJ0Bjb21taXRsaW50L2NvbmZpZy1jb252ZW50aW9uYWxAXjIwLjAuMCcsXG4gICAgICBgYXdzbGludEAke2FscGhhVmVyc2lvbn0tYWxwaGEuMGAsXG4gICAgICAnaHVza3lAXjkuMS43JyxcbiAgICApO1xuXG4gICAgdGhpcy5wYWNrYWdlLnNldFNjcmlwdCgncHJlcGFyZScsICdodXNreScpO1xuICAgIG5ldyBUZXh0RmlsZSh0aGlzLCAnLmNvbW1pdGxpbnRyYy5qcycsIHtcbiAgICAgIGxpbmVzOiBbXG4gICAgICAgICdtb2R1bGUuZXhwb3J0cyA9IHsgZXh0ZW5kczogW1xcJ0Bjb21taXRsaW50L2NvbmZpZy1jb252ZW50aW9uYWxcXCddIH07JyxcbiAgICAgIF0sXG4gICAgICBtYXJrZXI6IHRydWUsXG4gICAgfSk7XG5cbiAgICB0aGlzLnBhY2thZ2Uuc2V0U2NyaXB0KCdhd3NsaW50JywgJ2F3c2xpbnQnKTtcbiAgICAvLyAuZ2l0aHViL3dvcmtmbG93cy9idWlsZC55bWxcbiAgICBjb25zdCBidWlsZFdvcmtmbG93ID0gdGhpcy5naXRodWI/LnRyeUZpbmRXb3JrZmxvdygnYnVpbGQnKTtcbiAgICBpZiAoIWJ1aWxkV29ya2Zsb3cpIHJldHVybjtcbiAgICBjb25zdCBidWlsZEpvYiA9IGJ1aWxkV29ya2Zsb3cuZ2V0Sm9iKCdidWlsZCcpO1xuICAgIGlmICghYnVpbGRKb2IgfHwgISgnc3RlcHMnIGluIGJ1aWxkSm9iKSkgcmV0dXJuO1xuICAgIC8vIFRPRE86IGZpZ3VyZSBvdXQgd2h5IHdyb25nIHR5cGVzXG4gICAgY29uc3QgZ2V0QnVpbGRTdGVwcyA9IGJ1aWxkSm9iLnN0ZXBzIGFzIHVua25vd24gYXMgKCkgPT4gSm9iU3RlcFtdO1xuICAgIGNvbnN0IGJ1aWxkSm9iU3RlcHMgPSBnZXRCdWlsZFN0ZXBzKCk7XG4gICAgYnVpbGRXb3JrZmxvdy51cGRhdGVKb2IoJ2J1aWxkJywge1xuICAgICAgLi4uYnVpbGRKb2IsXG4gICAgICBzdGVwczogW1xuICAgICAgICAuLi5idWlsZEpvYlN0ZXBzLnNsaWNlKDAsIDQpLFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ1J1biBhd3NsaW50JyxcbiAgICAgICAgICBydW46ICducG0gcnVuIGF3c2xpbnQnLFxuICAgICAgICB9LFxuICAgICAgICAuLi5idWlsZEpvYlN0ZXBzLnNsaWNlKDQpLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIHRoaXMucGFja2FnZS5zZXRTY3JpcHQoXG4gICAgICAnaW50ZWctdGVzdCcsXG4gICAgICBgaW50ZWctcnVubmVyIC0tZGlyZWN0b3J5IC4vaW50ZWctdGVzdHMgJHtpbnRlZ1Rlc3RSZWdpb25zPy5tYXAocmVnaW9uID0+IGAtLXBhcmFsbGVsLXJlZ2lvbnMgJHtyZWdpb259YCkuam9pbignICcpfSAtLXVwZGF0ZS1vbi1mYWlsZWRgLFxuICAgICk7XG5cbiAgICBuZXcgVGV4dEZpbGUodGhpcywgJy5naXRodWIvSVNTVUVfVEVNUExBVEUvYnVnX3JlcG9ydC5tZCcsIHtcbiAgICAgIGxpbmVzOiBbZnMucmVhZEZpbGVTeW5jKGAke2Jhc2VBc3NldHNEaXJlY3Rvcnl9L2NvbW1vbi9naXRodWJfYnVnX3JlcG9ydC5tZGApLnRvU3RyaW5nKCldLFxuICAgIH0pO1xuXG4gICAgbmV3IFRleHRGaWxlKHRoaXMsICcuZ2l0aHViL0lTU1VFX1RFTVBMQVRFL2ZlYXR1cmVfcmVxdWVzdC5tZCcsIHtcbiAgICAgIGxpbmVzOiBbZnMucmVhZEZpbGVTeW5jKGAke2Jhc2VBc3NldHNEaXJlY3Rvcnl9L2NvbW1vbi9naXRodWJfZmVhdHVyZV9yZXF1ZXN0Lm1kYCkudG9TdHJpbmcoKV0sXG4gICAgfSk7XG5cbiAgICBuZXcgWWFtbEZpbGUodGhpcywgJy5naXRodWIvRlVORElORy55YW1sJywge1xuICAgICAgb2JqOiB7XG4gICAgICAgIGdpdGh1YjogJ21hdm9nZWwnLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIG5ldyBUZXh0RmlsZSh0aGlzLCAnQ09OVFJJQlVUSU5HLm1kJywge1xuICAgICAgbGluZXM6IFtmcy5yZWFkRmlsZVN5bmMoYCR7YmFzZUFzc2V0c0RpcmVjdG9yeX0vY29tbW9uL2NvbnRyaWJ1dGluZy5tZGApLnRvU3RyaW5nKCldLFxuICAgIH0pO1xuXG4gICAgbmV3IFRleHRGaWxlKHRoaXMsICcucHJldHRpZXJyYycsIHtcbiAgICAgIGxpbmVzOiBbZnMucmVhZEZpbGVTeW5jKGAke2Jhc2VBc3NldHNEaXJlY3Rvcnl9L2NvbW1vbi9wcmV0dGllcnJjYCkudG9TdHJpbmcoKV0sXG4gICAgfSk7XG5cbiAgICAvLyB3cml0ZSBzYW1wbGUgY29kZSB0byBtYWluLnRzICYgdG8gbWFpbi50ZXN0LnRzXG4gICAgaWYgKG9wdGlvbnMuc2FtcGxlQ29kZSA/PyB0cnVlKSB7XG4gICAgICBuZXcgU2FtcGxlQ29kZSh0aGlzLCB7XG4gICAgICAgIGJhc2VBc3NldHNEaXJlY3RvcnksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuaW50ZXJmYWNlIFNhbXBsZUNvZGVPcHRpb25zIHtcbiAgcmVhZG9ubHkgYmFzZUFzc2V0c0RpcmVjdG9yeT86IHN0cmluZztcbn1cblxuY2xhc3MgU2FtcGxlQ29kZSBleHRlbmRzIENvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGlicmFyeTogQXdzQ2RrQ29uc3RydWN0TGlicmFyeTtcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBTYW1wbGVDb2RlT3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBsaWJyYXJ5OiBBd3NDZGtDb25zdHJ1Y3RMaWJyYXJ5LFxuICAgIG9wdGlvbnM6IFNhbXBsZUNvZGVPcHRpb25zLFxuICApIHtcbiAgICBzdXBlcihsaWJyYXJ5KTtcbiAgICB0aGlzLmxpYnJhcnkgPSBsaWJyYXJ5O1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gIH1cblxuICBwdWJsaWMgc3ludGhlc2l6ZSgpIHtcbiAgICBjb25zdCBvdXRkaXIgPSB0aGlzLnByb2plY3Qub3V0ZGlyO1xuICAgIGNvbnN0IHNyY2RpciA9IHBhdGguam9pbihvdXRkaXIsIHRoaXMubGlicmFyeS5zcmNkaXIpO1xuICAgIGlmIChcbiAgICAgIGZzLmV4aXN0c1N5bmMoc3JjZGlyKSAmJlxuICAgICAgZnMucmVhZGRpclN5bmMoc3JjZGlyKS5maWx0ZXIoKHgpID0+IHguZW5kc1dpdGgoJy50cycpKSAmJlxuICAgICAgIWZzLnJlYWRGaWxlU3luYyhgJHtzcmNkaXJ9L2luZGV4LnRzYCkudG9TdHJpbmcoKS5pbmNsdWRlcygnZXhwb3J0IGNsYXNzIEhlbGxvJykgLy8gTm90ZTogZnJvbSBwYXJlbnRcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmcy5ta2RpclN5bmMoc3JjZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihzcmNkaXIsICdpbmRleC50cycpLCBmcy5yZWFkRmlsZVN5bmMoYCR7dGhpcy5vcHRpb25zLmJhc2VBc3NldHNEaXJlY3Rvcnl9L2Nkay1jb25zdHJ1Y3Qvc3JjX2luZGV4LnRzYCkudG9TdHJpbmcoKSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4oc3JjZGlyLCAncGxhY2Vob2xkZXIudHMnKSwgZnMucmVhZEZpbGVTeW5jKGAke3RoaXMub3B0aW9ucy5iYXNlQXNzZXRzRGlyZWN0b3J5fS9jZGstY29uc3RydWN0L3NyY19wbGFjZWhvbGRlci50c2ApLnRvU3RyaW5nKCkpO1xuICAgIC8vIGNyZCB3aXRoIGxhbWJkYSBnZW5lcmF0aW9uXG4gICAgZnMubWtkaXJTeW5jKGAke3NyY2Rpcn0vY3JkLWV4YW1wbGVgLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihgJHtzcmNkaXJ9L2NyZC1leGFtcGxlYCwgJ2NyZC1leGFtcGxlLnRzJyksIGZzLnJlYWRGaWxlU3luYyhgJHt0aGlzLm9wdGlvbnMuYmFzZUFzc2V0c0RpcmVjdG9yeX0vY2RrLWNvbnN0cnVjdC9zcmNfY3JkLWV4YW1wbGUudHNgKS50b1N0cmluZygpKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihgJHtzcmNkaXJ9L2NyZC1leGFtcGxlYCwgJ2NyZC1leGFtcGxlLmxhbWJkYS50cycpLCBmcy5yZWFkRmlsZVN5bmMoYCR7dGhpcy5vcHRpb25zLmJhc2VBc3NldHNEaXJlY3Rvcnl9L2Nkay1jb25zdHJ1Y3Qvc3JjX2NyZC1leGFtcGxlLmxhbWJkYS50c2ApLnRvU3RyaW5nKCkpO1xuXG5cbiAgICBjb25zdCB0ZXN0ZGlyID0gcGF0aC5qb2luKG91dGRpciwgdGhpcy5saWJyYXJ5LnRlc3RkaXIpO1xuICAgIGlmIChcbiAgICAgIGZzLmV4aXN0c1N5bmModGVzdGRpcikgJiZcbiAgICAgIGZzLnJlYWRkaXJTeW5jKHRlc3RkaXIpLmZpbHRlcigoeCkgPT4geC5lbmRzV2l0aCgnLnRzJykpICYmXG4gICAgICAhZnMuZXhpc3RzU3luYyhgJHt0ZXN0ZGlyfS9oZWxsby50ZXN0LnRzYCkgLy8gTm90ZTogZnJvbSBwYXJlbnRcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gcmVtb3ZlICR7dGVzdGRpcn0vaGVsbG8udGVzdC50cyBmaWxlLiBPbiB0aGUgb3RoZXIgaGFuZCwgd2Ugb3ZlcnJpZGUgaW5kZXgudHNcbiAgICBmcy51bmxpbmtTeW5jKGAke3Rlc3RkaXJ9L2hlbGxvLnRlc3QudHNgKTtcbiAgICBmcy5ta2RpclN5bmModGVzdGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4odGVzdGRpciwgJ2luZGV4LnRlc3QudHMnKSwgZnMucmVhZEZpbGVTeW5jKGAke3RoaXMub3B0aW9ucy5iYXNlQXNzZXRzRGlyZWN0b3J5fS9jZGstY29uc3RydWN0L3Rlc3RfaW5kZXgudGVzdC50c2ApLnRvU3RyaW5nKCkpO1xuICAgIC8vIGxhbWJkYSB0ZXN0cyB3aXRoIGplc3Qgc3R1YnNcbiAgICBmcy5ta2RpclN5bmMoYCR7dGVzdGRpcn0vY3JkLWV4YW1wbGVgLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihgJHt0ZXN0ZGlyfS9jcmQtZXhhbXBsZWAsICdjcmQtZXhhbXBsZS50ZXN0LnRzJyksIGZzLnJlYWRGaWxlU3luYyhgJHt0aGlzLm9wdGlvbnMuYmFzZUFzc2V0c0RpcmVjdG9yeX0vY2RrLWNvbnN0cnVjdC90ZXN0X2NyZC1leGFtcGxlLnRlc3QudHNgKS50b1N0cmluZygpKTtcblxuXG4gICAgY29uc3QgaW50ZWdUZXN0ZGlyID0gcGF0aC5qb2luKG91dGRpciwgJ2ludGVnLXRlc3RzJyk7XG4gICAgaWYgKFxuICAgICAgZnMuZXhpc3RzU3luYyhpbnRlZ1Rlc3RkaXIpICYmXG4gICAgICBmcy5yZWFkZGlyU3luYyhpbnRlZ1Rlc3RkaXIpLmZpbHRlcigoeCkgPT4geC5lbmRzV2l0aCgnLnRzJykpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZzLm1rZGlyU3luYyhpbnRlZ1Rlc3RkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKGludGVnVGVzdGRpciwgJ2ludGVnLnBsYWNlaG9sZGVyLnRzJyksIGZzLnJlYWRGaWxlU3luYyhgJHt0aGlzLm9wdGlvbnMuYmFzZUFzc2V0c0RpcmVjdG9yeX0vY2RrLWNvbnN0cnVjdC9pbnRlZ19pbnRlZy5wbGFjZWhvbGRlci50c2ApLnRvU3RyaW5nKCkpO1xuXG4gICAgY29uc3QgaW50ZWdUZXN0RnVuY3Rpb25zZGlyID0gcGF0aC5qb2luKGludGVnVGVzdGRpciwgJ2Z1bmN0aW9ucycpO1xuICAgIGlmIChcbiAgICAgIGZzLmV4aXN0c1N5bmMoaW50ZWdUZXN0RnVuY3Rpb25zZGlyKSAmJlxuICAgICAgZnMucmVhZGRpclN5bmMoaW50ZWdUZXN0RnVuY3Rpb25zZGlyKS5maWx0ZXIoKHgpID0+IHguZW5kc1dpdGgoJy50cycpKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmcy5ta2RpclN5bmMoaW50ZWdUZXN0RnVuY3Rpb25zZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihpbnRlZ1Rlc3RGdW5jdGlvbnNkaXIsICd0ZXN0LWhhbmRsZXIudHMnKSwgZnMucmVhZEZpbGVTeW5jKGAke3RoaXMub3B0aW9ucy5iYXNlQXNzZXRzRGlyZWN0b3J5fS9jZGstY29uc3RydWN0L2ludGVnX3Rlc3QtaGFuZGxlci50c2ApLnRvU3RyaW5nKCkpO1xuXG4gICAgY29uc3QgZG9jc2RpciA9IHBhdGguam9pbihvdXRkaXIsICdkb2NzJyk7XG4gICAgaWYgKFxuICAgICAgZnMuZXhpc3RzU3luYyhkb2NzZGlyKSAmJlxuICAgICAgZnMucmVhZGRpclN5bmMoZG9jc2RpcikuZmlsdGVyKCh4KSA9PiB4LmVuZHNXaXRoKCcuZHJhd2lvJykpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZzLm1rZGlyU3luYyhkb2NzZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihkb2NzZGlyLCAncGxhY2Vob2xkZXIuZHJhd2lvJyksIGZzLnJlYWRGaWxlU3luYyhgJHt0aGlzLm9wdGlvbnMuYmFzZUFzc2V0c0RpcmVjdG9yeX0vY29tbW9uL2RvY3NfcGxhY2Vob2xkZXIuZHJhd2lvYCkudG9TdHJpbmcoKSk7XG5cbiAgICBjb25zdCBleGFtcGxlc2RpciA9IHBhdGguam9pbihvdXRkaXIsICdleGFtcGxlcycsICdzaW1wbGUnKTtcbiAgICBpZiAoXG4gICAgICBmcy5leGlzdHNTeW5jKGV4YW1wbGVzZGlyKSAmJlxuICAgICAgZnMucmVhZGRpclN5bmMoZXhhbXBsZXNkaXIpLmZpbHRlcigoeCkgPT4geC5lbmRzV2l0aCgnLmRyYXdpbycpKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmcy5ta2RpclN5bmMoZXhhbXBsZXNkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKGV4YW1wbGVzZGlyLCAnbWFpbi50cycpLCBmcy5yZWFkRmlsZVN5bmMoYCR7dGhpcy5vcHRpb25zLmJhc2VBc3NldHNEaXJlY3Rvcnl9L2Nkay1jb25zdHJ1Y3QvZXhhbXBsZXNfc2ltcGxlX21haW4udHNgKS50b1N0cmluZygpKTtcbiAgfVxufSJdfQ==
|
|
487
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWNvbnN0cnVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm9qZWN0cy9jZGstY29uc3RydWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx1Q0FBeUI7QUFDekIsMkNBQTZCO0FBRTdCLG1DQUFzRjtBQUN0Riw4Q0FBeUc7QUFDekcsOENBQStEO0FBRy9ELDJFQUEyRTtBQUMzRSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUM7QUFDM0IsTUFBTSxpQkFBaUIsR0FBRyxzQkFBYSxDQUFDLFdBQVcsQ0FBQztBQUVwRCxvRkFBb0Y7QUFDcEYsb0ZBQW9GO0FBQ3BGLG1FQUFtRTtBQUNuRSxxRkFBcUY7QUFDckYsaUVBQWlFO0FBQ2pFLGdGQUFnRjtBQUNoRiw2Q0FBNkM7QUFDN0MsTUFBTSx5QkFBeUIsR0FBRyxTQUFTLENBQUM7QUFFNUMscUVBQXFFO0FBQ3JFLHdFQUF3RTtBQUN4RSwwRUFBMEU7QUFDMUUseUVBQXlFO0FBQ3pFLHlFQUF5RTtBQUN6RSwyRUFBMkU7QUFDM0UsMkNBQTJDO0FBQzNDLE1BQU0sNEJBQTRCLEdBQUcsU0FBUyxDQUFDO0FBRS9DLDBFQUEwRTtBQUMxRSw0RUFBNEU7QUFDNUUsMkVBQTJFO0FBQzNFLHlDQUF5QztBQUN6QywwRUFBMEU7QUFDMUUsNEVBQTRFO0FBQzVFLG1EQUFtRDtBQUNuRCxNQUFNLG1CQUFtQixHQUFHLFNBQVMsQ0FBQztBQXFCdEM7Ozs7R0FJRztBQUNILE1BQWEsc0JBQXVCLFNBQVEsK0JBQXNCOztJQUVoRSxZQUFZLE9BQXNDO1FBQ2hELE1BQU0sbUJBQW1CLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSwwQ0FBMEMsQ0FBQztRQUN0SCxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxXQUFXLENB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L0MsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsd0NBQXdDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQy9KLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IENvbXBvbmVudCwgamF2YXNjcmlwdCwgUmVsZWFzYWJsZUNvbW1pdHMsIFRleHRGaWxlLCBZYW1sRmlsZSB9IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBBd3NDZGtDb25zdHJ1Y3RMaWJyYXJ5LCBBd3NDZGtDb25zdHJ1Y3RMaWJyYXJ5T3B0aW9ucywgTGFtYmRhUnVudGltZSB9IGZyb20gJ3Byb2plbi9saWIvYXdzY2RrJztcbmltcG9ydCB7IERlcGVuZGFib3RTY2hlZHVsZUludGVydmFsIH0gZnJvbSAncHJvamVuL2xpYi9naXRodWInO1xuaW1wb3J0IHsgSm9iU3RlcCB9IGZyb20gJ3Byb2plbi9saWIvZ2l0aHViL3dvcmtmbG93cy1tb2RlbCc7XG5cbi8vIFNldCB0aGUgbWluaW11bSBub2RlIHZlcnNpb24gZm9yIEFXUyBDREsgYW5kIHRoZSBHaXRIdWIgYWN0aW9ucyB3b3JrZmxvd1xuY29uc3Qgbm9kZVZlcnNpb24gPSAnMjQueCc7XG5jb25zdCBsYW1iZGFOb2RlVmVyc2lvbiA9IExhbWJkYVJ1bnRpbWUuTk9ERUpTXzI0X1g7XG5cbi8vIFRoZSBsYXN0IEBhd3MtY2RrL2ludGVnLXJ1bm5lciB2ZXJzaW9uIHZlcmlmaWVkIGFnYWluc3QgbnBtIChjaGVja2VkIDIwMjYtMDctMjEpLlxuLy8gaW50ZWctcnVubmVyIHVzZXMgcGxhaW4gdmVyc2lvbnMgKG5vIC1hbHBoYS4wIHN1ZmZpeCkgYW5kIGhhcyBoaXN0b3JpY2FsbHkgbGFnZ2VkXG4vLyBvciBzdG9wcGVkIHRyYWNraW5nIGF3cy1jZGstbGliJ3MgdmVyc2lvbiBmb3Igc3RyZXRjaGVzIG9mIHRpbWUuXG4vLyBAYXdzLWNkay9pbnRlZy10ZXN0cy1hbHBoYSBhbmQgYXdzbGludCBjb250aW51ZSB0byBwdWJsaXNoIGFuZCB0cmFjayBDREsgdmVyc2lvbnMuXG4vLyBTSE9SVENVVDogaGFyZGNvZGVkIGNhcCByZXF1aXJlcyBtYW51YWwgcmUtdmVyaWZpY2F0aW9uIC0tIHJ1blxuLy8gYG5wbSB2aWV3IEBhd3MtY2RrL2ludGVnLXJ1bm5lciB2ZXJzaW9ucyAtLWpzb25gIGFuZCBidW1wIHRoaXMgaWYgYXdzLWNkay1saWJcbi8vIGhhcyByZWxlYXNlZCBuZXdlciB2ZXJzaW9ucyB0aGFuIHRoaXMgb25lLlxuY29uc3QgTEFTVF9JTlRFR19SVU5ORVJfVkVSU0lPTiA9ICcyLjIwMy4wJztcblxuLy8gQXdzQ2RrQ29uc3RydWN0TGlicmFyeU9wdGlvbnMuY2RrVmVyc2lvbidzIG93biB1cHN0cmVhbSBgQGRlZmF1bHRgXG4vLyAobm9kZV9tb2R1bGVzL3Byb2plbi9saWIvYXdzY2RrL2F3c2Nkay1kZXBzLmQudHMpIC0gd2hhdCBgcHJvamVuIG5ld2Bcbi8vIGZpbGxzIGluIHdoZW4gYC0tY2RrVmVyc2lvbmAgaXMgb21pdHRlZC4ganNpaSBmb3JiaWRzIGEgZGVyaXZlZCBvcHRpb25zXG4vLyBpbnRlcmZhY2UgZnJvbSByZS1kZWNsYXJpbmcgYW4gaW5oZXJpdGVkIG1lbWJlciAoSlNJSTUwMTU6IFwicmVzdWx0cyBpblxuLy8gaW52YWxpZCBDI1wiKSwgc28gd2UgY2FuJ3Qgb3ZlcnJpZGUgdGhlIGBAZGVmYXVsdGAgZG9jIHRoZSBDTEkgcmVmbGVjdHNcbi8vIG9uIHRvIGNoYW5nZSB0aGF0LiBEZXRlY3RpbmcgdGhpcyBleGFjdCB2YWx1ZSBiZWxvdyBhbmQgc3Vic3RpdHV0aW5nIG91clxuLy8gb3duIGRlZmF1bHQgaXMgdGhlIG9ubHkgcmVtYWluaW5nIGxldmVyLlxuY29uc3QgVVBTVFJFQU1fREVGQVVMVF9DREtfVkVSU0lPTiA9ICcyLjE4OS4xJztcblxuLy8gT3VyIGRlZmF1bHQgYGNka1ZlcnNpb25gIHdoZW4gdGhlIGNhbGxlciAob3IgYHByb2plbiBuZXdgKSBkb2Vzbid0IHBhc3Ncbi8vIG9uZS4gTXVzdCBzdGF5ID49IDIuMjU3LjA6IGNkay1uYWcgdjMgKGZvcmNlZCBiZWxvdyB2aWEgYWRkRGVwcykgcmVxdWlyZXNcbi8vIGl0IGFzIGEgcGVlciwgYW5kIHRoZSB1cHN0cmVhbSBkZWZhdWx0IGFib3ZlIGZhaWxzIGBucG0gaW5zdGFsbGAgd2l0aCBhblxuLy8gRVJFU09MVkUgY29uZmxpY3Qgb24gYSBmcmVzaCBzY2FmZm9sZC5cbi8vIFNIT1JUQ1VUOiBib3RoIGhhcmRjb2RlZCB2ZXJzaW9ucyByZXF1aXJlIG1hbnVhbCByZS12ZXJpZmljYXRpb24gLS0gcnVuXG4vLyBgbnBtIHZpZXcgYXdzLWNkay1saWIgdmVyc2lvbmAgYW5kIHJlLWNoZWNrIGF3c2Nkay1kZXBzLmQudHMncyBgQGRlZmF1bHRgXG4vLyBwZXJpb2RpY2FsbHkgKGl0IG1heSBkcmlmdCBvbiBhIHByb2plbiB1cGdyYWRlKS5cbmNvbnN0IERFRkFVTFRfQ0RLX1ZFUlNJT04gPSAnMi4yNjEuMCc7XG5cbi8qKlxuICogVGhlIG9wdGlvbnMgZm9yIHRoZSBjb25zdHJ1Y3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNdmNDZGtDb25zdHJ1Y3RMaWJyYXJ5T3B0aW9ucyBleHRlbmRzIEF3c0Nka0NvbnN0cnVjdExpYnJhcnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIEJhc2UgZGlyZWN0b3J5IGZvciB0aGUgYXNzZXRzXG4gICAqXG4gICAqIEBkZWZhdWx0ICR7cHJvY2Vzcy5jd2QoKX0vbm9kZV9tb2R1bGVzL212Yy1wcm9qZW4vYXNzZXRzXG4gICAqL1xuICByZWFkb25seSBiYXNlQXNzZXRzRGlyZWN0b3J5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaW9ucyB0byBydW4gdGhlIGludGVnIHRlc3RzIGluXG4gICAqXG4gICAqIEBkZWZhdWx0IGV1LXdlc3QtMSBhbmQgZXUtd2VzdC0yXG4gICAqL1xuICByZWFkb25seSBpbnRlZ1Rlc3RSZWdpb25zPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogVHlwZVNjcmlwdCBsaWJyYXJ5XG4gKlxuICogQHBqaWQgbXZjLWF3c2Nkay1jb25zdHJ1Y3RcbiAqL1xuZXhwb3J0IGNsYXNzIE12Y0Nka0NvbnN0cnVjdExpYnJhcnkgZXh0ZW5kcyBBd3NDZGtDb25zdHJ1Y3RMaWJyYXJ5IHtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBNdmNDZGtDb25zdHJ1Y3RMaWJyYXJ5T3B0aW9ucykge1xuICAgIGNvbnN0IGJhc2VBc3NldHNEaXJlY3RvcnkgPSBvcHRpb25zLmJhc2VBc3NldHNEaXJlY3RvcnkgPz8gYCR7cHJvY2Vzcy5jd2QoKX0vbm9kZV9tb2R1bGVzL0BtYXZvZ2VsL212Yy1wcm9qZW4vYXNzZXRzYDtcbiAgICBjb25zdCBpbnRlZ1Rlc3RSZWdpb25zID0gb3B0aW9ucy5pbnRlZ1Rlc3RSZWdpb25zID8/IFsnZXUtd2VzdC0xJywgJ2V1LXdlc3QtMiddO1xuICAgIC8vIGBvcHRpb25zLmNka1ZlcnNpb25gIGlzIHR5cGVkIGFzIHJlcXVpcmVkLCBidXQgYHByb2plbiBuZXdgIGFsd2F5c1xuICAgIC8vIHN1cHBsaWVzIGEgdmFsdWUgdmlhIGpzaWkgcmVmbGVjdGlvbiAtIGVpdGhlciBhIHJlYWwgdXNlciBvdmVycmlkZSxcbiAgICAvLyBvciAoaWYgLS1jZGtWZXJzaW9uIHdhcyBvbWl0dGVkKSB0aGUgdXBzdHJlYW0gYEBkZWZhdWx0YCBsaXRlcmFsXG4gICAgLy8gaXRzZWxmLiBTdWJzdGl0dXRlIG91cnMgb25seSBpbiB0aGUgbGF0dGVyIGNhc2UsIHZlcmlmaWVkIGJlbG93LlxuICAgIGNvbnN0IGNka1ZlcnNpb24gPSAoIW9wdGlvbnMuY2RrVmVyc2lvbiB8fCBvcHRpb25zLmNka1ZlcnNpb24gPT09IFVQU1RSRUFNX0RFRkFVTFRfQ0RLX1ZFUlNJT04pXG4gICAgICA/IERFRkFVTFRfQ0RLX1ZFUlNJT05cbiAgICAgIDogb3B0aW9ucy5jZGtWZXJzaW9uO1xuXG4gICAgLy8gQXdzQ2RrQ29uc3RydWN0TGlicmFyeSdzIGBzdXBlcigpYCBjYWxsIGJlbG93IHdpcmVzIHVwIGFuIEF1dG9EaXNjb3ZlclxuICAgIC8vIGNvbXBvbmVudCB3aG9zZSBjb25zdHJ1Y3RvciBzeW5jaHJvbm91c2x5IGdsb2JzIGBzcmNkaXJgIGZvclxuICAgIC8vIGAqLmxhbWJkYS50c2AgZW50cnlwb2ludHMgLSBpdCBuZXZlciByZS1zY2FucyBsYXRlci4gU2FtcGxlQ29kZSAoYWRkZWRcbiAgICAvLyBhdCB0aGUgZW5kIG9mIHRoaXMgY29uc3RydWN0b3IpIHdyaXRlcyB0aGUgc2FtcGxlIGNyZC1leGFtcGxlLmxhbWJkYS50c1xuICAgIC8vIGR1cmluZyB0aGUgcHJvamVjdCdzIHN5bnRoZXNpemUoKSBwaGFzZSwgd2hpY2ggcnVucyBhZnRlciBldmVyeVxuICAgIC8vIGNvbXBvbmVudCdzIGNvbnN0cnVjdG9yLCBpbmNsdWRpbmcgQXV0b0Rpc2NvdmVyJ3MgLSBzbyB0aGUgZmlsZSBuZXZlclxuICAgIC8vIGV4aXN0ZWQgZm9yIEF1dG9EaXNjb3ZlciB0byBmaW5kLCBubyBMYW1iZGFGdW5jdGlvbi9CdW5kbGVyIGV2ZXIgZ290XG4gICAgLy8gY3JlYXRlZCBmb3IgaXQsIGFuZCB0aGUgZ2VuZXJhdGVkIGNyZC1leGFtcGxlLnRzIHdhcyBsZWZ0IGltcG9ydGluZyBhXG4gICAgLy8gJy4vY3JkLWV4YW1wbGUtZnVuY3Rpb24nIGNvbnN0cnVjdCBmaWxlIHRoYXQgbm8gb25lIHdyb3RlLCBicmVha2luZ1xuICAgIC8vIGVzbGludCBvbiBldmVyeSBzY2FmZm9sZC4gV3JpdGUganVzdCB0aGlzIG9uZSBmaWxlIGVhcmx5IGVub3VnaCBmb3JcbiAgICAvLyBBdXRvRGlzY292ZXIgdG8gc2VlIGl0OyBTYW1wbGVDb2RlIHN0aWxsIG93bnMgZXZlcnl0aGluZyBlbHNlLlxuICAgIC8vIFNraXAgdW5kZXIgSmVzdCAoTk9ERV9FTlY9dGVzdCwgbWF0Y2hpbmcgcHJvamVuJ3Mgb3duIElTX1RFU1RfUlVOXG4gICAgLy8gY2hlY2spOiB3aGVuIG9wdGlvbnMub3V0ZGlyIGlzIHVuc2V0ICh0cnVlIGZvciBldmVyeSB0ZXN0IGluIHRoaXNcbiAgICAvLyByZXBvKSwgcHJvamVuJ3MgYmFzZSBQcm9qZWN0IGNsYXNzIC0gY29uc3RydWN0ZWQgdmlhIHN1cGVyKCkgYmVsb3cgLVxuICAgIC8vIHJlZGlyZWN0cyB0aGUgKnJlYWwqIG91dGRpciB0byBhIGZyZXNoIHRlbXAgZGlyZWN0b3J5IGluc3RlYWQgb2YgY3dkLlxuICAgIC8vIFRoaXMgZWFybHkgd3JpdGUgcnVucyBiZWZvcmUgdGhhdCByZWRpcmVjdCBleGlzdHMsIHNvIHdpdGhvdXQgdGhpc1xuICAgIC8vIGd1YXJkIGl0IHdvdWxkIHdyaXRlIHN0cmFpZ2h0IGludG8gdGhpcyByZXBvJ3Mgb3duIHdvcmtpbmcgdHJlZVxuICAgIC8vIGluc3RlYWQgb2YgdGhlIHRlc3QncyB0ZW1wIGRpci5cbiAgICBpZiAoKG9wdGlvbnMuc2FtcGxlQ29kZSA/PyB0cnVlKSAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Rlc3QnKSB7XG4gICAgICBjb25zdCBvdXRkaXIgPSBwYXRoLnJlc29sdmUob3B0aW9ucy5vdXRkaXIgPz8gJy4nKTtcbiAgICAgIGNvbnN0IGxhbWJkYUVudHJ5cG9pbnQgPSBwYXRoLmpvaW4ob3V0ZGlyLCAnc3JjJywgJ2NyZC1leGFtcGxlJywgJ2NyZC1leGFtcGxlLmxhbWJkYS50cycpO1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGxhbWJkYUVudHJ5cG9pbnQpKSB7XG4gICAgICAgIGZzLm1rZGlyU3luYyhwYXRoLmRpcm5hbWUobGFtYmRhRW50cnlwb2ludCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGxhbWJkYUVudHJ5cG9pbnQsIGZzLnJlYWRGaWxlU3luYyhgJHtiYXNlQXNzZXRzRGlyZWN0b3J5fS9jZGstY29uc3RydWN0L3NyY19jcmQtZXhhbXBsZS5sYW1iZGEudHNgKS50b1N0cmluZygpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzdXBlcih7XG4gICAgICBhdXRob3JPcmdhbml6YXRpb246IHRydWUsXG4gICAgICBjb3B5cmlnaHRPd25lcjogJ01WIENvbnN1bHRpbmcgR21iSCcsXG4gICAgICBsaWNlbnNlOiAnQXBhY2hlLTIuMCcsXG4gICAgICBqc2lpVmVyc2lvbjogJ342LjAuMCcsXG4gICAgICB0eXBlc2NyaXB0VmVyc2lvbjogJ142LjAuMicsXG4gICAgICBtaW5Ob2RlVmVyc2lvbjogbm9kZVZlcnNpb24sXG4gICAgICB3b3JrZmxvd05vZGVWZXJzaW9uOiBub2RlVmVyc2lvbixcbiAgICAgIHN0YWJpbGl0eTogJ2V4cGVyaW1lbnRhbCcsXG4gICAgICByZWxlYXNlVG9OcG06IHRydWUsXG4gICAgICBwYWNrYWdlTWFuYWdlcjogamF2YXNjcmlwdC5Ob2RlUGFja2FnZU1hbmFnZXIuTlBNLFxuICAgICAgbnBtQWNjZXNzOiBqYXZhc2NyaXB0Lk5wbUFjY2Vzcy5QVUJMSUMsXG4gICAgICBsYW1iZGFPcHRpb25zOiB7XG4gICAgICAgIHJ1bnRpbWU6IGxhbWJkYU5vZGVWZXJzaW9uLFxuICAgICAgICBhd3NTZGtDb25uZWN0aW9uUmV1c2U6IGZhbHNlLCAvLyBkb2Vzbid0IGV4aXN0IGluIEFXUyBTREsgSlMgdjNcbiAgICAgIH0sXG4gICAgICBhdXRvQXBwcm92ZU9wdGlvbnM6IHtcbiAgICAgICAgLy8gJ212Yy1ib3QnICh0aGUgUFJPSkVOX0dJVEhVQl9UT0tFTiBpZGVudGl0eSkgaXMgZGVsaWJlcmF0ZWx5XG4gICAgICAgIC8vIGV4Y2x1ZGVkOiBHaXRIdWIgcmVqZWN0cyBhIFBSIHJldmlldyBmcm9tIHRoZSBzYW1lIGFjY291bnQgdGhhdFxuICAgICAgICAvLyBhdXRob3JlZCB0aGUgUFIgKFwiQ2FuIG5vdCBhcHByb3ZlIHlvdXIgb3duIHB1bGwgcmVxdWVzdFwiKSwgYW5kXG4gICAgICAgIC8vIHRoaXMgdG9rZW4gY2FuIGFsc28gYXV0aG9yIFBScyBhZ2FpbnN0IGdlbmVyYXRlZCBwcm9qZWN0cyAoZS5nLlxuICAgICAgICAvLyBzY2FmZm9sZGVyLWRyaXZlbiBhdXRvbWF0aW9uKS4gVGhvc2UgUFJzIGFyZSBhdXRvLWFwcHJvdmVkIHZpYVxuICAgICAgICAvLyBNZXJnaWZ5IGluc3RlYWQsIGJlbG93LCB3aGljaCBwb3N0cyB0aGUgcmV2aWV3IGFzIHRoZSBNZXJnaWZ5XG4gICAgICAgIC8vIGFwcCAtIGEgZGlmZmVyZW50IGFjdG9yLiBTZWUgbWF2b2dlbC9tdmMtcHJvamVuIzc0LlxuICAgICAgICBhbGxvd2VkVXNlcm5hbWVzOiBbXG4gICAgICAgICAgJ2RlcGVuZGFib3QnLFxuICAgICAgICAgICdkZXBlbmRhYm90W2JvdF0nLFxuICAgICAgICAgICdnaXRodWItYm90JyxcbiAgICAgICAgICAnZ2l0aHViLWFjdGlvbnNbYm90XScsXG4gICAgICAgIF0sXG4gICAgICAgIC8vIFRoZSBuYW1lIG9mIHRoZSBzZWNyZXQgdGhhdCBoYXMgdGhlIEdpdEh1YiBQQVQgZm9yIGF1dG8tYXBwcm92aW5nIFBScyB3aXRoIHBlcm1pc3Npb25zIHJlcG8sIHdvcmtmbG93LCB3cml0ZTpwYWNrYWdlc1xuICAgICAgICAvLyBHZW5lcmF0ZSBhIG5ldyBQQVQgKGh0dHBzOi8vZ2l0aHViLmNvbS9zZXR0aW5ncy90b2tlbnMvbmV3KSBhbmQgYWRkIGl0IHRvIHlvdXIgcmVwbydzIHNlY3JldHNcbiAgICAgICAgLy8gTk9URTogY29tZXMgZnJvbSBNVi1Db25zdWx0aW5nIE9yZ1xuICAgICAgICBzZWNyZXQ6ICdQUk9KRU5fR0lUSFVCX1RPS0VOJyxcbiAgICAgIH0sXG4gICAgICBkZXBlbmRhYm90OiB0cnVlLFxuICAgICAgZGVwZW5kYWJvdE9wdGlvbnM6IHtcbiAgICAgICAgc2NoZWR1bGVJbnRlcnZhbDogRGVwZW5kYWJvdFNjaGVkdWxlSW50ZXJ2YWwuV0VFS0xZLFxuICAgICAgICBsYWJlbHM6IFsnZGVwZW5kZW5jaWVzJywgJ2F1dG8tYXBwcm92ZSddLFxuICAgICAgICBncm91cHM6IHtcbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBwYXR0ZXJuczogWycqJ10sXG4gICAgICAgICAgICBleGNsdWRlUGF0dGVybnM6IFsnYXdzLWNkayonLCAncHJvamVuJ10sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgaWdub3JlOiBbeyBkZXBlbmRlbmN5TmFtZTogJ2F3cy1jZGstbGliJyB9LCB7IGRlcGVuZGVuY3lOYW1lOiAnYXdzLWNkaycgfV0sXG4gICAgICB9LFxuICAgICAgLy8gLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9qZW4vcHJvamVuL2Rpc2N1c3Npb25zLzQwNDAjZGlzY3Vzc2lvbmNvbW1lbnQtMTE5MDU2MjhcbiAgICAgIHJlbGVhc2FibGVDb21taXRzOiBSZWxlYXNhYmxlQ29tbWl0cy5vZlR5cGUoW1xuICAgICAgICAnZmVhdCcsXG4gICAgICAgICdmaXgnLFxuICAgICAgICAnY2hvcmUnLFxuICAgICAgICAncmVmYWN0b3InLFxuICAgICAgICAncGVyZicsXG4gICAgICBdKSxcbiAgICAgIGdpdGh1Yk9wdGlvbnM6IHtcbiAgICAgICAgcHVsbFJlcXVlc3RMaW50T3B0aW9uczoge1xuICAgICAgICAgIHNlbWFudGljVGl0bGVPcHRpb25zOiB7XG4gICAgICAgICAgICAvLyBzZWUgY29tbWl0IHR5cGVzIGhlcmU6IGh0dHBzOi8vd3d3LmNvbnZlbnRpb25hbGNvbW1pdHMub3JnL2VuL3YxLjAuMC8jc3VtbWFyeVxuICAgICAgICAgICAgdHlwZXM6IFtcbiAgICAgICAgICAgICAgJ2ZlYXQnLFxuICAgICAgICAgICAgICAnZml4JyxcbiAgICAgICAgICAgICAgJ2Nob3JlJyxcbiAgICAgICAgICAgICAgJ3JlZmFjdG9yJyxcbiAgICAgICAgICAgICAgJ3BlcmYnLFxuICAgICAgICAgICAgICAnZG9jcycsXG4gICAgICAgICAgICAgICdzdHlsZScsXG4gICAgICAgICAgICAgICd0ZXN0JyxcbiAgICAgICAgICAgICAgJ2J1aWxkJyxcbiAgICAgICAgICAgICAgJ2NpJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB2ZXJzaW9ucmNPcHRpb25zOiB7XG4gICAgICAgIHR5cGVzOiBbXG4gICAgICAgICAgeyB0eXBlOiAnZmVhdCcsIHNlY3Rpb246ICdGZWF0dXJlcycgfSxcbiAgICAgICAgICB7IHR5cGU6ICdmaXgnLCBzZWN0aW9uOiAnQnVnIEZpeGVzJyB9LFxuICAgICAgICAgIHsgdHlwZTogJ2Nob3JlJywgc2VjdGlvbjogJ0Nob3JlcycgfSxcbiAgICAgICAgICB7IHR5cGU6ICdkb2NzJywgc2VjdGlvbjogJ0RvY3MnIH0sXG4gICAgICAgICAgeyB0eXBlOiAnc3R5bGUnLCBoaWRkZW46IHRydWUgfSxcbiAgICAgICAgICB7IHR5cGU6ICdyZWZhY3RvcicsIGhpZGRlbjogdHJ1ZSB9LFxuICAgICAgICAgIHsgdHlwZTogJ3BlcmYnLCBzZWN0aW9uOiAnUGVyZm9ybWFuY2UnIH0sXG4gICAgICAgICAgeyB0eXBlOiAndGVzdCcsIGhpZGRlbjogdHJ1ZSB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIGVzbGludE9wdGlvbnM6IHtcbiAgICAgICAgcHJldHRpZXI6IGZhbHNlLFxuICAgICAgICBkaXJzOiBbJ3NyYyddLFxuICAgICAgICBpZ25vcmVQYXR0ZXJuczogWycqKi8qLWZ1bmN0aW9uLnRzJywgJ2V4YW1wbGVzLyddLFxuICAgICAgfSxcbiAgICAgIC8vIGV4cGVyaW1lbnRhbEludGVnUnVubmVyOiB0cnVlLFxuICAgICAgLy8gbWFudWFsIGludGVnIHRlc3Qgc2V0dXBcbiAgICAgIHRzY29uZmlnRGV2OiB7XG4gICAgICAgIGNvbXBpbGVyT3B0aW9uczoge1xuICAgICAgICAgIHR5cGVzOiBbJ25vZGUnLCAnamVzdCddLFxuICAgICAgICB9LFxuICAgICAgICBpbmNsdWRlOiBbJ2ludGVnLXRlc3RzLyoqLyoudHMnXSxcbiAgICAgIH0sXG4gICAgICBwdWxsUmVxdWVzdFRlbXBsYXRlQ29udGVudHM6IFtmcy5yZWFkRmlsZVN5bmMoYCR7YmFzZUFzc2V0c0RpcmVjdG9yeX0vY29tbW9uL2dpdGh1Yl9wdWxsX3JlcXVlc3QubWRgKS50b1N0cmluZygpXSxcbiAgICAgIC8vIE5PVEU6IGlzc3VlIHRlbXBsYXRlcyBhcmUgbm90IHN1cHBvcnRlZCB5ZXQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHJvamVuL3Byb2plbi9wdWxsLzM2NDhcbiAgICAgIC8vIGlzc3VlVGVtcGxhdGVzOiB7fVxuICAgICAgcmVhZG1lOiB7XG4gICAgICAgIGNvbnRlbnRzOiBbXG4gICAgICAgICAgYFxuIVtTb3VyY2VdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vZ2l0aHViL3N0YXJzL01WLUNvbnN1bHRpbmcvJHtvcHRpb25zLm5hbWV9P2xvZ289Z2l0aHViJmxhYmVsPUdpdEh1YiUyMFN0YXJzKVxuWyFbQnVpbGQgU3RhdHVzXShodHRwczovL2dpdGh1Yi5jb20vTVYtQ29uc3VsdGluZy8ke29wdGlvbnMubmFtZX0vYWN0aW9ucy93b3JrZmxvd3MvYnVpbGQueW1sL2JhZGdlLnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS9NVi1Db25zdWx0aW5nLyR7b3B0aW9ucy5uYW1lfS9hY3Rpb25zL3dvcmtmbG93cy9idWlsZC55bWwpXG5bIVtFU0xpbnQgQ29kZSBGb3JtYXR0aW5nXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL2NvZGVfc3R5bGUtZXNsaW50LWJyaWdodGdyZWVuLnN2ZyldKGh0dHBzOi8vZXNsaW50Lm9yZylcblshW0xhdGVzdCByZWxlYXNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2dpdGh1Yi9yZWxlYXNlL01WLUNvbnN1bHRpbmcvJHtvcHRpb25zLm5hbWV9LnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS9NVi1Db25zdWx0aW5nLyR7b3B0aW9ucy5uYW1lfS9yZWxlYXNlcylcbiFbR2l0SHViXShodHRwczovL2ltZy5zaGllbGRzLmlvL2dpdGh1Yi9saWNlbnNlL01WLUNvbnN1bHRpbmcvJHtvcHRpb25zLm5hbWV9KVxuWyFbbnBtXShodHRwczovL2ltZy5zaGllbGRzLmlvL25wbS9kdC9AbWF2b2dlbC8ke29wdGlvbnMubmFtZX0/bGFiZWw9bnBtJmNvbG9yPW9yYW5nZSldKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL0BtYXZvZ2VsLyR7b3B0aW9ucy5uYW1lfSlcblshW3R5cGVzY3JpcHRdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvanNpaS10eXBlc2NyaXB0LWJsdWV2aW9sZXQuc3ZnKV0oaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvQG1hdm9nZWwvJHtvcHRpb25zLm5hbWV9KVxuICAgICAgICAgIGAsXG4gICAgICAgICAgYCMgJHtvcHRpb25zLm5hbWV9YCxcbiAgICAgICAgICAnTXkgYXdlc29tZSBkZXNjcmlwdGlvbi4uLicsXG4gICAgICAgICAgYFxuIyMgVGFibGUgb2YgQ29udGVudHNcblxuLSBbRmVhdHVyZXNdKCNmZWF0dXJlcylcbi0gW1VzYWdlXSgjdXNhZ2UpXG4tIFtTb2x1dGlvbiBEZXNpZ25dKCNzb2x1dGlvbi1kZXNpZ24pXG4tIFtJbnNwaXJhdGlvbl0oI2luc3BpcmF0aW9uKVxuXG4jIyBGZWF0dXJlc1xuXG4tIOKaoSAqKlF1aWNrIFNldHVwKio6IFRCRFxuLSDwn5OPICoqQmVzdCBQcmFjdGljZSBTZXR1cCoqOiBUQkRcbi0g8J+kueKAjeKZgu+4jyAqKlByZS1pbnN0YWxsZWQgcGFja2FnZXMqKjogVEJEXG4tIPCfj5fvuI8gKipFeHRlbnNpYmlsaXR5Kio6IFRCRFxuXG4jIyBVc2FnZVxuVGhlIGZvbGxvd2luZyBzdGVwcyBnZXQgeW91IHN0YXJ0ZWQ6XG5cbjEuIENyZWF0ZSBhIG5ldyBcXGBhd3NjZGstYXBwXFxgIHZpYVxuXFxgXFxgXFxgYmFzaFxubnB4IHByb2plbiBuZXcgYXdzY2RrLWFwcC10cyAtLWNka1ZlcnNpb249Mi4yNjEuMCAtLXBhY2thZ2UtbWFuYWdlcj1ucG1cblxcYFxcYFxcYFxuMy4gQWRkIFxcYEBtYXZvZ2VsLyR7b3B0aW9ucy5uYW1lfVxcYCBhcyBhIGRlcGVuZGVuY3kgdG8geW91ciBwcm9qZWN0IGluIHRoZSBcXGAucHJvamVucmMudHNcXGAgZmlsZVxuNC4gUnVuIFxcYG5weCBwcm9qZW5cXGAgdG8gaW5zdGFsbCBpdFxuNS4gQWRkIHRoZSBmb2xsb3dpbmcgdG8gdGhlIFxcYHNyYy9tYWluLnRzXFxgIGZpbGU6XG5cXGBcXGBcXGB0c1xuaW1wb3J0IHsgQXBwLCBTdGFjaywgU3RhY2tQcm9wcyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGVjMiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgUGxhY2Vob2xkZXIgfSBmcm9tICdAbWF2b2dlbC8ke29wdGlvbnMubmFtZX0nO1xuXG5leHBvcnQgY2xhc3MgTXlTdGFjayBleHRlbmRzIFN0YWNrIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFN0YWNrUHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgbmV3IFBsYWNlaG9sZGVyKHRoaXMsICdwbGFjZWhvbGRlcicsIHtcbiAgICAgIC8vIGFuZCBtb3JlLi4uIPCfkqFcbiAgICB9KTtcbiAgfVxufVxuXG5jb25zdCBlbnYgPSB7XG4gIGFjY291bnQ6ICcxMjM0NTY3ODk5MTInLFxuICByZWdpb246ICdldS1jZW50cmFsLTEnLFxufTtcblxuY29uc3QgYXBwID0gbmV3IEFwcCgpO1xubmV3IE15U3RhY2soYXBwLCAncGxhY2Vob2xkZXInLCB7IGVudiB9KTtcbmFwcC5zeW50aCgpO1xuXFxgXFxgXFxgXG5cbmFuZCBkZXBsb3kgaXRcblxcYFxcYFxcYGJhc2hcbm5weCBwcm9qZW4gYnVpbGRcbm5weCBwcm9qZW4gZGVwbG95XG5cXGBcXGBcXGBcblxud2l0aCB0aGUgb3V0cHV0XG5cXGBcXGBcXGBjb25zb2xlXG5UQkRcblxcYFxcYFxcYFxuXG5TZWUgdGhlIFtleGFtcGxlc10oLi9leGFtcGxlcykgZm9sZGVyIGZvciBtb3JlIGluc3BpcmF0aW9uLlxuXG4jIyBTb2x1dGlvbiBEZXNpZ25cblxuPGRldGFpbHM+XG4gIDxzdW1tYXJ5Pi4uLiBpZiB5b3UncmUgY3VyaW91cyBhYm91dCBjbGljayBoZXJlIGZvciB0aGUgZGV0YWlsczwvc3VtbWFyeT5cblxuIVtwbGFjZWhvbGRlcl0oZG9jcy9pbWcvcGxhY2Vob2xkZXIuZHJhd2lvLW1pbi5wbmcpXG5cbjwvZGV0YWlscz5cblxuIyMgSW5zcGlyYXRpb25cblxuYWRkIHRvb2xzIG9yIGxpbmtzIHdoaWNoIGluc3BpcmVkIHlvdVxuICAgICAgICAgIGAsXG4gICAgICAgICAgZnMucmVhZEZpbGVTeW5jKGAke2Jhc2VBc3NldHNEaXJlY3Rvcnl9L2NvbW1vbi9naXRodWJfcmVhZG1lX2N0YS5tZGApLnRvU3RyaW5nKCksXG4gICAgICAgIF0uam9pbignXFxuJyksXG4gICAgICB9LFxuICAgICAgLy8gTk9URToga2VlcCBhbGwgdGhlIHBhc3NlZCBpbiBvcHRpb25zIHdoaWNoIGNhbiBvdmVycmlkZSB0aGUgZXhpc3Rpbmcgb25lcyFcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAvLyBhcHBsaWVkIGFmdGVyIC4uLm9wdGlvbnMgc28gdGhlIERFRkFVTFRfQ0RLX1ZFUlNJT04gZmFsbGJhY2sgYWJvdmVcbiAgICAgIC8vIGFsd2F5cyB3aW5zIG92ZXIgYW4gdW5kZWZpbmVkIG9wdGlvbnMuY2RrVmVyc2lvblxuICAgICAgY2RrVmVyc2lvbixcbiAgICB9KTtcblxuICAgIC8vIFR5cGVTY3JpcHQgNiBubyBsb25nZXIgYXV0by1kaXNjb3ZlcnMgQHR5cGVzLyogcGFja2FnZXNcbiAgICB0aGlzLnRzY29uZmlnRGV2LmZpbGUuYWRkT3ZlcnJpZGUoJ2NvbXBpbGVyT3B0aW9ucy50eXBlcycsIFsnbm9kZScsICdqZXN0J10pO1xuICAgIHRoaXMudHNjb25maWc/LmZpbGUuYWRkT3ZlcnJpZGUoJ2NvbXBpbGVyT3B0aW9ucy50eXBlcycsIFsnbm9kZSddKTtcblxuICAgIC8vIHByb2plbidzIEF1dG9NZXJnZSBjb21wb25lbnQgaGFyZGNvZGVzIGBkZWxldGVfaGVhZF9icmFuY2g6IHt9YCBpbiB0aGVcbiAgICAvLyBtZXJnaWZ5IHJ1bGUgd2l0aCBubyBvcHRpb24gdG8gZGlzYWJsZSBpdC4gU3RyaXAgaXQgc28gTWVyZ2lmeSBkb2VzIG5vdFxuICAgIC8vIGRlbGV0ZSBoZWFkIGJyYW5jaGVzIG9uIG1lcmdlIChyZW5vdmF0ZS9kZXBlbmRhYm90IG1hbmFnZSB0aGVpciBvd24pLlxuICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vTVYtQ29uc3VsdGluZy9jZGstdnNjb2RlLXNlcnZlci9wdWxsLzExMlxuICAgIHRoaXMudHJ5RmluZE9iamVjdEZpbGUoJy5tZXJnaWZ5LnltbCcpPy5hZGREZWxldGlvbk92ZXJyaWRlKFxuICAgICAgJ3B1bGxfcmVxdWVzdF9ydWxlcy4wLmFjdGlvbnMuZGVsZXRlX2hlYWRfYnJhbmNoJyxcbiAgICApO1xuXG4gICAgLy8gQXV0by1hcHByb3ZlIFBScyBhdXRob3JlZCBieSAnbXZjLWJvdCcgaXRzZWxmIChzZWUgdGhlXG4gICAgLy8gYXV0b0FwcHJvdmVPcHRpb25zIGNvbW1lbnQgYWJvdmUgZm9yIHdoeSB0aGlzIGNhbid0IGdvIHRocm91Z2ggdGhlXG4gICAgLy8gR2l0SHViIEFjdGlvbnMgYXV0by1hcHByb3ZlIHBhdGgpIHZpYSBNZXJnaWZ5IGluc3RlYWQ6IGl0IHBvc3RzIHRoZVxuICAgIC8vIHJldmlldyBhcyB0aGUgTWVyZ2lmeSBhcHAsIGEgZGlmZmVyZW50IGFjdG9yLiBTZWUgbWF2b2dlbC9tdmMtcHJvamVuIzc0LlxuICAgIHRoaXMudHJ5RmluZE9iamVjdEZpbGUoJy5tZXJnaWZ5LnltbCcpPy5hZGRPdmVycmlkZShcbiAgICAgICdwdWxsX3JlcXVlc3RfcnVsZXMuMScsXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdBdXRvLWFwcHJvdmUgc2VsZi1hdXRob3JlZCBtdmMtYm90IFBScycsXG4gICAgICAgIGNvbmRpdGlvbnM6IFtcbiAgICAgICAgICAnYXV0aG9yPW12Yy1ib3QnLFxuICAgICAgICAgICdsYWJlbD1hdXRvLWFwcHJvdmUnLFxuICAgICAgICBdLFxuICAgICAgICBhY3Rpb25zOiB7XG4gICAgICAgICAgcmV2aWV3OiB7XG4gICAgICAgICAgICB0eXBlOiAnQVBQUk9WRScsXG4gICAgICAgICAgICBtZXNzYWdlOiAnQXV0b21hdGljYWxseSBhcHByb3ZlZDogc2VsZi1hdXRob3JlZCBhdXRvbWF0aW9uIFBSLicsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIGdpdGlnbm9yZVxuICAgIGNvbnN0IGZpbGVzUGF0dGVyblRvR2l0aWdub3JlID0gW1xuICAgICAgJ3RtcCcsXG4gICAgICAnLmNvZGVncHQnLFxuICAgIF07XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzUGF0dGVyblRvR2l0aWdub3JlKSB7XG4gICAgICB0aGlzLmdpdGlnbm9yZS5leGNsdWRlKGZpbGUpO1xuICAgIH1cbiAgICB0aGlzLmFkZERlcHMoXG4gICAgICAvLyBjZGstbmFnIHYzIHJlcXVpcmVzIGF3cy1jZGstbGliID49IDIuMjU3LjAgKHNlZSBjZGstbmFnIE1JR1JBVElPTi5tZClcbiAgICAgICdjZGstbmFnQF4zLjAuMScsXG4gICAgKTtcbiAgICAvLyBDYXAgaW50ZWctcnVubmVyIGF0IExBU1RfSU5URUdfUlVOTkVSX1ZFUlNJT04gc2luY2UgaXQgc3RvcHBlZCBwdWJsaXNoaW5nIGFmdGVyIHRoYXQgdmVyc2lvbi5cbiAgICAvLyBpbnRlZy1ydW5uZXIgdXNlcyBwbGFpbiB2ZXJzaW9ucyAobm8gLWFscGhhLjAgc3VmZml4KS5cbiAgICAvLyBpbnRlZy10ZXN0cy1hbHBoYSBhbmQgYXdzbGludCBvbmx5IHB1Ymxpc2ggYXQgbWlub3IgdmVyc2lvbnMgKGUuZy4gMi4xOTcuMC1hbHBoYS4wLCBub3QgMi4xOTcuNC1hbHBoYS4wKS5cbiAgICBjb25zdCByYXdDZGtWZXJzaW9uID0gdGhpcy5jZGtWZXJzaW9uLnJlcGxhY2UoL1tcXF5+XS8sICcnKTtcbiAgICBjb25zdCBpbnRlZ1J1bm5lclZlcnNpb24gPSByYXdDZGtWZXJzaW9uLmxvY2FsZUNvbXBhcmUoTEFTVF9JTlRFR19SVU5ORVJfVkVSU0lPTiwgdW5kZWZpbmVkLCB7IG51bWVyaWM6IHRydWUsIHNlbnNpdGl2aXR5OiAnYmFzZScgfSkgPiAwXG4gICAgICA/IExBU1RfSU5URUdfUlVOTkVSX1ZFUlNJT05cbiAgICAgIDogcmF3Q2RrVmVyc2lvbjtcbiAgICAvLyBBbHBoYSBwYWNrYWdlcyBvbmx5IHB1Ymxpc2ggYXQgLjAgcGF0Y2ggdmVyc2lvbnMg4oCUIG5vcm1hbGl6ZSB0byBtaW5vciB2ZXJzaW9uXG4gICAgY29uc3QgW21ham9yLCBtaW5vcl0gPSByYXdDZGtWZXJzaW9uLnNwbGl0KCcuJyk7XG4gICAgY29uc3QgYWxwaGFWZXJzaW9uID0gYCR7bWFqb3J9LiR7bWlub3J9LjBgO1xuICAgIHRoaXMuYWRkRGV2RGVwcyhcbiAgICAgIGBAYXdzLWNkay9pbnRlZy1ydW5uZXJAJHtpbnRlZ1J1bm5lclZlcnNpb259YCxcbiAgICAgIGBAYXdzLWNkay9pbnRlZy10ZXN0cy1hbHBoYUAke2FscGhhVmVyc2lvbn0tYWxwaGEuMGAsXG4gICAgICAnQGNvbW1pdGxpbnQvY2xpQF4yMC4xLjAnLFxuICAgICAgJ0Bjb21taXRsaW50L2NvbmZpZy1jb252ZW50aW9uYWxAXjIwLjAuMCcsXG4gICAgICBgYXdzbGludEAke2FscGhhVmVyc2lvbn0tYWxwaGEuMGAsXG4gICAgICAnaHVza3lAXjkuMS43JyxcbiAgICApO1xuXG4gICAgdGhpcy5wYWNrYWdlLnNldFNjcmlwdCgncHJlcGFyZScsICdodXNreScpO1xuICAgIG5ldyBUZXh0RmlsZSh0aGlzLCAnLmNvbW1pdGxpbnRyYy5qcycsIHtcbiAgICAgIGxpbmVzOiBbXG4gICAgICAgICdtb2R1bGUuZXhwb3J0cyA9IHsgZXh0ZW5kczogW1xcJ0Bjb21taXRsaW50L2NvbmZpZy1jb252ZW50aW9uYWxcXCddIH07JyxcbiAgICAgIF0sXG4gICAgICBtYXJrZXI6IHRydWUsXG4gICAgfSk7XG5cbiAgICB0aGlzLnBhY2thZ2Uuc2V0U2NyaXB0KCdhd3NsaW50JywgJ2F3c2xpbnQnKTtcbiAgICAvLyAuZ2l0aHViL3dvcmtmbG93cy9idWlsZC55bWxcbiAgICBjb25zdCBidWlsZFdvcmtmbG93ID0gdGhpcy5naXRodWI/LnRyeUZpbmRXb3JrZmxvdygnYnVpbGQnKTtcbiAgICBpZiAoIWJ1aWxkV29ya2Zsb3cpIHJldHVybjtcbiAgICBjb25zdCBidWlsZEpvYiA9IGJ1aWxkV29ya2Zsb3cuZ2V0Sm9iKCdidWlsZCcpO1xuICAgIGlmICghYnVpbGRKb2IgfHwgISgnc3RlcHMnIGluIGJ1aWxkSm9iKSkgcmV0dXJuO1xuICAgIC8vIFRPRE86IGZpZ3VyZSBvdXQgd2h5IHdyb25nIHR5cGVzXG4gICAgY29uc3QgZ2V0QnVpbGRTdGVwcyA9IGJ1aWxkSm9iLnN0ZXBzIGFzIHVua25vd24gYXMgKCkgPT4gSm9iU3RlcFtdO1xuICAgIGNvbnN0IGJ1aWxkSm9iU3RlcHMgPSBnZXRCdWlsZFN0ZXBzKCk7XG4gICAgYnVpbGRXb3JrZmxvdy51cGRhdGVKb2IoJ2J1aWxkJywge1xuICAgICAgLi4uYnVpbGRKb2IsXG4gICAgICBzdGVwczogW1xuICAgICAgICAuLi5idWlsZEpvYlN0ZXBzLnNsaWNlKDAsIDQpLFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ1J1biBhd3NsaW50JyxcbiAgICAgICAgICBydW46ICducG0gcnVuIGF3c2xpbnQnLFxuICAgICAgICB9LFxuICAgICAgICAuLi5idWlsZEpvYlN0ZXBzLnNsaWNlKDQpLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIHRoaXMucGFja2FnZS5zZXRTY3JpcHQoXG4gICAgICAnaW50ZWctdGVzdCcsXG4gICAgICBgaW50ZWctcnVubmVyIC0tZGlyZWN0b3J5IC4vaW50ZWctdGVzdHMgJHtpbnRlZ1Rlc3RSZWdpb25zPy5tYXAocmVnaW9uID0+IGAtLXBhcmFsbGVsLXJlZ2lvbnMgJHtyZWdpb259YCkuam9pbignICcpfSAtLXVwZGF0ZS1vbi1mYWlsZWRgLFxuICAgICk7XG5cbiAgICBuZXcgVGV4dEZpbGUodGhpcywgJy5naXRodWIvSVNTVUVfVEVNUExBVEUvYnVnX3JlcG9ydC5tZCcsIHtcbiAgICAgIGxpbmVzOiBbZnMucmVhZEZpbGVTeW5jKGAke2Jhc2VBc3NldHNEaXJlY3Rvcnl9L2NvbW1vbi9naXRodWJfYnVnX3JlcG9ydC5tZGApLnRvU3RyaW5nKCldLFxuICAgIH0pO1xuXG4gICAgbmV3IFRleHRGaWxlKHRoaXMsICcuZ2l0aHViL0lTU1VFX1RFTVBMQVRFL2ZlYXR1cmVfcmVxdWVzdC5tZCcsIHtcbiAgICAgIGxpbmVzOiBbZnMucmVhZEZpbGVTeW5jKGAke2Jhc2VBc3NldHNEaXJlY3Rvcnl9L2NvbW1vbi9naXRodWJfZmVhdHVyZV9yZXF1ZXN0Lm1kYCkudG9TdHJpbmcoKV0sXG4gICAgfSk7XG5cbiAgICBuZXcgWWFtbEZpbGUodGhpcywgJy5naXRodWIvRlVORElORy55YW1sJywge1xuICAgICAgb2JqOiB7XG4gICAgICAgIGdpdGh1YjogJ21hdm9nZWwnLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIG5ldyBUZXh0RmlsZSh0aGlzLCAnQ09OVFJJQlVUSU5HLm1kJywge1xuICAgICAgbGluZXM6IFtmcy5yZWFkRmlsZVN5bmMoYCR7YmFzZUFzc2V0c0RpcmVjdG9yeX0vY29tbW9uL2NvbnRyaWJ1dGluZy5tZGApLnRvU3RyaW5nKCldLFxuICAgIH0pO1xuXG4gICAgbmV3IFRleHRGaWxlKHRoaXMsICcucHJldHRpZXJyYycsIHtcbiAgICAgIGxpbmVzOiBbZnMucmVhZEZpbGVTeW5jKGAke2Jhc2VBc3NldHNEaXJlY3Rvcnl9L2NvbW1vbi9wcmV0dGllcnJjYCkudG9TdHJpbmcoKV0sXG4gICAgfSk7XG5cbiAgICAvLyB3cml0ZSBzYW1wbGUgY29kZSB0byBtYWluLnRzICYgdG8gbWFpbi50ZXN0LnRzXG4gICAgaWYgKG9wdGlvbnMuc2FtcGxlQ29kZSA/PyB0cnVlKSB7XG4gICAgICBuZXcgU2FtcGxlQ29kZSh0aGlzLCB7XG4gICAgICAgIGJhc2VBc3NldHNEaXJlY3RvcnksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuaW50ZXJmYWNlIFNhbXBsZUNvZGVPcHRpb25zIHtcbiAgcmVhZG9ubHkgYmFzZUFzc2V0c0RpcmVjdG9yeT86IHN0cmluZztcbn1cblxuY2xhc3MgU2FtcGxlQ29kZSBleHRlbmRzIENvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGlicmFyeTogQXdzQ2RrQ29uc3RydWN0TGlicmFyeTtcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBTYW1wbGVDb2RlT3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBsaWJyYXJ5OiBBd3NDZGtDb25zdHJ1Y3RMaWJyYXJ5LFxuICAgIG9wdGlvbnM6IFNhbXBsZUNvZGVPcHRpb25zLFxuICApIHtcbiAgICBzdXBlcihsaWJyYXJ5KTtcbiAgICB0aGlzLmxpYnJhcnkgPSBsaWJyYXJ5O1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gIH1cblxuICBwdWJsaWMgc3ludGhlc2l6ZSgpIHtcbiAgICBjb25zdCBvdXRkaXIgPSB0aGlzLnByb2plY3Qub3V0ZGlyO1xuICAgIGNvbnN0IHNyY2RpciA9IHBhdGguam9pbihvdXRkaXIsIHRoaXMubGlicmFyeS5zcmNkaXIpO1xuICAgIGlmIChcbiAgICAgIGZzLmV4aXN0c1N5bmMoYCR7c3JjZGlyfS9pbmRleC50c2ApICYmXG4gICAgICAhZnMucmVhZEZpbGVTeW5jKGAke3NyY2Rpcn0vaW5kZXgudHNgKS50b1N0cmluZygpLmluY2x1ZGVzKCdleHBvcnQgY2xhc3MgSGVsbG8nKSAvLyBOb3RlOiBmcm9tIHBhcmVudFxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZzLm1rZGlyU3luYyhzcmNkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHNyY2RpciwgJ2luZGV4LnRzJyksIGZzLnJlYWRGaWxlU3luYyhgJHt0aGlzLm9wdGlvbnMuYmFzZUFzc2V0c0RpcmVjdG9yeX0vY2RrLWNvbnN0cnVjdC9zcmNfaW5kZXgudHNgKS50b1N0cmluZygpKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihzcmNkaXIsICdwbGFjZWhvbGRlci50cycpLCBmcy5yZWFkRmlsZVN5bmMoYCR7dGhpcy5vcHRpb25zLmJhc2VBc3NldHNEaXJlY3Rvcnl9L2Nkay1jb25zdHJ1Y3Qvc3JjX3BsYWNlaG9sZGVyLnRzYCkudG9TdHJpbmcoKSk7XG4gICAgLy8gY3JkIHdpdGggbGFtYmRhIGdlbmVyYXRpb25cbiAgICAvLyBOb3RlOiBjcmQtZXhhbXBsZS5sYW1iZGEudHMgaXMgd3JpdHRlbiBlYXJsaWVyLCBiZWZvcmUgYHN1cGVyKClgLCBzb1xuICAgIC8vIEF1dG9EaXNjb3ZlcidzIGNvbnN0cnVjdG9yLXRpbWUgZ2xvYiBjYW4gZmluZCBpdCAtIHNlZSB0aGUgY29tbWVudCBpblxuICAgIC8vIHRoZSBjb25zdHJ1Y3RvciBhYm92ZS5cbiAgICBmcy5ta2RpclN5bmMoYCR7c3JjZGlyfS9jcmQtZXhhbXBsZWAsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKGAke3NyY2Rpcn0vY3JkLWV4YW1wbGVgLCAnY3JkLWV4YW1wbGUudHMnKSwgZnMucmVhZEZpbGVTeW5jKGAke3RoaXMub3B0aW9ucy5iYXNlQXNzZXRzRGlyZWN0b3J5fS9jZGstY29uc3RydWN0L3NyY19jcmQtZXhhbXBsZS50c2ApLnRvU3RyaW5nKCkpO1xuXG5cbiAgICBjb25zdCB0ZXN0ZGlyID0gcGF0aC5qb2luKG91dGRpciwgdGhpcy5saWJyYXJ5LnRlc3RkaXIpO1xuICAgIGlmIChcbiAgICAgIGZzLmV4aXN0c1N5bmModGVzdGRpcikgJiZcbiAgICAgIGZzLnJlYWRkaXJTeW5jKHRlc3RkaXIpLmZpbHRlcigoeCkgPT4geC5lbmRzV2l0aCgnLnRzJykpICYmXG4gICAgICAhZnMuZXhpc3RzU3luYyhgJHt0ZXN0ZGlyfS9oZWxsby50ZXN0LnRzYCkgLy8gTm90ZTogZnJvbSBwYXJlbnRcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gcmVtb3ZlICR7dGVzdGRpcn0vaGVsbG8udGVzdC50cyBmaWxlLiBPbiB0aGUgb3RoZXIgaGFuZCwgd2Ugb3ZlcnJpZGUgaW5kZXgudHNcbiAgICBmcy51bmxpbmtTeW5jKGAke3Rlc3RkaXJ9L2hlbGxvLnRlc3QudHNgKTtcbiAgICBmcy5ta2RpclN5bmModGVzdGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4odGVzdGRpciwgJ2luZGV4LnRlc3QudHMnKSwgZnMucmVhZEZpbGVTeW5jKGAke3RoaXMub3B0aW9ucy5iYXNlQXNzZXRzRGlyZWN0b3J5fS9jZGstY29uc3RydWN0L3Rlc3RfaW5kZXgudGVzdC50c2ApLnRvU3RyaW5nKCkpO1xuICAgIC8vIGxhbWJkYSB0ZXN0cyB3aXRoIGplc3Qgc3R1YnNcbiAgICBmcy5ta2RpclN5bmMoYCR7dGVzdGRpcn0vY3JkLWV4YW1wbGVgLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihgJHt0ZXN0ZGlyfS9jcmQtZXhhbXBsZWAsICdjcmQtZXhhbXBsZS50ZXN0LnRzJyksIGZzLnJlYWRGaWxlU3luYyhgJHt0aGlzLm9wdGlvbnMuYmFzZUFzc2V0c0RpcmVjdG9yeX0vY2RrLWNvbnN0cnVjdC90ZXN0X2NyZC1leGFtcGxlLnRlc3QudHNgKS50b1N0cmluZygpKTtcblxuXG4gICAgY29uc3QgaW50ZWdUZXN0ZGlyID0gcGF0aC5qb2luKG91dGRpciwgJ2ludGVnLXRlc3RzJyk7XG4gICAgaWYgKFxuICAgICAgZnMuZXhpc3RzU3luYyhpbnRlZ1Rlc3RkaXIpICYmXG4gICAgICBmcy5yZWFkZGlyU3luYyhpbnRlZ1Rlc3RkaXIpLmZpbHRlcigoeCkgPT4geC5lbmRzV2l0aCgnLnRzJykpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZzLm1rZGlyU3luYyhpbnRlZ1Rlc3RkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKGludGVnVGVzdGRpciwgJ2ludGVnLnBsYWNlaG9sZGVyLnRzJyksIGZzLnJlYWRGaWxlU3luYyhgJHt0aGlzLm9wdGlvbnMuYmFzZUFzc2V0c0RpcmVjdG9yeX0vY2RrLWNvbnN0cnVjdC9pbnRlZ19pbnRlZy5wbGFjZWhvbGRlci50c2ApLnRvU3RyaW5nKCkpO1xuXG4gICAgY29uc3QgaW50ZWdUZXN0RnVuY3Rpb25zZGlyID0gcGF0aC5qb2luKGludGVnVGVzdGRpciwgJ2Z1bmN0aW9ucycpO1xuICAgIGlmIChcbiAgICAgIGZzLmV4aXN0c1N5bmMoaW50ZWdUZXN0RnVuY3Rpb25zZGlyKSAmJlxuICAgICAgZnMucmVhZGRpclN5bmMoaW50ZWdUZXN0RnVuY3Rpb25zZGlyKS5maWx0ZXIoKHgpID0+IHguZW5kc1dpdGgoJy50cycpKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmcy5ta2RpclN5bmMoaW50ZWdUZXN0RnVuY3Rpb25zZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihpbnRlZ1Rlc3RGdW5jdGlvbnNkaXIsICd0ZXN0LWhhbmRsZXIudHMnKSwgZnMucmVhZEZpbGVTeW5jKGAke3RoaXMub3B0aW9ucy5iYXNlQXNzZXRzRGlyZWN0b3J5fS9jZGstY29uc3RydWN0L2ludGVnX3Rlc3QtaGFuZGxlci50c2ApLnRvU3RyaW5nKCkpO1xuXG4gICAgY29uc3QgZG9jc2RpciA9IHBhdGguam9pbihvdXRkaXIsICdkb2NzJyk7XG4gICAgaWYgKFxuICAgICAgZnMuZXhpc3RzU3luYyhkb2NzZGlyKSAmJlxuICAgICAgZnMucmVhZGRpclN5bmMoZG9jc2RpcikuZmlsdGVyKCh4KSA9PiB4LmVuZHNXaXRoKCcuZHJhd2lvJykpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZzLm1rZGlyU3luYyhkb2NzZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihkb2NzZGlyLCAncGxhY2Vob2xkZXIuZHJhd2lvJyksIGZzLnJlYWRGaWxlU3luYyhgJHt0aGlzLm9wdGlvbnMuYmFzZUFzc2V0c0RpcmVjdG9yeX0vY29tbW9uL2RvY3NfcGxhY2Vob2xkZXIuZHJhd2lvYCkudG9TdHJpbmcoKSk7XG5cbiAgICBjb25zdCBleGFtcGxlc2RpciA9IHBhdGguam9pbihvdXRkaXIsICdleGFtcGxlcycsICdzaW1wbGUnKTtcbiAgICBpZiAoXG4gICAgICBmcy5leGlzdHNTeW5jKGV4YW1wbGVzZGlyKSAmJlxuICAgICAgZnMucmVhZGRpclN5bmMoZXhhbXBsZXNkaXIpLmZpbHRlcigoeCkgPT4geC5lbmRzV2l0aCgnLmRyYXdpbycpKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmcy5ta2RpclN5bmMoZXhhbXBsZXNkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKGV4YW1wbGVzZGlyLCAnbWFpbi50cycpLCBmcy5yZWFkRmlsZVN5bmMoYCR7dGhpcy5vcHRpb25zLmJhc2VBc3NldHNEaXJlY3Rvcnl9L2Nkay1jb25zdHJ1Y3QvZXhhbXBsZXNfc2ltcGxlX21haW4udHNgKS50b1N0cmluZygpKTtcbiAgfVxufSJdfQ==
|
|
@@ -266,6 +266,15 @@ type MvcCdkConstructLibraryOptions struct {
|
|
|
266
266
|
//
|
|
267
267
|
// Experimental.
|
|
268
268
|
CodeArtifactOptions *javascript.CodeArtifactOptions `field:"optional" json:"codeArtifactOptions" yaml:"codeArtifactOptions"`
|
|
269
|
+
// Configuration values available to package scripts at runtime.
|
|
270
|
+
//
|
|
271
|
+
// Values should be JSON-serializable.
|
|
272
|
+
// See: https://docs.npmjs.com/cli/v11/configuring-npm/package-json#config
|
|
273
|
+
//
|
|
274
|
+
// Default: - no package configuration.
|
|
275
|
+
//
|
|
276
|
+
// Experimental.
|
|
277
|
+
Config *map[string]interface{} `field:"optional" json:"config" yaml:"config"`
|
|
269
278
|
// Add a `dedupe` task that deduplicates project dependencies.
|
|
270
279
|
//
|
|
271
280
|
// Deduplication prevents multiple versions of the same package from being
|
package/mavogelmvcprojen/go.mod
CHANGED
|
@@ -3,7 +3,7 @@ module github.com/mavogel/mvc-projen/mavogelmvcprojen
|
|
|
3
3
|
go 1.25
|
|
4
4
|
|
|
5
5
|
require (
|
|
6
|
-
github.com/aws/jsii-runtime-go v1.
|
|
6
|
+
github.com/aws/jsii-runtime-go v1.140.0
|
|
7
7
|
github.com/aws/constructs-go/constructs/v10 v10.5.1
|
|
8
|
-
github.com/projen/projen-go/projen v0.103.
|
|
8
|
+
github.com/projen/projen-go/projen v0.103.20
|
|
9
9
|
)
|
|
@@ -13,7 +13,7 @@ import (
|
|
|
13
13
|
projen "github.com/projen/projen-go/projen/jsii"
|
|
14
14
|
)
|
|
15
15
|
|
|
16
|
-
//go:embed mavogel-mvc-projen-0.0.
|
|
16
|
+
//go:embed mavogel-mvc-projen-0.0.34.tgz
|
|
17
17
|
var tarball []byte
|
|
18
18
|
|
|
19
19
|
// Initialize loads the necessary packages in the @jsii/kernel to support the enclosing module.
|
|
@@ -24,5 +24,5 @@ func Initialize() {
|
|
|
24
24
|
projen.Initialize()
|
|
25
25
|
|
|
26
26
|
// Load this library into the kernel
|
|
27
|
-
_jsii_.Load("@mavogel/mvc-projen", "0.0.
|
|
27
|
+
_jsii_.Load("@mavogel/mvc-projen", "0.0.34", tarball)
|
|
28
28
|
}
|
package/mavogelmvcprojen/version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.0.
|
|
1
|
+
0.0.34
|