cdk-nextjs 0.7.13 → 0.7.15
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/.jsii +132 -42
- package/.jsii.tabl.json +1 -1
- package/API.md +56 -0
- package/docs/harness-coverage.md +16 -6
- package/docs/next-build-output-guide.md +1 -1
- package/lib/adapter/adapter.mjs +1 -1
- package/lib/generated-structs/OptionalNextjsApiProps.d.ts +6 -0
- package/lib/generated-structs/OptionalNextjsApiProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsDistributionProps.d.ts +6 -0
- package/lib/generated-structs/OptionalNextjsDistributionProps.js +1 -1
- package/lib/nextjs-api.d.ts +11 -0
- package/lib/nextjs-api.js +63 -9
- package/lib/nextjs-api.test.js +127 -1
- package/lib/nextjs-build/nextjs-build.js +1 -1
- package/lib/nextjs-cache.js +1 -1
- package/lib/nextjs-compute/nextjs-containers.js +1 -1
- package/lib/nextjs-compute/nextjs-functions.js +1 -1
- package/lib/nextjs-distribution.d.ts +21 -0
- package/lib/nextjs-distribution.js +69 -4
- package/lib/nextjs-distribution.test.js +132 -1
- package/lib/nextjs-post-deploy.js +1 -1
- package/lib/nextjs-static-assets.js +1 -1
- package/lib/root-constructs/nextjs-base-construct.d.ts +7 -0
- package/lib/root-constructs/nextjs-base-construct.js +14 -2
- package/lib/root-constructs/nextjs-global-containers.js +3 -2
- package/lib/root-constructs/nextjs-global-functions.js +3 -2
- package/lib/root-constructs/nextjs-regional-containers.js +1 -1
- package/lib/root-constructs/nextjs-regional-functions.js +3 -2
- package/lib/runtime/core.js +4 -6
- package/lib/runtime/http/response.d.ts +0 -6
- package/lib/runtime/http/response.js +1 -7
- package/lib/runtime/http/sink.js +10 -6
- package/lib/runtime/http/sink.test.js +45 -13
- package/lib/runtime/lambda.mjs +2 -10
- package/lib/runtime/server.mjs +2 -10
- package/package.json +1 -1
- package/scripts/e2e-harness/README.md +10 -8
|
@@ -12,7 +12,7 @@ const constants_1 = require("./constants");
|
|
|
12
12
|
const base_path_1 = require("./utils/base-path");
|
|
13
13
|
const viewer_request_functions_1 = require("./utils/viewer-request-functions");
|
|
14
14
|
class NextjsDistribution extends constructs_1.Construct {
|
|
15
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsDistribution", version: "0.7.
|
|
15
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsDistribution", version: "0.7.15" };
|
|
16
16
|
distribution;
|
|
17
17
|
props;
|
|
18
18
|
/**
|
|
@@ -571,7 +571,61 @@ class NextjsDistribution extends constructs_1.Construct {
|
|
|
571
571
|
],
|
|
572
572
|
});
|
|
573
573
|
}
|
|
574
|
+
/**
|
|
575
|
+
* Serves `_next/static/service-worker/*` with `Service-Worker-Allowed`, which
|
|
576
|
+
* the browser requires before it registers a service worker at a scope above
|
|
577
|
+
* the script's own directory. Added ahead of `_next/static*`, which would
|
|
578
|
+
* otherwise match first.
|
|
579
|
+
*
|
|
580
|
+
* The policy is the static one plus the header, so security headers and any
|
|
581
|
+
* `staticResponseHeadersPolicyProps` still apply. A whole
|
|
582
|
+
* `staticBehaviorOptions.responseHeadersPolicy` can't be added to, so it is
|
|
583
|
+
* used as it is, with a warning.
|
|
584
|
+
*/
|
|
585
|
+
addServiceWorkerBehavior(serviceWorkerAllowed) {
|
|
586
|
+
const overridden = this.props.overrides?.staticBehaviorOptions?.responseHeadersPolicy;
|
|
587
|
+
if (overridden) {
|
|
588
|
+
aws_cdk_lib_1.Annotations.of(this).addWarning(`${constants_1.LOG_PREFIX} \`overrides.staticBehaviorOptions.responseHeadersPolicy\` ` +
|
|
589
|
+
`is used for \`_next/static/service-worker/*\` too, so service ` +
|
|
590
|
+
`workers get no \`Service-Worker-Allowed: ${serviceWorkerAllowed}\` ` +
|
|
591
|
+
`unless that policy sends it, and registering one at a scope above ` +
|
|
592
|
+
`its own directory fails. Add the header to your policy, or set ` +
|
|
593
|
+
`\`overrides.staticResponseHeadersPolicyProps\` instead.`);
|
|
594
|
+
}
|
|
595
|
+
const props = this.props.overrides?.staticResponseHeadersPolicyProps;
|
|
596
|
+
const customHeaders = props?.customHeadersBehavior?.customHeaders ?? [];
|
|
597
|
+
const responseHeadersPolicy = overridden ??
|
|
598
|
+
new aws_cloudfront_1.ResponseHeadersPolicy(this, "ServiceWorkerResponseHeadersPolicy", {
|
|
599
|
+
securityHeadersBehavior: this.commonSecurityHeadersBehavior,
|
|
600
|
+
comment: this.getComment("NextJS Service Worker Response Headers Policy", aws_cdk_lib_1.Stack.of(this).stackName),
|
|
601
|
+
...props,
|
|
602
|
+
// Policy names are unique per account, so the static policy's can't be
|
|
603
|
+
// reused as it is, and are at most 128 characters, so a suffix can't
|
|
604
|
+
// simply be added to one that is already that long.
|
|
605
|
+
responseHeadersPolicyName: props?.responseHeadersPolicyName &&
|
|
606
|
+
`${aws_cdk_lib_1.Token.isUnresolved(props.responseHeadersPolicyName)
|
|
607
|
+
? props.responseHeadersPolicyName
|
|
608
|
+
: props.responseHeadersPolicyName.slice(0, MAX_POLICY_NAME_LENGTH - SERVICE_WORKER_SUFFIX.length)}${SERVICE_WORKER_SUFFIX}`,
|
|
609
|
+
customHeadersBehavior: {
|
|
610
|
+
// One the override sets itself is kept.
|
|
611
|
+
customHeaders: customHeaders.some(({ header }) => header.toLowerCase() === "service-worker-allowed")
|
|
612
|
+
? customHeaders
|
|
613
|
+
: [
|
|
614
|
+
...customHeaders,
|
|
615
|
+
{
|
|
616
|
+
header: "Service-Worker-Allowed",
|
|
617
|
+
value: serviceWorkerAllowed,
|
|
618
|
+
override: true,
|
|
619
|
+
},
|
|
620
|
+
],
|
|
621
|
+
},
|
|
622
|
+
});
|
|
623
|
+
this.distribution.addBehavior(this.getPathPattern("_next/static/service-worker/*"), this.staticOrigin, { ...this.staticBehaviorOptions, responseHeadersPolicy });
|
|
624
|
+
}
|
|
574
625
|
addStaticBehaviors() {
|
|
626
|
+
if (this.props.serviceWorkerAllowed !== undefined) {
|
|
627
|
+
this.addServiceWorkerBehavior(this.props.serviceWorkerAllowed);
|
|
628
|
+
}
|
|
575
629
|
this.distribution.addBehavior(this.getPathPattern("_next/static*"), this.staticOrigin, this.staticBehaviorOptions);
|
|
576
630
|
if (this.assetPrefix) {
|
|
577
631
|
this.addAssetPrefixBehavior();
|
|
@@ -690,11 +744,15 @@ class NextjsDistribution extends constructs_1.Construct {
|
|
|
690
744
|
const groupPatterns = this.functionGroupBehaviors().length;
|
|
691
745
|
// The default behavior, `_next/image*`, `_next/static*`, plus — with a
|
|
692
746
|
// basePath — the two that stand in for the default behavior's coverage, and
|
|
693
|
-
// — with a path-style assetPrefix — the one that serves bundles under it
|
|
747
|
+
// — with a path-style assetPrefix — the one that serves bundles under it,
|
|
748
|
+
// and — with service workers — the one that adds `Service-Worker-Allowed`.
|
|
694
749
|
// `this.basePath`, not the raw prop: `basePath: "/"` normalizes to `""` and
|
|
695
750
|
// adds no behaviors, so counting it added 2 to the total and could throw
|
|
696
751
|
// "over the limit" on an app that is under it.
|
|
697
|
-
const fixed = 3 +
|
|
752
|
+
const fixed = 3 +
|
|
753
|
+
(this.basePath ? 2 : 0) +
|
|
754
|
+
(this.assetPrefix ? 1 : 0) +
|
|
755
|
+
(this.props.serviceWorkerAllowed !== undefined ? 1 : 0);
|
|
698
756
|
const total = fixed + publicPatterns + groupPatterns;
|
|
699
757
|
if (total <= limit) {
|
|
700
758
|
return;
|
|
@@ -811,6 +869,13 @@ const DEFAULT_MAX_CACHE_BEHAVIORS = 75;
|
|
|
811
869
|
function isPathPatternChar(char) {
|
|
812
870
|
return char === "*" || char === "?" || function_groups_1.PATH_PATTERN_LITERAL.test(char);
|
|
813
871
|
}
|
|
872
|
+
/**
|
|
873
|
+
* CloudFront's limit on a response headers policy name, and the suffix that
|
|
874
|
+
* tells the service worker policy's apart from the static one's.
|
|
875
|
+
* @see https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_ResponseHeadersPolicyConfig.html
|
|
876
|
+
*/
|
|
877
|
+
const MAX_POLICY_NAME_LENGTH = 128;
|
|
878
|
+
const SERVICE_WORKER_SUFFIX = "-sw";
|
|
814
879
|
/** CloudFront's path pattern length limit. */
|
|
815
880
|
const MAX_PATH_PATTERN_LENGTH = 255;
|
|
816
881
|
/**
|
|
@@ -838,4 +903,4 @@ function toPathPattern(name) {
|
|
|
838
903
|
: "?".repeat(Buffer.byteLength(char, "utf8")))
|
|
839
904
|
.join("");
|
|
840
905
|
}
|
|
841
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWRpc3RyaWJ1dGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9uZXh0anMtZGlzdHJpYnV0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSw2Q0FBa0U7QUFFbEUsK0RBK0JvQztBQUNwQywrRUFNNEM7QUFFNUMsdURBQXFFO0FBRXJFLDJDQUF1QztBQUN2QywrREFJbUM7QUFDbkMsMkNBQXFEO0FBT3JELGlEQUF1RTtBQUN2RSwrRUFPMEM7QUFvSTFDLE1BQWEsa0JBQW1CLFNBQVEsc0JBQVM7O0lBQy9DLFlBQVksQ0FBZTtJQUVuQixLQUFLLENBQTBCO0lBQ3ZDOzs7OztPQUtHO0lBQ0ssUUFBUSxDQUFTO0lBQ3pCOzs7OztPQUtHO0lBQ0ssV0FBVyxDQUFTO0lBQzVCOzs7T0FHRztJQUNLLDZCQUE2QixHQUFvQztRQUN2RSxrQkFBa0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUU7UUFDdkMsWUFBWSxFQUFFO1lBQ1osV0FBVyxFQUFFLG1DQUFrQixDQUFDLFVBQVU7WUFDMUMsUUFBUSxFQUFFLEtBQUs7U0FDaEI7UUFDRCxjQUFjLEVBQUU7WUFDZCxRQUFRLEVBQUUsS0FBSztZQUNmLGNBQWMsRUFBRSxzQ0FBcUIsQ0FBQywrQkFBK0I7U0FDdEU7UUFFRCx1QkFBdUIsRUFBRTtZQUN2QixtQkFBbUIsRUFBRSxzQkFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDdkMsaUJBQWlCLEVBQUUsSUFBSTtZQUN2QixRQUFRLEVBQUUsS0FBSztZQUNmLE9BQU8sRUFBRSxJQUFJO1NBQ2Q7UUFDRCxhQUFhLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRTtLQUN0RSxDQUFDO0lBQ00sWUFBWSxDQUFVO0lBQ3RCLGFBQWEsQ0FBVTtJQUN2QiwyQkFBMkIsQ0FBdUI7SUFDbEQscUNBQXFDLENBQXdCO0lBQ3JFOzs7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LEdBQUcsR0FBRyxDQUFDO0FBRXBDOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILFNBQVMsYUFBYSxDQUFDLElBQVk7SUFDakMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDO1NBQ2IsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDWixpQkFBaUIsQ0FBQyxJQUFJLENBQUM7UUFDckIsQ0FBQyxDQUFDLElBQUk7UUFDTixDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUNoRDtTQUNBLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbm5vdGF0aW9ucywgRHVyYXRpb24sIFN0YWNrLCBUb2tlbiB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgSUNlcnRpZmljYXRlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jZXJ0aWZpY2F0ZW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIEFjY2Vzc0xldmVsLFxuICBBZGRCZWhhdmlvck9wdGlvbnMsXG4gIEFsbG93ZWRNZXRob2RzLFxuICBCZWhhdmlvck9wdGlvbnMsXG4gIENhY2hlQ29va2llQmVoYXZpb3IsXG4gIENhY2hlSGVhZGVyQmVoYXZpb3IsXG4gIENhY2hlUG9saWN5LFxuICBDYWNoZVBvbGljeVByb3BzLFxuICBDYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IsXG4gIENhY2hlZE1ldGhvZHMsXG4gIEZ1bmN0aW9uIGFzIENsb3VkRnJvbnRGdW5jdGlvbixcbiAgRGlzdHJpYnV0aW9uLFxuICBGdW5jdGlvbkFzc29jaWF0aW9uLFxuICBGdW5jdGlvbkNvZGUsXG4gIEZ1bmN0aW9uRXZlbnRUeXBlLFxuICBGdW5jdGlvblByb3BzLFxuICBGdW5jdGlvblJ1bnRpbWUsXG4gIEhlYWRlcnNGcmFtZU9wdGlvbixcbiAgSGVhZGVyc1JlZmVycmVyUG9saWN5LFxuICBIdHRwVmVyc2lvbixcbiAgSUtleVZhbHVlU3RvcmUsXG4gIElPcmlnaW4sXG4gIElPcmlnaW5SZXF1ZXN0UG9saWN5LFxuICBPcmlnaW5Qcm90b2NvbFBvbGljeSxcbiAgT3JpZ2luUmVxdWVzdFBvbGljeSxcbiAgUmVzcG9uc2VIZWFkZXJzUG9saWN5LFxuICBSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcyxcbiAgUmVzcG9uc2VTZWN1cml0eUhlYWRlcnNCZWhhdmlvcixcbiAgU2VjdXJpdHlQb2xpY3lQcm90b2NvbCxcbiAgVmlld2VyUHJvdG9jb2xQb2xpY3ksXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udFwiO1xuaW1wb3J0IHtcbiAgRnVuY3Rpb25VcmxPcmlnaW4sXG4gIEZ1bmN0aW9uVXJsT3JpZ2luV2l0aE9BQ1Byb3BzLFxuICBTM0J1Y2tldE9yaWdpbixcbiAgVnBjT3JpZ2luLFxuICBWcGNPcmlnaW5XaXRoRW5kcG9pbnRQcm9wcyxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250LW9yaWdpbnNcIjtcbmltcG9ydCB7IElBcHBsaWNhdGlvbkxvYWRCYWxhbmNlciB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWxhc3RpY2xvYWRiYWxhbmNpbmd2MlwiO1xuaW1wb3J0IHsgQ2ZuUGVybWlzc2lvbiwgSUZ1bmN0aW9uVXJsIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcbmltcG9ydCB7IElCdWNrZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHtcbiAgY2xvdWRGcm9udFBhdHRlcm5SZWdleCxcbiAgREVGQVVMVF9GVU5DVElPTl9HUk9VUCxcbiAgUEFUSF9QQVRURVJOX0xJVEVSQUwsXG59IGZyb20gXCIuL2FkYXB0ZXIvZnVuY3Rpb24tZ3JvdXBzXCI7XG5pbXBvcnQgeyBMT0dfUFJFRklYLCBOZXh0anNUeXBlIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBPcHRpb25hbERpc3RyaWJ1dGlvblByb3BzIH0gZnJvbSBcIi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxEaXN0cmlidXRpb25Qcm9wc1wiO1xuaW1wb3J0IHsgT3B0aW9uYWxTM09yaWdpbkJ1Y2tldFdpdGhPQUNQcm9wcyB9IGZyb20gXCIuL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsUzNPcmlnaW5CdWNrZXRXaXRoT0FDUHJvcHNcIjtcbmltcG9ydCB7XG4gIE5leHRqc0Z1bmN0aW9uR3JvdXBCZWhhdmlvcixcbiAgUHVibGljRGlyRW50cnksXG59IGZyb20gXCIuL25leHRqcy1idWlsZC9uZXh0anMtYnVpbGRcIjtcbmltcG9ydCB7IGFzc2V0UHJlZml4UGF0aCwgbm9ybWFsaXplQmFzZVBhdGggfSBmcm9tIFwiLi91dGlscy9iYXNlLXBhdGhcIjtcbmltcG9ydCB7XG4gIGFzc2V0UHJlZml4UmV3cml0ZUhhbmRsZXIsXG4gIGNoZWNrVmlld2VyUmVxdWVzdENvZGUsXG4gIE1BWF9GVU5DVElPTl9DT0RFX0JZVEVTLFxuICBQQVNTX1RIUk9VR0hfSEFORExFUixcbiAgc3BsaWNlVmlld2VyUmVxdWVzdCxcbiAgWF9GT1JXQVJERURfSE9TVF9IQU5ETEVSLFxufSBmcm9tIFwiLi91dGlscy92aWV3ZXItcmVxdWVzdC1mdW5jdGlvbnNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNEaXN0cmlidXRpb25PdmVycmlkZXMge1xuICByZWFkb25seSBkaXN0cmlidXRpb25Qcm9wcz86IE9wdGlvbmFsRGlzdHJpYnV0aW9uUHJvcHM7XG4gIHJlYWRvbmx5IGltYWdlQmVoYXZpb3JPcHRpb25zPzogQWRkQmVoYXZpb3JPcHRpb25zO1xuICByZWFkb25seSBpbWFnZUNhY2hlUG9saWN5UHJvcHM/OiBDYWNoZVBvbGljeVByb3BzO1xuICByZWFkb25seSBpbWFnZVJlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzPzogUmVzcG9uc2VIZWFkZXJzUG9saWN5UHJvcHM7XG4gIHJlYWRvbmx5IGR5bmFtaWNCZWhhdmlvck9wdGlvbnM/OiBBZGRCZWhhdmlvck9wdGlvbnM7XG4gIHJlYWRvbmx5IGR5bmFtaWNDYWNoZVBvbGljeVByb3BzPzogQ2FjaGVQb2xpY3lQcm9wcztcbiAgcmVhZG9ubHkgZHluYW1pY1Jlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzPzogUmVzcG9uc2VIZWFkZXJzUG9saWN5UHJvcHM7XG4gIHJlYWRvbmx5IGR5bmFtaWNGdW5jdGlvblVybE9yaWdpbldpdGhPQUNQcm9wcz86IEZ1bmN0aW9uVXJsT3JpZ2luV2l0aE9BQ1Byb3BzO1xuICByZWFkb25seSBkeW5hbWljVnBjT3JpZ2luV2l0aEVuZHBvaW50UHJvcHM/OiBWcGNPcmlnaW5XaXRoRW5kcG9pbnRQcm9wcztcbiAgcmVhZG9ubHkgc3RhdGljQmVoYXZpb3JPcHRpb25zPzogQWRkQmVoYXZpb3JPcHRpb25zO1xuICByZWFkb25seSBzdGF0aWNSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcz86IFJlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzO1xuICByZWFkb25seSBzM0J1Y2tldE9yaWdpblByb3BzPzogT3B0aW9uYWxTM09yaWdpbkJ1Y2tldFdpdGhPQUNQcm9wcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNEaXN0cmlidXRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBCdWNrZXQgY29udGFpbmluZyBzdGF0aWMgYXNzZXRzLlxuICAgKiBNdXN0IGJlIHByb3ZpZGVkIGlmIHlvdSB3YW50IHRvIHNlcnZlIHN0YXRpYyBmaWxlcy5cbiAgICovXG4gIHJlYWRvbmx5IGFzc2V0c0J1Y2tldDogSUJ1Y2tldDtcbiAgLyoqXG4gICAqIFRoZSBhcHAncyBvd24gYGFzc2V0UHJlZml4YC4gTmV4dC5qcyBlbWl0cyBgPGFzc2V0UHJlZml4Pi9fbmV4dC9zdGF0aWMvLi4uYFxuICAgKiBmb3IgZXZlcnkgYnVuZGxlIHdoaWxlIHRoZSBvYmplY3RzIHN0YXkgYXQgYDxiYXNlUGF0aD4vX25leHQvc3RhdGljLy4uLmAgaW5cbiAgICogUzMsIHNvIHRoZSBwcmVmaXgncyBwYXRoIGdldHMgYSBjYWNoZSBiZWhhdmlvciBvZiBpdHMgb3duIHRoYXQgcmV3cml0ZXMgaXRcbiAgICogYXdheS5cbiAgICpcbiAgICogRWl0aGVyIGZvcm0gaXMgYWNjZXB0ZWQ6IGEgcGF0aCAoXCIvY2RuXCIpLCBvciBhbiBhYnNvbHV0ZSBVUkwsIGluIHdoaWNoIGNhc2VcbiAgICogb25seSBpdHMgcGF0aCBjb3VudHMgKFwiaHR0cHM6Ly9jZG4uZXhhbXBsZS5jb20vY2RuXCIgYmVoYXZlcyBhcyBcIi9jZG5cIiwgYW5kXG4gICAqIFwiaHR0cHM6Ly9jZG4uZXhhbXBsZS5jb21cIiBuZWVkcyBubyBiZWhhdmlvciBhdCBhbGwpLiBBbiBhYnNvbHV0ZSBwcmVmaXgncyBwYXRoXG4gICAqIG1hdHRlcnMgYmVjYXVzZSBgbmV4dCBidWlsZGAgY29tcGlsZXMgYSBgL2Nkbi9fbmV4dC86cGF0aCtgIHJld3JpdGUgb2YgaXRzXG4gICAqIG93biwgc28gYG5leHQgc3RhcnRgIHNlcnZlcyBldmVyeSBidW5kbGUgdW5kZXIgaXQg4oCUIGEgQ0ROIGZyb250aW5nIHRoaXNcbiAgICogZGlzdHJpYnV0aW9uIHRoZXJlIGhhcyB0byBiZSBhbnN3ZXJlZCB0b28uXG4gICAqXG4gICAqIEFwcGxpZWQgb24gdG9wIG9mIGBiYXNlUGF0aGAsIG5vdCB1bmRlciBpdCwgYmVjYXVzZSB0aGF0IGlzIGhvdyBOZXh0LmpzXG4gICAqIGJ1aWxkcyB0aGUgVVJMLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vbmU7IHBhc3MgYE5leHRqc0J1aWxkLm5leHRDb25maWdBc3NldFByZWZpeFBhdGhgXG4gICAqL1xuICByZWFkb25seSBhc3NldFByZWZpeD86IHN0cmluZztcbiAgLyoqXG4gICAqIFVSSSBwYXRoIHByZWZpeCB0aGUgYXBwIGlzIHNlcnZlZCBhdC4gU3Vycm91bmRpbmcgc2xhc2hlcyBhcmUgbm9ybWFsaXplZFxuICAgKiBhd2F5LCBzbyBcIi9iYXNlXCIsIFwiYmFzZVwiIGFuZCBcIi9iYXNlL1wiIGFsbCBwcm9kdWNlIHRoZSBzYW1lIGNhY2hlIGJlaGF2aW9ycy5cbiAgICovXG4gIHJlYWRvbmx5IGJhc2VQYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogT3B0aW9uYWwgYnV0IG9ubHkgYXBwbGljYWJsZSBmb3IgYE5leHRqc1R5cGUuR0xPQkFMX0NPTlRBSU5FUlNgXG4gICAqL1xuICByZWFkb25seSBjZXJ0aWZpY2F0ZT86IElDZXJ0aWZpY2F0ZTtcbiAgcmVhZG9ubHkgZGlzdHJpYnV0aW9uPzogRGlzdHJpYnV0aW9uO1xuICAvKipcbiAgICogUmVxdWlyZWQgaWYgYE5leHRqc1R5cGUuR0xPQkFMX0ZVTkNUSU9OU2BcbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uVXJsPzogSUZ1bmN0aW9uVXJsO1xuICAvKipcbiAgICogUmVxdWlyZWQgaWYgYE5leHRqc1R5cGUuR0xPQkFMX0NPTlRBSU5FUlNgIG9yIGBOZXh0anNUeXBlLlJFR0lPTkFMX0NPTlRBSU5FUlNgXG4gICAqL1xuICByZWFkb25seSBsb2FkQmFsYW5jZXI/OiBJQXBwbGljYXRpb25Mb2FkQmFsYW5jZXI7XG4gIHJlYWRvbmx5IG5leHRqc1R5cGU6IE5leHRqc1R5cGU7XG4gIC8qKlxuICAgKiBPdmVycmlkZSBwcm9wcyBmb3IgZXZlcnkgY29uc3RydWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgb3ZlcnJpZGVzPzogTmV4dGpzRGlzdHJpYnV0aW9uT3ZlcnJpZGVzO1xuICAvKipcbiAgICogRW50cmllcyAoZmlsZXMvZGlyZWN0b3JpZXMpIHdpdGhpbiBOZXh0LmpzIGFwcCdzIHB1YmxpYyBkaXJlY3RvcnkuIFVzZWQgdG9cbiAgICogYWRkIHN0YXRpYyBiZWhhdmlvcnMgdG8gZGlzdHJpYnV0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgcHVibGljRGlyRW50cmllczogUHVibGljRGlyRW50cnlbXTtcbiAgLyoqXG4gICAqIFRoZSBub24tYGRlZmF1bHRgIGZ1bmN0aW9uIGdyb3VwcywgdGhlIG9yaWdpbnNcbiAgICoge0BsaW5rIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnN9IHJvdXRlIHRvLlxuICAgKiBAZGVmYXVsdCAtIG5vIHNwbGl0dGluZzsgdGhlIGRlZmF1bHQgYmVoYXZpb3Igc2VydmVzIGV2ZXJ5IGR5bmFtaWMgcm91dGVcbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uR3JvdXBzPzogTmV4dGpzRGlzdHJpYnV0aW9uRnVuY3Rpb25Hcm91cFtdO1xuICAvKipcbiAgICogYE5leHRqc0J1aWxkLmZ1bmN0aW9uR3JvdXBCZWhhdmlvcnNgOiBvbmUgY2FjaGUgYmVoYXZpb3IgZWFjaCwgYWRkZWQgaW5cbiAgICogb3JkZXIsIHNvIHRoZSByb3V0ZXMgZWFjaCBncm91cCB3YXMgcGFja2FnZWQgd2l0aCByZWFjaCBpdCByYXRoZXIgdGhhbiB0aGVcbiAgICogZGVmYXVsdCBmdW5jdGlvbi5cbiAgICogQGRlZmF1bHQgLSBub25lXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzPzogTmV4dGpzRnVuY3Rpb25Hcm91cEJlaGF2aW9yW107XG4gIC8qKlxuICAgKiBUaGUgbW9zdCBjYWNoZSBiZWhhdmlvcnMgdGhlIGRpc3RyaWJ1dGlvbiBtYXkgaGF2ZSwgdGhlIGRlZmF1bHQgb25lXG4gICAqIGluY2x1ZGVkLiBjZGstbmV4dGpzIGNvdW50cyB3aGF0IGl0IGFkZHMgYWdhaW5zdCB0aGlzIGF0IHN5bnRoLCBzbyBydW5uaW5nXG4gICAqIG91dCBpcyBhIHN5bnRoIGVycm9yIG5hbWluZyB3aGF0IHVzZWQgdGhlbSByYXRoZXIgdGhhbiBhIGZhaWxlZCBkZXBsb3kuXG4gICAqXG4gICAqIFJhaXNlIGl0IGFmdGVyIHJhaXNpbmcgdGhlIFwiQ2FjaGUgYmVoYXZpb3JzIHBlciBkaXN0cmlidXRpb25cIiBxdW90YSBmb3JcbiAgICogeW91ciBhY2NvdW50LiBMb3dlciBpdCBieSB0aGUgYmVoYXZpb3JzIGEgc3VwcGxpZWQge0BsaW5rIGRpc3RyaWJ1dGlvbn1cbiAgICogKG9yIGBvdmVycmlkZXMuZGlzdHJpYnV0aW9uUHJvcHNgKSBhbHJlYWR5IGhhcywgd2hpY2ggYXJlIG5vdCBjb3VudGVkLlxuICAgKiBAZGVmYXVsdCA3NSAtIENsb3VkRnJvbnQncyBkZWZhdWx0IHF1b3RhXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2Nsb3VkZnJvbnQtbGltaXRzLmh0bWwjbGltaXRzLXdlYi1kaXN0cmlidXRpb25zXG4gICAqL1xuICByZWFkb25seSBtYXhDYWNoZUJlaGF2aW9ycz86IG51bWJlcjtcbiAgLyoqXG4gICAqIENsb3VkRnJvbnQgRnVuY3Rpb24gY29kZSBydW4gZmlyc3Qgb24gZXZlcnkgdmlld2VyIHJlcXVlc3QsIG9uIGV2ZXJ5XG4gICAqIGJlaGF2aW9yIGNkay1uZXh0anMgYWRkcywgc3RhdGljIGFzc2V0cyBpbmNsdWRlZCDigJQgSFRUUCBCYXNpYyBhdXRoIG9uIGFcbiAgICogcHJlLWxhdW5jaCBzaXRlLCBnZW8tZ2F0aW5nLlxuICAgKlxuICAgKiBJdCBtdXN0IGRlZmluZSBgdmlld2VyUmVxdWVzdChldmVudClgIChhIGZ1bmN0aW9uLCBzeW5jIG9yIGFzeW5jLCBvciBhXG4gICAqIGB2YXJgL2BsZXRgL2Bjb25zdGApOiByZXR1cm4gYSByZXNwb25zZSB0byBhbnN3ZXIgdGhlIHZpZXdlciwgb3IgdGhlXG4gICAqIHJlcXVlc3QgKG9yIG5vdGhpbmcpIHRvIGNhcnJ5IG9uLiBJdCBpcyBzcGxpY2VkIGludG8gY2RrLW5leHRqcydzIG93blxuICAgKiB2aWV3ZXItcmVxdWVzdCBmdW5jdGlvbnMsIGFoZWFkIG9mIHRoZWlyIGxvZ2ljLCBzbyBpdCBtYXkgbm90IHVzZSB0aGVcbiAgICogbmFtZSBgaGFuZGxlcmAsIGFuZCB0aGUgY29tYmluZWQgZnVuY3Rpb24gbXVzdCBmaXQgQ2xvdWRGcm9udCdzIDEwIEtCLlxuICAgKiBJdCBydW5zIG9uIGBjbG91ZGZyb250LWpzLTIuMGAsIHNvIGl0IG1heSBiZSBhc3luYyBhbmQgcmVhZFxuICAgKiB7QGxpbmsgdmlld2VyUmVxdWVzdEtleVZhbHVlU3RvcmV9IHdpdGggYGNmLmt2cygpYC4gQSBicmluZy15b3VyLW93blxuICAgKiB7QGxpbmsgZGlzdHJpYnV0aW9ufSdzIGRlZmF1bHQgYmVoYXZpb3IgaXNuJ3QgY292ZXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lXG4gICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Nka2xhYnMvY2RrLW5leHRqcyNydW5uaW5nLWNvZGUtb24tZXZlcnktdmlld2VyLXJlcXVlc3RcbiAgICovXG4gIHJlYWRvbmx5IHZpZXdlclJlcXVlc3RGdW5jdGlvbkNvZGU/OiBGdW5jdGlvbkNvZGU7XG4gIC8qKlxuICAgKiBBIENsb3VkRnJvbnQgS2V5VmFsdWVTdG9yZSBhc3NvY2lhdGVkIHdpdGggZXZlcnkgdmlld2VyLXJlcXVlc3QgZnVuY3Rpb25cbiAgICoge0BsaW5rIHZpZXdlclJlcXVlc3RGdW5jdGlvbkNvZGV9IGlzIGNvcGllZCBpbnRvICh1cCB0byB0aHJlZSwgb25lIHBlciBraW5kXG4gICAqIG9mIGJlaGF2aW9yKSwgc28gdmFsdWVzIGl0IHJlYWRzIOKAlCBCYXNpYyBhdXRoIGNyZWRlbnRpYWxzLCBhbiBhbGxvd2xpc3Qg4oCUXG4gICAqIGxpdmUgb3V0c2lkZSB0aGUgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUgYW5kIGNoYW5nZSB3aXRob3V0IGEgZGVwbG95LlxuICAgKiBSZWFkIGl0IHdpdGggYGNmLmt2cygpYCwgbm8gSUQgbmVlZGVkLlxuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvZnVuY3Rpb25zLWN1c3RvbS1tZXRob2RzLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IHZpZXdlclJlcXVlc3RLZXlWYWx1ZVN0b3JlPzogSUtleVZhbHVlU3RvcmU7XG59XG5cbi8qKiBBIG5vbi1kZWZhdWx0IGZ1bmN0aW9uIGdyb3VwIGFuZCB0aGUgb3JpZ2luIGl0cyByb3V0ZXMgbXVzdCByZWFjaC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzRGlzdHJpYnV0aW9uRnVuY3Rpb25Hcm91cCB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqIFRoZSBncm91cCdzIExhbWJkYSBGdW5jdGlvbiBVUkwuICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uVXJsOiBJRnVuY3Rpb25Vcmw7XG59XG5cbmV4cG9ydCBjbGFzcyBOZXh0anNEaXN0cmlidXRpb24gZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBkaXN0cmlidXRpb246IERpc3RyaWJ1dGlvbjtcblxuICBwcml2YXRlIHByb3BzOiBOZXh0anNEaXN0cmlidXRpb25Qcm9wcztcbiAgLyoqXG4gICAqIGBwcm9wcy5iYXNlUGF0aGAgbm9ybWFsaXplZCB0byBhIGJhcmUgcGF0aCBzZWdtZW50LiBUaGlzIGNvbnN0cnVjdCBpcyB0aGVcbiAgICogb25lIHBsYWNlIHRoYXQgbmVlZHMgaXQgd2l0aCBhIGxlYWRpbmcgc2xhc2gg4oCUIENsb3VkRnJvbnQgcGF0aCBwYXR0ZXJucyBhcmVcbiAgICogd3JpdHRlbiBhZ2FpbnN0IHRoZSByZXF1ZXN0IHBhdGgg4oCUIHNvIGl0IHByZXBlbmRzIGl0cyBvd24gcmF0aGVyIHRoYW5cbiAgICogcmVseWluZyBvbiB0aGUgY2FsbGVyIGhhdmluZyBwYXNzZWQgb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBiYXNlUGF0aDogc3RyaW5nO1xuICAvKipcbiAgICogYHByb3BzLmFzc2V0UHJlZml4YCBub3JtYWxpemVkIHRvIGEgbGVhZGluZy1zbGFzaCBwYXRoLCBgXCJcImAgd2hlbiB0aGUgYXBwXG4gICAqIHNldHMgbm9uZSBvciBzZXRzIG9uZSB0aGF0IGFscmVhZHkgZXF1YWxzIHRoZSBgYmFzZVBhdGhgIHByZWZpeCDigJQgaW4gd2hpY2hcbiAgICogY2FzZSB0aGUgb3JkaW5hcnkgYF9uZXh0L3N0YXRpYypgIGJlaGF2aW9yIGFscmVhZHkgY292ZXJzIGl0IGFuZCBhIHNlY29uZCBvbmVcbiAgICogd291bGQgYmUgYSBkdXBsaWNhdGUgcGF0dGVybiBDbG91ZEZyb250IHJlamVjdHMuXG4gICAqL1xuICBwcml2YXRlIGFzc2V0UHJlZml4OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDb21tb24gc2VjdXJpdHkgaGVhZGVycyBhcHBsaWVkIGJ5IGRlZmF1bHQgdG8gYWxsIG9yaWdpbnNcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvdXNpbmctbWFuYWdlZC1yZXNwb25zZS1oZWFkZXJzLXBvbGljaWVzLmh0bWwjbWFuYWdlZC1yZXNwb25zZS1oZWFkZXJzLXBvbGljaWVzLXNlY3VyaXR5XG4gICAqL1xuICBwcml2YXRlIGNvbW1vblNlY3VyaXR5SGVhZGVyc0JlaGF2aW9yOiBSZXNwb25zZVNlY3VyaXR5SGVhZGVyc0JlaGF2aW9yID0ge1xuICAgIGNvbnRlbnRUeXBlT3B0aW9uczogeyBvdmVycmlkZTogZmFsc2UgfSxcbiAgICBmcmFtZU9wdGlvbnM6IHtcbiAgICAgIGZyYW1lT3B0aW9uOiBIZWFkZXJzRnJhbWVPcHRpb24uU0FNRU9SSUdJTixcbiAgICAgIG92ZXJyaWRlOiBmYWxzZSxcbiAgICB9LFxuICAgIHJlZmVycmVyUG9saWN5OiB7XG4gICAgICBvdmVycmlkZTogZmFsc2UsXG4gICAgICByZWZlcnJlclBvbGljeTogSGVhZGVyc1JlZmVycmVyUG9saWN5LlNUUklDVF9PUklHSU5fV0hFTl9DUk9TU19PUklHSU4sXG4gICAgfSxcblxuICAgIHN0cmljdFRyYW5zcG9ydFNlY3VyaXR5OiB7XG4gICAgICBhY2Nlc3NDb250cm9sTWF4QWdlOiBEdXJhdGlvbi5kYXlzKDM2NSksXG4gICAgICBpbmNsdWRlU3ViZG9tYWluczogdHJ1ZSxcbiAgICAgIG92ZXJyaWRlOiBmYWxzZSxcbiAgICAgIHByZWxvYWQ6IHRydWUsXG4gICAgfSxcbiAgICB4c3NQcm90ZWN0aW9uOiB7IG92ZXJyaWRlOiBmYWxzZSwgcHJvdGVjdGlvbjogdHJ1ZSwgbW9kZUJsb2NrOiB0cnVlIH0sXG4gIH07XG4gIHByaXZhdGUgc3RhdGljT3JpZ2luOiBJT3JpZ2luO1xuICBwcml2YXRlIGR5bmFtaWNPcmlnaW46IElPcmlnaW47XG4gIHByaXZhdGUgZHluYW1pY09yaWdpblJlc3BvbnNlUG9saWN5OiBJT3JpZ2luUmVxdWVzdFBvbGljeTtcbiAgcHJpdmF0ZSBkeW5hbWljQ2xvdWRGcm9udEZ1bmN0aW9uQXNzb2NpYXRpb25zOiBGdW5jdGlvbkFzc29jaWF0aW9uW107XG4gIC8qKlxuICAgKiBgdmlld2VyUmVxdWVzdEZ1bmN0aW9uQ29kZWAsIHJlbmRlcmVkIGFuZCBjaGVja2VkIG9uY2UsIHNpbmNlXG4gICAqIGBGdW5jdGlvbkNvZGUuZnJvbUZpbGVgIHJlYWRzIHRoZSBmaWxlIG9uIGV2ZXJ5IHJlbmRlci5cbiAgICovXG4gIHByaXZhdGUgdmlld2VyUmVxdWVzdENvZGU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdmlld2VyLXJlcXVlc3QgZnVuY3Rpb24gYHZpZXdlclJlcXVlc3RGdW5jdGlvbkNvZGVgIGFkZHMgdG8gYmVoYXZpb3JzXG4gICAqIHdpdGggbm8gdmlld2VyLXJlcXVlc3QgbG9naWMgb2YgdGhlaXIgb3duLCBzaGFyZWQgYnkgYWxsIG9mIHRoZW0sIHNvIHRoZVxuICAgKiBgYXNzZXRQcmVmaXhgIGJlaGF2aW9yLCB3aGljaCBoYXMgYSB2aWV3ZXItcmVxdWVzdCBmdW5jdGlvbiBvZiBpdHMgb3duLFxuICAgKiBjYW4gdGVsbCBpdCBmcm9tIGFuIG92ZXJyaWRlJ3MuXG4gICAqL1xuICBwcml2YXRlIHBhc3NUaHJvdWdoRnVuY3Rpb24/OiBDbG91ZEZyb250RnVuY3Rpb247XG4gIHByaXZhdGUgaXNGdW5jdGlvbkNvbXB1dGU6IGJvb2xlYW47XG4gIHByaXZhdGUgc3RhdGljQmVoYXZpb3JPcHRpb25zOiBCZWhhdmlvck9wdGlvbnM7XG4gIHByaXZhdGUgZHluYW1pY0JlaGF2aW9yT3B0aW9uczogQmVoYXZpb3JPcHRpb25zO1xuICBwcml2YXRlIGltYWdlQmVoYXZpb3JPcHRpb25zOiBCZWhhdmlvck9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE5leHRqc0Rpc3RyaWJ1dGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgaWYgKHByb3BzLnZpZXdlclJlcXVlc3RLZXlWYWx1ZVN0b3JlICYmICFwcm9wcy52aWV3ZXJSZXF1ZXN0RnVuY3Rpb25Db2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke0xPR19QUkVGSVh9IFxcYHZpZXdlclJlcXVlc3RLZXlWYWx1ZVN0b3JlXFxgIGlzIG9ubHkgYXNzb2NpYXRlZCB3aXRoIGAgK1xuICAgICAgICAgIGB0aGUgZnVuY3Rpb25zIFxcYHZpZXdlclJlcXVlc3RGdW5jdGlvbkNvZGVcXGAgcnVucyBpbiwgc28gaXQgbmVlZHMgYCArXG4gICAgICAgICAgYFxcYHZpZXdlclJlcXVlc3RGdW5jdGlvbkNvZGVcXGAgdG8gcmVhZCBpdC5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy52aWV3ZXJSZXF1ZXN0Q29kZSA9IHRoaXMucmVuZGVyVmlld2VyUmVxdWVzdENvZGUoKTtcbiAgICB0aGlzLmJhc2VQYXRoID0gbm9ybWFsaXplQmFzZVBhdGgocHJvcHMuYmFzZVBhdGgpO1xuICAgIHRoaXMuYXNzZXRQcmVmaXggPSB0aGlzLnJlc29sdmVBc3NldFByZWZpeCgpO1xuICAgIHRoaXMuc3RhdGljT3JpZ2luID0gdGhpcy5jcmVhdGVTdGF0aWNPcmlnaW4oKTtcbiAgICB0aGlzLmlzRnVuY3Rpb25Db21wdXRlID0gcHJvcHMubmV4dGpzVHlwZSA9PT0gTmV4dGpzVHlwZS5HTE9CQUxfRlVOQ1RJT05TO1xuICAgIHRoaXMudmFsaWRhdGVGdW5jdGlvbkdyb3VwUHJvcHMoKTtcbiAgICB0aGlzLmR5bmFtaWNPcmlnaW4gPSB0aGlzLmNyZWF0ZUR5bmFtaWNPcmlnaW4oKTtcbiAgICB0aGlzLmR5bmFtaWNPcmlnaW5SZXNwb25zZVBvbGljeSA9IHRoaXMuY3JlYXRlRHluYW1pY09yaWdpblJlcXVlc3RQb2xpY3koKTtcbiAgICB0aGlzLmR5bmFtaWNDbG91ZEZyb250RnVuY3Rpb25Bc3NvY2lhdGlvbnMgPVxuICAgICAgdGhpcy5jcmVhdGVEeW5hbWljQ2xvdWRGcm9udEZ1bmN0aW9uQXNzb2NpYXRpb25zKCk7XG4gICAgdGhpcy5zdGF0aWNCZWhhdmlvck9wdGlvbnMgPSB0aGlzLmNyZWF0ZVN0YXRpY0JlaGF2aW9yT3B0aW9ucygpO1xuICAgIHRoaXMuZHluYW1pY0JlaGF2aW9yT3B0aW9ucyA9IHRoaXMuY3JlYXRlRHluYW1pY0JlaGF2aW9yT3B0aW9ucygpO1xuICAgIHRoaXMuaW1hZ2VCZWhhdmlvck9wdGlvbnMgPSB0aGlzLmNyZWF0ZUltYWdlQmVoYXZpb3JPcHRpb25zKCk7XG4gICAgdGhpcy5kaXN0cmlidXRpb24gPSB0aGlzLmdldERpc3RyaWJ1dGlvbigpO1xuICAgIGlmICh0aGlzLmlzRnVuY3Rpb25Db21wdXRlKSB7XG4gICAgICB0aGlzLmdyYW50SW52b2tlKERFRkFVTFRfRlVOQ1RJT05fR1JPVVAsIHByb3BzLmZ1bmN0aW9uVXJsISk7XG4gICAgfVxuICAgIHRoaXMuYWRkU3RhdGljQmVoYXZpb3JzKCk7XG4gICAgdGhpcy5hZGREeW5hbWljQmVoYXZpb3JzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIENsb3VkRnJvbnQgY29tbWVudCB0aGF0IGlzIHNhZmUgZm9yIHRoZSAxMjggY2hhcmFjdGVyIGxpbWl0LlxuICAgKiBJZiB0aGUgZnVsbCBjb21tZW50IHdpdGggc3RhY2sgbmFtZSBleGNlZWRzIDEyOCBjaGFyYWN0ZXJzLCByZXR1cm5zIHRoZSBiYXNlIGNvbW1lbnQgb25seS5cbiAgICogQHBhcmFtIGJhc2VDb21tZW50IFRoZSBiYXNlIGNvbW1lbnQgdGV4dFxuICAgKiBAcGFyYW0gc3RhY2tOYW1lIFRoZSBzdGFjayBuYW1lIHRvIGFwcGVuZFxuICAgKiBAcmV0dXJucyBBIGNvbW1lbnQgc3RyaW5nIHRoYXQgaXMgZ3VhcmFudGVlZCB0byBiZSA8IDEyOCBjaGFyYWN0ZXJzXG4gICAqL1xuICBwcml2YXRlIGdldENvbW1lbnQoYmFzZUNvbW1lbnQ6IHN0cmluZywgc3RhY2tOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZ1bGxDb21tZW50ID0gYCR7YmFzZUNvbW1lbnR9IGZvciAke3N0YWNrTmFtZX1gO1xuICAgIHJldHVybiBmdWxsQ29tbWVudC5sZW5ndGggPCAxMjggPyBmdWxsQ29tbWVudCA6IGJhc2VDb21tZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTdGF0aWNPcmlnaW4oKTogSU9yaWdpbiB7XG4gICAgcmV0dXJuIFMzQnVja2V0T3JpZ2luLndpdGhPcmlnaW5BY2Nlc3NDb250cm9sKHRoaXMucHJvcHMuYXNzZXRzQnVja2V0LCB7XG4gICAgICAvLyBMSVNUIGxldHMgUzMgYW5zd2VyIGEgbWlzc2luZyBrZXkgd2l0aCA0MDQgaW5zdGVhZCBvZiA0MDNcbiAgICAgIG9yaWdpbkFjY2Vzc0xldmVsczogW0FjY2Vzc0xldmVsLlJFQUQsIEFjY2Vzc0xldmVsLkxJU1RdLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LnMzQnVja2V0T3JpZ2luUHJvcHMsXG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVEeW5hbWljT3JpZ2luKCk6IElPcmlnaW4ge1xuICAgIGlmICh0aGlzLmlzRnVuY3Rpb25Db21wdXRlKSB7XG4gICAgICBpZiAoIXRoaXMucHJvcHMuZnVuY3Rpb25VcmwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBOZXh0anNEaXN0cmlidXRpb25Qcm9wcy5mdW5jdGlvblVybFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBGdW5jdGlvblVybE9yaWdpbi53aXRoT3JpZ2luQWNjZXNzQ29udHJvbChcbiAgICAgICAgdGhpcy5wcm9wcy5mdW5jdGlvblVybCxcbiAgICAgICAgdGhpcy5wcm9wcy5vdmVycmlkZXM/LmR5bmFtaWNGdW5jdGlvblVybE9yaWdpbldpdGhPQUNQcm9wcyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGxvYWRCYWxhbmNlciA9IHRoaXMucHJvcHMubG9hZEJhbGFuY2VyO1xuICAgICAgaWYgKCFsb2FkQmFsYW5jZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBOZXh0anNEaXN0cmlidXRpb25Qcm9wcy5sb2FkQmFsYW5jZXJcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gVnBjT3JpZ2luLndpdGhBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcihsb2FkQmFsYW5jZXIsIHtcbiAgICAgICAgcHJvdG9jb2xQb2xpY3k6IHRoaXMucHJvcHMuY2VydGlmaWNhdGVcbiAgICAgICAgICA/IE9yaWdpblByb3RvY29sUG9saWN5LkhUVFBTX09OTFlcbiAgICAgICAgICA6IE9yaWdpblByb3RvY29sUG9saWN5LkhUVFBfT05MWSxcbiAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LmR5bmFtaWNWcGNPcmlnaW5XaXRoRW5kcG9pbnRQcm9wcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogTGFtYmRhIEZ1bmN0aW9uIFVSTHMgXCJleHBlY3QgdGhlIGBIb3N0YCBoZWFkZXIgdG8gY29udGFpbiB0aGUgb3JpZ2luIGRvbWFpblxuICAgKiBuYW1lLCBub3QgdGhlIGRvbWFpbiBuYW1lIG9mIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbi5cIlxuICAgKlxuICAgKiBBIGNvbnRhaW5lciBvcmlnaW4gYWxzbyBnZXRzIENsb3VkRnJvbnQncyBvd24gaGVhZGVycywgZm9yXG4gICAqIGBDbG91ZEZyb250LUZvcndhcmRlZC1Qcm90b2A6IHdpdGhvdXQgYSBjZXJ0aWZpY2F0ZSBDbG91ZEZyb250IHJlYWNoZXMgdGhlXG4gICAqIEFMQiBvdmVyIHBsYWluIEhUVFAsIHNvIHRoZSBBTEIncyBgWC1Gb3J3YXJkZWQtUHJvdG9gIGlzIGBodHRwYCwgYW5kIHRoZVxuICAgKiBydW50aW1lIHdvdWxkIGJ1aWxkIGV2ZXJ5IGFic29sdXRlIFVSTCAoYHJlcXVlc3QudXJsYCwgdGhlIG9yaWdpbiBhIHNlcnZlclxuICAgKiBhY3Rpb24gaXMgZm9yd2FyZGVkIHRvKSBhcyBgaHR0cDovL2AgYmVoaW5kIGEgdmlld2VyIG9uIEhUVFBTLlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS91c2luZy1tYW5hZ2VkLW9yaWdpbi1yZXF1ZXN0LXBvbGljaWVzLmh0bWwjbWFuYWdlZC1vcmlnaW4tcmVxdWVzdC1wb2xpY3ktYWxsLXZpZXdlci1leGNlcHQtaG9zdC1oZWFkZXJcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvdXNpbmctbWFuYWdlZC1vcmlnaW4tcmVxdWVzdC1wb2xpY2llcy5odG1sI21hbmFnZWQtb3JpZ2luLXJlcXVlc3QtcG9saWN5LWFsbC12aWV3ZXItYW5kLWNsb3VkZnJvbnRcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRHluYW1pY09yaWdpblJlcXVlc3RQb2xpY3koKTogSU9yaWdpblJlcXVlc3RQb2xpY3kge1xuICAgIHJldHVybiB0aGlzLmlzRnVuY3Rpb25Db21wdXRlXG4gICAgICA/IE9yaWdpblJlcXVlc3RQb2xpY3kuQUxMX1ZJRVdFUl9FWENFUFRfSE9TVF9IRUFERVJcbiAgICAgIDogT3JpZ2luUmVxdWVzdFBvbGljeS5BTExfVklFV0VSX0FORF9DTE9VREZST05UXzIwMjI7XG4gIH1cbiAgLyoqXG4gICAqIEVuc3VyZXMgTmV4dC5qcyBgcmVxdWVzdC51cmxgIHdpbGwgYmUgY29ycmVjdCBkb21haW4gaW5zdGVhZCBvZiBVUkwgb2ZcbiAgICogY29tcHV0ZSAoTGFtYmRhIG9yIEZhcmdhdGUpXG4gICAqIEBzZWUgaHR0cHM6Ly9vcGVuLW5leHQuanMub3JnL2FkdmFuY2VkL3dvcmthcm91bmQjd29ya2Fyb3VuZC1zZXQteC1mb3J3YXJkZWQtaG9zdC1oZWFkZXItYXdzLXNwZWNpZmljXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUR5bmFtaWNDbG91ZEZyb250RnVuY3Rpb25Bc3NvY2lhdGlvbnMoKTogRnVuY3Rpb25Bc3NvY2lhdGlvbltdIHtcbiAgICBjb25zdCBhc3NvY2lhdGlvbnM6IEZ1bmN0aW9uQXNzb2NpYXRpb25bXSA9IFtdO1xuICAgIGlmICh0aGlzLmlzRnVuY3Rpb25Db21wdXRlKSB7XG4gICAgICBjb25zdCBjbG91ZEZyb250Rm4gPSBuZXcgQ2xvdWRGcm9udEZ1bmN0aW9uKHRoaXMsIFwiQ2xvdWRGcm9udEZuXCIsIHtcbiAgICAgICAgLi4udGhpcy52aWV3ZXJSZXF1ZXN0RnVuY3Rpb25Qcm9wcyhYX0ZPUldBUkRFRF9IT1NUX0hBTkRMRVIpLFxuICAgICAgfSk7XG4gICAgICBhc3NvY2lhdGlvbnMucHVzaCh7XG4gICAgICAgIGV2ZW50VHlwZTogRnVuY3Rpb25FdmVudFR5cGUuVklFV0VSX1JFUVVFU1QsXG4gICAgICAgIGZ1bmN0aW9uOiBjbG91ZEZyb250Rm4sXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudmlld2VyUmVxdWVzdENvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQ29udGFpbmVycyBuZWVkIG5vIGZ1bmN0aW9uIG9mIHRoZWlyIG93biDigJQgdGhlaXIgb3JpZ2luIHNlZXMgdGhlXG4gICAgICAvLyB2aWV3ZXIncyBgSG9zdGAg4oCUIHNvIHRoaXMgb25lIG9ubHkgcnVucyB0aGUgdXNlcidzIGNvZGUuXG4gICAgICBhc3NvY2lhdGlvbnMucHVzaCh7XG4gICAgICAgIGV2ZW50VHlwZTogRnVuY3Rpb25FdmVudFR5cGUuVklFV0VSX1JFUVVFU1QsXG4gICAgICAgIGZ1bmN0aW9uOiB0aGlzLmdldFBhc3NUaHJvdWdoRnVuY3Rpb24oKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gYXNzb2NpYXRpb25zO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gYSBiZWhhdmlvciB3aXRoIG5vIHZpZXdlci1yZXF1ZXN0IGxvZ2ljIG9mIGl0cyBvd24gZ2V0cyB3aGVuXG4gICAqIGB2aWV3ZXJSZXF1ZXN0RnVuY3Rpb25Db2RlYCBpcyBzZXQsIGNyZWF0ZWQgb24gZmlyc3QgdXNlLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRQYXNzVGhyb3VnaEZ1bmN0aW9uKCkge1xuICAgIHRoaXMucGFzc1Rocm91Z2hGdW5jdGlvbiA/Pz0gbmV3IENsb3VkRnJvbnRGdW5jdGlvbihcbiAgICAgIHRoaXMsXG4gICAgICBcIlZpZXdlclJlcXVlc3RGblwiLFxuICAgICAge1xuICAgICAgICBjb21tZW50OiB0aGlzLmdldENvbW1lbnQoXG4gICAgICAgICAgXCJOZXh0SlMgdmlld2VyIHJlcXVlc3RcIixcbiAgICAgICAgICBTdGFjay5vZih0aGlzKS5zdGFja05hbWUsXG4gICAgICAgICksXG4gICAgICAgIC4uLnRoaXMudmlld2VyUmVxdWVzdEZ1bmN0aW9uUHJvcHMoUEFTU19USFJPVUdIX0hBTkRMRVIpLFxuICAgICAgfSxcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnBhc3NUaHJvdWdoRnVuY3Rpb247XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBjb2RlLCBydW50aW1lIGFuZCBLZXlWYWx1ZVN0b3JlIG9mIGEgZnVuY3Rpb24gd2hvc2UgYGhhbmRsZXJgIGlzXG4gICAqIGNkay1uZXh0anMncywgd2l0aCBgdmlld2VyUmVxdWVzdEZ1bmN0aW9uQ29kZWAgc3BsaWNlZCBpblxuICAgKiAoe0BsaW5rIHNwbGljZVZpZXdlclJlcXVlc3R9KSBhbmQgY2hlY2tlZCBhZ2FpbnN0IENsb3VkRnJvbnQncyBzaXplIGxpbWl0LlxuICAgKlxuICAgKiBFdmVyeSBvbmUgcnVucyBvbiBgY2xvdWRmcm9udC1qcy0yLjBgLCB0aGUgcnVudGltZSBBV1MgcmVjb21tZW5kcyBhbmQgdGhlXG4gICAqIG9uZSB3aXRoIGBhc3luY2AgYW5kIEtleVZhbHVlU3RvcmVzLCBzbyB0aGUgaGFuZGxlcnMgYXJlIGFsbCBgYXN5bmNgXG4gICAqIHdoZXRoZXIgb3Igbm90IHRoZXJlIGlzIHVzZXIgY29kZSB0byBhd2FpdC5cbiAgICovXG4gIHByaXZhdGUgdmlld2VyUmVxdWVzdEZ1bmN0aW9uUHJvcHMoXG4gICAgaGFuZGxlcjogc3RyaW5nLFxuICApOiBQaWNrPEZ1bmN0aW9uUHJvcHMsIFwiY29kZVwiIHwgXCJydW50aW1lXCIgfCBcImtleVZhbHVlU3RvcmVcIj4ge1xuICAgIGNvbnN0IHVzZXJDb2RlID0gdGhpcy52aWV3ZXJSZXF1ZXN0Q29kZTtcbiAgICBjb25zdCBjb2RlID0gc3BsaWNlVmlld2VyUmVxdWVzdChoYW5kbGVyLCB1c2VyQ29kZSk7XG4gICAgaWYgKHVzZXJDb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IEZ1bmN0aW9uQ29kZS5mcm9tSW5saW5lKGNvZGUpLFxuICAgICAgICBydW50aW1lOiBGdW5jdGlvblJ1bnRpbWUuSlNfMl8wLFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3Qgc2l6ZSA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGNvZGUpO1xuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQoY29kZSkpIHtcbiAgICAgIC8vIEEgdG9rZW4ncyBwbGFjZWhvbGRlciBpc24ndCB0aGUgbGVuZ3RoIG9mIHdoYXQgaXQgcmVzb2x2ZXMgdG8uXG4gICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nKFxuICAgICAgICBgJHtMT0dfUFJFRklYfSBcXGB2aWV3ZXJSZXF1ZXN0RnVuY3Rpb25Db2RlXFxgIGNvbnRhaW5zIGEgQ0RLIHRva2VuLCBzbyBgICtcbiAgICAgICAgICBgaXRzIHNpemUgY2FuJ3QgYmUgY2hlY2tlZCBhZ2FpbnN0IENsb3VkRnJvbnQncyBsaW1pdCBvZiBgICtcbiAgICAgICAgICBgJHtNQVhfRlVOQ1RJT05fQ09ERV9CWVRFU30gYnl0ZXMgdW50aWwgZGVwbG95LmAsXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoc2l6ZSA+IE1BWF9GVU5DVElPTl9DT0RFX0JZVEVTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke0xPR19QUkVGSVh9IFxcYHZpZXdlclJlcXVlc3RGdW5jdGlvbkNvZGVcXGAgbWFrZXMgYSBDbG91ZEZyb250IGAgK1xuICAgICAgICAgIGBGdW5jdGlvbiBvZiAke3NpemV9IGJ5dGVzLCBjZGstbmV4dGpzJ3Mgb3duIGNvZGUgaW5jbHVkZWQsIG92ZXIgYCArXG4gICAgICAgICAgYENsb3VkRnJvbnQncyBsaW1pdCBvZiAke01BWF9GVU5DVElPTl9DT0RFX0JZVEVTfS4gU2hvcnRlbiBpdCBgICtcbiAgICAgICAgICBgKGNvbW1lbnRzIGFuZCB3aGl0ZXNwYWNlIGNvdW50KS4gU2VlIGAgK1xuICAgICAgICAgIGBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY2xvdWRmcm9udC1saW1pdHMuaHRtbCNsaW1pdHMtZnVuY3Rpb25zYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBGdW5jdGlvbkNvZGUuZnJvbUlubGluZShjb2RlKSxcbiAgICAgIHJ1bnRpbWU6IEZ1bmN0aW9uUnVudGltZS5KU18yXzAsXG4gICAgICBrZXlWYWx1ZVN0b3JlOiB0aGlzLnByb3BzLnZpZXdlclJlcXVlc3RLZXlWYWx1ZVN0b3JlLFxuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIGB2aWV3ZXJSZXF1ZXN0RnVuY3Rpb25Db2RlYCwgcmVuZGVyZWQgb25jZSwgc2luY2UgYEZ1bmN0aW9uQ29kZS5mcm9tRmlsZWBcbiAgICogcmVhZHMgdGhlIGZpbGUgb24gZXZlcnkgcmVuZGVyLCBhbmQgY2hlY2tlZFxuICAgKiAoe0BsaW5rIGNoZWNrVmlld2VyUmVxdWVzdENvZGV9KS5cbiAgICovXG4gIHByaXZhdGUgcmVuZGVyVmlld2VyUmVxdWVzdENvZGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB1c2VyQ29kZSA9IHRoaXMucHJvcHMudmlld2VyUmVxdWVzdEZ1bmN0aW9uQ29kZT8ucmVuZGVyKCk7XG4gICAgaWYgKHVzZXJDb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNoZWNrVmlld2VyUmVxdWVzdENvZGUodXNlckNvZGUpO1xuICAgIHJldHVybiB1c2VyQ29kZTtcbiAgfVxuICAvKipcbiAgICogQ2xvdWRGcm9udCBhbGxvd3Mgb25lIGZ1bmN0aW9uIHBlciBldmVudCB0eXBlIHBlciBiZWhhdmlvciwgc28gYW5cbiAgICogb3ZlcnJpZGUncyB2aWV3ZXItcmVxdWVzdCBhc3NvY2lhdGlvbiBhbmQgb25lIGNkay1uZXh0anMgbmVlZHMgY2FuJ3QgYm90aFxuICAgKiBiZSBrZXB0LiBUaHJvd24gYXQgc3ludGgsIHdoZXJlIGJvdGggaGFsdmVzIGFyZSBrbm93biwgcmF0aGVyIHRoYW4gbGVmdCB0b1xuICAgKiBhIGRlcGxveSB0aGF0IG5hbWVzIG5laXRoZXIuXG4gICAqL1xuICBwcml2YXRlIGFzc2VydFZpZXdlclJlcXVlc3RVbmNsYWltZWQoXG4gICAgb3ZlcnJpZGVOYW1lOiBzdHJpbmcsXG4gICAgYXNzb2NpYXRpb25zOiBGdW5jdGlvbkFzc29jaWF0aW9uW10gfCB1bmRlZmluZWQsXG4gICAgbmVlZHM6IHN0cmluZyxcbiAgKSB7XG4gICAgY29uc3QgY2xhaW1lZCA9IChhc3NvY2lhdGlvbnMgPz8gW10pLnNvbWUoXG4gICAgICAoYXNzb2NpYXRpb24pID0+XG4gICAgICAgIGFzc29jaWF0aW9uLmV2ZW50VHlwZSA9PT0gRnVuY3Rpb25FdmVudFR5cGUuVklFV0VSX1JFUVVFU1QsXG4gICAgKTtcbiAgICBpZiAoY2xhaW1lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtMT0dfUFJFRklYfSBcXGBvdmVycmlkZXMuJHtvdmVycmlkZU5hbWV9LmZ1bmN0aW9uQXNzb2NpYXRpb25zXFxgIGAgK1xuICAgICAgICAgIGBhc3NvY2lhdGVzIGEgQ2xvdWRGcm9udCBmdW5jdGlvbiB3aXRoIGAgK1xuICAgICAgICAgIGAke0Z1bmN0aW9uRXZlbnRUeXBlLlZJRVdFUl9SRVFVRVNUfSwgYnV0ICR7bmVlZHN9LiBgICtcbiAgICAgICAgICBgQ2xvdWRGcm9udCBwZXJtaXRzIG9ubHkgb25lIGZ1bmN0aW9uIHBlciBldmVudCB0eXBlIHBlciBiZWhhdmlvci4gYCArXG4gICAgICAgICAgYE1vdmUgdGhlIGxvZ2ljIGludG8gXFxgdmlld2VyUmVxdWVzdEZ1bmN0aW9uQ29kZVxcYCwgd2hpY2ggcnVucyBgICtcbiAgICAgICAgICBgaW5zaWRlIGNkay1uZXh0anMncyBvd24gdmlld2VyLXJlcXVlc3QgZnVuY3Rpb24gb24gZXZlcnkgYmVoYXZpb3IuYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgY3JlYXRlU3RhdGljQmVoYXZpb3JPcHRpb25zKCk6IEJlaGF2aW9yT3B0aW9ucyB7XG4gICAgY29uc3Qgc3RhdGljQmVoYXZpb3JPcHRpb25zID0gdGhpcy5wcm9wcy5vdmVycmlkZXM/LnN0YXRpY0JlaGF2aW9yT3B0aW9ucztcbiAgICBjb25zdCByZXNwb25zZUhlYWRlcnNQb2xpY3kgPVxuICAgICAgc3RhdGljQmVoYXZpb3JPcHRpb25zPy5yZXNwb25zZUhlYWRlcnNQb2xpY3kgPz9cbiAgICAgIG5ldyBSZXNwb25zZUhlYWRlcnNQb2xpY3kodGhpcywgXCJTdGF0aWNSZXNwb25zZUhlYWRlcnNQb2xpY3lcIiwge1xuICAgICAgICBzZWN1cml0eUhlYWRlcnNCZWhhdmlvcjogdGhpcy5jb21tb25TZWN1cml0eUhlYWRlcnNCZWhhdmlvcixcbiAgICAgICAgY29tbWVudDogdGhpcy5nZXRDb21tZW50KFxuICAgICAgICAgIFwiTmV4dEpTIFN0YXRpYyBSZXNwb25zZSBIZWFkZXJzIFBvbGljeVwiLFxuICAgICAgICAgIFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZSxcbiAgICAgICAgKSxcbiAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LnN0YXRpY1Jlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzLFxuICAgICAgfSk7XG4gICAgY29uc3Qgb3B0aW9uczogQmVoYXZpb3JPcHRpb25zID0ge1xuICAgICAgYWxsb3dlZE1ldGhvZHM6IEFsbG93ZWRNZXRob2RzLkFMTE9XX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICBjYWNoZWRNZXRob2RzOiBDYWNoZWRNZXRob2RzLkNBQ0hFX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICBjYWNoZVBvbGljeTogQ2FjaGVQb2xpY3kuQ0FDSElOR19PUFRJTUlaRUQsXG4gICAgICBvcmlnaW46IHRoaXMuc3RhdGljT3JpZ2luLFxuICAgICAgcmVzcG9uc2VIZWFkZXJzUG9saWN5LFxuICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IFZpZXdlclByb3RvY29sUG9saWN5LlJFRElSRUNUX1RPX0hUVFBTLFxuICAgICAgLi4uc3RhdGljQmVoYXZpb3JPcHRpb25zLFxuICAgIH07XG4gICAgaWYgKHRoaXMudmlld2VyUmVxdWVzdENvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuICAgIHRoaXMuYXNzZXJ0Vmlld2VyUmVxdWVzdFVuY2xhaW1lZChcbiAgICAgIFwic3RhdGljQmVoYXZpb3JPcHRpb25zXCIsXG4gICAgICBzdGF0aWNCZWhhdmlvck9wdGlvbnM/LmZ1bmN0aW9uQXNzb2NpYXRpb25zLFxuICAgICAgXCJgdmlld2VyUmVxdWVzdEZ1bmN0aW9uQ29kZWAgbmVlZHMgdGhhdCBldmVudCB0eXBlIG9uIHRoZSBzdGF0aWMgYmVoYXZpb3JzXCIsXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGZ1bmN0aW9uQXNzb2NpYXRpb25zOiBbXG4gICAgICAgIC4uLihzdGF0aWNCZWhhdmlvck9wdGlvbnM/LmZ1bmN0aW9uQXNzb2NpYXRpb25zID8/IFtdKSxcbiAgICAgICAge1xuICAgICAgICAgIGV2ZW50VHlwZTogRnVuY3Rpb25FdmVudFR5cGUuVklFV0VSX1JFUVVFU1QsXG4gICAgICAgICAgZnVuY3Rpb246IHRoaXMuZ2V0UGFzc1Rocm91Z2hGdW5jdGlvbigpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG4gIHByaXZhdGUgY3JlYXRlRHluYW1pY0JlaGF2aW9yT3B0aW9ucygpOiBCZWhhdmlvck9wdGlvbnMge1xuICAgIGNvbnN0IGR5bmFtaWNCZWhhdmlvck9wdGlvbnMgPSB0aGlzLnByb3BzLm92ZXJyaWRlcz8uZHluYW1pY0JlaGF2aW9yT3B0aW9ucztcbiAgICBjb25zdCBjYWNoZVBvbGljeVByb3BzID0gdGhpcy5wcm9wcy5vdmVycmlkZXM/LmR5bmFtaWNDYWNoZVBvbGljeVByb3BzO1xuICAgIC8vIGNyZWF0ZSBkZWZhdWx0IGNhY2hlIHBvbGljeSBpZiBub3QgcHJvdmlkZWRcbiAgICBjb25zdCBjYWNoZVBvbGljeSA9XG4gICAgICBkeW5hbWljQmVoYXZpb3JPcHRpb25zPy5jYWNoZVBvbGljeSA/P1xuICAgICAgbmV3IENhY2hlUG9saWN5KHRoaXMsIFwiRHluYW1pY0NhY2hlUG9saWN5XCIsIHtcbiAgICAgICAgLi4uKGlzQ2FjaGluZ0Rpc2FibGVkKGNhY2hlUG9saWN5UHJvcHMpXG4gICAgICAgICAgPyBESVNBQkxFRF9DQUNIRV9LRVlcbiAgICAgICAgICA6IERZTkFNSUNfQ0FDSEVfS0VZKSxcbiAgICAgICAgLy8gQSByZXNwb25zZSB3aXRoIG5vIGBDYWNoZS1Db250cm9sYCBpcyBub3QgY2FjaGVkLCB3aGljaCBpcyB3aGF0IE5leHQuanNcbiAgICAgICAgLy8gYW5kIGV2ZXJ5IGFwcCB3cml0dGVuIGZvciBpdCBhc3N1bWU6IGEgZHluYW1pYyByb3V0ZSBoYW5kbGVyIHNldHMgbm9uZS5cbiAgICAgICAgLy8gQ0RLJ3MgZGVmYXVsdCBpcyBhIGRheSwgd2hpY2ggY2FjaGVkIGAvYXBpLypgIHJlc3BvbnNlcyBhdCB0aGUgZWRnZSBmb3JcbiAgICAgICAgLy8gMjQgaG91cnMuIEFueXRoaW5nIE5leHQuanMgKm1lYW5zKiB0byBjYWNoZSAtIElTUiwgU1NHLCBhIFBQUiBzaGVsbCAtXG4gICAgICAgIC8vIHNheXMgc28gd2l0aCBgcy1tYXhhZ2VgLCB3aGljaCBgbWF4VHRsYCBzdGlsbCBob25vcnMuXG4gICAgICAgIGRlZmF1bHRUdGw6IER1cmF0aW9uLnNlY29uZHMoMCksXG4gICAgICAgIGNvbW1lbnQ6IHRoaXMuZ2V0Q29tbWVudChcbiAgICAgICAgICBcIk5leHRKUyBEeW5hbWljIENhY2hlIFBvbGljeVwiLFxuICAgICAgICAgIFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZSxcbiAgICAgICAgKSxcbiAgICAgICAgLi4uY2FjaGVQb2xpY3lQcm9wcyxcbiAgICAgIH0pO1xuICAgIGNvbnN0IHJlc3BvbnNlSGVhZGVyc1BvbGljeSA9XG4gICAgICBkeW5hbWljQmVoYXZpb3JPcHRpb25zPy5yZXNwb25zZUhlYWRlcnNQb2xpY3kgPz9cbiAgICAgIG5ldyBSZXNwb25zZUhlYWRlcnNQb2xpY3kodGhpcywgXCJEeW5hbWljUmVzcG9uc2VIZWFkZXJzUG9saWN5XCIsIHtcbiAgICAgICAgc2VjdXJpdHlIZWFkZXJzQmVoYXZpb3I6IHRoaXMuY29tbW9uU2VjdXJpdHlIZWFkZXJzQmVoYXZpb3IsXG4gICAgICAgIGNvbW1lbnQ6IHRoaXMuZ2V0Q29tbWVudChcbiAgICAgICAgICBcIk5leHRKUyBEeW5hbWljIFJlc3BvbnNlIEhlYWRlcnMgUG9saWN5XCIsXG4gICAgICAgICAgU3RhY2sub2YodGhpcykuc3RhY2tOYW1lLFxuICAgICAgICApLFxuICAgICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uZHluYW1pY1Jlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzLFxuICAgICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19BTEwsXG4gICAgICBjYWNoZVBvbGljeSxcbiAgICAgIG9yaWdpbjogdGhpcy5keW5hbWljT3JpZ2luLFxuICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeTogdGhpcy5keW5hbWljT3JpZ2luUmVzcG9uc2VQb2xpY3ksXG4gICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3ksXG4gICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogVmlld2VyUHJvdG9jb2xQb2xpY3kuUkVESVJFQ1RfVE9fSFRUUFMsXG4gICAgICAuLi5keW5hbWljQmVoYXZpb3JPcHRpb25zLFxuICAgICAgZnVuY3Rpb25Bc3NvY2lhdGlvbnM6IHRoaXMud2l0aER5bmFtaWNGdW5jdGlvbkFzc29jaWF0aW9ucyhcbiAgICAgICAgXCJkeW5hbWljQmVoYXZpb3JPcHRpb25zXCIsXG4gICAgICAgIGR5bmFtaWNCZWhhdmlvck9wdGlvbnM/LmZ1bmN0aW9uQXNzb2NpYXRpb25zLFxuICAgICAgKSxcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBUaGUgYmVoYXZpb3IncyBmdW5jdGlvbiBhc3NvY2lhdGlvbnM6IGFuIG92ZXJyaWRlJ3MsIHBsdXMgdGhlIHZpZXdlci1yZXF1ZXN0XG4gICAqIGZ1bmN0aW9uIEdsb2JhbCBGdW5jdGlvbnMgZGVwZW5kcyBvbiwgb3IgdGhlIG9uZSBgdmlld2VyUmVxdWVzdEZ1bmN0aW9uQ29kZWBcbiAgICogYWRkcyBvbiBHbG9iYWwgQ29udGFpbmVycy5cbiAgICpcbiAgICogU3ByZWFkaW5nIHRoZSBvdmVycmlkZSdzIGBmdW5jdGlvbkFzc29jaWF0aW9uc2Agb3ZlciBvdXJzIHdvdWxkIHNpbGVudGx5XG4gICAqIGRyb3AgdGhhdCBmdW5jdGlvbiwgYW5kIHdpdGggaXQgdGhlIG9ubHkgdGhpbmcgc3RhbmRpbmcgYmV0d2VlbiBhIHZpZXdlcidzXG4gICAqIG93biBgWC1Gb3J3YXJkZWQtSG9zdGAgYW5kIHRoZSBydW50aW1lLCB3aGljaCB0cnVzdHMgdGhhdCBoZWFkZXIgb24gRnVuY3Rpb25cbiAgICogVVJMIGV2ZW50cyAoYGxhbWJkYS1ldmVudC50c2ApOiBob3N0IGluamVjdGlvbiBpbnRvIHJlZGlyZWN0cyBhbmQgYWJzb2x1dGVcbiAgICogVVJMcywgY2FjaGVkIGZvciBvdGhlciB2aWV3ZXJzIGJlY2F1c2UgdGhlIGhlYWRlciBpcyBub3QgaW4gdGhlIGNhY2hlIGtleS5cbiAgICogU28gb3VycyBpcyBrZXB0LCBhbmQgYW4gb3ZlcnJpZGUgY2xhaW1pbmcgVklFV0VSX1JFUVVFU1Qg4oCUIHdoaWNoIENsb3VkRnJvbnRcbiAgICogYWxsb3dzIG9ubHkgb25lIG9mIHBlciBiZWhhdmlvciDigJQgaXMgYW4gZXJyb3IgcmF0aGVyIHRoYW4gYSByZXBsYWNlbWVudC5cbiAgICovXG4gIHByaXZhdGUgd2l0aER5bmFtaWNGdW5jdGlvbkFzc29jaWF0aW9ucyhcbiAgICBvdmVycmlkZU5hbWU6IHN0cmluZyxcbiAgICBvdmVycmlkZGVuOiBGdW5jdGlvbkFzc29jaWF0aW9uW10gfCB1bmRlZmluZWQsXG4gICk6IEZ1bmN0aW9uQXNzb2NpYXRpb25bXSB7XG4gICAgY29uc3Qgb3VycyA9IHRoaXMuZHluYW1pY0Nsb3VkRnJvbnRGdW5jdGlvbkFzc29jaWF0aW9ucztcbiAgICBpZiAoIW92ZXJyaWRkZW4pIHtcbiAgICAgIHJldHVybiBvdXJzO1xuICAgIH1cbiAgICBpZiAoIW91cnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gb3ZlcnJpZGRlbjtcbiAgICB9XG4gICAgdGhpcy5hc3NlcnRWaWV3ZXJSZXF1ZXN0VW5jbGFpbWVkKFxuICAgICAgb3ZlcnJpZGVOYW1lLFxuICAgICAgb3ZlcnJpZGRlbixcbiAgICAgIHRoaXMuaXNGdW5jdGlvbkNvbXB1dGVcbiAgICAgICAgPyBgTmV4dGpzR2xvYmFsRnVuY3Rpb25zIG5lZWRzIHRoYXQgZXZlbnQgdHlwZSBmb3IgaXRzIG93biBmdW5jdGlvbiwgYCArXG4gICAgICAgICAgICBgd2hpY2ggb3ZlcndyaXRlcyBcXGB4LWZvcndhcmRlZC1ob3N0XFxgIHdpdGggdGhlIHZpZXdlcidzIFxcYEhvc3RcXGAgYCArXG4gICAgICAgICAgICBgKHRoZSBydW50aW1lIHRydXN0cyB0aGF0IGhlYWRlciBiZWhpbmQgQ2xvdWRGcm9udCkgYW5kIHJlZGlyZWN0cyBgICtcbiAgICAgICAgICAgIGByZXBlYXRlZCBzbGFzaGVzYFxuICAgICAgICA6IFwiYHZpZXdlclJlcXVlc3RGdW5jdGlvbkNvZGVgIG5lZWRzIHRoYXQgZXZlbnQgdHlwZSBvbiB0aGUgZHluYW1pYyBcIiArXG4gICAgICAgICAgICBcImFuZCBpbWFnZSBiZWhhdmlvcnNcIixcbiAgICApO1xuICAgIHJldHVybiBbLi4ub3ZlcnJpZGRlbiwgLi4ub3Vyc107XG4gIH1cbiAgLyoqXG4gICAqIGBfbmV4dC9pbWFnZSpgIGdvZXMgdG8gdGhlIHNhbWUgb3JpZ2luIGFzIGV2ZXJ5dGhpbmcgZWxzZSDigJQgdGhlIE5leHQuanNcbiAgICogc2VydmVyIG9wdGltaXplcyBpbWFnZXMgaW4tcHJvY2VzcyDigJQgYnV0IGtlZXBzIGl0cyBvd24gYmVoYXZpb3IgZm9yIHRoZVxuICAgKiBjYWNoZSBwb2xpY3k6IGBxdWVyeVN0cmluZ0JlaGF2aW9yOiBhbGwoKWAgcGx1cyBgYWNjZXB0YCBpbiB0aGUgY2FjaGUga2V5IGlzXG4gICAqIHJpZ2h0IGZvciBpbWFnZSByZXF1ZXN0cyBhbmQgd3JvbmcgZm9yIHRoZSByZXN0LlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVJbWFnZUJlaGF2aW9yT3B0aW9ucygpOiBCZWhhdmlvck9wdGlvbnMge1xuICAgIGNvbnN0IGltYWdlQmVoYXZpb3JPcHRpb25zID0gdGhpcy5wcm9wcy5vdmVycmlkZXM/LmltYWdlQmVoYXZpb3JPcHRpb25zO1xuICAgIC8vIGFkZCBkZWZhdWx0IGNhY2hlIHBvbGljeSBpZiBub3QgcHJvdmlkZWRcbiAgICBjb25zdCBjYWNoZVBvbGljeSA9XG4gICAgICBpbWFnZUJlaGF2aW9yT3B0aW9ucz8uY2FjaGVQb2xpY3kgPz9cbiAgICAgIG5ldyBDYWNoZVBvbGljeSh0aGlzLCBcIkltYWdlQ2FjaGVQb2xpY3lcIiwge1xuICAgICAgICAvLyBTRUNVUklUWSBOT1RFOiBieSBkZWZhdWx0IHdlIGRvbid0IGluY2x1ZGUgY29va2llcyBpbiBjYWNoZSBmb3JcbiAgICAgICAgLy8gaW1hZ2VzIGIvYyBpdCBzaWduaWZpY2FudGx5IGltcHJvdmVzIGltYWdlIHBlcmYgZm9yIG1vc3Qgc2l0ZXMgQlVUXG4gICAgICAgIC8vIGlmIHlvdSBoYXZlIHByaXZhdGUgaW1hZ2VzIGxvY2tlZCBiZWhpbmQgYXV0aCBpbXBsZW1lbnRlZCB3aXRoIGNvb2tpZXNcbiAgICAgICAgLy8geW91IG5lZWQgdG8gb3ZlcnJpZGUgdGhpcy5cbiAgICAgICAgcXVlcnlTdHJpbmdCZWhhdmlvcjogQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLmFsbCgpLFxuICAgICAgICBoZWFkZXJCZWhhdmlvcjogQ2FjaGVIZWFkZXJCZWhhdmlvci5hbGxvd0xpc3QoXCJhY2NlcHRcIiksXG4gICAgICAgIGNvb2tpZUJlaGF2aW9yOiBDYWNoZUNvb2tpZUJlaGF2aW9yLm5vbmUoKSxcbiAgICAgICAgZW5hYmxlQWNjZXB0RW5jb2RpbmdCcm90bGk6IHRydWUsXG4gICAgICAgIGVuYWJsZUFjY2VwdEVuY29kaW5nR3ppcDogdHJ1ZSxcbiAgICAgICAgY29tbWVudDogdGhpcy5nZXRDb21tZW50KFxuICAgICAgICAgIFwiTmV4dEpTIEltYWdlIENhY2hlIFBvbGljeVwiLFxuICAgICAgICAgIFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZSxcbiAgICAgICAgKSxcbiAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LmltYWdlQ2FjaGVQb2xpY3lQcm9wcyxcbiAgICAgIH0pO1xuICAgIC8vIGFkZCBkZWZhdWx0IHJlc3BvbnNlIGhlYWRlcnMgcG9saWN5IGlmIG5vdCBwcm92aWRlZFxuICAgIGNvbnN0IHJlc3BvbnNlSGVhZGVyc1BvbGljeSA9XG4gICAgICBpbWFnZUJlaGF2aW9yT3B0aW9ucz8ucmVzcG9uc2VIZWFkZXJzUG9saWN5ID8/XG4gICAgICBuZXcgUmVzcG9uc2VIZWFkZXJzUG9saWN5KHRoaXMsIFwiSW1hZ2VSZXNwb25zZUhlYWRlcnNQb2xpY3lcIiwge1xuICAgICAgICBzZWN1cml0eUhlYWRlcnNCZWhhdmlvcjogdGhpcy5jb21tb25TZWN1cml0eUhlYWRlcnNCZWhhdmlvcixcbiAgICAgICAgY29tbWVudDogdGhpcy5nZXRDb21tZW50KFxuICAgICAgICAgIFwiTmV4dEpTIEltYWdlIFJlc3BvbnNlIEhlYWRlcnMgUG9saWN5XCIsXG4gICAgICAgICAgU3RhY2sub2YodGhpcykuc3RhY2tOYW1lLFxuICAgICAgICApLFxuICAgICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uaW1hZ2VSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcyxcbiAgICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBhbGxvd2VkTWV0aG9kczogQWxsb3dlZE1ldGhvZHMuQUxMT1dfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgIGNhY2hlZE1ldGhvZHM6IENhY2hlZE1ldGhvZHMuQ0FDSEVfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgIG9yaWdpbjogdGhpcy5keW5hbWljT3JpZ2luLFxuICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeTogdGhpcy5keW5hbWljT3JpZ2luUmVzcG9uc2VQb2xpY3ksXG4gICAgICBjYWNoZVBvbGljeSxcbiAgICAgIHJlc3BvbnNlSGVhZGVyc1BvbGljeSxcbiAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICAgIC4uLmltYWdlQmVoYXZpb3JPcHRpb25zLFxuICAgICAgZnVuY3Rpb25Bc3NvY2lhdGlvbnM6IHRoaXMud2l0aER5bmFtaWNGdW5jdGlvbkFzc29jaWF0aW9ucyhcbiAgICAgICAgXCJpbWFnZUJlaGF2aW9yT3B0aW9uc1wiLFxuICAgICAgICBpbWFnZUJlaGF2aW9yT3B0aW9ucz8uZnVuY3Rpb25Bc3NvY2lhdGlvbnMsXG4gICAgICApLFxuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgb3IgdXNlcyB1c2VyIHNwZWNpZmllZCBDbG91ZEZyb250IERpc3RyaWJ1dGlvblxuICAgKi9cbiAgcHJpdmF0ZSBnZXREaXN0cmlidXRpb24oKTogRGlzdHJpYnV0aW9uIHtcbiAgICBsZXQgZGlzdHJpYnV0aW9uOiBEaXN0cmlidXRpb247XG4gICAgaWYgKHRoaXMucHJvcHMuZGlzdHJpYnV0aW9uKSB7XG4gICAgICBkaXN0cmlidXRpb24gPSB0aGlzLnByb3BzLmRpc3RyaWJ1dGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVW5kZXIgYSBgYmFzZVBhdGhgLCB0aGUgYmVoYXZpb3JzIGNkay1uZXh0anMgYWRkcyBmb3IgaXQgc2VydmUgdGhlXG4gICAgICAvLyBhcHAsIHNvIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRoZSB1c2VyJ3MgdG8gcmVwbGFjZS5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy52aWV3ZXJSZXF1ZXN0Q29kZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICF0aGlzLmJhc2VQYXRoICYmXG4gICAgICAgIHRoaXMucHJvcHMub3ZlcnJpZGVzPy5kaXN0cmlidXRpb25Qcm9wcz8uZGVmYXVsdEJlaGF2aW9yXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGAke0xPR19QUkVGSVh9IFxcYG92ZXJyaWRlcy5kaXN0cmlidXRpb25Qcm9wcy5kZWZhdWx0QmVoYXZpb3JcXGAgYCArXG4gICAgICAgICAgICBgcmVwbGFjZXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IgY2RrLW5leHRqcyBidWlsZHMsIGFuZCB3aXRoIGl0IHRoZSBgICtcbiAgICAgICAgICAgIGB2aWV3ZXItcmVxdWVzdCBmdW5jdGlvbiBcXGB2aWV3ZXJSZXF1ZXN0RnVuY3Rpb25Db2RlXFxgIHJ1bnMgaW4sIGAgK1xuICAgICAgICAgICAgYHNvIHBhZ2VzIGFuZCBBUEkgcm91dGVzIHdvdWxkIHNraXAgaXQuIEN1c3RvbWl6ZSB0aGUgZGVmYXVsdCBgICtcbiAgICAgICAgICAgIGBiZWhhdmlvciB0aHJvdWdoIFxcYG92ZXJyaWRlcy5keW5hbWljQmVoYXZpb3JPcHRpb25zXFxgIGluc3RlYWQuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGRpc3RyaWJ1dGlvbiA9IG5ldyBEaXN0cmlidXRpb24odGhpcywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgICBtaW5pbXVtUHJvdG9jb2xWZXJzaW9uOiBTZWN1cml0eVBvbGljeVByb3RvY29sLlRMU19WMV8yXzIwMjEsXG4gICAgICAgIGRlZmF1bHRCZWhhdmlvcjogdGhpcy5keW5hbWljQmVoYXZpb3JPcHRpb25zLFxuICAgICAgICAvLyBiZXN0IHRvIHVzZSBIVFRQIDIgYW5kIDMgZm9yIGNvbXBhdGFiaWxpdHkgKEhUVFAgMikgYW5kIHBlcmZvcm1hbmNlIChIVFRQMylcbiAgICAgICAgLy8gQ2xvdWRGcm9udCB3aWxsIGNob29zZSBiZXN0IG9wdGlvbiBmb3IgY2xpZW50XG4gICAgICAgIGh0dHBWZXJzaW9uOiBIdHRwVmVyc2lvbi5IVFRQMl9BTkRfMyxcbiAgICAgICAgY29tbWVudDogdGhpcy5nZXRDb21tZW50KFxuICAgICAgICAgIFwiTmV4dEpTIERpc3RyaWJ1dGlvblwiLFxuICAgICAgICAgIFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZSxcbiAgICAgICAgKSxcbiAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBkaXN0cmlidXRpb247XG4gIH1cbiAgcHJpdmF0ZSBhZGREeW5hbWljQmVoYXZpb3JzKCkge1xuICAgIC8vIEltYWdlIEJlaGF2aW9yXG4gICAgdGhpcy5kaXN0cmlidXRpb24uYWRkQmVoYXZpb3IoXG4gICAgICB0aGlzLmdldFBhdGhQYXR0ZXJuKFwiX25leHQvaW1hZ2UqXCIpLFxuICAgICAgdGhpcy5pbWFnZUJlaGF2aW9yT3B0aW9ucy5vcmlnaW4sXG4gICAgICB0aGlzLmltYWdlQmVoYXZpb3JPcHRpb25zLFxuICAgICk7XG4gICAgLy8gRnVuY3Rpb24gZ3JvdXAgYmVoYXZpb3JzLCBiZWZvcmUgdGhlIGJhc2VQYXRoIGNhdGNoLWFsbCBiZWxvdyBhbmQgYWZ0ZXJcbiAgICAvLyBgX25leHQvaW1hZ2UqYCAobm8gZ3JvdXAgcGF0dGVybiBjYW4gbWF0Y2ggYW4gaW1hZ2UgcmVxdWVzdCwgYW5kIGtlZXBpbmdcbiAgICAvLyB0aGUgb3JkZXIgb2YgdGhlIHVuc3BsaXQgY2FzZSBieXRlLWlkZW50aWNhbCBpcyB3b3J0aCBtb3JlIHRoYW4gc3ltbWV0cnkpLlxuICAgIHRoaXMuYWRkRnVuY3Rpb25Hcm91cEJlaGF2aW9ycygpO1xuICAgIC8vIFJvb3QgUGF0aCBCZWhhdmlvcnNcbiAgICBpZiAodGhpcy5iYXNlUGF0aCkge1xuICAgICAgLy8gYmVjYXVzZSB3ZSBhbHJlYWR5IGhhdmUgYSBiYXNlUGF0aCB3ZSBkb24ndCB1c2UgLyBpbnN0ZWFkIHdlIHVzZSAvYmFzZS1wYXRoXG4gICAgICB0aGlzLmRpc3RyaWJ1dGlvbi5hZGRCZWhhdmlvcihcbiAgICAgICAgYC8ke3RoaXMuYmFzZVBhdGh9YCxcbiAgICAgICAgdGhpcy5keW5hbWljQmVoYXZpb3JPcHRpb25zLm9yaWdpbixcbiAgICAgICAgdGhpcy5keW5hbWljQmVoYXZpb3JPcHRpb25zLFxuICAgICAgKTtcbiAgICAgIC8vIHdoZW4gYmFzZVBhdGggaXMgc2V0LCB3ZSBlbXVsYXRlIHRoZSBcImRlZmF1bHQgYmVoYXZpb3JcIiAoKikgZm9yIHRoZSBzaXRlIGFzIGAvYmFzZS1wYXRoLypgXG4gICAgICB0aGlzLmRpc3RyaWJ1dGlvbi5hZGRCZWhhdmlvcihcbiAgICAgICAgdGhpcy5nZXRQYXRoUGF0dGVybihcIipcIiksXG4gICAgICAgIHRoaXMuZHluYW1pY0JlaGF2aW9yT3B0aW9ucy5vcmlnaW4sXG4gICAgICAgIHRoaXMuZHluYW1pY0JlaGF2aW9yT3B0aW9ucyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGlmIG5vIGJhc2UgcGF0aCwgdGhlbiBkZWZhdWx0IGJlaGF2aW9yIHdpbGwgaGFuZGxlIGFsbCBvdGhlciBwYXRoc1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQmVmb3JlIGFueSBiZWhhdmlvciBpcyBjb21wdXRlZDogdGhlIGJ1ZGdldCBhbmQgdGhlIGBwdWJsaWMvYCBjaGVja3MgYm90aFxuICAgKiBnZW5lcmF0ZSB0aGUgZ3JvdXAgcGF0dGVybnMsIGFuZCB3b3VsZCBvdGhlcndpc2UgZmFpbCBmaXJzdCB3aXRoIGEgbGVzc1xuICAgKiB1c2VmdWwgbWVzc2FnZS5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVGdW5jdGlvbkdyb3VwUHJvcHMoKSB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMucHJvcHMuZnVuY3Rpb25Hcm91cHM/Lmxlbmd0aCAmJlxuICAgICAgIXRoaXMucHJvcHMuZnVuY3Rpb25Hcm91cEJlaGF2aW9ycz8ubGVuZ3RoXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5pc0Z1bmN0aW9uQ29tcHV0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcImBmdW5jdGlvbkdyb3Vwc2AgaXMgb25seSBzdXBwb3J0ZWQgYnkgTmV4dGpzR2xvYmFsRnVuY3Rpb25zLlwiLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEV2ZXJ5IGdyb3VwIGJlaGF2aW9yLCBmaW5hbCBwYXRoIHBhdHRlcm4gaW5jbHVkZWQsIGluIHRoZSBvcmRlclxuICAgKiB7QGxpbmsgYWRkRnVuY3Rpb25Hcm91cEJlaGF2aW9yc30gYWRkcyB0aGVtLlxuICAgKi9cbiAgcHJpdmF0ZSBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzKCkge1xuICAgIHJldHVybiAodGhpcy5wcm9wcy5mdW5jdGlvbkdyb3VwQmVoYXZpb3JzID8/IFtdKS5tYXAoKGJlaGF2aW9yKSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IHRoaXMucHJvcHMuZnVuY3Rpb25Hcm91cHM/LmZpbmQoXG4gICAgICAgIChpdCkgPT4gaXQubmFtZSA9PT0gYmVoYXZpb3IuZ3JvdXAsXG4gICAgICApO1xuICAgICAgaWYgKCFncm91cCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYCR7TE9HX1BSRUZJWH0gXFxgZnVuY3Rpb25Hcm91cEJlaGF2aW9yc1xcYCByb3V0ZXMgdG8gZnVuY3Rpb24gZ3JvdXAgYCArXG4gICAgICAgICAgICBgXCIke2JlaGF2aW9yLmdyb3VwfVwiLCB3aGljaCBpcyBub3QgaW4gXFxgZnVuY3Rpb25Hcm91cHNcXGAuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmJlaGF2aW9yLFxuICAgICAgICBncm91cCxcbiAgICAgICAgcGF0aFBhdHRlcm46IHRoaXMuZ2V0UGF0aFBhdHRlcm4oYmVoYXZpb3IucGF0dGVybiksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBPbmUgYmVoYXZpb3IgcGVyIGdyb3VwIHBhdHRlcm4sIG1vc3Qgc3BlY2lmaWMgZmlyc3QuXG4gICAqXG4gICAqIFRoZSBvcmRlciBpcyB0aGUgd2hvbGUgbWVjaGFuaXNtLiBDbG91ZEZyb250IGV2YWx1YXRlcyBiZWhhdmlvcnMgaW4gb3JkZXJcbiAgICogYW5kIHN0b3BzIGF0IHRoZSBmaXJzdCB3aG9zZSBwYXRoIHBhdHRlcm4gbWF0Y2hlcywgYW5kIGBhZGRCZWhhdmlvcmBcbiAgICogYXBwZW5kcyDigJQgc28gYGFwaS8qYCBhZGRlZCBiZWZvcmUgYGFwaS9yZXBvcnRzLypgIHdvdWxkIHN3YWxsb3cgZXZlcnlcbiAgICogcmVwb3J0IHJlcXVlc3QgYW5kIHNlbmQgaXQgdG8gYSBmdW5jdGlvbiB3aG9zZSBwYWNrYWdlIGhhcyBubyByZXBvcnRcbiAgICogZW50cnlwb2ludC4gVGhlIGFkYXB0ZXIgc29ydGVkIHRoZSBsaXN0IHdoZW4gaXQgY2hlY2tlZCBpdCBhZ2FpbnN0IGhvd1xuICAgKiBgYXNzaWduUm91dGVzVG9Hcm91cHNgIHBhY2thZ2VkIHRoZSBzYW1lIHJvdXRlcywgc28gaXQgaXMgYWRkZWQgYXMgaXQgaXMuXG4gICAqL1xuICBwcml2YXRlIGFkZEZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMoKSB7XG4gICAgY29uc3Qgb3JpZ2luUGVyR3JvdXAgPSBuZXcgTWFwPHN0cmluZywgSU9yaWdpbj4oKTtcbiAgICBmb3IgKGNvbnN0IHsgZ3JvdXAsIHBhdGhQYXR0ZXJuIH0gb2YgdGhpcy5mdW5jdGlvbkdyb3VwQmVoYXZpb3JzKCkpIHtcbiAgICAgIGxldCBvcmlnaW4gPSBvcmlnaW5QZXJHcm91cC5nZXQoZ3JvdXAubmFtZSk7XG4gICAgICBpZiAoIW9yaWdpbikge1xuICAgICAgICBvcmlnaW4gPSBGdW5jdGlvblVybE9yaWdpbi53aXRoT3JpZ2luQWNjZXNzQ29udHJvbChcbiAgICAgICAgICBncm91cC5mdW5jdGlvblVybCxcbiAgICAgICAgICB0aGlzLnByb3BzLm92ZXJyaWRlcz8uZHluYW1pY0Z1bmN0aW9uVXJsT3JpZ2luV2l0aE9BQ1Byb3BzLFxuICAgICAgICApO1xuICAgICAgICBvcmlnaW5QZXJHcm91cC5zZXQoZ3JvdXAubmFtZSwgb3JpZ2luKTtcbiAgICAgICAgdGhpcy5ncmFudEludm9rZShncm91cC5uYW1lLCBncm91cC5mdW5jdGlvblVybCk7XG4gICAgICB9XG4gICAgICAvLyBTYW1lIGJlaGF2aW9yIG9wdGlvbnMgYXMgZXZlcnkgb3RoZXIgZHluYW1pYyByb3V0ZSDigJQgb25seSB0aGUgb3JpZ2luXG4gICAgICAvLyBkaWZmZXJzLCBhbmQgaXQgaXMgcGFzc2VkIHNlcGFyYXRlbHkuXG4gICAgICBjb25zdCB7IG9yaWdpbjogX2lnbm9yZWQsIC4uLmJlaGF2aW9yT3B0aW9ucyB9ID1cbiAgICAgICAgdGhpcy5keW5hbWljQmVoYXZpb3JPcHRpb25zO1xuICAgICAgdGhpcy5kaXN0cmlidXRpb24uYWRkQmVoYXZpb3IocGF0aFBhdHRlcm4sIG9yaWdpbiwgYmVoYXZpb3JPcHRpb25zKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIGBsYW1iZGE6SW52b2tlRnVuY3Rpb25gIGZvciBDbG91ZEZyb250LCB3aGljaCBhIEZ1bmN0aW9uIFVSTCBiZWhpbmQgT0FDXG4gICAqIG5lZWRzIGJlc2lkZXMgdGhlIGBsYW1iZGE6SW52b2tlRnVuY3Rpb25VcmxgIGBGdW5jdGlvblVybE9yaWdpbmAgZ3JhbnRzLFxuICAgKiBhbmQgc2NvcGVkIHRoZSBzYW1lIHdheTogdG8gdGhpcyBkaXN0cmlidXRpb24sIGFuZCB0byBjYWxscyB0aGF0IGNvbWVcbiAgICogdGhyb3VnaCB0aGUgRnVuY3Rpb24gVVJMLlxuICAgKi9cbiAgcHJpdmF0ZSBncmFudEludm9rZShncm91cDogc3RyaW5nLCBmdW5jdGlvblVybDogSUZ1bmN0aW9uVXJsKSB7XG4gICAgbmV3IENmblBlcm1pc3Npb24odGhpcywgYEludm9rZUZ1bmN0aW9uLSR7Z3JvdXB9YCwge1xuICAgICAgYWN0aW9uOiBcImxhbWJkYTpJbnZva2VGdW5jdGlvblwiLFxuICAgICAgcHJpbmNpcGFsOiBcImNsb3VkZnJvbnQuYW1hem9uYXdzLmNvbVwiLFxuICAgICAgZnVuY3Rpb25OYW1lOiBmdW5jdGlvblVybC5mdW5jdGlvbkFybixcbiAgICAgIHNvdXJjZUFybjogdGhpcy5kaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uQXJuLFxuICAgICAgaW52b2tlZFZpYUZ1bmN0aW9uVXJsOiB0cnVlLFxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgYGFzc2V0UHJlZml4YCBwYXRoIHRoYXQgbmVlZHMgYSBiZWhhdmlvciBvZiBpdHMgb3duLCBvciBgXCJcImAgZm9yIG5vbmUuXG4gICAqXG4gICAqIEFuIGFic29sdXRlIHByZWZpeCBjb250cmlidXRlcyBpdHMgKnBhdGgqOiBcImh0dHBzOi8vY2RuLmV4YW1wbGUuY29tXCIgbmVlZHMgbm9cbiAgICogYmVoYXZpb3IsIGJ1dCBcImh0dHBzOi8vY2RuLmV4YW1wbGUuY29tL2NkblwiIGRvZXMsIGJlY2F1c2UgYG5leHQgYnVpbGRgXG4gICAqIGNvbXBpbGVzIGEgYC9jZG4vX25leHQvOnBhdGgrYCByZXdyaXRlIG9mIGl0cyBvd24gYW5kIGBuZXh0IHN0YXJ0YCBzZXJ2ZXNcbiAgICogZXZlcnkgYnVuZGxlIHVuZGVyIHRoYXQgcGF0aCDigJQgc28gYSBDRE4gZnJvbnRpbmcgdGhpcyBkaXN0cmlidXRpb24gdGhlcmUgaGFzXG4gICAqIHRvIGJlIGFuc3dlcmVkLiBBIHByZWZpeCBlcXVhbCB0byB0aGUgYGJhc2VQYXRoYCBwcmVmaXggaXMgZHJvcHBlZCDigJQgdGhhdCBpc1xuICAgKiB0aGUgTmV4dC5qcyBkZWZhdWx0IHdoZW4gYGJhc2VQYXRoYCBpcyBzZXQsIGFuZCBgX25leHQvc3RhdGljKmAgYWxyZWFkeVxuICAgKiByZXNvbHZlcyB1bmRlciBpdCwgc28gYWRkaW5nIGEgc2Vjb25kIGlkZW50aWNhbCBwYXR0ZXJuIHdvdWxkIG1ha2UgQ2xvdWRGcm9udFxuICAgKiByZWplY3QgdGhlIGRpc3RyaWJ1dGlvbi5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUFzc2V0UHJlZml4KCk6IHN0cmluZyB7XG4gICAgY29uc3QgcHJlZml4ID0gYXNzZXRQcmVmaXhQYXRoKHRoaXMucHJvcHMuYXNzZXRQcmVmaXggPz8gXCJcIik7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZUJhc2VQYXRoKHByZWZpeCkgPT09IHRoaXMuYmFzZVBhdGggPyBcIlwiIDogcHJlZml4O1xuICB9XG4gIC8qKlxuICAgKiBTZXJ2ZXMgYDxhc3NldFByZWZpeD4vX25leHQvc3RhdGljLypgIGZyb20gdGhlIHNhbWUgUzMgb2JqZWN0cyBhc1xuICAgKiBgX25leHQvc3RhdGljLypgLlxuICAgKlxuICAgKiBOZWVkZWQgYmVjYXVzZSBOZXh0LmpzIHB1dHMgYGFzc2V0UHJlZml4YCBpbiBmcm9udCBvZiBldmVyeSBidW5kbGUgVVJMIGl0XG4gICAqIGVtaXRzIHdoaWxlIHRoZSBvYmplY3RzIGtlZXAgdGhlaXIgYDxiYXNlUGF0aD4vX25leHQvc3RhdGljLy4uLmAga2V5cywgYW5kXG4gICAqIGBhc3NldFByZWZpeGAgc2l0cyBvbiB0b3Agb2YgYGJhc2VQYXRoYCByYXRoZXIgdGhhbiB1bmRlciBpdCwgc29cbiAgICogYGdldFBhdGhQYXR0ZXJuYCBpcyBkZWxpYmVyYXRlbHkgbm90IHVzZWQgaGVyZS4gV2l0aG91dCB0aGlzIGJlaGF2aW9yIHRoZVxuICAgKiByZXF1ZXN0IGZhbGxzIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgb25lLCByZWFjaGVzIHRoZSBjb21wdXRlIG9yaWdpbiwgYW5kXG4gICAqIDQwNHM6IHRoZSBkZXBsb3ltZW50IHBhY2thZ2UgY2FycmllcyBubyBgLm5leHQvc3RhdGljYCBkaXJlY3RvcnkgYXQgYWxsLlxuICAgKlxuICAgKiBBIHZpZXdlci1yZXF1ZXN0IGZ1bmN0aW9uIGRvZXMgdGhlIHJld3JpdGUgYmVjYXVzZSBhbiBTMyBvcmlnaW4ga2V5cyBvbiB0aGVcbiAgICogcmVxdWVzdCBVUkkgYW5kIGBvcmlnaW5QYXRoYCBjYW4gb25seSBwcmVwZW5kLiBUaGUgcHJlZml4IGlzIGEgc3ludGgtdGltZVxuICAgKiBsaXRlcmFsLCBzbyB0aGUgZnVuY3Rpb24gaXMgYSBmaXhlZC1sZW5ndGggc3RyaW5nIG9wZXJhdGlvbiByYXRoZXIgdGhhbiBhXG4gICAqIHBhcnNlLlxuICAgKi9cbiAgcHJpdmF0ZSBhZGRBc3NldFByZWZpeEJlaGF2aW9yKCkge1xuICAgIC8vIFRoZSBzdGF0aWMgYmVoYXZpb3JzJyBvd24gdmlld2VyLXJlcXVlc3QgZnVuY3Rpb24sIHdoZW5cbiAgICAvLyBgdmlld2VyUmVxdWVzdEZ1bmN0aW9uQ29kZWAgYWRkZWQgb25lLCBnaXZlcyB3YXkgdG8gdGhlIHJld3JpdGUsIHdoaWNoXG4gICAgLy8gcnVucyB0aGUgc2FtZSBjb2RlIGZpcnN0LlxuICAgIGNvbnN0IGFzc29jaWF0aW9ucyA9IChcbiAgICAgIHRoaXMuc3RhdGljQmVoYXZpb3JPcHRpb25zLmZ1bmN0aW9uQXNzb2NpYXRpb25zID8/IFtdXG4gICAgKS5maWx0ZXIoXG4gICAgICAoYXNzb2NpYXRpb24pID0+IGFzc29jaWF0aW9uLmZ1bmN0aW9uICE9PSB0aGlzLnBhc3NUaHJvdWdoRnVuY3Rpb24sXG4gICAgKTtcbiAgICB0aGlzLmFzc2VydFZpZXdlclJlcXVlc3RVbmNsYWltZWQoXG4gICAgICBcInN0YXRpY0JlaGF2aW9yT3B0aW9uc1wiLFxuICAgICAgYXNzb2NpYXRpb25zLFxuICAgICAgYHNlcnZpbmcgXFxgYXNzZXRQcmVmaXhcXGAgKFwiJHt0aGlzLmFzc2V0UHJlZml4fVwiKSBuZWVkcyB0aGF0IGV2ZW50IHR5cGUgYCArXG4gICAgICAgIGB0byByZXdyaXRlIHRoZSByZXF1ZXN0IFVSSSB0byB0aGUgb2JqZWN0J3Mga2V5YCxcbiAgICApO1xuICAgIGNvbnN0IHJld3JpdGUgPSBuZXcgQ2xvdWRGcm9udEZ1bmN0aW9uKHRoaXMsIFwiQXNzZXRQcmVmaXhGblwiLCB7XG4gICAgICBjb21tZW50OiB0aGlzLmdldENvbW1lbnQoXG4gICAgICAgIFwiTmV4dEpTIGFzc2V0UHJlZml4IHJld3JpdGVcIixcbiAgICAgICAgU3RhY2sub2YodGhpcykuc3RhY2tOYW1lLFxuICAgICAgKSxcbiAgICAgIC4uLnRoaXMudmlld2VyUmVxdWVzdEZ1bmN0aW9uUHJvcHMoXG4gICAgICAgIGFzc2V0UHJlZml4UmV3cml0ZUhhbmRsZXIodGhpcy5iYXNlUGF0aCwgdGhpcy5hc3NldFByZWZpeCksXG4gICAgICApLFxuICAgIH0pO1xuICAgIHRoaXMuZGlzdHJpYnV0aW9uLmFkZEJlaGF2aW9yKFxuICAgICAgYCR7dGhpcy5hc3NldFByZWZpeH0vX25leHQvc3RhdGljKmAsXG4gICAgICB0aGlzLnN0YXRpY09yaWdpbixcbiAgICAgIHtcbiAgICAgICAgLi4udGhpcy5zdGF0aWNCZWhhdmlvck9wdGlvbnMsXG4gICAgICAgIGZ1bmN0aW9uQXNzb2NpYXRpb25zOiBbXG4gICAgICAgICAgLi4uYXNzb2NpYXRpb25zLFxuICAgICAgICAgIHsgZXZlbnRUeXBlOiBGdW5jdGlvbkV2ZW50VHlwZS5WSUVXRVJfUkVRVUVTVCwgZnVuY3Rpb246IHJld3JpdGUgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGFkZFN0YXRpY0JlaGF2aW9ycygpIHtcbiAgICB0aGlzLmRpc3RyaWJ1dGlvbi5hZGRCZWhhdmlvcihcbiAgICAgIHRoaXMuZ2V0UGF0aFBhdHRlcm4oXCJfbmV4dC9zdGF0aWMqXCIpLFxuICAgICAgdGhpcy5zdGF0aWNPcmlnaW4sXG4gICAgICB0aGlzLnN0YXRpY0JlaGF2aW9yT3B0aW9ucyxcbiAgICApO1xuICAgIGlmICh0aGlzLmFzc2V0UHJlZml4KSB7XG4gICAgICB0aGlzLmFkZEFzc2V0UHJlZml4QmVoYXZpb3IoKTtcbiAgICB9XG4gICAgY29uc3QgcHVibGljUGF0aFBhdHRlcm5zID0gdGhpcy5wdWJsaWNQYXRoUGF0dGVybnMoKTtcbiAgICB0aGlzLmFzc2VydEJlaGF2aW9yQnVkZ2V0KHB1YmxpY1BhdGhQYXR0ZXJucy5sZW5ndGgpO1xuICAgIHRoaXMuYXNzZXJ0Tm9QdWJsaWNDb2xsaXNpb25zKHB1YmxpY1BhdGhQYXR0ZXJucyk7XG4gICAgZm9yIChjb25zdCBwYXRoUGF0dGVybiBvZiBwdWJsaWNQYXRoUGF0dGVybnMpIHtcbiAgICAgIHRoaXMuZGlzdHJpYnV0aW9uLmFkZEJlaGF2aW9yKFxuICAgICAgICBwYXRoUGF0dGVybixcbiAgICAgICAgdGhpcy5zdGF0aWNPcmlnaW4sXG4gICAgICAgIHRoaXMuc3RhdGljQmVoYXZpb3JPcHRpb25zLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBiZWhhdmlvciBwYXRoIHBhdHRlcm4gZm9yIGVhY2ggdG9wLWxldmVsIGBwdWJsaWMvYCBlbnRyeSwgZmluYWwgZm9ybTpcbiAgICogYC8qYCBmb3IgYSBkaXJlY3RvcnkgYW5kIHRoZSBiYXNlUGF0aCBwcmVmaXggYm90aCBhcHBsaWVkLlxuICAgKlxuICAgKiBBbiBlbnRyeSB3aG9zZSBuYW1lIGhhcyBubyBjaGFyYWN0ZXIgQ2xvdWRGcm9udCBjYW4gc3BlbGwgaXMgbGVmdCBvdXQsIHdpdGhcbiAgICogYSB3YXJuaW5nLCByYXRoZXIgdGhhbiBnaXZlbiBhIHBhdHRlcm4gb2Ygbm90aGluZyBidXQgd2lsZGNhcmRzLiBg0YTQvtGC0L4vYCBpc1xuICAgKiBgPz8/Pz8/Pz8vKmAg4oCUIGFueSA4LWJ5dGUgZmlyc3Qgc2VnbWVudCDigJQgYW5kIHB1YmxpYy8gYmVoYXZpb3JzIGFyZSBhZGRlZFxuICAgKiBhaGVhZCBvZiBldmVyeSBjb21wdXRlIGJlaGF2aW9yLCBzbyBpdCB3b3VsZCBzZW5kIGAvcHJvZHVjdHMvNDJgIGFuZFxuICAgKiBgL3NldHRpbmdzLypgIHRvIFMzLCB3aGljaCBhbnN3ZXJzIDQwMy4gTGVhdmluZyB0aGUgZW50cnkgb3V0IGNvc3RzIGl0cyBvd25cbiAgICogZmlsZXMgaW5zdGVhZDogdGhvc2UgcmVxdWVzdHMgcmVhY2ggdGhlIGNvbXB1dGUsIHdoaWNoIGRvZXMgbm90IGhhdmUgdGhlbSxcbiAgICogYW5kIDQwNC4gT25lIGxpdGVyYWwgY2hhcmFjdGVyIGlzIGVub3VnaCB0byBrZWVwIGEgcGF0dGVybiBuYXJyb3cg4oCUXG4gICAqIGA/Pz8/Pz8/Py5qcGdgIG9ubHkgbWF0Y2hlcyBgLmpwZ2AgcmVxdWVzdHMg4oCUIHNvIG9ubHkgdGhlIGFsbC13aWxkY2FyZCBvbmVzXG4gICAqIGdvLlxuICAgKlxuICAgKiBUaGUgbGVuZ3RoIGxpbWl0IGlzIGNoZWNrZWQgaGVyZSwgb24gdGhlIGZpbmFsIHBhdHRlcm4sIHJhdGhlciB0aGFuIGluXG4gICAqIHtAbGluayB0b1BhdGhQYXR0ZXJufTogdGhlIGAvKmAgYW5kIHRoZSBiYXNlUGF0aCBjb3VudCBhZ2FpbnN0IGl0IHRvbywgYW5kIGFcbiAgICogcGF0dGVybiB0aGF0IHBhc3NlZCB3aXRob3V0IHRoZW0gZmFpbGVkIGF0IGRlcGxveSBpbnN0ZWFkLlxuICAgKi9cbiAgcHJpdmF0ZSBwdWJsaWNQYXRoUGF0dGVybnMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHBhdHRlcm5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHVubWF0Y2hhYmxlOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcHVibGljRmlsZSBvZiB0aGlzLnByb3BzLnB1YmxpY0RpckVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSB0b1BhdGhQYXR0ZXJuKHB1YmxpY0ZpbGUubmFtZSk7XG4gICAgICBpZiAoIS9bXj8qL10vLnRlc3QobmFtZSkpIHtcbiAgICAgICAgdW5tYXRjaGFibGUucHVzaChgXCIke3B1YmxpY0ZpbGUubmFtZX1cImApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhdGhQYXR0ZXJuID0gdGhpcy5nZXRQYXRoUGF0dGVybihcbiAgICAgICAgcHVibGljRmlsZS5pc0RpcmVjdG9yeSA/IGAke25hbWV9LypgIDogbmFtZSxcbiAgICAgICk7XG4gICAgICBpZiAocGF0aFBhdHRlcm4ubGVuZ3RoID4gTUFYX1BBVEhfUEFUVEVSTl9MRU5HVEgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUaGUgcHVibGljLyBlbnRyeSBcIiR7cHVibGljRmlsZS5uYW1lfVwiIG5lZWRzIGEgYCArXG4gICAgICAgICAgICBgJHtwYXRoUGF0dGVybi5sZW5ndGh9LWNoYXJhY3RlciBDbG91ZEZyb250IHBhdGggcGF0dGVybiwgb3ZlciBgICtcbiAgICAgICAgICAgIGB0aGUgJHtNQVhfUEFUSF9QQVRURVJOX0xFTkdUSH0tY2hhcmFjdGVyIGAgK1xuICAgICAgICAgICAgXCJsaW1pdC4gUmVuYW1lIGl0LCBvciBtb3ZlIGl0IGludG8gYSBzdWJkaXJlY3Rvcnkgb2YgcHVibGljLyB3aG9zZSBcIiArXG4gICAgICAgICAgICBcIm93biBuYW1lIGlzIHNob3J0IGVub3VnaC4gU2VlIFwiICtcbiAgICAgICAgICAgIFwiaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL0Rvd25sb2FkRGlzdFZhbHVlc0NhY2hlQmVoYXZpb3IuaHRtbCNEb3dubG9hZERpc3RWYWx1ZXNQYXRoUGF0dGVyblwiLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcGF0dGVybnMucHVzaChwYXRoUGF0dGVybik7XG4gICAgfVxuICAgIGlmICh1bm1hdGNoYWJsZS5sZW5ndGggPiAwKSB7XG4gICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nKFxuICAgICAgICBgJHtMT0dfUFJFRklYfSBUaGVzZSB0b3AtbGV2ZWwgcHVibGljLyBlbnRyaWVzIGhhdmUgbm8gY2hhcmFjdGVyIGEgYCArXG4gICAgICAgICAgXCJDbG91ZEZyb250IHBhdGggcGF0dGVybiBjYW4gc3BlbGwsIHNvIHRoZWlyIHBhdHRlcm4gd291bGQgYmUgXCIgK1xuICAgICAgICAgIFwid2lsZGNhcmRzIGFsb25lIGFuZCB3b3VsZCBjYXB0dXJlIGV2ZXJ5IGFwcCByb3V0ZSBvZiB0aGUgc2FtZSBcIiArXG4gICAgICAgICAgYGxlbmd0aC4gVGhleSBnZXQgbm8gYmVoYXZpb3IsIHNvIHRoZWlyIHJlcXVlc3RzIHJlYWNoIHRoZSBzZXJ2ZXIsIGAgK1xuICAgICAgICAgIGB3aGljaCByZWFkcyB0aGVtIGZyb20gUzMgaW5zdGVhZDogJHt1bm1hdGNoYWJsZS5qb2luKFwiLCBcIil9LiBUbyBzZXJ2ZSBgICtcbiAgICAgICAgICBcInRoZW0gZnJvbSBTMyBkaXJlY3RseSwgcmVuYW1lIHRoZW0sIG9yIG1vdmUgdGhlbSBpbnRvIGEgcHVibGljLyBcIiArXG4gICAgICAgICAgXCJzdWJkaXJlY3Rvcnkgd2hvc2UgbmFtZSBoYXMgYXQgbGVhc3Qgb25lIEFTQ0lJIGxldHRlciBvciBkaWdpdC5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBwYXR0ZXJucztcbiAgfVxuICAvKipcbiAgICogUmVmdXNlIGEgZ3JvdXAgYmVoYXZpb3IgdGhhdCBhIGBwdWJsaWMvYCBiZWhhdmlvciB3b3VsZCBtYWtlIHVucmVhY2hhYmxlLlxuICAgKlxuICAgKiBgcHVibGljL2AgYmVoYXZpb3JzIGFyZSBhZGRlZCBmaXJzdCwgYW5kIENsb3VkRnJvbnQgc3RvcHMgYXQgdGhlIGZpcnN0IG1hdGNoLFxuICAgKiBzbyB0d28gY2FzZXMgc2VuZCBhIGdyb3VwJ3Mgcm91dGUgdG8gUzMgaW5zdGVhZCBvZiBpdHMgZnVuY3Rpb24g4oCUIHdoaWNoIGlzXG4gICAqIHdoeSB0aGlzIGlzIGNoZWNrZWQgYXQgc3ludGgsIHdoZXJlIGJvdGggc2lkZXMgYXJlIGtub3duOlxuICAgKiAtIHRoZSBzYW1lIHBhdHRlcm4gdHdpY2U6IGBwdWJsaWMvZG9jcy9gIGFuZCBgL2RvY3MvKipgIGJvdGggZGVwbG95IGFzXG4gICAqICAgYGRvY3MvKmAuIFRoZSBzeW50aCBzdWNjZWVkZWQgYW5kIENsb3VkRnJvbnQgcmVqZWN0ZWQgdGhlIGRlcGxveS5cbiAgICogLSBhIGdyb3VwIHBhdHRlcm4gdW5kZXIgYSBwdWJsaWMgZGlyZWN0b3J5OiBgL2RvY3MvZ3VpZGUvKipgIGJlaGluZFxuICAgKiAgIGBkb2NzLypgIGRlcGxveXMgYW5kIG5ldmVyIG1hdGNoZXMuXG4gICAqL1xuICBwcml2YXRlIGFzc2VydE5vUHVibGljQ29sbGlzaW9ucyhwdWJsaWNQYXRoUGF0dGVybnM6IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgcHVibGljUmVnZXhlcyA9IHB1YmxpY1BhdGhQYXR0ZXJucy5tYXAoKHBhdHRlcm4pID0+ICh7XG4gICAgICBwYXR0ZXJuLFxuICAgICAgcmVnZXg6IGNsb3VkRnJvbnRQYXR0ZXJuUmVnZXgoYC8ke3BhdHRlcm4ucmVwbGFjZSgvXlxcLysvLCBcIlwiKX1gKSxcbiAgICB9KSk7XG4gICAgZm9yIChjb25zdCB7IGdyb3VwLCByb3V0ZSwgcGF0aFBhdHRlcm4gfSBvZiB0aGlzLmZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMoKSkge1xuICAgICAgY29uc3QgZHVwbGljYXRlID0gcHVibGljUGF0aFBhdHRlcm5zLmluY2x1ZGVzKHBhdGhQYXR0ZXJuKTtcbiAgICAgIC8vIE1hdGNoaW5nIHRoZSBncm91cCBwYXR0ZXJuJ3Mgb3duIHRleHQgaXMgZW5vdWdoOiBpdHMgb25seSB3aWxkY2FyZCBpcyBhXG4gICAgICAvLyB0cmFpbGluZyBgKmAsIHNvIGEgcHVibGljIHBhdHRlcm4gdGhhdCBtYXRjaGVzIHRoZSB0ZXh0IHVwIHRvIGFuZFxuICAgICAgLy8gaW5jbHVkaW5nIGl0IG1hdGNoZXMgZXZlcnkgVVJMIHRoZSBncm91cCBwYXR0ZXJuIGRvZXMuXG4gICAgICBjb25zdCBzaGFkb3cgPSBkdXBsaWNhdGVcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBwdWJsaWNSZWdleGVzLmZpbmQoKHsgcmVnZXggfSkgPT5cbiAgICAgICAgICAgIHJlZ2V4LnRlc3QoYC8ke3BhdGhQYXR0ZXJuLnJlcGxhY2UoL15cXC8rLywgXCJcIil9YCksXG4gICAgICAgICAgKTtcbiAgICAgIGlmICghZHVwbGljYXRlICYmICFzaGFkb3cpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke0xPR19QUkVGSVh9IFxcYGZ1bmN0aW9uR3JvdXBzXFxgIHBhdHRlcm4gXCIke3JvdXRlfVwiIChncm91cCBgICtcbiAgICAgICAgICBgXCIke2dyb3VwLm5hbWV9XCIpIGAgK1xuICAgICAgICAgIChkdXBsaWNhdGVcbiAgICAgICAgICAgID8gYGRlcGxveXMgYXMgdGhlIHBhdGggcGF0dGVybiBcIiR7cGF0aFBhdHRlcm59XCIsIHdoaWNoIGEgdG9wLWxldmVsIGAgK1xuICAgICAgICAgICAgICBgcHVibGljLyBlbnRyeSBhbHJlYWR5IHVzZXMg4oCUIENsb3VkRnJvbnQgcmVqZWN0cyBhIGRpc3RyaWJ1dGlvbiBgICtcbiAgICAgICAgICAgICAgYHdpdGggdHdvIGJlaGF2aW9ycyBvbiBvbmUgcGF0aCBwYXR0ZXJuLiBgXG4gICAgICAgICAgICA6IGBkZXBsb3lzIGFzIFwiJHtwYXRoUGF0dGVybn1cIiwgYnV0IHRoZSB0b3AtbGV2ZWwgcHVibGljLyBlbnRyeSBgICtcbiAgICAgICAgICAgICAgYGJlaGluZCBcIiR7c2hhZG93IS5wYXR0ZXJufVwiIGlzIG1hdGNoZWQgZmlyc3QgYW5kIHNlbmRzIGV2ZXJ5IGAgK1xuICAgICAgICAgICAgICBgc3VjaCByZXF1ZXN0IHRvIFMzLCBzbyB0aGUgZ3JvdXAncyBmdW5jdGlvbiB3b3VsZCBuZXZlciBzZWUgYCArXG4gICAgICAgICAgICAgIGB0aGVtLiBgKSArXG4gICAgICAgICAgYE1vdmUgdGhvc2UgcHVibGljLyBmaWxlcyB1bmRlciBhIGRpcmVjdG9yeSBubyByb3V0ZSB1c2VzLCBvciBgICtcbiAgICAgICAgICBgZ3JvdXAgYSBkaWZmZXJlbnQgcGF0aC5gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENsb3VkRnJvbnQgaGFzIGEgcGVyLWRpc3RyaWJ1dGlvbiBjYWNoZSBiZWhhdmlvciBxdW90YSwgY291bnRpbmcgdGhlIGRlZmF1bHRcbiAgICogb25lIOKAlCA3NSB1bmxlc3MgcmFpc2VkLCBhbmQgYG1heENhY2hlQmVoYXZpb3JzYCBzYXlzIHdoaWNoIOKAlCBhbmQgdGhlcmUgYXJlXG4gICAqIHRocmVlIHRoaW5ncyBjb21wZXRpbmcgZm9yIGl0OiBgcHVibGljL2AgZW50cmllcywgZnVuY3Rpb24gZ3JvdXBzLCBhbmRcbiAgICogY2RrLW5leHRqcydzIG93biBmaXhlZCBzZXQuXG4gICAqIENoZWNrZWQgaW4gb25lIHBsYWNlIHNvIHRoZSBlcnJvciBjYW4gc2F5IHdoaWNoIHRvIGN1dC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY2xvdWRmcm9udC1saW1pdHMuaHRtbCNsaW1pdHMtd2ViLWRpc3RyaWJ1dGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXNzZXJ0QmVoYXZpb3JCdWRnZXQocHVibGljUGF0dGVybnM6IG51bWJlcikge1xuICAgIGNvbnN0IGxpbWl0ID0gdGhpcy5wcm9wcy5tYXhDYWNoZUJlaGF2aW9ycyA/PyBERUZBVUxUX01BWF9DQUNIRV9CRUhBVklPUlM7XG4gICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChsaW1pdCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZ3JvdXBQYXR0ZXJucyA9IHRoaXMuZnVuY3Rpb25Hcm91cEJlaGF2aW9ycygpLmxlbmd0aDtcbiAgICAvLyBUaGUgZGVmYXVsdCBiZWhhdmlvciwgYF9uZXh0L2ltYWdlKmAsIGBfbmV4dC9zdGF0aWMqYCwgcGx1cyDigJQgd2l0aCBhXG4gICAgLy8gYmFzZVBhdGgg4oCUIHRoZSB0d28gdGhhdCBzdGFuZCBpbiBmb3IgdGhlIGRlZmF1bHQgYmVoYXZpb3IncyBjb3ZlcmFnZSwgYW5kXG4gICAgLy8g4oCUIHdpdGggYSBwYXRoLXN0eWxlIGFzc2V0UHJlZml4IOKAlCB0aGUgb25lIHRoYXQgc2VydmVzIGJ1bmRsZXMgdW5kZXIgaXQuXG4gICAgLy8gYHRoaXMuYmFzZVBhdGhgLCBub3QgdGhlIHJhdyBwcm9wOiBgYmFzZVBhdGg6IFwiL1wiYCBub3JtYWxpemVzIHRvIGBcIlwiYCBhbmRcbiAgICAvLyBhZGRzIG5vIGJlaGF2aW9ycywgc28gY291bnRpbmcgaXQgYWRkZWQgMiB0byB0aGUgdG90YWwgYW5kIGNvdWxkIHRocm93XG4gICAgLy8gXCJvdmVyIHRoZSBsaW1pdFwiIG9uIGFuIGFwcCB0aGF0IGlzIHVuZGVyIGl0LlxuICAgIGNvbnN0IGZpeGVkID0gMyArICh0aGlzLmJhc2VQYXRoID8gMiA6IDApICsgKHRoaXMuYXNzZXRQcmVmaXggPyAxIDogMCk7XG4gICAgY29uc3QgdG90YWwgPSBmaXhlZCArIHB1YmxpY1BhdHRlcm5zICsgZ3JvdXBQYXR0ZXJucztcbiAgICBpZiAodG90YWwgPD0gbGltaXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcGFydHMgPSBbXG4gICAgICBgJHtmaXhlZH0gdXNlZCBieSBjZGstbmV4dGpzIGl0c2VsZmAsXG4gICAgICBgJHtwdWJsaWNQYXR0ZXJuc30gZm9yIHRvcC1sZXZlbCBwdWJsaWMvIGVudHJpZXNgLFxuICAgIF07XG4gICAgaWYgKGdyb3VwUGF0dGVybnMpIHtcbiAgICAgIHBhcnRzLnB1c2goYCR7Z3JvdXBQYXR0ZXJuc30gZm9yIFxcYGZ1bmN0aW9uR3JvdXBzXFxgIHBhdHRlcm5zYCk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGlzIE5leHQuanMgYXBwIG5lZWRzICR7dG90YWx9IENsb3VkRnJvbnQgY2FjaGUgYmVoYXZpb3JzLCBvdmVyIHRoZSBgICtcbiAgICAgICAgYGxpbWl0IG9mICR7bGltaXR9IHBlciBkaXN0cmlidXRpb246ICR7cGFydHMuam9pbihcIiwgXCIpfS4gYCArXG4gICAgICAgIGBNb3ZlIHB1YmxpYy8gZmlsZXMgaW50byBhIHNpbmdsZSB0b3AtbGV2ZWwgZGlyZWN0b3J5IChvbmUgYmVoYXZpb3IgYCArXG4gICAgICAgIGBzZXJ2ZXMgXFxgc3RhdGljLypcXGApYCArXG4gICAgICAgIChncm91cFBhdHRlcm5zXG4gICAgICAgICAgPyBgLCBhbmQgcHJlZmVyIG9uZSBzdWJ0cmVlIHBhdHRlcm4gcGVyIGZ1bmN0aW9uIGdyb3VwIG92ZXIgc2V2ZXJhbCBgICtcbiAgICAgICAgICAgIGBleGFjdCBwYXRoc2BcbiAgICAgICAgICA6IGBgKSArXG4gICAgICAgIGAuIElmIHlvdXIgYWNjb3VudCdzIHF1b3RhIGlzIGhpZ2hlciB0aGFuICR7bGltaXR9LCBzZXQgYCArXG4gICAgICAgIGBcXGBtYXhDYWNoZUJlaGF2aW9yc1xcYCB0byBpdC4gU2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jbG91ZGZyb250LWxpbWl0cy5odG1sI2xpbWl0cy13ZWItZGlzdHJpYnV0aW9uc2AsXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogT3B0aW9uYWxseSBwcmVwZW5kcyBiYXNlIHBhdGggdG8gZ2l2ZW4gcGF0aCBwYXR0ZXJuLlxuICAgKlxuICAgKiBBIHRyYWlsaW5nIHNsYXNoIG9uIGBwYXRoUGF0dGVybmAgaXMgbG9hZC1iZWFyaW5nIGFuZCBzdXJ2aXZlcywgd2hpY2ggaXMgd2h5XG4gICAqIHRoaXMgY29uY2F0ZW5hdGVzIHJhdGhlciB0aGFuIGdvaW5nIHRocm91Z2ggYGpvaW5QYXRoYC4gVGhlIGJ1aWxkJ3NcbiAgICogYGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnNgIGhvbGQgYm90aCBcInByaWNpbmdcIiBhbmQgXCJwcmljaW5nL1wiIGZvciBhXG4gICAqIGB0cmFpbGluZ1NsYXNoYCBhcHAsIGFuZCBub3JtYWxpemluZyB0aGUgc2Vjb25kIG9uZSBjb2xsYXBzZWQgaXQgb250byB0aGVcbiAgICogZmlyc3Q6IGBhZGRCZWhhdmlvcmAgd2FzXG4gICAqIHRoZW4gY2FsbGVkIHR3aWNlIHdpdGggYC9iYXNlL3ByaWNpbmdgLCB3aGljaCBDbG91ZEZyb250IHJlamVjdHMgYXQgZGVwbG95XG4gICAqIChcIm1vcmUgdGhhbiBvbmUgY2FjaGUgYmVoYXZpb3IgaGFzIHRoZSBzYW1lIHBhdGggcGF0dGVyblwiKSwgYW5kIHRoZVxuICAgKiBjYW5vbmljYWwgYC9iYXNlL3ByaWNpbmcvYCB3YXMgbGVmdCB0byB0aGUgYC9iYXNlLypgIGNhdGNoLWFsbCDigJQgdGhlIG1pc3JvdXRlXG4gICAqIHRoZSBzZWNvbmQgcGF0dGVybiBleGlzdHMgdG8gcHJldmVudC5cbiAgICovXG4gIHByaXZhdGUgZ2V0UGF0aFBhdHRlcm4ocGF0aFBhdHRlcm46IHN0cmluZykge1xuICAgIGlmICghdGhpcy5iYXNlUGF0aCkge1xuICAgICAgcmV0dXJuIHBhdGhQYXR0ZXJuO1xuICAgIH1cbiAgICByZXR1cm4gYC8ke3RoaXMuYmFzZVBhdGh9LyR7cGF0aFBhdHRlcm4ucmVwbGFjZSgvXlxcLysvLCBcIlwiKX1gO1xuICB9XG59XG5cbi8qKlxuICogV2hldGhlciBgZHluYW1pY0NhY2hlUG9saWN5UHJvcHNgIHR1cm5zIHRoZSBkeW5hbWljIGNhY2hlIG9mZiwgYnkgY2FwcGluZyBldmVyeVxuICogVFRMIGF0IDAuXG4gKlxuICogQ2xvdWRGcm9udCByZWplY3RzIGEgcG9saWN5IHRoYXQgY2FjaGVzIG5vdGhpbmcgYnV0IHN0aWxsIGhhcyBhIGNhY2hlIGtleVxuICogKFwiSGVhZGVyQmVoYXZpb3IgaXMgaW52YWxpZCBmb3IgcG9saWN5IHdpdGggY2FjaGluZyBkaXNhYmxlZFwiKSwgc28gc3VjaCBhXG4gKiBwb2xpY3kgaGFzIHRvIGRyb3AgdGhlIGtleS4gVW50aWwgdGhlIGRlZmF1bHQgVFRMIGJlY2FtZSAwIHRoaXMgY291bGQgbm90XG4gKiBjb21lIHVwOiBDREsgcmFpc2VzIGBtYXhUdGxgIHRvIGBkZWZhdWx0VHRsYCB3aGVuIGl0IGlzIGxvd2VyLCBzbyBhbiBvdmVycmlkZVxuICogb2YgYG1heFR0bDogMGAgc3ludGhlc2l6ZWQgYXMgYSBkYXkgYW5kIGRlcGxveWVkLiBOb3cgaXQgaXMgaG9ub3JlZCwgYW5kXG4gKiB3aXRob3V0IHRoaXMgdGhlIHVwZ3JhZGUgZGVwbG95IHdvdWxkIGZhaWwuXG4gKlxuICogVGhlIFRUTHMgYXJlIHJlc29sdmVkIHRoZSB3YXkgQ0RLIHJlc29sdmVzIHRoZW06IGBkZWZhdWx0VHRsYCByYWlzZWQgdG9cbiAqIGBtaW5UdGxgLCB0aGVuIGBtYXhUdGxgIHJhaXNlZCB0byBgZGVmYXVsdFR0bGAuIENoZWNraW5nIGBtYXhUdGxgIGFsb25lIGNhbGxlZFxuICogYHsgbWF4VHRsOiAwLCBkZWZhdWx0VHRsOiAxaCB9YCBkaXNhYmxlZCwgZHJvcHBlZCB0aGUga2V5LCBhbmQgQ0RLIHRoZW5cbiAqIHN5bnRoZXNpemVkIGEgcG9saWN5IHRoYXQgY2FjaGVzIGZvciBhbiBob3VyIGtleWVkIG9uIG5vdGhpbmcg4oCUIG9uZSB2aWV3ZXInc1xuICogcGFnZSBzZXJ2ZWQgdG8gZXZlcnkgdmlld2VyLlxuICovXG5mdW5jdGlvbiBpc0NhY2hpbmdEaXNhYmxlZChwcm9wczogQ2FjaGVQb2xpY3lQcm9wcyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBjb25zdCB0dGxzID0gW3Byb3BzPy5tYXhUdGwsIHByb3BzPy5kZWZhdWx0VHRsLCBwcm9wcz8ubWluVHRsXTtcbiAgaWYgKHByb3BzPy5tYXhUdGwgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlOyAvLyBDREsncyBkZWZhdWx0IGlzIGEgeWVhclxuICByZXR1cm4gdHRscy5ldmVyeShcbiAgICAodHRsKSA9PlxuICAgICAgdHRsID09PSB1bmRlZmluZWQgfHxcbiAgICAgICghVG9rZW4uaXNVbnJlc29sdmVkKHR0bC50b1N0cmluZygpKSAmJiB0dGwudG9TZWNvbmRzKCkgPT09IDApLFxuICApO1xufVxuXG4vKiogVGhlIGNhY2hlLWtleSBoYWxmIG9mIHtAbGluayBDYWNoZVBvbGljeVByb3BzfS4gKi9cbmludGVyZmFjZSBDYWNoZUtleVByb3BzIHtcbiAgcmVhZG9ubHkgcXVlcnlTdHJpbmdCZWhhdmlvcjogQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yO1xuICByZWFkb25seSBoZWFkZXJCZWhhdmlvcjogQ2FjaGVIZWFkZXJCZWhhdmlvcjtcbiAgcmVhZG9ubHkgY29va2llQmVoYXZpb3I6IENhY2hlQ29va2llQmVoYXZpb3I7XG4gIHJlYWRvbmx5IGVuYWJsZUFjY2VwdEVuY29kaW5nQnJvdGxpOiBib29sZWFuO1xuICByZWFkb25seSBlbmFibGVBY2NlcHRFbmNvZGluZ0d6aXA6IGJvb2xlYW47XG59XG5cbi8qKlxuICogV2hhdCB0aGUgZHluYW1pYyBjYWNoZSBwb2xpY3kga2V5cyBvbjogZXZlcnkgcmVxdWVzdCBpbnB1dCBhIE5leHQuanMgcmVzcG9uc2VcbiAqIHZhcmllcyBieS5cbiAqL1xuY29uc3QgRFlOQU1JQ19DQUNIRV9LRVk6IENhY2hlS2V5UHJvcHMgPSB7XG4gIHF1ZXJ5U3RyaW5nQmVoYXZpb3I6IENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvci5hbGwoKSxcbiAgaGVhZGVyQmVoYXZpb3I6IENhY2hlSGVhZGVyQmVoYXZpb3IuYWxsb3dMaXN0KFxuICAgIC8vIE5PVEU6IENsb3VkRnJvbnQgQ3VzdG9tIENhY2hlIFBvbGljaWVzIGhhdmUgc29mdCBtYXggb2YgMTAgaGVhZGVyc1xuICAgIC8vIGNkay1uZXh0anMgaW5jbHVkZXMgdGhlIG1vc3QgZXNzZW50aWFsIGhlYWRlcnMgZm9yIE5leHQuanMgZnVuY3Rpb25hbGl0eVxuICAgIC8vIGFuZCBsZWF2ZXMgb3V0IHRoZSBvbmUgY29tbWVudGVkIG91dCBiZWxvdzsga2V5aW5nIG9uIGl0IGFzIHdlbGwgbmVlZHMgYVxuICAgIC8vIHF1b3RhIGluY3JlYXNlXG4gICAgLy8gbW9yZSBoZXJlOiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY2xvdWRmcm9udC1saW1pdHMuaHRtbCNsaW1pdHMtcG9saWNpZXNcbiAgICBcImFjY2VwdFwiLCAvLyBjb250ZW50IG5lZ290aWF0aW9uIChIVE1MIHZzIFJTQyBwYXlsb2FkKVxuICAgIFwicnNjXCIsIC8vIFJlYWN0IFNlcnZlciBDb21wb25lbnRzIHJlcXVlc3RzXG4gICAgXCJuZXh0LXVybFwiLCAvLyBOZXh0LmpzIHJvdXRpbmdcbiAgICBcIm5leHQtcm91dGVyLXN0YXRlLXRyZWVcIiwgLy8gQXBwIFJvdXRlciBuYXZpZ2F0aW9uIHN0YXRlXG4gICAgXCJuZXh0LXJvdXRlci1wcmVmZXRjaFwiLCAvLyBwcmVmZXRjaCBiZWhhdmlvclxuICAgIFwibmV4dC1yb3V0ZXItc2VnbWVudC1wcmVmZXRjaFwiLCAvLyBzZWdtZW50LWxldmVsIHByZWZldGNoaW5nXG4gICAgXCJ4LXByZXJlbmRlci1yZXZhbGlkYXRlXCIsIC8vIG9uLWRlbWFuZCBJU1IgcmV2YWxpZGF0aW9uXG4gICAgLy8gRHJhZnQgbW9kZSBuZWVkcyBubyBoZWFkZXI6IGl0IGlzIHRoZSBgX19wcmVyZW5kZXJfYnlwYXNzYCBjb29raWUsIHdoaWNoXG4gICAgLy8gYGNvb2tpZUJlaGF2aW9yLmFsbCgpYCBhbHJlYWR5IGtleXMgb24uXG4gICAgLy8gXCJ4LXByZXJlbmRlci1yZXZhbGlkYXRlLWlmLWdlbmVyYXRlZFwiLCAvLyBjb25kaXRpb25hbCByZXZhbGlkYXRpb24gKG5pY2hlIHVzZSBjYXNlKVxuICApLFxuICBjb29raWVCZWhhdmlvcjogQ2FjaGVDb29raWVCZWhhdmlvci5hbGwoKSxcbiAgZW5hYmxlQWNjZXB0RW5jb2RpbmdCcm90bGk6IHRydWUsXG4gIGVuYWJsZUFjY2VwdEVuY29kaW5nR3ppcDogdHJ1ZSxcbn07XG5cbi8qKlxuICogQSBjYWNoZSBrZXkgb2Ygbm90aGluZywgZm9yIGEgcG9saWN5IHRoYXQgY2FjaGVzIG5vdGhpbmcuIEZvcndhcmRpbmcgaXNcbiAqIHVuYWZmZWN0ZWQ6IHRoZSBkeW5hbWljIG9yaWdpbiByZXF1ZXN0IHBvbGljeSBzZW5kcyBldmVyeSB2aWV3ZXIgaGVhZGVyLFxuICogY29va2llIGFuZCBxdWVyeSBzdHJpbmcgcmVnYXJkbGVzcy5cbiAqL1xuY29uc3QgRElTQUJMRURfQ0FDSEVfS0VZOiBDYWNoZUtleVByb3BzID0ge1xuICBxdWVyeVN0cmluZ0JlaGF2aW9yOiBDYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3Iubm9uZSgpLFxuICBoZWFkZXJCZWhhdmlvcjogQ2FjaGVIZWFkZXJCZWhhdmlvci5ub25lKCksXG4gIGNvb2tpZUJlaGF2aW9yOiBDYWNoZUNvb2tpZUJlaGF2aW9yLm5vbmUoKSxcbiAgZW5hYmxlQWNjZXB0RW5jb2RpbmdCcm90bGk6IGZhbHNlLFxuICBlbmFibGVBY2NlcHRFbmNvZGluZ0d6aXA6IGZhbHNlLFxufTtcblxuLyoqXG4gKiBDbG91ZEZyb250J3MgZGVmYXVsdCBcIkNhY2hlIGJlaGF2aW9ycyBwZXIgZGlzdHJpYnV0aW9uXCIgcXVvdGEsIHRoZSBkZWZhdWx0XG4gKiBiZWhhdmlvciBpbmNsdWRlZC4gQWRqdXN0YWJsZSwgaGVuY2UgYG1heENhY2hlQmVoYXZpb3JzYC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jbG91ZGZyb250LWxpbWl0cy5odG1sI2xpbWl0cy13ZWItZGlzdHJpYnV0aW9uc1xuICovXG5jb25zdCBERUZBVUxUX01BWF9DQUNIRV9CRUhBVklPUlMgPSA3NTtcblxuLyoqXG4gKiBXaGV0aGVyIGBjaGFyYCBpcyBpbiBDbG91ZEZyb250J3MgcGF0aCBwYXR0ZXJuIGFscGhhYmV0OiB0aGUgbGl0ZXJhbHMsIHBsdXMgdGhlXG4gKiBgKmAgYW5kIGA/YCB3aWxkY2FyZHMuIE5vIHNwYWNlLCBubyBgJWAsIG5vdGhpbmcgbm9uLUFTQ0lJLlxuICovXG5mdW5jdGlvbiBpc1BhdGhQYXR0ZXJuQ2hhcihjaGFyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNoYXIgPT09IFwiKlwiIHx8IGNoYXIgPT09IFwiP1wiIHx8IFBBVEhfUEFUVEVSTl9MSVRFUkFMLnRlc3QoY2hhcik7XG59XG4vKiogQ2xvdWRGcm9udCdzIHBhdGggcGF0dGVybiBsZW5ndGggbGltaXQuICovXG5jb25zdCBNQVhfUEFUSF9QQVRURVJOX0xFTkdUSCA9IDI1NTtcblxuLyoqXG4gKiBBIGBwdWJsaWMvYCBlbnRyeSdzIG5hbWUgYXMgYSBDbG91ZEZyb250IHBhdGggcGF0dGVybi5cbiAqXG4gKiBgcHVibGljL2hlbGxvIHdvcmxkLmpwZ2AgaXMgYSB2YWxpZCBOZXh0LmpzIGFzc2V0IOKAlCBgbmV4dCBzdGFydGAgc2VydmVzIGl0LCBhbmRcbiAqIGBuZXh0L2ltYWdlYCBwb2ludHMgYXQgaXQg4oCUIGJ1dCBhIHNwYWNlIGNhbm5vdCBhcHBlYXIgaW4gYSBwYXRoIHBhdHRlcm4sIHNvXG4gKiBjZGstbmV4dGpzIHVzZWQgdG8gdGhyb3cgYXQgc3ludGggYW5kIHRoZSBhcHAgY291bGQgbm90IGJlIGRlcGxveWVkIGF0IGFsbFxuICogKGBuZXh0LWltYWdlLWxlZ2FjeS91bmljb2RlYCwgd2hvc2UgYHB1YmxpYy9gIGFsc28gaG9sZHMgYMOkw7bDvMWhxI3FmcOtLnBuZ2ApLlxuICpcbiAqIENsb3VkRnJvbnQgVVJMLWRlY29kZXMgdGhlIHJlcXVlc3QgcGF0aCBiZWZvcmUgbWF0Y2hpbmcgaXQsIHNvIHRoZSBwYXR0ZXJuIGlzXG4gKiBtYXRjaGVkIGFnYWluc3QgYGhlbGxvIHdvcmxkLmpwZ2AsIG5vdCB0aGUgYC9oZWxsbyUyMHdvcmxkLmpwZ2Agb24gdGhlIHdpcmUuXG4gKiBFYWNoIGNoYXJhY3RlciBvdXRzaWRlIHRoZSBhbHBoYWJldCBpcyByZXBsYWNlZCBieSBvbmUgYD9gIHBlciBieXRlIG9mIGl0c1xuICogVVRGLTggZW5jb2RpbmcsIGJlY2F1c2UgdGhhdCBpcyB3aGF0IGA/YCBtYXRjaGVzOiBgaGVsbG8/d29ybGQuanBnYCBmb3IgdGhlXG4gKiBzcGFjZSwgYW5kIHR3byBgP2AgZm9yIGVhY2ggY2hhcmFjdGVyIG9mIGDDpMO2w7zFocSNxZnDrS5wbmdgLiBNZWFzdXJlZCBhZ2FpbnN0IGFcbiAqIGRlcGxveWVkIGRpc3RyaWJ1dGlvbjsgYSBgP2AgcGVyICpwZXJjZW50LWVuY29kZWQqIGNoYXJhY3RlciAoYGhlbGxvPz8/d29ybGRgKVxuICogc3ludGhlc2l6ZXMgZmluZSBhbmQgbmV2ZXIgbWF0Y2hlcy4gQSBgKmAgd291bGQgYmUgc2hvcnRlciBhbmQgbXVjaCB3aWRlcjpcbiAqIGDDpMO2w7zFocSNxZnDrS5wbmdgIHdvdWxkIGJlY29tZSBgKi5wbmdgLCB3aGljaCB3b3VsZCBwdWxsIGV2ZXJ5IGAucG5nYCByZXF1ZXN0IGluXG4gKiB0aGUgYXBwIG9udG8gdGhlIHN0YXRpYyBvcmlnaW4uXG4gKi9cbmZ1bmN0aW9uIHRvUGF0aFBhdHRlcm4obmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIFsuLi5uYW1lXVxuICAgIC5tYXAoKGNoYXIpID0+XG4gICAgICBpc1BhdGhQYXR0ZXJuQ2hhcihjaGFyKVxuICAgICAgICA/IGNoYXJcbiAgICAgICAgOiBcIj9cIi5yZXBlYXQoQnVmZmVyLmJ5dGVMZW5ndGgoY2hhciwgXCJ1dGY4XCIpKSxcbiAgICApXG4gICAgLmpvaW4oXCJcIik7XG59XG4iXX0=
|
|
906
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWRpc3RyaWJ1dGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9uZXh0anMtZGlzdHJpYnV0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSw2Q0FBa0U7QUFFbEUsK0RBK0JvQztBQUNwQywrRUFNNEM7QUFFNUMsdURBQXFFO0FBRXJFLDJDQUF1QztBQUN2QywrREFJbUM7QUFDbkMsMkNBQXFEO0FBT3JELGlEQUF1RTtBQUN2RSwrRUFPMEM7QUE2STFDLE1BQWEsa0JBQW1CLFNBQVEsc0JBQVM7O0lBQy9DLFlBQVksQ0FBZTtJQUVuQixLQUFLLENBQTBCO0lBQ3ZDOzs7OztPQUtHO0lBQ0ssUUFBUSxDQUFTO0lBQ3pCOzs7OztPQUtHO0lBQ0ssV0FBVyxDQUFTO0lBQzVCOzs7T0FHRztJQUNLLDZCQUE2QixHQUFvQztRQUN2RSxrQkFBa0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUU7UUFDdkMsWUFBWSxFQUFFO1lBQ1osV0FBVyxFQUFFLG1DQUFrQixDQUFDLFVBQVU7WUFDMUMsUUFBUSxFQUFFLEtBQUs7U0FDaEI7UUFDRCxjQUFjLEVBQUU7WUFDZCxRQUFRLEVBQUUsS0FBSztZQUNmLGNBQWMsRUFBRSxzQ0FBcUIsQ0FBQywrQkFBK0I7U0FDdEU7UUFFRCx1QkFBdUIsRUFBRTtZQUN2QixtQkFBbUIsRUFBRSxzQkFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDdkMsaUJBQWlCLEVBQUUsSUFBSTtZQUN2QixRQUFRLEVBQUUsS0FBSztZQUNmLE9BQU8sRUFBRSxJQUFJO1NBQ2Q7UUFDRCxhQUFhLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRTtLQUN0RSxDQUFDO0lBQ00sWUFBWSxDQUFVO0lBQ3RCLGFBQWEsQ0FBVTtJQUN2QiwyQkFBMkIsQ0FBdUI7SUFDbEQscUNBQXFDLENBQXdCO0lBQ3JFOzs7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Q2pDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQztTQUNiLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ1osaUJBQWlCLENBQUMsSUFBSSxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxJQUFJO1FBQ04sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FDaEQ7U0FDQSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW5ub3RhdGlvbnMsIER1cmF0aW9uLCBTdGFjaywgVG9rZW4gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IElDZXJ0aWZpY2F0ZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBBY2Nlc3NMZXZlbCxcbiAgQWRkQmVoYXZpb3JPcHRpb25zLFxuICBBbGxvd2VkTWV0aG9kcyxcbiAgQmVoYXZpb3JPcHRpb25zLFxuICBDYWNoZUNvb2tpZUJlaGF2aW9yLFxuICBDYWNoZUhlYWRlckJlaGF2aW9yLFxuICBDYWNoZVBvbGljeSxcbiAgQ2FjaGVQb2xpY3lQcm9wcyxcbiAgQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLFxuICBDYWNoZWRNZXRob2RzLFxuICBGdW5jdGlvbiBhcyBDbG91ZEZyb250RnVuY3Rpb24sXG4gIERpc3RyaWJ1dGlvbixcbiAgRnVuY3Rpb25Bc3NvY2lhdGlvbixcbiAgRnVuY3Rpb25Db2RlLFxuICBGdW5jdGlvbkV2ZW50VHlwZSxcbiAgRnVuY3Rpb25Qcm9wcyxcbiAgRnVuY3Rpb25SdW50aW1lLFxuICBIZWFkZXJzRnJhbWVPcHRpb24sXG4gIEhlYWRlcnNSZWZlcnJlclBvbGljeSxcbiAgSHR0cFZlcnNpb24sXG4gIElLZXlWYWx1ZVN0b3JlLFxuICBJT3JpZ2luLFxuICBJT3JpZ2luUmVxdWVzdFBvbGljeSxcbiAgT3JpZ2luUHJvdG9jb2xQb2xpY3ksXG4gIE9yaWdpblJlcXVlc3RQb2xpY3ksXG4gIFJlc3BvbnNlSGVhZGVyc1BvbGljeSxcbiAgUmVzcG9uc2VIZWFkZXJzUG9saWN5UHJvcHMsXG4gIFJlc3BvbnNlU2VjdXJpdHlIZWFkZXJzQmVoYXZpb3IsXG4gIFNlY3VyaXR5UG9saWN5UHJvdG9jb2wsXG4gIFZpZXdlclByb3RvY29sUG9saWN5LFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnRcIjtcbmltcG9ydCB7XG4gIEZ1bmN0aW9uVXJsT3JpZ2luLFxuICBGdW5jdGlvblVybE9yaWdpbldpdGhPQUNQcm9wcyxcbiAgUzNCdWNrZXRPcmlnaW4sXG4gIFZwY09yaWdpbixcbiAgVnBjT3JpZ2luV2l0aEVuZHBvaW50UHJvcHMsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udC1vcmlnaW5zXCI7XG5pbXBvcnQgeyBJQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjJcIjtcbmltcG9ydCB7IENmblBlcm1pc3Npb24sIElGdW5jdGlvblVybCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBJQnVja2V0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7XG4gIGNsb3VkRnJvbnRQYXR0ZXJuUmVnZXgsXG4gIERFRkFVTFRfRlVOQ1RJT05fR1JPVVAsXG4gIFBBVEhfUEFUVEVSTl9MSVRFUkFMLFxufSBmcm9tIFwiLi9hZGFwdGVyL2Z1bmN0aW9uLWdyb3Vwc1wiO1xuaW1wb3J0IHsgTE9HX1BSRUZJWCwgTmV4dGpzVHlwZSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgT3B0aW9uYWxEaXN0cmlidXRpb25Qcm9wcyB9IGZyb20gXCIuL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsRGlzdHJpYnV0aW9uUHJvcHNcIjtcbmltcG9ydCB7IE9wdGlvbmFsUzNPcmlnaW5CdWNrZXRXaXRoT0FDUHJvcHMgfSBmcm9tIFwiLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbFMzT3JpZ2luQnVja2V0V2l0aE9BQ1Byb3BzXCI7XG5pbXBvcnQge1xuICBOZXh0anNGdW5jdGlvbkdyb3VwQmVoYXZpb3IsXG4gIFB1YmxpY0RpckVudHJ5LFxufSBmcm9tIFwiLi9uZXh0anMtYnVpbGQvbmV4dGpzLWJ1aWxkXCI7XG5pbXBvcnQgeyBhc3NldFByZWZpeFBhdGgsIG5vcm1hbGl6ZUJhc2VQYXRoIH0gZnJvbSBcIi4vdXRpbHMvYmFzZS1wYXRoXCI7XG5pbXBvcnQge1xuICBhc3NldFByZWZpeFJld3JpdGVIYW5kbGVyLFxuICBjaGVja1ZpZXdlclJlcXVlc3RDb2RlLFxuICBNQVhfRlVOQ1RJT05fQ09ERV9CWVRFUyxcbiAgUEFTU19USFJPVUdIX0hBTkRMRVIsXG4gIHNwbGljZVZpZXdlclJlcXVlc3QsXG4gIFhfRk9SV0FSREVEX0hPU1RfSEFORExFUixcbn0gZnJvbSBcIi4vdXRpbHMvdmlld2VyLXJlcXVlc3QtZnVuY3Rpb25zXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzRGlzdHJpYnV0aW9uT3ZlcnJpZGVzIHtcbiAgcmVhZG9ubHkgZGlzdHJpYnV0aW9uUHJvcHM/OiBPcHRpb25hbERpc3RyaWJ1dGlvblByb3BzO1xuICByZWFkb25seSBpbWFnZUJlaGF2aW9yT3B0aW9ucz86IEFkZEJlaGF2aW9yT3B0aW9ucztcbiAgcmVhZG9ubHkgaW1hZ2VDYWNoZVBvbGljeVByb3BzPzogQ2FjaGVQb2xpY3lQcm9wcztcbiAgcmVhZG9ubHkgaW1hZ2VSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcz86IFJlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzO1xuICByZWFkb25seSBkeW5hbWljQmVoYXZpb3JPcHRpb25zPzogQWRkQmVoYXZpb3JPcHRpb25zO1xuICByZWFkb25seSBkeW5hbWljQ2FjaGVQb2xpY3lQcm9wcz86IENhY2hlUG9saWN5UHJvcHM7XG4gIHJlYWRvbmx5IGR5bmFtaWNSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcz86IFJlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzO1xuICByZWFkb25seSBkeW5hbWljRnVuY3Rpb25VcmxPcmlnaW5XaXRoT0FDUHJvcHM/OiBGdW5jdGlvblVybE9yaWdpbldpdGhPQUNQcm9wcztcbiAgcmVhZG9ubHkgZHluYW1pY1ZwY09yaWdpbldpdGhFbmRwb2ludFByb3BzPzogVnBjT3JpZ2luV2l0aEVuZHBvaW50UHJvcHM7XG4gIHJlYWRvbmx5IHN0YXRpY0JlaGF2aW9yT3B0aW9ucz86IEFkZEJlaGF2aW9yT3B0aW9ucztcbiAgcmVhZG9ubHkgc3RhdGljUmVzcG9uc2VIZWFkZXJzUG9saWN5UHJvcHM/OiBSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcztcbiAgcmVhZG9ubHkgczNCdWNrZXRPcmlnaW5Qcm9wcz86IE9wdGlvbmFsUzNPcmlnaW5CdWNrZXRXaXRoT0FDUHJvcHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzRGlzdHJpYnV0aW9uUHJvcHMge1xuICAvKipcbiAgICogQnVja2V0IGNvbnRhaW5pbmcgc3RhdGljIGFzc2V0cy5cbiAgICogTXVzdCBiZSBwcm92aWRlZCBpZiB5b3Ugd2FudCB0byBzZXJ2ZSBzdGF0aWMgZmlsZXMuXG4gICAqL1xuICByZWFkb25seSBhc3NldHNCdWNrZXQ6IElCdWNrZXQ7XG4gIC8qKlxuICAgKiBUaGUgYXBwJ3Mgb3duIGBhc3NldFByZWZpeGAuIE5leHQuanMgZW1pdHMgYDxhc3NldFByZWZpeD4vX25leHQvc3RhdGljLy4uLmBcbiAgICogZm9yIGV2ZXJ5IGJ1bmRsZSB3aGlsZSB0aGUgb2JqZWN0cyBzdGF5IGF0IGA8YmFzZVBhdGg+L19uZXh0L3N0YXRpYy8uLi5gIGluXG4gICAqIFMzLCBzbyB0aGUgcHJlZml4J3MgcGF0aCBnZXRzIGEgY2FjaGUgYmVoYXZpb3Igb2YgaXRzIG93biB0aGF0IHJld3JpdGVzIGl0XG4gICAqIGF3YXkuXG4gICAqXG4gICAqIEVpdGhlciBmb3JtIGlzIGFjY2VwdGVkOiBhIHBhdGggKFwiL2NkblwiKSwgb3IgYW4gYWJzb2x1dGUgVVJMLCBpbiB3aGljaCBjYXNlXG4gICAqIG9ubHkgaXRzIHBhdGggY291bnRzIChcImh0dHBzOi8vY2RuLmV4YW1wbGUuY29tL2NkblwiIGJlaGF2ZXMgYXMgXCIvY2RuXCIsIGFuZFxuICAgKiBcImh0dHBzOi8vY2RuLmV4YW1wbGUuY29tXCIgbmVlZHMgbm8gYmVoYXZpb3IgYXQgYWxsKS4gQW4gYWJzb2x1dGUgcHJlZml4J3MgcGF0aFxuICAgKiBtYXR0ZXJzIGJlY2F1c2UgYG5leHQgYnVpbGRgIGNvbXBpbGVzIGEgYC9jZG4vX25leHQvOnBhdGgrYCByZXdyaXRlIG9mIGl0c1xuICAgKiBvd24sIHNvIGBuZXh0IHN0YXJ0YCBzZXJ2ZXMgZXZlcnkgYnVuZGxlIHVuZGVyIGl0IOKAlCBhIENETiBmcm9udGluZyB0aGlzXG4gICAqIGRpc3RyaWJ1dGlvbiB0aGVyZSBoYXMgdG8gYmUgYW5zd2VyZWQgdG9vLlxuICAgKlxuICAgKiBBcHBsaWVkIG9uIHRvcCBvZiBgYmFzZVBhdGhgLCBub3QgdW5kZXIgaXQsIGJlY2F1c2UgdGhhdCBpcyBob3cgTmV4dC5qc1xuICAgKiBidWlsZHMgdGhlIFVSTC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lOyBwYXNzIGBOZXh0anNCdWlsZC5uZXh0Q29uZmlnQXNzZXRQcmVmaXhQYXRoYFxuICAgKi9cbiAgcmVhZG9ubHkgYXNzZXRQcmVmaXg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBVUkkgcGF0aCBwcmVmaXggdGhlIGFwcCBpcyBzZXJ2ZWQgYXQuIFN1cnJvdW5kaW5nIHNsYXNoZXMgYXJlIG5vcm1hbGl6ZWRcbiAgICogYXdheSwgc28gXCIvYmFzZVwiLCBcImJhc2VcIiBhbmQgXCIvYmFzZS9cIiBhbGwgcHJvZHVjZSB0aGUgc2FtZSBjYWNoZSBiZWhhdmlvcnMuXG4gICAqL1xuICByZWFkb25seSBiYXNlUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGJ1dCBvbmx5IGFwcGxpY2FibGUgZm9yIGBOZXh0anNUeXBlLkdMT0JBTF9DT05UQUlORVJTYFxuICAgKi9cbiAgcmVhZG9ubHkgY2VydGlmaWNhdGU/OiBJQ2VydGlmaWNhdGU7XG4gIHJlYWRvbmx5IGRpc3RyaWJ1dGlvbj86IERpc3RyaWJ1dGlvbjtcbiAgLyoqXG4gICAqIFJlcXVpcmVkIGlmIGBOZXh0anNUeXBlLkdMT0JBTF9GVU5DVElPTlNgXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvblVybD86IElGdW5jdGlvblVybDtcbiAgLyoqXG4gICAqIFJlcXVpcmVkIGlmIGBOZXh0anNUeXBlLkdMT0JBTF9DT05UQUlORVJTYCBvciBgTmV4dGpzVHlwZS5SRUdJT05BTF9DT05UQUlORVJTYFxuICAgKi9cbiAgcmVhZG9ubHkgbG9hZEJhbGFuY2VyPzogSUFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyO1xuICByZWFkb25seSBuZXh0anNUeXBlOiBOZXh0anNUeXBlO1xuICAvKipcbiAgICogT3ZlcnJpZGUgcHJvcHMgZm9yIGV2ZXJ5IGNvbnN0cnVjdC5cbiAgICovXG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IE5leHRqc0Rpc3RyaWJ1dGlvbk92ZXJyaWRlcztcbiAgLyoqXG4gICAqIEVudHJpZXMgKGZpbGVzL2RpcmVjdG9yaWVzKSB3aXRoaW4gTmV4dC5qcyBhcHAncyBwdWJsaWMgZGlyZWN0b3J5LiBVc2VkIHRvXG4gICAqIGFkZCBzdGF0aWMgYmVoYXZpb3JzIHRvIGRpc3RyaWJ1dGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHB1YmxpY0RpckVudHJpZXM6IFB1YmxpY0RpckVudHJ5W107XG4gIC8qKlxuICAgKiBUaGUgYFNlcnZpY2UtV29ya2VyLUFsbG93ZWRgIGhlYWRlciBmb3IgYF9uZXh0L3N0YXRpYy9zZXJ2aWNlLXdvcmtlci8qYCxcbiAgICogd2hpY2ggTmV4dC5qcyBzZW5kcyBzbyBhIGNvbXBpbGVkIHNlcnZpY2Ugd29ya2VyIGNhbiByZWdpc3RlciBhdCBhIHNjb3BlXG4gICAqIHdpZGVyIHRoYW4gaXRzIG93biBkaXJlY3RvcnksIHN1Y2ggYXMgYC9gLiBTMyBjYW4ndCBzZW5kIGFuIGFyYml0cmFyeVxuICAgKiBoZWFkZXIsIHNvIHNldHRpbmcgdGhpcyBhZGRzIGEgYmVoYXZpb3IgZm9yIHRob3NlIGZpbGVzIHdob3NlIHJlc3BvbnNlXG4gICAqIGhlYWRlcnMgcG9saWN5IGRvZXMuIE5leHQuanMgdXNlcyB0aGUgYXBwJ3MgYGJhc2VQYXRoYCwgb3IgYC9gIGZvciBub25lLlxuICAgKiBAZGVmYXVsdCAtIG5vIGJlaGF2aW9yOyB0aGUgYnVpbGQgaGFzIG5vIHNlcnZpY2Ugd29ya2VyXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlV29ya2VyQWxsb3dlZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBub24tYGRlZmF1bHRgIGZ1bmN0aW9uIGdyb3VwcywgdGhlIG9yaWdpbnNcbiAgICoge0BsaW5rIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnN9IHJvdXRlIHRvLlxuICAgKiBAZGVmYXVsdCAtIG5vIHNwbGl0dGluZzsgdGhlIGRlZmF1bHQgYmVoYXZpb3Igc2VydmVzIGV2ZXJ5IGR5bmFtaWMgcm91dGVcbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uR3JvdXBzPzogTmV4dGpzRGlzdHJpYnV0aW9uRnVuY3Rpb25Hcm91cFtdO1xuICAvKipcbiAgICogYE5leHRqc0J1aWxkLmZ1bmN0aW9uR3JvdXBCZWhhdmlvcnNgOiBvbmUgY2FjaGUgYmVoYXZpb3IgZWFjaCwgYWRkZWQgaW5cbiAgICogb3JkZXIsIHNvIHRoZSByb3V0ZXMgZWFjaCBncm91cCB3YXMgcGFja2FnZWQgd2l0aCByZWFjaCBpdCByYXRoZXIgdGhhbiB0aGVcbiAgICogZGVmYXVsdCBmdW5jdGlvbi5cbiAgICogQGRlZmF1bHQgLSBub25lXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzPzogTmV4dGpzRnVuY3Rpb25Hcm91cEJlaGF2aW9yW107XG4gIC8qKlxuICAgKiBUaGUgbW9zdCBjYWNoZSBiZWhhdmlvcnMgdGhlIGRpc3RyaWJ1dGlvbiBtYXkgaGF2ZSwgdGhlIGRlZmF1bHQgb25lXG4gICAqIGluY2x1ZGVkLiBjZGstbmV4dGpzIGNvdW50cyB3aGF0IGl0IGFkZHMgYWdhaW5zdCB0aGlzIGF0IHN5bnRoLCBzbyBydW5uaW5nXG4gICAqIG91dCBpcyBhIHN5bnRoIGVycm9yIG5hbWluZyB3aGF0IHVzZWQgdGhlbSByYXRoZXIgdGhhbiBhIGZhaWxlZCBkZXBsb3kuXG4gICAqXG4gICAqIFJhaXNlIGl0IGFmdGVyIHJhaXNpbmcgdGhlIFwiQ2FjaGUgYmVoYXZpb3JzIHBlciBkaXN0cmlidXRpb25cIiBxdW90YSBmb3JcbiAgICogeW91ciBhY2NvdW50LiBMb3dlciBpdCBieSB0aGUgYmVoYXZpb3JzIGEgc3VwcGxpZWQge0BsaW5rIGRpc3RyaWJ1dGlvbn1cbiAgICogKG9yIGBvdmVycmlkZXMuZGlzdHJpYnV0aW9uUHJvcHNgKSBhbHJlYWR5IGhhcywgd2hpY2ggYXJlIG5vdCBjb3VudGVkLlxuICAgKiBAZGVmYXVsdCA3NSAtIENsb3VkRnJvbnQncyBkZWZhdWx0IHF1b3RhXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2Nsb3VkZnJvbnQtbGltaXRzLmh0bWwjbGltaXRzLXdlYi1kaXN0cmlidXRpb25zXG4gICAqL1xuICByZWFkb25seSBtYXhDYWNoZUJlaGF2aW9ycz86IG51bWJlcjtcbiAgLyoqXG4gICAqIENsb3VkRnJvbnQgRnVuY3Rpb24gY29kZSBydW4gZmlyc3Qgb24gZXZlcnkgdmlld2VyIHJlcXVlc3QsIG9uIGV2ZXJ5XG4gICAqIGJlaGF2aW9yIGNkay1uZXh0anMgYWRkcywgc3RhdGljIGFzc2V0cyBpbmNsdWRlZCDigJQgSFRUUCBCYXNpYyBhdXRoIG9uIGFcbiAgICogcHJlLWxhdW5jaCBzaXRlLCBnZW8tZ2F0aW5nLlxuICAgKlxuICAgKiBJdCBtdXN0IGRlZmluZSBgdmlld2VyUmVxdWVzdChldmVudClgIChhIGZ1bmN0aW9uLCBzeW5jIG9yIGFzeW5jLCBvciBhXG4gICAqIGB2YXJgL2BsZXRgL2Bjb25zdGApOiByZXR1cm4gYSByZXNwb25zZSB0byBhbnN3ZXIgdGhlIHZpZXdlciwgb3IgdGhlXG4gICAqIHJlcXVlc3QgKG9yIG5vdGhpbmcpIHRvIGNhcnJ5IG9uLiBJdCBpcyBzcGxpY2VkIGludG8gY2RrLW5leHRqcydzIG93blxuICAgKiB2aWV3ZXItcmVxdWVzdCBmdW5jdGlvbnMsIGFoZWFkIG9mIHRoZWlyIGxvZ2ljLCBzbyBpdCBtYXkgbm90IHVzZSB0aGVcbiAgICogbmFtZSBgaGFuZGxlcmAsIGFuZCB0aGUgY29tYmluZWQgZnVuY3Rpb24gbXVzdCBmaXQgQ2xvdWRGcm9udCdzIDEwIEtCLlxuICAgKiBJdCBydW5zIG9uIGBjbG91ZGZyb250LWpzLTIuMGAsIHNvIGl0IG1heSBiZSBhc3luYyBhbmQgcmVhZFxuICAgKiB7QGxpbmsgdmlld2VyUmVxdWVzdEtleVZhbHVlU3RvcmV9IHdpdGggYGNmLmt2cygpYC4gQSBicmluZy15b3VyLW93blxuICAgKiB7QGxpbmsgZGlzdHJpYnV0aW9ufSdzIGRlZmF1bHQgYmVoYXZpb3IgaXNuJ3QgY292ZXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lXG4gICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Nka2xhYnMvY2RrLW5leHRqcyNydW5uaW5nLWNvZGUtb24tZXZlcnktdmlld2VyLXJlcXVlc3RcbiAgICovXG4gIHJlYWRvbmx5IHZpZXdlclJlcXVlc3RGdW5jdGlvbkNvZGU/OiBGdW5jdGlvbkNvZGU7XG4gIC8qKlxuICAgKiBBIENsb3VkRnJvbnQgS2V5VmFsdWVTdG9yZSBhc3NvY2lhdGVkIHdpdGggZXZlcnkgdmlld2VyLXJlcXVlc3QgZnVuY3Rpb25cbiAgICoge0BsaW5rIHZpZXdlclJlcXVlc3RGdW5jdGlvbkNvZGV9IGlzIGNvcGllZCBpbnRvICh1cCB0byB0aHJlZSwgb25lIHBlciBraW5kXG4gICAqIG9mIGJlaGF2aW9yKSwgc28gdmFsdWVzIGl0IHJlYWRzIOKAlCBCYXNpYyBhdXRoIGNyZWRlbnRpYWxzLCBhbiBhbGxvd2xpc3Qg4oCUXG4gICAqIGxpdmUgb3V0c2lkZSB0aGUgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUgYW5kIGNoYW5nZSB3aXRob3V0IGEgZGVwbG95LlxuICAgKiBSZWFkIGl0IHdpdGggYGNmLmt2cygpYCwgbm8gSUQgbmVlZGVkLlxuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvZnVuY3Rpb25zLWN1c3RvbS1tZXRob2RzLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IHZpZXdlclJlcXVlc3RLZXlWYWx1ZVN0b3JlPzogSUtleVZhbHVlU3RvcmU7XG59XG5cbi8qKiBBIG5vbi1kZWZhdWx0IGZ1bmN0aW9uIGdyb3VwIGFuZCB0aGUgb3JpZ2luIGl0cyByb3V0ZXMgbXVzdCByZWFjaC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzRGlzdHJpYnV0aW9uRnVuY3Rpb25Hcm91cCB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqIFRoZSBncm91cCdzIExhbWJkYSBGdW5jdGlvbiBVUkwuICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uVXJsOiBJRnVuY3Rpb25Vcmw7XG59XG5cbmV4cG9ydCBjbGFzcyBOZXh0anNEaXN0cmlidXRpb24gZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBkaXN0cmlidXRpb246IERpc3RyaWJ1dGlvbjtcblxuICBwcml2YXRlIHByb3BzOiBOZXh0anNEaXN0cmlidXRpb25Qcm9wcztcbiAgLyoqXG4gICAqIGBwcm9wcy5iYXNlUGF0aGAgbm9ybWFsaXplZCB0byBhIGJhcmUgcGF0aCBzZWdtZW50LiBUaGlzIGNvbnN0cnVjdCBpcyB0aGVcbiAgICogb25lIHBsYWNlIHRoYXQgbmVlZHMgaXQgd2l0aCBhIGxlYWRpbmcgc2xhc2gg4oCUIENsb3VkRnJvbnQgcGF0aCBwYXR0ZXJucyBhcmVcbiAgICogd3JpdHRlbiBhZ2FpbnN0IHRoZSByZXF1ZXN0IHBhdGgg4oCUIHNvIGl0IHByZXBlbmRzIGl0cyBvd24gcmF0aGVyIHRoYW5cbiAgICogcmVseWluZyBvbiB0aGUgY2FsbGVyIGhhdmluZyBwYXNzZWQgb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBiYXNlUGF0aDogc3RyaW5nO1xuICAvKipcbiAgICogYHByb3BzLmFzc2V0UHJlZml4YCBub3JtYWxpemVkIHRvIGEgbGVhZGluZy1zbGFzaCBwYXRoLCBgXCJcImAgd2hlbiB0aGUgYXBwXG4gICAqIHNldHMgbm9uZSBvciBzZXRzIG9uZSB0aGF0IGFscmVhZHkgZXF1YWxzIHRoZSBgYmFzZVBhdGhgIHByZWZpeCDigJQgaW4gd2hpY2hcbiAgICogY2FzZSB0aGUgb3JkaW5hcnkgYF9uZXh0L3N0YXRpYypgIGJlaGF2aW9yIGFscmVhZHkgY292ZXJzIGl0IGFuZCBhIHNlY29uZCBvbmVcbiAgICogd291bGQgYmUgYSBkdXBsaWNhdGUgcGF0dGVybiBDbG91ZEZyb250IHJlamVjdHMuXG4gICAqL1xuICBwcml2YXRlIGFzc2V0UHJlZml4OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDb21tb24gc2VjdXJpdHkgaGVhZGVycyBhcHBsaWVkIGJ5IGRlZmF1bHQgdG8gYWxsIG9yaWdpbnNcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvdXNpbmctbWFuYWdlZC1yZXNwb25zZS1oZWFkZXJzLXBvbGljaWVzLmh0bWwjbWFuYWdlZC1yZXNwb25zZS1oZWFkZXJzLXBvbGljaWVzLXNlY3VyaXR5XG4gICAqL1xuICBwcml2YXRlIGNvbW1vblNlY3VyaXR5SGVhZGVyc0JlaGF2aW9yOiBSZXNwb25zZVNlY3VyaXR5SGVhZGVyc0JlaGF2aW9yID0ge1xuICAgIGNvbnRlbnRUeXBlT3B0aW9uczogeyBvdmVycmlkZTogZmFsc2UgfSxcbiAgICBmcmFtZU9wdGlvbnM6IHtcbiAgICAgIGZyYW1lT3B0aW9uOiBIZWFkZXJzRnJhbWVPcHRpb24uU0FNRU9SSUdJTixcbiAgICAgIG92ZXJyaWRlOiBmYWxzZSxcbiAgICB9LFxuICAgIHJlZmVycmVyUG9saWN5OiB7XG4gICAgICBvdmVycmlkZTogZmFsc2UsXG4gICAgICByZWZlcnJlclBvbGljeTogSGVhZGVyc1JlZmVycmVyUG9saWN5LlNUUklDVF9PUklHSU5fV0hFTl9DUk9TU19PUklHSU4sXG4gICAgfSxcblxuICAgIHN0cmljdFRyYW5zcG9ydFNlY3VyaXR5OiB7XG4gICAgICBhY2Nlc3NDb250cm9sTWF4QWdlOiBEdXJhdGlvbi5kYXlzKDM2NSksXG4gICAgICBpbmNsdWRlU3ViZG9tYWluczogdHJ1ZSxcbiAgICAgIG92ZXJyaWRlOiBmYWxzZSxcbiAgICAgIHByZWxvYWQ6IHRydWUsXG4gICAgfSxcbiAgICB4c3NQcm90ZWN0aW9uOiB7IG92ZXJyaWRlOiBmYWxzZSwgcHJvdGVjdGlvbjogdHJ1ZSwgbW9kZUJsb2NrOiB0cnVlIH0sXG4gIH07XG4gIHByaXZhdGUgc3RhdGljT3JpZ2luOiBJT3JpZ2luO1xuICBwcml2YXRlIGR5bmFtaWNPcmlnaW46IElPcmlnaW47XG4gIHByaXZhdGUgZHluYW1pY09yaWdpblJlc3BvbnNlUG9saWN5OiBJT3JpZ2luUmVxdWVzdFBvbGljeTtcbiAgcHJpdmF0ZSBkeW5hbWljQ2xvdWRGcm9udEZ1bmN0aW9uQXNzb2NpYXRpb25zOiBGdW5jdGlvbkFzc29jaWF0aW9uW107XG4gIC8qKlxuICAgKiBgdmlld2VyUmVxdWVzdEZ1bmN0aW9uQ29kZWAsIHJlbmRlcmVkIGFuZCBjaGVja2VkIG9uY2UsIHNpbmNlXG4gICAqIGBGdW5jdGlvbkNvZGUuZnJvbUZpbGVgIHJlYWRzIHRoZSBmaWxlIG9uIGV2ZXJ5IHJlbmRlci5cbiAgICovXG4gIHByaXZhdGUgdmlld2VyUmVxdWVzdENvZGU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdmlld2VyLXJlcXVlc3QgZnVuY3Rpb24gYHZpZXdlclJlcXVlc3RGdW5jdGlvbkNvZGVgIGFkZHMgdG8gYmVoYXZpb3JzXG4gICAqIHdpdGggbm8gdmlld2VyLXJlcXVlc3QgbG9naWMgb2YgdGhlaXIgb3duLCBzaGFyZWQgYnkgYWxsIG9mIHRoZW0sIHNvIHRoZVxuICAgKiBgYXNzZXRQcmVmaXhgIGJlaGF2aW9yLCB3aGljaCBoYXMgYSB2aWV3ZXItcmVxdWVzdCBmdW5jdGlvbiBvZiBpdHMgb3duLFxuICAgKiBjYW4gdGVsbCBpdCBmcm9tIGFuIG92ZXJyaWRlJ3MuXG4gICAqL1xuICBwcml2YXRlIHBhc3NUaHJvdWdoRnVuY3Rpb24/OiBDbG91ZEZyb250RnVuY3Rpb247XG4gIHByaXZhdGUgaXNGdW5jdGlvbkNvbXB1dGU6IGJvb2xlYW47XG4gIHByaXZhdGUgc3RhdGljQmVoYXZpb3JPcHRpb25zOiBCZWhhdmlvck9wdGlvbnM7XG4gIHByaXZhdGUgZHluYW1pY0JlaGF2aW9yT3B0aW9uczogQmVoYXZpb3JPcHRpb25zO1xuICBwcml2YXRlIGltYWdlQmVoYXZpb3JPcHRpb25zOiBCZWhhdmlvck9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE5leHRqc0Rpc3RyaWJ1dGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgaWYgKHByb3BzLnZpZXdlclJlcXVlc3RLZXlWYWx1ZVN0b3JlICYmICFwcm9wcy52aWV3ZXJSZXF1ZXN0RnVuY3Rpb25Db2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke0xPR19QUkVGSVh9IFxcYHZpZXdlclJlcXVlc3RLZXlWYWx1ZVN0b3JlXFxgIGlzIG9ubHkgYXNzb2NpYXRlZCB3aXRoIGAgK1xuICAgICAgICAgIGB0aGUgZnVuY3Rpb25zIFxcYHZpZXdlclJlcXVlc3RGdW5jdGlvbkNvZGVcXGAgcnVucyBpbiwgc28gaXQgbmVlZHMgYCArXG4gICAgICAgICAgYFxcYHZpZXdlclJlcXVlc3RGdW5jdGlvbkNvZGVcXGAgdG8gcmVhZCBpdC5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy52aWV3ZXJSZXF1ZXN0Q29kZSA9IHRoaXMucmVuZGVyVmlld2VyUmVxdWVzdENvZGUoKTtcbiAgICB0aGlzLmJhc2VQYXRoID0gbm9ybWFsaXplQmFzZVBhdGgocHJvcHMuYmFzZVBhdGgpO1xuICAgIHRoaXMuYXNzZXRQcmVmaXggPSB0aGlzLnJlc29sdmVBc3NldFByZWZpeCgpO1xuICAgIHRoaXMuc3RhdGljT3JpZ2luID0gdGhpcy5jcmVhdGVTdGF0aWNPcmlnaW4oKTtcbiAgICB0aGlzLmlzRnVuY3Rpb25Db21wdXRlID0gcHJvcHMubmV4dGpzVHlwZSA9PT0gTmV4dGpzVHlwZS5HTE9CQUxfRlVOQ1RJT05TO1xuICAgIHRoaXMudmFsaWRhdGVGdW5jdGlvbkdyb3VwUHJvcHMoKTtcbiAgICB0aGlzLmR5bmFtaWNPcmlnaW4gPSB0aGlzLmNyZWF0ZUR5bmFtaWNPcmlnaW4oKTtcbiAgICB0aGlzLmR5bmFtaWNPcmlnaW5SZXNwb25zZVBvbGljeSA9IHRoaXMuY3JlYXRlRHluYW1pY09yaWdpblJlcXVlc3RQb2xpY3koKTtcbiAgICB0aGlzLmR5bmFtaWNDbG91ZEZyb250RnVuY3Rpb25Bc3NvY2lhdGlvbnMgPVxuICAgICAgdGhpcy5jcmVhdGVEeW5hbWljQ2xvdWRGcm9udEZ1bmN0aW9uQXNzb2NpYXRpb25zKCk7XG4gICAgdGhpcy5zdGF0aWNCZWhhdmlvck9wdGlvbnMgPSB0aGlzLmNyZWF0ZVN0YXRpY0JlaGF2aW9yT3B0aW9ucygpO1xuICAgIHRoaXMuZHluYW1pY0JlaGF2aW9yT3B0aW9ucyA9IHRoaXMuY3JlYXRlRHluYW1pY0JlaGF2aW9yT3B0aW9ucygpO1xuICAgIHRoaXMuaW1hZ2VCZWhhdmlvck9wdGlvbnMgPSB0aGlzLmNyZWF0ZUltYWdlQmVoYXZpb3JPcHRpb25zKCk7XG4gICAgdGhpcy5kaXN0cmlidXRpb24gPSB0aGlzLmdldERpc3RyaWJ1dGlvbigpO1xuICAgIGlmICh0aGlzLmlzRnVuY3Rpb25Db21wdXRlKSB7XG4gICAgICB0aGlzLmdyYW50SW52b2tlKERFRkFVTFRfRlVOQ1RJT05fR1JPVVAsIHByb3BzLmZ1bmN0aW9uVXJsISk7XG4gICAgfVxuICAgIHRoaXMuYWRkU3RhdGljQmVoYXZpb3JzKCk7XG4gICAgdGhpcy5hZGREeW5hbWljQmVoYXZpb3JzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIENsb3VkRnJvbnQgY29tbWVudCB0aGF0IGlzIHNhZmUgZm9yIHRoZSAxMjggY2hhcmFjdGVyIGxpbWl0LlxuICAgKiBJZiB0aGUgZnVsbCBjb21tZW50IHdpdGggc3RhY2sgbmFtZSBleGNlZWRzIDEyOCBjaGFyYWN0ZXJzLCByZXR1cm5zIHRoZSBiYXNlIGNvbW1lbnQgb25seS5cbiAgICogQHBhcmFtIGJhc2VDb21tZW50IFRoZSBiYXNlIGNvbW1lbnQgdGV4dFxuICAgKiBAcGFyYW0gc3RhY2tOYW1lIFRoZSBzdGFjayBuYW1lIHRvIGFwcGVuZFxuICAgKiBAcmV0dXJucyBBIGNvbW1lbnQgc3RyaW5nIHRoYXQgaXMgZ3VhcmFudGVlZCB0byBiZSA8IDEyOCBjaGFyYWN0ZXJzXG4gICAqL1xuICBwcml2YXRlIGdldENvbW1lbnQoYmFzZUNvbW1lbnQ6IHN0cmluZywgc3RhY2tOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZ1bGxDb21tZW50ID0gYCR7YmFzZUNvbW1lbnR9IGZvciAke3N0YWNrTmFtZX1gO1xuICAgIHJldHVybiBmdWxsQ29tbWVudC5sZW5ndGggPCAxMjggPyBmdWxsQ29tbWVudCA6IGJhc2VDb21tZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTdGF0aWNPcmlnaW4oKTogSU9yaWdpbiB7XG4gICAgcmV0dXJuIFMzQnVja2V0T3JpZ2luLndpdGhPcmlnaW5BY2Nlc3NDb250cm9sKHRoaXMucHJvcHMuYXNzZXRzQnVja2V0LCB7XG4gICAgICAvLyBMSVNUIGxldHMgUzMgYW5zd2VyIGEgbWlzc2luZyBrZXkgd2l0aCA0MDQgaW5zdGVhZCBvZiA0MDNcbiAgICAgIG9yaWdpbkFjY2Vzc0xldmVsczogW0FjY2Vzc0xldmVsLlJFQUQsIEFjY2Vzc0xldmVsLkxJU1RdLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LnMzQnVja2V0T3JpZ2luUHJvcHMsXG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVEeW5hbWljT3JpZ2luKCk6IElPcmlnaW4ge1xuICAgIGlmICh0aGlzLmlzRnVuY3Rpb25Db21wdXRlKSB7XG4gICAgICBpZiAoIXRoaXMucHJvcHMuZnVuY3Rpb25VcmwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBOZXh0anNEaXN0cmlidXRpb25Qcm9wcy5mdW5jdGlvblVybFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBGdW5jdGlvblVybE9yaWdpbi53aXRoT3JpZ2luQWNjZXNzQ29udHJvbChcbiAgICAgICAgdGhpcy5wcm9wcy5mdW5jdGlvblVybCxcbiAgICAgICAgdGhpcy5wcm9wcy5vdmVycmlkZXM/LmR5bmFtaWNGdW5jdGlvblVybE9yaWdpbldpdGhPQUNQcm9wcyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGxvYWRCYWxhbmNlciA9IHRoaXMucHJvcHMubG9hZEJhbGFuY2VyO1xuICAgICAgaWYgKCFsb2FkQmFsYW5jZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBOZXh0anNEaXN0cmlidXRpb25Qcm9wcy5sb2FkQmFsYW5jZXJcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gVnBjT3JpZ2luLndpdGhBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcihsb2FkQmFsYW5jZXIsIHtcbiAgICAgICAgcHJvdG9jb2xQb2xpY3k6IHRoaXMucHJvcHMuY2VydGlmaWNhdGVcbiAgICAgICAgICA/IE9yaWdpblByb3RvY29sUG9saWN5LkhUVFBTX09OTFlcbiAgICAgICAgICA6IE9yaWdpblByb3RvY29sUG9saWN5LkhUVFBfT05MWSxcbiAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LmR5bmFtaWNWcGNPcmlnaW5XaXRoRW5kcG9pbnRQcm9wcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogTGFtYmRhIEZ1bmN0aW9uIFVSTHMgXCJleHBlY3QgdGhlIGBIb3N0YCBoZWFkZXIgdG8gY29udGFpbiB0aGUgb3JpZ2luIGRvbWFpblxuICAgKiBuYW1lLCBub3QgdGhlIGRvbWFpbiBuYW1lIG9mIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbi5cIlxuICAgKlxuICAgKiBBIGNvbnRhaW5lciBvcmlnaW4gYWxzbyBnZXRzIENsb3VkRnJvbnQncyBvd24gaGVhZGVycywgZm9yXG4gICAqIGBDbG91ZEZyb250LUZvcndhcmRlZC1Qcm90b2A6IHdpdGhvdXQgYSBjZXJ0aWZpY2F0ZSBDbG91ZEZyb250IHJlYWNoZXMgdGhlXG4gICAqIEFMQiBvdmVyIHBsYWluIEhUVFAsIHNvIHRoZSBBTEIncyBgWC1Gb3J3YXJkZWQtUHJvdG9gIGlzIGBodHRwYCwgYW5kIHRoZVxuICAgKiBydW50aW1lIHdvdWxkIGJ1aWxkIGV2ZXJ5IGFic29sdXRlIFVSTCAoYHJlcXVlc3QudXJsYCwgdGhlIG9yaWdpbiBhIHNlcnZlclxuICAgKiBhY3Rpb24gaXMgZm9yd2FyZGVkIHRvKSBhcyBgaHR0cDovL2AgYmVoaW5kIGEgdmlld2VyIG9uIEhUVFBTLlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS91c2luZy1tYW5hZ2VkLW9yaWdpbi1yZXF1ZXN0LXBvbGljaWVzLmh0bWwjbWFuYWdlZC1vcmlnaW4tcmVxdWVzdC1wb2xpY3ktYWxsLXZpZXdlci1leGNlcHQtaG9zdC1oZWFkZXJcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvdXNpbmctbWFuYWdlZC1vcmlnaW4tcmVxdWVzdC1wb2xpY2llcy5odG1sI21hbmFnZWQtb3JpZ2luLXJlcXVlc3QtcG9saWN5LWFsbC12aWV3ZXItYW5kLWNsb3VkZnJvbnRcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRHluYW1pY09yaWdpblJlcXVlc3RQb2xpY3koKTogSU9yaWdpblJlcXVlc3RQb2xpY3kge1xuICAgIHJldHVybiB0aGlzLmlzRnVuY3Rpb25Db21wdXRlXG4gICAgICA/IE9yaWdpblJlcXVlc3RQb2xpY3kuQUxMX1ZJRVdFUl9FWENFUFRfSE9TVF9IRUFERVJcbiAgICAgIDogT3JpZ2luUmVxdWVzdFBvbGljeS5BTExfVklFV0VSX0FORF9DTE9VREZST05UXzIwMjI7XG4gIH1cbiAgLyoqXG4gICAqIEVuc3VyZXMgTmV4dC5qcyBgcmVxdWVzdC51cmxgIHdpbGwgYmUgY29ycmVjdCBkb21haW4gaW5zdGVhZCBvZiBVUkwgb2ZcbiAgICogY29tcHV0ZSAoTGFtYmRhIG9yIEZhcmdhdGUpXG4gICAqIEBzZWUgaHR0cHM6Ly9vcGVuLW5leHQuanMub3JnL2FkdmFuY2VkL3dvcmthcm91bmQjd29ya2Fyb3VuZC1zZXQteC1mb3J3YXJkZWQtaG9zdC1oZWFkZXItYXdzLXNwZWNpZmljXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUR5bmFtaWNDbG91ZEZyb250RnVuY3Rpb25Bc3NvY2lhdGlvbnMoKTogRnVuY3Rpb25Bc3NvY2lhdGlvbltdIHtcbiAgICBjb25zdCBhc3NvY2lhdGlvbnM6IEZ1bmN0aW9uQXNzb2NpYXRpb25bXSA9IFtdO1xuICAgIGlmICh0aGlzLmlzRnVuY3Rpb25Db21wdXRlKSB7XG4gICAgICBjb25zdCBjbG91ZEZyb250Rm4gPSBuZXcgQ2xvdWRGcm9udEZ1bmN0aW9uKHRoaXMsIFwiQ2xvdWRGcm9udEZuXCIsIHtcbiAgICAgICAgLi4udGhpcy52aWV3ZXJSZXF1ZXN0RnVuY3Rpb25Qcm9wcyhYX0ZPUldBUkRFRF9IT1NUX0hBTkRMRVIpLFxuICAgICAgfSk7XG4gICAgICBhc3NvY2lhdGlvbnMucHVzaCh7XG4gICAgICAgIGV2ZW50VHlwZTogRnVuY3Rpb25FdmVudFR5cGUuVklFV0VSX1JFUVVFU1QsXG4gICAgICAgIGZ1bmN0aW9uOiBjbG91ZEZyb250Rm4sXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudmlld2VyUmVxdWVzdENvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQ29udGFpbmVycyBuZWVkIG5vIGZ1bmN0aW9uIG9mIHRoZWlyIG93biDigJQgdGhlaXIgb3JpZ2luIHNlZXMgdGhlXG4gICAgICAvLyB2aWV3ZXIncyBgSG9zdGAg4oCUIHNvIHRoaXMgb25lIG9ubHkgcnVucyB0aGUgdXNlcidzIGNvZGUuXG4gICAgICBhc3NvY2lhdGlvbnMucHVzaCh7XG4gICAgICAgIGV2ZW50VHlwZTogRnVuY3Rpb25FdmVudFR5cGUuVklFV0VSX1JFUVVFU1QsXG4gICAgICAgIGZ1bmN0aW9uOiB0aGlzLmdldFBhc3NUaHJvdWdoRnVuY3Rpb24oKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gYXNzb2NpYXRpb25zO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gYSBiZWhhdmlvciB3aXRoIG5vIHZpZXdlci1yZXF1ZXN0IGxvZ2ljIG9mIGl0cyBvd24gZ2V0cyB3aGVuXG4gICAqIGB2aWV3ZXJSZXF1ZXN0RnVuY3Rpb25Db2RlYCBpcyBzZXQsIGNyZWF0ZWQgb24gZmlyc3QgdXNlLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRQYXNzVGhyb3VnaEZ1bmN0aW9uKCkge1xuICAgIHRoaXMucGFzc1Rocm91Z2hGdW5jdGlvbiA/Pz0gbmV3IENsb3VkRnJvbnRGdW5jdGlvbihcbiAgICAgIHRoaXMsXG4gICAgICBcIlZpZXdlclJlcXVlc3RGblwiLFxuICAgICAge1xuICAgICAgICBjb21tZW50OiB0aGlzLmdldENvbW1lbnQoXG4gICAgICAgICAgXCJOZXh0SlMgdmlld2VyIHJlcXVlc3RcIixcbiAgICAgICAgICBTdGFjay5vZih0aGlzKS5zdGFja05hbWUsXG4gICAgICAgICksXG4gICAgICAgIC4uLnRoaXMudmlld2VyUmVxdWVzdEZ1bmN0aW9uUHJvcHMoUEFTU19USFJPVUdIX0hBTkRMRVIpLFxuICAgICAgfSxcbiAgICApO1xuICAgIHJldHVybiB0aGlzLnBhc3NUaHJvdWdoRnVuY3Rpb247XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBjb2RlLCBydW50aW1lIGFuZCBLZXlWYWx1ZVN0b3JlIG9mIGEgZnVuY3Rpb24gd2hvc2UgYGhhbmRsZXJgIGlzXG4gICAqIGNkay1uZXh0anMncywgd2l0aCBgdmlld2VyUmVxdWVzdEZ1bmN0aW9uQ29kZWAgc3BsaWNlZCBpblxuICAgKiAoe0BsaW5rIHNwbGljZVZpZXdlclJlcXVlc3R9KSBhbmQgY2hlY2tlZCBhZ2FpbnN0IENsb3VkRnJvbnQncyBzaXplIGxpbWl0LlxuICAgKlxuICAgKiBFdmVyeSBvbmUgcnVucyBvbiBgY2xvdWRmcm9udC1qcy0yLjBgLCB0aGUgcnVudGltZSBBV1MgcmVjb21tZW5kcyBhbmQgdGhlXG4gICAqIG9uZSB3aXRoIGBhc3luY2AgYW5kIEtleVZhbHVlU3RvcmVzLCBzbyB0aGUgaGFuZGxlcnMgYXJlIGFsbCBgYXN5bmNgXG4gICAqIHdoZXRoZXIgb3Igbm90IHRoZXJlIGlzIHVzZXIgY29kZSB0byBhd2FpdC5cbiAgICovXG4gIHByaXZhdGUgdmlld2VyUmVxdWVzdEZ1bmN0aW9uUHJvcHMoXG4gICAgaGFuZGxlcjogc3RyaW5nLFxuICApOiBQaWNrPEZ1bmN0aW9uUHJvcHMsIFwiY29kZVwiIHwgXCJydW50aW1lXCIgfCBcImtleVZhbHVlU3RvcmVcIj4ge1xuICAgIGNvbnN0IHVzZXJDb2RlID0gdGhpcy52aWV3ZXJSZXF1ZXN0Q29kZTtcbiAgICBjb25zdCBjb2RlID0gc3BsaWNlVmlld2VyUmVxdWVzdChoYW5kbGVyLCB1c2VyQ29kZSk7XG4gICAgaWYgKHVzZXJDb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IEZ1bmN0aW9uQ29kZS5mcm9tSW5saW5lKGNvZGUpLFxuICAgICAgICBydW50aW1lOiBGdW5jdGlvblJ1bnRpbWUuSlNfMl8wLFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3Qgc2l6ZSA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGNvZGUpO1xuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQoY29kZSkpIHtcbiAgICAgIC8vIEEgdG9rZW4ncyBwbGFjZWhvbGRlciBpc24ndCB0aGUgbGVuZ3RoIG9mIHdoYXQgaXQgcmVzb2x2ZXMgdG8uXG4gICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nKFxuICAgICAgICBgJHtMT0dfUFJFRklYfSBcXGB2aWV3ZXJSZXF1ZXN0RnVuY3Rpb25Db2RlXFxgIGNvbnRhaW5zIGEgQ0RLIHRva2VuLCBzbyBgICtcbiAgICAgICAgICBgaXRzIHNpemUgY2FuJ3QgYmUgY2hlY2tlZCBhZ2FpbnN0IENsb3VkRnJvbnQncyBsaW1pdCBvZiBgICtcbiAgICAgICAgICBgJHtNQVhfRlVOQ1RJT05fQ09ERV9CWVRFU30gYnl0ZXMgdW50aWwgZGVwbG95LmAsXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoc2l6ZSA+IE1BWF9GVU5DVElPTl9DT0RFX0JZVEVTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke0xPR19QUkVGSVh9IFxcYHZpZXdlclJlcXVlc3RGdW5jdGlvbkNvZGVcXGAgbWFrZXMgYSBDbG91ZEZyb250IGAgK1xuICAgICAgICAgIGBGdW5jdGlvbiBvZiAke3NpemV9IGJ5dGVzLCBjZGstbmV4dGpzJ3Mgb3duIGNvZGUgaW5jbHVkZWQsIG92ZXIgYCArXG4gICAgICAgICAgYENsb3VkRnJvbnQncyBsaW1pdCBvZiAke01BWF9GVU5DVElPTl9DT0RFX0JZVEVTfS4gU2hvcnRlbiBpdCBgICtcbiAgICAgICAgICBgKGNvbW1lbnRzIGFuZCB3aGl0ZXNwYWNlIGNvdW50KS4gU2VlIGAgK1xuICAgICAgICAgIGBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY2xvdWRmcm9udC1saW1pdHMuaHRtbCNsaW1pdHMtZnVuY3Rpb25zYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiBGdW5jdGlvbkNvZGUuZnJvbUlubGluZShjb2RlKSxcbiAgICAgIHJ1bnRpbWU6IEZ1bmN0aW9uUnVudGltZS5KU18yXzAsXG4gICAgICBrZXlWYWx1ZVN0b3JlOiB0aGlzLnByb3BzLnZpZXdlclJlcXVlc3RLZXlWYWx1ZVN0b3JlLFxuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIGB2aWV3ZXJSZXF1ZXN0RnVuY3Rpb25Db2RlYCwgcmVuZGVyZWQgb25jZSwgc2luY2UgYEZ1bmN0aW9uQ29kZS5mcm9tRmlsZWBcbiAgICogcmVhZHMgdGhlIGZpbGUgb24gZXZlcnkgcmVuZGVyLCBhbmQgY2hlY2tlZFxuICAgKiAoe0BsaW5rIGNoZWNrVmlld2VyUmVxdWVzdENvZGV9KS5cbiAgICovXG4gIHByaXZhdGUgcmVuZGVyVmlld2VyUmVxdWVzdENvZGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB1c2VyQ29kZSA9IHRoaXMucHJvcHMudmlld2VyUmVxdWVzdEZ1bmN0aW9uQ29kZT8ucmVuZGVyKCk7XG4gICAgaWYgKHVzZXJDb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNoZWNrVmlld2VyUmVxdWVzdENvZGUodXNlckNvZGUpO1xuICAgIHJldHVybiB1c2VyQ29kZTtcbiAgfVxuICAvKipcbiAgICogQ2xvdWRGcm9udCBhbGxvd3Mgb25lIGZ1bmN0aW9uIHBlciBldmVudCB0eXBlIHBlciBiZWhhdmlvciwgc28gYW5cbiAgICogb3ZlcnJpZGUncyB2aWV3ZXItcmVxdWVzdCBhc3NvY2lhdGlvbiBhbmQgb25lIGNkay1uZXh0anMgbmVlZHMgY2FuJ3QgYm90aFxuICAgKiBiZSBrZXB0LiBUaHJvd24gYXQgc3ludGgsIHdoZXJlIGJvdGggaGFsdmVzIGFyZSBrbm93biwgcmF0aGVyIHRoYW4gbGVmdCB0b1xuICAgKiBhIGRlcGxveSB0aGF0IG5hbWVzIG5laXRoZXIuXG4gICAqL1xuICBwcml2YXRlIGFzc2VydFZpZXdlclJlcXVlc3RVbmNsYWltZWQoXG4gICAgb3ZlcnJpZGVOYW1lOiBzdHJpbmcsXG4gICAgYXNzb2NpYXRpb25zOiBGdW5jdGlvbkFzc29jaWF0aW9uW10gfCB1bmRlZmluZWQsXG4gICAgbmVlZHM6IHN0cmluZyxcbiAgKSB7XG4gICAgY29uc3QgY2xhaW1lZCA9IChhc3NvY2lhdGlvbnMgPz8gW10pLnNvbWUoXG4gICAgICAoYXNzb2NpYXRpb24pID0+XG4gICAgICAgIGFzc29jaWF0aW9uLmV2ZW50VHlwZSA9PT0gRnVuY3Rpb25FdmVudFR5cGUuVklFV0VSX1JFUVVFU1QsXG4gICAgKTtcbiAgICBpZiAoY2xhaW1lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtMT0dfUFJFRklYfSBcXGBvdmVycmlkZXMuJHtvdmVycmlkZU5hbWV9LmZ1bmN0aW9uQXNzb2NpYXRpb25zXFxgIGAgK1xuICAgICAgICAgIGBhc3NvY2lhdGVzIGEgQ2xvdWRGcm9udCBmdW5jdGlvbiB3aXRoIGAgK1xuICAgICAgICAgIGAke0Z1bmN0aW9uRXZlbnRUeXBlLlZJRVdFUl9SRVFVRVNUfSwgYnV0ICR7bmVlZHN9LiBgICtcbiAgICAgICAgICBgQ2xvdWRGcm9udCBwZXJtaXRzIG9ubHkgb25lIGZ1bmN0aW9uIHBlciBldmVudCB0eXBlIHBlciBiZWhhdmlvci4gYCArXG4gICAgICAgICAgYE1vdmUgdGhlIGxvZ2ljIGludG8gXFxgdmlld2VyUmVxdWVzdEZ1bmN0aW9uQ29kZVxcYCwgd2hpY2ggcnVucyBgICtcbiAgICAgICAgICBgaW5zaWRlIGNkay1uZXh0anMncyBvd24gdmlld2VyLXJlcXVlc3QgZnVuY3Rpb24gb24gZXZlcnkgYmVoYXZpb3IuYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgY3JlYXRlU3RhdGljQmVoYXZpb3JPcHRpb25zKCk6IEJlaGF2aW9yT3B0aW9ucyB7XG4gICAgY29uc3Qgc3RhdGljQmVoYXZpb3JPcHRpb25zID0gdGhpcy5wcm9wcy5vdmVycmlkZXM/LnN0YXRpY0JlaGF2aW9yT3B0aW9ucztcbiAgICBjb25zdCByZXNwb25zZUhlYWRlcnNQb2xpY3kgPVxuICAgICAgc3RhdGljQmVoYXZpb3JPcHRpb25zPy5yZXNwb25zZUhlYWRlcnNQb2xpY3kgPz9cbiAgICAgIG5ldyBSZXNwb25zZUhlYWRlcnNQb2xpY3kodGhpcywgXCJTdGF0aWNSZXNwb25zZUhlYWRlcnNQb2xpY3lcIiwge1xuICAgICAgICBzZWN1cml0eUhlYWRlcnNCZWhhdmlvcjogdGhpcy5jb21tb25TZWN1cml0eUhlYWRlcnNCZWhhdmlvcixcbiAgICAgICAgY29tbWVudDogdGhpcy5nZXRDb21tZW50KFxuICAgICAgICAgIFwiTmV4dEpTIFN0YXRpYyBSZXNwb25zZSBIZWFkZXJzIFBvbGljeVwiLFxuICAgICAgICAgIFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZSxcbiAgICAgICAgKSxcbiAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LnN0YXRpY1Jlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzLFxuICAgICAgfSk7XG4gICAgY29uc3Qgb3B0aW9uczogQmVoYXZpb3JPcHRpb25zID0ge1xuICAgICAgYWxsb3dlZE1ldGhvZHM6IEFsbG93ZWRNZXRob2RzLkFMTE9XX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICBjYWNoZWRNZXRob2RzOiBDYWNoZWRNZXRob2RzLkNBQ0hFX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICBjYWNoZVBvbGljeTogQ2FjaGVQb2xpY3kuQ0FDSElOR19PUFRJTUlaRUQsXG4gICAgICBvcmlnaW46IHRoaXMuc3RhdGljT3JpZ2luLFxuICAgICAgcmVzcG9uc2VIZWFkZXJzUG9saWN5LFxuICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IFZpZXdlclByb3RvY29sUG9saWN5LlJFRElSRUNUX1RPX0hUVFBTLFxuICAgICAgLi4uc3RhdGljQmVoYXZpb3JPcHRpb25zLFxuICAgIH07XG4gICAgaWYgKHRoaXMudmlld2VyUmVxdWVzdENvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuICAgIHRoaXMuYXNzZXJ0Vmlld2VyUmVxdWVzdFVuY2xhaW1lZChcbiAgICAgIFwic3RhdGljQmVoYXZpb3JPcHRpb25zXCIsXG4gICAgICBzdGF0aWNCZWhhdmlvck9wdGlvbnM/LmZ1bmN0aW9uQXNzb2NpYXRpb25zLFxuICAgICAgXCJgdmlld2VyUmVxdWVzdEZ1bmN0aW9uQ29kZWAgbmVlZHMgdGhhdCBldmVudCB0eXBlIG9uIHRoZSBzdGF0aWMgYmVoYXZpb3JzXCIsXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGZ1bmN0aW9uQXNzb2NpYXRpb25zOiBbXG4gICAgICAgIC4uLihzdGF0aWNCZWhhdmlvck9wdGlvbnM/LmZ1bmN0aW9uQXNzb2NpYXRpb25zID8/IFtdKSxcbiAgICAgICAge1xuICAgICAgICAgIGV2ZW50VHlwZTogRnVuY3Rpb25FdmVudFR5cGUuVklFV0VSX1JFUVVFU1QsXG4gICAgICAgICAgZnVuY3Rpb246IHRoaXMuZ2V0UGFzc1Rocm91Z2hGdW5jdGlvbigpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG4gIHByaXZhdGUgY3JlYXRlRHluYW1pY0JlaGF2aW9yT3B0aW9ucygpOiBCZWhhdmlvck9wdGlvbnMge1xuICAgIGNvbnN0IGR5bmFtaWNCZWhhdmlvck9wdGlvbnMgPSB0aGlzLnByb3BzLm92ZXJyaWRlcz8uZHluYW1pY0JlaGF2aW9yT3B0aW9ucztcbiAgICBjb25zdCBjYWNoZVBvbGljeVByb3BzID0gdGhpcy5wcm9wcy5vdmVycmlkZXM/LmR5bmFtaWNDYWNoZVBvbGljeVByb3BzO1xuICAgIC8vIGNyZWF0ZSBkZWZhdWx0IGNhY2hlIHBvbGljeSBpZiBub3QgcHJvdmlkZWRcbiAgICBjb25zdCBjYWNoZVBvbGljeSA9XG4gICAgICBkeW5hbWljQmVoYXZpb3JPcHRpb25zPy5jYWNoZVBvbGljeSA/P1xuICAgICAgbmV3IENhY2hlUG9saWN5KHRoaXMsIFwiRHluYW1pY0NhY2hlUG9saWN5XCIsIHtcbiAgICAgICAgLi4uKGlzQ2FjaGluZ0Rpc2FibGVkKGNhY2hlUG9saWN5UHJvcHMpXG4gICAgICAgICAgPyBESVNBQkxFRF9DQUNIRV9LRVlcbiAgICAgICAgICA6IERZTkFNSUNfQ0FDSEVfS0VZKSxcbiAgICAgICAgLy8gQSByZXNwb25zZSB3aXRoIG5vIGBDYWNoZS1Db250cm9sYCBpcyBub3QgY2FjaGVkLCB3aGljaCBpcyB3aGF0IE5leHQuanNcbiAgICAgICAgLy8gYW5kIGV2ZXJ5IGFwcCB3cml0dGVuIGZvciBpdCBhc3N1bWU6IGEgZHluYW1pYyByb3V0ZSBoYW5kbGVyIHNldHMgbm9uZS5cbiAgICAgICAgLy8gQ0RLJ3MgZGVmYXVsdCBpcyBhIGRheSwgd2hpY2ggY2FjaGVkIGAvYXBpLypgIHJlc3BvbnNlcyBhdCB0aGUgZWRnZSBmb3JcbiAgICAgICAgLy8gMjQgaG91cnMuIEFueXRoaW5nIE5leHQuanMgKm1lYW5zKiB0byBjYWNoZSAtIElTUiwgU1NHLCBhIFBQUiBzaGVsbCAtXG4gICAgICAgIC8vIHNheXMgc28gd2l0aCBgcy1tYXhhZ2VgLCB3aGljaCBgbWF4VHRsYCBzdGlsbCBob25vcnMuXG4gICAgICAgIGRlZmF1bHRUdGw6IER1cmF0aW9uLnNlY29uZHMoMCksXG4gICAgICAgIGNvbW1lbnQ6IHRoaXMuZ2V0Q29tbWVudChcbiAgICAgICAgICBcIk5leHRKUyBEeW5hbWljIENhY2hlIFBvbGljeVwiLFxuICAgICAgICAgIFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZSxcbiAgICAgICAgKSxcbiAgICAgICAgLi4uY2FjaGVQb2xpY3lQcm9wcyxcbiAgICAgIH0pO1xuICAgIGNvbnN0IHJlc3BvbnNlSGVhZGVyc1BvbGljeSA9XG4gICAgICBkeW5hbWljQmVoYXZpb3JPcHRpb25zPy5yZXNwb25zZUhlYWRlcnNQb2xpY3kgPz9cbiAgICAgIG5ldyBSZXNwb25zZUhlYWRlcnNQb2xpY3kodGhpcywgXCJEeW5hbWljUmVzcG9uc2VIZWFkZXJzUG9saWN5XCIsIHtcbiAgICAgICAgc2VjdXJpdHlIZWFkZXJzQmVoYXZpb3I6IHRoaXMuY29tbW9uU2VjdXJpdHlIZWFkZXJzQmVoYXZpb3IsXG4gICAgICAgIGNvbW1lbnQ6IHRoaXMuZ2V0Q29tbWVudChcbiAgICAgICAgICBcIk5leHRKUyBEeW5hbWljIFJlc3BvbnNlIEhlYWRlcnMgUG9saWN5XCIsXG4gICAgICAgICAgU3RhY2sub2YodGhpcykuc3RhY2tOYW1lLFxuICAgICAgICApLFxuICAgICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uZHluYW1pY1Jlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzLFxuICAgICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19BTEwsXG4gICAgICBjYWNoZVBvbGljeSxcbiAgICAgIG9yaWdpbjogdGhpcy5keW5hbWljT3JpZ2luLFxuICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeTogdGhpcy5keW5hbWljT3JpZ2luUmVzcG9uc2VQb2xpY3ksXG4gICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3ksXG4gICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogVmlld2VyUHJvdG9jb2xQb2xpY3kuUkVESVJFQ1RfVE9fSFRUUFMsXG4gICAgICAuLi5keW5hbWljQmVoYXZpb3JPcHRpb25zLFxuICAgICAgZnVuY3Rpb25Bc3NvY2lhdGlvbnM6IHRoaXMud2l0aER5bmFtaWNGdW5jdGlvbkFzc29jaWF0aW9ucyhcbiAgICAgICAgXCJkeW5hbWljQmVoYXZpb3JPcHRpb25zXCIsXG4gICAgICAgIGR5bmFtaWNCZWhhdmlvck9wdGlvbnM/LmZ1bmN0aW9uQXNzb2NpYXRpb25zLFxuICAgICAgKSxcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBUaGUgYmVoYXZpb3IncyBmdW5jdGlvbiBhc3NvY2lhdGlvbnM6IGFuIG92ZXJyaWRlJ3MsIHBsdXMgdGhlIHZpZXdlci1yZXF1ZXN0XG4gICAqIGZ1bmN0aW9uIEdsb2JhbCBGdW5jdGlvbnMgZGVwZW5kcyBvbiwgb3IgdGhlIG9uZSBgdmlld2VyUmVxdWVzdEZ1bmN0aW9uQ29kZWBcbiAgICogYWRkcyBvbiBHbG9iYWwgQ29udGFpbmVycy5cbiAgICpcbiAgICogU3ByZWFkaW5nIHRoZSBvdmVycmlkZSdzIGBmdW5jdGlvbkFzc29jaWF0aW9uc2Agb3ZlciBvdXJzIHdvdWxkIHNpbGVudGx5XG4gICAqIGRyb3AgdGhhdCBmdW5jdGlvbiwgYW5kIHdpdGggaXQgdGhlIG9ubHkgdGhpbmcgc3RhbmRpbmcgYmV0d2VlbiBhIHZpZXdlcidzXG4gICAqIG93biBgWC1Gb3J3YXJkZWQtSG9zdGAgYW5kIHRoZSBydW50aW1lLCB3aGljaCB0cnVzdHMgdGhhdCBoZWFkZXIgb24gRnVuY3Rpb25cbiAgICogVVJMIGV2ZW50cyAoYGxhbWJkYS1ldmVudC50c2ApOiBob3N0IGluamVjdGlvbiBpbnRvIHJlZGlyZWN0cyBhbmQgYWJzb2x1dGVcbiAgICogVVJMcywgY2FjaGVkIGZvciBvdGhlciB2aWV3ZXJzIGJlY2F1c2UgdGhlIGhlYWRlciBpcyBub3QgaW4gdGhlIGNhY2hlIGtleS5cbiAgICogU28gb3VycyBpcyBrZXB0LCBhbmQgYW4gb3ZlcnJpZGUgY2xhaW1pbmcgVklFV0VSX1JFUVVFU1Qg4oCUIHdoaWNoIENsb3VkRnJvbnRcbiAgICogYWxsb3dzIG9ubHkgb25lIG9mIHBlciBiZWhhdmlvciDigJQgaXMgYW4gZXJyb3IgcmF0aGVyIHRoYW4gYSByZXBsYWNlbWVudC5cbiAgICovXG4gIHByaXZhdGUgd2l0aER5bmFtaWNGdW5jdGlvbkFzc29jaWF0aW9ucyhcbiAgICBvdmVycmlkZU5hbWU6IHN0cmluZyxcbiAgICBvdmVycmlkZGVuOiBGdW5jdGlvbkFzc29jaWF0aW9uW10gfCB1bmRlZmluZWQsXG4gICk6IEZ1bmN0aW9uQXNzb2NpYXRpb25bXSB7XG4gICAgY29uc3Qgb3VycyA9IHRoaXMuZHluYW1pY0Nsb3VkRnJvbnRGdW5jdGlvbkFzc29jaWF0aW9ucztcbiAgICBpZiAoIW92ZXJyaWRkZW4pIHtcbiAgICAgIHJldHVybiBvdXJzO1xuICAgIH1cbiAgICBpZiAoIW91cnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gb3ZlcnJpZGRlbjtcbiAgICB9XG4gICAgdGhpcy5hc3NlcnRWaWV3ZXJSZXF1ZXN0VW5jbGFpbWVkKFxuICAgICAgb3ZlcnJpZGVOYW1lLFxuICAgICAgb3ZlcnJpZGRlbixcbiAgICAgIHRoaXMuaXNGdW5jdGlvbkNvbXB1dGVcbiAgICAgICAgPyBgTmV4dGpzR2xvYmFsRnVuY3Rpb25zIG5lZWRzIHRoYXQgZXZlbnQgdHlwZSBmb3IgaXRzIG93biBmdW5jdGlvbiwgYCArXG4gICAgICAgICAgICBgd2hpY2ggb3ZlcndyaXRlcyBcXGB4LWZvcndhcmRlZC1ob3N0XFxgIHdpdGggdGhlIHZpZXdlcidzIFxcYEhvc3RcXGAgYCArXG4gICAgICAgICAgICBgKHRoZSBydW50aW1lIHRydXN0cyB0aGF0IGhlYWRlciBiZWhpbmQgQ2xvdWRGcm9udCkgYW5kIHJlZGlyZWN0cyBgICtcbiAgICAgICAgICAgIGByZXBlYXRlZCBzbGFzaGVzYFxuICAgICAgICA6IFwiYHZpZXdlclJlcXVlc3RGdW5jdGlvbkNvZGVgIG5lZWRzIHRoYXQgZXZlbnQgdHlwZSBvbiB0aGUgZHluYW1pYyBcIiArXG4gICAgICAgICAgICBcImFuZCBpbWFnZSBiZWhhdmlvcnNcIixcbiAgICApO1xuICAgIHJldHVybiBbLi4ub3ZlcnJpZGRlbiwgLi4ub3Vyc107XG4gIH1cbiAgLyoqXG4gICAqIGBfbmV4dC9pbWFnZSpgIGdvZXMgdG8gdGhlIHNhbWUgb3JpZ2luIGFzIGV2ZXJ5dGhpbmcgZWxzZSDigJQgdGhlIE5leHQuanNcbiAgICogc2VydmVyIG9wdGltaXplcyBpbWFnZXMgaW4tcHJvY2VzcyDigJQgYnV0IGtlZXBzIGl0cyBvd24gYmVoYXZpb3IgZm9yIHRoZVxuICAgKiBjYWNoZSBwb2xpY3k6IGBxdWVyeVN0cmluZ0JlaGF2aW9yOiBhbGwoKWAgcGx1cyBgYWNjZXB0YCBpbiB0aGUgY2FjaGUga2V5IGlzXG4gICAqIHJpZ2h0IGZvciBpbWFnZSByZXF1ZXN0cyBhbmQgd3JvbmcgZm9yIHRoZSByZXN0LlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVJbWFnZUJlaGF2aW9yT3B0aW9ucygpOiBCZWhhdmlvck9wdGlvbnMge1xuICAgIGNvbnN0IGltYWdlQmVoYXZpb3JPcHRpb25zID0gdGhpcy5wcm9wcy5vdmVycmlkZXM/LmltYWdlQmVoYXZpb3JPcHRpb25zO1xuICAgIC8vIGFkZCBkZWZhdWx0IGNhY2hlIHBvbGljeSBpZiBub3QgcHJvdmlkZWRcbiAgICBjb25zdCBjYWNoZVBvbGljeSA9XG4gICAgICBpbWFnZUJlaGF2aW9yT3B0aW9ucz8uY2FjaGVQb2xpY3kgPz9cbiAgICAgIG5ldyBDYWNoZVBvbGljeSh0aGlzLCBcIkltYWdlQ2FjaGVQb2xpY3lcIiwge1xuICAgICAgICAvLyBTRUNVUklUWSBOT1RFOiBieSBkZWZhdWx0IHdlIGRvbid0IGluY2x1ZGUgY29va2llcyBpbiBjYWNoZSBmb3JcbiAgICAgICAgLy8gaW1hZ2VzIGIvYyBpdCBzaWduaWZpY2FudGx5IGltcHJvdmVzIGltYWdlIHBlcmYgZm9yIG1vc3Qgc2l0ZXMgQlVUXG4gICAgICAgIC8vIGlmIHlvdSBoYXZlIHByaXZhdGUgaW1hZ2VzIGxvY2tlZCBiZWhpbmQgYXV0aCBpbXBsZW1lbnRlZCB3aXRoIGNvb2tpZXNcbiAgICAgICAgLy8geW91IG5lZWQgdG8gb3ZlcnJpZGUgdGhpcy5cbiAgICAgICAgcXVlcnlTdHJpbmdCZWhhdmlvcjogQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLmFsbCgpLFxuICAgICAgICBoZWFkZXJCZWhhdmlvcjogQ2FjaGVIZWFkZXJCZWhhdmlvci5hbGxvd0xpc3QoXCJhY2NlcHRcIiksXG4gICAgICAgIGNvb2tpZUJlaGF2aW9yOiBDYWNoZUNvb2tpZUJlaGF2aW9yLm5vbmUoKSxcbiAgICAgICAgZW5hYmxlQWNjZXB0RW5jb2RpbmdCcm90bGk6IHRydWUsXG4gICAgICAgIGVuYWJsZUFjY2VwdEVuY29kaW5nR3ppcDogdHJ1ZSxcbiAgICAgICAgY29tbWVudDogdGhpcy5nZXRDb21tZW50KFxuICAgICAgICAgIFwiTmV4dEpTIEltYWdlIENhY2hlIFBvbGljeVwiLFxuICAgICAgICAgIFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZSxcbiAgICAgICAgKSxcbiAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LmltYWdlQ2FjaGVQb2xpY3lQcm9wcyxcbiAgICAgIH0pO1xuICAgIC8vIGFkZCBkZWZhdWx0IHJlc3BvbnNlIGhlYWRlcnMgcG9saWN5IGlmIG5vdCBwcm92aWRlZFxuICAgIGNvbnN0IHJlc3BvbnNlSGVhZGVyc1BvbGljeSA9XG4gICAgICBpbWFnZUJlaGF2aW9yT3B0aW9ucz8ucmVzcG9uc2VIZWFkZXJzUG9saWN5ID8/XG4gICAgICBuZXcgUmVzcG9uc2VIZWFkZXJzUG9saWN5KHRoaXMsIFwiSW1hZ2VSZXNwb25zZUhlYWRlcnNQb2xpY3lcIiwge1xuICAgICAgICBzZWN1cml0eUhlYWRlcnNCZWhhdmlvcjogdGhpcy5jb21tb25TZWN1cml0eUhlYWRlcnNCZWhhdmlvcixcbiAgICAgICAgY29tbWVudDogdGhpcy5nZXRDb21tZW50KFxuICAgICAgICAgIFwiTmV4dEpTIEltYWdlIFJlc3BvbnNlIEhlYWRlcnMgUG9saWN5XCIsXG4gICAgICAgICAgU3RhY2sub2YodGhpcykuc3RhY2tOYW1lLFxuICAgICAgICApLFxuICAgICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uaW1hZ2VSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcyxcbiAgICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBhbGxvd2VkTWV0aG9kczogQWxsb3dlZE1ldGhvZHMuQUxMT1dfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgIGNhY2hlZE1ldGhvZHM6IENhY2hlZE1ldGhvZHMuQ0FDSEVfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgIG9yaWdpbjogdGhpcy5keW5hbWljT3JpZ2luLFxuICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeTogdGhpcy5keW5hbWljT3JpZ2luUmVzcG9uc2VQb2xpY3ksXG4gICAgICBjYWNoZVBvbGljeSxcbiAgICAgIHJlc3BvbnNlSGVhZGVyc1BvbGljeSxcbiAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICAgIC4uLmltYWdlQmVoYXZpb3JPcHRpb25zLFxuICAgICAgZnVuY3Rpb25Bc3NvY2lhdGlvbnM6IHRoaXMud2l0aER5bmFtaWNGdW5jdGlvbkFzc29jaWF0aW9ucyhcbiAgICAgICAgXCJpbWFnZUJlaGF2aW9yT3B0aW9uc1wiLFxuICAgICAgICBpbWFnZUJlaGF2aW9yT3B0aW9ucz8uZnVuY3Rpb25Bc3NvY2lhdGlvbnMsXG4gICAgICApLFxuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgb3IgdXNlcyB1c2VyIHNwZWNpZmllZCBDbG91ZEZyb250IERpc3RyaWJ1dGlvblxuICAgKi9cbiAgcHJpdmF0ZSBnZXREaXN0cmlidXRpb24oKTogRGlzdHJpYnV0aW9uIHtcbiAgICBsZXQgZGlzdHJpYnV0aW9uOiBEaXN0cmlidXRpb247XG4gICAgaWYgKHRoaXMucHJvcHMuZGlzdHJpYnV0aW9uKSB7XG4gICAgICBkaXN0cmlidXRpb24gPSB0aGlzLnByb3BzLmRpc3RyaWJ1dGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVW5kZXIgYSBgYmFzZVBhdGhgLCB0aGUgYmVoYXZpb3JzIGNkay1uZXh0anMgYWRkcyBmb3IgaXQgc2VydmUgdGhlXG4gICAgICAvLyBhcHAsIHNvIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRoZSB1c2VyJ3MgdG8gcmVwbGFjZS5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy52aWV3ZXJSZXF1ZXN0Q29kZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICF0aGlzLmJhc2VQYXRoICYmXG4gICAgICAgIHRoaXMucHJvcHMub3ZlcnJpZGVzPy5kaXN0cmlidXRpb25Qcm9wcz8uZGVmYXVsdEJlaGF2aW9yXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGAke0xPR19QUkVGSVh9IFxcYG92ZXJyaWRlcy5kaXN0cmlidXRpb25Qcm9wcy5kZWZhdWx0QmVoYXZpb3JcXGAgYCArXG4gICAgICAgICAgICBgcmVwbGFjZXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IgY2RrLW5leHRqcyBidWlsZHMsIGFuZCB3aXRoIGl0IHRoZSBgICtcbiAgICAgICAgICAgIGB2aWV3ZXItcmVxdWVzdCBmdW5jdGlvbiBcXGB2aWV3ZXJSZXF1ZXN0RnVuY3Rpb25Db2RlXFxgIHJ1bnMgaW4sIGAgK1xuICAgICAgICAgICAgYHNvIHBhZ2VzIGFuZCBBUEkgcm91dGVzIHdvdWxkIHNraXAgaXQuIEN1c3RvbWl6ZSB0aGUgZGVmYXVsdCBgICtcbiAgICAgICAgICAgIGBiZWhhdmlvciB0aHJvdWdoIFxcYG92ZXJyaWRlcy5keW5hbWljQmVoYXZpb3JPcHRpb25zXFxgIGluc3RlYWQuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGRpc3RyaWJ1dGlvbiA9IG5ldyBEaXN0cmlidXRpb24odGhpcywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgICBtaW5pbXVtUHJvdG9jb2xWZXJzaW9uOiBTZWN1cml0eVBvbGljeVByb3RvY29sLlRMU19WMV8yXzIwMjEsXG4gICAgICAgIGRlZmF1bHRCZWhhdmlvcjogdGhpcy5keW5hbWljQmVoYXZpb3JPcHRpb25zLFxuICAgICAgICAvLyBiZXN0IHRvIHVzZSBIVFRQIDIgYW5kIDMgZm9yIGNvbXBhdGFiaWxpdHkgKEhUVFAgMikgYW5kIHBlcmZvcm1hbmNlIChIVFRQMylcbiAgICAgICAgLy8gQ2xvdWRGcm9udCB3aWxsIGNob29zZSBiZXN0IG9wdGlvbiBmb3IgY2xpZW50XG4gICAgICAgIGh0dHBWZXJzaW9uOiBIdHRwVmVyc2lvbi5IVFRQMl9BTkRfMyxcbiAgICAgICAgY29tbWVudDogdGhpcy5nZXRDb21tZW50KFxuICAgICAgICAgIFwiTmV4dEpTIERpc3RyaWJ1dGlvblwiLFxuICAgICAgICAgIFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZSxcbiAgICAgICAgKSxcbiAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBkaXN0cmlidXRpb247XG4gIH1cbiAgcHJpdmF0ZSBhZGREeW5hbWljQmVoYXZpb3JzKCkge1xuICAgIC8vIEltYWdlIEJlaGF2aW9yXG4gICAgdGhpcy5kaXN0cmlidXRpb24uYWRkQmVoYXZpb3IoXG4gICAgICB0aGlzLmdldFBhdGhQYXR0ZXJuKFwiX25leHQvaW1hZ2UqXCIpLFxuICAgICAgdGhpcy5pbWFnZUJlaGF2aW9yT3B0aW9ucy5vcmlnaW4sXG4gICAgICB0aGlzLmltYWdlQmVoYXZpb3JPcHRpb25zLFxuICAgICk7XG4gICAgLy8gRnVuY3Rpb24gZ3JvdXAgYmVoYXZpb3JzLCBiZWZvcmUgdGhlIGJhc2VQYXRoIGNhdGNoLWFsbCBiZWxvdyBhbmQgYWZ0ZXJcbiAgICAvLyBgX25leHQvaW1hZ2UqYCAobm8gZ3JvdXAgcGF0dGVybiBjYW4gbWF0Y2ggYW4gaW1hZ2UgcmVxdWVzdCwgYW5kIGtlZXBpbmdcbiAgICAvLyB0aGUgb3JkZXIgb2YgdGhlIHVuc3BsaXQgY2FzZSBieXRlLWlkZW50aWNhbCBpcyB3b3J0aCBtb3JlIHRoYW4gc3ltbWV0cnkpLlxuICAgIHRoaXMuYWRkRnVuY3Rpb25Hcm91cEJlaGF2aW9ycygpO1xuICAgIC8vIFJvb3QgUGF0aCBCZWhhdmlvcnNcbiAgICBpZiAodGhpcy5iYXNlUGF0aCkge1xuICAgICAgLy8gYmVjYXVzZSB3ZSBhbHJlYWR5IGhhdmUgYSBiYXNlUGF0aCB3ZSBkb24ndCB1c2UgLyBpbnN0ZWFkIHdlIHVzZSAvYmFzZS1wYXRoXG4gICAgICB0aGlzLmRpc3RyaWJ1dGlvbi5hZGRCZWhhdmlvcihcbiAgICAgICAgYC8ke3RoaXMuYmFzZVBhdGh9YCxcbiAgICAgICAgdGhpcy5keW5hbWljQmVoYXZpb3JPcHRpb25zLm9yaWdpbixcbiAgICAgICAgdGhpcy5keW5hbWljQmVoYXZpb3JPcHRpb25zLFxuICAgICAgKTtcbiAgICAgIC8vIHdoZW4gYmFzZVBhdGggaXMgc2V0LCB3ZSBlbXVsYXRlIHRoZSBcImRlZmF1bHQgYmVoYXZpb3JcIiAoKikgZm9yIHRoZSBzaXRlIGFzIGAvYmFzZS1wYXRoLypgXG4gICAgICB0aGlzLmRpc3RyaWJ1dGlvbi5hZGRCZWhhdmlvcihcbiAgICAgICAgdGhpcy5nZXRQYXRoUGF0dGVybihcIipcIiksXG4gICAgICAgIHRoaXMuZHluYW1pY0JlaGF2aW9yT3B0aW9ucy5vcmlnaW4sXG4gICAgICAgIHRoaXMuZHluYW1pY0JlaGF2aW9yT3B0aW9ucyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGlmIG5vIGJhc2UgcGF0aCwgdGhlbiBkZWZhdWx0IGJlaGF2aW9yIHdpbGwgaGFuZGxlIGFsbCBvdGhlciBwYXRoc1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQmVmb3JlIGFueSBiZWhhdmlvciBpcyBjb21wdXRlZDogdGhlIGJ1ZGdldCBhbmQgdGhlIGBwdWJsaWMvYCBjaGVja3MgYm90aFxuICAgKiBnZW5lcmF0ZSB0aGUgZ3JvdXAgcGF0dGVybnMsIGFuZCB3b3VsZCBvdGhlcndpc2UgZmFpbCBmaXJzdCB3aXRoIGEgbGVzc1xuICAgKiB1c2VmdWwgbWVzc2FnZS5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVGdW5jdGlvbkdyb3VwUHJvcHMoKSB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMucHJvcHMuZnVuY3Rpb25Hcm91cHM/Lmxlbmd0aCAmJlxuICAgICAgIXRoaXMucHJvcHMuZnVuY3Rpb25Hcm91cEJlaGF2aW9ycz8ubGVuZ3RoXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5pc0Z1bmN0aW9uQ29tcHV0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcImBmdW5jdGlvbkdyb3Vwc2AgaXMgb25seSBzdXBwb3J0ZWQgYnkgTmV4dGpzR2xvYmFsRnVuY3Rpb25zLlwiLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEV2ZXJ5IGdyb3VwIGJlaGF2aW9yLCBmaW5hbCBwYXRoIHBhdHRlcm4gaW5jbHVkZWQsIGluIHRoZSBvcmRlclxuICAgKiB7QGxpbmsgYWRkRnVuY3Rpb25Hcm91cEJlaGF2aW9yc30gYWRkcyB0aGVtLlxuICAgKi9cbiAgcHJpdmF0ZSBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzKCkge1xuICAgIHJldHVybiAodGhpcy5wcm9wcy5mdW5jdGlvbkdyb3VwQmVoYXZpb3JzID8/IFtdKS5tYXAoKGJlaGF2aW9yKSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IHRoaXMucHJvcHMuZnVuY3Rpb25Hcm91cHM/LmZpbmQoXG4gICAgICAgIChpdCkgPT4gaXQubmFtZSA9PT0gYmVoYXZpb3IuZ3JvdXAsXG4gICAgICApO1xuICAgICAgaWYgKCFncm91cCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYCR7TE9HX1BSRUZJWH0gXFxgZnVuY3Rpb25Hcm91cEJlaGF2aW9yc1xcYCByb3V0ZXMgdG8gZnVuY3Rpb24gZ3JvdXAgYCArXG4gICAgICAgICAgICBgXCIke2JlaGF2aW9yLmdyb3VwfVwiLCB3aGljaCBpcyBub3QgaW4gXFxgZnVuY3Rpb25Hcm91cHNcXGAuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmJlaGF2aW9yLFxuICAgICAgICBncm91cCxcbiAgICAgICAgcGF0aFBhdHRlcm46IHRoaXMuZ2V0UGF0aFBhdHRlcm4oYmVoYXZpb3IucGF0dGVybiksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBPbmUgYmVoYXZpb3IgcGVyIGdyb3VwIHBhdHRlcm4sIG1vc3Qgc3BlY2lmaWMgZmlyc3QuXG4gICAqXG4gICAqIFRoZSBvcmRlciBpcyB0aGUgd2hvbGUgbWVjaGFuaXNtLiBDbG91ZEZyb250IGV2YWx1YXRlcyBiZWhhdmlvcnMgaW4gb3JkZXJcbiAgICogYW5kIHN0b3BzIGF0IHRoZSBmaXJzdCB3aG9zZSBwYXRoIHBhdHRlcm4gbWF0Y2hlcywgYW5kIGBhZGRCZWhhdmlvcmBcbiAgICogYXBwZW5kcyDigJQgc28gYGFwaS8qYCBhZGRlZCBiZWZvcmUgYGFwaS9yZXBvcnRzLypgIHdvdWxkIHN3YWxsb3cgZXZlcnlcbiAgICogcmVwb3J0IHJlcXVlc3QgYW5kIHNlbmQgaXQgdG8gYSBmdW5jdGlvbiB3aG9zZSBwYWNrYWdlIGhhcyBubyByZXBvcnRcbiAgICogZW50cnlwb2ludC4gVGhlIGFkYXB0ZXIgc29ydGVkIHRoZSBsaXN0IHdoZW4gaXQgY2hlY2tlZCBpdCBhZ2FpbnN0IGhvd1xuICAgKiBgYXNzaWduUm91dGVzVG9Hcm91cHNgIHBhY2thZ2VkIHRoZSBzYW1lIHJvdXRlcywgc28gaXQgaXMgYWRkZWQgYXMgaXQgaXMuXG4gICAqL1xuICBwcml2YXRlIGFkZEZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMoKSB7XG4gICAgY29uc3Qgb3JpZ2luUGVyR3JvdXAgPSBuZXcgTWFwPHN0cmluZywgSU9yaWdpbj4oKTtcbiAgICBmb3IgKGNvbnN0IHsgZ3JvdXAsIHBhdGhQYXR0ZXJuIH0gb2YgdGhpcy5mdW5jdGlvbkdyb3VwQmVoYXZpb3JzKCkpIHtcbiAgICAgIGxldCBvcmlnaW4gPSBvcmlnaW5QZXJHcm91cC5nZXQoZ3JvdXAubmFtZSk7XG4gICAgICBpZiAoIW9yaWdpbikge1xuICAgICAgICBvcmlnaW4gPSBGdW5jdGlvblVybE9yaWdpbi53aXRoT3JpZ2luQWNjZXNzQ29udHJvbChcbiAgICAgICAgICBncm91cC5mdW5jdGlvblVybCxcbiAgICAgICAgICB0aGlzLnByb3BzLm92ZXJyaWRlcz8uZHluYW1pY0Z1bmN0aW9uVXJsT3JpZ2luV2l0aE9BQ1Byb3BzLFxuICAgICAgICApO1xuICAgICAgICBvcmlnaW5QZXJHcm91cC5zZXQoZ3JvdXAubmFtZSwgb3JpZ2luKTtcbiAgICAgICAgdGhpcy5ncmFudEludm9rZShncm91cC5uYW1lLCBncm91cC5mdW5jdGlvblVybCk7XG4gICAgICB9XG4gICAgICAvLyBTYW1lIGJlaGF2aW9yIG9wdGlvbnMgYXMgZXZlcnkgb3RoZXIgZHluYW1pYyByb3V0ZSDigJQgb25seSB0aGUgb3JpZ2luXG4gICAgICAvLyBkaWZmZXJzLCBhbmQgaXQgaXMgcGFzc2VkIHNlcGFyYXRlbHkuXG4gICAgICBjb25zdCB7IG9yaWdpbjogX2lnbm9yZWQsIC4uLmJlaGF2aW9yT3B0aW9ucyB9ID1cbiAgICAgICAgdGhpcy5keW5hbWljQmVoYXZpb3JPcHRpb25zO1xuICAgICAgdGhpcy5kaXN0cmlidXRpb24uYWRkQmVoYXZpb3IocGF0aFBhdHRlcm4sIG9yaWdpbiwgYmVoYXZpb3JPcHRpb25zKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIGBsYW1iZGE6SW52b2tlRnVuY3Rpb25gIGZvciBDbG91ZEZyb250LCB3aGljaCBhIEZ1bmN0aW9uIFVSTCBiZWhpbmQgT0FDXG4gICAqIG5lZWRzIGJlc2lkZXMgdGhlIGBsYW1iZGE6SW52b2tlRnVuY3Rpb25VcmxgIGBGdW5jdGlvblVybE9yaWdpbmAgZ3JhbnRzLFxuICAgKiBhbmQgc2NvcGVkIHRoZSBzYW1lIHdheTogdG8gdGhpcyBkaXN0cmlidXRpb24sIGFuZCB0byBjYWxscyB0aGF0IGNvbWVcbiAgICogdGhyb3VnaCB0aGUgRnVuY3Rpb24gVVJMLlxuICAgKi9cbiAgcHJpdmF0ZSBncmFudEludm9rZShncm91cDogc3RyaW5nLCBmdW5jdGlvblVybDogSUZ1bmN0aW9uVXJsKSB7XG4gICAgbmV3IENmblBlcm1pc3Npb24odGhpcywgYEludm9rZUZ1bmN0aW9uLSR7Z3JvdXB9YCwge1xuICAgICAgYWN0aW9uOiBcImxhbWJkYTpJbnZva2VGdW5jdGlvblwiLFxuICAgICAgcHJpbmNpcGFsOiBcImNsb3VkZnJvbnQuYW1hem9uYXdzLmNvbVwiLFxuICAgICAgZnVuY3Rpb25OYW1lOiBmdW5jdGlvblVybC5mdW5jdGlvbkFybixcbiAgICAgIHNvdXJjZUFybjogdGhpcy5kaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uQXJuLFxuICAgICAgaW52b2tlZFZpYUZ1bmN0aW9uVXJsOiB0cnVlLFxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgYGFzc2V0UHJlZml4YCBwYXRoIHRoYXQgbmVlZHMgYSBiZWhhdmlvciBvZiBpdHMgb3duLCBvciBgXCJcImAgZm9yIG5vbmUuXG4gICAqXG4gICAqIEFuIGFic29sdXRlIHByZWZpeCBjb250cmlidXRlcyBpdHMgKnBhdGgqOiBcImh0dHBzOi8vY2RuLmV4YW1wbGUuY29tXCIgbmVlZHMgbm9cbiAgICogYmVoYXZpb3IsIGJ1dCBcImh0dHBzOi8vY2RuLmV4YW1wbGUuY29tL2NkblwiIGRvZXMsIGJlY2F1c2UgYG5leHQgYnVpbGRgXG4gICAqIGNvbXBpbGVzIGEgYC9jZG4vX25leHQvOnBhdGgrYCByZXdyaXRlIG9mIGl0cyBvd24gYW5kIGBuZXh0IHN0YXJ0YCBzZXJ2ZXNcbiAgICogZXZlcnkgYnVuZGxlIHVuZGVyIHRoYXQgcGF0aCDigJQgc28gYSBDRE4gZnJvbnRpbmcgdGhpcyBkaXN0cmlidXRpb24gdGhlcmUgaGFzXG4gICAqIHRvIGJlIGFuc3dlcmVkLiBBIHByZWZpeCBlcXVhbCB0byB0aGUgYGJhc2VQYXRoYCBwcmVmaXggaXMgZHJvcHBlZCDigJQgdGhhdCBpc1xuICAgKiB0aGUgTmV4dC5qcyBkZWZhdWx0IHdoZW4gYGJhc2VQYXRoYCBpcyBzZXQsIGFuZCBgX25leHQvc3RhdGljKmAgYWxyZWFkeVxuICAgKiByZXNvbHZlcyB1bmRlciBpdCwgc28gYWRkaW5nIGEgc2Vjb25kIGlkZW50aWNhbCBwYXR0ZXJuIHdvdWxkIG1ha2UgQ2xvdWRGcm9udFxuICAgKiByZWplY3QgdGhlIGRpc3RyaWJ1dGlvbi5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUFzc2V0UHJlZml4KCk6IHN0cmluZyB7XG4gICAgY29uc3QgcHJlZml4ID0gYXNzZXRQcmVmaXhQYXRoKHRoaXMucHJvcHMuYXNzZXRQcmVmaXggPz8gXCJcIik7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZUJhc2VQYXRoKHByZWZpeCkgPT09IHRoaXMuYmFzZVBhdGggPyBcIlwiIDogcHJlZml4O1xuICB9XG4gIC8qKlxuICAgKiBTZXJ2ZXMgYDxhc3NldFByZWZpeD4vX25leHQvc3RhdGljLypgIGZyb20gdGhlIHNhbWUgUzMgb2JqZWN0cyBhc1xuICAgKiBgX25leHQvc3RhdGljLypgLlxuICAgKlxuICAgKiBOZWVkZWQgYmVjYXVzZSBOZXh0LmpzIHB1dHMgYGFzc2V0UHJlZml4YCBpbiBmcm9udCBvZiBldmVyeSBidW5kbGUgVVJMIGl0XG4gICAqIGVtaXRzIHdoaWxlIHRoZSBvYmplY3RzIGtlZXAgdGhlaXIgYDxiYXNlUGF0aD4vX25leHQvc3RhdGljLy4uLmAga2V5cywgYW5kXG4gICAqIGBhc3NldFByZWZpeGAgc2l0cyBvbiB0b3Agb2YgYGJhc2VQYXRoYCByYXRoZXIgdGhhbiB1bmRlciBpdCwgc29cbiAgICogYGdldFBhdGhQYXR0ZXJuYCBpcyBkZWxpYmVyYXRlbHkgbm90IHVzZWQgaGVyZS4gV2l0aG91dCB0aGlzIGJlaGF2aW9yIHRoZVxuICAgKiByZXF1ZXN0IGZhbGxzIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgb25lLCByZWFjaGVzIHRoZSBjb21wdXRlIG9yaWdpbiwgYW5kXG4gICAqIDQwNHM6IHRoZSBkZXBsb3ltZW50IHBhY2thZ2UgY2FycmllcyBubyBgLm5leHQvc3RhdGljYCBkaXJlY3RvcnkgYXQgYWxsLlxuICAgKlxuICAgKiBBIHZpZXdlci1yZXF1ZXN0IGZ1bmN0aW9uIGRvZXMgdGhlIHJld3JpdGUgYmVjYXVzZSBhbiBTMyBvcmlnaW4ga2V5cyBvbiB0aGVcbiAgICogcmVxdWVzdCBVUkkgYW5kIGBvcmlnaW5QYXRoYCBjYW4gb25seSBwcmVwZW5kLiBUaGUgcHJlZml4IGlzIGEgc3ludGgtdGltZVxuICAgKiBsaXRlcmFsLCBzbyB0aGUgZnVuY3Rpb24gaXMgYSBmaXhlZC1sZW5ndGggc3RyaW5nIG9wZXJhdGlvbiByYXRoZXIgdGhhbiBhXG4gICAqIHBhcnNlLlxuICAgKi9cbiAgcHJpdmF0ZSBhZGRBc3NldFByZWZpeEJlaGF2aW9yKCkge1xuICAgIC8vIFRoZSBzdGF0aWMgYmVoYXZpb3JzJyBvd24gdmlld2VyLXJlcXVlc3QgZnVuY3Rpb24sIHdoZW5cbiAgICAvLyBgdmlld2VyUmVxdWVzdEZ1bmN0aW9uQ29kZWAgYWRkZWQgb25lLCBnaXZlcyB3YXkgdG8gdGhlIHJld3JpdGUsIHdoaWNoXG4gICAgLy8gcnVucyB0aGUgc2FtZSBjb2RlIGZpcnN0LlxuICAgIGNvbnN0IGFzc29jaWF0aW9ucyA9IChcbiAgICAgIHRoaXMuc3RhdGljQmVoYXZpb3JPcHRpb25zLmZ1bmN0aW9uQXNzb2NpYXRpb25zID8/IFtdXG4gICAgKS5maWx0ZXIoXG4gICAgICAoYXNzb2NpYXRpb24pID0+IGFzc29jaWF0aW9uLmZ1bmN0aW9uICE9PSB0aGlzLnBhc3NUaHJvdWdoRnVuY3Rpb24sXG4gICAgKTtcbiAgICB0aGlzLmFzc2VydFZpZXdlclJlcXVlc3RVbmNsYWltZWQoXG4gICAgICBcInN0YXRpY0JlaGF2aW9yT3B0aW9uc1wiLFxuICAgICAgYXNzb2NpYXRpb25zLFxuICAgICAgYHNlcnZpbmcgXFxgYXNzZXRQcmVmaXhcXGAgKFwiJHt0aGlzLmFzc2V0UHJlZml4fVwiKSBuZWVkcyB0aGF0IGV2ZW50IHR5cGUgYCArXG4gICAgICAgIGB0byByZXdyaXRlIHRoZSByZXF1ZXN0IFVSSSB0byB0aGUgb2JqZWN0J3Mga2V5YCxcbiAgICApO1xuICAgIGNvbnN0IHJld3JpdGUgPSBuZXcgQ2xvdWRGcm9udEZ1bmN0aW9uKHRoaXMsIFwiQXNzZXRQcmVmaXhGblwiLCB7XG4gICAgICBjb21tZW50OiB0aGlzLmdldENvbW1lbnQoXG4gICAgICAgIFwiTmV4dEpTIGFzc2V0UHJlZml4IHJld3JpdGVcIixcbiAgICAgICAgU3RhY2sub2YodGhpcykuc3RhY2tOYW1lLFxuICAgICAgKSxcbiAgICAgIC4uLnRoaXMudmlld2VyUmVxdWVzdEZ1bmN0aW9uUHJvcHMoXG4gICAgICAgIGFzc2V0UHJlZml4UmV3cml0ZUhhbmRsZXIodGhpcy5iYXNlUGF0aCwgdGhpcy5hc3NldFByZWZpeCksXG4gICAgICApLFxuICAgIH0pO1xuICAgIHRoaXMuZGlzdHJpYnV0aW9uLmFkZEJlaGF2aW9yKFxuICAgICAgYCR7dGhpcy5hc3NldFByZWZpeH0vX25leHQvc3RhdGljKmAsXG4gICAgICB0aGlzLnN0YXRpY09yaWdpbixcbiAgICAgIHtcbiAgICAgICAgLi4udGhpcy5zdGF0aWNCZWhhdmlvck9wdGlvbnMsXG4gICAgICAgIGZ1bmN0aW9uQXNzb2NpYXRpb25zOiBbXG4gICAgICAgICAgLi4uYXNzb2NpYXRpb25zLFxuICAgICAgICAgIHsgZXZlbnRUeXBlOiBGdW5jdGlvbkV2ZW50VHlwZS5WSUVXRVJfUkVRVUVTVCwgZnVuY3Rpb246IHJld3JpdGUgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogU2VydmVzIGBfbmV4dC9zdGF0aWMvc2VydmljZS13b3JrZXIvKmAgd2l0aCBgU2VydmljZS1Xb3JrZXItQWxsb3dlZGAsIHdoaWNoXG4gICAqIHRoZSBicm93c2VyIHJlcXVpcmVzIGJlZm9yZSBpdCByZWdpc3RlcnMgYSBzZXJ2aWNlIHdvcmtlciBhdCBhIHNjb3BlIGFib3ZlXG4gICAqIHRoZSBzY3JpcHQncyBvd24gZGlyZWN0b3J5LiBBZGRlZCBhaGVhZCBvZiBgX25leHQvc3RhdGljKmAsIHdoaWNoIHdvdWxkXG4gICAqIG90aGVyd2lzZSBtYXRjaCBmaXJzdC5cbiAgICpcbiAgICogVGhlIHBvbGljeSBpcyB0aGUgc3RhdGljIG9uZSBwbHVzIHRoZSBoZWFkZXIsIHNvIHNlY3VyaXR5IGhlYWRlcnMgYW5kIGFueVxuICAgKiBgc3RhdGljUmVzcG9uc2VIZWFkZXJzUG9saWN5UHJvcHNgIHN0aWxsIGFwcGx5LiBBIHdob2xlXG4gICAqIGBzdGF0aWNCZWhhdmlvck9wdGlvbnMucmVzcG9uc2VIZWFkZXJzUG9saWN5YCBjYW4ndCBiZSBhZGRlZCB0bywgc28gaXQgaXNcbiAgICogdXNlZCBhcyBpdCBpcywgd2l0aCBhIHdhcm5pbmcuXG4gICAqL1xuICBwcml2YXRlIGFkZFNlcnZpY2VXb3JrZXJCZWhhdmlvcihzZXJ2aWNlV29ya2VyQWxsb3dlZDogc3RyaW5nKSB7XG4gICAgY29uc3Qgb3ZlcnJpZGRlbiA9XG4gICAgICB0aGlzLnByb3BzLm92ZXJyaWRlcz8uc3RhdGljQmVoYXZpb3JPcHRpb25zPy5yZXNwb25zZUhlYWRlcnNQb2xpY3k7XG4gICAgaWYgKG92ZXJyaWRkZW4pIHtcbiAgICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmcoXG4gICAgICAgIGAke0xPR19QUkVGSVh9IFxcYG92ZXJyaWRlcy5zdGF0aWNCZWhhdmlvck9wdGlvbnMucmVzcG9uc2VIZWFkZXJzUG9saWN5XFxgIGAgK1xuICAgICAgICAgIGBpcyB1c2VkIGZvciBcXGBfbmV4dC9zdGF0aWMvc2VydmljZS13b3JrZXIvKlxcYCB0b28sIHNvIHNlcnZpY2UgYCArXG4gICAgICAgICAgYHdvcmtlcnMgZ2V0IG5vIFxcYFNlcnZpY2UtV29ya2VyLUFsbG93ZWQ6ICR7c2VydmljZVdvcmtlckFsbG93ZWR9XFxgIGAgK1xuICAgICAgICAgIGB1bmxlc3MgdGhhdCBwb2xpY3kgc2VuZHMgaXQsIGFuZCByZWdpc3RlcmluZyBvbmUgYXQgYSBzY29wZSBhYm92ZSBgICtcbiAgICAgICAgICBgaXRzIG93biBkaXJlY3RvcnkgZmFpbHMuIEFkZCB0aGUgaGVhZGVyIHRvIHlvdXIgcG9saWN5LCBvciBzZXQgYCArXG4gICAgICAgICAgYFxcYG92ZXJyaWRlcy5zdGF0aWNSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wc1xcYCBpbnN0ZWFkLmAsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBwcm9wcyA9IHRoaXMucHJvcHMub3ZlcnJpZGVzPy5zdGF0aWNSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcztcbiAgICBjb25zdCBjdXN0b21IZWFkZXJzID0gcHJvcHM/LmN1c3RvbUhlYWRlcnNCZWhhdmlvcj8uY3VzdG9tSGVhZGVycyA/PyBbXTtcbiAgICBjb25zdCByZXNwb25zZUhlYWRlcnNQb2xpY3kgPVxuICAgICAgb3ZlcnJpZGRlbiA/P1xuICAgICAgbmV3IFJlc3BvbnNlSGVhZGVyc1BvbGljeSh0aGlzLCBcIlNlcnZpY2VXb3JrZXJSZXNwb25zZUhlYWRlcnNQb2xpY3lcIiwge1xuICAgICAgICBzZWN1cml0eUhlYWRlcnNCZWhhdmlvcjogdGhpcy5jb21tb25TZWN1cml0eUhlYWRlcnNCZWhhdmlvcixcbiAgICAgICAgY29tbWVudDogdGhpcy5nZXRDb21tZW50KFxuICAgICAgICAgIFwiTmV4dEpTIFNlcnZpY2UgV29ya2VyIFJlc3BvbnNlIEhlYWRlcnMgUG9saWN5XCIsXG4gICAgICAgICAgU3RhY2sub2YodGhpcykuc3RhY2tOYW1lLFxuICAgICAgICApLFxuICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgLy8gUG9saWN5IG5hbWVzIGFyZSB1bmlxdWUgcGVyIGFjY291bnQsIHNvIHRoZSBzdGF0aWMgcG9saWN5J3MgY2FuJ3QgYmVcbiAgICAgICAgLy8gcmV1c2VkIGFzIGl0IGlzLCBhbmQgYXJlIGF0IG1vc3QgMTI4IGNoYXJhY3RlcnMsIHNvIGEgc3VmZml4IGNhbid0XG4gICAgICAgIC8vIHNpbXBseSBiZSBhZGRlZCB0byBvbmUgdGhhdCBpcyBhbHJlYWR5IHRoYXQgbG9uZy5cbiAgICAgICAgcmVzcG9uc2VIZWFkZXJzUG9saWN5TmFtZTpcbiAgICAgICAgICBwcm9wcz8ucmVzcG9uc2VIZWFkZXJzUG9saWN5TmFtZSAmJlxuICAgICAgICAgIGAke1xuICAgICAgICAgICAgVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeU5hbWUpXG4gICAgICAgICAgICAgID8gcHJvcHMucmVzcG9uc2VIZWFkZXJzUG9saWN5TmFtZVxuICAgICAgICAgICAgICA6IHByb3BzLnJlc3BvbnNlSGVhZGVyc1BvbGljeU5hbWUuc2xpY2UoXG4gICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgTUFYX1BPTElDWV9OQU1FX0xFTkdUSCAtIFNFUlZJQ0VfV09SS0VSX1NVRkZJWC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgIH0ke1NFUlZJQ0VfV09SS0VSX1NVRkZJWH1gLFxuICAgICAgICBjdXN0b21IZWFkZXJzQmVoYXZpb3I6IHtcbiAgICAgICAgICAvLyBPbmUgdGhlIG92ZXJyaWRlIHNldHMgaXRzZWxmIGlzIGtlcHQuXG4gICAgICAgICAgY3VzdG9tSGVhZGVyczogY3VzdG9tSGVhZGVycy5zb21lKFxuICAgICAgICAgICAgKHsgaGVhZGVyIH0pID0+IGhlYWRlci50b0xvd2VyQ2FzZSgpID09PSBcInNlcnZpY2Utd29ya2VyLWFsbG93ZWRcIixcbiAgICAgICAgICApXG4gICAgICAgICAgICA/IGN1c3RvbUhlYWRlcnNcbiAgICAgICAgICAgIDogW1xuICAgICAgICAgICAgICAgIC4uLmN1c3RvbUhlYWRlcnMsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaGVhZGVyOiBcIlNlcnZpY2UtV29ya2VyLUFsbG93ZWRcIixcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZXJ2aWNlV29ya2VyQWxsb3dlZCxcbiAgICAgICAgICAgICAgICAgIG92ZXJyaWRlOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB0aGlzLmRpc3RyaWJ1dGlvbi5hZGRCZWhhdmlvcihcbiAgICAgIHRoaXMuZ2V0UGF0aFBhdHRlcm4oXCJfbmV4dC9zdGF0aWMvc2VydmljZS13b3JrZXIvKlwiKSxcbiAgICAgIHRoaXMuc3RhdGljT3JpZ2luLFxuICAgICAgeyAuLi50aGlzLnN0YXRpY0JlaGF2aW9yT3B0aW9ucywgcmVzcG9uc2VIZWFkZXJzUG9saWN5IH0sXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGFkZFN0YXRpY0JlaGF2aW9ycygpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5zZXJ2aWNlV29ya2VyQWxsb3dlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmFkZFNlcnZpY2VXb3JrZXJCZWhhdmlvcih0aGlzLnByb3BzLnNlcnZpY2VXb3JrZXJBbGxvd2VkKTtcbiAgICB9XG4gICAgdGhpcy5kaXN0cmlidXRpb24uYWRkQmVoYXZpb3IoXG4gICAgICB0aGlzLmdldFBhdGhQYXR0ZXJuKFwiX25leHQvc3RhdGljKlwiKSxcbiAgICAgIHRoaXMuc3RhdGljT3JpZ2luLFxuICAgICAgdGhpcy5zdGF0aWNCZWhhdmlvck9wdGlvbnMsXG4gICAgKTtcbiAgICBpZiAodGhpcy5hc3NldFByZWZpeCkge1xuICAgICAgdGhpcy5hZGRBc3NldFByZWZpeEJlaGF2aW9yKCk7XG4gICAgfVxuICAgIGNvbnN0IHB1YmxpY1BhdGhQYXR0ZXJucyA9IHRoaXMucHVibGljUGF0aFBhdHRlcm5zKCk7XG4gICAgdGhpcy5hc3NlcnRCZWhhdmlvckJ1ZGdldChwdWJsaWNQYXRoUGF0dGVybnMubGVuZ3RoKTtcbiAgICB0aGlzLmFzc2VydE5vUHVibGljQ29sbGlzaW9ucyhwdWJsaWNQYXRoUGF0dGVybnMpO1xuICAgIGZvciAoY29uc3QgcGF0aFBhdHRlcm4gb2YgcHVibGljUGF0aFBhdHRlcm5zKSB7XG4gICAgICB0aGlzLmRpc3RyaWJ1dGlvbi5hZGRCZWhhdmlvcihcbiAgICAgICAgcGF0aFBhdHRlcm4sXG4gICAgICAgIHRoaXMuc3RhdGljT3JpZ2luLFxuICAgICAgICB0aGlzLnN0YXRpY0JlaGF2aW9yT3B0aW9ucyxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBUaGUgYmVoYXZpb3IgcGF0aCBwYXR0ZXJuIGZvciBlYWNoIHRvcC1sZXZlbCBgcHVibGljL2AgZW50cnksIGZpbmFsIGZvcm06XG4gICAqIGAvKmAgZm9yIGEgZGlyZWN0b3J5IGFuZCB0aGUgYmFzZVBhdGggcHJlZml4IGJvdGggYXBwbGllZC5cbiAgICpcbiAgICogQW4gZW50cnkgd2hvc2UgbmFtZSBoYXMgbm8gY2hhcmFjdGVyIENsb3VkRnJvbnQgY2FuIHNwZWxsIGlzIGxlZnQgb3V0LCB3aXRoXG4gICAqIGEgd2FybmluZywgcmF0aGVyIHRoYW4gZ2l2ZW4gYSBwYXR0ZXJuIG9mIG5vdGhpbmcgYnV0IHdpbGRjYXJkcy4gYNGE0L7RgtC+L2AgaXNcbiAgICogYD8/Pz8/Pz8/LypgIOKAlCBhbnkgOC1ieXRlIGZpcnN0IHNlZ21lbnQg4oCUIGFuZCBwdWJsaWMvIGJlaGF2aW9ycyBhcmUgYWRkZWRcbiAgICogYWhlYWQgb2YgZXZlcnkgY29tcHV0ZSBiZWhhdmlvciwgc28gaXQgd291bGQgc2VuZCBgL3Byb2R1Y3RzLzQyYCBhbmRcbiAgICogYC9zZXR0aW5ncy8qYCB0byBTMywgd2hpY2ggYW5zd2VycyA0MDMuIExlYXZpbmcgdGhlIGVudHJ5IG91dCBjb3N0cyBpdHMgb3duXG4gICAqIGZpbGVzIGluc3RlYWQ6IHRob3NlIHJlcXVlc3RzIHJlYWNoIHRoZSBjb21wdXRlLCB3aGljaCBkb2VzIG5vdCBoYXZlIHRoZW0sXG4gICAqIGFuZCA0MDQuIE9uZSBsaXRlcmFsIGNoYXJhY3RlciBpcyBlbm91Z2ggdG8ga2VlcCBhIHBhdHRlcm4gbmFycm93IOKAlFxuICAgKiBgPz8/Pz8/Pz8uanBnYCBvbmx5IG1hdGNoZXMgYC5qcGdgIHJlcXVlc3RzIOKAlCBzbyBvbmx5IHRoZSBhbGwtd2lsZGNhcmQgb25lc1xuICAgKiBnby5cbiAgICpcbiAgICogVGhlIGxlbmd0aCBsaW1pdCBpcyBjaGVja2VkIGhlcmUsIG9uIHRoZSBmaW5hbCBwYXR0ZXJuLCByYXRoZXIgdGhhbiBpblxuICAgKiB7QGxpbmsgdG9QYXRoUGF0dGVybn06IHRoZSBgLypgIGFuZCB0aGUgYmFzZVBhdGggY291bnQgYWdhaW5zdCBpdCB0b28sIGFuZCBhXG4gICAqIHBhdHRlcm4gdGhhdCBwYXNzZWQgd2l0aG91dCB0aGVtIGZhaWxlZCBhdCBkZXBsb3kgaW5zdGVhZC5cbiAgICovXG4gIHByaXZhdGUgcHVibGljUGF0aFBhdHRlcm5zKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBwYXR0ZXJuczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCB1bm1hdGNoYWJsZTogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHB1YmxpY0ZpbGUgb2YgdGhpcy5wcm9wcy5wdWJsaWNEaXJFbnRyaWVzKSB7XG4gICAgICBjb25zdCBuYW1lID0gdG9QYXRoUGF0dGVybihwdWJsaWNGaWxlLm5hbWUpO1xuICAgICAgaWYgKCEvW14/Ki9dLy50ZXN0KG5hbWUpKSB7XG4gICAgICAgIHVubWF0Y2hhYmxlLnB1c2goYFwiJHtwdWJsaWNGaWxlLm5hbWV9XCJgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXRoUGF0dGVybiA9IHRoaXMuZ2V0UGF0aFBhdHRlcm4oXG4gICAgICAgIHB1YmxpY0ZpbGUuaXNEaXJlY3RvcnkgPyBgJHtuYW1lfS8qYCA6IG5hbWUsXG4gICAgICApO1xuICAgICAgaWYgKHBhdGhQYXR0ZXJuLmxlbmd0aCA+IE1BWF9QQVRIX1BBVFRFUk5fTEVOR1RIKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGhlIHB1YmxpYy8gZW50cnkgXCIke3B1YmxpY0ZpbGUubmFtZX1cIiBuZWVkcyBhIGAgK1xuICAgICAgICAgICAgYCR7cGF0aFBhdHRlcm4ubGVuZ3RofS1jaGFyYWN0ZXIgQ2xvdWRGcm9udCBwYXRoIHBhdHRlcm4sIG92ZXIgYCArXG4gICAgICAgICAgICBgdGhlICR7TUFYX1BBVEhfUEFUVEVSTl9MRU5HVEh9LWNoYXJhY3RlciBgICtcbiAgICAgICAgICAgIFwibGltaXQuIFJlbmFtZSBpdCwgb3IgbW92ZSBpdCBpbnRvIGEgc3ViZGlyZWN0b3J5IG9mIHB1YmxpYy8gd2hvc2UgXCIgK1xuICAgICAgICAgICAgXCJvd24gbmFtZSBpcyBzaG9ydCBlbm91Z2guIFNlZSBcIiArXG4gICAgICAgICAgICBcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9Eb3dubG9hZERpc3RWYWx1ZXNDYWNoZUJlaGF2aW9yLmh0bWwjRG93bmxvYWREaXN0VmFsdWVzUGF0aFBhdHRlcm5cIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHBhdHRlcm5zLnB1c2gocGF0aFBhdHRlcm4pO1xuICAgIH1cbiAgICBpZiAodW5tYXRjaGFibGUubGVuZ3RoID4gMCkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZyhcbiAgICAgICAgYCR7TE9HX1BSRUZJWH0gVGhlc2UgdG9wLWxldmVsIHB1YmxpYy8gZW50cmllcyBoYXZlIG5vIGNoYXJhY3RlciBhIGAgK1xuICAgICAgICAgIFwiQ2xvdWRGcm9udCBwYXRoIHBhdHRlcm4gY2FuIHNwZWxsLCBzbyB0aGVpciBwYXR0ZXJuIHdvdWxkIGJlIFwiICtcbiAgICAgICAgICBcIndpbGRjYXJkcyBhbG9uZSBhbmQgd291bGQgY2FwdHVyZSBldmVyeSBhcHAgcm91dGUgb2YgdGhlIHNhbWUgXCIgK1xuICAgICAgICAgIGBsZW5ndGguIFRoZXkgZ2V0IG5vIGJlaGF2aW9yLCBzbyB0aGVpciByZXF1ZXN0cyByZWFjaCB0aGUgc2VydmVyLCBgICtcbiAgICAgICAgICBgd2hpY2ggcmVhZHMgdGhlbSBmcm9tIFMzIGluc3RlYWQ6ICR7dW5tYXRjaGFibGUuam9pbihcIiwgXCIpfS4gVG8gc2VydmUgYCArXG4gICAgICAgICAgXCJ0aGVtIGZyb20gUzMgZGlyZWN0bHksIHJlbmFtZSB0aGVtLCBvciBtb3ZlIHRoZW0gaW50byBhIHB1YmxpYy8gXCIgK1xuICAgICAgICAgIFwic3ViZGlyZWN0b3J5IHdob3NlIG5hbWUgaGFzIGF0IGxlYXN0IG9uZSBBU0NJSSBsZXR0ZXIgb3IgZGlnaXQuXCIsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcGF0dGVybnM7XG4gIH1cbiAgLyoqXG4gICAqIFJlZnVzZSBhIGdyb3VwIGJlaGF2aW9yIHRoYXQgYSBgcHVibGljL2AgYmVoYXZpb3Igd291bGQgbWFrZSB1bnJlYWNoYWJsZS5cbiAgICpcbiAgICogYHB1YmxpYy9gIGJlaGF2aW9ycyBhcmUgYWRkZWQgZmlyc3QsIGFuZCBDbG91ZEZyb250IHN0b3BzIGF0IHRoZSBmaXJzdCBtYXRjaCxcbiAgICogc28gdHdvIGNhc2VzIHNlbmQgYSBncm91cCdzIHJvdXRlIHRvIFMzIGluc3RlYWQgb2YgaXRzIGZ1bmN0aW9uIOKAlCB3aGljaCBpc1xuICAgKiB3aHkgdGhpcyBpcyBjaGVja2VkIGF0IHN5bnRoLCB3aGVyZSBib3RoIHNpZGVzIGFyZSBrbm93bjpcbiAgICogLSB0aGUgc2FtZSBwYXR0ZXJuIHR3aWNlOiBgcHVibGljL2RvY3MvYCBhbmQgYC9kb2NzLyoqYCBib3RoIGRlcGxveSBhc1xuICAgKiAgIGBkb2NzLypgLiBUaGUgc3ludGggc3VjY2VlZGVkIGFuZCBDbG91ZEZyb250IHJlamVjdGVkIHRoZSBkZXBsb3kuXG4gICAqIC0gYSBncm91cCBwYXR0ZXJuIHVuZGVyIGEgcHVibGljIGRpcmVjdG9yeTogYC9kb2NzL2d1aWRlLyoqYCBiZWhpbmRcbiAgICogICBgZG9jcy8qYCBkZXBsb3lzIGFuZCBuZXZlciBtYXRjaGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3NlcnROb1B1YmxpY0NvbGxpc2lvbnMocHVibGljUGF0aFBhdHRlcm5zOiBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHB1YmxpY1JlZ2V4ZXMgPSBwdWJsaWNQYXRoUGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PiAoe1xuICAgICAgcGF0dGVybixcbiAgICAgIHJlZ2V4OiBjbG91ZEZyb250UGF0dGVyblJlZ2V4KGAvJHtwYXR0ZXJuLnJlcGxhY2UoL15cXC8rLywgXCJcIil9YCksXG4gICAgfSkpO1xuICAgIGZvciAoY29uc3QgeyBncm91cCwgcm91dGUsIHBhdGhQYXR0ZXJuIH0gb2YgdGhpcy5mdW5jdGlvbkdyb3VwQmVoYXZpb3JzKCkpIHtcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZSA9IHB1YmxpY1BhdGhQYXR0ZXJucy5pbmNsdWRlcyhwYXRoUGF0dGVybik7XG4gICAgICAvLyBNYXRjaGluZyB0aGUgZ3JvdXAgcGF0dGVybidzIG93biB0ZXh0IGlzIGVub3VnaDogaXRzIG9ubHkgd2lsZGNhcmQgaXMgYVxuICAgICAgLy8gdHJhaWxpbmcgYCpgLCBzbyBhIHB1YmxpYyBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyB0aGUgdGV4dCB1cCB0byBhbmRcbiAgICAgIC8vIGluY2x1ZGluZyBpdCBtYXRjaGVzIGV2ZXJ5IFVSTCB0aGUgZ3JvdXAgcGF0dGVybiBkb2VzLlxuICAgICAgY29uc3Qgc2hhZG93ID0gZHVwbGljYXRlXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogcHVibGljUmVnZXhlcy5maW5kKCh7IHJlZ2V4IH0pID0+XG4gICAgICAgICAgICByZWdleC50ZXN0KGAvJHtwYXRoUGF0dGVybi5yZXBsYWNlKC9eXFwvKy8sIFwiXCIpfWApLFxuICAgICAgICAgICk7XG4gICAgICBpZiAoIWR1cGxpY2F0ZSAmJiAhc2hhZG93KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtMT0dfUFJFRklYfSBcXGBmdW5jdGlvbkdyb3Vwc1xcYCBwYXR0ZXJuIFwiJHtyb3V0ZX1cIiAoZ3JvdXAgYCArXG4gICAgICAgICAgYFwiJHtncm91cC5uYW1lfVwiKSBgICtcbiAgICAgICAgICAoZHVwbGljYXRlXG4gICAgICAgICAgICA/IGBkZXBsb3lzIGFzIHRoZSBwYXRoIHBhdHRlcm4gXCIke3BhdGhQYXR0ZXJufVwiLCB3aGljaCBhIHRvcC1sZXZlbCBgICtcbiAgICAgICAgICAgICAgYHB1YmxpYy8gZW50cnkgYWxyZWFkeSB1c2VzIOKAlCBDbG91ZEZyb250IHJlamVjdHMgYSBkaXN0cmlidXRpb24gYCArXG4gICAgICAgICAgICAgIGB3aXRoIHR3byBiZWhhdmlvcnMgb24gb25lIHBhdGggcGF0dGVybi4gYFxuICAgICAgICAgICAgOiBgZGVwbG95cyBhcyBcIiR7cGF0aFBhdHRlcm59XCIsIGJ1dCB0aGUgdG9wLWxldmVsIHB1YmxpYy8gZW50cnkgYCArXG4gICAgICAgICAgICAgIGBiZWhpbmQgXCIke3NoYWRvdyEucGF0dGVybn1cIiBpcyBtYXRjaGVkIGZpcnN0IGFuZCBzZW5kcyBldmVyeSBgICtcbiAgICAgICAgICAgICAgYHN1Y2ggcmVxdWVzdCB0byBTMywgc28gdGhlIGdyb3VwJ3MgZnVuY3Rpb24gd291bGQgbmV2ZXIgc2VlIGAgK1xuICAgICAgICAgICAgICBgdGhlbS4gYCkgK1xuICAgICAgICAgIGBNb3ZlIHRob3NlIHB1YmxpYy8gZmlsZXMgdW5kZXIgYSBkaXJlY3Rvcnkgbm8gcm91dGUgdXNlcywgb3IgYCArXG4gICAgICAgICAgYGdyb3VwIGEgZGlmZmVyZW50IHBhdGguYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDbG91ZEZyb250IGhhcyBhIHBlci1kaXN0cmlidXRpb24gY2FjaGUgYmVoYXZpb3IgcXVvdGEsIGNvdW50aW5nIHRoZSBkZWZhdWx0XG4gICAqIG9uZSDigJQgNzUgdW5sZXNzIHJhaXNlZCwgYW5kIGBtYXhDYWNoZUJlaGF2aW9yc2Agc2F5cyB3aGljaCDigJQgYW5kIHRoZXJlIGFyZVxuICAgKiB0aHJlZSB0aGluZ3MgY29tcGV0aW5nIGZvciBpdDogYHB1YmxpYy9gIGVudHJpZXMsIGZ1bmN0aW9uIGdyb3VwcywgYW5kXG4gICAqIGNkay1uZXh0anMncyBvd24gZml4ZWQgc2V0LlxuICAgKiBDaGVja2VkIGluIG9uZSBwbGFjZSBzbyB0aGUgZXJyb3IgY2FuIHNheSB3aGljaCB0byBjdXQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2Nsb3VkZnJvbnQtbGltaXRzLmh0bWwjbGltaXRzLXdlYi1kaXN0cmlidXRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzc2VydEJlaGF2aW9yQnVkZ2V0KHB1YmxpY1BhdHRlcm5zOiBudW1iZXIpIHtcbiAgICBjb25zdCBsaW1pdCA9IHRoaXMucHJvcHMubWF4Q2FjaGVCZWhhdmlvcnMgPz8gREVGQVVMVF9NQVhfQ0FDSEVfQkVIQVZJT1JTO1xuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQobGltaXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGdyb3VwUGF0dGVybnMgPSB0aGlzLmZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMoKS5sZW5ndGg7XG4gICAgLy8gVGhlIGRlZmF1bHQgYmVoYXZpb3IsIGBfbmV4dC9pbWFnZSpgLCBgX25leHQvc3RhdGljKmAsIHBsdXMg4oCUIHdpdGggYVxuICAgIC8vIGJhc2VQYXRoIOKAlCB0aGUgdHdvIHRoYXQgc3RhbmQgaW4gZm9yIHRoZSBkZWZhdWx0IGJlaGF2aW9yJ3MgY292ZXJhZ2UsIGFuZFxuICAgIC8vIOKAlCB3aXRoIGEgcGF0aC1zdHlsZSBhc3NldFByZWZpeCDigJQgdGhlIG9uZSB0aGF0IHNlcnZlcyBidW5kbGVzIHVuZGVyIGl0LFxuICAgIC8vIGFuZCDigJQgd2l0aCBzZXJ2aWNlIHdvcmtlcnMg4oCUIHRoZSBvbmUgdGhhdCBhZGRzIGBTZXJ2aWNlLVdvcmtlci1BbGxvd2VkYC5cbiAgICAvLyBgdGhpcy5iYXNlUGF0aGAsIG5vdCB0aGUgcmF3IHByb3A6IGBiYXNlUGF0aDogXCIvXCJgIG5vcm1hbGl6ZXMgdG8gYFwiXCJgIGFuZFxuICAgIC8vIGFkZHMgbm8gYmVoYXZpb3JzLCBzbyBjb3VudGluZyBpdCBhZGRlZCAyIHRvIHRoZSB0b3RhbCBhbmQgY291bGQgdGhyb3dcbiAgICAvLyBcIm92ZXIgdGhlIGxpbWl0XCIgb24gYW4gYXBwIHRoYXQgaXMgdW5kZXIgaXQuXG4gICAgY29uc3QgZml4ZWQgPVxuICAgICAgMyArXG4gICAgICAodGhpcy5iYXNlUGF0aCA/IDIgOiAwKSArXG4gICAgICAodGhpcy5hc3NldFByZWZpeCA/IDEgOiAwKSArXG4gICAgICAodGhpcy5wcm9wcy5zZXJ2aWNlV29ya2VyQWxsb3dlZCAhPT0gdW5kZWZpbmVkID8gMSA6IDApO1xuICAgIGNvbnN0IHRvdGFsID0gZml4ZWQgKyBwdWJsaWNQYXR0ZXJucyArIGdyb3VwUGF0dGVybnM7XG4gICAgaWYgKHRvdGFsIDw9IGxpbWl0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBhcnRzID0gW1xuICAgICAgYCR7Zml4ZWR9IHVzZWQgYnkgY2RrLW5leHRqcyBpdHNlbGZgLFxuICAgICAgYCR7cHVibGljUGF0dGVybnN9IGZvciB0b3AtbGV2ZWwgcHVibGljLyBlbnRyaWVzYCxcbiAgICBdO1xuICAgIGlmIChncm91cFBhdHRlcm5zKSB7XG4gICAgICBwYXJ0cy5wdXNoKGAke2dyb3VwUGF0dGVybnN9IGZvciBcXGBmdW5jdGlvbkdyb3Vwc1xcYCBwYXR0ZXJuc2ApO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhpcyBOZXh0LmpzIGFwcCBuZWVkcyAke3RvdGFsfSBDbG91ZEZyb250IGNhY2hlIGJlaGF2aW9ycywgb3ZlciB0aGUgYCArXG4gICAgICAgIGBsaW1pdCBvZiAke2xpbWl0fSBwZXIgZGlzdHJpYnV0aW9uOiAke3BhcnRzLmpvaW4oXCIsIFwiKX0uIGAgK1xuICAgICAgICBgTW92ZSBwdWJsaWMvIGZpbGVzIGludG8gYSBzaW5nbGUgdG9wLWxldmVsIGRpcmVjdG9yeSAob25lIGJlaGF2aW9yIGAgK1xuICAgICAgICBgc2VydmVzIFxcYHN0YXRpYy8qXFxgKWAgK1xuICAgICAgICAoZ3JvdXBQYXR0ZXJuc1xuICAgICAgICAgID8gYCwgYW5kIHByZWZlciBvbmUgc3VidHJlZSBwYXR0ZXJuIHBlciBmdW5jdGlvbiBncm91cCBvdmVyIHNldmVyYWwgYCArXG4gICAgICAgICAgICBgZXhhY3QgcGF0aHNgXG4gICAgICAgICAgOiBgYCkgK1xuICAgICAgICBgLiBJZiB5b3VyIGFjY291bnQncyBxdW90YSBpcyBoaWdoZXIgdGhhbiAke2xpbWl0fSwgc2V0IGAgK1xuICAgICAgICBgXFxgbWF4Q2FjaGVCZWhhdmlvcnNcXGAgdG8gaXQuIFNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY2xvdWRmcm9udC1saW1pdHMuaHRtbCNsaW1pdHMtd2ViLWRpc3RyaWJ1dGlvbnNgLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIE9wdGlvbmFsbHkgcHJlcGVuZHMgYmFzZSBwYXRoIHRvIGdpdmVuIHBhdGggcGF0dGVybi5cbiAgICpcbiAgICogQSB0cmFpbGluZyBzbGFzaCBvbiBgcGF0aFBhdHRlcm5gIGlzIGxvYWQtYmVhcmluZyBhbmQgc3Vydml2ZXMsIHdoaWNoIGlzIHdoeVxuICAgKiB0aGlzIGNvbmNhdGVuYXRlcyByYXRoZXIgdGhhbiBnb2luZyB0aHJvdWdoIGBqb2luUGF0aGAuIFRoZSBidWlsZCdzXG4gICAqIGBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzYCBob2xkIGJvdGggXCJwcmljaW5nXCIgYW5kIFwicHJpY2luZy9cIiBmb3IgYVxuICAgKiBgdHJhaWxpbmdTbGFzaGAgYXBwLCBhbmQgbm9ybWFsaXppbmcgdGhlIHNlY29uZCBvbmUgY29sbGFwc2VkIGl0IG9udG8gdGhlXG4gICAqIGZpcnN0OiBgYWRkQmVoYXZpb3JgIHdhc1xuICAgKiB0aGVuIGNhbGxlZCB0d2ljZSB3aXRoIGAvYmFzZS9wcmljaW5nYCwgd2hpY2ggQ2xvdWRGcm9udCByZWplY3RzIGF0IGRlcGxveVxuICAgKiAoXCJtb3JlIHRoYW4gb25lIGNhY2hlIGJlaGF2aW9yIGhhcyB0aGUgc2FtZSBwYXRoIHBhdHRlcm5cIiksIGFuZCB0aGVcbiAgICogY2Fub25pY2FsIGAvYmFzZS9wcmljaW5nL2Agd2FzIGxlZnQgdG8gdGhlIGAvYmFzZS8qYCBjYXRjaC1hbGwg4oCUIHRoZSBtaXNyb3V0ZVxuICAgKiB0aGUgc2Vjb25kIHBhdHRlcm4gZXhpc3RzIHRvIHByZXZlbnQuXG4gICAqL1xuICBwcml2YXRlIGdldFBhdGhQYXR0ZXJuKHBhdGhQYXR0ZXJuOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuYmFzZVBhdGgpIHtcbiAgICAgIHJldHVybiBwYXRoUGF0dGVybjtcbiAgICB9XG4gICAgcmV0dXJuIGAvJHt0aGlzLmJhc2VQYXRofS8ke3BhdGhQYXR0ZXJuLnJlcGxhY2UoL15cXC8rLywgXCJcIil9YDtcbiAgfVxufVxuXG4vKipcbiAqIFdoZXRoZXIgYGR5bmFtaWNDYWNoZVBvbGljeVByb3BzYCB0dXJucyB0aGUgZHluYW1pYyBjYWNoZSBvZmYsIGJ5IGNhcHBpbmcgZXZlcnlcbiAqIFRUTCBhdCAwLlxuICpcbiAqIENsb3VkRnJvbnQgcmVqZWN0cyBhIHBvbGljeSB0aGF0IGNhY2hlcyBub3RoaW5nIGJ1dCBzdGlsbCBoYXMgYSBjYWNoZSBrZXlcbiAqIChcIkhlYWRlckJlaGF2aW9yIGlzIGludmFsaWQgZm9yIHBvbGljeSB3aXRoIGNhY2hpbmcgZGlzYWJsZWRcIiksIHNvIHN1Y2ggYVxuICogcG9saWN5IGhhcyB0byBkcm9wIHRoZSBrZXkuIFVudGlsIHRoZSBkZWZhdWx0IFRUTCBiZWNhbWUgMCB0aGlzIGNvdWxkIG5vdFxuICogY29tZSB1cDogQ0RLIHJhaXNlcyBgbWF4VHRsYCB0byBgZGVmYXVsdFR0bGAgd2hlbiBpdCBpcyBsb3dlciwgc28gYW4gb3ZlcnJpZGVcbiAqIG9mIGBtYXhUdGw6IDBgIHN5bnRoZXNpemVkIGFzIGEgZGF5IGFuZCBkZXBsb3llZC4gTm93IGl0IGlzIGhvbm9yZWQsIGFuZFxuICogd2l0aG91dCB0aGlzIHRoZSB1cGdyYWRlIGRlcGxveSB3b3VsZCBmYWlsLlxuICpcbiAqIFRoZSBUVExzIGFyZSByZXNvbHZlZCB0aGUgd2F5IENESyByZXNvbHZlcyB0aGVtOiBgZGVmYXVsdFR0bGAgcmFpc2VkIHRvXG4gKiBgbWluVHRsYCwgdGhlbiBgbWF4VHRsYCByYWlzZWQgdG8gYGRlZmF1bHRUdGxgLiBDaGVja2luZyBgbWF4VHRsYCBhbG9uZSBjYWxsZWRcbiAqIGB7IG1heFR0bDogMCwgZGVmYXVsdFR0bDogMWggfWAgZGlzYWJsZWQsIGRyb3BwZWQgdGhlIGtleSwgYW5kIENESyB0aGVuXG4gKiBzeW50aGVzaXplZCBhIHBvbGljeSB0aGF0IGNhY2hlcyBmb3IgYW4gaG91ciBrZXllZCBvbiBub3RoaW5nIOKAlCBvbmUgdmlld2VyJ3NcbiAqIHBhZ2Ugc2VydmVkIHRvIGV2ZXJ5IHZpZXdlci5cbiAqL1xuZnVuY3Rpb24gaXNDYWNoaW5nRGlzYWJsZWQocHJvcHM6IENhY2hlUG9saWN5UHJvcHMgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgY29uc3QgdHRscyA9IFtwcm9wcz8ubWF4VHRsLCBwcm9wcz8uZGVmYXVsdFR0bCwgcHJvcHM/Lm1pblR0bF07XG4gIGlmIChwcm9wcz8ubWF4VHRsID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTsgLy8gQ0RLJ3MgZGVmYXVsdCBpcyBhIHllYXJcbiAgcmV0dXJuIHR0bHMuZXZlcnkoXG4gICAgKHR0bCkgPT5cbiAgICAgIHR0bCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAoIVRva2VuLmlzVW5yZXNvbHZlZCh0dGwudG9TdHJpbmcoKSkgJiYgdHRsLnRvU2Vjb25kcygpID09PSAwKSxcbiAgKTtcbn1cblxuLyoqIFRoZSBjYWNoZS1rZXkgaGFsZiBvZiB7QGxpbmsgQ2FjaGVQb2xpY3lQcm9wc30uICovXG5pbnRlcmZhY2UgQ2FjaGVLZXlQcm9wcyB7XG4gIHJlYWRvbmx5IHF1ZXJ5U3RyaW5nQmVoYXZpb3I6IENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvcjtcbiAgcmVhZG9ubHkgaGVhZGVyQmVoYXZpb3I6IENhY2hlSGVhZGVyQmVoYXZpb3I7XG4gIHJlYWRvbmx5IGNvb2tpZUJlaGF2aW9yOiBDYWNoZUNvb2tpZUJlaGF2aW9yO1xuICByZWFkb25seSBlbmFibGVBY2NlcHRFbmNvZGluZ0Jyb3RsaTogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZW5hYmxlQWNjZXB0RW5jb2RpbmdHemlwOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFdoYXQgdGhlIGR5bmFtaWMgY2FjaGUgcG9saWN5IGtleXMgb246IGV2ZXJ5IHJlcXVlc3QgaW5wdXQgYSBOZXh0LmpzIHJlc3BvbnNlXG4gKiB2YXJpZXMgYnkuXG4gKi9cbmNvbnN0IERZTkFNSUNfQ0FDSEVfS0VZOiBDYWNoZUtleVByb3BzID0ge1xuICBxdWVyeVN0cmluZ0JlaGF2aW9yOiBDYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IuYWxsKCksXG4gIGhlYWRlckJlaGF2aW9yOiBDYWNoZUhlYWRlckJlaGF2aW9yLmFsbG93TGlzdChcbiAgICAvLyBOT1RFOiBDbG91ZEZyb250IEN1c3RvbSBDYWNoZSBQb2xpY2llcyBoYXZlIHNvZnQgbWF4IG9mIDEwIGhlYWRlcnNcbiAgICAvLyBjZGstbmV4dGpzIGluY2x1ZGVzIHRoZSBtb3N0IGVzc2VudGlhbCBoZWFkZXJzIGZvciBOZXh0LmpzIGZ1bmN0aW9uYWxpdHlcbiAgICAvLyBhbmQgbGVhdmVzIG91dCB0aGUgb25lIGNvbW1lbnRlZCBvdXQgYmVsb3c7IGtleWluZyBvbiBpdCBhcyB3ZWxsIG5lZWRzIGFcbiAgICAvLyBxdW90YSBpbmNyZWFzZVxuICAgIC8vIG1vcmUgaGVyZTogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2Nsb3VkZnJvbnQtbGltaXRzLmh0bWwjbGltaXRzLXBvbGljaWVzXG4gICAgXCJhY2NlcHRcIiwgLy8gY29udGVudCBuZWdvdGlhdGlvbiAoSFRNTCB2cyBSU0MgcGF5bG9hZClcbiAgICBcInJzY1wiLCAvLyBSZWFjdCBTZXJ2ZXIgQ29tcG9uZW50cyByZXF1ZXN0c1xuICAgIFwibmV4dC11cmxcIiwgLy8gTmV4dC5qcyByb3V0aW5nXG4gICAgXCJuZXh0LXJvdXRlci1zdGF0ZS10cmVlXCIsIC8vIEFwcCBSb3V0ZXIgbmF2aWdhdGlvbiBzdGF0ZVxuICAgIFwibmV4dC1yb3V0ZXItcHJlZmV0Y2hcIiwgLy8gcHJlZmV0Y2ggYmVoYXZpb3JcbiAgICBcIm5leHQtcm91dGVyLXNlZ21lbnQtcHJlZmV0Y2hcIiwgLy8gc2VnbWVudC1sZXZlbCBwcmVmZXRjaGluZ1xuICAgIFwieC1wcmVyZW5kZXItcmV2YWxpZGF0ZVwiLCAvLyBvbi1kZW1hbmQgSVNSIHJldmFsaWRhdGlvblxuICAgIC8vIERyYWZ0IG1vZGUgbmVlZHMgbm8gaGVhZGVyOiBpdCBpcyB0aGUgYF9fcHJlcmVuZGVyX2J5cGFzc2AgY29va2llLCB3aGljaFxuICAgIC8vIGBjb29raWVCZWhhdmlvci5hbGwoKWAgYWxyZWFkeSBrZXlzIG9uLlxuICAgIC8vIFwieC1wcmVyZW5kZXItcmV2YWxpZGF0ZS1pZi1nZW5lcmF0ZWRcIiwgLy8gY29uZGl0aW9uYWwgcmV2YWxpZGF0aW9uIChuaWNoZSB1c2UgY2FzZSlcbiAgKSxcbiAgY29va2llQmVoYXZpb3I6IENhY2hlQ29va2llQmVoYXZpb3IuYWxsKCksXG4gIGVuYWJsZUFjY2VwdEVuY29kaW5nQnJvdGxpOiB0cnVlLFxuICBlbmFibGVBY2NlcHRFbmNvZGluZ0d6aXA6IHRydWUsXG59O1xuXG4vKipcbiAqIEEgY2FjaGUga2V5IG9mIG5vdGhpbmcsIGZvciBhIHBvbGljeSB0aGF0IGNhY2hlcyBub3RoaW5nLiBGb3J3YXJkaW5nIGlzXG4gKiB1bmFmZmVjdGVkOiB0aGUgZHluYW1pYyBvcmlnaW4gcmVxdWVzdCBwb2xpY3kgc2VuZHMgZXZlcnkgdmlld2VyIGhlYWRlcixcbiAqIGNvb2tpZSBhbmQgcXVlcnkgc3RyaW5nIHJlZ2FyZGxlc3MuXG4gKi9cbmNvbnN0IERJU0FCTEVEX0NBQ0hFX0tFWTogQ2FjaGVLZXlQcm9wcyA9IHtcbiAgcXVlcnlTdHJpbmdCZWhhdmlvcjogQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLm5vbmUoKSxcbiAgaGVhZGVyQmVoYXZpb3I6IENhY2hlSGVhZGVyQmVoYXZpb3Iubm9uZSgpLFxuICBjb29raWVCZWhhdmlvcjogQ2FjaGVDb29raWVCZWhhdmlvci5ub25lKCksXG4gIGVuYWJsZUFjY2VwdEVuY29kaW5nQnJvdGxpOiBmYWxzZSxcbiAgZW5hYmxlQWNjZXB0RW5jb2RpbmdHemlwOiBmYWxzZSxcbn07XG5cbi8qKlxuICogQ2xvdWRGcm9udCdzIGRlZmF1bHQgXCJDYWNoZSBiZWhhdmlvcnMgcGVyIGRpc3RyaWJ1dGlvblwiIHF1b3RhLCB0aGUgZGVmYXVsdFxuICogYmVoYXZpb3IgaW5jbHVkZWQuIEFkanVzdGFibGUsIGhlbmNlIGBtYXhDYWNoZUJlaGF2aW9yc2AuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY2xvdWRmcm9udC1saW1pdHMuaHRtbCNsaW1pdHMtd2ViLWRpc3RyaWJ1dGlvbnNcbiAqL1xuY29uc3QgREVGQVVMVF9NQVhfQ0FDSEVfQkVIQVZJT1JTID0gNzU7XG5cbi8qKlxuICogV2hldGhlciBgY2hhcmAgaXMgaW4gQ2xvdWRGcm9udCdzIHBhdGggcGF0dGVybiBhbHBoYWJldDogdGhlIGxpdGVyYWxzLCBwbHVzIHRoZVxuICogYCpgIGFuZCBgP2Agd2lsZGNhcmRzLiBObyBzcGFjZSwgbm8gYCVgLCBub3RoaW5nIG5vbi1BU0NJSS5cbiAqL1xuZnVuY3Rpb24gaXNQYXRoUGF0dGVybkNoYXIoY2hhcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBjaGFyID09PSBcIipcIiB8fCBjaGFyID09PSBcIj9cIiB8fCBQQVRIX1BBVFRFUk5fTElURVJBTC50ZXN0KGNoYXIpO1xufVxuLyoqXG4gKiBDbG91ZEZyb250J3MgbGltaXQgb24gYSByZXNwb25zZSBoZWFkZXJzIHBvbGljeSBuYW1lLCBhbmQgdGhlIHN1ZmZpeCB0aGF0XG4gKiB0ZWxscyB0aGUgc2VydmljZSB3b3JrZXIgcG9saWN5J3MgYXBhcnQgZnJvbSB0aGUgc3RhdGljIG9uZSdzLlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2xvdWRmcm9udC9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9SZXNwb25zZUhlYWRlcnNQb2xpY3lDb25maWcuaHRtbFxuICovXG5jb25zdCBNQVhfUE9MSUNZX05BTUVfTEVOR1RIID0gMTI4O1xuY29uc3QgU0VSVklDRV9XT1JLRVJfU1VGRklYID0gXCItc3dcIjtcbi8qKiBDbG91ZEZyb250J3MgcGF0aCBwYXR0ZXJuIGxlbmd0aCBsaW1pdC4gKi9cbmNvbnN0IE1BWF9QQVRIX1BBVFRFUk5fTEVOR1RIID0gMjU1O1xuXG4vKipcbiAqIEEgYHB1YmxpYy9gIGVudHJ5J3MgbmFtZSBhcyBhIENsb3VkRnJvbnQgcGF0aCBwYXR0ZXJuLlxuICpcbiAqIGBwdWJsaWMvaGVsbG8gd29ybGQuanBnYCBpcyBhIHZhbGlkIE5leHQuanMgYXNzZXQg4oCUIGBuZXh0IHN0YXJ0YCBzZXJ2ZXMgaXQsIGFuZFxuICogYG5leHQvaW1hZ2VgIHBvaW50cyBhdCBpdCDigJQgYnV0IGEgc3BhY2UgY2Fubm90IGFwcGVhciBpbiBhIHBhdGggcGF0dGVybiwgc29cbiAqIGNkay1uZXh0anMgdXNlZCB0byB0aHJvdyBhdCBzeW50aCBhbmQgdGhlIGFwcCBjb3VsZCBub3QgYmUgZGVwbG95ZWQgYXQgYWxsXG4gKiAoYG5leHQtaW1hZ2UtbGVnYWN5L3VuaWNvZGVgLCB3aG9zZSBgcHVibGljL2AgYWxzbyBob2xkcyBgw6TDtsO8xaHEjcWZw60ucG5nYCkuXG4gKlxuICogQ2xvdWRGcm9udCBVUkwtZGVjb2RlcyB0aGUgcmVxdWVzdCBwYXRoIGJlZm9yZSBtYXRjaGluZyBpdCwgc28gdGhlIHBhdHRlcm4gaXNcbiAqIG1hdGNoZWQgYWdhaW5zdCBgaGVsbG8gd29ybGQuanBnYCwgbm90IHRoZSBgL2hlbGxvJTIwd29ybGQuanBnYCBvbiB0aGUgd2lyZS5cbiAqIEVhY2ggY2hhcmFjdGVyIG91dHNpZGUgdGhlIGFscGhhYmV0IGlzIHJlcGxhY2VkIGJ5IG9uZSBgP2AgcGVyIGJ5dGUgb2YgaXRzXG4gKiBVVEYtOCBlbmNvZGluZywgYmVjYXVzZSB0aGF0IGlzIHdoYXQgYD9gIG1hdGNoZXM6IGBoZWxsbz93b3JsZC5qcGdgIGZvciB0aGVcbiAqIHNwYWNlLCBhbmQgdHdvIGA/YCBmb3IgZWFjaCBjaGFyYWN0ZXIgb2YgYMOkw7bDvMWhxI3FmcOtLnBuZ2AuIE1lYXN1cmVkIGFnYWluc3QgYVxuICogZGVwbG95ZWQgZGlzdHJpYnV0aW9uOyBhIGA/YCBwZXIgKnBlcmNlbnQtZW5jb2RlZCogY2hhcmFjdGVyIChgaGVsbG8/Pz93b3JsZGApXG4gKiBzeW50aGVzaXplcyBmaW5lIGFuZCBuZXZlciBtYXRjaGVzLiBBIGAqYCB3b3VsZCBiZSBzaG9ydGVyIGFuZCBtdWNoIHdpZGVyOlxuICogYMOkw7bDvMWhxI3FmcOtLnBuZ2Agd291bGQgYmVjb21lIGAqLnBuZ2AsIHdoaWNoIHdvdWxkIHB1bGwgZXZlcnkgYC5wbmdgIHJlcXVlc3QgaW5cbiAqIHRoZSBhcHAgb250byB0aGUgc3RhdGljIG9yaWdpbi5cbiAqL1xuZnVuY3Rpb24gdG9QYXRoUGF0dGVybihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gWy4uLm5hbWVdXG4gICAgLm1hcCgoY2hhcikgPT5cbiAgICAgIGlzUGF0aFBhdHRlcm5DaGFyKGNoYXIpXG4gICAgICAgID8gY2hhclxuICAgICAgICA6IFwiP1wiLnJlcGVhdChCdWZmZXIuYnl0ZUxlbmd0aChjaGFyLCBcInV0ZjhcIikpLFxuICAgIClcbiAgICAuam9pbihcIlwiKTtcbn1cbiJdfQ==
|