@pipeline-builder/api-server 4.1.4 → 4.1.5

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 CHANGED
@@ -15,7 +15,7 @@ Assembles the standardized HTTP runtime shared by every backend service: a confi
15
15
  ### App factory & lifecycle (`./api`)
16
16
  | Export | Purpose |
17
17
  | --- | --- |
18
- | `createApp` | Configured Express app: CORS, Helmet (strict CSP), gzip/deflate compression, org-keyed rate limiting (shared Redis store when `redisUrl` is set), `/health`, `/ready`, `/warmup`, `/metrics`, and Swagger UI + OpenAPI at `/docs`. Fails fast if `JWT_SECRET` is unset. |
18
+ | `createApp` | Configured Express app: CORS, Helmet (strict CSP), gzip/deflate compression, org-keyed rate limiting (shared Redis store when `redisUrl` is set), `/health`, `/ready`, `/warmup`, `/metrics`, and Swagger UI + OpenAPI at `/docs`. Fails fast if this service's own internal signing key or the public key bundle is unset (`SERVICE_SIGNING_KEY_FILE`/`SERVICE_KEY_BUNDLE_FILE`). |
19
19
  | `startServer`, `runServer` | Server lifecycle with graceful shutdown |
20
20
 
21
21
  ### Middleware (`./api`)
@@ -29,6 +29,13 @@ export interface CreateAppOptions {
29
29
  urlEncodedLimit?: string;
30
30
  /** Custom SSE manager instance */
31
31
  sseManager?: SSEManager;
32
+ /**
33
+ * Serve the per-request build-log stream: `POST /logs/ticket` +
34
+ * `GET /logs/:requestId`, a log ticket store, the cross-pod relay, and
35
+ * `ctx.log` frames pushed to SSE. Default false — a service without it has no
36
+ * `/logs` routes and `ctx.log` only writes to the logger.
37
+ */
38
+ logStream?: boolean;
32
39
  /** Health check dependency checker — if provided, /health reports dependency status */
33
40
  checkDependencies?: () => Promise<Record<string, 'connected' | 'disconnected' | 'unknown'>>;
34
41
  /** Enable OpenAPI spec at /docs/openapi.json and Swagger UI at /docs (default: true) */
@@ -83,7 +90,7 @@ export interface CreateAppResult {
83
90
  * - Trust proxy settings
84
91
  * - Health check endpoint (/health)
85
92
  * - Metrics endpoint (/metrics)
86
- * - SSE logs endpoint (/logs/:requestId)
93
+ * - SSE logs endpoint (/logs/:requestId) — only with `logStream: true`
87
94
  *
88
95
  * @param options - Configuration options
89
96
  * @returns Configured Express app and SSE manager
@@ -1,6 +1,6 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
- import { sendSuccess, sendError, generateOpenApiSpec, ErrorCode, createLogger, verifyServicePrincipal, createHealthRouter, setCounterEmitter, requireAuth, safeEqual } from '@pipeline-builder/api-core';
3
+ import { sendSuccess, sendError, generateOpenApiSpec, ErrorCode, createLogger, verifyServicePrincipal, createHealthRouter, setCounterEmitter, requireAuth, safeEqual, createEnvSseTicketStore, SSE_TICKET_TTL_MS } from '@pipeline-builder/api-core';
4
4
  import { Config, CoreConstants } from '@pipeline-builder/pipeline-core';
5
5
  import { getConnection } from '@pipeline-builder/pipeline-data';
6
6
  import compression from 'compression';
@@ -17,7 +17,6 @@ import { createSharedRateLimitStore } from './rate-limit-store.js';
17
17
  import { readinessGuard } from './readiness.js';
18
18
  import { SSEManager, SSE_REQUEST_ID_RE } from '../http/sse-connection-manager.js';
19
19
  import { createEnvRedisSSERelay } from '../http/sse-relay.js';
20
- import { createEnvRedisTicketStore } from '../http/sse-ticket-store.js';
21
20
  // Wire api-core's counter shim to the real prom-client registry. This is
22
21
  // a no-op until incCounter is called for the first time (lazy registration
23
22
  // in metrics.ts), and lets api-core helpers like the quota client record
@@ -34,7 +33,7 @@ setCounterEmitter(incCounter);
34
33
  * - Trust proxy settings
35
34
  * - Health check endpoint (/health)
36
35
  * - Metrics endpoint (/metrics)
37
- * - SSE logs endpoint (/logs/:requestId)
36
+ * - SSE logs endpoint (/logs/:requestId) — only with `logStream: true`
38
37
  *
39
38
  * @param options - Configuration options
40
39
  * @returns Configured Express app and SSE manager
@@ -51,19 +50,27 @@ setCounterEmitter(incCounter);
51
50
  * ```
52
51
  */
53
52
  export function createApp(options = {}) {
54
- const { enableCors = true, enableHelmet = true, enableRateLimit = true, enableJsonBody = true, jsonLimit = '1mb', enableUrlEncoded = true, urlEncodedLimit = '1mb',
55
- // Default SSE manager wired to the shared env Redis ticket/ownership store
56
- // when Redis is configured (multi-pod correctness + cross-service stream
57
- // ownership), else the in-memory default. A caller-supplied `sseManager`
58
- // skips this entirely.
59
- sseManager = new SSEManager({
60
- ticketStore: createEnvRedisTicketStore() ?? undefined,
61
- relay: createEnvRedisSSERelay() ?? undefined,
62
- }), checkDependencies, enableOpenApi = process.env.NODE_ENV !== 'production', openApiOptions, enableCompression = true, warmupHooks = [], idempotencyStore, } = options;
63
- // Fail fast if JWT_SECRET is not configured — prevents silent auth failures at runtime
64
- if (!process.env.JWT_SECRET) {
65
- throw new Error('JWT_SECRET environment variable is required. Set it before starting the server.');
66
- }
53
+ const { enableCors = true, enableHelmet = true, enableRateLimit = true, enableJsonBody = true, jsonLimit = '1mb', enableUrlEncoded = true, urlEncodedLimit = '1mb', logStream = false, checkDependencies, enableOpenApi = process.env.NODE_ENV !== 'production', openApiOptions, enableCompression = true, warmupHooks = [], idempotencyStore, } = options;
54
+ const serviceName = process.env.SERVICE_NAME || 'api';
55
+ // Default SSE manager. The relay (this service's own Redis channel) is built
56
+ // only when something streams: the log stream turns it on here, and an
57
+ // org-keyed channel turns it on when registered (registerSseTicketChannel).
58
+ // The log ticket store exists only with the log stream. A caller-supplied
59
+ // `sseManager` skips this entirely.
60
+ const sseManager = options.sseManager ?? new SSEManager({
61
+ logStream,
62
+ relayFactory: () => createEnvRedisSSERelay(serviceName),
63
+ ...(logStream && {
64
+ ticketStore: createEnvSseTicketStore({
65
+ ttlMs: SSE_TICKET_TTL_MS,
66
+ maxTotal: parseInt(process.env.SSE_MAX_TOTAL_TICKETS || '1000', 10),
67
+ maxPerOrg: parseInt(process.env.SSE_MAX_TICKETS_PER_ORG || '10', 10),
68
+ keyPrefix: `logs:${serviceName}`,
69
+ }),
70
+ }),
71
+ });
72
+ if (logStream)
73
+ sseManager.enableRelay();
67
74
  // Wire the idempotency replay-cache backend used by the post-auth route
68
75
  // factories (createProtectedRoute / createAuthenticatedWithOrgRoute). Prefer
69
76
  // an explicitly injected store; otherwise auto-construct from the shared env
@@ -157,7 +164,7 @@ export function createApp(options = {}) {
157
164
  });
158
165
  // Health check registered before rate limiter so it is never throttled
159
166
  app.use(createHealthRouter({
160
- serviceName: process.env.SERVICE_NAME || 'api',
167
+ serviceName,
161
168
  checkDependencies,
162
169
  }));
163
170
  // Readiness guard — 503s business traffic while the service is NotReady
@@ -260,7 +267,7 @@ export function createApp(options = {}) {
260
267
  // Namespaced per SERVICE: every service shares one Redis, and the old
261
268
  // unprefixed `rl:<ip>` key let one client's traffic to ANY service drain its
262
269
  // budget on EVERY service.
263
- rateLimitOptions.store = createSharedRateLimitStore(`${process.env.SERVICE_NAME || 'api'}:global`);
270
+ rateLimitOptions.store = createSharedRateLimitStore(`${serviceName}:global`);
264
271
  app.use(rateLimit(rateLimitOptions));
265
272
  }
266
273
  // Express request timeout — uses CoreConstants to share the same default as Lambda handlers
@@ -299,49 +306,51 @@ export function createApp(options = {}) {
299
306
  // here is a permanent no-op (org always undefined → skip). It is instead wired
300
307
  // into the post-auth route chains — see `createProtectedRoute` /
301
308
  // `createAuthenticatedWithOrgRoute` in middleware-factory.ts.
302
- // SSE logs endpoint — ticket-gated (Wave 2b).
303
- // The stream carries per-org build logs, so it must not be world-readable.
304
- // Clients first POST /logs/ticket (JWT-authenticated) to mint a short-lived,
305
- // single-use ticket bound to their org AND to the specific `requestId` stream
306
- // they intend to open, then open the EventSource with ?ticket=<t>. This keeps
307
- // the JWT out of query strings / access logs while enforcing org ownership,
308
- // per-subject authorization, and the per-org connection cap on the stream.
309
- // Mirrors the message-service notifications SSE ticket exchange.
310
- app.post('/logs/ticket', requireAuth, async (req, res) => {
311
- const orgId = req.user?.organizationId?.toLowerCase();
312
- if (!orgId) {
313
- sendError(res, 400, 'Token missing organization', ErrorCode.VALIDATION_ERROR);
314
- return;
315
- }
316
- // The caller must name the stream subject up front so the ticket is bound to
317
- // it. Without this, a ticket could be replayed against ANY requestId the
318
- // org could guess, letting it attach to another org's log stream. Strictly
319
- // format-validated so it can't carry an injection payload into the subject.
320
- const requestId = req.body?.requestId;
321
- if (typeof requestId !== 'string' || !SSE_REQUEST_ID_RE.test(requestId)) {
322
- sendError(res, 400, 'Missing or invalid requestId', ErrorCode.VALIDATION_ERROR);
323
- return;
324
- }
325
- const result = await sseManager.createTicket(orgId, requestId);
326
- if (!result.ok) {
327
- if (result.reason === 'forbidden') {
328
- // The subject is owned by another org — do not confirm it exists; a plain
329
- // 403 is enough and leaks nothing about which requestIds are live.
330
- sendError(res, 403, 'Not authorized for this log stream', ErrorCode.INSUFFICIENT_PERMISSIONS);
309
+ if (logStream) {
310
+ // SSE logs endpoint — ticket-gated (Wave 2b).
311
+ // The stream carries per-org build logs, so it must not be world-readable.
312
+ // Clients first POST /logs/ticket (JWT-authenticated) to mint a short-lived,
313
+ // single-use ticket bound to their org AND to the specific `requestId` stream
314
+ // they intend to open, then open the EventSource with ?ticket=<t>. This keeps
315
+ // the JWT out of query strings / access logs while enforcing org ownership,
316
+ // per-subject authorization, and the per-org connection cap on the stream.
317
+ // Mirrors the message-service notifications SSE ticket exchange.
318
+ app.post('/logs/ticket', requireAuth, async (req, res) => {
319
+ const orgId = req.user?.organizationId?.toLowerCase();
320
+ if (!orgId) {
321
+ sendError(res, 400, 'Token missing organization', ErrorCode.VALIDATION_ERROR);
322
+ return;
331
323
  }
332
- else if (result.reason === 'org-limit') {
333
- sendError(res, 429, 'Too many log stream tickets issued', ErrorCode.QUOTA_EXCEEDED);
324
+ // The caller must name the stream subject up front so the ticket is bound to
325
+ // it. Without this, a ticket could be replayed against ANY requestId the
326
+ // org could guess, letting it attach to another org's log stream. Strictly
327
+ // format-validated so it can't carry an injection payload into the subject.
328
+ const requestId = req.body?.requestId;
329
+ if (typeof requestId !== 'string' || !SSE_REQUEST_ID_RE.test(requestId)) {
330
+ sendError(res, 400, 'Missing or invalid requestId', ErrorCode.VALIDATION_ERROR);
331
+ return;
334
332
  }
335
- else {
336
- sendError(res, 503, 'Log streaming subsystem at capacity', ErrorCode.QUOTA_EXCEEDED);
333
+ const result = await sseManager.createTicket(orgId, requestId);
334
+ if (!result.ok) {
335
+ if (result.reason === 'forbidden') {
336
+ // The subject is owned by another org — do not confirm it exists; a plain
337
+ // 403 is enough and leaks nothing about which requestIds are live.
338
+ sendError(res, 403, 'Not authorized for this log stream', ErrorCode.INSUFFICIENT_PERMISSIONS);
339
+ }
340
+ else if (result.reason === 'org-limit') {
341
+ sendError(res, 429, 'Too many log stream tickets issued', ErrorCode.QUOTA_EXCEEDED);
342
+ }
343
+ else {
344
+ sendError(res, 503, 'Log streaming subsystem at capacity', ErrorCode.QUOTA_EXCEEDED);
345
+ }
346
+ return;
337
347
  }
338
- return;
339
- }
340
- sendSuccess(res, 200, { ticket: result.ticket });
341
- });
342
- // The stream itself resolves + consumes the ticket inside middleware() and
343
- // rejects any anonymous / invalid / expired / already-used ticket with 401.
344
- app.get('/logs/:requestId', sseManager.middleware());
348
+ sendSuccess(res, 200, { ticket: result.ticket });
349
+ });
350
+ // The stream itself resolves + consumes the ticket inside middleware() and
351
+ // rejects any anonymous / invalid / expired / already-used ticket with 401.
352
+ app.get('/logs/:requestId', sseManager.middleware());
353
+ }
345
354
  return { app, sseManager };
346
355
  }
347
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLWZhY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL2FwcC1mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxzQkFBc0IsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFek0sT0FBTyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDaEUsT0FBTyxXQUFXLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUN4QixPQUFPLE9BQU8sRUFBRSxFQUFnRSxNQUFNLFNBQVMsQ0FBQztBQUNoRyxPQUFPLFNBQVMsRUFBRSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9ELE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLFNBQVMsTUFBTSxvQkFBb0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLDhCQUE4QixFQUFFLG1CQUFtQixFQUF5QixNQUFNLDZCQUE2QixDQUFDO0FBQ3pILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0Is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QUM7WUFDRCxPQUFPO1FBQ1QsQ0FBQztRQUNELFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ25ELENBQUMsQ0FBQyxDQUFDO0lBRUgsMkVBQTJFO0lBQzNFLDRFQUE0RTtJQUM1RSxHQUFHLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBRXJELE9BQU8sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFDN0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBzZW5kU3VjY2Vzcywgc2VuZEVycm9yLCBnZW5lcmF0ZU9wZW5BcGlTcGVjLCBFcnJvckNvZGUsIGNyZWF0ZUxvZ2dlciwgdmVyaWZ5U2VydmljZVByaW5jaXBhbCwgY3JlYXRlSGVhbHRoUm91dGVyLCBzZXRDb3VudGVyRW1pdHRlciwgcmVxdWlyZUF1dGgsIHNhZmVFcXVhbCB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB0eXBlIHsgT3BlbkFwaVNwZWNPcHRpb25zIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgQ29uZmlnLCBDb3JlQ29uc3RhbnRzIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtY29yZSc7XG5pbXBvcnQgeyBnZXRDb25uZWN0aW9uIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YSc7XG5pbXBvcnQgY29tcHJlc3Npb24gZnJvbSAnY29tcHJlc3Npb24nO1xuaW1wb3J0IGNvcnMgZnJvbSAnY29ycyc7XG5pbXBvcnQgZXhwcmVzcywgeyB0eXBlIEV4cHJlc3MsIHR5cGUgTmV4dEZ1bmN0aW9uLCB0eXBlIFJlcXVlc3QsIHR5cGUgUmVzcG9uc2UgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCByYXRlTGltaXQsIHsgaXBLZXlHZW5lcmF0b3IgfSBmcm9tICdleHByZXNzLXJhdGUtbGltaXQnO1xuaW1wb3J0IGhlbG1ldCBmcm9tICdoZWxtZXQnO1xuaW1wb3J0IHN3YWdnZXJVaSBmcm9tICdzd2FnZ2VyLXVpLWV4cHJlc3MnO1xuaW1wb3J0IHsgdjcgYXMgdXVpZCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgZXRhZ01pZGRsZXdhcmUgfSBmcm9tICcuL2V0YWctbWlkZGxld2FyZS5qcyc7XG5pbXBvcnQgeyBjcmVhdGVFbnZSZWRpc0lkZW1wb3RlbmN5U3RvcmUsIHNldElkZW1wb3RlbmN5U3RvcmUsIHR5cGUgSWRlbXBvdGVuY3lTdG9yZSB9IGZyb20gJy4vaWRlbXBvdGVuY3ktbWlkZGxld2FyZS5qcyc7XG5pbXBvcnQgeyBtZXRyaWNzTWlkZGxld2FyZSwgbWV0cmljc0hhbmRsZXIsIGluY0NvdW50ZXIgfSBmcm9tICcuL21ldHJpY3MuanMnO1xuaW1wb3J0IHsgY3JlYXRlU2hhcmVkUmF0ZUxpbWl0U3RvcmUgfSBmcm9tICcuL3JhdGUtbGltaXQtc3RvcmUuanMnO1xuaW1wb3J0IHsgcmVhZGluZXNzR3VhcmQgfSBmcm9tICcuL3JlYWRpbmVzcy5qcyc7XG5pbXBvcnQgeyBTU0VNYW5hZ2VyLCBTU0VfUkVRVUVTVF9JRF9SRSB9IGZyb20gJy4uL2h0dHAvc3NlLWNvbm5lY3Rpb24tbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBjcmVhdGVFbnZSZWRpc1NTRVJlbGF5IH0gZnJvbSAnLi4vaHR0cC9zc2UtcmVsYXkuanMnO1xuaW1wb3J0IHsgY3JlYXRlRW52UmVkaXNUaWNrZXRTdG9yZSB9IGZyb20gJy4uL2h0dHAvc3NlLXRpY2tldC1zdG9yZS5qcyc7XG5cbi8vIFdpcmUgYXBpLWNvcmUncyBjb3VudGVyIHNoaW0gdG8gdGhlIHJlYWwgcHJvbS1jbGllbnQgcmVnaXN0cnkuIFRoaXMgaXNcbi8vIGEgbm8tb3AgdW50aWwgaW5jQ291bnRlciBpcyBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lIChsYXp5IHJlZ2lzdHJhdGlvblxuLy8gaW4gbWV0cmljcy50cyksIGFuZCBsZXRzIGFwaS1jb3JlIGhlbHBlcnMgbGlrZSB0aGUgcXVvdGEgY2xpZW50IHJlY29yZFxuLy8gYHF1b3RhX2ZhaWxfb3Blbl90b3RhbGAgd2l0aG91dCB0YWtpbmcgYSBoYXJkIGRlcCBvbiBhcGktc2VydmVyLlxuc2V0Q291bnRlckVtaXR0ZXIoaW5jQ291bnRlcik7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY3JlYXRpbmcgYW4gRXhwcmVzcyBhcHBsaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUFwcE9wdGlvbnMge1xuICAvKiogRW5hYmxlIENPUlMgKGRlZmF1bHQ6IHRydWUpICovXG4gIGVuYWJsZUNvcnM/OiBib29sZWFuO1xuICAvKiogRW5hYmxlIEhlbG1ldCBzZWN1cml0eSBoZWFkZXJzIChkZWZhdWx0OiB0cnVlKSAqL1xuICBlbmFibGVIZWxtZXQ/OiBib29sZWFuO1xuICAvKiogRW5hYmxlIHJhdGUgbGltaXRpbmcgKGRlZmF1bHQ6IHRydWUpICovXG4gIGVuYWJsZVJhdGVMaW1pdD86IGJvb2xlYW47XG4gIC8qKiBFbmFibGUgSlNPTiBib2R5IHBhcnNpbmcgKGRlZmF1bHQ6IHRydWUpICovXG4gIGVuYWJsZUpzb25Cb2R5PzogYm9vbGVhbjtcbiAgLyoqIEpTT04gYm9keSBzaXplIGxpbWl0IChkZWZhdWx0OiAnMW1iJykgKi9cbiAganNvbkxpbWl0Pzogc3RyaW5nO1xuICAvKipcbiAgICogUGF0aCBwcmVmaXhlcyB0aGUgZ2xvYmFsIEpTT04gYm9keSBwYXJzZXIgbXVzdCBOT1QgdG91Y2gg4oCUIGZvciByb3V0ZXMgdGhhdCBuZWVkXG4gICAqIHRoZSByYXcgYm9keSAoZS5nLiBhIFN0cmlwZSB3ZWJob29rIHdob3NlIEhNQUMgaXMgY29tcHV0ZWQgb3ZlciB0aGUgZXhhY3QgYnl0ZXMpLlxuICAgKiBXaXRob3V0IHRoaXMgdGhlIGdsb2JhbCBwYXJzZXIgY29uc3VtZXMgdGhlIGJvZHkgZmlyc3QgYW5kIGEgbGF0ZXIgYGV4cHJlc3MucmF3KClgXG4gICAqIG9uIHRoZSBzYW1lIHBhdGggaXMgYSBuby1vcCwgYnJlYWtpbmcgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbi5cbiAgICovXG4gIGpzb25Cb2R5RXhjbHVkZT86IHN0cmluZ1tdO1xuICAvKiogRW5hYmxlIFVSTC1lbmNvZGVkIGJvZHkgcGFyc2luZyAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgZW5hYmxlVXJsRW5jb2RlZD86IGJvb2xlYW47XG4gIC8qKiBVUkwtZW5jb2RlZCBib2R5IHNpemUgbGltaXQgKGRlZmF1bHQ6ICcxbWInKSAqL1xuICB1cmxFbmNvZGVkTGltaXQ/OiBzdHJpbmc7XG4gIC8qKiBDdXN0b20gU1NFIG1hbmFnZXIgaW5zdGFuY2UgKi9cbiAgc3NlTWFuYWdlcj86IFNTRU1hbmFnZXI7XG4gIC8qKiBIZWFsdGggY2hlY2sgZGVwZW5kZW5jeSBjaGVja2VyIOKAlCBpZiBwcm92aWRlZCwgL2hlYWx0aCByZXBvcnRzIGRlcGVuZGVuY3kgc3RhdHVzICovXG4gIGNoZWNrRGVwZW5kZW5jaWVzPzogKCkgPT4gUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCAnY29ubmVjdGVkJyB8ICdkaXNjb25uZWN0ZWQnIHwgJ3Vua25vd24nPj47XG4gIC8qKiBFbmFibGUgT3BlbkFQSSBzcGVjIGF0IC9kb2NzL29wZW5hcGkuanNvbiBhbmQgU3dhZ2dlciBVSSBhdCAvZG9jcyAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgLyoqXG4gICAqIFNlcnZlIHRoZSBPcGVuQVBJIHNwZWMgYXQgYC9kb2NzL29wZW5hcGkuanNvbmAgYW5kIFN3YWdnZXIgVUkgYXQgYC9kb2NzYC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gT0ZGIHVuZGVyIGBOT0RFX0VOVj1wcm9kdWN0aW9uYDogdGhlIHJvdXRlcyBhcmUgcmVnaXN0ZXJlZCBhYm92ZVxuICAgKiB0aGUgcmF0ZSBsaW1pdGVyIGFuZCB3ZXJlIG5ldmVyIGF1dGgtZ2F0ZWQsIHNvIGluIHByb2R1Y3Rpb24gdGhleSBwdWJsaXNoZWRcbiAgICogdGhlIGZ1bGwgcm91dGUgKyBzY2hlbWEgaW52ZW50b3J5IG9mIGV2ZXJ5IHNlcnZpY2UgdG8gYW55b25lIHdobyBjb3VsZCByZWFjaFxuICAgKiB0aGUgcG9ydC4gT25seSB0aGUgQ1NQIHdhcyB0aWdodGVuZWQgZm9yIHByb2R1Y3Rpb24gYmVmb3JlLCBub3QgdGhlIHJvdXRlLlxuICAgKiBQYXNzIGB0cnVlYCBleHBsaWNpdGx5IHRvIHNlcnZlIHRoZW0gaW4gcHJvZHVjdGlvbiBhbnl3YXkuXG4gICAqL1xuICBlbmFibGVPcGVuQXBpPzogYm9vbGVhbjtcbiAgLyoqIE9wZW5BUEkgc3BlYyBjdXN0b21pemF0aW9uIG9wdGlvbnMgKi9cbiAgb3BlbkFwaU9wdGlvbnM/OiBPcGVuQXBpU3BlY09wdGlvbnM7XG4gIC8qKiBFbmFibGUgZ3ppcC9kZWZsYXRlIHJlc3BvbnNlIGNvbXByZXNzaW9uIChkZWZhdWx0OiB0cnVlKSAqL1xuICBlbmFibGVDb21wcmVzc2lvbj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBJZGVtcG90ZW5jeSByZXBsYXktY2FjaGUgYmFja2VuZCBmb3Iga2V5ZWQgbXV0YXRpb24gcmV0cmllcy4gV2hlbiBvbWl0dGVkLFxuICAgKiBjcmVhdGVBcHAgYXV0by13aXJlcyB0aGUgc2hhcmVkIGVudiBSZWRpcyBzdG9yZSAobXVsdGktcmVwbGljYSBkZWR1cCkgaWZcbiAgICogUmVkaXMgaXMgY29uZmlndXJlZCwgZWxzZSBrZWVwcyB0aGUgaW4tbWVtb3J5IGRlZmF1bHQgKHNpbmdsZS1yZXBsaWNhKS5cbiAgICogUGFzcyBhbiBleHBsaWNpdCBzdG9yZSB0byBpbmplY3QgYSBiZXNwb2tlIGJhY2tlbmQgKGUuZy4gYSBzZXJ2aWNlJ3Mgb3duXG4gICAqIGlvcmVkaXMgY29ubmVjdGlvbikuXG4gICAqL1xuICBpZGVtcG90ZW5jeVN0b3JlPzogSWRlbXBvdGVuY3lTdG9yZTtcbiAgLyoqXG4gICAqIEV4dHJhIHdhcm11cCBjYWxsYmFja3MgaW52b2tlZCBieSBgR0VUIC93YXJtdXBgIGluIGFkZGl0aW9uIHRvIHRoZVxuICAgKiBkZWZhdWx0IFBvc3RncmVzIHBpbmcuIFVzZSBmb3Igc2VydmljZXMgdGhhdCBkZXBlbmQgb24gTW9uZ28sIFJlZGlzLFxuICAgKiBTUVMsIGV0Yy4g4oCUIHByZS13YXJtaW5nIG9wZW5zIGNvbm5lY3Rpb24gcG9vbHMgYmVmb3JlIHJlYWwgdHJhZmZpY1xuICAgKiBhcnJpdmVzLiBFYWNoIGNhbGxiYWNrIHNob3VsZCByZXNvbHZlIHdoZW4gaXRzIGRlcGVuZGVuY3kgaXMgcmVhZHk7XG4gICAqIGFueSByZWplY3Rpb24gY2F1c2VzIC93YXJtdXAgdG8gcmV0dXJuIDUwMy5cbiAgICovXG4gIHdhcm11cEhvb2tzPzogQXJyYXk8KCkgPT4gUHJvbWlzZTx2b2lkPj47XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGNyZWF0aW5nIGFuIEV4cHJlc3MgYXBwbGljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVBcHBSZXN1bHQge1xuICAvKiogQ29uZmlndXJlZCBFeHByZXNzIGFwcGxpY2F0aW9uICovXG4gIGFwcDogRXhwcmVzcztcbiAgLyoqIFNTRSBtYW5hZ2VyIGluc3RhbmNlICovXG4gIHNzZU1hbmFnZXI6IFNTRU1hbmFnZXI7XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuZCBjb25maWd1cmUgYW4gRXhwcmVzcyBhcHBsaWNhdGlvbiB3aXRoIGNvbW1vbiBtaWRkbGV3YXJlXG4gKlxuICogU2V0cyB1cDpcbiAqIC0gQ09SUyB3aXRoIGNvbmZpZ3VyZWQgb3JpZ2luc1xuICogLSBIZWxtZXQgc2VjdXJpdHkgaGVhZGVyc1xuICogLSBSYXRlIGxpbWl0aW5nXG4gKiAtIEpTT04gYW5kIFVSTC1lbmNvZGVkIGJvZHkgcGFyc2luZ1xuICogLSBUcnVzdCBwcm94eSBzZXR0aW5nc1xuICogLSBIZWFsdGggY2hlY2sgZW5kcG9pbnQgKC9oZWFsdGgpXG4gKiAtIE1ldHJpY3MgZW5kcG9pbnQgKC9tZXRyaWNzKVxuICogLSBTU0UgbG9ncyBlbmRwb2ludCAoL2xvZ3MvOnJlcXVlc3RJZClcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHJldHVybnMgQ29uZmlndXJlZCBFeHByZXNzIGFwcCBhbmQgU1NFIG1hbmFnZXJcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgeyBhcHAsIHNzZU1hbmFnZXIgfSA9IGNyZWF0ZUFwcCgpO1xuICpcbiAqIGFwcC5wb3N0KCcvYXBpL3Jlc291cmNlJywgcmVxdWlyZUF1dGgsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICogICAvLyBZb3VyIHJvdXRlIGhhbmRsZXJcbiAqIH0pO1xuICpcbiAqIHN0YXJ0U2VydmVyKGFwcCwgeyBuYW1lOiAnTXkgU2VydmljZScgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFwcChvcHRpb25zOiBDcmVhdGVBcHBPcHRpb25zID0ge30pOiBDcmVhdGVBcHBSZXN1bHQge1xuICBjb25zdCB7XG4gICAgZW5hYmxlQ29ycyA9IHRydWUsXG4gICAgZW5hYmxlSGVsbWV0ID0gdHJ1ZSxcbiAgICBlbmFibGVSYXRlTGltaXQgPSB0cnVlLFxuICAgIGVuYWJsZUpzb25Cb2R5ID0gdHJ1ZSxcbiAgICBqc29uTGltaXQgPSAnMW1iJyxcbiAgICBlbmFibGVVcmxFbmNvZGVkID0gdHJ1ZSxcbiAgICB1cmxFbmNvZGVkTGltaXQgPSAnMW1iJyxcbiAgICAvLyBEZWZhdWx0IFNTRSBtYW5hZ2VyIHdpcmVkIHRvIHRoZSBzaGFyZWQgZW52IFJlZGlzIHRpY2tldC9vd25lcnNoaXAgc3RvcmVcbiAgICAvLyB3aGVuIFJlZGlzIGlzIGNvbmZpZ3VyZWQgKG11bHRpLXBvZCBjb3JyZWN0bmVzcyArIGNyb3NzLXNlcnZpY2Ugc3RyZWFtXG4gICAgLy8gb3duZXJzaGlwKSwgZWxzZSB0aGUgaW4tbWVtb3J5IGRlZmF1bHQuIEEgY2FsbGVyLXN1cHBsaWVkIGBzc2VNYW5hZ2VyYFxuICAgIC8vIHNraXBzIHRoaXMgZW50aXJlbHkuXG4gICAgc3NlTWFuYWdlciA9IG5ldyBTU0VNYW5hZ2VyKHtcbiAgICAgIHRpY2tldFN0b3JlOiBjcmVhdGVFbnZSZWRpc1RpY2tldFN0b3JlKCkgPz8gdW5kZWZpbmVkLFxuICAgICAgcmVsYXk6IGNyZWF0ZUVudlJlZGlzU1NFUmVsYXkoKSA/PyB1bmRlZmluZWQsXG4gICAgfSksXG4gICAgY2hlY2tEZXBlbmRlbmNpZXMsXG4gICAgZW5hYmxlT3BlbkFwaSA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicsXG4gICAgb3BlbkFwaU9wdGlvbnMsXG4gICAgZW5hYmxlQ29tcHJlc3Npb24gPSB0cnVlLFxuICAgIHdhcm11cEhvb2tzID0gW10sXG4gICAgaWRlbXBvdGVuY3lTdG9yZSxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgLy8gRmFpbCBmYXN0IGlmIEpXVF9TRUNSRVQgaXMgbm90IGNvbmZpZ3VyZWQg4oCUIHByZXZlbnRzIHNpbGVudCBhdXRoIGZhaWx1cmVzIGF0IHJ1bnRpbWVcbiAgaWYgKCFwcm9jZXNzLmVudi5KV1RfU0VDUkVUKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdKV1RfU0VDUkVUIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHJlcXVpcmVkLiBTZXQgaXQgYmVmb3JlIHN0YXJ0aW5nIHRoZSBzZXJ2ZXIuJyk7XG4gIH1cblxuICAvLyBXaXJlIHRoZSBpZGVtcG90ZW5jeSByZXBsYXktY2FjaGUgYmFja2VuZCB1c2VkIGJ5IHRoZSBwb3N0LWF1dGggcm91dGVcbiAgLy8gZmFjdG9yaWVzIChjcmVhdGVQcm90ZWN0ZWRSb3V0ZSAvIGNyZWF0ZUF1dGhlbnRpY2F0ZWRXaXRoT3JnUm91dGUpLiBQcmVmZXJcbiAgLy8gYW4gZXhwbGljaXRseSBpbmplY3RlZCBzdG9yZTsgb3RoZXJ3aXNlIGF1dG8tY29uc3RydWN0IGZyb20gdGhlIHNoYXJlZCBlbnZcbiAgLy8gUmVkaXMgc28ga2V5ZWQgbXV0YXRpb24gcmV0cmllcyBkZWR1cGUgYWNyb3NzIHJlcGxpY2FzLiBGYWxscyBiYWNrIHRvIHRoZVxuICAvLyBpbi1tZW1vcnkgZGVmYXVsdCB3aGVuIG5vIFJlZGlzIGlzIGNvbmZpZ3VyZWQgKHNpbmdsZS1yZXBsaWNhIGNvcnJlY3RuZXNzKS5cbiAgY29uc3QgcmVzb2x2ZWRJZGVtcG90ZW5jeVN0b3JlID0gaWRlbXBvdGVuY3lTdG9yZSA/PyBjcmVhdGVFbnZSZWRpc0lkZW1wb3RlbmN5U3RvcmUoKTtcbiAgaWYgKHJlc29sdmVkSWRlbXBvdGVuY3lTdG9yZSkge1xuICAgIHNldElkZW1wb3RlbmN5U3RvcmUocmVzb2x2ZWRJZGVtcG90ZW5jeVN0b3JlKTtcbiAgfVxuXG4gIC8vIE9wZW5UZWxlbWV0cnkgaXMgTk9UIGluaXRpYWxpemVkIGhlcmU6IGJ5IHRoZSB0aW1lIGNyZWF0ZUFwcCBydW5zLCBleHByZXNzXG4gIC8vIGFuZCBodHRwIGhhdmUgYWxyZWFkeSBiZWVuIHJlcXVpcmVkLCBzbyB0aGUgYXV0by1pbnN0cnVtZW50YXRpb24gaG9va3NcbiAgLy8gd291bGQgaGF2ZSBub3RoaW5nIHRvIHBhdGNoIChubyBpbmJvdW5kIHNwYW4g4oaSIG5vIHRyYWNlIGlkKS4gVHJhY2luZyBpc1xuICAvLyBzdGFydGVkIGJ5IHRoZSBgb3RlbC1ib290c3RyYXAuanNgIHByZWxvYWQgaW5zdGVhZCAobm9kZSAtciDigKYg4oCUIHNlZSBlYWNoXG4gIC8vIHNlcnZpY2UncyBEb2NrZXJmaWxlIENNRCAvIHN0YXJ0IHNjcmlwdCksIHdoaWNoIHJ1bnMgYmVmb3JlIGFueVxuICAvLyBpbnN0cnVtZW50ZWQgbW9kdWxlIGxvYWRzLiBgY3VycmVudFRyYWNlSWQoKWAgdGhlbiByZWFkcyB0aGUgYWN0aXZlIHNwYW4uXG5cbiAgY29uc3Qgc2VydmVyQ29uZmlnID0gQ29uZmlnLmdldCgnc2VydmVyJyk7XG4gIGNvbnN0IGFwcCA9IGV4cHJlc3MoKTtcblxuICAvLyBTZWN1cml0eSBtaWRkbGV3YXJlLlxuICAvL1xuICAvLyBTd2FnZ2VyIFVJIG5lZWRzIHVuc2FmZS1pbmxpbmUgKyB1bnNhZmUtZXZhbCBmb3IgaXRzIGJ1bmRsZWQgc2NyaXB0cyDigJRcbiAgLy8gYnV0IHdlIG9ubHkgcmVsYXggQ1NQIHRoYXQgZmFyIHdoZW4gKGEpIE9wZW5BUEkgaXMgZW5hYmxlZCBBTkQgKGIpIHdlJ3JlXG4gIC8vIG5vdCBpbiBwcm9kdWN0aW9uLiBJbiBwcm9kLCBTd2FnZ2VyIHNob3VsZCBiZSBzZXJ2ZWQgYmVoaW5kIGEgc2VwYXJhdGVcbiAgLy8gaG9zdCBvciBhdXRoLWdhdGVkIHJvdXRlOyB0aGUgbWFpbiBhcHAga2VlcHMgdGhlIHN0cmljdCBDU1Agc28gYSBTdG9yZWRcbiAgLy8gWFNTIGluIGFueSBoYW5kbGVyIGNhbid0IGBldmFsKClgIGFyYml0cmFyeSBzY3JpcHQuXG4gIGNvbnN0IGlzUHJvZHVjdGlvbiA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbic7XG4gIGNvbnN0IGFsbG93U3dhZ2dlckNzcCA9IGVuYWJsZU9wZW5BcGkgJiYgIWlzUHJvZHVjdGlvbjtcbiAgaWYgKGVuYWJsZUhlbG1ldCkge1xuICAgIGFwcC51c2UoaGVsbWV0KHtcbiAgICAgIGNvbnRlbnRTZWN1cml0eVBvbGljeToge1xuICAgICAgICBkaXJlY3RpdmVzOiB7XG4gICAgICAgICAgZGVmYXVsdFNyYzogW1wiJ3NlbGYnXCJdLFxuICAgICAgICAgIHNjcmlwdFNyYzogYWxsb3dTd2FnZ2VyQ3NwXG4gICAgICAgICAgICA/IFtcIidzZWxmJ1wiLCBcIid1bnNhZmUtaW5saW5lJ1wiLCBcIid1bnNhZmUtZXZhbCdcIl1cbiAgICAgICAgICAgIDogW1wiJ3NlbGYnXCJdLFxuICAgICAgICAgIHN0eWxlU3JjOiBbXCInc2VsZidcIiwgXCIndW5zYWZlLWlubGluZSdcIl0sXG4gICAgICAgICAgaW1nU3JjOiBbXCInc2VsZidcIiwgJ2RhdGE6JywgJ2Jsb2I6J10sXG4gICAgICAgICAgY29ubmVjdFNyYzogW1wiJ3NlbGYnXCJdLFxuICAgICAgICAgIGZvbnRTcmM6IFtcIidzZWxmJ1wiXSxcbiAgICAgICAgICBvYmplY3RTcmM6IFtcIidub25lJ1wiXSxcbiAgICAgICAgICBmcmFtZUFuY2VzdG9yczogW1wiJ25vbmUnXCJdLFxuICAgICAgICAgIGJhc2VVcmk6IFtcIidzZWxmJ1wiXSxcbiAgICAgICAgICBmb3JtQWN0aW9uOiBbXCInc2VsZidcIl0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pKTtcbiAgfVxuXG4gIGlmIChlbmFibGVDb3JzKSB7XG4gICAgYXBwLnVzZShjb3JzKHNlcnZlckNvbmZpZy5jb3JzKSk7XG4gIH1cblxuICAvLyBSZXNwb25zZSBjb21wcmVzc2lvbiAoZ3ppcC9kZWZsYXRlKSDigJQgc2tpcCBTU0Ugc3RyZWFtc1xuICBpZiAoZW5hYmxlQ29tcHJlc3Npb24pIHtcbiAgICBhcHAudXNlKGNvbXByZXNzaW9uKHtcbiAgICAgIGZpbHRlcjogKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICAvLyBEb24ndCBjb21wcmVzcyBTU0Ugc3RyZWFtcy4gTWF0Y2ggYnkgaW5jbHVzaW9uOiB0aGUgQWNjZXB0IGhlYWRlciBpc1xuICAgICAgICAvLyBvZnRlbiBhIGxpc3QgKGUuZy4gXCJ0ZXh0L2V2ZW50LXN0cmVhbSwgKi8qXCIpLCBzbyBleGFjdCBlcXVhbGl0eSBtaXNzZWRcbiAgICAgICAgLy8gdGhvc2UgYW5kIGNvbXByZXNzZWQvYnVmZmVyZWQgdGhlIHN0cmVhbS5cbiAgICAgICAgaWYgKChyZXEuaGVhZGVycy5hY2NlcHQgfHwgJycpLmluY2x1ZGVzKCd0ZXh0L2V2ZW50LXN0cmVhbScpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBjb21wcmVzc2lvbi5maWx0ZXIocmVxLCByZXMpO1xuICAgICAgfSxcbiAgICAgIHRocmVzaG9sZDogQ29yZUNvbnN0YW50cy5DT01QUkVTU0lPTl9USFJFU0hPTERfQllURVMsXG4gICAgfSkpO1xuICB9XG5cbiAgLy8gRVRhZyBzdXBwb3J0IGZvciBjb25kaXRpb25hbCBHRVQgcmVxdWVzdHMgKDMwNCBOb3QgTW9kaWZpZWQpXG4gIGFwcC51c2UoZXRhZ01pZGRsZXdhcmUoKSk7XG5cbiAgLy8gQm9keSBwYXJzaW5nXG4gIGlmIChlbmFibGVKc29uQm9keSkge1xuICAgIGNvbnN0IGpzb25QYXJzZXIgPSBleHByZXNzLmpzb24oeyBsaW1pdDoganNvbkxpbWl0IH0pO1xuICAgIGNvbnN0IGV4Y2x1ZGUgPSBvcHRpb25zLmpzb25Cb2R5RXhjbHVkZSA/PyBbXTtcbiAgICBpZiAoZXhjbHVkZS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBTa2lwIHRoZSBnbG9iYWwgSlNPTiBwYXJzZXIgZm9yIHJhdy1ib2R5IHBhdGhzIHNvIGEgcGVyLXBhdGggYGV4cHJlc3MucmF3KClgXG4gICAgICAvLyBjYW4gcmVhZCB0aGUgZXhhY3QgYnl0ZXMgKHNlZSBganNvbkJvZHlFeGNsdWRlYCkuXG4gICAgICBhcHAudXNlKChyZXEsIHJlcywgbmV4dCkgPT4gKGV4Y2x1ZGUuc29tZSgocCkgPT4gcmVxLnBhdGguc3RhcnRzV2l0aChwKSkgPyBuZXh0KCkgOiBqc29uUGFyc2VyKHJlcSwgcmVzLCBuZXh0KSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHAudXNlKGpzb25QYXJzZXIpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVVcmxFbmNvZGVkKSB7XG4gICAgYXBwLnVzZShleHByZXNzLnVybGVuY29kZWQoeyBleHRlbmRlZDogdHJ1ZSwgbGltaXQ6IHVybEVuY29kZWRMaW1pdCB9KSk7XG4gIH1cblxuICAvLyBUcnVzdCBwcm94eSAobXVzdCBiZSBzZXQgYmVmb3JlIHJhdGUgbGltaXRlciBzbyByZXEuaXAgcmVzb2x2ZXMgY29ycmVjdGx5KVxuICBhcHAuc2V0KCd0cnVzdCBwcm94eScsIHNlcnZlckNvbmZpZy50cnVzdFByb3h5KTtcblxuICAvLyBSZXF1ZXN0IElEIOKAlCBwcmVmZXIgZXhpc3RpbmcgaGVhZGVyIGZyb20gbmdpbngsIG90aGVyd2lzZSBnZW5lcmF0ZSBvbmVcbiAgYXBwLnVzZSgocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pID0+IHtcbiAgICBjb25zdCBoZHIgPSByZXEuaGVhZGVyc1sneC1yZXF1ZXN0LWlkJ107XG4gICAgY29uc3QgcmVxdWVzdElkID0gKEFycmF5LmlzQXJyYXkoaGRyKSA/IGhkclswXSA6IGhkcikgfHwgdXVpZCgpO1xuICAgIHJlcS5yZXF1ZXN0SWQgPSByZXF1ZXN0SWQ7XG4gICAgcmVzLnNldEhlYWRlcignWC1SZXF1ZXN0LUlkJywgcmVxdWVzdElkKTtcbiAgICBuZXh0KCk7XG4gIH0pO1xuXG4gIC8vIEhlYWx0aCBjaGVjayByZWdpc3RlcmVkIGJlZm9yZSByYXRlIGxpbWl0ZXIgc28gaXQgaXMgbmV2ZXIgdGhyb3R0bGVkXG4gIGFwcC51c2UoY3JlYXRlSGVhbHRoUm91dGVyKHtcbiAgICBzZXJ2aWNlTmFtZTogcHJvY2Vzcy5lbnYuU0VSVklDRV9OQU1FIHx8ICdhcGknLFxuICAgIGNoZWNrRGVwZW5kZW5jaWVzLFxuICB9KSk7XG5cbiAgLy8gUmVhZGluZXNzIGd1YXJkIOKAlCA1MDNzIGJ1c2luZXNzIHRyYWZmaWMgd2hpbGUgdGhlIHNlcnZpY2UgaXMgTm90UmVhZHlcbiAgLy8gKGRhdGFzdG9yZSBzdGlsbCBjb25uZWN0aW5nIGF0IHN0YXJ0dXAsIG9yIGRyb3BwZWQpLiBNb3VudGVkIHJpZ2h0IGFmdGVyXG4gIC8vIHRoZSBoZWFsdGggcm91dGVyIGFuZCBiZWZvcmUgZXZlcnl0aGluZyBlbHNlIHNvIGEgTm90UmVhZHkgcmVxdWVzdCBpc1xuICAvLyByZWplY3RlZCBjaGVhcGx5LCBiZWZvcmUgcmF0ZS1saW1pdCAvIGlkZW1wb3RlbmN5IC8gYnVzaW5lc3MgaGFuZGxlcnMgZXZlclxuICAvLyB0b3VjaCBhIGRpc2Nvbm5lY3RlZCBkYXRhc3RvcmUuIEl0IGFsbG93bGlzdHMgdGhlIGluZnJhIGVuZHBvaW50c1xuICAvLyAoL21ldHJpY3MsIC93YXJtdXAsIC9kb2NzLCAvbG9ncykgcmVnaXN0ZXJlZCBiZWxvdywgcGx1cyAvaGVhbHRoICsgL3JlYWR5LlxuICBhcHAudXNlKHJlYWRpbmVzc0d1YXJkKCkpO1xuXG4gIC8vIFdhcm0tdXAgZW5kcG9pbnQg4oCUIHByZS1vcGVucyBjb25uZWN0aW9uIHBvb2xzIHNvIHRoZSBmaXJzdCByZWFsIHJlcXVlc3RcbiAgLy8gZG9lc24ndCBwYXkgY29sZC1zdGFydCBsYXRlbmN5LiBBbHdheXMgcGluZ3MgUG9zdGdyZXM7IHNlcnZpY2VzIHVzaW5nXG4gIC8vIE1vbmdvIC8gUmVkaXMgLyBTUVMgcGFzcyBgd2FybXVwSG9va3NgIHNvIHRob3NlIGFyZSB3YXJtZWQgaW4gcGFyYWxsZWwuXG4gIC8vXG4gIC8vIEdBVEVEIHRvIHZlcmlmaWVkIHNlcnZpY2UgcHJpbmNpcGFscy4gRXZlcnkgaGl0IHJ1bnMgYSBQb3N0Z3JlcyByb3VuZC10cmlwXG4gIC8vIHBsdXMgYWxsIGB3YXJtdXBIb29rc2AgKE1vbmdvL1JlZGlzL1NRUyksIHNvIHdoaWxlIGl0IHdhcyBvcGVuIGFuIGFub255bW91c1xuICAvLyBsb29wIGFtcGxpZmllZCBpbnRvIGRhdGFzdG9yZSBsb2FkIG9uIGV2ZXJ5IHNlcnZpY2UgaW4gdGhlIGZsZWV0IOKAlCBhbmRcbiAgLy8gYmVjYXVzZSBpdCBpcyByZWdpc3RlcmVkIGFib3ZlIHRoZSByYXRlIGxpbWl0ZXIsIG5vdGhpbmcgdGhyb3R0bGVkIGl0LlxuICAvLyBgdmVyaWZ5U2VydmljZVByaW5jaXBhbGAgY2hlY2tzIHRoZSBiZWFyZXIgdG9rZW4gY3J5cHRvZ3JhcGhpY2FsbHksIHNvIGl0IGlzXG4gIC8vIHNhZmUgaGVyZSwgYWJvdmUgYHJlcXVpcmVBdXRoYC5cbiAgYXBwLmdldCgnL3dhcm11cCcsIGFzeW5jIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICBpZiAoIXZlcmlmeVNlcnZpY2VQcmluY2lwYWwocmVxKSkge1xuICAgICAgc2VuZEVycm9yKHJlcywgNDA0LCAnTm90IGZvdW5kJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIGdldENvbm5lY3Rpb24oKS50ZXN0Q29ubmVjdGlvbigpLFxuICAgICAgICAuLi53YXJtdXBIb29rcy5tYXAoKGhvb2spID0+IGhvb2soKSksXG4gICAgICBdKTtcbiAgICAgIHNlbmRTdWNjZXNzKHJlcywgMjAwLCB7IHdhcm1lZDogdHJ1ZSwgaG9va3M6IHdhcm11cEhvb2tzLmxlbmd0aCB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHNlbmRFcnJvcihyZXMsIDUwMywgJ1dhcm11cCBmYWlsZWQnKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFByb21ldGhldXMgbWV0cmljcyBlbmRwb2ludCDigJQgYWx3YXlzIHJlZ2lzdGVyZWQgKG5ldmVyIHRocm90dGxlZCkuXG4gIC8vXG4gIC8vIE9wdGlvbmFsbHkgZ2F0ZWQ6IHdoZW4gYE1FVFJJQ1NfU0NSQVBFX1RPS0VOYCBpcyBzZXQsIHRoZSBzY3JhcGVyIG11c3Qgc2VuZFxuICAvLyBpdCBhcyBhIGJlYXJlciB0b2tlbiAoUHJvbWV0aGV1cyBgYmVhcmVyX3Rva2VuYCAvIGBiZWFyZXJfdG9rZW5fZmlsZWAgaW4gdGhlXG4gIC8vIHNjcmFwZSBjb25maWcpLiBMZWZ0IHVuZ2F0ZWQgd2hlbiB1bnNldCBzbyBlbmFibGluZyBpdCBpcyBhIGRlbGliZXJhdGUsXG4gIC8vIGNvb3JkaW5hdGVkIGNoYW5nZSByYXRoZXIgdGhhbiBhIHNpbGVudCBtb25pdG9yaW5nIG91dGFnZSDigJQgdGhlIHRlbmFudFxuICAvLyBkaXNjbG9zdXJlIHRoYXQgbWFkZSBnYXRpbmcgdXJnZW50IGlzIGNsb3NlZCBpbmRlcGVuZGVudGx5IGJ5IGRlZmF1bHRpbmcgdGhlXG4gIC8vIHBlci1vcmcgbGFiZWwgT0ZGIChzZWUgSFRUUF9NRVRSSUNTX09SR19TQU1QTEVfUkFURSBpbiBtZXRyaWNzLnRzKS5cbiAgY29uc3QgbWV0cmljc1Rva2VuID0gcHJvY2Vzcy5lbnYuTUVUUklDU19TQ1JBUEVfVE9LRU47XG4gIGFwcC5nZXQoJy9tZXRyaWNzJywgKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgaWYgKCFtZXRyaWNzVG9rZW4pIHtcbiAgICAgIG5leHQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaGVhZGVyID0gcmVxLmhlYWRlcnMuYXV0aG9yaXphdGlvbjtcbiAgICBjb25zdCBwcmVzZW50ZWQgPSBoZWFkZXI/LnN0YXJ0c1dpdGgoJ0JlYXJlciAnKSA/IGhlYWRlci5zbGljZSg3KSA6IHVuZGVmaW5lZDtcbiAgICAvLyBDb25zdGFudC10aW1lIGNvbXBhcmUg4oCUIGEgbGVuZ3RoLWluZGVwZW5kZW50IGVxdWFsaXR5IGNoZWNrIGhlcmUgd291bGRcbiAgICAvLyBsZWFrIHRoZSB0b2tlbiBhIGJ5dGUgYXQgYSB0aW1lLlxuICAgIGlmICghcHJlc2VudGVkIHx8ICFzYWZlRXF1YWwocHJlc2VudGVkLCBtZXRyaWNzVG9rZW4pKSB7XG4gICAgICBzZW5kRXJyb3IocmVzLCA0MDQsICdOb3QgZm91bmQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbmV4dCgpO1xuICB9LCBtZXRyaWNzSGFuZGxlcigpKTtcblxuICAvLyBPcGVuQVBJIHNwZWMgYW5kIFN3YWdnZXIgVUkgKHJlZ2lzdGVyZWQgYmVmb3JlIHJhdGUgbGltaXRlcilcbiAgaWYgKGVuYWJsZU9wZW5BcGkpIHtcbiAgICBjb25zdCBzcGVjID0gZ2VuZXJhdGVPcGVuQXBpU3BlYyhvcGVuQXBpT3B0aW9ucyk7XG4gICAgYXBwLmdldCgnL2RvY3Mvb3BlbmFwaS5qc29uJywgKF9yZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICAgIHJlcy5qc29uKHNwZWMpO1xuICAgIH0pO1xuICAgIGFwcC51c2UoJy9kb2NzJywgc3dhZ2dlclVpLnNlcnZlLCBzd2FnZ2VyVWkuc2V0dXAoc3BlYywge1xuICAgICAgY3VzdG9tU2l0ZVRpdGxlOiBvcGVuQXBpT3B0aW9ucz8udGl0bGUgPz8gJ1BpcGVsaW5lIEJ1aWxkZXIgQVBJIERvY3MnLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8vIFJhdGUgbGltaXRpbmcg4oCUIHNoYXJlZCBhY3Jvc3MgcmVwbGljYXMgdmlhIHRoZSBlbnYgUmVkaXMgd2hlbiBjb25maWd1cmVkXG4gIGlmIChlbmFibGVSYXRlTGltaXQpIHtcbiAgICBjb25zdCByYXRlTGltaXRDb25maWcgPSBDb25maWcuZ2V0KCdyYXRlTGltaXQnKTtcblxuICAgIGNvbnN0IHJhdGVMaW1pdE9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIHJhdGVMaW1pdD5bMF0gPSB7XG4gICAgICBtYXg6IHJhdGVMaW1pdENvbmZpZy5tYXgsXG4gICAgICB3aW5kb3dNczogcmF0ZUxpbWl0Q29uZmlnLndpbmRvd01zLFxuICAgICAgc3RhbmRhcmRIZWFkZXJzOiB0cnVlLFxuICAgICAgbGVnYWN5SGVhZGVyczogZmFsc2UsXG4gICAgICAvLyBTa2lwIHJhdGUgbGltaXRpbmcgb25seSBmb3IgQ1JZUFRPR1JBUEhJQ0FMTFktVkVSSUZJRUQgaW50ZXJuYWwgc2VydmljZVxuICAgICAgLy8gY2FsbGVycy4gVGhlIGxpbWl0ZXIgcnVucyBiZWZvcmUgcmVxdWlyZUF1dGgsIHNvIHRoZSBwcmV2aW91c2x5LXRydXN0ZWRcbiAgICAgIC8vIHBsYWludGV4dCBgeC1pbnRlcm5hbC1zZXJ2aWNlYCBoZWFkZXIgd2FzIHNwb29mYWJsZSBieSBhbnkgZXh0ZXJuYWxcbiAgICAgIC8vIGNsaWVudCDihpIgdG90YWwgYnlwYXNzLiB2ZXJpZnlTZXJ2aWNlUHJpbmNpcGFsIHZlcmlmaWVzIHRoZSBzaWduZWRcbiAgICAgIC8vIHNlcnZpY2UgSldUIGluc3RlYWQ7IGludGVyLXNlcnZpY2UgY2FsbGVycyBhbGwgc2VuZCBvbmVcbiAgICAgIC8vIChnZXRTZXJ2aWNlQXV0aEhlYWRlcikuXG4gICAgICBza2lwOiAocmVxOiBSZXF1ZXN0KSA9PiB2ZXJpZnlTZXJ2aWNlUHJpbmNpcGFsKHJlcSksXG4gICAgICAvLyBLZXkgb24gY2xpZW50IElQIG9ubHkuIFRoZSBsaW1pdGVyIHJ1bnMgcHJlLWF1dGgsIHNvIGByZXEudXNlcmAgaXMgdW5zZXRcbiAgICAgIC8vIGFuZCBhbnkgb3JnIGlkIHdvdWxkIGNvbWUgZnJvbSB0aGUgY2FsbGVyLXN1cHBsaWVkIGB4LW9yZy1pZGAgaGVhZGVyIOKAlFxuICAgICAgLy8gc3Bvb2ZhYmxlLCBsZXR0aW5nIGFuIGF0dGFja2VyIHJvdGF0ZSB2YWx1ZXMgdG8gZXZhZGUgdGhlIGJ1Y2tldCBvclxuICAgICAgLy8gZmxvb2QgYSB2aWN0aW0gb3JnJ3MgYnVja2V0LiBpcEtleUdlbmVyYXRvciBub3JtYWxpemVzIElQdjYgdG8gYSAvNjRcbiAgICAgIC8vIHByZWZpeCAoYWxzbyByZXF1aXJlZCBieSBleHByZXNzLXJhdGUtbGltaXQgOC54J3MgdmFsaWRhdG9yKS5cbiAgICAgIGtleUdlbmVyYXRvcjogKHJlcTogUmVxdWVzdCkgPT4gaXBLZXlHZW5lcmF0b3IocmVxLmlwIHx8ICdhbm9uJywgNjQpLFxuICAgICAgLy8gQSBzdG9yZSBmYWlsdXJlIChSZWRpcyBkb3duIC8gZmFpbGluZyBvdmVyKSBtdXN0IGRlZ3JhZGUgdG8gXCJub3QgcmF0ZVxuICAgICAgLy8gbGltaXRlZFwiLCBuZXZlciB0byBhIDUwMCBvbiBldmVyeSByZXF1ZXN0IG9mIGV2ZXJ5IHNlcnZpY2UuXG4gICAgICBwYXNzT25TdG9yZUVycm9yOiB0cnVlLFxuICAgICAgaGFuZGxlcjogKF9yZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICAgICAgc2VuZEVycm9yKHJlcywgNDI5LCAnVG9vIG1hbnkgcmVxdWVzdHMsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuJywgRXJyb3JDb2RlLlJBVEVfTElNSVRfRVhDRUVERUQpO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8gU2hhcmVkIHN0YXRlIGFjcm9zcyByZXBsaWNhcyAodGhlIHByb2Nlc3Mtd2lkZSByYXRlLWxpbWl0IFJlZGlzIGNvbm5lY3Rpb247XG4gICAgLy8gdW5kZWZpbmVkIHdpdGhvdXQgUmVkaXMg4oaSIHBlci1wcm9jZXNzIG1lbW9yeSBzdG9yZSwgcmlnaHQgZm9yIG9uZSByZXBsaWNhKS5cbiAgICAvLyBOYW1lc3BhY2VkIHBlciBTRVJWSUNFOiBldmVyeSBzZXJ2aWNlIHNoYXJlcyBvbmUgUmVkaXMsIGFuZCB0aGUgb2xkXG4gICAgLy8gdW5wcmVmaXhlZCBgcmw6PGlwPmAga2V5IGxldCBvbmUgY2xpZW50J3MgdHJhZmZpYyB0byBBTlkgc2VydmljZSBkcmFpbiBpdHNcbiAgICAvLyBidWRnZXQgb24gRVZFUlkgc2VydmljZS5cbiAgICByYXRlTGltaXRPcHRpb25zLnN0b3JlID0gY3JlYXRlU2hhcmVkUmF0ZUxpbWl0U3RvcmUoYCR7cHJvY2Vzcy5lbnYuU0VSVklDRV9OQU1FIHx8ICdhcGknfTpnbG9iYWxgKTtcblxuICAgIGFwcC51c2UocmF0ZUxpbWl0KHJhdGVMaW1pdE9wdGlvbnMpKTtcbiAgfVxuXG4gIC8vIEV4cHJlc3MgcmVxdWVzdCB0aW1lb3V0IOKAlCB1c2VzIENvcmVDb25zdGFudHMgdG8gc2hhcmUgdGhlIHNhbWUgZGVmYXVsdCBhcyBMYW1iZGEgaGFuZGxlcnNcbiAgY29uc3QgdGltZW91dE1zID0gQ29yZUNvbnN0YW50cy5IQU5ETEVSX1RJTUVPVVRfTVM7XG4gIGFwcC51c2UoKF9yZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4ge1xuICAgIHJlcy5zZXRUaW1lb3V0KHRpbWVvdXRNcywgKCkgPT4ge1xuICAgICAgaWYgKCFyZXMuaGVhZGVyc1NlbnQpIHtcbiAgICAgICAgc2VuZEVycm9yKHJlcywgNTAzLCAnUmVxdWVzdCB0aW1lb3V0Jyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgbmV4dCgpO1xuICB9KTtcblxuICAvLyBSZXF1ZXN0IGR1cmF0aW9uIGxvZ2dpbmdcbiAgY29uc3QgZHVyYXRpb25Mb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ3JlcXVlc3QtZHVyYXRpb24nKTtcbiAgYXBwLnVzZSgocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pID0+IHtcbiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgcmVzLm9uKCdmaW5pc2gnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydDtcbiAgICAgIC8vIExvZyBgcmVxLnBhdGhgIChubyBxdWVyeSBzdHJpbmcpIOKAlCBhIHN0cmF5IGA/dG9rZW49YC9gP3RpY2tldD1gIG11c3Qgbm90IGJlXG4gICAgICAvLyBwZXJzaXN0ZWQgdmVyYmF0aW0gb24gZXZlcnkgcmVxdWVzdCAobWlycm9ycyB0aGUgYXV0aHotZGVuaWFsIGF1ZGl0b3IncyBzdHJpcCkuXG4gICAgICBkdXJhdGlvbkxvZ2dlci5pbmZvKGAke3JlcS5tZXRob2R9ICR7cmVxLnBhdGh9ICR7cmVzLnN0YXR1c0NvZGV9ICR7ZHVyYXRpb259bXNgLCB7XG4gICAgICAgIG1ldGhvZDogcmVxLm1ldGhvZCxcbiAgICAgICAgcGF0aDogcmVxLnBhdGgsXG4gICAgICAgIHN0YXR1c0NvZGU6IHJlcy5zdGF0dXNDb2RlLFxuICAgICAgICBkdXJhdGlvbk1zOiBkdXJhdGlvbixcbiAgICAgICAgcmVxdWVzdElkOiByZXEucmVxdWVzdElkLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgbmV4dCgpO1xuICB9KTtcblxuICAvLyBQcm9tZXRoZXVzIG1ldHJpY3MgbWlkZGxld2FyZSDigJQgcmVjb3JkcyByZXF1ZXN0IGR1cmF0aW9uIGFuZCBjb3VudFxuICBhcHAudXNlKG1ldHJpY3NNaWRkbGV3YXJlKCkpO1xuXG4gIC8vIE5PVEU6IGlkZW1wb3RlbmN5IGlzIGludGVudGlvbmFsbHkgTk9UIG1vdW50ZWQgaGVyZS4gSXQgbmVlZHMgdGhlIFZFUklGSUVEXG4gIC8vIG9yZyBpZCB0byBuYW1lc3BhY2UgaXRzIHJlcGxheSBjYWNoZSwgYnV0IHRoaXMgcHJlLWF1dGggcG9zaXRpb24gcnVucyBiZWZvcmVcbiAgLy8gYHJlcXVpcmVBdXRoYC9gYXR0YWNoUmVxdWVzdENvbnRleHRgIHBvcHVsYXRlIGlkZW50aXR5LCBzbyBhIGdsb2JhbCBtb3VudFxuICAvLyBoZXJlIGlzIGEgcGVybWFuZW50IG5vLW9wIChvcmcgYWx3YXlzIHVuZGVmaW5lZCDihpIgc2tpcCkuIEl0IGlzIGluc3RlYWQgd2lyZWRcbiAgLy8gaW50byB0aGUgcG9zdC1hdXRoIHJvdXRlIGNoYWlucyDigJQgc2VlIGBjcmVhdGVQcm90ZWN0ZWRSb3V0ZWAgL1xuICAvLyBgY3JlYXRlQXV0aGVudGljYXRlZFdpdGhPcmdSb3V0ZWAgaW4gbWlkZGxld2FyZS1mYWN0b3J5LnRzLlxuXG4gIC8vIFNTRSBsb2dzIGVuZHBvaW50IOKAlCB0aWNrZXQtZ2F0ZWQgKFdhdmUgMmIpLlxuICAvLyBUaGUgc3RyZWFtIGNhcnJpZXMgcGVyLW9yZyBidWlsZCBsb2dzLCBzbyBpdCBtdXN0IG5vdCBiZSB3b3JsZC1yZWFkYWJsZS5cbiAgLy8gQ2xpZW50cyBmaXJzdCBQT1NUIC9sb2dzL3RpY2tldCAoSldULWF1dGhlbnRpY2F0ZWQpIHRvIG1pbnQgYSBzaG9ydC1saXZlZCxcbiAgLy8gc2luZ2xlLXVzZSB0aWNrZXQgYm91bmQgdG8gdGhlaXIgb3JnIEFORCB0byB0aGUgc3BlY2lmaWMgYHJlcXVlc3RJZGAgc3RyZWFtXG4gIC8vIHRoZXkgaW50ZW5kIHRvIG9wZW4sIHRoZW4gb3BlbiB0aGUgRXZlbnRTb3VyY2Ugd2l0aCA/dGlja2V0PTx0Pi4gVGhpcyBrZWVwc1xuICAvLyB0aGUgSldUIG91dCBvZiBxdWVyeSBzdHJpbmdzIC8gYWNjZXNzIGxvZ3Mgd2hpbGUgZW5mb3JjaW5nIG9yZyBvd25lcnNoaXAsXG4gIC8vIHBlci1zdWJqZWN0IGF1dGhvcml6YXRpb24sIGFuZCB0aGUgcGVyLW9yZyBjb25uZWN0aW9uIGNhcCBvbiB0aGUgc3RyZWFtLlxuICAvLyBNaXJyb3JzIHRoZSBtZXNzYWdlLXNlcnZpY2Ugbm90aWZpY2F0aW9ucyBTU0UgdGlja2V0IGV4Y2hhbmdlLlxuICBhcHAucG9zdCgnL2xvZ3MvdGlja2V0JywgcmVxdWlyZUF1dGgsIGFzeW5jIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICBjb25zdCBvcmdJZCA9IHJlcS51c2VyPy5vcmdhbml6YXRpb25JZD8udG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIW9yZ0lkKSB7XG4gICAgICBzZW5kRXJyb3IocmVzLCA0MDAsICdUb2tlbiBtaXNzaW5nIG9yZ2FuaXphdGlvbicsIEVycm9yQ29kZS5WQUxJREFUSU9OX0VSUk9SKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gVGhlIGNhbGxlciBtdXN0IG5hbWUgdGhlIHN0cmVhbSBzdWJqZWN0IHVwIGZyb250IHNvIHRoZSB0aWNrZXQgaXMgYm91bmQgdG9cbiAgICAvLyBpdC4gV2l0aG91dCB0aGlzLCBhIHRpY2tldCBjb3VsZCBiZSByZXBsYXllZCBhZ2FpbnN0IEFOWSByZXF1ZXN0SWQgdGhlXG4gICAgLy8gb3JnIGNvdWxkIGd1ZXNzLCBsZXR0aW5nIGl0IGF0dGFjaCB0byBhbm90aGVyIG9yZydzIGxvZyBzdHJlYW0uIFN0cmljdGx5XG4gICAgLy8gZm9ybWF0LXZhbGlkYXRlZCBzbyBpdCBjYW4ndCBjYXJyeSBhbiBpbmplY3Rpb24gcGF5bG9hZCBpbnRvIHRoZSBzdWJqZWN0LlxuICAgIGNvbnN0IHJlcXVlc3RJZCA9IChyZXEuYm9keSBhcyB7IHJlcXVlc3RJZD86IHVua25vd24gfSB8IHVuZGVmaW5lZCk/LnJlcXVlc3RJZDtcbiAgICBpZiAodHlwZW9mIHJlcXVlc3RJZCAhPT0gJ3N0cmluZycgfHwgIVNTRV9SRVFVRVNUX0lEX1JFLnRlc3QocmVxdWVzdElkKSkge1xuICAgICAgc2VuZEVycm9yKHJlcywgNDAwLCAnTWlzc2luZyBvciBpbnZhbGlkIHJlcXVlc3RJZCcsIEVycm9yQ29kZS5WQUxJREFUSU9OX0VSUk9SKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3NlTWFuYWdlci5jcmVhdGVUaWNrZXQob3JnSWQsIHJlcXVlc3RJZCk7XG4gICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgIGlmIChyZXN1bHQucmVhc29uID09PSAnZm9yYmlkZGVuJykge1xuICAgICAgICAvLyBUaGUgc3ViamVjdCBpcyBvd25lZCBieSBhbm90aGVyIG9yZyDigJQgZG8gbm90IGNvbmZpcm0gaXQgZXhpc3RzOyBhIHBsYWluXG4gICAgICAgIC8vIDQwMyBpcyBlbm91Z2ggYW5kIGxlYWtzIG5vdGhpbmcgYWJvdXQgd2hpY2ggcmVxdWVzdElkcyBhcmUgbGl2ZS5cbiAgICAgICAgc2VuZEVycm9yKHJlcywgNDAzLCAnTm90IGF1dGhvcml6ZWQgZm9yIHRoaXMgbG9nIHN0cmVhbScsIEVycm9yQ29kZS5JTlNVRkZJQ0lFTlRfUEVSTUlTU0lPTlMpO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHQucmVhc29uID09PSAnb3JnLWxpbWl0Jykge1xuICAgICAgICBzZW5kRXJyb3IocmVzLCA0MjksICdUb28gbWFueSBsb2cgc3RyZWFtIHRpY2tldHMgaXNzdWVkJywgRXJyb3JDb2RlLlFVT1RBX0VYQ0VFREVEKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbmRFcnJvcihyZXMsIDUwMywgJ0xvZyBzdHJlYW1pbmcgc3Vic3lzdGVtIGF0IGNhcGFjaXR5JywgRXJyb3JDb2RlLlFVT1RBX0VYQ0VFREVEKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2VuZFN1Y2Nlc3MocmVzLCAyMDAsIHsgdGlja2V0OiByZXN1bHQudGlja2V0IH0pO1xuICB9KTtcblxuICAvLyBUaGUgc3RyZWFtIGl0c2VsZiByZXNvbHZlcyArIGNvbnN1bWVzIHRoZSB0aWNrZXQgaW5zaWRlIG1pZGRsZXdhcmUoKSBhbmRcbiAgLy8gcmVqZWN0cyBhbnkgYW5vbnltb3VzIC8gaW52YWxpZCAvIGV4cGlyZWQgLyBhbHJlYWR5LXVzZWQgdGlja2V0IHdpdGggNDAxLlxuICBhcHAuZ2V0KCcvbG9ncy86cmVxdWVzdElkJywgc3NlTWFuYWdlci5taWRkbGV3YXJlKCkpO1xuXG4gIHJldHVybiB7IGFwcCwgc3NlTWFuYWdlciB9O1xufVxuIl19
356
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLWZhY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL2FwcC1mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxzQkFBc0IsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFclAsT0FBTyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDaEUsT0FBTyxXQUFXLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUN4QixPQUFPLE9BQU8sRUFBRSxFQUFnRSxNQUFNLFNBQVMsQ0FBQztBQUNoRyxPQUFPLFNBQVMsRUFBRSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9ELE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLFNBQVMsTUFBTSxvQkFBb0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLDhCQUE4QixFQUFFLG1CQUFtQixFQUF5QixNQUFNLDZCQUE2QixDQUFDO0FBQ3pILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ25FLE9BQU8sRUFB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RUFBRSxTQUFTLENBQUMsd0JBQXdCLENBQUMsQ0FBQztnQkFDaEcsQ0FBQztxQkFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7b0JBQ3pDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLG9DQUFvQyxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDdEYsQ0FBQztxQkFBTSxDQUFDO29CQUNOLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLHFDQUFxQyxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDdkYsQ0FBQztnQkFDRCxPQUFPO1lBQ1QsQ0FBQztZQUNELFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO1FBRUgsMkVBQTJFO1FBQzNFLDRFQUE0RTtRQUM1RSxHQUFHLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxDQUFDO0FBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgc2VuZFN1Y2Nlc3MsIHNlbmRFcnJvciwgZ2VuZXJhdGVPcGVuQXBpU3BlYywgRXJyb3JDb2RlLCBjcmVhdGVMb2dnZXIsIHZlcmlmeVNlcnZpY2VQcmluY2lwYWwsIGNyZWF0ZUhlYWx0aFJvdXRlciwgc2V0Q291bnRlckVtaXR0ZXIsIHJlcXVpcmVBdXRoLCBzYWZlRXF1YWwsIGNyZWF0ZUVudlNzZVRpY2tldFN0b3JlLCBTU0VfVElDS0VUX1RUTF9NUyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB0eXBlIHsgT3BlbkFwaVNwZWNPcHRpb25zIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgQ29uZmlnLCBDb3JlQ29uc3RhbnRzIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtY29yZSc7XG5pbXBvcnQgeyBnZXRDb25uZWN0aW9uIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YSc7XG5pbXBvcnQgY29tcHJlc3Npb24gZnJvbSAnY29tcHJlc3Npb24nO1xuaW1wb3J0IGNvcnMgZnJvbSAnY29ycyc7XG5pbXBvcnQgZXhwcmVzcywgeyB0eXBlIEV4cHJlc3MsIHR5cGUgTmV4dEZ1bmN0aW9uLCB0eXBlIFJlcXVlc3QsIHR5cGUgUmVzcG9uc2UgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCByYXRlTGltaXQsIHsgaXBLZXlHZW5lcmF0b3IgfSBmcm9tICdleHByZXNzLXJhdGUtbGltaXQnO1xuaW1wb3J0IGhlbG1ldCBmcm9tICdoZWxtZXQnO1xuaW1wb3J0IHN3YWdnZXJVaSBmcm9tICdzd2FnZ2VyLXVpLWV4cHJlc3MnO1xuaW1wb3J0IHsgdjcgYXMgdXVpZCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgZXRhZ01pZGRsZXdhcmUgfSBmcm9tICcuL2V0YWctbWlkZGxld2FyZS5qcyc7XG5pbXBvcnQgeyBjcmVhdGVFbnZSZWRpc0lkZW1wb3RlbmN5U3RvcmUsIHNldElkZW1wb3RlbmN5U3RvcmUsIHR5cGUgSWRlbXBvdGVuY3lTdG9yZSB9IGZyb20gJy4vaWRlbXBvdGVuY3ktbWlkZGxld2FyZS5qcyc7XG5pbXBvcnQgeyBtZXRyaWNzTWlkZGxld2FyZSwgbWV0cmljc0hhbmRsZXIsIGluY0NvdW50ZXIgfSBmcm9tICcuL21ldHJpY3MuanMnO1xuaW1wb3J0IHsgY3JlYXRlU2hhcmVkUmF0ZUxpbWl0U3RvcmUgfSBmcm9tICcuL3JhdGUtbGltaXQtc3RvcmUuanMnO1xuaW1wb3J0IHsgcmVhZGluZXNzR3VhcmQgfSBmcm9tICcuL3JlYWRpbmVzcy5qcyc7XG5pbXBvcnQgeyBTU0VNYW5hZ2VyLCBTU0VfUkVRVUVTVF9JRF9SRSB9IGZyb20gJy4uL2h0dHAvc3NlLWNvbm5lY3Rpb24tbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBjcmVhdGVFbnZSZWRpc1NTRVJlbGF5IH0gZnJvbSAnLi4vaHR0cC9zc2UtcmVsYXkuanMnO1xuXG4vLyBXaXJlIGFwaS1jb3JlJ3MgY291bnRlciBzaGltIHRvIHRoZSByZWFsIHByb20tY2xpZW50IHJlZ2lzdHJ5LiBUaGlzIGlzXG4vLyBhIG5vLW9wIHVudGlsIGluY0NvdW50ZXIgaXMgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZSAobGF6eSByZWdpc3RyYXRpb25cbi8vIGluIG1ldHJpY3MudHMpLCBhbmQgbGV0cyBhcGktY29yZSBoZWxwZXJzIGxpa2UgdGhlIHF1b3RhIGNsaWVudCByZWNvcmRcbi8vIGBxdW90YV9mYWlsX29wZW5fdG90YWxgIHdpdGhvdXQgdGFraW5nIGEgaGFyZCBkZXAgb24gYXBpLXNlcnZlci5cbnNldENvdW50ZXJFbWl0dGVyKGluY0NvdW50ZXIpO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNyZWF0aW5nIGFuIEV4cHJlc3MgYXBwbGljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVBcHBPcHRpb25zIHtcbiAgLyoqIEVuYWJsZSBDT1JTIChkZWZhdWx0OiB0cnVlKSAqL1xuICBlbmFibGVDb3JzPzogYm9vbGVhbjtcbiAgLyoqIEVuYWJsZSBIZWxtZXQgc2VjdXJpdHkgaGVhZGVycyAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgZW5hYmxlSGVsbWV0PzogYm9vbGVhbjtcbiAgLyoqIEVuYWJsZSByYXRlIGxpbWl0aW5nIChkZWZhdWx0OiB0cnVlKSAqL1xuICBlbmFibGVSYXRlTGltaXQ/OiBib29sZWFuO1xuICAvKiogRW5hYmxlIEpTT04gYm9keSBwYXJzaW5nIChkZWZhdWx0OiB0cnVlKSAqL1xuICBlbmFibGVKc29uQm9keT86IGJvb2xlYW47XG4gIC8qKiBKU09OIGJvZHkgc2l6ZSBsaW1pdCAoZGVmYXVsdDogJzFtYicpICovXG4gIGpzb25MaW1pdD86IHN0cmluZztcbiAgLyoqXG4gICAqIFBhdGggcHJlZml4ZXMgdGhlIGdsb2JhbCBKU09OIGJvZHkgcGFyc2VyIG11c3QgTk9UIHRvdWNoIOKAlCBmb3Igcm91dGVzIHRoYXQgbmVlZFxuICAgKiB0aGUgcmF3IGJvZHkgKGUuZy4gYSBTdHJpcGUgd2ViaG9vayB3aG9zZSBITUFDIGlzIGNvbXB1dGVkIG92ZXIgdGhlIGV4YWN0IGJ5dGVzKS5cbiAgICogV2l0aG91dCB0aGlzIHRoZSBnbG9iYWwgcGFyc2VyIGNvbnN1bWVzIHRoZSBib2R5IGZpcnN0IGFuZCBhIGxhdGVyIGBleHByZXNzLnJhdygpYFxuICAgKiBvbiB0aGUgc2FtZSBwYXRoIGlzIGEgbm8tb3AsIGJyZWFraW5nIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24uXG4gICAqL1xuICBqc29uQm9keUV4Y2x1ZGU/OiBzdHJpbmdbXTtcbiAgLyoqIEVuYWJsZSBVUkwtZW5jb2RlZCBib2R5IHBhcnNpbmcgKGRlZmF1bHQ6IHRydWUpICovXG4gIGVuYWJsZVVybEVuY29kZWQ/OiBib29sZWFuO1xuICAvKiogVVJMLWVuY29kZWQgYm9keSBzaXplIGxpbWl0IChkZWZhdWx0OiAnMW1iJykgKi9cbiAgdXJsRW5jb2RlZExpbWl0Pzogc3RyaW5nO1xuICAvKiogQ3VzdG9tIFNTRSBtYW5hZ2VyIGluc3RhbmNlICovXG4gIHNzZU1hbmFnZXI/OiBTU0VNYW5hZ2VyO1xuICAvKipcbiAgICogU2VydmUgdGhlIHBlci1yZXF1ZXN0IGJ1aWxkLWxvZyBzdHJlYW06IGBQT1NUIC9sb2dzL3RpY2tldGAgK1xuICAgKiBgR0VUIC9sb2dzLzpyZXF1ZXN0SWRgLCBhIGxvZyB0aWNrZXQgc3RvcmUsIHRoZSBjcm9zcy1wb2QgcmVsYXksIGFuZFxuICAgKiBgY3R4LmxvZ2AgZnJhbWVzIHB1c2hlZCB0byBTU0UuIERlZmF1bHQgZmFsc2Ug4oCUIGEgc2VydmljZSB3aXRob3V0IGl0IGhhcyBub1xuICAgKiBgL2xvZ3NgIHJvdXRlcyBhbmQgYGN0eC5sb2dgIG9ubHkgd3JpdGVzIHRvIHRoZSBsb2dnZXIuXG4gICAqL1xuICBsb2dTdHJlYW0/OiBib29sZWFuO1xuICAvKiogSGVhbHRoIGNoZWNrIGRlcGVuZGVuY3kgY2hlY2tlciDigJQgaWYgcHJvdmlkZWQsIC9oZWFsdGggcmVwb3J0cyBkZXBlbmRlbmN5IHN0YXR1cyAqL1xuICBjaGVja0RlcGVuZGVuY2llcz86ICgpID0+IFByb21pc2U8UmVjb3JkPHN0cmluZywgJ2Nvbm5lY3RlZCcgfCAnZGlzY29ubmVjdGVkJyB8ICd1bmtub3duJz4+O1xuICAvKiogRW5hYmxlIE9wZW5BUEkgc3BlYyBhdCAvZG9jcy9vcGVuYXBpLmpzb24gYW5kIFN3YWdnZXIgVUkgYXQgL2RvY3MgKGRlZmF1bHQ6IHRydWUpICovXG4gIC8qKlxuICAgKiBTZXJ2ZSB0aGUgT3BlbkFQSSBzcGVjIGF0IGAvZG9jcy9vcGVuYXBpLmpzb25gIGFuZCBTd2FnZ2VyIFVJIGF0IGAvZG9jc2AuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIE9GRiB1bmRlciBgTk9ERV9FTlY9cHJvZHVjdGlvbmA6IHRoZSByb3V0ZXMgYXJlIHJlZ2lzdGVyZWQgYWJvdmVcbiAgICogdGhlIHJhdGUgbGltaXRlciBhbmQgd2VyZSBuZXZlciBhdXRoLWdhdGVkLCBzbyBpbiBwcm9kdWN0aW9uIHRoZXkgcHVibGlzaGVkXG4gICAqIHRoZSBmdWxsIHJvdXRlICsgc2NoZW1hIGludmVudG9yeSBvZiBldmVyeSBzZXJ2aWNlIHRvIGFueW9uZSB3aG8gY291bGQgcmVhY2hcbiAgICogdGhlIHBvcnQuIE9ubHkgdGhlIENTUCB3YXMgdGlnaHRlbmVkIGZvciBwcm9kdWN0aW9uIGJlZm9yZSwgbm90IHRoZSByb3V0ZS5cbiAgICogUGFzcyBgdHJ1ZWAgZXhwbGljaXRseSB0byBzZXJ2ZSB0aGVtIGluIHByb2R1Y3Rpb24gYW55d2F5LlxuICAgKi9cbiAgZW5hYmxlT3BlbkFwaT86IGJvb2xlYW47XG4gIC8qKiBPcGVuQVBJIHNwZWMgY3VzdG9taXphdGlvbiBvcHRpb25zICovXG4gIG9wZW5BcGlPcHRpb25zPzogT3BlbkFwaVNwZWNPcHRpb25zO1xuICAvKiogRW5hYmxlIGd6aXAvZGVmbGF0ZSByZXNwb25zZSBjb21wcmVzc2lvbiAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgZW5hYmxlQ29tcHJlc3Npb24/OiBib29sZWFuO1xuICAvKipcbiAgICogSWRlbXBvdGVuY3kgcmVwbGF5LWNhY2hlIGJhY2tlbmQgZm9yIGtleWVkIG11dGF0aW9uIHJldHJpZXMuIFdoZW4gb21pdHRlZCxcbiAgICogY3JlYXRlQXBwIGF1dG8td2lyZXMgdGhlIHNoYXJlZCBlbnYgUmVkaXMgc3RvcmUgKG11bHRpLXJlcGxpY2EgZGVkdXApIGlmXG4gICAqIFJlZGlzIGlzIGNvbmZpZ3VyZWQsIGVsc2Uga2VlcHMgdGhlIGluLW1lbW9yeSBkZWZhdWx0IChzaW5nbGUtcmVwbGljYSkuXG4gICAqIFBhc3MgYW4gZXhwbGljaXQgc3RvcmUgdG8gaW5qZWN0IGEgYmVzcG9rZSBiYWNrZW5kIChlLmcuIGEgc2VydmljZSdzIG93blxuICAgKiBpb3JlZGlzIGNvbm5lY3Rpb24pLlxuICAgKi9cbiAgaWRlbXBvdGVuY3lTdG9yZT86IElkZW1wb3RlbmN5U3RvcmU7XG4gIC8qKlxuICAgKiBFeHRyYSB3YXJtdXAgY2FsbGJhY2tzIGludm9rZWQgYnkgYEdFVCAvd2FybXVwYCBpbiBhZGRpdGlvbiB0byB0aGVcbiAgICogZGVmYXVsdCBQb3N0Z3JlcyBwaW5nLiBVc2UgZm9yIHNlcnZpY2VzIHRoYXQgZGVwZW5kIG9uIE1vbmdvLCBSZWRpcyxcbiAgICogU1FTLCBldGMuIOKAlCBwcmUtd2FybWluZyBvcGVucyBjb25uZWN0aW9uIHBvb2xzIGJlZm9yZSByZWFsIHRyYWZmaWNcbiAgICogYXJyaXZlcy4gRWFjaCBjYWxsYmFjayBzaG91bGQgcmVzb2x2ZSB3aGVuIGl0cyBkZXBlbmRlbmN5IGlzIHJlYWR5O1xuICAgKiBhbnkgcmVqZWN0aW9uIGNhdXNlcyAvd2FybXVwIHRvIHJldHVybiA1MDMuXG4gICAqL1xuICB3YXJtdXBIb29rcz86IEFycmF5PCgpID0+IFByb21pc2U8dm9pZD4+O1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBjcmVhdGluZyBhbiBFeHByZXNzIGFwcGxpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlQXBwUmVzdWx0IHtcbiAgLyoqIENvbmZpZ3VyZWQgRXhwcmVzcyBhcHBsaWNhdGlvbiAqL1xuICBhcHA6IEV4cHJlc3M7XG4gIC8qKiBTU0UgbWFuYWdlciBpbnN0YW5jZSAqL1xuICBzc2VNYW5hZ2VyOiBTU0VNYW5hZ2VyO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhbmQgY29uZmlndXJlIGFuIEV4cHJlc3MgYXBwbGljYXRpb24gd2l0aCBjb21tb24gbWlkZGxld2FyZVxuICpcbiAqIFNldHMgdXA6XG4gKiAtIENPUlMgd2l0aCBjb25maWd1cmVkIG9yaWdpbnNcbiAqIC0gSGVsbWV0IHNlY3VyaXR5IGhlYWRlcnNcbiAqIC0gUmF0ZSBsaW1pdGluZ1xuICogLSBKU09OIGFuZCBVUkwtZW5jb2RlZCBib2R5IHBhcnNpbmdcbiAqIC0gVHJ1c3QgcHJveHkgc2V0dGluZ3NcbiAqIC0gSGVhbHRoIGNoZWNrIGVuZHBvaW50ICgvaGVhbHRoKVxuICogLSBNZXRyaWNzIGVuZHBvaW50ICgvbWV0cmljcylcbiAqIC0gU1NFIGxvZ3MgZW5kcG9pbnQgKC9sb2dzLzpyZXF1ZXN0SWQpIOKAlCBvbmx5IHdpdGggYGxvZ1N0cmVhbTogdHJ1ZWBcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHJldHVybnMgQ29uZmlndXJlZCBFeHByZXNzIGFwcCBhbmQgU1NFIG1hbmFnZXJcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgeyBhcHAsIHNzZU1hbmFnZXIgfSA9IGNyZWF0ZUFwcCgpO1xuICpcbiAqIGFwcC5wb3N0KCcvYXBpL3Jlc291cmNlJywgcmVxdWlyZUF1dGgsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICogICAvLyBZb3VyIHJvdXRlIGhhbmRsZXJcbiAqIH0pO1xuICpcbiAqIHN0YXJ0U2VydmVyKGFwcCwgeyBuYW1lOiAnTXkgU2VydmljZScgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFwcChvcHRpb25zOiBDcmVhdGVBcHBPcHRpb25zID0ge30pOiBDcmVhdGVBcHBSZXN1bHQge1xuICBjb25zdCB7XG4gICAgZW5hYmxlQ29ycyA9IHRydWUsXG4gICAgZW5hYmxlSGVsbWV0ID0gdHJ1ZSxcbiAgICBlbmFibGVSYXRlTGltaXQgPSB0cnVlLFxuICAgIGVuYWJsZUpzb25Cb2R5ID0gdHJ1ZSxcbiAgICBqc29uTGltaXQgPSAnMW1iJyxcbiAgICBlbmFibGVVcmxFbmNvZGVkID0gdHJ1ZSxcbiAgICB1cmxFbmNvZGVkTGltaXQgPSAnMW1iJyxcbiAgICBsb2dTdHJlYW0gPSBmYWxzZSxcbiAgICBjaGVja0RlcGVuZGVuY2llcyxcbiAgICBlbmFibGVPcGVuQXBpID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyxcbiAgICBvcGVuQXBpT3B0aW9ucyxcbiAgICBlbmFibGVDb21wcmVzc2lvbiA9IHRydWUsXG4gICAgd2FybXVwSG9va3MgPSBbXSxcbiAgICBpZGVtcG90ZW5jeVN0b3JlLFxuICB9ID0gb3B0aW9ucztcblxuICBjb25zdCBzZXJ2aWNlTmFtZSA9IHByb2Nlc3MuZW52LlNFUlZJQ0VfTkFNRSB8fCAnYXBpJztcblxuICAvLyBEZWZhdWx0IFNTRSBtYW5hZ2VyLiBUaGUgcmVsYXkgKHRoaXMgc2VydmljZSdzIG93biBSZWRpcyBjaGFubmVsKSBpcyBidWlsdFxuICAvLyBvbmx5IHdoZW4gc29tZXRoaW5nIHN0cmVhbXM6IHRoZSBsb2cgc3RyZWFtIHR1cm5zIGl0IG9uIGhlcmUsIGFuZCBhblxuICAvLyBvcmcta2V5ZWQgY2hhbm5lbCB0dXJucyBpdCBvbiB3aGVuIHJlZ2lzdGVyZWQgKHJlZ2lzdGVyU3NlVGlja2V0Q2hhbm5lbCkuXG4gIC8vIFRoZSBsb2cgdGlja2V0IHN0b3JlIGV4aXN0cyBvbmx5IHdpdGggdGhlIGxvZyBzdHJlYW0uIEEgY2FsbGVyLXN1cHBsaWVkXG4gIC8vIGBzc2VNYW5hZ2VyYCBza2lwcyB0aGlzIGVudGlyZWx5LlxuICBjb25zdCBzc2VNYW5hZ2VyID0gb3B0aW9ucy5zc2VNYW5hZ2VyID8/IG5ldyBTU0VNYW5hZ2VyKHtcbiAgICBsb2dTdHJlYW0sXG4gICAgcmVsYXlGYWN0b3J5OiAoKSA9PiBjcmVhdGVFbnZSZWRpc1NTRVJlbGF5KHNlcnZpY2VOYW1lKSxcbiAgICAuLi4obG9nU3RyZWFtICYmIHtcbiAgICAgIHRpY2tldFN0b3JlOiBjcmVhdGVFbnZTc2VUaWNrZXRTdG9yZSh7XG4gICAgICAgIHR0bE1zOiBTU0VfVElDS0VUX1RUTF9NUyxcbiAgICAgICAgbWF4VG90YWw6IHBhcnNlSW50KHByb2Nlc3MuZW52LlNTRV9NQVhfVE9UQUxfVElDS0VUUyB8fCAnMTAwMCcsIDEwKSxcbiAgICAgICAgbWF4UGVyT3JnOiBwYXJzZUludChwcm9jZXNzLmVudi5TU0VfTUFYX1RJQ0tFVFNfUEVSX09SRyB8fCAnMTAnLCAxMCksXG4gICAgICAgIGtleVByZWZpeDogYGxvZ3M6JHtzZXJ2aWNlTmFtZX1gLFxuICAgICAgfSksXG4gICAgfSksXG4gIH0pO1xuICBpZiAobG9nU3RyZWFtKSBzc2VNYW5hZ2VyLmVuYWJsZVJlbGF5KCk7XG5cbiAgLy8gV2lyZSB0aGUgaWRlbXBvdGVuY3kgcmVwbGF5LWNhY2hlIGJhY2tlbmQgdXNlZCBieSB0aGUgcG9zdC1hdXRoIHJvdXRlXG4gIC8vIGZhY3RvcmllcyAoY3JlYXRlUHJvdGVjdGVkUm91dGUgLyBjcmVhdGVBdXRoZW50aWNhdGVkV2l0aE9yZ1JvdXRlKS4gUHJlZmVyXG4gIC8vIGFuIGV4cGxpY2l0bHkgaW5qZWN0ZWQgc3RvcmU7IG90aGVyd2lzZSBhdXRvLWNvbnN0cnVjdCBmcm9tIHRoZSBzaGFyZWQgZW52XG4gIC8vIFJlZGlzIHNvIGtleWVkIG11dGF0aW9uIHJldHJpZXMgZGVkdXBlIGFjcm9zcyByZXBsaWNhcy4gRmFsbHMgYmFjayB0byB0aGVcbiAgLy8gaW4tbWVtb3J5IGRlZmF1bHQgd2hlbiBubyBSZWRpcyBpcyBjb25maWd1cmVkIChzaW5nbGUtcmVwbGljYSBjb3JyZWN0bmVzcykuXG4gIGNvbnN0IHJlc29sdmVkSWRlbXBvdGVuY3lTdG9yZSA9IGlkZW1wb3RlbmN5U3RvcmUgPz8gY3JlYXRlRW52UmVkaXNJZGVtcG90ZW5jeVN0b3JlKCk7XG4gIGlmIChyZXNvbHZlZElkZW1wb3RlbmN5U3RvcmUpIHtcbiAgICBzZXRJZGVtcG90ZW5jeVN0b3JlKHJlc29sdmVkSWRlbXBvdGVuY3lTdG9yZSk7XG4gIH1cblxuICAvLyBPcGVuVGVsZW1ldHJ5IGlzIE5PVCBpbml0aWFsaXplZCBoZXJlOiBieSB0aGUgdGltZSBjcmVhdGVBcHAgcnVucywgZXhwcmVzc1xuICAvLyBhbmQgaHR0cCBoYXZlIGFscmVhZHkgYmVlbiByZXF1aXJlZCwgc28gdGhlIGF1dG8taW5zdHJ1bWVudGF0aW9uIGhvb2tzXG4gIC8vIHdvdWxkIGhhdmUgbm90aGluZyB0byBwYXRjaCAobm8gaW5ib3VuZCBzcGFuIOKGkiBubyB0cmFjZSBpZCkuIFRyYWNpbmcgaXNcbiAgLy8gc3RhcnRlZCBieSB0aGUgYG90ZWwtYm9vdHN0cmFwLmpzYCBwcmVsb2FkIGluc3RlYWQgKG5vZGUgLXIg4oCmIOKAlCBzZWUgZWFjaFxuICAvLyBzZXJ2aWNlJ3MgRG9ja2VyZmlsZSBDTUQgLyBzdGFydCBzY3JpcHQpLCB3aGljaCBydW5zIGJlZm9yZSBhbnlcbiAgLy8gaW5zdHJ1bWVudGVkIG1vZHVsZSBsb2Fkcy4gYGN1cnJlbnRUcmFjZUlkKClgIHRoZW4gcmVhZHMgdGhlIGFjdGl2ZSBzcGFuLlxuXG4gIGNvbnN0IHNlcnZlckNvbmZpZyA9IENvbmZpZy5nZXQoJ3NlcnZlcicpO1xuICBjb25zdCBhcHAgPSBleHByZXNzKCk7XG5cbiAgLy8gU2VjdXJpdHkgbWlkZGxld2FyZS5cbiAgLy9cbiAgLy8gU3dhZ2dlciBVSSBuZWVkcyB1bnNhZmUtaW5saW5lICsgdW5zYWZlLWV2YWwgZm9yIGl0cyBidW5kbGVkIHNjcmlwdHMg4oCUXG4gIC8vIGJ1dCB3ZSBvbmx5IHJlbGF4IENTUCB0aGF0IGZhciB3aGVuIChhKSBPcGVuQVBJIGlzIGVuYWJsZWQgQU5EIChiKSB3ZSdyZVxuICAvLyBub3QgaW4gcHJvZHVjdGlvbi4gSW4gcHJvZCwgU3dhZ2dlciBzaG91bGQgYmUgc2VydmVkIGJlaGluZCBhIHNlcGFyYXRlXG4gIC8vIGhvc3Qgb3IgYXV0aC1nYXRlZCByb3V0ZTsgdGhlIG1haW4gYXBwIGtlZXBzIHRoZSBzdHJpY3QgQ1NQIHNvIGEgU3RvcmVkXG4gIC8vIFhTUyBpbiBhbnkgaGFuZGxlciBjYW4ndCBgZXZhbCgpYCBhcmJpdHJhcnkgc2NyaXB0LlxuICBjb25zdCBpc1Byb2R1Y3Rpb24gPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nO1xuICBjb25zdCBhbGxvd1N3YWdnZXJDc3AgPSBlbmFibGVPcGVuQXBpICYmICFpc1Byb2R1Y3Rpb247XG4gIGlmIChlbmFibGVIZWxtZXQpIHtcbiAgICBhcHAudXNlKGhlbG1ldCh7XG4gICAgICBjb250ZW50U2VjdXJpdHlQb2xpY3k6IHtcbiAgICAgICAgZGlyZWN0aXZlczoge1xuICAgICAgICAgIGRlZmF1bHRTcmM6IFtcIidzZWxmJ1wiXSxcbiAgICAgICAgICBzY3JpcHRTcmM6IGFsbG93U3dhZ2dlckNzcFxuICAgICAgICAgICAgPyBbXCInc2VsZidcIiwgXCIndW5zYWZlLWlubGluZSdcIiwgXCIndW5zYWZlLWV2YWwnXCJdXG4gICAgICAgICAgICA6IFtcIidzZWxmJ1wiXSxcbiAgICAgICAgICBzdHlsZVNyYzogW1wiJ3NlbGYnXCIsIFwiJ3Vuc2FmZS1pbmxpbmUnXCJdLFxuICAgICAgICAgIGltZ1NyYzogW1wiJ3NlbGYnXCIsICdkYXRhOicsICdibG9iOiddLFxuICAgICAgICAgIGNvbm5lY3RTcmM6IFtcIidzZWxmJ1wiXSxcbiAgICAgICAgICBmb250U3JjOiBbXCInc2VsZidcIl0sXG4gICAgICAgICAgb2JqZWN0U3JjOiBbXCInbm9uZSdcIl0sXG4gICAgICAgICAgZnJhbWVBbmNlc3RvcnM6IFtcIidub25lJ1wiXSxcbiAgICAgICAgICBiYXNlVXJpOiBbXCInc2VsZidcIl0sXG4gICAgICAgICAgZm9ybUFjdGlvbjogW1wiJ3NlbGYnXCJdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KSk7XG4gIH1cblxuICBpZiAoZW5hYmxlQ29ycykge1xuICAgIGFwcC51c2UoY29ycyhzZXJ2ZXJDb25maWcuY29ycykpO1xuICB9XG5cbiAgLy8gUmVzcG9uc2UgY29tcHJlc3Npb24gKGd6aXAvZGVmbGF0ZSkg4oCUIHNraXAgU1NFIHN0cmVhbXNcbiAgaWYgKGVuYWJsZUNvbXByZXNzaW9uKSB7XG4gICAgYXBwLnVzZShjb21wcmVzc2lvbih7XG4gICAgICBmaWx0ZXI6IChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICAgICAgLy8gRG9uJ3QgY29tcHJlc3MgU1NFIHN0cmVhbXMuIE1hdGNoIGJ5IGluY2x1c2lvbjogdGhlIEFjY2VwdCBoZWFkZXIgaXNcbiAgICAgICAgLy8gb2Z0ZW4gYSBsaXN0IChlLmcuIFwidGV4dC9ldmVudC1zdHJlYW0sICovKlwiKSwgc28gZXhhY3QgZXF1YWxpdHkgbWlzc2VkXG4gICAgICAgIC8vIHRob3NlIGFuZCBjb21wcmVzc2VkL2J1ZmZlcmVkIHRoZSBzdHJlYW0uXG4gICAgICAgIGlmICgocmVxLmhlYWRlcnMuYWNjZXB0IHx8ICcnKS5pbmNsdWRlcygndGV4dC9ldmVudC1zdHJlYW0nKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gY29tcHJlc3Npb24uZmlsdGVyKHJlcSwgcmVzKTtcbiAgICAgIH0sXG4gICAgICB0aHJlc2hvbGQ6IENvcmVDb25zdGFudHMuQ09NUFJFU1NJT05fVEhSRVNIT0xEX0JZVEVTLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8vIEVUYWcgc3VwcG9ydCBmb3IgY29uZGl0aW9uYWwgR0VUIHJlcXVlc3RzICgzMDQgTm90IE1vZGlmaWVkKVxuICBhcHAudXNlKGV0YWdNaWRkbGV3YXJlKCkpO1xuXG4gIC8vIEJvZHkgcGFyc2luZ1xuICBpZiAoZW5hYmxlSnNvbkJvZHkpIHtcbiAgICBjb25zdCBqc29uUGFyc2VyID0gZXhwcmVzcy5qc29uKHsgbGltaXQ6IGpzb25MaW1pdCB9KTtcbiAgICBjb25zdCBleGNsdWRlID0gb3B0aW9ucy5qc29uQm9keUV4Y2x1ZGUgPz8gW107XG4gICAgaWYgKGV4Y2x1ZGUubGVuZ3RoID4gMCkge1xuICAgICAgLy8gU2tpcCB0aGUgZ2xvYmFsIEpTT04gcGFyc2VyIGZvciByYXctYm9keSBwYXRocyBzbyBhIHBlci1wYXRoIGBleHByZXNzLnJhdygpYFxuICAgICAgLy8gY2FuIHJlYWQgdGhlIGV4YWN0IGJ5dGVzIChzZWUgYGpzb25Cb2R5RXhjbHVkZWApLlxuICAgICAgYXBwLnVzZSgocmVxLCByZXMsIG5leHQpID0+IChleGNsdWRlLnNvbWUoKHApID0+IHJlcS5wYXRoLnN0YXJ0c1dpdGgocCkpID8gbmV4dCgpIDoganNvblBhcnNlcihyZXEsIHJlcywgbmV4dCkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwLnVzZShqc29uUGFyc2VyKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlVXJsRW5jb2RlZCkge1xuICAgIGFwcC51c2UoZXhwcmVzcy51cmxlbmNvZGVkKHsgZXh0ZW5kZWQ6IHRydWUsIGxpbWl0OiB1cmxFbmNvZGVkTGltaXQgfSkpO1xuICB9XG5cbiAgLy8gVHJ1c3QgcHJveHkgKG11c3QgYmUgc2V0IGJlZm9yZSByYXRlIGxpbWl0ZXIgc28gcmVxLmlwIHJlc29sdmVzIGNvcnJlY3RseSlcbiAgYXBwLnNldCgndHJ1c3QgcHJveHknLCBzZXJ2ZXJDb25maWcudHJ1c3RQcm94eSk7XG5cbiAgLy8gUmVxdWVzdCBJRCDigJQgcHJlZmVyIGV4aXN0aW5nIGhlYWRlciBmcm9tIG5naW54LCBvdGhlcndpc2UgZ2VuZXJhdGUgb25lXG4gIGFwcC51c2UoKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgY29uc3QgaGRyID0gcmVxLmhlYWRlcnNbJ3gtcmVxdWVzdC1pZCddO1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9IChBcnJheS5pc0FycmF5KGhkcikgPyBoZHJbMF0gOiBoZHIpIHx8IHV1aWQoKTtcbiAgICByZXEucmVxdWVzdElkID0gcmVxdWVzdElkO1xuICAgIHJlcy5zZXRIZWFkZXIoJ1gtUmVxdWVzdC1JZCcsIHJlcXVlc3RJZCk7XG4gICAgbmV4dCgpO1xuICB9KTtcblxuICAvLyBIZWFsdGggY2hlY2sgcmVnaXN0ZXJlZCBiZWZvcmUgcmF0ZSBsaW1pdGVyIHNvIGl0IGlzIG5ldmVyIHRocm90dGxlZFxuICBhcHAudXNlKGNyZWF0ZUhlYWx0aFJvdXRlcih7XG4gICAgc2VydmljZU5hbWUsXG4gICAgY2hlY2tEZXBlbmRlbmNpZXMsXG4gIH0pKTtcblxuICAvLyBSZWFkaW5lc3MgZ3VhcmQg4oCUIDUwM3MgYnVzaW5lc3MgdHJhZmZpYyB3aGlsZSB0aGUgc2VydmljZSBpcyBOb3RSZWFkeVxuICAvLyAoZGF0YXN0b3JlIHN0aWxsIGNvbm5lY3RpbmcgYXQgc3RhcnR1cCwgb3IgZHJvcHBlZCkuIE1vdW50ZWQgcmlnaHQgYWZ0ZXJcbiAgLy8gdGhlIGhlYWx0aCByb3V0ZXIgYW5kIGJlZm9yZSBldmVyeXRoaW5nIGVsc2Ugc28gYSBOb3RSZWFkeSByZXF1ZXN0IGlzXG4gIC8vIHJlamVjdGVkIGNoZWFwbHksIGJlZm9yZSByYXRlLWxpbWl0IC8gaWRlbXBvdGVuY3kgLyBidXNpbmVzcyBoYW5kbGVycyBldmVyXG4gIC8vIHRvdWNoIGEgZGlzY29ubmVjdGVkIGRhdGFzdG9yZS4gSXQgYWxsb3dsaXN0cyB0aGUgaW5mcmEgZW5kcG9pbnRzXG4gIC8vICgvbWV0cmljcywgL3dhcm11cCwgL2RvY3MsIC9sb2dzKSByZWdpc3RlcmVkIGJlbG93LCBwbHVzIC9oZWFsdGggKyAvcmVhZHkuXG4gIGFwcC51c2UocmVhZGluZXNzR3VhcmQoKSk7XG5cbiAgLy8gV2FybS11cCBlbmRwb2ludCDigJQgcHJlLW9wZW5zIGNvbm5lY3Rpb24gcG9vbHMgc28gdGhlIGZpcnN0IHJlYWwgcmVxdWVzdFxuICAvLyBkb2Vzbid0IHBheSBjb2xkLXN0YXJ0IGxhdGVuY3kuIEFsd2F5cyBwaW5ncyBQb3N0Z3Jlczsgc2VydmljZXMgdXNpbmdcbiAgLy8gTW9uZ28gLyBSZWRpcyAvIFNRUyBwYXNzIGB3YXJtdXBIb29rc2Agc28gdGhvc2UgYXJlIHdhcm1lZCBpbiBwYXJhbGxlbC5cbiAgLy9cbiAgLy8gR0FURUQgdG8gdmVyaWZpZWQgc2VydmljZSBwcmluY2lwYWxzLiBFdmVyeSBoaXQgcnVucyBhIFBvc3RncmVzIHJvdW5kLXRyaXBcbiAgLy8gcGx1cyBhbGwgYHdhcm11cEhvb2tzYCAoTW9uZ28vUmVkaXMvU1FTKSwgc28gd2hpbGUgaXQgd2FzIG9wZW4gYW4gYW5vbnltb3VzXG4gIC8vIGxvb3AgYW1wbGlmaWVkIGludG8gZGF0YXN0b3JlIGxvYWQgb24gZXZlcnkgc2VydmljZSBpbiB0aGUgZmxlZXQg4oCUIGFuZFxuICAvLyBiZWNhdXNlIGl0IGlzIHJlZ2lzdGVyZWQgYWJvdmUgdGhlIHJhdGUgbGltaXRlciwgbm90aGluZyB0aHJvdHRsZWQgaXQuXG4gIC8vIGB2ZXJpZnlTZXJ2aWNlUHJpbmNpcGFsYCBjaGVja3MgdGhlIGJlYXJlciB0b2tlbiBjcnlwdG9ncmFwaGljYWxseSwgc28gaXQgaXNcbiAgLy8gc2FmZSBoZXJlLCBhYm92ZSBgcmVxdWlyZUF1dGhgLlxuICBhcHAuZ2V0KCcvd2FybXVwJywgYXN5bmMgKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgIGlmICghdmVyaWZ5U2VydmljZVByaW5jaXBhbChyZXEpKSB7XG4gICAgICBzZW5kRXJyb3IocmVzLCA0MDQsICdOb3QgZm91bmQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgZ2V0Q29ubmVjdGlvbigpLnRlc3RDb25uZWN0aW9uKCksXG4gICAgICAgIC4uLndhcm11cEhvb2tzLm1hcCgoaG9vaykgPT4gaG9vaygpKSxcbiAgICAgIF0pO1xuICAgICAgc2VuZFN1Y2Nlc3MocmVzLCAyMDAsIHsgd2FybWVkOiB0cnVlLCBob29rczogd2FybXVwSG9va3MubGVuZ3RoIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgc2VuZEVycm9yKHJlcywgNTAzLCAnV2FybXVwIGZhaWxlZCcpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gUHJvbWV0aGV1cyBtZXRyaWNzIGVuZHBvaW50IOKAlCBhbHdheXMgcmVnaXN0ZXJlZCAobmV2ZXIgdGhyb3R0bGVkKS5cbiAgLy9cbiAgLy8gT3B0aW9uYWxseSBnYXRlZDogd2hlbiBgTUVUUklDU19TQ1JBUEVfVE9LRU5gIGlzIHNldCwgdGhlIHNjcmFwZXIgbXVzdCBzZW5kXG4gIC8vIGl0IGFzIGEgYmVhcmVyIHRva2VuIChQcm9tZXRoZXVzIGBiZWFyZXJfdG9rZW5gIC8gYGJlYXJlcl90b2tlbl9maWxlYCBpbiB0aGVcbiAgLy8gc2NyYXBlIGNvbmZpZykuIExlZnQgdW5nYXRlZCB3aGVuIHVuc2V0IHNvIGVuYWJsaW5nIGl0IGlzIGEgZGVsaWJlcmF0ZSxcbiAgLy8gY29vcmRpbmF0ZWQgY2hhbmdlIHJhdGhlciB0aGFuIGEgc2lsZW50IG1vbml0b3Jpbmcgb3V0YWdlIOKAlCB0aGUgdGVuYW50XG4gIC8vIGRpc2Nsb3N1cmUgdGhhdCBtYWRlIGdhdGluZyB1cmdlbnQgaXMgY2xvc2VkIGluZGVwZW5kZW50bHkgYnkgZGVmYXVsdGluZyB0aGVcbiAgLy8gcGVyLW9yZyBsYWJlbCBPRkYgKHNlZSBIVFRQX01FVFJJQ1NfT1JHX1NBTVBMRV9SQVRFIGluIG1ldHJpY3MudHMpLlxuICBjb25zdCBtZXRyaWNzVG9rZW4gPSBwcm9jZXNzLmVudi5NRVRSSUNTX1NDUkFQRV9UT0tFTjtcbiAgYXBwLmdldCgnL21ldHJpY3MnLCAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pID0+IHtcbiAgICBpZiAoIW1ldHJpY3NUb2tlbikge1xuICAgICAgbmV4dCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBoZWFkZXIgPSByZXEuaGVhZGVycy5hdXRob3JpemF0aW9uO1xuICAgIGNvbnN0IHByZXNlbnRlZCA9IGhlYWRlcj8uc3RhcnRzV2l0aCgnQmVhcmVyICcpID8gaGVhZGVyLnNsaWNlKDcpIDogdW5kZWZpbmVkO1xuICAgIC8vIENvbnN0YW50LXRpbWUgY29tcGFyZSDigJQgYSBsZW5ndGgtaW5kZXBlbmRlbnQgZXF1YWxpdHkgY2hlY2sgaGVyZSB3b3VsZFxuICAgIC8vIGxlYWsgdGhlIHRva2VuIGEgYnl0ZSBhdCBhIHRpbWUuXG4gICAgaWYgKCFwcmVzZW50ZWQgfHwgIXNhZmVFcXVhbChwcmVzZW50ZWQsIG1ldHJpY3NUb2tlbikpIHtcbiAgICAgIHNlbmRFcnJvcihyZXMsIDQwNCwgJ05vdCBmb3VuZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBuZXh0KCk7XG4gIH0sIG1ldHJpY3NIYW5kbGVyKCkpO1xuXG4gIC8vIE9wZW5BUEkgc3BlYyBhbmQgU3dhZ2dlciBVSSAocmVnaXN0ZXJlZCBiZWZvcmUgcmF0ZSBsaW1pdGVyKVxuICBpZiAoZW5hYmxlT3BlbkFwaSkge1xuICAgIGNvbnN0IHNwZWMgPSBnZW5lcmF0ZU9wZW5BcGlTcGVjKG9wZW5BcGlPcHRpb25zKTtcbiAgICBhcHAuZ2V0KCcvZG9jcy9vcGVuYXBpLmpzb24nLCAoX3JlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgICAgcmVzLmpzb24oc3BlYyk7XG4gICAgfSk7XG4gICAgYXBwLnVzZSgnL2RvY3MnLCBzd2FnZ2VyVWkuc2VydmUsIHN3YWdnZXJVaS5zZXR1cChzcGVjLCB7XG4gICAgICBjdXN0b21TaXRlVGl0bGU6IG9wZW5BcGlPcHRpb25zPy50aXRsZSA/PyAnUGlwZWxpbmUgQnVpbGRlciBBUEkgRG9jcycsXG4gICAgfSkpO1xuICB9XG5cbiAgLy8gUmF0ZSBsaW1pdGluZyDigJQgc2hhcmVkIGFjcm9zcyByZXBsaWNhcyB2aWEgdGhlIGVudiBSZWRpcyB3aGVuIGNvbmZpZ3VyZWRcbiAgaWYgKGVuYWJsZVJhdGVMaW1pdCkge1xuICAgIGNvbnN0IHJhdGVMaW1pdENvbmZpZyA9IENvbmZpZy5nZXQoJ3JhdGVMaW1pdCcpO1xuXG4gICAgY29uc3QgcmF0ZUxpbWl0T3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcmF0ZUxpbWl0PlswXSA9IHtcbiAgICAgIG1heDogcmF0ZUxpbWl0Q29uZmlnLm1heCxcbiAgICAgIHdpbmRvd01zOiByYXRlTGltaXRDb25maWcud2luZG93TXMsXG4gICAgICBzdGFuZGFyZEhlYWRlcnM6IHRydWUsXG4gICAgICBsZWdhY3lIZWFkZXJzOiBmYWxzZSxcbiAgICAgIC8vIFNraXAgcmF0ZSBsaW1pdGluZyBvbmx5IGZvciBDUllQVE9HUkFQSElDQUxMWS1WRVJJRklFRCBpbnRlcm5hbCBzZXJ2aWNlXG4gICAgICAvLyBjYWxsZXJzLiBUaGUgbGltaXRlciBydW5zIGJlZm9yZSByZXF1aXJlQXV0aCwgc28gdGhlIHByZXZpb3VzbHktdHJ1c3RlZFxuICAgICAgLy8gcGxhaW50ZXh0IGB4LWludGVybmFsLXNlcnZpY2VgIGhlYWRlciB3YXMgc3Bvb2ZhYmxlIGJ5IGFueSBleHRlcm5hbFxuICAgICAgLy8gY2xpZW50IOKGkiB0b3RhbCBieXBhc3MuIHZlcmlmeVNlcnZpY2VQcmluY2lwYWwgdmVyaWZpZXMgdGhlIHNpZ25lZFxuICAgICAgLy8gc2VydmljZSBKV1QgaW5zdGVhZDsgaW50ZXItc2VydmljZSBjYWxsZXJzIGFsbCBzZW5kIG9uZVxuICAgICAgLy8gKGdldFNlcnZpY2VBdXRoSGVhZGVyKS5cbiAgICAgIHNraXA6IChyZXE6IFJlcXVlc3QpID0+IHZlcmlmeVNlcnZpY2VQcmluY2lwYWwocmVxKSxcbiAgICAgIC8vIEtleSBvbiBjbGllbnQgSVAgb25seS4gVGhlIGxpbWl0ZXIgcnVucyBwcmUtYXV0aCwgc28gYHJlcS51c2VyYCBpcyB1bnNldFxuICAgICAgLy8gYW5kIGFueSBvcmcgaWQgd291bGQgY29tZSBmcm9tIHRoZSBjYWxsZXItc3VwcGxpZWQgYHgtb3JnLWlkYCBoZWFkZXIg4oCUXG4gICAgICAvLyBzcG9vZmFibGUsIGxldHRpbmcgYW4gYXR0YWNrZXIgcm90YXRlIHZhbHVlcyB0byBldmFkZSB0aGUgYnVja2V0IG9yXG4gICAgICAvLyBmbG9vZCBhIHZpY3RpbSBvcmcncyBidWNrZXQuIGlwS2V5R2VuZXJhdG9yIG5vcm1hbGl6ZXMgSVB2NiB0byBhIC82NFxuICAgICAgLy8gcHJlZml4IChhbHNvIHJlcXVpcmVkIGJ5IGV4cHJlc3MtcmF0ZS1saW1pdCA4LngncyB2YWxpZGF0b3IpLlxuICAgICAga2V5R2VuZXJhdG9yOiAocmVxOiBSZXF1ZXN0KSA9PiBpcEtleUdlbmVyYXRvcihyZXEuaXAgfHwgJ2Fub24nLCA2NCksXG4gICAgICAvLyBBIHN0b3JlIGZhaWx1cmUgKFJlZGlzIGRvd24gLyBmYWlsaW5nIG92ZXIpIG11c3QgZGVncmFkZSB0byBcIm5vdCByYXRlXG4gICAgICAvLyBsaW1pdGVkXCIsIG5ldmVyIHRvIGEgNTAwIG9uIGV2ZXJ5IHJlcXVlc3Qgb2YgZXZlcnkgc2VydmljZS5cbiAgICAgIHBhc3NPblN0b3JlRXJyb3I6IHRydWUsXG4gICAgICBoYW5kbGVyOiAoX3JlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICBzZW5kRXJyb3IocmVzLCA0MjksICdUb28gbWFueSByZXF1ZXN0cywgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4nLCBFcnJvckNvZGUuUkFURV9MSU1JVF9FWENFRURFRCk7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBTaGFyZWQgc3RhdGUgYWNyb3NzIHJlcGxpY2FzICh0aGUgcHJvY2Vzcy13aWRlIHJhdGUtbGltaXQgUmVkaXMgY29ubmVjdGlvbjtcbiAgICAvLyB1bmRlZmluZWQgd2l0aG91dCBSZWRpcyDihpIgcGVyLXByb2Nlc3MgbWVtb3J5IHN0b3JlLCByaWdodCBmb3Igb25lIHJlcGxpY2EpLlxuICAgIC8vIE5hbWVzcGFjZWQgcGVyIFNFUlZJQ0U6IGV2ZXJ5IHNlcnZpY2Ugc2hhcmVzIG9uZSBSZWRpcywgYW5kIHRoZSBvbGRcbiAgICAvLyB1bnByZWZpeGVkIGBybDo8aXA+YCBrZXkgbGV0IG9uZSBjbGllbnQncyB0cmFmZmljIHRvIEFOWSBzZXJ2aWNlIGRyYWluIGl0c1xuICAgIC8vIGJ1ZGdldCBvbiBFVkVSWSBzZXJ2aWNlLlxuICAgIHJhdGVMaW1pdE9wdGlvbnMuc3RvcmUgPSBjcmVhdGVTaGFyZWRSYXRlTGltaXRTdG9yZShgJHtzZXJ2aWNlTmFtZX06Z2xvYmFsYCk7XG5cbiAgICBhcHAudXNlKHJhdGVMaW1pdChyYXRlTGltaXRPcHRpb25zKSk7XG4gIH1cblxuICAvLyBFeHByZXNzIHJlcXVlc3QgdGltZW91dCDigJQgdXNlcyBDb3JlQ29uc3RhbnRzIHRvIHNoYXJlIHRoZSBzYW1lIGRlZmF1bHQgYXMgTGFtYmRhIGhhbmRsZXJzXG4gIGNvbnN0IHRpbWVvdXRNcyA9IENvcmVDb25zdGFudHMuSEFORExFUl9USU1FT1VUX01TO1xuICBhcHAudXNlKChfcmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pID0+IHtcbiAgICByZXMuc2V0VGltZW91dCh0aW1lb3V0TXMsICgpID0+IHtcbiAgICAgIGlmICghcmVzLmhlYWRlcnNTZW50KSB7XG4gICAgICAgIHNlbmRFcnJvcihyZXMsIDUwMywgJ1JlcXVlc3QgdGltZW91dCcpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIG5leHQoKTtcbiAgfSk7XG5cbiAgLy8gUmVxdWVzdCBkdXJhdGlvbiBsb2dnaW5nXG4gIGNvbnN0IGR1cmF0aW9uTG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdyZXF1ZXN0LWR1cmF0aW9uJyk7XG4gIGFwcC51c2UoKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIHJlcy5vbignZmluaXNoJywgKCkgPT4ge1xuICAgICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnQ7XG4gICAgICAvLyBMb2cgYHJlcS5wYXRoYCAobm8gcXVlcnkgc3RyaW5nKSDigJQgYSBzdHJheSBgP3Rva2VuPWAvYD90aWNrZXQ9YCBtdXN0IG5vdCBiZVxuICAgICAgLy8gcGVyc2lzdGVkIHZlcmJhdGltIG9uIGV2ZXJ5IHJlcXVlc3QgKG1pcnJvcnMgdGhlIGF1dGh6LWRlbmlhbCBhdWRpdG9yJ3Mgc3RyaXApLlxuICAgICAgZHVyYXRpb25Mb2dnZXIuaW5mbyhgJHtyZXEubWV0aG9kfSAke3JlcS5wYXRofSAke3Jlcy5zdGF0dXNDb2RlfSAke2R1cmF0aW9ufW1zYCwge1xuICAgICAgICBtZXRob2Q6IHJlcS5tZXRob2QsXG4gICAgICAgIHBhdGg6IHJlcS5wYXRoLFxuICAgICAgICBzdGF0dXNDb2RlOiByZXMuc3RhdHVzQ29kZSxcbiAgICAgICAgZHVyYXRpb25NczogZHVyYXRpb24sXG4gICAgICAgIHJlcXVlc3RJZDogcmVxLnJlcXVlc3RJZCxcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIG5leHQoKTtcbiAgfSk7XG5cbiAgLy8gUHJvbWV0aGV1cyBtZXRyaWNzIG1pZGRsZXdhcmUg4oCUIHJlY29yZHMgcmVxdWVzdCBkdXJhdGlvbiBhbmQgY291bnRcbiAgYXBwLnVzZShtZXRyaWNzTWlkZGxld2FyZSgpKTtcblxuICAvLyBOT1RFOiBpZGVtcG90ZW5jeSBpcyBpbnRlbnRpb25hbGx5IE5PVCBtb3VudGVkIGhlcmUuIEl0IG5lZWRzIHRoZSBWRVJJRklFRFxuICAvLyBvcmcgaWQgdG8gbmFtZXNwYWNlIGl0cyByZXBsYXkgY2FjaGUsIGJ1dCB0aGlzIHByZS1hdXRoIHBvc2l0aW9uIHJ1bnMgYmVmb3JlXG4gIC8vIGByZXF1aXJlQXV0aGAvYGF0dGFjaFJlcXVlc3RDb250ZXh0YCBwb3B1bGF0ZSBpZGVudGl0eSwgc28gYSBnbG9iYWwgbW91bnRcbiAgLy8gaGVyZSBpcyBhIHBlcm1hbmVudCBuby1vcCAob3JnIGFsd2F5cyB1bmRlZmluZWQg4oaSIHNraXApLiBJdCBpcyBpbnN0ZWFkIHdpcmVkXG4gIC8vIGludG8gdGhlIHBvc3QtYXV0aCByb3V0ZSBjaGFpbnMg4oCUIHNlZSBgY3JlYXRlUHJvdGVjdGVkUm91dGVgIC9cbiAgLy8gYGNyZWF0ZUF1dGhlbnRpY2F0ZWRXaXRoT3JnUm91dGVgIGluIG1pZGRsZXdhcmUtZmFjdG9yeS50cy5cblxuICBpZiAobG9nU3RyZWFtKSB7XG4gICAgLy8gU1NFIGxvZ3MgZW5kcG9pbnQg4oCUIHRpY2tldC1nYXRlZCAoV2F2ZSAyYikuXG4gICAgLy8gVGhlIHN0cmVhbSBjYXJyaWVzIHBlci1vcmcgYnVpbGQgbG9ncywgc28gaXQgbXVzdCBub3QgYmUgd29ybGQtcmVhZGFibGUuXG4gICAgLy8gQ2xpZW50cyBmaXJzdCBQT1NUIC9sb2dzL3RpY2tldCAoSldULWF1dGhlbnRpY2F0ZWQpIHRvIG1pbnQgYSBzaG9ydC1saXZlZCxcbiAgICAvLyBzaW5nbGUtdXNlIHRpY2tldCBib3VuZCB0byB0aGVpciBvcmcgQU5EIHRvIHRoZSBzcGVjaWZpYyBgcmVxdWVzdElkYCBzdHJlYW1cbiAgICAvLyB0aGV5IGludGVuZCB0byBvcGVuLCB0aGVuIG9wZW4gdGhlIEV2ZW50U291cmNlIHdpdGggP3RpY2tldD08dD4uIFRoaXMga2VlcHNcbiAgICAvLyB0aGUgSldUIG91dCBvZiBxdWVyeSBzdHJpbmdzIC8gYWNjZXNzIGxvZ3Mgd2hpbGUgZW5mb3JjaW5nIG9yZyBvd25lcnNoaXAsXG4gICAgLy8gcGVyLXN1YmplY3QgYXV0aG9yaXphdGlvbiwgYW5kIHRoZSBwZXItb3JnIGNvbm5lY3Rpb24gY2FwIG9uIHRoZSBzdHJlYW0uXG4gICAgLy8gTWlycm9ycyB0aGUgbWVzc2FnZS1zZXJ2aWNlIG5vdGlmaWNhdGlvbnMgU1NFIHRpY2tldCBleGNoYW5nZS5cbiAgICBhcHAucG9zdCgnL2xvZ3MvdGlja2V0JywgcmVxdWlyZUF1dGgsIGFzeW5jIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IG9yZ0lkID0gcmVxLnVzZXI/Lm9yZ2FuaXphdGlvbklkPy50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKCFvcmdJZCkge1xuICAgICAgICBzZW5kRXJyb3IocmVzLCA0MDAsICdUb2tlbiBtaXNzaW5nIG9yZ2FuaXphdGlvbicsIEVycm9yQ29kZS5WQUxJREFUSU9OX0VSUk9SKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gVGhlIGNhbGxlciBtdXN0IG5hbWUgdGhlIHN0cmVhbSBzdWJqZWN0IHVwIGZyb250IHNvIHRoZSB0aWNrZXQgaXMgYm91bmQgdG9cbiAgICAgIC8vIGl0LiBXaXRob3V0IHRoaXMsIGEgdGlja2V0IGNvdWxkIGJlIHJlcGxheWVkIGFnYWluc3QgQU5ZIHJlcXVlc3RJZCB0aGVcbiAgICAgIC8vIG9yZyBjb3VsZCBndWVzcywgbGV0dGluZyBpdCBhdHRhY2ggdG8gYW5vdGhlciBvcmcncyBsb2cgc3RyZWFtLiBTdHJpY3RseVxuICAgICAgLy8gZm9ybWF0LXZhbGlkYXRlZCBzbyBpdCBjYW4ndCBjYXJyeSBhbiBpbmplY3Rpb24gcGF5bG9hZCBpbnRvIHRoZSBzdWJqZWN0LlxuICAgICAgY29uc3QgcmVxdWVzdElkID0gKHJlcS5ib2R5IGFzIHsgcmVxdWVzdElkPzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8ucmVxdWVzdElkO1xuICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0SWQgIT09ICdzdHJpbmcnIHx8ICFTU0VfUkVRVUVTVF9JRF9SRS50ZXN0KHJlcXVlc3RJZCkpIHtcbiAgICAgICAgc2VuZEVycm9yKHJlcywgNDAwLCAnTWlzc2luZyBvciBpbnZhbGlkIHJlcXVlc3RJZCcsIEVycm9yQ29kZS5WQUxJREFUSU9OX0VSUk9SKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3NlTWFuYWdlci5jcmVhdGVUaWNrZXQob3JnSWQsIHJlcXVlc3RJZCk7XG4gICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICBpZiAocmVzdWx0LnJlYXNvbiA9PT0gJ2ZvcmJpZGRlbicpIHtcbiAgICAgICAgICAvLyBUaGUgc3ViamVjdCBpcyBvd25lZCBieSBhbm90aGVyIG9yZyDigJQgZG8gbm90IGNvbmZpcm0gaXQgZXhpc3RzOyBhIHBsYWluXG4gICAgICAgICAgLy8gNDAzIGlzIGVub3VnaCBhbmQgbGVha3Mgbm90aGluZyBhYm91dCB3aGljaCByZXF1ZXN0SWRzIGFyZSBsaXZlLlxuICAgICAgICAgIHNlbmRFcnJvcihyZXMsIDQwMywgJ05vdCBhdXRob3JpemVkIGZvciB0aGlzIGxvZyBzdHJlYW0nLCBFcnJvckNvZGUuSU5TVUZGSUNJRU5UX1BFUk1JU1NJT05TKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQucmVhc29uID09PSAnb3JnLWxpbWl0Jykge1xuICAgICAgICAgIHNlbmRFcnJvcihyZXMsIDQyOSwgJ1RvbyBtYW55IGxvZyBzdHJlYW0gdGlja2V0cyBpc3N1ZWQnLCBFcnJvckNvZGUuUVVPVEFfRVhDRUVERUQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbmRFcnJvcihyZXMsIDUwMywgJ0xvZyBzdHJlYW1pbmcgc3Vic3lzdGVtIGF0IGNhcGFjaXR5JywgRXJyb3JDb2RlLlFVT1RBX0VYQ0VFREVEKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzZW5kU3VjY2VzcyhyZXMsIDIwMCwgeyB0aWNrZXQ6IHJlc3VsdC50aWNrZXQgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgc3RyZWFtIGl0c2VsZiByZXNvbHZlcyArIGNvbnN1bWVzIHRoZSB0aWNrZXQgaW5zaWRlIG1pZGRsZXdhcmUoKSBhbmRcbiAgICAvLyByZWplY3RzIGFueSBhbm9ueW1vdXMgLyBpbnZhbGlkIC8gZXhwaXJlZCAvIGFscmVhZHktdXNlZCB0aWNrZXQgd2l0aCA0MDEuXG4gICAgYXBwLmdldCgnL2xvZ3MvOnJlcXVlc3RJZCcsIHNzZU1hbmFnZXIubWlkZGxld2FyZSgpKTtcbiAgfVxuXG4gIHJldHVybiB7IGFwcCwgc3NlTWFuYWdlciB9O1xufVxuIl19