@xpertss/projen-types 0.0.21 → 0.0.23

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.
Files changed (45) hide show
  1. package/.jsii +445 -309
  2. package/API.md +1453 -385
  3. package/README.md +40 -16
  4. package/lib/actions/action-build-workflow.js +11 -4
  5. package/lib/actions/action-dogfood-workflow.js +1 -1
  6. package/lib/actions/action-sonar-workflow.d.ts +10 -29
  7. package/lib/actions/action-sonar-workflow.js +9 -58
  8. package/lib/actions/github-action-project.d.ts +5 -22
  9. package/lib/actions/github-action-project.js +16 -12
  10. package/lib/cdk/app-runtime-scaffold.js +1 -1
  11. package/lib/cdk/cdk-app-project.js +1 -1
  12. package/lib/cdk/cdk-infra-project.js +1 -1
  13. package/lib/cdk/cdk-typescript-base.d.ts +3 -0
  14. package/lib/cdk/cdk-typescript-base.js +14 -2
  15. package/lib/cdk/components/ecr-ecs-constructs.js +1 -1
  16. package/lib/cdk/components/edge-networking-constructs.js +1 -1
  17. package/lib/cdk/database-component.js +1 -1
  18. package/lib/cdk/options.d.ts +2 -1
  19. package/lib/cdk/options.js +1 -1
  20. package/lib/common/projen-drift-check-workflow.js +1 -1
  21. package/lib/common/sonar-options.d.ts +29 -0
  22. package/lib/common/sonar-options.js +3 -0
  23. package/lib/common/sonar-workflow.d.ts +48 -0
  24. package/lib/common/sonar-workflow.js +75 -0
  25. package/lib/common/workflow-change-notice-workflow.js +1 -1
  26. package/lib/index.d.ts +2 -0
  27. package/lib/index.js +3 -1
  28. package/lib/java/components/cdk-deploy-hook.js +1 -1
  29. package/lib/java/components/code-index-workflow.js +1 -1
  30. package/lib/java/components/docker-publish.js +1 -1
  31. package/lib/java/components/flyway-migration.js +1 -1
  32. package/lib/java/components/github-packages-publish.js +1 -1
  33. package/lib/java/components/maven-central-publish.js +1 -1
  34. package/lib/java/components/maven-upgrade-report.js +1 -1
  35. package/lib/java/java-app-project.js +1 -1
  36. package/lib/java/java-library-project.js +1 -1
  37. package/lib/java/java-maven-base.d.ts +6 -2
  38. package/lib/java/java-maven-base.js +18 -14
  39. package/lib/java/java-service-project.js +1 -1
  40. package/lib/java/java-spring-boot-project.js +1 -1
  41. package/lib/java/maven/maven-module.js +1 -1
  42. package/lib/java/maven/maven-pom.js +1 -1
  43. package/lib/java/options.d.ts +2 -3
  44. package/lib/java/options.js +1 -1
  45. package/package.json +1 -1
package/README.md CHANGED
@@ -36,6 +36,7 @@ All project types:
36
36
  - run a **drift check** in PR builds - a job that re-runs projen and fails if generated files were hand-edited. Edit `.projenrc.ts`, then run `npx projen`; never edit generated files directly.
37
37
  - use the GitHub secret `PROJEN_GITHUB_TOKEN` (a fine-grained PAT) for projen's automation. Override with `gheTokenSecret`.
38
38
  - make all publishing/deploying **manual** (workflow_dispatch) rather than on every merge.
39
+ - offer an opt-in SonarCloud scan (`sonar.yml`) on any type via `sonarHostUrl` (see [SonarCloud (opt-in)](#sonarcloud-opt-in)).
39
40
 
40
41
  ## Getting started
41
42
 
@@ -60,9 +61,9 @@ installs dependencies. The type names `projen new` accepts are `cdk_infra`,
60
61
  `cdk_app`, `java_maven`, `java_library`, `java_app`, `java_spring_boot`,
61
62
  `java_service` and `git_hub_action`; pass a bogus one to have it list them.
62
63
  Required options become flags: `--name` for every type, plus
63
- `--group-id`/`--artifact-id` (Java) and `--sonar-host-url`
64
- (`git_hub_action`). Any other plainly-typed option can be passed the same
65
- way - `--java-version 1.8`, `--cdk-deploy-target-repo owner/repo`,
64
+ `--group-id`/`--artifact-id` (Java). Any other plainly-typed option can be
65
+ passed the same way - `--sonar-host-url` (opt-in Sonar, all types),
66
+ `--java-version 1.8`, `--cdk-deploy-target-repo owner/repo`,
66
67
  `--docker-registry ghcr.io`, `--no-use-flyway`, and so on. Modules can't be
67
68
  passed on the command line; add them to `.projenrc.ts` afterwards (see
68
69
  [JavaMavenProject](#javamavenproject)).
@@ -329,7 +330,7 @@ You get:
329
330
  - **exact versions only**: a range such as `^1`, `~1.2` or `[1,2)` fails the synth
330
331
  - the compiler level, enforcer rule and JUnit line all follow `javaVersion`
331
332
  - one Maven run per build. `npx projen build` synthesizes, then runs `mvn -B verify`: compile, unit tests (surefire), package, and `*IT` integration tests (failsafe). There is no `mvn deploy` and no `dist/`.
332
- - `.github/workflows/build.yml`: a PR build that installs the pinned Node toolchain (`npm ci`) and the project's JDK (`actions/setup-java`, Maven cache), then runs `npx projen build`, plus a SonarQube step when `sonarProjectKey` is set. See [Adding CI jobs](#adding-ci-jobs-to-a-java-project).
333
+ - `.github/workflows/build.yml`: a PR build that installs the pinned Node toolchain (`npm ci`) and the project's JDK (`actions/setup-java`, Maven cache), then runs `npx projen build`. The Maven build itself never runs a Sonar step - SonarCloud scanning is a separate, opt-in `sonar.yml` (set `sonarHostUrl`). See [Adding CI jobs](#adding-ci-jobs-to-a-java-project) and [SonarCloud (opt-in)](#sonarcloud-opt-in).
333
334
  - `.github/workflows/upgrade.yml`: a nightly (03:00 UTC) **report** of available dependency and plugin updates in the job summary. It changes nothing, because every version comes from `.projenrc.ts`; apply an update there. Turn it off with `upgradeWorkflow: false`. The same report runs locally with `npx projen upgrade`.
334
335
  - the projen drift check, `LICENSE` (MIT by default), `.editorconfig`, and a generated `package.json` that pins the projen toolchain exactly.
335
336
  - no sample code, unless `sample: true` on a single-module project.
@@ -353,7 +354,7 @@ const project = new JavaLibraryProject({
353
354
  groupId: 'org.xpertss',
354
355
  artifactId: 'common-utils',
355
356
  version: '1.0.0',
356
- sonarProjectKey: 'org.xpertss:common-utils',
357
+ sonarHostUrl: 'https://sonarcloud.io', // opt-in: adds sonar.yml (see SonarCloud)
357
358
  mavenCentralOidc: true,
358
359
  });
359
360
 
@@ -491,7 +492,7 @@ import { GitHubActionProject } from '@xpertss/projen-types';
491
492
  const project = new GitHubActionProject({
492
493
  name: 'auto-commit',
493
494
  description: 'Stage a folder and, only if it changed, commit and push it',
494
- sonarHostUrl: 'https://sonarcloud.io', // required, no default - your SonarCloud URL
495
+ sonarHostUrl: 'https://sonarcloud.io', // optional - set it to add sonar.yml (see SonarCloud)
495
496
  sonarOrganization: 'xpertss', // default - your SonarCloud org key
496
497
  dogfood: {
497
498
  // Two scenario steps: the "changed" path and the "no-op" path are both
@@ -538,14 +539,14 @@ project.synth();
538
539
  You get:
539
540
 
540
541
  - `action.yml` and `auto-commit.sh` are hand-written - this type only lints their content via `build.yml`'s shellcheck/yamllint/actionlint checks.
541
- - `.github/workflows/build.yml` - lint gate: `apt`-installed shellcheck/yamllint plus a pinned, SHA-256-verified `actionlint` release binary. Gates `main` alongside `sonar.yml`.
542
+ - `.github/workflows/build.yml` - lint gate: `apt`-installed shellcheck/yamllint plus a pinned, SHA-256-verified `actionlint` release binary. Gates `main` (alongside `sonar.yml` when Sonar is enabled).
542
543
  - `.github/workflows/test-dogfood.yml` - runs the `dogfood.scenario` steps above against this repo's own `action.yml` (via `uses: ./`), then the shared `cleanup`, on `workflow_dispatch`, every `pull_request`, and nightly. Omit `dogfood` and the workflow still exists, with one step that fails on every PR until you declare a scenario - AD-001 allows a dogfood to be missing loudly, never silently. A *partial* `dogfood` (a scenario with no cleanup) is a synth error.
543
- - `.github/workflows/sonar.yml` - SonarCloud scan via the Scanner CLI (the quality gate blocks the PR), scanning `action.yml`/`.github/workflows/**`/`**/*.sh` explicitly.
544
+ - `.github/workflows/sonar.yml` - SonarCloud scan via the Scanner CLI (the quality gate blocks the PR), scanning `action.yml`/`.github/workflows/**`/`**/*.sh` explicitly. Opt-in: generated only when `sonarHostUrl` is set (see [SonarCloud (opt-in)](#sonarcloud-opt-in)).
544
545
  - `.github/workflows/release.yml` - `feat:`/`fix:` commits on `main` bump the version, tag `vX.Y.Z`, and create a GitHub Release.
545
546
  - `.github/workflows/projen-drift-check.yml` and `workflow-change-notice.yml` - drift detection and a change notice, always included.
546
547
  - `package.json` (**private**, version source only), `.yamllint`, `LICENSE` (MIT by default), and a `README.md` template - all regenerated by `npx projen`.
547
548
 
548
- Needs the same two secrets as everything else in this package: `PROJEN_GITHUB_TOKEN` (used for automated PR comments) and `SONAR_TOKEN` (the Sonar scan). Onboard a brand-new action repo by running the `projen new` command above first (see [Getting started](#getting-started)), then replace the generated `.projenrc.ts` with the one above and run `npx projen`, then hand-write `action.yml`/`auto-commit.sh`/`test/fixtures/`. If you wrote the `.projenrc.ts` before running `projen new`, see [Starting from an existing `.projenrc.ts`](#starting-from-an-existing-projenrcts).
549
+ Needs `PROJEN_GITHUB_TOKEN` (used for automated PR comments), and `SONAR_TOKEN` only when Sonar is enabled (see [SonarCloud (opt-in)](#sonarcloud-opt-in)). Onboard a brand-new action repo by running the `projen new` command above first (see [Getting started](#getting-started)), then replace the generated `.projenrc.ts` with the one above and run `npx projen`, then hand-write `action.yml`/`auto-commit.sh`/`test/fixtures/`. If you wrote the `.projenrc.ts` before running `projen new`, see [Starting from an existing `.projenrc.ts`](#starting-from-an-existing-projenrcts).
549
550
 
550
551
  ## Java version support
551
552
 
@@ -640,7 +641,7 @@ Java project types (`JavaMavenProjectOptions` and everything built on it - `Java
640
641
  | `copyrightOwner` / `copyrightPeriod` | `Xpert Software` / current year | Named in the `LICENSE` |
641
642
  | `editorconfig` | `true` | Write a projen-managed `.editorconfig` (also on the CDK and action types) |
642
643
  | `upgradeWorkflow` | `true` | Generate the nightly update report (`upgrade.yml`) |
643
- | `sonarProjectKey` | - | SonarQube project key; the sonar step is skipped when unset |
644
+ | Sonar options | - | `sonarHostUrl`, `sonarOrganization`, `sonarTokenSecret`, `sonarPullRequestGate`, `sonarProjectKey` - SonarCloud is opt-in; see [SonarCloud (opt-in)](#sonarcloud-opt-in) |
644
645
  | `gheTokenSecret` | `PROJEN_GITHUB_TOKEN` | GitHub secret holding projen's PAT |
645
646
  | `springBootVersion` | newest Boot for `javaVersion` (Spring Boot types only) | Exact Spring Boot version: the BOM and `spring-boot-maven-plugin` |
646
647
  | `cdkDeployTargetRepo` | - (service only; `deploy-cdk.yml` fails until set) | Companion CDK repo (`owner/repo`) whose `deploy.yml` the deploy hook dispatches |
@@ -692,10 +693,7 @@ Plain strings (`'dev'`) are shorthand for `{ name: 'dev' }`.
692
693
  | --- | --- | --- |
693
694
  | `name` | - (required) | Project name |
694
695
  | `description` | - | One-line description; used in the default README template and recorded in the private `package.json` |
695
- | `sonarHostUrl` | - (required) | URL of your SonarCloud instance (e.g. `https://sonarcloud.io`); must be reachable from github.com-hosted runners |
696
- | `sonarOrganization` | `xpertss` | SonarCloud org key (`sonar.organization`); required by the Scanner CLI, not derived from the token |
697
- | `sonarTokenSecret` | `SONAR_TOKEN` | GitHub secret holding the Sonar token |
698
- | `sonarPullRequestGate` | `true` | Whether `sonar.yml` also runs on `pull_request` as a pass/fail gate |
696
+ | Sonar options | - | `sonarHostUrl`, `sonarOrganization`, `sonarTokenSecret`, `sonarPullRequestGate`, `sonarProjectKey` - SonarCloud is opt-in; see [SonarCloud (opt-in)](#sonarcloud-opt-in) |
699
697
  | `dogfood` | - (a `test-dogfood.yml` that fails until you declare one) | `ActionDogfoodOptions` - the scenario that exercises the action end-to-end via `uses: ./` |
700
698
  | `license` | `MIT` | SPDX identifier for the generated `LICENSE` |
701
699
  | `copyrightOwner` / `copyrightPeriod` | `Xpert Software` / current year | Named in the `LICENSE` |
@@ -720,12 +718,38 @@ interface ActionDogfoodStep {
720
718
 
721
719
  Most actions need exactly one `scenario` step. Actions with a re-run/no-op/idempotency behavior to verify (e.g. `auto-commit`'s no-op-on-no-change path, `create-pull-request`'s reuse-the-PR path) declare two - the second typically omits `fixtureSteps` so its invocation sees no new state, and its assertion checks the opposite outcome of the first. Reference an invocation's own outputs from a later assertion via `${{ steps.<id>.outputs.<name> }}`, using either the default slug or an explicit `id`.
722
720
 
721
+ ## SonarCloud (opt-in)
722
+
723
+ SonarCloud is a shared, **opt-in** capability on every project type (CDK, Java, and GitHub Action). Set `sonarHostUrl` on any type and it generates a `.github/workflows/sonar.yml` that runs a pinned, SHA-256-verified Sonar Scanner CLI and blocks the PR on the quality gate. Omit it and no `sonar.yml` is generated. The Maven build itself never runs a Sonar step.
724
+
725
+ Shared options (accepted by the CDK types, every Java type, and `GitHubActionProject`):
726
+
727
+ | Option | Default | Description |
728
+ | --- | --- | --- |
729
+ | `sonarHostUrl` | - (required to enable) | URL of your SonarCloud instance (e.g. `https://sonarcloud.io`); must be reachable from github.com-hosted runners |
730
+ | `sonarOrganization` | `xpertss` | SonarCloud org key (`sonar.organization`); required by the Scanner CLI, not derived from the token |
731
+ | `sonarProjectKey` | `${sonarOrganization}_${name}` | `sonar.projectKey` - the org + project key SonarCloud uses (e.g. `xpertss_create-pull-request`) |
732
+ | `sonarTokenSecret` | `SONAR_TOKEN` | GitHub secret holding the Sonar token |
733
+ | `sonarPullRequestGate` | `true` | Whether `sonar.yml` also runs on `pull_request` as a pass/fail gate |
734
+
735
+ Inclusions differ by type: a `GitHubActionProject` scans `action.yml`/`.github/workflows/**`/`**/*.sh` explicitly (YAML and shell are not in Sonar's default-recognized set), while the CDK and Java types rely on Sonar's default inclusions for their languages.
736
+
737
+ ```typescript
738
+ new CdkInfraProject({
739
+ name: 'my-infra',
740
+ environments: ['dev', 'prod'],
741
+ sonarHostUrl: 'https://sonarcloud.io', // adds sonar.yml
742
+ });
743
+ ```
744
+
745
+ Requires the `SONAR_TOKEN` secret (rename it with `sonarTokenSecret`).
746
+
723
747
  ## Required GitHub secrets
724
748
 
725
749
  | Secret | Used by | Notes |
726
750
  | --- | --- | --- |
727
751
  | `PROJEN_GITHUB_TOKEN` | all types | PAT for projen's self-mutation/automation; override via `gheTokenSecret` |
728
- | `SONAR_TOKEN` | Java types with `sonarProjectKey`; `GitHubActionProject` | SonarQube scan step in `build.yml` / `sonar.yml`; override via `sonarTokenSecret` on `GitHubActionProject` |
752
+ | `SONAR_TOKEN` | any type with `sonarHostUrl` set | SonarCloud scan in `sonar.yml`; override the secret name via `sonarTokenSecret` |
729
753
  | `DOCKER_USERNAME` / `DOCKER_PASSWORD` | `JavaServiceProject` | Docker image push |
730
754
  | `MAVEN_GPG_PRIVATE_KEY`, `MAVEN_GPG_PASSPHRASE`, `MAVEN_CENTRAL_USERNAME`, `MAVEN_CENTRAL_PASSWORD` | `JavaLibraryProject` without `mavenCentralOidc` | Not needed with OIDC trusted publishing |
731
755
 
@@ -780,7 +804,7 @@ The project types are composed from smaller components you can also attach to yo
780
804
  | `CodeIndexWorkflow` | `JavaMavenProject` | Code index generation on push to `main` |
781
805
  | `ActionBuildWorkflow` | `GitHubProject` | The `lint` task (shellcheck/yamllint/pinned actionlint) + `build.yml` |
782
806
  | `ActionDogfoodWorkflow` | `GitHubProject` | `test-dogfood.yml` from an `ActionDogfoodOptions` scenario |
783
- | `ActionSonarWorkflow` | `GitHubProject` | `sonar.yml` (SonarCloud scan via the Scanner CLI) |
807
+ | `SonarWorkflow` | `GitHubProject` | `sonar.yml` (SonarCloud scan via the Scanner CLI); opt-in, shared by every type via `sonarHostUrl` |
784
808
 
785
809
  Example - adding a Docker publish to a `JavaMavenProject` (`JavaServiceProject` is the packaged version of this, with Spring Boot):
786
810
 
@@ -20,7 +20,7 @@ const ACTIONLINT_SHA256 = '8aca8db96f1b94770f1b0d72b6dddcb1ebb8123cb3712530b08cc
20
20
  * the release build job, so the lint commands exist in exactly one place.
21
21
  */
22
22
  class ActionBuildWorkflow extends projen_1.Component {
23
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.ActionBuildWorkflow", version: "0.0.21" };
23
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.ActionBuildWorkflow", version: "0.0.23" };
24
24
  task;
25
25
  workflow;
26
26
  constructor(scope) {
@@ -34,16 +34,23 @@ class ActionBuildWorkflow extends projen_1.Component {
34
34
  });
35
35
  this.task.exec('sudo apt-get update -y && sudo apt-get install -y shellcheck yamllint');
36
36
  this.task.exec('find . -path ./node_modules -prune -o -name "*.sh" -print0 | xargs -0 -r shellcheck');
37
- this.task.exec('yamllint -c .yamllint action.yml .github/workflows/*.yml');
37
+ // Hand-written YAML only: the workflows are projen-generated (and
38
+ // drift-checked), and their long lines would fail `line-length`.
39
+ this.task.exec('yamllint -c .yamllint action.yml');
38
40
  // One step, so the private `mktemp -d` dir carries from download through
39
41
  // execution - never the world-writable shared /tmp, where another local
40
42
  // user could plant the binary that gets run.
43
+ // Workflows only: actionlint parses every file argument as a workflow,
44
+ // so the composite `action.yml` is validated transitively via
45
+ // `uses: ./` instead. `-shellcheck=` disables its incidental shellcheck
46
+ // pass over generated `run:` scripts (e.g. projen's own `release.yml`);
47
+ // hand-written `*.sh` files are covered by the shellcheck step above.
41
48
  this.task.exec([
42
49
  'TMP="$(mktemp -d)"',
43
50
  `curl -fsSL -o "$TMP/actionlint.tar.gz" "https://github.com/rhysd/actionlint/releases/download/v${ACTIONLINT_VERSION}/actionlint_${ACTIONLINT_VERSION}_linux_amd64.tar.gz"`,
44
51
  `echo "${ACTIONLINT_SHA256} $TMP/actionlint.tar.gz" | sha256sum -c -`,
45
52
  'tar -xzf "$TMP/actionlint.tar.gz" -C "$TMP" actionlint',
46
- '"$TMP/actionlint" action.yml .github/workflows/*.yml',
53
+ '"$TMP/actionlint" -shellcheck= .github/workflows/*.yml',
47
54
  ].join(' && '));
48
55
  this.workflow = new projen_1.github.TaskWorkflow(gh, {
49
56
  name: 'build',
@@ -57,4 +64,4 @@ class ActionBuildWorkflow extends projen_1.Component {
57
64
  }
58
65
  }
59
66
  exports.ActionBuildWorkflow = ActionBuildWorkflow;
60
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLWJ1aWxkLXdvcmtmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FjdGlvbnMvYWN0aW9uLWJ1aWxkLXdvcmtmbG93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxtQ0FBaUQ7QUFDakQsaUVBQWlFO0FBRWpFLDBFQUEwRTtBQUMxRSw0REFBNEQ7QUFDNUQsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUM7QUFDcEMsTUFBTSxpQkFBaUIsR0FDckIsa0VBQWtFLENBQUM7QUFFckU7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQWEsbUJBQW9CLFNBQVEsa0JBQVM7O0lBQ2hDLElBQUksQ0FBTztJQUNYLFFBQVEsQ0FBc0I7SUFFOUMsWUFBWSxLQUEyQjtRQUNyQyxLQUFLLENBQUMsS0FBSyxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFFcEMsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUN4QixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDUixNQUFNLElBQUksS0FBSyxDQUNiLCtEQUErRCxDQUNoRSxDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDaEMsV0FBVyxFQUFFLG9EQUFvRDtTQUNsRSxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDWix1RUFBdUUsQ0FDeEUsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNaLHFGQUFxRixDQUN0RixDQUFDO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsMERBQTBELENBQUMsQ0FBQztRQUMzRSx5RUFBeUU7UUFDekUsd0VBQXdFO1FBQ3hFLDZDQUE2QztRQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDWjtZQUNFLG9CQUFvQjtZQUNwQixrR0FBa0csa0JBQWtCLGVBQWUsa0JBQWtCLHNCQUFzQjtZQUMzSyxTQUFTLGlCQUFpQiw0Q0FBNEM7WUFDdEUsd0RBQXdEO1lBQ3hELHNEQUFzRDtTQUN2RCxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FDZixDQUFDO1FBRUYsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLGVBQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFO1lBQzFDLElBQUksRUFBRSxPQUFPO1lBQ2IsS0FBSyxFQUFFLE9BQU87WUFDZCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUU7WUFDM0QsV0FBVyxFQUFFLEVBQUUsUUFBUSxFQUFFLGVBQU0sQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRTtZQUM5RCxhQUFhLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxzQkFBc0IsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUM7U0FDakUsQ0FBQyxDQUFDO1FBQ0gsSUFBQSxzQ0FBbUIsRUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQ2xCLDhEQUE4RCxDQUMvRCxDQUFDO0lBQ0osQ0FBQzs7QUFqREgsa0RBa0RDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBUYXNrLCBnaXRodWIgfSBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgbm90ZVdvcmtmbG93UHVycG9zZSB9IGZyb20gJy4uL2NvbW1vbi93b3JrZmxvdy1wdXJwb3NlJztcblxuLy8gUGlubmVkIHJlbGVhc2UgKyB2ZXJpZmllZCBTSEEtMjU2IChsaW51eF9hbWQ2NCkgLSB1cGdyYWRlIGlzIGEgcmV2aWV3ZWRcbi8vIGRpZmYgb2YgdGhpcyBjb25zdGFudCwgbmV2ZXIgYSBmbG9hdGluZyB2ZXJzaW9uIChBRC0wMDEpLlxuY29uc3QgQUNUSU9OTElOVF9WRVJTSU9OID0gJzEuNy4xMic7XG5jb25zdCBBQ1RJT05MSU5UX1NIQTI1NiA9XG4gICc4YWNhOGRiOTZmMWI5NDc3MGYxYjBkNzJiNmRkZGNiMWViYjgxMjNjYjM3MTI1MzBiMDhjYzM4N2IzNDlhM2Q4JztcblxuLyoqXG4gKiBUaGUgQUQtMDAxIExheWVyLTEgbGludCBnYXRlIGZvciBhIGNvbXBvc2l0ZS1hY3Rpb24gcmVwbzogc2hlbGxjaGVjayxcbiAqIHlhbWxsaW50LCBhbmQgYSBwaW5uZWQgYGFjdGlvbmxpbnRgIHJlbGVhc2UgYmluYXJ5ICh2ZXJpZmllZCBieSBTSEEtMjU2LFxuICogbmV2ZXIgYSBtYXJrZXRwbGFjZSBhY3Rpb24gLSBvcmcgcG9saWN5KS4gQ3JlYXRlcyBhIGRlZGljYXRlZCBgbGludGAgdGFza1xuICogKG5hbWVkIHRvIGF2b2lkIGNvbGxpZGluZyB3aXRoIHByb2plbidzIG93biByZXNlcnZlZCBgYnVpbGRgIHRhc2ssIHdoaWNoXG4gKiBzcGF3bnMgdGhlIHVucmVsYXRlZCBkZWZhdWx0L3ByZS1jb21waWxlL2NvbXBpbGUvcG9zdC1jb21waWxlL3Rlc3QvcGFja2FnZVxuICogY2hhaW4gLSBpbmNsdWRpbmcgYGRlZmF1bHRgLCBpLmUuIHJlLXJ1bm5pbmcgYC5wcm9qZW5yYy50c2AsIHdoaWNoIGlzIG5vdFxuICogd2hhdCB0aGlzIGdhdGUgaXMgZm9yKSBhbmQgd3JhcHMgaXQgaW4gYSBgVGFza1dvcmtmbG93YCAoYGJ1aWxkLnltbGApXG4gKiB0cmlnZ2VyZWQgb24gcHVzaC10by1gbWFpbmAgYW5kIGBwdWxsX3JlcXVlc3RgLiBUaGUgc2FtZSB0YXNrIGlzIHJldXNlZCBieVxuICogdGhlIHJlbGVhc2UgYnVpbGQgam9iLCBzbyB0aGUgbGludCBjb21tYW5kcyBleGlzdCBpbiBleGFjdGx5IG9uZSBwbGFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEFjdGlvbkJ1aWxkV29ya2Zsb3cgZXh0ZW5kcyBDb21wb25lbnQge1xuICBwdWJsaWMgcmVhZG9ubHkgdGFzazogVGFzaztcbiAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93OiBnaXRodWIuVGFza1dvcmtmbG93O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBnaXRodWIuR2l0SHViUHJvamVjdCkge1xuICAgIHN1cGVyKHNjb3BlLCAnQWN0aW9uQnVpbGRXb3JrZmxvdycpO1xuXG4gICAgY29uc3QgZ2ggPSBzY29wZS5naXRodWI7XG4gICAgaWYgKCFnaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQWN0aW9uQnVpbGRXb3JrZmxvdyByZXF1aXJlcyBHaXRIdWIgaW50ZWdyYXRpb24gdG8gYmUgZW5hYmxlZCcsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMudGFzayA9IHNjb3BlLmFkZFRhc2soJ2xpbnQnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0xpbnQgdGhlIGFjdGlvbiAoc2hlbGxjaGVjaywgeWFtbGxpbnQsIGFjdGlvbmxpbnQpJyxcbiAgICB9KTtcbiAgICB0aGlzLnRhc2suZXhlYyhcbiAgICAgICdzdWRvIGFwdC1nZXQgdXBkYXRlIC15ICYmIHN1ZG8gYXB0LWdldCBpbnN0YWxsIC15IHNoZWxsY2hlY2sgeWFtbGxpbnQnLFxuICAgICk7XG4gICAgdGhpcy50YXNrLmV4ZWMoXG4gICAgICAnZmluZCAuIC1wYXRoIC4vbm9kZV9tb2R1bGVzIC1wcnVuZSAtbyAtbmFtZSBcIiouc2hcIiAtcHJpbnQwIHwgeGFyZ3MgLTAgLXIgc2hlbGxjaGVjaycsXG4gICAgKTtcbiAgICB0aGlzLnRhc2suZXhlYygneWFtbGxpbnQgLWMgLnlhbWxsaW50IGFjdGlvbi55bWwgLmdpdGh1Yi93b3JrZmxvd3MvKi55bWwnKTtcbiAgICAvLyBPbmUgc3RlcCwgc28gdGhlIHByaXZhdGUgYG1rdGVtcCAtZGAgZGlyIGNhcnJpZXMgZnJvbSBkb3dubG9hZCB0aHJvdWdoXG4gICAgLy8gZXhlY3V0aW9uIC0gbmV2ZXIgdGhlIHdvcmxkLXdyaXRhYmxlIHNoYXJlZCAvdG1wLCB3aGVyZSBhbm90aGVyIGxvY2FsXG4gICAgLy8gdXNlciBjb3VsZCBwbGFudCB0aGUgYmluYXJ5IHRoYXQgZ2V0cyBydW4uXG4gICAgdGhpcy50YXNrLmV4ZWMoXG4gICAgICBbXG4gICAgICAgICdUTVA9XCIkKG1rdGVtcCAtZClcIicsXG4gICAgICAgIGBjdXJsIC1mc1NMIC1vIFwiJFRNUC9hY3Rpb25saW50LnRhci5nelwiIFwiaHR0cHM6Ly9naXRodWIuY29tL3JoeXNkL2FjdGlvbmxpbnQvcmVsZWFzZXMvZG93bmxvYWQvdiR7QUNUSU9OTElOVF9WRVJTSU9OfS9hY3Rpb25saW50XyR7QUNUSU9OTElOVF9WRVJTSU9OfV9saW51eF9hbWQ2NC50YXIuZ3pcImAsXG4gICAgICAgIGBlY2hvIFwiJHtBQ1RJT05MSU5UX1NIQTI1Nn0gICRUTVAvYWN0aW9ubGludC50YXIuZ3pcIiB8IHNoYTI1NnN1bSAtYyAtYCxcbiAgICAgICAgJ3RhciAteHpmIFwiJFRNUC9hY3Rpb25saW50LnRhci5nelwiIC1DIFwiJFRNUFwiIGFjdGlvbmxpbnQnLFxuICAgICAgICAnXCIkVE1QL2FjdGlvbmxpbnRcIiBhY3Rpb24ueW1sIC5naXRodWIvd29ya2Zsb3dzLyoueW1sJyxcbiAgICAgIF0uam9pbignICYmICcpLFxuICAgICk7XG5cbiAgICB0aGlzLndvcmtmbG93ID0gbmV3IGdpdGh1Yi5UYXNrV29ya2Zsb3coZ2gsIHtcbiAgICAgIG5hbWU6ICdidWlsZCcsXG4gICAgICBqb2JJZDogJ2J1aWxkJyxcbiAgICAgIHRhc2s6IHRoaXMudGFzayxcbiAgICAgIHRyaWdnZXJzOiB7IHB1c2g6IHsgYnJhbmNoZXM6IFsnbWFpbiddIH0sIHB1bGxSZXF1ZXN0OiB7fSB9LFxuICAgICAgcGVybWlzc2lvbnM6IHsgY29udGVudHM6IGdpdGh1Yi53b3JrZmxvd3MuSm9iUGVybWlzc2lvbi5SRUFEIH0sXG4gICAgICBwcmVCdWlsZFN0ZXBzOiBbeyBuYW1lOiAnSW5zdGFsbCBkZXBlbmRlbmNpZXMnLCBydW46ICducG0gY2knIH1dLFxuICAgIH0pO1xuICAgIG5vdGVXb3JrZmxvd1B1cnBvc2UoXG4gICAgICB0aGlzLndvcmtmbG93LmZpbGUsXG4gICAgICAnTGludCBnYXRlIGZvciB0aGUgYWN0aW9uIChzaGVsbGNoZWNrLCB5YW1sbGludCwgYWN0aW9ubGludCkuJyxcbiAgICApO1xuICB9XG59XG4iXX0=
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLWJ1aWxkLXdvcmtmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FjdGlvbnMvYWN0aW9uLWJ1aWxkLXdvcmtmbG93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxtQ0FBaUQ7QUFDakQsaUVBQWlFO0FBRWpFLDBFQUEwRTtBQUMxRSw0REFBNEQ7QUFDNUQsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUM7QUFDcEMsTUFBTSxpQkFBaUIsR0FDckIsa0VBQWtFLENBQUM7QUFFckU7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQWEsbUJBQW9CLFNBQVEsa0JBQVM7O0lBQ2hDLElBQUksQ0FBTztJQUNYLFFBQVEsQ0FBc0I7SUFFOUMsWUFBWSxLQUEyQjtRQUNyQyxLQUFLLENBQUMsS0FBSyxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFFcEMsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUN4QixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDUixNQUFNLElBQUksS0FBSyxDQUNiLCtEQUErRCxDQUNoRSxDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDaEMsV0FBVyxFQUFFLG9EQUFvRDtTQUNsRSxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDWix1RUFBdUUsQ0FDeEUsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNaLHFGQUFxRixDQUN0RixDQUFDO1FBQ0Ysa0VBQWtFO1FBQ2xFLGlFQUFpRTtRQUNqRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQ25ELHlFQUF5RTtRQUN6RSx3RUFBd0U7UUFDeEUsNkNBQTZDO1FBQzdDLHVFQUF1RTtRQUN2RSw4REFBOEQ7UUFDOUQsd0VBQXdFO1FBQ3hFLHdFQUF3RTtRQUN4RSxzRUFBc0U7UUFDdEUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ1o7WUFDRSxvQkFBb0I7WUFDcEIsa0dBQWtHLGtCQUFrQixlQUFlLGtCQUFrQixzQkFBc0I7WUFDM0ssU0FBUyxpQkFBaUIsNENBQTRDO1lBQ3RFLHdEQUF3RDtZQUN4RCx3REFBd0Q7U0FDekQsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQ2YsQ0FBQztRQUVGLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxlQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRTtZQUMxQyxJQUFJLEVBQUUsT0FBTztZQUNiLEtBQUssRUFBRSxPQUFPO1lBQ2QsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFO1lBQzNELFdBQVcsRUFBRSxFQUFFLFFBQVEsRUFBRSxlQUFNLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUU7WUFDOUQsYUFBYSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDO1NBQ2pFLENBQUMsQ0FBQztRQUNILElBQUEsc0NBQW1CLEVBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUNsQiw4REFBOEQsQ0FDL0QsQ0FBQztJQUNKLENBQUM7O0FBeERILGtEQXlEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgVGFzaywgZ2l0aHViIH0gZnJvbSAncHJvamVuJztcbmltcG9ydCB7IG5vdGVXb3JrZmxvd1B1cnBvc2UgfSBmcm9tICcuLi9jb21tb24vd29ya2Zsb3ctcHVycG9zZSc7XG5cbi8vIFBpbm5lZCByZWxlYXNlICsgdmVyaWZpZWQgU0hBLTI1NiAobGludXhfYW1kNjQpIC0gdXBncmFkZSBpcyBhIHJldmlld2VkXG4vLyBkaWZmIG9mIHRoaXMgY29uc3RhbnQsIG5ldmVyIGEgZmxvYXRpbmcgdmVyc2lvbiAoQUQtMDAxKS5cbmNvbnN0IEFDVElPTkxJTlRfVkVSU0lPTiA9ICcxLjcuMTInO1xuY29uc3QgQUNUSU9OTElOVF9TSEEyNTYgPVxuICAnOGFjYThkYjk2ZjFiOTQ3NzBmMWIwZDcyYjZkZGRjYjFlYmI4MTIzY2IzNzEyNTMwYjA4Y2MzODdiMzQ5YTNkOCc7XG5cbi8qKlxuICogVGhlIEFELTAwMSBMYXllci0xIGxpbnQgZ2F0ZSBmb3IgYSBjb21wb3NpdGUtYWN0aW9uIHJlcG86IHNoZWxsY2hlY2ssXG4gKiB5YW1sbGludCwgYW5kIGEgcGlubmVkIGBhY3Rpb25saW50YCByZWxlYXNlIGJpbmFyeSAodmVyaWZpZWQgYnkgU0hBLTI1NixcbiAqIG5ldmVyIGEgbWFya2V0cGxhY2UgYWN0aW9uIC0gb3JnIHBvbGljeSkuIENyZWF0ZXMgYSBkZWRpY2F0ZWQgYGxpbnRgIHRhc2tcbiAqIChuYW1lZCB0byBhdm9pZCBjb2xsaWRpbmcgd2l0aCBwcm9qZW4ncyBvd24gcmVzZXJ2ZWQgYGJ1aWxkYCB0YXNrLCB3aGljaFxuICogc3Bhd25zIHRoZSB1bnJlbGF0ZWQgZGVmYXVsdC9wcmUtY29tcGlsZS9jb21waWxlL3Bvc3QtY29tcGlsZS90ZXN0L3BhY2thZ2VcbiAqIGNoYWluIC0gaW5jbHVkaW5nIGBkZWZhdWx0YCwgaS5lLiByZS1ydW5uaW5nIGAucHJvamVucmMudHNgLCB3aGljaCBpcyBub3RcbiAqIHdoYXQgdGhpcyBnYXRlIGlzIGZvcikgYW5kIHdyYXBzIGl0IGluIGEgYFRhc2tXb3JrZmxvd2AgKGBidWlsZC55bWxgKVxuICogdHJpZ2dlcmVkIG9uIHB1c2gtdG8tYG1haW5gIGFuZCBgcHVsbF9yZXF1ZXN0YC4gVGhlIHNhbWUgdGFzayBpcyByZXVzZWQgYnlcbiAqIHRoZSByZWxlYXNlIGJ1aWxkIGpvYiwgc28gdGhlIGxpbnQgY29tbWFuZHMgZXhpc3QgaW4gZXhhY3RseSBvbmUgcGxhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBBY3Rpb25CdWlsZFdvcmtmbG93IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgcHVibGljIHJlYWRvbmx5IHRhc2s6IFRhc2s7XG4gIHB1YmxpYyByZWFkb25seSB3b3JrZmxvdzogZ2l0aHViLlRhc2tXb3JrZmxvdztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogZ2l0aHViLkdpdEh1YlByb2plY3QpIHtcbiAgICBzdXBlcihzY29wZSwgJ0FjdGlvbkJ1aWxkV29ya2Zsb3cnKTtcblxuICAgIGNvbnN0IGdoID0gc2NvcGUuZ2l0aHViO1xuICAgIGlmICghZ2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0FjdGlvbkJ1aWxkV29ya2Zsb3cgcmVxdWlyZXMgR2l0SHViIGludGVncmF0aW9uIHRvIGJlIGVuYWJsZWQnLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLnRhc2sgPSBzY29wZS5hZGRUYXNrKCdsaW50Jywge1xuICAgICAgZGVzY3JpcHRpb246ICdMaW50IHRoZSBhY3Rpb24gKHNoZWxsY2hlY2ssIHlhbWxsaW50LCBhY3Rpb25saW50KScsXG4gICAgfSk7XG4gICAgdGhpcy50YXNrLmV4ZWMoXG4gICAgICAnc3VkbyBhcHQtZ2V0IHVwZGF0ZSAteSAmJiBzdWRvIGFwdC1nZXQgaW5zdGFsbCAteSBzaGVsbGNoZWNrIHlhbWxsaW50JyxcbiAgICApO1xuICAgIHRoaXMudGFzay5leGVjKFxuICAgICAgJ2ZpbmQgLiAtcGF0aCAuL25vZGVfbW9kdWxlcyAtcHJ1bmUgLW8gLW5hbWUgXCIqLnNoXCIgLXByaW50MCB8IHhhcmdzIC0wIC1yIHNoZWxsY2hlY2snLFxuICAgICk7XG4gICAgLy8gSGFuZC13cml0dGVuIFlBTUwgb25seTogdGhlIHdvcmtmbG93cyBhcmUgcHJvamVuLWdlbmVyYXRlZCAoYW5kXG4gICAgLy8gZHJpZnQtY2hlY2tlZCksIGFuZCB0aGVpciBsb25nIGxpbmVzIHdvdWxkIGZhaWwgYGxpbmUtbGVuZ3RoYC5cbiAgICB0aGlzLnRhc2suZXhlYygneWFtbGxpbnQgLWMgLnlhbWxsaW50IGFjdGlvbi55bWwnKTtcbiAgICAvLyBPbmUgc3RlcCwgc28gdGhlIHByaXZhdGUgYG1rdGVtcCAtZGAgZGlyIGNhcnJpZXMgZnJvbSBkb3dubG9hZCB0aHJvdWdoXG4gICAgLy8gZXhlY3V0aW9uIC0gbmV2ZXIgdGhlIHdvcmxkLXdyaXRhYmxlIHNoYXJlZCAvdG1wLCB3aGVyZSBhbm90aGVyIGxvY2FsXG4gICAgLy8gdXNlciBjb3VsZCBwbGFudCB0aGUgYmluYXJ5IHRoYXQgZ2V0cyBydW4uXG4gICAgLy8gV29ya2Zsb3dzIG9ubHk6IGFjdGlvbmxpbnQgcGFyc2VzIGV2ZXJ5IGZpbGUgYXJndW1lbnQgYXMgYSB3b3JrZmxvdyxcbiAgICAvLyBzbyB0aGUgY29tcG9zaXRlIGBhY3Rpb24ueW1sYCBpcyB2YWxpZGF0ZWQgdHJhbnNpdGl2ZWx5IHZpYVxuICAgIC8vIGB1c2VzOiAuL2AgaW5zdGVhZC4gYC1zaGVsbGNoZWNrPWAgZGlzYWJsZXMgaXRzIGluY2lkZW50YWwgc2hlbGxjaGVja1xuICAgIC8vIHBhc3Mgb3ZlciBnZW5lcmF0ZWQgYHJ1bjpgIHNjcmlwdHMgKGUuZy4gcHJvamVuJ3Mgb3duIGByZWxlYXNlLnltbGApO1xuICAgIC8vIGhhbmQtd3JpdHRlbiBgKi5zaGAgZmlsZXMgYXJlIGNvdmVyZWQgYnkgdGhlIHNoZWxsY2hlY2sgc3RlcCBhYm92ZS5cbiAgICB0aGlzLnRhc2suZXhlYyhcbiAgICAgIFtcbiAgICAgICAgJ1RNUD1cIiQobWt0ZW1wIC1kKVwiJyxcbiAgICAgICAgYGN1cmwgLWZzU0wgLW8gXCIkVE1QL2FjdGlvbmxpbnQudGFyLmd6XCIgXCJodHRwczovL2dpdGh1Yi5jb20vcmh5c2QvYWN0aW9ubGludC9yZWxlYXNlcy9kb3dubG9hZC92JHtBQ1RJT05MSU5UX1ZFUlNJT059L2FjdGlvbmxpbnRfJHtBQ1RJT05MSU5UX1ZFUlNJT059X2xpbnV4X2FtZDY0LnRhci5nelwiYCxcbiAgICAgICAgYGVjaG8gXCIke0FDVElPTkxJTlRfU0hBMjU2fSAgJFRNUC9hY3Rpb25saW50LnRhci5nelwiIHwgc2hhMjU2c3VtIC1jIC1gLFxuICAgICAgICAndGFyIC14emYgXCIkVE1QL2FjdGlvbmxpbnQudGFyLmd6XCIgLUMgXCIkVE1QXCIgYWN0aW9ubGludCcsXG4gICAgICAgICdcIiRUTVAvYWN0aW9ubGludFwiIC1zaGVsbGNoZWNrPSAuZ2l0aHViL3dvcmtmbG93cy8qLnltbCcsXG4gICAgICBdLmpvaW4oJyAmJiAnKSxcbiAgICApO1xuXG4gICAgdGhpcy53b3JrZmxvdyA9IG5ldyBnaXRodWIuVGFza1dvcmtmbG93KGdoLCB7XG4gICAgICBuYW1lOiAnYnVpbGQnLFxuICAgICAgam9iSWQ6ICdidWlsZCcsXG4gICAgICB0YXNrOiB0aGlzLnRhc2ssXG4gICAgICB0cmlnZ2VyczogeyBwdXNoOiB7IGJyYW5jaGVzOiBbJ21haW4nXSB9LCBwdWxsUmVxdWVzdDoge30gfSxcbiAgICAgIHBlcm1pc3Npb25zOiB7IGNvbnRlbnRzOiBnaXRodWIud29ya2Zsb3dzLkpvYlBlcm1pc3Npb24uUkVBRCB9LFxuICAgICAgcHJlQnVpbGRTdGVwczogW3sgbmFtZTogJ0luc3RhbGwgZGVwZW5kZW5jaWVzJywgcnVuOiAnbnBtIGNpJyB9XSxcbiAgICB9KTtcbiAgICBub3RlV29ya2Zsb3dQdXJwb3NlKFxuICAgICAgdGhpcy53b3JrZmxvdy5maWxlLFxuICAgICAgJ0xpbnQgZ2F0ZSBmb3IgdGhlIGFjdGlvbiAoc2hlbGxjaGVjaywgeWFtbGxpbnQsIGFjdGlvbmxpbnQpLicsXG4gICAgKTtcbiAgfVxufVxuIl19
@@ -41,7 +41,7 @@ const UNCONFIGURED_STEPS = [
41
41
  * error: if you wrote a scenario by hand, you can write its cleanup too.
42
42
  */
43
43
  class ActionDogfoodWorkflow extends projen_1.Component {
44
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.ActionDogfoodWorkflow", version: "0.0.21" };
44
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.ActionDogfoodWorkflow", version: "0.0.23" };
45
45
  workflow;
46
46
  constructor(scope, options) {
47
47
  super(scope, 'ActionDogfoodWorkflow');
@@ -1,32 +1,13 @@
1
- import { Component, github } from 'projen';
2
- export interface ActionSonarWorkflowOptions {
3
- /**
4
- * URL of the org's SonarCloud instance (e.g. `https://sonarcloud.io`).
5
- * Required, no default - a guessed server is worse than a loud failure.
6
- */
7
- readonly sonarHostUrl: string;
8
- /**
9
- * SonarCloud organization key (`sonar.organization`). Mandatory for the
10
- * Scanner CLI on SonarCloud - it is not derived from the token, so a scan
11
- * without it always fails.
12
- * @default "xpertss"
13
- */
14
- readonly sonarOrganization?: string;
15
- /** @default "SONAR_TOKEN" */
16
- readonly sonarTokenSecret?: string;
17
- /**
18
- * Whether `sonar.yml` also runs on `pull_request` as a pass/fail gate.
19
- * @default true
20
- */
21
- readonly sonarPullRequestGate?: boolean;
22
- }
1
+ import { github } from 'projen';
2
+ import { SonarWorkflow, SonarWorkflowOptions } from '../common/sonar-workflow';
23
3
  /**
24
- * AD-001 Layer 2: SonarCloud via the Scanner CLI only (never
25
- * `SonarSource/sonarqube-scan-action` - third-party, and it carried a
26
- * security advisory). `sonar.inclusions` is set explicitly since default
27
- * inclusions may skip `action.yml` outside `.github/`.
4
+ * @deprecated Renamed to `SonarWorkflow` (now in `src/common/` and applied to
5
+ * every project type, not just actions). Use `SonarWorkflow` instead; this
6
+ * subclass is kept only so existing imports of `ActionSonarWorkflow` keep
7
+ * compiling. It behaves identically to `SonarWorkflow`.
28
8
  */
29
- export declare class ActionSonarWorkflow extends Component {
30
- readonly workflow: github.GithubWorkflow;
31
- constructor(scope: github.GitHubProject, options: ActionSonarWorkflowOptions);
9
+ export declare class ActionSonarWorkflow extends SonarWorkflow {
10
+ constructor(scope: github.GitHubProject, options: SonarWorkflowOptions);
32
11
  }
12
+ /** @deprecated Renamed to `SonarWorkflowOptions`. */
13
+ export type ActionSonarWorkflowOptions = SonarWorkflowOptions;
@@ -2,67 +2,18 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ActionSonarWorkflow = void 0;
4
4
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
5
- const projen_1 = require("projen");
6
- const workflow_purpose_1 = require("../common/workflow-purpose");
7
- // Pinned release + verified SHA-256 (linux-x64) - upgrade is a reviewed diff
8
- // of this constant, never a floating version (AD-001).
9
- const SONAR_SCANNER_VERSION = '8.1.0.6389';
10
- const SONAR_SCANNER_SHA256 = 'bb8f709f9cb73352f8d1260a3b3c506c0f41146754bc630762c126d795499d0b';
5
+ const sonar_workflow_1 = require("../common/sonar-workflow");
11
6
  /**
12
- * AD-001 Layer 2: SonarCloud via the Scanner CLI only (never
13
- * `SonarSource/sonarqube-scan-action` - third-party, and it carried a
14
- * security advisory). `sonar.inclusions` is set explicitly since default
15
- * inclusions may skip `action.yml` outside `.github/`.
7
+ * @deprecated Renamed to `SonarWorkflow` (now in `src/common/` and applied to
8
+ * every project type, not just actions). Use `SonarWorkflow` instead; this
9
+ * subclass is kept only so existing imports of `ActionSonarWorkflow` keep
10
+ * compiling. It behaves identically to `SonarWorkflow`.
16
11
  */
17
- class ActionSonarWorkflow extends projen_1.Component {
18
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.ActionSonarWorkflow", version: "0.0.21" };
19
- workflow;
12
+ class ActionSonarWorkflow extends sonar_workflow_1.SonarWorkflow {
13
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.ActionSonarWorkflow", version: "0.0.23" };
20
14
  constructor(scope, options) {
21
- super(scope, 'ActionSonarWorkflow');
22
- if (!options.sonarHostUrl) {
23
- throw new Error('ActionSonarWorkflow requires sonarHostUrl');
24
- }
25
- const gh = scope.github;
26
- if (!gh) {
27
- throw new Error('ActionSonarWorkflow requires GitHub integration to be enabled');
28
- }
29
- const sonarTokenSecret = options.sonarTokenSecret ?? 'SONAR_TOKEN';
30
- const pullRequestGate = options.sonarPullRequestGate ?? true;
31
- const sonarOrganization = options.sonarOrganization ?? 'xpertss';
32
- this.workflow = new projen_1.github.GithubWorkflow(gh, 'sonar');
33
- (0, workflow_purpose_1.noteWorkflowPurpose)(this.workflow.file, 'Static-analysis scan of the action on the org SonarCloud.');
34
- this.workflow.on({
35
- push: { branches: ['main'] },
36
- ...(pullRequestGate ? { pullRequest: {} } : {}),
37
- });
38
- this.workflow.addJob('sonar', {
39
- runsOn: ['ubuntu-latest'],
40
- permissions: { contents: projen_1.github.workflows.JobPermission.READ },
41
- env: { SONAR_TOKEN: `\${{ secrets.${sonarTokenSecret} }}` },
42
- steps: [
43
- projen_1.github.WorkflowSteps.checkout(),
44
- {
45
- name: 'Install sonar-scanner',
46
- run: `set -euo pipefail
47
- curl -fsSL -o /tmp/sonar-scanner.zip "https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-${SONAR_SCANNER_VERSION}-linux-x64.zip"
48
- echo "${SONAR_SCANNER_SHA256} /tmp/sonar-scanner.zip" | sha256sum -c -
49
- unzip -q /tmp/sonar-scanner.zip -d /tmp
50
- echo "/tmp/sonar-scanner-${SONAR_SCANNER_VERSION}-linux-x64/bin" >> "$GITHUB_PATH"
51
- `,
52
- },
53
- {
54
- name: 'Scan',
55
- run: `sonar-scanner \\
56
- -Dsonar.host.url=${options.sonarHostUrl} \\
57
- -Dsonar.organization=${sonarOrganization} \\
58
- -Dsonar.projectKey=${scope.name} \\
59
- -Dsonar.projectVersion="$(git describe --tags --always)" \\
60
- -Dsonar.inclusions=.github/workflows/**,action.yml,**/*.sh \\
61
- -Dsonar.qualitygate.wait=true`,
62
- },
63
- ],
64
- });
15
+ super(scope, options);
65
16
  }
66
17
  }
67
18
  exports.ActionSonarWorkflow = ActionSonarWorkflow;
68
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLXNvbmFyLXdvcmtmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FjdGlvbnMvYWN0aW9uLXNvbmFyLXdvcmtmbG93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxtQ0FBMkM7QUFDM0MsaUVBQWlFO0FBRWpFLDZFQUE2RTtBQUM3RSx1REFBdUQ7QUFDdkQsTUFBTSxxQkFBcUIsR0FBRyxZQUFZLENBQUM7QUFDM0MsTUFBTSxvQkFBb0IsR0FDeEIsa0VBQWtFLENBQUM7QUEyQnJFOzs7OztHQUtHO0FBQ0gsTUFBYSxtQkFBb0IsU0FBUSxrQkFBUzs7SUFDaEMsUUFBUSxDQUF3QjtJQUVoRCxZQUNFLEtBQTJCLEVBQzNCLE9BQW1DO1FBRW5DLEtBQUssQ0FBQyxLQUFLLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUVwQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBRUQsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUN4QixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDUixNQUFNLElBQUksS0FBSyxDQUNiLCtEQUErRCxDQUNoRSxDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixJQUFJLGFBQWEsQ0FBQztRQUNuRSxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsb0JBQW9CLElBQUksSUFBSSxDQUFDO1FBQzdELE1BQU0saUJBQWlCLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixJQUFJLFNBQVMsQ0FBQztRQUVqRSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksZUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdkQsSUFBQSxzQ0FBbUIsRUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQ2xCLDJEQUEyRCxDQUM1RCxDQUFDO1FBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDZixJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUM1QixHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ2hELENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtZQUM1QixNQUFNLEVBQUUsQ0FBQyxlQUFlLENBQUM7WUFDekIsV0FBVyxFQUFFLEVBQUUsUUFBUSxFQUFFLGVBQU0sQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRTtZQUM5RCxHQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLGdCQUFnQixLQUFLLEVBQUU7WUFDM0QsS0FBSyxFQUFFO2dCQUNMLGVBQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFO2dCQUMvQjtvQkFDRSxJQUFJLEVBQUUsdUJBQXVCO29CQUM3QixHQUFHLEVBQUU7MEhBQzJHLHFCQUFxQjtRQUN2SSxvQkFBb0I7OzJCQUVELHFCQUFxQjtDQUMvQztpQkFDUTtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixHQUFHLEVBQUU7cUJBQ00sT0FBTyxDQUFDLFlBQVk7eUJBQ2hCLGlCQUFpQjt1QkFDbkIsS0FBSyxDQUFDLElBQUk7OztnQ0FHRDtpQkFDdkI7YUFDRjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBNURILGtEQTZEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgZ2l0aHViIH0gZnJvbSAncHJvamVuJztcbmltcG9ydCB7IG5vdGVXb3JrZmxvd1B1cnBvc2UgfSBmcm9tICcuLi9jb21tb24vd29ya2Zsb3ctcHVycG9zZSc7XG5cbi8vIFBpbm5lZCByZWxlYXNlICsgdmVyaWZpZWQgU0hBLTI1NiAobGludXgteDY0KSAtIHVwZ3JhZGUgaXMgYSByZXZpZXdlZCBkaWZmXG4vLyBvZiB0aGlzIGNvbnN0YW50LCBuZXZlciBhIGZsb2F0aW5nIHZlcnNpb24gKEFELTAwMSkuXG5jb25zdCBTT05BUl9TQ0FOTkVSX1ZFUlNJT04gPSAnOC4xLjAuNjM4OSc7XG5jb25zdCBTT05BUl9TQ0FOTkVSX1NIQTI1NiA9XG4gICdiYjhmNzA5ZjljYjczMzUyZjhkMTI2MGEzYjNjNTA2YzBmNDExNDY3NTRiYzYzMDc2MmMxMjZkNzk1NDk5ZDBiJztcblxuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25Tb25hcldvcmtmbG93T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBVUkwgb2YgdGhlIG9yZydzIFNvbmFyQ2xvdWQgaW5zdGFuY2UgKGUuZy4gYGh0dHBzOi8vc29uYXJjbG91ZC5pb2ApLlxuICAgKiBSZXF1aXJlZCwgbm8gZGVmYXVsdCAtIGEgZ3Vlc3NlZCBzZXJ2ZXIgaXMgd29yc2UgdGhhbiBhIGxvdWQgZmFpbHVyZS5cbiAgICovXG4gIHJlYWRvbmx5IHNvbmFySG9zdFVybDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTb25hckNsb3VkIG9yZ2FuaXphdGlvbiBrZXkgKGBzb25hci5vcmdhbml6YXRpb25gKS4gTWFuZGF0b3J5IGZvciB0aGVcbiAgICogU2Nhbm5lciBDTEkgb24gU29uYXJDbG91ZCAtIGl0IGlzIG5vdCBkZXJpdmVkIGZyb20gdGhlIHRva2VuLCBzbyBhIHNjYW5cbiAgICogd2l0aG91dCBpdCBhbHdheXMgZmFpbHMuXG4gICAqIEBkZWZhdWx0IFwieHBlcnRzc1wiXG4gICAqL1xuICByZWFkb25seSBzb25hck9yZ2FuaXphdGlvbj86IHN0cmluZztcblxuICAvKiogQGRlZmF1bHQgXCJTT05BUl9UT0tFTlwiICovXG4gIHJlYWRvbmx5IHNvbmFyVG9rZW5TZWNyZXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYHNvbmFyLnltbGAgYWxzbyBydW5zIG9uIGBwdWxsX3JlcXVlc3RgIGFzIGEgcGFzcy9mYWlsIGdhdGUuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHNvbmFyUHVsbFJlcXVlc3RHYXRlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBRC0wMDEgTGF5ZXIgMjogU29uYXJDbG91ZCB2aWEgdGhlIFNjYW5uZXIgQ0xJIG9ubHkgKG5ldmVyXG4gKiBgU29uYXJTb3VyY2Uvc29uYXJxdWJlLXNjYW4tYWN0aW9uYCAtIHRoaXJkLXBhcnR5LCBhbmQgaXQgY2FycmllZCBhXG4gKiBzZWN1cml0eSBhZHZpc29yeSkuIGBzb25hci5pbmNsdXNpb25zYCBpcyBzZXQgZXhwbGljaXRseSBzaW5jZSBkZWZhdWx0XG4gKiBpbmNsdXNpb25zIG1heSBza2lwIGBhY3Rpb24ueW1sYCBvdXRzaWRlIGAuZ2l0aHViL2AuXG4gKi9cbmV4cG9ydCBjbGFzcyBBY3Rpb25Tb25hcldvcmtmbG93IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93OiBnaXRodWIuR2l0aHViV29ya2Zsb3c7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IGdpdGh1Yi5HaXRIdWJQcm9qZWN0LFxuICAgIG9wdGlvbnM6IEFjdGlvblNvbmFyV29ya2Zsb3dPcHRpb25zLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgJ0FjdGlvblNvbmFyV29ya2Zsb3cnKTtcblxuICAgIGlmICghb3B0aW9ucy5zb25hckhvc3RVcmwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWN0aW9uU29uYXJXb3JrZmxvdyByZXF1aXJlcyBzb25hckhvc3RVcmwnKTtcbiAgICB9XG5cbiAgICBjb25zdCBnaCA9IHNjb3BlLmdpdGh1YjtcbiAgICBpZiAoIWdoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdBY3Rpb25Tb25hcldvcmtmbG93IHJlcXVpcmVzIEdpdEh1YiBpbnRlZ3JhdGlvbiB0byBiZSBlbmFibGVkJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc29uYXJUb2tlblNlY3JldCA9IG9wdGlvbnMuc29uYXJUb2tlblNlY3JldCA/PyAnU09OQVJfVE9LRU4nO1xuICAgIGNvbnN0IHB1bGxSZXF1ZXN0R2F0ZSA9IG9wdGlvbnMuc29uYXJQdWxsUmVxdWVzdEdhdGUgPz8gdHJ1ZTtcbiAgICBjb25zdCBzb25hck9yZ2FuaXphdGlvbiA9IG9wdGlvbnMuc29uYXJPcmdhbml6YXRpb24gPz8gJ3hwZXJ0c3MnO1xuXG4gICAgdGhpcy53b3JrZmxvdyA9IG5ldyBnaXRodWIuR2l0aHViV29ya2Zsb3coZ2gsICdzb25hcicpO1xuICAgIG5vdGVXb3JrZmxvd1B1cnBvc2UoXG4gICAgICB0aGlzLndvcmtmbG93LmZpbGUsXG4gICAgICAnU3RhdGljLWFuYWx5c2lzIHNjYW4gb2YgdGhlIGFjdGlvbiBvbiB0aGUgb3JnIFNvbmFyQ2xvdWQuJyxcbiAgICApO1xuICAgIHRoaXMud29ya2Zsb3cub24oe1xuICAgICAgcHVzaDogeyBicmFuY2hlczogWydtYWluJ10gfSxcbiAgICAgIC4uLihwdWxsUmVxdWVzdEdhdGUgPyB7IHB1bGxSZXF1ZXN0OiB7fSB9IDoge30pLFxuICAgIH0pO1xuICAgIHRoaXMud29ya2Zsb3cuYWRkSm9iKCdzb25hcicsIHtcbiAgICAgIHJ1bnNPbjogWyd1YnVudHUtbGF0ZXN0J10sXG4gICAgICBwZXJtaXNzaW9uczogeyBjb250ZW50czogZ2l0aHViLndvcmtmbG93cy5Kb2JQZXJtaXNzaW9uLlJFQUQgfSxcbiAgICAgIGVudjogeyBTT05BUl9UT0tFTjogYFxcJHt7IHNlY3JldHMuJHtzb25hclRva2VuU2VjcmV0fSB9fWAgfSxcbiAgICAgIHN0ZXBzOiBbXG4gICAgICAgIGdpdGh1Yi5Xb3JrZmxvd1N0ZXBzLmNoZWNrb3V0KCksXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnSW5zdGFsbCBzb25hci1zY2FubmVyJyxcbiAgICAgICAgICBydW46IGBzZXQgLWV1byBwaXBlZmFpbFxuY3VybCAtZnNTTCAtbyAvdG1wL3NvbmFyLXNjYW5uZXIuemlwIFwiaHR0cHM6Ly9iaW5hcmllcy5zb25hcnNvdXJjZS5jb20vRGlzdHJpYnV0aW9uL3NvbmFyLXNjYW5uZXItY2xpL3NvbmFyLXNjYW5uZXItY2xpLSR7U09OQVJfU0NBTk5FUl9WRVJTSU9OfS1saW51eC14NjQuemlwXCJcbmVjaG8gXCIke1NPTkFSX1NDQU5ORVJfU0hBMjU2fSAgL3RtcC9zb25hci1zY2FubmVyLnppcFwiIHwgc2hhMjU2c3VtIC1jIC1cbnVuemlwIC1xIC90bXAvc29uYXItc2Nhbm5lci56aXAgLWQgL3RtcFxuZWNobyBcIi90bXAvc29uYXItc2Nhbm5lci0ke1NPTkFSX1NDQU5ORVJfVkVSU0lPTn0tbGludXgteDY0L2JpblwiID4+IFwiJEdJVEhVQl9QQVRIXCJcbmAsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnU2NhbicsXG4gICAgICAgICAgcnVuOiBgc29uYXItc2Nhbm5lciBcXFxcXG4gIC1Ec29uYXIuaG9zdC51cmw9JHtvcHRpb25zLnNvbmFySG9zdFVybH0gXFxcXFxuICAtRHNvbmFyLm9yZ2FuaXphdGlvbj0ke3NvbmFyT3JnYW5pemF0aW9ufSBcXFxcXG4gIC1Ec29uYXIucHJvamVjdEtleT0ke3Njb3BlLm5hbWV9IFxcXFxcbiAgLURzb25hci5wcm9qZWN0VmVyc2lvbj1cIiQoZ2l0IGRlc2NyaWJlIC0tdGFncyAtLWFsd2F5cylcIiBcXFxcXG4gIC1Ec29uYXIuaW5jbHVzaW9ucz0uZ2l0aHViL3dvcmtmbG93cy8qKixhY3Rpb24ueW1sLCoqLyouc2ggXFxcXFxuICAtRHNvbmFyLnF1YWxpdHlnYXRlLndhaXQ9dHJ1ZWAsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLXNvbmFyLXdvcmtmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FjdGlvbnMvYWN0aW9uLXNvbmFyLXdvcmtmbG93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFDQSw2REFBK0U7QUFFL0U7Ozs7O0dBS0c7QUFDSCxNQUFhLG1CQUFvQixTQUFRLDhCQUFhOztJQUNwRCxZQUFZLEtBQTJCLEVBQUUsT0FBNkI7UUFDcEUsS0FBSyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN4QixDQUFDOztBQUhILGtEQUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2l0aHViIH0gZnJvbSAncHJvamVuJztcbmltcG9ydCB7IFNvbmFyV29ya2Zsb3csIFNvbmFyV29ya2Zsb3dPcHRpb25zIH0gZnJvbSAnLi4vY29tbW9uL3NvbmFyLXdvcmtmbG93JztcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBSZW5hbWVkIHRvIGBTb25hcldvcmtmbG93YCAobm93IGluIGBzcmMvY29tbW9uL2AgYW5kIGFwcGxpZWQgdG9cbiAqIGV2ZXJ5IHByb2plY3QgdHlwZSwgbm90IGp1c3QgYWN0aW9ucykuIFVzZSBgU29uYXJXb3JrZmxvd2AgaW5zdGVhZDsgdGhpc1xuICogc3ViY2xhc3MgaXMga2VwdCBvbmx5IHNvIGV4aXN0aW5nIGltcG9ydHMgb2YgYEFjdGlvblNvbmFyV29ya2Zsb3dgIGtlZXBcbiAqIGNvbXBpbGluZy4gSXQgYmVoYXZlcyBpZGVudGljYWxseSB0byBgU29uYXJXb3JrZmxvd2AuXG4gKi9cbmV4cG9ydCBjbGFzcyBBY3Rpb25Tb25hcldvcmtmbG93IGV4dGVuZHMgU29uYXJXb3JrZmxvdyB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBnaXRodWIuR2l0SHViUHJvamVjdCwgb3B0aW9uczogU29uYXJXb3JrZmxvd09wdGlvbnMpIHtcbiAgICBzdXBlcihzY29wZSwgb3B0aW9ucyk7XG4gIH1cbn1cblxuLyoqIEBkZXByZWNhdGVkIFJlbmFtZWQgdG8gYFNvbmFyV29ya2Zsb3dPcHRpb25zYC4gKi9cbmV4cG9ydCB0eXBlIEFjdGlvblNvbmFyV29ya2Zsb3dPcHRpb25zID0gU29uYXJXb3JrZmxvd09wdGlvbnM7XG4iXX0=
@@ -1,8 +1,9 @@
1
1
  import { github, release } from 'projen';
2
2
  import { ActionBuildWorkflow } from './action-build-workflow';
3
3
  import { ActionDogfoodOptions, ActionDogfoodWorkflow } from './action-dogfood-workflow';
4
- import { ActionSonarWorkflow } from './action-sonar-workflow';
5
- export interface GitHubActionProjectOptions extends github.GitHubProjectOptions {
4
+ import { SonarScanOptions } from '../common/sonar-options';
5
+ import { SonarWorkflow } from '../common/sonar-workflow';
6
+ export interface GitHubActionProjectOptions extends github.GitHubProjectOptions, SonarScanOptions {
6
7
  /**
7
8
  * One-line description of the action. Used in the default README
8
9
  * template and recorded in the private `package.json`.
@@ -17,25 +18,6 @@ export interface GitHubActionProjectOptions extends github.GitHubProjectOptions
17
18
  * @default "PROJEN_GITHUB_TOKEN"
18
19
  */
19
20
  readonly gheTokenSecret?: string;
20
- /**
21
- * URL of the org's SonarCloud instance (e.g. `https://sonarcloud.io`).
22
- * MUST be reachable from github.com-hosted (public) runners (AD-001).
23
- * Required, no default: a guessed server is worse than a loud failure.
24
- */
25
- readonly sonarHostUrl: string;
26
- /**
27
- * SonarCloud organization key (`sonar.organization`), required by the
28
- * Scanner CLI on SonarCloud.
29
- * @default "xpertss"
30
- */
31
- readonly sonarOrganization?: string;
32
- /** @default "SONAR_TOKEN" */
33
- readonly sonarTokenSecret?: string;
34
- /**
35
- * Whether `sonar.yml` also runs on `pull_request` as a pass/fail gate.
36
- * @default true
37
- */
38
- readonly sonarPullRequestGate?: boolean;
39
21
  /**
40
22
  * The dogfood scenario (AD-001). What fixture state, what to assert, and
41
23
  * how to clean up are specified by the action's own F### spec - the
@@ -86,7 +68,8 @@ export interface GitHubActionProjectOptions extends github.GitHubProjectOptions
86
68
  export declare class GitHubActionProject extends github.GitHubProject {
87
69
  readonly buildWorkflow: ActionBuildWorkflow;
88
70
  readonly dogfoodWorkflow: ActionDogfoodWorkflow;
89
- readonly sonarWorkflow: ActionSonarWorkflow;
71
+ /** Set only when `sonarHostUrl` is provided. */
72
+ readonly sonarWorkflow?: SonarWorkflow;
90
73
  readonly release: release.Release;
91
74
  constructor(options: GitHubActionProjectOptions);
92
75
  }
@@ -5,13 +5,13 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
5
5
  const projen_1 = require("projen");
6
6
  const action_build_workflow_1 = require("./action-build-workflow");
7
7
  const action_dogfood_workflow_1 = require("./action-dogfood-workflow");
8
- const action_sonar_workflow_1 = require("./action-sonar-workflow");
9
8
  const constants_1 = require("../common/constants");
10
9
  const editorconfig_1 = require("../common/editorconfig");
11
10
  const internal_actions_1 = require("../common/internal-actions");
12
11
  const license_file_1 = require("../common/license-file");
13
12
  const projen_drift_check_workflow_1 = require("../common/projen-drift-check-workflow");
14
13
  const projenrc_ts_1 = require("../common/projenrc-ts");
14
+ const sonar_workflow_1 = require("../common/sonar-workflow");
15
15
  const workflow_change_notice_workflow_1 = require("../common/workflow-change-notice-workflow");
16
16
  const workflow_purpose_1 = require("../common/workflow-purpose");
17
17
  // `require('projen/package.json')`/`require('../../package.json')` resolve
@@ -64,15 +64,13 @@ hand-committed.
64
64
  * per the action's own F### spec - this type only lints it.
65
65
  */
66
66
  class GitHubActionProject extends projen_1.github.GitHubProject {
67
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.GitHubActionProject", version: "0.0.21" };
67
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.GitHubActionProject", version: "0.0.23" };
68
68
  buildWorkflow;
69
69
  dogfoodWorkflow;
70
+ /** Set only when `sonarHostUrl` is provided. */
70
71
  sonarWorkflow;
71
72
  release;
72
73
  constructor(options) {
73
- if (!options.sonarHostUrl) {
74
- throw new Error('GitHubActionProject requires sonarHostUrl');
75
- }
76
74
  // A declared-but-incomplete dogfood is still an error - see
77
75
  // `ActionDogfoodWorkflow`, which owns that check (and the
78
76
  // no-dogfood-declared case).
@@ -138,12 +136,18 @@ class GitHubActionProject extends projen_1.github.GitHubProject {
138
136
  });
139
137
  this.buildWorkflow = new action_build_workflow_1.ActionBuildWorkflow(this);
140
138
  this.dogfoodWorkflow = new action_dogfood_workflow_1.ActionDogfoodWorkflow(this, options.dogfood);
141
- this.sonarWorkflow = new action_sonar_workflow_1.ActionSonarWorkflow(this, {
142
- sonarHostUrl: options.sonarHostUrl,
143
- sonarOrganization: options.sonarOrganization,
144
- sonarTokenSecret: options.sonarTokenSecret,
145
- sonarPullRequestGate: options.sonarPullRequestGate,
146
- });
139
+ if (options.sonarHostUrl) {
140
+ this.sonarWorkflow = new sonar_workflow_1.SonarWorkflow(this, {
141
+ sonarHostUrl: options.sonarHostUrl,
142
+ sonarOrganization: options.sonarOrganization,
143
+ sonarTokenSecret: options.sonarTokenSecret,
144
+ sonarPullRequestGate: options.sonarPullRequestGate,
145
+ sonarProjectKey: options.sonarProjectKey,
146
+ // YAML / shell are not in Sonar's default-recognized set, so the
147
+ // action's `action.yml` and scripts need explicit inclusions.
148
+ sonarInclusions: '.github/workflows/**,action.yml,**/*.sh',
149
+ });
150
+ }
147
151
  // `githubRelease` defaults to true, which auto-wires
148
152
  // `publishToGitHubReleases` - its `gh release create ... --target
149
153
  // $GITHUB_SHA` creates the tag *and* the release together for our
@@ -171,4 +175,4 @@ class GitHubActionProject extends projen_1.github.GitHubProject {
171
175
  }
172
176
  }
173
177
  exports.GitHubActionProject = GitHubActionProject;
174
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aHViLWFjdGlvbi1wcm9qZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FjdGlvbnMvZ2l0aHViLWFjdGlvbi1wcm9qZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxtQ0FNZ0I7QUFDaEIsbUVBQThEO0FBQzlELHVFQUF3RjtBQUN4RixtRUFBOEQ7QUFDOUQsbURBQStEO0FBQy9ELHlEQUF5RDtBQUN6RCxpRUFBMEU7QUFDMUUseURBQXdEO0FBQ3hELHVGQUFpRjtBQUNqRix1REFBaUU7QUFDakUsK0ZBQXlGO0FBQ3pGLGlFQUFpRTtBQUVqRSwyRUFBMkU7QUFDM0UseUVBQXlFO0FBQ3pFLCtEQUErRDtBQUMvRCx5RUFBeUU7QUFDekUsb0VBQW9FO0FBQ3BFLGtFQUFrRTtBQUNsRSxpRUFBaUU7QUFDakUsTUFBTSxjQUFjLEdBQVcsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsT0FBTyxDQUFDO0FBQ3RFLGlFQUFpRTtBQUNqRSxNQUFNLG9CQUFvQixHQUFXLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUUzRSx3RUFBd0U7QUFDeEUsNEVBQTRFO0FBQzVFLG1DQUFtQztBQUNuQyxNQUFNLHNCQUFzQixHQUFHLFFBQVEsQ0FBQztBQXFGeEMsU0FBUyxxQkFBcUIsQ0FBQyxPQUFtQztJQUNoRSxPQUFPLEtBQUssT0FBTyxDQUFDLElBQUk7O0VBRXhCLE9BQU8sQ0FBQyxXQUFXLElBQUksRUFBRTs7Ozs7a0JBS1QsT0FBTyxDQUFDLElBQUk7Ozs7Ozs7Ozs7Ozs7OztDQWU3QixDQUFDO0FBQ0YsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQWEsbUJBQW9CLFNBQVEsZUFBTSxDQUFDLGFBQWE7O0lBQzNDLGFBQWEsQ0FBc0I7SUFDbkMsZUFBZSxDQUF3QjtJQUN2QyxhQUFhLENBQXNCO0lBQ25DLE9BQU8sQ0FBa0I7SUFFekMsWUFBWSxPQUFtQztRQUM3QyxJQUFJ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SSwyQ0FBbUIsQ0FBQyxJQUFJLEVBQUU7WUFDakQsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZO1lBQ2xDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxpQkFBaUI7WUFDNUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLGdCQUFnQjtZQUMxQyxvQkFBb0IsRUFBRSxPQUFPLENBQUMsb0JBQW9CO1NBQ25ELENBQUMsQ0FBQztRQUVILHFEQUFxRDtRQUNyRCxrRUFBa0U7UUFDbEUsa0VBQWtFO1FBQ2xFLHFFQUFxRTtRQUNyRSw4REFBOEQ7UUFDOUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGdCQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRTtZQUN2QyxNQUFNLEVBQUUsTUFBTTtZQUNkLG1FQUFtRTtZQUNuRSx3REFBd0Q7WUFDeEQsa0JBQWtCLEVBQUUsTUFBTTtZQUMxQixLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztZQUNoQyxXQUFXLEVBQUUsY0FBYztZQUMzQixpQkFBaUIsRUFBRSwwQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRTtZQUN2RCxjQUFjLEVBQUUsZ0JBQU8sQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFO1lBQ25ELFdBQVcsRUFBRSwwQkFBMEIsc0JBQXNCLEVBQUU7WUFDL0QseUJBQXlCLEVBQUU7Z0JBQ3pCLEVBQUUsSUFBSSxFQUFFLHNCQUFzQixFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUU7YUFDaEQ7U0FDRixDQUFDLENBQUM7UUFFSCxtRUFBbUU7UUFDbkUsc0VBQXNFO1FBQ3RFLGtFQUFrRTtRQUNsRSw2Q0FBNkM7UUFDN0MsSUFBQSxzQ0FBbUIsRUFDakIsSUFBSSxDQUFDLFdBQVcsQ0FBQywrQkFBK0IsQ0FBQyxFQUNqRCxxRkFBcUYsQ0FDdEYsQ0FBQztJQUNKLENBQUM7O0FBNUhILGtEQTZIQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEpzb25GaWxlLFxuICBSZWxlYXNhYmxlQ29tbWl0cyxcbiAgWWFtbEZpbGUsXG4gIGdpdGh1YixcbiAgcmVsZWFzZSxcbn0gZnJvbSAncHJvamVuJztcbmltcG9ydCB7IEFjdGlvbkJ1aWxkV29ya2Zsb3cgfSBmcm9tICcuL2FjdGlvbi1idWlsZC13b3JrZmxvdyc7XG5pbXBvcnQgeyBBY3Rpb25Eb2dmb29kT3B0aW9ucywgQWN0aW9uRG9nZm9vZFdvcmtmbG93IH0gZnJvbSAnLi9hY3Rpb24tZG9nZm9vZC13b3JrZmxvdyc7XG5pbXBvcnQgeyBBY3Rpb25Tb25hcldvcmtmbG93IH0gZnJvbSAnLi9hY3Rpb24tc29uYXItd29ya2Zsb3cnO1xuaW1wb3J0IHsgREVGQVVMVF9HSEVfVE9LRU5fU0VDUkVUIH0gZnJvbSAnLi4vY29tbW9uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBhZGRFZGl0b3JDb25maWcgfSBmcm9tICcuLi9jb21tb24vZWRpdG9yY29uZmlnJztcbmltcG9ydCB7IGFwcGx5SW50ZXJuYWxBY3Rpb25PdmVycmlkZXMgfSBmcm9tICcuLi9jb21tb24vaW50ZXJuYWwtYWN0aW9ucyc7XG5pbXBvcnQgeyBhZGRMaWNlbnNlRmlsZSB9IGZyb20gJy4uL2NvbW1vbi9saWNlbnNlLWZpbGUnO1xuaW1wb3J0IHsgUHJvamVuRHJpZnRDaGVja1dvcmtmbG93IH0gZnJvbSAnLi4vY29tbW9uL3Byb2plbi1kcmlmdC1jaGVjay13b3JrZmxvdyc7XG5pbXBvcnQgeyBhdHRhY2hUeXBlU2NyaXB0UHJvamVucmMgfSBmcm9tICcuLi9jb21tb24vcHJvamVucmMtdHMnO1xuaW1wb3J0IHsgV29ya2Zsb3dDaGFuZ2VOb3RpY2VXb3JrZmxvdyB9IGZyb20gJy4uL2NvbW1vbi93b3JrZmxvdy1jaGFuZ2Utbm90aWNlLXdvcmtmbG93JztcbmltcG9ydCB7IG5vdGVXb3JrZmxvd1B1cnBvc2UgfSBmcm9tICcuLi9jb21tb24vd29ya2Zsb3ctcHVycG9zZSc7XG5cbi8vIGByZXF1aXJlKCdwcm9qZW4vcGFja2FnZS5qc29uJylgL2ByZXF1aXJlKCcuLi8uLi9wYWNrYWdlLmpzb24nKWAgcmVzb2x2ZVxuLy8gdmlhIE5vZGUncyBub3JtYWwgbW9kdWxlIHJlc29sdXRpb24sIHNvIGluIGEgKnB1Ymxpc2hlZCogcGFja2FnZSB0aGVzZVxuLy8gcmVhZCB0aGUgdmVyc2lvbnMgYWN0dWFsbHkgaW5zdGFsbGVkIGluIHRoZSBjb25zdW1pbmcgcmVwbydzXG4vLyBub2RlX21vZHVsZXMgLSBleGFjdGx5IHRoZSBcIlBST0pFTl9WRVJTSU9OIG9mIHRoZSBzeW50aFwiIC8gXCJ2ZXJzaW9uIG9mXG4vLyB0aGlzIHBhY2thZ2UgdGhhdCBzY2FmZm9sZGVkIHRoZSByZXBvXCIgdGhlIHByaXZhdGUgcGFja2FnZS5qc29uJ3Ncbi8vIGRldkRlcGVuZGVuY2llcyBuZWVkIHRvIHBpbiAoc2VlIEYwMTAgQ0ktZGVwZW5kZW5jaWVzIHNlY3Rpb24pLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmNvbnN0IFBST0pFTl9WRVJTSU9OOiBzdHJpbmcgPSByZXF1aXJlKCdwcm9qZW4vcGFja2FnZS5qc29uJykudmVyc2lvbjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG5jb25zdCBQUk9KRU5fVFlQRVNfVkVSU0lPTjogc3RyaW5nID0gcmVxdWlyZSgnLi4vLi4vcGFja2FnZS5qc29uJykudmVyc2lvbjtcblxuLy8gRXhhY3QgcGluLCByZWNvcmRlZCBhcyBhIGNvbXBvbmVudCBjb25zdGFudCAoQUQtMDAxOiBubyBsYXRlc3QvbW92aW5nXG4vLyB0YWcvc2VtdmVyIHJhbmdlIGluIGFueXRoaW5nIGEgZ2VuZXJhdGVkIHJlcG8gZGVwZW5kcyBvbikuIFVwZ3JhZGluZyB0aGlzXG4vLyBpcyBhIHJldmlld2VkIGRpZmYgb2YgdGhpcyBmaWxlLlxuY29uc3QgQ09NTUlUX0FORF9UQUdfVkVSU0lPTiA9ICcxMy4yLjEnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdpdEh1YkFjdGlvblByb2plY3RPcHRpb25zXG4gIGV4dGVuZHMgZ2l0aHViLkdpdEh1YlByb2plY3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIE9uZS1saW5lIGRlc2NyaXB0aW9uIG9mIHRoZSBhY3Rpb24uIFVzZWQgaW4gdGhlIGRlZmF1bHQgUkVBRE1FXG4gICAqIHRlbXBsYXRlIGFuZCByZWNvcmRlZCBpbiB0aGUgcHJpdmF0ZSBgcGFja2FnZS5qc29uYC5cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBHaXRIdWIgQWN0aW9ucyBzZWNyZXQgaG9sZGluZyB0aGUgUEFUIHVzZWQgZm9yXG4gICAqIHByb2plbi1hdXRvbWF0aW9uIFBSIGNvbW1lbnRzIChGMDAzKSBhbmQgdGhlIGRyaWZ0LWNoZWNrJ3MgUFIgY29tbWVudHMuXG4gICAqIEl0IGlzICoqbm90Kiogd2lyZWQgaW50byB0aGUgZG9nZm9vZCBhdXRvbWF0aWNhbGx5OiBhIGRvZ2Zvb2QgdGhhdCBpbnZva2VzXG4gICAqIGFuIGFjdGlvbiB3aXRoIGEgYHRva2VuYCBpbnB1dCBtdXN0IHJlZmVyZW5jZSB0aGlzIHNlY3JldCBpbiB0aGUgc3RlcCdzXG4gICAqIGBpbnB1dHNgIChlLmcuIGB0b2tlbjogJyR7eyBzZWNyZXRzLlBST0pFTl9HSVRIVUJfVE9LRU4gfX0nYCkuXG4gICAqIEBkZWZhdWx0IFwiUFJPSkVOX0dJVEhVQl9UT0tFTlwiXG4gICAqL1xuICByZWFkb25seSBnaGVUb2tlblNlY3JldD86IHN0cmluZztcblxuICAvKipcbiAgICogVVJMIG9mIHRoZSBvcmcncyBTb25hckNsb3VkIGluc3RhbmNlIChlLmcuIGBodHRwczovL3NvbmFyY2xvdWQuaW9gKS5cbiAgICogTVVTVCBiZSByZWFjaGFibGUgZnJvbSBnaXRodWIuY29tLWhvc3RlZCAocHVibGljKSBydW5uZXJzIChBRC0wMDEpLlxuICAgKiBSZXF1aXJlZCwgbm8gZGVmYXVsdDogYSBndWVzc2VkIHNlcnZlciBpcyB3b3JzZSB0aGFuIGEgbG91ZCBmYWlsdXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgc29uYXJIb3N0VXJsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNvbmFyQ2xvdWQgb3JnYW5pemF0aW9uIGtleSAoYHNvbmFyLm9yZ2FuaXphdGlvbmApLCByZXF1aXJlZCBieSB0aGVcbiAgICogU2Nhbm5lciBDTEkgb24gU29uYXJDbG91ZC5cbiAgICogQGRlZmF1bHQgXCJ4cGVydHNzXCJcbiAgICovXG4gIHJlYWRvbmx5IHNvbmFyT3JnYW5pemF0aW9uPzogc3RyaW5nO1xuXG4gIC8qKiBAZGVmYXVsdCBcIlNPTkFSX1RPS0VOXCIgKi9cbiAgcmVhZG9ubHkgc29uYXJUb2tlblNlY3JldD86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciBgc29uYXIueW1sYCBhbHNvIHJ1bnMgb24gYHB1bGxfcmVxdWVzdGAgYXMgYSBwYXNzL2ZhaWwgZ2F0ZS5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgc29uYXJQdWxsUmVxdWVzdEdhdGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgZG9nZm9vZCBzY2VuYXJpbyAoQUQtMDAxKS4gV2hhdCBmaXh0dXJlIHN0YXRlLCB3aGF0IHRvIGFzc2VydCwgYW5kXG4gICAqIGhvdyB0byBjbGVhbiB1cCBhcmUgc3BlY2lmaWVkIGJ5IHRoZSBhY3Rpb24ncyBvd24gRiMjIyBzcGVjIC0gdGhlXG4gICAqIGhpZ2hlc3QtcmlzayBiZWhhdmlvciBvZiB0aGF0IGFjdGlvbi5cbiAgICpcbiAgICogSXRzIHR5cGUgaXMgYSBzdHJ1Y3QsIHdoaWNoIHByb2plbidzIENMSSBjYW5ub3QgcmVuZGVyIGludG8gYSBwcm9qZW5yYyxcbiAgICogc28gaXQgY2FuIG9ubHkgYmUgd3JpdHRlbiBieSBoYW5kIC0gaXQgaXMgdGhlcmVmb3JlIG9wdGlvbmFsLCBiZWNhdXNlIGFcbiAgICogKnJlcXVpcmVkKiBvcHRpb24gYHByb2plbiBuZXdgIGNhbm5vdCBzdXBwbHkgd291bGQgbWFrZSB0aGlzIHByb2plY3RcbiAgICogdHlwZSBpbXBvc3NpYmxlIHRvIHNjYWZmb2xkLiBBRC0wMDEncyBcIm5ldmVyIGEgc2lsZW50IG5vLW9wIGRvZ2Zvb2RcIlxuICAgKiBydWxlIGlzIGVuZm9yY2VkIGluc3RlYWQgYnkgdGhlIHdvcmtmbG93IGl0IGdlbmVyYXRlcyBpbiB0aGF0IGNhc2U6IGFcbiAgICogc2luZ2xlIHN0ZXAgdGhhdCBmYWlscyBvbiBldmVyeSBQUiB1bnRpbCBhIHNjZW5hcmlvIGlzIGRlY2xhcmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGB0ZXN0LWRvZ2Zvb2QueW1sYCBydW5zIG9uZSBmYWlsaW5nIHN0ZXAgdGhhdCB0ZWxscyB5b3UgdG9cbiAgICogZGVjbGFyZSBhIHNjZW5hcmlvXG4gICAqL1xuICByZWFkb25seSBkb2dmb29kPzogQWN0aW9uRG9nZm9vZE9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFNQRFggaWRlbnRpZmllciBmb3IgdGhlIGdlbmVyYXRlZCBgTElDRU5TRWAuXG4gICAqIEBkZWZhdWx0IFwiTUlUXCJcbiAgICovXG4gIHJlYWRvbmx5IGxpY2Vuc2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENvcHlyaWdodCBvd25lciBuYW1lZCBpbiB0aGUgYExJQ0VOU0VgLlxuICAgKiBAZGVmYXVsdCBcIlhwZXJ0IFNvZnR3YXJlXCJcbiAgICovXG4gIHJlYWRvbmx5IGNvcHlyaWdodE93bmVyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDb3B5cmlnaHQgcGVyaW9kIG5hbWVkIGluIHRoZSBgTElDRU5TRWAuXG4gICAqIEBkZWZhdWx0IC0gdGhlIGN1cnJlbnQgeWVhclxuICAgKi9cbiAgcmVhZG9ubHkgY29weXJpZ2h0UGVyaW9kPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXcml0ZSBhIHByb2plbi1tYW5hZ2VkIGAuZWRpdG9yY29uZmlnYC5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZWRpdG9yY29uZmlnPzogYm9vbGVhbjtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFJlYWRtZUNvbnRlbnRzKG9wdGlvbnM6IEdpdEh1YkFjdGlvblByb2plY3RPcHRpb25zKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAjICR7b3B0aW9ucy5uYW1lfVxuXG4ke29wdGlvbnMuZGVzY3JpcHRpb24gPz8gJyd9XG5cbiMjIFVzYWdlXG5cblxcYFxcYFxcYHlhbWxcbi0gdXNlczogeHBlcnRzcy8ke29wdGlvbnMubmFtZX1APHJlZj5cblxcYFxcYFxcYFxuXG4jIyBCdW1waW5nXG5cbkEgXFxgZmVhdDpcXGAvXFxgZml4OlxcYCBjb21taXQgcHVzaGVkIHRvIFxcYG1haW5cXGAgaXMgcmVsZWFzZWQgYXV0b21hdGljYWxseTogYnVtcCxcbnRhZyBcXGB2WC5ZLlpcXGAsIEdpdEh1YiBSZWxlYXNlLiBTZWUgXFxgLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS55bWxcXGAuXG5cbiMjIFRydXN0IGNvbnRyYWN0XG5cblRoaXMgaXMgYSBjb21wb3NpdGUgKHNoZWxsKSBhY3Rpb24gLSBubyBOb2RlL25wbSBhdCBydW50aW1lLCBubyBEb2NrZXIuIEl0c1xuQ0kgbGludCBnYXRlIChcXGBidWlsZC55bWxcXGApLCBkb2dmb29kIHRlc3QgKFxcYHRlc3QtZG9nZm9vZC55bWxcXGApLCBhbmQgU29uYXJcbnNjYW4gKFxcYHNvbmFyLnltbFxcYCkgYXJlIHNjYWZmb2xkZWQgYnkgXFxgQHhwZXJ0c3MvcHJvamVuLXR5cGVzXFxgJ1xuXFxgR2l0SHViQWN0aW9uUHJvamVjdFxcYDsgb25seSBcXGBhY3Rpb24ueW1sXFxgIGFuZCBpdHMgc2hlbGwgc2NyaXB0cyBhcmVcbmhhbmQtY29tbWl0dGVkLlxuYDtcbn1cblxuLyoqXG4gKiBTY2FmZm9sZHMgdGhlIHJlcG8gbGlmZWN5Y2xlIChBRC0wMDEpIGFyb3VuZCBhIGhhbmQtY29tbWl0dGVkLCBjb21wb3NpdGVcbiAqIChzaGVsbCkgR2l0SHViIEFjdGlvbjogdGhlIGBidWlsZGAvYHRlc3QtZG9nZm9vZGAvYHNvbmFyYC9gcmVsZWFzZWBcbiAgKiB3b3JrZmxvd3MsIHZlcnNpb25pbmcgYW5kIHJlbGVhc2UgZGlzY2lwbGluZSwgdGhlIEYwMDMgdmVyaWZ5IGNvbXBvbmVudHMsXG4gICogYW5kIHJlcG8gYm9pbGVycGxhdGUgKGEgcHJpdmF0ZSB2ZXJzaW9uLXNvdXJjZSBgcGFja2FnZS5qc29uYCwgYC55YW1sbGludGAsXG4gICogYExJQ0VOU0VgLCBhbmQgYSBgUkVBRE1FLm1kYCB0ZW1wbGF0ZSkuIFRoZVxuICogYWN0aW9uJ3Mgb3duIGNvbnRlbnRcbiAqIChgYWN0aW9uLnltbGAsIGl0cyBzaGVsbCBzY3JpcHRzLCBgdGVzdC9gIGZpeHR1cmVzKSBpcyBhdXRob3JlZCBieSBoYW5kXG4gKiBwZXIgdGhlIGFjdGlvbidzIG93biBGIyMjIHNwZWMgLSB0aGlzIHR5cGUgb25seSBsaW50cyBpdC5cbiAqL1xuZXhwb3J0IGNsYXNzIEdpdEh1YkFjdGlvblByb2plY3QgZXh0ZW5kcyBnaXRodWIuR2l0SHViUHJvamVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBidWlsZFdvcmtmbG93OiBBY3Rpb25CdWlsZFdvcmtmbG93O1xuICBwdWJsaWMgcmVhZG9ubHkgZG9nZm9vZFdvcmtmbG93OiBBY3Rpb25Eb2dmb29kV29ya2Zsb3c7XG4gIHB1YmxpYyByZWFkb25seSBzb25hcldvcmtmbG93OiBBY3Rpb25Tb25hcldvcmtmbG93O1xuICBwdWJsaWMgcmVhZG9ubHkgcmVsZWFzZTogcmVsZWFzZS5SZWxlYXNlO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEdpdEh1YkFjdGlvblByb2plY3RPcHRpb25zKSB7XG4gICAgaWYgKCFvcHRpb25zLnNvbmFySG9zdFVybCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHaXRIdWJBY3Rpb25Qcm9qZWN0IHJlcXVpcmVzIHNvbmFySG9zdFVybCcpO1xuICAgIH1cbiAgICAvLyBBIGRlY2xhcmVkLWJ1dC1pbmNvbXBsZXRlIGRvZ2Zvb2QgaXMgc3RpbGwgYW4gZXJyb3IgLSBzZWVcbiAgICAvLyBgQWN0aW9uRG9nZm9vZFdvcmtmbG93YCwgd2hpY2ggb3ducyB0aGF0IGNoZWNrIChhbmQgdGhlXG4gICAgLy8gbm8tZG9nZm9vZC1kZWNsYXJlZCBjYXNlKS5cblxuICAgIHN1cGVyKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAvLyBQUiB0aXRsZXMgYXJlIG5vdCBnYXRlZDogYGZlYXQ6YC9gZml4OmAgbWF0dGVyIG9ubHkgYmVjYXVzZSB0aGV5IGRyaXZlXG4gICAgICAvLyB0aGUgcmVsZWFzZSB3b3JrZmxvdyAodmlhIGByZWxlYXNhYmxlQ29tbWl0c2ApLCBub3QgUFIgY2hlY2tzLiBUaGVcbiAgICAgIC8vIGNvbnZlbnRpb25hbC1jb21taXQgUFItdGl0bGUgbGludCBpcyBhZGRlZCBieSB0aGUgYEdpdEh1YmAgY29tcG9uZW50XG4gICAgICAvLyB1bmxlc3MgYGdpdGh1Yk9wdGlvbnMucHVsbFJlcXVlc3RMaW50YCBpcyBgZmFsc2VgIChpdCBkZWZhdWx0cyB0cnVlKS5cbiAgICAgIGdpdGh1Yk9wdGlvbnM6IHsgLi4ub3B0aW9ucy5naXRodWJPcHRpb25zLCBwdWxsUmVxdWVzdExpbnQ6IGZhbHNlIH0sXG4gICAgICByZWFkbWU6IG9wdGlvbnMucmVhZG1lID8/IHsgY29udGVudHM6IGRlZmF1bHRSZWFkbWVDb250ZW50cyhvcHRpb25zKSB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgZ2ggPSB0aGlzLmdpdGh1YjtcbiAgICBpZiAoIWdoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdHaXRIdWJBY3Rpb25Qcm9qZWN0IHJlcXVpcmVzIEdpdEh1YiBpbnRlZ3JhdGlvbiB0byBiZSBlbmFibGVkJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGFwcGx5SW50ZXJuYWxBY3Rpb25PdmVycmlkZXMoZ2gpO1xuXG4gICAgLy8gSmV0QnJhaW5zIElERSBzdGF0ZSAoLmlkZWEvKSBpcyBuZXZlciB0cmFja2VkIGluIGdlbmVyYXRlZCByZXBvcywgYW5kXG4gICAgLy8gbmVpdGhlciBpcyAvc3BlYy8gKGxvY2FsIHBsYW5zIGFuZCBzcGVjczsgdGhlIHBhdHRlcm4gY292ZXJzIGV2ZXJ5XG4gICAgLy8gc3ViZGlyZWN0b3J5KS5cbiAgICB0aGlzLmFkZEdpdElnbm9yZSgnLy5pZGVhLyonKTtcbiAgICB0aGlzLmFkZEdpdElnbm9yZSgnL3NwZWMvJyk7XG5cbiAgICBpZiAob3B0aW9ucy5lZGl0b3Jjb25maWcgPz8gdHJ1ZSkge1xuICAgICAgYWRkRWRpdG9yQ29uZmlnKHRoaXMpO1xuICAgIH1cblxuICAgIG5ldyBQcm9qZW5EcmlmdENoZWNrV29ya2Zsb3codGhpcywge1xuICAgICAgZ2hlVG9rZW5TZWNyZXQ6IG9wdGlvbnMuZ2hlVG9rZW5TZWNyZXQgPz8gREVGQVVMVF9HSEVfVE9LRU5fU0VDUkVULFxuICAgIH0pO1xuICAgIG5ldyBXb3JrZmxvd0NoYW5nZU5vdGljZVdvcmtmbG93KHRoaXMpO1xuXG4gICAgYWRkTGljZW5zZUZpbGUodGhpcywge1xuICAgICAgc3BkeDogb3B0aW9ucy5saWNlbnNlID8/ICdNSVQnLFxuICAgICAgY29weXJpZ2h0T3duZXI6IG9wdGlvbnMuY29weXJpZ2h0T3duZXIgPz8gJ1hwZXJ0IFNvZnR3YXJlJyxcbiAgICAgIGNvcHlyaWdodFBlcmlvZDogb3B0aW9ucy5jb3B5cmlnaHRQZXJpb2QsXG4gICAgfSk7XG5cbiAgICAvLyBgLnByb2plbnJjLnRzYCArIGBucHggcHJvamVuYCwgc2FtZSBhcyBldmVyeSBvdGhlciB0eXBlIGhlcmUuIEEgYmFyZVxuICAgIC8vIEdpdEh1YlByb2plY3QgaGFzIG5vIGRlZmF1bHQgdGFzayB0aGF0IHJ1bnMgYSBwcm9qZW5yYyBvbiBpdHMgb3duLCBzb1xuICAgIC8vIHRoaXMgaXMgd2hhdCBtYWtlcyBgbnB4IHByb2plbmAgd29yayBpbiB0aGUgZ2VuZXJhdGVkIHJlcG8gYXQgYWxsLlxuICAgIGF0dGFjaFR5cGVTY3JpcHRQcm9qZW5yYyh0aGlzKTtcblxuICAgIC8vIHByb2plbiBtYXJrcyBnZW5lcmF0ZWQgZmlsZXMgcmVhZC1vbmx5ICgwNDQ0KSBvbiBkaXNrIGJ5IGRlZmF1bHQsIGJ1dFxuICAgIC8vIHRoaXMgb25lIG11c3Qgc3RheSBvd25lci13cml0YWJsZTogdGhlIGRvY3VtZW50ZWQgdXBkYXRlIGZsb3dcbiAgICAvLyAoYG5wbSBpIC1EIEB4cGVydHNzL3Byb2plbi10eXBlc0BsYXRlc3RgKSBuZWVkcyBucG0gdG8gcmV3cml0ZSB0aGVcbiAgICAvLyBwaW5uZWQgdmVyc2lvbnMgaW4gYW4gZXhpc3RpbmcgcmVwby4gSGFuZC1lZGl0cyBhcmUgc3RpbGwgY2F1Z2h0IGJ5XG4gICAgLy8gdGhlIGRyaWZ0IGNoZWNrLlxuICAgIG5ldyBKc29uRmlsZSh0aGlzLCAncGFja2FnZS5qc29uJywge1xuICAgICAgb2JqOiB7XG4gICAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSxcbiAgICAgICAgdmVyc2lvbjogJzAuMC4wJyxcbiAgICAgICAgcHJpdmF0ZTogdHJ1ZSxcbiAgICAgICAgZGVzY3JpcHRpb246IG9wdGlvbnMuZGVzY3JpcHRpb24sXG4gICAgICAgIGRldkRlcGVuZGVuY2llczoge1xuICAgICAgICAgICdwcm9qZW4nOiBQUk9KRU5fVkVSU0lPTixcbiAgICAgICAgICAnQHhwZXJ0c3MvcHJvamVuLXR5cGVzJzogUFJPSkVOX1RZUEVTX1ZFUlNJT04sXG4gICAgICAgICAgJ2NvbW1pdC1hbmQtdGFnLXZlcnNpb24nOiBDT01NSVRfQU5EX1RBR19WRVJTSU9OLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHJlYWRvbmx5OiBmYWxzZSxcbiAgICB9KTtcblxuICAgIG5ldyBZYW1sRmlsZSh0aGlzLCAnLnlhbWxsaW50Jywge1xuICAgICAgb2JqOiB7XG4gICAgICAgIGV4dGVuZHM6ICdkZWZhdWx0JyxcbiAgICAgICAgcnVsZXM6IHsgJ2xpbmUtbGVuZ3RoJzogeyBtYXg6IDEyMCB9IH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5idWlsZFdvcmtmbG93ID0gbmV3IEFjdGlvbkJ1aWxkV29ya2Zsb3codGhpcyk7XG5cbiAgICB0aGlzLmRvZ2Zvb2RXb3JrZmxvdyA9IG5ldyBBY3Rpb25Eb2dmb29kV29ya2Zsb3codGhpcywgb3B0aW9ucy5kb2dmb29kKTtcblxuICAgIHRoaXMuc29uYXJXb3JrZmxvdyA9IG5ldyBBY3Rpb25Tb25hcldvcmtmbG93KHRoaXMsIHtcbiAgICAgIHNvbmFySG9zdFVybDogb3B0aW9ucy5zb25hckhvc3RVcmwsXG4gICAgICBzb25hck9yZ2FuaXphdGlvbjogb3B0aW9ucy5zb25hck9yZ2FuaXphdGlvbixcbiAgICAgIHNvbmFyVG9rZW5TZWNyZXQ6IG9wdGlvbnMuc29uYXJUb2tlblNlY3JldCxcbiAgICAgIHNvbmFyUHVsbFJlcXVlc3RHYXRlOiBvcHRpb25zLnNvbmFyUHVsbFJlcXVlc3RHYXRlLFxuICAgIH0pO1xuXG4gICAgLy8gYGdpdGh1YlJlbGVhc2VgIGRlZmF1bHRzIHRvIHRydWUsIHdoaWNoIGF1dG8td2lyZXNcbiAgICAvLyBgcHVibGlzaFRvR2l0SHViUmVsZWFzZXNgIC0gaXRzIGBnaCByZWxlYXNlIGNyZWF0ZSAuLi4gLS10YXJnZXRcbiAgICAvLyAkR0lUSFVCX1NIQWAgY3JlYXRlcyB0aGUgdGFnICphbmQqIHRoZSByZWxlYXNlIHRvZ2V0aGVyIGZvciBvdXJcbiAgICAvLyBjb250aW51b3VzIChwdXNoLXRvLW1haW4pIHRyaWdnZXIuIE5vIHNlcGFyYXRlIGBwdWJsaXNoVG9HaXRgIGNhbGxcbiAgICAvLyBuZWVkZWQgKHRoYXQgcGF0aCBvbmx5IGZpcmVzIGZvciBhIG1hbnVhbCByZWxlYXNlIHRyaWdnZXIpLlxuICAgIHRoaXMucmVsZWFzZSA9IG5ldyByZWxlYXNlLlJlbGVhc2UodGhpcywge1xuICAgICAgYnJhbmNoOiAnbWFpbicsXG4gICAgICAvLyBObyBidWlsZCBhcnRpZmFjdCBmb3IgYSBjb21wb3NpdGUgYWN0aW9uIChBRC0wMDEpIC0gdGhpcyBpcyBvbmx5XG4gICAgICAvLyB3aGVyZSBSZWxlYXNlIHN0YWdlcyBpdHMgb3duIHZlcnNpb24vY2hhbmdlbG9nIGZpbGVzLlxuICAgICAgYXJ0aWZhY3RzRGlyZWN0b3J5OiAnZGlzdCcsXG4gICAgICB0YXNrczogW3RoaXMuYnVpbGRXb3JrZmxvdy50YXNrXSxcbiAgICAgIHZlcnNpb25GaWxlOiAncGFja2FnZS5qc29uJyxcbiAgICAgIHJlbGVhc2FibGVDb21taXRzOiBSZWxlYXNhYmxlQ29tbWl0cy5mZWF0dXJlc0FuZEZpeGVzKCksXG4gICAgICByZWxlYXNlVHJpZ2dlcjogcmVsZWFzZS5SZWxlYXNlVHJpZ2dlci5jb250aW51b3VzKCksXG4gICAgICBidW1wUGFja2FnZTogYGNvbW1pdC1hbmQtdGFnLXZlcnNpb25AJHtDT01NSVRfQU5EX1RBR19WRVJTSU9OfWAsXG4gICAgICByZWxlYXNlV29ya2Zsb3dTZXR1cFN0ZXBzOiBbXG4gICAgICAgIHsgbmFtZTogJ0luc3RhbGwgZGVwZW5kZW5jaWVzJywgcnVuOiAnbnBtIGNpJyB9LFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIC8vIFRoZSByZWxlYXNlIHdvcmtmbG93IGlzIGNyZWF0ZWQgaW5zaWRlIGByZWxlYXNlLlJlbGVhc2VgIChwcm9qZW5cbiAgICAvLyBpbnRlcm5hbCksIG5vdCBieSB0aGlzIHR5cGUgLSByZWFjaCBpdHMgZmlsZSBieSBwYXRoIHRvIGFubm90YXRlIGl0XG4gICAgLy8gbGlrZSBldmVyeSBvdGhlciBnZW5lcmF0ZWQgd29ya2Zsb3cuIFRoaXMgdHlwZSBpcyBhbHdheXMgYSByb290XG4gICAgLy8gcHJvamVjdCwgc28gcHJvamVuIG5hbWVzIGl0IGByZWxlYXNlLnltbGAuXG4gICAgbm90ZVdvcmtmbG93UHVycG9zZShcbiAgICAgIHRoaXMudHJ5RmluZEZpbGUoJy5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sJyksXG4gICAgICAnQ29udGludW91cyByZWxlYXNlIG9uIHB1c2ggdG8gbWFpbjogYnVtcCB2ZXJzaW9uLCB0YWcsIGFuZCBjcmVhdGUgYSBHaXRIdWIgUmVsZWFzZS4nLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
178
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aHViLWFjdGlvbi1wcm9qZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FjdGlvbnMvZ2l0aHViLWFjdGlvbi1wcm9qZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxtQ0FNZ0I7QUFDaEIsbUVBQThEO0FBQzlELHVFQUF3RjtBQUN4RixtREFBK0Q7QUFDL0QseURBQXlEO0FBQ3pELGlFQUEwRTtBQUMxRSx5REFBd0Q7QUFDeEQsdUZBQWlGO0FBQ2pGLHVEQUFpRTtBQUVqRSw2REFBeUQ7QUFDekQsK0ZBQXlGO0FBQ3pGLGlFQUFpRTtBQUVqRSwyRUFBMkU7QUFDM0UseUVBQXlFO0FBQ3pFLCtEQUErRDtBQUMvRCx5RUFBeUU7QUFDekUsb0VBQW9FO0FBQ3BFLGtFQUFrRTtBQUNsRSxpRUFBaUU7QUFDakUsTUFBTSxjQUFjLEdBQVcsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsT0FBTyxDQUFDO0FBQ3RFLGlFQUFpRTtBQUNqRSxNQUFNLG9CQUFvQixHQUFXLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUUzRSx3RUFBd0U7QUFDeEUsNEVBQTRFO0FBQzVFLG1DQUFtQztBQUNuQyxNQUFNLHNCQUFzQixHQUFHLFFBQVEsQ0FBQztBQStEeEMsU0FBUyxxQkFBcUIsQ0FBQyxPQUFtQztJQUNoRSxPQUFPLEtBQUssT0FBTyxDQUFDLElBQUk7O0VBRXhCLE9BQU8sQ0FBQyxXQUFXLElBQUksRUFBRTs7Ozs7a0JBS1QsT0FBTyxDQUFDLElBQUk7Ozs7Ozs7Ozs7Ozs7OztDQWU3QixDQUFDO0FBQ0YsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQWEsbUJBQW9CLFNBQVEsZUFBTSxDQUFDLGFBQWE7O0lBQzNDLGFBQWEsQ0FBc0I7SUFDbkMsZUFBZSxDQUF3QjtJQUN2RCxnREFBZ0Q7SUFDaEMsYUFBYSxDQUFpQjtJQUM5QixPQUFPLENBQWtCO0lBRXpDLFlBQVksT0FB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c29uRmlsZSxcbiAgUmVsZWFzYWJsZUNvbW1pdHMsXG4gIFlhbWxGaWxlLFxuICBnaXRodWIsXG4gIHJlbGVhc2UsXG59IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBBY3Rpb25CdWlsZFdvcmtmbG93IH0gZnJvbSAnLi9hY3Rpb24tYnVpbGQtd29ya2Zsb3cnO1xuaW1wb3J0IHsgQWN0aW9uRG9nZm9vZE9wdGlvbnMsIEFjdGlvbkRvZ2Zvb2RXb3JrZmxvdyB9IGZyb20gJy4vYWN0aW9uLWRvZ2Zvb2Qtd29ya2Zsb3cnO1xuaW1wb3J0IHsgREVGQVVMVF9HSEVfVE9LRU5fU0VDUkVUIH0gZnJvbSAnLi4vY29tbW9uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBhZGRFZGl0b3JDb25maWcgfSBmcm9tICcuLi9jb21tb24vZWRpdG9yY29uZmlnJztcbmltcG9ydCB7IGFwcGx5SW50ZXJuYWxBY3Rpb25PdmVycmlkZXMgfSBmcm9tICcuLi9jb21tb24vaW50ZXJuYWwtYWN0aW9ucyc7XG5pbXBvcnQgeyBhZGRMaWNlbnNlRmlsZSB9IGZyb20gJy4uL2NvbW1vbi9saWNlbnNlLWZpbGUnO1xuaW1wb3J0IHsgUHJvamVuRHJpZnRDaGVja1dvcmtmbG93IH0gZnJvbSAnLi4vY29tbW9uL3Byb2plbi1kcmlmdC1jaGVjay13b3JrZmxvdyc7XG5pbXBvcnQgeyBhdHRhY2hUeXBlU2NyaXB0UHJvamVucmMgfSBmcm9tICcuLi9jb21tb24vcHJvamVucmMtdHMnO1xuaW1wb3J0IHsgU29uYXJTY2FuT3B0aW9ucyB9IGZyb20gJy4uL2NvbW1vbi9zb25hci1vcHRpb25zJztcbmltcG9ydCB7IFNvbmFyV29ya2Zsb3cgfSBmcm9tICcuLi9jb21tb24vc29uYXItd29ya2Zsb3cnO1xuaW1wb3J0IHsgV29ya2Zsb3dDaGFuZ2VOb3RpY2VXb3JrZmxvdyB9IGZyb20gJy4uL2NvbW1vbi93b3JrZmxvdy1jaGFuZ2Utbm90aWNlLXdvcmtmbG93JztcbmltcG9ydCB7IG5vdGVXb3JrZmxvd1B1cnBvc2UgfSBmcm9tICcuLi9jb21tb24vd29ya2Zsb3ctcHVycG9zZSc7XG5cbi8vIGByZXF1aXJlKCdwcm9qZW4vcGFja2FnZS5qc29uJylgL2ByZXF1aXJlKCcuLi8uLi9wYWNrYWdlLmpzb24nKWAgcmVzb2x2ZVxuLy8gdmlhIE5vZGUncyBub3JtYWwgbW9kdWxlIHJlc29sdXRpb24sIHNvIGluIGEgKnB1Ymxpc2hlZCogcGFja2FnZSB0aGVzZVxuLy8gcmVhZCB0aGUgdmVyc2lvbnMgYWN0dWFsbHkgaW5zdGFsbGVkIGluIHRoZSBjb25zdW1pbmcgcmVwbydzXG4vLyBub2RlX21vZHVsZXMgLSBleGFjdGx5IHRoZSBcIlBST0pFTl9WRVJTSU9OIG9mIHRoZSBzeW50aFwiIC8gXCJ2ZXJzaW9uIG9mXG4vLyB0aGlzIHBhY2thZ2UgdGhhdCBzY2FmZm9sZGVkIHRoZSByZXBvXCIgdGhlIHByaXZhdGUgcGFja2FnZS5qc29uJ3Ncbi8vIGRldkRlcGVuZGVuY2llcyBuZWVkIHRvIHBpbiAoc2VlIEYwMTAgQ0ktZGVwZW5kZW5jaWVzIHNlY3Rpb24pLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmNvbnN0IFBST0pFTl9WRVJTSU9OOiBzdHJpbmcgPSByZXF1aXJlKCdwcm9qZW4vcGFja2FnZS5qc29uJykudmVyc2lvbjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG5jb25zdCBQUk9KRU5fVFlQRVNfVkVSU0lPTjogc3RyaW5nID0gcmVxdWlyZSgnLi4vLi4vcGFja2FnZS5qc29uJykudmVyc2lvbjtcblxuLy8gRXhhY3QgcGluLCByZWNvcmRlZCBhcyBhIGNvbXBvbmVudCBjb25zdGFudCAoQUQtMDAxOiBubyBsYXRlc3QvbW92aW5nXG4vLyB0YWcvc2VtdmVyIHJhbmdlIGluIGFueXRoaW5nIGEgZ2VuZXJhdGVkIHJlcG8gZGVwZW5kcyBvbikuIFVwZ3JhZGluZyB0aGlzXG4vLyBpcyBhIHJldmlld2VkIGRpZmYgb2YgdGhpcyBmaWxlLlxuY29uc3QgQ09NTUlUX0FORF9UQUdfVkVSU0lPTiA9ICcxMy4yLjEnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdpdEh1YkFjdGlvblByb2plY3RPcHRpb25zXG4gIGV4dGVuZHMgZ2l0aHViLkdpdEh1YlByb2plY3RPcHRpb25zLFxuICBTb25hclNjYW5PcHRpb25zIHtcbiAgLyoqXG4gICAqIE9uZS1saW5lIGRlc2NyaXB0aW9uIG9mIHRoZSBhY3Rpb24uIFVzZWQgaW4gdGhlIGRlZmF1bHQgUkVBRE1FXG4gICAqIHRlbXBsYXRlIGFuZCByZWNvcmRlZCBpbiB0aGUgcHJpdmF0ZSBgcGFja2FnZS5qc29uYC5cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBHaXRIdWIgQWN0aW9ucyBzZWNyZXQgaG9sZGluZyB0aGUgUEFUIHVzZWQgZm9yXG4gICAqIHByb2plbi1hdXRvbWF0aW9uIFBSIGNvbW1lbnRzIChGMDAzKSBhbmQgdGhlIGRyaWZ0LWNoZWNrJ3MgUFIgY29tbWVudHMuXG4gICAqIEl0IGlzICoqbm90Kiogd2lyZWQgaW50byB0aGUgZG9nZm9vZCBhdXRvbWF0aWNhbGx5OiBhIGRvZ2Zvb2QgdGhhdCBpbnZva2VzXG4gICAqIGFuIGFjdGlvbiB3aXRoIGEgYHRva2VuYCBpbnB1dCBtdXN0IHJlZmVyZW5jZSB0aGlzIHNlY3JldCBpbiB0aGUgc3RlcCdzXG4gICAqIGBpbnB1dHNgIChlLmcuIGB0b2tlbjogJyR7eyBzZWNyZXRzLlBST0pFTl9HSVRIVUJfVE9LRU4gfX0nYCkuXG4gICAqIEBkZWZhdWx0IFwiUFJPSkVOX0dJVEhVQl9UT0tFTlwiXG4gICAqL1xuICByZWFkb25seSBnaGVUb2tlblNlY3JldD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRvZ2Zvb2Qgc2NlbmFyaW8gKEFELTAwMSkuIFdoYXQgZml4dHVyZSBzdGF0ZSwgd2hhdCB0byBhc3NlcnQsIGFuZFxuICAgKiBob3cgdG8gY2xlYW4gdXAgYXJlIHNwZWNpZmllZCBieSB0aGUgYWN0aW9uJ3Mgb3duIEYjIyMgc3BlYyAtIHRoZVxuICAgKiBoaWdoZXN0LXJpc2sgYmVoYXZpb3Igb2YgdGhhdCBhY3Rpb24uXG4gICAqXG4gICAqIEl0cyB0eXBlIGlzIGEgc3RydWN0LCB3aGljaCBwcm9qZW4ncyBDTEkgY2Fubm90IHJlbmRlciBpbnRvIGEgcHJvamVucmMsXG4gICAqIHNvIGl0IGNhbiBvbmx5IGJlIHdyaXR0ZW4gYnkgaGFuZCAtIGl0IGlzIHRoZXJlZm9yZSBvcHRpb25hbCwgYmVjYXVzZSBhXG4gICAqICpyZXF1aXJlZCogb3B0aW9uIGBwcm9qZW4gbmV3YCBjYW5ub3Qgc3VwcGx5IHdvdWxkIG1ha2UgdGhpcyBwcm9qZWN0XG4gICAqIHR5cGUgaW1wb3NzaWJsZSB0byBzY2FmZm9sZC4gQUQtMDAxJ3MgXCJuZXZlciBhIHNpbGVudCBuby1vcCBkb2dmb29kXCJcbiAgICogcnVsZSBpcyBlbmZvcmNlZCBpbnN0ZWFkIGJ5IHRoZSB3b3JrZmxvdyBpdCBnZW5lcmF0ZXMgaW4gdGhhdCBjYXNlOiBhXG4gICAqIHNpbmdsZSBzdGVwIHRoYXQgZmFpbHMgb24gZXZlcnkgUFIgdW50aWwgYSBzY2VuYXJpbyBpcyBkZWNsYXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBgdGVzdC1kb2dmb29kLnltbGAgcnVucyBvbmUgZmFpbGluZyBzdGVwIHRoYXQgdGVsbHMgeW91IHRvXG4gICAqIGRlY2xhcmUgYSBzY2VuYXJpb1xuICAgKi9cbiAgcmVhZG9ubHkgZG9nZm9vZD86IEFjdGlvbkRvZ2Zvb2RPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBTUERYIGlkZW50aWZpZXIgZm9yIHRoZSBnZW5lcmF0ZWQgYExJQ0VOU0VgLlxuICAgKiBAZGVmYXVsdCBcIk1JVFwiXG4gICAqL1xuICByZWFkb25seSBsaWNlbnNlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDb3B5cmlnaHQgb3duZXIgbmFtZWQgaW4gdGhlIGBMSUNFTlNFYC5cbiAgICogQGRlZmF1bHQgXCJYcGVydCBTb2Z0d2FyZVwiXG4gICAqL1xuICByZWFkb25seSBjb3B5cmlnaHRPd25lcj86IHN0cmluZztcblxuICAvKipcbiAgICogQ29weXJpZ2h0IHBlcmlvZCBuYW1lZCBpbiB0aGUgYExJQ0VOU0VgLlxuICAgKiBAZGVmYXVsdCAtIHRoZSBjdXJyZW50IHllYXJcbiAgICovXG4gIHJlYWRvbmx5IGNvcHlyaWdodFBlcmlvZD86IHN0cmluZztcblxuICAvKipcbiAgICogV3JpdGUgYSBwcm9qZW4tbWFuYWdlZCBgLmVkaXRvcmNvbmZpZ2AuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGVkaXRvcmNvbmZpZz86IGJvb2xlYW47XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRSZWFkbWVDb250ZW50cyhvcHRpb25zOiBHaXRIdWJBY3Rpb25Qcm9qZWN0T3B0aW9ucyk6IHN0cmluZyB7XG4gIHJldHVybiBgIyAke29wdGlvbnMubmFtZX1cblxuJHtvcHRpb25zLmRlc2NyaXB0aW9uID8/ICcnfVxuXG4jIyBVc2FnZVxuXG5cXGBcXGBcXGB5YW1sXG4tIHVzZXM6IHhwZXJ0c3MvJHtvcHRpb25zLm5hbWV9QDxyZWY+XG5cXGBcXGBcXGBcblxuIyMgQnVtcGluZ1xuXG5BIFxcYGZlYXQ6XFxgL1xcYGZpeDpcXGAgY29tbWl0IHB1c2hlZCB0byBcXGBtYWluXFxgIGlzIHJlbGVhc2VkIGF1dG9tYXRpY2FsbHk6IGJ1bXAsXG50YWcgXFxgdlguWS5aXFxgLCBHaXRIdWIgUmVsZWFzZS4gU2VlIFxcYC5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sXFxgLlxuXG4jIyBUcnVzdCBjb250cmFjdFxuXG5UaGlzIGlzIGEgY29tcG9zaXRlIChzaGVsbCkgYWN0aW9uIC0gbm8gTm9kZS9ucG0gYXQgcnVudGltZSwgbm8gRG9ja2VyLiBJdHNcbkNJIGxpbnQgZ2F0ZSAoXFxgYnVpbGQueW1sXFxgKSwgZG9nZm9vZCB0ZXN0IChcXGB0ZXN0LWRvZ2Zvb2QueW1sXFxgKSwgYW5kIFNvbmFyXG5zY2FuIChcXGBzb25hci55bWxcXGApIGFyZSBzY2FmZm9sZGVkIGJ5IFxcYEB4cGVydHNzL3Byb2plbi10eXBlc1xcYCdcblxcYEdpdEh1YkFjdGlvblByb2plY3RcXGA7IG9ubHkgXFxgYWN0aW9uLnltbFxcYCBhbmQgaXRzIHNoZWxsIHNjcmlwdHMgYXJlXG5oYW5kLWNvbW1pdHRlZC5cbmA7XG59XG5cbi8qKlxuICogU2NhZmZvbGRzIHRoZSByZXBvIGxpZmVjeWNsZSAoQUQtMDAxKSBhcm91bmQgYSBoYW5kLWNvbW1pdHRlZCwgY29tcG9zaXRlXG4gKiAoc2hlbGwpIEdpdEh1YiBBY3Rpb246IHRoZSBgYnVpbGRgL2B0ZXN0LWRvZ2Zvb2RgL2Bzb25hcmAvYHJlbGVhc2VgXG4gICogd29ya2Zsb3dzLCB2ZXJzaW9uaW5nIGFuZCByZWxlYXNlIGRpc2NpcGxpbmUsIHRoZSBGMDAzIHZlcmlmeSBjb21wb25lbnRzLFxuICAqIGFuZCByZXBvIGJvaWxlcnBsYXRlIChhIHByaXZhdGUgdmVyc2lvbi1zb3VyY2UgYHBhY2thZ2UuanNvbmAsIGAueWFtbGxpbnRgLFxuICAqIGBMSUNFTlNFYCwgYW5kIGEgYFJFQURNRS5tZGAgdGVtcGxhdGUpLiBUaGVcbiAqIGFjdGlvbidzIG93biBjb250ZW50XG4gKiAoYGFjdGlvbi55bWxgLCBpdHMgc2hlbGwgc2NyaXB0cywgYHRlc3QvYCBmaXh0dXJlcykgaXMgYXV0aG9yZWQgYnkgaGFuZFxuICogcGVyIHRoZSBhY3Rpb24ncyBvd24gRiMjIyBzcGVjIC0gdGhpcyB0eXBlIG9ubHkgbGludHMgaXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBHaXRIdWJBY3Rpb25Qcm9qZWN0IGV4dGVuZHMgZ2l0aHViLkdpdEh1YlByb2plY3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgYnVpbGRXb3JrZmxvdzogQWN0aW9uQnVpbGRXb3JrZmxvdztcbiAgcHVibGljIHJlYWRvbmx5IGRvZ2Zvb2RXb3JrZmxvdzogQWN0aW9uRG9nZm9vZFdvcmtmbG93O1xuICAvKiogU2V0IG9ubHkgd2hlbiBgc29uYXJIb3N0VXJsYCBpcyBwcm92aWRlZC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHNvbmFyV29ya2Zsb3c/OiBTb25hcldvcmtmbG93O1xuICBwdWJsaWMgcmVhZG9ubHkgcmVsZWFzZTogcmVsZWFzZS5SZWxlYXNlO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEdpdEh1YkFjdGlvblByb2plY3RPcHRpb25zKSB7XG4gICAgLy8gQSBkZWNsYXJlZC1idXQtaW5jb21wbGV0ZSBkb2dmb29kIGlzIHN0aWxsIGFuIGVycm9yIC0gc2VlXG4gICAgLy8gYEFjdGlvbkRvZ2Zvb2RXb3JrZmxvd2AsIHdoaWNoIG93bnMgdGhhdCBjaGVjayAoYW5kIHRoZVxuICAgIC8vIG5vLWRvZ2Zvb2QtZGVjbGFyZWQgY2FzZSkuXG5cbiAgICBzdXBlcih7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgLy8gUFIgdGl0bGVzIGFyZSBub3QgZ2F0ZWQ6IGBmZWF0OmAvYGZpeDpgIG1hdHRlciBvbmx5IGJlY2F1c2UgdGhleSBkcml2ZVxuICAgICAgLy8gdGhlIHJlbGVhc2Ugd29ya2Zsb3cgKHZpYSBgcmVsZWFzYWJsZUNvbW1pdHNgKSwgbm90IFBSIGNoZWNrcy4gVGhlXG4gICAgICAvLyBjb252ZW50aW9uYWwtY29tbWl0IFBSLXRpdGxlIGxpbnQgaXMgYWRkZWQgYnkgdGhlIGBHaXRIdWJgIGNvbXBvbmVudFxuICAgICAgLy8gdW5sZXNzIGBnaXRodWJPcHRpb25zLnB1bGxSZXF1ZXN0TGludGAgaXMgYGZhbHNlYCAoaXQgZGVmYXVsdHMgdHJ1ZSkuXG4gICAgICBnaXRodWJPcHRpb25zOiB7IC4uLm9wdGlvbnMuZ2l0aHViT3B0aW9ucywgcHVsbFJlcXVlc3RMaW50OiBmYWxzZSB9LFxuICAgICAgcmVhZG1lOiBvcHRpb25zLnJlYWRtZSA/PyB7IGNvbnRlbnRzOiBkZWZhdWx0UmVhZG1lQ29udGVudHMob3B0aW9ucykgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGdoID0gdGhpcy5naXRodWI7XG4gICAgaWYgKCFnaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnR2l0SHViQWN0aW9uUHJvamVjdCByZXF1aXJlcyBHaXRIdWIgaW50ZWdyYXRpb24gdG8gYmUgZW5hYmxlZCcsXG4gICAgICApO1xuICAgIH1cbiAgICBhcHBseUludGVybmFsQWN0aW9uT3ZlcnJpZGVzKGdoKTtcblxuICAgIC8vIEpldEJyYWlucyBJREUgc3RhdGUgKC5pZGVhLykgaXMgbmV2ZXIgdHJhY2tlZCBpbiBnZW5lcmF0ZWQgcmVwb3MsIGFuZFxuICAgIC8vIG5laXRoZXIgaXMgL3NwZWMvIChsb2NhbCBwbGFucyBhbmQgc3BlY3M7IHRoZSBwYXR0ZXJuIGNvdmVycyBldmVyeVxuICAgIC8vIHN1YmRpcmVjdG9yeSkuXG4gICAgdGhpcy5hZGRHaXRJZ25vcmUoJy8uaWRlYS8qJyk7XG4gICAgdGhpcy5hZGRHaXRJZ25vcmUoJy9zcGVjLycpO1xuXG4gICAgaWYgKG9wdGlvbnMuZWRpdG9yY29uZmlnID8/IHRydWUpIHtcbiAgICAgIGFkZEVkaXRvckNvbmZpZyh0aGlzKTtcbiAgICB9XG5cbiAgICBuZXcgUHJvamVuRHJpZnRDaGVja1dvcmtmbG93KHRoaXMsIHtcbiAgICAgIGdoZVRva2VuU2VjcmV0OiBvcHRpb25zLmdoZVRva2VuU2VjcmV0ID8/IERFRkFVTFRfR0hFX1RPS0VOX1NFQ1JFVCxcbiAgICB9KTtcbiAgICBuZXcgV29ya2Zsb3dDaGFuZ2VOb3RpY2VXb3JrZmxvdyh0aGlzKTtcblxuICAgIGFkZExpY2Vuc2VGaWxlKHRoaXMsIHtcbiAgICAgIHNwZHg6IG9wdGlvbnMubGljZW5zZSA/PyAnTUlUJyxcbiAgICAgIGNvcHlyaWdodE93bmVyOiBvcHRpb25zLmNvcHlyaWdodE93bmVyID8/ICdYcGVydCBTb2Z0d2FyZScsXG4gICAgICBjb3B5cmlnaHRQZXJpb2Q6IG9wdGlvbnMuY29weXJpZ2h0UGVyaW9kLFxuICAgIH0pO1xuXG4gICAgLy8gYC5wcm9qZW5yYy50c2AgKyBgbnB4IHByb2plbmAsIHNhbWUgYXMgZXZlcnkgb3RoZXIgdHlwZSBoZXJlLiBBIGJhcmVcbiAgICAvLyBHaXRIdWJQcm9qZWN0IGhhcyBubyBkZWZhdWx0IHRhc2sgdGhhdCBydW5zIGEgcHJvamVucmMgb24gaXRzIG93biwgc29cbiAgICAvLyB0aGlzIGlzIHdoYXQgbWFrZXMgYG5weCBwcm9qZW5gIHdvcmsgaW4gdGhlIGdlbmVyYXRlZCByZXBvIGF0IGFsbC5cbiAgICBhdHRhY2hUeXBlU2NyaXB0UHJvamVucmModGhpcyk7XG5cbiAgICAvLyBwcm9qZW4gbWFya3MgZ2VuZXJhdGVkIGZpbGVzIHJlYWQtb25seSAoMDQ0NCkgb24gZGlzayBieSBkZWZhdWx0LCBidXRcbiAgICAvLyB0aGlzIG9uZSBtdXN0IHN0YXkgb3duZXItd3JpdGFibGU6IHRoZSBkb2N1bWVudGVkIHVwZGF0ZSBmbG93XG4gICAgLy8gKGBucG0gaSAtRCBAeHBlcnRzcy9wcm9qZW4tdHlwZXNAbGF0ZXN0YCkgbmVlZHMgbnBtIHRvIHJld3JpdGUgdGhlXG4gICAgLy8gcGlubmVkIHZlcnNpb25zIGluIGFuIGV4aXN0aW5nIHJlcG8uIEhhbmQtZWRpdHMgYXJlIHN0aWxsIGNhdWdodCBieVxuICAgIC8vIHRoZSBkcmlmdCBjaGVjay5cbiAgICBuZXcgSnNvbkZpbGUodGhpcywgJ3BhY2thZ2UuanNvbicsIHtcbiAgICAgIG9iajoge1xuICAgICAgICBuYW1lOiBvcHRpb25zLm5hbWUsXG4gICAgICAgIHZlcnNpb246ICcwLjAuMCcsXG4gICAgICAgIHByaXZhdGU6IHRydWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uLFxuICAgICAgICBkZXZEZXBlbmRlbmNpZXM6IHtcbiAgICAgICAgICAncHJvamVuJzogUFJPSkVOX1ZFUlNJT04sXG4gICAgICAgICAgJ0B4cGVydHNzL3Byb2plbi10eXBlcyc6IFBST0pFTl9UWVBFU19WRVJTSU9OLFxuICAgICAgICAgICdjb21taXQtYW5kLXRhZy12ZXJzaW9uJzogQ09NTUlUX0FORF9UQUdfVkVSU0lPTixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICByZWFkb25seTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICBuZXcgWWFtbEZpbGUodGhpcywgJy55YW1sbGludCcsIHtcbiAgICAgIG9iajoge1xuICAgICAgICBleHRlbmRzOiAnZGVmYXVsdCcsXG4gICAgICAgIHJ1bGVzOiB7ICdsaW5lLWxlbmd0aCc6IHsgbWF4OiAxMjAgfSB9LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMuYnVpbGRXb3JrZmxvdyA9IG5ldyBBY3Rpb25CdWlsZFdvcmtmbG93KHRoaXMpO1xuXG4gICAgdGhpcy5kb2dmb29kV29ya2Zsb3cgPSBuZXcgQWN0aW9uRG9nZm9vZFdvcmtmbG93KHRoaXMsIG9wdGlvbnMuZG9nZm9vZCk7XG5cbiAgICBpZiAob3B0aW9ucy5zb25hckhvc3RVcmwpIHtcbiAgICAgIHRoaXMuc29uYXJXb3JrZmxvdyA9IG5ldyBTb25hcldvcmtmbG93KHRoaXMsIHtcbiAgICAgICAgc29uYXJIb3N0VXJsOiBvcHRpb25zLnNvbmFySG9zdFVybCxcbiAgICAgICAgc29uYXJPcmdhbml6YXRpb246IG9wdGlvbnMuc29uYXJPcmdhbml6YXRpb24sXG4gICAgICAgIHNvbmFyVG9rZW5TZWNyZXQ6IG9wdGlvbnMuc29uYXJUb2tlblNlY3JldCxcbiAgICAgICAgc29uYXJQdWxsUmVxdWVzdEdhdGU6IG9wdGlvbnMuc29uYXJQdWxsUmVxdWVzdEdhdGUsXG4gICAgICAgIHNvbmFyUHJvamVjdEtleTogb3B0aW9ucy5zb25hclByb2plY3RLZXksXG4gICAgICAgIC8vIFlBTUwgLyBzaGVsbCBhcmUgbm90IGluIFNvbmFyJ3MgZGVmYXVsdC1yZWNvZ25pemVkIHNldCwgc28gdGhlXG4gICAgICAgIC8vIGFjdGlvbidzIGBhY3Rpb24ueW1sYCBhbmQgc2NyaXB0cyBuZWVkIGV4cGxpY2l0IGluY2x1c2lvbnMuXG4gICAgICAgIHNvbmFySW5jbHVzaW9uczogJy5naXRodWIvd29ya2Zsb3dzLyoqLGFjdGlvbi55bWwsKiovKi5zaCcsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBgZ2l0aHViUmVsZWFzZWAgZGVmYXVsdHMgdG8gdHJ1ZSwgd2hpY2ggYXV0by13aXJlc1xuICAgIC8vIGBwdWJsaXNoVG9HaXRIdWJSZWxlYXNlc2AgLSBpdHMgYGdoIHJlbGVhc2UgY3JlYXRlIC4uLiAtLXRhcmdldFxuICAgIC8vICRHSVRIVUJfU0hBYCBjcmVhdGVzIHRoZSB0YWcgKmFuZCogdGhlIHJlbGVhc2UgdG9nZXRoZXIgZm9yIG91clxuICAgIC8vIGNvbnRpbnVvdXMgKHB1c2gtdG8tbWFpbikgdHJpZ2dlci4gTm8gc2VwYXJhdGUgYHB1Ymxpc2hUb0dpdGAgY2FsbFxuICAgIC8vIG5lZWRlZCAodGhhdCBwYXRoIG9ubHkgZmlyZXMgZm9yIGEgbWFudWFsIHJlbGVhc2UgdHJpZ2dlcikuXG4gICAgdGhpcy5yZWxlYXNlID0gbmV3IHJlbGVhc2UuUmVsZWFzZSh0aGlzLCB7XG4gICAgICBicmFuY2g6ICdtYWluJyxcbiAgICAgIC8vIE5vIGJ1aWxkIGFydGlmYWN0IGZvciBhIGNvbXBvc2l0ZSBhY3Rpb24gKEFELTAwMSkgLSB0aGlzIGlzIG9ubHlcbiAgICAgIC8vIHdoZXJlIFJlbGVhc2Ugc3RhZ2VzIGl0cyBvd24gdmVyc2lvbi9jaGFuZ2Vsb2cgZmlsZXMuXG4gICAgICBhcnRpZmFjdHNEaXJlY3Rvcnk6ICdkaXN0JyxcbiAgICAgIHRhc2tzOiBbdGhpcy5idWlsZFdvcmtmbG93LnRhc2tdLFxuICAgICAgdmVyc2lvbkZpbGU6ICdwYWNrYWdlLmpzb24nLFxuICAgICAgcmVsZWFzYWJsZUNvbW1pdHM6IFJlbGVhc2FibGVDb21taXRzLmZlYXR1cmVzQW5kRml4ZXMoKSxcbiAgICAgIHJlbGVhc2VUcmlnZ2VyOiByZWxlYXNlLlJlbGVhc2VUcmlnZ2VyLmNvbnRpbnVvdXMoKSxcbiAgICAgIGJ1bXBQYWNrYWdlOiBgY29tbWl0LWFuZC10YWctdmVyc2lvbkAke0NPTU1JVF9BTkRfVEFHX1ZFUlNJT059YCxcbiAgICAgIHJlbGVhc2VXb3JrZmxvd1NldHVwU3RlcHM6IFtcbiAgICAgICAgeyBuYW1lOiAnSW5zdGFsbCBkZXBlbmRlbmNpZXMnLCBydW46ICducG0gY2knIH0sXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgLy8gVGhlIHJlbGVhc2Ugd29ya2Zsb3cgaXMgY3JlYXRlZCBpbnNpZGUgYHJlbGVhc2UuUmVsZWFzZWAgKHByb2plblxuICAgIC8vIGludGVybmFsKSwgbm90IGJ5IHRoaXMgdHlwZSAtIHJlYWNoIGl0cyBmaWxlIGJ5IHBhdGggdG8gYW5ub3RhdGUgaXRcbiAgICAvLyBsaWtlIGV2ZXJ5IG90aGVyIGdlbmVyYXRlZCB3b3JrZmxvdy4gVGhpcyB0eXBlIGlzIGFsd2F5cyBhIHJvb3RcbiAgICAvLyBwcm9qZWN0LCBzbyBwcm9qZW4gbmFtZXMgaXQgYHJlbGVhc2UueW1sYC5cbiAgICBub3RlV29ya2Zsb3dQdXJwb3NlKFxuICAgICAgdGhpcy50cnlGaW5kRmlsZSgnLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS55bWwnKSxcbiAgICAgICdDb250aW51b3VzIHJlbGVhc2Ugb24gcHVzaCB0byBtYWluOiBidW1wIHZlcnNpb24sIHRhZywgYW5kIGNyZWF0ZSBhIEdpdEh1YiBSZWxlYXNlLicsXG4gICAgKTtcbiAgfVxufVxuIl19
@@ -8,7 +8,7 @@ const projen_1 = require("projen");
8
8
  * layered on top of `CdkTypescriptProject`'s pure-infra scaffold.
9
9
  */
10
10
  class AppRuntimeScaffold extends projen_1.Component {
11
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.AppRuntimeScaffold", version: "0.0.21" };
11
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.AppRuntimeScaffold", version: "0.0.23" };
12
12
  constructor(project, appEntryPoint = 'src/app.ts') {
13
13
  super(project, 'AppRuntimeScaffold');
14
14
  const app = new projen_1.SourceCode(project, appEntryPoint);
@@ -13,7 +13,7 @@ const workflow_purpose_1 = require("../common/workflow-purpose");
13
13
  * application source, a database, and an app-level build/test workflow.
14
14
  */
15
15
  class CdkAppProject extends cdk_infra_project_1.CdkInfraProject {
16
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.CdkAppProject", version: "0.0.21" };
16
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.CdkAppProject", version: "0.0.23" };
17
17
  constructor(options) {
18
18
  super(options);
19
19
  new app_runtime_scaffold_1.AppRuntimeScaffold(this, options.appEntryPoint ?? 'src/app.ts');
@@ -11,7 +11,7 @@ const edge_networking_constructs_1 = require("./components/edge-networking-const
11
11
  * externally-built images). Reference example: SimulcastAVDelivery.
12
12
  */
13
13
  class CdkInfraProject extends cdk_typescript_base_1.CdkTypescriptProject {
14
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.CdkInfraProject", version: "0.0.21" };
14
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.CdkInfraProject", version: "0.0.23" };
15
15
  constructor(options) {
16
16
  super(options);
17
17
  if (options.ecrEcs?.enabled) {
@@ -1,6 +1,7 @@
1
1
  import { awscdk } from 'projen';
2
2
  import { CommonCdkOptions } from './options';
3
3
  import { EnvironmentOptions } from '../common/environment-options';
4
+ import { SonarWorkflow } from '../common/sonar-workflow';
4
5
  export interface CdkTypescriptProjectOptions extends CommonCdkOptions {
5
6
  readonly environments?: (string | EnvironmentOptions)[];
6
7
  }
@@ -12,5 +13,7 @@ export interface CdkTypescriptProjectOptions extends CommonCdkOptions {
12
13
  * `ManualDeployWorkflow` when `environments` is provided.
13
14
  */
14
15
  export declare class CdkTypescriptProject extends awscdk.AwsCdkTypeScriptApp {
16
+ /** Set only when `sonarHostUrl` is provided. */
17
+ readonly sonarWorkflow?: SonarWorkflow;
15
18
  constructor(options: CdkTypescriptProjectOptions);
16
19
  }