@pipeline-builder/pipeline-core 4.4.10 → 4.4.12
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/lib/config/config-types.d.ts +0 -36
- package/lib/config/config-types.js +1 -1
- package/lib/config/infrastructure-config.js +1 -3
- package/lib/core/pipeline-helpers.d.ts +26 -3
- package/lib/core/pipeline-helpers.js +62 -131
- package/lib/core/plugin-lookup-envelope.d.ts +44 -1
- package/lib/core/plugin-lookup-envelope.js +58 -3
- package/lib/core/self-mutation.d.ts +31 -0
- package/lib/core/self-mutation.js +36 -0
- package/lib/core/step-manifest.d.ts +36 -0
- package/lib/core/step-manifest.js +8 -2
- package/lib/handlers/bundle/index.mjs +20 -20
- package/lib/index.d.ts +2 -1
- package/lib/index.js +3 -2
- package/lib/pipeline/pipeline-builder.d.ts +19 -0
- package/lib/pipeline/pipeline-builder.js +67 -21
- package/lib/pipeline/plugin-lookup.d.ts +5 -9
- package/lib/pipeline/plugin-lookup.js +6 -10
- package/lib/pipeline/stage-builder.d.ts +4 -1
- package/lib/pipeline/stage-builder.js +4 -1
- package/lib/pipeline/step-manifest-recorder.d.ts +10 -1
- package/lib/pipeline/step-manifest-recorder.js +30 -3
- package/lib/pipeline/step-types.d.ts +9 -1
- package/lib/pipeline/step-types.js +1 -1
- package/lib/testing/exports.json +10 -0
- package/package.json +4 -4
|
@@ -12,6 +12,7 @@ import { resolveNetwork } from './network.js';
|
|
|
12
12
|
import { PluginType, ComputeType } from './pipeline-types.js';
|
|
13
13
|
import { pluginArtifactAlias } from './plugin-contract.js';
|
|
14
14
|
import { SECURITY_REPORT_KEY_ENV, SECURITY_REPORT_SECRET_LEAF, SECURITY_REPORT_UPLOAD_ENV } from './security-reports.js';
|
|
15
|
+
import { CURATED_SELF_MUTATION_IMAGE } from './self-mutation.js';
|
|
15
16
|
import { PLUGIN_IMAGE_REPOSITORY_RE } from './step-manifest.js';
|
|
16
17
|
import { Config, CoreConstants } from '../config/app-config.js';
|
|
17
18
|
import { resolvePluginTemplates } from '../template/plugin-resolver.js';
|
|
@@ -172,8 +173,9 @@ function resolveExternalPullTarget(registry) {
|
|
|
172
173
|
* sending the per-org platform Secret as Basic auth to
|
|
173
174
|
* `pipeline-image-registry`'s `/token` endpoint; the JWT in `password`
|
|
174
175
|
* resolves to a registry token scoped to the org.
|
|
175
|
-
* 3. If `metadata_only`, return `undefined` so
|
|
176
|
-
* (`
|
|
176
|
+
* 3. If `metadata_only`, return `undefined` so the step runs on the
|
|
177
|
+
* pipeline's default image (`codeBuildDefaults`: the toolchain release's
|
|
178
|
+
* `system/pipeline-bootstrap@<digest>`, see {@link resolveDefaultBuildImage}).
|
|
177
179
|
*
|
|
178
180
|
* `scope` and `orgId` are required: the per-org platform Secret is named
|
|
179
181
|
* `pipeline-builder/<orgId>/platform`, and `Secret.fromSecretNameV2()`
|
|
@@ -188,7 +190,7 @@ export function resolvePluginImage(scope, plugin, orgId) {
|
|
|
188
190
|
// makes both NOT NULL). Defensive check in case a malformed row slips in.
|
|
189
191
|
if (!plugin.name || !plugin.version) {
|
|
190
192
|
log.warn(`Plugin "${plugin.name}" has buildType=${plugin.buildType} but missing name/version — ` +
|
|
191
|
-
'CodeBuild will run on
|
|
193
|
+
'CodeBuild will run on the default build image and won\'t have the plugin\'s baked tools.');
|
|
192
194
|
return undefined;
|
|
193
195
|
}
|
|
194
196
|
// No digest ⇒ the plugin service never signed an image for this row (or the
|
|
@@ -214,13 +216,13 @@ export function resolvePluginImage(scope, plugin, orgId) {
|
|
|
214
216
|
catch {
|
|
215
217
|
// Config namespace not loaded (e.g., unit tests without full config).
|
|
216
218
|
log.warn(`Plugin "${plugin.name}:${plugin.version}" needs the registry config but it's not loaded — ` +
|
|
217
|
-
'CodeBuild will fall back to
|
|
219
|
+
'CodeBuild will fall back to the default build image. ' +
|
|
218
220
|
'Set IMAGE_REGISTRY_HOST + IMAGE_REGISTRY_PORT in pipeline-manager\'s environment.');
|
|
219
221
|
return undefined;
|
|
220
222
|
}
|
|
221
223
|
if (!registry?.host) {
|
|
222
224
|
log.warn(`Plugin "${plugin.name}:${plugin.version}" needs IMAGE_REGISTRY_HOST but it's empty — ` +
|
|
223
|
-
'CodeBuild will fall back to
|
|
225
|
+
'CodeBuild will fall back to the default build image. ' +
|
|
224
226
|
'Set IMAGE_REGISTRY_HOST in pipeline-manager\'s environment to use the plugin image.');
|
|
225
227
|
return undefined;
|
|
226
228
|
}
|
|
@@ -267,132 +269,48 @@ export function resolvePluginImage(scope, plugin, orgId) {
|
|
|
267
269
|
secretsManagerCredentials: credentialsSecret,
|
|
268
270
|
});
|
|
269
271
|
}
|
|
272
|
+
/** The managed toolchain's build-image plugin name and its (system-org) image repository. */
|
|
273
|
+
export const BOOTSTRAP_PLUGIN_NAME = 'pipeline-bootstrap';
|
|
274
|
+
export const BOOTSTRAP_IMAGE_REPOSITORY = `system/${BOOTSTRAP_PLUGIN_NAME}`;
|
|
270
275
|
/**
|
|
271
|
-
*
|
|
276
|
+
* The default CodeBuild image — every action without a plugin-baked image (the
|
|
277
|
+
* pipeline-wide `codeBuildDefaults`, a plugin-less step, asset publishing) —
|
|
278
|
+
* pinned to the resolved toolchain release's `pipeline-bootstrap` image.
|
|
272
279
|
*
|
|
273
|
-
*
|
|
274
|
-
*
|
|
275
|
-
* `
|
|
276
|
-
*
|
|
277
|
-
*
|
|
278
|
-
*
|
|
279
|
-
* - AWS curated image (`aws/codebuild/*`): use the matching `LinuxBuildImage`
|
|
280
|
-
* constant so CDK emits `imagePullCredentialsType: CODEBUILD`. Using
|
|
281
|
-
* `fromDockerRegistry()` here would set SERVICE_ROLE credentials, which
|
|
282
|
-
* CFN rejects with "cannot use a CodeBuild curated image with
|
|
283
|
-
* imagePullCredentialsType SERVICE_ROLE".
|
|
284
|
-
* - Bare tag (no `/`): auto-prefixed to
|
|
285
|
-
* `<registry-host>:<port>/library/<tag>` using the registry config,
|
|
286
|
-
* with the per-org platform Secret as Basic auth — same path
|
|
287
|
-
* `resolvePluginImage()` uses for plugin images. Needs `scope` + `orgId`.
|
|
288
|
-
* - Fully-qualified registry URI (contains `/`): used as-is, no auth wired.
|
|
289
|
-
* - Missing registry config or scope/orgId → falls back to
|
|
290
|
-
* `aws/codebuild/standard:8.0` (as a CURATED image, see above), with a
|
|
291
|
-
* warning so synth degrades gracefully on partially configured envs.
|
|
292
|
-
*/
|
|
293
|
-
const STANDARD_8_0 = 'aws/codebuild/standard:8.0';
|
|
294
|
-
/**
|
|
295
|
-
* aws-cdk-lib 2.258 has no `LinuxBuildImage.STANDARD_8_0` static yet, so the
|
|
296
|
-
* curated 8.0 fallback resolves via `fromCodeBuildImageId` (still CODEBUILD creds).
|
|
297
|
-
*/
|
|
298
|
-
const fallbackBuildImage = () => LinuxBuildImage.fromCodeBuildImageId(STANDARD_8_0);
|
|
299
|
-
/**
|
|
300
|
-
* Map AWS curated `aws/codebuild/*` image strings to the matching
|
|
301
|
-
* `LinuxBuildImage` static. Extend when newer standard images ship.
|
|
302
|
-
* Returns `undefined` for non-curated strings — caller should use
|
|
303
|
-
* `fromDockerRegistry()` for those.
|
|
280
|
+
* Exactly the path a system plugin's image takes ({@link resolvePluginImage}):
|
|
281
|
+
* `<external pull host>/system/pipeline-bootstrap@<signed digest>` with the
|
|
282
|
+
* org's `registry-push` secret as the pull credential. There is no env-driven
|
|
283
|
+
* image, no tag pull and no curated fallback: the bootstrap is resolved from
|
|
284
|
+
* the platform (`pipeline-manager`'s `resolveBootstrapImage`, D2) and anything
|
|
285
|
+
* short of a pinned, pullable image fails the synth.
|
|
304
286
|
*/
|
|
305
|
-
function
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
287
|
+
export function resolveDefaultBuildImage(scope, orgId, bootstrap) {
|
|
288
|
+
const fail = (why) => {
|
|
289
|
+
throw new Error(`BOOTSTRAP_IMAGE_UNRESOLVED: the default build image can't be pinned — ${why}. ` +
|
|
290
|
+
'Synthesize through `pipeline-manager pipeline synth/deploy` (or pass `--toolchain-file` with `--local-spec`).');
|
|
291
|
+
};
|
|
292
|
+
if (!bootstrap || bootstrap.name !== BOOTSTRAP_PLUGIN_NAME) {
|
|
293
|
+
fail(`resolvedBootstrap is "${bootstrap?.name ?? 'missing'}", not ${BOOTSTRAP_PLUGIN_NAME}`);
|
|
294
|
+
}
|
|
295
|
+
const repository = bootstrap.imageRepository;
|
|
296
|
+
if (repository !== BOOTSTRAP_IMAGE_REPOSITORY) {
|
|
297
|
+
fail(`${BOOTSTRAP_PLUGIN_NAME}:${bootstrap.version} has image repository "${repository ?? 'none'}", not ${BOOTSTRAP_IMAGE_REPOSITORY}`);
|
|
314
298
|
}
|
|
299
|
+
if (!orgId)
|
|
300
|
+
fail('the pipeline has no orgId (the registry pull credential is per org)');
|
|
301
|
+
// Throws on a missing/malformed digest and an unreachable pull host.
|
|
302
|
+
const image = resolvePluginImage(scope, { ...bootstrap, buildType: 'prebuilt' }, orgId);
|
|
303
|
+
if (!image)
|
|
304
|
+
fail('the registry config is not loaded (IMAGE_REGISTRY_HOST / the platform URL)');
|
|
305
|
+
return image;
|
|
315
306
|
}
|
|
316
|
-
/** A registry manifest digest as CodeBuild accepts it in an image reference. */
|
|
317
|
-
const IMAGE_DIGEST_RE = /^sha256:[0-9a-f]{64}$/;
|
|
318
307
|
/**
|
|
319
|
-
*
|
|
320
|
-
*
|
|
321
|
-
*
|
|
322
|
-
*
|
|
308
|
+
* The AWS curated image self-mutation runs on (D10): it only needs Node and the
|
|
309
|
+
* pinned CDK CLI, and a curated image keeps a defective toolchain release
|
|
310
|
+
* recoverable. Curated ⇒ `fromCodeBuildImageId` (CODEBUILD pull credentials —
|
|
311
|
+
* `fromDockerRegistry` would set SERVICE_ROLE, which CFN rejects for a curated image).
|
|
323
312
|
*/
|
|
324
|
-
|
|
325
|
-
if (!digest) {
|
|
326
|
-
log.warn(`CODEBUILD_DEFAULT_IMAGE='${configured}' is pulled by its MUTABLE tag — CODEBUILD_DEFAULT_IMAGE_DIGEST is not set. ` +
|
|
327
|
-
'Anyone holding a registry push credential for library/ could re-point it. Set CODEBUILD_DEFAULT_IMAGE_DIGEST ' +
|
|
328
|
-
'to the digest deploy/bin/build-codebuild-bootstrap.sh prints after publishing.');
|
|
329
|
-
return configured;
|
|
330
|
-
}
|
|
331
|
-
if (!IMAGE_DIGEST_RE.test(digest)) {
|
|
332
|
-
throw new Error(`CODEBUILD_DEFAULT_IMAGE_DIGEST='${digest}' is not a sha256 manifest digest (sha256:<64 hex>).`);
|
|
333
|
-
}
|
|
334
|
-
const repo = configured.replace(/@.*$/, '').replace(/:[^:/]+$/, '');
|
|
335
|
-
return `${repo}@${digest}`;
|
|
336
|
-
}
|
|
337
|
-
export function resolveDefaultBuildImage(scope, orgId) {
|
|
338
|
-
let configured;
|
|
339
|
-
let digest = '';
|
|
340
|
-
try {
|
|
341
|
-
const codeBuild = Config.get('aws').codeBuild;
|
|
342
|
-
configured = codeBuild.defaultImage;
|
|
343
|
-
digest = codeBuild.defaultImageDigest;
|
|
344
|
-
}
|
|
345
|
-
catch {
|
|
346
|
-
configured = STANDARD_8_0;
|
|
347
|
-
}
|
|
348
|
-
// AWS curated image → CODEBUILD credentials. MUST go through the
|
|
349
|
-
// LinuxBuildImage constants, not fromDockerRegistry().
|
|
350
|
-
const curated = curatedLinuxBuildImage(configured);
|
|
351
|
-
if (curated)
|
|
352
|
-
return curated;
|
|
353
|
-
// Fully-qualified URI — operator owns it. No registry/Secret wiring. An
|
|
354
|
-
// operator-supplied digest is honoured; a tag-only URI is warned about.
|
|
355
|
-
if (configured.includes('/')) {
|
|
356
|
-
return LinuxBuildImage.fromDockerRegistry(configured.includes('@sha256:') ? configured : pinnedDefaultImageRef(configured, digest));
|
|
357
|
-
}
|
|
358
|
-
// Bare tag → auto-prefix with the platform registry, mirroring
|
|
359
|
-
// resolvePluginImage(). Bail to the curated standard:8.0 fallback
|
|
360
|
-
// (with a warning) at each missing prerequisite so synth degrades
|
|
361
|
-
// gracefully on partially configured environments instead of failing.
|
|
362
|
-
let registry;
|
|
363
|
-
try {
|
|
364
|
-
registry = Config.get('registry');
|
|
365
|
-
}
|
|
366
|
-
catch {
|
|
367
|
-
log.warn(`CODEBUILD_DEFAULT_IMAGE='${configured}' is a bare tag but registry config not loaded — ` +
|
|
368
|
-
`falling back to ${STANDARD_8_0}. Set IMAGE_REGISTRY_HOST + IMAGE_REGISTRY_PORT.`);
|
|
369
|
-
return fallbackBuildImage();
|
|
370
|
-
}
|
|
371
|
-
if (!registry?.host) {
|
|
372
|
-
log.warn(`CODEBUILD_DEFAULT_IMAGE='${configured}' is a bare tag but IMAGE_REGISTRY_HOST is empty — ` +
|
|
373
|
-
`falling back to ${STANDARD_8_0}.`);
|
|
374
|
-
return fallbackBuildImage();
|
|
375
|
-
}
|
|
376
|
-
if (!scope || !orgId) {
|
|
377
|
-
log.warn(`CODEBUILD_DEFAULT_IMAGE='${configured}' needs scope+orgId for Secret auth — ` +
|
|
378
|
-
`falling back to ${STANDARD_8_0}. (Caller did not supply them.)`);
|
|
379
|
-
return fallbackBuildImage();
|
|
380
|
-
}
|
|
381
|
-
// Use the external pull host/port (not the in-cluster host) — this URI is
|
|
382
|
-
// consumed by AWS CodeBuild, which can't resolve the `registry:5000` ClusterIP.
|
|
383
|
-
const { host: pullHost, portPart } = resolveExternalPullTarget(registry);
|
|
384
|
-
const imageUri = `${pullHost}${portPart}/library/${pinnedDefaultImageRef(configured, digest)}`;
|
|
385
|
-
// Same Secret as resolvePluginImage — the per-org REGISTRY credential, which
|
|
386
|
-
// CodeBuild sends as Basic auth and image-registry exchanges for a scoped token.
|
|
387
|
-
const stack = Stack.of(scope);
|
|
388
|
-
const secretName = CoreConstants.secretPath(orgId, REGISTRY_CREDENTIAL_SECRET);
|
|
389
|
-
const secretConstructId = `RegistryCreds_${secretName.replace(/[^A-Za-z0-9_-]/g, '_')}`;
|
|
390
|
-
const credentialsSecret = stack.node.tryFindChild(secretConstructId)
|
|
391
|
-
?? Secret.fromSecretNameV2(stack, secretConstructId, secretName);
|
|
392
|
-
return LinuxBuildImage.fromDockerRegistry(imageUri, {
|
|
393
|
-
secretsManagerCredentials: credentialsSecret,
|
|
394
|
-
});
|
|
395
|
-
}
|
|
313
|
+
export const curatedSelfMutationImage = () => LinuxBuildImage.fromCodeBuildImageId(CURATED_SELF_MUTATION_IMAGE);
|
|
396
314
|
/**
|
|
397
315
|
* Create a CodeBuild step or Shell step based on plugin configuration.
|
|
398
316
|
*
|
|
@@ -481,17 +399,18 @@ export function createCodeBuildStep(options) {
|
|
|
481
399
|
postCommands,
|
|
482
400
|
}, failureBehavior);
|
|
483
401
|
const programmatic = { input, installCommands, commands };
|
|
484
|
-
// Resolve the plugin's runtime image.
|
|
485
|
-
//
|
|
486
|
-
//
|
|
487
|
-
// (
|
|
402
|
+
// Resolve the plugin's runtime image. A step with no `buildImage` runs on
|
|
403
|
+
// the pipeline's default image (the toolchain release's pipeline-bootstrap,
|
|
404
|
+
// via `codeBuildDefaults`), which carries pipeline-manager and the CDK CLI
|
|
405
|
+
// but NONE of a plugin's baked tools (snyk, terraform, etc.). Wiring the plugin's image
|
|
488
406
|
// here means CodeBuild pulls from our private registry and the tools
|
|
489
407
|
// installed in the plugin's Dockerfile are actually available.
|
|
490
408
|
const pluginBuildImage = resolvePluginImage(scope, plugin, orgId);
|
|
491
409
|
// ShellStep branch.
|
|
492
410
|
// ShellStep itself doesn't accept `buildEnvironment`/`buildImage`. CDK
|
|
493
411
|
// pipelines wraps ShellSteps in a default CodeBuild action that runs on
|
|
494
|
-
//
|
|
412
|
+
// the pipeline's default image (pipeline-bootstrap) — which won't have the
|
|
413
|
+
// plugin's tools.
|
|
495
414
|
//
|
|
496
415
|
// So when a SHELL_STEP plugin DOES have an image (because its author
|
|
497
416
|
// baked tools into a Dockerfile), we PROMOTE it to a CodeBuildStep with
|
|
@@ -549,7 +468,7 @@ export function createCodeBuildStep(options) {
|
|
|
549
468
|
partialBuildSpec: BuildSpec.fromObject({ env: { shell: '/bin/sh' } }),
|
|
550
469
|
buildEnvironment: {
|
|
551
470
|
computeType,
|
|
552
|
-
buildImage: pluginBuildImage ??
|
|
471
|
+
buildImage: pluginBuildImage ?? defaultBuildImageOrThrow(options),
|
|
553
472
|
environmentVariables: {
|
|
554
473
|
...toCodeBuildEnvVars(env),
|
|
555
474
|
...secretEnvVars,
|
|
@@ -572,6 +491,18 @@ export function createCodeBuildStep(options) {
|
|
|
572
491
|
}
|
|
573
492
|
return step;
|
|
574
493
|
}
|
|
494
|
+
/**
|
|
495
|
+
* The default image a plugin-less CodeBuild step runs on. It is resolved once
|
|
496
|
+
* per pipeline from `resolvedBootstrap` and handed down; a step without one
|
|
497
|
+
* has no image to run on, so the synth stops rather than let CodeBuild pick
|
|
498
|
+
* its own.
|
|
499
|
+
*/
|
|
500
|
+
function defaultBuildImageOrThrow(options) {
|
|
501
|
+
if (options.defaultBuildImage)
|
|
502
|
+
return options.defaultBuildImage;
|
|
503
|
+
throw new Error(`BOOTSTRAP_IMAGE_UNRESOLVED: step "${options.id}" (plugin "${options.plugin.name}") has no plugin image and no default build image. ` +
|
|
504
|
+
'Pass `defaultBuildImage` (PipelineBuilder resolves it from `resolvedBootstrap`).');
|
|
505
|
+
}
|
|
575
506
|
/**
|
|
576
507
|
* Convert string or ComputeType enum to CDK ComputeType
|
|
577
508
|
*/
|
|
@@ -607,4 +538,4 @@ export function getComputeType(input = 'SMALL') {
|
|
|
607
538
|
export function unwrapSecret(value) {
|
|
608
539
|
return typeof value === 'string' ? value : value.unsafeUnwrap();
|
|
609
540
|
}
|
|
610
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUtaGVscGVycy5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvcGlwZWxpbmUtaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0QsT0FBTyxFQUFFLDRCQUE0QixFQUFFLFNBQVMsRUFBRSxXQUFXLElBQUksY0FBYyxFQUFFLGVBQWUsRUFBb0IsTUFBTSwyQkFBMkIsQ0FBQztBQUN0SixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSxTQUFTLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVyRixPQUFPLEVBQW9CLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLHdCQUF3QixFQUFFLDJCQUEyQixFQUFFLHlCQUF5QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0ksT0FBTyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3RILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQXFCLE1BQU0scUJBQXFCLENBQUM7QUFDakYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHVCQUF1QixFQUFFLDJCQUEyQixFQUFFLDBCQUEwQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekgsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEUsT0FBTyxFQUFF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b3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW4gfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1kYXRhJztcbmltcG9ydCB7IER1cmF0aW9uLCBTZWNyZXRWYWx1ZSwgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBCdWlsZEVudmlyb25tZW50VmFyaWFibGVUeXBlLCBCdWlsZFNwZWMsIENvbXB1dGVUeXBlIGFzIENES0NvbXB1dGVUeXBlLCBMaW51eEJ1aWxkSW1hZ2UsIHR5cGUgSUJ1aWxkSW1hZ2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY29kZWJ1aWxkJztcbmltcG9ydCB7IFNlY3JldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlcic7XG5pbXBvcnQgeyBDb2RlQnVpbGRTdGVwLCBNYW51YWxBcHByb3ZhbFN0ZXAsIFNoZWxsU3RlcCB9IGZyb20gJ2F3cy1jZGstbGliL3BpcGVsaW5lcyc7XG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgdHlwZSBBcnRpZmFjdEtleSB9IGZyb20gJy4vYXJ0aWZhY3QtbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBtZXRhZGF0YUZvclNoZWxsU3RlcCwgbWV0YWRhdGFGb3JDb2RlQnVpbGRTdGVwLCBtZXRhZGF0YUZvckJ1aWxkRW52aXJvbm1lbnQsIG5ldHdvcmtDb25maWdGcm9tTWV0YWRhdGEgfSBmcm9tICcuL21ldGFkYXRhLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgU1RFUF9CT09UU1RSQVBfQ01ELCBleHRyYWN0TWV0YWRhdGFFbnYsIG1lcmdlLCB3cmFwQ29tbWFuZHNGb3JGYWlsdXJlQmVoYXZpb3IgfSBmcm9tICcuL21ldGFkYXRhLWhlbHBlcnMuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZU5ldHdvcmsgfSBmcm9tICcuL25ldHdvcmsuanMnO1xuaW1wb3J0IHsgUGx1Z2luVHlwZSwgQ29tcHV0ZVR5cGUsIHR5cGUgTWV0YURhdGFUeXBlIH0gZnJvbSAnLi9waXBlbGluZS10eXBlcy5qcyc7XG5pbXBvcnQgeyBwbHVnaW5BcnRpZmFjdEFsaWFzIH0gZnJvbSAnLi9wbHVnaW4tY29udHJhY3QuanMnO1xuaW1wb3J0IHsgU0VDVVJJVFlfUkVQT1JUX0tFWV9FTlYsIFNFQ1VSSVRZX1JFUE9SVF9TRUNSRVRfTEVBRiwgU0VDVVJJVFlfUkVQT1JUX1VQTE9BRF9FTlYgfSBmcm9tICcuL3NlY3VyaXR5LXJlcG9ydHMuanMnO1xuaW1wb3J0IHsgUExVR0lOX0lNQUdFX1JFUE9TSVRPUllfUkUgfSBmcm9tICcuL3N0ZXAtbWFuaWZlc3QuanMnO1xuaW1wb3J0IHsgQ29uZmlnLCBDb3JlQ29uc3RhbnRzIH0gZnJvbSAnLi4vY29uZmlnL2FwcC1jb25maWcuanMnO1xuaW1wb3J0IHR5cGUgeyBDb2RlQnVpbGRTdGVwT3B0aW9ucywgU3RlcEN1c3RvbWl6YXRpb24gfSBmcm9tICcuLi9waXBlbGluZS9zdGVwLXR5cGVzLmpzJztcbmltcG9ydCB7IHJlc29sdmVQbHVnaW5UZW1wbGF0ZXMgfSBmcm9tICcuLi90ZW1wbGF0ZS9wbHVnaW4tcmVzb2x2ZXIuanMnO1xuXG5jb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoJ3BpcGVsaW5lLWhlbHBlcnMnKTtcblxuLyoqXG4gKiBCdWlsZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBwbHVnaW4gY29uZmlnLCBtZXJnZWQgbWV0YWRhdGEsIGFuZCBjdXN0b20gZW52LlxuICpcbiAqIE1lcmdlIG9yZGVyIChsYXN0IHdpbnMpOlxuICogICAxLiBwbHVnaW4uZW52IOKAlCBwbHVnaW4gZGVmYXVsdCBlbnYgdmFycyAobG93ZXN0IHByaW9yaXR5KVxuICogICAyLiBub24tbmFtZXNwYWNlZCBtZXRhZGF0YSBrZXlzIOKAlCBlLmcuIFBZVEhPTl9WRVJTSU9OLCBXT1JLRElSXG4gKiAgIDMuIGN1c3RvbUVudiDigJQgcGVyLXN0ZXAgY3VzdG9tIGVudiB2YXJzIChoaWdoZXN0IHByaW9yaXR5KVxuICovXG5mdW5jdGlvbiBidWlsZEVudihwbHVnaW46IFBsdWdpbiwgbWV0YWRhdGE6IE1ldGFEYXRhVHlwZSwgY3VzdG9tRW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICByZXR1cm4ge1xuICAgIC4uLihwbHVnaW4uZW52ID8/IHt9KSxcbiAgICAuLi5leHRyYWN0TWV0YWRhdGFFbnYobWV0YWRhdGEpLFxuICAgIC4uLihjdXN0b21FbnYgPz8ge30pLFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIGJvb3RzdHJhcC1wcmVmaXhlZCBpbnN0YWxsIGFuZCBidWlsZCBjb21tYW5kcyBmcm9tIHBsdWdpbiBjb25maWcuXG4gKiBFYWNoIGNvbW1hbmQgbGlzdCBpcyBwcmVwZW5kZWQgd2l0aCBhIFdPUktESVIgYm9vdHN0cmFwIHRoYXQgZGVmYXVsdHMgdG8gJy4vJy5cbiAqIFdoZW4gY3VzdG9tIGNvbW1hbmRzIGFyZSBwcm92aWRlZCwgdGhleSBhcmUgaW5qZWN0ZWQgYmVmb3JlL2FmdGVyIHRoZSBwbHVnaW4ncyBjb21tYW5kcy5cbiAqIEJ1aWxkIGNvbW1hbmRzIGFyZSBvcHRpb25hbGx5IHdyYXBwZWQgYnkgZmFpbHVyZUJlaGF2aW9yIGxvZ2ljLlxuICovXG5mdW5jdGlvbiBidWlsZENvbW1hbmRzKHBsdWdpbjogUGx1Z2luLCBjdXN0b20/OiBTdGVwQ3VzdG9taXphdGlvbiwgZmFpbHVyZUJlaGF2aW9yPzogJ2ZhaWwnIHwgJ3dhcm4nIHwgJ2lnbm9yZScpOiB7IGluc3RhbGxDb21tYW5kczogc3RyaW5nW107IGNvbW1hbmRzOiBzdHJpbmdbXSB9IHtcbiAgY29uc3QgdXNlckNvbW1hbmRzID0gW1xuICAgIC4uLihjdXN0b20/LnByZUNvbW1hbmRzID8/IFtdKSxcbiAgICAuLi4ocGx1Z2luLmNvbW1hbmRzPy5sZW5ndGggPyBwbHVnaW4uY29tbWFuZHMgOiBbXSksXG4gICAgLi4uKGN1c3RvbT8ucG9zdENvbW1hbmRzID8/IFtdKSxcbiAgXTtcblxuICByZXR1cm4ge1xuICAgIGluc3RhbGxDb21tYW5kczogW1xuICAgICAgU1RFUF9CT09UU1RSQVBfQ01ELFxuICAgICAgLi4uKGN1c3RvbT8ucHJlSW5zdGFsbENvbW1hbmRzID8/IFtdKSxcbiAgICAgIC4uLihwbHVnaW4uaW5zdGFsbENvbW1hbmRzID8/IFtdKSxcbiAgICAgIC4uLihjdXN0b20/LnBvc3RJbnN0YWxsQ29tbWFuZHMgPz8gW10pLFxuICAgIF0sXG4gICAgY29tbWFuZHM6IFtTVEVQX0JPT1RTVFJBUF9DTUQsIC4uLndyYXBDb21tYW5kc0ZvckZhaWx1cmVCZWhhdmlvcih1c2VyQ29tbWFuZHMsIGZhaWx1cmVCZWhhdmlvcildLFxuICB9O1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSBwbGFpbiBlbnYgcmVjb3JkIHRvIENvZGVCdWlsZCdzIGVudmlyb25tZW50VmFyaWFibGVzIGZvcm1hdCAoUExBSU5URVhUKS5cbiAqL1xuZnVuY3Rpb24gdG9Db2RlQnVpbGRFbnZWYXJzKGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHN0cmluZyB9PiB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMoZW52KS5tYXAoKFtuYW1lLCB2YWx1ZV0pID0+IFtuYW1lLCB7IHZhbHVlIH1dKSxcbiAgKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBTRUNSRVRTX01BTkFHRVItdHlwZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBwbHVnaW4gc2VjcmV0IGRlY2xhcmF0aW9ucy5cbiAqIFVzZXMgbmFtaW5nIGNvbnZlbnRpb246IHBpcGVsaW5lLWJ1aWxkZXIve29yZ0lkfS97c2VjcmV0TmFtZX1cbiAqIEVhY2ggb3JnIG1hbmFnZXMgdGhlc2Ugc2VjcmV0cyBpbiB0aGVpciBvd24gQVdTIFNlY3JldHMgTWFuYWdlci5cbiAqL1xuY29uc3QgVkFMSURfU0VDUkVUX05BTUUgPSAvXlthLXpBLVowLTkvXys9LkAtXSskLztcblxuLyoqXG4gKiBTZWNyZXRzIE1hbmFnZXIgbGVhZiBob2xkaW5nIHRoZSBvcmcncyBSRUdJU1RSWSBjcmVkZW50aWFsIOKAlCB0aGVcbiAqIGByZWdpc3RyeTpwdXNoYC1zY29wZWQgc2VydmljZS1hY2NvdW50IGtleSBDb2RlQnVpbGQgcHJlc2VudHMgYXMgQmFzaWMgYXV0aCB0b1xuICogcGlwZWxpbmUtaW1hZ2UtcmVnaXN0cnkuIERlbGliZXJhdGVseSBOT1QgYHBsYXRmb3JtYDogdGhhdCBzZWNyZXQgaG9sZHNcbiAqIHRoZSBvcmcncyBmdWxsLXByaXZpbGVnZSBhdXRvbWF0aW9uIGNyZWRlbnRpYWwsIGFuZCBhIGJ1aWxkIGNvbnRhaW5lciBoYXMgbm9cbiAqIGJ1c2luZXNzIGJlaW5nIGFibGUgdG8gY2FsbCB0aGUgQVBJIHdpdGggaXQuXG4gKiBQcm92aXNpb25lZCBieSBgcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbiAtLXNjb3BlIHJlZ2lzdHJ5OnB1c2hgLlxuICovXG5jb25zdCBSRUdJU1RSWV9DUkVERU5USUFMX1NFQ1JFVCA9ICdyZWdpc3RyeS1wdXNoJztcblxuZnVuY3Rpb24gdG9TZWNyZXRFbnZWYXJzKFxuICBzZWNyZXRzOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgcmVxdWlyZWQ6IGJvb2xlYW4gfT4sXG4gIG9yZ0lkOiBzdHJpbmcsXG4pOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiBzdHJpbmc7IHR5cGU6IEJ1aWxkRW52aXJvbm1lbnRWYXJpYWJsZVR5cGUgfT4ge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIHNlY3JldHMubWFwKCh7IG5hbWUgfSkgPT4ge1xuICAgICAgY29uc3Qgc2VjcmV0UGF0aCA9IENvcmVDb25zdGFudHMuc2VjcmV0UGF0aChvcmdJZCwgbmFtZSk7XG4gICAgICBpZiAoIVZBTElEX1NFQ1JFVF9OQU1FLnRlc3Qoc2VjcmV0UGF0aCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZWNyZXQgcGF0aCBcIiR7c2VjcmV0UGF0aH1cIiBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgZm9yIEFXUyBTZWNyZXRzIE1hbmFnZXJgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHtcbiAgICAgICAgICB2YWx1ZTogc2VjcmV0UGF0aCxcbiAgICAgICAgICB0eXBlOiBCdWlsZEVudmlyb25tZW50VmFyaWFibGVUeXBlLlNFQ1JFVFNfTUFOQUdFUixcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfSksXG4gICk7XG59XG5cbi8qKlxuICogSW4tY2x1c3RlciAvIGxvY2FsIHJlZ2lzdHJ5IGhvc3RuYW1lcyB0aGF0IEFXUyBDb2RlQnVpbGQgKG91dC1vZi1jbHVzdGVyKVxuICogY2Fubm90IHJlc29sdmUuIEJha2luZyBvbmUgb2YgdGhlc2UgaW50byBhIENvZGVCdWlsZCBpbWFnZSBVUkkgZ3VhcmFudGVlcyBhXG4gKiBgQlVJTERfQ09OVEFJTkVSX1VOQUJMRV9UT19QVUxMX0lNQUdFYCBmYWlsdXJlIGF0IGJ1aWxkIHRpbWUsIHNvIHdlIGZhaWwgdGhlXG4gKiBzeW50aCBmYXN0IGluc3RlYWQg4oCUIHdpdGggYSBtZXNzYWdlIHRoYXQgc2F5cyBob3cgdG8gZml4IGl0LlxuICovXG5jb25zdCBVTlJFQUNIQUJMRV9QVUxMX0hPU1RTID0gbmV3IFNldChbJ3JlZ2lzdHJ5JywgJ2xvY2FsaG9zdCcsICcxMjcuMC4wLjEnLCAnOjoxJywgJzAuMC4wLjAnXSk7XG5cbi8qKiBLdWJlcm5ldGVzIC8gbUROUyBzdWZmaXhlcyB0aGF0IG9ubHkgcmVzb2x2ZSBpbnNpZGUgdGhlIGNsdXN0ZXIvTEFOLiAqL1xuY29uc3QgVU5SRUFDSEFCTEVfSE9TVF9TVUZGSVhFUyA9IFsnLnN2YycsICcuc3ZjLmNsdXN0ZXIubG9jYWwnLCAnLmxvY2FsJ107XG5cbi8qKlxuICogUmVkdWNlIGEgcmVnaXN0cnkgaG9zdCB2YWx1ZSB0byBpdHMgYmFyZSBob3N0bmFtZSBmb3IgdGhlIHJlYWNoYWJpbGl0eSBjaGVjazpcbiAqIHN0cmlwIElQdjYgYnJhY2tldHMgYW5kIGFueSBgOnBvcnRgIHN1ZmZpeCAoYW4gb3BlcmF0b3IgbWF5IHB1dCBob3N0K3BvcnQgaW5cbiAqIG9uZSBmaWVsZCksIHNvIGByZWdpc3RyeTo1MDAwYCAvIGBbOjoxXTo1MDAwYCBhcmUgc3RpbGwgcmVjb2duaXplZC5cbiAqL1xuZnVuY3Rpb24gYmFyZUhvc3RuYW1lKHJhd0hvc3Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCBoID0gcmF3SG9zdC50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgaWYgKGguc3RhcnRzV2l0aCgnWycpKSB7XG4gICAgY29uc3QgZW5kID0gaC5pbmRleE9mKCddJyk7XG4gICAgaWYgKGVuZCAhPT0gLTEpIHJldHVybiBoLnNsaWNlKDEsIGVuZCk7IC8vIFs6OjFdOjUwMDAgLT4gOjoxXG4gIH1cbiAgLy8gU3RyaXAgYSB0cmFpbGluZyA6cG9ydCBvbmx5IGZvciBub24tSVB2NiB2YWx1ZXMgKElQdjYgY29udGFpbnMgJzo6JyBvciA+MSAnOicpLlxuICBpZiAoaC5pbmNsdWRlcygnOicpICYmIChoLm1hdGNoKC86L2cpPy5sZW5ndGggPz8gMCkgPT09IDEpIGggPSBoLnNwbGl0KCc6JylbMF07XG4gIHJldHVybiBoO1xufVxuXG4vKiogVHJ1ZSB3aGVuIENvZGVCdWlsZCAob3V0LW9mLWNsdXN0ZXIpIGNvdWxkIG5vdCByZXNvbHZlIHRoaXMgcmVnaXN0cnkgaG9zdC4gKi9cbmZ1bmN0aW9uIGlzVW5yZWFjaGFibGVQdWxsSG9zdChyYXdIb3N0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgaCA9IGJhcmVIb3N0bmFtZShyYXdIb3N0KTtcbiAgaWYgKGggPT09ICcnKSByZXR1cm4gdHJ1ZTsgLy8gbm8gaG9zdCDihpIgbWFsZm9ybWVkIFVSSVxuICBpZiAoVU5SRUFDSEFCTEVfUFVMTF9IT1NUUy5oYXMoaCkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gVU5SRUFDSEFCTEVfSE9TVF9TVUZGSVhFUy5zb21lKChzKSA9PiBoLmVuZHNXaXRoKHMpKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBleHRlcm5hbCAob3V0LW9mLWNsdXN0ZXIpIHJlZ2lzdHJ5IHB1bGwgaG9zdCArIGA6cG9ydGAgc3VmZml4IGZvclxuICogYSBDb2RlQnVpbGQgaW1hZ2UgVVJJLCBhbmQgZmFpbCBmYXN0IGlmIGl0IHJlc29sdmVkIHRvIGFuIGluLWNsdXN0ZXIvbG9jYWxcbiAqIGRlZmF1bHQgdGhhdCBDb2RlQnVpbGQgY2FuJ3QgcmVhY2guXG4gKlxuICogUHJlZmVycyBgcHVsbEhvc3RgL2BwdWxsUG9ydGAgKHRoZSBwdWJsaWMgZW5kcG9pbnQgQ29kZUJ1aWxkIGNhbiByZXNvbHZlKSBhbmRcbiAqIGZhbGxzIGJhY2sgdG8gYGhvc3RgL2Bwb3J0YCBmb3Igc2luZ2xlLWhvc3QgZGVwbG95cy4gcGlwZWxpbmUtbWFuYWdlciBiYWtlc1xuICogdGhlIHJpZ2h0IHB1bGwgaG9zdCBpbnRvIHRoZSBzeW50aCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIHBsYXRmb3JtIFVSTCBpdFxuICogZGVwbG95cyBhZ2FpbnN0IChgcHJvcHMucmVnaXN0cnlgKTsgdGhpcyBndWFyZCBjYXRjaGVzIHRoZSBjYXNlIHdoZXJlIG5laXRoZXJcbiAqIHRoYXQgbm9yIGBJTUFHRV9SRUdJU1RSWV9QVUxMX0hPU1RgL2BQTEFURk9STV9CQVNFX1VSTGAgd2FzIHN1cHBsaWVkLlxuICpcbiAqIEVzY2FwZSBoYXRjaDogYEFMTE9XX0lOQ0xVU1RFUl9QVUxMX0hPU1Q9dHJ1ZWAgKGUuZy4gQ29kZUJ1aWxkIGluIGEgVlBDIHdob3NlXG4gKiBwcml2YXRlIEROUyBnZW51aW5lbHkgcmVzb2x2ZXMgdGhlIGluLWNsdXN0ZXIgbmFtZSkuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVFeHRlcm5hbFB1bGxUYXJnZXQoXG4gIHJlZ2lzdHJ5OiB7IGhvc3Q/OiBzdHJpbmc7IHBvcnQ/OiBudW1iZXI7IHB1bGxIb3N0Pzogc3RyaW5nOyBwdWxsUG9ydD86IG51bWJlciB9LFxuKTogeyBob3N0OiBzdHJpbmc7IHBvcnRQYXJ0OiBzdHJpbmcgfSB7XG4gIGNvbnN0IGhvc3QgPSByZWdpc3RyeS5wdWxsSG9zdCB8fCByZWdpc3RyeS5ob3N0IHx8ICcnO1xuICBjb25zdCBwb3J0ID0gcmVnaXN0cnkucHVsbFBvcnQgPz8gcmVnaXN0cnkucG9ydDtcbiAgaWYgKHByb2Nlc3MuZW52LkFMTE9XX0lOQ0xVU1RFUl9QVUxMX0hPU1QgIT09ICd0cnVlJyAmJiBpc1VucmVhY2hhYmxlUHVsbEhvc3QoaG9zdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgUmVnaXN0cnkgcHVsbCBob3N0IHJlc29sdmVkIHRvICcke2hvc3R9Jywgd2hpY2ggQVdTIENvZGVCdWlsZCBjYW5ub3QgcmVhY2gg4oCUIGl0IGlzIHRoZSBgICtcbiAgICAgICdpbi1jbHVzdGVyL2xvY2FsIGRlZmF1bHQuIFRoZSBzeW50aGVzaXplZCBwaXBlbGluZSB3b3VsZCBmYWlsIGF0IGJ1aWxkIHRpbWUgd2l0aCAnICtcbiAgICAgICdCVUlMRF9DT05UQUlORVJfVU5BQkxFX1RPX1BVTExfSU1BR0UuIFNldCB0aGUgcGxhdGZvcm1cXCdzIHB1YmxpYyBob3N0IHZpYSAnICtcbiAgICAgICdJTUFHRV9SRUdJU1RSWV9QVUxMX0hPU1Qgb3IgUExBVEZPUk1fQkFTRV9VUkwgYmVmb3JlIGRlcGxveWluZyDigJQgcGlwZWxpbmUtbWFuYWdlciBiYWtlcyAnICtcbiAgICAgICd0aGlzIGluIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgcGxhdGZvcm0gVVJMIGl0IGRlcGxveXMgYWdhaW5zdC4gJyArXG4gICAgICAnU2V0IEFMTE9XX0lOQ0xVU1RFUl9QVUxMX0hPU1Q9dHJ1ZSB0byBieXBhc3MgKGluLVZQQyBwcml2YXRlIEROUykuJyxcbiAgICApO1xuICB9XG4gIGNvbnN0IHBvcnRQYXJ0ID0gcG9ydCAmJiBwb3J0ICE9PSA4MCAmJiBwb3J0ICE9PSA0NDMgPyBgOiR7cG9ydH1gIDogJyc7XG4gIHJldHVybiB7IGhvc3QsIHBvcnRQYXJ0IH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgQ29kZUJ1aWxkIGltYWdlIHRvIHVzZSBmb3IgYSBwbHVnaW4uXG4gKlxuICogU3RyYXRlZ3k6XG4gKiAgIDEuIElmIHRoZSBwbHVnaW4gc2V0cyBgYXdzOmNkazpjb2RlYnVpbGQ6YnVpbGRlbnZpcm9ubWVudDpidWlsZEltYWdlYFxuICogICAgICBleHBsaWNpdGx5IGluIG1ldGFkYXRhLCB0aGUgbWV0YWRhdGEtYnVpbGRlciBwYXNzdGhyb3VnaCBoYW5kbGVzIGl0XG4gKiAgICAgICh2aWEgYG1ldGFkYXRhRm9yQnVpbGRFbnZpcm9ubWVudGApLiBUaGlzIGZ1bmN0aW9uIHJldHVybnNcbiAqICAgICAgYHVuZGVmaW5lZGAgYW5kIHRoZSBtZXRhZGF0YSB3aW5zLlxuICogICAyLiBPdGhlcndpc2UsIGlmIHRoZSBwbHVnaW4gaGFzIGEgYG5hbWVgK2B2ZXJzaW9uYCBBTkQgdGhlIHJlZ2lzdHJ5XG4gKiAgICAgIGNvbmZpZyBpcyBwb3B1bGF0ZWQsIGJ1aWxkIGEgYExpbnV4QnVpbGRJbWFnZS5mcm9tRG9ja2VyUmVnaXN0cnkoKWBcbiAqICAgICAgaW1hZ2UgcG9pbnRpbmcgYXQgYDxyZWdpc3RyeS1ob3N0Pjo8cG9ydD4vPG5zPi88bmFtZT5APGltYWdlRGlnZXN0PmBcbiAqICAgICAgd2hlcmUgYDxucz5gIGlzIGBzeXN0ZW1gIG9yIGBvcmctPG9yZ0lkPmAuIFBpbm5lZCBCWSBESUdFU1Qg4oCUIHRoZSBvbmVcbiAqICAgICAgdGhlIHBsdWdpbiBzZXJ2aWNlIHZlcmlmaWVkIGFnYWluc3QgaXRzIHNpZ25pbmcga2V5IGJlZm9yZSByZXR1cm5pbmdcbiAqICAgICAgdGhpcyByZWNvcmQg4oCUIG5ldmVyIGJ5IHRoZSBtdXRhYmxlIGA6PHZlcnNpb24+YCB0YWcsIHdoaWNoIGFueW9uZVxuICogICAgICBob2xkaW5nIHRoZSBvcmcncyByZWdpc3RyeSBwdXNoIGNyZWRlbnRpYWwgY291bGQgcmUtcG9pbnQuIEEgcGx1Z2luXG4gKiAgICAgIHRoYXQgbmVlZHMgYW4gaW1hZ2UgYnV0IGNhcnJpZXMgbm8gZGlnZXN0IGlzIHJlZnVzZWQgKHRocm93cyk6IHJ1bm5pbmdcbiAqICAgICAgYW4gdW52ZXJpZmllZCBpbWFnZSBpcyB3b3JzZSB0aGFuIGEgZmFpbGVkIHN5bnRoLiBDb2RlQnVpbGQgYXV0aGVudGljYXRlcyBieVxuICogICAgICBzZW5kaW5nIHRoZSBwZXItb3JnIHBsYXRmb3JtIFNlY3JldCBhcyBCYXNpYyBhdXRoIHRvXG4gKiAgICAgIGBwaXBlbGluZS1pbWFnZS1yZWdpc3RyeWAncyBgL3Rva2VuYCBlbmRwb2ludDsgdGhlIEpXVCBpbiBgcGFzc3dvcmRgXG4gKiAgICAgIHJlc29sdmVzIHRvIGEgcmVnaXN0cnkgdG9rZW4gc2NvcGVkIHRvIHRoZSBvcmcuXG4gKiAgIDMuIElmIGBtZXRhZGF0YV9vbmx5YCwgcmV0dXJuIGB1bmRlZmluZWRgIHNvIENvZGVCdWlsZCB1c2VzIGl0cyBkZWZhdWx0XG4gKiAgICAgIChgc3RhbmRhcmQ6Ny4wYCkuXG4gKlxuICogYHNjb3BlYCBhbmQgYG9yZ0lkYCBhcmUgcmVxdWlyZWQ6IHRoZSBwZXItb3JnIHBsYXRmb3JtIFNlY3JldCBpcyBuYW1lZFxuICogYHBpcGVsaW5lLWJ1aWxkZXIvPG9yZ0lkPi9wbGF0Zm9ybWAsIGFuZCBgU2VjcmV0LmZyb21TZWNyZXROYW1lVjIoKWBcbiAqIG5lZWRzIGEgQ29uc3RydWN0IHRvIGFuY2hvciB0aGUgaW1wb3J0ZWQgc2VjcmV0IHRvLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVBsdWdpbkltYWdlKHNjb3BlOiBDb25zdHJ1Y3QgfCB1bmRlZmluZWQsIHBsdWdpbjogUGx1Z2luLCBvcmdJZD86IHN0cmluZyk6IElCdWlsZEltYWdlIHwgdW5kZWZpbmVkIHtcbiAgLy8gYG1ldGFkYXRhX29ubHlgIHBsdWdpbnMgbGVnaXRpbWF0ZWx5IGhhdmUgbm8gaW1hZ2Ug4oCUIHRoZWlyIHdvcmsgcnVuc1xuICAvLyBpbiB0aGUgZGVmYXVsdCBDb2RlQnVpbGQgaW1hZ2UuIFF1aWV0IHNraXAuXG4gIGlmIChwbHVnaW4uYnVpbGRUeXBlID09PSAnbWV0YWRhdGFfb25seScpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gYnVpbGRfaW1hZ2UgLyBwcmVidWlsdCBwbHVnaW5zIG11c3QgaGF2ZSBuYW1lICsgdmVyc2lvbiAoREIgY29uc3RyYWludFxuICAvLyBtYWtlcyBib3RoIE5PVCBOVUxMKS4gRGVmZW5zaXZlIGNoZWNrIGluIGNhc2UgYSBtYWxmb3JtZWQgcm93IHNsaXBzIGluLlxuICBpZiAoIXBsdWdpbi5uYW1lIHx8ICFwbHVnaW4udmVyc2lvbikge1xuICAgIGxvZy53YXJuKFxuICAgICAgYFBsdWdpbiBcIiR7cGx1Z2luLm5hbWV9XCIgaGFzIGJ1aWxkVHlwZT0ke3BsdWdpbi5idWlsZFR5cGV9IGJ1dCBtaXNzaW5nIG5hbWUvdmVyc2lvbiDigJQgYCArXG4gICAgICAnQ29kZUJ1aWxkIHdpbGwgcnVuIG9uIGF3cy9jb2RlYnVpbGQvc3RhbmRhcmQ6OC4wIGFuZCB3b25cXCd0IGhhdmUgdGhlIHBsdWdpblxcJ3MgYmFrZWQgdG9vbHMuJyxcbiAgICApO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyBObyBkaWdlc3Qg4oeSIHRoZSBwbHVnaW4gc2VydmljZSBuZXZlciBzaWduZWQgYW4gaW1hZ2UgZm9yIHRoaXMgcm93IChvciB0aGVcbiAgLy8gcmVjb3JkIGRpZG4ndCBjb21lIGZyb20gYC9wbHVnaW5zL2xvb2t1cGApLiBGYWlsIHRoZSBzeW50aCByYXRoZXIgdGhhbiBmYWxsXG4gIC8vIGJhY2sgdG8gdGhlIHRhZy5cbiAgaWYgKCFwbHVnaW4uaW1hZ2VEaWdlc3QgfHwgIS9ec2hhMjU2OlswLTlhLWZdezY0fSQvLnRlc3QocGx1Z2luLmltYWdlRGlnZXN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBQbHVnaW4gXCIke3BsdWdpbi5uYW1lfToke3BsdWdpbi52ZXJzaW9ufVwiIGhhcyBidWlsZFR5cGU9JHtwbHVnaW4uYnVpbGRUeXBlfSBidXQgbm8gc2lnbmVkIGltYWdlIGRpZ2VzdC4gYCArXG4gICAgICAnUmVidWlsZCB0aGUgcGx1Z2luIChyZS11cGxvYWQgaXQpIHNvIHRoZSBwbGF0Zm9ybSBjYW4gYnVpbGQsIHNpZ24gYW5kIHJlY29yZCBpdHMgaW1hZ2UuJyxcbiAgICApO1xuICB9XG5cbiAgLy8gVGhlIHJlcG9zaXRvcnkgY29tZXMgZnJvbSBsb29rdXA6IGBwdWJsaWMvPHB1Ymxpc2hlcj4vPG5hbWU+YCBmb3IgYVxuICAvLyBsaXN0ZWQgcGx1Z2luICh0aGUgcmVhZC1vbmx5IGNvcHkgZXZlcnkgb3JnIG1heSBwdWxsKSwgYG9yZy08aWQ+LzxuYW1lPmBcbiAgLy8gZm9yIHRoZSBvcmcncyBvd24uIE5ldmVyIGRlcml2ZWQgaGVyZSBmcm9tIHRoZSByZWNvcmQncyBvd25lciDigJQgYSBsaXN0aW5nJ3NcbiAgLy8gaW1hZ2UgZG9lc24ndCBsaXZlIGluIGl0cyBwdWJsaXNoZXIncyBuYW1lc3BhY2UuXG4gIGNvbnN0IHJlcG9zaXRvcnkgPSAocGx1Z2luIGFzIFBsdWdpbiAmIHsgaW1hZ2VSZXBvc2l0b3J5Pzogc3RyaW5nIHwgbnVsbCB9KS5pbWFnZVJlcG9zaXRvcnk7XG4gIGlmICghcmVwb3NpdG9yeSB8fCAhUExVR0lOX0lNQUdFX1JFUE9TSVRPUllfUkUudGVzdChyZXBvc2l0b3J5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBQbHVnaW4gXCIke3BsdWdpbi5uYW1lfToke3BsdWdpbi52ZXJzaW9ufVwiIGhhcyBubyBpbWFnZSByZXBvc2l0b3J5IGZyb20gdGhlIHBsdWdpbiBsb29rdXAuIGAgK1xuICAgICAgJ1Jlc29sdmUgcGx1Z2lucyB0aHJvdWdoIHRoZSBwbGF0Zm9ybSAoYHBpcGVsaW5lLW1hbmFnZXIgcGlwZWxpbmUgc3ludGhgIC8gdGhlIGxvb2t1cCBjdXN0b20gcmVzb3VyY2UpLicsXG4gICAgKTtcbiAgfVxuXG4gIGxldCByZWdpc3RyeTtcbiAgdHJ5IHtcbiAgICByZWdpc3RyeSA9IENvbmZpZy5nZXQoJ3JlZ2lzdHJ5Jyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIENvbmZpZyBuYW1lc3BhY2Ugbm90IGxvYWRlZCAoZS5nLiwgdW5pdCB0ZXN0cyB3aXRob3V0IGZ1bGwgY29uZmlnKS5cbiAgICBsb2cud2FybihcbiAgICAgIGBQbHVnaW4gXCIke3BsdWdpbi5uYW1lfToke3BsdWdpbi52ZXJzaW9ufVwiIG5lZWRzIHRoZSByZWdpc3RyeSBjb25maWcgYnV0IGl0J3Mgbm90IGxvYWRlZCDigJQgYCArXG4gICAgICAnQ29kZUJ1aWxkIHdpbGwgZmFsbCBiYWNrIHRvIGF3cy9jb2RlYnVpbGQvc3RhbmRhcmQ6OC4wLiAnICtcbiAgICAgICdTZXQgSU1BR0VfUkVHSVNUUllfSE9TVCArIElNQUdFX1JFR0lTVFJZX1BPUlQgaW4gcGlwZWxpbmUtbWFuYWdlclxcJ3MgZW52aXJvbm1lbnQuJyxcbiAgICApO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAoIXJlZ2lzdHJ5Py5ob3N0KSB7XG4gICAgbG9nLndhcm4oXG4gICAgICBgUGx1Z2luIFwiJHtwbHVnaW4ubmFtZX06JHtwbHVnaW4udmVyc2lvbn1cIiBuZWVkcyBJTUFHRV9SRUdJU1RSWV9IT1NUIGJ1dCBpdCdzIGVtcHR5IOKAlCBgICtcbiAgICAgICdDb2RlQnVpbGQgd2lsbCBmYWxsIGJhY2sgdG8gYXdzL2NvZGVidWlsZC9zdGFuZGFyZDo4LjAuICcgK1xuICAgICAgJ1NldCBJTUFHRV9SRUdJU1RSWV9IT1NUIGluIHBpcGVsaW5lLW1hbmFnZXJcXCdzIGVudmlyb25tZW50IHRvIHVzZSB0aGUgcGx1Z2luIGltYWdlLicsXG4gICAgKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGlmICghc2NvcGUpIHtcbiAgICBsb2cud2FybihgUGx1Z2luIFwiJHtwbHVnaW4ubmFtZX1cIiBpbWFnZSByZXNvbHV0aW9uIHNraXBwZWQ6IG5vIGNvbnN0cnVjdCBzY29wZSBwcm92aWRlZGApO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyBQZXItb3JnIGF1dGggcmVxdWlyZXMgb3JnSWQg4oCUIHRoZSBTZWNyZXQgaXMgbmFtZWQgcGVyIG9yZy5cbiAgaWYgKCFvcmdJZCkge1xuICAgIGxvZy53YXJuKFxuICAgICAgYFBsdWdpbiBcIiR7cGx1Z2luLm5hbWV9XCIgaW1hZ2UgcmVzb2x1dGlvbiBza2lwcGVkOiBvcmdJZCBpcyByZXF1aXJlZCB0byBgICtcbiAgICAgICdyZXNvbHZlIHRoZSBwZXItb3JnIHBsYXRmb3JtIFNlY3JldCB1c2VkIGZvciBDb2RlQnVpbGQgQmFzaWMgYXV0aC4nLFxuICAgICk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIENvbXBvc2UgdGhlIGltYWdlIFVSSSBmcm9tIHRoZSBsb29rdXAncyByZXBvc2l0b3J5LCBwaW5uZWQgYnkgZGlnZXN0LlxuICAvLyBUaGUgdG9rZW4gc2VydmljZSBncmFudHMgcHVsbCBvbiBgcHVibGljLypgIHRvIGV2ZXJ5IGF1dGhlbnRpY2F0ZWRcbiAgLy8gaWRlbnRpdHkgYW5kIG9uIGBvcmctPGlkPi8qYCB0byB0aGF0IG9yZyAoYW5kIGl0cyB0ZWFtcykuXG4gIC8vIFVzZSB0aGUgZXh0ZXJuYWwgcHVsbCBob3N0L3BvcnQ6IHRoaXMgaW1hZ2UgVVJJIGlzIGNvbnN1bWVkIGJ5IEFXU1xuICAvLyBDb2RlQnVpbGQgKG91dC1vZi1jbHVzdGVyKSwgd2hpY2ggY2FuJ3QgcmVzb2x2ZSB0aGUgaW4tY2x1c3RlclxuICAvLyBgcmVnaXN0cnk6NTAwMGAgQ2x1c3RlcklQLiBGYWxsIGJhY2sgdG8gYGhvc3RgL2Bwb3J0YCBmb3Igc2luZ2xlLWhvc3QgL1xuICAvLyBpbi1jbHVzdGVyLW9ubHkgZGVwbG95cyB3aGVyZSBubyBzZXBhcmF0ZSBwdWxsIGhvc3QgaXMgY29uZmlndXJlZC5cbiAgY29uc3QgeyBob3N0OiBwdWxsSG9zdCwgcG9ydFBhcnQgfSA9IHJlc29sdmVFeHRlcm5hbFB1bGxUYXJnZXQocmVnaXN0cnkpO1xuICBjb25zdCBpbWFnZVVyaSA9IGAke3B1bGxIb3N0fSR7cG9ydFBhcnR9LyR7cmVwb3NpdG9yeX1AJHtwbHVnaW4uaW1hZ2VEaWdlc3R9YDtcblxuICAvLyBDb2RlQnVpbGQgcmVhZHMgYHBpcGVsaW5lLWJ1aWxkZXIvPG9yZ0lkPi9yZWdpc3RyeS1wdXNoYCBhbmQgc2VuZHMgaXRzXG4gIC8vIGB1c2VybmFtZWAvYHBhc3N3b3JkYCBmaWVsZHMgYXMgSFRUUCBCYXNpYyB0byB0aGUgcmVnaXN0cnkuIFRoZSByZWdpc3RyeVxuICAvLyBjaGFsbGVuZ2VzIHdpdGggYSBCZWFyZXIgcmVhbG0gcG9pbnRpbmcgYXQgcGlwZWxpbmUtaW1hZ2UtcmVnaXN0cnknc1xuICAvLyBgL3Rva2VuYCBlbmRwb2ludDsgdGhlIERvY2tlciBjbGllbnQgZm9yd2FyZHMgdGhvc2UgY3JlZHMsIGltYWdlLXJlZ2lzdHJ5XG4gIC8vIGV4Y2hhbmdlcyB0aGUgb3BhcXVlIGBwYl9zYV/igKZgIGtleSBmb3IgYSBzaG9ydC1saXZlZCB0b2tlbiwgYW5kIGEgcmVnaXN0cnlcbiAgLy8gdG9rZW4gc2NvcGVkIHRvIHRoZSBvcmcgaXMgaXNzdWVkLlxuICAvL1xuICAvLyBUaGlzIGlzIHRoZSBSRUdJU1RSWS1PTkxZIGNyZWRlbnRpYWwsIG5vdCB0aGUgb3JnJ3MgZnVsbC1wcml2aWxlZ2VcbiAgLy8gcGxhdGZvcm0gb25lOiBpdHMgZXhjaGFuZ2VkIHRva2VuIGNhcnJpZXMgdGhlIHNpbmdsZSBgcmVnaXN0cnk6cHVzaGAgc2NvcGVcbiAgLy8gYW5kIG5vIEFQSSBwZXJtaXNzaW9ucyBhdCBhbGwsIHNvIGEgQ29kZUJ1aWxkIGpvYiB0aGF0IGxlYWtzIGl0IGNhbiBtb3ZlXG4gIC8vIGltYWdlcyBpbnNpZGUgdGhpcyBvcmcncyBuYW1lc3BhY2UgYW5kIG5vdGhpbmcgZWxzZS4gVGhlIHBsdWdpbi1sb29rdXBcbiAgLy8gTGFtYmRhIGtlZXBzIHJlYWRpbmcgYC4uLi9wbGF0Zm9ybWAg4oCUIGl0IGNhbGxzIHRoZSBvcmRpbmFyeSBBUEksIHdoaWNoIG5vXG4gIC8vIHNpbmdsZSBzY29wZSBjb3ZlcnMuXG4gIC8vIFByb3Zpc2lvbiBpdCB3aXRoOiBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuIC0tc2NvcGUgcmVnaXN0cnk6cHVzaFxuICBjb25zdCBzdGFjayA9IFN0YWNrLm9mKHNjb3BlKTtcbiAgY29uc3Qgc2VjcmV0TmFtZSA9IENvcmVDb25zdGFudHMuc2VjcmV0UGF0aChvcmdJZCwgUkVHSVNUUllfQ1JFREVOVElBTF9TRUNSRVQpO1xuICAvLyBDREsgY29uc3RydWN0IElEcyBhbGxvdyBvbmx5IFtBLVphLXowLTlfLV07IHNhbml0aXplIHRoZSBzZWNyZXQgbmFtZS5cbiAgY29uc3Qgc2VjcmV0Q29uc3RydWN0SWQgPSBgUmVnaXN0cnlDcmVkc18ke3NlY3JldE5hbWUucmVwbGFjZSgvW15BLVphLXowLTlfLV0vZywgJ18nKX1gO1xuICBjb25zdCBjcmVkZW50aWFsc1NlY3JldCA9IChzdGFjay5ub2RlLnRyeUZpbmRDaGlsZChzZWNyZXRDb25zdHJ1Y3RJZCkgYXMgU2VjcmV0IHwgdW5kZWZpbmVkKVxuICAgID8/IFNlY3JldC5mcm9tU2VjcmV0TmFtZVYyKHN0YWNrLCBzZWNyZXRDb25zdHJ1Y3RJZCwgc2VjcmV0TmFtZSk7XG5cbiAgcmV0dXJuIExpbnV4QnVpbGRJbWFnZS5mcm9tRG9ja2VyUmVnaXN0cnkoaW1hZ2VVcmksIHtcbiAgICBzZWNyZXRzTWFuYWdlckNyZWRlbnRpYWxzOiBjcmVkZW50aWFsc1NlY3JldCxcbiAgfSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgZmFsbGJhY2sgQ29kZUJ1aWxkIGltYWdlIGZvciBzdGVwcyB3aXRob3V0IGEgcGx1Z2luLWJha2VkIG9uZS5cbiAqXG4gKiBSZWFkcyBgYXdzLmNvZGVCdWlsZC5kZWZhdWx0SW1hZ2VgIChlbnY6IGBDT0RFQlVJTERfREVGQVVMVF9JTUFHRWApLlxuICogRGVmYXVsdDogYHBpcGVsaW5lLWJvb3RzdHJhcDoxLjBgIOKAlCB0aGUgbG9jYWwgdGFnIGJ1aWx0IGJ5XG4gKiBgZGVwbG95L2NvZGVidWlsZC9ib290c3RyYXAvRG9ja2VyZmlsZWAuIFBpbm5lZCBieVxuICogYGF3cy5jb2RlQnVpbGQuZGVmYXVsdEltYWdlRGlnZXN0YCAoZW52OiBgQ09ERUJVSUxEX0RFRkFVTFRfSU1BR0VfRElHRVNUYClcbiAqIHdoZW4gc2V0LCB0aGUgc2FtZSB3YXkgcGx1Z2luIGltYWdlcyBhcmUgcGlubmVkIGJ5IHRoZWlyIHNpZ25lZCBkaWdlc3QuXG4gKlxuICogLSBBV1MgY3VyYXRlZCBpbWFnZSAoYGF3cy9jb2RlYnVpbGQvKmApOiB1c2UgdGhlIG1hdGNoaW5nIGBMaW51eEJ1aWxkSW1hZ2VgXG4gKiAgIGNvbnN0YW50IHNvIENESyBlbWl0cyBgaW1hZ2VQdWxsQ3JlZGVudGlhbHNUeXBlOiBDT0RFQlVJTERgLiBVc2luZ1xuICogICBgZnJvbURvY2tlclJlZ2lzdHJ5KClgIGhlcmUgd291bGQgc2V0IFNFUlZJQ0VfUk9MRSBjcmVkZW50aWFscywgd2hpY2hcbiAqICAgQ0ZOIHJlamVjdHMgd2l0aCBcImNhbm5vdCB1c2UgYSBDb2RlQnVpbGQgY3VyYXRlZCBpbWFnZSB3aXRoXG4gKiAgIGltYWdlUHVsbENyZWRlbnRpYWxzVHlwZSBTRVJWSUNFX1JPTEVcIi5cbiAqIC0gQmFyZSB0YWcgKG5vIGAvYCk6IGF1dG8tcHJlZml4ZWQgdG9cbiAqICAgYDxyZWdpc3RyeS1ob3N0Pjo8cG9ydD4vbGlicmFyeS88dGFnPmAgdXNpbmcgdGhlIHJlZ2lzdHJ5IGNvbmZpZyxcbiAqICAgd2l0aCB0aGUgcGVyLW9yZyBwbGF0Zm9ybSBTZWNyZXQgYXMgQmFzaWMgYXV0aCDigJQgc2FtZSBwYXRoXG4gKiAgIGByZXNvbHZlUGx1Z2luSW1hZ2UoKWAgdXNlcyBmb3IgcGx1Z2luIGltYWdlcy4gTmVlZHMgYHNjb3BlYCArIGBvcmdJZGAuXG4gKiAtIEZ1bGx5LXF1YWxpZmllZCByZWdpc3RyeSBVUkkgKGNvbnRhaW5zIGAvYCk6IHVzZWQgYXMtaXMsIG5vIGF1dGggd2lyZWQuXG4gKiAtIE1pc3NpbmcgcmVnaXN0cnkgY29uZmlnIG9yIHNjb3BlL29yZ0lkIOKGkiBmYWxscyBiYWNrIHRvXG4gKiAgIGBhd3MvY29kZWJ1aWxkL3N0YW5kYXJkOjguMGAgKGFzIGEgQ1VSQVRFRCBpbWFnZSwgc2VlIGFib3ZlKSwgd2l0aCBhXG4gKiAgIHdhcm5pbmcgc28gc3ludGggZGVncmFkZXMgZ3JhY2VmdWxseSBvbiBwYXJ0aWFsbHkgY29uZmlndXJlZCBlbnZzLlxuICovXG5jb25zdCBTVEFOREFSRF84XzAgPSAnYXdzL2NvZGVidWlsZC9zdGFuZGFyZDo4LjAnO1xuXG4vKipcbiAqIGF3cy1jZGstbGliIDIuMjU4IGhhcyBubyBgTGludXhCdWlsZEltYWdlLlNUQU5EQVJEXzhfMGAgc3RhdGljIHlldCwgc28gdGhlXG4gKiBjdXJhdGVkIDguMCBmYWxsYmFjayByZXNvbHZlcyB2aWEgYGZyb21Db2RlQnVpbGRJbWFnZUlkYCAoc3RpbGwgQ09ERUJVSUxEIGNyZWRzKS5cbiAqL1xuY29uc3QgZmFsbGJhY2tCdWlsZEltYWdlID0gKCk6IElCdWlsZEltYWdlID0+IExpbnV4QnVpbGRJbWFnZS5mcm9tQ29kZUJ1aWxkSW1hZ2VJZChTVEFOREFSRF84XzApO1xuXG4vKipcbiAqIE1hcCBBV1MgY3VyYXRlZCBgYXdzL2NvZGVidWlsZC8qYCBpbWFnZSBzdHJpbmdzIHRvIHRoZSBtYXRjaGluZ1xuICogYExpbnV4QnVpbGRJbWFnZWAgc3RhdGljLiBFeHRlbmQgd2hlbiBuZXdlciBzdGFuZGFyZCBpbWFnZXMgc2hpcC5cbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgZm9yIG5vbi1jdXJhdGVkIHN0cmluZ3Mg4oCUIGNhbGxlciBzaG91bGQgdXNlXG4gKiBgZnJvbURvY2tlclJlZ2lzdHJ5KClgIGZvciB0aG9zZS5cbiAqL1xuZnVuY3Rpb24gY3VyYXRlZExpbnV4QnVpbGRJbWFnZShpbWFnZUlkOiBzdHJpbmcpOiBJQnVpbGRJbWFnZSB8IHVuZGVmaW5lZCB7XG4gIGlmICghaW1hZ2VJZC5zdGFydHNXaXRoKCdhd3MvY29kZWJ1aWxkLycpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBzd2l0Y2ggKGltYWdlSWQpIHtcbiAgICBjYXNlICdhd3MvY29kZWJ1aWxkL3N0YW5kYXJkOjYuMCc6IHJldHVybiBMaW51eEJ1aWxkSW1hZ2UuU1RBTkRBUkRfNl8wO1xuICAgIGNhc2UgJ2F3cy9jb2RlYnVpbGQvc3RhbmRhcmQ6NS4wJzogcmV0dXJuIExpbnV4QnVpbGRJbWFnZS5TVEFOREFSRF81XzA7XG4gICAgLy8gTmV3ZXIgY29kZW5hbWVkIGltYWdlcyByb3V0ZSB0aHJvdWdoIGZyb21Db2RlQnVpbGRJbWFnZUlkLCB3aGljaFxuICAgIC8vIENESyBhbHNvIG1hcmtzIGFzIENPREVCVUlMRCBjcmVkZW50aWFscyAoY3VyYXRlZCkuXG4gICAgZGVmYXVsdDogcmV0dXJuIExpbnV4QnVpbGRJbWFnZS5mcm9tQ29kZUJ1aWxkSW1hZ2VJZChpbWFnZUlkKTtcbiAgfVxufVxuXG4vKiogQSByZWdpc3RyeSBtYW5pZmVzdCBkaWdlc3QgYXMgQ29kZUJ1aWxkIGFjY2VwdHMgaXQgaW4gYW4gaW1hZ2UgcmVmZXJlbmNlLiAqL1xuY29uc3QgSU1BR0VfRElHRVNUX1JFID0gL15zaGEyNTY6WzAtOWEtZl17NjR9JC87XG5cbi8qKlxuICogUHVsbCByZWZlcmVuY2UgZm9yIHRoZSBjb25maWd1cmVkIGRlZmF1bHQgaW1hZ2UncyBiYXJlIGA8cmVwbz46PHRhZz5gOlxuICogYDxyZXBvPkA8ZGlnZXN0PmAgd2hlbiB0aGUgYm9vdHN0cmFwIGRpZ2VzdCBpcyBjb25maWd1cmVkLCBlbHNlIHRoZSB0YWdcbiAqIGl0c2VsZiB3aXRoIGEgbG91ZCB3YXJuaW5nLiBBIGRpZ2VzdCB0aGF0IGlzIHNldCBidXQgbWFsZm9ybWVkIGZhaWxzIHRoZVxuICogc3ludGgg4oCUIGl0IGlzIGEgdHlwbywgYW5kIHNpbGVudGx5IGZhbGxpbmcgYmFjayB0byB0aGUgdGFnIHdvdWxkIGhpZGUgaXQuXG4gKi9cbmZ1bmN0aW9uIHBpbm5lZERlZmF1bHRJbWFnZVJlZihjb25maWd1cmVkOiBzdHJpbmcsIGRpZ2VzdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFkaWdlc3QpIHtcbiAgICBsb2cud2FybihcbiAgICAgIGBDT0RFQlVJTERfREVGQVVMVF9JTUFHRT0nJHtjb25maWd1cmVkfScgaXMgcHVsbGVkIGJ5IGl0cyBNVVRBQkxFIHRhZyDigJQgQ09ERUJVSUxEX0RFRkFVTFRfSU1BR0VfRElHRVNUIGlzIG5vdCBzZXQuIGAgK1xuICAgICAgJ0FueW9uZSBob2xkaW5nIGEgcmVnaXN0cnkgcHVzaCBjcmVkZW50aWFsIGZvciBsaWJyYXJ5LyBjb3VsZCByZS1wb2ludCBpdC4gU2V0IENPREVCVUlMRF9ERUZBVUxUX0lNQUdFX0RJR0VTVCAnICtcbiAgICAgICd0byB0aGUgZGlnZXN0IGRlcGxveS9iaW4vYnVpbGQtY29kZWJ1aWxkLWJvb3RzdHJhcC5zaCBwcmludHMgYWZ0ZXIgcHVibGlzaGluZy4nLFxuICAgICk7XG4gICAgcmV0dXJuIGNvbmZpZ3VyZWQ7XG4gIH1cbiAgaWYgKCFJTUFHRV9ESUdFU1RfUkUudGVzdChkaWdlc3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDT0RFQlVJTERfREVGQVVMVF9JTUFHRV9ESUdFU1Q9JyR7ZGlnZXN0fScgaXMgbm90IGEgc2hhMjU2IG1hbmlmZXN0IGRpZ2VzdCAoc2hhMjU2Ojw2NCBoZXg+KS5gKTtcbiAgfVxuICBjb25zdCByZXBvID0gY29uZmlndXJlZC5yZXBsYWNlKC9ALiokLywgJycpLnJlcGxhY2UoLzpbXjovXSskLywgJycpO1xuICByZXR1cm4gYCR7cmVwb31AJHtkaWdlc3R9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEZWZhdWx0QnVpbGRJbWFnZShzY29wZT86IENvbnN0cnVjdCwgb3JnSWQ/OiBzdHJpbmcpOiBJQnVpbGRJbWFnZSB7XG4gIGxldCBjb25maWd1cmVkOiBzdHJpbmc7XG4gIGxldCBkaWdlc3QgPSAnJztcbiAgdHJ5IHtcbiAgICBjb25zdCBjb2RlQnVpbGQgPSBDb25maWcuZ2V0KCdhd3MnKS5jb2RlQnVpbGQ7XG4gICAgY29uZmlndXJlZCA9IGNvZGVCdWlsZC5kZWZhdWx0SW1hZ2U7XG4gICAgZGlnZXN0ID0gY29kZUJ1aWxkLmRlZmF1bHRJbWFnZURpZ2VzdDtcbiAgfSBjYXRjaCB7XG4gICAgY29uZmlndXJlZCA9IFNUQU5EQVJEXzhfMDtcbiAgfVxuXG4gIC8vIEFXUyBjdXJhdGVkIGltYWdlIOKGkiBDT0RFQlVJTEQgY3JlZGVudGlhbHMuIE1VU1QgZ28gdGhyb3VnaCB0aGVcbiAgLy8gTGludXhCdWlsZEltYWdlIGNvbnN0YW50cywgbm90IGZyb21Eb2NrZXJSZWdpc3RyeSgpLlxuICBjb25zdCBjdXJhdGVkID0gY3VyYXRlZExpbnV4QnVpbGRJbWFnZShjb25maWd1cmVkKTtcbiAgaWYgKGN1cmF0ZWQpIHJldHVybiBjdXJhdGVkO1xuXG4gIC8vIEZ1bGx5LXF1YWxpZmllZCBVUkkg4oCUIG9wZXJhdG9yIG93bnMgaXQuIE5vIHJlZ2lzdHJ5L1NlY3JldCB3aXJpbmcuIEFuXG4gIC8vIG9wZXJhdG9yLXN1cHBsaWVkIGRpZ2VzdCBpcyBob25vdXJlZDsgYSB0YWctb25seSBVUkkgaXMgd2FybmVkIGFib3V0LlxuICBpZiAoY29uZmlndXJlZC5pbmNsdWRlcygnLycpKSB7XG4gICAgcmV0dXJuIExpbnV4QnVpbGRJbWFnZS5mcm9tRG9ja2VyUmVnaXN0cnkoXG4gICAgICBjb25maWd1cmVkLmluY2x1ZGVzKCdAc2hhMjU2OicpID8gY29uZmlndXJlZCA6IHBpbm5lZERlZmF1bHRJbWFnZVJlZihjb25maWd1cmVkLCBkaWdlc3QpLFxuICAgICk7XG4gIH1cblxuICAvLyBCYXJlIHRhZyDihpIgYXV0by1wcmVmaXggd2l0aCB0aGUgcGxhdGZvcm0gcmVnaXN0cnksIG1pcnJvcmluZ1xuICAvLyByZXNvbHZlUGx1Z2luSW1hZ2UoKS4gQmFpbCB0byB0aGUgY3VyYXRlZCBzdGFuZGFyZDo4LjAgZmFsbGJhY2tcbiAgLy8gKHdpdGggYSB3YXJuaW5nKSBhdCBlYWNoIG1pc3NpbmcgcHJlcmVxdWlzaXRlIHNvIHN5bnRoIGRlZ3JhZGVzXG4gIC8vIGdyYWNlZnVsbHkgb24gcGFydGlhbGx5IGNvbmZpZ3VyZWQgZW52aXJvbm1lbnRzIGluc3RlYWQgb2YgZmFpbGluZy5cbiAgbGV0IHJlZ2lzdHJ5O1xuICB0cnkge1xuICAgIHJlZ2lzdHJ5ID0gQ29uZmlnLmdldCgncmVnaXN0cnknKTtcbiAgfSBjYXRjaCB7XG4gICAgbG9nLndhcm4oXG4gICAgICBgQ09ERUJVSUxEX0RFRkFVTFRfSU1BR0U9JyR7Y29uZmlndXJlZH0nIGlzIGEgYmFyZSB0YWcgYnV0IHJlZ2lzdHJ5IGNvbmZpZyBub3QgbG9hZGVkIOKAlCBgICtcbiAgICAgIGBmYWxsaW5nIGJhY2sgdG8gJHtTVEFOREFSRF84XzB9LiBTZXQgSU1BR0VfUkVHSVNUUllfSE9TVCArIElNQUdFX1JFR0lTVFJZX1BPUlQuYCxcbiAgICApO1xuICAgIHJldHVybiBmYWxsYmFja0J1aWxkSW1hZ2UoKTtcbiAgfVxuICBpZiAoIXJlZ2lzdHJ5Py5ob3N0KSB7XG4gICAgbG9nLndhcm4oXG4gICAgICBgQ09ERUJVSUxEX0RFRkFVTFRfSU1BR0U9JyR7Y29uZmlndXJlZH0nIGlzIGEgYmFyZSB0YWcgYnV0IElNQUdFX1JFR0lTVFJZX0hPU1QgaXMgZW1wdHkg4oCUIGAgK1xuICAgICAgYGZhbGxpbmcgYmFjayB0byAke1NUQU5EQVJEXzhfMH0uYCxcbiAgICApO1xuICAgIHJldHVybiBmYWxsYmFja0J1aWxkSW1hZ2UoKTtcbiAgfVxuICBpZiAoIXNjb3BlIHx8ICFvcmdJZCkge1xuICAgIGxvZy53YXJuKFxuICAgICAgYENPREVCVUlMRF9ERUZBVUxUX0lNQUdFPScke2NvbmZpZ3VyZWR9JyBuZWVkcyBzY29wZStvcmdJZCBmb3IgU2VjcmV0IGF1dGgg4oCUIGAgK1xuICAgICAgYGZhbGxpbmcgYmFjayB0byAke1NUQU5EQVJEXzhfMH0uIChDYWxsZXIgZGlkIG5vdCBzdXBwbHkgdGhlbS4pYCxcbiAgICApO1xuICAgIHJldHVybiBmYWxsYmFja0J1aWxkSW1hZ2UoKTtcbiAgfVxuXG4gIC8vIFVzZSB0aGUgZXh0ZXJuYWwgcHVsbCBob3N0L3BvcnQgKG5vdCB0aGUgaW4tY2x1c3RlciBob3N0KSDigJQgdGhpcyBVUkkgaXNcbiAgLy8gY29uc3VtZWQgYnkgQVdTIENvZGVCdWlsZCwgd2hpY2ggY2FuJ3QgcmVzb2x2ZSB0aGUgYHJlZ2lzdHJ5OjUwMDBgIENsdXN0ZXJJUC5cbiAgY29uc3QgeyBob3N0OiBwdWxsSG9zdCwgcG9ydFBhcnQgfSA9IHJlc29sdmVFeHRlcm5hbFB1bGxUYXJnZXQocmVnaXN0cnkpO1xuICBjb25zdCBpbWFnZVVyaSA9IGAke3B1bGxIb3N0fSR7cG9ydFBhcnR9L2xpYnJhcnkvJHtwaW5uZWREZWZhdWx0SW1hZ2VSZWYoY29uZmlndXJlZCwgZGlnZXN0KX1gO1xuXG4gIC8vIFNhbWUgU2VjcmV0IGFzIHJlc29sdmVQbHVnaW5JbWFnZSDigJQgdGhlIHBlci1vcmcgUkVHSVNUUlkgY3JlZGVudGlhbCwgd2hpY2hcbiAgLy8gQ29kZUJ1aWxkIHNlbmRzIGFzIEJhc2ljIGF1dGggYW5kIGltYWdlLXJlZ2lzdHJ5IGV4Y2hhbmdlcyBmb3IgYSBzY29wZWQgdG9rZW4uXG4gIGNvbnN0IHN0YWNrID0gU3RhY2sub2Yoc2NvcGUpO1xuICBjb25zdCBzZWNyZXROYW1lID0gQ29yZUNvbnN0YW50cy5zZWNyZXRQYXRoKG9yZ0lkLCBSRUdJU1RSWV9DUkVERU5USUFMX1NFQ1JFVCk7XG4gIGNvbnN0IHNlY3JldENvbnN0cnVjdElkID0gYFJlZ2lzdHJ5Q3JlZHNfJHtzZWNyZXROYW1lLnJlcGxhY2UoL1teQS1aYS16MC05Xy1dL2csICdfJyl9YDtcbiAgY29uc3QgY3JlZGVudGlhbHNTZWNyZXQgPSAoc3RhY2subm9kZS50cnlGaW5kQ2hpbGQoc2VjcmV0Q29uc3RydWN0SWQpIGFzIFNlY3JldCB8IHVuZGVmaW5lZClcbiAgICA/PyBTZWNyZXQuZnJvbVNlY3JldE5hbWVWMihzdGFjaywgc2VjcmV0Q29uc3RydWN0SWQsIHNlY3JldE5hbWUpO1xuXG4gIHJldHVybiBMaW51eEJ1aWxkSW1hZ2UuZnJvbURvY2tlclJlZ2lzdHJ5KGltYWdlVXJpLCB7XG4gICAgc2VjcmV0c01hbmFnZXJDcmVkZW50aWFsczogY3JlZGVudGlhbHNTZWNyZXQsXG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIENvZGVCdWlsZCBzdGVwIG9yIFNoZWxsIHN0ZXAgYmFzZWQgb24gcGx1Z2luIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogTWV0YWRhdGEgbWVyZ2Ugb3JkZXIgKGxhc3Qgd2lucyk6XG4gKiAgIDEuIFBsdWdpbiBtZXRhZGF0YSAoZnJvbSBwbHVnaW4ubWV0YWRhdGEgaW4gZGF0YWJhc2UpIOKAlCB0aGUgcGx1Z2luXG4gKiAgICAgIGF1dGhvcidzIGJha2VkLWluIGRlZmF1bHRzXG4gKiAgIDIuIFN0ZXAtbGV2ZWwgbWV0YWRhdGEgKGZyb20gb3B0aW9ucy5tZXRhZGF0YSkg4oCUIHRoZSBwaXBlbGluZSBhdXRob3Inc1xuICogICAgICBwZXItc3RlcCBvdmVycmlkZXMsIHdoaWNoIGFyZSBtb3JlIHNwZWNpZmljIGFuZCBtdXN0IHdpblxuICpcbiAqIEVudmlyb25tZW50IG1lcmdlIG9yZGVyIChsYXN0IHdpbnMpOlxuICogICAxLiBQbHVnaW4gZW52IHZhcnMgKGZyb20gcGx1Z2luLmVudilcbiAqICAgMi4gQ3VzdG9tIGVudiB2YXJzIChmcm9tIG9wdGlvbnMuZW52KVxuICogICAzLiBXT1JLRElSIGZyb20gbWVyZ2VkIG1ldGFkYXRhXG4gKlxuICogQ0RLIHByb3Agc3ByZWFkIG9yZGVyIChsYXN0IHdpbnMpOlxuICogICBwcm9ncmFtbWF0aWMgZGVmYXVsdHMgKGlucHV0LCBjb21tYW5kcywgZW52LCBuZXR3b3JrKSDihpIgbWV0YWRhdGEgb3ZlcnJpZGVzXG4gKlxuICogVGhpcyBtZWFucyBtZXRhZGF0YSBrZXlzIGxpa2UgYGF3czpjZGs6cGlwZWxpbmVzOmNvZGVidWlsZHN0ZXA6Y29tbWFuZHNgXG4gKiB3aWxsIG92ZXJyaWRlIHRoZSBwbHVnaW4tZGVyaXZlZCBjb21tYW5kcyB3aGVuIGV4cGxpY2l0bHkgc2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29kZUJ1aWxkU3RlcChvcHRpb25zOiBDb2RlQnVpbGRTdGVwT3B0aW9ucyk6IFNoZWxsU3RlcCB8IENvZGVCdWlsZFN0ZXAgfCBNYW51YWxBcHByb3ZhbFN0ZXAge1xuICBjb25zdCB7XG4gICAgaWQsIGlucHV0LCBtZXRhZGF0YSwgbmV0d29yaywgc2NvcGUsXG4gICAgcHJlSW5zdGFsbENvbW1hbmRzLCBwb3N0SW5zdGFsbENvbW1hbmRzLCBwcmVDb21tYW5kcywgcG9zdENvbW1hbmRzLFxuICAgIGVudjogY3VzdG9tRW52LCBhZGRpdGlvbmFsSW5wdXRzLCB0aW1lb3V0LCBmYWlsdXJlQmVoYXZpb3IsXG4gICAgYXJ0aWZhY3RNYW5hZ2VyLCBzdGFnZU5hbWUsIHN0YWdlQWxpYXMsIHBsdWdpbkFsaWFzLCBvcmdJZCwgcGlwZWxpbmVTY29wZSxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgLy8gUmVzb2x2ZSB7eyAuLi4gfX0gdGVtcGxhdGVzIGluIHBsdWdpbiBzcGVjIGZpZWxkcyBhZ2FpbnN0IHRoZSBwaXBlbGluZSBzY29wZS5cbiAgLy8gRXZlcnkgY2FsbCBnb2VzIHRocm91Z2ggdGhlIHJlc29sdmVyIOKAlCBwbHVnaW5zIHdpdGhvdXQgdGVtcGxhdGUgdG9rZW5zIGFyZVxuICAvLyBhIG5vLW9wIGZhc3QgcGF0aCBpbnNpZGUgcmVzb2x2ZVBsdWdpblRlbXBsYXRlcygpLlxuICBjb25zdCBwbHVnaW4gPSByZXNvbHZlUGx1Z2luVGVtcGxhdGVzKG9wdGlvbnMucGx1Z2luLCBwaXBlbGluZVNjb3BlKTtcblxuICAvLyBQZXItc3RlcCBtZXRhZGF0YSAodGhlIHBpcGVsaW5lIGF1dGhvcidzIG92ZXJyaWRlcywgZS5nLiBKQVZBX1ZFUlNJT049MjUpXG4gIC8vIG11c3Qgd2luIG92ZXIgdGhlIHBsdWdpbidzIGNhdGFsb2cgYG1ldGFkYXRhYCBkZWZhdWx0cywgc28gaXQgZ29lcyBMQVNULlxuICAvLyBSZXZlcnNpbmcgdGhlc2Ugc2lsZW50bHkgZHJvcHBlZCBwZXItc3RlcCBvdmVycmlkZXMgZm9yIGFueSBwbHVnaW4gdGhhdFxuICAvLyBzaGlwcyBub24tZW1wdHkgY2F0YWxvZyBtZXRhZGF0YSAocGx1Z2lucyB0aGF0IGNhcnJ5IGRlZmF1bHRzIHVuZGVyIGBlbnZgXG4gIC8vIGluc3RlYWQg4oCUIGxpa2UgamF2YS1jb3JyZXR0byDigJQgd2VyZSB1bmFmZmVjdGVkLCB3aGljaCBtYXNrZWQgdGhpcykuXG4gIGNvbnN0IG1lcmdlZCA9IG1lcmdlKHBsdWdpbi5tZXRhZGF0YSA/PyB7fSwgbWV0YWRhdGEgPz8ge30pO1xuXG4gIC8vIE1hbnVhbEFwcHJvdmFsU3RlcDogbm8gY29tbWFuZHMsIGVudiwgY29tcHV0ZSwgb3IgbmV0d29yayDigJQganVzdCBpZCArIG9wdGlvbmFsIGNvbW1lbnRcbiAgaWYgKHBsdWdpbi5wbHVnaW5UeXBlID09PSBQbHVnaW5UeXBlLk1BTlVBTF9BUFBST1ZBTF9TVEVQKSB7XG4gICAgcmV0dXJuIG5ldyBNYW51YWxBcHByb3ZhbFN0ZXAoaWQsIHtcbiAgICAgIGNvbW1lbnQ6IHR5cGVvZiBtZXJnZWQuQVBQUk9WQUxfQ09NTUVOVCA9PT0gJ3N0cmluZycgPyBtZXJnZWQuQVBQUk9WQUxfQ09NTUVOVCA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgfVxuXG4gIGxvZy5kZWJ1ZygnW0NyZWF0ZUNvZGVCdWlsZFN0ZXBdIEJ1aWxkaW5nIHN0ZXAgd2l0aCBtZXJnZWQgbWV0YWRhdGEnKTtcblxuICAvLyBXYXJuIGFib3V0IHJlcXVpcmVkIHNlY3JldHMgd2l0aG91dCBvcmdJZCAoY2FuJ3QgcmVzb2x2ZSlcbiAgY29uc3QgcmVxdWlyZWRTZWNyZXRzID0gcGx1Z2luLnNlY3JldHM/LmZpbHRlcihzID0+IHMucmVxdWlyZWQpID8/IFtdO1xuICBpZiAocmVxdWlyZWRTZWNyZXRzLmxlbmd0aCA+IDAgJiYgIW9yZ0lkKSB7XG4gICAgbG9nLndhcm4oXG4gICAgICBgUGx1Z2luIFwiJHtwbHVnaW4ubmFtZX1cIiBkZWNsYXJlcyAke3JlcXVpcmVkU2VjcmV0cy5sZW5ndGh9IHJlcXVpcmVkIHNlY3JldChzKSBidXQgbm8gb3JnSWQgaXMgYXZhaWxhYmxlLiBgICtcbiAgICAgIGBTZWNyZXRzIHdpbGwgbm90IGJlIGluamVjdGVkOiAke3JlcXVpcmVkU2VjcmV0cy5tYXAocyA9PiBzLm5hbWUpLmpvaW4oJywgJyl9YCxcbiAgICApO1xuICB9XG5cbiAgLy8gUmVzb2x2ZSBwbHVnaW4gc2VjcmV0cyBhcyBTRUNSRVRTX01BTkFHRVIgZW52IHZhcnMg4oCUIG9ubHkgUkVRVUlSRUQgb25lcy5cbiAgLy8gQ29kZUJ1aWxkIHRyZWF0cyBhIFNFQ1JFVFNfTUFOQUdFUiBlbnYgdmFyIGFzIE1BTkRBVE9SWTogaXQgZmFpbHMgdGhlIGJ1aWxkXG4gIC8vIGF0IERPV05MT0FEX1NPVVJDRSAoXCJSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOiBjYW4ndCBmaW5kIHRoZSBzcGVjaWZpZWRcbiAgLy8gc2VjcmV0XCIpIGlmIHRoZSBzZWNyZXQgaXMgYWJzZW50LiBBdXRvLXdpcmluZyBhbiBPUFRJT05BTCBzZWNyZXRcbiAgLy8gKGByZXF1aXJlZDogZmFsc2VgLCBlLmcuIE5WRF9BUElfS0VZIC8gU0VNR1JFUF9BUFBfVE9LRU4pIHRoZSBvcGVyYXRvciBoYXNuJ3RcbiAgLy8gY3JlYXRlZCB3b3VsZCB0aGVyZWZvcmUgYnJlYWsgZXZlcnkgYnVpbGQg4oCUIHRoZSBleGFjdCBvcHBvc2l0ZSBvZiBcIm9wdGlvbmFsXCIuXG4gIC8vIE9wdGlvbmFsIHNlY3JldHMgYXJlIGxlZnQgZm9yIHRoZSBwbHVnaW4gdG8gcmVhZCBvbmx5IHdoZXJlIHRoZSBvcGVyYXRvciBoYXNcbiAgLy8gcHJvdmlzaW9uZWQgdGhlbSAob3V0LW9mLWJhbmQgZW52L3NlY3JldCksIG5vdCBmb3JjZS1pbmplY3RlZCBoZXJlLlxuICBjb25zdCBzZWNyZXRFbnZWYXJzID0gKHJlcXVpcmVkU2VjcmV0cy5sZW5ndGggJiYgb3JnSWQpXG4gICAgPyB0b1NlY3JldEVudlZhcnMocmVxdWlyZWRTZWNyZXRzLCBvcmdJZClcbiAgICA6IHt9O1xuXG4gIGNvbnN0IGVudiA9IGJ1aWxkRW52KHBsdWdpbiwgbWVyZ2VkLCBjdXN0b21FbnYpO1xuXG4gIC8vIFNlY3VyaXR5LXJlcG9ydCB1cGxvYWQgKG9wdC1pbik6IGluamVjdCB0aGUgb3JnJ3MgcmVwb3J0aW5nOmluZ2VzdC1zY29wZWRcbiAgLy8ga2V5IOKAlCBuZXZlciB0aGUgZnVsbCBwbGF0Zm9ybSBjcmVkZW50aWFsIOKAlCBhcyBhIFNFQ1JFVFNfTUFOQUdFUiB2YXJpYWJsZS5cbiAgLy8gQ0RLIGdyYW50cyB0aGUgc3RlcCByb2xlIHJlYWQgb24gZXhhY3RseSB0aGF0IHNlY3JldC4gU2VlIGNvcmUvc2VjdXJpdHktcmVwb3J0cy50cy5cbiAgY29uc3QgcmVwb3J0VXBsb2FkID0gZW52W1NFQ1VSSVRZX1JFUE9SVF9VUExPQURfRU5WXSA9PT0gJ3RydWUnO1xuICBpZiAocmVwb3J0VXBsb2FkICYmICFvcmdJZCkge1xuICAgIGxvZy53YXJuKGBTdGVwIFwiJHtpZH1cIiBzZXRzICR7U0VDVVJJVFlfUkVQT1JUX1VQTE9BRF9FTlZ9PXRydWUgYnV0IG5vIG9yZ0lkIGlzIGF2YWlsYWJsZSDigJQgdGhlIHVwbG9hZCBrZXkgY2Fubm90IGJlIGluamVjdGVkIGFuZCB0aGUgdXBsb2FkIHdpbGwgZmFpbC5gKTtcbiAgfVxuICBjb25zdCByZXBvcnRLZXlFbnZWYXI6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHN0cmluZzsgdHlwZTogQnVpbGRFbnZpcm9ubWVudFZhcmlhYmxlVHlwZSB9PiA9IHJlcG9ydFVwbG9hZCAmJiBvcmdJZFxuICAgID8ge1xuICAgICAgW1NFQ1VSSVRZX1JFUE9SVF9LRVlfRU5WXToge1xuICAgICAgICB2YWx1ZTogYCR7Q29yZUNvbnN0YW50cy5zZWNyZXRQYXRoKG9yZ0lkLCBTRUNVUklUWV9SRVBPUlRfU0VDUkVUX0xFQUYpfTpwYXNzd29yZGAsXG4gICAgICAgIHR5cGU6IEJ1aWxkRW52aXJvbm1lbnRWYXJpYWJsZVR5cGUuU0VDUkVUU19NQU5BR0VSLFxuICAgICAgfSxcbiAgICB9XG4gICAgOiB7fTtcblxuICAvLyBDb2RlUGlwZWxpbmUgcmVzb2x2ZWQgdmFyaWFibGVzIOKAlCBtdXN0IGJlIGluIENvZGVCdWlsZFN0ZXAuZW52IChhY3Rpb24tbGV2ZWwpLFxuICAvLyBub3QgYnVpbGRFbnZpcm9ubWVudC5lbnZpcm9ubWVudFZhcmlhYmxlcyAocHJvamVjdC1sZXZlbClcbiAgY29uc3QgYWN0aW9uRW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIFBJUEVMSU5FX0VYRUNVVElPTl9JRDogJyN7Y29kZXBpcGVsaW5lLlBpcGVsaW5lRXhlY3V0aW9uSWR9JyxcbiAgfTtcblxuICBjb25zdCBvdXRwdXREaXIgPSBwbHVnaW4ucHJpbWFyeU91dHB1dERpcmVjdG9yeTtcbiAgY29uc3QgZW5zdXJlT3V0cHV0RGlyID0gKG91dHB1dERpciAmJiAhb3V0cHV0RGlyLmluY2x1ZGVzKCcqJykpXG4gICAgPyBbYG1rZGlyIC1wIFwiJHtvdXRwdXREaXJ9XCIgJiYgdG91Y2ggXCIke291dHB1dERpcn0vLmdpdGtlZXBcImBdXG4gICAgOiBbXTtcblxuICBjb25zdCB7IGluc3RhbGxDb21tYW5kcywgY29tbWFuZHMgfSA9IGJ1aWxkQ29tbWFuZHMocGx1Z2luLCB7XG4gICAgcHJlSW5zdGFsbENvbW1hbmRzOiBbLi4uZW5zdXJlT3V0cHV0RGlyLCAuLi4ocHJlSW5zdGFsbENvbW1hbmRzID8/IFtdKV0sXG4gICAgcG9zdEluc3RhbGxDb21tYW5kcyxcbiAgICBwcmVDb21tYW5kcyxcbiAgICBwb3N0Q29tbWFuZHMsXG4gIH0sIGZhaWx1cmVCZWhhdmlvcik7XG5cbiAgY29uc3QgcHJvZ3JhbW1hdGljID0geyBpbnB1dCwgaW5zdGFsbENvbW1hbmRzLCBjb21tYW5kcyB9O1xuXG4gIC8vIFJlc29sdmUgdGhlIHBsdWdpbidzIHJ1bnRpbWUgaW1hZ2UuIENvZGVCdWlsZCBkZWZhdWx0cyB0b1xuICAvLyBgYXdzL2NvZGVidWlsZC9zdGFuZGFyZDo3LjBgIHdoZW4gbm8gYGJ1aWxkSW1hZ2VgIGlzIHNldCDigJQgdGhhdCdzIHRoZVxuICAvLyBBV1MtbWFuYWdlZCBVYnVudHUgaW1hZ2UgYW5kIERPRVMgTk9UIGhhdmUgYW55IHBsdWdpbi1iYWtlZCB0b29sc1xuICAvLyAocGlwZWxpbmUtbWFuYWdlciwgc255aywgdGVycmFmb3JtLCBldGMuKS4gV2lyaW5nIHRoZSBwbHVnaW4ncyBpbWFnZVxuICAvLyBoZXJlIG1lYW5zIENvZGVCdWlsZCBwdWxscyBmcm9tIG91ciBwcml2YXRlIHJlZ2lzdHJ5IGFuZCB0aGUgdG9vbHNcbiAgLy8gaW5zdGFsbGVkIGluIHRoZSBwbHVnaW4ncyBEb2NrZXJmaWxlIGFyZSBhY3R1YWxseSBhdmFpbGFibGUuXG4gIGNvbnN0IHBsdWdpbkJ1aWxkSW1hZ2UgPSByZXNvbHZlUGx1Z2luSW1hZ2Uoc2NvcGUsIHBsdWdpbiwgb3JnSWQpO1xuXG4gIC8vIFNoZWxsU3RlcCBicmFuY2guXG4gIC8vIFNoZWxsU3RlcCBpdHNlbGYgZG9lc24ndCBhY2NlcHQgYGJ1aWxkRW52aXJvbm1lbnRgL2BidWlsZEltYWdlYC4gQ0RLXG4gIC8vIHBpcGVsaW5lcyB3cmFwcyBTaGVsbFN0ZXBzIGluIGEgZGVmYXVsdCBDb2RlQnVpbGQgYWN0aW9uIHRoYXQgcnVucyBvblxuICAvLyBgYXdzL2NvZGVidWlsZC9zdGFuZGFyZDo3LjBgIOKAlCB3aGljaCB3b24ndCBoYXZlIHRoZSBwbHVnaW4ncyB0b29scy5cbiAgLy9cbiAgLy8gU28gd2hlbiBhIFNIRUxMX1NURVAgcGx1Z2luIERPRVMgaGF2ZSBhbiBpbWFnZSAoYmVjYXVzZSBpdHMgYXV0aG9yXG4gIC8vIGJha2VkIHRvb2xzIGludG8gYSBEb2NrZXJmaWxlKSwgd2UgUFJPTU9URSBpdCB0byBhIENvZGVCdWlsZFN0ZXAgd2l0aFxuICAvLyB0aGUgcmVzb2x2ZWQgaW1hZ2UuIFRoZSBwbHVnaW4gYXV0aG9yJ3MgaW50ZW50IChcInVzZSBteSBiYWtlZCB0b29sc1wiKVxuICAvLyBpcyBwcmVzZXJ2ZWQgd2l0aG91dCBmb3JjaW5nIHRoZW0gdG8gY2hhbmdlIHBsdWdpblR5cGUuXG4gIC8vXG4gIC8vIFdoZW4gdGhlIHBsdWdpbiBoYXMgbm8gaW1hZ2UgKG9yIHJlZ2lzdHJ5IGlzbid0IGNvbmZpZ3VyZWQpLCB3ZSBrZWVwXG4gIC8vIHRoZSBvcmlnaW5hbCBTaGVsbFN0ZXAg4oCUIGl0J3MgbGlnaHRlciB3ZWlnaHQgYW5kIHRoZSBkZWZhdWx0XG4gIC8vIENvZGVCdWlsZCBpbWFnZSBpcyBmaW5lLlxuICBpZiAocGx1Z2luLnBsdWdpblR5cGUgPT09IFBsdWdpblR5cGUuU0hFTExfU1RFUCkge1xuICAgIGlmICghcGx1Z2luQnVpbGRJbWFnZSkge1xuICAgICAgcmV0dXJuIG5ldyBTaGVsbFN0ZXAoaWQsIHtcbiAgICAgICAgLi4ucHJvZ3JhbW1hdGljLFxuICAgICAgICBlbnY6IHsgLi4uZW52LCAuLi5hY3Rpb25FbnYgfSxcbiAgICAgICAgLi4ubWV0YWRhdGFGb3JTaGVsbFN0ZXAobWVyZ2VkKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYFtDcmVhdGVDb2RlQnVpbGRTdGVwXSBTSEVMTF9TVEVQIHBsdWdpbiBcIiR7cGx1Z2luLm5hbWV9XCIgaGFzIGEgcmVnaXN0cnkgaW1hZ2Ug4oCUIHByb21vdGluZyB0byBDb2RlQnVpbGRTdGVwIHNvIHRoZSBwbHVnaW4gaW1hZ2UgaXMgYWN0dWFsbHkgdXNlZGApO1xuICAgIC8vIEZhbGwgdGhyb3VnaCB0byB0aGUgQ29kZUJ1aWxkU3RlcCBwYXRoIGJlbG93LlxuICB9XG5cbiAgY29uc3QgY29tcHV0ZVR5cGUgPSBnZXRDb21wdXRlVHlwZShcbiAgICBwbHVnaW4uY29tcHV0ZVR5cGUgPz8gb3B0aW9ucy5kZWZhdWx0Q29tcHV0ZVR5cGUgPz8gJ1NNQUxMJyxcbiAgKTtcblxuICAvLyBTdGVwIG5ldHdvcms6IGV4cGxpY2l0IHN0ZXAgY29uZmlnIHdpbnMsIGVsc2UgdGhpcyBzdGVwJ3MgYGVjMjpuZXR3b3JrYCBtZXRhZGF0YS5cbiAgY29uc3QgcmVzb2x2ZWROZXR3b3JrID0gbmV0d29yayA/PyBuZXR3b3JrQ29uZmlnRnJvbU1ldGFkYXRhKG1lcmdlZCk7XG4gIGNvbnN0IG5ldHdvcmtQcm9wcyA9IHJlc29sdmVkTmV0d29ya1xuICAgID8gcmVzb2x2ZU5ldHdvcmsoc2NvcGUsIG9wdGlvbnMudW5pcXVlSWQsIHJlc29sdmVkTmV0d29yaylcbiAgICA6IHt9O1xuXG4gIC8vIE1ldGFkYXRhIHNwcmVhZCBsYXN0IHNvIGl0IGNhbiBvdmVycmlkZSBwcm9ncmFtbWF0aWMgZGVmYXVsdHMuXG4gIC8vIE5PVEU6IENhY2hpbmcgaXMgc3VwcG9ydGVkIHZpYSB0d28gbWV0YWRhdGEgcGF0aHM6XG4gIC8vICAgMS4gTWV0YWRhdGFLZXlzLkNBQ0hFICgnYXdzOmNkazpwaXBlbGluZXM6Y29kZWJ1aWxkc3RlcDpjYWNoZScpIOKAlCBwYXNzZWQgZGlyZWN0bHlcbiAgLy8gICAgICBhcyB0aGUgQ29kZUJ1aWxkU3RlcCBgY2FjaGVgIHByb3AgKGV4cGVjdHMgYSBjb2RlYnVpbGQuQ2FjaGUgb2JqZWN0KS5cbiAgLy8gICAyLiBNZXRhZGF0YUtleXMuUEFSVElBTF9CVUlMRF9TUEVDICgnYXdzOmNkazpwaXBlbGluZXM6Y29kZWJ1aWxkc3RlcDpwYXJ0aWFsYnVpbGRzcGVjJylcbiAgLy8gICAgICDigJQgcGFzc2VkIGFzIGBwYXJ0aWFsQnVpbGRTcGVjYCwgd2hpY2ggY2FuIGluY2x1ZGUgYSBgY2FjaGU6YCBzZWN0aW9uIGZvclxuICAvLyAgICAgIFMzIG9yIGxvY2FsIGNhY2hpbmcgKGUuZy4sIEJ1aWxkU3BlYy5mcm9tT2JqZWN0KHsgY2FjaGU6IHsgcGF0aHM6IFsuLi5dIH0gfSkpLlxuICAvLyBQZXItc3RlcCBidWlsZEVudmlyb25tZW50IG92ZXJyaWRlcyBmcm9tIG1ldGFkYXRhIChhd3M6Y2RrOmNvZGVidWlsZDpidWlsZGVudmlyb25tZW50OiopLlxuICAvLyBBIG1ldGFkYXRhLXByb3ZpZGVkIGNvbXB1dGVUeXBlIGlzIGEgcmF3IHBhc3N0aHJvdWdoLCBzbyBub3JtYWxpemUgaXQgdGhyb3VnaFxuICAvLyBnZXRDb21wdXRlVHlwZSDigJQgb3RoZXJ3aXNlIGEgZnJpZW5kbHkgdmFsdWUgbGlrZSBcIkxBUkdFXCIgcmVhY2hlcyBDb2RlQnVpbGQgdmVyYmF0aW1cbiAgLy8gYW5kIGZhaWxzIHdpdGggXCJJbnZhbGlkIGNvbXB1dGUgdHlwZSBwcm92aWRlZFwiIChpdCBuZWVkcyBCVUlMRF9HRU5FUkFMMV9MQVJHRSkuXG4gIGNvbnN0IHJhd01ldGFCdWlsZEVudiA9IG1ldGFkYXRhRm9yQnVpbGRFbnZpcm9ubWVudChtZXJnZWQpO1xuICBjb25zdCBtZXRhQnVpbGRFbnYgPSB0eXBlb2YgcmF3TWV0YUJ1aWxkRW52LmNvbXB1dGVUeXBlID09PSAnc3RyaW5nJ1xuICAgID8geyAuLi5yYXdNZXRhQnVpbGRFbnYsIGNvbXB1dGVUeXBlOiBnZXRDb21wdXRlVHlwZShyYXdNZXRhQnVpbGRFbnYuY29tcHV0ZVR5cGUpIH1cbiAgICA6IHJhd01ldGFCdWlsZEVudjtcblxuICBjb25zdCBzdGVwID0gbmV3IENvZGVCdWlsZFN0ZXAoaWQsIHtcbiAgICAuLi5wcm9ncmFtbWF0aWMsXG4gICAgLi4ubmV0d29ya1Byb3BzLFxuICAgIC4uLihhZGRpdGlvbmFsSW5wdXRzICYmIHsgYWRkaXRpb25hbElucHV0cyB9KSxcbiAgICAuLi4odGltZW91dCAmJiB7IHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXModGltZW91dCkgfSksXG4gICAgZW52OiBhY3Rpb25FbnYsXG4gICAgcHJpbWFyeU91dHB1dERpcmVjdG9yeTogcGx1Z2luLnByaW1hcnlPdXRwdXREaXJlY3RvcnkgPz8gdW5kZWZpbmVkLFxuICAgIC8vIFBpbiB0aGUgYnVpbGRzcGVjIHNoZWxsIHRvIFBPU0lYIC9iaW4vc2ggc28gZXhlY3V0aW9uIGlzIGlkZW50aWNhbCB0b1xuICAgIC8vIENvZGVCdWlsZCdzIGRlZmF1bHQgYW5kIHBvcnRhYmxlIGFjcm9zcyBtaW5pbWFsIGJhc2UgaW1hZ2VzIChubyBiYXNoXG4gICAgLy8gZGVwZW5kZW5jeSkuIFBsdWdpbiBzcGVjcyBhcmUgYXV0aG9yZWQgUE9TSVgtY2xlYW4gdG8gbWF0Y2gg4oCUIG5vIGJhc2gtb25seVxuICAgIC8vIGBbWyBdXWAsIGFycmF5cywgYHJlYWQgLXJhIDw8PGAsIG9yIGBzb3VyY2VgL2Budm0gdXNlYC9gc2RrIHVzZWAuIEFcbiAgICAvLyBwbHVnaW4tc3VwcGxpZWQgcGFydGlhbEJ1aWxkU3BlYyAobm9uZSB0b2RheSkgd291bGQgb3ZlcnJpZGUgdGhpcyB2aWEgdGhlXG4gICAgLy8gbWV0YWRhdGEgc3ByZWFkIGJlbG93IGFuZCBtdXN0IHRoZW4gc2V0IGBlbnYuc2hlbGxgIGl0c2VsZi5cbiAgICBwYXJ0aWFsQnVpbGRTcGVjOiBCdWlsZFNwZWMuZnJvbU9iamVjdCh7IGVudjogeyBzaGVsbDogJy9iaW4vc2gnIH0gfSksXG4gICAgYnVpbGRFbnZpcm9ubWVudDoge1xuICAgICAgY29tcHV0ZVR5cGUsXG4gICAgICBidWlsZEltYWdlOiBwbHVnaW5CdWlsZEltYWdlID8/IHJlc29sdmVEZWZhdWx0QnVpbGRJbWFnZShzY29wZSwgb3JnSWQpLFxuICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZXM6IHtcbiAgICAgICAgLi4udG9Db2RlQnVpbGRFbnZWYXJzKGVudiksXG4gICAgICAgIC4uLnNlY3JldEVudlZhcnMsXG4gICAgICAgIC4uLnJlcG9ydEtleUVudlZhcixcbiAgICAgIH0sXG4gICAgICAuLi5tZXRhQnVpbGRFbnYsXG4gICAgfSxcbiAgICAuLi5tZXRhZGF0YUZvckNvZGVCdWlsZFN0ZXAobWVyZ2VkKSxcbiAgfSk7XG5cbiAgLy8gUmVnaXN0ZXIgd2l0aCBhcnRpZmFjdCBtYW5hZ2VyIGlmIHByaW1hcnlPdXRwdXREaXJlY3RvcnkgaXMgc2V0XG4gIGlmIChwbHVnaW4ucHJpbWFyeU91dHB1dERpcmVjdG9yeSAmJiBhcnRpZmFjdE1hbmFnZXIgJiYgc3RhZ2VOYW1lKSB7XG4gICAgY29uc3QgYXJ0aWZhY3RLZXk6IEFydGlmYWN0S2V5ID0ge1xuICAgICAgc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VBbGlhczogc3RhZ2VBbGlhcyA/PyBgJHtzdGFnZU5hbWV9LWFsaWFzYCxcbiAgICAgIHBsdWdpbk5hbWU6IHBsdWdpbi5uYW1lLFxuICAgICAgcGx1Z2luQWxpYXM6IHBsdWdpbkFsaWFzID8/IHBsdWdpbkFydGlmYWN0QWxpYXMocGx1Z2luKSxcbiAgICAgIG91dHB1dERpcmVjdG9yeTogcGx1Z2luLnByaW1hcnlPdXRwdXREaXJlY3RvcnksXG4gICAgfTtcbiAgICBhcnRpZmFjdE1hbmFnZXIuYWRkKGFydGlmYWN0S2V5LCBzdGVwKTtcbiAgfVxuXG4gIHJldHVybiBzdGVwO1xufVxuXG4vKipcbiAqIENvbnZlcnQgc3RyaW5nIG9yIENvbXB1dGVUeXBlIGVudW0gdG8gQ0RLIENvbXB1dGVUeXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb21wdXRlVHlwZShpbnB1dDogc3RyaW5nIHwgQ0RLQ29tcHV0ZVR5cGUgPSAnU01BTEwnKTogQ0RLQ29tcHV0ZVR5cGUge1xuICAvLyBJZiBhbHJlYWR5IGEgQ0RLIENvbXB1dGVUeXBlLCByZXR1cm4gYXMtaXNcbiAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cblxuICAvLyBBbHJlYWR5IGEgbmF0aXZlIENvZGVCdWlsZCBDb21wdXRlVHlwZSAoZS5nLiBcIkJVSUxEX0dFTkVSQUwxX0xBUkdFXCIpPyBBY2NlcHQgYXMtaXNcbiAgLy8gc28gYm90aCBmcmllbmRseSAoTEFSR0UpIGFuZCBuYXRpdmUgdmFsdWVzIHJvdW5kLXRyaXAgd2l0aG91dCBmYWxsaW5nIGJhY2sgdG8gU01BTEwuXG4gIGlmICgoT2JqZWN0LnZhbHVlcyhDREtDb21wdXRlVHlwZSkgYXMgc3RyaW5nW10pLmluY2x1ZGVzKGlucHV0KSkge1xuICAgIHJldHVybiBpbnB1dCBhcyBDREtDb21wdXRlVHlwZTtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBpbnB1dC50b1VwcGVyQ2FzZSgpIGFzIENvbXB1dGVUeXBlO1xuXG4gIGNvbnN0IG1hcHBpbmc6IFJlY29yZDxDb21wdXRlVHlwZSwgQ0RLQ29tcHV0ZVR5cGU+ID0ge1xuICAgIFtDb21wdXRlVHlwZS5TTUFMTF06IENES0NvbXB1dGVUeXBlLlNNQUxMLFxuICAgIFtDb21wdXRlVHlwZS5NRURJVU1dOiBDREtDb21wdXRlVHlwZS5NRURJVU0sXG4gICAgW0NvbXB1dGVUeXBlLkxBUkdFXTogQ0RLQ29tcHV0ZVR5cGUuTEFSR0UsXG4gICAgW0NvbXB1dGVUeXBlLlgyX0xBUkdFXTogQ0RLQ29tcHV0ZVR5cGUuWDJfTEFSR0UsXG4gIH07XG5cbiAgY29uc3QgcmVzdWx0ID0gbWFwcGluZ1tub3JtYWxpemVkXTtcbiAgaWYgKCFyZXN1bHQpIHtcbiAgICBsb2cud2FybihgVW5rbm93biBjb21wdXRlIHR5cGUgXCIke2lucHV0fVwiLCBmYWxsaW5nIGJhY2sgdG8gU01BTExgKTtcbiAgICByZXR1cm4gQ0RLQ29tcHV0ZVR5cGUuU01BTEw7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBVbndyYXAgYSBTZWNyZXRWYWx1ZSB8IHN0cmluZyBpbnRvIGEgcGxhaW4gc3RyaW5nLlxuICogV2hlbiBhIFNlY3JldFZhbHVlIGlzIHByb3ZpZGVkIChlLmcuIGZyb20gU2VjcmV0cyBNYW5hZ2VyKSwgY2FsbHMgdW5zYWZlVW53cmFwKClcbiAqIHRvIGV4dHJhY3QgdGhlIHVuZGVybHlpbmcgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bndyYXBTZWNyZXQodmFsdWU6IFNlY3JldFZhbHVlIHwgc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IHZhbHVlLnVuc2FmZVVud3JhcCgpO1xufVxuIl19
|
|
541
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUtaGVscGVycy5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvcGlwZWxpbmUtaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0QsT0FBTyxFQUFFLDRCQUE0QixFQUFFLFNBQVMsRUFBRSxXQUFXLElBQUksY0FBYyxFQUFFLGVBQWUsRUFBb0IsTUFBTSwyQkFBMkIsQ0FBQztBQUN0SixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSxTQUFTLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVyRixPQUFPLEVBQW9CLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLHdCQUF3QixFQUFFLDJCQUEyQixFQUFFLHlCQUF5QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0ksT0FBTyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3RILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQXFCLE1BQU0scUJBQXFCLENBQUM7QUFDakYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHVCQUF1QixFQUFFLDJCQUEyQixFQUFFLDBCQUEwQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekgsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDakUsT0FBTyxFQUFF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QU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUEyQjtJQUN0RCxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7QUFDbEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpbiB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWRhdGEnO1xuaW1wb3J0IHsgRHVyYXRpb24sIFNlY3JldFZhbHVlLCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IEJ1aWxkRW52aXJvbm1lbnRWYXJpYWJsZVR5cGUsIEJ1aWxkU3BlYywgQ29tcHV0ZVR5cGUgYXMgQ0RLQ29tcHV0ZVR5cGUsIExpbnV4QnVpbGRJbWFnZSwgdHlwZSBJQnVpbGRJbWFnZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2RlYnVpbGQnO1xuaW1wb3J0IHsgU2VjcmV0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyJztcbmltcG9ydCB7IENvZGVCdWlsZFN0ZXAsIE1hbnVhbEFwcHJvdmFsU3RlcCwgU2hlbGxTdGVwIH0gZnJvbSAnYXdzLWNkay1saWIvcGlwZWxpbmVzJztcbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyB0eXBlIEFydGlmYWN0S2V5IH0gZnJvbSAnLi9hcnRpZmFjdC1tYW5hZ2VyLmpzJztcbmltcG9ydCB7IG1ldGFkYXRhRm9yU2hlbGxTdGVwLCBtZXRhZGF0YUZvckNvZGVCdWlsZFN0ZXAsIG1ldGFkYXRhRm9yQnVpbGRFbnZpcm9ubWVudCwgbmV0d29ya0NvbmZpZ0Zyb21NZXRhZGF0YSB9IGZyb20gJy4vbWV0YWRhdGEtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBTVEVQX0JPT1RTVFJBUF9DTUQsIGV4dHJhY3RNZXRhZGF0YUVudiwgbWVyZ2UsIHdyYXBDb21tYW5kc0ZvckZhaWx1cmVCZWhhdmlvciB9IGZyb20gJy4vbWV0YWRhdGEtaGVscGVycy5qcyc7XG5pbXBvcnQgeyByZXNvbHZlTmV0d29yayB9IGZyb20gJy4vbmV0d29yay5qcyc7XG5pbXBvcnQgeyBQbHVnaW5UeXBlLCBDb21wdXRlVHlwZSwgdHlwZSBNZXRhRGF0YVR5cGUgfSBmcm9tICcuL3BpcGVsaW5lLXR5cGVzLmpzJztcbmltcG9ydCB7IHBsdWdpbkFydGlmYWN0QWxpYXMgfSBmcm9tICcuL3BsdWdpbi1jb250cmFjdC5qcyc7XG5pbXBvcnQgeyBTRUNVUklUWV9SRVBPUlRfS0VZX0VOViwgU0VDVVJJVFlfUkVQT1JUX1NFQ1JFVF9MRUFGLCBTRUNVUklUWV9SRVBPUlRfVVBMT0FEX0VOViB9IGZyb20gJy4vc2VjdXJpdHktcmVwb3J0cy5qcyc7XG5pbXBvcnQgeyBDVVJBVEVEX1NFTEZfTVVUQVRJT05fSU1BR0UgfSBmcm9tICcuL3NlbGYtbXV0YXRpb24uanMnO1xuaW1wb3J0IHsgUExVR0lOX0lNQUdFX1JFUE9TSVRPUllfUkUgfSBmcm9tICcuL3N0ZXAtbWFuaWZlc3QuanMnO1xuaW1wb3J0IHsgQ29uZmlnLCBDb3JlQ29uc3RhbnRzIH0gZnJvbSAnLi4vY29uZmlnL2FwcC1jb25maWcuanMnO1xuaW1wb3J0IHR5cGUgeyBDb2RlQnVpbGRTdGVwT3B0aW9ucywgU3RlcEN1c3RvbWl6YXRpb24gfSBmcm9tICcuLi9waXBlbGluZS9zdGVwLXR5cGVzLmpzJztcbmltcG9ydCB7IHJlc29sdmVQbHVnaW5UZW1wbGF0ZXMgfSBmcm9tICcuLi90ZW1wbGF0ZS9wbHVnaW4tcmVzb2x2ZXIuanMnO1xuXG5jb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoJ3BpcGVsaW5lLWhlbHBlcnMnKTtcblxuLyoqXG4gKiBCdWlsZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBwbHVnaW4gY29uZmlnLCBtZXJnZWQgbWV0YWRhdGEsIGFuZCBjdXN0b20gZW52LlxuICpcbiAqIE1lcmdlIG9yZGVyIChsYXN0IHdpbnMpOlxuICogICAxLiBwbHVnaW4uZW52IOKAlCBwbHVnaW4gZGVmYXVsdCBlbnYgdmFycyAobG93ZXN0IHByaW9yaXR5KVxuICogICAyLiBub24tbmFtZXNwYWNlZCBtZXRhZGF0YSBrZXlzIOKAlCBlLmcuIFBZVEhPTl9WRVJTSU9OLCBXT1JLRElSXG4gKiAgIDMuIGN1c3RvbUVudiDigJQgcGVyLXN0ZXAgY3VzdG9tIGVudiB2YXJzIChoaWdoZXN0IHByaW9yaXR5KVxuICovXG5mdW5jdGlvbiBidWlsZEVudihwbHVnaW46IFBsdWdpbiwgbWV0YWRhdGE6IE1ldGFEYXRhVHlwZSwgY3VzdG9tRW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICByZXR1cm4ge1xuICAgIC4uLihwbHVnaW4uZW52ID8/IHt9KSxcbiAgICAuLi5leHRyYWN0TWV0YWRhdGFFbnYobWV0YWRhdGEpLFxuICAgIC4uLihjdXN0b21FbnYgPz8ge30pLFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIGJvb3RzdHJhcC1wcmVmaXhlZCBpbnN0YWxsIGFuZCBidWlsZCBjb21tYW5kcyBmcm9tIHBsdWdpbiBjb25maWcuXG4gKiBFYWNoIGNvbW1hbmQgbGlzdCBpcyBwcmVwZW5kZWQgd2l0aCBhIFdPUktESVIgYm9vdHN0cmFwIHRoYXQgZGVmYXVsdHMgdG8gJy4vJy5cbiAqIFdoZW4gY3VzdG9tIGNvbW1hbmRzIGFyZSBwcm92aWRlZCwgdGhleSBhcmUgaW5qZWN0ZWQgYmVmb3JlL2FmdGVyIHRoZSBwbHVnaW4ncyBjb21tYW5kcy5cbiAqIEJ1aWxkIGNvbW1hbmRzIGFyZSBvcHRpb25hbGx5IHdyYXBwZWQgYnkgZmFpbHVyZUJlaGF2aW9yIGxvZ2ljLlxuICovXG5mdW5jdGlvbiBidWlsZENvbW1hbmRzKHBsdWdpbjogUGx1Z2luLCBjdXN0b20/OiBTdGVwQ3VzdG9taXphdGlvbiwgZmFpbHVyZUJlaGF2aW9yPzogJ2ZhaWwnIHwgJ3dhcm4nIHwgJ2lnbm9yZScpOiB7IGluc3RhbGxDb21tYW5kczogc3RyaW5nW107IGNvbW1hbmRzOiBzdHJpbmdbXSB9IHtcbiAgY29uc3QgdXNlckNvbW1hbmRzID0gW1xuICAgIC4uLihjdXN0b20/LnByZUNvbW1hbmRzID8/IFtdKSxcbiAgICAuLi4ocGx1Z2luLmNvbW1hbmRzPy5sZW5ndGggPyBwbHVnaW4uY29tbWFuZHMgOiBbXSksXG4gICAgLi4uKGN1c3RvbT8ucG9zdENvbW1hbmRzID8/IFtdKSxcbiAgXTtcblxuICByZXR1cm4ge1xuICAgIGluc3RhbGxDb21tYW5kczogW1xuICAgICAgU1RFUF9CT09UU1RSQVBfQ01ELFxuICAgICAgLi4uKGN1c3RvbT8ucHJlSW5zdGFsbENvbW1hbmRzID8/IFtdKSxcbiAgICAgIC4uLihwbHVnaW4uaW5zdGFsbENvbW1hbmRzID8/IFtdKSxcbiAgICAgIC4uLihjdXN0b20/LnBvc3RJbnN0YWxsQ29tbWFuZHMgPz8gW10pLFxuICAgIF0sXG4gICAgY29tbWFuZHM6IFtTVEVQX0JPT1RTVFJBUF9DTUQsIC4uLndyYXBDb21tYW5kc0ZvckZhaWx1cmVCZWhhdmlvcih1c2VyQ29tbWFuZHMsIGZhaWx1cmVCZWhhdmlvcildLFxuICB9O1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSBwbGFpbiBlbnYgcmVjb3JkIHRvIENvZGVCdWlsZCdzIGVudmlyb25tZW50VmFyaWFibGVzIGZvcm1hdCAoUExBSU5URVhUKS5cbiAqL1xuZnVuY3Rpb24gdG9Db2RlQnVpbGRFbnZWYXJzKGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHN0cmluZyB9PiB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMoZW52KS5tYXAoKFtuYW1lLCB2YWx1ZV0pID0+IFtuYW1lLCB7IHZhbHVlIH1dKSxcbiAgKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBTRUNSRVRTX01BTkFHRVItdHlwZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBwbHVnaW4gc2VjcmV0IGRlY2xhcmF0aW9ucy5cbiAqIFVzZXMgbmFtaW5nIGNvbnZlbnRpb246IHBpcGVsaW5lLWJ1aWxkZXIve29yZ0lkfS97c2VjcmV0TmFtZX1cbiAqIEVhY2ggb3JnIG1hbmFnZXMgdGhlc2Ugc2VjcmV0cyBpbiB0aGVpciBvd24gQVdTIFNlY3JldHMgTWFuYWdlci5cbiAqL1xuY29uc3QgVkFMSURfU0VDUkVUX05BTUUgPSAvXlthLXpBLVowLTkvXys9LkAtXSskLztcblxuLyoqXG4gKiBTZWNyZXRzIE1hbmFnZXIgbGVhZiBob2xkaW5nIHRoZSBvcmcncyBSRUdJU1RSWSBjcmVkZW50aWFsIOKAlCB0aGVcbiAqIGByZWdpc3RyeTpwdXNoYC1zY29wZWQgc2VydmljZS1hY2NvdW50IGtleSBDb2RlQnVpbGQgcHJlc2VudHMgYXMgQmFzaWMgYXV0aCB0b1xuICogcGlwZWxpbmUtaW1hZ2UtcmVnaXN0cnkuIERlbGliZXJhdGVseSBOT1QgYHBsYXRmb3JtYDogdGhhdCBzZWNyZXQgaG9sZHNcbiAqIHRoZSBvcmcncyBmdWxsLXByaXZpbGVnZSBhdXRvbWF0aW9uIGNyZWRlbnRpYWwsIGFuZCBhIGJ1aWxkIGNvbnRhaW5lciBoYXMgbm9cbiAqIGJ1c2luZXNzIGJlaW5nIGFibGUgdG8gY2FsbCB0aGUgQVBJIHdpdGggaXQuXG4gKiBQcm92aXNpb25lZCBieSBgcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbiAtLXNjb3BlIHJlZ2lzdHJ5OnB1c2hgLlxuICovXG5jb25zdCBSRUdJU1RSWV9DUkVERU5USUFMX1NFQ1JFVCA9ICdyZWdpc3RyeS1wdXNoJztcblxuZnVuY3Rpb24gdG9TZWNyZXRFbnZWYXJzKFxuICBzZWNyZXRzOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgcmVxdWlyZWQ6IGJvb2xlYW4gfT4sXG4gIG9yZ0lkOiBzdHJpbmcsXG4pOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiBzdHJpbmc7IHR5cGU6IEJ1aWxkRW52aXJvbm1lbnRWYXJpYWJsZVR5cGUgfT4ge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIHNlY3JldHMubWFwKCh7IG5hbWUgfSkgPT4ge1xuICAgICAgY29uc3Qgc2VjcmV0UGF0aCA9IENvcmVDb25zdGFudHMuc2VjcmV0UGF0aChvcmdJZCwgbmFtZSk7XG4gICAgICBpZiAoIVZBTElEX1NFQ1JFVF9OQU1FLnRlc3Qoc2VjcmV0UGF0aCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZWNyZXQgcGF0aCBcIiR7c2VjcmV0UGF0aH1cIiBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgZm9yIEFXUyBTZWNyZXRzIE1hbmFnZXJgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHtcbiAgICAgICAgICB2YWx1ZTogc2VjcmV0UGF0aCxcbiAgICAgICAgICB0eXBlOiBCdWlsZEVudmlyb25tZW50VmFyaWFibGVUeXBlLlNFQ1JFVFNfTUFOQUdFUixcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfSksXG4gICk7XG59XG5cbi8qKlxuICogSW4tY2x1c3RlciAvIGxvY2FsIHJlZ2lzdHJ5IGhvc3RuYW1lcyB0aGF0IEFXUyBDb2RlQnVpbGQgKG91dC1vZi1jbHVzdGVyKVxuICogY2Fubm90IHJlc29sdmUuIEJha2luZyBvbmUgb2YgdGhlc2UgaW50byBhIENvZGVCdWlsZCBpbWFnZSBVUkkgZ3VhcmFudGVlcyBhXG4gKiBgQlVJTERfQ09OVEFJTkVSX1VOQUJMRV9UT19QVUxMX0lNQUdFYCBmYWlsdXJlIGF0IGJ1aWxkIHRpbWUsIHNvIHdlIGZhaWwgdGhlXG4gKiBzeW50aCBmYXN0IGluc3RlYWQg4oCUIHdpdGggYSBtZXNzYWdlIHRoYXQgc2F5cyBob3cgdG8gZml4IGl0LlxuICovXG5jb25zdCBVTlJFQUNIQUJMRV9QVUxMX0hPU1RTID0gbmV3IFNldChbJ3JlZ2lzdHJ5JywgJ2xvY2FsaG9zdCcsICcxMjcuMC4wLjEnLCAnOjoxJywgJzAuMC4wLjAnXSk7XG5cbi8qKiBLdWJlcm5ldGVzIC8gbUROUyBzdWZmaXhlcyB0aGF0IG9ubHkgcmVzb2x2ZSBpbnNpZGUgdGhlIGNsdXN0ZXIvTEFOLiAqL1xuY29uc3QgVU5SRUFDSEFCTEVfSE9TVF9TVUZGSVhFUyA9IFsnLnN2YycsICcuc3ZjLmNsdXN0ZXIubG9jYWwnLCAnLmxvY2FsJ107XG5cbi8qKlxuICogUmVkdWNlIGEgcmVnaXN0cnkgaG9zdCB2YWx1ZSB0byBpdHMgYmFyZSBob3N0bmFtZSBmb3IgdGhlIHJlYWNoYWJpbGl0eSBjaGVjazpcbiAqIHN0cmlwIElQdjYgYnJhY2tldHMgYW5kIGFueSBgOnBvcnRgIHN1ZmZpeCAoYW4gb3BlcmF0b3IgbWF5IHB1dCBob3N0K3BvcnQgaW5cbiAqIG9uZSBmaWVsZCksIHNvIGByZWdpc3RyeTo1MDAwYCAvIGBbOjoxXTo1MDAwYCBhcmUgc3RpbGwgcmVjb2duaXplZC5cbiAqL1xuZnVuY3Rpb24gYmFyZUhvc3RuYW1lKHJhd0hvc3Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCBoID0gcmF3SG9zdC50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgaWYgKGguc3RhcnRzV2l0aCgnWycpKSB7XG4gICAgY29uc3QgZW5kID0gaC5pbmRleE9mKCddJyk7XG4gICAgaWYgKGVuZCAhPT0gLTEpIHJldHVybiBoLnNsaWNlKDEsIGVuZCk7IC8vIFs6OjFdOjUwMDAgLT4gOjoxXG4gIH1cbiAgLy8gU3RyaXAgYSB0cmFpbGluZyA6cG9ydCBvbmx5IGZvciBub24tSVB2NiB2YWx1ZXMgKElQdjYgY29udGFpbnMgJzo6JyBvciA+MSAnOicpLlxuICBpZiAoaC5pbmNsdWRlcygnOicpICYmIChoLm1hdGNoKC86L2cpPy5sZW5ndGggPz8gMCkgPT09IDEpIGggPSBoLnNwbGl0KCc6JylbMF07XG4gIHJldHVybiBoO1xufVxuXG4vKiogVHJ1ZSB3aGVuIENvZGVCdWlsZCAob3V0LW9mLWNsdXN0ZXIpIGNvdWxkIG5vdCByZXNvbHZlIHRoaXMgcmVnaXN0cnkgaG9zdC4gKi9cbmZ1bmN0aW9uIGlzVW5yZWFjaGFibGVQdWxsSG9zdChyYXdIb3N0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgaCA9IGJhcmVIb3N0bmFtZShyYXdIb3N0KTtcbiAgaWYgKGggPT09ICcnKSByZXR1cm4gdHJ1ZTsgLy8gbm8gaG9zdCDihpIgbWFsZm9ybWVkIFVSSVxuICBpZiAoVU5SRUFDSEFCTEVfUFVMTF9IT1NUUy5oYXMoaCkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gVU5SRUFDSEFCTEVfSE9TVF9TVUZGSVhFUy5zb21lKChzKSA9PiBoLmVuZHNXaXRoKHMpKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBleHRlcm5hbCAob3V0LW9mLWNsdXN0ZXIpIHJlZ2lzdHJ5IHB1bGwgaG9zdCArIGA6cG9ydGAgc3VmZml4IGZvclxuICogYSBDb2RlQnVpbGQgaW1hZ2UgVVJJLCBhbmQgZmFpbCBmYXN0IGlmIGl0IHJlc29sdmVkIHRvIGFuIGluLWNsdXN0ZXIvbG9jYWxcbiAqIGRlZmF1bHQgdGhhdCBDb2RlQnVpbGQgY2FuJ3QgcmVhY2guXG4gKlxuICogUHJlZmVycyBgcHVsbEhvc3RgL2BwdWxsUG9ydGAgKHRoZSBwdWJsaWMgZW5kcG9pbnQgQ29kZUJ1aWxkIGNhbiByZXNvbHZlKSBhbmRcbiAqIGZhbGxzIGJhY2sgdG8gYGhvc3RgL2Bwb3J0YCBmb3Igc2luZ2xlLWhvc3QgZGVwbG95cy4gcGlwZWxpbmUtbWFuYWdlciBiYWtlc1xuICogdGhlIHJpZ2h0IHB1bGwgaG9zdCBpbnRvIHRoZSBzeW50aCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIHBsYXRmb3JtIFVSTCBpdFxuICogZGVwbG95cyBhZ2FpbnN0IChgcHJvcHMucmVnaXN0cnlgKTsgdGhpcyBndWFyZCBjYXRjaGVzIHRoZSBjYXNlIHdoZXJlIG5laXRoZXJcbiAqIHRoYXQgbm9yIGBJTUFHRV9SRUdJU1RSWV9QVUxMX0hPU1RgL2BQTEFURk9STV9CQVNFX1VSTGAgd2FzIHN1cHBsaWVkLlxuICpcbiAqIEVzY2FwZSBoYXRjaDogYEFMTE9XX0lOQ0xVU1RFUl9QVUxMX0hPU1Q9dHJ1ZWAgKGUuZy4gQ29kZUJ1aWxkIGluIGEgVlBDIHdob3NlXG4gKiBwcml2YXRlIEROUyBnZW51aW5lbHkgcmVzb2x2ZXMgdGhlIGluLWNsdXN0ZXIgbmFtZSkuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVFeHRlcm5hbFB1bGxUYXJnZXQoXG4gIHJlZ2lzdHJ5OiB7IGhvc3Q/OiBzdHJpbmc7IHBvcnQ/OiBudW1iZXI7IHB1bGxIb3N0Pzogc3RyaW5nOyBwdWxsUG9ydD86IG51bWJlciB9LFxuKTogeyBob3N0OiBzdHJpbmc7IHBvcnRQYXJ0OiBzdHJpbmcgfSB7XG4gIGNvbnN0IGhvc3QgPSByZWdpc3RyeS5wdWxsSG9zdCB8fCByZWdpc3RyeS5ob3N0IHx8ICcnO1xuICBjb25zdCBwb3J0ID0gcmVnaXN0cnkucHVsbFBvcnQgPz8gcmVnaXN0cnkucG9ydDtcbiAgaWYgKHByb2Nlc3MuZW52LkFMTE9XX0lOQ0xVU1RFUl9QVUxMX0hPU1QgIT09ICd0cnVlJyAmJiBpc1VucmVhY2hhYmxlUHVsbEhvc3QoaG9zdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgUmVnaXN0cnkgcHVsbCBob3N0IHJlc29sdmVkIHRvICcke2hvc3R9Jywgd2hpY2ggQVdTIENvZGVCdWlsZCBjYW5ub3QgcmVhY2gg4oCUIGl0IGlzIHRoZSBgICtcbiAgICAgICdpbi1jbHVzdGVyL2xvY2FsIGRlZmF1bHQuIFRoZSBzeW50aGVzaXplZCBwaXBlbGluZSB3b3VsZCBmYWlsIGF0IGJ1aWxkIHRpbWUgd2l0aCAnICtcbiAgICAgICdCVUlMRF9DT05UQUlORVJfVU5BQkxFX1RPX1BVTExfSU1BR0UuIFNldCB0aGUgcGxhdGZvcm1cXCdzIHB1YmxpYyBob3N0IHZpYSAnICtcbiAgICAgICdJTUFHRV9SRUdJU1RSWV9QVUxMX0hPU1Qgb3IgUExBVEZPUk1fQkFTRV9VUkwgYmVmb3JlIGRlcGxveWluZyDigJQgcGlwZWxpbmUtbWFuYWdlciBiYWtlcyAnICtcbiAgICAgICd0aGlzIGluIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgcGxhdGZvcm0gVVJMIGl0IGRlcGxveXMgYWdhaW5zdC4gJyArXG4gICAgICAnU2V0IEFMTE9XX0lOQ0xVU1RFUl9QVUxMX0hPU1Q9dHJ1ZSB0byBieXBhc3MgKGluLVZQQyBwcml2YXRlIEROUykuJyxcbiAgICApO1xuICB9XG4gIGNvbnN0IHBvcnRQYXJ0ID0gcG9ydCAmJiBwb3J0ICE9PSA4MCAmJiBwb3J0ICE9PSA0NDMgPyBgOiR7cG9ydH1gIDogJyc7XG4gIHJldHVybiB7IGhvc3QsIHBvcnRQYXJ0IH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgQ29kZUJ1aWxkIGltYWdlIHRvIHVzZSBmb3IgYSBwbHVnaW4uXG4gKlxuICogU3RyYXRlZ3k6XG4gKiAgIDEuIElmIHRoZSBwbHVnaW4gc2V0cyBgYXdzOmNkazpjb2RlYnVpbGQ6YnVpbGRlbnZpcm9ubWVudDpidWlsZEltYWdlYFxuICogICAgICBleHBsaWNpdGx5IGluIG1ldGFkYXRhLCB0aGUgbWV0YWRhdGEtYnVpbGRlciBwYXNzdGhyb3VnaCBoYW5kbGVzIGl0XG4gKiAgICAgICh2aWEgYG1ldGFkYXRhRm9yQnVpbGRFbnZpcm9ubWVudGApLiBUaGlzIGZ1bmN0aW9uIHJldHVybnNcbiAqICAgICAgYHVuZGVmaW5lZGAgYW5kIHRoZSBtZXRhZGF0YSB3aW5zLlxuICogICAyLiBPdGhlcndpc2UsIGlmIHRoZSBwbHVnaW4gaGFzIGEgYG5hbWVgK2B2ZXJzaW9uYCBBTkQgdGhlIHJlZ2lzdHJ5XG4gKiAgICAgIGNvbmZpZyBpcyBwb3B1bGF0ZWQsIGJ1aWxkIGEgYExpbnV4QnVpbGRJbWFnZS5mcm9tRG9ja2VyUmVnaXN0cnkoKWBcbiAqICAgICAgaW1hZ2UgcG9pbnRpbmcgYXQgYDxyZWdpc3RyeS1ob3N0Pjo8cG9ydD4vPG5zPi88bmFtZT5APGltYWdlRGlnZXN0PmBcbiAqICAgICAgd2hlcmUgYDxucz5gIGlzIGBzeXN0ZW1gIG9yIGBvcmctPG9yZ0lkPmAuIFBpbm5lZCBCWSBESUdFU1Qg4oCUIHRoZSBvbmVcbiAqICAgICAgdGhlIHBsdWdpbiBzZXJ2aWNlIHZlcmlmaWVkIGFnYWluc3QgaXRzIHNpZ25pbmcga2V5IGJlZm9yZSByZXR1cm5pbmdcbiAqICAgICAgdGhpcyByZWNvcmQg4oCUIG5ldmVyIGJ5IHRoZSBtdXRhYmxlIGA6PHZlcnNpb24+YCB0YWcsIHdoaWNoIGFueW9uZVxuICogICAgICBob2xkaW5nIHRoZSBvcmcncyByZWdpc3RyeSBwdXNoIGNyZWRlbnRpYWwgY291bGQgcmUtcG9pbnQuIEEgcGx1Z2luXG4gKiAgICAgIHRoYXQgbmVlZHMgYW4gaW1hZ2UgYnV0IGNhcnJpZXMgbm8gZGlnZXN0IGlzIHJlZnVzZWQgKHRocm93cyk6IHJ1bm5pbmdcbiAqICAgICAgYW4gdW52ZXJpZmllZCBpbWFnZSBpcyB3b3JzZSB0aGFuIGEgZmFpbGVkIHN5bnRoLiBDb2RlQnVpbGQgYXV0aGVudGljYXRlcyBieVxuICogICAgICBzZW5kaW5nIHRoZSBwZXItb3JnIHBsYXRmb3JtIFNlY3JldCBhcyBCYXNpYyBhdXRoIHRvXG4gKiAgICAgIGBwaXBlbGluZS1pbWFnZS1yZWdpc3RyeWAncyBgL3Rva2VuYCBlbmRwb2ludDsgdGhlIEpXVCBpbiBgcGFzc3dvcmRgXG4gKiAgICAgIHJlc29sdmVzIHRvIGEgcmVnaXN0cnkgdG9rZW4gc2NvcGVkIHRvIHRoZSBvcmcuXG4gKiAgIDMuIElmIGBtZXRhZGF0YV9vbmx5YCwgcmV0dXJuIGB1bmRlZmluZWRgIHNvIHRoZSBzdGVwIHJ1bnMgb24gdGhlXG4gKiAgICAgIHBpcGVsaW5lJ3MgZGVmYXVsdCBpbWFnZSAoYGNvZGVCdWlsZERlZmF1bHRzYDogdGhlIHRvb2xjaGFpbiByZWxlYXNlJ3NcbiAqICAgICAgYHN5c3RlbS9waXBlbGluZS1ib290c3RyYXBAPGRpZ2VzdD5gLCBzZWUge0BsaW5rIHJlc29sdmVEZWZhdWx0QnVpbGRJbWFnZX0pLlxuICpcbiAqIGBzY29wZWAgYW5kIGBvcmdJZGAgYXJlIHJlcXVpcmVkOiB0aGUgcGVyLW9yZyBwbGF0Zm9ybSBTZWNyZXQgaXMgbmFtZWRcbiAqIGBwaXBlbGluZS1idWlsZGVyLzxvcmdJZD4vcGxhdGZvcm1gLCBhbmQgYFNlY3JldC5mcm9tU2VjcmV0TmFtZVYyKClgXG4gKiBuZWVkcyBhIENvbnN0cnVjdCB0byBhbmNob3IgdGhlIGltcG9ydGVkIHNlY3JldCB0by5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQbHVnaW5JbWFnZShzY29wZTogQ29uc3RydWN0IHwgdW5kZWZpbmVkLCBwbHVnaW46IFBsdWdpbiwgb3JnSWQ/OiBzdHJpbmcpOiBJQnVpbGRJbWFnZSB8IHVuZGVmaW5lZCB7XG4gIC8vIGBtZXRhZGF0YV9vbmx5YCBwbHVnaW5zIGxlZ2l0aW1hdGVseSBoYXZlIG5vIGltYWdlIOKAlCB0aGVpciB3b3JrIHJ1bnNcbiAgLy8gaW4gdGhlIGRlZmF1bHQgQ29kZUJ1aWxkIGltYWdlLiBRdWlldCBza2lwLlxuICBpZiAocGx1Z2luLmJ1aWxkVHlwZSA9PT0gJ21ldGFkYXRhX29ubHknKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIGJ1aWxkX2ltYWdlIC8gcHJlYnVpbHQgcGx1Z2lucyBtdXN0IGhhdmUgbmFtZSArIHZlcnNpb24gKERCIGNvbnN0cmFpbnRcbiAgLy8gbWFrZXMgYm90aCBOT1QgTlVMTCkuIERlZmVuc2l2ZSBjaGVjayBpbiBjYXNlIGEgbWFsZm9ybWVkIHJvdyBzbGlwcyBpbi5cbiAgaWYgKCFwbHVnaW4ubmFtZSB8fCAhcGx1Z2luLnZlcnNpb24pIHtcbiAgICBsb2cud2FybihcbiAgICAgIGBQbHVnaW4gXCIke3BsdWdpbi5uYW1lfVwiIGhhcyBidWlsZFR5cGU9JHtwbHVnaW4uYnVpbGRUeXBlfSBidXQgbWlzc2luZyBuYW1lL3ZlcnNpb24g4oCUIGAgK1xuICAgICAgJ0NvZGVCdWlsZCB3aWxsIHJ1biBvbiB0aGUgZGVmYXVsdCBidWlsZCBpbWFnZSBhbmQgd29uXFwndCBoYXZlIHRoZSBwbHVnaW5cXCdzIGJha2VkIHRvb2xzLicsXG4gICAgKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8gTm8gZGlnZXN0IOKHkiB0aGUgcGx1Z2luIHNlcnZpY2UgbmV2ZXIgc2lnbmVkIGFuIGltYWdlIGZvciB0aGlzIHJvdyAob3IgdGhlXG4gIC8vIHJlY29yZCBkaWRuJ3QgY29tZSBmcm9tIGAvcGx1Z2lucy9sb29rdXBgKS4gRmFpbCB0aGUgc3ludGggcmF0aGVyIHRoYW4gZmFsbFxuICAvLyBiYWNrIHRvIHRoZSB0YWcuXG4gIGlmICghcGx1Z2luLmltYWdlRGlnZXN0IHx8ICEvXnNoYTI1NjpbMC05YS1mXXs2NH0kLy50ZXN0KHBsdWdpbi5pbWFnZURpZ2VzdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgUGx1Z2luIFwiJHtwbHVnaW4ubmFtZX06JHtwbHVnaW4udmVyc2lvbn1cIiBoYXMgYnVpbGRUeXBlPSR7cGx1Z2luLmJ1aWxkVHlwZX0gYnV0IG5vIHNpZ25lZCBpbWFnZSBkaWdlc3QuIGAgK1xuICAgICAgJ1JlYnVpbGQgdGhlIHBsdWdpbiAocmUtdXBsb2FkIGl0KSBzbyB0aGUgcGxhdGZvcm0gY2FuIGJ1aWxkLCBzaWduIGFuZCByZWNvcmQgaXRzIGltYWdlLicsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRoZSByZXBvc2l0b3J5IGNvbWVzIGZyb20gbG9va3VwOiBgcHVibGljLzxwdWJsaXNoZXI+LzxuYW1lPmAgZm9yIGFcbiAgLy8gbGlzdGVkIHBsdWdpbiAodGhlIHJlYWQtb25seSBjb3B5IGV2ZXJ5IG9yZyBtYXkgcHVsbCksIGBvcmctPGlkPi88bmFtZT5gXG4gIC8vIGZvciB0aGUgb3JnJ3Mgb3duLiBOZXZlciBkZXJpdmVkIGhlcmUgZnJvbSB0aGUgcmVjb3JkJ3Mgb3duZXIg4oCUIGEgbGlzdGluZydzXG4gIC8vIGltYWdlIGRvZXNuJ3QgbGl2ZSBpbiBpdHMgcHVibGlzaGVyJ3MgbmFtZXNwYWNlLlxuICBjb25zdCByZXBvc2l0b3J5ID0gKHBsdWdpbiBhcyBQbHVnaW4gJiB7IGltYWdlUmVwb3NpdG9yeT86IHN0cmluZyB8IG51bGwgfSkuaW1hZ2VSZXBvc2l0b3J5O1xuICBpZiAoIXJlcG9zaXRvcnkgfHwgIVBMVUdJTl9JTUFHRV9SRVBPU0lUT1JZX1JFLnRlc3QocmVwb3NpdG9yeSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgUGx1Z2luIFwiJHtwbHVnaW4ubmFtZX06JHtwbHVnaW4udmVyc2lvbn1cIiBoYXMgbm8gaW1hZ2UgcmVwb3NpdG9yeSBmcm9tIHRoZSBwbHVnaW4gbG9va3VwLiBgICtcbiAgICAgICdSZXNvbHZlIHBsdWdpbnMgdGhyb3VnaCB0aGUgcGxhdGZvcm0gKGBwaXBlbGluZS1tYW5hZ2VyIHBpcGVsaW5lIHN5bnRoYCAvIHRoZSBsb29rdXAgY3VzdG9tIHJlc291cmNlKS4nLFxuICAgICk7XG4gIH1cblxuICBsZXQgcmVnaXN0cnk7XG4gIHRyeSB7XG4gICAgcmVnaXN0cnkgPSBDb25maWcuZ2V0KCdyZWdpc3RyeScpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBDb25maWcgbmFtZXNwYWNlIG5vdCBsb2FkZWQgKGUuZy4sIHVuaXQgdGVzdHMgd2l0aG91dCBmdWxsIGNvbmZpZykuXG4gICAgbG9nLndhcm4oXG4gICAgICBgUGx1Z2luIFwiJHtwbHVnaW4ubmFtZX06JHtwbHVnaW4udmVyc2lvbn1cIiBuZWVkcyB0aGUgcmVnaXN0cnkgY29uZmlnIGJ1dCBpdCdzIG5vdCBsb2FkZWQg4oCUIGAgK1xuICAgICAgJ0NvZGVCdWlsZCB3aWxsIGZhbGwgYmFjayB0byB0aGUgZGVmYXVsdCBidWlsZCBpbWFnZS4gJyArXG4gICAgICAnU2V0IElNQUdFX1JFR0lTVFJZX0hPU1QgKyBJTUFHRV9SRUdJU1RSWV9QT1JUIGluIHBpcGVsaW5lLW1hbmFnZXJcXCdzIGVudmlyb25tZW50LicsXG4gICAgKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKCFyZWdpc3RyeT8uaG9zdCkge1xuICAgIGxvZy53YXJuKFxuICAgICAgYFBsdWdpbiBcIiR7cGx1Z2luLm5hbWV9OiR7cGx1Z2luLnZlcnNpb259XCIgbmVlZHMgSU1BR0VfUkVHSVNUUllfSE9TVCBidXQgaXQncyBlbXB0eSDigJQgYCArXG4gICAgICAnQ29kZUJ1aWxkIHdpbGwgZmFsbCBiYWNrIHRvIHRoZSBkZWZhdWx0IGJ1aWxkIGltYWdlLiAnICtcbiAgICAgICdTZXQgSU1BR0VfUkVHSVNUUllfSE9TVCBpbiBwaXBlbGluZS1tYW5hZ2VyXFwncyBlbnZpcm9ubWVudCB0byB1c2UgdGhlIHBsdWdpbiBpbWFnZS4nLFxuICAgICk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoIXNjb3BlKSB7XG4gICAgbG9nLndhcm4oYFBsdWdpbiBcIiR7cGx1Z2luLm5hbWV9XCIgaW1hZ2UgcmVzb2x1dGlvbiBza2lwcGVkOiBubyBjb25zdHJ1Y3Qgc2NvcGUgcHJvdmlkZWRgKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8gUGVyLW9yZyBhdXRoIHJlcXVpcmVzIG9yZ0lkIOKAlCB0aGUgU2VjcmV0IGlzIG5hbWVkIHBlciBvcmcuXG4gIGlmICghb3JnSWQpIHtcbiAgICBsb2cud2FybihcbiAgICAgIGBQbHVnaW4gXCIke3BsdWdpbi5uYW1lfVwiIGltYWdlIHJlc29sdXRpb24gc2tpcHBlZDogb3JnSWQgaXMgcmVxdWlyZWQgdG8gYCArXG4gICAgICAncmVzb2x2ZSB0aGUgcGVyLW9yZyBwbGF0Zm9ybSBTZWNyZXQgdXNlZCBmb3IgQ29kZUJ1aWxkIEJhc2ljIGF1dGguJyxcbiAgICApO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyBDb21wb3NlIHRoZSBpbWFnZSBVUkkgZnJvbSB0aGUgbG9va3VwJ3MgcmVwb3NpdG9yeSwgcGlubmVkIGJ5IGRpZ2VzdC5cbiAgLy8gVGhlIHRva2VuIHNlcnZpY2UgZ3JhbnRzIHB1bGwgb24gYHB1YmxpYy8qYCB0byBldmVyeSBhdXRoZW50aWNhdGVkXG4gIC8vIGlkZW50aXR5IGFuZCBvbiBgb3JnLTxpZD4vKmAgdG8gdGhhdCBvcmcgKGFuZCBpdHMgdGVhbXMpLlxuICAvLyBVc2UgdGhlIGV4dGVybmFsIHB1bGwgaG9zdC9wb3J0OiB0aGlzIGltYWdlIFVSSSBpcyBjb25zdW1lZCBieSBBV1NcbiAgLy8gQ29kZUJ1aWxkIChvdXQtb2YtY2x1c3RlciksIHdoaWNoIGNhbid0IHJlc29sdmUgdGhlIGluLWNsdXN0ZXJcbiAgLy8gYHJlZ2lzdHJ5OjUwMDBgIENsdXN0ZXJJUC4gRmFsbCBiYWNrIHRvIGBob3N0YC9gcG9ydGAgZm9yIHNpbmdsZS1ob3N0IC9cbiAgLy8gaW4tY2x1c3Rlci1vbmx5IGRlcGxveXMgd2hlcmUgbm8gc2VwYXJhdGUgcHVsbCBob3N0IGlzIGNvbmZpZ3VyZWQuXG4gIGNvbnN0IHsgaG9zdDogcHVsbEhvc3QsIHBvcnRQYXJ0IH0gPSByZXNvbHZlRXh0ZXJuYWxQdWxsVGFyZ2V0KHJlZ2lzdHJ5KTtcbiAgY29uc3QgaW1hZ2VVcmkgPSBgJHtwdWxsSG9zdH0ke3BvcnRQYXJ0fS8ke3JlcG9zaXRvcnl9QCR7cGx1Z2luLmltYWdlRGlnZXN0fWA7XG5cbiAgLy8gQ29kZUJ1aWxkIHJlYWRzIGBwaXBlbGluZS1idWlsZGVyLzxvcmdJZD4vcmVnaXN0cnktcHVzaGAgYW5kIHNlbmRzIGl0c1xuICAvLyBgdXNlcm5hbWVgL2BwYXNzd29yZGAgZmllbGRzIGFzIEhUVFAgQmFzaWMgdG8gdGhlIHJlZ2lzdHJ5LiBUaGUgcmVnaXN0cnlcbiAgLy8gY2hhbGxlbmdlcyB3aXRoIGEgQmVhcmVyIHJlYWxtIHBvaW50aW5nIGF0IHBpcGVsaW5lLWltYWdlLXJlZ2lzdHJ5J3NcbiAgLy8gYC90b2tlbmAgZW5kcG9pbnQ7IHRoZSBEb2NrZXIgY2xpZW50IGZvcndhcmRzIHRob3NlIGNyZWRzLCBpbWFnZS1yZWdpc3RyeVxuICAvLyBleGNoYW5nZXMgdGhlIG9wYXF1ZSBgcGJfc2Ff4oCmYCBrZXkgZm9yIGEgc2hvcnQtbGl2ZWQgdG9rZW4sIGFuZCBhIHJlZ2lzdHJ5XG4gIC8vIHRva2VuIHNjb3BlZCB0byB0aGUgb3JnIGlzIGlzc3VlZC5cbiAgLy9cbiAgLy8gVGhpcyBpcyB0aGUgUkVHSVNUUlktT05MWSBjcmVkZW50aWFsLCBub3QgdGhlIG9yZydzIGZ1bGwtcHJpdmlsZWdlXG4gIC8vIHBsYXRmb3JtIG9uZTogaXRzIGV4Y2hhbmdlZCB0b2tlbiBjYXJyaWVzIHRoZSBzaW5nbGUgYHJlZ2lzdHJ5OnB1c2hgIHNjb3BlXG4gIC8vIGFuZCBubyBBUEkgcGVybWlzc2lvbnMgYXQgYWxsLCBzbyBhIENvZGVCdWlsZCBqb2IgdGhhdCBsZWFrcyBpdCBjYW4gbW92ZVxuICAvLyBpbWFnZXMgaW5zaWRlIHRoaXMgb3JnJ3MgbmFtZXNwYWNlIGFuZCBub3RoaW5nIGVsc2UuIFRoZSBwbHVnaW4tbG9va3VwXG4gIC8vIExhbWJkYSBrZWVwcyByZWFkaW5nIGAuLi4vcGxhdGZvcm1gIOKAlCBpdCBjYWxscyB0aGUgb3JkaW5hcnkgQVBJLCB3aGljaCBub1xuICAvLyBzaW5nbGUgc2NvcGUgY292ZXJzLlxuICAvLyBQcm92aXNpb24gaXQgd2l0aDogcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbiAtLXNjb3BlIHJlZ2lzdHJ5OnB1c2hcbiAgY29uc3Qgc3RhY2sgPSBTdGFjay5vZihzY29wZSk7XG4gIGNvbnN0IHNlY3JldE5hbWUgPSBDb3JlQ29uc3RhbnRzLnNlY3JldFBhdGgob3JnSWQsIFJFR0lTVFJZX0NSRURFTlRJQUxfU0VDUkVUKTtcbiAgLy8gQ0RLIGNvbnN0cnVjdCBJRHMgYWxsb3cgb25seSBbQS1aYS16MC05Xy1dOyBzYW5pdGl6ZSB0aGUgc2VjcmV0IG5hbWUuXG4gIGNvbnN0IHNlY3JldENvbnN0cnVjdElkID0gYFJlZ2lzdHJ5Q3JlZHNfJHtzZWNyZXROYW1lLnJlcGxhY2UoL1teQS1aYS16MC05Xy1dL2csICdfJyl9YDtcbiAgY29uc3QgY3JlZGVudGlhbHNTZWNyZXQgPSAoc3RhY2subm9kZS50cnlGaW5kQ2hpbGQoc2VjcmV0Q29uc3RydWN0SWQpIGFzIFNlY3JldCB8IHVuZGVmaW5lZClcbiAgICA/PyBTZWNyZXQuZnJvbVNlY3JldE5hbWVWMihzdGFjaywgc2VjcmV0Q29uc3RydWN0SWQsIHNlY3JldE5hbWUpO1xuXG4gIHJldHVybiBMaW51eEJ1aWxkSW1hZ2UuZnJvbURvY2tlclJlZ2lzdHJ5KGltYWdlVXJpLCB7XG4gICAgc2VjcmV0c01hbmFnZXJDcmVkZW50aWFsczogY3JlZGVudGlhbHNTZWNyZXQsXG4gIH0pO1xufVxuXG4vKiogVGhlIG1hbmFnZWQgdG9vbGNoYWluJ3MgYnVpbGQtaW1hZ2UgcGx1Z2luIG5hbWUgYW5kIGl0cyAoc3lzdGVtLW9yZykgaW1hZ2UgcmVwb3NpdG9yeS4gKi9cbmV4cG9ydCBjb25zdCBCT09UU1RSQVBfUExVR0lOX05BTUUgPSAncGlwZWxpbmUtYm9vdHN0cmFwJztcbmV4cG9ydCBjb25zdCBCT09UU1RSQVBfSU1BR0VfUkVQT1NJVE9SWSA9IGBzeXN0ZW0vJHtCT09UU1RSQVBfUExVR0lOX05BTUV9YDtcblxuLyoqXG4gKiBUaGUgZGVmYXVsdCBDb2RlQnVpbGQgaW1hZ2Ug4oCUIGV2ZXJ5IGFjdGlvbiB3aXRob3V0IGEgcGx1Z2luLWJha2VkIGltYWdlICh0aGVcbiAqIHBpcGVsaW5lLXdpZGUgYGNvZGVCdWlsZERlZmF1bHRzYCwgYSBwbHVnaW4tbGVzcyBzdGVwLCBhc3NldCBwdWJsaXNoaW5nKSDigJRcbiAqIHBpbm5lZCB0byB0aGUgcmVzb2x2ZWQgdG9vbGNoYWluIHJlbGVhc2UncyBgcGlwZWxpbmUtYm9vdHN0cmFwYCBpbWFnZS5cbiAqXG4gKiBFeGFjdGx5IHRoZSBwYXRoIGEgc3lzdGVtIHBsdWdpbidzIGltYWdlIHRha2VzICh7QGxpbmsgcmVzb2x2ZVBsdWdpbkltYWdlfSk6XG4gKiBgPGV4dGVybmFsIHB1bGwgaG9zdD4vc3lzdGVtL3BpcGVsaW5lLWJvb3RzdHJhcEA8c2lnbmVkIGRpZ2VzdD5gIHdpdGggdGhlXG4gKiBvcmcncyBgcmVnaXN0cnktcHVzaGAgc2VjcmV0IGFzIHRoZSBwdWxsIGNyZWRlbnRpYWwuIFRoZXJlIGlzIG5vIGVudi1kcml2ZW5cbiAqIGltYWdlLCBubyB0YWcgcHVsbCBhbmQgbm8gY3VyYXRlZCBmYWxsYmFjazogdGhlIGJvb3RzdHJhcCBpcyByZXNvbHZlZCBmcm9tXG4gKiB0aGUgcGxhdGZvcm0gKGBwaXBlbGluZS1tYW5hZ2VyYCdzIGByZXNvbHZlQm9vdHN0cmFwSW1hZ2VgLCBEMikgYW5kIGFueXRoaW5nXG4gKiBzaG9ydCBvZiBhIHBpbm5lZCwgcHVsbGFibGUgaW1hZ2UgZmFpbHMgdGhlIHN5bnRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURlZmF1bHRCdWlsZEltYWdlKHNjb3BlOiBDb25zdHJ1Y3QsIG9yZ0lkOiBzdHJpbmcgfCB1bmRlZmluZWQsIGJvb3RzdHJhcDogUGx1Z2luKTogSUJ1aWxkSW1hZ2Uge1xuICBjb25zdCBmYWlsID0gKHdoeTogc3RyaW5nKTogbmV2ZXIgPT4ge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBCT09UU1RSQVBfSU1BR0VfVU5SRVNPTFZFRDogdGhlIGRlZmF1bHQgYnVpbGQgaW1hZ2UgY2FuJ3QgYmUgcGlubmVkIOKAlCAke3doeX0uIGAgK1xuICAgICAgJ1N5bnRoZXNpemUgdGhyb3VnaCBgcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSBzeW50aC9kZXBsb3lgIChvciBwYXNzIGAtLXRvb2xjaGFpbi1maWxlYCB3aXRoIGAtLWxvY2FsLXNwZWNgKS4nLFxuICAgICk7XG4gIH07XG4gIGlmICghYm9vdHN0cmFwIHx8IGJvb3RzdHJhcC5uYW1lICE9PSBCT09UU1RSQVBfUExVR0lOX05BTUUpIHtcbiAgICBmYWlsKGByZXNvbHZlZEJvb3RzdHJhcCBpcyBcIiR7Ym9vdHN0cmFwPy5uYW1lID8/ICdtaXNzaW5nJ31cIiwgbm90ICR7Qk9PVFNUUkFQX1BMVUdJTl9OQU1FfWApO1xuICB9XG4gIGNvbnN0IHJlcG9zaXRvcnkgPSAoYm9vdHN0cmFwIGFzIFBsdWdpbiAmIHsgaW1hZ2VSZXBvc2l0b3J5Pzogc3RyaW5nIHwgbnVsbCB9KS5pbWFnZVJlcG9zaXRvcnk7XG4gIGlmIChyZXBvc2l0b3J5ICE9PSBCT09UU1RSQVBfSU1BR0VfUkVQT1NJVE9SWSkge1xuICAgIGZhaWwoYCR7Qk9PVFNUUkFQX1BMVUdJTl9OQU1FfToke2Jvb3RzdHJhcC52ZXJzaW9ufSBoYXMgaW1hZ2UgcmVwb3NpdG9yeSBcIiR7cmVwb3NpdG9yeSA/PyAnbm9uZSd9XCIsIG5vdCAke0JPT1RTVFJBUF9JTUFHRV9SRVBPU0lUT1JZfWApO1xuICB9XG4gIGlmICghb3JnSWQpIGZhaWwoJ3RoZSBwaXBlbGluZSBoYXMgbm8gb3JnSWQgKHRoZSByZWdpc3RyeSBwdWxsIGNyZWRlbnRpYWwgaXMgcGVyIG9yZyknKTtcbiAgLy8gVGhyb3dzIG9uIGEgbWlzc2luZy9tYWxmb3JtZWQgZGlnZXN0IGFuZCBhbiB1bnJlYWNoYWJsZSBwdWxsIGhvc3QuXG4gIGNvbnN0IGltYWdlID0gcmVzb2x2ZVBsdWdpbkltYWdlKHNjb3BlLCB7IC4uLmJvb3RzdHJhcCwgYnVpbGRUeXBlOiAncHJlYnVpbHQnIH0sIG9yZ0lkKTtcbiAgaWYgKCFpbWFnZSkgZmFpbCgndGhlIHJlZ2lzdHJ5IGNvbmZpZyBpcyBub3QgbG9hZGVkIChJTUFHRV9SRUdJU1RSWV9IT1NUIC8gdGhlIHBsYXRmb3JtIFVSTCknKTtcbiAgcmV0dXJuIGltYWdlIGFzIElCdWlsZEltYWdlO1xufVxuXG4vKipcbiAqIFRoZSBBV1MgY3VyYXRlZCBpbWFnZSBzZWxmLW11dGF0aW9uIHJ1bnMgb24gKEQxMCk6IGl0IG9ubHkgbmVlZHMgTm9kZSBhbmQgdGhlXG4gKiBwaW5uZWQgQ0RLIENMSSwgYW5kIGEgY3VyYXRlZCBpbWFnZSBrZWVwcyBhIGRlZmVjdGl2ZSB0b29sY2hhaW4gcmVsZWFzZVxuICogcmVjb3ZlcmFibGUuIEN1cmF0ZWQg4oeSIGBmcm9tQ29kZUJ1aWxkSW1hZ2VJZGAgKENPREVCVUlMRCBwdWxsIGNyZWRlbnRpYWxzIOKAlFxuICogYGZyb21Eb2NrZXJSZWdpc3RyeWAgd291bGQgc2V0IFNFUlZJQ0VfUk9MRSwgd2hpY2ggQ0ZOIHJlamVjdHMgZm9yIGEgY3VyYXRlZCBpbWFnZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBjdXJhdGVkU2VsZk11dGF0aW9uSW1hZ2UgPSAoKTogSUJ1aWxkSW1hZ2UgPT4gTGludXhCdWlsZEltYWdlLmZyb21Db2RlQnVpbGRJbWFnZUlkKENVUkFURURfU0VMRl9NVVRBVElPTl9JTUFHRSk7XG5cbi8qKlxuICogQ3JlYXRlIGEgQ29kZUJ1aWxkIHN0ZXAgb3IgU2hlbGwgc3RlcCBiYXNlZCBvbiBwbHVnaW4gY29uZmlndXJhdGlvbi5cbiAqXG4gKiBNZXRhZGF0YSBtZXJnZSBvcmRlciAobGFzdCB3aW5zKTpcbiAqICAgMS4gUGx1Z2luIG1ldGFkYXRhIChmcm9tIHBsdWdpbi5tZXRhZGF0YSBpbiBkYXRhYmFzZSkg4oCUIHRoZSBwbHVnaW5cbiAqICAgICAgYXV0aG9yJ3MgYmFrZWQtaW4gZGVmYXVsdHNcbiAqICAgMi4gU3RlcC1sZXZlbCBtZXRhZGF0YSAoZnJvbSBvcHRpb25zLm1ldGFkYXRhKSDigJQgdGhlIHBpcGVsaW5lIGF1dGhvcidzXG4gKiAgICAgIHBlci1zdGVwIG92ZXJyaWRlcywgd2hpY2ggYXJlIG1vcmUgc3BlY2lmaWMgYW5kIG11c3Qgd2luXG4gKlxuICogRW52aXJvbm1lbnQgbWVyZ2Ugb3JkZXIgKGxhc3Qgd2lucyk6XG4gKiAgIDEuIFBsdWdpbiBlbnYgdmFycyAoZnJvbSBwbHVnaW4uZW52KVxuICogICAyLiBDdXN0b20gZW52IHZhcnMgKGZyb20gb3B0aW9ucy5lbnYpXG4gKiAgIDMuIFdPUktESVIgZnJvbSBtZXJnZWQgbWV0YWRhdGFcbiAqXG4gKiBDREsgcHJvcCBzcHJlYWQgb3JkZXIgKGxhc3Qgd2lucyk6XG4gKiAgIHByb2dyYW1tYXRpYyBkZWZhdWx0cyAoaW5wdXQsIGNvbW1hbmRzLCBlbnYsIG5ldHdvcmspIOKGkiBtZXRhZGF0YSBvdmVycmlkZXNcbiAqXG4gKiBUaGlzIG1lYW5zIG1ldGFkYXRhIGtleXMgbGlrZSBgYXdzOmNkazpwaXBlbGluZXM6Y29kZWJ1aWxkc3RlcDpjb21tYW5kc2BcbiAqIHdpbGwgb3ZlcnJpZGUgdGhlIHBsdWdpbi1kZXJpdmVkIGNvbW1hbmRzIHdoZW4gZXhwbGljaXRseSBzZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb2RlQnVpbGRTdGVwKG9wdGlvbnM6IENvZGVCdWlsZFN0ZXBPcHRpb25zKTogU2hlbGxTdGVwIHwgQ29kZUJ1aWxkU3RlcCB8IE1hbnVhbEFwcHJvdmFsU3RlcCB7XG4gIGNvbnN0IHtcbiAgICBpZCwgaW5wdXQsIG1ldGFkYXRhLCBuZXR3b3JrLCBzY29wZSxcbiAgICBwcmVJbnN0YWxsQ29tbWFuZHMsIHBvc3RJbnN0YWxsQ29tbWFuZHMsIHByZUNvbW1hbmRzLCBwb3N0Q29tbWFuZHMsXG4gICAgZW52OiBjdXN0b21FbnYsIGFkZGl0aW9uYWxJbnB1dHMsIHRpbWVvdXQsIGZhaWx1cmVCZWhhdmlvcixcbiAgICBhcnRpZmFjdE1hbmFnZXIsIHN0YWdlTmFtZSwgc3RhZ2VBbGlhcywgcGx1Z2luQWxpYXMsIG9yZ0lkLCBwaXBlbGluZVNjb3BlLFxuICB9ID0gb3B0aW9ucztcblxuICAvLyBSZXNvbHZlIHt7IC4uLiB9fSB0ZW1wbGF0ZXMgaW4gcGx1Z2luIHNwZWMgZmllbGRzIGFnYWluc3QgdGhlIHBpcGVsaW5lIHNjb3BlLlxuICAvLyBFdmVyeSBjYWxsIGdvZXMgdGhyb3VnaCB0aGUgcmVzb2x2ZXIg4oCUIHBsdWdpbnMgd2l0aG91dCB0ZW1wbGF0ZSB0b2tlbnMgYXJlXG4gIC8vIGEgbm8tb3AgZmFzdCBwYXRoIGluc2lkZSByZXNvbHZlUGx1Z2luVGVtcGxhdGVzKCkuXG4gIGNvbnN0IHBsdWdpbiA9IHJlc29sdmVQbHVnaW5UZW1wbGF0ZXMob3B0aW9ucy5wbHVnaW4sIHBpcGVsaW5lU2NvcGUpO1xuXG4gIC8vIFBlci1zdGVwIG1ldGFkYXRhICh0aGUgcGlwZWxpbmUgYXV0aG9yJ3Mgb3ZlcnJpZGVzLCBlLmcuIEpBVkFfVkVSU0lPTj0yNSlcbiAgLy8gbXVzdCB3aW4gb3ZlciB0aGUgcGx1Z2luJ3MgY2F0YWxvZyBgbWV0YWRhdGFgIGRlZmF1bHRzLCBzbyBpdCBnb2VzIExBU1QuXG4gIC8vIFJldmVyc2luZyB0aGVzZSBzaWxlbnRseSBkcm9wcGVkIHBlci1zdGVwIG92ZXJyaWRlcyBmb3IgYW55IHBsdWdpbiB0aGF0XG4gIC8vIHNoaXBzIG5vbi1lbXB0eSBjYXRhbG9nIG1ldGFkYXRhIChwbHVnaW5zIHRoYXQgY2FycnkgZGVmYXVsdHMgdW5kZXIgYGVudmBcbiAgLy8gaW5zdGVhZCDigJQgbGlrZSBqYXZhLWNvcnJldHRvIOKAlCB3ZXJlIHVuYWZmZWN0ZWQsIHdoaWNoIG1hc2tlZCB0aGlzKS5cbiAgY29uc3QgbWVyZ2VkID0gbWVyZ2UocGx1Z2luLm1ldGFkYXRhID8/IHt9LCBtZXRhZGF0YSA/PyB7fSk7XG5cbiAgLy8gTWFudWFsQXBwcm92YWxTdGVwOiBubyBjb21tYW5kcywgZW52LCBjb21wdXRlLCBvciBuZXR3b3JrIOKAlCBqdXN0IGlkICsgb3B0aW9uYWwgY29tbWVudFxuICBpZiAocGx1Z2luLnBsdWdpblR5cGUgPT09IFBsdWdpblR5cGUuTUFOVUFMX0FQUFJPVkFMX1NURVApIHtcbiAgICByZXR1cm4gbmV3IE1hbnVhbEFwcHJvdmFsU3RlcChpZCwge1xuICAgICAgY29tbWVudDogdHlwZW9mIG1lcmdlZC5BUFBST1ZBTF9DT01NRU5UID09PSAnc3RyaW5nJyA/IG1lcmdlZC5BUFBST1ZBTF9DT01NRU5UIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICB9XG5cbiAgbG9nLmRlYnVnKCdbQ3JlYXRlQ29kZUJ1aWxkU3RlcF0gQnVpbGRpbmcgc3RlcCB3aXRoIG1lcmdlZCBtZXRhZGF0YScpO1xuXG4gIC8vIFdhcm4gYWJvdXQgcmVxdWlyZWQgc2VjcmV0cyB3aXRob3V0IG9yZ0lkIChjYW4ndCByZXNvbHZlKVxuICBjb25zdCByZXF1aXJlZFNlY3JldHMgPSBwbHVnaW4uc2VjcmV0cz8uZmlsdGVyKHMgPT4gcy5yZXF1aXJlZCkgPz8gW107XG4gIGlmIChyZXF1aXJlZFNlY3JldHMubGVuZ3RoID4gMCAmJiAhb3JnSWQpIHtcbiAgICBsb2cud2FybihcbiAgICAgIGBQbHVnaW4gXCIke3BsdWdpbi5uYW1lfVwiIGRlY2xhcmVzICR7cmVxdWlyZWRTZWNyZXRzLmxlbmd0aH0gcmVxdWlyZWQgc2VjcmV0KHMpIGJ1dCBubyBvcmdJZCBpcyBhdmFpbGFibGUuIGAgK1xuICAgICAgYFNlY3JldHMgd2lsbCBub3QgYmUgaW5qZWN0ZWQ6ICR7cmVxdWlyZWRTZWNyZXRzLm1hcChzID0+IHMubmFtZSkuam9pbignLCAnKX1gLFxuICAgICk7XG4gIH1cblxuICAvLyBSZXNvbHZlIHBsdWdpbiBzZWNyZXRzIGFzIFNFQ1JFVFNfTUFOQUdFUiBlbnYgdmFycyDigJQgb25seSBSRVFVSVJFRCBvbmVzLlxuICAvLyBDb2RlQnVpbGQgdHJlYXRzIGEgU0VDUkVUU19NQU5BR0VSIGVudiB2YXIgYXMgTUFOREFUT1JZOiBpdCBmYWlscyB0aGUgYnVpbGRcbiAgLy8gYXQgRE9XTkxPQURfU09VUkNFIChcIlJlc291cmNlTm90Rm91bmRFeGNlcHRpb246IGNhbid0IGZpbmQgdGhlIHNwZWNpZmllZFxuICAvLyBzZWNyZXRcIikgaWYgdGhlIHNlY3JldCBpcyBhYnNlbnQuIEF1dG8td2lyaW5nIGFuIE9QVElPTkFMIHNlY3JldFxuICAvLyAoYHJlcXVpcmVkOiBmYWxzZWAsIGUuZy4gTlZEX0FQSV9LRVkgLyBTRU1HUkVQX0FQUF9UT0tFTikgdGhlIG9wZXJhdG9yIGhhc24ndFxuICAvLyBjcmVhdGVkIHdvdWxkIHRoZXJlZm9yZSBicmVhayBldmVyeSBidWlsZCDigJQgdGhlIGV4YWN0IG9wcG9zaXRlIG9mIFwib3B0aW9uYWxcIi5cbiAgLy8gT3B0aW9uYWwgc2VjcmV0cyBhcmUgbGVmdCBmb3IgdGhlIHBsdWdpbiB0byByZWFkIG9ubHkgd2hlcmUgdGhlIG9wZXJhdG9yIGhhc1xuICAvLyBwcm92aXNpb25lZCB0aGVtIChvdXQtb2YtYmFuZCBlbnYvc2VjcmV0KSwgbm90IGZvcmNlLWluamVjdGVkIGhlcmUuXG4gIGNvbnN0IHNlY3JldEVudlZhcnMgPSAocmVxdWlyZWRTZWNyZXRzLmxlbmd0aCAmJiBvcmdJZClcbiAgICA/IHRvU2VjcmV0RW52VmFycyhyZXF1aXJlZFNlY3JldHMsIG9yZ0lkKVxuICAgIDoge307XG5cbiAgY29uc3QgZW52ID0gYnVpbGRFbnYocGx1Z2luLCBtZXJnZWQsIGN1c3RvbUVudik7XG5cbiAgLy8gU2VjdXJpdHktcmVwb3J0IHVwbG9hZCAob3B0LWluKTogaW5qZWN0IHRoZSBvcmcncyByZXBvcnRpbmc6aW5nZXN0LXNjb3BlZFxuICAvLyBrZXkg4oCUIG5ldmVyIHRoZSBmdWxsIHBsYXRmb3JtIGNyZWRlbnRpYWwg4oCUIGFzIGEgU0VDUkVUU19NQU5BR0VSIHZhcmlhYmxlLlxuICAvLyBDREsgZ3JhbnRzIHRoZSBzdGVwIHJvbGUgcmVhZCBvbiBleGFjdGx5IHRoYXQgc2VjcmV0LiBTZWUgY29yZS9zZWN1cml0eS1yZXBvcnRzLnRzLlxuICBjb25zdCByZXBvcnRVcGxvYWQgPSBlbnZbU0VDVVJJVFlfUkVQT1JUX1VQTE9BRF9FTlZdID09PSAndHJ1ZSc7XG4gIGlmIChyZXBvcnRVcGxvYWQgJiYgIW9yZ0lkKSB7XG4gICAgbG9nLndhcm4oYFN0ZXAgXCIke2lkfVwiIHNldHMgJHtTRUNVUklUWV9SRVBPUlRfVVBMT0FEX0VOVn09dHJ1ZSBidXQgbm8gb3JnSWQgaXMgYXZhaWxhYmxlIOKAlCB0aGUgdXBsb2FkIGtleSBjYW5ub3QgYmUgaW5qZWN0ZWQgYW5kIHRoZSB1cGxvYWQgd2lsbCBmYWlsLmApO1xuICB9XG4gIGNvbnN0IHJlcG9ydEtleUVudlZhcjogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogc3RyaW5nOyB0eXBlOiBCdWlsZEVudmlyb25tZW50VmFyaWFibGVUeXBlIH0+ID0gcmVwb3J0VXBsb2FkICYmIG9yZ0lkXG4gICAgPyB7XG4gICAgICBbU0VDVVJJVFlfUkVQT1JUX0tFWV9FTlZdOiB7XG4gICAgICAgIHZhbHVlOiBgJHtDb3JlQ29uc3RhbnRzLnNlY3JldFBhdGgob3JnSWQsIFNFQ1VSSVRZX1JFUE9SVF9TRUNSRVRfTEVBRil9OnBhc3N3b3JkYCxcbiAgICAgICAgdHlwZTogQnVpbGRFbnZpcm9ubWVudFZhcmlhYmxlVHlwZS5TRUNSRVRTX01BTkFHRVIsXG4gICAgICB9LFxuICAgIH1cbiAgICA6IHt9O1xuXG4gIC8vIENvZGVQaXBlbGluZSByZXNvbHZlZCB2YXJpYWJsZXMg4oCUIG11c3QgYmUgaW4gQ29kZUJ1aWxkU3RlcC5lbnYgKGFjdGlvbi1sZXZlbCksXG4gIC8vIG5vdCBidWlsZEVudmlyb25tZW50LmVudmlyb25tZW50VmFyaWFibGVzIChwcm9qZWN0LWxldmVsKVxuICBjb25zdCBhY3Rpb25FbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgUElQRUxJTkVfRVhFQ1VUSU9OX0lEOiAnI3tjb2RlcGlwZWxpbmUuUGlwZWxpbmVFeGVjdXRpb25JZH0nLFxuICB9O1xuXG4gIGNvbnN0IG91dHB1dERpciA9IHBsdWdpbi5wcmltYXJ5T3V0cHV0RGlyZWN0b3J5O1xuICBjb25zdCBlbnN1cmVPdXRwdXREaXIgPSAob3V0cHV0RGlyICYmICFvdXRwdXREaXIuaW5jbHVkZXMoJyonKSlcbiAgICA/IFtgbWtkaXIgLXAgXCIke291dHB1dERpcn1cIiAmJiB0b3VjaCBcIiR7b3V0cHV0RGlyfS8uZ2l0a2VlcFwiYF1cbiAgICA6IFtdO1xuXG4gIGNvbnN0IHsgaW5zdGFsbENvbW1hbmRzLCBjb21tYW5kcyB9ID0gYnVpbGRDb21tYW5kcyhwbHVnaW4sIHtcbiAgICBwcmVJbnN0YWxsQ29tbWFuZHM6IFsuLi5lbnN1cmVPdXRwdXREaXIsIC4uLihwcmVJbnN0YWxsQ29tbWFuZHMgPz8gW10pXSxcbiAgICBwb3N0SW5zdGFsbENvbW1hbmRzLFxuICAgIHByZUNvbW1hbmRzLFxuICAgIHBvc3RDb21tYW5kcyxcbiAgfSwgZmFpbHVyZUJlaGF2aW9yKTtcblxuICBjb25zdCBwcm9ncmFtbWF0aWMgPSB7IGlucHV0LCBpbnN0YWxsQ29tbWFuZHMsIGNvbW1hbmRzIH07XG5cbiAgLy8gUmVzb2x2ZSB0aGUgcGx1Z2luJ3MgcnVudGltZSBpbWFnZS4gQSBzdGVwIHdpdGggbm8gYGJ1aWxkSW1hZ2VgIHJ1bnMgb25cbiAgLy8gdGhlIHBpcGVsaW5lJ3MgZGVmYXVsdCBpbWFnZSAodGhlIHRvb2xjaGFpbiByZWxlYXNlJ3MgcGlwZWxpbmUtYm9vdHN0cmFwLFxuICAvLyB2aWEgYGNvZGVCdWlsZERlZmF1bHRzYCksIHdoaWNoIGNhcnJpZXMgcGlwZWxpbmUtbWFuYWdlciBhbmQgdGhlIENESyBDTElcbiAgLy8gYnV0IE5PTkUgb2YgYSBwbHVnaW4ncyBiYWtlZCB0b29scyAoc255aywgdGVycmFmb3JtLCBldGMuKS4gV2lyaW5nIHRoZSBwbHVnaW4ncyBpbWFnZVxuICAvLyBoZXJlIG1lYW5zIENvZGVCdWlsZCBwdWxscyBmcm9tIG91ciBwcml2YXRlIHJlZ2lzdHJ5IGFuZCB0aGUgdG9vbHNcbiAgLy8gaW5zdGFsbGVkIGluIHRoZSBwbHVnaW4ncyBEb2NrZXJmaWxlIGFyZSBhY3R1YWxseSBhdmFpbGFibGUuXG4gIGNvbnN0IHBsdWdpbkJ1aWxkSW1hZ2UgPSByZXNvbHZlUGx1Z2luSW1hZ2Uoc2NvcGUsIHBsdWdpbiwgb3JnSWQpO1xuXG4gIC8vIFNoZWxsU3RlcCBicmFuY2guXG4gIC8vIFNoZWxsU3RlcCBpdHNlbGYgZG9lc24ndCBhY2NlcHQgYGJ1aWxkRW52aXJvbm1lbnRgL2BidWlsZEltYWdlYC4gQ0RLXG4gIC8vIHBpcGVsaW5lcyB3cmFwcyBTaGVsbFN0ZXBzIGluIGEgZGVmYXVsdCBDb2RlQnVpbGQgYWN0aW9uIHRoYXQgcnVucyBvblxuICAvLyB0aGUgcGlwZWxpbmUncyBkZWZhdWx0IGltYWdlIChwaXBlbGluZS1ib290c3RyYXApIOKAlCB3aGljaCB3b24ndCBoYXZlIHRoZVxuICAvLyBwbHVnaW4ncyB0b29scy5cbiAgLy9cbiAgLy8gU28gd2hlbiBhIFNIRUxMX1NURVAgcGx1Z2luIERPRVMgaGF2ZSBhbiBpbWFnZSAoYmVjYXVzZSBpdHMgYXV0aG9yXG4gIC8vIGJha2VkIHRvb2xzIGludG8gYSBEb2NrZXJmaWxlKSwgd2UgUFJPTU9URSBpdCB0byBhIENvZGVCdWlsZFN0ZXAgd2l0aFxuICAvLyB0aGUgcmVzb2x2ZWQgaW1hZ2UuIFRoZSBwbHVnaW4gYXV0aG9yJ3MgaW50ZW50IChcInVzZSBteSBiYWtlZCB0b29sc1wiKVxuICAvLyBpcyBwcmVzZXJ2ZWQgd2l0aG91dCBmb3JjaW5nIHRoZW0gdG8gY2hhbmdlIHBsdWdpblR5cGUuXG4gIC8vXG4gIC8vIFdoZW4gdGhlIHBsdWdpbiBoYXMgbm8gaW1hZ2UgKG9yIHJlZ2lzdHJ5IGlzbid0IGNvbmZpZ3VyZWQpLCB3ZSBrZWVwXG4gIC8vIHRoZSBvcmlnaW5hbCBTaGVsbFN0ZXAg4oCUIGl0J3MgbGlnaHRlciB3ZWlnaHQgYW5kIHRoZSBkZWZhdWx0XG4gIC8vIENvZGVCdWlsZCBpbWFnZSBpcyBmaW5lLlxuICBpZiAocGx1Z2luLnBsdWdpblR5cGUgPT09IFBsdWdpblR5cGUuU0hFTExfU1RFUCkge1xuICAgIGlmICghcGx1Z2luQnVpbGRJbWFnZSkge1xuICAgICAgcmV0dXJuIG5ldyBTaGVsbFN0ZXAoaWQsIHtcbiAgICAgICAgLi4ucHJvZ3JhbW1hdGljLFxuICAgICAgICBlbnY6IHsgLi4uZW52LCAuLi5hY3Rpb25FbnYgfSxcbiAgICAgICAgLi4ubWV0YWRhdGFGb3JTaGVsbFN0ZXAobWVyZ2VkKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYFtDcmVhdGVDb2RlQnVpbGRTdGVwXSBTSEVMTF9TVEVQIHBsdWdpbiBcIiR7cGx1Z2luLm5hbWV9XCIgaGFzIGEgcmVnaXN0cnkgaW1hZ2Ug4oCUIHByb21vdGluZyB0byBDb2RlQnVpbGRTdGVwIHNvIHRoZSBwbHVnaW4gaW1hZ2UgaXMgYWN0dWFsbHkgdXNlZGApO1xuICAgIC8vIEZhbGwgdGhyb3VnaCB0byB0aGUgQ29kZUJ1aWxkU3RlcCBwYXRoIGJlbG93LlxuICB9XG5cbiAgY29uc3QgY29tcHV0ZVR5cGUgPSBnZXRDb21wdXRlVHlwZShcbiAgICBwbHVnaW4uY29tcHV0ZVR5cGUgPz8gb3B0aW9ucy5kZWZhdWx0Q29tcHV0ZVR5cGUgPz8gJ1NNQUxMJyxcbiAgKTtcblxuICAvLyBTdGVwIG5ldHdvcms6IGV4cGxpY2l0IHN0ZXAgY29uZmlnIHdpbnMsIGVsc2UgdGhpcyBzdGVwJ3MgYGVjMjpuZXR3b3JrYCBtZXRhZGF0YS5cbiAgY29uc3QgcmVzb2x2ZWROZXR3b3JrID0gbmV0d29yayA/PyBuZXR3b3JrQ29uZmlnRnJvbU1ldGFkYXRhKG1lcmdlZCk7XG4gIGNvbnN0IG5ldHdvcmtQcm9wcyA9IHJlc29sdmVkTmV0d29ya1xuICAgID8gcmVzb2x2ZU5ldHdvcmsoc2NvcGUsIG9wdGlvbnMudW5pcXVlSWQsIHJlc29sdmVkTmV0d29yaylcbiAgICA6IHt9O1xuXG4gIC8vIE1ldGFkYXRhIHNwcmVhZCBsYXN0IHNvIGl0IGNhbiBvdmVycmlkZSBwcm9ncmFtbWF0aWMgZGVmYXVsdHMuXG4gIC8vIE5PVEU6IENhY2hpbmcgaXMgc3VwcG9ydGVkIHZpYSB0d28gbWV0YWRhdGEgcGF0aHM6XG4gIC8vICAgMS4gTWV0YWRhdGFLZXlzLkNBQ0hFICgnYXdzOmNkazpwaXBlbGluZXM6Y29kZWJ1aWxkc3RlcDpjYWNoZScpIOKAlCBwYXNzZWQgZGlyZWN0bHlcbiAgLy8gICAgICBhcyB0aGUgQ29kZUJ1aWxkU3RlcCBgY2FjaGVgIHByb3AgKGV4cGVjdHMgYSBjb2RlYnVpbGQuQ2FjaGUgb2JqZWN0KS5cbiAgLy8gICAyLiBNZXRhZGF0YUtleXMuUEFSVElBTF9CVUlMRF9TUEVDICgnYXdzOmNkazpwaXBlbGluZXM6Y29kZWJ1aWxkc3RlcDpwYXJ0aWFsYnVpbGRzcGVjJylcbiAgLy8gICAgICDigJQgcGFzc2VkIGFzIGBwYXJ0aWFsQnVpbGRTcGVjYCwgd2hpY2ggY2FuIGluY2x1ZGUgYSBgY2FjaGU6YCBzZWN0aW9uIGZvclxuICAvLyAgICAgIFMzIG9yIGxvY2FsIGNhY2hpbmcgKGUuZy4sIEJ1aWxkU3BlYy5mcm9tT2JqZWN0KHsgY2FjaGU6IHsgcGF0aHM6IFsuLi5dIH0gfSkpLlxuICAvLyBQZXItc3RlcCBidWlsZEVudmlyb25tZW50IG92ZXJyaWRlcyBmcm9tIG1ldGFkYXRhIChhd3M6Y2RrOmNvZGVidWlsZDpidWlsZGVudmlyb25tZW50OiopLlxuICAvLyBBIG1ldGFkYXRhLXByb3ZpZGVkIGNvbXB1dGVUeXBlIGlzIGEgcmF3IHBhc3N0aHJvdWdoLCBzbyBub3JtYWxpemUgaXQgdGhyb3VnaFxuICAvLyBnZXRDb21wdXRlVHlwZSDigJQgb3RoZXJ3aXNlIGEgZnJpZW5kbHkgdmFsdWUgbGlrZSBcIkxBUkdFXCIgcmVhY2hlcyBDb2RlQnVpbGQgdmVyYmF0aW1cbiAgLy8gYW5kIGZhaWxzIHdpdGggXCJJbnZhbGlkIGNvbXB1dGUgdHlwZSBwcm92aWRlZFwiIChpdCBuZWVkcyBCVUlMRF9HRU5FUkFMMV9MQVJHRSkuXG4gIGNvbnN0IHJhd01ldGFCdWlsZEVudiA9IG1ldGFkYXRhRm9yQnVpbGRFbnZpcm9ubWVudChtZXJnZWQpO1xuICBjb25zdCBtZXRhQnVpbGRFbnYgPSB0eXBlb2YgcmF3TWV0YUJ1aWxkRW52LmNvbXB1dGVUeXBlID09PSAnc3RyaW5nJ1xuICAgID8geyAuLi5yYXdNZXRhQnVpbGRFbnYsIGNvbXB1dGVUeXBlOiBnZXRDb21wdXRlVHlwZShyYXdNZXRhQnVpbGRFbnYuY29tcHV0ZVR5cGUpIH1cbiAgICA6IHJhd01ldGFCdWlsZEVudjtcblxuICBjb25zdCBzdGVwID0gbmV3IENvZGVCdWlsZFN0ZXAoaWQsIHtcbiAgICAuLi5wcm9ncmFtbWF0aWMsXG4gICAgLi4ubmV0d29ya1Byb3BzLFxuICAgIC4uLihhZGRpdGlvbmFsSW5wdXRzICYmIHsgYWRkaXRpb25hbElucHV0cyB9KSxcbiAgICAuLi4odGltZW91dCAmJiB7IHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXModGltZW91dCkgfSksXG4gICAgZW52OiBhY3Rpb25FbnYsXG4gICAgcHJpbWFyeU91dHB1dERpcmVjdG9yeTogcGx1Z2luLnByaW1hcnlPdXRwdXREaXJlY3RvcnkgPz8gdW5kZWZpbmVkLFxuICAgIC8vIFBpbiB0aGUgYnVpbGRzcGVjIHNoZWxsIHRvIFBPU0lYIC9iaW4vc2ggc28gZXhlY3V0aW9uIGlzIGlkZW50aWNhbCB0b1xuICAgIC8vIENvZGVCdWlsZCdzIGRlZmF1bHQgYW5kIHBvcnRhYmxlIGFjcm9zcyBtaW5pbWFsIGJhc2UgaW1hZ2VzIChubyBiYXNoXG4gICAgLy8gZGVwZW5kZW5jeSkuIFBsdWdpbiBzcGVjcyBhcmUgYXV0aG9yZWQgUE9TSVgtY2xlYW4gdG8gbWF0Y2gg4oCUIG5vIGJhc2gtb25seVxuICAgIC8vIGBbWyBdXWAsIGFycmF5cywgYHJlYWQgLXJhIDw8PGAsIG9yIGBzb3VyY2VgL2Budm0gdXNlYC9gc2RrIHVzZWAuIEFcbiAgICAvLyBwbHVnaW4tc3VwcGxpZWQgcGFydGlhbEJ1aWxkU3BlYyAobm9uZSB0b2RheSkgd291bGQgb3ZlcnJpZGUgdGhpcyB2aWEgdGhlXG4gICAgLy8gbWV0YWRhdGEgc3ByZWFkIGJlbG93IGFuZCBtdXN0IHRoZW4gc2V0IGBlbnYuc2hlbGxgIGl0c2VsZi5cbiAgICBwYXJ0aWFsQnVpbGRTcGVjOiBCdWlsZFNwZWMuZnJvbU9iamVjdCh7IGVudjogeyBzaGVsbDogJy9iaW4vc2gnIH0gfSksXG4gICAgYnVpbGRFbnZpcm9ubWVudDoge1xuICAgICAgY29tcHV0ZVR5cGUsXG4gICAgICBidWlsZEltYWdlOiBwbHVnaW5CdWlsZEltYWdlID8/IGRlZmF1bHRCdWlsZEltYWdlT3JUaHJvdyhvcHRpb25zKSxcbiAgICAgIGVudmlyb25tZW50VmFyaWFibGVzOiB7XG4gICAgICAgIC4uLnRvQ29kZUJ1aWxkRW52VmFycyhlbnYpLFxuICAgICAgICAuLi5zZWNyZXRFbnZWYXJzLFxuICAgICAgICAuLi5yZXBvcnRLZXlFbnZWYXIsXG4gICAgICB9LFxuICAgICAgLi4ubWV0YUJ1aWxkRW52LFxuICAgIH0sXG4gICAgLi4ubWV0YWRhdGFGb3JDb2RlQnVpbGRTdGVwKG1lcmdlZCksXG4gIH0pO1xuXG4gIC8vIFJlZ2lzdGVyIHdpdGggYXJ0aWZhY3QgbWFuYWdlciBpZiBwcmltYXJ5T3V0cHV0RGlyZWN0b3J5IGlzIHNldFxuICBpZiAocGx1Z2luLnByaW1hcnlPdXRwdXREaXJlY3RvcnkgJiYgYXJ0aWZhY3RNYW5hZ2VyICYmIHN0YWdlTmFtZSkge1xuICAgIGNvbnN0IGFydGlmYWN0S2V5OiBBcnRpZmFjdEtleSA9IHtcbiAgICAgIHN0YWdlTmFtZSxcbiAgICAgIHN0YWdlQWxpYXM6IHN0YWdlQWxpYXMgPz8gYCR7c3RhZ2VOYW1lfS1hbGlhc2AsXG4gICAgICBwbHVnaW5OYW1lOiBwbHVnaW4ubmFtZSxcbiAgICAgIHBsdWdpbkFsaWFzOiBwbHVnaW5BbGlhcyA/PyBwbHVnaW5BcnRpZmFjdEFsaWFzKHBsdWdpbiksXG4gICAgICBvdXRwdXREaXJlY3Rvcnk6IHBsdWdpbi5wcmltYXJ5T3V0cHV0RGlyZWN0b3J5LFxuICAgIH07XG4gICAgYXJ0aWZhY3RNYW5hZ2VyLmFkZChhcnRpZmFjdEtleSwgc3RlcCk7XG4gIH1cblxuICByZXR1cm4gc3RlcDtcbn1cblxuLyoqXG4gKiBUaGUgZGVmYXVsdCBpbWFnZSBhIHBsdWdpbi1sZXNzIENvZGVCdWlsZCBzdGVwIHJ1bnMgb24uIEl0IGlzIHJlc29sdmVkIG9uY2VcbiAqIHBlciBwaXBlbGluZSBmcm9tIGByZXNvbHZlZEJvb3RzdHJhcGAgYW5kIGhhbmRlZCBkb3duOyBhIHN0ZXAgd2l0aG91dCBvbmVcbiAqIGhhcyBubyBpbWFnZSB0byBydW4gb24sIHNvIHRoZSBzeW50aCBzdG9wcyByYXRoZXIgdGhhbiBsZXQgQ29kZUJ1aWxkIHBpY2tcbiAqIGl0cyBvd24uXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRCdWlsZEltYWdlT3JUaHJvdyhvcHRpb25zOiBDb2RlQnVpbGRTdGVwT3B0aW9ucyk6IElCdWlsZEltYWdlIHtcbiAgaWYgKG9wdGlvbnMuZGVmYXVsdEJ1aWxkSW1hZ2UpIHJldHVybiBvcHRpb25zLmRlZmF1bHRCdWlsZEltYWdlO1xuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYEJPT1RTVFJBUF9JTUFHRV9VTlJFU09MVkVEOiBzdGVwIFwiJHtvcHRpb25zLmlkfVwiIChwbHVnaW4gXCIke29wdGlvbnMucGx1Z2luLm5hbWV9XCIpIGhhcyBubyBwbHVnaW4gaW1hZ2UgYW5kIG5vIGRlZmF1bHQgYnVpbGQgaW1hZ2UuIGAgK1xuICAgICdQYXNzIGBkZWZhdWx0QnVpbGRJbWFnZWAgKFBpcGVsaW5lQnVpbGRlciByZXNvbHZlcyBpdCBmcm9tIGByZXNvbHZlZEJvb3RzdHJhcGApLicsXG4gICk7XG59XG5cbi8qKlxuICogQ29udmVydCBzdHJpbmcgb3IgQ29tcHV0ZVR5cGUgZW51bSB0byBDREsgQ29tcHV0ZVR5cGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbXB1dGVUeXBlKGlucHV0OiBzdHJpbmcgfCBDREtDb21wdXRlVHlwZSA9ICdTTUFMTCcpOiBDREtDb21wdXRlVHlwZSB7XG4gIC8vIElmIGFscmVhZHkgYSBDREsgQ29tcHV0ZVR5cGUsIHJldHVybiBhcy1pc1xuICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBpbnB1dDtcbiAgfVxuXG4gIC8vIEFscmVhZHkgYSBuYXRpdmUgQ29kZUJ1aWxkIENvbXB1dGVUeXBlIChlLmcuIFwiQlVJTERfR0VORVJBTDFfTEFSR0VcIik/IEFjY2VwdCBhcy1pc1xuICAvLyBzbyBib3RoIGZyaWVuZGx5IChMQVJHRSkgYW5kIG5hdGl2ZSB2YWx1ZXMgcm91bmQtdHJpcCB3aXRob3V0IGZhbGxpbmcgYmFjayB0byBTTUFMTC5cbiAgaWYgKChPYmplY3QudmFsdWVzKENES0NvbXB1dGVUeXBlKSBhcyBzdHJpbmdbXSkuaW5jbHVkZXMoaW5wdXQpKSB7XG4gICAgcmV0dXJuIGlucHV0IGFzIENES0NvbXB1dGVUeXBlO1xuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZCA9IGlucHV0LnRvVXBwZXJDYXNlKCkgYXMgQ29tcHV0ZVR5cGU7XG5cbiAgY29uc3QgbWFwcGluZzogUmVjb3JkPENvbXB1dGVUeXBlLCBDREtDb21wdXRlVHlwZT4gPSB7XG4gICAgW0NvbXB1dGVUeXBlLlNNQUxMXTogQ0RLQ29tcHV0ZVR5cGUuU01BTEwsXG4gICAgW0NvbXB1dGVUeXBlLk1FRElVTV06IENES0NvbXB1dGVUeXBlLk1FRElVTSxcbiAgICBbQ29tcHV0ZVR5cGUuTEFSR0VdOiBDREtDb21wdXRlVHlwZS5MQVJHRSxcbiAgICBbQ29tcHV0ZVR5cGUuWDJfTEFSR0VdOiBDREtDb21wdXRlVHlwZS5YMl9MQVJHRSxcbiAgfTtcblxuICBjb25zdCByZXN1bHQgPSBtYXBwaW5nW25vcm1hbGl6ZWRdO1xuICBpZiAoIXJlc3VsdCkge1xuICAgIGxvZy53YXJuKGBVbmtub3duIGNvbXB1dGUgdHlwZSBcIiR7aW5wdXR9XCIsIGZhbGxpbmcgYmFjayB0byBTTUFMTGApO1xuICAgIHJldHVybiBDREtDb21wdXRlVHlwZS5TTUFMTDtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFVud3JhcCBhIFNlY3JldFZhbHVlIHwgc3RyaW5nIGludG8gYSBwbGFpbiBzdHJpbmcuXG4gKiBXaGVuIGEgU2VjcmV0VmFsdWUgaXMgcHJvdmlkZWQgKGUuZy4gZnJvbSBTZWNyZXRzIE1hbmFnZXIpLCBjYWxscyB1bnNhZmVVbndyYXAoKVxuICogdG8gZXh0cmFjdCB0aGUgdW5kZXJseWluZyB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVud3JhcFNlY3JldCh2YWx1ZTogU2VjcmV0VmFsdWUgfCBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogdmFsdWUudW5zYWZlVW53cmFwKCk7XG59XG4iXX0=
|
|
@@ -10,18 +10,61 @@ export interface LookupWarning {
|
|
|
10
10
|
/** Absent on the wire → `warning`. */
|
|
11
11
|
readonly severity: LookupWarningSeverity;
|
|
12
12
|
}
|
|
13
|
+
/** How a managed toolchain release was chosen for the caller (never anything about other orgs). */
|
|
14
|
+
export type ToolchainResolvedVia = 'pin' | 'org-default' | 'canary' | 'default';
|
|
15
|
+
export declare const TOOLCHAIN_RESOLVED_VIA: readonly ToolchainResolvedVia[];
|
|
16
|
+
/** The exact tool versions a toolchain release carries (the bootstrap spec's `toolchain`). */
|
|
17
|
+
export interface ToolchainVersions {
|
|
18
|
+
readonly pipelineManager?: string;
|
|
19
|
+
readonly awsCdk?: string;
|
|
20
|
+
readonly cdkAssets?: string;
|
|
21
|
+
readonly esbuild?: string;
|
|
22
|
+
readonly pnpm?: string;
|
|
23
|
+
readonly node?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The release a managed-name lookup (`pipeline-bootstrap`, `cdk-synth`)
|
|
27
|
+
* resolved to: `data.toolchain` of the `/plugins/lookup` answer. `versions`
|
|
28
|
+
* holds the tool versions when the answer (or the plugin record) carries them.
|
|
29
|
+
*/
|
|
30
|
+
export interface LookupToolchain {
|
|
31
|
+
readonly releaseVersion: string;
|
|
32
|
+
readonly resolvedVia: ToolchainResolvedVia;
|
|
33
|
+
readonly versions: ToolchainVersions;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The resolved `pipeline-bootstrap` half of a toolchain release: the plugin
|
|
37
|
+
* record the default CodeBuild image is pinned to (by its signed digest) and
|
|
38
|
+
* the release it came from. Produced by `pipeline-manager`'s
|
|
39
|
+
* `resolveBootstrapImage` (or a `--toolchain-file`) and passed to
|
|
40
|
+
* `PipelineBuilder` as `resolvedBootstrap`.
|
|
41
|
+
*/
|
|
42
|
+
export interface ResolvedBootstrap {
|
|
43
|
+
readonly plugin: Plugin;
|
|
44
|
+
readonly toolchain: LookupToolchain;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Parse a lookup's `toolchain` block. Null unless it carries a release version
|
|
48
|
+
* and a known `resolvedVia`. Tool versions come from, lowest precedence first:
|
|
49
|
+
* the plugin row's `metadata` (`toolchain.<field>` keys, where the platform
|
|
50
|
+
* persists the bootstrap spec's `toolchain`), the record's own `toolchain`,
|
|
51
|
+
* the block's flat fields, then `toolchain.versions`.
|
|
52
|
+
*/
|
|
53
|
+
export declare function parseLookupToolchain(raw: unknown, plugin?: unknown): LookupToolchain | null;
|
|
13
54
|
/**
|
|
14
55
|
* Unwrap a `/plugins/lookup` answer. The platform's success envelope is
|
|
15
56
|
* `{ success, statusCode, data: { plugin, warnings } }` (note the double
|
|
16
57
|
* nesting: `data.plugin`); `{ data: Plugin }`, `{ plugin }` and a bare Plugin
|
|
17
58
|
* are tolerated too. Returns the plugin (null when absent or nameless) and the
|
|
18
|
-
* graded warnings (lifecycle, vulnerability, compliance) that ride beside it
|
|
59
|
+
* graded warnings (lifecycle, vulnerability, compliance) that ride beside it,
|
|
60
|
+
* and — for a managed toolchain name — the release it resolved to (`toolchain`).
|
|
19
61
|
*
|
|
20
62
|
* Dependency-free (type-only imports) so the plugin-lookup Lambda can bundle it.
|
|
21
63
|
*/
|
|
22
64
|
export declare function unwrapLookup(body: unknown): {
|
|
23
65
|
plugin: Plugin | null;
|
|
24
66
|
warnings: LookupWarning[];
|
|
67
|
+
toolchain?: LookupToolchain;
|
|
25
68
|
};
|
|
26
69
|
/**
|
|
27
70
|
* One line summarizing graded warnings, most serious first —
|