@pipeline-builder/pipeline-events 3.4.42 → 3.4.60

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 (3) hide show
  1. package/README.md +29 -9
  2. package/lib/index.js +103 -37
  3. package/package.json +21 -9
package/README.md CHANGED
@@ -2,20 +2,40 @@
2
2
 
3
3
  📖 **[View documentation](https://mwashburn160.github.io/pipeline-builder/)**
4
4
 
5
- AWS Lambda handler for [Pipeline Builder](https://mwashburn160.github.io/pipeline-builder/) that ingests CodePipeline state-change events from EventBridge and forwards normalized event payloads to the platform's reporting service. Deployed automatically by `pipeline-manager setup-events`.
5
+ AWS Lambda handler for [Pipeline Builder](https://mwashburn160.github.io/pipeline-builder/) that ingests CodePipeline state-change events from EventBridge and forwards normalized payloads to the reporting service.
6
6
 
7
- ## What it does
7
+ > Internal workspace package. This is not imported by other packages — it is deployed as a Lambda by the CLI's `setup-events` command, which provisions the full EventBridge → SQS → Lambda stack (rule, queue, dead-letter queue, IAM, and this handler).
8
8
 
9
- 1. Receives a CodePipeline stage/action/execution event from EventBridge
10
- 2. Hashes account IDs in ARNs so downstream storage never sees raw account numbers
11
- 3. Posts a normalized event payload to the reporting service (`/reports/events`)
9
+ ## Responsibilities
10
+
11
+ 1. Receives CodePipeline (pipeline / stage / action) events delivered as an SQS batch sourced from EventBridge.
12
+ 2. Classifies each record into a normalized event type (`PIPELINE`, `STAGE`, `ACTION`) and derives status, start/completion times, run duration, and — on failures — the `errorMessage` (from the action's `execution-result.external-execution-summary`).
13
+ 3. Resolves each pipeline's stable `PIPELINE_EVENT_ID` tag (applied at CDK synth = the platform `pipelineId`) via `codepipeline:ListTagsForResource`, cached per pipeline. The ARN and AWS account never leave AWS, so there is no masking/secret to manage. Untagged (unregistered) pipelines are skipped.
14
+ 4. Posts the normalized batch (keyed by `pipelineId`) to the reporting service via `POST /api/reports/events`.
15
+
16
+ CodeBuild `Build State` events are skipped: a build project can be shared across pipelines, so there is no clean 1:1 mapping to a pipeline id.
17
+
18
+ ## Key exports
19
+
20
+ | Export | Purpose |
21
+ |---|---|
22
+ | `handler(event: SQSEvent)` | The Lambda entry point. Parses + resolves the SQS batch and POSTs normalized events to the reporting service. |
12
23
 
13
24
  ## Runtime
14
25
 
15
- - Lambda Node.js runtime
16
- - Triggered by EventBridge rule on `aws.codepipeline` source
17
- - Requires `REPORTING_SERVICE_URL` and `PLATFORM_TOKEN` env vars (set by `setup-events`)
26
+ - Lambda Node.js runtime, using the runtime-provided `@aws-sdk/client-codepipeline`.
27
+ - Triggered by an SQS queue fed by an EventBridge rule matching the `aws.codepipeline` source; processes events in batches and POSTs them in a single request per invocation.
28
+ - Requires `PLATFORM_BASE_URL` (set by `setup-events`).
29
+ - **IAM:** the execution role must allow `codepipeline:ListTagsForResource`. An `AccessDenied` is logged as an error and fails the batch, so a missing grant is visible rather than silent.
30
+ - Authenticates with either `PLATFORM_TOKEN` (a JWT set directly) or `PLATFORM_SECRET_NAME` (a Secrets Manager secret holding `accessToken`, created via `pipeline-manager store-token`); the resolved token is cached across invocations.
31
+
32
+ ## Development
33
+
34
+ ```bash
35
+ pnpm build # projen build (compile + lint + test + package)
36
+ pnpm test # run the Jest test suite
37
+ ```
18
38
 
19
39
  ## License
20
40
 
21
- Apache-2.0. See [LICENSE](./LICENSE).
41
+ Apache-2.0. See [LICENSE](./LICENSE).
package/lib/index.js CHANGED
@@ -1,10 +1,12 @@
1
- "use strict";
2
1
  // Copyright 2026 Pipeline Builder Contributors
3
2
  // SPDX-License-Identifier: Apache-2.0
4
- Object.defineProperty(exports, "__esModule", { value: true });
5
- exports.handler = void 0;
6
- const crypto_1 = require("crypto");
7
- const client_secrets_manager_1 = require("@aws-sdk/client-secrets-manager");
3
+ import { GetSecretValueCommand, SecretsManagerClient } from '@aws-sdk/client-secrets-manager';
4
+ let codepipelineMod;
5
+ async function loadCodePipeline() {
6
+ if (!codepipelineMod)
7
+ codepipelineMod = (await import('@aws-sdk/client-codepipeline'));
8
+ return codepipelineMod;
9
+ }
8
10
  /**
9
11
  * Pipeline event ingestion Lambda handler.
10
12
  *
@@ -21,27 +23,62 @@ const client_secrets_manager_1 = require("@aws-sdk/client-secrets-manager");
21
23
  * - PLATFORM_TOKEN — JWT token (set directly, or)
22
24
  * - PLATFORM_SECRET_NAME — Secrets Manager secret containing { accessToken }
23
25
  */
24
- /**
25
- * One-way SHA-256 hash of a sensitive identifier.
26
- * Must match the same algorithm used in api-core/mask-helpers.ts so that
27
- * the hashed ARN from the Lambda matches the hashed ARN in pipeline_registry.
28
- */
29
- function hashId(value, length = 12) {
30
- return (0, crypto_1.createHash)('sha256').update(value).digest('hex').slice(0, length);
31
- }
32
- /** Replace the account segment of an ARN with its SHA-256 hash. */
33
- function hashAccountInArn(arn) {
34
- const parts = arn.split(':');
35
- if (parts.length < 5 || !parts[4])
36
- return arn;
37
- parts[4] = hashId(parts[4]);
38
- return parts.join(':');
39
- }
40
26
  const log = {
41
27
  info: (msg, data) => console.log(JSON.stringify({ level: 'INFO', message: msg, data, ts: new Date().toISOString() })),
42
28
  warn: (msg, data) => console.log(JSON.stringify({ level: 'WARN', message: msg, data, ts: new Date().toISOString() })),
43
29
  error: (msg, data) => console.error(JSON.stringify({ level: 'ERROR', message: msg, data, ts: new Date().toISOString() })),
44
30
  };
31
+ // ── PIPELINE_EVENT_ID resolution ─────────────────────────
32
+ // Pipelines are tagged `PIPELINE_EVENT_ID=<pipelineId>` at CDK synth. We resolve
33
+ // that tag from the live CodePipeline (region-aware) and report against the id —
34
+ // the ARN/account never leave AWS, so there's no masking. Cached per ARN
35
+ // (warm-container) to avoid hammering the ListTags API.
36
+ //
37
+ // Requires the Lambda execution role to allow `codepipeline:ListTagsForResource`.
38
+ // AccessDenied is a config error (alert loudly); a missing tag is treated as
39
+ // "not yet registered" (skip).
40
+ const PIPELINE_EVENT_ID_TAG = 'PIPELINE_EVENT_ID';
41
+ const clientsByRegion = new Map();
42
+ const eventIdByArn = new Map(); // null = resolved-but-untagged (negative cache)
43
+ async function pipelineClient(region) {
44
+ let client = clientsByRegion.get(region);
45
+ if (!client) {
46
+ const { CodePipelineClient } = await loadCodePipeline();
47
+ client = new CodePipelineClient({ region });
48
+ clientsByRegion.set(region, client);
49
+ }
50
+ return client;
51
+ }
52
+ /**
53
+ * Resolve a CodePipeline's PIPELINE_EVENT_ID tag → the platform pipelineId.
54
+ * Returns null when the pipeline has no such tag (unregistered). Throws on
55
+ * AccessDenied so a missing IAM grant surfaces loudly instead of silently
56
+ * dropping every event.
57
+ */
58
+ async function resolvePipelineEventId(arn, region) {
59
+ if (eventIdByArn.has(arn))
60
+ return eventIdByArn.get(arn);
61
+ try {
62
+ const client = await pipelineClient(region);
63
+ const { ListTagsForResourceCommand } = await loadCodePipeline();
64
+ const out = await client.send(new ListTagsForResourceCommand({ resourceArn: arn }));
65
+ const tag = out.tags?.find(t => t.key === PIPELINE_EVENT_ID_TAG)?.value ?? null;
66
+ if (!tag)
67
+ log.warn('Pipeline missing PIPELINE_EVENT_ID tag — skipping (register it?)', { arn });
68
+ eventIdByArn.set(arn, tag);
69
+ return tag;
70
+ }
71
+ catch (err) {
72
+ const name = err?.name;
73
+ if (name === 'AccessDeniedException') {
74
+ // Don't cache — this is a fixable misconfig, not a property of the pipeline.
75
+ log.error('AccessDenied calling codepipeline:ListTagsForResource — grant it to the Lambda role', { arn, error: name });
76
+ throw err;
77
+ }
78
+ log.error('Failed to resolve PIPELINE_EVENT_ID tag', { arn, error: name ?? String(err) });
79
+ return null;
80
+ }
81
+ }
45
82
  // ─── Auth ───────────────────────────────────────────────
46
83
  let cachedToken = null;
47
84
  async function getAuthToken() {
@@ -59,8 +96,8 @@ async function getAuthToken() {
59
96
  throw new Error('PLATFORM_TOKEN or PLATFORM_SECRET_NAME environment variable is required');
60
97
  }
61
98
  log.info(`Fetching token from Secrets Manager: ${secretName}`);
62
- const client = new client_secrets_manager_1.SecretsManagerClient({});
63
- const response = await client.send(new client_secrets_manager_1.GetSecretValueCommand({ SecretId: secretName }));
99
+ const client = new SecretsManagerClient({});
100
+ const response = await client.send(new GetSecretValueCommand({ SecretId: secretName }));
64
101
  if (!response.SecretString)
65
102
  throw new Error(`Secret "${secretName}" is empty`);
66
103
  const secret = JSON.parse(response.SecretString);
@@ -71,6 +108,8 @@ async function getAuthToken() {
71
108
  log.info('Using stored JWT token from Secrets Manager');
72
109
  return cachedToken;
73
110
  }
111
+ /** Cap on the stored failure summary — CodeBuild/Deploy summaries can be long. */
112
+ const MAX_ERROR_MESSAGE = 4000;
74
113
  function classifyEvent(detailType) {
75
114
  if (detailType.includes('Pipeline Execution'))
76
115
  return { eventType: 'PIPELINE', eventSource: 'codepipeline' };
@@ -82,18 +121,32 @@ function classifyEvent(detailType) {
82
121
  return { eventType: 'BUILD', eventSource: 'codebuild' };
83
122
  return { eventType: 'PIPELINE', eventSource: 'codepipeline' };
84
123
  }
85
- function parseRecord(record) {
124
+ /** Parse + resolve one record to a reportable event, or null to skip it. */
125
+ async function parseRecord(record) {
86
126
  const event = JSON.parse(record.body);
127
+ const { eventType, eventSource } = classifyEvent(event['detail-type']);
87
128
  const detail = { ...event.detail };
129
+ // The raw account never needs to leave AWS now — drop it from the payload.
130
+ delete detail.account;
131
+ // CodeBuild "Build State" events identify a build *project*, not a pipeline,
132
+ // and a project can be shared across pipelines — there's no clean 1:1 mapping
133
+ // to a PIPELINE_EVENT_ID, so skip them (they were effectively dropped before
134
+ // too, since detail.pipeline was undefined and never matched the registry).
135
+ if (eventSource !== 'codepipeline') {
136
+ log.warn('Skipping non-CodePipeline event (no pipeline tag to resolve)', { detailType: event['detail-type'] });
137
+ return null;
138
+ }
88
139
  const pipelineName = detail.pipeline;
89
- // Hash account in ARN so the real account never reaches the database.
90
- // Must use the same hashId algorithm as api-core so registry lookups match.
91
- const pipelineArn = hashAccountInArn(`arn:aws:codepipeline:${event.region}:${event.account}:${pipelineName}`);
92
- // Hash account in detail too
93
- if (event.account) {
94
- detail.account = hashId(event.account);
140
+ if (!pipelineName) {
141
+ log.warn('CodePipeline event missing pipeline name skipping');
142
+ return null;
95
143
  }
96
- const { eventType, eventSource } = classifyEvent(event['detail-type']);
144
+ // Resolve the pipeline's PIPELINE_EVENT_ID tag (= platform pipelineId). The
145
+ // ARN is only a transient handle for the tag lookup; it is never stored.
146
+ const arn = `arn:aws:codepipeline:${event.region}:${event.account}:${pipelineName}`;
147
+ const pipelineId = await resolvePipelineEventId(arn, event.region);
148
+ if (!pipelineId)
149
+ return null; // untagged / unregistered → skip
97
150
  const startedAt = detail['start-time'] || event.time;
98
151
  const state = detail.state;
99
152
  let durationMs;
@@ -106,14 +159,23 @@ function parseRecord(record) {
106
159
  durationMs = ms;
107
160
  }
108
161
  }
162
+ // Promote the failure reason to a typed field. On Action events AWS puts the
163
+ // human-readable summary (and a log URL + error-code, which stay in `detail`)
164
+ // under `execution-result`.
165
+ const result = detail['execution-result'];
166
+ const summary = result?.['external-execution-summary'];
167
+ const errorMessage = typeof summary === 'string' && summary.length > 0
168
+ ? summary.slice(0, MAX_ERROR_MESSAGE)
169
+ : undefined;
109
170
  return {
110
- pipelineArn,
171
+ pipelineId,
111
172
  eventSource,
112
173
  eventType,
113
174
  status: state,
114
175
  executionId: detail['execution-id'],
115
176
  stageName: detail.stage,
116
177
  actionName: detail.action,
178
+ errorMessage,
117
179
  startedAt,
118
180
  completedAt,
119
181
  durationMs,
@@ -121,12 +183,17 @@ function parseRecord(record) {
121
183
  };
122
184
  }
123
185
  // ─── Handler ────────────────────────────────────────────
124
- const handler = async (event) => {
186
+ export const handler = async (event) => {
125
187
  const baseUrl = process.env.PLATFORM_BASE_URL;
126
188
  if (!baseUrl)
127
189
  throw new Error('PLATFORM_BASE_URL environment variable is required');
128
- // Parse all events
129
- const events = event.Records.map(parseRecord);
190
+ // Parse + resolve all records (tag lookups run concurrently); drop skips.
191
+ const events = (await Promise.all(event.Records.map(parseRecord)))
192
+ .filter((e) => e !== null);
193
+ if (events.length === 0) {
194
+ log.info('No resolvable CodePipeline events in batch');
195
+ return;
196
+ }
130
197
  // Authenticate
131
198
  const token = await getAuthToken();
132
199
  // POST batch to reporting service
@@ -146,5 +213,4 @@ const handler = async (event) => {
146
213
  const result = await res.json();
147
214
  log.info(`Ingested ${events.length} events`, { inserted: result.data });
148
215
  };
149
- exports.handler = handler;
150
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7OztBQUV0QyxtQ0FBb0M7QUFDcEMsNEVBQThGO0FBRzlGOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVIOzs7O0dBSUc7QUFDSCxTQUFTLE1BQU0sQ0FBQyxLQUFhLEVBQUUsTUFBTSxHQUFHLEVBQUU7SUFDeEMsT0FBTyxJQUFBLG1CQUFVLEVBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzNFLENBQUM7QUFFRCxtRUFBbUU7QUFDbkUsU0FBUyxnQkFBZ0IsQ0FBQyxHQUFXO0lBQ25DLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUM5QyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6QixDQUFDO0FBRUQsTUFBTSxHQUFHLEdBQUc7SUFDVixJQUFJLEVBQUUsQ0FBQyxHQUFXLEVBQUUsSUFBYyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMs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LEVBQUUsVUFBVSxLQUFLLEVBQUU7U0FDbkM7UUFDRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDO0tBQ2pDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksR0FBRyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUMsR0FBRyxDQUFDLEtBQUssQ0FBQywwQkFBMEIsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM1RCxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUE2QixDQUFDO0lBQzNELEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxNQUFNLENBQUMsTUFBTSxTQUFTLEVBQUUsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7QUFDMUUsQ0FBQyxDQUFDO0FBNUJXLFFBQUEsT0FBTyxXQTRCbEIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQsIFNlY3JldHNNYW5hZ2VyQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXNlY3JldHMtbWFuYWdlcic7XG5pbXBvcnQgdHlwZSB7IFNRU0V2ZW50LCBTUVNSZWNvcmQgfSBmcm9tICdhd3MtbGFtYmRhJztcblxuLyoqXG4gKiBQaXBlbGluZSBldmVudCBpbmdlc3Rpb24gTGFtYmRhIGhhbmRsZXIuXG4gKlxuICogUmVjZWl2ZXMgQ29kZVBpcGVsaW5lL0NvZGVCdWlsZCBldmVudHMgZnJvbSBTUVMgKHNvdXJjZWQgYnkgRXZlbnRCcmlkZ2UpLFxuICogcGFyc2VzIHRoZW0gaW50byBhIG5vcm1hbGl6ZWQgZm9ybWF0LCBhbmQgUE9TVHMgdGhlbSB0byB0aGUgcmVwb3J0aW5nIHNlcnZpY2VcbiAqIHZpYSBQTEFURk9STV9CQVNFX1VSTC5cbiAqXG4gKiBBdXRoZW50aWNhdGlvbjpcbiAqIC0gUExBVEZPUk1fVE9LRU4gZW52IHZhciAocHJlZmVycmVkIOKAlCBubyBTZWNyZXRzIE1hbmFnZXIgY2FsbClcbiAqIC0gUExBVEZPUk1fU0VDUkVUX05BTUUgZW52IHZhciDihpIgcmVhZHMgYWNjZXNzVG9rZW4gZnJvbSBTZWNyZXRzIE1hbmFnZXJcbiAqXG4gKiBFbnZpcm9ubWVudCB2YXJpYWJsZXM6XG4gKiAtIFBMQVRGT1JNX0JBU0VfVVJMIOKAlCBCYXNlIFVSTCBvZiB0aGUgcGxhdGZvcm1cbiAqIC0gUExBVEZPUk1fVE9LRU4g4oCUIEpXVCB0b2tlbiAoc2V0IGRpcmVjdGx5LCBvcilcbiAqIC0gUExBVEZPUk1fU0VDUkVUX05BTUUg4oCUIFNlY3JldHMgTWFuYWdlciBzZWNyZXQgY29udGFpbmluZyB7IGFjY2Vzc1Rva2VuIH1cbiAqL1xuXG4vKipcbiAqIE9uZS13YXkgU0hBLTI1NiBoYXNoIG9mIGEgc2Vuc2l0aXZlIGlkZW50aWZpZXIuXG4gKiBNdXN0IG1hdGNoIHRoZSBzYW1lIGFsZ29yaXRobSB1c2VkIGluIGFwaS1jb3JlL21hc2staGVscGVycy50cyBzbyB0aGF0XG4gKiB0aGUgaGFzaGVkIEFSTiBmcm9tIHRoZSBMYW1iZGEgbWF0Y2hlcyB0aGUgaGFzaGVkIEFSTiBpbiBwaXBlbGluZV9yZWdpc3RyeS5cbiAqL1xuZnVuY3Rpb24gaGFzaElkKHZhbHVlOiBzdHJpbmcsIGxlbmd0aCA9IDEyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZSh2YWx1ZSkuZGlnZXN0KCdoZXgnKS5zbGljZSgwLCBsZW5ndGgpO1xufVxuXG4vKiogUmVwbGFjZSB0aGUgYWNjb3VudCBzZWdtZW50IG9mIGFuIEFSTiB3aXRoIGl0cyBTSEEtMjU2IGhhc2guICovXG5mdW5jdGlvbiBoYXNoQWNjb3VudEluQXJuKGFybjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcGFydHMgPSBhcm4uc3BsaXQoJzonKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCA8IDUgfHwgIXBhcnRzWzRdKSByZXR1cm4gYXJuO1xuICBwYXJ0c1s0XSA9IGhhc2hJZChwYXJ0c1s0XSk7XG4gIHJldHVybiBwYXJ0cy5qb2luKCc6Jyk7XG59XG5cbmNvbnN0IGxvZyA9IHtcbiAgaW5mbzogKG1zZzogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoeyBsZXZlbDogJ0lORk8nLCBtZXNzYWdlOiBtc2csIGRhdGEsIHRzOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfSkpLFxuICB3YXJuOiAobXNnOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IGxldmVsOiAnV0FSTicsIG1lc3NhZ2U6IG1zZywgZGF0YSwgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KSksXG4gIGVycm9yOiAobXNnOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiBjb25zb2xlLmVycm9yKEpTT04uc3RyaW5naWZ5KHsgbGV2ZWw6ICdFUlJPUicsIG1lc3NhZ2U6IG1zZywgZGF0YSwgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KSksXG59O1xuXG4vLyDilIDilIDilIAgQXV0aCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxubGV0IGNhY2hlZFRva2VuOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXV0aFRva2VuKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGlmIChjYWNoZWRUb2tlbikgcmV0dXJuIGNhY2hlZFRva2VuO1xuXG4gIC8vIFBhdGggMTogUExBVEZPUk1fVE9LRU4gZW52IHZhciAobm8gU2VjcmV0cyBNYW5hZ2VyIGNhbGwpXG4gIGlmIChwcm9jZXNzLmVudi5QTEFURk9STV9UT0tFTikge1xuICAgIGNhY2hlZFRva2VuID0gcHJvY2Vzcy5lbnYuUExBVEZPUk1fVE9LRU47XG4gICAgbG9nLmluZm8oJ1VzaW5nIFBMQVRGT1JNX1RPS0VOIGZyb20gZW52aXJvbm1lbnQnKTtcbiAgICByZXR1cm4gY2FjaGVkVG9rZW47XG4gIH1cblxuICAvLyBQYXRoIDI6IFBMQVRGT1JNX1NFQ1JFVF9OQU1FIOKGkiByZWFkIGZyb20gU2VjcmV0cyBNYW5hZ2VyXG4gIGNvbnN0IHNlY3JldE5hbWUgPSBwcm9jZXNzLmVudi5QTEFURk9STV9TRUNSRVRfTkFNRTtcbiAgaWYgKCFzZWNyZXROYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdQTEFURk9STV9UT0tFTiBvciBQTEFURk9STV9TRUNSRVRfTkFNRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyByZXF1aXJlZCcpO1xuICB9XG5cbiAgbG9nLmluZm8oYEZldGNoaW5nIHRva2VuIGZyb20gU2VjcmV0cyBNYW5hZ2VyOiAke3NlY3JldE5hbWV9YCk7XG4gIGNvbnN0IGNsaWVudCA9IG5ldyBTZWNyZXRzTWFuYWdlckNsaWVudCh7fSk7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnNlbmQobmV3IEdldFNlY3JldFZhbHVlQ29tbWFuZCh7IFNlY3JldElkOiBzZWNyZXROYW1lIH0pKTtcblxuICBpZiAoIXJlc3BvbnNlLlNlY3JldFN0cmluZykgdGhyb3cgbmV3IEVycm9yKGBTZWNyZXQgXCIke3NlY3JldE5hbWV9XCIgaXMgZW1wdHlgKTtcblxuICBjb25zdCBzZWNyZXQgPSBKU09OLnBhcnNlKHJlc3BvbnNlLlNlY3JldFN0cmluZykgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgaWYgKCFzZWNyZXQuYWNjZXNzVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlY3JldCBtaXNzaW5nIGFjY2Vzc1Rva2VuIOKAlCBydW4gXCJwaXBlbGluZS1tYW5hZ2VyIHN0b3JlLXRva2VuXCIgdG8gZ2VuZXJhdGUnKTtcbiAgfVxuXG4gIGNhY2hlZFRva2VuID0gc2VjcmV0LmFjY2Vzc1Rva2VuO1xuICBsb2cuaW5mbygnVXNpbmcgc3RvcmVkIEpXVCB0b2tlbiBmcm9tIFNlY3JldHMgTWFuYWdlcicpO1xuICByZXR1cm4gY2FjaGVkVG9rZW47XG59XG5cbi8vIOKUgOKUgOKUgCBFdmVudCBQYXJzaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5pbnRlcmZhY2UgUGFyc2VkRXZlbnQge1xuICBwaXBlbGluZUFybjogc3RyaW5nO1xuICBldmVudFNvdXJjZTogc3RyaW5nO1xuICBldmVudFR5cGU6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIGV4ZWN1dGlvbklkPzogc3RyaW5nO1xuICBzdGFnZU5hbWU/OiBzdHJpbmc7XG4gIGFjdGlvbk5hbWU/OiBzdHJpbmc7XG4gIHN0YXJ0ZWRBdD86IHN0cmluZztcbiAgY29tcGxldGVkQXQ/OiBzdHJpbmc7XG4gIGR1cmF0aW9uTXM/OiBudW1iZXI7XG4gIGRldGFpbDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmZ1bmN0aW9uIGNsYXNzaWZ5RXZlbnQoZGV0YWlsVHlwZTogc3RyaW5nKTogeyBldmVudFR5cGU6IHN0cmluZzsgZXZlbnRTb3VyY2U6IHN0cmluZyB9IHtcbiAgaWYgKGRldGFpbFR5cGUuaW5jbHVkZXMoJ1BpcGVsaW5lIEV4ZWN1dGlvbicpKSByZXR1cm4geyBldmVudFR5cGU6ICdQSVBFTElORScsIGV2ZW50U291cmNlOiAnY29kZXBpcGVsaW5lJyB9O1xuICBpZiAoZGV0YWlsVHlwZS5pbmNsdWRlcygnU3RhZ2UgRXhlY3V0aW9uJykpIHJldHVybiB7IGV2ZW50VHlwZTogJ1NUQUdFJywgZXZlbnRTb3VyY2U6ICdjb2RlcGlwZWxpbmUnIH07XG4gIGlmIChkZXRhaWxUeXBlLmluY2x1ZGVzKCdBY3Rpb24gRXhlY3V0aW9uJykpIHJldHVybiB7IGV2ZW50VHlwZTogJ0FDVElPTicsIGV2ZW50U291cmNlOiAnY29kZXBpcGVsaW5lJyB9O1xuICBpZiAoZGV0YWlsVHlwZS5pbmNsdWRlcygnQnVpbGQgU3RhdGUnKSkgcmV0dXJuIHsgZXZlbnRUeXBlOiAnQlVJTEQnLCBldmVudFNvdXJjZTogJ2NvZGVidWlsZCcgfTtcbiAgcmV0dXJuIHsgZXZlbnRUeXBlOiAnUElQRUxJTkUnLCBldmVudFNvdXJjZTogJ2NvZGVwaXBlbGluZScgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VSZWNvcmQocmVjb3JkOiBTUVNSZWNvcmQpOiBQYXJzZWRFdmVudCB7XG4gIGNvbnN0IGV2ZW50ID0gSlNPTi5wYXJzZShyZWNvcmQuYm9keSkgYXMge1xuICAgICdkZXRhaWwtdHlwZSc6IHN0cmluZztcbiAgICAnc291cmNlJzogc3RyaW5nO1xuICAgICdkZXRhaWwnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAndGltZSc6IHN0cmluZztcbiAgICAncmVnaW9uJzogc3RyaW5nO1xuICAgICdhY2NvdW50Jzogc3RyaW5nO1xuICB9O1xuXG4gIGNvbnN0IGRldGFpbCA9IHsgLi4uZXZlbnQuZGV0YWlsIH07XG4gIGNvbnN0IHBpcGVsaW5lTmFtZSA9IGRldGFpbC5waXBlbGluZSBhcyBzdHJpbmc7XG5cbiAgLy8gSGFzaCBhY2NvdW50IGluIEFSTiBzbyB0aGUgcmVhbCBhY2NvdW50IG5ldmVyIHJlYWNoZXMgdGhlIGRhdGFiYXNlLlxuICAvLyBNdXN0IHVzZSB0aGUgc2FtZSBoYXNoSWQgYWxnb3JpdGhtIGFzIGFwaS1jb3JlIHNvIHJlZ2lzdHJ5IGxvb2t1cHMgbWF0Y2guXG4gIGNvbnN0IHBpcGVsaW5lQXJuID0gaGFzaEFjY291bnRJbkFybihcbiAgICBgYXJuOmF3czpjb2RlcGlwZWxpbmU6JHtldmVudC5yZWdpb259OiR7ZXZlbnQuYWNjb3VudH06JHtwaXBlbGluZU5hbWV9YCxcbiAgKTtcblxuICAvLyBIYXNoIGFjY291bnQgaW4gZGV0YWlsIHRvb1xuICBpZiAoZXZlbnQuYWNjb3VudCkge1xuICAgIGRldGFpbC5hY2NvdW50ID0gaGFzaElkKGV2ZW50LmFjY291bnQpO1xuICB9XG5cbiAgY29uc3QgeyBldmVudFR5cGUsIGV2ZW50U291cmNlIH0gPSBjbGFzc2lmeUV2ZW50KGV2ZW50WydkZXRhaWwtdHlwZSddKTtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gKGRldGFpbFsnc3RhcnQtdGltZSddIGFzIHN0cmluZykgfHwgZXZlbnQudGltZTtcbiAgY29uc3Qgc3RhdGUgPSBkZXRhaWwuc3RhdGUgYXMgc3RyaW5nO1xuXG4gIGxldCBkdXJhdGlvbk1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxldCBjb21wbGV0ZWRBdDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGlmIChbJ1NVQ0NFRURFRCcsICdGQUlMRUQnLCAnQ0FOQ0VMRUQnLCAnU1RPUFBFRCddLmluY2x1ZGVzKHN0YXRlKSkge1xuICAgIGNvbXBsZXRlZEF0ID0gZXZlbnQudGltZTtcbiAgICBpZiAoc3RhcnRlZEF0ICYmIGNvbXBsZXRlZEF0KSB7XG4gICAgICBjb25zdCBtcyA9IG5ldyBEYXRlKGNvbXBsZXRlZEF0KS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShzdGFydGVkQXQpLmdldFRpbWUoKTtcbiAgICAgIGlmIChtcyA+PSAwKSBkdXJhdGlvbk1zID0gbXM7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwaXBlbGluZUFybixcbiAgICBldmVudFNvdXJjZSxcbiAgICBldmVudFR5cGUsXG4gICAgc3RhdHVzOiBzdGF0ZSxcbiAgICBleGVjdXRpb25JZDogZGV0YWlsWydleGVjdXRpb24taWQnXSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc3RhZ2VOYW1lOiBkZXRhaWwuc3RhZ2UgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGFjdGlvbk5hbWU6IGRldGFpbC5hY3Rpb24gYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHN0YXJ0ZWRBdCxcbiAgICBjb21wbGV0ZWRBdCxcbiAgICBkdXJhdGlvbk1zLFxuICAgIGRldGFpbCxcbiAgfTtcbn1cblxuLy8g4pSA4pSA4pSAIEhhbmRsZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBjb25zdCBoYW5kbGVyID0gYXN5bmMgKGV2ZW50OiBTUVNFdmVudCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCBiYXNlVXJsID0gcHJvY2Vzcy5lbnYuUExBVEZPUk1fQkFTRV9VUkw7XG4gIGlmICghYmFzZVVybCkgdGhyb3cgbmV3IEVycm9yKCdQTEFURk9STV9CQVNFX1VSTCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyByZXF1aXJlZCcpO1xuXG4gIC8vIFBhcnNlIGFsbCBldmVudHNcbiAgY29uc3QgZXZlbnRzID0gZXZlbnQuUmVjb3Jkcy5tYXAocGFyc2VSZWNvcmQpO1xuXG4gIC8vIEF1dGhlbnRpY2F0ZVxuICBjb25zdCB0b2tlbiA9IGF3YWl0IGdldEF1dGhUb2tlbigpO1xuXG4gIC8vIFBPU1QgYmF0Y2ggdG8gcmVwb3J0aW5nIHNlcnZpY2VcbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7YmFzZVVybH0vYXBpL3JlcG9ydHMvZXZlbnRzYCwge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBldmVudHMgfSksXG4gIH0pO1xuXG4gIGlmICghcmVzLm9rKSB7XG4gICAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCkuY2F0Y2goKCkgPT4gJycpO1xuICAgIGxvZy5lcnJvcihgUmVwb3J0aW5nIEFQSSByZXR1cm5lZCAke3Jlcy5zdGF0dXN9YCwgeyBib2R5IH0pO1xuICAgIHRocm93IG5ldyBFcnJvcihgUmVwb3J0aW5nIEFQSSBmYWlsZWQ6ICR7cmVzLnN0YXR1c31gKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcy5qc29uKCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGxvZy5pbmZvKGBJbmdlc3RlZCAke2V2ZW50cy5sZW5ndGh9IGV2ZW50c2AsIHsgaW5zZXJ0ZWQ6IHJlc3VsdC5kYXRhIH0pO1xufTtcbiJdfQ==
216
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQWU5RixJQUFJLGVBQStDLENBQUM7QUFDcEQsS0FBSyxVQUFVLGdCQUFnQjtJQUM3QixJQUFJLENBQUMsZUFBZTtRQUFFLGVBQWUsR0FBRyxDQUFDLE1BQU0sTUFBTSxDQUFDLDhCQUE4QixDQUFDLENBQWtDLENBQUM7SUFDeEgsT0FBTyxlQUFlLENBQUM7QUFDekIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE1BQU0sR0FBRyxHQUFHO0lBQ1YsSUFBSSxFQUFFLENBQUMsR0FBVyxFQUFFLElBQWMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdkksSUFBSSxFQUFFLENBQUMsR0FBVyxFQUFFLElBQWMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdkksS0FBSyxFQUFFLENBQUMsR0FBVyxFQUFFLElBQWMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7Q0FDNUksQ0FBQztBQUVGLDREQUE0RDtBQUM1RCxpRkFBaUY7QUFDakYsaUZBQWlGO0FBQ2pGLHlFQUF5RTtBQUN6RSx3REFBd0Q7QUFDeEQsRUFBRTtBQUNGLGtGQUFrRjtBQUNsRiw2RUFBNkU7QUFDN0UsK0JBQStCO0FBRS9CLE1BQU0scUJBQXFCLEdBQUcsbUJBQW1CLENBQUM7QUFDbEQsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQWtDLENBQUM7QUFDbEUsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQXlCLENBQUMsQ0FBQyxnREFBZ0Q7QUFFdkcsS0FBSyxVQUFVLGNBQWMsQ0FBQyxNQUFjO0lBQzFDLElBQUksTUFBTSxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osTUFBTSxFQUFFLGtCQUFrQixFQUFFLEdBQUcsTUFBTSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hELE1BQU0sR0FBRyxJQUFJLGtCQUFrQixDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUM1QyxlQUFlLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsS0FBSyxVQUFVLHNCQUFzQixDQUFDLEdBQVcsRUFBRSxNQUFjO0lBQy9ELElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFFLENBQUM7SUFDekQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUMsTUFBTSxFQUFFLDBCQUEwQixFQUFFLEdBQUcsTUFBTSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ2hFLE1BQU0sR0FBRyxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLDBCQUEwQixDQUFDLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNwRixNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUsscUJBQXFCLENBQUMsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDO1FBQ2hGLElBQUksQ0FBQyxHQUFHO1lBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxrRUFBa0UsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDaEcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDM0IsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLE1BQU0sSUFBSSxHQUFJLEdBQXlCLEVBQUUsSUFBSSxDQUFDO1FBQzlDLElBQUksSUFBSSxLQUFLLHVCQUF1QixFQUFFLENBQUM7WUFDckMsNkVBQTZFO1lBQzdFLEdBQUcsQ0FBQyxLQUFLLENBQUMscUZBQXFGLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdkgsTUFBTSxHQUFHLENBQUM7UUFDWixDQUFDO1FBQ0QsR0FBRyxDQUFDLEtBQUssQ0FBQyx5Q0FBeUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUYsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQztBQUVELDJEQUEyRDtBQUUzRCxJQUFJLFdBQVcsR0FBa0IsSUFBSSxDQUFDO0FBRXRDLEtBQUssVUFBVSxZQUFZO0lBQ3pCLElBQUksV0FBVztRQUFFLE9BQU8sV0FBVyxDQUFDO0lBRXBDLDJEQUEyRDtJQUMzRCxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDL0IsV0FBVyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDO1FBQ3pDLEdBQUcsQ0FBQyxJQUFJLENBQUMsdUNBQXVDLENBQUMsQ0FBQztRQUNsRCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRUQsMkRBQTJEO0lBQzNELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUM7SUFDcEQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMseUVBQXlFLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBRUQsR0FBRyxDQUFDLElBQUksQ0FBQyx3Q0FBd0MsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUMvRCxNQUFNLE1BQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLHFCQUFxQixDQUFDLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUV4RixJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVk7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLFdBQVcsVUFBVSxZQUFZLENBQUMsQ0FBQztJQUUvRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQTJCLENBQUM7SUFDM0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLDZFQUE2RSxDQUFDLENBQUM7SUFDakcsQ0FBQztJQUVELFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO0lBQ2pDLEdBQUcsQ0FBQyxJQUFJLENBQUMsNkNBQTZDLENBQUMsQ0FBQztJQUN4RCxPQUFPLFdBQVcsQ0FBQztBQUNyQixDQUFDO0FBc0JELGtGQUFrRjtBQUNsRixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQztBQUUvQixTQUFTLGFBQWEsQ0FBQyxVQUFrQjtJQUN2QyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUM7UUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLENBQUM7SUFDN0csSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDO1FBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxDQUFDO0lBQ3ZHLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQztRQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsQ0FBQztJQUN6RyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDO1FBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQ2hHLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsQ0FBQztBQUNoRSxDQUFDO0FBRUQsNEVBQTRFO0FBQzVFLEtBQUssVUFBVSxXQUFXLENBQUMsTUFBaUI7SUFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQU9uQyxDQUFDO0lBRUYsTUFBTSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDdkUsTUFBTSxNQUFNLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNuQywyRUFBMkU7SUFDM0UsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDO0lBRXRCLDZFQUE2RTtJQUM3RSw4RUFBOEU7SUFDOUUsNkVBQTZFO0lBQzdFLDRFQUE0RTtJQUM1RSxJQUFJLFdBQVcsS0FBSyxjQUFjLEVBQUUsQ0FBQztRQUNuQyxHQUFHLENBQUMsSUFBSSxDQUFDLDhEQUE4RCxFQUFFLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0csT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFFBQThCLENBQUM7SUFDM0QsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2xCLEdBQUcsQ0FBQyxJQUFJLENBQUMscURBQXFELENBQUMsQ0FBQztRQUNoRSxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCw0RUFBNEU7SUFDNUUseUVBQXlFO0lBQ3pFLE1BQU0sR0FBRyxHQUFHLHdCQUF3QixLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksWUFBWSxFQUFFLENBQUM7SUFDcEYsTUFBTSxVQUFVLEdBQUcsTUFBTSxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25FLElBQUksQ0FBQyxVQUFVO1FBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxpQ0FBaUM7SUFFL0QsTUFBTSxTQUFTLEdBQUksTUFBTSxDQUFDLFlBQVksQ0FBWSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUM7SUFDakUsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQWUsQ0FBQztJQUVyQyxJQUFJLFVBQThCLENBQUM7SUFDbkMsSUFBSSxXQUErQixDQUFDO0lBRXBDLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNuRSxXQUFXLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztRQUN6QixJQUFJLFNBQVMsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUM3QixNQUFNLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMzRSxJQUFJLEVBQUUsSUFBSSxDQUFDO2dCQUFFLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDL0IsQ0FBQztJQUNILENBQUM7SUFFRCw2RUFBNkU7SUFDN0UsOEVBQThFO0lBQzlFLDRCQUE0QjtJQUM1QixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQTJELENBQUM7SUFDcEcsTUFBTSxPQUFPLEdBQUcsTUFBTSxFQUFFLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUN2RCxNQUFNLFlBQVksR0FBRyxPQUFPLE9BQU8sS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQ3BFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQztRQUNyQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBRWQsT0FBTztRQUNMLFVBQVU7UUFDVixXQUFXO1FBQ1gsU0FBUztRQUNULE1BQU0sRUFBRSxLQUFLO1FBQ2IsV0FBVyxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQXVCO1FBQ3pELFNBQVMsRUFBRSxNQUFNLENBQUMsS0FBMkI7UUFDN0MsVUFBVSxFQUFFLE1BQU0sQ0FBQyxNQUE0QjtRQUMvQyxZQUFZO1FBQ1osU0FBUztRQUNULFdBQVc7UUFDWCxVQUFVO1FBQ1YsTUFBTTtLQUNQLENBQUM7QUFDSixDQUFDO0FBRUQsMkRBQTJEO0FBRTNELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxLQUFLLEVBQUUsS0FBZSxFQUFpQixFQUFFO0lBQzlELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUM7SUFDOUMsSUFBSSxDQUFDLE9BQU87UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7SUFFcEYsMEVBQTBFO0lBQzFFLE1BQU0sTUFBTSxHQUFHLENBQUMsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7U0FDL0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFvQixFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQy9DLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN4QixHQUFHLENBQUMsSUFBSSxDQUFDLDRDQUE0QyxDQUFDLENBQUM7UUFDdkQsT0FBTztJQUNULENBQUM7SUFFRCxlQUFlO0lBQ2YsTUFBTSxLQUFLLEdBQUcsTUFBTSxZQUFZLEVBQUUsQ0FBQztJQUVuQyxrQ0FBa0M7SUFDbEMsTUFBTSxHQUFHLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxPQUFPLHFCQUFxQixFQUFFO1FBQ3ZELE1BQU0sRUFBRSxNQUFNO1FBQ2QsT0FBTyxFQUFFO1lBQ1AsY0FBYyxFQUFFLGtCQUFrQjtZQUNsQyxlQUFlLEVBQUUsVUFBVSxLQUFLLEVBQUU7U0FDbkM7UUFDRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDO0tBQ2pDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksR0FBRyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUMsR0FBRyxDQUFDLEtBQUssQ0FBQywwQkFBMEIsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM1RCxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUE2QixDQUFDO0lBQzNELEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxNQUFNLENBQUMsTUFBTSxTQUFTLEVBQUUsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7QUFDMUUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IEdldFNlY3JldFZhbHVlQ29tbWFuZCwgU2VjcmV0c01hbmFnZXJDbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtc2VjcmV0cy1tYW5hZ2VyJztcbmltcG9ydCB0eXBlIHsgU1FTRXZlbnQsIFNRU1JlY29yZCB9IGZyb20gJ2F3cy1sYW1iZGEnO1xuXG4vLyBBV1MgTGFtYmRhJ3MgTm9kZSBydW50aW1lIGJ1bmRsZXMgQGF3cy1zZGsgdjMsIHNvIHRoZSBDb2RlUGlwZWxpbmUgY2xpZW50IGlzXG4vLyBsb2FkZWQgbGF6aWx5IHZpYSBkeW5hbWljIGltcG9ydCgpIOKAlCBhIHN0YXRpYyB3b3Jrc3BhY2UgZGVwZW5kZW5jeSBvblxuLy8gQGF3cy1zZGsvY2xpZW50LWNvZGVwaXBlbGluZSB3b3VsZCBwZXJ0dXJiIHRoZSBzaGFyZWQgQGF3cy1zZGsgdmVyc2lvbiB0cmVlXG4vLyBhbmQgYnJlYWsgb3RoZXIgcGFja2FnZXMnIHR5cGluZ3MuIFRoZSBkeW5hbWljIGltcG9ydCBrZWVwcyBpdCBvdXQgb2YgdGhlXG4vLyBzdGF0aWMgZ3JhcGggd2hpbGUgc3RheWluZyBFU00tY29ycmVjdCAobm8gYHJlcXVpcmVgIGluIGEgdHlwZTptb2R1bGUgcGFja2FnZSlcbi8vIGFuZCBtb2NrYWJsZS4gTWluaW1hbCBsb2NhbCB0eXBlcyBrZWVwIHRoZSBjYWxsIHNpdGVzIHR5cGUtY2hlY2tlZC5cbmludGVyZmFjZSBMaXN0VGFnc091dHB1dCB7IHRhZ3M/OiBBcnJheTx7IGtleT86IHN0cmluZzsgdmFsdWU/OiBzdHJpbmcgfT4gfVxuaW50ZXJmYWNlIENvZGVQaXBlbGluZUNsaWVudExpa2UgeyBzZW5kKGNvbW1hbmQ6IHVua25vd24pOiBQcm9taXNlPExpc3RUYWdzT3V0cHV0PiB9XG5pbnRlcmZhY2UgQ29kZVBpcGVsaW5lTW9kdWxlIHtcbiAgQ29kZVBpcGVsaW5lQ2xpZW50OiBuZXcgKGNvbmZpZzogeyByZWdpb246IHN0cmluZyB9KSA9PiBDb2RlUGlwZWxpbmVDbGllbnRMaWtlO1xuICBMaXN0VGFnc0ZvclJlc291cmNlQ29tbWFuZDogbmV3IChpbnB1dDogeyByZXNvdXJjZUFybjogc3RyaW5nIH0pID0+IHVua25vd247XG59XG5sZXQgY29kZXBpcGVsaW5lTW9kOiBDb2RlUGlwZWxpbmVNb2R1bGUgfCB1bmRlZmluZWQ7XG5hc3luYyBmdW5jdGlvbiBsb2FkQ29kZVBpcGVsaW5lKCk6IFByb21pc2U8Q29kZVBpcGVsaW5lTW9kdWxlPiB7XG4gIGlmICghY29kZXBpcGVsaW5lTW9kKSBjb2RlcGlwZWxpbmVNb2QgPSAoYXdhaXQgaW1wb3J0KCdAYXdzLXNkay9jbGllbnQtY29kZXBpcGVsaW5lJykpIGFzIHVua25vd24gYXMgQ29kZVBpcGVsaW5lTW9kdWxlO1xuICByZXR1cm4gY29kZXBpcGVsaW5lTW9kO1xufVxuXG4vKipcbiAqIFBpcGVsaW5lIGV2ZW50IGluZ2VzdGlvbiBMYW1iZGEgaGFuZGxlci5cbiAqXG4gKiBSZWNlaXZlcyBDb2RlUGlwZWxpbmUvQ29kZUJ1aWxkIGV2ZW50cyBmcm9tIFNRUyAoc291cmNlZCBieSBFdmVudEJyaWRnZSksXG4gKiBwYXJzZXMgdGhlbSBpbnRvIGEgbm9ybWFsaXplZCBmb3JtYXQsIGFuZCBQT1NUcyB0aGVtIHRvIHRoZSByZXBvcnRpbmcgc2VydmljZVxuICogdmlhIFBMQVRGT1JNX0JBU0VfVVJMLlxuICpcbiAqIEF1dGhlbnRpY2F0aW9uOlxuICogLSBQTEFURk9STV9UT0tFTiBlbnYgdmFyIChwcmVmZXJyZWQg4oCUIG5vIFNlY3JldHMgTWFuYWdlciBjYWxsKVxuICogLSBQTEFURk9STV9TRUNSRVRfTkFNRSBlbnYgdmFyIOKGkiByZWFkcyBhY2Nlc3NUb2tlbiBmcm9tIFNlY3JldHMgTWFuYWdlclxuICpcbiAqIEVudmlyb25tZW50IHZhcmlhYmxlczpcbiAqIC0gUExBVEZPUk1fQkFTRV9VUkwg4oCUIEJhc2UgVVJMIG9mIHRoZSBwbGF0Zm9ybVxuICogLSBQTEFURk9STV9UT0tFTiDigJQgSldUIHRva2VuIChzZXQgZGlyZWN0bHksIG9yKVxuICogLSBQTEFURk9STV9TRUNSRVRfTkFNRSDigJQgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCBjb250YWluaW5nIHsgYWNjZXNzVG9rZW4gfVxuICovXG5cbmNvbnN0IGxvZyA9IHtcbiAgaW5mbzogKG1zZzogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoeyBsZXZlbDogJ0lORk8nLCBtZXNzYWdlOiBtc2csIGRhdGEsIHRzOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfSkpLFxuICB3YXJuOiAobXNnOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IGxldmVsOiAnV0FSTicsIG1lc3NhZ2U6IG1zZywgZGF0YSwgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KSksXG4gIGVycm9yOiAobXNnOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiBjb25zb2xlLmVycm9yKEpTT04uc3RyaW5naWZ5KHsgbGV2ZWw6ICdFUlJPUicsIG1lc3NhZ2U6IG1zZywgZGF0YSwgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KSksXG59O1xuXG4vLyDilIDilIAgUElQRUxJTkVfRVZFTlRfSUQgcmVzb2x1dGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFBpcGVsaW5lcyBhcmUgdGFnZ2VkIGBQSVBFTElORV9FVkVOVF9JRD08cGlwZWxpbmVJZD5gIGF0IENESyBzeW50aC4gV2UgcmVzb2x2ZVxuLy8gdGhhdCB0YWcgZnJvbSB0aGUgbGl2ZSBDb2RlUGlwZWxpbmUgKHJlZ2lvbi1hd2FyZSkgYW5kIHJlcG9ydCBhZ2FpbnN0IHRoZSBpZCDigJRcbi8vIHRoZSBBUk4vYWNjb3VudCBuZXZlciBsZWF2ZSBBV1MsIHNvIHRoZXJlJ3Mgbm8gbWFza2luZy4gQ2FjaGVkIHBlciBBUk5cbi8vICh3YXJtLWNvbnRhaW5lcikgdG8gYXZvaWQgaGFtbWVyaW5nIHRoZSBMaXN0VGFncyBBUEkuXG4vL1xuLy8gUmVxdWlyZXMgdGhlIExhbWJkYSBleGVjdXRpb24gcm9sZSB0byBhbGxvdyBgY29kZXBpcGVsaW5lOkxpc3RUYWdzRm9yUmVzb3VyY2VgLlxuLy8gQWNjZXNzRGVuaWVkIGlzIGEgY29uZmlnIGVycm9yIChhbGVydCBsb3VkbHkpOyBhIG1pc3NpbmcgdGFnIGlzIHRyZWF0ZWQgYXNcbi8vIFwibm90IHlldCByZWdpc3RlcmVkXCIgKHNraXApLlxuXG5jb25zdCBQSVBFTElORV9FVkVOVF9JRF9UQUcgPSAnUElQRUxJTkVfRVZFTlRfSUQnO1xuY29uc3QgY2xpZW50c0J5UmVnaW9uID0gbmV3IE1hcDxzdHJpbmcsIENvZGVQaXBlbGluZUNsaWVudExpa2U+KCk7XG5jb25zdCBldmVudElkQnlBcm4gPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nIHwgbnVsbD4oKTsgLy8gbnVsbCA9IHJlc29sdmVkLWJ1dC11bnRhZ2dlZCAobmVnYXRpdmUgY2FjaGUpXG5cbmFzeW5jIGZ1bmN0aW9uIHBpcGVsaW5lQ2xpZW50KHJlZ2lvbjogc3RyaW5nKTogUHJvbWlzZTxDb2RlUGlwZWxpbmVDbGllbnRMaWtlPiB7XG4gIGxldCBjbGllbnQgPSBjbGllbnRzQnlSZWdpb24uZ2V0KHJlZ2lvbik7XG4gIGlmICghY2xpZW50KSB7XG4gICAgY29uc3QgeyBDb2RlUGlwZWxpbmVDbGllbnQgfSA9IGF3YWl0IGxvYWRDb2RlUGlwZWxpbmUoKTtcbiAgICBjbGllbnQgPSBuZXcgQ29kZVBpcGVsaW5lQ2xpZW50KHsgcmVnaW9uIH0pO1xuICAgIGNsaWVudHNCeVJlZ2lvbi5zZXQocmVnaW9uLCBjbGllbnQpO1xuICB9XG4gIHJldHVybiBjbGllbnQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIENvZGVQaXBlbGluZSdzIFBJUEVMSU5FX0VWRU5UX0lEIHRhZyDihpIgdGhlIHBsYXRmb3JtIHBpcGVsaW5lSWQuXG4gKiBSZXR1cm5zIG51bGwgd2hlbiB0aGUgcGlwZWxpbmUgaGFzIG5vIHN1Y2ggdGFnICh1bnJlZ2lzdGVyZWQpLiBUaHJvd3Mgb25cbiAqIEFjY2Vzc0RlbmllZCBzbyBhIG1pc3NpbmcgSUFNIGdyYW50IHN1cmZhY2VzIGxvdWRseSBpbnN0ZWFkIG9mIHNpbGVudGx5XG4gKiBkcm9wcGluZyBldmVyeSBldmVudC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVBpcGVsaW5lRXZlbnRJZChhcm46IHN0cmluZywgcmVnaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgaWYgKGV2ZW50SWRCeUFybi5oYXMoYXJuKSkgcmV0dXJuIGV2ZW50SWRCeUFybi5nZXQoYXJuKSE7XG4gIHRyeSB7XG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgcGlwZWxpbmVDbGllbnQocmVnaW9uKTtcbiAgICBjb25zdCB7IExpc3RUYWdzRm9yUmVzb3VyY2VDb21tYW5kIH0gPSBhd2FpdCBsb2FkQ29kZVBpcGVsaW5lKCk7XG4gICAgY29uc3Qgb3V0ID0gYXdhaXQgY2xpZW50LnNlbmQobmV3IExpc3RUYWdzRm9yUmVzb3VyY2VDb21tYW5kKHsgcmVzb3VyY2VBcm46IGFybiB9KSk7XG4gICAgY29uc3QgdGFnID0gb3V0LnRhZ3M/LmZpbmQodCA9PiB0LmtleSA9PT0gUElQRUxJTkVfRVZFTlRfSURfVEFHKT8udmFsdWUgPz8gbnVsbDtcbiAgICBpZiAoIXRhZykgbG9nLndhcm4oJ1BpcGVsaW5lIG1pc3NpbmcgUElQRUxJTkVfRVZFTlRfSUQgdGFnIOKAlCBza2lwcGluZyAocmVnaXN0ZXIgaXQ/KScsIHsgYXJuIH0pO1xuICAgIGV2ZW50SWRCeUFybi5zZXQoYXJuLCB0YWcpO1xuICAgIHJldHVybiB0YWc7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnN0IG5hbWUgPSAoZXJyIGFzIHsgbmFtZT86IHN0cmluZyB9KT8ubmFtZTtcbiAgICBpZiAobmFtZSA9PT0gJ0FjY2Vzc0RlbmllZEV4Y2VwdGlvbicpIHtcbiAgICAgIC8vIERvbid0IGNhY2hlIOKAlCB0aGlzIGlzIGEgZml4YWJsZSBtaXNjb25maWcsIG5vdCBhIHByb3BlcnR5IG9mIHRoZSBwaXBlbGluZS5cbiAgICAgIGxvZy5lcnJvcignQWNjZXNzRGVuaWVkIGNhbGxpbmcgY29kZXBpcGVsaW5lOkxpc3RUYWdzRm9yUmVzb3VyY2Ug4oCUIGdyYW50IGl0IHRvIHRoZSBMYW1iZGEgcm9sZScsIHsgYXJuLCBlcnJvcjogbmFtZSB9KTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgbG9nLmVycm9yKCdGYWlsZWQgdG8gcmVzb2x2ZSBQSVBFTElORV9FVkVOVF9JRCB0YWcnLCB7IGFybiwgZXJyb3I6IG5hbWUgPz8gU3RyaW5nKGVycikgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLy8g4pSA4pSA4pSAIEF1dGgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmxldCBjYWNoZWRUb2tlbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEF1dGhUb2tlbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoY2FjaGVkVG9rZW4pIHJldHVybiBjYWNoZWRUb2tlbjtcblxuICAvLyBQYXRoIDE6IFBMQVRGT1JNX1RPS0VOIGVudiB2YXIgKG5vIFNlY3JldHMgTWFuYWdlciBjYWxsKVxuICBpZiAocHJvY2Vzcy5lbnYuUExBVEZPUk1fVE9LRU4pIHtcbiAgICBjYWNoZWRUb2tlbiA9IHByb2Nlc3MuZW52LlBMQVRGT1JNX1RPS0VOO1xuICAgIGxvZy5pbmZvKCdVc2luZyBQTEFURk9STV9UT0tFTiBmcm9tIGVudmlyb25tZW50Jyk7XG4gICAgcmV0dXJuIGNhY2hlZFRva2VuO1xuICB9XG5cbiAgLy8gUGF0aCAyOiBQTEFURk9STV9TRUNSRVRfTkFNRSDihpIgcmVhZCBmcm9tIFNlY3JldHMgTWFuYWdlclxuICBjb25zdCBzZWNyZXROYW1lID0gcHJvY2Vzcy5lbnYuUExBVEZPUk1fU0VDUkVUX05BTUU7XG4gIGlmICghc2VjcmV0TmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignUExBVEZPUk1fVE9LRU4gb3IgUExBVEZPUk1fU0VDUkVUX05BTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIGxvZy5pbmZvKGBGZXRjaGluZyB0b2tlbiBmcm9tIFNlY3JldHMgTWFuYWdlcjogJHtzZWNyZXROYW1lfWApO1xuICBjb25zdCBjbGllbnQgPSBuZXcgU2VjcmV0c01hbmFnZXJDbGllbnQoe30pO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQoeyBTZWNyZXRJZDogc2VjcmV0TmFtZSB9KSk7XG5cbiAgaWYgKCFyZXNwb25zZS5TZWNyZXRTdHJpbmcpIHRocm93IG5ldyBFcnJvcihgU2VjcmV0IFwiJHtzZWNyZXROYW1lfVwiIGlzIGVtcHR5YCk7XG5cbiAgY29uc3Qgc2VjcmV0ID0gSlNPTi5wYXJzZShyZXNwb25zZS5TZWNyZXRTdHJpbmcpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGlmICghc2VjcmV0LmFjY2Vzc1Rva2VuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTZWNyZXQgbWlzc2luZyBhY2Nlc3NUb2tlbiDigJQgcnVuIFwicGlwZWxpbmUtbWFuYWdlciBzdG9yZS10b2tlblwiIHRvIGdlbmVyYXRlJyk7XG4gIH1cblxuICBjYWNoZWRUb2tlbiA9IHNlY3JldC5hY2Nlc3NUb2tlbjtcbiAgbG9nLmluZm8oJ1VzaW5nIHN0b3JlZCBKV1QgdG9rZW4gZnJvbSBTZWNyZXRzIE1hbmFnZXInKTtcbiAgcmV0dXJuIGNhY2hlZFRva2VuO1xufVxuXG4vLyDilIDilIDilIAgRXZlbnQgUGFyc2luZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuaW50ZXJmYWNlIFBhcnNlZEV2ZW50IHtcbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICBldmVudFNvdXJjZTogc3RyaW5nO1xuICBldmVudFR5cGU6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIGV4ZWN1dGlvbklkPzogc3RyaW5nO1xuICBzdGFnZU5hbWU/OiBzdHJpbmc7XG4gIGFjdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBmYWlsdXJlIHJlYXNvbiwgZnJvbSBhbiBBY3Rpb24gZXZlbnQnc1xuICAgKiAgYGV4ZWN1dGlvbi1yZXN1bHQuZXh0ZXJuYWwtZXhlY3V0aW9uLXN1bW1hcnlgLiBUaGUgbG9nIFVSTCArIGVycm9yLWNvZGVcbiAgICogIHN0YXkgaW4gYGRldGFpbGAgZm9yIGRyaWxsLWRvd24uICovXG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgc3RhcnRlZEF0Pzogc3RyaW5nO1xuICBjb21wbGV0ZWRBdD86IHN0cmluZztcbiAgZHVyYXRpb25Ncz86IG51bWJlcjtcbiAgZGV0YWlsOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqIENhcCBvbiB0aGUgc3RvcmVkIGZhaWx1cmUgc3VtbWFyeSDigJQgQ29kZUJ1aWxkL0RlcGxveSBzdW1tYXJpZXMgY2FuIGJlIGxvbmcuICovXG5jb25zdCBNQVhfRVJST1JfTUVTU0FHRSA9IDQwMDA7XG5cbmZ1bmN0aW9uIGNsYXNzaWZ5RXZlbnQoZGV0YWlsVHlwZTogc3RyaW5nKTogeyBldmVudFR5cGU6IHN0cmluZzsgZXZlbnRTb3VyY2U6IHN0cmluZyB9IHtcbiAgaWYgKGRldGFpbFR5cGUuaW5jbHVkZXMoJ1BpcGVsaW5lIEV4ZWN1dGlvbicpKSByZXR1cm4geyBldmVudFR5cGU6ICdQSVBFTElORScsIGV2ZW50U291cmNlOiAnY29kZXBpcGVsaW5lJyB9O1xuICBpZiAoZGV0YWlsVHlwZS5pbmNsdWRlcygnU3RhZ2UgRXhlY3V0aW9uJykpIHJldHVybiB7IGV2ZW50VHlwZTogJ1NUQUdFJywgZXZlbnRTb3VyY2U6ICdjb2RlcGlwZWxpbmUnIH07XG4gIGlmIChkZXRhaWxUeXBlLmluY2x1ZGVzKCdBY3Rpb24gRXhlY3V0aW9uJykpIHJldHVybiB7IGV2ZW50VHlwZTogJ0FDVElPTicsIGV2ZW50U291cmNlOiAnY29kZXBpcGVsaW5lJyB9O1xuICBpZiAoZGV0YWlsVHlwZS5pbmNsdWRlcygnQnVpbGQgU3RhdGUnKSkgcmV0dXJuIHsgZXZlbnRUeXBlOiAnQlVJTEQnLCBldmVudFNvdXJjZTogJ2NvZGVidWlsZCcgfTtcbiAgcmV0dXJuIHsgZXZlbnRUeXBlOiAnUElQRUxJTkUnLCBldmVudFNvdXJjZTogJ2NvZGVwaXBlbGluZScgfTtcbn1cblxuLyoqIFBhcnNlICsgcmVzb2x2ZSBvbmUgcmVjb3JkIHRvIGEgcmVwb3J0YWJsZSBldmVudCwgb3IgbnVsbCB0byBza2lwIGl0LiAqL1xuYXN5bmMgZnVuY3Rpb24gcGFyc2VSZWNvcmQocmVjb3JkOiBTUVNSZWNvcmQpOiBQcm9taXNlPFBhcnNlZEV2ZW50IHwgbnVsbD4ge1xuICBjb25zdCBldmVudCA9IEpTT04ucGFyc2UocmVjb3JkLmJvZHkpIGFzIHtcbiAgICAnZGV0YWlsLXR5cGUnOiBzdHJpbmc7XG4gICAgJ3NvdXJjZSc6IHN0cmluZztcbiAgICAnZGV0YWlsJzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgJ3RpbWUnOiBzdHJpbmc7XG4gICAgJ3JlZ2lvbic6IHN0cmluZztcbiAgICAnYWNjb3VudCc6IHN0cmluZztcbiAgfTtcblxuICBjb25zdCB7IGV2ZW50VHlwZSwgZXZlbnRTb3VyY2UgfSA9IGNsYXNzaWZ5RXZlbnQoZXZlbnRbJ2RldGFpbC10eXBlJ10pO1xuICBjb25zdCBkZXRhaWwgPSB7IC4uLmV2ZW50LmRldGFpbCB9O1xuICAvLyBUaGUgcmF3IGFjY291bnQgbmV2ZXIgbmVlZHMgdG8gbGVhdmUgQVdTIG5vdyDigJQgZHJvcCBpdCBmcm9tIHRoZSBwYXlsb2FkLlxuICBkZWxldGUgZGV0YWlsLmFjY291bnQ7XG5cbiAgLy8gQ29kZUJ1aWxkIFwiQnVpbGQgU3RhdGVcIiBldmVudHMgaWRlbnRpZnkgYSBidWlsZCAqcHJvamVjdCosIG5vdCBhIHBpcGVsaW5lLFxuICAvLyBhbmQgYSBwcm9qZWN0IGNhbiBiZSBzaGFyZWQgYWNyb3NzIHBpcGVsaW5lcyDigJQgdGhlcmUncyBubyBjbGVhbiAxOjEgbWFwcGluZ1xuICAvLyB0byBhIFBJUEVMSU5FX0VWRU5UX0lELCBzbyBza2lwIHRoZW0gKHRoZXkgd2VyZSBlZmZlY3RpdmVseSBkcm9wcGVkIGJlZm9yZVxuICAvLyB0b28sIHNpbmNlIGRldGFpbC5waXBlbGluZSB3YXMgdW5kZWZpbmVkIGFuZCBuZXZlciBtYXRjaGVkIHRoZSByZWdpc3RyeSkuXG4gIGlmIChldmVudFNvdXJjZSAhPT0gJ2NvZGVwaXBlbGluZScpIHtcbiAgICBsb2cud2FybignU2tpcHBpbmcgbm9uLUNvZGVQaXBlbGluZSBldmVudCAobm8gcGlwZWxpbmUgdGFnIHRvIHJlc29sdmUpJywgeyBkZXRhaWxUeXBlOiBldmVudFsnZGV0YWlsLXR5cGUnXSB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHBpcGVsaW5lTmFtZSA9IGRldGFpbC5waXBlbGluZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlmICghcGlwZWxpbmVOYW1lKSB7XG4gICAgbG9nLndhcm4oJ0NvZGVQaXBlbGluZSBldmVudCBtaXNzaW5nIHBpcGVsaW5lIG5hbWUg4oCUIHNraXBwaW5nJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBSZXNvbHZlIHRoZSBwaXBlbGluZSdzIFBJUEVMSU5FX0VWRU5UX0lEIHRhZyAoPSBwbGF0Zm9ybSBwaXBlbGluZUlkKS4gVGhlXG4gIC8vIEFSTiBpcyBvbmx5IGEgdHJhbnNpZW50IGhhbmRsZSBmb3IgdGhlIHRhZyBsb29rdXA7IGl0IGlzIG5ldmVyIHN0b3JlZC5cbiAgY29uc3QgYXJuID0gYGFybjphd3M6Y29kZXBpcGVsaW5lOiR7ZXZlbnQucmVnaW9ufToke2V2ZW50LmFjY291bnR9OiR7cGlwZWxpbmVOYW1lfWA7XG4gIGNvbnN0IHBpcGVsaW5lSWQgPSBhd2FpdCByZXNvbHZlUGlwZWxpbmVFdmVudElkKGFybiwgZXZlbnQucmVnaW9uKTtcbiAgaWYgKCFwaXBlbGluZUlkKSByZXR1cm4gbnVsbDsgLy8gdW50YWdnZWQgLyB1bnJlZ2lzdGVyZWQg4oaSIHNraXBcblxuICBjb25zdCBzdGFydGVkQXQgPSAoZGV0YWlsWydzdGFydC10aW1lJ10gYXMgc3RyaW5nKSB8fCBldmVudC50aW1lO1xuICBjb25zdCBzdGF0ZSA9IGRldGFpbC5zdGF0ZSBhcyBzdHJpbmc7XG5cbiAgbGV0IGR1cmF0aW9uTXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IGNvbXBsZXRlZEF0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKFsnU1VDQ0VFREVEJywgJ0ZBSUxFRCcsICdDQU5DRUxFRCcsICdTVE9QUEVEJ10uaW5jbHVkZXMoc3RhdGUpKSB7XG4gICAgY29tcGxldGVkQXQgPSBldmVudC50aW1lO1xuICAgIGlmIChzdGFydGVkQXQgJiYgY29tcGxldGVkQXQpIHtcbiAgICAgIGNvbnN0IG1zID0gbmV3IERhdGUoY29tcGxldGVkQXQpLmdldFRpbWUoKSAtIG5ldyBEYXRlKHN0YXJ0ZWRBdCkuZ2V0VGltZSgpO1xuICAgICAgaWYgKG1zID49IDApIGR1cmF0aW9uTXMgPSBtcztcbiAgICB9XG4gIH1cblxuICAvLyBQcm9tb3RlIHRoZSBmYWlsdXJlIHJlYXNvbiB0byBhIHR5cGVkIGZpZWxkLiBPbiBBY3Rpb24gZXZlbnRzIEFXUyBwdXRzIHRoZVxuICAvLyBodW1hbi1yZWFkYWJsZSBzdW1tYXJ5IChhbmQgYSBsb2cgVVJMICsgZXJyb3ItY29kZSwgd2hpY2ggc3RheSBpbiBgZGV0YWlsYClcbiAgLy8gdW5kZXIgYGV4ZWN1dGlvbi1yZXN1bHRgLlxuICBjb25zdCByZXN1bHQgPSBkZXRhaWxbJ2V4ZWN1dGlvbi1yZXN1bHQnXSBhcyB7ICdleHRlcm5hbC1leGVjdXRpb24tc3VtbWFyeSc/OiB1bmtub3duIH0gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHN1bW1hcnkgPSByZXN1bHQ/LlsnZXh0ZXJuYWwtZXhlY3V0aW9uLXN1bW1hcnknXTtcbiAgY29uc3QgZXJyb3JNZXNzYWdlID0gdHlwZW9mIHN1bW1hcnkgPT09ICdzdHJpbmcnICYmIHN1bW1hcnkubGVuZ3RoID4gMFxuICAgID8gc3VtbWFyeS5zbGljZSgwLCBNQVhfRVJST1JfTUVTU0FHRSlcbiAgICA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIHBpcGVsaW5lSWQsXG4gICAgZXZlbnRTb3VyY2UsXG4gICAgZXZlbnRUeXBlLFxuICAgIHN0YXR1czogc3RhdGUsXG4gICAgZXhlY3V0aW9uSWQ6IGRldGFpbFsnZXhlY3V0aW9uLWlkJ10gYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHN0YWdlTmFtZTogZGV0YWlsLnN0YWdlIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBhY3Rpb25OYW1lOiBkZXRhaWwuYWN0aW9uIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBlcnJvck1lc3NhZ2UsXG4gICAgc3RhcnRlZEF0LFxuICAgIGNvbXBsZXRlZEF0LFxuICAgIGR1cmF0aW9uTXMsXG4gICAgZGV0YWlsLFxuICB9O1xufVxuXG4vLyDilIDilIDilIAgSGFuZGxlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGNvbnN0IGhhbmRsZXIgPSBhc3luYyAoZXZlbnQ6IFNRU0V2ZW50KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGJhc2VVcmwgPSBwcm9jZXNzLmVudi5QTEFURk9STV9CQVNFX1VSTDtcbiAgaWYgKCFiYXNlVXJsKSB0aHJvdyBuZXcgRXJyb3IoJ1BMQVRGT1JNX0JBU0VfVVJMIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHJlcXVpcmVkJyk7XG5cbiAgLy8gUGFyc2UgKyByZXNvbHZlIGFsbCByZWNvcmRzICh0YWcgbG9va3VwcyBydW4gY29uY3VycmVudGx5KTsgZHJvcCBza2lwcy5cbiAgY29uc3QgZXZlbnRzID0gKGF3YWl0IFByb21pc2UuYWxsKGV2ZW50LlJlY29yZHMubWFwKHBhcnNlUmVjb3JkKSkpXG4gICAgLmZpbHRlcigoZSk6IGUgaXMgUGFyc2VkRXZlbnQgPT4gZSAhPT0gbnVsbCk7XG4gIGlmIChldmVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgbG9nLmluZm8oJ05vIHJlc29sdmFibGUgQ29kZVBpcGVsaW5lIGV2ZW50cyBpbiBiYXRjaCcpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEF1dGhlbnRpY2F0ZVxuICBjb25zdCB0b2tlbiA9IGF3YWl0IGdldEF1dGhUb2tlbigpO1xuXG4gIC8vIFBPU1QgYmF0Y2ggdG8gcmVwb3J0aW5nIHNlcnZpY2VcbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7YmFzZVVybH0vYXBpL3JlcG9ydHMvZXZlbnRzYCwge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBldmVudHMgfSksXG4gIH0pO1xuXG4gIGlmICghcmVzLm9rKSB7XG4gICAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCkuY2F0Y2goKCkgPT4gJycpO1xuICAgIGxvZy5lcnJvcihgUmVwb3J0aW5nIEFQSSByZXR1cm5lZCAke3Jlcy5zdGF0dXN9YCwgeyBib2R5IH0pO1xuICAgIHRocm93IG5ldyBFcnJvcihgUmVwb3J0aW5nIEFQSSBmYWlsZWQ6ICR7cmVzLnN0YXR1c31gKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcy5qc29uKCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGxvZy5pbmZvKGBJbmdlc3RlZCAke2V2ZW50cy5sZW5ndGh9IGV2ZW50c2AsIHsgaW5zZXJ0ZWQ6IHJlc3VsdC5kYXRhIH0pO1xufTtcbiJdfQ==
package/package.json CHANGED
@@ -6,20 +6,21 @@
6
6
  "url": "git+https://github.com/mwashburn160/pipeline-builder.git"
7
7
  },
8
8
  "devDependencies": {
9
- "@aws-sdk/client-secrets-manager": "3.997.0",
9
+ "@aws-sdk/client-codepipeline": "3.1064.0",
10
+ "@aws-sdk/client-secrets-manager": "3.1064.0",
11
+ "@jest/globals": "30.2.0",
10
12
  "@stylistic/eslint-plugin": "^2",
11
- "@types/aws-lambda": "8.10.160",
12
- "@types/jest": "30.0.0",
13
- "@types/node": "25.3.0",
13
+ "@types/aws-lambda": "8.10.162",
14
+ "@types/node": "25.9.2",
14
15
  "@typescript-eslint/eslint-plugin": "^8",
15
16
  "@typescript-eslint/parser": "^8",
16
17
  "eslint": "^9",
17
18
  "eslint-import-resolver-typescript": "^4.4.4",
18
19
  "eslint-plugin-import": "^2.32.0",
19
- "jest": "30.0.0",
20
+ "jest": "30.4.2",
20
21
  "jest-junit": "^17",
21
22
  "ts-jest": "^29",
22
- "typescript": "5.9.3"
23
+ "typescript": "6.0.3"
23
24
  },
24
25
  "keywords": [
25
26
  "aws",
@@ -39,7 +40,7 @@
39
40
  "plugins",
40
41
  "typescript",
41
42
  "self-service",
42
- "multi-tenant",
43
+ "multi-team",
43
44
  "compliance",
44
45
  "automation",
45
46
  "infrastructure-as-code",
@@ -59,7 +60,11 @@
59
60
  "main": "lib/index.js",
60
61
  "license": "Apache-2.0",
61
62
  "homepage": "https://mwashburn160.github.io/pipeline-builder/",
62
- "version": "3.4.42",
63
+ "publishConfig": {
64
+ "access": "public",
65
+ "registry": "https://registry.npmjs.org/"
66
+ },
67
+ "version": "3.4.60",
63
68
  "bugs": {
64
69
  "url": "https://github.com/mwashburn160/pipeline-builder/issues"
65
70
  },
@@ -101,6 +106,7 @@
101
106
  "^.+\\.[t]sx?$": [
102
107
  "ts-jest",
103
108
  {
109
+ "useESM": true,
104
110
  "tsconfig": "tsconfig.dev.json",
105
111
  "diagnostics": {
106
112
  "ignoreCodes": [
@@ -110,11 +116,17 @@
110
116
  }
111
117
  ]
112
118
  },
119
+ "extensionsToTreatAsEsm": [
120
+ ".ts",
121
+ ".tsx"
122
+ ],
113
123
  "moduleNameMapper": {
114
- "^uuid$": "<rootDir>/../../jest-uuid-stub.js"
124
+ "^uuid$": "<rootDir>/../../jest-uuid-stub.js",
125
+ "^(\\.{1,2}/.*)\\.js$": "$1"
115
126
  }
116
127
  },
117
128
  "types": "lib/index.d.ts",
129
+ "type": "module",
118
130
  "//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"pnpm dlx projen\".",
119
131
  "scripts": {
120
132
  "build": "pnpm dlx projen build",