@nikovirtala/projen-constructs 0.3.84 → 0.4.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 CHANGED
@@ -13,7 +13,7 @@
13
13
  "dependencies": {
14
14
  "@mrgrain/cdk-esbuild": "^5.8.5",
15
15
  "constructs": "^10.8.1",
16
- "projen": "^0.104.21"
16
+ "projen": "^0.104.23"
17
17
  },
18
18
  "dependencyClosure": {
19
19
  "@aws-cdk/asset-awscli-v1": {
@@ -4196,7 +4196,7 @@
4196
4196
  },
4197
4197
  "name": "@nikovirtala/projen-constructs",
4198
4198
  "readme": {
4199
- "markdown": "# @nikovirtala/projen-constructs\n\nProjen project types with standard configuration for consistent project setup across all repositories.\n\n## Installation\n\n```bash\npnpm add -D @nikovirtala/projen-constructs projen constructs\n```\n\nRequires pnpm 11 and `projen` >= 0.101.27. `@mrgrain/cdk-esbuild` and `constructs` are peer\ndependencies as well.\n\nTo create a project from scratch:\n\n```bash\npnpm dlx projen new --from @nikovirtala/projen-constructs aws_cdk_construct_library\n```\n\n## Features\n\n- **Standard Configuration**: Opinionated defaults for author, release branch, package manager, Node.js, TypeScript, and tooling\n- **Automatic Project Type Discovery**: Generates the `ProjectType` enum from Projen's JSII manifest (19 project types)\n- **Component System**: Reusable components (Vitest, TypeDoc, Mise, Homebrew, Colima, LocalStack, Lambda bundling)\n- **Code Generation**: `ProjectGenerator` creates project classes with standard configuration\n- **ES Modules**: TypeScript and CDK App projects use ES modules (JSII uses CommonJS)\n- **Code Quality**: Biome for formatting and linting\n- **Testing**: Vitest with coverage\n- **Auto-merge**: Enabled with auto-approve\n- **VSCode**: Recommended extensions and settings\n- **mise**: Node version management\n\n## Standard Configuration\n\n- **Author**: Niko Virtala (niko.virtala@hey.com)\n- **Default Release Branch**: main\n- **Package Manager**: pnpm 11.20.0\n- **Node Version**: 24.19.0\n- **TypeScript**: 6.0.3\n- **CDK Version**: 2.263.0 (for CDK projects)\n- **JSII Version**: ~6.0.3 (for JSII projects)\n\nThe AWS CDK, Node.js and TypeScript versions live in `src/versions.json` and are refreshed by the\n`update-versions` task, which the dependency upgrade workflow runs.\n\n### pnpm\n\npnpm reads its settings from `pnpm-workspace.yaml`, not `.npmrc`, since pnpm 11. Generated projects\nget:\n\n| Setting | Value | Reason |\n| ---------------------- | ----------------- | ------------------------------------------------------------------------------------------------------------ |\n| `nodeLinker` | `hoisted` | jsii tooling resolves dependencies from a flat `node_modules` |\n| `allowBuilds` | `esbuild: true` | esbuild links its platform binary in a postinstall script, and pnpm 11 fails an install with ignored builds |\n| `verifyDepsBeforeRun` | `false` | projen resolves the task `PATH` with `$(pnpm -c exec ...)`, which otherwise re-enters `pnpm install` and deadlocks |\n| `minimumReleaseAge` | `0` | the pnpm 11 default of 1440 minutes makes pnpm write `minimumReleaseAgeExclude` entries into this generated file |\n\n### TypeScript configuration\n\nProjen renders three configs, and none of them should be edited directly:\n\n- `tsconfig.json` compiles `src` to `lib`. For JSII projects, jsii validates it against its `strict`\n rule set, so it only carries compiler options jsii accepts.\n- `test/tsconfig.json` extends it and is type-check only. This is the config Vitest type checking and\n the editor use, and the one `tsconfigDev` points at.\n- `projenrc/tsconfig.json` covers `.projenrc.ts`.\n\n## Customization\n\nOverride any option by passing it to the constructor:\n\n```typescript\nconst project = new JsiiProject({\n name: \"my-project\",\n repositoryUrl: \"https://github.com/nikovirtala/my-project.git\",\n minNodeVersion: \"24.0.0\",\n author: \"Custom Author\",\n authorAddress: \"custom@example.com\",\n mise: false,\n vitest: false,\n tsconfig: {\n compilerOptions: {\n noUnusedLocals: false,\n },\n },\n biomeOptions: {\n biomeConfig: {\n formatter: {\n lineWidth: 100,\n },\n },\n },\n});\n```\n\nEvery component is exposed as an enable flag (`mise`, `vitest`, ...) plus an options property\n(`miseOptions`, `vitestOptions`, ...).\n\n## Usage\n\n### Projects\n\n#### AWS CDK Construct Library Project\n\n```typescript\nimport { AwsCdkConstructLibraryProject } from \"@nikovirtala/projen-constructs\";\n\nconst project = new AwsCdkConstructLibraryProject({\n name: \"my-cdk-construct\",\n repositoryUrl: \"https://github.com/nikovirtala/my-cdk-construct.git\",\n});\n\nproject.synth();\n```\n\n#### AWS CDK TypeScript App Project\n\n```typescript\nimport { AwsCdkTypeScriptAppProject } from \"@nikovirtala/projen-constructs\";\n\nconst project = new AwsCdkTypeScriptAppProject({\n name: \"my-cdk-app\",\n repositoryUrl: \"https://github.com/nikovirtala/my-cdk-app.git\",\n});\n\nproject.synth();\n```\n\n#### JSII Project\n\n```typescript\nimport { JsiiProject } from \"@nikovirtala/projen-constructs\";\n\nconst project = new JsiiProject({\n name: \"my-jsii-project\",\n repositoryUrl: \"https://github.com/nikovirtala/my-jsii-project.git\",\n});\n\nproject.synth();\n```\n\n#### TypeScript Project\n\n```typescript\nimport { TypeScriptProject } from \"@nikovirtala/projen-constructs\";\n\nconst project = new TypeScriptProject({\n name: \"my-typescript-project\",\n repositoryUrl: \"https://github.com/nikovirtala/my-typescript-project.git\",\n});\n\nproject.synth();\n```\n\n### Components\n\nThe package includes reusable components for common development tasks:\n\n#### Vitest\n\n[Vitest](https://vitest.dev) testing framework component.\n\n```typescript\nimport { Vitest } from \"@nikovirtala/projen-constructs\";\n\nnew Vitest(project, {\n vitestVersion: \"^4\",\n config: {\n coverageProvider: CoverageProvider.V8,\n coverageReporters: [CoverageReporter.TEXT, CoverageReporter.LCOV],\n },\n});\n```\n\nType checking runs against the project's development tsconfig (`test/tsconfig.json`) unless\n`config.typecheckTsconfig` says otherwise.\n\nFor Vitest settings that `config` doesn't cover, use `extraTestConfig` (merged into `test`) and\n`extraConfig` (top-level options next to `test`):\n\n```typescript\nnew Vitest(project, {\n extraTestConfig: {\n setupFiles: [\"test/setup.ts\"],\n },\n extraConfig: {\n resolve: { alias: { \"@\": \"/src\" } },\n },\n});\n```\n\n`extraTestConfig` is deep-merged over the generated `test` options: objects merge, and other values\n(including arrays) replace the generated value. Both options are rendered as JSON, so their values\ncan't contain functions or regular expressions, which rules out plugins.\n\n#### TypeDoc\n\n[TypeDoc](https://typedoc.org) documentation generation component.\n\n```typescript\nimport { TypeDoc, EntryPointStrategy } from \"@nikovirtala/projen-constructs\";\n\nnew TypeDoc(project, {\n version: \"^0.28\",\n typeDocConfig: {\n entryPointStrategy: EntryPointStrategy.EXPAND,\n out: \"docs/api\",\n exclude: [\"**/*.test.ts\"],\n },\n});\n```\n\n#### Mise\n\n[Mise](https://mise.jdx.dev) dev tools/runtimes management component.\n\n```typescript\nimport { Mise } from \"@nikovirtala/projen-constructs\";\n\nnew Mise(project, {\n nodeVersion: \"24.19.0\",\n});\n```\n\n#### Homebrew\n\n[Homebrew](https://brew.sh) package management component. Writes a `Brewfile` and adds an\n`install:homebrew` task that bootstraps Homebrew and runs `brew bundle`.\n\n```typescript\nimport { Homebrew } from \"@nikovirtala/projen-constructs\";\n\nconst homebrew = new Homebrew(project, {\n packages: [\"jq\", \"yq\"],\n});\n\nhomebrew.addPackage(\"gh\");\n```\n\nA fully qualified formula (`user/repository/formula`) also adds a `tap` entry. Since Homebrew 6,\nformulae from non-official taps only load when trusted, so they're written with `trusted: true`.\nThat trusts only the formula, not the rest of its tap.\n\n#### Colima\n\n[Colima](https://github.com/abiosoft/colima) container runtime component. Alternative for Docker.\n\n```typescript\nimport { Colima } from \"@nikovirtala/projen-constructs\";\n\nnew Colima(project);\n```\n\n#### LocalStack\n\n[LocalStack](https://www.localstack.cloud) AWS emulation component.\n\n```typescript\nimport { LocalStack } from \"@nikovirtala/projen-constructs\";\n\nnew LocalStack(project, {\n services: [\"s3\", \"lambda\", \"dynamodb\"],\n port: 4566,\n debug: true,\n});\n```\n\n#### LambdaFunctionConstructGenerator\n\nGenerates AWS CDK Lambda Function constructs and bundles their code.\n\n```typescript\nimport { LambdaFunctionConstructGenerator } from \"@nikovirtala/projen-constructs\";\n\nnew LambdaFunctionConstructGenerator(project, {\n sourceDir: \"src/handlers\",\n outputDir: \"src/constructs/lambda\",\n filePattern: \"*.lambda.ts\",\n esbuildOptions: {\n minify: true,\n sourcemap: true,\n },\n});\n```\n\n#### Bundler\n\nLow-level bundling utilities for Lambda functions.\n\n```typescript\nimport {\n Bundler,\n LambdaFunctionCodeBundle,\n} from \"@nikovirtala/projen-constructs\";\n\nconst bundler = new Bundler(project, {\n assetsDir: \"assets\",\n esbuildVersion: \"^0.25\",\n});\n\nnew LambdaFunctionCodeBundle(project, {\n entrypoint: \"src/my-function.lambda.ts\",\n extension: \".lambda.ts\",\n});\n```\n\n#### ProjectGenerator\n\nGenerates TypeScript project classes with standard configuration.\n\n```typescript\nimport { ProjectGenerator, ProjectType } from \"@nikovirtala/projen-constructs\";\n\nnew ProjectGenerator(project, {\n name: \"TypeScriptProject\",\n projectType: ProjectType.TYPE_SCRIPT_PROJECT,\n filePath: \"./src/projects/typescript.generated.ts\",\n components: [\n { componentClass: Mise },\n { componentClass: Vitest }, // Auto-detects VitestOptions from JSII manifest\n ],\n});\n```\n\nFeatures:\n\n- Automatically generates the `ProjectType` enum from Projen's JSII manifest\n- Auto-detects component options types from JSII manifests\n- Strips Projen's `@pjnew` annotation from `packageManager`, which `projen new` would otherwise\n render into a generated `.projenrc.ts` as the package manager that ran the command\n- Validates paths to prevent directory traversal attacks\n- Structured error handling with custom error classes\n\n## Migrating from the standalone packages\n\nThe components used to be published as separate packages. Those packages are deprecated and won't\nget new features or fixes. Every class, interface, enum and function they exported is exported from\n`@nikovirtala/projen-constructs` under the same name, except `AwsCdkApp` (see below).\n\n| Deprecated package | Replacement in `@nikovirtala/projen-constructs` |\n| --- | --- |\n| `@nikovirtala/projen-vitest` | `Vitest`, `VitestOptions`, `VitestConfigOptions`, `Environment`, `Pool`, `CoverageProvider`, `CoverageReporter` |\n| `@nikovirtala/projen-typedoc` | `TypeDoc`, `TypeDocOptions`, `TypeDocConfiguration` and its enums |\n| `@nikovirtala/projen-homebrew` | `Homebrew`, `HomebrewOptions` |\n| `@nikovirtala/projen-colima` | `Colima` |\n| `@nikovirtala/projen-localstack` | `LocalStack`, `LocalStackOptions` |\n| `@nikovirtala/projen-bundle-lambda-function-code` | `Bundler`, `LambdaFunctionCodeBundle`, `LambdaFunctionCodeBundler` and their options |\n| `@nikovirtala/projen-lambda-function-construct-generator` | `LambdaFunctionConstructGenerator`, `LambdaFunctionConstructGeneratorOptions` |\n| `@nikovirtala/projen-aws-cdk-app` | `AwsCdkTypeScriptAppProject`, `AwsCdkTypeScriptAppProjectOptions` |\n\n### Steps\n\n1. In `.projenrc.ts`, replace the old package in `devDeps` with `@nikovirtala/projen-constructs`, and\n change the imports:\n\n ```typescript\n // before\n import { Vitest } from \"@nikovirtala/projen-vitest\";\n // after\n import { Vitest } from \"@nikovirtala/projen-constructs\";\n ```\n\n2. Check the peer dependencies. `@nikovirtala/projen-constructs` needs `projen` ^0.104, `constructs`\n ^10 and `@mrgrain/cdk-esbuild` ^5. The standalone packages accepted older projen versions, so you\n may have to upgrade projen in the same change.\n3. Install the new package, run `npx projen` and review the changes to the generated files.\n\n### Changes to expect\n\nThese are the differences in behaviour or generated files between the standalone packages and this\nlibrary.\n\n**Vitest**\n\n- `vitest.config.ts` imports `defineConfig` from\n `@nikovirtala/projen-constructs/lib/vitest-define-config` instead of\n `@nikovirtala/projen-vitest/lib/bundled-define-config`. Projen rewrites the file, so there's\n nothing to change by hand.\n- The config is rendered as JSON, so its keys are quoted. The settings are the same.\n- `config.typecheckTsconfig` defaults to the project's development tsconfig (`test/tsconfig.json`\n in current projen) instead of `tsconfig.dev.json`.\n- JSII and construct library projects exclude `vitest.config.ts` from the published package.\n- New: `extraTestConfig` and `extraConfig` for Vitest settings that `config` doesn't cover.\n\n**Homebrew and Colima**\n\n- Packages from a tap (`owner/tap/formula`) also add a `tap` line to the `Brewfile`, and the\n `Brewfile` is sorted.\n- The `install:homebrew`, `homebrew:bundle` and `colima` tasks run in bash. `homebrew:bundle` also\n finds a freshly installed `brew` that isn't on the `PATH` yet.\n\n**LocalStack**\n\n- `imageTag` is applied: LocalStack starts with `localstack/localstack:<imageTag>`. It used to be\n ignored.\n\n**Bundler / LambdaFunctionCodeBundler**\n\n- `LambdaFunctionCodeBundler.bundleOptions` applies to every discovered entrypoint. Its `entrypoint`\n used to replace them all.\n\n**LambdaFunctionConstructGenerator**\n\n- The bundle task runs `tsx` with the project's development tsconfig instead of `tsconfig.dev.json`.\n\n**TypeDoc**: no changes.\n\n### From `AwsCdkApp` to `AwsCdkTypeScriptAppProject`\n\n```typescript\n// before\nimport { AwsCdkApp } from \"@nikovirtala/projen-aws-cdk-app\";\nconst project = new AwsCdkApp({ name: \"my-app\", cdkVersion: \"2.221.0\" });\n\n// after\nimport { AwsCdkTypeScriptAppProject } from \"@nikovirtala/projen-constructs\";\nconst project = new AwsCdkTypeScriptAppProject({ name: \"my-app\", cdkVersion: \"2.221.0\" });\n```\n\nBoth are ES module apps run with `tsx`, using pnpm, Biome, Vitest and mise. The differences:\n\n- **`nvm` is removed.** Use mise (on by default), which pins the Node.js version in `mise.toml`.\n- **Homebrew is on by default.** The project gets a `Brewfile`, and `npx projen` runs\n `install:homebrew` (installs Homebrew if `brew` is missing) and `homebrew:bundle`. Set\n `homebrew: false` to turn it off.\n- **cdk.json `app`** is `npx tsx src/main.ts` instead of `tsx --tsconfig tsconfig.json src/main.ts`.\n- **Defaults** come from this library: Node.js, TypeScript, CDK and pnpm versions (pnpm 11 instead\n of 10), Dependabot off, auto-merge on, `auto-approve` and `auto-merge` labels on dependency\n upgrade PRs, and auto-approval of PRs by `nikovirtala`. Any option you set explicitly still wins,\n so set `autoApproveOptions` if you aren't `nikovirtala`.\n- **tsconfig**: `noImplicitOverride` and `allowSyntheticDefaultImports` move from `tsconfig.json`\n to the development tsconfig (`test/tsconfig.json`).\n- **Options removed from the interface**: `eslint`, `jest`, `prettier` (and their options),\n `sampleCode` and `tsJestOptions`.\n- `vitestOptions` takes the `VitestOptions` of this library, and now also `homebrewOptions` and\n `miseOptions`.\n\n## Development\n\nThis project is managed by Projen and generates itself: `.projenrc.ts` defines the project using the\n`JsiiProject` type from `src/`. Configuration changes belong in `.projenrc.ts`, never in the\ngenerated files.\n\n```bash\npnpm projen # synthesize project files\npnpm build # synthesize, compile, test and package\npnpm test # biome, vitest, typedoc\npnpm test:watch # vitest in watch mode\npnpm test:update # update snapshots\npnpm biome # format and lint\npnpm docgen # regenerate API.md from the .jsii manifest\npnpm update-versions # refresh src/versions.json\npnpm upgrade # upgrade dependencies\n```\n\n### Build process\n\n```mermaid\nflowchart TD\n projenrc[\".projenrc.ts\"]\n\n subgraph synthesize[\"default (synthesize)\"]\n direction TB\n synth[\"tsx .projenrc.ts\"]\n generator[\"ProjectGenerator\"]\n generated[\"src/project-type.ts<br/>src/projects/*.generated.ts<br/>src/projects/*-options.generated.ts\"]\n projenfiles[\"package.json, tsconfig.json,<br/>pnpm-workspace.yaml, workflows, ...\"]\n brew[\"install:homebrew<br/>brew bundle\"]\n definecfg[\"bundle-vitest-define-config<br/>esbuild → lib/vitest-define-config.js\"]\n\n synth --> generator --> generated\n synth --> projenfiles\n synth --> brew\n synth --> definecfg\n end\n\n subgraph compile[\"compile\"]\n direction TB\n jsii[\"jsii<br/>validates tsconfig.json against the strict rule set\"]\n lib[\"lib/**\"]\n manifest[\".jsii manifest\"]\n\n jsii --> lib\n jsii --> manifest\n end\n\n subgraph test[\"test\"]\n direction TB\n biome[\"biome check --write\"]\n vitest[\"vitest run<br/>+ type checking\"]\n typedoc[\"typedoc → docs/api\"]\n\n biome --> vitest --> typedoc\n end\n\n subgraph package[\"package\"]\n direction TB\n pacmak[\"jsii-pacmak<br/>--pack-command 'pnpm pack'\"]\n dist[\"dist/js/*.tgz\"]\n\n pacmak --> dist\n end\n\n projenrc --> synthesize\n synthesize --> compile\n compile --> test\n test --> package\n\n manifest -. \"component options FQNs<br/>read on the next synthesis\" .-> generator\n docgen[\"docgen<br/>jsii-docgen → API.md\"]\n manifest --> docgen\n\n classDef artifact fill:#eef,stroke:#88a\n class generated,projenfiles,lib,manifest,dist artifact\n```\n\nThe dashed edge is the part worth knowing about: `ProjectGenerator` reads the committed `.jsii`\nmanifest to resolve component options types, so the manifest produced by `compile` feeds the *next*\nsynthesis. This is why `.jsii` is committed rather than ignored. A component options type that is\nmissing from the manifest is reported as a warning and its options property is left out of the\ngenerated interface, which is expected only while a new component is being introduced: compile once,\nthen synthesize again.\n\n`package` runs `package:js` on CI and `package-all` locally; both end up in `jsii-pacmak`.\n`docgen` is not part of `build` and has to be run explicitly after the manifest changes.\n"
4199
+ "markdown": "# @nikovirtala/projen-constructs\n\nProjen project types with standard configuration for consistent project setup across all repositories.\n\n## Installation\n\n```bash\npnpm add -D @nikovirtala/projen-constructs projen constructs\n```\n\nRequires pnpm 12 and `projen` >= 0.101.27. `@mrgrain/cdk-esbuild` and `constructs` are peer\ndependencies as well.\n\nTo create a project from scratch:\n\n```bash\npnpm dlx projen new --from @nikovirtala/projen-constructs aws_cdk_construct_library\n```\n\n## Features\n\n- **Standard Configuration**: Opinionated defaults for author, release branch, package manager, Node.js, TypeScript, and tooling\n- **Automatic Project Type Discovery**: Generates the `ProjectType` enum from Projen's JSII manifest (19 project types)\n- **Component System**: Reusable components (Vitest, TypeDoc, Mise, Homebrew, Colima, LocalStack, Lambda bundling)\n- **Code Generation**: `ProjectGenerator` creates project classes with standard configuration\n- **ES Modules**: TypeScript and CDK App projects use ES modules (JSII uses CommonJS)\n- **Code Quality**: Biome for formatting and linting\n- **Testing**: Vitest with coverage\n- **Auto-merge**: Enabled with auto-approve\n- **VSCode**: Recommended extensions and settings\n- **mise**: Node version management\n\n## Standard Configuration\n\n- **Author**: Niko Virtala (niko.virtala@hey.com)\n- **Default Release Branch**: main\n- **Package Manager**: pnpm 12.16.1\n- **Node Version**: 26.13.0\n- **TypeScript**: 6.0.3\n- **CDK Version**: 2.263.0 (for CDK projects)\n- **JSII Version**: ~6.0.3 (for JSII projects)\n\nThe AWS CDK, Node.js and TypeScript versions live in `src/versions.json` and are refreshed by the\n`update-versions` task, which the dependency upgrade workflow runs.\n\n### pnpm\n\npnpm reads its settings from `pnpm-workspace.yaml`, not `.npmrc`, since pnpm 11. Generated projects\nget:\n\n| Setting | Value | Reason |\n| ---------------------- | ----------------- | ------------------------------------------------------------------------------------------------------------ |\n| `nodeLinker` | `hoisted` | jsii tooling resolves dependencies from a flat `node_modules` |\n| `allowBuilds` | `esbuild: true` | esbuild links its platform binary in a postinstall script, and pnpm 11 fails an install with ignored builds |\n| `verifyDepsBeforeRun` | `false` | projen resolves the task `PATH` with `$(pnpm -c exec ...)`, which otherwise re-enters `pnpm install` and deadlocks |\n| `minimumReleaseAge` | `0` | the pnpm 11 default of 1440 minutes makes pnpm write `minimumReleaseAgeExclude` entries into this generated file |\n\n### TypeScript configuration\n\nProjen renders three configs, and none of them should be edited directly:\n\n- `tsconfig.json` compiles `src` to `lib`. For JSII projects, jsii validates it against its `strict`\n rule set, so it only carries compiler options jsii accepts.\n- `test/tsconfig.json` extends it and is type-check only. This is the config Vitest type checking and\n the editor use, and the one `tsconfigDev` points at.\n- `projenrc/tsconfig.json` covers `.projenrc.ts`.\n\n## Customization\n\nOverride any option by passing it to the constructor:\n\n```typescript\nconst project = new JsiiProject({\n name: \"my-project\",\n repositoryUrl: \"https://github.com/nikovirtala/my-project.git\",\n minNodeVersion: \"26.0.0\",\n author: \"Custom Author\",\n authorAddress: \"custom@example.com\",\n mise: false,\n vitest: false,\n tsconfig: {\n compilerOptions: {\n noUnusedLocals: false,\n },\n },\n biomeOptions: {\n biomeConfig: {\n formatter: {\n lineWidth: 100,\n },\n },\n },\n});\n```\n\nEvery component is exposed as an enable flag (`mise`, `vitest`, ...) plus an options property\n(`miseOptions`, `vitestOptions`, ...).\n\n## Usage\n\n### Projects\n\n#### AWS CDK Construct Library Project\n\n```typescript\nimport { AwsCdkConstructLibraryProject } from \"@nikovirtala/projen-constructs\";\n\nconst project = new AwsCdkConstructLibraryProject({\n name: \"my-cdk-construct\",\n repositoryUrl: \"https://github.com/nikovirtala/my-cdk-construct.git\",\n});\n\nproject.synth();\n```\n\n#### AWS CDK TypeScript App Project\n\n```typescript\nimport { AwsCdkTypeScriptAppProject } from \"@nikovirtala/projen-constructs\";\n\nconst project = new AwsCdkTypeScriptAppProject({\n name: \"my-cdk-app\",\n repositoryUrl: \"https://github.com/nikovirtala/my-cdk-app.git\",\n});\n\nproject.synth();\n```\n\n#### JSII Project\n\n```typescript\nimport { JsiiProject } from \"@nikovirtala/projen-constructs\";\n\nconst project = new JsiiProject({\n name: \"my-jsii-project\",\n repositoryUrl: \"https://github.com/nikovirtala/my-jsii-project.git\",\n});\n\nproject.synth();\n```\n\n#### TypeScript Project\n\n```typescript\nimport { TypeScriptProject } from \"@nikovirtala/projen-constructs\";\n\nconst project = new TypeScriptProject({\n name: \"my-typescript-project\",\n repositoryUrl: \"https://github.com/nikovirtala/my-typescript-project.git\",\n});\n\nproject.synth();\n```\n\n### Components\n\nThe package includes reusable components for common development tasks:\n\n#### Vitest\n\n[Vitest](https://vitest.dev) testing framework component.\n\n```typescript\nimport { Vitest } from \"@nikovirtala/projen-constructs\";\n\nnew Vitest(project, {\n vitestVersion: \"^5\",\n config: {\n coverageProvider: CoverageProvider.V8,\n coverageReporters: [CoverageReporter.TEXT, CoverageReporter.LCOV],\n },\n});\n```\n\nType checking runs against the project's development tsconfig (`test/tsconfig.json`) unless\n`config.typecheckTsconfig` says otherwise.\n\nFor Vitest settings that `config` doesn't cover, use `extraTestConfig` (merged into `test`) and\n`extraConfig` (top-level options next to `test`):\n\n```typescript\nnew Vitest(project, {\n extraTestConfig: {\n setupFiles: [\"test/setup.ts\"],\n },\n extraConfig: {\n resolve: { alias: { \"@\": \"/src\" } },\n },\n});\n```\n\n`extraTestConfig` is deep-merged over the generated `test` options: objects merge, and other values\n(including arrays) replace the generated value. Both options are rendered as JSON, so their values\ncan't contain functions or regular expressions, which rules out plugins.\n\n#### TypeDoc\n\n[TypeDoc](https://typedoc.org) documentation generation component.\n\n```typescript\nimport { TypeDoc, EntryPointStrategy } from \"@nikovirtala/projen-constructs\";\n\nnew TypeDoc(project, {\n version: \"^0.28\",\n typeDocConfig: {\n entryPointStrategy: EntryPointStrategy.EXPAND,\n out: \"docs/api\",\n exclude: [\"**/*.test.ts\"],\n },\n});\n```\n\n#### Mise\n\n[Mise](https://mise.jdx.dev) dev tools/runtimes management component.\n\n```typescript\nimport { Mise } from \"@nikovirtala/projen-constructs\";\n\nnew Mise(project, {\n nodeVersion: \"26.13.0\",\n});\n```\n\n#### Homebrew\n\n[Homebrew](https://brew.sh) package management component. Writes a `Brewfile` and adds an\n`install:homebrew` task that bootstraps Homebrew and runs `brew bundle`.\n\n```typescript\nimport { Homebrew } from \"@nikovirtala/projen-constructs\";\n\nconst homebrew = new Homebrew(project, {\n packages: [\"jq\", \"yq\"],\n});\n\nhomebrew.addPackage(\"gh\");\n```\n\nA fully qualified formula (`user/repository/formula`) also adds a `tap` entry. Since Homebrew 6,\nformulae from non-official taps only load when trusted, so they're written with `trusted: true`.\nThat trusts only the formula, not the rest of its tap.\n\n#### Colima\n\n[Colima](https://github.com/abiosoft/colima) container runtime component. Alternative for Docker.\n\n```typescript\nimport { Colima } from \"@nikovirtala/projen-constructs\";\n\nnew Colima(project);\n```\n\n#### LocalStack\n\n[LocalStack](https://www.localstack.cloud) AWS emulation component.\n\n```typescript\nimport { LocalStack } from \"@nikovirtala/projen-constructs\";\n\nnew LocalStack(project, {\n services: [\"s3\", \"lambda\", \"dynamodb\"],\n port: 4566,\n debug: true,\n});\n```\n\n#### LambdaFunctionConstructGenerator\n\nGenerates AWS CDK Lambda Function constructs and bundles their code.\n\n```typescript\nimport { LambdaFunctionConstructGenerator } from \"@nikovirtala/projen-constructs\";\n\nnew LambdaFunctionConstructGenerator(project, {\n sourceDir: \"src/handlers\",\n outputDir: \"src/constructs/lambda\",\n filePattern: \"*.lambda.ts\",\n esbuildOptions: {\n minify: true,\n sourcemap: true,\n },\n});\n```\n\n#### Bundler\n\nLow-level bundling utilities for Lambda functions.\n\n```typescript\nimport {\n Bundler,\n LambdaFunctionCodeBundle,\n} from \"@nikovirtala/projen-constructs\";\n\nconst bundler = new Bundler(project, {\n assetsDir: \"assets\",\n esbuildVersion: \"^0.25\",\n});\n\nnew LambdaFunctionCodeBundle(project, {\n entrypoint: \"src/my-function.lambda.ts\",\n extension: \".lambda.ts\",\n});\n```\n\n#### ProjectGenerator\n\nGenerates TypeScript project classes with standard configuration.\n\n```typescript\nimport { ProjectGenerator, ProjectType } from \"@nikovirtala/projen-constructs\";\n\nnew ProjectGenerator(project, {\n name: \"TypeScriptProject\",\n projectType: ProjectType.TYPE_SCRIPT_PROJECT,\n filePath: \"./src/projects/typescript.generated.ts\",\n components: [\n { componentClass: Mise },\n { componentClass: Vitest }, // Auto-detects VitestOptions from JSII manifest\n ],\n});\n```\n\nFeatures:\n\n- Automatically generates the `ProjectType` enum from Projen's JSII manifest\n- Auto-detects component options types from JSII manifests\n- Strips Projen's `@pjnew` annotation from `packageManager`, which `projen new` would otherwise\n render into a generated `.projenrc.ts` as the package manager that ran the command\n- Validates paths to prevent directory traversal attacks\n- Structured error handling with custom error classes\n\n## Migrating from the standalone packages\n\nThe components used to be published as separate packages. Those packages are deprecated and won't\nget new features or fixes. Every class, interface, enum and function they exported is exported from\n`@nikovirtala/projen-constructs` under the same name, except `AwsCdkApp` (see below).\n\n| Deprecated package | Replacement in `@nikovirtala/projen-constructs` |\n| --- | --- |\n| `@nikovirtala/projen-vitest` | `Vitest`, `VitestOptions`, `VitestConfigOptions`, `Environment`, `Pool`, `CoverageProvider`, `CoverageReporter` |\n| `@nikovirtala/projen-typedoc` | `TypeDoc`, `TypeDocOptions`, `TypeDocConfiguration` and its enums |\n| `@nikovirtala/projen-homebrew` | `Homebrew`, `HomebrewOptions` |\n| `@nikovirtala/projen-colima` | `Colima` |\n| `@nikovirtala/projen-localstack` | `LocalStack`, `LocalStackOptions` |\n| `@nikovirtala/projen-bundle-lambda-function-code` | `Bundler`, `LambdaFunctionCodeBundle`, `LambdaFunctionCodeBundler` and their options |\n| `@nikovirtala/projen-lambda-function-construct-generator` | `LambdaFunctionConstructGenerator`, `LambdaFunctionConstructGeneratorOptions` |\n| `@nikovirtala/projen-aws-cdk-app` | `AwsCdkTypeScriptAppProject`, `AwsCdkTypeScriptAppProjectOptions` |\n\n### Steps\n\n1. In `.projenrc.ts`, replace the old package in `devDeps` with `@nikovirtala/projen-constructs`, and\n change the imports:\n\n ```typescript\n // before\n import { Vitest } from \"@nikovirtala/projen-vitest\";\n // after\n import { Vitest } from \"@nikovirtala/projen-constructs\";\n ```\n\n2. Check the peer dependencies. `@nikovirtala/projen-constructs` needs `projen` ^0.104, `constructs`\n ^10 and `@mrgrain/cdk-esbuild` ^5. The standalone packages accepted older projen versions, so you\n may have to upgrade projen in the same change.\n3. Install the new package, run `npx projen` and review the changes to the generated files.\n\n### Changes to expect\n\nThese are the differences in behaviour or generated files between the standalone packages and this\nlibrary.\n\n**Vitest**\n\n- `vitest.config.ts` imports `defineConfig` from\n `@nikovirtala/projen-constructs/lib/vitest-define-config` instead of\n `@nikovirtala/projen-vitest/lib/bundled-define-config`. Projen rewrites the file, so there's\n nothing to change by hand.\n- The config is rendered as JSON, so its keys are quoted. The settings are the same.\n- `config.typecheckTsconfig` defaults to the project's development tsconfig (`test/tsconfig.json`\n in current projen) instead of `tsconfig.dev.json`.\n- JSII and construct library projects exclude `vitest.config.ts` from the published package.\n- New: `extraTestConfig` and `extraConfig` for Vitest settings that `config` doesn't cover.\n\n**Homebrew and Colima**\n\n- Packages from a tap (`owner/tap/formula`) also add a `tap` line to the `Brewfile`, and the\n `Brewfile` is sorted.\n- The `install:homebrew`, `homebrew:bundle` and `colima` tasks run in bash. `homebrew:bundle` also\n finds a freshly installed `brew` that isn't on the `PATH` yet.\n\n**LocalStack**\n\n- `imageTag` is applied: LocalStack starts with `localstack/localstack:<imageTag>`. It used to be\n ignored.\n\n**Bundler / LambdaFunctionCodeBundler**\n\n- `LambdaFunctionCodeBundler.bundleOptions` applies to every discovered entrypoint. Its `entrypoint`\n used to replace them all.\n\n**LambdaFunctionConstructGenerator**\n\n- The bundle task runs `tsx` with the project's development tsconfig instead of `tsconfig.dev.json`.\n\n**TypeDoc**: no changes.\n\n### From `AwsCdkApp` to `AwsCdkTypeScriptAppProject`\n\n```typescript\n// before\nimport { AwsCdkApp } from \"@nikovirtala/projen-aws-cdk-app\";\nconst project = new AwsCdkApp({ name: \"my-app\", cdkVersion: \"2.221.0\" });\n\n// after\nimport { AwsCdkTypeScriptAppProject } from \"@nikovirtala/projen-constructs\";\nconst project = new AwsCdkTypeScriptAppProject({ name: \"my-app\", cdkVersion: \"2.221.0\" });\n```\n\nBoth are ES module apps run with `tsx`, using pnpm, Biome, Vitest and mise. The differences:\n\n- **`nvm` is removed.** Use mise (on by default), which pins the Node.js version in `mise.toml`.\n- **Homebrew is on by default.** The project gets a `Brewfile`, and `npx projen` runs\n `install:homebrew` (installs Homebrew if `brew` is missing) and `homebrew:bundle`. Set\n `homebrew: false` to turn it off.\n- **cdk.json `app`** is `npx tsx src/main.ts` instead of `tsx --tsconfig tsconfig.json src/main.ts`.\n- **Defaults** come from this library: Node.js, TypeScript, CDK and pnpm versions (pnpm 12 instead\n of 10), Dependabot off, auto-merge on, `auto-approve` and `auto-merge` labels on dependency\n upgrade PRs, and auto-approval of PRs by `nikovirtala`. Any option you set explicitly still wins,\n so set `autoApproveOptions` if you aren't `nikovirtala`.\n- **tsconfig**: `noImplicitOverride` and `allowSyntheticDefaultImports` move from `tsconfig.json`\n to the development tsconfig (`test/tsconfig.json`).\n- **Options removed from the interface**: `eslint`, `jest`, `prettier` (and their options),\n `sampleCode` and `tsJestOptions`.\n- `vitestOptions` takes the `VitestOptions` of this library, and now also `homebrewOptions` and\n `miseOptions`.\n\n## Development\n\nThis project is managed by Projen and generates itself: `.projenrc.ts` defines the project using the\n`JsiiProject` type from `src/`. Configuration changes belong in `.projenrc.ts`, never in the\ngenerated files.\n\n```bash\npnpm projen # synthesize project files\npnpm build # synthesize, compile, test and package\npnpm test # biome, vitest, typedoc\npnpm test:watch # vitest in watch mode\npnpm test:update # update snapshots\npnpm biome # format and lint\npnpm docgen # regenerate API.md from the .jsii manifest\npnpm update-versions # refresh src/versions.json\npnpm upgrade # upgrade dependencies\n```\n\n### Build process\n\n```mermaid\nflowchart TD\n projenrc[\".projenrc.ts\"]\n\n subgraph synthesize[\"default (synthesize)\"]\n direction TB\n synth[\"tsx .projenrc.ts\"]\n generator[\"ProjectGenerator\"]\n generated[\"src/project-type.ts<br/>src/projects/*.generated.ts<br/>src/projects/*-options.generated.ts\"]\n projenfiles[\"package.json, tsconfig.json,<br/>pnpm-workspace.yaml, workflows, ...\"]\n brew[\"install:homebrew<br/>brew bundle\"]\n definecfg[\"bundle-vitest-define-config<br/>esbuild → lib/vitest-define-config.js\"]\n\n synth --> generator --> generated\n synth --> projenfiles\n synth --> brew\n synth --> definecfg\n end\n\n subgraph compile[\"compile\"]\n direction TB\n jsii[\"jsii<br/>validates tsconfig.json against the strict rule set\"]\n lib[\"lib/**\"]\n manifest[\".jsii manifest\"]\n\n jsii --> lib\n jsii --> manifest\n end\n\n subgraph test[\"test\"]\n direction TB\n biome[\"biome check --write\"]\n vitest[\"vitest run<br/>+ type checking\"]\n typedoc[\"typedoc → docs/api\"]\n\n biome --> vitest --> typedoc\n end\n\n subgraph package[\"package\"]\n direction TB\n pacmak[\"jsii-pacmak<br/>--pack-command 'pnpm pack'\"]\n dist[\"dist/js/*.tgz\"]\n\n pacmak --> dist\n end\n\n projenrc --> synthesize\n synthesize --> compile\n compile --> test\n test --> package\n\n manifest -. \"component options FQNs<br/>read on the next synthesis\" .-> generator\n docgen[\"docgen<br/>jsii-docgen → API.md\"]\n manifest --> docgen\n\n classDef artifact fill:#eef,stroke:#88a\n class generated,projenfiles,lib,manifest,dist artifact\n```\n\nThe dashed edge is the part worth knowing about: `ProjectGenerator` reads the committed `.jsii`\nmanifest to resolve component options types, so the manifest produced by `compile` feeds the *next*\nsynthesis. This is why `.jsii` is committed rather than ignored. A component options type that is\nmissing from the manifest is reported as a warning and its options property is left out of the\ngenerated interface, which is expected only while a new component is being introduced: compile once,\nthen synthesize again.\n\n`package` runs `package:js` on CI and `package-all` locally; both end up in `jsii-pacmak`.\n`docgen` is not part of `build` and has to be run explicitly after the manifest changes.\n"
4200
4200
  },
4201
4201
  "repository": {
4202
4202
  "type": "git",
@@ -21378,7 +21378,7 @@
21378
21378
  {
21379
21379
  "abstract": true,
21380
21380
  "docs": {
21381
- "default": "\"^4\"",
21381
+ "default": "\"^5\"",
21382
21382
  "stability": "stable",
21383
21383
  "summary": "Vitest version."
21384
21384
  },
@@ -21397,6 +21397,6 @@
21397
21397
  "symbolId": "src/components/vitest:VitestOptions"
21398
21398
  }
21399
21399
  },
21400
- "version": "0.3.84",
21401
- "fingerprint": "2BmkH+gG8kVks7fnwXToMINuRneaUtI6kONUbzl+/f8="
21400
+ "version": "0.4.1",
21401
+ "fingerprint": "5mgh7uYsfiJ1RmDet7ioul32cEFsC7MRzwE/k7SGeLA="
21402
21402
  }
package/README.md CHANGED
@@ -8,7 +8,7 @@ Projen project types with standard configuration for consistent project setup ac
8
8
  pnpm add -D @nikovirtala/projen-constructs projen constructs
9
9
  ```
10
10
 
11
- Requires pnpm 11 and `projen` >= 0.101.27. `@mrgrain/cdk-esbuild` and `constructs` are peer
11
+ Requires pnpm 12 and `projen` >= 0.101.27. `@mrgrain/cdk-esbuild` and `constructs` are peer
12
12
  dependencies as well.
13
13
 
14
14
  To create a project from scratch:
@@ -34,8 +34,8 @@ pnpm dlx projen new --from @nikovirtala/projen-constructs aws_cdk_construct_libr
34
34
 
35
35
  - **Author**: Niko Virtala (niko.virtala@hey.com)
36
36
  - **Default Release Branch**: main
37
- - **Package Manager**: pnpm 11.20.0
38
- - **Node Version**: 24.19.0
37
+ - **Package Manager**: pnpm 12.16.1
38
+ - **Node Version**: 26.13.0
39
39
  - **TypeScript**: 6.0.3
40
40
  - **CDK Version**: 2.263.0 (for CDK projects)
41
41
  - **JSII Version**: ~6.0.3 (for JSII projects)
@@ -73,7 +73,7 @@ Override any option by passing it to the constructor:
73
73
  const project = new JsiiProject({
74
74
  name: "my-project",
75
75
  repositoryUrl: "https://github.com/nikovirtala/my-project.git",
76
- minNodeVersion: "24.0.0",
76
+ minNodeVersion: "26.0.0",
77
77
  author: "Custom Author",
78
78
  authorAddress: "custom@example.com",
79
79
  mise: false,
@@ -164,7 +164,7 @@ The package includes reusable components for common development tasks:
164
164
  import { Vitest } from "@nikovirtala/projen-constructs";
165
165
 
166
166
  new Vitest(project, {
167
- vitestVersion: "^4",
167
+ vitestVersion: "^5",
168
168
  config: {
169
169
  coverageProvider: CoverageProvider.V8,
170
170
  coverageReporters: [CoverageReporter.TEXT, CoverageReporter.LCOV],
@@ -218,7 +218,7 @@ new TypeDoc(project, {
218
218
  import { Mise } from "@nikovirtala/projen-constructs";
219
219
 
220
220
  new Mise(project, {
221
- nodeVersion: "24.19.0",
221
+ nodeVersion: "26.13.0",
222
222
  });
223
223
  ```
224
224
 
@@ -424,7 +424,7 @@ Both are ES module apps run with `tsx`, using pnpm, Biome, Vitest and mise. The
424
424
  `install:homebrew` (installs Homebrew if `brew` is missing) and `homebrew:bundle`. Set
425
425
  `homebrew: false` to turn it off.
426
426
  - **cdk.json `app`** is `npx tsx src/main.ts` instead of `tsx --tsconfig tsconfig.json src/main.ts`.
427
- - **Defaults** come from this library: Node.js, TypeScript, CDK and pnpm versions (pnpm 11 instead
427
+ - **Defaults** come from this library: Node.js, TypeScript, CDK and pnpm versions (pnpm 12 instead
428
428
  of 10), Dependabot off, auto-merge on, `auto-approve` and `auto-merge` labels on dependency
429
429
  upgrade PRs, and auto-approval of PRs by `nikovirtala`. Any option you set explicitly still wins,
430
430
  so set `autoApproveOptions` if you aren't `nikovirtala`.
@@ -14,7 +14,7 @@
14
14
  <pre><code class="bash"><span class="hl-0">pnpm</span><span class="hl-1"> </span><span class="hl-2">add</span><span class="hl-1"> </span><span class="hl-3">-D</span><span class="hl-1"> </span><span class="hl-2">@nikovirtala/projen-constructs</span><span class="hl-1"> </span><span class="hl-2">projen</span><span class="hl-1"> </span><span class="hl-2">constructs</span>
15
15
  </code><button type="button">Copy</button></pre>
16
16
 
17
- <p>Requires pnpm 11 and <code>projen</code> &gt;= 0.101.27. <code>@mrgrain/cdk-esbuild</code> and <code>constructs</code> are peer
17
+ <p>Requires pnpm 12 and <code>projen</code> &gt;= 0.101.27. <code>@mrgrain/cdk-esbuild</code> and <code>constructs</code> are peer
18
18
  dependencies as well.</p>
19
19
  <p>To create a project from scratch:</p>
20
20
  <pre><code class="bash"><span class="hl-0">pnpm</span><span class="hl-1"> </span><span class="hl-2">dlx</span><span class="hl-1"> </span><span class="hl-2">projen</span><span class="hl-1"> </span><span class="hl-2">new</span><span class="hl-1"> </span><span class="hl-3">--from</span><span class="hl-1"> </span><span class="hl-2">@nikovirtala/projen-constructs</span><span class="hl-1"> </span><span class="hl-2">aws_cdk_construct_library</span>
@@ -37,8 +37,8 @@ dependencies as well.</p>
37
37
  <ul>
38
38
  <li><strong>Author</strong>: Niko Virtala (<a href="mailto:niko.virtala@hey.com">niko.virtala@hey.com</a>)</li>
39
39
  <li><strong>Default Release Branch</strong>: main</li>
40
- <li><strong>Package Manager</strong>: pnpm 11.20.0</li>
41
- <li><strong>Node Version</strong>: 24.19.0</li>
40
+ <li><strong>Package Manager</strong>: pnpm 12.16.1</li>
41
+ <li><strong>Node Version</strong>: 26.13.0</li>
42
42
  <li><strong>TypeScript</strong>: 6.0.3</li>
43
43
  <li><strong>CDK Version</strong>: 2.263.0 (for CDK projects)</li>
44
44
  <li><strong>JSII Version</strong>: ~6.0.3 (for JSII projects)</li>
@@ -90,7 +90,7 @@ the editor use, and the one <code>tsconfigDev</code> points at.</li>
90
90
  </ul>
91
91
  <h2 id="customization" class="tsd-anchor-link">Customization<a href="#customization" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h2>
92
92
  <p>Override any option by passing it to the constructor:</p>
93
- <pre><code class="typescript"><span class="hl-3">const</span><span class="hl-1"> </span><span class="hl-4">project</span><span class="hl-1"> = </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-0">JsiiProject</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-5">name:</span><span class="hl-1"> </span><span class="hl-2">&quot;my-project&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">repositoryUrl:</span><span class="hl-1"> </span><span class="hl-2">&quot;https://github.com/nikovirtala/my-project.git&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">minNodeVersion:</span><span class="hl-1"> </span><span class="hl-2">&quot;24.0.0&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">author:</span><span class="hl-1"> </span><span class="hl-2">&quot;Custom Author&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">authorAddress:</span><span class="hl-1"> </span><span class="hl-2">&quot;custom@example.com&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">mise:</span><span class="hl-1"> </span><span class="hl-3">false</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">vitest:</span><span class="hl-1"> </span><span class="hl-3">false</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">tsconfig:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-5">compilerOptions:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-5">noUnusedLocals:</span><span class="hl-1"> </span><span class="hl-3">false</span><span class="hl-1">,</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> </span><span class="hl-5">biomeOptions:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-5">biomeConfig:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-5">formatter:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-5">lineWidth:</span><span class="hl-1"> </span><span class="hl-6">100</span><span class="hl-1">,</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> },</span><br/><span class="hl-1">});</span>
93
+ <pre><code class="typescript"><span class="hl-3">const</span><span class="hl-1"> </span><span class="hl-4">project</span><span class="hl-1"> = </span><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-0">JsiiProject</span><span class="hl-1">({</span><br/><span class="hl-1"> </span><span class="hl-5">name:</span><span class="hl-1"> </span><span class="hl-2">&quot;my-project&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">repositoryUrl:</span><span class="hl-1"> </span><span class="hl-2">&quot;https://github.com/nikovirtala/my-project.git&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">minNodeVersion:</span><span class="hl-1"> </span><span class="hl-2">&quot;26.0.0&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">author:</span><span class="hl-1"> </span><span class="hl-2">&quot;Custom Author&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">authorAddress:</span><span class="hl-1"> </span><span class="hl-2">&quot;custom@example.com&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">mise:</span><span class="hl-1"> </span><span class="hl-3">false</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">vitest:</span><span class="hl-1"> </span><span class="hl-3">false</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">tsconfig:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-5">compilerOptions:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-5">noUnusedLocals:</span><span class="hl-1"> </span><span class="hl-3">false</span><span class="hl-1">,</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> </span><span class="hl-5">biomeOptions:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-5">biomeConfig:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-5">formatter:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-5">lineWidth:</span><span class="hl-1"> </span><span class="hl-6">100</span><span class="hl-1">,</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> },</span><br/><span class="hl-1">});</span>
94
94
  </code><button type="button">Copy</button></pre>
95
95
 
96
96
  <p>Every component is exposed as an enable flag (<code>mise</code>, <code>vitest</code>, ...) plus an options property
@@ -117,7 +117,7 @@ the editor use, and the one <code>tsconfigDev</code> points at.</li>
117
117
  <p>The package includes reusable components for common development tasks:</p>
118
118
  <h4 id="vitest" class="tsd-anchor-link">Vitest<a href="#vitest" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4>
119
119
  <p><a href="https://vitest.dev">Vitest</a> testing framework component.</p>
120
- <pre><code class="typescript"><span class="hl-7">import</span><span class="hl-1"> { </span><span class="hl-5">Vitest</span><span class="hl-1"> } </span><span class="hl-7">from</span><span class="hl-1"> </span><span class="hl-2">&quot;@nikovirtala/projen-constructs&quot;</span><span class="hl-1">;</span><br/><br/><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-0">Vitest</span><span class="hl-1">(</span><span class="hl-5">project</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-5">vitestVersion:</span><span class="hl-1"> </span><span class="hl-2">&quot;^4&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">config:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-5">coverageProvider:</span><span class="hl-1"> </span><span class="hl-5">CoverageProvider</span><span class="hl-1">.</span><span class="hl-4">V8</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">coverageReporters:</span><span class="hl-1"> [</span><span class="hl-5">CoverageReporter</span><span class="hl-1">.</span><span class="hl-4">TEXT</span><span class="hl-1">, </span><span class="hl-5">CoverageReporter</span><span class="hl-1">.</span><span class="hl-4">LCOV</span><span class="hl-1">],</span><br/><span class="hl-1"> },</span><br/><span class="hl-1">});</span>
120
+ <pre><code class="typescript"><span class="hl-7">import</span><span class="hl-1"> { </span><span class="hl-5">Vitest</span><span class="hl-1"> } </span><span class="hl-7">from</span><span class="hl-1"> </span><span class="hl-2">&quot;@nikovirtala/projen-constructs&quot;</span><span class="hl-1">;</span><br/><br/><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-0">Vitest</span><span class="hl-1">(</span><span class="hl-5">project</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-5">vitestVersion:</span><span class="hl-1"> </span><span class="hl-2">&quot;^5&quot;</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">config:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-5">coverageProvider:</span><span class="hl-1"> </span><span class="hl-5">CoverageProvider</span><span class="hl-1">.</span><span class="hl-4">V8</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">coverageReporters:</span><span class="hl-1"> [</span><span class="hl-5">CoverageReporter</span><span class="hl-1">.</span><span class="hl-4">TEXT</span><span class="hl-1">, </span><span class="hl-5">CoverageReporter</span><span class="hl-1">.</span><span class="hl-4">LCOV</span><span class="hl-1">],</span><br/><span class="hl-1"> },</span><br/><span class="hl-1">});</span>
121
121
  </code><button type="button">Copy</button></pre>
122
122
 
123
123
  <p>Type checking runs against the project's development tsconfig (<code>test/tsconfig.json</code>) unless
@@ -137,7 +137,7 @@ can't contain functions or regular expressions, which rules out plugins.</p>
137
137
 
138
138
  <h4 id="mise" class="tsd-anchor-link">Mise<a href="#mise" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4>
139
139
  <p><a href="https://mise.jdx.dev">Mise</a> dev tools/runtimes management component.</p>
140
- <pre><code class="typescript"><span class="hl-7">import</span><span class="hl-1"> { </span><span class="hl-5">Mise</span><span class="hl-1"> } </span><span class="hl-7">from</span><span class="hl-1"> </span><span class="hl-2">&quot;@nikovirtala/projen-constructs&quot;</span><span class="hl-1">;</span><br/><br/><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-0">Mise</span><span class="hl-1">(</span><span class="hl-5">project</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-5">nodeVersion:</span><span class="hl-1"> </span><span class="hl-2">&quot;24.19.0&quot;</span><span class="hl-1">,</span><br/><span class="hl-1">});</span>
140
+ <pre><code class="typescript"><span class="hl-7">import</span><span class="hl-1"> { </span><span class="hl-5">Mise</span><span class="hl-1"> } </span><span class="hl-7">from</span><span class="hl-1"> </span><span class="hl-2">&quot;@nikovirtala/projen-constructs&quot;</span><span class="hl-1">;</span><br/><br/><span class="hl-3">new</span><span class="hl-1"> </span><span class="hl-0">Mise</span><span class="hl-1">(</span><span class="hl-5">project</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-5">nodeVersion:</span><span class="hl-1"> </span><span class="hl-2">&quot;26.13.0&quot;</span><span class="hl-1">,</span><br/><span class="hl-1">});</span>
141
141
  </code><button type="button">Copy</button></pre>
142
142
 
143
143
  <h4 id="homebrew" class="tsd-anchor-link">Homebrew<a href="#homebrew" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h4>
@@ -295,7 +295,7 @@ used to replace them all.</li>
295
295
  <code>install:homebrew</code> (installs Homebrew if <code>brew</code> is missing) and <code>homebrew:bundle</code>. Set
296
296
  <code>homebrew: false</code> to turn it off.</li>
297
297
  <li><strong>cdk.json <code>app</code></strong> is <code>npx tsx src/main.ts</code> instead of <code>tsx --tsconfig tsconfig.json src/main.ts</code>.</li>
298
- <li><strong>Defaults</strong> come from this library: Node.js, TypeScript, CDK and pnpm versions (pnpm 11 instead
298
+ <li><strong>Defaults</strong> come from this library: Node.js, TypeScript, CDK and pnpm versions (pnpm 12 instead
299
299
  of 10), Dependabot off, auto-merge on, <code>auto-approve</code> and <code>auto-merge</code> labels on dependency
300
300
  upgrade PRs, and auto-approval of PRs by <code>nikovirtala</code>. Any option you set explicitly still wins,
301
301
  so set <code>autoApproveOptions</code> if you aren't <code>nikovirtala</code>.</li>
@@ -93,7 +93,7 @@ arrays) replace the generated value. Values are rendered as JSON, so they must b
93
93
  </div>
94
94
  <div class="tsd-comment tsd-typography">
95
95
  <div class="tsd-tag-default">
96
- <h4 class="tsd-anchor-link" id="default-3">Default<a href="#default-3" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><pre><code class="ts"><span class="hl-2">&quot;^4&quot;</span>
96
+ <h4 class="tsd-anchor-link" id="default-3">Default<a href="#default-3" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><pre><code class="ts"><span class="hl-2">&quot;^5&quot;</span>
97
97
  </code><button type="button">Copy</button></pre>
98
98
 
99
99
  </div></div></section></section></details></div>
@@ -67,7 +67,7 @@ function convertToPosixPath(p) {
67
67
  * single file.
68
68
  */
69
69
  class Bundler extends projen_1.Component {
70
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Bundler", version: "0.3.84" };
70
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Bundler", version: "0.4.1" };
71
71
  /**
72
72
  * Returns the `Bundler` instance associated with a project or `undefined` if
73
73
  * there is no Bundler.
@@ -221,7 +221,7 @@ exports.Bundler = Bundler;
221
221
  * });
222
222
  */
223
223
  class LambdaFunctionCodeBundle extends projen_1.Component {
224
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LambdaFunctionCodeBundle", version: "0.3.84" };
224
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LambdaFunctionCodeBundle", version: "0.4.1" };
225
225
  /**
226
226
  * Defines a pre-bundled AWS Lambda Function code asset from handler code.
227
227
  *
@@ -273,7 +273,7 @@ exports.LambdaFunctionCodeBundle = LambdaFunctionCodeBundle;
273
273
  * Creates Lambda Function code bundles from entrypoints discovered in the project's source tree.
274
274
  */
275
275
  class LambdaFunctionCodeBundler extends projen_1.cdk.AutoDiscoverBase {
276
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LambdaFunctionCodeBundler", version: "0.3.84" };
276
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LambdaFunctionCodeBundler", version: "0.4.1" };
277
277
  constructor(project, options) {
278
278
  super(project, {
279
279
  projectdir: options.srcdir,
@@ -11,7 +11,7 @@ const homebrew_1 = require("./homebrew");
11
11
  * Adds Colima support to your project with automatic installation and startup.
12
12
  */
13
13
  class Colima extends component_1.Component {
14
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Colima", version: "0.3.84" };
14
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Colima", version: "0.4.1" };
15
15
  constructor(scope) {
16
16
  super(scope);
17
17
  const project = this.project;
@@ -14,7 +14,7 @@ function tapOf(packageName) {
14
14
  return parts.length === 3 ? `${parts[0]}/${parts[1]}` : undefined;
15
15
  }
16
16
  class Homebrew extends component_1.Component {
17
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Homebrew", version: "0.3.84" };
17
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Homebrew", version: "0.4.1" };
18
18
  static of(project) {
19
19
  const isHomebrew = (c) => c instanceof Homebrew;
20
20
  return project.components.find(isHomebrew);
@@ -44,7 +44,7 @@ const utils_1 = require("../utils");
44
44
  * The bundling happens during projen execution, not during CDK synth, enabling a "build once, deploy many" pattern.
45
45
  */
46
46
  class LambdaFunctionConstructGenerator extends projen_1.Component {
47
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LambdaFunctionConstructGenerator", version: "0.3.84" };
47
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LambdaFunctionConstructGenerator", version: "0.4.1" };
48
48
  sourceDir;
49
49
  outputDir;
50
50
  filePattern;
@@ -12,7 +12,7 @@ const homebrew_1 = require("./homebrew");
12
12
  * Adds LocalStack support to your project with automatic Docker/Colima setup.
13
13
  */
14
14
  class LocalStack extends component_1.Component {
15
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LocalStack", version: "0.3.84" };
15
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LocalStack", version: "0.4.1" };
16
16
  constructor(scope, options = {}) {
17
17
  super(scope);
18
18
  const project = javascript_1.NodeProject.of(this);
@@ -7,7 +7,7 @@ const component_1 = require("projen/lib/component");
7
7
  const textfile_1 = require("projen/lib/textfile");
8
8
  const homebrew_1 = require("./homebrew");
9
9
  class Mise extends component_1.Component {
10
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Mise", version: "0.3.84" };
10
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Mise", version: "0.4.1" };
11
11
  static of(project) {
12
12
  const isMise = (c) => c instanceof Mise;
13
13
  return project.components.find(isMise);
@@ -34,7 +34,7 @@ const DEFAULT_CONFIG = {
34
34
  * TypeDoc component for projen projects
35
35
  */
36
36
  class TypeDoc extends component_1.Component {
37
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.TypeDoc", version: "0.3.84" };
37
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.TypeDoc", version: "0.4.1" };
38
38
  static of(project) {
39
39
  const isTypeDoc = (c) => c instanceof TypeDoc;
40
40
  return project.components.find(isTypeDoc);
@@ -241,7 +241,7 @@ export interface VitestOptions {
241
241
  /**
242
242
  * Vitest version.
243
243
  *
244
- * @default "^4"
244
+ * @default "^5"
245
245
  */
246
246
  readonly vitestVersion?: string;
247
247
  /**
@@ -141,7 +141,7 @@ var CoverageReporter;
141
141
  CoverageReporter["TEXT"] = "text";
142
142
  })(CoverageReporter || (exports.CoverageReporter = CoverageReporter = {}));
143
143
  class Vitest extends component_1.Component {
144
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Vitest", version: "0.3.84" };
144
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Vitest", version: "0.4.1" };
145
145
  static of(project) {
146
146
  const isVitest = (c) => c instanceof Vitest;
147
147
  return project.components.find(isVitest);
@@ -197,7 +197,7 @@ class Vitest extends component_1.Component {
197
197
  this.coverageProvider = options.config?.coverageProvider ?? CoverageProvider.V8;
198
198
  this.coverageReporters = options.config?.coverageReporters ?? [CoverageReporter.TEXT, CoverageReporter.LCOV];
199
199
  this.coverageDirectory = options.config?.coverageDirectory ?? "coverage";
200
- this.version = options.vitestVersion ?? "^4";
200
+ this.version = options.vitestVersion ?? "^5";
201
201
  this.updateSnapshots = options.config?.updateSnapshots ?? true;
202
202
  this.printConsoleTrace = options.config?.printConsoleTrace ?? true;
203
203
  this.slowTestThreshold = options.config?.slowTestThreshold ?? 300;
@@ -371,4 +371,4 @@ class Vitest extends component_1.Component {
371
371
  }
372
372
  }
373
373
  exports.Vitest = Vitest;
374
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbXBvbmVudHMvdml0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw0Q0FBOEI7QUFDOUIsZ0RBQWtDO0FBQ2xDLG1DQUFxQztBQUNyQyxvREFBaUQ7QUFDakQsMERBQXlEO0FBQ3pELHNEQUErRDtBQUMvRCxrREFBK0M7QUFDL0Msb0NBQXNEO0FBRXRELElBQVksV0EwQlg7QUExQkQsV0FBWSxXQUFXO0lBQ25COzs7O09BSUc7SUFDSCw0Q0FBNkIsQ0FBQTtJQUU3Qjs7OztPQUlHO0lBQ0gsc0NBQXVCLENBQUE7SUFFdkI7Ozs7T0FJRztJQUNILDhCQUFlLENBQUE7SUFFZjs7T0FFRztJQUNILDRCQUFhLENBQUE7QUFDakIsQ0FBQyxFQTFCVyxXQUFXLDJCQUFYLFdBQVcsUUEwQnRCO0FBRUQsSUFBWSxJQW1DWDtBQW5DRCxXQUFZLElBQUk7SUFDWjs7Ozs7O09BTUc7SUFDSCx1QkFBZSxDQUFBO0lBRWY7Ozs7T0FJRztJQUNILDJCQUFtQixDQUFBO0lBRW5COzs7Ozs7OztPQVFHO0lBQ0gsMkJBQW1CLENBQUE7SUFFbkI7Ozs7O09BS0c7SUFDSCwrQkFBdUIsQ0FBQTtBQUMzQixDQUFDLEVBbkNXLElBQUksb0JBQUosSUFBSSxRQW1DZjtBQUVELElBQVksZ0JBY1g7QUFkRCxXQUFZLGdCQUFnQjtJQUN4Qjs7OztPQUlHO0lBQ0gseUNBQXFCLENBQUE7SUFFckI7Ozs7T0FJRztJQUNILDZCQUFTLENBQUE7QUFDYixDQUFDLEVBZFcsZ0JBQWdCLGdDQUFoQixnQkFBZ0IsUUFjM0I7QUFFRCxJQUFZLGdCQXlCWDtBQXpCRCxXQUFZLGdCQUFnQjtJQUN4Qjs7T0FFRztJQUNILHFDQUFpQixDQUFBO0lBRWpCOztPQUVHO0lBQ0gsaUNBQWEsQ0FBQTtJQUViOztPQUVHO0lBQ0gsaUNBQWEsQ0FB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QUMzQztZQUNELFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ2pDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ2pDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWU7WUFDckMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtZQUN6QyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixpQkFBaUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCO1lBQ3pDLFNBQVMsRUFBRTtnQkFDUCxPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtnQkFDOUIsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7Z0JBQzlCLFFBQVEsRUFBRSxJQUFJLENBQUMsaUJBQWlCO2FBQ25DO1lBQ0QsTUFBTSxFQUFFLElBQUksQ0FBQyxlQUFlO1NBQy9CLENBQUM7SUFDTixDQUFDOztBQWxSTCx3QkFtUkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBhd3NjZGssIGNkayB9IGZyb20gXCJwcm9qZW5cIjtcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gXCJwcm9qZW4vbGliL2NvbXBvbmVudFwiO1xuaW1wb3J0IHsgRGVwZW5kZW5jeVR5cGUgfSBmcm9tIFwicHJvamVuL2xpYi9kZXBlbmRlbmNpZXNcIjtcbmltcG9ydCB7IEplc3QsIHR5cGUgTm9kZVByb2plY3QgfSBmcm9tIFwicHJvamVuL2xpYi9qYXZhc2NyaXB0XCI7XG5pbXBvcnQgeyBUZXh0RmlsZSB9IGZyb20gXCJwcm9qZW4vbGliL3RleHRmaWxlXCI7XG5pbXBvcnQgeyBkZWVwTWVyZ2UsIHRzY29uZmlnRGV2UGF0aCB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5leHBvcnQgZW51bSBFbnZpcm9ubWVudCB7XG4gICAgLyoqXG4gICAgICogUnVuIHRlc3RzIGluIFZlcmNlbCdzIEVkZ2UgUnVudGltZSBWTS5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9lZGdlLXJ1bnRpbWUudmVyY2VsLmFwcC9wYWNrYWdlcy92bVxuICAgICAqL1xuICAgIEVER0VfUlVOVElNRSA9IFwiZWRnZS1ydW50aW1lXCIsXG5cbiAgICAvKipcbiAgICAgKiBSdW4gdGVzdHMgaW4gYGhhcHB5LWRvbWAgZW52aXJvbm1lbnQuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jYXByaWNvcm44Ni9oYXBweS1kb21cbiAgICAgKi9cbiAgICBIQVBQWV9ET00gPSBcImhhcHB5LWRvbVwiLFxuXG4gICAgLyoqXG4gICAgICogUnVuIHRlc3RzIGluIGBqc2RvbWAgZW52aXJvbm1lbnQuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qc2RvbS9qc2RvbVxuICAgICAqL1xuICAgIEpTRE9NID0gXCJqc2RvbVwiLFxuXG4gICAgLyoqXG4gICAgICogUnVuIHRlc3RzIGluIGEgTm9kZS5qcyBlbnZpcm9ubWVudC5cbiAgICAgKi9cbiAgICBOT0RFID0gXCJub2RlXCIsXG59XG5cbmV4cG9ydCBlbnVtIFBvb2wge1xuICAgIC8qKlxuICAgICAqIFJ1biB0ZXN0cyBpbiBgbm9kZTpjaGlsZF9wcm9jZXNzYCB1c2luZyBmb3JrKClcbiAgICAgKlxuICAgICAqIFRlc3QgaXNvbGF0aW9uICh3aGVuIGVuYWJsZWQpIGlzIGRvbmUgYnkgc3Bhd25pbmcgYSBuZXcgY2hpbGQgcHJvY2VzcyBmb3IgZWFjaCB0ZXN0IGZpbGUuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvY2hpbGRfcHJvY2Vzcy5odG1sI2NoaWxkX3Byb2Nlc3Nmb3JrbW9kdWxlcGF0aC1hcmdzLW9wdGlvbnNcbiAgICAgKi9cbiAgICBGT1JLUyA9IFwiZm9ya3NcIixcblxuICAgIC8qKlxuICAgICAqIFJ1biB0ZXN0cyBpbiBgbm9kZTp3b3JrZXJfdGhyZWFkc2AuXG4gICAgICpcbiAgICAgKiBUZXN0IGlzb2xhdGlvbiAod2hlbiBlbmFibGVkKSBpcyBkb25lIGJ5IHNwYXduaW5nIGEgbmV3IHRocmVhZCBmb3IgZWFjaCB0ZXN0IGZpbGUuXG4gICAgICovXG4gICAgVEhSRUFEUyA9IFwidGhyZWFkc1wiLFxuXG4gICAgLyoqXG4gICAgICogUnVuIHRlc3RzIGluIGlzb2xhdGVkIGBub2RlOnZtYC5cbiAgICAgKlxuICAgICAqIFRlc3QgZmlsZXMgYXJlIHJ1biBwYXJhbGxlbCB1c2luZyBgbm9kZTpjaGlsZF9wcm9jZXNzYCBmb3JrKClcbiAgICAgKlxuICAgICAqIFRoaXMgbWFrZXMgdGVzdHMgcnVuIGZhc3RlciwgYnV0IFZNIG1vZHVsZSBpcyB1bnN0YWJsZS4gWW91ciB0ZXN0cyBtaWdodCBsZWFrIG1lbW9yeS5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9jaGlsZF9wcm9jZXNzLmh0bWwjY2hpbGRfcHJvY2Vzc2Zvcmttb2R1bGVwYXRoLWFyZ3Mtb3B0aW9uc1xuICAgICAqL1xuICAgIFZNRk9SS1MgPSBcInZtZm9ya3NcIixcblxuICAgIC8qKlxuICAgICAqIFJ1biB0ZXN0cyBpbiBpc29sYXRlZCBgbm9kZTp2bWAuXG4gICAgICogVGVzdCBmaWxlcyBhcmUgcnVuIHBhcmFsbGVsIHVzaW5nIGBub2RlOndvcmtlcl90aHJlYWRzYC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWFrZXMgdGVzdHMgcnVuIGZhc3RlciwgYnV0IFZNIG1vZHVsZSBpcyB1bnN0YWJsZS4gWW91ciB0ZXN0cyBtaWdodCBsZWFrIG1lbW9yeS5cbiAgICAgKi9cbiAgICBWTVRIUkVBRFMgPSBcInZtdGhyZWFkc1wiLFxufVxuXG5leHBvcnQgZW51bSBDb3ZlcmFnZVByb3ZpZGVyIHtcbiAgICAvKipcbiAgICAgKiBQcm92aWRlIGNvdmVyYWdlIHJlcG9ydCB1c2luZyBpc3RhbmJ1bC5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9pc3RhbmJ1bC5qcy5vcmdcbiAgICAgKi9cbiAgICBJU1RBTkJVTCA9IFwiaXN0YW5idWxcIixcblxuICAgIC8qKlxuICAgICAqIFByb3ZpZGUgY292ZXJhZ2UgcmVwb3J0cyB1c2luZyB2OC5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly92OC5kZXYvYmxvZy9qYXZhc2NyaXB0LWNvZGUtY292ZXJhZ2VcbiAgICAgKi9cbiAgICBWOCA9IFwidjhcIixcbn1cblxuZXhwb3J0IGVudW0gQ292ZXJhZ2VSZXBvcnRlciB7XG4gICAgLyoqXG4gICAgICogUHJvdmlkZXMgYGNsb3ZlcmAgcmVwb3J0LlxuICAgICAqL1xuICAgIENMT1ZFUiA9IFwiY2xvdmVyXCIsXG5cbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBgSFRNTGAgcmVwb3J0LlxuICAgICAqL1xuICAgIEhUTUwgPSBcImh0bWxcIixcblxuICAgIC8qKlxuICAgICAqIFByb3ZpZGVzIGBKU09OYCByZXBvcnQuXG4gICAgICovXG4gICAgSlNPTiA9IFwianNvblwiLFxuXG4gICAgLyoqXG4gICAgICogUHJvdmlkZXMgYExDT1ZgIHJlcG9ydC5cbiAgICAgKi9cbiAgICBMQ09WID0gXCJsY292XCIsXG5cbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBgdGV4dGAgcmVwb3J0LlxuICAgICAqL1xuICAgIFRFWFQgPSBcInRleHRcIixcbn1cblxuLyoqXG4gKiBWaXRlc3QgQ29uZmlnLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly92aXRlc3QuZGV2L2NvbmZpZy9cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaXRlc3RDb25maWdPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZ2xvYiBwYXR0ZXJucyB0aGF0IG1hdGNoIHlvdXIgdGVzdCBmaWxlcy5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IC0gVml0ZXN0J3MgYGNvbmZpZ0RlZmF1bHRzLmluY2x1ZGVgXG4gICAgICogQHNlZSBodHRwczovL3ZpdGVzdC5kZXYvY29uZmlnLyNpbmNsdWRlXG4gICAgICovXG4gICAgcmVhZG9ubHkgaW5jbHVkZT86IEFycmF5PHN0cmluZz47XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZ2xvYiBwYXR0ZXJucyB0aGF0IHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHlvdXIgdGVzdCBmaWxlcy5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IC0gVml0ZXN0J3MgYGNvbmZpZ0RlZmF1bHRzLmV4Y2x1ZGVgXG4gICAgICogQHNlZSBodHRwczovL3ZpdGVzdC5kZXYvY29uZmlnLyNleGNsdWRlXG4gICAgICovXG4gICAgcmVhZG9ubHkgZXhjbHVkZT86IEFycmF5PHN0cmluZz47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZW52aXJvbm1lbnQgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRlc3RpbmcuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBcIm5vZGVcIlxuICAgICAqIEBzZWUgaHR0cHM6Ly92aXRlc3QuZGV2L2NvbmZpZy8jZW52aXJvbm1lbnRcbiAgICAgKi9cbiAgICByZWFkb25seSBlbnZpcm9ubWVudD86IEVudmlyb25tZW50O1xuXG4gICAgLyoqXG4gICAgICogUnVuIHRlc3RzIGluIGFuIGlzb2xhdGVkIGVudmlyb25tZW50LiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHZtVGhyZWFkcyBwb29sLlxuICAgICAqXG4gICAgICogRGlzYWJsaW5nIHRoaXMgb3B0aW9uIG1pZ2h0IGltcHJvdmUgcGVyZm9ybWFuY2UgaWYgeW91ciBjb2RlIGRvZXNuJ3QgcmVseSBvbiBzaWRlIGVmZmVjdHMuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICogQHNlZSBodHRwczovL3ZpdGVzdC5kZXYvY29uZmlnLyNpc29sYXRlXG4gICAgICovXG4gICAgcmVhZG9ubHkgaXNvbGF0ZT86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBQb29sIHVzZWQgdG8gcnVuIHRlc3RzIGluLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgXCJmb3Jrc1wiXG4gICAgICogQHNlZSBodHRwczovL3ZpdGVzdC5kZXYvY29uZmlnLyNwb29sXG4gICAgICovXG4gICAgcmVhZG9ubHkgcG9vbD86IFBvb2w7XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBhcGlzIGdsb2JhbGx5LiBJZiB5b3UgcHJlZmVyIHRvIHVzZSB0aGUgQVBJcyBnbG9iYWxseSBsaWtlIEplc3QsIHNldCB0byBgdHJ1ZWAuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqIEBzZWUgaHR0cHM6Ly92aXRlc3QuZGV2L2NvbmZpZy8jZ2xvYmFsc1xuICAgICAqL1xuICAgIHJlYWRvbmx5IGdsb2JhbHM/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQ292ZXJhZ2UgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgKiBAc2VlIGh0dHBzOi8vdml0ZXN0LmRldi9jb25maWcvI2NvdmVyYWdlLWVuYWJsZWRcbiAgICAgKi9cbiAgICByZWFkb25seSBjb3ZlcmFnZUVuYWJsZWQ/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQ292ZXJhZ2UgcHJvdmlkZXIgdHlwZS5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IFwidjhcIlxuICAgICAqIEBzZWUgaHR0cHM6Ly92aXRlc3QuZGV2L2NvbmZpZy8jY292ZXJhZ2UtcHJvdmlkZXJcbiAgICAgKi9cbiAgICByZWFkb25seSBjb3ZlcmFnZVByb3ZpZGVyPzogQ292ZXJhZ2VQcm92aWRlcjtcblxuICAgIC8qKlxuICAgICAqIENvdmVyYWdlIHJlcG9ydGVycy5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0ICdbXCJ0ZXh0XCIsIFwibGNvdlwiXSdcbiAgICAgKiBAc2VlIGh0dHBzOi8vdml0ZXN0LmRldi9jb25maWcvI2NvdmVyYWdlLXJlcG9ydGVyXG4gICAgICovXG4gICAgcmVhZG9ubHkgY292ZXJhZ2VSZXBvcnRlcnM/OiBBcnJheTxDb3ZlcmFnZVJlcG9ydGVyPjtcblxuICAgIC8qKlxuICAgICAqIENvdmVyYWdlIG91dHB1dCBkaXJlY3RvcnkuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBcImNvdmVyYWdlXCJcbiAgICAgKi9cbiAgICByZWFkb25seSBjb3ZlcmFnZURpcmVjdG9yeT86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEVuYWJsZSB0eXBlY2hlY2tpbmcgYWxvbmdzaWRlIHlvdXIgcmVndWxhciB0ZXN0cy5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IHRydWUgKGZvciBUeXBlU2NyaXB0IHByb2plY3RzKVxuICAgICAqIEBzZWUgaHR0cHM6Ly92aXRlc3QuZGV2L2NvbmZpZy8jdHlwZWNoZWNrLWVuYWJsZWRcbiAgICAgKi9cbiAgICByZWFkb25seSB0eXBlY2hlY2tFbmFibGVkPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFRvb2wgdG8gdXNlIGZvciB0eXBlIGNoZWNraW5nLiBDaGVja2VyIHNob3VsZCBpbXBsZW1lbnQgdGhlIHNhbWUgb3V0cHV0IGZvcm1hdCBhcyBgdHNjYC5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IFwidHNjIC0tbm9FbWl0XCJcbiAgICAgKiBAc2VlIGh0dHBzOi8vdml0ZXN0LmRldi9jb25maWcvI3R5cGVjaGVjay1jaGVja2VyXG4gICAgICovXG4gICAgcmVhZG9ubHkgdHlwZWNoZWNrQ2hlY2tlcj86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFBhdGggdG8gY3VzdG9tIHRzY29uZmlnLCByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCByb290LlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgLSB0aGUgcHJvamVjdCdzIGRldmVsb3BtZW50IHRzY29uZmlnIChlLmcuIFwidGVzdC90c2NvbmZpZy5qc29uXCIpXG4gICAgICogQHNlZSBodHRwczovL3ZpdGVzdC5kZXYvY29uZmlnLyN0eXBlY2hlY2stdHNjb25maWdcbiAgICAgKi9cbiAgICByZWFkb25seSB0eXBlY2hlY2tUc2NvbmZpZz86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFZpdGVzdCB3aWxsIG5vdCBmYWlsLCBpZiBubyB0ZXN0cyB3aWxsIGJlIGZvdW5kLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqIEBzZWUgaHR0cHM6Ly92aXRlc3QuZGV2L2NvbmZpZy8jcGFzc3dpdGhub3Rlc3RzXG4gICAgICovXG4gICAgcmVhZG9ubHkgcGFzc1dpdGhOb1Rlc3RzPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFN0b3AgcnVubmluZyB0ZXN0cyBhZnRlciBjZXJ0YWluIG51bWJlciBvZiBmYWlsdXJlcy5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IDBcbiAgICAgKiBAc2VlIGh0dHBzOi8vdml0ZXN0LmRldi9jb25maWcvI2JhaWxcbiAgICAgKi9cbiAgICByZWFkb25seSBiYWlsPzogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHNuYXBzaG90IGZpbGVzLiBUaGlzIHdpbGwgdXBkYXRlIGFsbCBjaGFuZ2VkIHNuYXBzaG90cyBhbmQgZGVsZXRlIG9ic29sZXRlIG9uZXMuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICogQHNlZSBodHRwczovL3ZpdGVzdC5kZXYvZ3VpZGUvc25hcHNob3QuaHRtbCN1cGRhdGluZy1zbmFwc2hvdHNcbiAgICAgKi9cbiAgICByZWFkb25seSB1cGRhdGVTbmFwc2hvdHM/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQWx3YXlzIHByaW50IGNvbnNvbGUgdHJhY2VzIHdoZW4gY2FsbGluZyBhbnkgY29uc29sZSBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICogQHNlZSBodHRwczovL3ZpdGVzdC5kZXYvY29uZmlnLyNjb25zb2xldHJhY2VcbiAgICAgKi9cbiAgICByZWFkb25seSBwcmludENvbnNvbGVUcmFjZT86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCBhIHRlc3Qgb3Igc3VpdGUgaXMgY29uc2lkZXJlZCBzbG93LlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgMzAwXG4gICAgICogQHNlZSBodHRwczovL3ZpdGVzdC5kZXYvY29uZmlnLyNzbG93dGVzdHRocmVzaG9sZFxuICAgICAqL1xuICAgIHJlYWRvbmx5IHNsb3dUZXN0VGhyZXNob2xkPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZpdGVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIENvbmZpZyBmaWxlIHBhdGguXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBcInZpdGVzdC5jb25maWcudHNcIlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGNvbmZpZ0ZpbGVQYXRoPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbCBjb25maWcgb3B0aW9ucy5cbiAgICAgKi9cbiAgICByZWFkb25seSBjb25maWc/OiBWaXRlc3RDb25maWdPcHRpb25zO1xuXG4gICAgLyoqXG4gICAgICogVml0ZXN0IHZlcnNpb24uXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBcIl40XCJcbiAgICAgKi9cbiAgICByZWFkb25seSB2aXRlc3RWZXJzaW9uPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQWRkaXRpb25hbCBgdGVzdGAgb3B0aW9ucyBmb3Igc2V0dGluZ3MgdGhhdCBgY29uZmlnYCBkb2Vzbid0IGNvdmVyLCBzdWNoIGFzIGBzZXR1cEZpbGVzYCBvciBgZXhwZWN0YC5cbiAgICAgKlxuICAgICAqIERlZXAtbWVyZ2VkIG92ZXIgdGhlIG9wdGlvbnMgZ2VuZXJhdGVkIGZyb20gYGNvbmZpZ2A6IG9iamVjdHMgYXJlIG1lcmdlZCwgb3RoZXIgdmFsdWVzIChpbmNsdWRpbmdcbiAgICAgKiBhcnJheXMpIHJlcGxhY2UgdGhlIGdlbmVyYXRlZCB2YWx1ZS4gVmFsdWVzIGFyZSByZW5kZXJlZCBhcyBKU09OLCBzbyB0aGV5IG11c3QgYmUgSlNPTi1zZXJpYWxpemFibGVcbiAgICAgKiAobm8gZnVuY3Rpb25zIG9yIHJlZ3VsYXIgZXhwcmVzc2lvbnMpLlxuICAgICAqXG4gICAgICogQGV4YW1wbGUgeyBzZXR1cEZpbGVzOiBbXCJ0ZXN0L3NldHVwLnRzXCJdLCBleHBlY3Q6IHsgcmVxdWlyZUFzc2VydGlvbnM6IHRydWUgfSB9XG4gICAgICogQGRlZmF1bHQgLSBubyBhZGRpdGlvbmFsIHRlc3Qgb3B0aW9uc1xuICAgICAqIEBzZWUgaHR0cHM6Ly92aXRlc3QuZGV2L2NvbmZpZy9cbiAgICAgKi9cbiAgICByZWFkb25seSBleHRyYVRlc3RDb25maWc/OiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfTtcblxuICAgIC8qKlxuICAgICAqIEFkZGl0aW9uYWwgdG9wLWxldmVsIGNvbmZpZyBvcHRpb25zLCBuZXh0IHRvIGB0ZXN0YCwgc3VjaCBhcyBgcmVzb2x2ZWAuXG4gICAgICpcbiAgICAgKiBWYWx1ZXMgYXJlIHJlbmRlcmVkIGFzIEpTT04sIHNvIHRoZXkgbXVzdCBiZSBKU09OLXNlcmlhbGl6YWJsZSAobm8gZnVuY3Rpb25zIG9yIHJlZ3VsYXIgZXhwcmVzc2lvbnMsXG4gICAgICogd2hpY2ggcnVsZXMgb3V0IHBsdWdpbnMpLiBVc2UgYGV4dHJhVGVzdENvbmZpZ2AgZm9yIGB0ZXN0YCBvcHRpb25zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGUgeyByZXNvbHZlOiB7IGFsaWFzOiB7IFwiQFwiOiBcIi9zcmNcIiB9IH0gfVxuICAgICAqIEBkZWZhdWx0IC0gbm8gYWRkaXRpb25hbCB0b3AtbGV2ZWwgb3B0aW9uc1xuICAgICAqIEBzZWUgaHR0cHM6Ly92aXRlc3QuZGV2L2NvbmZpZy9cbiAgICAgKi9cbiAgICByZWFkb25seSBleHRyYUNvbmZpZz86IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9O1xufVxuXG5leHBvcnQgY2xhc3MgVml0ZXN0IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBwdWJsaWMgc3RhdGljIG9mKHByb2plY3Q6IE5vZGVQcm9qZWN0KTogVml0ZXN0IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3QgaXNWaXRlc3QgPSAoYzogQ29tcG9uZW50KTogYyBpcyBWaXRlc3QgPT4gYyBpbnN0YW5jZW9mIFZpdGVzdDtcbiAgICAgICAgcmV0dXJuIHByb2plY3QuY29tcG9uZW50cy5maW5kKGlzVml0ZXN0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZ0ZpbGVQYXRoOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBpbmNsdWRlOiBTZXQ8c3RyaW5nPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV4Y2x1ZGU6IFNldDxzdHJpbmc+O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaXNvbGF0ZTogYm9vbGVhbjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBvb2w6IFBvb2w7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjb3ZlcmFnZUVuYWJsZWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSByZWFkb25seSB0eXBlY2hlY2tFbmFibGVkOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdHlwZWNoZWNrQ2hlY2tlcjogc3RyaW5nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdHlwZWNoZWNrVHNjb25maWc6IHN0cmluZztcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhc3NXaXRoTm9UZXN0czogYm9vbGVhbjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJhaWw6IG51bWJlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZVNuYXBzaG90czogYm9vbGVhbjtcbiAgICBwcml2YXRlIGVudmlyb25tZW50OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBnbG9iYWxzOiBib29sZWFuO1xuICAgIHByaXZhdGUgY292ZXJhZ2VQcm92aWRlcjogQ292ZXJhZ2VQcm92aWRlcjtcbiAgICBwcml2YXRlIGNvdmVyYWdlUmVwb3J0ZXJzOiBBcnJheTxDb3ZlcmFnZVJlcG9ydGVyPjtcbiAgICBwcml2YXRlIGNvdmVyYWdlRGlyZWN0b3J5OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSB2ZXJzaW9uOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwcmludENvbnNvbGVUcmFjZTogYm9vbGVhbjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNsb3dUZXN0VGhyZXNob2xkOiBudW1iZXI7XG4gICAgcHJpdmF0ZSByZWFkb25seSBleHRyYVRlc3RDb25maWc6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZXh0cmFDb25maWc6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9O1xuXG4gICAgY29uc3RydWN0b3IocHJvamVjdDogTm9kZVByb2plY3QsIG9wdGlvbnM6IFZpdGVzdE9wdGlvbnMgPSB7fSkge1xuICAgICAgICBzdXBlcihwcm9qZWN0KTtcblxuICAgICAgICBpZiAob3B0aW9ucy5leHRyYUNvbmZpZyAmJiBcInRlc3RcIiBpbiBvcHRpb25zLmV4dHJhQ29uZmlnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ2aXRlc3QgZXh0cmFDb25maWcgbXVzdCBub3QgY29udGFpbiBgdGVzdGAsIHVzZSBleHRyYVRlc3RDb25maWcgZm9yIHRlc3Qgb3B0aW9uc1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXh0cmFUZXN0Q29uZmlnID0gb3B0aW9ucy5leHRyYVRlc3RDb25maWcgPz8ge307XG4gICAgICAgIHRoaXMuZXh0cmFDb25maWcgPSBvcHRpb25zLmV4dHJhQ29uZmlnID8/IHt9O1xuXG4gICAgICAgIHRoaXMuY29uZmlnRmlsZVBhdGggPSBvcHRpb25zLmNvbmZpZ0ZpbGVQYXRoID8/IFwidml0ZXN0LmNvbmZpZy50c1wiO1xuICAgICAgICB0aGlzLmluY2x1ZGUgPSBuZXcgU2V0KG9wdGlvbnMuY29uZmlnPy5pbmNsdWRlID8/IFtcIioqLyoue3Rlc3Qsc3BlY30uPyhjfG0pW2p0XXM/KHgpXCJdKTtcbiAgICAgICAgdGhpcy5leGNsdWRlID0gbmV3IFNldChcbiAgICAgICAgICAgIG9wdGlvbnMuY29uZmlnPy5leGNsdWRlID8/IFtcbiAgICAgICAgICAgICAgICBcIioqL25vZGVfbW9kdWxlcy8qKlwiLFxuICAgICAgICAgICAgICAgIFwiKiovZGlzdC8qKlwiLFxuICAgICAgICAgICAgICAgIFwiKiovY3lwcmVzcy8qKlwiLFxuICAgICAgICAgICAgICAgIFwiKiovLntpZGVhLGdpdCxjYWNoZSxvdXRwdXQsdGVtcH0vKipcIixcbiAgICAgICAgICAgICAgICBcIioqL3trYXJtYSxyb2xsdXAsd2VicGFjayx2aXRlLHZpdGVzdCxqZXN0LGF2YSxiYWJlbCxueWMsY3lwcmVzcyx0c3VwLGJ1aWxkLGVzbGludCxwcmV0dGllcn0uY29uZmlnLipcIixcbiAgICAgICAgICAgIF0sXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaXNvbGF0ZSA9IG9wdGlvbnMuY29uZmlnPy5pc29sYXRlID8/IHRydWU7XG4gICAgICAgIHRoaXMucG9vbCA9IG9wdGlvbnMuY29uZmlnPy5wb29sID8/IFBvb2wuRk9SS1M7XG4gICAgICAgIHRoaXMuY292ZXJhZ2VFbmFibGVkID0gb3B0aW9ucy5jb25maWc/LmNvdmVyYWdlRW5hYmxlZCA/PyB0cnVlO1xuICAgICAgICB0aGlzLnR5cGVjaGVja0VuYWJsZWQgPSBvcHRpb25zLmNvbmZpZz8udHlwZWNoZWNrRW5hYmxlZCA/PyB0aGlzLmlzVHlwZXNjcmlwdFByb2plY3QoKTtcbiAgICAgICAgdGhpcy50eXBlY2hlY2tDaGVja2VyID0gb3B0aW9ucy5jb25maWc/LnR5cGVjaGVja0NoZWNrZXIgPz8gXCJ0c2MgLS1ub0VtaXRcIjtcbiAgICAgICAgdGhpcy50eXBlY2hlY2tUc2NvbmZpZyA9IG9wdGlvbnMuY29uZmlnPy50eXBlY2hlY2tUc2NvbmZpZyA/PyB0c2NvbmZpZ0RldlBhdGgocHJvamVjdCk7XG4gICAgICAgIHRoaXMucGFzc1dpdGhOb1Rlc3RzID0gb3B0aW9ucy5jb25maWc/LnBhc3NXaXRoTm9UZXN0cyA/PyB0cnVlO1xuICAgICAgICB0aGlzLmJhaWwgPSBvcHRpb25zLmNvbmZpZz8uYmFpbCA/PyAwO1xuICAgICAgICB0aGlzLmVudmlyb25tZW50ID0gb3B0aW9ucy5jb25maWc/LmVudmlyb25tZW50ID8/IEVudmlyb25tZW50Lk5PREU7XG4gICAgICAgIHRoaXMuZ2xvYmFscyA9IG9wdGlvbnMuY29uZmlnPy5nbG9iYWxzID8/IGZhbHNlO1xuICAgICAgICB0aGlzLmNvdmVyYWdlUHJvdmlkZXIgPSBvcHRpb25zLmNvbmZpZz8uY292ZXJhZ2VQcm92aWRlciA/PyBDb3ZlcmFnZVByb3ZpZGVyLlY4O1xuICAgICAgICB0aGlzLmNvdmVyYWdlUmVwb3J0ZXJzID0gb3B0aW9ucy5jb25maWc/LmNvdmVyYWdlUmVwb3J0ZXJzID8/IFtDb3ZlcmFnZVJlcG9ydGVyLlRFWFQsIENvdmVyYWdlUmVwb3J0ZXIuTENPVl07XG4gICAgICAgIHRoaXMuY292ZXJhZ2VEaXJlY3RvcnkgPSBvcHRpb25zLmNvbmZpZz8uY292ZXJhZ2VEaXJlY3RvcnkgPz8gXCJjb3ZlcmFnZVwiO1xuICAgICAgICB0aGlzLnZlcnNpb24gPSBvcHRpb25zLnZpdGVzdFZlcnNpb24gPz8gXCJeNFwiO1xuICAgICAgICB0aGlzLnVwZGF0ZVNuYXBzaG90cyA9IG9wdGlvbnMuY29uZmlnPy51cGRhdGVTbmFwc2hvdHMgPz8gdHJ1ZTtcbiAgICAgICAgdGhpcy5wcmludENvbnNvbGVUcmFjZSA9IG9wdGlvbnMuY29uZmlnPy5wcmludENvbnNvbGVUcmFjZSA/PyB0cnVlO1xuICAgICAgICB0aGlzLnNsb3dUZXN0VGhyZXNob2xkID0gb3B0aW9ucy5jb25maWc/LnNsb3dUZXN0VGhyZXNob2xkID8/IDMwMDtcblxuICAgICAgICBwcm9qZWN0LmFkZERldkRlcHMoYHZpdGVzdEAke3RoaXMudmVyc2lvbn1gKTtcbiAgICAgICAgdGhpcy5jb25maWd1cmVDb3ZlcmFnZVByb3ZpZGVyKHRoaXMuY292ZXJhZ2VQcm92aWRlcik7XG5cbiAgICAgICAgaWYgKHRoaXMuZ2xvYmFscyAmJiB0aGlzLmlzVHlwZXNjcmlwdFByb2plY3QoKSAmJiB0aGlzLnByb2plY3QudHJ5RmluZE9iamVjdEZpbGUodGhpcy50eXBlY2hlY2tUc2NvbmZpZykpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJlR2xvYmFscygpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY292ZXJhZ2VEaXJlY3RvcnlQYXRoID0gcGF0aC5wb3NpeC5qb2luKFwiL1wiLCB0aGlzLmNvdmVyYWdlRGlyZWN0b3J5LCBcIi9cIik7XG4gICAgICAgIHByb2plY3QubnBtaWdub3JlPy5leGNsdWRlKGNvdmVyYWdlRGlyZWN0b3J5UGF0aCk7XG4gICAgICAgIHByb2plY3QuZ2l0aWdub3JlLmV4Y2x1ZGUoY292ZXJhZ2VEaXJlY3RvcnlQYXRoKTtcblxuICAgICAgICB0aGlzLmFkZFRlc3RDb21tYW5kKCk7XG4gICAgICAgIHRoaXMuc3ludGhlc2l6ZUNvbmZpZygpO1xuXG4gICAgICAgIGlmIChwcm9qZWN0IGluc3RhbmNlb2YgY2RrLkpzaWlQcm9qZWN0IHx8IHByb2plY3QgaW5zdGFuY2VvZiBhd3NjZGsuQXdzQ2RrQ29uc3RydWN0TGlicmFyeSkge1xuICAgICAgICAgICAgcHJvamVjdC5ucG1pZ25vcmU/LmFkZFBhdHRlcm5zKFwidml0ZXN0LmNvbmZpZy50c1wiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBwcmVTeW50aGVzaXplKCkge1xuICAgICAgICBzdXBlci5wcmVTeW50aGVzaXplKCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgdGhpcy5wcm9qZWN0LmNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBKZXN0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidml0ZXN0IGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggamVzdFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJ1bnMgYWZ0ZXIgcHJvamVuJ3Mgc2FtcGxlIGNvZGUgY29tcG9uZW50LCB3aGljaCBpcyBhZGRlZCBpbiB0aGUgcHJvamVjdCBjb25zdHJ1Y3RvciBiZWZvcmVcbiAgICAgKiBhbnkgY29tcG9uZW50LCBzbyB0aGUgc2FtcGxlIHRlc3QgZXhpc3RzIGJ5IG5vdy4gYHBvc3RTeW50aGVzaXplYCB3b3VsZCBiZSB0b28gbGF0ZSB0byByZWx5XG4gICAgICogb246IHByb2plbiBza2lwcyBpdCB3aGVuIGBQUk9KRU5fRElTQUJMRV9QT1NUYCBpcyBzZXQuXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIHN5bnRoZXNpemUoKSB7XG4gICAgICAgIHN1cGVyLnN5bnRoZXNpemUoKTtcblxuICAgICAgICB0aGlzLmltcG9ydFZpdGVzdEluU2FtcGxlVGVzdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1ha2VzIHRoZSBzYW1wbGUgdGVzdCBvZiBBV1MgQ0RLIGFwcHMgd29yayB3aXRoIFZpdGVzdC5cbiAgICAgKlxuICAgICAqIFByb2plbiB3cml0ZXMgYDx0ZXN0ZGlyPi88ZW50cnlwb2ludD4udGVzdC50c2AgZm9yIEFXUyBDREsgVHlwZVNjcmlwdCBhcHBzIHdoZW5ldmVyIHRoZSB0ZXN0XG4gICAgICogZGlyZWN0b3J5IGNvbnRhaW5zIG5vIFR5cGVTY3JpcHQgZmlsZXMuIFRoZSB0ZXN0IHVzZXMgdGhlIEplc3QgZ2xvYmFscyBgdGVzdGAgYW5kIGBleHBlY3RgLFxuICAgICAqIHdoaWNoIGRvbid0IGV4aXN0IHdpdGggVml0ZXN0IHVubGVzcyBgZ2xvYmFsc2AgaXMgZW5hYmxlZCwgc28gaW1wb3J0IHRoZW0gZnJvbSBgdml0ZXN0YC5cbiAgICAgKlxuICAgICAqIE9ubHkgYSBmaWxlIHRoYXQgc3RpbGwgbWF0Y2hlcyBwcm9qZW4ncyBzYW1wbGUgaXMgY2hhbmdlZCwgbmV2ZXIgYSB0ZXN0IHdyaXR0ZW4gYnkgaGFuZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGltcG9ydFZpdGVzdEluU2FtcGxlVGVzdCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZ2xvYmFscyB8fCAhKHRoaXMucHJvamVjdCBpbnN0YW5jZW9mIGF3c2Nkay5Bd3NDZGtUeXBlU2NyaXB0QXBwKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJvamVjdCA9IHRoaXMucHJvamVjdDtcbiAgICAgICAgY29uc3QgZW50cnlwb2ludE5hbWUgPSBwYXRoLmJhc2VuYW1lKHByb2plY3QuYXBwRW50cnlwb2ludCwgXCIudHNcIik7XG4gICAgICAgIGNvbnN0IHRlc3RQYXRoID0gcGF0aC5qb2luKHByb2plY3Qub3V0ZGlyLCBwcm9qZWN0LnRlc3RkaXIsIGAke2VudHJ5cG9pbnROYW1lfS50ZXN0LnRzYCk7XG5cbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRlc3RQYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2FtcGxlSW1wb3J0cyA9XG4gICAgICAgICAgICBcImltcG9ydCB7IEFwcCB9IGZyb20gJ2F3cy1jZGstbGliJztcXG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gJ2F3cy1jZGstbGliL2Fzc2VydGlvbnMnO1xcblwiO1xuICAgICAgICBjb25zdCBjb250ZW50cyA9IGZzLnJlYWRGaWxlU3luYyh0ZXN0UGF0aCwgXCJ1dGYtOFwiKTtcblxuICAgICAgICBjb25zdCBpc1NhbXBsZSA9IGNvbnRlbnRzLnN0YXJ0c1dpdGgoc2FtcGxlSW1wb3J0cykgJiYgY29udGVudHMuaW5jbHVkZXMoXCJcXG50ZXN0KCdTbmFwc2hvdCcsICgpID0+IHtcIik7XG4gICAgICAgIGlmICghaXNTYW1wbGUgfHwgY29udGVudHMuaW5jbHVkZXMoXCJmcm9tICd2aXRlc3QnXCIpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICAgICAgdGVzdFBhdGgsXG4gICAgICAgICAgICBjb250ZW50cy5yZXBsYWNlKHNhbXBsZUltcG9ydHMsIGAke3NhbXBsZUltcG9ydHN9aW1wb3J0IHsgZXhwZWN0LCB0ZXN0IH0gZnJvbSAndml0ZXN0JztcXG5gKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkSW5jbHVkZShwYXR0ZXJuOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbmNsdWRlLmFkZChwYXR0ZXJuKTtcbiAgICAgICAgdGhpcy5zeW50aGVzaXplQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEV4Y2x1ZGUocGF0dGVybjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZXhjbHVkZS5hZGQocGF0dGVybik7XG4gICAgICAgIHRoaXMuc3ludGhlc2l6ZUNvbmZpZygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb25maWd1cmVFbnZpcm9ubWVudChlbnZpcm9ubWVudDogRW52aXJvbm1lbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudCA9IGVudmlyb25tZW50O1xuICAgICAgICB0aGlzLnN5bnRoZXNpemVDb25maWcoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29uZmlndXJlQ292ZXJhZ2VQcm92aWRlcihwcm92aWRlcjogQ292ZXJhZ2VQcm92aWRlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBwcm92aWRlclBhY2thZ2VzID0ge1xuICAgICAgICAgICAgW0NvdmVyYWdlUHJvdmlkZXIuVjhdOiBgQHZpdGVzdC9jb3ZlcmFnZS12OEAke3RoaXMudmVyc2lvbn1gLFxuICAgICAgICAgICAgW0NvdmVyYWdlUHJvdmlkZXIuSVNUQU5CVUxdOiBgQHZpdGVzdC9jb3ZlcmFnZS1pc3RhbmJ1bEAke3RoaXMudmVyc2lvbn1gLFxuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAoY29uc3QgcHJvdmlkZXJQYWNrYWdlIG9mIE9iamVjdC52YWx1ZXMocHJvdmlkZXJQYWNrYWdlcykpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9qZWN0LmRlcHMucmVtb3ZlRGVwZW5kZW5jeShwcm92aWRlclBhY2thZ2UpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnByb2plY3QuZGVwcy5hZGREZXBlbmRlbmN5KHByb3ZpZGVyUGFja2FnZXNbcHJvdmlkZXJdLCBEZXBlbmRlbmN5VHlwZS5ERVZFTlYpO1xuICAgICAgICB0aGlzLmNvdmVyYWdlUHJvdmlkZXIgPSBwcm92aWRlcjtcbiAgICAgICAgdGhpcy5zeW50aGVzaXplQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbmZpZ3VyZUNvdmVyYWdlUmVwb3J0ZXJzKHJlcG9ydGVyczogQXJyYXk8Q292ZXJhZ2VSZXBvcnRlcj4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb3ZlcmFnZVJlcG9ydGVycyA9IHJlcG9ydGVycztcbiAgICAgICAgdGhpcy5zeW50aGVzaXplQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbmZpZ3VyZUdsb2JhbHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudXBkYXRlVHNDb25maWcoKTtcbiAgICAgICAgdGhpcy5zeW50aGVzaXplQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVUc0NvbmZpZygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdHNjb25maWcgPSB0aGlzLnByb2plY3QudHJ5RmluZE9iamVjdEZpbGUodGhpcy50eXBlY2hlY2tUc2NvbmZpZyk7XG5cbiAgICAgICAgaWYgKCF0c2NvbmZpZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidW5hYmxlIHRvIGZpbmQgdHNjb25maWdcIik7XG4gICAgICAgIH1cblxuICAgICAgICB0c2NvbmZpZy5hZGRUb0FycmF5KFwiY29tcGlsZXJPcHRpb25zLnR5cGVzXCIsIFwidml0ZXN0L2dsb2JhbHNcIik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1R5cGVzY3JpcHRQcm9qZWN0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9qZWN0LmRlcHMudHJ5R2V0RGVwZW5kZW5jeShcInR5cGVzY3JpcHRcIikgIT09IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZFRlc3RDb21tYW5kKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnByb2plY3QudGVzdFRhc2suZXhlYyhcInZpdGVzdCBydW5cIiwge1xuICAgICAgICAgICAgcmVjZWl2ZUFyZ3M6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHRlc3RXYXRjaCA9IHRoaXMucHJvamVjdC50YXNrcy50cnlGaW5kKFwidGVzdDp3YXRjaFwiKTtcbiAgICAgICAgaWYgKCF0ZXN0V2F0Y2gpIHtcbiAgICAgICAgICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKFwidGVzdDp3YXRjaFwiLCB7XG4gICAgICAgICAgICAgICAgZXhlYzogXCJ2aXRlc3Qgd2F0Y2hcIixcbiAgICAgICAgICAgICAgICByZWNlaXZlQXJnczogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGVzdFVwZGF0ZVNuYXBzaG90cyA9IHRoaXMucHJvamVjdC50YXNrcy50cnlGaW5kKFwidGVzdDp1cGRhdGVcIik7XG4gICAgICAgIGlmICghdGVzdFVwZGF0ZVNuYXBzaG90cykge1xuICAgICAgICAgICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soXCJ0ZXN0OnVwZGF0ZVwiLCB7XG4gICAgICAgICAgICAgICAgZXhlYzogXCJ2aXRlc3QgLS11cGRhdGVcIixcbiAgICAgICAgICAgICAgICByZWNlaXZlQXJnczogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzeW50aGVzaXplQ29uZmlnKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnByb2plY3QudHJ5UmVtb3ZlRmlsZSh0aGlzLmNvbmZpZ0ZpbGVQYXRoKTtcblxuICAgICAgICBuZXcgVGV4dEZpbGUodGhpcywgdGhpcy5jb25maWdGaWxlUGF0aCwge1xuICAgICAgICAgICAgbGluZXM6IHRoaXMucmVuZGVyQ29uZmlnKCksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVuZGVyQ29uZmlnKCk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICBjb25zdCBwcm9qZWN0ID0gdGhpcy5wcm9qZWN0IGFzIE5vZGVQcm9qZWN0O1xuICAgICAgICBjb25zdCBwYWNrYWdlTmFtZSA9IHByb2plY3QucGFja2FnZS5wYWNrYWdlTmFtZTtcbiAgICAgICAgY29uc3QgZGVmaW5lQ29uZmlnSW1wb3J0ID1cbiAgICAgICAgICAgIHBhY2thZ2VOYW1lID09PSBcIkBuaWtvdmlydGFsYS9wcm9qZW4tY29uc3RydWN0c1wiXG4gICAgICAgICAgICAgICAgPyAnaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSBcIi4vbGliL3ZpdGVzdC1kZWZpbmUtY29uZmlnXCI7J1xuICAgICAgICAgICAgICAgIDogJ2ltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gXCJAbmlrb3ZpcnRhbGEvcHJvamVuLWNvbnN0cnVjdHMvbGliL3ZpdGVzdC1kZWZpbmUtY29uZmlnXCI7JztcblxuICAgICAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICAgICAgICAuLi50aGlzLmV4dHJhQ29uZmlnLFxuICAgICAgICAgICAgdGVzdDogZGVlcE1lcmdlPFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih0aGlzLnJlbmRlclRlc3RPcHRpb25zKCksIHRoaXMuZXh0cmFUZXN0Q29uZmlnKSxcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gW2RlZmluZUNvbmZpZ0ltcG9ydCwgXCJcIiwgYGV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZygke0pTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMil9KTtgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbmRlclRlc3RPcHRpb25zKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJhaWw6IHRoaXMuYmFpbCxcbiAgICAgICAgICAgIGNvdmVyYWdlOiB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZDogdGhpcy5jb3ZlcmFnZUVuYWJsZWQsXG4gICAgICAgICAgICAgICAgcHJvdmlkZXI6IHRoaXMuY292ZXJhZ2VQcm92aWRlcixcbiAgICAgICAgICAgICAgICByZXBvcnRlcjogdGhpcy5jb3ZlcmFnZVJlcG9ydGVycyxcbiAgICAgICAgICAgICAgICByZXBvcnRzRGlyZWN0b3J5OiB0aGlzLmNvdmVyYWdlRGlyZWN0b3J5LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVudmlyb25tZW50OiB0aGlzLmVudmlyb25tZW50LFxuICAgICAgICAgICAgZXhjbHVkZTogQXJyYXkuZnJvbSh0aGlzLmV4Y2x1ZGUpLFxuICAgICAgICAgICAgZ2xvYmFsczogdGhpcy5nbG9iYWxzLFxuICAgICAgICAgICAgaW5jbHVkZTogQXJyYXkuZnJvbSh0aGlzLmluY2x1ZGUpLFxuICAgICAgICAgICAgaXNvbGF0ZTogdGhpcy5pc29sYXRlLFxuICAgICAgICAgICAgcGFzc1dpdGhOb1Rlc3RzOiB0aGlzLnBhc3NXaXRoTm9UZXN0cyxcbiAgICAgICAgICAgIHByaW50Q29uc29sZVRyYWNlOiB0aGlzLnByaW50Q29uc29sZVRyYWNlLFxuICAgICAgICAgICAgcG9vbDogdGhpcy5wb29sLFxuICAgICAgICAgICAgc2xvd1Rlc3RUaHJlc2hvbGQ6IHRoaXMuc2xvd1Rlc3RUaHJlc2hvbGQsXG4gICAgICAgICAgICB0eXBlY2hlY2s6IHtcbiAgICAgICAgICAgICAgICBlbmFibGVkOiB0aGlzLnR5cGVjaGVja0VuYWJsZWQsXG4gICAgICAgICAgICAgICAgY2hlY2tlcjogdGhpcy50eXBlY2hlY2tDaGVja2VyLFxuICAgICAgICAgICAgICAgIHRzY29uZmlnOiB0aGlzLnR5cGVjaGVja1RzY29uZmlnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVwZGF0ZTogdGhpcy51cGRhdGVTbmFwc2hvdHMsXG4gICAgICAgIH07XG4gICAgfVxufVxuIl19
374
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbXBvbmVudHMvdml0ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw0Q0FBOEI7QUFDOUIsZ0RBQWtDO0FBQ2xDLG1DQUFxQztBQUNyQyxvREFBaUQ7QUFDakQsMERBQXlEO0FBQ3pELHNEQUErRDtBQUMvRCxrREFBK0M7QUFDL0Msb0NBQXNEO0FBRXRELElBQVksV0EwQlg7QUExQkQsV0FBWSxXQUFXO0lBQ25COzs7O09BSUc7SUFDSCw0Q0FBNkIsQ0FBQTtJQUU3Qjs7OztPQUlHO0lBQ0gsc0NBQXVCLENBQUE7SUFFdkI7Ozs7T0FJRztJQUNILDhCQUFlLENBQUE7SUFFZjs7T0FFRztJQUNILDRCQUFhLENBQUE7QUFDakIsQ0FBQyxFQTFCVyxXQUFXLDJCQUFYLFdBQVcsUUEwQnRCO0FBRUQsSUFBWSxJQW1DWDtBQW5DRCxXQUFZLElBQUk7SUFDWjs7Ozs7O09BTUc7SUFDSCx1QkFBZSxDQUFBO0lBRWY7Ozs7T0FJRztJQUNILDJCQUFtQixDQUFBO0lBRW5COzs7Ozs7OztPQVFHO0lBQ0gsMkJBQW1CLENBQUE7SUFFbkI7Ozs7O09BS0c7SUFDSCwrQkFBdUIsQ0FBQTtBQUMzQixDQUFDLEVBbkNXLElBQUksb0JBQUosSUFBSSxRQW1DZjtBQUVELElBQVksZ0JBY1g7QUFkRCxXQUFZLGdCQUFnQjtJQUN4Qjs7OztPQUlHO0lBQ0gseUNBQXFCLENBQUE7SUFFckI7Ozs7T0FJRztJQUNILDZCQUFTLENBQUE7QUFDYixDQUFDLEVBZFcsZ0JBQWdCLGdDQUFoQixnQkFBZ0IsUUFjM0I7QUFFRCxJQUFZLGdCQXlCWDtBQXpCRCxXQUFZLGdCQUFnQjtJQUN4Qjs7T0FFRztJQUNILHFDQUFpQixDQUFBO0lBRWpCOztPQUVHO0lBQ0gsaUNBQWEsQ0FBQTtJQUViOztPQUVHO0lBQ0gsaUNBQWEsQ0FB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QUMzQztZQUNELFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ2pDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ2pDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWU7WUFDckMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtZQUN6QyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixpQkFBaUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCO1lBQ3pDLFNBQVMsRUFBRTtnQkFDUCxPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtnQkFDOUIsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7Z0JBQzlCLFFBQVEsRUFBRSxJQUFJLENBQUMsaUJBQWlCO2FBQ25DO1lBQ0QsTUFBTSxFQUFFLElBQUksQ0FBQyxlQUFlO1NBQy9CLENBQUM7SUFDTixDQUFDOztBQWxSTCx3QkFtUkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBhd3NjZGssIGNkayB9IGZyb20gXCJwcm9qZW5cIjtcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gXCJwcm9qZW4vbGliL2NvbXBvbmVudFwiO1xuaW1wb3J0IHsgRGVwZW5kZW5jeVR5cGUgfSBmcm9tIFwicHJvamVuL2xpYi9kZXBlbmRlbmNpZXNcIjtcbmltcG9ydCB7IEplc3QsIHR5cGUgTm9kZVByb2plY3QgfSBmcm9tIFwicHJvamVuL2xpYi9qYXZhc2NyaXB0XCI7XG5pbXBvcnQgeyBUZXh0RmlsZSB9IGZyb20gXCJwcm9qZW4vbGliL3RleHRmaWxlXCI7XG5pbXBvcnQgeyBkZWVwTWVyZ2UsIHRzY29uZmlnRGV2UGF0aCB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5leHBvcnQgZW51bSBFbnZpcm9ubWVudCB7XG4gICAgLyoqXG4gICAgICogUnVuIHRlc3RzIGluIFZlcmNlbCdzIEVkZ2UgUnVudGltZSBWTS5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9lZGdlLXJ1bnRpbWUudmVyY2VsLmFwcC9wYWNrYWdlcy92bVxuICAgICAqL1xuICAgIEVER0VfUlVOVElNRSA9IFwiZWRnZS1ydW50aW1lXCIsXG5cbiAgICAvKipcbiAgICAgKiBSdW4gdGVzdHMgaW4gYGhhcHB5LWRvbWAgZW52aXJvbm1lbnQuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jYXByaWNvcm44Ni9oYXBweS1kb21cbiAgICAgKi9cbiAgICBIQVBQWV9ET00gPSBcImhhcHB5LWRvbVwiLFxuXG4gICAgLyoqXG4gICAgICogUnVuIHRlc3RzIGluIGBqc2RvbWAgZW52aXJvbm1lbnQuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qc2RvbS9qc2RvbVxuICAgICAqL1xuICAgIEpTRE9NID0gXCJqc2RvbVwiLFxuXG4gICAgLyoqXG4gICAgICogUnVuIHRlc3RzIGluIGEgTm9kZS5qcyBlbnZpcm9ubWVudC5cbiAgICAgKi9cbiAgICBOT0RFID0gXCJub2RlXCIsXG59XG5cbmV4cG9ydCBlbnVtIFBvb2wge1xuICAgIC8qKlxuICAgICAqIFJ1biB0ZXN0cyBpbiBgbm9kZTpjaGlsZF9wcm9jZXNzYCB1c2luZyBmb3JrKClcbiAgICAgKlxuICAgICAqIFRlc3QgaXNvbGF0aW9uICh3aGVuIGVuYWJsZWQpIGlzIGRvbmUgYnkgc3Bhd25pbmcgYSBuZXcgY2hpbGQgcHJvY2VzcyBmb3IgZWFjaCB0ZXN0IGZpbGUuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvY2hpbGRfcHJvY2Vzcy5odG1sI2NoaWxkX3Byb2Nlc3Nmb3JrbW9kdWxlcGF0aC1hcmdzLW9wdGlvbnNcbiAgICAgKi9cbiAgICBGT1JLUyA9IFwiZm9ya3NcIixcblxuICAgIC8qKlxuICAgICAqIFJ1biB0ZXN0cyBpbiBgbm9kZTp3b3JrZXJfdGhyZWFkc2AuXG4gICAgICpcbiAgICAgKiBUZXN0IGlzb2xhdGlvbiAod2hlbiBlbmFibGVkKSBpcyBkb25lIGJ5IHNwYXduaW5nIGEgbmV3IHRocmVhZCBmb3IgZWFjaCB0ZXN0IGZpbGUuXG4gICAgICovXG4gICAgVEhSRUFEUyA9IFwidGhyZWFkc1wiLFxuXG4gICAgLyoqXG4gICAgICogUnVuIHRlc3RzIGluIGlzb2xhdGVkIGBub2RlOnZtYC5cbiAgICAgKlxuICAgICAqIFRlc3QgZmlsZXMgYXJlIHJ1biBwYXJhbGxlbCB1c2luZyBgbm9kZTpjaGlsZF9wcm9jZXNzYCBmb3JrKClcbiAgICAgKlxuICAgICAqIFRoaXMgbWFrZXMgdGVzdHMgcnVuIGZhc3RlciwgYnV0IFZNIG1vZHVsZSBpcyB1bnN0YWJsZS4gWW91ciB0ZXN0cyBtaWdodCBsZWFrIG1lbW9yeS5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9jaGlsZF9wcm9jZXNzLmh0bWwjY2hpbGRfcHJvY2Vzc2Zvcmttb2R1bGVwYXRoLWFyZ3Mtb3B0aW9uc1xuICAgICAqL1xuICAgIFZNRk9SS1MgPSBcInZtZm9ya3NcIixcblxuICAgIC8qKlxuICAgICAqIFJ1biB0ZXN0cyBpbiBpc29sYXRlZCBgbm9kZTp2bWAuXG4gICAgICogVGVzdCBmaWxlcyBhcmUgcnVuIHBhcmFsbGVsIHVzaW5nIGBub2RlOndvcmtlcl90aHJlYWRzYC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWFrZXMgdGVzdHMgcnVuIGZhc3RlciwgYnV0IFZNIG1vZHVsZSBpcyB1bnN0YWJsZS4gWW91ciB0ZXN0cyBtaWdodCBsZWFrIG1lbW9yeS5cbiAgICAgKi9cbiAgICBWTVRIUkVBRFMgPSBcInZtdGhyZWFkc1wiLFxufVxuXG5leHBvcnQgZW51bSBDb3ZlcmFnZVByb3ZpZGVyIHtcbiAgICAvKipcbiAgICAgKiBQcm92aWRlIGNvdmVyYWdlIHJlcG9ydCB1c2luZyBpc3RhbmJ1bC5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9pc3RhbmJ1bC5qcy5vcmdcbiAgICAgKi9cbiAgICBJU1RBTkJVTCA9IFwiaXN0YW5idWxcIixcblxuICAgIC8qKlxuICAgICAqIFByb3ZpZGUgY292ZXJhZ2UgcmVwb3J0cyB1c2luZyB2OC5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly92OC5kZXYvYmxvZy9qYXZhc2NyaXB0LWNvZGUtY292ZXJhZ2VcbiAgICAgKi9cbiAgICBWOCA9IFwidjhcIixcbn1cblxuZXhwb3J0IGVudW0gQ292ZXJhZ2VSZXBvcnRlciB7XG4gICAgLyoqXG4gICAgICogUHJvdmlkZXMgYGNsb3ZlcmAgcmVwb3J0LlxuICAgICAqL1xuICAgIENMT1ZFUiA9IFwiY2xvdmVyXCIsXG5cbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBgSFRNTGAgcmVwb3J0LlxuICAgICAqL1xuICAgIEhUTUwgPSBcImh0bWxcIixcblxuICAgIC8qKlxuICAgICAqIFByb3ZpZGVzIGBKU09OYCByZXBvcnQuXG4gICAgICovXG4gICAgSlNPTiA9IFwianNvblwiLFxuXG4gICAgLyoqXG4gICAgICogUHJvdmlkZXMgYExDT1ZgIHJlcG9ydC5cbiAgICAgKi9cbiAgICBMQ09WID0gXCJsY292XCIsXG5cbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBgdGV4dGAgcmVwb3J0LlxuICAgICAqL1xuICAgIFRFWFQgPSBcInRleHRcIixcbn1cblxuLyoqXG4gKiBWaXRlc3QgQ29uZmlnLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly92aXRlc3QuZGV2L2NvbmZpZy9cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaXRlc3RDb25maWdPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZ2xvYiBwYXR0ZXJucyB0aGF0IG1hdGNoIHlvdXIgdGVzdCBmaWxlcy5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IC0gVml0ZXN0J3MgYGNvbmZpZ0RlZmF1bHRzLmluY2x1ZGVgXG4gICAgICogQHNlZSBodHRwczovL3ZpdGVzdC5kZXYvY29uZmlnLyNpbmNsdWRlXG4gICAgICovXG4gICAgcmVhZG9ubHkgaW5jbHVkZT86IEFycmF5PHN0cmluZz47XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZ2xvYiBwYXR0ZXJucyB0aGF0IHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHlvdXIgdGVzdCBmaWxlcy5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IC0gVml0ZXN0J3MgYGNvbmZpZ0RlZmF1bHRzLmV4Y2x1ZGVgXG4gICAgICogQHNlZSBodHRwczovL3ZpdGVzdC5kZXYvY29uZmlnLyNleGNsdWRlXG4gICAgICovXG4gICAgcmVhZG9ubHkgZXhjbHVkZT86IEFycmF5PHN0cmluZz47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZW52aXJvbm1lbnQgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRlc3RpbmcuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBcIm5vZGVcIlxuICAgICAqIEBzZWUgaHR0cHM6Ly92aXRlc3QuZGV2L2NvbmZpZy8jZW52aXJvbm1lbnRcbiAgICAgKi9cbiAgICByZWFkb25seSBlbnZpcm9ubWVudD86IEVudmlyb25tZW50O1xuXG4gICAgLyoqXG4gICAgICogUnVuIHRlc3RzIGluIGFuIGlzb2xhdGVkIGVudmlyb25tZW50LiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHZtVGhyZWFkcyBwb29sLlxuICAgICAqXG4gICAgICogRGlzYWJsaW5nIHRoaXMgb3B0aW9uIG1pZ2h0IGltcHJvdmUgcGVyZm9ybWFuY2UgaWYgeW91ciBjb2RlIGRvZXNuJ3QgcmVseSBvbiBzaWRlIGVmZmVjdHMuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICogQHNlZSBodHRwczovL3ZpdGVzdC5kZXYvY29uZmlnLyNpc29sYXRlXG4gICAgICovXG4gICAgcmVhZG9ubHkgaXNvbGF0ZT86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBQb29sIHVzZWQgdG8gcnVuIHRlc3RzIGluLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgXCJmb3Jrc1wiXG4gICAgICogQHNlZSBodHRwczovL3ZpdGVzdC5kZXYvY29uZmlnLyNwb29sXG4gICAgICovXG4gICAgcmVhZG9ubHkgcG9vbD86IFBvb2w7XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBhcGlzIGdsb2JhbGx5LiBJZiB5b3UgcHJlZmVyIHRvIHVzZSB0aGUgQVBJcyBnbG9iYWxseSBsaWtlIEplc3QsIHNldCB0byBgdHJ1ZWAuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqIEBzZWUgaHR0cHM6Ly92aXRlc3QuZGV2L2NvbmZpZy8jZ2xvYmFsc1xuICAgICAqL1xuICAgIHJlYWRvbmx5IGdsb2JhbHM/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQ292ZXJhZ2UgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgKiBAc2VlIGh0dHBzOi8vdml0ZXN0LmRldi9jb25maWcvI2NvdmVyYWdlLWVuYWJsZWRcbiAgICAgKi9cbiAgICByZWFkb25seSBjb3ZlcmFnZUVuYWJsZWQ/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQ292ZXJhZ2UgcHJvdmlkZXIgdHlwZS5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IFwidjhcIlxuICAgICAqIEBzZWUgaHR0cHM6Ly92aXRlc3QuZGV2L2NvbmZpZy8jY292ZXJhZ2UtcHJvdmlkZXJcbiAgICAgKi9cbiAgICByZWFkb25seSBjb3ZlcmFnZVByb3ZpZGVyPzogQ292ZXJhZ2VQcm92aWRlcjtcblxuICAgIC8qKlxuICAgICAqIENvdmVyYWdlIHJlcG9ydGVycy5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0ICdbXCJ0ZXh0XCIsIFwibGNvdlwiXSdcbiAgICAgKiBAc2VlIGh0dHBzOi8vdml0ZXN0LmRldi9jb25maWcvI2NvdmVyYWdlLXJlcG9ydGVyXG4gICAgICovXG4gICAgcmVhZG9ubHkgY292ZXJhZ2VSZXBvcnRlcnM/OiBBcnJheTxDb3ZlcmFnZVJlcG9ydGVyPjtcblxuICAgIC8qKlxuICAgICAqIENvdmVyYWdlIG91dHB1dCBkaXJlY3RvcnkuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBcImNvdmVyYWdlXCJcbiAgICAgKi9cbiAgICByZWFkb25seSBjb3ZlcmFnZURpcmVjdG9yeT86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEVuYWJsZSB0eXBlY2hlY2tpbmcgYWxvbmdzaWRlIHlvdXIgcmVndWxhciB0ZXN0cy5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IHRydWUgKGZvciBUeXBlU2NyaXB0IHByb2plY3RzKVxuICAgICAqIEBzZWUgaHR0cHM6Ly92aXRlc3QuZGV2L2NvbmZpZy8jdHlwZWNoZWNrLWVuYWJsZWRcbiAgICAgKi9cbiAgICByZWFkb25seSB0eXBlY2hlY2tFbmFibGVkPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFRvb2wgdG8gdXNlIGZvciB0eXBlIGNoZWNraW5nLiBDaGVja2VyIHNob3VsZCBpbXBsZW1lbnQgdGhlIHNhbWUgb3V0cHV0IGZvcm1hdCBhcyBgdHNjYC5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IFwidHNjIC0tbm9FbWl0XCJcbiAgICAgKiBAc2VlIGh0dHBzOi8vdml0ZXN0LmRldi9jb25maWcvI3R5cGVjaGVjay1jaGVja2VyXG4gICAgICovXG4gICAgcmVhZG9ubHkgdHlwZWNoZWNrQ2hlY2tlcj86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFBhdGggdG8gY3VzdG9tIHRzY29uZmlnLCByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCByb290LlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgLSB0aGUgcHJvamVjdCdzIGRldmVsb3BtZW50IHRzY29uZmlnIChlLmcuIFwidGVzdC90c2NvbmZpZy5qc29uXCIpXG4gICAgICogQHNlZSBodHRwczovL3ZpdGVzdC5kZXYvY29uZmlnLyN0eXBlY2hlY2stdHNjb25maWdcbiAgICAgKi9cbiAgICByZWFkb25seSB0eXBlY2hlY2tUc2NvbmZpZz86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFZpdGVzdCB3aWxsIG5vdCBmYWlsLCBpZiBubyB0ZXN0cyB3aWxsIGJlIGZvdW5kLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqIEBzZWUgaHR0cHM6Ly92aXRlc3QuZGV2L2NvbmZpZy8jcGFzc3dpdGhub3Rlc3RzXG4gICAgICovXG4gICAgcmVhZG9ubHkgcGFzc1dpdGhOb1Rlc3RzPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFN0b3AgcnVubmluZyB0ZXN0cyBhZnRlciBjZXJ0YWluIG51bWJlciBvZiBmYWlsdXJlcy5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IDBcbiAgICAgKiBAc2VlIGh0dHBzOi8vdml0ZXN0LmRldi9jb25maWcvI2JhaWxcbiAgICAgKi9cbiAgICByZWFkb25seSBiYWlsPzogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHNuYXBzaG90IGZpbGVzLiBUaGlzIHdpbGwgdXBkYXRlIGFsbCBjaGFuZ2VkIHNuYXBzaG90cyBhbmQgZGVsZXRlIG9ic29sZXRlIG9uZXMuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICogQHNlZSBodHRwczovL3ZpdGVzdC5kZXYvZ3VpZGUvc25hcHNob3QuaHRtbCN1cGRhdGluZy1zbmFwc2hvdHNcbiAgICAgKi9cbiAgICByZWFkb25seSB1cGRhdGVTbmFwc2hvdHM/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQWx3YXlzIHByaW50IGNvbnNvbGUgdHJhY2VzIHdoZW4gY2FsbGluZyBhbnkgY29uc29sZSBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICogQHNlZSBodHRwczovL3ZpdGVzdC5kZXYvY29uZmlnLyNjb25zb2xldHJhY2VcbiAgICAgKi9cbiAgICByZWFkb25seSBwcmludENvbnNvbGVUcmFjZT86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCBhIHRlc3Qgb3Igc3VpdGUgaXMgY29uc2lkZXJlZCBzbG93LlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgMzAwXG4gICAgICogQHNlZSBodHRwczovL3ZpdGVzdC5kZXYvY29uZmlnLyNzbG93dGVzdHRocmVzaG9sZFxuICAgICAqL1xuICAgIHJlYWRvbmx5IHNsb3dUZXN0VGhyZXNob2xkPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZpdGVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIENvbmZpZyBmaWxlIHBhdGguXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBcInZpdGVzdC5jb25maWcudHNcIlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGNvbmZpZ0ZpbGVQYXRoPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbCBjb25maWcgb3B0aW9ucy5cbiAgICAgKi9cbiAgICByZWFkb25seSBjb25maWc/OiBWaXRlc3RDb25maWdPcHRpb25zO1xuXG4gICAgLyoqXG4gICAgICogVml0ZXN0IHZlcnNpb24uXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBcIl41XCJcbiAgICAgKi9cbiAgICByZWFkb25seSB2aXRlc3RWZXJzaW9uPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQWRkaXRpb25hbCBgdGVzdGAgb3B0aW9ucyBmb3Igc2V0dGluZ3MgdGhhdCBgY29uZmlnYCBkb2Vzbid0IGNvdmVyLCBzdWNoIGFzIGBzZXR1cEZpbGVzYCBvciBgZXhwZWN0YC5cbiAgICAgKlxuICAgICAqIERlZXAtbWVyZ2VkIG92ZXIgdGhlIG9wdGlvbnMgZ2VuZXJhdGVkIGZyb20gYGNvbmZpZ2A6IG9iamVjdHMgYXJlIG1lcmdlZCwgb3RoZXIgdmFsdWVzIChpbmNsdWRpbmdcbiAgICAgKiBhcnJheXMpIHJlcGxhY2UgdGhlIGdlbmVyYXRlZCB2YWx1ZS4gVmFsdWVzIGFyZSByZW5kZXJlZCBhcyBKU09OLCBzbyB0aGV5IG11c3QgYmUgSlNPTi1zZXJpYWxpemFibGVcbiAgICAgKiAobm8gZnVuY3Rpb25zIG9yIHJlZ3VsYXIgZXhwcmVzc2lvbnMpLlxuICAgICAqXG4gICAgICogQGV4YW1wbGUgeyBzZXR1cEZpbGVzOiBbXCJ0ZXN0L3NldHVwLnRzXCJdLCBleHBlY3Q6IHsgcmVxdWlyZUFzc2VydGlvbnM6IHRydWUgfSB9XG4gICAgICogQGRlZmF1bHQgLSBubyBhZGRpdGlvbmFsIHRlc3Qgb3B0aW9uc1xuICAgICAqIEBzZWUgaHR0cHM6Ly92aXRlc3QuZGV2L2NvbmZpZy9cbiAgICAgKi9cbiAgICByZWFkb25seSBleHRyYVRlc3RDb25maWc/OiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfTtcblxuICAgIC8qKlxuICAgICAqIEFkZGl0aW9uYWwgdG9wLWxldmVsIGNvbmZpZyBvcHRpb25zLCBuZXh0IHRvIGB0ZXN0YCwgc3VjaCBhcyBgcmVzb2x2ZWAuXG4gICAgICpcbiAgICAgKiBWYWx1ZXMgYXJlIHJlbmRlcmVkIGFzIEpTT04sIHNvIHRoZXkgbXVzdCBiZSBKU09OLXNlcmlhbGl6YWJsZSAobm8gZnVuY3Rpb25zIG9yIHJlZ3VsYXIgZXhwcmVzc2lvbnMsXG4gICAgICogd2hpY2ggcnVsZXMgb3V0IHBsdWdpbnMpLiBVc2UgYGV4dHJhVGVzdENvbmZpZ2AgZm9yIGB0ZXN0YCBvcHRpb25zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGUgeyByZXNvbHZlOiB7IGFsaWFzOiB7IFwiQFwiOiBcIi9zcmNcIiB9IH0gfVxuICAgICAqIEBkZWZhdWx0IC0gbm8gYWRkaXRpb25hbCB0b3AtbGV2ZWwgb3B0aW9uc1xuICAgICAqIEBzZWUgaHR0cHM6Ly92aXRlc3QuZGV2L2NvbmZpZy9cbiAgICAgKi9cbiAgICByZWFkb25seSBleHRyYUNvbmZpZz86IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9O1xufVxuXG5leHBvcnQgY2xhc3MgVml0ZXN0IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBwdWJsaWMgc3RhdGljIG9mKHByb2plY3Q6IE5vZGVQcm9qZWN0KTogVml0ZXN0IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3QgaXNWaXRlc3QgPSAoYzogQ29tcG9uZW50KTogYyBpcyBWaXRlc3QgPT4gYyBpbnN0YW5jZW9mIFZpdGVzdDtcbiAgICAgICAgcmV0dXJuIHByb2plY3QuY29tcG9uZW50cy5maW5kKGlzVml0ZXN0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZ0ZpbGVQYXRoOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBpbmNsdWRlOiBTZXQ8c3RyaW5nPjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV4Y2x1ZGU6IFNldDxzdHJpbmc+O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaXNvbGF0ZTogYm9vbGVhbjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBvb2w6IFBvb2w7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjb3ZlcmFnZUVuYWJsZWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSByZWFkb25seSB0eXBlY2hlY2tFbmFibGVkOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdHlwZWNoZWNrQ2hlY2tlcjogc3RyaW5nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdHlwZWNoZWNrVHNjb25maWc6IHN0cmluZztcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhc3NXaXRoTm9UZXN0czogYm9vbGVhbjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJhaWw6IG51bWJlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZVNuYXBzaG90czogYm9vbGVhbjtcbiAgICBwcml2YXRlIGVudmlyb25tZW50OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBnbG9iYWxzOiBib29sZWFuO1xuICAgIHByaXZhdGUgY292ZXJhZ2VQcm92aWRlcjogQ292ZXJhZ2VQcm92aWRlcjtcbiAgICBwcml2YXRlIGNvdmVyYWdlUmVwb3J0ZXJzOiBBcnJheTxDb3ZlcmFnZVJlcG9ydGVyPjtcbiAgICBwcml2YXRlIGNvdmVyYWdlRGlyZWN0b3J5OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSB2ZXJzaW9uOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwcmludENvbnNvbGVUcmFjZTogYm9vbGVhbjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNsb3dUZXN0VGhyZXNob2xkOiBudW1iZXI7XG4gICAgcHJpdmF0ZSByZWFkb25seSBleHRyYVRlc3RDb25maWc6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZXh0cmFDb25maWc6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9O1xuXG4gICAgY29uc3RydWN0b3IocHJvamVjdDogTm9kZVByb2plY3QsIG9wdGlvbnM6IFZpdGVzdE9wdGlvbnMgPSB7fSkge1xuICAgICAgICBzdXBlcihwcm9qZWN0KTtcblxuICAgICAgICBpZiAob3B0aW9ucy5leHRyYUNvbmZpZyAmJiBcInRlc3RcIiBpbiBvcHRpb25zLmV4dHJhQ29uZmlnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ2aXRlc3QgZXh0cmFDb25maWcgbXVzdCBub3QgY29udGFpbiBgdGVzdGAsIHVzZSBleHRyYVRlc3RDb25maWcgZm9yIHRlc3Qgb3B0aW9uc1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXh0cmFUZXN0Q29uZmlnID0gb3B0aW9ucy5leHRyYVRlc3RDb25maWcgPz8ge307XG4gICAgICAgIHRoaXMuZXh0cmFDb25maWcgPSBvcHRpb25zLmV4dHJhQ29uZmlnID8/IHt9O1xuXG4gICAgICAgIHRoaXMuY29uZmlnRmlsZVBhdGggPSBvcHRpb25zLmNvbmZpZ0ZpbGVQYXRoID8/IFwidml0ZXN0LmNvbmZpZy50c1wiO1xuICAgICAgICB0aGlzLmluY2x1ZGUgPSBuZXcgU2V0KG9wdGlvbnMuY29uZmlnPy5pbmNsdWRlID8/IFtcIioqLyoue3Rlc3Qsc3BlY30uPyhjfG0pW2p0XXM/KHgpXCJdKTtcbiAgICAgICAgdGhpcy5leGNsdWRlID0gbmV3IFNldChcbiAgICAgICAgICAgIG9wdGlvbnMuY29uZmlnPy5leGNsdWRlID8/IFtcbiAgICAgICAgICAgICAgICBcIioqL25vZGVfbW9kdWxlcy8qKlwiLFxuICAgICAgICAgICAgICAgIFwiKiovZGlzdC8qKlwiLFxuICAgICAgICAgICAgICAgIFwiKiovY3lwcmVzcy8qKlwiLFxuICAgICAgICAgICAgICAgIFwiKiovLntpZGVhLGdpdCxjYWNoZSxvdXRwdXQsdGVtcH0vKipcIixcbiAgICAgICAgICAgICAgICBcIioqL3trYXJtYSxyb2xsdXAsd2VicGFjayx2aXRlLHZpdGVzdCxqZXN0LGF2YSxiYWJlbCxueWMsY3lwcmVzcyx0c3VwLGJ1aWxkLGVzbGludCxwcmV0dGllcn0uY29uZmlnLipcIixcbiAgICAgICAgICAgIF0sXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaXNvbGF0ZSA9IG9wdGlvbnMuY29uZmlnPy5pc29sYXRlID8/IHRydWU7XG4gICAgICAgIHRoaXMucG9vbCA9IG9wdGlvbnMuY29uZmlnPy5wb29sID8/IFBvb2wuRk9SS1M7XG4gICAgICAgIHRoaXMuY292ZXJhZ2VFbmFibGVkID0gb3B0aW9ucy5jb25maWc/LmNvdmVyYWdlRW5hYmxlZCA/PyB0cnVlO1xuICAgICAgICB0aGlzLnR5cGVjaGVja0VuYWJsZWQgPSBvcHRpb25zLmNvbmZpZz8udHlwZWNoZWNrRW5hYmxlZCA/PyB0aGlzLmlzVHlwZXNjcmlwdFByb2plY3QoKTtcbiAgICAgICAgdGhpcy50eXBlY2hlY2tDaGVja2VyID0gb3B0aW9ucy5jb25maWc/LnR5cGVjaGVja0NoZWNrZXIgPz8gXCJ0c2MgLS1ub0VtaXRcIjtcbiAgICAgICAgdGhpcy50eXBlY2hlY2tUc2NvbmZpZyA9IG9wdGlvbnMuY29uZmlnPy50eXBlY2hlY2tUc2NvbmZpZyA/PyB0c2NvbmZpZ0RldlBhdGgocHJvamVjdCk7XG4gICAgICAgIHRoaXMucGFzc1dpdGhOb1Rlc3RzID0gb3B0aW9ucy5jb25maWc/LnBhc3NXaXRoTm9UZXN0cyA/PyB0cnVlO1xuICAgICAgICB0aGlzLmJhaWwgPSBvcHRpb25zLmNvbmZpZz8uYmFpbCA/PyAwO1xuICAgICAgICB0aGlzLmVudmlyb25tZW50ID0gb3B0aW9ucy5jb25maWc/LmVudmlyb25tZW50ID8/IEVudmlyb25tZW50Lk5PREU7XG4gICAgICAgIHRoaXMuZ2xvYmFscyA9IG9wdGlvbnMuY29uZmlnPy5nbG9iYWxzID8/IGZhbHNlO1xuICAgICAgICB0aGlzLmNvdmVyYWdlUHJvdmlkZXIgPSBvcHRpb25zLmNvbmZpZz8uY292ZXJhZ2VQcm92aWRlciA/PyBDb3ZlcmFnZVByb3ZpZGVyLlY4O1xuICAgICAgICB0aGlzLmNvdmVyYWdlUmVwb3J0ZXJzID0gb3B0aW9ucy5jb25maWc/LmNvdmVyYWdlUmVwb3J0ZXJzID8/IFtDb3ZlcmFnZVJlcG9ydGVyLlRFWFQsIENvdmVyYWdlUmVwb3J0ZXIuTENPVl07XG4gICAgICAgIHRoaXMuY292ZXJhZ2VEaXJlY3RvcnkgPSBvcHRpb25zLmNvbmZpZz8uY292ZXJhZ2VEaXJlY3RvcnkgPz8gXCJjb3ZlcmFnZVwiO1xuICAgICAgICB0aGlzLnZlcnNpb24gPSBvcHRpb25zLnZpdGVzdFZlcnNpb24gPz8gXCJeNVwiO1xuICAgICAgICB0aGlzLnVwZGF0ZVNuYXBzaG90cyA9IG9wdGlvbnMuY29uZmlnPy51cGRhdGVTbmFwc2hvdHMgPz8gdHJ1ZTtcbiAgICAgICAgdGhpcy5wcmludENvbnNvbGVUcmFjZSA9IG9wdGlvbnMuY29uZmlnPy5wcmludENvbnNvbGVUcmFjZSA/PyB0cnVlO1xuICAgICAgICB0aGlzLnNsb3dUZXN0VGhyZXNob2xkID0gb3B0aW9ucy5jb25maWc/LnNsb3dUZXN0VGhyZXNob2xkID8/IDMwMDtcblxuICAgICAgICBwcm9qZWN0LmFkZERldkRlcHMoYHZpdGVzdEAke3RoaXMudmVyc2lvbn1gKTtcbiAgICAgICAgdGhpcy5jb25maWd1cmVDb3ZlcmFnZVByb3ZpZGVyKHRoaXMuY292ZXJhZ2VQcm92aWRlcik7XG5cbiAgICAgICAgaWYgKHRoaXMuZ2xvYmFscyAmJiB0aGlzLmlzVHlwZXNjcmlwdFByb2plY3QoKSAmJiB0aGlzLnByb2plY3QudHJ5RmluZE9iamVjdEZpbGUodGhpcy50eXBlY2hlY2tUc2NvbmZpZykpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJlR2xvYmFscygpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY292ZXJhZ2VEaXJlY3RvcnlQYXRoID0gcGF0aC5wb3NpeC5qb2luKFwiL1wiLCB0aGlzLmNvdmVyYWdlRGlyZWN0b3J5LCBcIi9cIik7XG4gICAgICAgIHByb2plY3QubnBtaWdub3JlPy5leGNsdWRlKGNvdmVyYWdlRGlyZWN0b3J5UGF0aCk7XG4gICAgICAgIHByb2plY3QuZ2l0aWdub3JlLmV4Y2x1ZGUoY292ZXJhZ2VEaXJlY3RvcnlQYXRoKTtcblxuICAgICAgICB0aGlzLmFkZFRlc3RDb21tYW5kKCk7XG4gICAgICAgIHRoaXMuc3ludGhlc2l6ZUNvbmZpZygpO1xuXG4gICAgICAgIGlmIChwcm9qZWN0IGluc3RhbmNlb2YgY2RrLkpzaWlQcm9qZWN0IHx8IHByb2plY3QgaW5zdGFuY2VvZiBhd3NjZGsuQXdzQ2RrQ29uc3RydWN0TGlicmFyeSkge1xuICAgICAgICAgICAgcHJvamVjdC5ucG1pZ25vcmU/LmFkZFBhdHRlcm5zKFwidml0ZXN0LmNvbmZpZy50c1wiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvdmVycmlkZSBwcmVTeW50aGVzaXplKCkge1xuICAgICAgICBzdXBlci5wcmVTeW50aGVzaXplKCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgdGhpcy5wcm9qZWN0LmNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBKZXN0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidml0ZXN0IGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggamVzdFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJ1bnMgYWZ0ZXIgcHJvamVuJ3Mgc2FtcGxlIGNvZGUgY29tcG9uZW50LCB3aGljaCBpcyBhZGRlZCBpbiB0aGUgcHJvamVjdCBjb25zdHJ1Y3RvciBiZWZvcmVcbiAgICAgKiBhbnkgY29tcG9uZW50LCBzbyB0aGUgc2FtcGxlIHRlc3QgZXhpc3RzIGJ5IG5vdy4gYHBvc3RTeW50aGVzaXplYCB3b3VsZCBiZSB0b28gbGF0ZSB0byByZWx5XG4gICAgICogb246IHByb2plbiBza2lwcyBpdCB3aGVuIGBQUk9KRU5fRElTQUJMRV9QT1NUYCBpcyBzZXQuXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIHN5bnRoZXNpemUoKSB7XG4gICAgICAgIHN1cGVyLnN5bnRoZXNpemUoKTtcblxuICAgICAgICB0aGlzLmltcG9ydFZpdGVzdEluU2FtcGxlVGVzdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1ha2VzIHRoZSBzYW1wbGUgdGVzdCBvZiBBV1MgQ0RLIGFwcHMgd29yayB3aXRoIFZpdGVzdC5cbiAgICAgKlxuICAgICAqIFByb2plbiB3cml0ZXMgYDx0ZXN0ZGlyPi88ZW50cnlwb2ludD4udGVzdC50c2AgZm9yIEFXUyBDREsgVHlwZVNjcmlwdCBhcHBzIHdoZW5ldmVyIHRoZSB0ZXN0XG4gICAgICogZGlyZWN0b3J5IGNvbnRhaW5zIG5vIFR5cGVTY3JpcHQgZmlsZXMuIFRoZSB0ZXN0IHVzZXMgdGhlIEplc3QgZ2xvYmFscyBgdGVzdGAgYW5kIGBleHBlY3RgLFxuICAgICAqIHdoaWNoIGRvbid0IGV4aXN0IHdpdGggVml0ZXN0IHVubGVzcyBgZ2xvYmFsc2AgaXMgZW5hYmxlZCwgc28gaW1wb3J0IHRoZW0gZnJvbSBgdml0ZXN0YC5cbiAgICAgKlxuICAgICAqIE9ubHkgYSBmaWxlIHRoYXQgc3RpbGwgbWF0Y2hlcyBwcm9qZW4ncyBzYW1wbGUgaXMgY2hhbmdlZCwgbmV2ZXIgYSB0ZXN0IHdyaXR0ZW4gYnkgaGFuZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGltcG9ydFZpdGVzdEluU2FtcGxlVGVzdCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZ2xvYmFscyB8fCAhKHRoaXMucHJvamVjdCBpbnN0YW5jZW9mIGF3c2Nkay5Bd3NDZGtUeXBlU2NyaXB0QXBwKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJvamVjdCA9IHRoaXMucHJvamVjdDtcbiAgICAgICAgY29uc3QgZW50cnlwb2ludE5hbWUgPSBwYXRoLmJhc2VuYW1lKHByb2plY3QuYXBwRW50cnlwb2ludCwgXCIudHNcIik7XG4gICAgICAgIGNvbnN0IHRlc3RQYXRoID0gcGF0aC5qb2luKHByb2plY3Qub3V0ZGlyLCBwcm9qZWN0LnRlc3RkaXIsIGAke2VudHJ5cG9pbnROYW1lfS50ZXN0LnRzYCk7XG5cbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRlc3RQYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2FtcGxlSW1wb3J0cyA9XG4gICAgICAgICAgICBcImltcG9ydCB7IEFwcCB9IGZyb20gJ2F3cy1jZGstbGliJztcXG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gJ2F3cy1jZGstbGliL2Fzc2VydGlvbnMnO1xcblwiO1xuICAgICAgICBjb25zdCBjb250ZW50cyA9IGZzLnJlYWRGaWxlU3luYyh0ZXN0UGF0aCwgXCJ1dGYtOFwiKTtcblxuICAgICAgICBjb25zdCBpc1NhbXBsZSA9IGNvbnRlbnRzLnN0YXJ0c1dpdGgoc2FtcGxlSW1wb3J0cykgJiYgY29udGVudHMuaW5jbHVkZXMoXCJcXG50ZXN0KCdTbmFwc2hvdCcsICgpID0+IHtcIik7XG4gICAgICAgIGlmICghaXNTYW1wbGUgfHwgY29udGVudHMuaW5jbHVkZXMoXCJmcm9tICd2aXRlc3QnXCIpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICAgICAgdGVzdFBhdGgsXG4gICAgICAgICAgICBjb250ZW50cy5yZXBsYWNlKHNhbXBsZUltcG9ydHMsIGAke3NhbXBsZUltcG9ydHN9aW1wb3J0IHsgZXhwZWN0LCB0ZXN0IH0gZnJvbSAndml0ZXN0JztcXG5gKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkSW5jbHVkZShwYXR0ZXJuOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbmNsdWRlLmFkZChwYXR0ZXJuKTtcbiAgICAgICAgdGhpcy5zeW50aGVzaXplQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEV4Y2x1ZGUocGF0dGVybjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZXhjbHVkZS5hZGQocGF0dGVybik7XG4gICAgICAgIHRoaXMuc3ludGhlc2l6ZUNvbmZpZygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb25maWd1cmVFbnZpcm9ubWVudChlbnZpcm9ubWVudDogRW52aXJvbm1lbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudCA9IGVudmlyb25tZW50O1xuICAgICAgICB0aGlzLnN5bnRoZXNpemVDb25maWcoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29uZmlndXJlQ292ZXJhZ2VQcm92aWRlcihwcm92aWRlcjogQ292ZXJhZ2VQcm92aWRlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBwcm92aWRlclBhY2thZ2VzID0ge1xuICAgICAgICAgICAgW0NvdmVyYWdlUHJvdmlkZXIuVjhdOiBgQHZpdGVzdC9jb3ZlcmFnZS12OEAke3RoaXMudmVyc2lvbn1gLFxuICAgICAgICAgICAgW0NvdmVyYWdlUHJvdmlkZXIuSVNUQU5CVUxdOiBgQHZpdGVzdC9jb3ZlcmFnZS1pc3RhbmJ1bEAke3RoaXMudmVyc2lvbn1gLFxuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAoY29uc3QgcHJvdmlkZXJQYWNrYWdlIG9mIE9iamVjdC52YWx1ZXMocHJvdmlkZXJQYWNrYWdlcykpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9qZWN0LmRlcHMucmVtb3ZlRGVwZW5kZW5jeShwcm92aWRlclBhY2thZ2UpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnByb2plY3QuZGVwcy5hZGREZXBlbmRlbmN5KHByb3ZpZGVyUGFja2FnZXNbcHJvdmlkZXJdLCBEZXBlbmRlbmN5VHlwZS5ERVZFTlYpO1xuICAgICAgICB0aGlzLmNvdmVyYWdlUHJvdmlkZXIgPSBwcm92aWRlcjtcbiAgICAgICAgdGhpcy5zeW50aGVzaXplQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbmZpZ3VyZUNvdmVyYWdlUmVwb3J0ZXJzKHJlcG9ydGVyczogQXJyYXk8Q292ZXJhZ2VSZXBvcnRlcj4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb3ZlcmFnZVJlcG9ydGVycyA9IHJlcG9ydGVycztcbiAgICAgICAgdGhpcy5zeW50aGVzaXplQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbmZpZ3VyZUdsb2JhbHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudXBkYXRlVHNDb25maWcoKTtcbiAgICAgICAgdGhpcy5zeW50aGVzaXplQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVUc0NvbmZpZygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdHNjb25maWcgPSB0aGlzLnByb2plY3QudHJ5RmluZE9iamVjdEZpbGUodGhpcy50eXBlY2hlY2tUc2NvbmZpZyk7XG5cbiAgICAgICAgaWYgKCF0c2NvbmZpZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidW5hYmxlIHRvIGZpbmQgdHNjb25maWdcIik7XG4gICAgICAgIH1cblxuICAgICAgICB0c2NvbmZpZy5hZGRUb0FycmF5KFwiY29tcGlsZXJPcHRpb25zLnR5cGVzXCIsIFwidml0ZXN0L2dsb2JhbHNcIik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1R5cGVzY3JpcHRQcm9qZWN0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9qZWN0LmRlcHMudHJ5R2V0RGVwZW5kZW5jeShcInR5cGVzY3JpcHRcIikgIT09IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZFRlc3RDb21tYW5kKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnByb2plY3QudGVzdFRhc2suZXhlYyhcInZpdGVzdCBydW5cIiwge1xuICAgICAgICAgICAgcmVjZWl2ZUFyZ3M6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHRlc3RXYXRjaCA9IHRoaXMucHJvamVjdC50YXNrcy50cnlGaW5kKFwidGVzdDp3YXRjaFwiKTtcbiAgICAgICAgaWYgKCF0ZXN0V2F0Y2gpIHtcbiAgICAgICAgICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKFwidGVzdDp3YXRjaFwiLCB7XG4gICAgICAgICAgICAgICAgZXhlYzogXCJ2aXRlc3Qgd2F0Y2hcIixcbiAgICAgICAgICAgICAgICByZWNlaXZlQXJnczogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGVzdFVwZGF0ZVNuYXBzaG90cyA9IHRoaXMucHJvamVjdC50YXNrcy50cnlGaW5kKFwidGVzdDp1cGRhdGVcIik7XG4gICAgICAgIGlmICghdGVzdFVwZGF0ZVNuYXBzaG90cykge1xuICAgICAgICAgICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soXCJ0ZXN0OnVwZGF0ZVwiLCB7XG4gICAgICAgICAgICAgICAgZXhlYzogXCJ2aXRlc3QgLS11cGRhdGVcIixcbiAgICAgICAgICAgICAgICByZWNlaXZlQXJnczogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzeW50aGVzaXplQ29uZmlnKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnByb2plY3QudHJ5UmVtb3ZlRmlsZSh0aGlzLmNvbmZpZ0ZpbGVQYXRoKTtcblxuICAgICAgICBuZXcgVGV4dEZpbGUodGhpcywgdGhpcy5jb25maWdGaWxlUGF0aCwge1xuICAgICAgICAgICAgbGluZXM6IHRoaXMucmVuZGVyQ29uZmlnKCksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVuZGVyQ29uZmlnKCk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICBjb25zdCBwcm9qZWN0ID0gdGhpcy5wcm9qZWN0IGFzIE5vZGVQcm9qZWN0O1xuICAgICAgICBjb25zdCBwYWNrYWdlTmFtZSA9IHByb2plY3QucGFja2FnZS5wYWNrYWdlTmFtZTtcbiAgICAgICAgY29uc3QgZGVmaW5lQ29uZmlnSW1wb3J0ID1cbiAgICAgICAgICAgIHBhY2thZ2VOYW1lID09PSBcIkBuaWtvdmlydGFsYS9wcm9qZW4tY29uc3RydWN0c1wiXG4gICAgICAgICAgICAgICAgPyAnaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSBcIi4vbGliL3ZpdGVzdC1kZWZpbmUtY29uZmlnXCI7J1xuICAgICAgICAgICAgICAgIDogJ2ltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gXCJAbmlrb3ZpcnRhbGEvcHJvamVuLWNvbnN0cnVjdHMvbGliL3ZpdGVzdC1kZWZpbmUtY29uZmlnXCI7JztcblxuICAgICAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICAgICAgICAuLi50aGlzLmV4dHJhQ29uZmlnLFxuICAgICAgICAgICAgdGVzdDogZGVlcE1lcmdlPFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih0aGlzLnJlbmRlclRlc3RPcHRpb25zKCksIHRoaXMuZXh0cmFUZXN0Q29uZmlnKSxcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gW2RlZmluZUNvbmZpZ0ltcG9ydCwgXCJcIiwgYGV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZygke0pTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMil9KTtgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbmRlclRlc3RPcHRpb25zKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJhaWw6IHRoaXMuYmFpbCxcbiAgICAgICAgICAgIGNvdmVyYWdlOiB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZDogdGhpcy5jb3ZlcmFnZUVuYWJsZWQsXG4gICAgICAgICAgICAgICAgcHJvdmlkZXI6IHRoaXMuY292ZXJhZ2VQcm92aWRlcixcbiAgICAgICAgICAgICAgICByZXBvcnRlcjogdGhpcy5jb3ZlcmFnZVJlcG9ydGVycyxcbiAgICAgICAgICAgICAgICByZXBvcnRzRGlyZWN0b3J5OiB0aGlzLmNvdmVyYWdlRGlyZWN0b3J5LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVudmlyb25tZW50OiB0aGlzLmVudmlyb25tZW50LFxuICAgICAgICAgICAgZXhjbHVkZTogQXJyYXkuZnJvbSh0aGlzLmV4Y2x1ZGUpLFxuICAgICAgICAgICAgZ2xvYmFsczogdGhpcy5nbG9iYWxzLFxuICAgICAgICAgICAgaW5jbHVkZTogQXJyYXkuZnJvbSh0aGlzLmluY2x1ZGUpLFxuICAgICAgICAgICAgaXNvbGF0ZTogdGhpcy5pc29sYXRlLFxuICAgICAgICAgICAgcGFzc1dpdGhOb1Rlc3RzOiB0aGlzLnBhc3NXaXRoTm9UZXN0cyxcbiAgICAgICAgICAgIHByaW50Q29uc29sZVRyYWNlOiB0aGlzLnByaW50Q29uc29sZVRyYWNlLFxuICAgICAgICAgICAgcG9vbDogdGhpcy5wb29sLFxuICAgICAgICAgICAgc2xvd1Rlc3RUaHJlc2hvbGQ6IHRoaXMuc2xvd1Rlc3RUaHJlc2hvbGQsXG4gICAgICAgICAgICB0eXBlY2hlY2s6IHtcbiAgICAgICAgICAgICAgICBlbmFibGVkOiB0aGlzLnR5cGVjaGVja0VuYWJsZWQsXG4gICAgICAgICAgICAgICAgY2hlY2tlcjogdGhpcy50eXBlY2hlY2tDaGVja2VyLFxuICAgICAgICAgICAgICAgIHRzY29uZmlnOiB0aGlzLnR5cGVjaGVja1RzY29uZmlnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVwZGF0ZTogdGhpcy51cGRhdGVTbmFwc2hvdHMsXG4gICAgICAgIH07XG4gICAgfVxufVxuIl19
package/lib/config.js CHANGED
@@ -121,7 +121,7 @@ exports.projectDefaultOptions = {
121
121
  linter: true,
122
122
  },
123
123
  packageManager: projen_1.javascript.NodePackageManager.PNPM,
124
- pnpmVersion: "11.20.0",
124
+ pnpmVersion: "12.16.1",
125
125
  /**
126
126
  * pnpm 11 only reads auth and registry settings from `.npmrc`, everything else
127
127
  * has to live in `pnpm-workspace.yaml`.
@@ -228,4 +228,4 @@ exports.defaultOptions = {
228
228
  AwsCdkConstructLibrary: (0, utils_1.mergeAll)(exports.projectDefaultOptions, publishableProjectDefaultOptions, cdkDefaultVersionOptions),
229
229
  },
230
230
  };
231
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE4RUEsc0NBVUM7QUF4RkQsbUNBQWdHO0FBRWhHLG1DQUFtQztBQUNuQywwREFBNEM7QUFFL0IsUUFBQSxRQUFRLEdBQUc7SUFDcEIsTUFBTSxFQUFFLGNBQWM7SUFDdEIsYUFBYSxFQUFFLHNCQUFzQjtJQUNyQyxpQkFBaUIsRUFBRSxRQUFRO0lBQzNCLEdBQUcsUUFBUTtJQUNYLElBQUksV0FBVztRQUNYLE9BQU8sSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0NBQ0ssQ0FBQztBQVFYLFNBQVMsZ0JBQWdCLENBQ3JCLE9BSXFCO0lBRXJCLElBQ0ksQ0FBQyxPQUFPLFlBQVksZUFBTSxDQUFDLG1CQUFtQixJQUFJLE9BQU8sWUFBWSxtQkFBVSxDQUFDLGlCQUFpQixDQUFDO1FBQ2xHLENBQUMsQ0FBQyxPQUFPLFlBQVksWUFBRyxDQUFDLFdBQVcsQ0FBQztRQUNyQyxDQUFDLENBQUMsT0FBTyxZQUFZLGVBQU0sQ0FBQyxzQkFBc0IsQ0FBQyxFQUNyRCxDQUFDO1FBQ0MsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3pDLE9BQU8sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUIsT0FBTyxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUM3QixPQUFPLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQztJQUUxRixJQUFJLE9BQU8s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TSxFQUFFLElBQUk7WUFDWixNQUFNLEVBQUUsUUFBUTtTQUNuQjtLQUNKO0NBQ3dDLENBQUM7QUFFOUMsTUFBTSxnQ0FBZ0MsR0FBRztJQUNyQyxNQUFNLEVBQUUsZ0JBQVEsQ0FBQyxNQUFNO0lBQ3ZCLGFBQWEsRUFBRSxnQkFBUSxDQUFDLGFBQWE7SUFDckMsb0JBQW9CLEVBQUUsSUFBSTtDQUNhLENBQUM7QUFFNUMsTUFBTSx3QkFBd0IsR0FBRztJQUM3QixVQUFVLEVBQUUsZ0JBQVEsQ0FBQyxVQUFVO0lBQy9CLGlCQUFpQixFQUFFLGdCQUFRLENBQUMsaUJBQWlCO0NBQ1EsQ0FBQztBQUU3QyxRQUFBLGNBQWMsR0FBRztJQUMxQixVQUFVLEVBQUU7UUFDUixpQkFBaUIsRUFBRSxJQUFBLGdCQUFRLEVBQ3ZCLDZCQUFxQixFQUNyQix1QkFBdUIsQ0FDMUI7S0FDSjtJQUNELEdBQUcsRUFBRTtRQUNELFdBQVcsRUFBRSxJQUFBLGdCQUFRLEVBQXlCLDZCQUFxQixFQUFFLGdDQUFnQyxFQUFFO1lBQ25HLFdBQVcsRUFBRSxnQkFBUSxDQUFDLFdBQVc7U0FDcEMsQ0FBQztLQUNMO0lBQ0QsTUFBTSxFQUFFO1FBQ0osbUJBQW1CLEVBQUUsSUFBQSxnQkFBUSxFQUN6Qiw2QkFBcUIsRUFDckIsdUJBQXVCLEVBQ3ZCLHdCQUF3QixDQUMzQjtRQUNELHNCQUFzQixFQUFFLElBQUEsZ0JBQVEsRUFDNUIsNkJBQXFCLEVBQ3JCLGdDQUFnQyxFQUNoQyx3QkFBd0IsQ0FDM0I7S0FDSjtDQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhd3NjZGssIGNkaywgamF2YXNjcmlwdCwgdHlwZSBDb21wb25lbnQgYXMgUHJvamVuQ29tcG9uZW50LCB0eXBlc2NyaXB0IH0gZnJvbSBcInByb2plblwiO1xuaW1wb3J0IHR5cGUgeyBUeXBlU2NyaXB0UHJvamVjdE9wdGlvbnMgfSBmcm9tIFwicHJvamVuL2xpYi90eXBlc2NyaXB0XCI7XG5pbXBvcnQgeyBtZXJnZUFsbCB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgKiBhcyB2ZXJzaW9ucyBmcm9tIFwiLi92ZXJzaW9ucy5qc29uXCI7XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0cyA9IHtcbiAgICBhdXRob3I6IFwiTmlrbyBWaXJ0YWxhXCIsXG4gICAgYXV0aG9yQWRkcmVzczogXCJuaWtvLnZpcnRhbGFAaGV5LmNvbVwiLFxuICAgIGNvbnN0cnVjdHNWZXJzaW9uOiBcIjEwLjQuM1wiLFxuICAgIC4uLnZlcnNpb25zLFxuICAgIGdldCBqc2lpVmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIGB+JHt0aGlzLnR5cGVzY3JpcHRWZXJzaW9ufWA7XG4gICAgfSxcbn0gYXMgY29uc3Q7XG5cbmludGVyZmFjZSBDb21wb25lbnQge1xuICAgIGNvbXBvbmVudDogbmV3IChwcm9qZWN0OiBuZXZlciwgb3B0aW9ucz86IG5ldmVyKSA9PiBQcm9qZW5Db21wb25lbnQ7XG4gICAgZW5hYmxlZD86IGJvb2xlYW47XG4gICAgb3B0aW9ucz86IHVua25vd247XG59XG5cbmZ1bmN0aW9uIGNvbmZpZ3VyZVByb2plY3QoXG4gICAgcHJvamVjdDpcbiAgICAgICAgfCBhd3NjZGsuQXdzQ2RrVHlwZVNjcmlwdEFwcFxuICAgICAgICB8IGF3c2Nkay5Bd3NDZGtDb25zdHJ1Y3RMaWJyYXJ5XG4gICAgICAgIHwgdHlwZXNjcmlwdC5UeXBlU2NyaXB0UHJvamVjdFxuICAgICAgICB8IGNkay5Kc2lpUHJvamVjdCxcbikge1xuICAgIGlmIChcbiAgICAgICAgKHByb2plY3QgaW5zdGFuY2VvZiBhd3NjZGsuQXdzQ2RrVHlwZVNjcmlwdEFwcCB8fCBwcm9qZWN0IGluc3RhbmNlb2YgdHlwZXNjcmlwdC5UeXBlU2NyaXB0UHJvamVjdCkgJiZcbiAgICAgICAgIShwcm9qZWN0IGluc3RhbmNlb2YgY2RrLkpzaWlQcm9qZWN0KSAmJlxuICAgICAgICAhKHByb2plY3QgaW5zdGFuY2VvZiBhd3NjZGsuQXdzQ2RrQ29uc3RydWN0TGlicmFyeSlcbiAgICApIHtcbiAgICAgICAgcHJvamVjdC5wYWNrYWdlLmFkZEZpZWxkKFwidHlwZVwiLCBcIm1vZHVsZVwiKTtcbiAgICB9XG5cbiAgICBwcm9qZWN0LmRlcHMucmVtb3ZlRGVwZW5kZW5jeShcInRzLW5vZGVcIik7XG4gICAgcHJvamVjdC5hZGREZXZEZXBzKFwidHN4XCIpO1xuICAgIHByb2plY3QuZGVmYXVsdFRhc2s/LnJlc2V0KCk7XG4gICAgcHJvamVjdC5kZWZhdWx0VGFzaz8uZXhlYyhgdHN4IC0tdHNjb25maWcgJHtwcm9qZWN0LnRzY29uZmlnRGV2LmZpbGUucGF0aH0gLnByb2plbnJjLnRzYCk7XG5cbiAgICBpZiAocHJvamVjdCBpbnN0YW5jZW9mIGF3c2Nkay5Bd3NDZGtUeXBlU2NyaXB0QXBwKSB7XG4gICAgICAgIHByb2plY3QuY2RrQ29uZmlnLmpzb24uYWRkT3ZlcnJpZGUoXCJhcHBcIiwgYG5weCB0c3ggJHtwcm9qZWN0LnNyY2Rpcn0vJHtwcm9qZWN0LmFwcEVudHJ5cG9pbnR9YCk7XG4gICAgfVxuXG4gICAgcHJvamVjdC52c2NvZGU/LmV4dGVuc2lvbnMuYWRkUmVjb21tZW5kYXRpb25zKFwiYmlvbWVqcy5iaW9tZVwiKTtcbiAgICBwcm9qZWN0LnZzY29kZT8uc2V0dGluZ3MuYWRkU2V0dGluZ3Moe1xuICAgICAgICBcImVkaXRvci5jb2RlQWN0aW9uc09uU2F2ZVwiOiB7XG4gICAgICAgICAgICBcInNvdXJjZS5vcmdhbml6ZUltcG9ydHMuYmlvbWVcIjogXCJhbHdheXNcIixcbiAgICAgICAgfSxcbiAgICAgICAgXCJlZGl0b3IuZGVmYXVsdEZvcm1hdHRlclwiOiBcImJpb21lanMuYmlvbWVcIixcbiAgICAgICAgXCJlZGl0b3IuZm9ybWF0T25TYXZlXCI6IHRydWUsXG4gICAgICAgIFwiZWRpdG9yLnRhYlNpemVcIjogNCxcbiAgICB9KTtcblxuICAgIGlmIChwcm9qZWN0IGluc3RhbmNlb2YgY2RrLkpzaWlQcm9qZWN0IHx8IHByb2plY3QgaW5zdGFuY2VvZiBhd3NjZGsuQXdzQ2RrQ29uc3RydWN0TGlicmFyeSkge1xuICAgICAgICBwcm9qZWN0LnBhY2thZ2UuYWRkRmllbGQoXCJwdWJsaXNoQ29uZmlnXCIsIHsgYWNjZXNzOiBcInB1YmxpY1wiIH0pO1xuICAgIH1cblxuICAgIC8vIHJlbW92ZSBvbmNlIGNvbmZpZ3VyZWQgY29ycmVjdGx5IHRvIGJpb21lLCBtaXNlIGFuZCB2aXRlc3QgY29tcG9uZW50c1xuICAgIHByb2plY3QubnBtaWdub3JlPy5hZGRQYXR0ZXJucyhcImJpb21lLmpzb25jXCIsIFwibWlzZS50b21sXCIsIFwidml0ZXN0LmNvbmZpZy50c1wiKTtcbn1cblxuZnVuY3Rpb24gaW5qZWN0Q29tcG9uZW50cyhcbiAgICBwcm9qZWN0OlxuICAgICAgICB8IGF3c2Nkay5Bd3NDZGtUeXBlU2NyaXB0QXBwXG4gICAgICAgIHwgYXdzY2RrLkF3c0Nka0NvbnN0cnVjdExpYnJhcnlcbiAgICAgICAgfCB0eXBlc2NyaXB0LlR5cGVTY3JpcHRQcm9qZWN0XG4gICAgICAgIHwgY2RrLkpzaWlQcm9qZWN0LFxuICAgIGNvbXBvbmVudHM6IENvbXBvbmVudFtdLFxuKSB7XG4gICAgZm9yIChjb25zdCB7IGNvbXBvbmVudCwgZW5hYmxlZCwgb3B0aW9ucyB9IG9mIGNvbXBvbmVudHMpIHtcbiAgICAgICAgaWYgKGVuYWJsZWQgPz8gdHJ1ZSkge1xuICAgICAgICAgICAgbmV3IGNvbXBvbmVudChwcm9qZWN0IGFzIG5ldmVyLCBvcHRpb25zIGFzIG5ldmVyKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5RGVmYXVsdHMoXG4gICAgcHJvamVjdDpcbiAgICAgICAgfCBhd3NjZGsuQXdzQ2RrVHlwZVNjcmlwdEFwcFxuICAgICAgICB8IGF3c2Nkay5Bd3NDZGtDb25zdHJ1Y3RMaWJyYXJ5XG4gICAgICAgIHwgdHlwZXNjcmlwdC5UeXBlU2NyaXB0UHJvamVjdFxuICAgICAgICB8IGNkay5Kc2lpUHJvamVjdCxcbiAgICBjb21wb25lbnRzOiBDb21wb25lbnRbXSxcbikge1xuICAgIGNvbmZpZ3VyZVByb2plY3QocHJvamVjdCk7XG4gICAgaW5qZWN0Q29tcG9uZW50cyhwcm9qZWN0LCBjb21wb25lbnRzKTtcbn1cblxuZXhwb3J0IGNvbnN0IHByb2plY3REZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBkZWZhdWx0UmVsZWFzZUJyYW5jaDogXCJtYWluXCIsXG4gICAgbWluTm9kZVZlcnNpb246IGRlZmF1bHRzLm1pbk5vZGVWZXJzaW9uLFxuICAgIGF1dG9BcHByb3ZlT3B0aW9uczoge1xuICAgICAgICBzZWNyZXQ6IFwiR0lUSFVCX1RPS0VOXCIsXG4gICAgICAgIGFsbG93ZWRVc2VybmFtZXM6IFtcIm5pa292aXJ0YWxhXCJdLFxuICAgIH0sXG4gICAgZGVwZW5kYWJvdDogZmFsc2UsXG4gICAgZGVwc1VwZ3JhZGVPcHRpb25zOiB7XG4gICAgICAgIHdvcmtmbG93T3B0aW9uczoge1xuICAgICAgICAgICAgbGFiZWxzOiBbXCJhdXRvLWFwcHJvdmVcIiwgXCJhdXRvLW1lcmdlXCJdLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgZ2l0aHViOiB0cnVlLFxuICAgIGdpdGh1Yk9wdGlvbnM6IHtcbiAgICAgICAgbWVyZ2lmeTogdHJ1ZSxcbiAgICB9LFxuICAgIGF1dG9NZXJnZTogdHJ1ZSxcbiAgICBqZXN0OiBmYWxzZSxcbiAgICBlc2xpbnQ6IGZhbHNlLFxuICAgIHByZXR0aWVyOiBmYWxzZSxcbiAgICBiaW9tZTogdHJ1ZSxcbiAgICBiaW9tZU9wdGlvbnM6IHtcbiAgICAgICAgYmlvbWVDb25maWc6IHtcbiAgICAgICAgICAgIGZvcm1hdHRlcjoge1xuICAgICAgICAgICAgICAgIGluZGVudFN0eWxlOiBqYXZhc2NyaXB0LmJpb21lX2NvbmZpZy5JbmRlbnRTdHlsZS5TUEFDRSxcbiAgICAgICAgICAgICAgICBpbmRlbnRXaWR0aDogNCxcbiAgICAgICAgICAgICAgICBsaW5lV2lkdGg6IDEyMCxcbiAgICAgICAgICAgICAgICB1c2VFZGl0b3Jjb25maWc6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgZm9ybWF0dGVyOiB0cnVlLFxuICAgICAgICBsaW50ZXI6IHRydWUsXG4gICAgfSxcbiAgICBwYWNrYWdlTWFuYWdlcjogamF2YXNjcmlwdC5Ob2RlUGFja2FnZU1hbmFnZXIuUE5QTSxcbiAgICBwbnBtVmVyc2lvbjogXCIxMS4yMC4wXCIsXG4gICAgLyoqXG4gICAgICogcG5wbSAxMSBvbmx5IHJlYWRzIGF1dGggYW5kIHJlZ2lzdHJ5IHNldHRpbmdzIGZyb20gYC5ucG1yY2AsIGV2ZXJ5dGhpbmcgZWxzZVxuICAgICAqIGhhcyB0byBsaXZlIGluIGBwbnBtLXdvcmtzcGFjZS55YW1sYC5cbiAgICAgKlxuICAgICAqIGBtaW5pbXVtUmVsZWFzZUFnZWAgZGVmYXVsdHMgdG8gMTQ0MCBtaW51dGVzIGluIHBucG0gMTEuIFRoYXQgY29vbGRvd24gbWFrZXNcbiAgICAgKiBwbnBtIHJlY29yZCB1bmF2b2lkYWJsZSBleGNlcHRpb25zIGluIGBtaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVgLCB3aGljaCBwcm9qZW5cbiAgICAgKiByZWdlbmVyYXRlcyBhd2F5IG9uIHRoZSBuZXh0IHN5bnRoLCBzbyB0aGUgZGVwZW5kZW5jeSB1cGdyYWRlIHdvcmtmbG93IHdvdWxkXG4gICAgICoga2VlcCBmbGlwLWZsb3BwaW5nIHRoaXMgZmlsZS4gU2V0IGl0IGV4cGxpY2l0bHkgdG8gb3B0IG91dC5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9wbnBtLmlvL21pZ3JhdGlvblxuICAgICAqIEBzZWUgaHR0cHM6Ly9wbnBtLmlvL3NldHRpbmdzL2RlcGVuZGVuY3ktcmVzb2x1dGlvbiNtaW5pbXVtcmVsZWFzZWFnZVxuICAgICAqL1xuICAgIHBucG1PcHRpb25zOiB7XG4gICAgICAgIHdvcmtzcGFjZVlhbWxPcHRpb25zOiB7XG4gICAgICAgICAgICBub2RlTGlua2VyOiBqYXZhc2NyaXB0LlBucG1Xb3Jrc3BhY2VZYW1sU2NoZW1hTm9kZUxpbmtlci5IT0lTVEVELFxuICAgICAgICAgICAgbWluaW11bVJlbGVhc2VBZ2U6IDAsXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIHBucG0gYmxvY2tzIGRlcGVuZGVuY3kgaW5zdGFsbCBzY3JpcHRzIGJ5IGRlZmF1bHQgYW5kLCBzaW5jZSBwbnBtIDExLCBmYWlsc1xuICAgICAgICAgICAgICogdGhlIGluc3RhbGwgd2hlbiBhbnkgYXJlIGlnbm9yZWQuIGVzYnVpbGQgbGlua3MgaXRzIHBsYXRmb3JtIGJpbmFyeSBpbiBhXG4gICAgICAgICAgICAgKiBwb3N0aW5zdGFsbCBzY3JpcHQgYW5kIGlzIHB1bGxlZCBpbiBieSB2aXRlc3QsIHNvIGFsbG93IGl0LiBgYWxsb3dCdWlsZHNgXG4gICAgICAgICAgICAgKiByZXBsYWNlcyB0aGUgYGFsbG93U2NyaXB0c2AgcHJvamVjdCBvcHRpb24sIHdoaWNoIHN0aWxsIHJlbmRlcnMgdGhlXG4gICAgICAgICAgICAgKiBgb25seUJ1aWx0RGVwZW5kZW5jaWVzYCBrZXkgdGhhdCBwbnBtIDExIG5vIGxvbmdlciByZWFkcy5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgYWxsb3dCdWlsZHM6IHsgZXNidWlsZDogdHJ1ZSB9LFxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBwbnBtIDExIGRlZmF1bHRzIGB2ZXJpZnlEZXBzQmVmb3JlUnVuYCB0byBgaW5zdGFsbGAsIHNvIGBwbnBtIGV4ZWNgIGFuZFxuICAgICAgICAgICAgICogYHBucG0gcnVuYCBpbnN0YWxsIGJlZm9yZSBydW5uaW5nLiBwcm9qZW4gcmVzb2x2ZXMgdGhlIHRhc2sgYFBBVEhgIHdpdGhcbiAgICAgICAgICAgICAqIGAkKHBucG0gLWMgZXhlYyAuLi4pYCwgd2hpY2ggcmUtZW50ZXJzIGBwbnBtIGluc3RhbGxgIHdoaWxlIGFuIGluc3RhbGwgaXNcbiAgICAgICAgICAgICAqIGFscmVhZHkgcnVubmluZyBhbmQgZGVhZGxvY2tzIG9uIHRoZSBzdG9yZSBsb2NrLiBwcm9qZW4gb3JjaGVzdHJhdGVzIHRoZVxuICAgICAgICAgICAgICogaW5zdGFsbHMgaXRzZWxmLCBzbyB0dXJuIHRoZSBjaGVjayBvZmYuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogQHNlZSBodHRwczovL3BucG0uaW8vc2V0dGluZ3MvYnVpbGQjdmVyaWZ5ZGVwc2JlZm9yZXJ1blxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICB2ZXJpZnlEZXBzQmVmb3JlUnVuOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHByb2plbnJjVHM6IHRydWUsXG4gICAgdHlwZXNjcmlwdFZlcnNpb246IGRlZmF1bHRzLnR5cGVzY3JpcHRWZXJzaW9uLFxuICAgIC8qKlxuICAgICAqIGpzaWkgdmFsaWRhdGVzIHRoZSBjb21waWxlIHRzY29uZmlnIGFnYWluc3QgaXRzIFwic3RyaWN0XCIgcnVsZSBzZXQsIHNvIGl0IG1heVxuICAgICAqIG9ubHkgY2Fycnkgb3B0aW9ucyBqc2lpIGFjY2VwdHMuIEV2ZXJ5dGhpbmcgZWxzZSBiZWxvbmdzIHRvIGB0c2NvbmZpZ0RldmAsXG4gICAgICogd2hpY2ggcHJvamVuIHJlbmRlcnMgYXMgdGhlIHR5cGUtY2hlY2sgb25seSBjb25maWcgZXh0ZW5kaW5nIHRoaXMgb25lLlxuICAgICAqL1xuICAgIHRzY29uZmlnOiB7XG4gICAgICAgIGNvbXBpbGVyT3B0aW9uczoge1xuICAgICAgICAgICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgICAgICAgICAgZGVjbGFyYXRpb246IHRydWUsXG4gICAgICAgICAgICBlc01vZHVsZUludGVyb3A6IHRydWUsXG4gICAgICAgICAgICBleHBlcmltZW50YWxEZWNvcmF0b3JzOiB0cnVlLFxuICAgICAgICAgICAgaW5saW5lU291cmNlTWFwOiB0cnVlLFxuICAgICAgICAgICAgaW5saW5lU291cmNlczogdHJ1ZSxcbiAgICAgICAgICAgIGlzb2xhdGVkTW9kdWxlczogdHJ1ZSxcbiAgICAgICAgICAgIG5vRmFsbHRocm91Z2hDYXNlc0luU3dpdGNoOiB0cnVlLFxuICAgICAgICAgICAgbm9JbXBsaWNpdEFueTogdHJ1ZSxcbiAgICAgICAgICAgIG5vSW1wbGljaXRSZXR1cm5zOiB0cnVlLFxuICAgICAgICAgICAgbm9JbXBsaWNpdFRoaXM6IHRydWUsXG4gICAgICAgICAgICBub1VudXNlZExvY2FsczogdHJ1ZSxcbiAgICAgICAgICAgIG5vVW51c2VkUGFyYW1ldGVyczogdHJ1ZSxcbiAgICAgICAgICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLFxuICAgICAgICAgICAgc3RyaWN0OiB0cnVlLFxuICAgICAgICAgICAgc3RyaWN0TnVsbENoZWNrczogdHJ1ZSxcbiAgICAgICAgICAgIHN0cmljdFByb3BlcnR5SW5pdGlhbGl6YXRpb246IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB0c2NvbmZpZ0Rldjoge1xuICAgICAgICBjb21waWxlck9wdGlvbnM6IHtcbiAgICAgICAgICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsXG4gICAgICAgICAgICBub0ltcGxpY2l0T3ZlcnJpZGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbn0gc2F0aXNmaWVzIFBhcnRpYWw8VHlwZVNjcmlwdFByb2plY3RPcHRpb25zPjtcblxuY29uc3QgZXNNb2R1bGVUc2NvbmZpZ09wdGlvbnMgPSB7XG4gICAgdHNjb25maWc6IHtcbiAgICAgICAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgICAgICAgICBhbGxvd0ltcG9ydGluZ1RzRXh0ZW5zaW9uczogdHJ1ZSxcbiAgICAgICAgICAgIGxpYjogW1wiZXNuZXh0XCJdLFxuICAgICAgICAgICAgbW9kdWxlOiBcIm5vZGVuZXh0XCIsXG4gICAgICAgICAgICBtb2R1bGVSZXNvbHV0aW9uOiBqYXZhc2NyaXB0LlR5cGVTY3JpcHRNb2R1bGVSZXNvbHV0aW9uLk5PREVfTkVYVCxcbiAgICAgICAgICAgIG5vRW1pdDogdHJ1ZSxcbiAgICAgICAgICAgIHRhcmdldDogXCJlc25leHRcIixcbiAgICAgICAgfSxcbiAgICB9LFxufSBzYXRpc2ZpZXMgUGFydGlhbDxUeXBlU2NyaXB0UHJvamVjdE9wdGlvbnM+O1xuXG5jb25zdCBwdWJsaXNoYWJsZVByb2plY3REZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBhdXRob3I6IGRlZmF1bHRzLmF1dGhvcixcbiAgICBhdXRob3JBZGRyZXNzOiBkZWZhdWx0cy5hdXRob3JBZGRyZXNzLFxuICAgIG5wbVRydXN0ZWRQdWJsaXNoaW5nOiB0cnVlLFxufSBzYXRpc2ZpZXMgUGFydGlhbDxjZGsuSnNpaVByb2plY3RPcHRpb25zPjtcblxuY29uc3QgY2RrRGVmYXVsdFZlcnNpb25PcHRpb25zID0ge1xuICAgIGNka1ZlcnNpb246IGRlZmF1bHRzLmNka1ZlcnNpb24sXG4gICAgY29uc3RydWN0c1ZlcnNpb246IGRlZmF1bHRzLmNvbnN0cnVjdHNWZXJzaW9uLFxufSBzYXRpc2ZpZXMgUGFydGlhbDxhd3NjZGsuQXdzQ2RrQ29uc3RydWN0TGlicmFyeU9wdGlvbnM+O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgdHlwZXNjcmlwdDoge1xuICAgICAgICBUeXBlU2NyaXB0UHJvamVjdDogbWVyZ2VBbGw8dHlwZXNjcmlwdC5UeXBlU2NyaXB0UHJvamVjdE9wdGlvbnM+KFxuICAgICAgICAgICAgcHJvamVjdERlZmF1bHRPcHRpb25zLFxuICAgICAgICAgICAgZXNNb2R1bGVUc2NvbmZpZ09wdGlvbnMsXG4gICAgICAgICksXG4gICAgfSxcbiAgICBjZGs6IHtcbiAgICAgICAgSnNpaVByb2plY3Q6IG1lcmdlQWxsPGNkay5Kc2lpUHJvamVjdE9wdGlvbnM+KHByb2plY3REZWZhdWx0T3B0aW9ucywgcHVibGlzaGFibGVQcm9qZWN0RGVmYXVsdE9wdGlvbnMsIHtcbiAgICAgICAgICAgIGpzaWlWZXJzaW9uOiBkZWZhdWx0cy5qc2lpVmVyc2lvbixcbiAgICAgICAgfSksXG4gICAgfSxcbiAgICBhd3NjZGs6IHtcbiAgICAgICAgQXdzQ2RrVHlwZVNjcmlwdEFwcDogbWVyZ2VBbGw8YXdzY2RrLkF3c0Nka1R5cGVTY3JpcHRBcHBPcHRpb25zPihcbiAgICAgICAgICAgIHByb2plY3REZWZhdWx0T3B0aW9ucyxcbiAgICAgICAgICAgIGVzTW9kdWxlVHNjb25maWdPcHRpb25zLFxuICAgICAgICAgICAgY2RrRGVmYXVsdFZlcnNpb25PcHRpb25zLFxuICAgICAgICApLFxuICAgICAgICBBd3NDZGtDb25zdHJ1Y3RMaWJyYXJ5OiBtZXJnZUFsbDxhd3NjZGsuQXdzQ2RrQ29uc3RydWN0TGlicmFyeU9wdGlvbnM+KFxuICAgICAgICAgICAgcHJvamVjdERlZmF1bHRPcHRpb25zLFxuICAgICAgICAgICAgcHVibGlzaGFibGVQcm9qZWN0RGVmYXVsdE9wdGlvbnMsXG4gICAgICAgICAgICBjZGtEZWZhdWx0VmVyc2lvbk9wdGlvbnMsXG4gICAgICAgICksXG4gICAgfSxcbn07XG4iXX0=
231
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE4RUEsc0NBVUM7QUF4RkQsbUNBQWdHO0FBRWhHLG1DQUFtQztBQUNuQywwREFBNEM7QUFFL0IsUUFBQSxRQUFRLEdBQUc7SUFDcEIsTUFBTSxFQUFFLGNBQWM7SUFDdEIsYUFBYSxFQUFFLHNCQUFzQjtJQUNyQyxpQkFBaUIsRUFBRSxRQUFRO0lBQzNCLEdBQUcsUUFBUTtJQUNYLElBQUksV0FBVztRQUNYLE9BQU8sSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0NBQ0ssQ0FBQztBQVFYLFNBQVMsZ0JBQWdCLENBQ3JCLE9BSXFCO0lBRXJCLElBQ0ksQ0FBQyxPQUFPLFlBQVksZUFBTSxDQUFDLG1CQUFtQixJQUFJLE9BQU8sWUFBWSxtQkFBVSxDQUFDLGlCQUFpQixDQUFDO1FBQ2xHLENBQUMsQ0FBQyxPQUFPLFlBQVksWUFBRyxDQUFDLFdBQVcsQ0FBQztRQUNyQyxDQUFDLENBQUMsT0FBTyxZQUFZLGVBQU0sQ0FBQyxzQkFBc0IsQ0FBQyxFQUNyRCxDQUFDO1FBQ0MsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3pDLE9BQU8sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUIsT0FBTyxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUM3QixPQUFPLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQztJQUUxRixJQUFJLE9BQU8sWUFBWSxlQUFNLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUNoRCxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLFdBQVcsT0FBTyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztJQUNwRyxDQUFDO0lBRUQsT0FBTyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDL0QsT0FBTyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ2pDLDBCQUEwQixFQUFFO1lBQ3hCLDhCQUE4QixFQUFFLFFBQVE7U0FDM0M7UUFDRCx5QkFBeUIsRUFBRSxlQUFlO1FBQzFDLHFCQUFxQixFQUFFLElBQUk7UUFDM0IsZ0JBQWdCLEVBQUUsQ0FBQztLQUN0QixDQUFDLENBQUM7SUFFSCxJQUFJLE9BQU8sWUFBWSxZQUFHLENBQUMsV0FBVyxJQUFJLE9BQU8sWUFBWSxlQUFNLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUN6RixPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztBQUNuRixDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FDckIsT0FJcUIsRUFDckIsVUFBdUI7SUFFdkIsS0FBSyxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUN2RCxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNsQixJQUFJLFNBQVMsQ0FBQyxPQUFnQixFQUFFLE9BQWdCLENBQUMsQ0FBQztRQUN0RCxDQUFDO0lBQ0wsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFnQixhQUFhLENBQ3pCLE9BSXFCLEVBQ3JCLFVBQXVCO0lBRXZCLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFCLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBRVksUUFBQSxxQkFBcUIsR0FBRztJQUNqQyxvQkFBb0IsRUFBRSxNQUFNO0lBQzVCLGNBQWMsRUFBRSxnQkFBUSxDQUFDLGNBQWM7SUFDdkMsa0JBQWtCLEVBQUU7UUFDaEIsTUFBTSxFQUFFLGNBQWM7UUFDdEIsZ0JBQWdCLEVBQUUsQ0FBQyxhQUFhLENBQUM7S0FDcEM7SUFDRCxVQUFVLEVBQUUsS0FBSztJQUNqQixrQkFBa0IsRUFBRTtRQUNoQixlQUFlLEVBQUU7WUFDYixNQUFNLEVBQUUsQ0FBQyxjQUFjLEVBQUUsWUFBWSxDQUFDO1NBQ3pDO0tBQ0o7SUFDRCxNQUFNLEVBQUUsSUFBSTtJQUNaLGFBQWEsRUFBRTtRQUNYLE9BQU8sRUFBRSxJQUFJO0tBQ2hCO0lBQ0QsU0FBUyxFQUFFLElBQUk7SUFDZixJQUFJLEVBQUUsS0FBSztJQUNYLE1BQU0sRUFBRSxLQUFLO0lBQ2IsUUFBUSxFQUFFLEtBQUs7SUFDZixLQUFLLEVBQUUsSUFBSTtJQUNYLFlBQVksRUFBRTtRQUNWLFdBQVcsRUFBRTtZQUNULFNBQVMsRUFBRTtnQkFDUCxXQUFXLEVBQUUsbUJBQVUsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEtBQUs7Z0JBQ3RELFdBQVcsRUFBRSxDQUFDO2dCQUNkLFNBQVMsRUFBRSxHQUFHO2dCQUNkLGVBQWUsRUFBRSxLQUFLO2FBQ3pCO1NBQ0o7UUFDRCxTQUFTLEVBQUUsSUFBSTtRQUNmLE1BQU0sRUFBRSxJQUFJO0tBQ2Y7SUFDRCxjQUFjLEVBQUUsbUJBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJO0lBQ2xELFdBQVcsRUFBRSxTQUFTO0lBQ3RCOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsV0FBVyxFQUFFO1FBQ1Qsb0JBQW9CLEVBQUU7WUFDbEIsVUFBVSxFQUFFLG1CQUFVLENBQUMsaUNBQWlDLENBQUMsT0FBTztZQUNoRSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3BCOzs7Ozs7ZUFNRztZQUNILFdBQVcsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUU7WUFDOUI7Ozs7Ozs7O2VBUUc7WUFDSCxtQkFBbUIsRUFBRSxLQUFLO1NBQzdCO0tBQ0o7SUFDRCxVQUFVLEVBQUUsSUFBSTtJQUNoQixpQkFBaUIsRUFBRSxnQkFBUSxDQUFDLGlCQUFpQjtJQUM3Qzs7OztPQUlHO0lBQ0gsUUFBUSxFQUFFO1FBQ04sZUFBZSxFQUFFO1lBQ2IsWUFBWSxFQUFFLElBQUk7WUFDbEIsV0FBVyxFQUFFLElBQUk7WUFDakIsZUFBZSxFQUFFLElBQUk7WUFDckIsc0JBQXNCLEVBQUUsSUFBSTtZQUM1QixlQUFlLEVBQUUsSUFBSTtZQUNyQixhQUFhLEVBQUUsSUFBSTtZQUNuQixlQUFlLEVBQUUsSUFBSTtZQUNyQiwwQkFBMEIsRUFBRSxJQUFJO1lBQ2hDLGFBQWEsRUFBRSxJQUFJO1lBQ25CLGlCQUFpQixFQUFFLElBQUk7WUFDdkIsY0FBYyxFQUFFLElBQUk7WUFDcEIsY0FBYyxFQUFFLElBQUk7WUFDcEIsa0JBQWtCLEVBQUUsSUFBSTtZQUN4QixpQkFBaUIsRUFBRSxJQUFJO1lBQ3ZCLE1BQU0sRUFBRSxJQUFJO1lBQ1osZ0JBQWdCLEVBQUUsSUFBSTtZQUN0Qiw0QkFBNEIsRUFBRSxJQUFJO1NBQ3JDO0tBQ0o7SUFDRCxXQUFXLEVBQUU7UUFDVCxlQUFlLEVBQUU7WUFDYiw0QkFBNEIsRUFBRSxJQUFJO1lBQ2xDLGtCQUFrQixFQUFFLElBQUk7U0FDM0I7S0FDSjtDQUN3QyxDQUFDO0FBRTlDLE1BQU0sdUJBQXVCLEdBQUc7SUFDNUIsUUFBUSxFQUFFO1FBQ04sZUFBZSxFQUFFO1lBQ2IsMEJBQTBCLEVBQUUsSUFBSTtZQUNoQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDZixNQUFNLEVBQUUsVUFBVTtZQUNsQixnQkFBZ0IsRUFBRSxtQkFBVSxDQUFDLDBCQUEwQixDQUFDLFNBQVM7WUFDakUsTUFBTSxFQUFFLElBQUk7WUFDWixNQUFNLEVBQUUsUUFBUTtTQUNuQjtLQUNKO0NBQ3dDLENBQUM7QUFFOUMsTUFBTSxnQ0FBZ0MsR0FBRztJQUNyQyxNQUFNLEVBQUUsZ0JBQVEsQ0FBQyxNQUFNO0lBQ3ZCLGFBQWEsRUFBRSxnQkFBUSxDQUFDLGFBQWE7SUFDckMsb0JBQW9CLEVBQUUsSUFBSTtDQUNhLENBQUM7QUFFNUMsTUFBTSx3QkFBd0IsR0FBRztJQUM3QixVQUFVLEVBQUUsZ0JBQVEsQ0FBQyxVQUFVO0lBQy9CLGlCQUFpQixFQUFFLGdCQUFRLENBQUMsaUJBQWlCO0NBQ1EsQ0FBQztBQUU3QyxRQUFBLGNBQWMsR0FBRztJQUMxQixVQUFVLEVBQUU7UUFDUixpQkFBaUIsRUFBRSxJQUFBLGdCQUFRLEVBQ3ZCLDZCQUFxQixFQUNyQix1QkFBdUIsQ0FDMUI7S0FDSjtJQUNELEdBQUcsRUFBRTtRQUNELFdBQVcsRUFBRSxJQUFBLGdCQUFRLEVBQXlCLDZCQUFxQixFQUFFLGdDQUFnQyxFQUFFO1lBQ25HLFdBQVcsRUFBRSxnQkFBUSxDQUFDLFdBQVc7U0FDcEMsQ0FBQztLQUNMO0lBQ0QsTUFBTSxFQUFFO1FBQ0osbUJBQW1CLEVBQUUsSUFBQSxnQkFBUSxFQUN6Qiw2QkFBcUIsRUFDckIsdUJBQXVCLEVBQ3ZCLHdCQUF3QixDQUMzQjtRQUNELHNCQUFzQixFQUFFLElBQUEsZ0JBQVEsRUFDNUIsNkJBQXFCLEVBQ3JCLGdDQUFnQyxFQUNoQyx3QkFBd0IsQ0FDM0I7S0FDSjtDQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhd3NjZGssIGNkaywgamF2YXNjcmlwdCwgdHlwZSBDb21wb25lbnQgYXMgUHJvamVuQ29tcG9uZW50LCB0eXBlc2NyaXB0IH0gZnJvbSBcInByb2plblwiO1xuaW1wb3J0IHR5cGUgeyBUeXBlU2NyaXB0UHJvamVjdE9wdGlvbnMgfSBmcm9tIFwicHJvamVuL2xpYi90eXBlc2NyaXB0XCI7XG5pbXBvcnQgeyBtZXJnZUFsbCB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgKiBhcyB2ZXJzaW9ucyBmcm9tIFwiLi92ZXJzaW9ucy5qc29uXCI7XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0cyA9IHtcbiAgICBhdXRob3I6IFwiTmlrbyBWaXJ0YWxhXCIsXG4gICAgYXV0aG9yQWRkcmVzczogXCJuaWtvLnZpcnRhbGFAaGV5LmNvbVwiLFxuICAgIGNvbnN0cnVjdHNWZXJzaW9uOiBcIjEwLjQuM1wiLFxuICAgIC4uLnZlcnNpb25zLFxuICAgIGdldCBqc2lpVmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIGB+JHt0aGlzLnR5cGVzY3JpcHRWZXJzaW9ufWA7XG4gICAgfSxcbn0gYXMgY29uc3Q7XG5cbmludGVyZmFjZSBDb21wb25lbnQge1xuICAgIGNvbXBvbmVudDogbmV3IChwcm9qZWN0OiBuZXZlciwgb3B0aW9ucz86IG5ldmVyKSA9PiBQcm9qZW5Db21wb25lbnQ7XG4gICAgZW5hYmxlZD86IGJvb2xlYW47XG4gICAgb3B0aW9ucz86IHVua25vd247XG59XG5cbmZ1bmN0aW9uIGNvbmZpZ3VyZVByb2plY3QoXG4gICAgcHJvamVjdDpcbiAgICAgICAgfCBhd3NjZGsuQXdzQ2RrVHlwZVNjcmlwdEFwcFxuICAgICAgICB8IGF3c2Nkay5Bd3NDZGtDb25zdHJ1Y3RMaWJyYXJ5XG4gICAgICAgIHwgdHlwZXNjcmlwdC5UeXBlU2NyaXB0UHJvamVjdFxuICAgICAgICB8IGNkay5Kc2lpUHJvamVjdCxcbikge1xuICAgIGlmIChcbiAgICAgICAgKHByb2plY3QgaW5zdGFuY2VvZiBhd3NjZGsuQXdzQ2RrVHlwZVNjcmlwdEFwcCB8fCBwcm9qZWN0IGluc3RhbmNlb2YgdHlwZXNjcmlwdC5UeXBlU2NyaXB0UHJvamVjdCkgJiZcbiAgICAgICAgIShwcm9qZWN0IGluc3RhbmNlb2YgY2RrLkpzaWlQcm9qZWN0KSAmJlxuICAgICAgICAhKHByb2plY3QgaW5zdGFuY2VvZiBhd3NjZGsuQXdzQ2RrQ29uc3RydWN0TGlicmFyeSlcbiAgICApIHtcbiAgICAgICAgcHJvamVjdC5wYWNrYWdlLmFkZEZpZWxkKFwidHlwZVwiLCBcIm1vZHVsZVwiKTtcbiAgICB9XG5cbiAgICBwcm9qZWN0LmRlcHMucmVtb3ZlRGVwZW5kZW5jeShcInRzLW5vZGVcIik7XG4gICAgcHJvamVjdC5hZGREZXZEZXBzKFwidHN4XCIpO1xuICAgIHByb2plY3QuZGVmYXVsdFRhc2s/LnJlc2V0KCk7XG4gICAgcHJvamVjdC5kZWZhdWx0VGFzaz8uZXhlYyhgdHN4IC0tdHNjb25maWcgJHtwcm9qZWN0LnRzY29uZmlnRGV2LmZpbGUucGF0aH0gLnByb2plbnJjLnRzYCk7XG5cbiAgICBpZiAocHJvamVjdCBpbnN0YW5jZW9mIGF3c2Nkay5Bd3NDZGtUeXBlU2NyaXB0QXBwKSB7XG4gICAgICAgIHByb2plY3QuY2RrQ29uZmlnLmpzb24uYWRkT3ZlcnJpZGUoXCJhcHBcIiwgYG5weCB0c3ggJHtwcm9qZWN0LnNyY2Rpcn0vJHtwcm9qZWN0LmFwcEVudHJ5cG9pbnR9YCk7XG4gICAgfVxuXG4gICAgcHJvamVjdC52c2NvZGU/LmV4dGVuc2lvbnMuYWRkUmVjb21tZW5kYXRpb25zKFwiYmlvbWVqcy5iaW9tZVwiKTtcbiAgICBwcm9qZWN0LnZzY29kZT8uc2V0dGluZ3MuYWRkU2V0dGluZ3Moe1xuICAgICAgICBcImVkaXRvci5jb2RlQWN0aW9uc09uU2F2ZVwiOiB7XG4gICAgICAgICAgICBcInNvdXJjZS5vcmdhbml6ZUltcG9ydHMuYmlvbWVcIjogXCJhbHdheXNcIixcbiAgICAgICAgfSxcbiAgICAgICAgXCJlZGl0b3IuZGVmYXVsdEZvcm1hdHRlclwiOiBcImJpb21lanMuYmlvbWVcIixcbiAgICAgICAgXCJlZGl0b3IuZm9ybWF0T25TYXZlXCI6IHRydWUsXG4gICAgICAgIFwiZWRpdG9yLnRhYlNpemVcIjogNCxcbiAgICB9KTtcblxuICAgIGlmIChwcm9qZWN0IGluc3RhbmNlb2YgY2RrLkpzaWlQcm9qZWN0IHx8IHByb2plY3QgaW5zdGFuY2VvZiBhd3NjZGsuQXdzQ2RrQ29uc3RydWN0TGlicmFyeSkge1xuICAgICAgICBwcm9qZWN0LnBhY2thZ2UuYWRkRmllbGQoXCJwdWJsaXNoQ29uZmlnXCIsIHsgYWNjZXNzOiBcInB1YmxpY1wiIH0pO1xuICAgIH1cblxuICAgIC8vIHJlbW92ZSBvbmNlIGNvbmZpZ3VyZWQgY29ycmVjdGx5IHRvIGJpb21lLCBtaXNlIGFuZCB2aXRlc3QgY29tcG9uZW50c1xuICAgIHByb2plY3QubnBtaWdub3JlPy5hZGRQYXR0ZXJucyhcImJpb21lLmpzb25jXCIsIFwibWlzZS50b21sXCIsIFwidml0ZXN0LmNvbmZpZy50c1wiKTtcbn1cblxuZnVuY3Rpb24gaW5qZWN0Q29tcG9uZW50cyhcbiAgICBwcm9qZWN0OlxuICAgICAgICB8IGF3c2Nkay5Bd3NDZGtUeXBlU2NyaXB0QXBwXG4gICAgICAgIHwgYXdzY2RrLkF3c0Nka0NvbnN0cnVjdExpYnJhcnlcbiAgICAgICAgfCB0eXBlc2NyaXB0LlR5cGVTY3JpcHRQcm9qZWN0XG4gICAgICAgIHwgY2RrLkpzaWlQcm9qZWN0LFxuICAgIGNvbXBvbmVudHM6IENvbXBvbmVudFtdLFxuKSB7XG4gICAgZm9yIChjb25zdCB7IGNvbXBvbmVudCwgZW5hYmxlZCwgb3B0aW9ucyB9IG9mIGNvbXBvbmVudHMpIHtcbiAgICAgICAgaWYgKGVuYWJsZWQgPz8gdHJ1ZSkge1xuICAgICAgICAgICAgbmV3IGNvbXBvbmVudChwcm9qZWN0IGFzIG5ldmVyLCBvcHRpb25zIGFzIG5ldmVyKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5RGVmYXVsdHMoXG4gICAgcHJvamVjdDpcbiAgICAgICAgfCBhd3NjZGsuQXdzQ2RrVHlwZVNjcmlwdEFwcFxuICAgICAgICB8IGF3c2Nkay5Bd3NDZGtDb25zdHJ1Y3RMaWJyYXJ5XG4gICAgICAgIHwgdHlwZXNjcmlwdC5UeXBlU2NyaXB0UHJvamVjdFxuICAgICAgICB8IGNkay5Kc2lpUHJvamVjdCxcbiAgICBjb21wb25lbnRzOiBDb21wb25lbnRbXSxcbikge1xuICAgIGNvbmZpZ3VyZVByb2plY3QocHJvamVjdCk7XG4gICAgaW5qZWN0Q29tcG9uZW50cyhwcm9qZWN0LCBjb21wb25lbnRzKTtcbn1cblxuZXhwb3J0IGNvbnN0IHByb2plY3REZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBkZWZhdWx0UmVsZWFzZUJyYW5jaDogXCJtYWluXCIsXG4gICAgbWluTm9kZVZlcnNpb246IGRlZmF1bHRzLm1pbk5vZGVWZXJzaW9uLFxuICAgIGF1dG9BcHByb3ZlT3B0aW9uczoge1xuICAgICAgICBzZWNyZXQ6IFwiR0lUSFVCX1RPS0VOXCIsXG4gICAgICAgIGFsbG93ZWRVc2VybmFtZXM6IFtcIm5pa292aXJ0YWxhXCJdLFxuICAgIH0sXG4gICAgZGVwZW5kYWJvdDogZmFsc2UsXG4gICAgZGVwc1VwZ3JhZGVPcHRpb25zOiB7XG4gICAgICAgIHdvcmtmbG93T3B0aW9uczoge1xuICAgICAgICAgICAgbGFiZWxzOiBbXCJhdXRvLWFwcHJvdmVcIiwgXCJhdXRvLW1lcmdlXCJdLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgZ2l0aHViOiB0cnVlLFxuICAgIGdpdGh1Yk9wdGlvbnM6IHtcbiAgICAgICAgbWVyZ2lmeTogdHJ1ZSxcbiAgICB9LFxuICAgIGF1dG9NZXJnZTogdHJ1ZSxcbiAgICBqZXN0OiBmYWxzZSxcbiAgICBlc2xpbnQ6IGZhbHNlLFxuICAgIHByZXR0aWVyOiBmYWxzZSxcbiAgICBiaW9tZTogdHJ1ZSxcbiAgICBiaW9tZU9wdGlvbnM6IHtcbiAgICAgICAgYmlvbWVDb25maWc6IHtcbiAgICAgICAgICAgIGZvcm1hdHRlcjoge1xuICAgICAgICAgICAgICAgIGluZGVudFN0eWxlOiBqYXZhc2NyaXB0LmJpb21lX2NvbmZpZy5JbmRlbnRTdHlsZS5TUEFDRSxcbiAgICAgICAgICAgICAgICBpbmRlbnRXaWR0aDogNCxcbiAgICAgICAgICAgICAgICBsaW5lV2lkdGg6IDEyMCxcbiAgICAgICAgICAgICAgICB1c2VFZGl0b3Jjb25maWc6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgZm9ybWF0dGVyOiB0cnVlLFxuICAgICAgICBsaW50ZXI6IHRydWUsXG4gICAgfSxcbiAgICBwYWNrYWdlTWFuYWdlcjogamF2YXNjcmlwdC5Ob2RlUGFja2FnZU1hbmFnZXIuUE5QTSxcbiAgICBwbnBtVmVyc2lvbjogXCIxMi4xNi4xXCIsXG4gICAgLyoqXG4gICAgICogcG5wbSAxMSBvbmx5IHJlYWRzIGF1dGggYW5kIHJlZ2lzdHJ5IHNldHRpbmdzIGZyb20gYC5ucG1yY2AsIGV2ZXJ5dGhpbmcgZWxzZVxuICAgICAqIGhhcyB0byBsaXZlIGluIGBwbnBtLXdvcmtzcGFjZS55YW1sYC5cbiAgICAgKlxuICAgICAqIGBtaW5pbXVtUmVsZWFzZUFnZWAgZGVmYXVsdHMgdG8gMTQ0MCBtaW51dGVzIGluIHBucG0gMTEuIFRoYXQgY29vbGRvd24gbWFrZXNcbiAgICAgKiBwbnBtIHJlY29yZCB1bmF2b2lkYWJsZSBleGNlcHRpb25zIGluIGBtaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVgLCB3aGljaCBwcm9qZW5cbiAgICAgKiByZWdlbmVyYXRlcyBhd2F5IG9uIHRoZSBuZXh0IHN5bnRoLCBzbyB0aGUgZGVwZW5kZW5jeSB1cGdyYWRlIHdvcmtmbG93IHdvdWxkXG4gICAgICoga2VlcCBmbGlwLWZsb3BwaW5nIHRoaXMgZmlsZS4gU2V0IGl0IGV4cGxpY2l0bHkgdG8gb3B0IG91dC5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9wbnBtLmlvL21pZ3JhdGlvblxuICAgICAqIEBzZWUgaHR0cHM6Ly9wbnBtLmlvL3NldHRpbmdzL2RlcGVuZGVuY3ktcmVzb2x1dGlvbiNtaW5pbXVtcmVsZWFzZWFnZVxuICAgICAqL1xuICAgIHBucG1PcHRpb25zOiB7XG4gICAgICAgIHdvcmtzcGFjZVlhbWxPcHRpb25zOiB7XG4gICAgICAgICAgICBub2RlTGlua2VyOiBqYXZhc2NyaXB0LlBucG1Xb3Jrc3BhY2VZYW1sU2NoZW1hTm9kZUxpbmtlci5IT0lTVEVELFxuICAgICAgICAgICAgbWluaW11bVJlbGVhc2VBZ2U6IDAsXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIHBucG0gYmxvY2tzIGRlcGVuZGVuY3kgaW5zdGFsbCBzY3JpcHRzIGJ5IGRlZmF1bHQgYW5kLCBzaW5jZSBwbnBtIDExLCBmYWlsc1xuICAgICAgICAgICAgICogdGhlIGluc3RhbGwgd2hlbiBhbnkgYXJlIGlnbm9yZWQuIGVzYnVpbGQgbGlua3MgaXRzIHBsYXRmb3JtIGJpbmFyeSBpbiBhXG4gICAgICAgICAgICAgKiBwb3N0aW5zdGFsbCBzY3JpcHQgYW5kIGlzIHB1bGxlZCBpbiBieSB2aXRlc3QsIHNvIGFsbG93IGl0LiBgYWxsb3dCdWlsZHNgXG4gICAgICAgICAgICAgKiByZXBsYWNlcyB0aGUgYGFsbG93U2NyaXB0c2AgcHJvamVjdCBvcHRpb24sIHdoaWNoIHN0aWxsIHJlbmRlcnMgdGhlXG4gICAgICAgICAgICAgKiBgb25seUJ1aWx0RGVwZW5kZW5jaWVzYCBrZXkgdGhhdCBwbnBtIDExIG5vIGxvbmdlciByZWFkcy5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgYWxsb3dCdWlsZHM6IHsgZXNidWlsZDogdHJ1ZSB9LFxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBwbnBtIDExIGRlZmF1bHRzIGB2ZXJpZnlEZXBzQmVmb3JlUnVuYCB0byBgaW5zdGFsbGAsIHNvIGBwbnBtIGV4ZWNgIGFuZFxuICAgICAgICAgICAgICogYHBucG0gcnVuYCBpbnN0YWxsIGJlZm9yZSBydW5uaW5nLiBwcm9qZW4gcmVzb2x2ZXMgdGhlIHRhc2sgYFBBVEhgIHdpdGhcbiAgICAgICAgICAgICAqIGAkKHBucG0gLWMgZXhlYyAuLi4pYCwgd2hpY2ggcmUtZW50ZXJzIGBwbnBtIGluc3RhbGxgIHdoaWxlIGFuIGluc3RhbGwgaXNcbiAgICAgICAgICAgICAqIGFscmVhZHkgcnVubmluZyBhbmQgZGVhZGxvY2tzIG9uIHRoZSBzdG9yZSBsb2NrLiBwcm9qZW4gb3JjaGVzdHJhdGVzIHRoZVxuICAgICAgICAgICAgICogaW5zdGFsbHMgaXRzZWxmLCBzbyB0dXJuIHRoZSBjaGVjayBvZmYuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogQHNlZSBodHRwczovL3BucG0uaW8vc2V0dGluZ3MvYnVpbGQjdmVyaWZ5ZGVwc2JlZm9yZXJ1blxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICB2ZXJpZnlEZXBzQmVmb3JlUnVuOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHByb2plbnJjVHM6IHRydWUsXG4gICAgdHlwZXNjcmlwdFZlcnNpb246IGRlZmF1bHRzLnR5cGVzY3JpcHRWZXJzaW9uLFxuICAgIC8qKlxuICAgICAqIGpzaWkgdmFsaWRhdGVzIHRoZSBjb21waWxlIHRzY29uZmlnIGFnYWluc3QgaXRzIFwic3RyaWN0XCIgcnVsZSBzZXQsIHNvIGl0IG1heVxuICAgICAqIG9ubHkgY2Fycnkgb3B0aW9ucyBqc2lpIGFjY2VwdHMuIEV2ZXJ5dGhpbmcgZWxzZSBiZWxvbmdzIHRvIGB0c2NvbmZpZ0RldmAsXG4gICAgICogd2hpY2ggcHJvamVuIHJlbmRlcnMgYXMgdGhlIHR5cGUtY2hlY2sgb25seSBjb25maWcgZXh0ZW5kaW5nIHRoaXMgb25lLlxuICAgICAqL1xuICAgIHRzY29uZmlnOiB7XG4gICAgICAgIGNvbXBpbGVyT3B0aW9uczoge1xuICAgICAgICAgICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgICAgICAgICAgZGVjbGFyYXRpb246IHRydWUsXG4gICAgICAgICAgICBlc01vZHVsZUludGVyb3A6IHRydWUsXG4gICAgICAgICAgICBleHBlcmltZW50YWxEZWNvcmF0b3JzOiB0cnVlLFxuICAgICAgICAgICAgaW5saW5lU291cmNlTWFwOiB0cnVlLFxuICAgICAgICAgICAgaW5saW5lU291cmNlczogdHJ1ZSxcbiAgICAgICAgICAgIGlzb2xhdGVkTW9kdWxlczogdHJ1ZSxcbiAgICAgICAgICAgIG5vRmFsbHRocm91Z2hDYXNlc0luU3dpdGNoOiB0cnVlLFxuICAgICAgICAgICAgbm9JbXBsaWNpdEFueTogdHJ1ZSxcbiAgICAgICAgICAgIG5vSW1wbGljaXRSZXR1cm5zOiB0cnVlLFxuICAgICAgICAgICAgbm9JbXBsaWNpdFRoaXM6IHRydWUsXG4gICAgICAgICAgICBub1VudXNlZExvY2FsczogdHJ1ZSxcbiAgICAgICAgICAgIG5vVW51c2VkUGFyYW1ldGVyczogdHJ1ZSxcbiAgICAgICAgICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLFxuICAgICAgICAgICAgc3RyaWN0OiB0cnVlLFxuICAgICAgICAgICAgc3RyaWN0TnVsbENoZWNrczogdHJ1ZSxcbiAgICAgICAgICAgIHN0cmljdFByb3BlcnR5SW5pdGlhbGl6YXRpb246IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB0c2NvbmZpZ0Rldjoge1xuICAgICAgICBjb21waWxlck9wdGlvbnM6IHtcbiAgICAgICAgICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsXG4gICAgICAgICAgICBub0ltcGxpY2l0T3ZlcnJpZGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbn0gc2F0aXNmaWVzIFBhcnRpYWw8VHlwZVNjcmlwdFByb2plY3RPcHRpb25zPjtcblxuY29uc3QgZXNNb2R1bGVUc2NvbmZpZ09wdGlvbnMgPSB7XG4gICAgdHNjb25maWc6IHtcbiAgICAgICAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgICAgICAgICBhbGxvd0ltcG9ydGluZ1RzRXh0ZW5zaW9uczogdHJ1ZSxcbiAgICAgICAgICAgIGxpYjogW1wiZXNuZXh0XCJdLFxuICAgICAgICAgICAgbW9kdWxlOiBcIm5vZGVuZXh0XCIsXG4gICAgICAgICAgICBtb2R1bGVSZXNvbHV0aW9uOiBqYXZhc2NyaXB0LlR5cGVTY3JpcHRNb2R1bGVSZXNvbHV0aW9uLk5PREVfTkVYVCxcbiAgICAgICAgICAgIG5vRW1pdDogdHJ1ZSxcbiAgICAgICAgICAgIHRhcmdldDogXCJlc25leHRcIixcbiAgICAgICAgfSxcbiAgICB9LFxufSBzYXRpc2ZpZXMgUGFydGlhbDxUeXBlU2NyaXB0UHJvamVjdE9wdGlvbnM+O1xuXG5jb25zdCBwdWJsaXNoYWJsZVByb2plY3REZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBhdXRob3I6IGRlZmF1bHRzLmF1dGhvcixcbiAgICBhdXRob3JBZGRyZXNzOiBkZWZhdWx0cy5hdXRob3JBZGRyZXNzLFxuICAgIG5wbVRydXN0ZWRQdWJsaXNoaW5nOiB0cnVlLFxufSBzYXRpc2ZpZXMgUGFydGlhbDxjZGsuSnNpaVByb2plY3RPcHRpb25zPjtcblxuY29uc3QgY2RrRGVmYXVsdFZlcnNpb25PcHRpb25zID0ge1xuICAgIGNka1ZlcnNpb246IGRlZmF1bHRzLmNka1ZlcnNpb24sXG4gICAgY29uc3RydWN0c1ZlcnNpb246IGRlZmF1bHRzLmNvbnN0cnVjdHNWZXJzaW9uLFxufSBzYXRpc2ZpZXMgUGFydGlhbDxhd3NjZGsuQXdzQ2RrQ29uc3RydWN0TGlicmFyeU9wdGlvbnM+O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgdHlwZXNjcmlwdDoge1xuICAgICAgICBUeXBlU2NyaXB0UHJvamVjdDogbWVyZ2VBbGw8dHlwZXNjcmlwdC5UeXBlU2NyaXB0UHJvamVjdE9wdGlvbnM+KFxuICAgICAgICAgICAgcHJvamVjdERlZmF1bHRPcHRpb25zLFxuICAgICAgICAgICAgZXNNb2R1bGVUc2NvbmZpZ09wdGlvbnMsXG4gICAgICAgICksXG4gICAgfSxcbiAgICBjZGs6IHtcbiAgICAgICAgSnNpaVByb2plY3Q6IG1lcmdlQWxsPGNkay5Kc2lpUHJvamVjdE9wdGlvbnM+KHByb2plY3REZWZhdWx0T3B0aW9ucywgcHVibGlzaGFibGVQcm9qZWN0RGVmYXVsdE9wdGlvbnMsIHtcbiAgICAgICAgICAgIGpzaWlWZXJzaW9uOiBkZWZhdWx0cy5qc2lpVmVyc2lvbixcbiAgICAgICAgfSksXG4gICAgfSxcbiAgICBhd3NjZGs6IHtcbiAgICAgICAgQXdzQ2RrVHlwZVNjcmlwdEFwcDogbWVyZ2VBbGw8YXdzY2RrLkF3c0Nka1R5cGVTY3JpcHRBcHBPcHRpb25zPihcbiAgICAgICAgICAgIHByb2plY3REZWZhdWx0T3B0aW9ucyxcbiAgICAgICAgICAgIGVzTW9kdWxlVHNjb25maWdPcHRpb25zLFxuICAgICAgICAgICAgY2RrRGVmYXVsdFZlcnNpb25PcHRpb25zLFxuICAgICAgICApLFxuICAgICAgICBBd3NDZGtDb25zdHJ1Y3RMaWJyYXJ5OiBtZXJnZUFsbDxhd3NjZGsuQXdzQ2RrQ29uc3RydWN0TGlicmFyeU9wdGlvbnM+KFxuICAgICAgICAgICAgcHJvamVjdERlZmF1bHRPcHRpb25zLFxuICAgICAgICAgICAgcHVibGlzaGFibGVQcm9qZWN0RGVmYXVsdE9wdGlvbnMsXG4gICAgICAgICAgICBjZGtEZWZhdWx0VmVyc2lvbk9wdGlvbnMsXG4gICAgICAgICksXG4gICAgfSxcbn07XG4iXX0=
@@ -428,7 +428,7 @@ class TypeScriptClassRenderer {
428
428
  */
429
429
  class ProjectGenerator extends projen.Component {
430
430
  options;
431
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.ProjectGenerator", version: "0.3.84" };
431
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.ProjectGenerator", version: "0.4.1" };
432
432
  renderer;
433
433
  static enumGenerated = false;
434
434
  /**
@@ -15,7 +15,7 @@ const utils_1 = require("../utils");
15
15
  * Extends Projen's base class with opinionated defaults and automatic component setup.
16
16
  */
17
17
  class AwsCdkConstructLibraryProject extends projen_1.awscdk.AwsCdkConstructLibrary {
18
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.AwsCdkConstructLibraryProject", version: "0.3.84" };
18
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.AwsCdkConstructLibraryProject", version: "0.4.1" };
19
19
  /**
20
20
  * @param options - Project configuration
21
21
  */
@@ -15,7 +15,7 @@ const utils_1 = require("../utils");
15
15
  * Extends Projen's base class with opinionated defaults and automatic component setup.
16
16
  */
17
17
  class AwsCdkTypeScriptAppProject extends projen_1.awscdk.AwsCdkTypeScriptApp {
18
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.AwsCdkTypeScriptAppProject", version: "0.3.84" };
18
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.AwsCdkTypeScriptAppProject", version: "0.4.1" };
19
19
  /**
20
20
  * @param options - Project configuration
21
21
  */
@@ -16,7 +16,7 @@ const utils_1 = require("../utils");
16
16
  * Extends Projen's base class with opinionated defaults and automatic component setup.
17
17
  */
18
18
  class JsiiProject extends projen_1.cdk.JsiiProject {
19
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.JsiiProject", version: "0.3.84" };
19
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.JsiiProject", version: "0.4.1" };
20
20
  /**
21
21
  * @param options - Project configuration
22
22
  */
@@ -15,7 +15,7 @@ const utils_1 = require("../utils");
15
15
  * Extends Projen's base class with opinionated defaults and automatic component setup.
16
16
  */
17
17
  class TypeScriptProject extends projen_1.typescript.TypeScriptProject {
18
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.TypeScriptProject", version: "0.3.84" };
18
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.TypeScriptProject", version: "0.4.1" };
19
19
  /**
20
20
  * @param options - Project configuration
21
21
  */
package/lib/versions.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "cdkVersion": "2.275.0",
3
3
  "typescriptVersion": "6.0.3",
4
- "minNodeVersion": "24.22.2"
4
+ "minNodeVersion": "26.13.0"
5
5
  }
package/package.json CHANGED
@@ -14,8 +14,8 @@
14
14
  "@biomejs/biome": "^2.5",
15
15
  "@jsii/spec": "^1.142.0",
16
16
  "@mrgrain/cdk-esbuild": "5.8.5",
17
- "@types/node": "^24",
18
- "@vitest/coverage-v8": "^4",
17
+ "@types/node": "^26",
18
+ "@vitest/coverage-v8": "^5",
19
19
  "commit-and-tag-version": "^13",
20
20
  "constructs": "^10.8.1",
21
21
  "esbuild": "^0.28.2",
@@ -24,33 +24,33 @@
24
24
  "jsii-docgen": "^10.5.0",
25
25
  "jsii-pacmak": "^1.142.0",
26
26
  "jsii-rosetta": "~6.0.3",
27
- "projen": "^0.104.21",
27
+ "projen": "^0.104.23",
28
28
  "tsx": "^4.23.15",
29
29
  "typedoc": "^0.28",
30
30
  "typescript": "6.0.3",
31
- "vitest": "^4"
31
+ "vitest": "^5"
32
32
  },
33
33
  "peerDependencies": {
34
34
  "@mrgrain/cdk-esbuild": "^5.8.5",
35
35
  "constructs": "^10.8.1",
36
- "projen": "^0.104.21"
36
+ "projen": "^0.104.23"
37
37
  },
38
38
  "dependencies": {
39
39
  "@mrgrain/jsii-struct-builder": "^0.7.64",
40
40
  "case": "^1.6.3",
41
- "projen": "^0.104.21"
41
+ "projen": "^0.104.23"
42
42
  },
43
43
  "bundledDependencies": [
44
44
  "@mrgrain/jsii-struct-builder",
45
45
  "case"
46
46
  ],
47
47
  "engines": {
48
- "node": ">= 24.22.2"
48
+ "node": ">= 26.13.0"
49
49
  },
50
50
  "devEngines": {
51
51
  "packageManager": {
52
52
  "name": "pnpm",
53
- "version": "11.20.0",
53
+ "version": "12.16.1",
54
54
  "onFail": "ignore"
55
55
  }
56
56
  },
@@ -60,7 +60,7 @@
60
60
  "publishConfig": {
61
61
  "access": "public"
62
62
  },
63
- "version": "0.3.84",
63
+ "version": "0.4.1",
64
64
  "types": "lib/index.d.ts",
65
65
  "jsii": {
66
66
  "outdir": "dist",