@pipeline-builder/pipeline-manager 4.5.3 → 4.5.4
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/README.md +61 -37
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +13 -7
- package/dist/commands/audit-stacks.d.ts +42 -1
- package/dist/commands/audit-stacks.d.ts.map +1 -1
- package/dist/commands/audit-stacks.js +104 -23
- package/dist/commands/audit-tokens.d.ts.map +1 -1
- package/dist/commands/audit-tokens.js +3 -4
- package/dist/commands/create-pat.d.ts.map +1 -1
- package/dist/commands/create-pat.js +9 -6
- package/dist/commands/login.d.ts +3 -2
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +19 -10
- package/dist/commands/logout.d.ts +24 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +105 -0
- package/dist/commands/org-export.js +2 -2
- package/dist/commands/pipeline-remove.d.ts +26 -0
- package/dist/commands/pipeline-remove.d.ts.map +1 -0
- package/dist/commands/pipeline-remove.js +84 -0
- package/dist/commands/register.d.ts.map +1 -1
- package/dist/commands/register.js +3 -4
- package/dist/commands/status.d.ts +5 -2
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +65 -25
- package/dist/commands/toolchain.d.ts.map +1 -1
- package/dist/commands/toolchain.js +4 -3
- package/dist/commands/validate-templates.d.ts.map +1 -1
- package/dist/commands/validate-templates.js +4 -5
- package/dist/config/cli.constants.d.ts +8 -0
- package/dist/config/cli.constants.d.ts.map +1 -1
- package/dist/config/cli.constants.js +21 -2
- package/dist/types/plugin.d.ts +0 -6
- package/dist/types/plugin.d.ts.map +1 -1
- package/dist/types/plugin.js +1 -1
- package/dist/utils/command-utils.d.ts +13 -0
- package/dist/utils/command-utils.d.ts.map +1 -1
- package/dist/utils/command-utils.js +31 -17
- package/dist/utils/config-loader.d.ts +2 -1
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/config-loader.js +14 -4
- package/dist/utils/credential-store.d.ts +9 -1
- package/dist/utils/credential-store.d.ts.map +1 -1
- package/dist/utils/credential-store.js +21 -2
- package/dist/utils/error-handler.d.ts +10 -1
- package/dist/utils/error-handler.d.ts.map +1 -1
- package/dist/utils/error-handler.js +20 -8
- package/dist/utils/plugin-resolver.d.ts +0 -2
- package/dist/utils/plugin-resolver.d.ts.map +1 -1
- package/dist/utils/plugin-resolver.js +3 -11
- package/dist/utils/response-utils.d.ts +11 -0
- package/dist/utils/response-utils.d.ts.map +1 -1
- package/dist/utils/response-utils.js +23 -1
- package/dist/utils/toolchain.d.ts +0 -2
- package/dist/utils/toolchain.d.ts.map +1 -1
- package/dist/utils/toolchain.js +4 -5
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -16,17 +16,19 @@ Requires Node.js 26.13.1+.
|
|
|
16
16
|
|
|
17
17
|
```bash
|
|
18
18
|
# Sign in — prints a short code, opens your browser to approve it, and stores
|
|
19
|
-
# the session in ~/.pipeline-manager/credentials.json (no password on the CLI)
|
|
19
|
+
# the session in ~/.pipeline-manager/credentials.json (no password on the CLI).
|
|
20
|
+
# The platform you sign in to becomes the one every later command talks to.
|
|
20
21
|
pipeline-manager auth login --url https://platform.example.com
|
|
21
22
|
|
|
22
|
-
#
|
|
23
|
-
pipeline-manager infra bootstrap
|
|
23
|
+
# One-time per AWS account/region: deploy the CDK toolkit stack pipelines deploy into
|
|
24
|
+
pipeline-manager infra bootstrap --account 123456789012 --region us-east-1
|
|
24
25
|
|
|
25
|
-
#
|
|
26
|
-
pipeline-manager pipeline
|
|
26
|
+
# Register a pipeline definition (props.json from `template instantiate`, or your own)
|
|
27
|
+
pipeline-manager pipeline create -f props.json
|
|
27
28
|
|
|
28
|
-
#
|
|
29
|
-
pipeline-manager pipeline
|
|
29
|
+
# Synthesize the CDK app into a CloudFormation template, then deploy it to AWS
|
|
30
|
+
pipeline-manager pipeline synth --id <pipelineId>
|
|
31
|
+
pipeline-manager pipeline deploy --id <pipelineId>
|
|
30
32
|
```
|
|
31
33
|
|
|
32
34
|
## Install the platform (`provision`)
|
|
@@ -68,57 +70,79 @@ The underlying `bin/setup.sh` / `bin/shutdown.sh` scripts (and `aws cloudformati
|
|
|
68
70
|
|
|
69
71
|
## Commands
|
|
70
72
|
|
|
71
|
-
|
|
73
|
+
Commands are grouped by task: `pipeline-manager <group> <verb>`. `pipeline-manager --help` lists the groups and `pipeline-manager <group> --help` a group's verbs.
|
|
74
|
+
|
|
75
|
+
### `auth` — credentials
|
|
72
76
|
|
|
73
77
|
| Command | Purpose |
|
|
74
78
|
| --- | --- |
|
|
75
|
-
| `
|
|
79
|
+
| `auth login` | Sign in through your browser (device authorization — no password on the command line) and store the session for that platform. The platform becomes the active one for later commands (`PLATFORM_BASE_URL` still overrides it). `--org <orgId>` switches organization; `--token` / `--quiet` print the token for `export PLATFORM_TOKEN=…` |
|
|
80
|
+
| `auth logout` | Revoke the stored session on the platform (`POST /auth/logout`) and delete it from this device. The local copy is removed even when the platform can't be reached — the command then says to revoke the device from Settings → Sessions and devices |
|
|
81
|
+
| `auth pat` | Create a named access key (`pb_pat_…`, long-lived, for CI as `PLATFORM_TOKEN`). The step-up is approved in the browser; the key is printed once |
|
|
76
82
|
|
|
77
|
-
###
|
|
83
|
+
### `pipeline` — define, deploy and reconcile pipelines
|
|
78
84
|
|
|
79
85
|
| Command | Purpose |
|
|
80
86
|
| --- | --- |
|
|
81
|
-
| `
|
|
82
|
-
| `
|
|
83
|
-
| `
|
|
84
|
-
| `
|
|
85
|
-
| `register` | Re-register a deployed pipeline
|
|
86
|
-
| `
|
|
87
|
+
| `pipeline create` | Register a pipeline definition from a props file (`--deploy` to also deploy it) |
|
|
88
|
+
| `pipeline list` / `pipeline get` | Inspect the pipelines your organization can see |
|
|
89
|
+
| `pipeline synth` | Run CDK synth to emit the CloudFormation template for a pipeline |
|
|
90
|
+
| `pipeline deploy` | Deploy the synthesized stack to AWS (also registers the deployment by its `pipelineId`). `--local-spec <pipeline.json>` deploys without the platform and needs `--toolchain-file` (from `toolchain export`) |
|
|
91
|
+
| `pipeline register` | Re-register a deployed pipeline and drain registrations queued by failed deploys (recovery path; non-zero exit if any still fails) |
|
|
92
|
+
| `pipeline deregister` | Remove one `pipeline_registry` row by its registry id (`--yes` required) — the fix for an `audit stacks` missing-stack finding |
|
|
93
|
+
| `pipeline delete` | Delete a pipeline definition (`--yes` required). A deployed stack is left in AWS |
|
|
94
|
+
|
|
95
|
+
### `plugin` — author and publish plugins
|
|
87
96
|
|
|
88
|
-
|
|
97
|
+
| Command | Purpose |
|
|
98
|
+
| --- | --- |
|
|
99
|
+
| `plugin new` | Scaffold a plugin from a `plugin-<eco>-base` image (Dockerfile, spec, README, LICENSE) |
|
|
100
|
+
| `plugin validate` | Validate a local plugin with the server's schemas and report its catalog metadata |
|
|
101
|
+
| `plugin test` | Run a plugin's install + build commands locally in its image against a sample workspace |
|
|
102
|
+
| `plugin publish` | Pre-flight, scan-preview and upload a plugin, then request its listing in the plugin ecosystem |
|
|
103
|
+
| `plugin upload` | Upload and deploy a plugin package |
|
|
104
|
+
| `plugin list` / `plugin get` | Browse the plugin catalog and fetch one plugin |
|
|
105
|
+
| `plugin deprecate` | Deprecate a version (it keeps resolving, with a warning); `--undo` clears it |
|
|
106
|
+
| `plugin yank` | Yank a version (stops resolving for ranges, `latest` and the default) |
|
|
107
|
+
| `plugin verify` | Report the current vulnerability state of a pipeline's pinned plugin images at run time (never fails on it) |
|
|
108
|
+
|
|
109
|
+
### `template` — golden-path templates
|
|
89
110
|
|
|
90
111
|
| Command | Purpose |
|
|
91
112
|
| --- | --- |
|
|
92
|
-
| `
|
|
93
|
-
| `
|
|
94
|
-
| `list-plugins` / `get-plugin` | Browse the plugin catalog and fetch a single plugin spec |
|
|
95
|
-
| `upload-plugin` | Publish a custom plugin spec + Dockerfile to the platform |
|
|
96
|
-
| `validate-templates` | Parse and validate `{{ ... }}` templates in a pipeline or plugin spec (local file, registered pipeline by ID, or registered plugin by `name:version`) |
|
|
97
|
-
| `org-export` | Export an organization's data as JSON for GDPR portability (sysadmins can export any org; org admins their own only) |
|
|
113
|
+
| `template instantiate` | Render a pipeline template into concrete pipeline props (creates nothing) |
|
|
114
|
+
| `template validate` | Parse and validate `{{ ... }}` templates in a local file, a registered pipeline (by id) or a registered plugin (`name:version`) |
|
|
98
115
|
|
|
99
|
-
###
|
|
116
|
+
### `infra` — AWS and platform infrastructure
|
|
100
117
|
|
|
101
118
|
| Command | Purpose |
|
|
102
119
|
| --- | --- |
|
|
103
|
-
| `
|
|
104
|
-
| `
|
|
105
|
-
| `
|
|
120
|
+
| `infra bootstrap` | Deploy the AWS CDK toolkit stack in the target account/region (`--account`, `--qualifier`, `--trust` for cross-account) — needed once before the first `pipeline deploy` there |
|
|
121
|
+
| `infra setup-events` | Deploy the EventBridge → SQS → Lambda stack that streams CodePipeline events into reporting |
|
|
122
|
+
| `infra redrive-events` | Move dead-lettered CodePipeline events back onto the ingestion queue (manual fallback for the Lambda's own redrive) |
|
|
123
|
+
| `infra store-token` | Provision an org service-account key and store it in AWS Secrets Manager for CDK synth steps and the events Lambda (`--schedule` adds daily auto-renewal) |
|
|
124
|
+
| `infra provision` | Install (or `--teardown`) the **platform** on local/Minikube/EC2/EKS. See [Install the platform](#install-the-platform-provision) |
|
|
106
125
|
|
|
107
|
-
###
|
|
126
|
+
### `audit` — operator audits (cron-friendly)
|
|
108
127
|
|
|
109
|
-
These
|
|
128
|
+
These report drift and exit non-zero when there are findings. Designed to run on a schedule.
|
|
110
129
|
|
|
111
130
|
| Command | Purpose | Exit codes |
|
|
112
131
|
| --- | --- | --- |
|
|
113
|
-
| `audit
|
|
114
|
-
| `audit
|
|
132
|
+
| `audit stacks` | Diff the CloudFormation stacks tagged `pipeline-builder` in ONE region (`--region`) against your org's `pipeline_registry` rows for that region (every page). Surfaces orphaned stacks (no registry row) and missing stacks (a row but no live stack), each with the command that reconciles it. `--org` audits another org when your credential may list it (a system admin). See [drift detection](https://mwashburn160.github.io/pipeline-builder/docs/aws-deployment.html#drift-detection-audit-stacks). | `0` clean / `1` findings or an incomplete scan / `2` AWS or platform error |
|
|
133
|
+
| `audit tokens` | Scan platform tokens stored in AWS Secrets Manager and flag any expiring within `--warn-days` (default 7) | `0` clean / `1` at-risk / `2` AWS error |
|
|
115
134
|
|
|
116
|
-
###
|
|
135
|
+
### Other groups
|
|
117
136
|
|
|
118
137
|
| Command | Purpose |
|
|
119
138
|
| --- | --- |
|
|
120
|
-
| `
|
|
121
|
-
| `
|
|
139
|
+
| `toolchain export` | Write the pipeline toolchain release your org resolves to (or `--release <V>`) as JSON: both images' repositories and signed digests, the release and its tool versions — the input to `pipeline deploy --local-spec --toolchain-file` |
|
|
140
|
+
| `org export` | Export an organization's data as JSON for GDPR portability (sysadmins any org; org admins their own) |
|
|
141
|
+
| `report list` / `create` / `run` / `publish` / `link` / `pdf` / `transfer` | Stakeholder reports: save a scheduled report, compose a period (or backfill past ones), publish it, mint a read-only link, download the PDF, hand it to a new owner |
|
|
142
|
+
| `security-report upload` | Upload a SARIF / trivy / grype report produced inside a pipeline |
|
|
143
|
+
| `status` | Show the CLI's setup: the platform it talks to, the credential it would use and its expiry, whether the platform accepts it (and as whom), CDK availability and `/health` reachability |
|
|
144
|
+
| `version` | Print CLI version info (`--check-config` validates the configuration) |
|
|
145
|
+
| `completions` | Print a shell completion script for `bash`, `zsh` or `fish`, e.g. `eval "$(pipeline-manager completions bash)"` (derived from the live command tree, so it never drifts) |
|
|
122
146
|
|
|
123
147
|
Run `pipeline-manager <command> --help` for the full flag reference on any command.
|
|
124
148
|
|
|
@@ -126,8 +150,8 @@ Run `pipeline-manager <command> --help` for the full flag reference on any comma
|
|
|
126
150
|
|
|
127
151
|
| Variable | Required | Purpose |
|
|
128
152
|
| --- | --- | --- |
|
|
129
|
-
| `PLATFORM_TOKEN` |
|
|
130
|
-
| `PLATFORM_BASE_URL` |
|
|
153
|
+
| `PLATFORM_TOKEN` | No | Access key or token; overrides the stored `auth login` session (what CI uses) |
|
|
154
|
+
| `PLATFORM_BASE_URL` | No | Base URL of your platform; overrides the platform `auth login` signed in to and `config.yml` |
|
|
131
155
|
| `AWS_REGION` | Yes (for deploy) | Target AWS region for `synth` / `deploy` / `provision` teardown |
|
|
132
156
|
| `ANTHROPIC_API_KEY` (or other provider key) | No | Enables `provision`'s natural-language `--prompt` parsing + failure diagnosis (else it falls back to the deterministic issue matcher) |
|
|
133
157
|
| `AI_PROVIDER` / `AI_MODEL` | No | Provider + model for `provision` (`anthropic` \| `openai` \| `google` \| `xai` \| `bedrock`) |
|
|
@@ -138,7 +162,7 @@ Full reference: [Environment Variables](https://mwashburn160.github.io/pipeline-
|
|
|
138
162
|
|
|
139
163
|
- [Getting started](https://mwashburn160.github.io/pipeline-builder/)
|
|
140
164
|
- [CDK usage](https://mwashburn160.github.io/pipeline-builder/docs/cdk-usage)
|
|
141
|
-
- [Plugin catalog (
|
|
165
|
+
- [Plugin catalog (118 plugins)](https://mwashburn160.github.io/pipeline-builder/docs/plugins/)
|
|
142
166
|
- [API reference](https://mwashburn160.github.io/pipeline-builder/docs/api-reference)
|
|
143
167
|
- [AWS deployment](https://mwashburn160.github.io/pipeline-builder/docs/aws-deployment)
|
|
144
168
|
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sources":["../src/cli.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sources":["../src/cli.ts"],"names":[],"mappings":";AA6DA;;GAEG;AACH,UAAU,UAAU;IAClB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wGAAwG;AACxG,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAEpD;AA6VD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,UAAe,GAAG,IAAI,CA0D5D;AAiDD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,IAAI,CAAC,OAAO,GAAE,UAAe,GAAG,IAAI,CA0BnD"}
|
package/dist/cli.js
CHANGED
|
@@ -17,8 +17,10 @@ import { instantiateTemplate } from './commands/instantiate-template.js';
|
|
|
17
17
|
import { listPipelines } from './commands/list-pipelines.js';
|
|
18
18
|
import { listPlugins } from './commands/list-plugins.js';
|
|
19
19
|
import { login } from './commands/login.js';
|
|
20
|
+
import { logout } from './commands/logout.js';
|
|
20
21
|
import { newPlugin } from './commands/new-plugin.js';
|
|
21
22
|
import { orgExport } from './commands/org-export.js';
|
|
23
|
+
import { deletePipeline, deregisterPipeline } from './commands/pipeline-remove.js';
|
|
22
24
|
import { deprecatePlugin, yankPlugin } from './commands/plugin-lifecycle.js';
|
|
23
25
|
import { provision } from './commands/provision.js';
|
|
24
26
|
import { publishPlugin } from './commands/publish-plugin.js';
|
|
@@ -38,7 +40,7 @@ import { validatePlugin } from './commands/validate-plugin.js';
|
|
|
38
40
|
import { validateTemplatesCommand } from './commands/validate-templates.js';
|
|
39
41
|
import { verifyPlugins } from './commands/verify-plugins.js';
|
|
40
42
|
import { version } from './commands/version.js';
|
|
41
|
-
import { APP_NAME, APP_DESCRIPTION, APP_VERSION, ENV_VARS, isDebugMode, generateExecutionId, } from './config/cli.constants.js';
|
|
43
|
+
import { APP_NAME, APP_DESCRIPTION, APP_VERSION, ENV_VARS, isDebugMode, generateExecutionId, meetsNodeVersionFloor, NODE_VERSION_FLOOR, } from './config/cli.constants.js';
|
|
42
44
|
import { banner, miniBanner } from './utils/banner.js';
|
|
43
45
|
import { getApiConfig } from './utils/config-loader.js';
|
|
44
46
|
import { loadSession } from './utils/credential-store.js';
|
|
@@ -64,9 +66,8 @@ function checkEnvironment({ signInRelevant = true } = {}) {
|
|
|
64
66
|
}
|
|
65
67
|
// Check Node version
|
|
66
68
|
const nodeVersion = process.version;
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
warnings.push(`Node.js ${nodeVersion} detected - version 24+ required (see package.json engines)`);
|
|
69
|
+
if (!meetsNodeVersionFloor(nodeVersion)) {
|
|
70
|
+
warnings.push(`Node.js ${nodeVersion} detected - version ${NODE_VERSION_FLOOR}+ required (see package.json engines)`);
|
|
70
71
|
}
|
|
71
72
|
// Display warnings
|
|
72
73
|
if (warnings.length > 0) {
|
|
@@ -110,14 +111,16 @@ function displayStartupInfo(options) {
|
|
|
110
111
|
/** Top-level `--help` epilogue: command groups, auth, env vars, examples, exit codes. */
|
|
111
112
|
const HELP_TEXT = `
|
|
112
113
|
Command groups:
|
|
113
|
-
auth Authenticate and manage credentials (login, pat)
|
|
114
|
-
pipeline Create, inspect, and deploy pipelines (create, list, get, register, synth, deploy)
|
|
114
|
+
auth Authenticate and manage credentials (login, logout, pat)
|
|
115
|
+
pipeline Create, inspect, and deploy pipelines (create, list, get, register, deregister, delete, synth, deploy)
|
|
115
116
|
plugin Author, validate, and publish plugins (new, validate, test, publish, upload, get, list, deprecate, yank, verify)
|
|
116
117
|
template Instantiate golden-path pipeline templates and validate {{ ... }} syntax (instantiate, validate)
|
|
117
118
|
infra Set up and operate platform infrastructure (bootstrap, setup-events, redrive-events, store-token, provision)
|
|
118
119
|
audit Operator audits, cron-friendly (tokens, stacks)
|
|
119
120
|
org Organization data operations (export)
|
|
120
121
|
security-report Upload SARIF / trivy / grype reports produced inside a pipeline (upload)
|
|
122
|
+
report Stakeholder reports (list, create, run, publish, link, pdf, transfer)
|
|
123
|
+
toolchain The pipeline toolchain release (export)
|
|
121
124
|
status / version / completions
|
|
122
125
|
|
|
123
126
|
Authentication:
|
|
@@ -163,6 +166,7 @@ function registerTaskNamespaces() {
|
|
|
163
166
|
// auth — authenticate and manage credentials
|
|
164
167
|
const auth = program.command('auth').description('Authenticate and manage credentials');
|
|
165
168
|
login(auth); // auth login — browser (device-authorization) sign-in, stored locally
|
|
169
|
+
logout(auth); // auth logout — revoke the stored session on the platform and delete it locally
|
|
166
170
|
createPat(auth); // auth pat — create a named access key (device sign-in + browser step-up)
|
|
167
171
|
// pipeline — create, inspect, and deploy pipelines
|
|
168
172
|
const pipeline = program.command('pipeline').description('Create, inspect, and deploy pipelines');
|
|
@@ -170,6 +174,8 @@ function registerTaskNamespaces() {
|
|
|
170
174
|
listPipelines(pipeline); // pipeline list
|
|
171
175
|
getPipeline(pipeline); // pipeline get
|
|
172
176
|
register(pipeline); // pipeline register — re-register a deployed ARN + drain pending intents
|
|
177
|
+
deregisterPipeline(pipeline); // pipeline deregister — remove a registry row (audit stacks' missing-stack fix)
|
|
178
|
+
deletePipeline(pipeline); // pipeline delete — delete a pipeline configuration
|
|
173
179
|
synth(pipeline); // pipeline synth — CDK synthesis from pipeline config
|
|
174
180
|
deploy(pipeline); // pipeline deploy — CDK deploy (--app prints boilerplate path)
|
|
175
181
|
// plugin — author, validate, and publish plugins
|
|
@@ -520,4 +526,4 @@ if (isMainModule) {
|
|
|
520
526
|
scheduleUpdateNotice();
|
|
521
527
|
main(options);
|
|
522
528
|
}
|
|
523
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlcyI6WyIuLi9zcmMvY2xpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFB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QUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLEdBQUc7UUFDNUUsVUFBVSxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNoRCxDQUFDO0lBRUYsdUVBQXVFO0lBQ3ZFLG9CQUFvQixFQUFFLENBQUM7SUFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG4vLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgcmVhbHBhdGhTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnO1xuaW1wb3J0IHsgZXJyb3JNZXNzYWdlIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgcHJvZ3JhbSB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBhdWRpdFN0YWNrcyB9IGZyb20gJy4vY29tbWFuZHMvYXVkaXQtc3RhY2tzLmpzJztcbmltcG9ydCB7IGF1ZGl0VG9rZW5zIH0gZnJvbSAnLi9jb21tYW5kcy9hdWRpdC10b2tlbnMuanMnO1xuaW1wb3J0IHsgYm9vdHN0cmFwIH0gZnJvbSAnLi9jb21tYW5kcy9ib290c3RyYXAuanMnO1xuaW1wb3J0IHsgY3JlYXRlUGF0IH0gZnJvbSAnLi9jb21tYW5kcy9jcmVhdGUtcGF0LmpzJztcbmltcG9ydCB7IGNyZWF0ZVBpcGVsaW5lIH0gZnJvbSAnLi9jb21tYW5kcy9jcmVhdGUtcGlwZWxpbmUuanMnO1xuaW1wb3J0IHsgZGVwbG95IH0gZnJvbSAnLi9jb21tYW5kcy9kZXBsb3kuanMnO1xuaW1wb3J0IHsgZ2V0UGlwZWxpbmUgfSBmcm9tICcuL2NvbW1hbmRzL2dldC1waXBlbGluZS5qcyc7XG5pbXBvcnQgeyBnZXRQbHVnaW4gfSBmcm9tICcuL2NvbW1hbmRzL2dldC1wbHVnaW4uanMnO1xuaW1wb3J0IHsgaW5zdGFudGlhdGVUZW1wbGF0ZSB9IGZyb20gJy4vY29tbWFuZHMvaW5zdGFudGlhdGUtdGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgbGlzdFBpcGVsaW5lcyB9IGZyb20gJy4vY29tbWFuZHMvbGlzdC1waXBlbGluZXMuanMnO1xuaW1wb3J0IHsgbGlzdFBsdWdpbnMgfSBmcm9tICcuL2NvbW1hbmRzL2xpc3QtcGx1Z2lucy5qcyc7XG5pbXBvcnQgeyBsb2dpbiB9IGZyb20gJy4vY29tbWFuZHMvbG9naW4uanMnO1xuaW1wb3J0IHsgbmV3UGx1Z2luIH0gZnJvbSAnLi9jb21tYW5kcy9uZXctcGx1Z2luLmpzJztcbmltcG9ydCB7IG9yZ0V4cG9ydCB9IGZyb20gJy4vY29tbWFuZHMvb3JnLWV4cG9ydC5qcyc7XG5pbXBvcnQgeyBkZXByZWNhdGVQbHVnaW4sIHlhbmtQbHVnaW4gfSBmcm9tICcuL2NvbW1hbmRzL3BsdWdpbi1saWZlY3ljbGUuanMnO1xuaW1wb3J0IHsgcHJvdmlzaW9uIH0gZnJvbSAnLi9jb21tYW5kcy9wcm92aXNpb24uanMnO1xuaW1wb3J0IHsgcHVibGlzaFBsdWdpbiB9IGZyb20gJy4vY29tbWFuZHMvcHVibGlzaC1wbHVnaW4uanMnO1xuaW1wb3J0IHsgcmVkcml2ZUV2ZW50cyB9IGZyb20gJy4vY29tbWFuZHMvcmVkcml2ZS1ldmVudHMuanMnO1xuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tICcuL2NvbW1hbmRzL3JlZ2lzdGVyLmpzJztcbmltcG9ydCB7IHJlcG9ydCB9IGZyb20gJy4vY29tbWFuZHMvcmVwb3J0LmpzJztcbmltcG9ydCB7IHNlY3VyaXR5UmVwb3J0IH0gZnJvbSAnLi9jb21tYW5kcy9zZWN1cml0eS1yZXBvcnQuanMnO1xuaW1wb3J0IHsgc2V0dXBFdmVudHMgfSBmcm9tICcuL2NvbW1hbmRzL3NldHVwLWV2ZW50cy5qcyc7XG5pbXBvcnQgeyBzdGF0dXMgfSBmcm9tICcuL2NvbW1hbmRzL3N0YXR1cy5qcyc7XG5pbXBvcnQgeyBzdG9yZVRva2VuIH0gZnJvbSAnLi9jb21tYW5kcy9zdG9yZS10b2tlbi5qcyc7XG5pbXBvcnQgeyBzeW50aCB9IGZyb20gJy4vY29tbWFuZHMvc3ludGguanMnO1xuaW1wb3J0IHsgdGVzdFBsdWdpbiB9IGZyb20gJy4vY29tbWFuZHMvdGVzdC1wbHVnaW4uanMnO1xuaW1wb3J0IHsgdG9vbGNoYWluIH0gZnJvbSAnLi9jb21tYW5kcy90b29sY2hhaW4uanMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJVcGdyYWRlT3B0aW9uIH0gZnJvbSAnLi9jb21tYW5kcy91cGdyYWRlLmpzJztcbmltcG9ydCB7IHVwbG9hZFBsdWdpbiB9IGZyb20gJy4vY29tbWFuZHMvdXBsb2FkLXBsdWdpbi5qcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZVBsdWdpbiB9IGZyb20gJy4vY29tbWFuZHMvdmFsaWRhdGUtcGx1Z2luLmpzJztcbmltcG9ydCB7IHZhbGlkYXRlVGVtcGxhdGVzQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdmFsaWRhdGUtdGVtcGxhdGVzLmpzJztcbmltcG9ydCB7IHZlcmlmeVBsdWdpbnMgfSBmcm9tICcuL2NvbW1hbmRzL3ZlcmlmeS1wbHVnaW5zLmpzJztcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuL2NvbW1hbmRzL3ZlcnNpb24uanMnO1xuaW1wb3J0IHtcbiAgQVBQX05BTUUsXG4gIEFQUF9ERVNDUklQVElPTixcbiAgQVBQX1ZFUlNJT04sXG4gIEVOVl9WQVJTLFxuICBpc0RlYnVnTW9kZSxcbiAgZ2VuZXJhdGVFeGVjdXRpb25JZCxcbn0gZnJvbSAnLi9jb25maWcvY2xpLmNvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBiYW5uZXIsIG1pbmlCYW5uZXIgfSBmcm9tICcuL3V0aWxzL2Jhbm5lci5qcyc7XG5pbXBvcnQgeyBnZXRBcGlDb25maWcgfSBmcm9tICcuL3V0aWxzL2NvbmZpZy1sb2FkZXIuanMnO1xuaW1wb3J0IHsgbG9hZFNlc3Npb24gfSBmcm9tICcuL3V0aWxzL2NyZWRlbnRpYWwtc3RvcmUuanMnO1xuaW1wb3J0IHsgRVJST1JfQ09ERVMsIGhhbmRsZUVycm9yIH0gZnJvbSAnLi91dGlscy9lcnJvci1oYW5kbGVyLmpzJztcbmltcG9ydCB7IHByaW50SW5mbywgcHJpbnRFcnJvciwgcHJpbnRXYXJuaW5nLCBwcmludERlYnVnLCBwcmludFNlY3Rpb24gfSBmcm9tICcuL3V0aWxzL291dHB1dC11dGlscy5qcyc7XG5pbXBvcnQgeyBwcmVmbGlnaHRDb21tYW5kVG9vbHMgfSBmcm9tICcuL3V0aWxzL3ByZWZsaWdodC5qcyc7XG5pbXBvcnQgeyBzY2hlZHVsZVVwZGF0ZU5vdGljZSB9IGZyb20gJy4vdXRpbHMvdXBkYXRlLW5vdGljZS5qcyc7XG5cbi8qKlxuICogQ0xJIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAqL1xuaW50ZXJmYWNlIENsaU9wdGlvbnMge1xuICAvKipcbiAgICogU2hvdyBiYW5uZXIgb24gc3RhcnR1cFxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBzaG93QmFubmVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTWluaW1hbCBiYW5uZXIgKG5vIEFTQ0lJIGFydClcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIG1pbmltYWxCYW5uZXI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEZWJ1ZyBtb2RlXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBkZWJ1Zz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFZlcmJvc2Ugb3V0cHV0XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICB2ZXJib3NlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUXVpZXQgbW9kZSAobWluaW1hbCBvdXRwdXQpXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBxdWlldD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE5vIGNvbG9yIG91dHB1dFxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgbm9Db2xvcj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBgLS11cGdyYWRlYCAvIGAtLXVwZ3JhZGUtY2hlY2tgOiB0YWxrcyBvbmx5IHRvIHRoZSBucG0gcmVnaXN0cnksIG5ldmVyIHRvXG4gICAqIHRoZSBwbGF0Zm9ybSwgc28gaXQgbXVzdCB3b3JrIHNpZ25lZCBvdXQgYW5kIHdpdGhvdXQgdGhlIHNpZ24taW4gd2FybmluZy5cbiAgICovXG4gIHNlbGZVcGRhdGU/OiBib29sZWFuO1xufVxuXG4vKiogV2hldGhlciBhcmd2IGFza3MgZm9yIGEgc2VsZi11cGRhdGUgKGAtLXVwZ3JhZGVgIC8gYC0tdXBncmFkZS1jaGVja2AsIHdpdGggb3Igd2l0aG91dCBhIHZlcnNpb24pLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2VsZlVwZGF0ZShhcmd2OiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gYXJndi5zb21lKChhKSA9PiBhID09PSAnLS11cGdyYWRlJyB8fCBhID09PSAnLS11cGdyYWRlLWNoZWNrJyB8fCBhLnN0YXJ0c1dpdGgoJy0tdXBncmFkZT0nKSB8fCBhLnN0YXJ0c1dpdGgoJy0tdXBncmFkZS1jaGVjaz0nKSk7XG59XG5cbi8qKlxuICogQ2hlY2sgZW52aXJvbm1lbnQgYW5kIGRpc3BsYXkgd2FybmluZ3NcbiAqL1xuZnVuY3Rpb24gY2hlY2tFbnZpcm9ubWVudCh7IHNpZ25JblJlbGV2YW50ID0gdHJ1ZSB9OiB7IHNpZ25JblJlbGV2YW50PzogYm9vbGVhbiB9ID0ge30pOiB2b2lkIHtcbiAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gTm90IHNpZ25lZCBpbiBBVCBBTEw6IG5laXRoZXIgYW4gZXhwbGljaXQgdG9rZW4gbm9yIGEgc3RvcmVkIGJyb3dzZXJcbiAgLy8gc2lnbi1pbi4gRWl0aGVyIGFsb25lIGlzIGVub3VnaCwgc28gdGhlIHdhcm5pbmcgb25seSBmaXJlcyB3aGVuIGJvdGggYXJlXG4gIC8vIG1pc3Npbmcg4oCUIG90aGVyd2lzZSBgYXV0aCBsb2dpbmAgdXNlcnMgd291bGQgYmUgbmFnZ2VkIG9uIGV2ZXJ5IGNvbW1hbmQuXG4gIGlmIChzaWduSW5SZWxldmFudCAmJiAhcHJvY2Vzcy5lbnZbRU5WX1ZBUlMuUExBVEZPUk1fVE9LRU5dICYmICFsb2FkU2Vzc2lvbihnZXRBcGlDb25maWcoKS5hcGkuYmFzZVVybCkpIHtcbiAgICB3YXJuaW5ncy5wdXNoKCdOb3Qgc2lnbmVkIGluIChubyBQTEFURk9STV9UT0tFTiwgbm8gc3RvcmVkIHNlc3Npb24pJyk7XG4gICAgd2FybmluZ3MucHVzaCgnUnVuIFwicGlwZWxpbmUtbWFuYWdlciBhdXRoIGxvZ2luXCIg4oCUIEFQSSBvcGVyYXRpb25zIHdpbGwgZmFpbCB1bnRpbCB5b3UgZG8nKTtcbiAgfVxuXG4gIC8vIENoZWNrIE5vZGUgdmVyc2lvblxuICBjb25zdCBub2RlVmVyc2lvbiA9IHByb2Nlc3MudmVyc2lvbjtcbiAgY29uc3QgbWFqb3JWZXJzaW9uID0gcGFyc2VJbnQobm9kZVZlcnNpb24uc2xpY2UoMSkuc3BsaXQoJy4nKVswXSB8fCAnMCcsIDEwKTtcbiAgaWYgKG1ham9yVmVyc2lvbiA8IDI0KSB7XG4gICAgd2FybmluZ3MucHVzaChgTm9kZS5qcyAke25vZGVWZXJzaW9ufSBkZXRlY3RlZCAtIHZlcnNpb24gMjQrIHJlcXVpcmVkIChzZWUgcGFja2FnZS5qc29uIGVuZ2luZXMpYCk7XG4gIH1cblxuICAvLyBEaXNwbGF5IHdhcm5pbmdzXG4gIGlmICh3YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgcHJpbnRTZWN0aW9uKCdFbnZpcm9ubWVudCBXYXJuaW5ncycpO1xuICAgIHdhcm5pbmdzLmZvckVhY2god2FybmluZyA9PiB7XG4gICAgICBwcmludFdhcm5pbmcod2FybmluZyk7XG4gICAgfSk7XG4gICAgY29uc29sZS5sb2coJycpO1xuICB9XG59XG5cbi8qKlxuICogRGlzcGxheSBzdGFydHVwIGluZm9ybWF0aW9uXG4gKi9cbmZ1bmN0aW9uIGRpc3BsYXlTdGFydHVwSW5mbyhvcHRpb25zOiBDbGlPcHRpb25zKTogdm9pZCB7XG4gIGlmIChvcHRpb25zLnF1aWV0KSByZXR1cm47XG5cbiAgY29uc3QgZXhlY3V0aW9uSWQgPSBnZW5lcmF0ZUV4ZWN1dGlvbklkKCk7XG5cbiAgaWYgKG9wdGlvbnMuZGVidWcgfHwgb3B0aW9ucy52ZXJib3NlKSB7XG4gICAgcHJpbnREZWJ1ZygnQ0xJIENvbmZpZ3VyYXRpb24nLCB7XG4gICAgICBuYW1lOiBBUFBfTkFNRSxcbiAgICAgIHZlcnNpb246IEFQUF9WRVJTSU9OLFxuICAgICAgZXhlY3V0aW9uSWQsXG4gICAgICBub2RlOiBwcm9jZXNzLnZlcnNpb24sXG4gICAgICBwbGF0Zm9ybTogcHJvY2Vzcy5wbGF0Zm9ybSxcbiAgICAgIGFyY2g6IHByb2Nlc3MuYXJjaCxcbiAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICAgIGVudjoge1xuICAgICAgICBkZWJ1ZzogcHJvY2Vzcy5lbnYuREVCVUcsXG4gICAgICAgIHRva2VuOiBwcm9jZXNzLmVudltFTlZfVkFSUy5QTEFURk9STV9UT0tFTl0gPyAnc2V0JzogJ25vdCBzZXQnLFxuICAgICAgICB1cmw6IHByb2Nlc3MuZW52W0VOVl9WQVJTLlBMQVRGT1JNX0JBU0VfVVJMXSB8fCAnZGVmYXVsdCcsXG4gICAgICB9LFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHByaW50RGVidWcoJ1N0YXJ0aW5nIENMSScsIHtcbiAgICAgIHZlcnNpb246IEFQUF9WRVJTSU9OLFxuICAgICAgZXhlY3V0aW9uSWQsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqIFRvcC1sZXZlbCBgLS1oZWxwYCBlcGlsb2d1ZTogY29tbWFuZCBncm91cHMsIGF1dGgsIGVudiB2YXJzLCBleGFtcGxlcywgZXhpdCBjb2Rlcy4gKi9cbmNvbnN0IEhFTFBfVEVYVCA9IGBcbkNvbW1hbmQgZ3JvdXBzOlxuICBhdXRoICAgICAgQXV0aGVudGljYXRlIGFuZCBtYW5hZ2UgY3JlZGVudGlhbHMgKGxvZ2luLCBwYXQpXG4gIHBpcGVsaW5lICBDcmVhdGUsIGluc3BlY3QsIGFuZCBkZXBsb3kgcGlwZWxpbmVzIChjcmVhdGUsIGxpc3QsIGdldCwgcmVnaXN0ZXIsIHN5bnRoLCBkZXBsb3kpXG4gIHBsdWdpbiAgICBBdXRob3IsIHZhbGlkYXRlLCBhbmQgcHVibGlzaCBwbHVnaW5zIChuZXcsIHZhbGlkYXRlLCB0ZXN0LCBwdWJsaXNoLCB1cGxvYWQsIGdldCwgbGlzdCwgZGVwcmVjYXRlLCB5YW5rLCB2ZXJpZnkpXG4gIHRlbXBsYXRlICBJbnN0YW50aWF0ZSBnb2xkZW4tcGF0aCBwaXBlbGluZSB0ZW1wbGF0ZXMgYW5kIHZhbGlkYXRlIHt7IC4uLiB9fSBzeW50YXggKGluc3RhbnRpYXRlLCB2YWxpZGF0ZSlcbiAgaW5mcmEgICAgIFNldCB1cCBhbmQgb3BlcmF0ZSBwbGF0Zm9ybSBpbmZyYXN0cnVjdHVyZSAoYm9vdHN0cmFwLCBzZXR1cC1ldmVudHMsIHJlZHJpdmUtZXZlbnRzLCBzdG9yZS10b2tlbiwgcHJvdmlzaW9uKVxuICBhdWRpdCAgICAgT3BlcmF0b3IgYXVkaXRzLCBjcm9uLWZyaWVuZGx5ICh0b2tlbnMsIHN0YWNrcylcbiAgb3JnICAgICAgIE9yZ2FuaXphdGlvbiBkYXRhIG9wZXJhdGlvbnMgKGV4cG9ydClcbiAgc2VjdXJpdHktcmVwb3J0ICBVcGxvYWQgU0FSSUYgLyB0cml2eSAvIGdyeXBlIHJlcG9ydHMgcHJvZHVjZWQgaW5zaWRlIGEgcGlwZWxpbmUgKHVwbG9hZClcbiAgc3RhdHVzIC8gdmVyc2lvbiAvIGNvbXBsZXRpb25zXG5cbkF1dGhlbnRpY2F0aW9uOlxuICBSdW4gJyR7QVBQX05BTUV9IGF1dGggbG9naW4nIG9uY2UgcGVyIHBsYXRmb3JtIOKAlCBpdCBzaWducyB5b3UgaW4gdGhyb3VnaCB5b3VyXG4gIGJyb3dzZXIgKG5vIHBhc3N3b3JkIG9uIHRoZSBjb21tYW5kIGxpbmUpIGFuZCBzdG9yZXMgdGhlIHNlc3Npb24gdW5kZXJcbiAgfi8ucGlwZWxpbmUtbWFuYWdlci9jcmVkZW50aWFscy5qc29uLiBGb3IgQ0ksIGNyZWF0ZSBhbiBhY2Nlc3Mga2V5IHdpdGhcbiAgJyR7QVBQX05BTUV9IGF1dGggcGF0JyBhbmQgZXhwb3J0IGl0IGFzICR7RU5WX1ZBUlMuUExBVEZPUk1fVE9LRU59LCB3aGljaCBhbHdheXMgd2lucy5cblxuRW52aXJvbm1lbnQgVmFyaWFibGVzOlxuICAke0VOVl9WQVJTLlBMQVRGT1JNX1RPS0VOfSBBY2Nlc3Mga2V5IG9yIHRva2VuIChvdmVycmlkZXMgdGhlIHN0b3JlZCBzZXNzaW9uKVxuICAke0VOVl9WQVJTLlBMQVRGT1JNX0JBU0VfVVJMfSBBUEkgYmFzZSBVUkwgKG9wdGlvbmFsKVxuICAke0VOVl9WQVJTLkNMSV9DT05GSUdfUEFUSH0gQ29uZmlnIGZpbGUgcGF0aCAob3B0aW9uYWwpXG4gICR7RU5WX1ZBUlMuVExTX1JFSkVDVF9VTkFVVEhPUklaRUR9IERpc2FibGUgU1NMIHZlcmlmaWNhdGlvbiBpZiAnMCdcbiAgUExBVEZPUk1fQ0FfQlVORExFICBQRU0gb2YgYSBwcml2YXRlIENBIHRvIHRydXN0IGZvciB0aGUgcGxhdGZvcm0gKHZlcmlmaWVkLCBub3Qgc2tpcHBlZClcbiAgJHtFTlZfVkFSUy5ERUJVR30gRW5hYmxlIGRlYnVnIG1vZGUgaWYgJ3RydWUnXG5cbkV4YW1wbGVzOlxuICAkICR7QVBQX05BTUV9IHZlcnNpb25cbiAgJCAke0FQUF9OQU1FfSAtLXVwZ3JhZGUgICAgICAgICAgICAoLS11cGdyYWRlIDx2ZXJzaW9uPiBmb3IgYSBzcGVjaWZpYyBvbmUsIC0tdXBncmFkZS1jaGVjayB0byBvbmx5IGxvb2spXG4gICQgJHtBUFBfTkFNRX0gYXV0aCBsb2dpblxuICAkICR7QVBQX05BTUV9IHBpcGVsaW5lIGxpc3QgLS1wcm9qZWN0IG15LWFwcFxuICAkICR7QVBQX05BTUV9IHBpcGVsaW5lIGdldCAtLWlkIHBpcGUtMTIzIC0tZm9ybWF0IGpzb25cbiAgJCAke0FQUF9OQU1FfSBwaXBlbGluZSBjcmVhdGUgLWYgcHJvcHMuanNvbiAtLWRlcGxveSAtLXByb2ZpbGUgcHJvZHVjdGlvblxuICAkICR7QVBQX05BTUV9IHRlbXBsYXRlIGluc3RhbnRpYXRlIC1uIHJlYWN0LWphdmFzY3JpcHQgLXAgcmVhY3QgLW8gYWNtZSAtLWlucHV0IG9yZ0lkPTx1dWlkPiAtLW91dHB1dCBwcm9wcy5qc29uXG4gICQgJHtBUFBfTkFNRX0gcGx1Z2luIHVwbG9hZCAtLWZpbGUgcGx1Z2luLnppcFxuICAkICR7QVBQX05BTUV9IGluZnJhIHN0b3JlLXRva2VuIC0tZGF5cyAzMCAtLXJlZ2lvbiB1cy1lYXN0LTFcbiAgJCAke0FQUF9OQU1FfSBpbmZyYSBib290c3RyYXAgLS1hY2NvdW50IDEyMzQ1Njc4OTAxMiAtLXJlZ2lvbiB1cy1lYXN0LTFcbiAgJCAke0FQUF9OQU1FfSBwaXBlbGluZSBkZXBsb3kgLS1pZCBwaXBlLTEyMyAtLXByb2ZpbGUgcHJvZHVjdGlvblxuXG5FeGl0IGNvZGVzICgwID0gc3VjY2VzczsgZmFpbHVyZXMgdXNlIGEgc3RhbmRhcmQgY29kZSBieSBlcnJvciB0eXBlKTpcbiAgMSBnZW5lcmFsIMK3IDIgdmFsaWRhdGlvbiDCtyAzIGFwaS1yZXF1ZXN0IMK3IDQgYXV0aCDCtyA1IGZvcmJpZGRlblxuICA2IG5vdC1mb3VuZCDCtyA3IG5ldHdvcmsgwrcgOCBjb25maWcgwrcgOSBmaWxlLXN5c3RlbSDCtyAxMCB0aW1lb3V0XG5cblJ1biAnJHtBUFBfTkFNRX0gPGdyb3VwPiAtLWhlbHAnIHRvIHNlZSBhIGdyb3VwJ3Mgc3ViY29tbWFuZHMuXG5gO1xuXG4vKipcbiAqIFRhc2sgbmFtZXNwYWNlcyDigJQgY29tbWFuZHMgYXJlIGdyb3VwZWQgYnkgdGhlIGpvYiB0aGUgdXNlciBpcyBkb2luZywgbm90IGJ5XG4gKiBpbXBsZW1lbnRhdGlvbi4gRWFjaCBwYXJlbnQgaXMgYSBzdWJjb21tYW5kIGNvbnRhaW5lcjsgdGhlIGxlYWYgdmVyYiBsaXZlcyBpblxuICogdGhlIGNvbW1hbmQgZmlsZSAoZS5nLiBgLmNvbW1hbmQoJ2xpc3QnKWApLCBzbyBgcGlwZWxpbmUgbGlzdGAgcmVhZHMgYXMgYSB0YXNrLlxuICovXG5mdW5jdGlvbiByZWdpc3RlclRhc2tOYW1lc3BhY2VzKCk6IHZvaWQge1xuICBwcmludERlYnVnKCdSZWdpc3RlcmluZyB0YXNrIG5hbWVzcGFjZXMnKTtcblxuICAvLyBhdXRoIOKAlCBhdXRoZW50aWNhdGUgYW5kIG1hbmFnZSBjcmVkZW50aWFsc1xuICBjb25zdCBhdXRoID0gcHJvZ3JhbS5jb21tYW5kKCdhdXRoJykuZGVzY3JpcHRpb24oJ0F1dGhlbnRpY2F0ZSBhbmQgbWFuYWdlIGNyZWRlbnRpYWxzJyk7XG4gIGxvZ2luKGF1dGgpOyAvLyBhdXRoIGxvZ2luIOKAlCBicm93c2VyIChkZXZpY2UtYXV0aG9yaXphdGlvbikgc2lnbi1pbiwgc3RvcmVkIGxvY2FsbHlcbiAgY3JlYXRlUGF0KGF1dGgpOyAvLyBhdXRoIHBhdCDigJQgY3JlYXRlIGEgbmFtZWQgYWNjZXNzIGtleSAoZGV2aWNlIHNpZ24taW4gKyBicm93c2VyIHN0ZXAtdXApXG5cbiAgLy8gcGlwZWxpbmUg4oCUIGNyZWF0ZSwgaW5zcGVjdCwgYW5kIGRlcGxveSBwaXBlbGluZXNcbiAgY29uc3QgcGlwZWxpbmUgPSBwcm9ncmFtLmNvbW1hbmQoJ3BpcGVsaW5lJykuZGVzY3JpcHRpb24oJ0NyZWF0ZSwgaW5zcGVjdCwgYW5kIGRlcGxveSBwaXBlbGluZXMnKTtcbiAgY3JlYXRlUGlwZWxpbmUocGlwZWxpbmUpOyAvLyBwaXBlbGluZSBjcmVhdGVcbiAgbGlzdFBpcGVsaW5lcyhwaXBlbGluZSk7IC8vIHBpcGVsaW5lIGxpc3RcbiAgZ2V0UGlwZWxpbmUocGlwZWxpbmUpOyAvLyBwaXBlbGluZSBnZXRcbiAgcmVnaXN0ZXIocGlwZWxpbmUpOyAvLyBwaXBlbGluZSByZWdpc3RlciDigJQgcmUtcmVnaXN0ZXIgYSBkZXBsb3llZCBBUk4gKyBkcmFpbiBwZW5kaW5nIGludGVudHNcbiAgc3ludGgocGlwZWxpbmUpOyAvLyBwaXBlbGluZSBzeW50aCDigJQgQ0RLIHN5bnRoZXNpcyBmcm9tIHBpcGVsaW5lIGNvbmZpZ1xuICBkZXBsb3kocGlwZWxpbmUpOyAvLyBwaXBlbGluZSBkZXBsb3kg4oCUIENESyBkZXBsb3kgKC0tYXBwIHByaW50cyBib2lsZXJwbGF0ZSBwYXRoKVxuXG4gIC8vIHBsdWdpbiDigJQgYXV0aG9yLCB2YWxpZGF0ZSwgYW5kIHB1Ymxpc2ggcGx1Z2luc1xuICBjb25zdCBwbHVnaW4gPSBwcm9ncmFtLmNvbW1hbmQoJ3BsdWdpbicpLmRlc2NyaXB0aW9uKCdBdXRob3IsIHZhbGlkYXRlLCBhbmQgcHVibGlzaCBwbHVnaW5zJyk7XG4gIG5ld1BsdWdpbihwbHVnaW4pOyAvLyBwbHVnaW4gbmV3IOKAlCBzY2FmZm9sZCBhIGxvY2FsIHBsdWdpbiBkaXJlY3RvcnlcbiAgdmFsaWRhdGVQbHVnaW4ocGx1Z2luKTsgLy8gcGx1Z2luIHZhbGlkYXRlIOKAlCB0aGUgc2VydmVyJ3Mgc2NoZW1hcyArIHRoZSBjYXRhbG9nLW1ldGFkYXRhIHJlcG9ydFxuICB0ZXN0UGx1Z2luKHBsdWdpbik7IC8vIHBsdWdpbiB0ZXN0IOKAlCBydW4gaW5zdGFsbCArIGJ1aWxkIGNvbW1hbmRzIGxvY2FsbHkgaW4gdGhlIGltYWdlXG4gIHB1Ymxpc2hQbHVnaW4ocGx1Z2luKTsgLy8gcGx1Z2luIHB1Ymxpc2gg4oCUIHByZS1mbGlnaHQsIHNjYW4gcHJldmlldywgYWNjZXB0LW9yLWVkaXQsIHB1Ymxpc2ggcmVxdWVzdFxuICB1cGxvYWRQbHVnaW4ocGx1Z2luKTsgLy8gcGx1Z2luIHVwbG9hZCDigJQgdXBsb2FkIGFuZCBkZXBsb3lcbiAgZ2V0UGx1Z2luKHBsdWdpbik7IC8vIHBsdWdpbiBnZXRcbiAgbGlzdFBsdWdpbnMocGx1Z2luKTsgLy8gcGx1Z2luIGxpc3RcbiAgZGVwcmVjYXRlUGx1Z2luKHBsdWdpbik7IC8vIHBsdWdpbiBkZXByZWNhdGUg4oCUIGRlcHJlY2F0ZSAob3IgLS11bmRvKSBhIHZlcnNpb25cbiAgeWFua1BsdWdpbihwbHVnaW4pOyAvLyBwbHVnaW4geWFuayDigJQgc3RvcCBhIHZlcnNpb24gcmVzb2x2aW5nIGZvciBuZXcgc3ludGhzXG4gIHZlcmlmeVBsdWdpbnMocGx1Z2luKTsgLy8gcGx1Z2luIHZlcmlmeSDigJQgcnVuLXRpbWUgY2hlY2sgb2YgYSBwaXBlbGluZSdzIHBpbm5lZCBwbHVnaW4gaW1hZ2VzXG5cbiAgLy8gdGVtcGxhdGUg4oCUIGluc3RhbnRpYXRlIGdvbGRlbi1wYXRoIHBpcGVsaW5lIHRlbXBsYXRlcywgdmFsaWRhdGUge3sgLi4uIH19IHN5bnRheFxuICBjb25zdCB0ZW1wbGF0ZSA9IHByb2dyYW0uY29tbWFuZCgndGVtcGxhdGUnKS5kZXNjcmlwdGlvbignSW5zdGFudGlhdGUgcGlwZWxpbmUgdGVtcGxhdGVzIGFuZCB2YWxpZGF0ZSB7eyAuLi4gfX0gdGVtcGxhdGUgc3ludGF4Jyk7XG4gIGluc3RhbnRpYXRlVGVtcGxhdGUodGVtcGxhdGUpOyAvLyB0ZW1wbGF0ZSBpbnN0YW50aWF0ZSDigJQgcmVuZGVyIGEgdGVtcGxhdGUgaW50byBwaXBlbGluZSBwcm9wc1xuICB2YWxpZGF0ZVRlbXBsYXRlc0NvbW1hbmQodGVtcGxhdGUpOyAvLyB0ZW1wbGF0ZSB2YWxpZGF0ZVxuXG4gIC8vIGluZnJhIOKAlCBzZXQgdXAgYW5kIG9wZXJhdGUgcGxhdGZvcm0gaW5mcmFzdHJ1Y3R1cmVcbiAgY29uc3QgaW5mcmEgPSBwcm9ncmFtLmNvbW1hbmQoJ2luZnJhJykuZGVzY3JpcHRpb24oJ1NldCB1cCBhbmQgb3BlcmF0ZSBwbGF0Zm9ybSBpbmZyYXN0cnVjdHVyZScpO1xuICBib290c3RyYXAoaW5mcmEpOyAvLyBpbmZyYSBib290c3RyYXAg4oCUIENESyB0b29sa2l0IHN0YWNrXG4gIHNldHVwRXZlbnRzKGluZnJhKTsgLy8gaW5mcmEgc2V0dXAtZXZlbnRzIOKAlCBFdmVudEJyaWRnZSBldmVudCBpbmdlc3Rpb25cbiAgcmVkcml2ZUV2ZW50cyhpbmZyYSk7IC8vIGluZnJhIHJlZHJpdmUtZXZlbnRzIOKAlCBtYW51YWwgRExRIOKGkiBxdWV1ZSByZWRyaXZlIGZhbGxiYWNrXG4gIHN0b3JlVG9rZW4oaW5mcmEpOyAvLyBpbmZyYSBzdG9yZS10b2tlbiDigJQgSldUIHRva2VuIGluIFNlY3JldHMgTWFuYWdlciBmb3IgQ0RLXG4gIHByb3Zpc2lvbihpbmZyYSk7IC8vIGluZnJhIHByb3Zpc2lvbiDigJQgQUktYXNzaXN0ZWQgZGVwbG95L3RlYXJkb3duIG9mIHRoZSBwbGF0Zm9ybVxuXG4gIC8vIGF1ZGl0IOKAlCBvcGVyYXRvciBhdWRpdHMgKGNyb24tZnJpZW5kbHk6IGV4aXQgMSBvbiBmaW5kaW5ncylcbiAgY29uc3QgYXVkaXQgPSBwcm9ncmFtLmNvbW1hbmQoJ2F1ZGl0JykuZGVzY3JpcHRpb24oJ09wZXJhdG9yIGF1ZGl0cyAoY3Jvbi1mcmllbmRseTogZXhpdCAxIG9uIGZpbmRpbmdzKScpO1xuICBhdWRpdFRva2VucyhhdWRpdCk7IC8vIGF1ZGl0IHRva2VucyDigJQgZXhwaXJpbmcgcGxhdGZvcm0gdG9rZW5zIGluIFNlY3JldHMgTWFuYWdlclxuICBhdWRpdFN0YWNrcyhhdWRpdCk7IC8vIGF1ZGl0IHN0YWNrcyDigJQgQ0ZOIHN0YWNrcyB2cyBwaXBlbGluZV9yZWdpc3RyeSBkcmlmdFxuXG4gIC8vIHRvb2xjaGFpbiDigJQgdGhlIHBpcGVsaW5lIHRvb2xjaGFpbiByZWxlYXNlIChwaXBlbGluZS1ib290c3RyYXAgKyBjZGstc3ludGgpXG4gIHRvb2xjaGFpbihwcm9ncmFtKTsgLy8gdG9vbGNoYWluIGV4cG9ydCDigJQgdGhlIHJlc29sdmVkIHJlbGVhc2UgYXMgSlNPTiwgZm9yIGRlcGxveSAtLWxvY2FsLXNwZWNcblxuICAvLyBvcmcg4oCUIG9yZ2FuaXphdGlvbiBkYXRhIG9wZXJhdGlvbnNcbiAgY29uc3Qgb3JnID0gcHJvZ3JhbS5jb21tYW5kKCdvcmcnKS5kZXNjcmlwdGlvbignT3JnYW5pemF0aW9uIGRhdGEgb3BlcmF0aW9ucycpO1xuICBvcmdFeHBvcnQob3JnKTsgLy8gb3JnIGV4cG9ydCDigJQgR0RQUiBwb3J0YWJpbGl0eSBleHBvcnRcblxuICAvLyByZXBvcnQg4oCUIHRoZSBzdGFrZWhvbGRlci1yZXBvcnQgYWRkLW9uLiBSZWdpc3RlcmVkIGFzIGl0cyBPV04gbmFtZXNwYWNlIHJhdGhlciB0aGFuXG4gIC8vIHVuZGVyIGBvcmdgLCBiZWNhdXNlIGl0cyB2ZXJicyBhcmUgYSBsZWFkJ3Mgd29ya2Zsb3cgKGNvbXBvc2UsIHB1Ymxpc2gsIHNoYXJlKSwgbm90IGFuXG4gIC8vIG9yZ2FuaXphdGlvbi1kYXRhIG9wZXJhdGlvbi4gVGhlIHR3byBqb2JzIHRoZSBkYXNoYm9hcmQgaXMgdGhlIHdyb25nIHNoYXBlIGZvciBhcmVcbiAgLy8gYmFja2ZpbGxpbmcgYSBydW4gb2YgcGFzdCBwZXJpb2RzIGFuZCBkcml2aW5nIGEgcHVibGlzaCBmcm9tIGFub3RoZXIgc2NoZWR1bGVyLlxuICByZXBvcnQocHJvZ3JhbSk7XG5cbiAgLy8gc2VjdXJpdHktcmVwb3J0IOKAlCB1cGxvYWQgU0FSSUYgLyB0cml2eSAvIGdyeXBlIHJlcG9ydHMgcHJvZHVjZWQgaW5zaWRlIGEgcGlwZWxpbmVcbiAgc2VjdXJpdHlSZXBvcnQocHJvZ3JhbSk7XG59XG5cbi8qKiBQcmludCBzaGVsbCBjb21wbGV0aW9ucyBmb3IgYHNoZWxsYCAoYmFzaCwgenNoIG9yIGZpc2gpLiAqL1xuZnVuY3Rpb24gcHJpbnRDb21wbGV0aW9ucyhzaGVsbDogc3RyaW5nKTogdm9pZCB7XG4gIC8vIFdhbGsgY29tbWFuZGVyJ3MgcmVnaXN0ZXJlZCB0cmVlIHNvIGNvbXBsZXRpb25zIG5ldmVyIGRyaWZ0IGZyb20gdGhlIGFjdHVhbFxuICAvLyBzdXJmYWNlLiBgdG9wTGV2ZWxgIGlzIHRoZSBmaXJzdC13b3JkIHNldCAobmFtZXNwYWNlcyArIG1ldGEgY29tbWFuZHMpO1xuICAvLyBgc3Vic2AgbWFwcyBlYWNoIG5hbWVzcGFjZSB0byBpdHMgbGVhZiB2ZXJicyBmb3Igc2Vjb25kLXdvcmQgY29tcGxldGlvbi5cbiAgY29uc3QgdG9wTGV2ZWwgPSBwcm9ncmFtLmNvbW1hbmRzLm1hcChjID0+IGMubmFtZSgpKS5zb3J0KCk7XG4gIGNvbnN0IHN1YnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuICBmb3IgKGNvbnN0IGMgb2YgcHJvZ3JhbS5jb21tYW5kcykge1xuICAgIGlmIChjLmNvbW1hbmRzLmxlbmd0aCA+IDApIHN1YnNbYy5uYW1lKCldID0gYy5jb21tYW5kcy5tYXAocyA9PiBzLm5hbWUoKSkuc29ydCgpO1xuICB9XG4gIGNvbnN0IHRvcExldmVsU3RyID0gdG9wTGV2ZWwuam9pbignICcpO1xuICBzd2l0Y2ggKHNoZWxsKSB7XG4gICAgY2FzZSAnYmFzaCc6IHtcbiAgICAgIC8vIFR3by1sZXZlbDogY29tcGxldGUgdGhlIGdyb3VwIGF0IHdvcmQgMSwgaXRzIHN1YmNvbW1hbmRzIGF0IHdvcmQgMi5cbiAgICAgIGNvbnN0IGNhc2VzID0gT2JqZWN0LmVudHJpZXMoc3VicylcbiAgICAgICAgLm1hcCgoW25zLCBsZWF2ZXNdKSA9PiBgICAgICAgJHtuc30pIENPTVBSRVBMWT0oJChjb21wZ2VuIC1XIFwiJHtsZWF2ZXMuam9pbignICcpfVwiIC0tIFwiXFwke2N1cn1cIikpOztgKVxuICAgICAgICAuam9pbignXFxuJyk7XG4gICAgICBjb25zb2xlLmxvZyhgIyBwaXBlbGluZS1tYW5hZ2VyIGJhc2ggY29tcGxldGlvbnNcbl9waXBlbGluZV9tYW5hZ2VyX2NvbXBsZXRpb25zKCkge1xuICBsb2NhbCBjdXI9XCJcXCR7Q09NUF9XT1JEU1tDT01QX0NXT1JEXX1cIlxuICBpZiBbIFwiXFwke0NPTVBfQ1dPUkR9XCIgLWVxIDEgXTsgdGhlblxuQ09NUFJFUExZPSgkKGNvbXBnZW4gLVcgXCIke3RvcExldmVsU3RyfVwiIC0tIFwiXFwke2N1cn1cIikpXG5yZXR1cm5cbiAgZmlcbiAgY2FzZSBcIlxcJHtDT01QX1dPUkRTWzFdfVwiIGluXG4ke2Nhc2VzfVxuICBlc2FjXG59XG5jb21wbGV0ZSAtRiBfcGlwZWxpbmVfbWFuYWdlcl9jb21wbGV0aW9ucyBwaXBlbGluZS1tYW5hZ2VyYCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAnenNoJzoge1xuICAgICAgY29uc3QgY2FzZXMgPSBPYmplY3QuZW50cmllcyhzdWJzKVxuICAgICAgICAubWFwKChbbnMsIGxlYXZlc10pID0+IGAgICAgICAgICR7bnN9KSBfdmFsdWVzICdzdWJjb21tYW5kJyAke2xlYXZlcy5qb2luKCcgJyl9OztgKVxuICAgICAgICAuam9pbignXFxuJyk7XG4gICAgICBjb25zb2xlLmxvZyhgIyBwaXBlbGluZS1tYW5hZ2VyIHpzaCBjb21wbGV0aW9uc1xuX3BpcGVsaW5lX21hbmFnZXIoKSB7XG4gIGlmICgoIENVUlJFTlQgPT0gMiApKTsgdGhlblxuX3ZhbHVlcyAnY29tbWFuZCcgJHt0b3BMZXZlbC5qb2luKCcgJyl9XG5yZXR1cm5cbiAgZmlcbiAgY2FzZSBcIlxcJHt3b3Jkc1syXX1cIiBpblxuJHtjYXNlc31cbiAgZXNhY1xufVxuY29tcGRlZiBfcGlwZWxpbmVfbWFuYWdlciBwaXBlbGluZS1tYW5hZ2VyYCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAnZmlzaCc6IHtcbiAgICAgIGNvbnN0IGxpbmVzID0gW1xuICAgICAgICBgY29tcGxldGUgLWMgcGlwZWxpbmUtbWFuYWdlciAtbiAnX19maXNoX3VzZV9zdWJjb21tYW5kJyAtYSAnJHt0b3BMZXZlbFN0cn0nYCxcbiAgICAgICAgLi4uT2JqZWN0LmVudHJpZXMoc3VicykubWFwKChbbnMsIGxlYXZlc10pID0+XG4gICAgICAgICAgYGNvbXBsZXRlIC1jIHBpcGVsaW5lLW1hbmFnZXIgLW4gJ19fZmlzaF9zZWVuX3N1YmNvbW1hbmRfZnJvbSAke25zfScgLWEgJyR7bGVhdmVzLmpvaW4oJyAnKX0nYCksXG4gICAgICBdO1xuICAgICAgY29uc29sZS5sb2coYCMgcGlwZWxpbmUtbWFuYWdlciBmaXNoIGNvbXBsZXRpb25zXFxuJHtsaW5lcy5qb2luKCdcXG4nKX1gKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgY29uc29sZS5lcnJvcihgVW5rbm93biBzaGVsbDogJHtzaGVsbH0uIFVzZSBiYXNoLCB6c2gsIG9yIGZpc2guYCk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWdpc3RlciBhbGwgQ0xJIGNvbW1hbmRzXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyQ29tbWFuZHMoKTogdm9pZCB7XG4gIHByaW50RGVidWcoJ1JlZ2lzdGVyaW5nIGNvbW1hbmRzJyk7XG5cbiAgLy8gQ29uZmlndXJlIHByb2dyYW1cbiAgcHJvZ3JhbVxuICAgIC5uYW1lKEFQUF9OQU1FKVxuICAgIC5kZXNjcmlwdGlvbihBUFBfREVTQ1JJUFRJT04pXG4gICAgLnZlcnNpb24oQVBQX1ZFUlNJT04sICctdiwgLS12ZXJzaW9uJywgJ1Nob3cgQ0xJIHZlcnNpb24nKVxuICAgIC5vcHRpb24oJy0tZGVidWcnLCAnRW5hYmxlIGRlYnVnIG91dHB1dCB3aXRoIHN0YWNrIHRyYWNlcycsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tdmVyYm9zZScsICdTaG93IGRldGFpbGVkIGluZm9ybWF0aW9uJywgZmFsc2UpXG4gICAgLm9wdGlvbignLS1xdWlldCcsICdNaW5pbWFsIG91dHB1dCAoZXJyb3JzIG9ubHkpJywgZmFsc2UpXG4gICAgLm9wdGlvbignLS1uby1jb2xvcicsICdEaXNhYmxlIGNvbG9yZWQgb3V0cHV0JywgZmFsc2UpXG4gICAgLmFkZEhlbHBUZXh0KCdhZnRlcicsIEhFTFBfVEVYVCk7XG5cbiAgLy8gLS11cGdyYWRlIFt2ZXJzaW9uXTogc2VsZi11cGRhdGUsIGhhbmRsZWQgbGlrZSAtLXZlcnNpb24gKGxpc3RlbmVyICsgZXhpdCkuXG4gIHJlZ2lzdGVyVXBncmFkZU9wdGlvbihwcm9ncmFtKTtcblxuICAvLyBGYWlsLWZhc3QgcHJlZmxpZ2h0OiBiZWZvcmUgQU5ZIGNvbW1hbmQncyBhY3Rpb24gcnVucywgdmVyaWZ5IHRoZSBsb2NhbFxuICAvLyB0b29scyB0aGF0IGNvbW1hbmQgbmVlZHMuIENvbW1hbmRlciBza2lwcyB0aGlzIGZvciAtLWhlbHAvLS12ZXJzaW9uIGFuZCBmb3JcbiAgLy8gaGVscCBvdXRwdXQsIHNvIHRob3NlIGFsd2F5cyB3b3JrOyBBUEktb25seSBjb21tYW5kcyBkZWNsYXJlIG5vIHJlcXVpcmVtZW50c1xuICAvLyBhbmQgcGFzcyB0aHJvdWdoIHVudG91Y2hlZC5cbiAgcHJvZ3JhbS5ob29rKCdwcmVBY3Rpb24nLCAoX3RoaXNDb21tYW5kLCBhY3Rpb25Db21tYW5kKSA9PiBwcmVmbGlnaHRDb21tYW5kVG9vbHMoYWN0aW9uQ29tbWFuZCkpO1xuXG4gIC8vIFRvcC1sZXZlbCBtZXRhIGNvbW1hbmRzIChubyBuYW1lc3BhY2UpLlxuICB2ZXJzaW9uKHByb2dyYW0pO1xuICBzdGF0dXMocHJvZ3JhbSk7IC8vIFNob3cgZW52aXJvbm1lbnQgYW5kIGNvbm5lY3Rpdml0eSBzdGF0dXNcblxuICByZWdpc3RlclRhc2tOYW1lc3BhY2VzKCk7XG5cbiAgLy8gU2hlbGwgY29tcGxldGlvbnNcbiAgcHJpbnREZWJ1ZygnUmVnaXN0ZXJpbmcgY29tcGxldGlvbnMgY29tbWFuZCcpO1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoJ2NvbXBsZXRpb25zJylcbiAgICAuZGVzY3JpcHRpb24oJ0dlbmVyYXRlIHNoZWxsIGNvbXBsZXRpb25zIChiYXNoLCB6c2gsIGZpc2gpJylcbiAgICAuYXJndW1lbnQoJzxzaGVsbD4nLCAnU2hlbGwgdHlwZTogYmFzaCwgenNoLCBvciBmaXNoJylcbiAgICAuYWN0aW9uKChzaGVsbDogc3RyaW5nKSA9PiB7XG4gICAgICBwcmludENvbXBsZXRpb25zKHNoZWxsKTtcbiAgICB9KTtcblxuICBwcmludERlYnVnKCdBbGwgY29tbWFuZHMgcmVnaXN0ZXJlZCBzdWNjZXNzZnVsbHknKTtcbn1cblxuLyoqXG4gKiBIYW5kbGUgcHJvZ3JhbSBlcnJvcnNcbiAqL1xuZnVuY3Rpb24gc2V0dXBFcnJvckhhbmRsZXJzKCk6IHZvaWQge1xuICAvLyBIYW5kbGUgdW5jYXVnaHQgZXhjZXB0aW9uc1xuICBwcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIChlcnJvcjogRXJyb3IpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgIHByaW50RXJyb3IoJ1VuY2F1Z2h0IGV4Y2VwdGlvbicsIHtcbiAgICAgIGVycm9yOiBlcnJvci5tZXNzYWdlLFxuICAgICAgbmFtZTogZXJyb3IubmFtZSxcbiAgICB9KTtcblxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBFUlJPUl9DT0RFUy5HRU5FUkFMLCB7XG4gICAgICBkZWJ1ZzogaXNEZWJ1Z01vZGUocHJvZ3JhbS5vcHRzKCkpLFxuICAgICAgZXhpdDogdHJ1ZSxcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgdHlwZTogJ3VuY2F1Z2h0RXhjZXB0aW9uJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIEhhbmRsZSB1bmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb25zXG4gIHByb2Nlc3Mub24oJ3VuaGFuZGxlZFJlamVjdGlvbicsIChyZWFzb246IHVua25vd24pID0+IHtcbiAgICBjb25zb2xlLmVycm9yKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgIHByaW50RXJyb3IoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHtcbiAgICAgIHJlYXNvbjogZXJyb3JNZXNzYWdlKHJlYXNvbiksXG4gICAgfSk7XG5cbiAgICBjb25zdCBlcnJvciA9IHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yID8gcmVhc29uOiBuZXcgRXJyb3IoU3RyaW5nKHJlYXNvbikpO1xuXG4gICAgaGFuZGxlRXJyb3IoZXJyb3IsIEVSUk9SX0NPREVTLkdFTkVSQUwsIHtcbiAgICAgIGRlYnVnOiBpc0RlYnVnTW9kZShwcm9ncmFtLm9wdHMoKSksXG4gICAgICBleGl0OiB0cnVlLFxuICAgICAgY29udGV4dDoge1xuICAgICAgICB0eXBlOiAndW5oYW5kbGVkUmVqZWN0aW9uJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIEhhbmRsZSBTSUdJTlQgKEN0cmwrQylcbiAgcHJvY2Vzcy5vbignU0lHSU5UJywgKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgIHByaW50V2FybmluZygnUHJvY2VzcyBpbnRlcnJ1cHRlZCBieSB1c2VyIChTSUdJTlQpJyk7XG4gICAgY29uc29sZS5sb2coJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgcHJvY2Vzcy5leGl0KDEzMCk7IC8vIFN0YW5kYXJkIGV4aXQgY29kZSBmb3IgU0lHSU5UXG4gIH0pO1xuXG4gIC8vIEhhbmRsZSBTSUdURVJNXG4gIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgcHJpbnRXYXJuaW5nKCdQcm9jZXNzIHRlcm1pbmF0ZWQgKFNJR1RFUk0pJyk7XG4gICAgY29uc29sZS5sb2coJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgcHJvY2Vzcy5leGl0KDE0Myk7IC8vIFN0YW5kYXJkIGV4aXQgY29kZSBmb3IgU0lHVEVSTVxuICB9KTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIENMSSB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENMSSBpbml0aWFsaXphdGlvbiBvcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplQ2xpKG9wdGlvbnM6IENsaU9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICBjb25zdCB7XG4gICAgc2hvd0Jhbm5lciA9IHRydWUsXG4gICAgbWluaW1hbEJhbm5lciA9IGZhbHNlLFxuICAgIGRlYnVnID0gZmFsc2UsXG4gICAgdmVyYm9zZSA9IGZhbHNlLFxuICAgIHF1aWV0ID0gZmFsc2UsXG4gICAgbm9Db2xvciA9IGZhbHNlLFxuICAgIHNlbGZVcGRhdGUgPSBmYWxzZSxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgLy8gSGFuZGxlIGNvbG9yIG91dHB1dFxuICBpZiAobm9Db2xvcikge1xuICAgIHByb2Nlc3MuZW52Lk5PX0NPTE9SID0gJzEnO1xuICB9XG5cbiAgLy8gRGlzcGxheSBiYW5uZXJcbiAgaWYgKHNob3dCYW5uZXIgJiYgIXF1aWV0KSB7XG4gICAgaWYgKG1pbmltYWxCYW5uZXIpIHtcbiAgICAgIG1pbmlCYW5uZXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmFubmVyKHtcbiAgICAgICAgbWluaW1hbDogZmFsc2UsXG4gICAgICAgIHNob3dEZXNjcmlwdGlvbjogdHJ1ZSxcbiAgICAgICAgc2hvd1RpbWVzdGFtcDogZGVidWcgfHwgdmVyYm9zZSxcbiAgICAgICAgc2hvd0V4ZWN1dGlvbklkOiBkZWJ1ZyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIERpc3BsYXkgc3RhcnR1cCBpbmZvXG4gIGRpc3BsYXlTdGFydHVwSW5mbyh7IGRlYnVnLCB2ZXJib3NlLCBxdWlldCB9KTtcblxuICAvLyBDaGVjayBlbnZpcm9ubWVudFxuICBpZiAoIXF1aWV0KSB7XG4gICAgY2hlY2tFbnZpcm9ubWVudCh7IHNpZ25JblJlbGV2YW50OiAhc2VsZlVwZGF0ZSB9KTtcbiAgfVxuXG4gIC8vIFNldHVwIGVycm9yIGhhbmRsZXJzXG4gIHNldHVwRXJyb3JIYW5kbGVycygpO1xuXG4gIC8vIFJlZ2lzdGVyIGNvbW1hbmRzXG4gIHRyeSB7XG4gICAgcmVnaXN0ZXJDb21tYW5kcygpO1xuICAgIHByaW50RGVidWcoJ0NMSSBpbml0aWFsaXphdGlvbiBjb21wbGV0ZScpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHByaW50RXJyb3IoJ0NMSSBpbml0aWFsaXphdGlvbiBmYWlsZWQnLCB7XG4gICAgICBlcnJvcjogZXJyb3JNZXNzYWdlKGVycm9yKSxcbiAgICB9KTtcblxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBFUlJPUl9DT0RFUy5DT05GSUdVUkFUSU9OLCB7XG4gICAgICBkZWJ1ZzogZGVidWcgfHwgaXNEZWJ1Z01vZGUoKSxcbiAgICAgIGV4aXQ6IHRydWUsXG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIHN0YWdlOiAnaW5pdGlhbGl6YXRpb24nLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlIGNvbW1hbmQgbGluZSBhcmd1bWVudHNcbiAqL1xuZnVuY3Rpb24gcGFyc2VBcmd1bWVudHMoKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcHJvZ3JhbS5wYXJzZShwcm9jZXNzLmFyZ3YpO1xuXG4gICAgLy8gU2hvdyBoZWxwIGlmIG5vIGNvbW1hbmQgcHJvdmlkZWRcbiAgICBjb25zdCBhcmdzID0gcHJvY2Vzcy5hcmd2LnNsaWNlKDIpO1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcHJpbnRJbmZvKCdObyBjb21tYW5kIHNwZWNpZmllZCAtIGRpc3BsYXlpbmcgaGVscCcpO1xuICAgICAgY29uc29sZS5sb2coJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgICBwcm9ncmFtLm91dHB1dEhlbHAoKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBjb21tYW5kIGV4aXN0c1xuICAgIGNvbnN0IGNvbW1hbmQgPSBhcmdzWzBdO1xuICAgIGlmIChjb21tYW5kICYmICFjb21tYW5kLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgY29uc3QgY29tbWFuZEV4aXN0cyA9IHByb2dyYW0uY29tbWFuZHMuc29tZShjbWQgPT4gY21kLm5hbWUoKSA9PT0gY29tbWFuZCk7XG5cbiAgICAgIGlmICghY29tbWFuZEV4aXN0cykge1xuICAgICAgICBjb25zb2xlLmxvZygnJyk7IC8vIEVtcHR5IGxpbmVcbiAgICAgICAgcHJpbnRFcnJvcihgVW5rbm93biBjb21tYW5kOiAke2NvbW1hbmR9YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgICAgICBwcmludEluZm8oJ0F2YWlsYWJsZSBjb21tYW5kczonKTtcbiAgICAgICAgcHJvZ3JhbS5jb21tYW5kcy5mb3JFYWNoKGNtZCA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCDigKIgJHtjbWQubmFtZSgpfSAtICR7Y21kLmRlc2NyaXB0aW9uKCl9YCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zb2xlLmxvZygnJyk7IC8vIEVtcHR5IGxpbmVcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaW50RGVidWcoJ0NvbW1hbmQgbGluZSBhcmd1bWVudHMgcGFyc2VkIHN1Y2Nlc3NmdWxseScpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGhhbmRsZUVycm9yKGVycm9yLCBFUlJPUl9DT0RFUy5HRU5FUkFMLCB7XG4gICAgICBkZWJ1ZzogaXNEZWJ1Z01vZGUocHJvZ3JhbS5vcHRzKCkpLFxuICAgICAgZXhpdDogdHJ1ZSxcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgc3RhZ2U6ICdhcmd1bWVudC1wYXJzaW5nJyxcbiAgICAgICAgYXJndjogcHJvY2Vzcy5hcmd2LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIE1haW4gQ0xJIGVudHJ5IHBvaW50XG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBDTEkgaW5pdGlhbGl6YXRpb24gb3B0aW9uc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBTdGFuZGFyZCBpbml0aWFsaXphdGlvblxuICogbWFpbigpO1xuICpcbiAqIC8vIE1pbmltYWwgbW9kZVxuICogbWFpbih7IG1pbmltYWxCYW5uZXI6IHRydWUsIHF1aWV0OiB0cnVlIH0pO1xuICpcbiAqIC8vIERlYnVnIG1vZGVcbiAqIG1haW4oeyBkZWJ1ZzogdHJ1ZSwgdmVyYm9zZTogdHJ1ZSB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFpbihvcHRpb25zOiBDbGlPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICAvLyBJbml0aWFsaXplIENMSVxuICAgIGluaXRpYWxpemVDbGkob3B0aW9ucyk7XG5cbiAgICAvLyBQYXJzZSBhcmd1bWVudHMgYW5kIGV4ZWN1dGUgY29tbWFuZFxuICAgIHBhcnNlQXJndW1lbnRzKCk7XG5cbiAgICAvLyBJZiB3ZSByZWFjaCBoZXJlLCBjb21tYW5kIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcbiAgICBwcmludERlYnVnKCdDTEkgZXhlY3V0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBGaW5hbCBjYXRjaC1hbGwgZXJyb3IgaGFuZGxlclxuICAgIGNvbnNvbGUuZXJyb3IoJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgcHJpbnRFcnJvcignRmF0YWwgQ0xJIGVycm9yJywge1xuICAgICAgZXJyb3I6IGVycm9yTWVzc2FnZShlcnJvciksXG4gICAgfSk7XG5cbiAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuR0VORVJBTCwge1xuICAgICAgZGVidWc6IGlzRGVidWdNb2RlKG9wdGlvbnMpLFxuICAgICAgZXhpdDogdHJ1ZSxcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgc3RhZ2U6ICdtYWluJyxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSdW4gQ0xJIGlmIGV4ZWN1dGVkIGRpcmVjdGx5LiBFU00gaGFzIG5vIGByZXF1aXJlLm1haW5gOyBjb21wYXJlIHRoZSBpbnZva2VkXG4gKiBzY3JpcHQgdG8gdGhpcyBtb2R1bGUncyBwYXRoLCByZXNvbHZpbmcgc3ltbGlua3Mgb24gYm90aCBzaWRlcyBzbyB0aGUgYGJpbmBcbiAqIHN5bWxpbmsgKG5vZGVfbW9kdWxlcy8uYmluL3BpcGVsaW5lLW1hbmFnZXIg4oaSIGRpc3QvY2xpLmpzKSBzdGlsbCBtYXRjaGVzLlxuICovXG5jb25zdCBpbnZva2VkU2NyaXB0ID0gcHJvY2Vzcy5hcmd2WzFdO1xuY29uc3QgaXNNYWluTW9kdWxlID0gaW52b2tlZFNjcmlwdCAhPT0gdW5kZWZpbmVkXG4gICYmIHJlYWxwYXRoU3luYyhpbnZva2VkU2NyaXB0KSA9PT0gcmVhbHBhdGhTeW5jKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG5pZiAoaXNNYWluTW9kdWxlKSB7XG4gIC8vIFBhcnNlIENMSSBvcHRpb25zIGZyb20gZW52aXJvbm1lbnQgb3IgY29tbWFuZCBsaW5lXG4gIGNvbnN0IG9wdGlvbnM6IENsaU9wdGlvbnMgPSB7XG4gICAgZGVidWc6IHByb2Nlc3MuZW52LkRFQlVHID09PSAndHJ1ZScsXG4gICAgLy8gYC0tdG9rZW5gIHByaW50cyBhIGJhcmUgdG9rZW4gZm9yIGAkKOKApilgIGNhcHR1cmUsIHNvIHRoZSBiYW5uZXIgYW5kIHRoZVxuICAgIC8vIHN0YXJ0dXAgY2hyb21lIG11c3Qgbm90IHJlYWNoIHN0ZG91dCBlaXRoZXIuIFNjYW5uZWQgZnJvbSBhcmd2IGxpa2VcbiAgICAvLyBgLS1xdWlldGAgaXMsIGJlY2F1c2UgdGhpcyBydW5zIEJFRk9SRSBDb21tYW5kZXIgcGFyc2VzLlxuICAgIHF1aWV0OiBwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tcXVpZXQnKSB8fCBwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tdG9rZW4nKSxcbiAgICB2ZXJib3NlOiBwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tdmVyYm9zZScpLFxuICAgIG5vQ29sb3I6IHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1uby1jb2xvcicpIHx8IHByb2Nlc3MuZW52Lk5PX0NPTE9SID09PSAnMScsXG4gICAgc2VsZlVwZGF0ZTogaXNTZWxmVXBkYXRlKHByb2Nlc3MuYXJndi5zbGljZSgyKSksXG4gIH07XG5cbiAgLy8gRGFpbHkgYmFja2dyb3VuZCBjaGVjazsgcHJpbnRzIFwidXBkYXRlIGF2YWlsYWJsZVwiIHRvIHN0ZGVyciBvbiBleGl0LlxuICBzY2hlZHVsZVVwZGF0ZU5vdGljZSgpO1xuICBtYWluKG9wdGlvbnMpO1xufSJdfQ==
|
|
529
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlcyI6WyIuLi9zcmMvY2xpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFB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QUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7UUFDM0UsT0FBTyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUMzQyxPQUFPLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssR0FBRztRQUM1RSxVQUFVLEVBQUUsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2hELENBQUM7SUFFRix1RUFBdUU7SUFDdkUsb0JBQW9CLEVBQUUsQ0FBQztJQUN2QixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcbi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyByZWFscGF0aFN5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQgeyBlcnJvck1lc3NhZ2UgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyBwcm9ncmFtIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7IGF1ZGl0U3RhY2tzIH0gZnJvbSAnLi9jb21tYW5kcy9hdWRpdC1zdGFja3MuanMnO1xuaW1wb3J0IHsgYXVkaXRUb2tlbnMgfSBmcm9tICcuL2NvbW1hbmRzL2F1ZGl0LXRva2Vucy5qcyc7XG5pbXBvcnQgeyBib290c3RyYXAgfSBmcm9tICcuL2NvbW1hbmRzL2Jvb3RzdHJhcC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVQYXQgfSBmcm9tICcuL2NvbW1hbmRzL2NyZWF0ZS1wYXQuanMnO1xuaW1wb3J0IHsgY3JlYXRlUGlwZWxpbmUgfSBmcm9tICcuL2NvbW1hbmRzL2NyZWF0ZS1waXBlbGluZS5qcyc7XG5pbXBvcnQgeyBkZXBsb3kgfSBmcm9tICcuL2NvbW1hbmRzL2RlcGxveS5qcyc7XG5pbXBvcnQgeyBnZXRQaXBlbGluZSB9IGZyb20gJy4vY29tbWFuZHMvZ2V0LXBpcGVsaW5lLmpzJztcbmltcG9ydCB7IGdldFBsdWdpbiB9IGZyb20gJy4vY29tbWFuZHMvZ2V0LXBsdWdpbi5qcyc7XG5pbXBvcnQgeyBpbnN0YW50aWF0ZVRlbXBsYXRlIH0gZnJvbSAnLi9jb21tYW5kcy9pbnN0YW50aWF0ZS10ZW1wbGF0ZS5qcyc7XG5pbXBvcnQgeyBsaXN0UGlwZWxpbmVzIH0gZnJvbSAnLi9jb21tYW5kcy9saXN0LXBpcGVsaW5lcy5qcyc7XG5pbXBvcnQgeyBsaXN0UGx1Z2lucyB9IGZyb20gJy4vY29tbWFuZHMvbGlzdC1wbHVnaW5zLmpzJztcbmltcG9ydCB7IGxvZ2luIH0gZnJvbSAnLi9jb21tYW5kcy9sb2dpbi5qcyc7XG5pbXBvcnQgeyBsb2dvdXQgfSBmcm9tICcuL2NvbW1hbmRzL2xvZ291dC5qcyc7XG5pbXBvcnQgeyBuZXdQbHVnaW4gfSBmcm9tICcuL2NvbW1hbmRzL25ldy1wbHVnaW4uanMnO1xuaW1wb3J0IHsgb3JnRXhwb3J0IH0gZnJvbSAnLi9jb21tYW5kcy9vcmctZXhwb3J0LmpzJztcbmltcG9ydCB7IGRlbGV0ZVBpcGVsaW5lLCBkZXJlZ2lzdGVyUGlwZWxpbmUgfSBmcm9tICcuL2NvbW1hbmRzL3BpcGVsaW5lLXJlbW92ZS5qcyc7XG5pbXBvcnQgeyBkZXByZWNhdGVQbHVnaW4sIHlhbmtQbHVnaW4gfSBmcm9tICcuL2NvbW1hbmRzL3BsdWdpbi1saWZlY3ljbGUuanMnO1xuaW1wb3J0IHsgcHJvdmlzaW9uIH0gZnJvbSAnLi9jb21tYW5kcy9wcm92aXNpb24uanMnO1xuaW1wb3J0IHsgcHVibGlzaFBsdWdpbiB9IGZyb20gJy4vY29tbWFuZHMvcHVibGlzaC1wbHVnaW4uanMnO1xuaW1wb3J0IHsgcmVkcml2ZUV2ZW50cyB9IGZyb20gJy4vY29tbWFuZHMvcmVkcml2ZS1ldmVudHMuanMnO1xuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tICcuL2NvbW1hbmRzL3JlZ2lzdGVyLmpzJztcbmltcG9ydCB7IHJlcG9ydCB9IGZyb20gJy4vY29tbWFuZHMvcmVwb3J0LmpzJztcbmltcG9ydCB7IHNlY3VyaXR5UmVwb3J0IH0gZnJvbSAnLi9jb21tYW5kcy9zZWN1cml0eS1yZXBvcnQuanMnO1xuaW1wb3J0IHsgc2V0dXBFdmVudHMgfSBmcm9tICcuL2NvbW1hbmRzL3NldHVwLWV2ZW50cy5qcyc7XG5pbXBvcnQgeyBzdGF0dXMgfSBmcm9tICcuL2NvbW1hbmRzL3N0YXR1cy5qcyc7XG5pbXBvcnQgeyBzdG9yZVRva2VuIH0gZnJvbSAnLi9jb21tYW5kcy9zdG9yZS10b2tlbi5qcyc7XG5pbXBvcnQgeyBzeW50aCB9IGZyb20gJy4vY29tbWFuZHMvc3ludGguanMnO1xuaW1wb3J0IHsgdGVzdFBsdWdpbiB9IGZyb20gJy4vY29tbWFuZHMvdGVzdC1wbHVnaW4uanMnO1xuaW1wb3J0IHsgdG9vbGNoYWluIH0gZnJvbSAnLi9jb21tYW5kcy90b29sY2hhaW4uanMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJVcGdyYWRlT3B0aW9uIH0gZnJvbSAnLi9jb21tYW5kcy91cGdyYWRlLmpzJztcbmltcG9ydCB7IHVwbG9hZFBsdWdpbiB9IGZyb20gJy4vY29tbWFuZHMvdXBsb2FkLXBsdWdpbi5qcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZVBsdWdpbiB9IGZyb20gJy4vY29tbWFuZHMvdmFsaWRhdGUtcGx1Z2luLmpzJztcbmltcG9ydCB7IHZhbGlkYXRlVGVtcGxhdGVzQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdmFsaWRhdGUtdGVtcGxhdGVzLmpzJztcbmltcG9ydCB7IHZlcmlmeVBsdWdpbnMgfSBmcm9tICcuL2NvbW1hbmRzL3ZlcmlmeS1wbHVnaW5zLmpzJztcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuL2NvbW1hbmRzL3ZlcnNpb24uanMnO1xuaW1wb3J0IHtcbiAgQVBQX05BTUUsXG4gIEFQUF9ERVNDUklQVElPTixcbiAgQVBQX1ZFUlNJT04sXG4gIEVOVl9WQVJTLFxuICBpc0RlYnVnTW9kZSxcbiAgZ2VuZXJhdGVFeGVjdXRpb25JZCxcbiAgbWVldHNOb2RlVmVyc2lvbkZsb29yLFxuICBOT0RFX1ZFUlNJT05fRkxPT1IsXG59IGZyb20gJy4vY29uZmlnL2NsaS5jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgYmFubmVyLCBtaW5pQmFubmVyIH0gZnJvbSAnLi91dGlscy9iYW5uZXIuanMnO1xuaW1wb3J0IHsgZ2V0QXBpQ29uZmlnIH0gZnJvbSAnLi91dGlscy9jb25maWctbG9hZGVyLmpzJztcbmltcG9ydCB7IGxvYWRTZXNzaW9uIH0gZnJvbSAnLi91dGlscy9jcmVkZW50aWFsLXN0b3JlLmpzJztcbmltcG9ydCB7IEVSUk9SX0NPREVTLCBoYW5kbGVFcnJvciB9IGZyb20gJy4vdXRpbHMvZXJyb3ItaGFuZGxlci5qcyc7XG5pbXBvcnQgeyBwcmludEluZm8sIHByaW50RXJyb3IsIHByaW50V2FybmluZywgcHJpbnREZWJ1ZywgcHJpbnRTZWN0aW9uIH0gZnJvbSAnLi91dGlscy9vdXRwdXQtdXRpbHMuanMnO1xuaW1wb3J0IHsgcHJlZmxpZ2h0Q29tbWFuZFRvb2xzIH0gZnJvbSAnLi91dGlscy9wcmVmbGlnaHQuanMnO1xuaW1wb3J0IHsgc2NoZWR1bGVVcGRhdGVOb3RpY2UgfSBmcm9tICcuL3V0aWxzL3VwZGF0ZS1ub3RpY2UuanMnO1xuXG4vKipcbiAqIENMSSBpbml0aWFsaXphdGlvbiBvcHRpb25zXG4gKi9cbmludGVyZmFjZSBDbGlPcHRpb25zIHtcbiAgLyoqXG4gICAqIFNob3cgYmFubmVyIG9uIHN0YXJ0dXBcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgc2hvd0Jhbm5lcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE1pbmltYWwgYmFubmVyIChubyBBU0NJSSBhcnQpXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBtaW5pbWFsQmFubmVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGVidWcgbW9kZVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgZGVidWc/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBWZXJib3NlIG91dHB1dFxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgdmVyYm9zZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFF1aWV0IG1vZGUgKG1pbmltYWwgb3V0cHV0KVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcXVpZXQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBObyBjb2xvciBvdXRwdXRcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIG5vQ29sb3I/OiBib29sZWFuO1xuICAvKipcbiAgICogYC0tdXBncmFkZWAgLyBgLS11cGdyYWRlLWNoZWNrYDogdGFsa3Mgb25seSB0byB0aGUgbnBtIHJlZ2lzdHJ5LCBuZXZlciB0b1xuICAgKiB0aGUgcGxhdGZvcm0sIHNvIGl0IG11c3Qgd29yayBzaWduZWQgb3V0IGFuZCB3aXRob3V0IHRoZSBzaWduLWluIHdhcm5pbmcuXG4gICAqL1xuICBzZWxmVXBkYXRlPzogYm9vbGVhbjtcbn1cblxuLyoqIFdoZXRoZXIgYXJndiBhc2tzIGZvciBhIHNlbGYtdXBkYXRlIChgLS11cGdyYWRlYCAvIGAtLXVwZ3JhZGUtY2hlY2tgLCB3aXRoIG9yIHdpdGhvdXQgYSB2ZXJzaW9uKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NlbGZVcGRhdGUoYXJndjogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIGFyZ3Yuc29tZSgoYSkgPT4gYSA9PT0gJy0tdXBncmFkZScgfHwgYSA9PT0gJy0tdXBncmFkZS1jaGVjaycgfHwgYS5zdGFydHNXaXRoKCctLXVwZ3JhZGU9JykgfHwgYS5zdGFydHNXaXRoKCctLXVwZ3JhZGUtY2hlY2s9JykpO1xufVxuXG4vKipcbiAqIENoZWNrIGVudmlyb25tZW50IGFuZCBkaXNwbGF5IHdhcm5pbmdzXG4gKi9cbmZ1bmN0aW9uIGNoZWNrRW52aXJvbm1lbnQoeyBzaWduSW5SZWxldmFudCA9IHRydWUgfTogeyBzaWduSW5SZWxldmFudD86IGJvb2xlYW4gfSA9IHt9KTogdm9pZCB7XG4gIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIE5vdCBzaWduZWQgaW4gQVQgQUxMOiBuZWl0aGVyIGFuIGV4cGxpY2l0IHRva2VuIG5vciBhIHN0b3JlZCBicm93c2VyXG4gIC8vIHNpZ24taW4uIEVpdGhlciBhbG9uZSBpcyBlbm91Z2gsIHNvIHRoZSB3YXJuaW5nIG9ubHkgZmlyZXMgd2hlbiBib3RoIGFyZVxuICAvLyBtaXNzaW5nIOKAlCBvdGhlcndpc2UgYGF1dGggbG9naW5gIHVzZXJzIHdvdWxkIGJlIG5hZ2dlZCBvbiBldmVyeSBjb21tYW5kLlxuICBpZiAoc2lnbkluUmVsZXZhbnQgJiYgIXByb2Nlc3MuZW52W0VOVl9WQVJTLlBMQVRGT1JNX1RPS0VOXSAmJiAhbG9hZFNlc3Npb24oZ2V0QXBpQ29uZmlnKCkuYXBpLmJhc2VVcmwpKSB7XG4gICAgd2FybmluZ3MucHVzaCgnTm90IHNpZ25lZCBpbiAobm8gUExBVEZPUk1fVE9LRU4sIG5vIHN0b3JlZCBzZXNzaW9uKScpO1xuICAgIHdhcm5pbmdzLnB1c2goJ1J1biBcInBpcGVsaW5lLW1hbmFnZXIgYXV0aCBsb2dpblwiIOKAlCBBUEkgb3BlcmF0aW9ucyB3aWxsIGZhaWwgdW50aWwgeW91IGRvJyk7XG4gIH1cblxuICAvLyBDaGVjayBOb2RlIHZlcnNpb25cbiAgY29uc3Qgbm9kZVZlcnNpb24gPSBwcm9jZXNzLnZlcnNpb247XG4gIGlmICghbWVldHNOb2RlVmVyc2lvbkZsb29yKG5vZGVWZXJzaW9uKSkge1xuICAgIHdhcm5pbmdzLnB1c2goYE5vZGUuanMgJHtub2RlVmVyc2lvbn0gZGV0ZWN0ZWQgLSB2ZXJzaW9uICR7Tk9ERV9WRVJTSU9OX0ZMT09SfSsgcmVxdWlyZWQgKHNlZSBwYWNrYWdlLmpzb24gZW5naW5lcylgKTtcbiAgfVxuXG4gIC8vIERpc3BsYXkgd2FybmluZ3NcbiAgaWYgKHdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICBwcmludFNlY3Rpb24oJ0Vudmlyb25tZW50IFdhcm5pbmdzJyk7XG4gICAgd2FybmluZ3MuZm9yRWFjaCh3YXJuaW5nID0+IHtcbiAgICAgIHByaW50V2FybmluZyh3YXJuaW5nKTtcbiAgICB9KTtcbiAgICBjb25zb2xlLmxvZygnJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBEaXNwbGF5IHN0YXJ0dXAgaW5mb3JtYXRpb25cbiAqL1xuZnVuY3Rpb24gZGlzcGxheVN0YXJ0dXBJbmZvKG9wdGlvbnM6IENsaU9wdGlvbnMpOiB2b2lkIHtcbiAgaWYgKG9wdGlvbnMucXVpZXQpIHJldHVybjtcblxuICBjb25zdCBleGVjdXRpb25JZCA9IGdlbmVyYXRlRXhlY3V0aW9uSWQoKTtcblxuICBpZiAob3B0aW9ucy5kZWJ1ZyB8fCBvcHRpb25zLnZlcmJvc2UpIHtcbiAgICBwcmludERlYnVnKCdDTEkgQ29uZmlndXJhdGlvbicsIHtcbiAgICAgIG5hbWU6IEFQUF9OQU1FLFxuICAgICAgdmVyc2lvbjogQVBQX1ZFUlNJT04sXG4gICAgICBleGVjdXRpb25JZCxcbiAgICAgIG5vZGU6IHByb2Nlc3MudmVyc2lvbixcbiAgICAgIHBsYXRmb3JtOiBwcm9jZXNzLnBsYXRmb3JtLFxuICAgICAgYXJjaDogcHJvY2Vzcy5hcmNoLFxuICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgICAgZW52OiB7XG4gICAgICAgIGRlYnVnOiBwcm9jZXNzLmVudi5ERUJVRyxcbiAgICAgICAgdG9rZW46IHByb2Nlc3MuZW52W0VOVl9WQVJTLlBMQVRGT1JNX1RPS0VOXSA/ICdzZXQnOiAnbm90IHNldCcsXG4gICAgICAgIHVybDogcHJvY2Vzcy5lbnZbRU5WX1ZBUlMuUExBVEZPUk1fQkFTRV9VUkxdIHx8ICdkZWZhdWx0JyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcHJpbnREZWJ1ZygnU3RhcnRpbmcgQ0xJJywge1xuICAgICAgdmVyc2lvbjogQVBQX1ZFUlNJT04sXG4gICAgICBleGVjdXRpb25JZCxcbiAgICB9KTtcbiAgfVxufVxuXG4vKiogVG9wLWxldmVsIGAtLWhlbHBgIGVwaWxvZ3VlOiBjb21tYW5kIGdyb3VwcywgYXV0aCwgZW52IHZhcnMsIGV4YW1wbGVzLCBleGl0IGNvZGVzLiAqL1xuY29uc3QgSEVMUF9URVhUID0gYFxuQ29tbWFuZCBncm91cHM6XG4gIGF1dGggICAgICBBdXRoZW50aWNhdGUgYW5kIG1hbmFnZSBjcmVkZW50aWFscyAobG9naW4sIGxvZ291dCwgcGF0KVxuICBwaXBlbGluZSAgQ3JlYXRlLCBpbnNwZWN0LCBhbmQgZGVwbG95IHBpcGVsaW5lcyAoY3JlYXRlLCBsaXN0LCBnZXQsIHJlZ2lzdGVyLCBkZXJlZ2lzdGVyLCBkZWxldGUsIHN5bnRoLCBkZXBsb3kpXG4gIHBsdWdpbiAgICBBdXRob3IsIHZhbGlkYXRlLCBhbmQgcHVibGlzaCBwbHVnaW5zIChuZXcsIHZhbGlkYXRlLCB0ZXN0LCBwdWJsaXNoLCB1cGxvYWQsIGdldCwgbGlzdCwgZGVwcmVjYXRlLCB5YW5rLCB2ZXJpZnkpXG4gIHRlbXBsYXRlICBJbnN0YW50aWF0ZSBnb2xkZW4tcGF0aCBwaXBlbGluZSB0ZW1wbGF0ZXMgYW5kIHZhbGlkYXRlIHt7IC4uLiB9fSBzeW50YXggKGluc3RhbnRpYXRlLCB2YWxpZGF0ZSlcbiAgaW5mcmEgICAgIFNldCB1cCBhbmQgb3BlcmF0ZSBwbGF0Zm9ybSBpbmZyYXN0cnVjdHVyZSAoYm9vdHN0cmFwLCBzZXR1cC1ldmVudHMsIHJlZHJpdmUtZXZlbnRzLCBzdG9yZS10b2tlbiwgcHJvdmlzaW9uKVxuICBhdWRpdCAgICAgT3BlcmF0b3IgYXVkaXRzLCBjcm9uLWZyaWVuZGx5ICh0b2tlbnMsIHN0YWNrcylcbiAgb3JnICAgICAgIE9yZ2FuaXphdGlvbiBkYXRhIG9wZXJhdGlvbnMgKGV4cG9ydClcbiAgc2VjdXJpdHktcmVwb3J0ICBVcGxvYWQgU0FSSUYgLyB0cml2eSAvIGdyeXBlIHJlcG9ydHMgcHJvZHVjZWQgaW5zaWRlIGEgcGlwZWxpbmUgKHVwbG9hZClcbiAgcmVwb3J0ICAgIFN0YWtlaG9sZGVyIHJlcG9ydHMgKGxpc3QsIGNyZWF0ZSwgcnVuLCBwdWJsaXNoLCBsaW5rLCBwZGYsIHRyYW5zZmVyKVxuICB0b29sY2hhaW4gVGhlIHBpcGVsaW5lIHRvb2xjaGFpbiByZWxlYXNlIChleHBvcnQpXG4gIHN0YXR1cyAvIHZlcnNpb24gLyBjb21wbGV0aW9uc1xuXG5BdXRoZW50aWNhdGlvbjpcbiAgUnVuICcke0FQUF9OQU1FfSBhdXRoIGxvZ2luJyBvbmNlIHBlciBwbGF0Zm9ybSDigJQgaXQgc2lnbnMgeW91IGluIHRocm91Z2ggeW91clxuICBicm93c2VyIChubyBwYXNzd29yZCBvbiB0aGUgY29tbWFuZCBsaW5lKSBhbmQgc3RvcmVzIHRoZSBzZXNzaW9uIHVuZGVyXG4gIH4vLnBpcGVsaW5lLW1hbmFnZXIvY3JlZGVudGlhbHMuanNvbi4gRm9yIENJLCBjcmVhdGUgYW4gYWNjZXNzIGtleSB3aXRoXG4gICcke0FQUF9OQU1FfSBhdXRoIHBhdCcgYW5kIGV4cG9ydCBpdCBhcyAke0VOVl9WQVJTLlBMQVRGT1JNX1RPS0VOfSwgd2hpY2ggYWx3YXlzIHdpbnMuXG5cbkVudmlyb25tZW50IFZhcmlhYmxlczpcbiAgJHtFTlZfVkFSUy5QTEFURk9STV9UT0tFTn0gQWNjZXNzIGtleSBvciB0b2tlbiAob3ZlcnJpZGVzIHRoZSBzdG9yZWQgc2Vzc2lvbilcbiAgJHtFTlZfVkFSUy5QTEFURk9STV9CQVNFX1VSTH0gQVBJIGJhc2UgVVJMIChvcHRpb25hbClcbiAgJHtFTlZfVkFSUy5DTElfQ09ORklHX1BBVEh9IENvbmZpZyBmaWxlIHBhdGggKG9wdGlvbmFsKVxuICAke0VOVl9WQVJTLlRMU19SRUpFQ1RfVU5BVVRIT1JJWkVEfSBEaXNhYmxlIFNTTCB2ZXJpZmljYXRpb24gaWYgJzAnXG4gIFBMQVRGT1JNX0NBX0JVTkRMRSAgUEVNIG9mIGEgcHJpdmF0ZSBDQSB0byB0cnVzdCBmb3IgdGhlIHBsYXRmb3JtICh2ZXJpZmllZCwgbm90IHNraXBwZWQpXG4gICR7RU5WX1ZBUlMuREVCVUd9IEVuYWJsZSBkZWJ1ZyBtb2RlIGlmICd0cnVlJ1xuXG5FeGFtcGxlczpcbiAgJCAke0FQUF9OQU1FfSB2ZXJzaW9uXG4gICQgJHtBUFBfTkFNRX0gLS11cGdyYWRlICAgICAgICAgICAgKC0tdXBncmFkZSA8dmVyc2lvbj4gZm9yIGEgc3BlY2lmaWMgb25lLCAtLXVwZ3JhZGUtY2hlY2sgdG8gb25seSBsb29rKVxuICAkICR7QVBQX05BTUV9IGF1dGggbG9naW5cbiAgJCAke0FQUF9OQU1FfSBwaXBlbGluZSBsaXN0IC0tcHJvamVjdCBteS1hcHBcbiAgJCAke0FQUF9OQU1FfSBwaXBlbGluZSBnZXQgLS1pZCBwaXBlLTEyMyAtLWZvcm1hdCBqc29uXG4gICQgJHtBUFBfTkFNRX0gcGlwZWxpbmUgY3JlYXRlIC1mIHByb3BzLmpzb24gLS1kZXBsb3kgLS1wcm9maWxlIHByb2R1Y3Rpb25cbiAgJCAke0FQUF9OQU1FfSB0ZW1wbGF0ZSBpbnN0YW50aWF0ZSAtbiByZWFjdC1qYXZhc2NyaXB0IC1wIHJlYWN0IC1vIGFjbWUgLS1pbnB1dCBvcmdJZD08dXVpZD4gLS1vdXRwdXQgcHJvcHMuanNvblxuICAkICR7QVBQX05BTUV9IHBsdWdpbiB1cGxvYWQgLS1maWxlIHBsdWdpbi56aXBcbiAgJCAke0FQUF9OQU1FfSBpbmZyYSBzdG9yZS10b2tlbiAtLWRheXMgMzAgLS1yZWdpb24gdXMtZWFzdC0xXG4gICQgJHtBUFBfTkFNRX0gaW5mcmEgYm9vdHN0cmFwIC0tYWNjb3VudCAxMjM0NTY3ODkwMTIgLS1yZWdpb24gdXMtZWFzdC0xXG4gICQgJHtBUFBfTkFNRX0gcGlwZWxpbmUgZGVwbG95IC0taWQgcGlwZS0xMjMgLS1wcm9maWxlIHByb2R1Y3Rpb25cblxuRXhpdCBjb2RlcyAoMCA9IHN1Y2Nlc3M7IGZhaWx1cmVzIHVzZSBhIHN0YW5kYXJkIGNvZGUgYnkgZXJyb3IgdHlwZSk6XG4gIDEgZ2VuZXJhbCDCtyAyIHZhbGlkYXRpb24gwrcgMyBhcGktcmVxdWVzdCDCtyA0IGF1dGggwrcgNSBmb3JiaWRkZW5cbiAgNiBub3QtZm91bmQgwrcgNyBuZXR3b3JrIMK3IDggY29uZmlnIMK3IDkgZmlsZS1zeXN0ZW0gwrcgMTAgdGltZW91dFxuXG5SdW4gJyR7QVBQX05BTUV9IDxncm91cD4gLS1oZWxwJyB0byBzZWUgYSBncm91cCdzIHN1YmNvbW1hbmRzLlxuYDtcblxuLyoqXG4gKiBUYXNrIG5hbWVzcGFjZXMg4oCUIGNvbW1hbmRzIGFyZSBncm91cGVkIGJ5IHRoZSBqb2IgdGhlIHVzZXIgaXMgZG9pbmcsIG5vdCBieVxuICogaW1wbGVtZW50YXRpb24uIEVhY2ggcGFyZW50IGlzIGEgc3ViY29tbWFuZCBjb250YWluZXI7IHRoZSBsZWFmIHZlcmIgbGl2ZXMgaW5cbiAqIHRoZSBjb21tYW5kIGZpbGUgKGUuZy4gYC5jb21tYW5kKCdsaXN0JylgKSwgc28gYHBpcGVsaW5lIGxpc3RgIHJlYWRzIGFzIGEgdGFzay5cbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJUYXNrTmFtZXNwYWNlcygpOiB2b2lkIHtcbiAgcHJpbnREZWJ1ZygnUmVnaXN0ZXJpbmcgdGFzayBuYW1lc3BhY2VzJyk7XG5cbiAgLy8gYXV0aCDigJQgYXV0aGVudGljYXRlIGFuZCBtYW5hZ2UgY3JlZGVudGlhbHNcbiAgY29uc3QgYXV0aCA9IHByb2dyYW0uY29tbWFuZCgnYXV0aCcpLmRlc2NyaXB0aW9uKCdBdXRoZW50aWNhdGUgYW5kIG1hbmFnZSBjcmVkZW50aWFscycpO1xuICBsb2dpbihhdXRoKTsgLy8gYXV0aCBsb2dpbiDigJQgYnJvd3NlciAoZGV2aWNlLWF1dGhvcml6YXRpb24pIHNpZ24taW4sIHN0b3JlZCBsb2NhbGx5XG4gIGxvZ291dChhdXRoKTsgLy8gYXV0aCBsb2dvdXQg4oCUIHJldm9rZSB0aGUgc3RvcmVkIHNlc3Npb24gb24gdGhlIHBsYXRmb3JtIGFuZCBkZWxldGUgaXQgbG9jYWxseVxuICBjcmVhdGVQYXQoYXV0aCk7IC8vIGF1dGggcGF0IOKAlCBjcmVhdGUgYSBuYW1lZCBhY2Nlc3Mga2V5IChkZXZpY2Ugc2lnbi1pbiArIGJyb3dzZXIgc3RlcC11cClcblxuICAvLyBwaXBlbGluZSDigJQgY3JlYXRlLCBpbnNwZWN0LCBhbmQgZGVwbG95IHBpcGVsaW5lc1xuICBjb25zdCBwaXBlbGluZSA9IHByb2dyYW0uY29tbWFuZCgncGlwZWxpbmUnKS5kZXNjcmlwdGlvbignQ3JlYXRlLCBpbnNwZWN0LCBhbmQgZGVwbG95IHBpcGVsaW5lcycpO1xuICBjcmVhdGVQaXBlbGluZShwaXBlbGluZSk7IC8vIHBpcGVsaW5lIGNyZWF0ZVxuICBsaXN0UGlwZWxpbmVzKHBpcGVsaW5lKTsgLy8gcGlwZWxpbmUgbGlzdFxuICBnZXRQaXBlbGluZShwaXBlbGluZSk7IC8vIHBpcGVsaW5lIGdldFxuICByZWdpc3RlcihwaXBlbGluZSk7IC8vIHBpcGVsaW5lIHJlZ2lzdGVyIOKAlCByZS1yZWdpc3RlciBhIGRlcGxveWVkIEFSTiArIGRyYWluIHBlbmRpbmcgaW50ZW50c1xuICBkZXJlZ2lzdGVyUGlwZWxpbmUocGlwZWxpbmUpOyAvLyBwaXBlbGluZSBkZXJlZ2lzdGVyIOKAlCByZW1vdmUgYSByZWdpc3RyeSByb3cgKGF1ZGl0IHN0YWNrcycgbWlzc2luZy1zdGFjayBmaXgpXG4gIGRlbGV0ZVBpcGVsaW5lKHBpcGVsaW5lKTsgLy8gcGlwZWxpbmUgZGVsZXRlIOKAlCBkZWxldGUgYSBwaXBlbGluZSBjb25maWd1cmF0aW9uXG4gIHN5bnRoKHBpcGVsaW5lKTsgLy8gcGlwZWxpbmUgc3ludGgg4oCUIENESyBzeW50aGVzaXMgZnJvbSBwaXBlbGluZSBjb25maWdcbiAgZGVwbG95KHBpcGVsaW5lKTsgLy8gcGlwZWxpbmUgZGVwbG95IOKAlCBDREsgZGVwbG95ICgtLWFwcCBwcmludHMgYm9pbGVycGxhdGUgcGF0aClcblxuICAvLyBwbHVnaW4g4oCUIGF1dGhvciwgdmFsaWRhdGUsIGFuZCBwdWJsaXNoIHBsdWdpbnNcbiAgY29uc3QgcGx1Z2luID0gcHJvZ3JhbS5jb21tYW5kKCdwbHVnaW4nKS5kZXNjcmlwdGlvbignQXV0aG9yLCB2YWxpZGF0ZSwgYW5kIHB1Ymxpc2ggcGx1Z2lucycpO1xuICBuZXdQbHVnaW4ocGx1Z2luKTsgLy8gcGx1Z2luIG5ldyDigJQgc2NhZmZvbGQgYSBsb2NhbCBwbHVnaW4gZGlyZWN0b3J5XG4gIHZhbGlkYXRlUGx1Z2luKHBsdWdpbik7IC8vIHBsdWdpbiB2YWxpZGF0ZSDigJQgdGhlIHNlcnZlcidzIHNjaGVtYXMgKyB0aGUgY2F0YWxvZy1tZXRhZGF0YSByZXBvcnRcbiAgdGVzdFBsdWdpbihwbHVnaW4pOyAvLyBwbHVnaW4gdGVzdCDigJQgcnVuIGluc3RhbGwgKyBidWlsZCBjb21tYW5kcyBsb2NhbGx5IGluIHRoZSBpbWFnZVxuICBwdWJsaXNoUGx1Z2luKHBsdWdpbik7IC8vIHBsdWdpbiBwdWJsaXNoIOKAlCBwcmUtZmxpZ2h0LCBzY2FuIHByZXZpZXcsIGFjY2VwdC1vci1lZGl0LCBwdWJsaXNoIHJlcXVlc3RcbiAgdXBsb2FkUGx1Z2luKHBsdWdpbik7IC8vIHBsdWdpbiB1cGxvYWQg4oCUIHVwbG9hZCBhbmQgZGVwbG95XG4gIGdldFBsdWdpbihwbHVnaW4pOyAvLyBwbHVnaW4gZ2V0XG4gIGxpc3RQbHVnaW5zKHBsdWdpbik7IC8vIHBsdWdpbiBsaXN0XG4gIGRlcHJlY2F0ZVBsdWdpbihwbHVnaW4pOyAvLyBwbHVnaW4gZGVwcmVjYXRlIOKAlCBkZXByZWNhdGUgKG9yIC0tdW5kbykgYSB2ZXJzaW9uXG4gIHlhbmtQbHVnaW4ocGx1Z2luKTsgLy8gcGx1Z2luIHlhbmsg4oCUIHN0b3AgYSB2ZXJzaW9uIHJlc29sdmluZyBmb3IgbmV3IHN5bnRoc1xuICB2ZXJpZnlQbHVnaW5zKHBsdWdpbik7IC8vIHBsdWdpbiB2ZXJpZnkg4oCUIHJ1bi10aW1lIGNoZWNrIG9mIGEgcGlwZWxpbmUncyBwaW5uZWQgcGx1Z2luIGltYWdlc1xuXG4gIC8vIHRlbXBsYXRlIOKAlCBpbnN0YW50aWF0ZSBnb2xkZW4tcGF0aCBwaXBlbGluZSB0ZW1wbGF0ZXMsIHZhbGlkYXRlIHt7IC4uLiB9fSBzeW50YXhcbiAgY29uc3QgdGVtcGxhdGUgPSBwcm9ncmFtLmNvbW1hbmQoJ3RlbXBsYXRlJykuZGVzY3JpcHRpb24oJ0luc3RhbnRpYXRlIHBpcGVsaW5lIHRlbXBsYXRlcyBhbmQgdmFsaWRhdGUge3sgLi4uIH19IHRlbXBsYXRlIHN5bnRheCcpO1xuICBpbnN0YW50aWF0ZVRlbXBsYXRlKHRlbXBsYXRlKTsgLy8gdGVtcGxhdGUgaW5zdGFudGlhdGUg4oCUIHJlbmRlciBhIHRlbXBsYXRlIGludG8gcGlwZWxpbmUgcHJvcHNcbiAgdmFsaWRhdGVUZW1wbGF0ZXNDb21tYW5kKHRlbXBsYXRlKTsgLy8gdGVtcGxhdGUgdmFsaWRhdGVcblxuICAvLyBpbmZyYSDigJQgc2V0IHVwIGFuZCBvcGVyYXRlIHBsYXRmb3JtIGluZnJhc3RydWN0dXJlXG4gIGNvbnN0IGluZnJhID0gcHJvZ3JhbS5jb21tYW5kKCdpbmZyYScpLmRlc2NyaXB0aW9uKCdTZXQgdXAgYW5kIG9wZXJhdGUgcGxhdGZvcm0gaW5mcmFzdHJ1Y3R1cmUnKTtcbiAgYm9vdHN0cmFwKGluZnJhKTsgLy8gaW5mcmEgYm9vdHN0cmFwIOKAlCBDREsgdG9vbGtpdCBzdGFja1xuICBzZXR1cEV2ZW50cyhpbmZyYSk7IC8vIGluZnJhIHNldHVwLWV2ZW50cyDigJQgRXZlbnRCcmlkZ2UgZXZlbnQgaW5nZXN0aW9uXG4gIHJlZHJpdmVFdmVudHMoaW5mcmEpOyAvLyBpbmZyYSByZWRyaXZlLWV2ZW50cyDigJQgbWFudWFsIERMUSDihpIgcXVldWUgcmVkcml2ZSBmYWxsYmFja1xuICBzdG9yZVRva2VuKGluZnJhKTsgLy8gaW5mcmEgc3RvcmUtdG9rZW4g4oCUIEpXVCB0b2tlbiBpbiBTZWNyZXRzIE1hbmFnZXIgZm9yIENES1xuICBwcm92aXNpb24oaW5mcmEpOyAvLyBpbmZyYSBwcm92aXNpb24g4oCUIEFJLWFzc2lzdGVkIGRlcGxveS90ZWFyZG93biBvZiB0aGUgcGxhdGZvcm1cblxuICAvLyBhdWRpdCDigJQgb3BlcmF0b3IgYXVkaXRzIChjcm9uLWZyaWVuZGx5OiBleGl0IDEgb24gZmluZGluZ3MpXG4gIGNvbnN0IGF1ZGl0ID0gcHJvZ3JhbS5jb21tYW5kKCdhdWRpdCcpLmRlc2NyaXB0aW9uKCdPcGVyYXRvciBhdWRpdHMgKGNyb24tZnJpZW5kbHk6IGV4aXQgMSBvbiBmaW5kaW5ncyknKTtcbiAgYXVkaXRUb2tlbnMoYXVkaXQpOyAvLyBhdWRpdCB0b2tlbnMg4oCUIGV4cGlyaW5nIHBsYXRmb3JtIHRva2VucyBpbiBTZWNyZXRzIE1hbmFnZXJcbiAgYXVkaXRTdGFja3MoYXVkaXQpOyAvLyBhdWRpdCBzdGFja3Mg4oCUIENGTiBzdGFja3MgdnMgcGlwZWxpbmVfcmVnaXN0cnkgZHJpZnRcblxuICAvLyB0b29sY2hhaW4g4oCUIHRoZSBwaXBlbGluZSB0b29sY2hhaW4gcmVsZWFzZSAocGlwZWxpbmUtYm9vdHN0cmFwICsgY2RrLXN5bnRoKVxuICB0b29sY2hhaW4ocHJvZ3JhbSk7IC8vIHRvb2xjaGFpbiBleHBvcnQg4oCUIHRoZSByZXNvbHZlZCByZWxlYXNlIGFzIEpTT04sIGZvciBkZXBsb3kgLS1sb2NhbC1zcGVjXG5cbiAgLy8gb3JnIOKAlCBvcmdhbml6YXRpb24gZGF0YSBvcGVyYXRpb25zXG4gIGNvbnN0IG9yZyA9IHByb2dyYW0uY29tbWFuZCgnb3JnJykuZGVzY3JpcHRpb24oJ09yZ2FuaXphdGlvbiBkYXRhIG9wZXJhdGlvbnMnKTtcbiAgb3JnRXhwb3J0KG9yZyk7IC8vIG9yZyBleHBvcnQg4oCUIEdEUFIgcG9ydGFiaWxpdHkgZXhwb3J0XG5cbiAgLy8gcmVwb3J0IOKAlCB0aGUgc3Rha2Vob2xkZXItcmVwb3J0IGFkZC1vbi4gUmVnaXN0ZXJlZCBhcyBpdHMgT1dOIG5hbWVzcGFjZSByYXRoZXIgdGhhblxuICAvLyB1bmRlciBgb3JnYCwgYmVjYXVzZSBpdHMgdmVyYnMgYXJlIGEgbGVhZCdzIHdvcmtmbG93IChjb21wb3NlLCBwdWJsaXNoLCBzaGFyZSksIG5vdCBhblxuICAvLyBvcmdhbml6YXRpb24tZGF0YSBvcGVyYXRpb24uIFRoZSB0d28gam9icyB0aGUgZGFzaGJvYXJkIGlzIHRoZSB3cm9uZyBzaGFwZSBmb3IgYXJlXG4gIC8vIGJhY2tmaWxsaW5nIGEgcnVuIG9mIHBhc3QgcGVyaW9kcyBhbmQgZHJpdmluZyBhIHB1Ymxpc2ggZnJvbSBhbm90aGVyIHNjaGVkdWxlci5cbiAgcmVwb3J0KHByb2dyYW0pO1xuXG4gIC8vIHNlY3VyaXR5LXJlcG9ydCDigJQgdXBsb2FkIFNBUklGIC8gdHJpdnkgLyBncnlwZSByZXBvcnRzIHByb2R1Y2VkIGluc2lkZSBhIHBpcGVsaW5lXG4gIHNlY3VyaXR5UmVwb3J0KHByb2dyYW0pO1xufVxuXG4vKiogUHJpbnQgc2hlbGwgY29tcGxldGlvbnMgZm9yIGBzaGVsbGAgKGJhc2gsIHpzaCBvciBmaXNoKS4gKi9cbmZ1bmN0aW9uIHByaW50Q29tcGxldGlvbnMoc2hlbGw6IHN0cmluZyk6IHZvaWQge1xuICAvLyBXYWxrIGNvbW1hbmRlcidzIHJlZ2lzdGVyZWQgdHJlZSBzbyBjb21wbGV0aW9ucyBuZXZlciBkcmlmdCBmcm9tIHRoZSBhY3R1YWxcbiAgLy8gc3VyZmFjZS4gYHRvcExldmVsYCBpcyB0aGUgZmlyc3Qtd29yZCBzZXQgKG5hbWVzcGFjZXMgKyBtZXRhIGNvbW1hbmRzKTtcbiAgLy8gYHN1YnNgIG1hcHMgZWFjaCBuYW1lc3BhY2UgdG8gaXRzIGxlYWYgdmVyYnMgZm9yIHNlY29uZC13b3JkIGNvbXBsZXRpb24uXG4gIGNvbnN0IHRvcExldmVsID0gcHJvZ3JhbS5jb21tYW5kcy5tYXAoYyA9PiBjLm5hbWUoKSkuc29ydCgpO1xuICBjb25zdCBzdWJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcbiAgZm9yIChjb25zdCBjIG9mIHByb2dyYW0uY29tbWFuZHMpIHtcbiAgICBpZiAoYy5jb21tYW5kcy5sZW5ndGggPiAwKSBzdWJzW2MubmFtZSgpXSA9IGMuY29tbWFuZHMubWFwKHMgPT4gcy5uYW1lKCkpLnNvcnQoKTtcbiAgfVxuICBjb25zdCB0b3BMZXZlbFN0ciA9IHRvcExldmVsLmpvaW4oJyAnKTtcbiAgc3dpdGNoIChzaGVsbCkge1xuICAgIGNhc2UgJ2Jhc2gnOiB7XG4gICAgICAvLyBUd28tbGV2ZWw6IGNvbXBsZXRlIHRoZSBncm91cCBhdCB3b3JkIDEsIGl0cyBzdWJjb21tYW5kcyBhdCB3b3JkIDIuXG4gICAgICBjb25zdCBjYXNlcyA9IE9iamVjdC5lbnRyaWVzKHN1YnMpXG4gICAgICAgIC5tYXAoKFtucywgbGVhdmVzXSkgPT4gYCAgICAgICR7bnN9KSBDT01QUkVQTFk9KCQoY29tcGdlbiAtVyBcIiR7bGVhdmVzLmpvaW4oJyAnKX1cIiAtLSBcIlxcJHtjdXJ9XCIpKTs7YClcbiAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgICAgY29uc29sZS5sb2coYCMgcGlwZWxpbmUtbWFuYWdlciBiYXNoIGNvbXBsZXRpb25zXG5fcGlwZWxpbmVfbWFuYWdlcl9jb21wbGV0aW9ucygpIHtcbiAgbG9jYWwgY3VyPVwiXFwke0NPTVBfV09SRFNbQ09NUF9DV09SRF19XCJcbiAgaWYgWyBcIlxcJHtDT01QX0NXT1JEfVwiIC1lcSAxIF07IHRoZW5cbkNPTVBSRVBMWT0oJChjb21wZ2VuIC1XIFwiJHt0b3BMZXZlbFN0cn1cIiAtLSBcIlxcJHtjdXJ9XCIpKVxucmV0dXJuXG4gIGZpXG4gIGNhc2UgXCJcXCR7Q09NUF9XT1JEU1sxXX1cIiBpblxuJHtjYXNlc31cbiAgZXNhY1xufVxuY29tcGxldGUgLUYgX3BpcGVsaW5lX21hbmFnZXJfY29tcGxldGlvbnMgcGlwZWxpbmUtbWFuYWdlcmApO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3pzaCc6IHtcbiAgICAgIGNvbnN0IGNhc2VzID0gT2JqZWN0LmVudHJpZXMoc3VicylcbiAgICAgICAgLm1hcCgoW25zLCBsZWF2ZXNdKSA9PiBgICAgICAgICAke25zfSkgX3ZhbHVlcyAnc3ViY29tbWFuZCcgJHtsZWF2ZXMuam9pbignICcpfTs7YClcbiAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgICAgY29uc29sZS5sb2coYCMgcGlwZWxpbmUtbWFuYWdlciB6c2ggY29tcGxldGlvbnNcbl9waXBlbGluZV9tYW5hZ2VyKCkge1xuICBpZiAoKCBDVVJSRU5UID09IDIgKSk7IHRoZW5cbl92YWx1ZXMgJ2NvbW1hbmQnICR7dG9wTGV2ZWwuam9pbignICcpfVxucmV0dXJuXG4gIGZpXG4gIGNhc2UgXCJcXCR7d29yZHNbMl19XCIgaW5cbiR7Y2FzZXN9XG4gIGVzYWNcbn1cbmNvbXBkZWYgX3BpcGVsaW5lX21hbmFnZXIgcGlwZWxpbmUtbWFuYWdlcmApO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ2Zpc2gnOiB7XG4gICAgICBjb25zdCBsaW5lcyA9IFtcbiAgICAgICAgYGNvbXBsZXRlIC1jIHBpcGVsaW5lLW1hbmFnZXIgLW4gJ19fZmlzaF91c2Vfc3ViY29tbWFuZCcgLWEgJyR7dG9wTGV2ZWxTdHJ9J2AsXG4gICAgICAgIC4uLk9iamVjdC5lbnRyaWVzKHN1YnMpLm1hcCgoW25zLCBsZWF2ZXNdKSA9PlxuICAgICAgICAgIGBjb21wbGV0ZSAtYyBwaXBlbGluZS1tYW5hZ2VyIC1uICdfX2Zpc2hfc2Vlbl9zdWJjb21tYW5kX2Zyb20gJHtuc30nIC1hICcke2xlYXZlcy5qb2luKCcgJyl9J2ApLFxuICAgICAgXTtcbiAgICAgIGNvbnNvbGUubG9nKGAjIHBpcGVsaW5lLW1hbmFnZXIgZmlzaCBjb21wbGV0aW9uc1xcbiR7bGluZXMuam9pbignXFxuJyl9YCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFVua25vd24gc2hlbGw6ICR7c2hlbGx9LiBVc2UgYmFzaCwgenNoLCBvciBmaXNoLmApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYWxsIENMSSBjb21tYW5kc1xuICovXG5mdW5jdGlvbiByZWdpc3RlckNvbW1hbmRzKCk6IHZvaWQge1xuICBwcmludERlYnVnKCdSZWdpc3RlcmluZyBjb21tYW5kcycpO1xuXG4gIC8vIENvbmZpZ3VyZSBwcm9ncmFtXG4gIHByb2dyYW1cbiAgICAubmFtZShBUFBfTkFNRSlcbiAgICAuZGVzY3JpcHRpb24oQVBQX0RFU0NSSVBUSU9OKVxuICAgIC52ZXJzaW9uKEFQUF9WRVJTSU9OLCAnLXYsIC0tdmVyc2lvbicsICdTaG93IENMSSB2ZXJzaW9uJylcbiAgICAub3B0aW9uKCctLWRlYnVnJywgJ0VuYWJsZSBkZWJ1ZyBvdXRwdXQgd2l0aCBzdGFjayB0cmFjZXMnLCBmYWxzZSlcbiAgICAub3B0aW9uKCctLXZlcmJvc2UnLCAnU2hvdyBkZXRhaWxlZCBpbmZvcm1hdGlvbicsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tcXVpZXQnLCAnTWluaW1hbCBvdXRwdXQgKGVycm9ycyBvbmx5KScsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tbm8tY29sb3InLCAnRGlzYWJsZSBjb2xvcmVkIG91dHB1dCcsIGZhbHNlKVxuICAgIC5hZGRIZWxwVGV4dCgnYWZ0ZXInLCBIRUxQX1RFWFQpO1xuXG4gIC8vIC0tdXBncmFkZSBbdmVyc2lvbl06IHNlbGYtdXBkYXRlLCBoYW5kbGVkIGxpa2UgLS12ZXJzaW9uIChsaXN0ZW5lciArIGV4aXQpLlxuICByZWdpc3RlclVwZ3JhZGVPcHRpb24ocHJvZ3JhbSk7XG5cbiAgLy8gRmFpbC1mYXN0IHByZWZsaWdodDogYmVmb3JlIEFOWSBjb21tYW5kJ3MgYWN0aW9uIHJ1bnMsIHZlcmlmeSB0aGUgbG9jYWxcbiAgLy8gdG9vbHMgdGhhdCBjb21tYW5kIG5lZWRzLiBDb21tYW5kZXIgc2tpcHMgdGhpcyBmb3IgLS1oZWxwLy0tdmVyc2lvbiBhbmQgZm9yXG4gIC8vIGhlbHAgb3V0cHV0LCBzbyB0aG9zZSBhbHdheXMgd29yazsgQVBJLW9ubHkgY29tbWFuZHMgZGVjbGFyZSBubyByZXF1aXJlbWVudHNcbiAgLy8gYW5kIHBhc3MgdGhyb3VnaCB1bnRvdWNoZWQuXG4gIHByb2dyYW0uaG9vaygncHJlQWN0aW9uJywgKF90aGlzQ29tbWFuZCwgYWN0aW9uQ29tbWFuZCkgPT4gcHJlZmxpZ2h0Q29tbWFuZFRvb2xzKGFjdGlvbkNvbW1hbmQpKTtcblxuICAvLyBUb3AtbGV2ZWwgbWV0YSBjb21tYW5kcyAobm8gbmFtZXNwYWNlKS5cbiAgdmVyc2lvbihwcm9ncmFtKTtcbiAgc3RhdHVzKHByb2dyYW0pOyAvLyBTaG93IGVudmlyb25tZW50IGFuZCBjb25uZWN0aXZpdHkgc3RhdHVzXG5cbiAgcmVnaXN0ZXJUYXNrTmFtZXNwYWNlcygpO1xuXG4gIC8vIFNoZWxsIGNvbXBsZXRpb25zXG4gIHByaW50RGVidWcoJ1JlZ2lzdGVyaW5nIGNvbXBsZXRpb25zIGNvbW1hbmQnKTtcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKCdjb21wbGV0aW9ucycpXG4gICAgLmRlc2NyaXB0aW9uKCdHZW5lcmF0ZSBzaGVsbCBjb21wbGV0aW9ucyAoYmFzaCwgenNoLCBmaXNoKScpXG4gICAgLmFyZ3VtZW50KCc8c2hlbGw+JywgJ1NoZWxsIHR5cGU6IGJhc2gsIHpzaCwgb3IgZmlzaCcpXG4gICAgLmFjdGlvbigoc2hlbGw6IHN0cmluZykgPT4ge1xuICAgICAgcHJpbnRDb21wbGV0aW9ucyhzaGVsbCk7XG4gICAgfSk7XG5cbiAgcHJpbnREZWJ1ZygnQWxsIGNvbW1hbmRzIHJlZ2lzdGVyZWQgc3VjY2Vzc2Z1bGx5Jyk7XG59XG5cbi8qKlxuICogSGFuZGxlIHByb2dyYW0gZXJyb3JzXG4gKi9cbmZ1bmN0aW9uIHNldHVwRXJyb3JIYW5kbGVycygpOiB2b2lkIHtcbiAgLy8gSGFuZGxlIHVuY2F1Z2h0IGV4Y2VwdGlvbnNcbiAgcHJvY2Vzcy5vbigndW5jYXVnaHRFeGNlcHRpb24nLCAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgY29uc29sZS5lcnJvcignJyk7IC8vIEVtcHR5IGxpbmVcbiAgICBwcmludEVycm9yKCdVbmNhdWdodCBleGNlcHRpb24nLCB7XG4gICAgICBlcnJvcjogZXJyb3IubWVzc2FnZSxcbiAgICAgIG5hbWU6IGVycm9yLm5hbWUsXG4gICAgfSk7XG5cbiAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuR0VORVJBTCwge1xuICAgICAgZGVidWc6IGlzRGVidWdNb2RlKHByb2dyYW0ub3B0cygpKSxcbiAgICAgIGV4aXQ6IHRydWUsXG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIHR5cGU6ICd1bmNhdWdodEV4Y2VwdGlvbicsXG4gICAgICB9LFxuICAgIH0pO1xuICB9KTtcblxuICAvLyBIYW5kbGUgdW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uc1xuICBwcm9jZXNzLm9uKCd1bmhhbmRsZWRSZWplY3Rpb24nLCAocmVhc29uOiB1bmtub3duKSA9PiB7XG4gICAgY29uc29sZS5lcnJvcignJyk7IC8vIEVtcHR5IGxpbmVcbiAgICBwcmludEVycm9yKCdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24nLCB7XG4gICAgICByZWFzb246IGVycm9yTWVzc2FnZShyZWFzb24pLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZXJyb3IgPSByZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IHJlYXNvbjogbmV3IEVycm9yKFN0cmluZyhyZWFzb24pKTtcblxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBFUlJPUl9DT0RFUy5HRU5FUkFMLCB7XG4gICAgICBkZWJ1ZzogaXNEZWJ1Z01vZGUocHJvZ3JhbS5vcHRzKCkpLFxuICAgICAgZXhpdDogdHJ1ZSxcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgdHlwZTogJ3VuaGFuZGxlZFJlamVjdGlvbicsXG4gICAgICB9LFxuICAgIH0pO1xuICB9KTtcblxuICAvLyBIYW5kbGUgU0lHSU5UIChDdHJsK0MpXG4gIHByb2Nlc3Mub24oJ1NJR0lOVCcsICgpID0+IHtcbiAgICBjb25zb2xlLmxvZygnJyk7IC8vIEVtcHR5IGxpbmVcbiAgICBwcmludFdhcm5pbmcoJ1Byb2Nlc3MgaW50ZXJydXB0ZWQgYnkgdXNlciAoU0lHSU5UKScpO1xuICAgIGNvbnNvbGUubG9nKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgIHByb2Nlc3MuZXhpdCgxMzApOyAvLyBTdGFuZGFyZCBleGl0IGNvZGUgZm9yIFNJR0lOVFxuICB9KTtcblxuICAvLyBIYW5kbGUgU0lHVEVSTVxuICBwcm9jZXNzLm9uKCdTSUdURVJNJywgKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgIHByaW50V2FybmluZygnUHJvY2VzcyB0ZXJtaW5hdGVkIChTSUdURVJNKScpO1xuICAgIGNvbnNvbGUubG9nKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgIHByb2Nlc3MuZXhpdCgxNDMpOyAvLyBTdGFuZGFyZCBleGl0IGNvZGUgZm9yIFNJR1RFUk1cbiAgfSk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBDTEkgd2l0aCBvcHRpb25zXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBDTEkgaW5pdGlhbGl6YXRpb24gb3B0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbGl6ZUNsaShvcHRpb25zOiBDbGlPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIHNob3dCYW5uZXIgPSB0cnVlLFxuICAgIG1pbmltYWxCYW5uZXIgPSBmYWxzZSxcbiAgICBkZWJ1ZyA9IGZhbHNlLFxuICAgIHZlcmJvc2UgPSBmYWxzZSxcbiAgICBxdWlldCA9IGZhbHNlLFxuICAgIG5vQ29sb3IgPSBmYWxzZSxcbiAgICBzZWxmVXBkYXRlID0gZmFsc2UsXG4gIH0gPSBvcHRpb25zO1xuXG4gIC8vIEhhbmRsZSBjb2xvciBvdXRwdXRcbiAgaWYgKG5vQ29sb3IpIHtcbiAgICBwcm9jZXNzLmVudi5OT19DT0xPUiA9ICcxJztcbiAgfVxuXG4gIC8vIERpc3BsYXkgYmFubmVyXG4gIGlmIChzaG93QmFubmVyICYmICFxdWlldCkge1xuICAgIGlmIChtaW5pbWFsQmFubmVyKSB7XG4gICAgICBtaW5pQmFubmVyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJhbm5lcih7XG4gICAgICAgIG1pbmltYWw6IGZhbHNlLFxuICAgICAgICBzaG93RGVzY3JpcHRpb246IHRydWUsXG4gICAgICAgIHNob3dUaW1lc3RhbXA6IGRlYnVnIHx8IHZlcmJvc2UsXG4gICAgICAgIHNob3dFeGVjdXRpb25JZDogZGVidWcsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBEaXNwbGF5IHN0YXJ0dXAgaW5mb1xuICBkaXNwbGF5U3RhcnR1cEluZm8oeyBkZWJ1ZywgdmVyYm9zZSwgcXVpZXQgfSk7XG5cbiAgLy8gQ2hlY2sgZW52aXJvbm1lbnRcbiAgaWYgKCFxdWlldCkge1xuICAgIGNoZWNrRW52aXJvbm1lbnQoeyBzaWduSW5SZWxldmFudDogIXNlbGZVcGRhdGUgfSk7XG4gIH1cblxuICAvLyBTZXR1cCBlcnJvciBoYW5kbGVyc1xuICBzZXR1cEVycm9ySGFuZGxlcnMoKTtcblxuICAvLyBSZWdpc3RlciBjb21tYW5kc1xuICB0cnkge1xuICAgIHJlZ2lzdGVyQ29tbWFuZHMoKTtcbiAgICBwcmludERlYnVnKCdDTEkgaW5pdGlhbGl6YXRpb24gY29tcGxldGUnKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBwcmludEVycm9yKCdDTEkgaW5pdGlhbGl6YXRpb24gZmFpbGVkJywge1xuICAgICAgZXJyb3I6IGVycm9yTWVzc2FnZShlcnJvciksXG4gICAgfSk7XG5cbiAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuQ09ORklHVVJBVElPTiwge1xuICAgICAgZGVidWc6IGRlYnVnIHx8IGlzRGVidWdNb2RlKCksXG4gICAgICBleGl0OiB0cnVlLFxuICAgICAgY29udGV4dDoge1xuICAgICAgICBzdGFnZTogJ2luaXRpYWxpemF0aW9uJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQXJndW1lbnRzKCk6IHZvaWQge1xuICB0cnkge1xuICAgIHByb2dyYW0ucGFyc2UocHJvY2Vzcy5hcmd2KTtcblxuICAgIC8vIFNob3cgaGVscCBpZiBubyBjb21tYW5kIHByb3ZpZGVkXG4gICAgY29uc3QgYXJncyA9IHByb2Nlc3MuYXJndi5zbGljZSgyKTtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgIHByaW50SW5mbygnTm8gY29tbWFuZCBzcGVjaWZpZWQgLSBkaXNwbGF5aW5nIGhlbHAnKTtcbiAgICAgIGNvbnNvbGUubG9nKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgICAgcHJvZ3JhbS5vdXRwdXRIZWxwKCk7XG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgY29tbWFuZCBleGlzdHNcbiAgICBjb25zdCBjb21tYW5kID0gYXJnc1swXTtcbiAgICBpZiAoY29tbWFuZCAmJiAhY29tbWFuZC5zdGFydHNXaXRoKCctJykpIHtcbiAgICAgIGNvbnN0IGNvbW1hbmRFeGlzdHMgPSBwcm9ncmFtLmNvbW1hbmRzLnNvbWUoY21kID0+IGNtZC5uYW1lKCkgPT09IGNvbW1hbmQpO1xuXG4gICAgICBpZiAoIWNvbW1hbmRFeGlzdHMpIHtcbiAgICAgICAgY29uc29sZS5sb2coJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgICAgIHByaW50RXJyb3IoYFVua25vd24gY29tbWFuZDogJHtjb21tYW5kfWApO1xuICAgICAgICBjb25zb2xlLmxvZygnJyk7IC8vIEVtcHR5IGxpbmVcbiAgICAgICAgcHJpbnRJbmZvKCdBdmFpbGFibGUgY29tbWFuZHM6Jyk7XG4gICAgICAgIHByb2dyYW0uY29tbWFuZHMuZm9yRWFjaChjbWQgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAg4oCiICR7Y21kLm5hbWUoKX0gLSAke2NtZC5kZXNjcmlwdGlvbigpfWApO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc29sZS5sb2coJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcmludERlYnVnKCdDb21tYW5kIGxpbmUgYXJndW1lbnRzIHBhcnNlZCBzdWNjZXNzZnVsbHknKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuR0VORVJBTCwge1xuICAgICAgZGVidWc6IGlzRGVidWdNb2RlKHByb2dyYW0ub3B0cygpKSxcbiAgICAgIGV4aXQ6IHRydWUsXG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIHN0YWdlOiAnYXJndW1lbnQtcGFyc2luZycsXG4gICAgICAgIGFyZ3Y6IHByb2Nlc3MuYXJndixcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBNYWluIENMSSBlbnRyeSBwb2ludFxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ0xJIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gU3RhbmRhcmQgaW5pdGlhbGl6YXRpb25cbiAqIG1haW4oKTtcbiAqXG4gKiAvLyBNaW5pbWFsIG1vZGVcbiAqIG1haW4oeyBtaW5pbWFsQmFubmVyOiB0cnVlLCBxdWlldDogdHJ1ZSB9KTtcbiAqXG4gKiAvLyBEZWJ1ZyBtb2RlXG4gKiBtYWluKHsgZGVidWc6IHRydWUsIHZlcmJvc2U6IHRydWUgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1haW4ob3B0aW9uczogQ2xpT3B0aW9ucyA9IHt9KTogdm9pZCB7XG4gIHRyeSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBDTElcbiAgICBpbml0aWFsaXplQ2xpKG9wdGlvbnMpO1xuXG4gICAgLy8gUGFyc2UgYXJndW1lbnRzIGFuZCBleGVjdXRlIGNvbW1hbmRcbiAgICBwYXJzZUFyZ3VtZW50cygpO1xuXG4gICAgLy8gSWYgd2UgcmVhY2ggaGVyZSwgY29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5XG4gICAgcHJpbnREZWJ1ZygnQ0xJIGV4ZWN1dGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gRmluYWwgY2F0Y2gtYWxsIGVycm9yIGhhbmRsZXJcbiAgICBjb25zb2xlLmVycm9yKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgIHByaW50RXJyb3IoJ0ZhdGFsIENMSSBlcnJvcicsIHtcbiAgICAgIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyb3IpLFxuICAgIH0pO1xuXG4gICAgaGFuZGxlRXJyb3IoZXJyb3IsIEVSUk9SX0NPREVTLkdFTkVSQUwsIHtcbiAgICAgIGRlYnVnOiBpc0RlYnVnTW9kZShvcHRpb25zKSxcbiAgICAgIGV4aXQ6IHRydWUsXG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIHN0YWdlOiAnbWFpbicsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUnVuIENMSSBpZiBleGVjdXRlZCBkaXJlY3RseS4gRVNNIGhhcyBubyBgcmVxdWlyZS5tYWluYDsgY29tcGFyZSB0aGUgaW52b2tlZFxuICogc2NyaXB0IHRvIHRoaXMgbW9kdWxlJ3MgcGF0aCwgcmVzb2x2aW5nIHN5bWxpbmtzIG9uIGJvdGggc2lkZXMgc28gdGhlIGBiaW5gXG4gKiBzeW1saW5rIChub2RlX21vZHVsZXMvLmJpbi9waXBlbGluZS1tYW5hZ2VyIOKGkiBkaXN0L2NsaS5qcykgc3RpbGwgbWF0Y2hlcy5cbiAqL1xuY29uc3QgaW52b2tlZFNjcmlwdCA9IHByb2Nlc3MuYXJndlsxXTtcbmNvbnN0IGlzTWFpbk1vZHVsZSA9IGludm9rZWRTY3JpcHQgIT09IHVuZGVmaW5lZFxuICAmJiByZWFscGF0aFN5bmMoaW52b2tlZFNjcmlwdCkgPT09IHJlYWxwYXRoU3luYyhmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuaWYgKGlzTWFpbk1vZHVsZSkge1xuICAvLyBQYXJzZSBDTEkgb3B0aW9ucyBmcm9tIGVudmlyb25tZW50IG9yIGNvbW1hbmQgbGluZVxuICBjb25zdCBvcHRpb25zOiBDbGlPcHRpb25zID0ge1xuICAgIGRlYnVnOiBwcm9jZXNzLmVudi5ERUJVRyA9PT0gJ3RydWUnLFxuICAgIC8vIGAtLXRva2VuYCBwcmludHMgYSBiYXJlIHRva2VuIGZvciBgJCjigKYpYCBjYXB0dXJlLCBzbyB0aGUgYmFubmVyIGFuZCB0aGVcbiAgICAvLyBzdGFydHVwIGNocm9tZSBtdXN0IG5vdCByZWFjaCBzdGRvdXQgZWl0aGVyLiBTY2FubmVkIGZyb20gYXJndiBsaWtlXG4gICAgLy8gYC0tcXVpZXRgIGlzLCBiZWNhdXNlIHRoaXMgcnVucyBCRUZPUkUgQ29tbWFuZGVyIHBhcnNlcy5cbiAgICBxdWlldDogcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLXF1aWV0JykgfHwgcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLXRva2VuJyksXG4gICAgdmVyYm9zZTogcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLXZlcmJvc2UnKSxcbiAgICBub0NvbG9yOiBwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tbm8tY29sb3InKSB8fCBwcm9jZXNzLmVudi5OT19DT0xPUiA9PT0gJzEnLFxuICAgIHNlbGZVcGRhdGU6IGlzU2VsZlVwZGF0ZShwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpLFxuICB9O1xuXG4gIC8vIERhaWx5IGJhY2tncm91bmQgY2hlY2s7IHByaW50cyBcInVwZGF0ZSBhdmFpbGFibGVcIiB0byBzdGRlcnIgb24gZXhpdC5cbiAgc2NoZWR1bGVVcGRhdGVOb3RpY2UoKTtcbiAgbWFpbihvcHRpb25zKTtcbn0iXX0=
|
|
@@ -1,4 +1,38 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
+
/** One `GET /api/pipelines/registry` row (the fields this audit reads). */
|
|
3
|
+
export interface RegistryEntry {
|
|
4
|
+
/** Registry row UUID — what `pipeline deregister --id` takes. */
|
|
5
|
+
id: string;
|
|
6
|
+
pipelineId: string;
|
|
7
|
+
orgId?: string;
|
|
8
|
+
pipelineName: string;
|
|
9
|
+
stackName?: string;
|
|
10
|
+
region?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface AuditFinding {
|
|
13
|
+
type: 'orphaned-stack' | 'missing-stack';
|
|
14
|
+
stackName?: string;
|
|
15
|
+
pipelineId?: string;
|
|
16
|
+
pipelineName?: string;
|
|
17
|
+
/** Registry row id (missing-stack only). */
|
|
18
|
+
registryId?: string;
|
|
19
|
+
detail: string;
|
|
20
|
+
/** The command that reconciles this finding. */
|
|
21
|
+
fix: string;
|
|
22
|
+
}
|
|
23
|
+
/** Registry rows fetched per request (the route caps `limit` at MAX_PAGE_LIMIT, 1000 by default). */
|
|
24
|
+
export declare const REGISTRY_PAGE_LIMIT = 500;
|
|
25
|
+
/**
|
|
26
|
+
* Read EVERY registry row the platform returns for this caller (`limit` +
|
|
27
|
+
* `offset` paging until `pagination.hasMore` is false). A partial registry is
|
|
28
|
+
* as bad as an empty one: each row left unread becomes a false orphaned-stack
|
|
29
|
+
* finding. `orgId` is sent when `--org` names an org — the platform scopes the
|
|
30
|
+
* list to the caller's org unless it honours that parameter (a system-org
|
|
31
|
+
* caller), and the caller checks which org it got back.
|
|
32
|
+
*/
|
|
33
|
+
export declare function fetchAllRegistryEntries(client: {
|
|
34
|
+
get<T = unknown>(url: string, params?: Record<string, unknown>): Promise<T>;
|
|
35
|
+
}, pipelineUrl: string, orgId?: string): Promise<RegistryEntry[]>;
|
|
2
36
|
/**
|
|
3
37
|
* Registers the `audit-stacks` command with the CLI program.
|
|
4
38
|
*
|
|
@@ -9,6 +43,13 @@ import { Command } from 'commander';
|
|
|
9
43
|
* - **Missing stacks**: registry entries pointing to stacks that no longer exist
|
|
10
44
|
* in CloudFormation (likely after a manual `aws cloudformation delete-stack`).
|
|
11
45
|
*
|
|
46
|
+
* Scope: the registry of ONE org (yours, or `--org` when the platform lets the
|
|
47
|
+
* credential list that org) against the stacks of ONE region (`--region`) —
|
|
48
|
+
* registry rows of other regions are counted but not compared, and stacks
|
|
49
|
+
* tagged with another `OrgId` are skipped. Every finding carries the command
|
|
50
|
+
* that reconciles it (`pipeline deregister` for a missing stack; `pipeline
|
|
51
|
+
* register` or `aws cloudformation delete-stack` for an orphaned one).
|
|
52
|
+
*
|
|
12
53
|
* Designed for cron use:
|
|
13
54
|
* - Exits 0 when there are no findings.
|
|
14
55
|
* - Exits 1 when at least one orphaned or missing stack is found.
|
|
@@ -17,7 +58,7 @@ import { Command } from 'commander';
|
|
|
17
58
|
* @example
|
|
18
59
|
* ```bash
|
|
19
60
|
* pipeline-manager audit stacks --region us-east-1
|
|
20
|
-
* pipeline-manager audit stacks --
|
|
61
|
+
* pipeline-manager audit stacks --region eu-west-1 --json
|
|
21
62
|
* ```
|
|
22
63
|
*/
|
|
23
64
|
export declare function auditStacks(program: Command): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-stacks.d.ts","sources":["../../src/commands/audit-stacks.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"audit-stacks.d.ts","sources":["../../src/commands/audit-stacks.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,2EAA2E;AAC3E,MAAM,WAAW,aAAa;IAC5B,iEAAiE;IACjE,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAYD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,gBAAgB,GAAG,eAAe,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;CACb;AAOD,qGAAqG;AACrG,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAKvC;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE;IAAE,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CAAE,EACvF,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,aAAa,EAAE,CAAC,CAc1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmMlD"}
|