cdk-nextjs 0.7.10 → 0.7.11
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 +3 -3
- package/README.md +1 -1
- package/docs/harness-coverage.md +1 -1
- package/docs/nextjs-private-apis.md +128 -0
- package/lib/adapter/adapter.mjs +276 -24
- package/lib/adapter/build-outputs.d.ts +1 -1
- package/lib/adapter/build-outputs.js +29 -13
- package/lib/adapter/build-outputs.test.js +35 -7
- package/lib/adapter/cache-handler.d.ts +1 -1
- package/lib/adapter/cache-handler.js +1 -1
- package/lib/adapter/cache-kinds.d.ts +12 -1
- package/lib/adapter/cache-kinds.js +16 -4
- package/lib/adapter/init-cache.js +7 -7
- package/lib/adapter/local-file-cache-handler.d.ts +1 -1
- package/lib/adapter/local-file-cache-handler.js +1 -1
- package/lib/adapter/memory-cache-handler.d.ts +2 -2
- package/lib/adapter/memory-cache-handler.js +1 -1
- package/lib/adapter/s3-cache-handler.d.ts +2 -2
- package/lib/adapter/s3-cache-handler.js +1 -1
- package/lib/adapter/use-cache-common.d.ts +1 -1
- package/lib/adapter/use-cache-common.js +1 -1
- package/lib/adapter/use-cache-common.test.js +1 -1
- package/lib/adapter/use-cache-default-handler.d.ts +1 -1
- package/lib/adapter/use-cache-default-handler.js +1 -1
- package/lib/adapter/use-cache-handlers.test.js +1 -1
- package/lib/adapter/use-cache-remote-handler.d.ts +1 -1
- package/lib/adapter/use-cache-remote-handler.js +1 -1
- package/lib/cdk-nextjs-version.d.ts +10 -0
- package/lib/cdk-nextjs-version.js +15 -0
- package/lib/nextjs-api.js +1 -1
- package/lib/nextjs-build/nextjs-build.js +7 -6
- package/lib/nextjs-build/nextjs-build.test.js +16 -3
- 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.js +5 -5
- package/lib/nextjs-post-deploy.js +1 -1
- package/lib/nextjs-static-assets.js +1 -1
- package/lib/root-constructs/nextjs-base-construct.js +1 -1
- package/lib/root-constructs/nextjs-global-containers.js +1 -1
- package/lib/root-constructs/nextjs-global-functions.js +1 -1
- package/lib/root-constructs/nextjs-regional-containers.js +1 -1
- package/lib/root-constructs/nextjs-regional-functions.js +1 -1
- package/lib/runtime/core.test.js +17 -8
- package/lib/runtime/dispatch.js +4 -5
- package/lib/runtime/image.js +43 -32
- package/lib/runtime/image.test.js +27 -26
- package/lib/runtime/lambda.mjs +276 -36
- package/lib/runtime/manifest.d.ts +34 -8
- package/lib/runtime/manifest.js +7 -5
- package/lib/runtime/server.mjs +276 -36
- package/package.json +1 -1
- package/scripts/capture-adapter-fixture.mjs +13 -1
- package/scripts/zero-config-build.mjs +5 -1
|
@@ -11,7 +11,7 @@ const function_groups_1 = require("./adapter/function-groups");
|
|
|
11
11
|
const constants_1 = require("./constants");
|
|
12
12
|
const base_path_1 = require("./utils/base-path");
|
|
13
13
|
class NextjsDistribution extends constructs_1.Construct {
|
|
14
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsDistribution", version: "0.7.
|
|
14
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsDistribution", version: "0.7.11" };
|
|
15
15
|
distribution;
|
|
16
16
|
props;
|
|
17
17
|
/**
|
|
@@ -722,7 +722,8 @@ const DYNAMIC_CACHE_KEY = {
|
|
|
722
722
|
headerBehavior: aws_cloudfront_1.CacheHeaderBehavior.allowList(
|
|
723
723
|
// NOTE: CloudFront Custom Cache Policies have soft max of 10 headers
|
|
724
724
|
// cdk-nextjs includes the most essential headers for Next.js functionality
|
|
725
|
-
//
|
|
725
|
+
// and leaves out the one commented out below; keying on it as well needs a
|
|
726
|
+
// quota increase
|
|
726
727
|
// more here: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/cloudfront-limits.html#limits-policies
|
|
727
728
|
"accept", // content negotiation (HTML vs RSC payload)
|
|
728
729
|
"rsc", // React Server Components requests
|
|
@@ -730,8 +731,7 @@ const DYNAMIC_CACHE_KEY = {
|
|
|
730
731
|
"next-router-state-tree", // App Router navigation state
|
|
731
732
|
"next-router-prefetch", // prefetch behavior
|
|
732
733
|
"next-router-segment-prefetch", // segment-level prefetching
|
|
733
|
-
"x-prerender-revalidate",
|
|
734
|
-
"x-prerender-bypass"),
|
|
734
|
+
"x-prerender-revalidate"),
|
|
735
735
|
cookieBehavior: aws_cloudfront_1.CacheCookieBehavior.all(),
|
|
736
736
|
enableAcceptEncodingBrotli: true,
|
|
737
737
|
enableAcceptEncodingGzip: true,
|
|
@@ -789,4 +789,4 @@ function toPathPattern(name) {
|
|
|
789
789
|
: "?".repeat(Buffer.byteLength(char, "utf8")))
|
|
790
790
|
.join("");
|
|
791
791
|
}
|
|
792
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWRpc3RyaWJ1dGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9uZXh0anMtZGlzdHJpYnV0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSw2Q0FBa0U7QUFFbEUsK0RBNEJvQztBQUNwQywrRUFNNEM7QUFFNUMsdURBQXFFO0FBRXJFLDJDQUF1QztBQUN2QywrREFJbUM7QUFDbkMsMkNBQXFEO0FBT3JELGlEQUF1RTtBQXdHdkUsTUFBYSxrQkFBbUIsU0FBUSxzQkFBUzs7SUFDL0MsWUFBWSxDQUFlO0lBRW5CLEtBQUssQ0FBMEI7SUFDdkM7Ozs7O09BS0c7SUFDSyxRQUFRLENBQVM7SUFDekI7Ozs7O09BS0c7SUFDSyxXQUFXLENBQVM7SUFDNUI7OztPQUdHO0lBQ0ssNkJBQTZCLEdBQW9DO1FBQ3ZFLGtCQUFrQixFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRTtRQUN2QyxZQUFZLEVBQUU7WUFDWixXQUFXLEVBQUUsbUNBQWtCLENBQUMsVUFBVTtZQUMxQyxRQUFRLEVBQUUsS0FBSztTQUNoQjtRQUNELGNBQWMsRUFBRTtZQUNkLFFBQVEsRUFBRSxLQUFLO1lBQ2YsY0FBYyxFQUFFLHNDQUFxQixDQUFDLCtCQUErQjtTQUN0RTtRQUVELHVCQUF1QixFQUFFO1lBQ3ZCLG1CQUFtQixFQUFFLHNCQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUN2QyxpQkFBaUIsRUFBRSxJQUFJO1lBQ3ZCLFFBQVEsRUFBRSxLQUFLO1lBQ2YsT0FBTyxFQUFFLElBQUk7U0FDZDtRQUNELGFBQWEsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFO0tBQ3RFLENBQUM7SUFDTSxZQUFZLENBQVU7SUFDdEIsYUFBYSxDQUFVO0lBQ3ZCLDJCQUEyQixDQUF1QjtJQUNsRCxxQ0FBcUMsQ0FBd0I7SUFDN0QsaUJBQWlCLENBQVU7SUFD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b0NBQW1CLENBQUMsSUFBSSxFQUFFO0lBQzFDLGNBQWMsRUFBRSxvQ0FBbUIsQ0FBQyxJQUFJLEVBQUU7SUFDMUMsMEJBQTBCLEVBQUUsS0FBSztJQUNqQyx3QkFBd0IsRUFBRSxLQUFLO0NBQ2hDLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNILE1BQU0sMkJBQTJCLEdBQUcsRUFBRSxDQUFDO0FBRXZDOzs7R0FHRztBQUNILFNBQVMsaUJBQWlCLENBQUMsSUFBWTtJQUNyQyxPQUFPLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxLQUFLLEdBQUcsSUFBSSxzQ0FBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekUsQ0FBQztBQUNELDhDQUE4QztBQUM5QyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQUVwQzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxTQUFTLGFBQWEsQ0FBQyxJQUFZO0lBQ2pDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQztTQUNiLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ1osaUJBQWlCLENBQUMsSUFBSSxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxJQUFJO1FBQ04sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FDaEQ7U0FDQSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW5ub3RhdGlvbnMsIER1cmF0aW9uLCBTdGFjaywgVG9rZW4gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IElDZXJ0aWZpY2F0ZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBBY2Nlc3NMZXZlbCxcbiAgQWRkQmVoYXZpb3JPcHRpb25zLFxuICBBbGxvd2VkTWV0aG9kcyxcbiAgQmVoYXZpb3JPcHRpb25zLFxuICBDYWNoZUNvb2tpZUJlaGF2aW9yLFxuICBDYWNoZUhlYWRlckJlaGF2aW9yLFxuICBDYWNoZVBvbGljeSxcbiAgQ2FjaGVQb2xpY3lQcm9wcyxcbiAgQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLFxuICBDYWNoZWRNZXRob2RzLFxuICBGdW5jdGlvbiBhcyBDbG91ZEZyb250RnVuY3Rpb24sXG4gIERpc3RyaWJ1dGlvbixcbiAgRnVuY3Rpb25Bc3NvY2lhdGlvbixcbiAgRnVuY3Rpb25Db2RlLFxuICBGdW5jdGlvbkV2ZW50VHlwZSxcbiAgSGVhZGVyc0ZyYW1lT3B0aW9uLFxuICBIZWFkZXJzUmVmZXJyZXJQb2xpY3ksXG4gIEh0dHBWZXJzaW9uLFxuICBJT3JpZ2luLFxuICBJT3JpZ2luUmVxdWVzdFBvbGljeSxcbiAgT3JpZ2luUHJvdG9jb2xQb2xpY3ksXG4gIE9yaWdpblJlcXVlc3RQb2xpY3ksXG4gIFJlc3BvbnNlSGVhZGVyc1BvbGljeSxcbiAgUmVzcG9uc2VIZWFkZXJzUG9saWN5UHJvcHMsXG4gIFJlc3BvbnNlU2VjdXJpdHlIZWFkZXJzQmVoYXZpb3IsXG4gIFNlY3VyaXR5UG9saWN5UHJvdG9jb2wsXG4gIFZpZXdlclByb3RvY29sUG9saWN5LFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnRcIjtcbmltcG9ydCB7XG4gIEZ1bmN0aW9uVXJsT3JpZ2luLFxuICBGdW5jdGlvblVybE9yaWdpbldpdGhPQUNQcm9wcyxcbiAgUzNCdWNrZXRPcmlnaW4sXG4gIFZwY09yaWdpbixcbiAgVnBjT3JpZ2luV2l0aEVuZHBvaW50UHJvcHMsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udC1vcmlnaW5zXCI7XG5pbXBvcnQgeyBJQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjJcIjtcbmltcG9ydCB7IENmblBlcm1pc3Npb24sIElGdW5jdGlvblVybCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBJQnVja2V0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7XG4gIGNsb3VkRnJvbnRQYXR0ZXJuUmVnZXgsXG4gIERFRkFVTFRfRlVOQ1RJT05fR1JPVVAsXG4gIFBBVEhfUEFUVEVSTl9MSVRFUkFMLFxufSBmcm9tIFwiLi9hZGFwdGVyL2Z1bmN0aW9uLWdyb3Vwc1wiO1xuaW1wb3J0IHsgTE9HX1BSRUZJWCwgTmV4dGpzVHlwZSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgT3B0aW9uYWxEaXN0cmlidXRpb25Qcm9wcyB9IGZyb20gXCIuL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsRGlzdHJpYnV0aW9uUHJvcHNcIjtcbmltcG9ydCB7IE9wdGlvbmFsUzNPcmlnaW5CdWNrZXRXaXRoT0FDUHJvcHMgfSBmcm9tIFwiLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbFMzT3JpZ2luQnVja2V0V2l0aE9BQ1Byb3BzXCI7XG5pbXBvcnQge1xuICBOZXh0anNGdW5jdGlvbkdyb3VwQmVoYXZpb3IsXG4gIFB1YmxpY0RpckVudHJ5LFxufSBmcm9tIFwiLi9uZXh0anMtYnVpbGQvbmV4dGpzLWJ1aWxkXCI7XG5pbXBvcnQgeyBhc3NldFByZWZpeFBhdGgsIG5vcm1hbGl6ZUJhc2VQYXRoIH0gZnJvbSBcIi4vdXRpbHMvYmFzZS1wYXRoXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzRGlzdHJpYnV0aW9uT3ZlcnJpZGVzIHtcbiAgcmVhZG9ubHkgZGlzdHJpYnV0aW9uUHJvcHM/OiBPcHRpb25hbERpc3RyaWJ1dGlvblByb3BzO1xuICByZWFkb25seSBpbWFnZUJlaGF2aW9yT3B0aW9ucz86IEFkZEJlaGF2aW9yT3B0aW9ucztcbiAgcmVhZG9ubHkgaW1hZ2VDYWNoZVBvbGljeVByb3BzPzogQ2FjaGVQb2xpY3lQcm9wcztcbiAgcmVhZG9ubHkgaW1hZ2VSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcz86IFJlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzO1xuICByZWFkb25seSBkeW5hbWljQmVoYXZpb3JPcHRpb25zPzogQWRkQmVoYXZpb3JPcHRpb25zO1xuICByZWFkb25seSBkeW5hbWljQ2FjaGVQb2xpY3lQcm9wcz86IENhY2hlUG9saWN5UHJvcHM7XG4gIHJlYWRvbmx5IGR5bmFtaWNSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcz86IFJlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzO1xuICByZWFkb25seSBkeW5hbWljRnVuY3Rpb25VcmxPcmlnaW5XaXRoT0FDUHJvcHM/OiBGdW5jdGlvblVybE9yaWdpbldpdGhPQUNQcm9wcztcbiAgcmVhZG9ubHkgZHluYW1pY1ZwY09yaWdpbldpdGhFbmRwb2ludFByb3BzPzogVnBjT3JpZ2luV2l0aEVuZHBvaW50UHJvcHM7XG4gIHJlYWRvbmx5IHN0YXRpY0JlaGF2aW9yT3B0aW9ucz86IEFkZEJlaGF2aW9yT3B0aW9ucztcbiAgcmVhZG9ubHkgc3RhdGljUmVzcG9uc2VIZWFkZXJzUG9saWN5UHJvcHM/OiBSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcztcbiAgcmVhZG9ubHkgczNCdWNrZXRPcmlnaW5Qcm9wcz86IE9wdGlvbmFsUzNPcmlnaW5CdWNrZXRXaXRoT0FDUHJvcHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzRGlzdHJpYnV0aW9uUHJvcHMge1xuICAvKipcbiAgICogQnVja2V0IGNvbnRhaW5pbmcgc3RhdGljIGFzc2V0cy5cbiAgICogTXVzdCBiZSBwcm92aWRlZCBpZiB5b3Ugd2FudCB0byBzZXJ2ZSBzdGF0aWMgZmlsZXMuXG4gICAqL1xuICByZWFkb25seSBhc3NldHNCdWNrZXQ6IElCdWNrZXQ7XG4gIC8qKlxuICAgKiBUaGUgYXBwJ3Mgb3duIGBhc3NldFByZWZpeGAuIE5leHQuanMgZW1pdHMgYDxhc3NldFByZWZpeD4vX25leHQvc3RhdGljLy4uLmBcbiAgICogZm9yIGV2ZXJ5IGJ1bmRsZSB3aGlsZSB0aGUgb2JqZWN0cyBzdGF5IGF0IGA8YmFzZVBhdGg+L19uZXh0L3N0YXRpYy8uLi5gIGluXG4gICAqIFMzLCBzbyB0aGUgcHJlZml4J3MgcGF0aCBnZXRzIGEgY2FjaGUgYmVoYXZpb3Igb2YgaXRzIG93biB0aGF0IHJld3JpdGVzIGl0XG4gICAqIGF3YXkuXG4gICAqXG4gICAqIEVpdGhlciBmb3JtIGlzIGFjY2VwdGVkOiBhIHBhdGggKFwiL2NkblwiKSwgb3IgYW4gYWJzb2x1dGUgVVJMLCBpbiB3aGljaCBjYXNlXG4gICAqIG9ubHkgaXRzIHBhdGggY291bnRzIChcImh0dHBzOi8vY2RuLmV4YW1wbGUuY29tL2NkblwiIGJlaGF2ZXMgYXMgXCIvY2RuXCIsIGFuZFxuICAgKiBcImh0dHBzOi8vY2RuLmV4YW1wbGUuY29tXCIgbmVlZHMgbm8gYmVoYXZpb3IgYXQgYWxsKS4gQW4gYWJzb2x1dGUgcHJlZml4J3MgcGF0aFxuICAgKiBtYXR0ZXJzIGJlY2F1c2UgYG5leHQgYnVpbGRgIGNvbXBpbGVzIGEgYC9jZG4vX25leHQvOnBhdGgrYCByZXdyaXRlIG9mIGl0c1xuICAgKiBvd24sIHNvIGBuZXh0IHN0YXJ0YCBzZXJ2ZXMgZXZlcnkgYnVuZGxlIHVuZGVyIGl0IOKAlCBhIENETiBmcm9udGluZyB0aGlzXG4gICAqIGRpc3RyaWJ1dGlvbiB0aGVyZSBoYXMgdG8gYmUgYW5zd2VyZWQgdG9vLlxuICAgKlxuICAgKiBBcHBsaWVkIG9uIHRvcCBvZiBgYmFzZVBhdGhgLCBub3QgdW5kZXIgaXQsIGJlY2F1c2UgdGhhdCBpcyBob3cgTmV4dC5qc1xuICAgKiBidWlsZHMgdGhlIFVSTC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lOyBwYXNzIGBOZXh0anNCdWlsZC5uZXh0Q29uZmlnQXNzZXRQcmVmaXhQYXRoYFxuICAgKi9cbiAgcmVhZG9ubHkgYXNzZXRQcmVmaXg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBVUkkgcGF0aCBwcmVmaXggdGhlIGFwcCBpcyBzZXJ2ZWQgYXQuIFN1cnJvdW5kaW5nIHNsYXNoZXMgYXJlIG5vcm1hbGl6ZWRcbiAgICogYXdheSwgc28gXCIvYmFzZVwiLCBcImJhc2VcIiBhbmQgXCIvYmFzZS9cIiBhbGwgcHJvZHVjZSB0aGUgc2FtZSBjYWNoZSBiZWhhdmlvcnMuXG4gICAqL1xuICByZWFkb25seSBiYXNlUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGJ1dCBvbmx5IGFwcGxpY2FibGUgZm9yIGBOZXh0anNUeXBlLkdMT0JBTF9DT05UQUlORVJTYFxuICAgKi9cbiAgcmVhZG9ubHkgY2VydGlmaWNhdGU/OiBJQ2VydGlmaWNhdGU7XG4gIHJlYWRvbmx5IGRpc3RyaWJ1dGlvbj86IERpc3RyaWJ1dGlvbjtcbiAgLyoqXG4gICAqIFJlcXVpcmVkIGlmIGBOZXh0anNUeXBlLkdMT0JBTF9GVU5DVElPTlNgXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvblVybD86IElGdW5jdGlvblVybDtcbiAgLyoqXG4gICAqIFJlcXVpcmVkIGlmIGBOZXh0anNUeXBlLkdMT0JBTF9DT05UQUlORVJTYCBvciBgTmV4dGpzVHlwZS5SRUdJT05BTF9DT05UQUlORVJTYFxuICAgKi9cbiAgcmVhZG9ubHkgbG9hZEJhbGFuY2VyPzogSUFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyO1xuICByZWFkb25seSBuZXh0anNUeXBlOiBOZXh0anNUeXBlO1xuICAvKipcbiAgICogT3ZlcnJpZGUgcHJvcHMgZm9yIGV2ZXJ5IGNvbnN0cnVjdC5cbiAgICovXG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IE5leHRqc0Rpc3RyaWJ1dGlvbk92ZXJyaWRlcztcbiAgLyoqXG4gICAqIEVudHJpZXMgKGZpbGVzL2RpcmVjdG9yaWVzKSB3aXRoaW4gTmV4dC5qcyBhcHAncyBwdWJsaWMgZGlyZWN0b3J5LiBVc2VkIHRvXG4gICAqIGFkZCBzdGF0aWMgYmVoYXZpb3JzIHRvIGRpc3RyaWJ1dGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHB1YmxpY0RpckVudHJpZXM6IFB1YmxpY0RpckVudHJ5W107XG4gIC8qKlxuICAgKiBUaGUgbm9uLWBkZWZhdWx0YCBmdW5jdGlvbiBncm91cHMsIHRoZSBvcmlnaW5zXG4gICAqIHtAbGluayBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzfSByb3V0ZSB0by5cbiAgICogQGRlZmF1bHQgLSBubyBzcGxpdHRpbmc7IHRoZSBkZWZhdWx0IGJlaGF2aW9yIHNlcnZlcyBldmVyeSBkeW5hbWljIHJvdXRlXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbkdyb3Vwcz86IE5leHRqc0Rpc3RyaWJ1dGlvbkZ1bmN0aW9uR3JvdXBbXTtcbiAgLyoqXG4gICAqIGBOZXh0anNCdWlsZC5mdW5jdGlvbkdyb3VwQmVoYXZpb3JzYDogb25lIGNhY2hlIGJlaGF2aW9yIGVhY2gsIGFkZGVkIGluXG4gICAqIG9yZGVyLCBzbyB0aGUgcm91dGVzIGVhY2ggZ3JvdXAgd2FzIHBhY2thZ2VkIHdpdGggcmVhY2ggaXQgcmF0aGVyIHRoYW4gdGhlXG4gICAqIGRlZmF1bHQgZnVuY3Rpb24uXG4gICAqIEBkZWZhdWx0IC0gbm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycz86IE5leHRqc0Z1bmN0aW9uR3JvdXBCZWhhdmlvcltdO1xuICAvKipcbiAgICogVGhlIG1vc3QgY2FjaGUgYmVoYXZpb3JzIHRoZSBkaXN0cmlidXRpb24gbWF5IGhhdmUsIHRoZSBkZWZhdWx0IG9uZVxuICAgKiBpbmNsdWRlZC4gY2RrLW5leHRqcyBjb3VudHMgd2hhdCBpdCBhZGRzIGFnYWluc3QgdGhpcyBhdCBzeW50aCwgc28gcnVubmluZ1xuICAgKiBvdXQgaXMgYSBzeW50aCBlcnJvciBuYW1pbmcgd2hhdCB1c2VkIHRoZW0gcmF0aGVyIHRoYW4gYSBmYWlsZWQgZGVwbG95LlxuICAgKlxuICAgKiBSYWlzZSBpdCBhZnRlciByYWlzaW5nIHRoZSBcIkNhY2hlIGJlaGF2aW9ycyBwZXIgZGlzdHJpYnV0aW9uXCIgcXVvdGEgZm9yXG4gICAqIHlvdXIgYWNjb3VudC4gTG93ZXIgaXQgYnkgdGhlIGJlaGF2aW9ycyBhIHN1cHBsaWVkIHtAbGluayBkaXN0cmlidXRpb259XG4gICAqIChvciBgb3ZlcnJpZGVzLmRpc3RyaWJ1dGlvblByb3BzYCkgYWxyZWFkeSBoYXMsIHdoaWNoIGFyZSBub3QgY291bnRlZC5cbiAgICogQGRlZmF1bHQgNzUgLSBDbG91ZEZyb250J3MgZGVmYXVsdCBxdW90YVxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jbG91ZGZyb250LWxpbWl0cy5odG1sI2xpbWl0cy13ZWItZGlzdHJpYnV0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF4Q2FjaGVCZWhhdmlvcnM/OiBudW1iZXI7XG59XG5cbi8qKiBBIG5vbi1kZWZhdWx0IGZ1bmN0aW9uIGdyb3VwIGFuZCB0aGUgb3JpZ2luIGl0cyByb3V0ZXMgbXVzdCByZWFjaC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzRGlzdHJpYnV0aW9uRnVuY3Rpb25Hcm91cCB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqIFRoZSBncm91cCdzIExhbWJkYSBGdW5jdGlvbiBVUkwuICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uVXJsOiBJRnVuY3Rpb25Vcmw7XG59XG5cbmV4cG9ydCBjbGFzcyBOZXh0anNEaXN0cmlidXRpb24gZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBkaXN0cmlidXRpb246IERpc3RyaWJ1dGlvbjtcblxuICBwcml2YXRlIHByb3BzOiBOZXh0anNEaXN0cmlidXRpb25Qcm9wcztcbiAgLyoqXG4gICAqIGBwcm9wcy5iYXNlUGF0aGAgbm9ybWFsaXplZCB0byBhIGJhcmUgcGF0aCBzZWdtZW50LiBUaGlzIGNvbnN0cnVjdCBpcyB0aGVcbiAgICogb25lIHBsYWNlIHRoYXQgbmVlZHMgaXQgd2l0aCBhIGxlYWRpbmcgc2xhc2gg4oCUIENsb3VkRnJvbnQgcGF0aCBwYXR0ZXJucyBhcmVcbiAgICogd3JpdHRlbiBhZ2FpbnN0IHRoZSByZXF1ZXN0IHBhdGgg4oCUIHNvIGl0IHByZXBlbmRzIGl0cyBvd24gcmF0aGVyIHRoYW5cbiAgICogcmVseWluZyBvbiB0aGUgY2FsbGVyIGhhdmluZyBwYXNzZWQgb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBiYXNlUGF0aDogc3RyaW5nO1xuICAvKipcbiAgICogYHByb3BzLmFzc2V0UHJlZml4YCBub3JtYWxpemVkIHRvIGEgbGVhZGluZy1zbGFzaCBwYXRoLCBgXCJcImAgd2hlbiB0aGUgYXBwXG4gICAqIHNldHMgbm9uZSBvciBzZXRzIG9uZSB0aGF0IGFscmVhZHkgZXF1YWxzIHRoZSBgYmFzZVBhdGhgIHByZWZpeCDigJQgaW4gd2hpY2hcbiAgICogY2FzZSB0aGUgb3JkaW5hcnkgYF9uZXh0L3N0YXRpYypgIGJlaGF2aW9yIGFscmVhZHkgY292ZXJzIGl0IGFuZCBhIHNlY29uZCBvbmVcbiAgICogd291bGQgYmUgYSBkdXBsaWNhdGUgcGF0dGVybiBDbG91ZEZyb250IHJlamVjdHMuXG4gICAqL1xuICBwcml2YXRlIGFzc2V0UHJlZml4OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDb21tb24gc2VjdXJpdHkgaGVhZGVycyBhcHBsaWVkIGJ5IGRlZmF1bHQgdG8gYWxsIG9yaWdpbnNcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvdXNpbmctbWFuYWdlZC1yZXNwb25zZS1oZWFkZXJzLXBvbGljaWVzLmh0bWwjbWFuYWdlZC1yZXNwb25zZS1oZWFkZXJzLXBvbGljaWVzLXNlY3VyaXR5XG4gICAqL1xuICBwcml2YXRlIGNvbW1vblNlY3VyaXR5SGVhZGVyc0JlaGF2aW9yOiBSZXNwb25zZVNlY3VyaXR5SGVhZGVyc0JlaGF2aW9yID0ge1xuICAgIGNvbnRlbnRUeXBlT3B0aW9uczogeyBvdmVycmlkZTogZmFsc2UgfSxcbiAgICBmcmFtZU9wdGlvbnM6IHtcbiAgICAgIGZyYW1lT3B0aW9uOiBIZWFkZXJzRnJhbWVPcHRpb24uU0FNRU9SSUdJTixcbiAgICAgIG92ZXJyaWRlOiBmYWxzZSxcbiAgICB9LFxuICAgIHJlZmVycmVyUG9saWN5OiB7XG4gICAgICBvdmVycmlkZTogZmFsc2UsXG4gICAgICByZWZlcnJlclBvbGljeTogSGVhZGVyc1JlZmVycmVyUG9saWN5LlNUUklDVF9PUklHSU5fV0hFTl9DUk9TU19PUklHSU4sXG4gICAgfSxcblxuICAgIHN0cmljdFRyYW5zcG9ydFNlY3VyaXR5OiB7XG4gICAgICBhY2Nlc3NDb250cm9sTWF4QWdlOiBEdXJhdGlvbi5kYXlzKDM2NSksXG4gICAgICBpbmNsdWRlU3ViZG9tYWluczogdHJ1ZSxcbiAgICAgIG92ZXJyaWRlOiBmYWxzZSxcbiAgICAgIHByZWxvYWQ6IHRydWUsXG4gICAgfSxcbiAgICB4c3NQcm90ZWN0aW9uOiB7IG92ZXJyaWRlOiBmYWxzZSwgcHJvdGVjdGlvbjogdHJ1ZSwgbW9kZUJsb2NrOiB0cnVlIH0sXG4gIH07XG4gIHByaXZhdGUgc3RhdGljT3JpZ2luOiBJT3JpZ2luO1xuICBwcml2YXRlIGR5bmFtaWNPcmlnaW46IElPcmlnaW47XG4gIHByaXZhdGUgZHluYW1pY09yaWdpblJlc3BvbnNlUG9saWN5OiBJT3JpZ2luUmVxdWVzdFBvbGljeTtcbiAgcHJpdmF0ZSBkeW5hbWljQ2xvdWRGcm9udEZ1bmN0aW9uQXNzb2NpYXRpb25zOiBGdW5jdGlvbkFzc29jaWF0aW9uW107XG4gIHByaXZhdGUgaXNGdW5jdGlvbkNvbXB1dGU6IGJvb2xlYW47XG4gIHByaXZhdGUgc3RhdGljQmVoYXZpb3JPcHRpb25zOiBCZWhhdmlvck9wdGlvbnM7XG4gIHByaXZhdGUgZHluYW1pY0JlaGF2aW9yT3B0aW9uczogQmVoYXZpb3JPcHRpb25zO1xuICBwcml2YXRlIGltYWdlQmVoYXZpb3JPcHRpb25zOiBCZWhhdmlvck9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE5leHRqc0Rpc3RyaWJ1dGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgdGhpcy5iYXNlUGF0aCA9IG5vcm1hbGl6ZUJhc2VQYXRoKHByb3BzLmJhc2VQYXRoKTtcbiAgICB0aGlzLmFzc2V0UHJlZml4ID0gdGhpcy5yZXNvbHZlQXNzZXRQcmVmaXgoKTtcbiAgICB0aGlzLnN0YXRpY09yaWdpbiA9IHRoaXMuY3JlYXRlU3RhdGljT3JpZ2luKCk7XG4gICAgdGhpcy5pc0Z1bmN0aW9uQ29tcHV0ZSA9IHByb3BzLm5leHRqc1R5cGUgPT09IE5leHRqc1R5cGUuR0xPQkFMX0ZVTkNUSU9OUztcbiAgICB0aGlzLnZhbGlkYXRlRnVuY3Rpb25Hcm91cFByb3BzKCk7XG4gICAgdGhpcy5keW5hbWljT3JpZ2luID0gdGhpcy5jcmVhdGVEeW5hbWljT3JpZ2luKCk7XG4gICAgdGhpcy5keW5hbWljT3JpZ2luUmVzcG9uc2VQb2xpY3kgPSB0aGlzLmNyZWF0ZUR5bmFtaWNPcmlnaW5SZXF1ZXN0UG9saWN5KCk7XG4gICAgdGhpcy5keW5hbWljQ2xvdWRGcm9udEZ1bmN0aW9uQXNzb2NpYXRpb25zID1cbiAgICAgIHRoaXMuY3JlYXRlRHluYW1pY0Nsb3VkRnJvbnRGdW5jdGlvbkFzc29jaWF0aW9ucygpO1xuICAgIHRoaXMuc3RhdGljQmVoYXZpb3JPcHRpb25zID0gdGhpcy5jcmVhdGVTdGF0aWNCZWhhdmlvck9wdGlvbnMoKTtcbiAgICB0aGlzLmR5bmFtaWNCZWhhdmlvck9wdGlvbnMgPSB0aGlzLmNyZWF0ZUR5bmFtaWNCZWhhdmlvck9wdGlvbnMoKTtcbiAgICB0aGlzLmltYWdlQmVoYXZpb3JPcHRpb25zID0gdGhpcy5jcmVhdGVJbWFnZUJlaGF2aW9yT3B0aW9ucygpO1xuICAgIHRoaXMuZGlzdHJpYnV0aW9uID0gdGhpcy5nZXREaXN0cmlidXRpb24oKTtcbiAgICBpZiAodGhpcy5pc0Z1bmN0aW9uQ29tcHV0ZSkge1xuICAgICAgdGhpcy5ncmFudEludm9rZShERUZBVUxUX0ZVTkNUSU9OX0dST1VQLCBwcm9wcy5mdW5jdGlvblVybCEpO1xuICAgIH1cbiAgICB0aGlzLmFkZFN0YXRpY0JlaGF2aW9ycygpO1xuICAgIHRoaXMuYWRkRHluYW1pY0JlaGF2aW9ycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBDbG91ZEZyb250IGNvbW1lbnQgdGhhdCBpcyBzYWZlIGZvciB0aGUgMTI4IGNoYXJhY3RlciBsaW1pdC5cbiAgICogSWYgdGhlIGZ1bGwgY29tbWVudCB3aXRoIHN0YWNrIG5hbWUgZXhjZWVkcyAxMjggY2hhcmFjdGVycywgcmV0dXJucyB0aGUgYmFzZSBjb21tZW50IG9ubHkuXG4gICAqIEBwYXJhbSBiYXNlQ29tbWVudCBUaGUgYmFzZSBjb21tZW50IHRleHRcbiAgICogQHBhcmFtIHN0YWNrTmFtZSBUaGUgc3RhY2sgbmFtZSB0byBhcHBlbmRcbiAgICogQHJldHVybnMgQSBjb21tZW50IHN0cmluZyB0aGF0IGlzIGd1YXJhbnRlZWQgdG8gYmUgPCAxMjggY2hhcmFjdGVyc1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRDb21tZW50KGJhc2VDb21tZW50OiBzdHJpbmcsIHN0YWNrTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBmdWxsQ29tbWVudCA9IGAke2Jhc2VDb21tZW50fSBmb3IgJHtzdGFja05hbWV9YDtcbiAgICByZXR1cm4gZnVsbENvbW1lbnQubGVuZ3RoIDwgMTI4ID8gZnVsbENvbW1lbnQgOiBiYXNlQ29tbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU3RhdGljT3JpZ2luKCk6IElPcmlnaW4ge1xuICAgIHJldHVybiBTM0J1Y2tldE9yaWdpbi53aXRoT3JpZ2luQWNjZXNzQ29udHJvbCh0aGlzLnByb3BzLmFzc2V0c0J1Y2tldCwge1xuICAgICAgLy8gTElTVCBsZXRzIFMzIGFuc3dlciBhIG1pc3Npbmcga2V5IHdpdGggNDA0IGluc3RlYWQgb2YgNDAzXG4gICAgICBvcmlnaW5BY2Nlc3NMZXZlbHM6IFtBY2Nlc3NMZXZlbC5SRUFELCBBY2Nlc3NMZXZlbC5MSVNUXSxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5zM0J1Y2tldE9yaWdpblByb3BzLFxuICAgIH0pO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlRHluYW1pY09yaWdpbigpOiBJT3JpZ2luIHtcbiAgICBpZiAodGhpcy5pc0Z1bmN0aW9uQ29tcHV0ZSkge1xuICAgICAgaWYgKCF0aGlzLnByb3BzLmZ1bmN0aW9uVXJsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgTmV4dGpzRGlzdHJpYnV0aW9uUHJvcHMuZnVuY3Rpb25VcmxcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gRnVuY3Rpb25VcmxPcmlnaW4ud2l0aE9yaWdpbkFjY2Vzc0NvbnRyb2woXG4gICAgICAgIHRoaXMucHJvcHMuZnVuY3Rpb25VcmwsXG4gICAgICAgIHRoaXMucHJvcHMub3ZlcnJpZGVzPy5keW5hbWljRnVuY3Rpb25VcmxPcmlnaW5XaXRoT0FDUHJvcHMsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBsb2FkQmFsYW5jZXIgPSB0aGlzLnByb3BzLmxvYWRCYWxhbmNlcjtcbiAgICAgIGlmICghbG9hZEJhbGFuY2VyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgTmV4dGpzRGlzdHJpYnV0aW9uUHJvcHMubG9hZEJhbGFuY2VyXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFZwY09yaWdpbi53aXRoQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIobG9hZEJhbGFuY2VyLCB7XG4gICAgICAgIHByb3RvY29sUG9saWN5OiB0aGlzLnByb3BzLmNlcnRpZmljYXRlXG4gICAgICAgICAgPyBPcmlnaW5Qcm90b2NvbFBvbGljeS5IVFRQU19PTkxZXG4gICAgICAgICAgOiBPcmlnaW5Qcm90b2NvbFBvbGljeS5IVFRQX09OTFksXG4gICAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5keW5hbWljVnBjT3JpZ2luV2l0aEVuZHBvaW50UHJvcHMsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIExhbWJkYSBGdW5jdGlvbiBVUkxzIFwiZXhwZWN0IHRoZSBgSG9zdGAgaGVhZGVyIHRvIGNvbnRhaW4gdGhlIG9yaWdpbiBkb21haW5cbiAgICogbmFtZSwgbm90IHRoZSBkb21haW4gbmFtZSBvZiB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24uXCJcbiAgICpcbiAgICogQSBjb250YWluZXIgb3JpZ2luIGFsc28gZ2V0cyBDbG91ZEZyb250J3Mgb3duIGhlYWRlcnMsIGZvclxuICAgKiBgQ2xvdWRGcm9udC1Gb3J3YXJkZWQtUHJvdG9gOiB3aXRob3V0IGEgY2VydGlmaWNhdGUgQ2xvdWRGcm9udCByZWFjaGVzIHRoZVxuICAgKiBBTEIgb3ZlciBwbGFpbiBIVFRQLCBzbyB0aGUgQUxCJ3MgYFgtRm9yd2FyZGVkLVByb3RvYCBpcyBgaHR0cGAsIGFuZCB0aGVcbiAgICogcnVudGltZSB3b3VsZCBidWlsZCBldmVyeSBhYnNvbHV0ZSBVUkwgKGByZXF1ZXN0LnVybGAsIHRoZSBvcmlnaW4gYSBzZXJ2ZXJcbiAgICogYWN0aW9uIGlzIGZvcndhcmRlZCB0bykgYXMgYGh0dHA6Ly9gIGJlaGluZCBhIHZpZXdlciBvbiBIVFRQUy5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvdXNpbmctbWFuYWdlZC1vcmlnaW4tcmVxdWVzdC1wb2xpY2llcy5odG1sI21hbmFnZWQtb3JpZ2luLXJlcXVlc3QtcG9saWN5LWFsbC12aWV3ZXItZXhjZXB0LWhvc3QtaGVhZGVyXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL3VzaW5nLW1hbmFnZWQtb3JpZ2luLXJlcXVlc3QtcG9saWNpZXMuaHRtbCNtYW5hZ2VkLW9yaWdpbi1yZXF1ZXN0LXBvbGljeS1hbGwtdmlld2VyLWFuZC1jbG91ZGZyb250XG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUR5bmFtaWNPcmlnaW5SZXF1ZXN0UG9saWN5KCk6IElPcmlnaW5SZXF1ZXN0UG9saWN5IHtcbiAgICByZXR1cm4gdGhpcy5pc0Z1bmN0aW9uQ29tcHV0ZVxuICAgICAgPyBPcmlnaW5SZXF1ZXN0UG9saWN5LkFMTF9WSUVXRVJfRVhDRVBUX0hPU1RfSEVBREVSXG4gICAgICA6IE9yaWdpblJlcXVlc3RQb2xpY3kuQUxMX1ZJRVdFUl9BTkRfQ0xPVURGUk9OVF8yMDIyO1xuICB9XG4gIC8qKlxuICAgKiBFbnN1cmVzIE5leHQuanMgYHJlcXVlc3QudXJsYCB3aWxsIGJlIGNvcnJlY3QgZG9tYWluIGluc3RlYWQgb2YgVVJMIG9mXG4gICAqIGNvbXB1dGUgKExhbWJkYSBvciBGYXJnYXRlKVxuICAgKiBAc2VlIGh0dHBzOi8vb3Blbi1uZXh0LmpzLm9yZy9hZHZhbmNlZC93b3JrYXJvdW5kI3dvcmthcm91bmQtc2V0LXgtZm9yd2FyZGVkLWhvc3QtaGVhZGVyLWF3cy1zcGVjaWZpY1xuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVEeW5hbWljQ2xvdWRGcm9udEZ1bmN0aW9uQXNzb2NpYXRpb25zKCk6IEZ1bmN0aW9uQXNzb2NpYXRpb25bXSB7XG4gICAgY29uc3QgYXNzb2NpYXRpb25zOiBGdW5jdGlvbkFzc29jaWF0aW9uW10gPSBbXTtcbiAgICBpZiAodGhpcy5pc0Z1bmN0aW9uQ29tcHV0ZSkge1xuICAgICAgY29uc3QgY2xvdWRGcm9udEZuID0gbmV3IENsb3VkRnJvbnRGdW5jdGlvbih0aGlzLCBcIkNsb3VkRnJvbnRGblwiLCB7XG4gICAgICAgIC8vIGNsb3VkZnJvbnQtanMtMS4wLCBzbyBFUzUuMTogYHZhcmAsIG5vIGFycm93IGZ1bmN0aW9ucywgbm8gdGVtcGxhdGVcbiAgICAgICAgLy8gbGl0ZXJhbHMsIG5vIGBPYmplY3Qua2V5c2AuXG4gICAgICAgIGNvZGU6IEZ1bmN0aW9uQ29kZS5mcm9tSW5saW5lKGBcbiAgICAgICAgICBmdW5jdGlvbiBoYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgICAgICB2YXIgcmVxdWVzdCA9IGV2ZW50LnJlcXVlc3Q7XG4gICAgICAgICAgICB2YXIgdXJpID0gcmVxdWVzdC51cmk7XG5cbiAgICAgICAgICAgIC8vIE5leHQuanMgYW5zd2VycyBhbnkgcGF0aCBjb250YWluaW5nIGEgYmFja3NsYXNoIG9yIGEgcmVwZWF0ZWRcbiAgICAgICAgICAgIC8vIHNsYXNoIHdpdGggYSAzMDggdG8gdGhlIGNvbGxhcHNlZCBwYXRoXG4gICAgICAgICAgICAvLyAoXFxgbm9ybWFsaXplUmVwZWF0ZWRTbGFzaGVzXFxgLCBjYWxsZWQgZnJvbSBcXGBiYXNlLXNlcnZlci50c1xcYCksIGFuZCBzb1xuICAgICAgICAgICAgLy8gZG9lcyB0aGlzIHJ1bnRpbWUuIEJlaGluZCBhIExhbWJkYSBGdW5jdGlvbiBVUkwgdGhlIG9yaWdpbiBuZXZlclxuICAgICAgICAgICAgLy8gZ2V0cyB0aGUgY2hhbmNlOiBPcmlnaW4gQWNjZXNzIENvbnRyb2wgc2lnbnMgdGhlIHJhdyBwYXRoIHdoaWxlIHRoZVxuICAgICAgICAgICAgLy8gRnVuY3Rpb24gVVJMIGNhbm9uaWNhbGl6ZXMgaXQgYmVmb3JlIHZlcmlmeWluZywgc28gdGhlIG9yaWdpblxuICAgICAgICAgICAgLy8gYW5zd2VycyA0MDMgU2lnbmF0dXJlRG9lc05vdE1hdGNoLiBEb2luZyB0aGUgcmVkaXJlY3QgaGVyZSBpcyB3aGF0XG4gICAgICAgICAgICAvLyBtYWtlcyBcXGAvYmFzZXBhdGgvL3RvLXN2XFxgIGJlaGF2ZSBhcyBpdCBkb2VzIHVuZGVyIFxcYG5leHQgc3RhcnRcXGAuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gQSBiYXJlIFxcYC8vXFxgIHJlYWNoZXMgaGVyZSB0b28sIGFuZCBpcyBhbnN3ZXJlZCB0aGUgc2FtZSB3YXkgLVxuICAgICAgICAgICAgLy8gbWVhc3VyZWQsIGJlY2F1c2UgXFxgLy9cXGAgYXQgdGhlIHN0YXJ0IG9mIGEgcmVxdWVzdCB0YXJnZXQgaXMgYWxzbyB0aGVcbiAgICAgICAgICAgIC8vIGF1dGhvcml0eSBmb3JtIGFuZCBpdCB3YXMgbm90IG9idmlvdXMgQ2xvdWRGcm9udCB3b3VsZCByb3V0ZSBpdCB0byBhXG4gICAgICAgICAgICAvLyBmdW5jdGlvbiBhdCBhbGwuIEl0IGRvZXM6IFxcYEdFVCAvL1xcYCBhbnN3ZXJzIDMwOCB0byBcXGAvXFxgIHdpdGhcbiAgICAgICAgICAgIC8vIFxcYHgtY2FjaGU6IEZ1bmN0aW9uR2VuZXJhdGVkUmVzcG9uc2VcXGAsIG92ZXIgYm90aCBIVFRQLzEuMSBhbmQgSFRUUC8yLFxuICAgICAgICAgICAgLy8gd2hpY2ggaXMgd2hhdCBcXGB0ZXN0L2UyZS9oeWRyYXRpb25cXGAgYXNrcyBmb3IuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gVHdvIHRoaW5ncyBOZXh0LmpzIGRvZXMgdGhhdCB0aGlzIGNhbm5vdDpcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyAtIHRoZSBib2R5IGl0IHNlbmRzIHdpdGggaXRzIG93biByZWRpcmVjdCAodGhlIGRlc3RpbmF0aW9uLCBhc1xuICAgICAgICAgICAgLy8gICB0ZXh0KSwgYmVjYXVzZSBhIGdlbmVyYXRlZCByZXNwb25zZSBjYW4gb25seSBjYXJyeSBvbmUgb25cbiAgICAgICAgICAgIC8vICAgY2xvdWRmcm9udC1qcy0yLjAuIE5vIGtub3duIGNsaWVudCByZWFkcyBpdC5cbiAgICAgICAgICAgIC8vIC0gdGhlIG9yaWdpbmFsIG9yZGVyIG9mIHRoZSBxdWVyeSBzdHJpbmcuIFRoZSBldmVudCBleHBvc2VzXG4gICAgICAgICAgICAvLyAgIFxcYHF1ZXJ5c3RyaW5nXFxgIGFzIGFuIG9iamVjdCwgbmV2ZXIgYXMgdGhlIHJhdyBzdHJpbmcsIHNvXG4gICAgICAgICAgICAvLyAgIFxcYC94Ly95P2E9MSZiPTJcXGAgcmVkaXJlY3RzIHRvIFxcYC94L3k/Yj0yJmE9MVxcYC4gVGhlIHBhaXJzIGFsbFxuICAgICAgICAgICAgLy8gICBzdXJ2aXZlOyBvbmx5IHRoZWlyIG9yZGVyIGlzIENsb3VkRnJvbnQncyByYXRoZXIgdGhhbiB0aGVcbiAgICAgICAgICAgIC8vICAgY2xpZW50J3MsIGFuZCBhIHJlZGlyZWN0IHRhcmdldCBpcyBub3Qgb3JkZXItc2Vuc2l0aXZlLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIEEgcmVwZWF0ZWQga2V5J3MgXFxgbXVsdGlWYWx1ZVxcYCBhbHJlYWR5IGhvbGRzIGl0cyBmaXJzdCB2YWx1ZSwgd2hpY2hcbiAgICAgICAgICAgIC8vIFxcYHZhbHVlXFxgIHJlcGVhdHMsIHNvIGl0IGlzIG9uZSBvciB0aGUgb3RoZXIsIG5ldmVyIGJvdGguIE5hbWVzIGFuZFxuICAgICAgICAgICAgLy8gdmFsdWVzIGFycml2ZSBhcyB0aGUgY2xpZW50IHNlbnQgdGhlbSwgc3RpbGwgcGVyY2VudC1lbmNvZGVkXG4gICAgICAgICAgICAvLyAobWVhc3VyZWQ6IFxcYD9hPSUyMGIlMjZjJnA9MSsyXFxgIHJlYWRzIGJhY2sgdW5jaGFuZ2VkKSwgc28gdGhleSBhcmVcbiAgICAgICAgICAgIC8vIGpvaW5lZCBhcy1pczsgZW5jb2RpbmcgdGhlbSBhZ2FpbiB3b3VsZCB0dXJuIFxcYCUyMFxcYCBpbnRvIFxcYCUyNTIwXFxgLlxuICAgICAgICAgICAgaWYgKC9cXFxcXFxcXHxcXFxcL1xcXFwvLy50ZXN0KHVyaSkpIHtcbiAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gdXJpLnJlcGxhY2UoL1xcXFxcXFxcL2csIFwiL1wiKS5yZXBsYWNlKC9cXFxcL1xcXFwvKy9nLCBcIi9cIik7XG4gICAgICAgICAgICAgIHZhciBxcyA9IFtdO1xuICAgICAgICAgICAgICBmb3IgKHZhciBuYW1lIGluIHJlcXVlc3QucXVlcnlzdHJpbmcpIHtcbiAgICAgICAgICAgICAgICB2YXIgcSA9IHJlcXVlc3QucXVlcnlzdHJpbmdbbmFtZV07XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlcyA9IHEubXVsdGlWYWx1ZSB8fCBbcV07XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgIHZhciB2ID0gdmFsdWVzW2ldLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgcXMucHVzaCh2ID09PSBcIlwiID8gbmFtZSA6IG5hbWUgKyBcIj1cIiArIHYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAocXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbG9jYXRpb24gPSBsb2NhdGlvbiArIFwiP1wiICsgcXMuam9pbihcIiZcIik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiAzMDgsXG4gICAgICAgICAgICAgICAgc3RhdHVzRGVzY3JpcHRpb246IFwiUGVybWFuZW50IFJlZGlyZWN0XCIsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogeyBsb2NhdGlvbjogeyB2YWx1ZTogbG9jYXRpb24gfSB9LFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnNbXCJ4LWZvcndhcmRlZC1ob3N0XCJdID0gcmVxdWVzdC5oZWFkZXJzLmhvc3Q7XG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYCksXG4gICAgICB9KTtcbiAgICAgIGFzc29jaWF0aW9ucy5wdXNoKHtcbiAgICAgICAgZXZlbnRUeXBlOiBGdW5jdGlvbkV2ZW50VHlwZS5WSUVXRVJfUkVRVUVTVCxcbiAgICAgICAgZnVuY3Rpb246IGNsb3VkRnJvbnRGbixcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gYXNzb2NpYXRpb25zO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlU3RhdGljQmVoYXZpb3JPcHRpb25zKCk6IEJlaGF2aW9yT3B0aW9ucyB7XG4gICAgY29uc3Qgc3RhdGljQmVoYXZpb3JPcHRpb25zID0gdGhpcy5wcm9wcy5vdmVycmlkZXM/LnN0YXRpY0JlaGF2aW9yT3B0aW9ucztcbiAgICBjb25zdCByZXNwb25zZUhlYWRlcnNQb2xpY3kgPVxuICAgICAgc3RhdGljQmVoYXZpb3JPcHRpb25zPy5yZXNwb25zZUhlYWRlcnNQb2xpY3kgPz9cbiAgICAgIG5ldyBSZXNwb25zZUhlYWRlcnNQb2xpY3kodGhpcywgXCJTdGF0aWNSZXNwb25zZUhlYWRlcnNQb2xpY3lcIiwge1xuICAgICAgICBzZWN1cml0eUhlYWRlcnNCZWhhdmlvcjogdGhpcy5jb21tb25TZWN1cml0eUhlYWRlcnNCZWhhdmlvcixcbiAgICAgICAgY29tbWVudDogdGhpcy5nZXRDb21tZW50KFxuICAgICAgICAgIFwiTmV4dEpTIFN0YXRpYyBSZXNwb25zZSBIZWFkZXJzIFBvbGljeVwiLFxuICAgICAgICAgIFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZSxcbiAgICAgICAgKSxcbiAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LnN0YXRpY1Jlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzLFxuICAgICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgY2FjaGVkTWV0aG9kczogQ2FjaGVkTWV0aG9kcy5DQUNIRV9HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgY2FjaGVQb2xpY3k6IENhY2hlUG9saWN5LkNBQ0hJTkdfT1BUSU1JWkVELFxuICAgICAgb3JpZ2luOiB0aGlzLnN0YXRpY09yaWdpbixcbiAgICAgIHJlc3BvbnNlSGVhZGVyc1BvbGljeSxcbiAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICAgIC4uLnN0YXRpY0JlaGF2aW9yT3B0aW9ucyxcbiAgICB9O1xuICB9XG4gIHByaXZhdGUgY3JlYXRlRHluYW1pY0JlaGF2aW9yT3B0aW9ucygpOiBCZWhhdmlvck9wdGlvbnMge1xuICAgIGNvbnN0IGR5bmFtaWNCZWhhdmlvck9wdGlvbnMgPSB0aGlzLnByb3BzLm92ZXJyaWRlcz8uZHluYW1pY0JlaGF2aW9yT3B0aW9ucztcbiAgICBjb25zdCBjYWNoZVBvbGljeVByb3BzID0gdGhpcy5wcm9wcy5vdmVycmlkZXM/LmR5bmFtaWNDYWNoZVBvbGljeVByb3BzO1xuICAgIC8vIGNyZWF0ZSBkZWZhdWx0IGNhY2hlIHBvbGljeSBpZiBub3QgcHJvdmlkZWRcbiAgICBjb25zdCBjYWNoZVBvbGljeSA9XG4gICAgICBkeW5hbWljQmVoYXZpb3JPcHRpb25zPy5jYWNoZVBvbGljeSA/P1xuICAgICAgbmV3IENhY2hlUG9saWN5KHRoaXMsIFwiRHluYW1pY0NhY2hlUG9saWN5XCIsIHtcbiAgICAgICAgLi4uKGlzQ2FjaGluZ0Rpc2FibGVkKGNhY2hlUG9saWN5UHJvcHMpXG4gICAgICAgICAgPyBESVNBQkxFRF9DQUNIRV9LRVlcbiAgICAgICAgICA6IERZTkFNSUNfQ0FDSEVfS0VZKSxcbiAgICAgICAgLy8gQSByZXNwb25zZSB3aXRoIG5vIGBDYWNoZS1Db250cm9sYCBpcyBub3QgY2FjaGVkLCB3aGljaCBpcyB3aGF0IE5leHQuanNcbiAgICAgICAgLy8gYW5kIGV2ZXJ5IGFwcCB3cml0dGVuIGZvciBpdCBhc3N1bWU6IGEgZHluYW1pYyByb3V0ZSBoYW5kbGVyIHNldHMgbm9uZS5cbiAgICAgICAgLy8gQ0RLJ3MgZGVmYXVsdCBpcyBhIGRheSwgd2hpY2ggY2FjaGVkIGAvYXBpLypgIHJlc3BvbnNlcyBhdCB0aGUgZWRnZSBmb3JcbiAgICAgICAgLy8gMjQgaG91cnMuIEFueXRoaW5nIE5leHQuanMgKm1lYW5zKiB0byBjYWNoZSAtIElTUiwgU1NHLCBhIFBQUiBzaGVsbCAtXG4gICAgICAgIC8vIHNheXMgc28gd2l0aCBgcy1tYXhhZ2VgLCB3aGljaCBgbWF4VHRsYCBzdGlsbCBob25vcnMuXG4gICAgICAgIGRlZmF1bHRUdGw6IER1cmF0aW9uLnNlY29uZHMoMCksXG4gICAgICAgIGNvbW1lbnQ6IHRoaXMuZ2V0Q29tbWVudChcbiAgICAgICAgICBcIk5leHRKUyBEeW5hbWljIENhY2hlIFBvbGljeVwiLFxuICAgICAgICAgIFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZSxcbiAgICAgICAgKSxcbiAgICAgICAgLi4uY2FjaGVQb2xpY3lQcm9wcyxcbiAgICAgIH0pO1xuICAgIGNvbnN0IHJlc3BvbnNlSGVhZGVyc1BvbGljeSA9XG4gICAgICBkeW5hbWljQmVoYXZpb3JPcHRpb25zPy5yZXNwb25zZUhlYWRlcnNQb2xpY3kgPz9cbiAgICAgIG5ldyBSZXNwb25zZUhlYWRlcnNQb2xpY3kodGhpcywgXCJEeW5hbWljUmVzcG9uc2VIZWFkZXJzUG9saWN5XCIsIHtcbiAgICAgICAgc2VjdXJpdHlIZWFkZXJzQmVoYXZpb3I6IHRoaXMuY29tbW9uU2VjdXJpdHlIZWFkZXJzQmVoYXZpb3IsXG4gICAgICAgIGNvbW1lbnQ6IHRoaXMuZ2V0Q29tbWVudChcbiAgICAgICAgICBcIk5leHRKUyBEeW5hbWljIFJlc3BvbnNlIEhlYWRlcnMgUG9saWN5XCIsXG4gICAgICAgICAgU3RhY2sub2YodGhpcykuc3RhY2tOYW1lLFxuICAgICAgICApLFxuICAgICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uZHluYW1pY1Jlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzLFxuICAgICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19BTEwsXG4gICAgICBjYWNoZVBvbGljeSxcbiAgICAgIG9yaWdpbjogdGhpcy5keW5hbWljT3JpZ2luLFxuICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeTogdGhpcy5keW5hbWljT3JpZ2luUmVzcG9uc2VQb2xpY3ksXG4gICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3ksXG4gICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogVmlld2VyUHJvdG9jb2xQb2xpY3kuUkVESVJFQ1RfVE9fSFRUUFMsXG4gICAgICAuLi5keW5hbWljQmVoYXZpb3JPcHRpb25zLFxuICAgICAgZnVuY3Rpb25Bc3NvY2lhdGlvbnM6IHRoaXMud2l0aER5bmFtaWNGdW5jdGlvbkFzc29jaWF0aW9ucyhcbiAgICAgICAgXCJkeW5hbWljQmVoYXZpb3JPcHRpb25zXCIsXG4gICAgICAgIGR5bmFtaWNCZWhhdmlvck9wdGlvbnM/LmZ1bmN0aW9uQXNzb2NpYXRpb25zLFxuICAgICAgKSxcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBUaGUgYmVoYXZpb3IncyBmdW5jdGlvbiBhc3NvY2lhdGlvbnM6IGFuIG92ZXJyaWRlJ3MsIHBsdXMgdGhlIHZpZXdlci1yZXF1ZXN0XG4gICAqIGZ1bmN0aW9uIEdsb2JhbCBGdW5jdGlvbnMgZGVwZW5kcyBvbi5cbiAgICpcbiAgICogU3ByZWFkaW5nIHRoZSBvdmVycmlkZSdzIGBmdW5jdGlvbkFzc29jaWF0aW9uc2Agb3ZlciBvdXJzIHdvdWxkIHNpbGVudGx5XG4gICAqIGRyb3AgdGhhdCBmdW5jdGlvbiwgYW5kIHdpdGggaXQgdGhlIG9ubHkgdGhpbmcgc3RhbmRpbmcgYmV0d2VlbiBhIHZpZXdlcidzXG4gICAqIG93biBgWC1Gb3J3YXJkZWQtSG9zdGAgYW5kIHRoZSBydW50aW1lLCB3aGljaCB0cnVzdHMgdGhhdCBoZWFkZXIgb24gRnVuY3Rpb25cbiAgICogVVJMIGV2ZW50cyAoYGxhbWJkYS1ldmVudC50c2ApOiBob3N0IGluamVjdGlvbiBpbnRvIHJlZGlyZWN0cyBhbmQgYWJzb2x1dGVcbiAgICogVVJMcywgY2FjaGVkIGZvciBvdGhlciB2aWV3ZXJzIGJlY2F1c2UgdGhlIGhlYWRlciBpcyBub3QgaW4gdGhlIGNhY2hlIGtleS5cbiAgICogU28gb3VycyBpcyBrZXB0LCBhbmQgYW4gb3ZlcnJpZGUgY2xhaW1pbmcgVklFV0VSX1JFUVVFU1Qg4oCUIHdoaWNoIENsb3VkRnJvbnRcbiAgICogYWxsb3dzIG9ubHkgb25lIG9mIHBlciBiZWhhdmlvciDigJQgaXMgYW4gZXJyb3IgcmF0aGVyIHRoYW4gYSByZXBsYWNlbWVudC5cbiAgICovXG4gIHByaXZhdGUgd2l0aER5bmFtaWNGdW5jdGlvbkFzc29jaWF0aW9ucyhcbiAgICBvdmVycmlkZU5hbWU6IHN0cmluZyxcbiAgICBvdmVycmlkZGVuOiBGdW5jdGlvbkFzc29jaWF0aW9uW10gfCB1bmRlZmluZWQsXG4gICk6IEZ1bmN0aW9uQXNzb2NpYXRpb25bXSB7XG4gICAgaWYgKCFvdmVycmlkZGVuKSB7XG4gICAgICByZXR1cm4gdGhpcy5keW5hbWljQ2xvdWRGcm9udEZ1bmN0aW9uQXNzb2NpYXRpb25zO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNGdW5jdGlvbkNvbXB1dGUpIHtcbiAgICAgIHJldHVybiBvdmVycmlkZGVuO1xuICAgIH1cbiAgICBjb25zdCBjbGFpbWVkID0gb3ZlcnJpZGRlbi5zb21lKFxuICAgICAgKGFzc29jaWF0aW9uKSA9PlxuICAgICAgICBhc3NvY2lhdGlvbi5ldmVudFR5cGUgPT09IEZ1bmN0aW9uRXZlbnRUeXBlLlZJRVdFUl9SRVFVRVNULFxuICAgICk7XG4gICAgaWYgKGNsYWltZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYCR7TE9HX1BSRUZJWH0gXFxgb3ZlcnJpZGVzLiR7b3ZlcnJpZGVOYW1lfS5mdW5jdGlvbkFzc29jaWF0aW9uc1xcYCBgICtcbiAgICAgICAgICBgYXNzb2NpYXRlcyBhIENsb3VkRnJvbnQgZnVuY3Rpb24gd2l0aCBgICtcbiAgICAgICAgICBgJHtGdW5jdGlvbkV2ZW50VHlwZS5WSUVXRVJfUkVRVUVTVH0sIGJ1dCBOZXh0anNHbG9iYWxGdW5jdGlvbnMgbmVlZHMgYCArXG4gICAgICAgICAgYHRoYXQgZXZlbnQgdHlwZSBmb3IgaXRzIG93biBmdW5jdGlvbiwgd2hpY2ggb3ZlcndyaXRlcyBgICtcbiAgICAgICAgICBgXFxgeC1mb3J3YXJkZWQtaG9zdFxcYCB3aXRoIHRoZSB2aWV3ZXIncyBcXGBIb3N0XFxgICh0aGUgcnVudGltZSB0cnVzdHMgYCArXG4gICAgICAgICAgYHRoYXQgaGVhZGVyIGJlaGluZCBDbG91ZEZyb250KSBhbmQgcmVkaXJlY3RzIHJlcGVhdGVkIHNsYXNoZXMuIGAgK1xuICAgICAgICAgIGBDbG91ZEZyb250IHBlcm1pdHMgb25seSBvbmUgZnVuY3Rpb24gcGVyIGV2ZW50IHR5cGUgcGVyIGJlaGF2aW9yLiBgICtcbiAgICAgICAgICBgTW92ZSB0aGUgbG9naWMgdG8gJHtGdW5jdGlvbkV2ZW50VHlwZS5WSUVXRVJfUkVTUE9OU0V9LCBvciBpbnRvIGAgK1xuICAgICAgICAgIGB0aGUgYXBwJ3MgbWlkZGxld2FyZS5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIFsuLi5vdmVycmlkZGVuLCAuLi50aGlzLmR5bmFtaWNDbG91ZEZyb250RnVuY3Rpb25Bc3NvY2lhdGlvbnNdO1xuICB9XG4gIC8qKlxuICAgKiBgX25leHQvaW1hZ2UqYCBnb2VzIHRvIHRoZSBzYW1lIG9yaWdpbiBhcyBldmVyeXRoaW5nIGVsc2Ug4oCUIHRoZSBOZXh0LmpzXG4gICAqIHNlcnZlciBvcHRpbWl6ZXMgaW1hZ2VzIGluLXByb2Nlc3Mg4oCUIGJ1dCBrZWVwcyBpdHMgb3duIGJlaGF2aW9yIGZvciB0aGVcbiAgICogY2FjaGUgcG9saWN5OiBgcXVlcnlTdHJpbmdCZWhhdmlvcjogYWxsKClgIHBsdXMgYGFjY2VwdGAgaW4gdGhlIGNhY2hlIGtleSBpc1xuICAgKiByaWdodCBmb3IgaW1hZ2UgcmVxdWVzdHMgYW5kIHdyb25nIGZvciB0aGUgcmVzdC5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlSW1hZ2VCZWhhdmlvck9wdGlvbnMoKTogQmVoYXZpb3JPcHRpb25zIHtcbiAgICBjb25zdCBpbWFnZUJlaGF2aW9yT3B0aW9ucyA9IHRoaXMucHJvcHMub3ZlcnJpZGVzPy5pbWFnZUJlaGF2aW9yT3B0aW9ucztcbiAgICAvLyBhZGQgZGVmYXVsdCBjYWNoZSBwb2xpY3kgaWYgbm90IHByb3ZpZGVkXG4gICAgY29uc3QgY2FjaGVQb2xpY3kgPVxuICAgICAgaW1hZ2VCZWhhdmlvck9wdGlvbnM/LmNhY2hlUG9saWN5ID8/XG4gICAgICBuZXcgQ2FjaGVQb2xpY3kodGhpcywgXCJJbWFnZUNhY2hlUG9saWN5XCIsIHtcbiAgICAgICAgLy8gU0VDVVJJVFkgTk9URTogYnkgZGVmYXVsdCB3ZSBkb24ndCBpbmNsdWRlIGNvb2tpZXMgaW4gY2FjaGUgZm9yXG4gICAgICAgIC8vIGltYWdlcyBiL2MgaXQgc2lnbmlmaWNhbnRseSBpbXByb3ZlcyBpbWFnZSBwZXJmIGZvciBtb3N0IHNpdGVzIEJVVFxuICAgICAgICAvLyBpZiB5b3UgaGF2ZSBwcml2YXRlIGltYWdlcyBsb2NrZWQgYmVoaW5kIGF1dGggaW1wbGVtZW50ZWQgd2l0aCBjb29raWVzXG4gICAgICAgIC8vIHlvdSBuZWVkIHRvIG92ZXJyaWRlIHRoaXMuXG4gICAgICAgIHF1ZXJ5U3RyaW5nQmVoYXZpb3I6IENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvci5hbGwoKSxcbiAgICAgICAgaGVhZGVyQmVoYXZpb3I6IENhY2hlSGVhZGVyQmVoYXZpb3IuYWxsb3dMaXN0KFwiYWNjZXB0XCIpLFxuICAgICAgICBjb29raWVCZWhhdmlvcjogQ2FjaGVDb29raWVCZWhhdmlvci5ub25lKCksXG4gICAgICAgIGVuYWJsZUFjY2VwdEVuY29kaW5nQnJvdGxpOiB0cnVlLFxuICAgICAgICBlbmFibGVBY2NlcHRFbmNvZGluZ0d6aXA6IHRydWUsXG4gICAgICAgIGNvbW1lbnQ6IHRoaXMuZ2V0Q29tbWVudChcbiAgICAgICAgICBcIk5leHRKUyBJbWFnZSBDYWNoZSBQb2xpY3lcIixcbiAgICAgICAgICBTdGFjay5vZih0aGlzKS5zdGFja05hbWUsXG4gICAgICAgICksXG4gICAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5pbWFnZUNhY2hlUG9saWN5UHJvcHMsXG4gICAgICB9KTtcbiAgICAvLyBhZGQgZGVmYXVsdCByZXNwb25zZSBoZWFkZXJzIHBvbGljeSBpZiBub3QgcHJvdmlkZWRcbiAgICBjb25zdCByZXNwb25zZUhlYWRlcnNQb2xpY3kgPVxuICAgICAgaW1hZ2VCZWhhdmlvck9wdGlvbnM/LnJlc3BvbnNlSGVhZGVyc1BvbGljeSA/P1xuICAgICAgbmV3IFJlc3BvbnNlSGVhZGVyc1BvbGljeSh0aGlzLCBcIkltYWdlUmVzcG9uc2VIZWFkZXJzUG9saWN5XCIsIHtcbiAgICAgICAgc2VjdXJpdHlIZWFkZXJzQmVoYXZpb3I6IHRoaXMuY29tbW9uU2VjdXJpdHlIZWFkZXJzQmVoYXZpb3IsXG4gICAgICAgIGNvbW1lbnQ6IHRoaXMuZ2V0Q29tbWVudChcbiAgICAgICAgICBcIk5leHRKUyBJbWFnZSBSZXNwb25zZSBIZWFkZXJzIFBvbGljeVwiLFxuICAgICAgICAgIFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZSxcbiAgICAgICAgKSxcbiAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LmltYWdlUmVzcG9uc2VIZWFkZXJzUG9saWN5UHJvcHMsXG4gICAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgYWxsb3dlZE1ldGhvZHM6IEFsbG93ZWRNZXRob2RzLkFMTE9XX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICBjYWNoZWRNZXRob2RzOiBDYWNoZWRNZXRob2RzLkNBQ0hFX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICBvcmlnaW46IHRoaXMuZHluYW1pY09yaWdpbixcbiAgICAgIG9yaWdpblJlcXVlc3RQb2xpY3k6IHRoaXMuZHluYW1pY09yaWdpblJlc3BvbnNlUG9saWN5LFxuICAgICAgY2FjaGVQb2xpY3ksXG4gICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3ksXG4gICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogVmlld2VyUHJvdG9jb2xQb2xpY3kuUkVESVJFQ1RfVE9fSFRUUFMsXG4gICAgICAuLi5pbWFnZUJlaGF2aW9yT3B0aW9ucyxcbiAgICAgIGZ1bmN0aW9uQXNzb2NpYXRpb25zOiB0aGlzLndpdGhEeW5hbWljRnVuY3Rpb25Bc3NvY2lhdGlvbnMoXG4gICAgICAgIFwiaW1hZ2VCZWhhdmlvck9wdGlvbnNcIixcbiAgICAgICAgaW1hZ2VCZWhhdmlvck9wdGlvbnM/LmZ1bmN0aW9uQXNzb2NpYXRpb25zLFxuICAgICAgKSxcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIG9yIHVzZXMgdXNlciBzcGVjaWZpZWQgQ2xvdWRGcm9udCBEaXN0cmlidXRpb25cbiAgICovXG4gIHByaXZhdGUgZ2V0RGlzdHJpYnV0aW9uKCk6IERpc3RyaWJ1dGlvbiB7XG4gICAgbGV0IGRpc3RyaWJ1dGlvbjogRGlzdHJpYnV0aW9uO1xuICAgIGlmICh0aGlzLnByb3BzLmRpc3RyaWJ1dGlvbikge1xuICAgICAgZGlzdHJpYnV0aW9uID0gdGhpcy5wcm9wcy5kaXN0cmlidXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpc3RyaWJ1dGlvbiA9IG5ldyBEaXN0cmlidXRpb24odGhpcywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgICBtaW5pbXVtUHJvdG9jb2xWZXJzaW9uOiBTZWN1cml0eVBvbGljeVByb3RvY29sLlRMU19WMV8yXzIwMjEsXG4gICAgICAgIGRlZmF1bHRCZWhhdmlvcjogdGhpcy5keW5hbWljQmVoYXZpb3JPcHRpb25zLFxuICAgICAgICAvLyBiZXN0IHRvIHVzZSBIVFRQIDIgYW5kIDMgZm9yIGNvbXBhdGFiaWxpdHkgKEhUVFAgMikgYW5kIHBlcmZvcm1hbmNlIChIVFRQMylcbiAgICAgICAgLy8gQ2xvdWRGcm9udCB3aWxsIGNob29zZSBiZXN0IG9wdGlvbiBmb3IgY2xpZW50XG4gICAgICAgIGh0dHBWZXJzaW9uOiBIdHRwVmVyc2lvbi5IVFRQMl9BTkRfMyxcbiAgICAgICAgY29tbWVudDogdGhpcy5nZXRDb21tZW50KFxuICAgICAgICAgIFwiTmV4dEpTIERpc3RyaWJ1dGlvblwiLFxuICAgICAgICAgIFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZSxcbiAgICAgICAgKSxcbiAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBkaXN0cmlidXRpb247XG4gIH1cbiAgcHJpdmF0ZSBhZGREeW5hbWljQmVoYXZpb3JzKCkge1xuICAgIC8vIEltYWdlIEJlaGF2aW9yXG4gICAgdGhpcy5kaXN0cmlidXRpb24uYWRkQmVoYXZpb3IoXG4gICAgICB0aGlzLmdldFBhdGhQYXR0ZXJuKFwiX25leHQvaW1hZ2UqXCIpLFxuICAgICAgdGhpcy5pbWFnZUJlaGF2aW9yT3B0aW9ucy5vcmlnaW4sXG4gICAgICB0aGlzLmltYWdlQmVoYXZpb3JPcHRpb25zLFxuICAgICk7XG4gICAgLy8gRnVuY3Rpb24gZ3JvdXAgYmVoYXZpb3JzLCBiZWZvcmUgdGhlIGJhc2VQYXRoIGNhdGNoLWFsbCBiZWxvdyBhbmQgYWZ0ZXJcbiAgICAvLyBgX25leHQvaW1hZ2UqYCAobm8gZ3JvdXAgcGF0dGVybiBjYW4gbWF0Y2ggYW4gaW1hZ2UgcmVxdWVzdCwgYW5kIGtlZXBpbmdcbiAgICAvLyB0aGUgb3JkZXIgb2YgdGhlIHVuc3BsaXQgY2FzZSBieXRlLWlkZW50aWNhbCBpcyB3b3J0aCBtb3JlIHRoYW4gc3ltbWV0cnkpLlxuICAgIHRoaXMuYWRkRnVuY3Rpb25Hcm91cEJlaGF2aW9ycygpO1xuICAgIC8vIFJvb3QgUGF0aCBCZWhhdmlvcnNcbiAgICBpZiAodGhpcy5iYXNlUGF0aCkge1xuICAgICAgLy8gYmVjYXVzZSB3ZSBhbHJlYWR5IGhhdmUgYSBiYXNlUGF0aCB3ZSBkb24ndCB1c2UgLyBpbnN0ZWFkIHdlIHVzZSAvYmFzZS1wYXRoXG4gICAgICB0aGlzLmRpc3RyaWJ1dGlvbi5hZGRCZWhhdmlvcihcbiAgICAgICAgYC8ke3RoaXMuYmFzZVBhdGh9YCxcbiAgICAgICAgdGhpcy5keW5hbWljQmVoYXZpb3JPcHRpb25zLm9yaWdpbixcbiAgICAgICAgdGhpcy5keW5hbWljQmVoYXZpb3JPcHRpb25zLFxuICAgICAgKTtcbiAgICAgIC8vIHdoZW4gYmFzZVBhdGggaXMgc2V0LCB3ZSBlbXVsYXRlIHRoZSBcImRlZmF1bHQgYmVoYXZpb3JcIiAoKikgZm9yIHRoZSBzaXRlIGFzIGAvYmFzZS1wYXRoLypgXG4gICAgICB0aGlzLmRpc3RyaWJ1dGlvbi5hZGRCZWhhdmlvcihcbiAgICAgICAgdGhpcy5nZXRQYXRoUGF0dGVybihcIipcIiksXG4gICAgICAgIHRoaXMuZHluYW1pY0JlaGF2aW9yT3B0aW9ucy5vcmlnaW4sXG4gICAgICAgIHRoaXMuZHluYW1pY0JlaGF2aW9yT3B0aW9ucyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGlmIG5vIGJhc2UgcGF0aCwgdGhlbiBkZWZhdWx0IGJlaGF2aW9yIHdpbGwgaGFuZGxlIGFsbCBvdGhlciBwYXRoc1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQmVmb3JlIGFueSBiZWhhdmlvciBpcyBjb21wdXRlZDogdGhlIGJ1ZGdldCBhbmQgdGhlIGBwdWJsaWMvYCBjaGVja3MgYm90aFxuICAgKiBnZW5lcmF0ZSB0aGUgZ3JvdXAgcGF0dGVybnMsIGFuZCB3b3VsZCBvdGhlcndpc2UgZmFpbCBmaXJzdCB3aXRoIGEgbGVzc1xuICAgKiB1c2VmdWwgbWVzc2FnZS5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVGdW5jdGlvbkdyb3VwUHJvcHMoKSB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMucHJvcHMuZnVuY3Rpb25Hcm91cHM/Lmxlbmd0aCAmJlxuICAgICAgIXRoaXMucHJvcHMuZnVuY3Rpb25Hcm91cEJlaGF2aW9ycz8ubGVuZ3RoXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5pc0Z1bmN0aW9uQ29tcHV0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcImBmdW5jdGlvbkdyb3Vwc2AgaXMgb25seSBzdXBwb3J0ZWQgYnkgTmV4dGpzR2xvYmFsRnVuY3Rpb25zLlwiLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEV2ZXJ5IGdyb3VwIGJlaGF2aW9yLCBmaW5hbCBwYXRoIHBhdHRlcm4gaW5jbHVkZWQsIGluIHRoZSBvcmRlclxuICAgKiB7QGxpbmsgYWRkRnVuY3Rpb25Hcm91cEJlaGF2aW9yc30gYWRkcyB0aGVtLlxuICAgKi9cbiAgcHJpdmF0ZSBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzKCkge1xuICAgIHJldHVybiAodGhpcy5wcm9wcy5mdW5jdGlvbkdyb3VwQmVoYXZpb3JzID8/IFtdKS5tYXAoKGJlaGF2aW9yKSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IHRoaXMucHJvcHMuZnVuY3Rpb25Hcm91cHM/LmZpbmQoXG4gICAgICAgIChpdCkgPT4gaXQubmFtZSA9PT0gYmVoYXZpb3IuZ3JvdXAsXG4gICAgICApO1xuICAgICAgaWYgKCFncm91cCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYCR7TE9HX1BSRUZJWH0gXFxgZnVuY3Rpb25Hcm91cEJlaGF2aW9yc1xcYCByb3V0ZXMgdG8gZnVuY3Rpb24gZ3JvdXAgYCArXG4gICAgICAgICAgICBgXCIke2JlaGF2aW9yLmdyb3VwfVwiLCB3aGljaCBpcyBub3QgaW4gXFxgZnVuY3Rpb25Hcm91cHNcXGAuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmJlaGF2aW9yLFxuICAgICAgICBncm91cCxcbiAgICAgICAgcGF0aFBhdHRlcm46IHRoaXMuZ2V0UGF0aFBhdHRlcm4oYmVoYXZpb3IucGF0dGVybiksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBPbmUgYmVoYXZpb3IgcGVyIGdyb3VwIHBhdHRlcm4sIG1vc3Qgc3BlY2lmaWMgZmlyc3QuXG4gICAqXG4gICAqIFRoZSBvcmRlciBpcyB0aGUgd2hvbGUgbWVjaGFuaXNtLiBDbG91ZEZyb250IGV2YWx1YXRlcyBiZWhhdmlvcnMgaW4gb3JkZXJcbiAgICogYW5kIHN0b3BzIGF0IHRoZSBmaXJzdCB3aG9zZSBwYXRoIHBhdHRlcm4gbWF0Y2hlcywgYW5kIGBhZGRCZWhhdmlvcmBcbiAgICogYXBwZW5kcyDigJQgc28gYGFwaS8qYCBhZGRlZCBiZWZvcmUgYGFwaS9yZXBvcnRzLypgIHdvdWxkIHN3YWxsb3cgZXZlcnlcbiAgICogcmVwb3J0IHJlcXVlc3QgYW5kIHNlbmQgaXQgdG8gYSBmdW5jdGlvbiB3aG9zZSBwYWNrYWdlIGhhcyBubyByZXBvcnRcbiAgICogZW50cnlwb2ludC4gVGhlIGFkYXB0ZXIgc29ydGVkIHRoZSBsaXN0IHdoZW4gaXQgY2hlY2tlZCBpdCBhZ2FpbnN0IGhvd1xuICAgKiBgYXNzaWduUm91dGVzVG9Hcm91cHNgIHBhY2thZ2VkIHRoZSBzYW1lIHJvdXRlcywgc28gaXQgaXMgYWRkZWQgYXMgaXQgaXMuXG4gICAqL1xuICBwcml2YXRlIGFkZEZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMoKSB7XG4gICAgY29uc3Qgb3JpZ2luUGVyR3JvdXAgPSBuZXcgTWFwPHN0cmluZywgSU9yaWdpbj4oKTtcbiAgICBmb3IgKGNvbnN0IHsgZ3JvdXAsIHBhdGhQYXR0ZXJuIH0gb2YgdGhpcy5mdW5jdGlvbkdyb3VwQmVoYXZpb3JzKCkpIHtcbiAgICAgIGxldCBvcmlnaW4gPSBvcmlnaW5QZXJHcm91cC5nZXQoZ3JvdXAubmFtZSk7XG4gICAgICBpZiAoIW9yaWdpbikge1xuICAgICAgICBvcmlnaW4gPSBGdW5jdGlvblVybE9yaWdpbi53aXRoT3JpZ2luQWNjZXNzQ29udHJvbChcbiAgICAgICAgICBncm91cC5mdW5jdGlvblVybCxcbiAgICAgICAgICB0aGlzLnByb3BzLm92ZXJyaWRlcz8uZHluYW1pY0Z1bmN0aW9uVXJsT3JpZ2luV2l0aE9BQ1Byb3BzLFxuICAgICAgICApO1xuICAgICAgICBvcmlnaW5QZXJHcm91cC5zZXQoZ3JvdXAubmFtZSwgb3JpZ2luKTtcbiAgICAgICAgdGhpcy5ncmFudEludm9rZShncm91cC5uYW1lLCBncm91cC5mdW5jdGlvblVybCk7XG4gICAgICB9XG4gICAgICAvLyBTYW1lIGJlaGF2aW9yIG9wdGlvbnMgYXMgZXZlcnkgb3RoZXIgZHluYW1pYyByb3V0ZSDigJQgb25seSB0aGUgb3JpZ2luXG4gICAgICAvLyBkaWZmZXJzLCBhbmQgaXQgaXMgcGFzc2VkIHNlcGFyYXRlbHkuXG4gICAgICBjb25zdCB7IG9yaWdpbjogX2lnbm9yZWQsIC4uLmJlaGF2aW9yT3B0aW9ucyB9ID1cbiAgICAgICAgdGhpcy5keW5hbWljQmVoYXZpb3JPcHRpb25zO1xuICAgICAgdGhpcy5kaXN0cmlidXRpb24uYWRkQmVoYXZpb3IocGF0aFBhdHRlcm4sIG9yaWdpbiwgYmVoYXZpb3JPcHRpb25zKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIGBsYW1iZGE6SW52b2tlRnVuY3Rpb25gIGZvciBDbG91ZEZyb250LCB3aGljaCBhIEZ1bmN0aW9uIFVSTCBiZWhpbmQgT0FDXG4gICAqIG5lZWRzIGJlc2lkZXMgdGhlIGBsYW1iZGE6SW52b2tlRnVuY3Rpb25VcmxgIGBGdW5jdGlvblVybE9yaWdpbmAgZ3JhbnRzLFxuICAgKiBhbmQgc2NvcGVkIHRoZSBzYW1lIHdheTogdG8gdGhpcyBkaXN0cmlidXRpb24sIGFuZCB0byBjYWxscyB0aGF0IGNvbWVcbiAgICogdGhyb3VnaCB0aGUgRnVuY3Rpb24gVVJMLlxuICAgKi9cbiAgcHJpdmF0ZSBncmFudEludm9rZShncm91cDogc3RyaW5nLCBmdW5jdGlvblVybDogSUZ1bmN0aW9uVXJsKSB7XG4gICAgbmV3IENmblBlcm1pc3Npb24odGhpcywgYEludm9rZUZ1bmN0aW9uLSR7Z3JvdXB9YCwge1xuICAgICAgYWN0aW9uOiBcImxhbWJkYTpJbnZva2VGdW5jdGlvblwiLFxuICAgICAgcHJpbmNpcGFsOiBcImNsb3VkZnJvbnQuYW1hem9uYXdzLmNvbVwiLFxuICAgICAgZnVuY3Rpb25OYW1lOiBmdW5jdGlvblVybC5mdW5jdGlvbkFybixcbiAgICAgIHNvdXJjZUFybjogdGhpcy5kaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uQXJuLFxuICAgICAgaW52b2tlZFZpYUZ1bmN0aW9uVXJsOiB0cnVlLFxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgYGFzc2V0UHJlZml4YCBwYXRoIHRoYXQgbmVlZHMgYSBiZWhhdmlvciBvZiBpdHMgb3duLCBvciBgXCJcImAgZm9yIG5vbmUuXG4gICAqXG4gICAqIEFuIGFic29sdXRlIHByZWZpeCBjb250cmlidXRlcyBpdHMgKnBhdGgqOiBcImh0dHBzOi8vY2RuLmV4YW1wbGUuY29tXCIgbmVlZHMgbm9cbiAgICogYmVoYXZpb3IsIGJ1dCBcImh0dHBzOi8vY2RuLmV4YW1wbGUuY29tL2NkblwiIGRvZXMsIGJlY2F1c2UgYG5leHQgYnVpbGRgXG4gICAqIGNvbXBpbGVzIGEgYC9jZG4vX25leHQvOnBhdGgrYCByZXdyaXRlIG9mIGl0cyBvd24gYW5kIGBuZXh0IHN0YXJ0YCBzZXJ2ZXNcbiAgICogZXZlcnkgYnVuZGxlIHVuZGVyIHRoYXQgcGF0aCDigJQgc28gYSBDRE4gZnJvbnRpbmcgdGhpcyBkaXN0cmlidXRpb24gdGhlcmUgaGFzXG4gICAqIHRvIGJlIGFuc3dlcmVkLiBBIHByZWZpeCBlcXVhbCB0byB0aGUgYGJhc2VQYXRoYCBwcmVmaXggaXMgZHJvcHBlZCDigJQgdGhhdCBpc1xuICAgKiB0aGUgTmV4dC5qcyBkZWZhdWx0IHdoZW4gYGJhc2VQYXRoYCBpcyBzZXQsIGFuZCBgX25leHQvc3RhdGljKmAgYWxyZWFkeVxuICAgKiByZXNvbHZlcyB1bmRlciBpdCwgc28gYWRkaW5nIGEgc2Vjb25kIGlkZW50aWNhbCBwYXR0ZXJuIHdvdWxkIG1ha2UgQ2xvdWRGcm9udFxuICAgKiByZWplY3QgdGhlIGRpc3RyaWJ1dGlvbi5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUFzc2V0UHJlZml4KCk6IHN0cmluZyB7XG4gICAgY29uc3QgcHJlZml4ID0gYXNzZXRQcmVmaXhQYXRoKHRoaXMucHJvcHMuYXNzZXRQcmVmaXggPz8gXCJcIik7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZUJhc2VQYXRoKHByZWZpeCkgPT09IHRoaXMuYmFzZVBhdGggPyBcIlwiIDogcHJlZml4O1xuICB9XG4gIC8qKlxuICAgKiBTZXJ2ZXMgYDxhc3NldFByZWZpeD4vX25leHQvc3RhdGljLypgIGZyb20gdGhlIHNhbWUgUzMgb2JqZWN0cyBhc1xuICAgKiBgX25leHQvc3RhdGljLypgLlxuICAgKlxuICAgKiBOZWVkZWQgYmVjYXVzZSBOZXh0LmpzIHB1dHMgYGFzc2V0UHJlZml4YCBpbiBmcm9udCBvZiBldmVyeSBidW5kbGUgVVJMIGl0XG4gICAqIGVtaXRzIHdoaWxlIHRoZSBvYmplY3RzIGtlZXAgdGhlaXIgYDxiYXNlUGF0aD4vX25leHQvc3RhdGljLy4uLmAga2V5cywgYW5kXG4gICAqIGBhc3NldFByZWZpeGAgc2l0cyBvbiB0b3Agb2YgYGJhc2VQYXRoYCByYXRoZXIgdGhhbiB1bmRlciBpdCwgc29cbiAgICogYGdldFBhdGhQYXR0ZXJuYCBpcyBkZWxpYmVyYXRlbHkgbm90IHVzZWQgaGVyZS4gV2l0aG91dCB0aGlzIGJlaGF2aW9yIHRoZVxuICAgKiByZXF1ZXN0IGZhbGxzIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgb25lLCByZWFjaGVzIHRoZSBjb21wdXRlIG9yaWdpbiwgYW5kXG4gICAqIDQwNHM6IHRoZSBkZXBsb3ltZW50IHBhY2thZ2UgY2FycmllcyBubyBgLm5leHQvc3RhdGljYCBkaXJlY3RvcnkgYXQgYWxsLlxuICAgKlxuICAgKiBBIHZpZXdlci1yZXF1ZXN0IGZ1bmN0aW9uIGRvZXMgdGhlIHJld3JpdGUgYmVjYXVzZSBhbiBTMyBvcmlnaW4ga2V5cyBvbiB0aGVcbiAgICogcmVxdWVzdCBVUkkgYW5kIGBvcmlnaW5QYXRoYCBjYW4gb25seSBwcmVwZW5kLiBUaGUgcHJlZml4IGlzIGEgc3ludGgtdGltZVxuICAgKiBsaXRlcmFsLCBzbyB0aGUgZnVuY3Rpb24gaXMgYSBmaXhlZC1sZW5ndGggc3RyaW5nIG9wZXJhdGlvbiByYXRoZXIgdGhhbiBhXG4gICAqIHBhcnNlLlxuICAgKi9cbiAgcHJpdmF0ZSBhZGRBc3NldFByZWZpeEJlaGF2aW9yKCkge1xuICAgIC8vIENsb3VkRnJvbnQgYWxsb3dzIG9uZSBmdW5jdGlvbiBwZXIgZXZlbnQgdHlwZSBwZXIgYmVoYXZpb3IsIHNvIGFuIG92ZXJyaWRlXG4gICAgLy8gdGhhdCBhbHJlYWR5IGNsYWltcyBWSUVXRVJfUkVRVUVTVCBvbiB0aGUgc3RhdGljIGJlaGF2aW9yIGNhbm5vdCBjb2V4aXN0XG4gICAgLy8gd2l0aCB0aGUgcmV3cml0ZSBiZWxvdyDigJQgdGhlIGRpc3RyaWJ1dGlvbiB3b3VsZCBzeW50aCBhbmQgdGhlbiBiZSByZWplY3RlZFxuICAgIC8vIGF0IGRlcGxveSwgbmFtaW5nIG5laXRoZXIuIFRocm93biBoZXJlIGluc3RlYWQsIHdoZXJlIGJvdGggaGFsdmVzIGFyZVxuICAgIC8vIGtub3duLlxuICAgIGNvbnN0IGNsYWltZWQgPSAoXG4gICAgICB0aGlzLnN0YXRpY0JlaGF2aW9yT3B0aW9ucy5mdW5jdGlvbkFzc29jaWF0aW9ucyA/PyBbXVxuICAgICkuc29tZShcbiAgICAgIChhc3NvY2lhdGlvbikgPT5cbiAgICAgICAgYXNzb2NpYXRpb24uZXZlbnRUeXBlID09PSBGdW5jdGlvbkV2ZW50VHlwZS5WSUVXRVJfUkVRVUVTVCxcbiAgICApO1xuICAgIGlmIChjbGFpbWVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke0xPR19QUkVGSVh9IFxcYG92ZXJyaWRlcy5zdGF0aWNCZWhhdmlvck9wdGlvbnMuZnVuY3Rpb25Bc3NvY2lhdGlvbnNcXGAgYCArXG4gICAgICAgICAgYGFscmVhZHkgYXNzb2NpYXRlcyBhIENsb3VkRnJvbnQgZnVuY3Rpb24gd2l0aCBgICtcbiAgICAgICAgICBgJHtGdW5jdGlvbkV2ZW50VHlwZS5WSUVXRVJfUkVRVUVTVH0sIGJ1dCBzZXJ2aW5nIFxcYGFzc2V0UHJlZml4XFxgIGAgK1xuICAgICAgICAgIGAoXCIke3RoaXMuYXNzZXRQcmVmaXh9XCIpIG5lZWRzIHRoYXQgZXZlbnQgdHlwZSB0byByZXdyaXRlIHRoZSByZXF1ZXN0IGAgK1xuICAgICAgICAgIGBVUkkgdG8gdGhlIG9iamVjdCdzIGtleSwgYW5kIENsb3VkRnJvbnQgcGVybWl0cyBvbmx5IG9uZSBmdW5jdGlvbiBwZXIgYCArXG4gICAgICAgICAgYGV2ZW50IHR5cGUgcGVyIGJlaGF2aW9yLiBFaXRoZXIgZHJvcCB0aGUgb3ZlcnJpZGUsIG9yIGZvbGQgaXRzIGxvZ2ljIGAgK1xuICAgICAgICAgIGBpbnRvIGEgc2luZ2xlIGZ1bmN0aW9uIGFuZCBzZXQgXFxgYXNzZXRQcmVmaXhcXGAgdG8gXCJcIiBzbyB0aGlzIGAgK1xuICAgICAgICAgIGBjb25zdHJ1Y3QgYWRkcyBubyBiZWhhdmlvciBvZiBpdHMgb3duLmAsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCByZXdyaXRlID0gbmV3IENsb3VkRnJvbnRGdW5jdGlvbih0aGlzLCBcIkFzc2V0UHJlZml4Rm5cIiwge1xuICAgICAgY29tbWVudDogdGhpcy5nZXRDb21tZW50KFxuICAgICAgICBcIk5leHRKUyBhc3NldFByZWZpeCByZXdyaXRlXCIsXG4gICAgICAgIFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZSxcbiAgICAgICksXG4gICAgICBjb2RlOiBGdW5jdGlvbkNvZGUuZnJvbUlubGluZShgXG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQpIHtcbiAgICAgICAgICB2YXIgcmVxdWVzdCA9IGV2ZW50LnJlcXVlc3Q7XG4gICAgICAgICAgcmVxdWVzdC51cmkgPSAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgdGhpcy5iYXNlUGF0aCA/IGAvJHt0aGlzLmJhc2VQYXRofWAgOiBcIlwiLFxuICAgICAgICAgICl9ICsgcmVxdWVzdC51cmkuc2xpY2UoJHt0aGlzLmFzc2V0UHJlZml4Lmxlbmd0aH0pO1xuICAgICAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgICAgICB9XG4gICAgICAgIGApLFxuICAgIH0pO1xuICAgIHRoaXMuZGlzdHJpYnV0aW9uLmFkZEJlaGF2aW9yKFxuICAgICAgYCR7dGhpcy5hc3NldFByZWZpeH0vX25leHQvc3RhdGljKmAsXG4gICAgICB0aGlzLnN0YXRpY09yaWdpbixcbiAgICAgIHtcbiAgICAgICAgLi4udGhpcy5zdGF0aWNCZWhhdmlvck9wdGlvbnMsXG4gICAgICAgIGZ1bmN0aW9uQXNzb2NpYXRpb25zOiBbXG4gICAgICAgICAgLi4uKHRoaXMuc3RhdGljQmVoYXZpb3JPcHRpb25zLmZ1bmN0aW9uQXNzb2NpYXRpb25zID8/IFtdKSxcbiAgICAgICAgICB7IGV2ZW50VHlwZTogRnVuY3Rpb25FdmVudFR5cGUuVklFV0VSX1JFUVVFU1QsIGZ1bmN0aW9uOiByZXdyaXRlIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBhZGRTdGF0aWNCZWhhdmlvcnMoKSB7XG4gICAgdGhpcy5kaXN0cmlidXRpb24uYWRkQmVoYXZpb3IoXG4gICAgICB0aGlzLmdldFBhdGhQYXR0ZXJuKFwiX25leHQvc3RhdGljKlwiKSxcbiAgICAgIHRoaXMuc3RhdGljT3JpZ2luLFxuICAgICAgdGhpcy5zdGF0aWNCZWhhdmlvck9wdGlvbnMsXG4gICAgKTtcbiAgICBpZiAodGhpcy5hc3NldFByZWZpeCkge1xuICAgICAgdGhpcy5hZGRBc3NldFByZWZpeEJlaGF2aW9yKCk7XG4gICAgfVxuICAgIGNvbnN0IHB1YmxpY1BhdGhQYXR0ZXJucyA9IHRoaXMucHVibGljUGF0aFBhdHRlcm5zKCk7XG4gICAgdGhpcy5hc3NlcnRCZWhhdmlvckJ1ZGdldChwdWJsaWNQYXRoUGF0dGVybnMubGVuZ3RoKTtcbiAgICB0aGlzLmFzc2VydE5vUHVibGljQ29sbGlzaW9ucyhwdWJsaWNQYXRoUGF0dGVybnMpO1xuICAgIGZvciAoY29uc3QgcGF0aFBhdHRlcm4gb2YgcHVibGljUGF0aFBhdHRlcm5zKSB7XG4gICAgICB0aGlzLmRpc3RyaWJ1dGlvbi5hZGRCZWhhdmlvcihcbiAgICAgICAgcGF0aFBhdHRlcm4sXG4gICAgICAgIHRoaXMuc3RhdGljT3JpZ2luLFxuICAgICAgICB0aGlzLnN0YXRpY0JlaGF2aW9yT3B0aW9ucyxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBUaGUgYmVoYXZpb3IgcGF0aCBwYXR0ZXJuIGZvciBlYWNoIHRvcC1sZXZlbCBgcHVibGljL2AgZW50cnksIGZpbmFsIGZvcm06XG4gICAqIGAvKmAgZm9yIGEgZGlyZWN0b3J5IGFuZCB0aGUgYmFzZVBhdGggcHJlZml4IGJvdGggYXBwbGllZC5cbiAgICpcbiAgICogQW4gZW50cnkgd2hvc2UgbmFtZSBoYXMgbm8gY2hhcmFjdGVyIENsb3VkRnJvbnQgY2FuIHNwZWxsIGlzIGxlZnQgb3V0LCB3aXRoXG4gICAqIGEgd2FybmluZywgcmF0aGVyIHRoYW4gZ2l2ZW4gYSBwYXR0ZXJuIG9mIG5vdGhpbmcgYnV0IHdpbGRjYXJkcy4gYNGE0L7RgtC+L2AgaXNcbiAgICogYD8/Pz8/Pz8/LypgIOKAlCBhbnkgOC1ieXRlIGZpcnN0IHNlZ21lbnQg4oCUIGFuZCBwdWJsaWMvIGJlaGF2aW9ycyBhcmUgYWRkZWRcbiAgICogYWhlYWQgb2YgZXZlcnkgY29tcHV0ZSBiZWhhdmlvciwgc28gaXQgd291bGQgc2VuZCBgL3Byb2R1Y3RzLzQyYCBhbmRcbiAgICogYC9zZXR0aW5ncy8qYCB0byBTMywgd2hpY2ggYW5zd2VycyA0MDMuIExlYXZpbmcgdGhlIGVudHJ5IG91dCBjb3N0cyBpdHMgb3duXG4gICAqIGZpbGVzIGluc3RlYWQ6IHRob3NlIHJlcXVlc3RzIHJlYWNoIHRoZSBjb21wdXRlLCB3aGljaCBkb2VzIG5vdCBoYXZlIHRoZW0sXG4gICAqIGFuZCA0MDQuIE9uZSBsaXRlcmFsIGNoYXJhY3RlciBpcyBlbm91Z2ggdG8ga2VlcCBhIHBhdHRlcm4gbmFycm93IOKAlFxuICAgKiBgPz8/Pz8/Pz8uanBnYCBvbmx5IG1hdGNoZXMgYC5qcGdgIHJlcXVlc3RzIOKAlCBzbyBvbmx5IHRoZSBhbGwtd2lsZGNhcmQgb25lc1xuICAgKiBnby5cbiAgICpcbiAgICogVGhlIGxlbmd0aCBsaW1pdCBpcyBjaGVja2VkIGhlcmUsIG9uIHRoZSBmaW5hbCBwYXR0ZXJuLCByYXRoZXIgdGhhbiBpblxuICAgKiB7QGxpbmsgdG9QYXRoUGF0dGVybn06IHRoZSBgLypgIGFuZCB0aGUgYmFzZVBhdGggY291bnQgYWdhaW5zdCBpdCB0b28sIGFuZCBhXG4gICAqIHBhdHRlcm4gdGhhdCBwYXNzZWQgd2l0aG91dCB0aGVtIGZhaWxlZCBhdCBkZXBsb3kgaW5zdGVhZC5cbiAgICovXG4gIHByaXZhdGUgcHVibGljUGF0aFBhdHRlcm5zKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBwYXR0ZXJuczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCB1bm1hdGNoYWJsZTogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHB1YmxpY0ZpbGUgb2YgdGhpcy5wcm9wcy5wdWJsaWNEaXJFbnRyaWVzKSB7XG4gICAgICBjb25zdCBuYW1lID0gdG9QYXRoUGF0dGVybihwdWJsaWNGaWxlLm5hbWUpO1xuICAgICAgaWYgKCEvW14/Ki9dLy50ZXN0KG5hbWUpKSB7XG4gICAgICAgIHVubWF0Y2hhYmxlLnB1c2goYFwiJHtwdWJsaWNGaWxlLm5hbWV9XCJgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXRoUGF0dGVybiA9IHRoaXMuZ2V0UGF0aFBhdHRlcm4oXG4gICAgICAgIHB1YmxpY0ZpbGUuaXNEaXJlY3RvcnkgPyBgJHtuYW1lfS8qYCA6IG5hbWUsXG4gICAgICApO1xuICAgICAgaWYgKHBhdGhQYXR0ZXJuLmxlbmd0aCA+IE1BWF9QQVRIX1BBVFRFUk5fTEVOR1RIKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGhlIHB1YmxpYy8gZW50cnkgXCIke3B1YmxpY0ZpbGUubmFtZX1cIiBuZWVkcyBhIGAgK1xuICAgICAgICAgICAgYCR7cGF0aFBhdHRlcm4ubGVuZ3RofS1jaGFyYWN0ZXIgQ2xvdWRGcm9udCBwYXRoIHBhdHRlcm4sIG92ZXIgYCArXG4gICAgICAgICAgICBgdGhlICR7TUFYX1BBVEhfUEFUVEVSTl9MRU5HVEh9LWNoYXJhY3RlciBgICtcbiAgICAgICAgICAgIFwibGltaXQuIFJlbmFtZSBpdCwgb3IgbW92ZSBpdCBpbnRvIGEgc3ViZGlyZWN0b3J5IG9mIHB1YmxpYy8gd2hvc2UgXCIgK1xuICAgICAgICAgICAgXCJvd24gbmFtZSBpcyBzaG9ydCBlbm91Z2guIFNlZSBcIiArXG4gICAgICAgICAgICBcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9Eb3dubG9hZERpc3RWYWx1ZXNDYWNoZUJlaGF2aW9yLmh0bWwjRG93bmxvYWREaXN0VmFsdWVzUGF0aFBhdHRlcm5cIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHBhdHRlcm5zLnB1c2gocGF0aFBhdHRlcm4pO1xuICAgIH1cbiAgICBpZiAodW5tYXRjaGFibGUubGVuZ3RoID4gMCkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZyhcbiAgICAgICAgYCR7TE9HX1BSRUZJWH0gVGhlc2UgdG9wLWxldmVsIHB1YmxpYy8gZW50cmllcyBoYXZlIG5vIGNoYXJhY3RlciBhIGAgK1xuICAgICAgICAgIFwiQ2xvdWRGcm9udCBwYXRoIHBhdHRlcm4gY2FuIHNwZWxsLCBzbyB0aGVpciBwYXR0ZXJuIHdvdWxkIGJlIFwiICtcbiAgICAgICAgICBcIndpbGRjYXJkcyBhbG9uZSBhbmQgd291bGQgY2FwdHVyZSBldmVyeSBhcHAgcm91dGUgb2YgdGhlIHNhbWUgXCIgK1xuICAgICAgICAgIGBsZW5ndGguIFRoZXkgZ2V0IG5vIGJlaGF2aW9yLCBzbyB0aGVpciByZXF1ZXN0cyByZWFjaCB0aGUgc2VydmVyLCBgICtcbiAgICAgICAgICBgd2hpY2ggcmVhZHMgdGhlbSBmcm9tIFMzIGluc3RlYWQ6ICR7dW5tYXRjaGFibGUuam9pbihcIiwgXCIpfS4gVG8gc2VydmUgYCArXG4gICAgICAgICAgXCJ0aGVtIGZyb20gUzMgZGlyZWN0bHksIHJlbmFtZSB0aGVtLCBvciBtb3ZlIHRoZW0gaW50byBhIHB1YmxpYy8gXCIgK1xuICAgICAgICAgIFwic3ViZGlyZWN0b3J5IHdob3NlIG5hbWUgaGFzIGF0IGxlYXN0IG9uZSBBU0NJSSBsZXR0ZXIgb3IgZGlnaXQuXCIsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcGF0dGVybnM7XG4gIH1cbiAgLyoqXG4gICAqIFJlZnVzZSBhIGdyb3VwIGJlaGF2aW9yIHRoYXQgYSBgcHVibGljL2AgYmVoYXZpb3Igd291bGQgbWFrZSB1bnJlYWNoYWJsZS5cbiAgICpcbiAgICogYHB1YmxpYy9gIGJlaGF2aW9ycyBhcmUgYWRkZWQgZmlyc3QsIGFuZCBDbG91ZEZyb250IHN0b3BzIGF0IHRoZSBmaXJzdCBtYXRjaCxcbiAgICogc28gdHdvIGNhc2VzIHNlbmQgYSBncm91cCdzIHJvdXRlIHRvIFMzIGluc3RlYWQgb2YgaXRzIGZ1bmN0aW9uIOKAlCB3aGljaCBpc1xuICAgKiB3aHkgdGhpcyBpcyBjaGVja2VkIGF0IHN5bnRoLCB3aGVyZSBib3RoIHNpZGVzIGFyZSBrbm93bjpcbiAgICogLSB0aGUgc2FtZSBwYXR0ZXJuIHR3aWNlOiBgcHVibGljL2RvY3MvYCBhbmQgYC9kb2NzLyoqYCBib3RoIGRlcGxveSBhc1xuICAgKiAgIGBkb2NzLypgLiBUaGUgc3ludGggc3VjY2VlZGVkIGFuZCBDbG91ZEZyb250IHJlamVjdGVkIHRoZSBkZXBsb3kuXG4gICAqIC0gYSBncm91cCBwYXR0ZXJuIHVuZGVyIGEgcHVibGljIGRpcmVjdG9yeTogYC9kb2NzL2d1aWRlLyoqYCBiZWhpbmRcbiAgICogICBgZG9jcy8qYCBkZXBsb3lzIGFuZCBuZXZlciBtYXRjaGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3NlcnROb1B1YmxpY0NvbGxpc2lvbnMocHVibGljUGF0aFBhdHRlcm5zOiBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHB1YmxpY1JlZ2V4ZXMgPSBwdWJsaWNQYXRoUGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PiAoe1xuICAgICAgcGF0dGVybixcbiAgICAgIHJlZ2V4OiBjbG91ZEZyb250UGF0dGVyblJlZ2V4KGAvJHtwYXR0ZXJuLnJlcGxhY2UoL15cXC8rLywgXCJcIil9YCksXG4gICAgfSkpO1xuICAgIGZvciAoY29uc3QgeyBncm91cCwgcm91dGUsIHBhdGhQYXR0ZXJuIH0gb2YgdGhpcy5mdW5jdGlvbkdyb3VwQmVoYXZpb3JzKCkpIHtcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZSA9IHB1YmxpY1BhdGhQYXR0ZXJucy5pbmNsdWRlcyhwYXRoUGF0dGVybik7XG4gICAgICAvLyBNYXRjaGluZyB0aGUgZ3JvdXAgcGF0dGVybidzIG93biB0ZXh0IGlzIGVub3VnaDogaXRzIG9ubHkgd2lsZGNhcmQgaXMgYVxuICAgICAgLy8gdHJhaWxpbmcgYCpgLCBzbyBhIHB1YmxpYyBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyB0aGUgdGV4dCB1cCB0byBhbmRcbiAgICAgIC8vIGluY2x1ZGluZyBpdCBtYXRjaGVzIGV2ZXJ5IFVSTCB0aGUgZ3JvdXAgcGF0dGVybiBkb2VzLlxuICAgICAgY29uc3Qgc2hhZG93ID0gZHVwbGljYXRlXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogcHVibGljUmVnZXhlcy5maW5kKCh7IHJlZ2V4IH0pID0+XG4gICAgICAgICAgICByZWdleC50ZXN0KGAvJHtwYXRoUGF0dGVybi5yZXBsYWNlKC9eXFwvKy8sIFwiXCIpfWApLFxuICAgICAgICAgICk7XG4gICAgICBpZiAoIWR1cGxpY2F0ZSAmJiAhc2hhZG93KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtMT0dfUFJFRklYfSBcXGBmdW5jdGlvbkdyb3Vwc1xcYCBwYXR0ZXJuIFwiJHtyb3V0ZX1cIiAoZ3JvdXAgYCArXG4gICAgICAgICAgYFwiJHtncm91cC5uYW1lfVwiKSBgICtcbiAgICAgICAgICAoZHVwbGljYXRlXG4gICAgICAgICAgICA/IGBkZXBsb3lzIGFzIHRoZSBwYXRoIHBhdHRlcm4gXCIke3BhdGhQYXR0ZXJufVwiLCB3aGljaCBhIHRvcC1sZXZlbCBgICtcbiAgICAgICAgICAgICAgYHB1YmxpYy8gZW50cnkgYWxyZWFkeSB1c2VzIOKAlCBDbG91ZEZyb250IHJlamVjdHMgYSBkaXN0cmlidXRpb24gYCArXG4gICAgICAgICAgICAgIGB3aXRoIHR3byBiZWhhdmlvcnMgb24gb25lIHBhdGggcGF0dGVybi4gYFxuICAgICAgICAgICAgOiBgZGVwbG95cyBhcyBcIiR7cGF0aFBhdHRlcm59XCIsIGJ1dCB0aGUgdG9wLWxldmVsIHB1YmxpYy8gZW50cnkgYCArXG4gICAgICAgICAgICAgIGBiZWhpbmQgXCIke3NoYWRvdyEucGF0dGVybn1cIiBpcyBtYXRjaGVkIGZpcnN0IGFuZCBzZW5kcyBldmVyeSBgICtcbiAgICAgICAgICAgICAgYHN1Y2ggcmVxdWVzdCB0byBTMywgc28gdGhlIGdyb3VwJ3MgZnVuY3Rpb24gd291bGQgbmV2ZXIgc2VlIGAgK1xuICAgICAgICAgICAgICBgdGhlbS4gYCkgK1xuICAgICAgICAgIGBNb3ZlIHRob3NlIHB1YmxpYy8gZmlsZXMgdW5kZXIgYSBkaXJlY3Rvcnkgbm8gcm91dGUgdXNlcywgb3IgYCArXG4gICAgICAgICAgYGdyb3VwIGEgZGlmZmVyZW50IHBhdGguYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDbG91ZEZyb250IGhhcyBhIHBlci1kaXN0cmlidXRpb24gY2FjaGUgYmVoYXZpb3IgcXVvdGEsIGNvdW50aW5nIHRoZSBkZWZhdWx0XG4gICAqIG9uZSDigJQgNzUgdW5sZXNzIHJhaXNlZCwgYW5kIGBtYXhDYWNoZUJlaGF2aW9yc2Agc2F5cyB3aGljaCDigJQgYW5kIHRoZXJlIGFyZVxuICAgKiB0aHJlZSB0aGluZ3MgY29tcGV0aW5nIGZvciBpdDogYHB1YmxpYy9gIGVudHJpZXMsIGZ1bmN0aW9uIGdyb3VwcywgYW5kXG4gICAqIGNkay1uZXh0anMncyBvd24gZml4ZWQgc2V0LlxuICAgKiBDaGVja2VkIGluIG9uZSBwbGFjZSBzbyB0aGUgZXJyb3IgY2FuIHNheSB3aGljaCB0byBjdXQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2Nsb3VkZnJvbnQtbGltaXRzLmh0bWwjbGltaXRzLXdlYi1kaXN0cmlidXRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzc2VydEJlaGF2aW9yQnVkZ2V0KHB1YmxpY1BhdHRlcm5zOiBudW1iZXIpIHtcbiAgICBjb25zdCBsaW1pdCA9IHRoaXMucHJvcHMubWF4Q2FjaGVCZWhhdmlvcnMgPz8gREVGQVVMVF9NQVhfQ0FDSEVfQkVIQVZJT1JTO1xuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQobGltaXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGdyb3VwUGF0dGVybnMgPSB0aGlzLmZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMoKS5sZW5ndGg7XG4gICAgLy8gVGhlIGRlZmF1bHQgYmVoYXZpb3IsIGBfbmV4dC9pbWFnZSpgLCBgX25leHQvc3RhdGljKmAsIHBsdXMg4oCUIHdpdGggYVxuICAgIC8vIGJhc2VQYXRoIOKAlCB0aGUgdHdvIHRoYXQgc3RhbmQgaW4gZm9yIHRoZSBkZWZhdWx0IGJlaGF2aW9yJ3MgY292ZXJhZ2UsIGFuZFxuICAgIC8vIOKAlCB3aXRoIGEgcGF0aC1zdHlsZSBhc3NldFByZWZpeCDigJQgdGhlIG9uZSB0aGF0IHNlcnZlcyBidW5kbGVzIHVuZGVyIGl0LlxuICAgIC8vIGB0aGlzLmJhc2VQYXRoYCwgbm90IHRoZSByYXcgcHJvcDogYGJhc2VQYXRoOiBcIi9cImAgbm9ybWFsaXplcyB0byBgXCJcImAgYW5kXG4gICAgLy8gYWRkcyBubyBiZWhhdmlvcnMsIHNvIGNvdW50aW5nIGl0IGFkZGVkIDIgdG8gdGhlIHRvdGFsIGFuZCBjb3VsZCB0aHJvd1xuICAgIC8vIFwib3ZlciB0aGUgbGltaXRcIiBvbiBhbiBhcHAgdGhhdCBpcyB1bmRlciBpdC5cbiAgICBjb25zdCBmaXhlZCA9IDMgKyAodGhpcy5iYXNlUGF0aCA/IDIgOiAwKSArICh0aGlzLmFzc2V0UHJlZml4ID8gMSA6IDApO1xuICAgIGNvbnN0IHRvdGFsID0gZml4ZWQgKyBwdWJsaWNQYXR0ZXJucyArIGdyb3VwUGF0dGVybnM7XG4gICAgaWYgKHRvdGFsIDw9IGxpbWl0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBhcnRzID0gW1xuICAgICAgYCR7Zml4ZWR9IHVzZWQgYnkgY2RrLW5leHRqcyBpdHNlbGZgLFxuICAgICAgYCR7cHVibGljUGF0dGVybnN9IGZvciB0b3AtbGV2ZWwgcHVibGljLyBlbnRyaWVzYCxcbiAgICBdO1xuICAgIGlmIChncm91cFBhdHRlcm5zKSB7XG4gICAgICBwYXJ0cy5wdXNoKGAke2dyb3VwUGF0dGVybnN9IGZvciBcXGBmdW5jdGlvbkdyb3Vwc1xcYCBwYXR0ZXJuc2ApO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhpcyBOZXh0LmpzIGFwcCBuZWVkcyAke3RvdGFsfSBDbG91ZEZyb250IGNhY2hlIGJlaGF2aW9ycywgb3ZlciB0aGUgYCArXG4gICAgICAgIGBsaW1pdCBvZiAke2xpbWl0fSBwZXIgZGlzdHJpYnV0aW9uOiAke3BhcnRzLmpvaW4oXCIsIFwiKX0uIGAgK1xuICAgICAgICBgTW92ZSBwdWJsaWMvIGZpbGVzIGludG8gYSBzaW5nbGUgdG9wLWxldmVsIGRpcmVjdG9yeSAob25lIGJlaGF2aW9yIGAgK1xuICAgICAgICBgc2VydmVzIFxcYHN0YXRpYy8qXFxgKWAgK1xuICAgICAgICAoZ3JvdXBQYXR0ZXJuc1xuICAgICAgICAgID8gYCwgYW5kIHByZWZlciBvbmUgc3VidHJlZSBwYXR0ZXJuIHBlciBmdW5jdGlvbiBncm91cCBvdmVyIHNldmVyYWwgYCArXG4gICAgICAgICAgICBgZXhhY3QgcGF0aHNgXG4gICAgICAgICAgOiBgYCkgK1xuICAgICAgICBgLiBJZiB5b3VyIGFjY291bnQncyBxdW90YSBpcyBoaWdoZXIgdGhhbiAke2xpbWl0fSwgc2V0IGAgK1xuICAgICAgICBgXFxgbWF4Q2FjaGVCZWhhdmlvcnNcXGAgdG8gaXQuIFNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY2xvdWRmcm9udC1saW1pdHMuaHRtbCNsaW1pdHMtd2ViLWRpc3RyaWJ1dGlvbnNgLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIE9wdGlvbmFsbHkgcHJlcGVuZHMgYmFzZSBwYXRoIHRvIGdpdmVuIHBhdGggcGF0dGVybi5cbiAgICpcbiAgICogQSB0cmFpbGluZyBzbGFzaCBvbiBgcGF0aFBhdHRlcm5gIGlzIGxvYWQtYmVhcmluZyBhbmQgc3Vydml2ZXMsIHdoaWNoIGlzIHdoeVxuICAgKiB0aGlzIGNvbmNhdGVuYXRlcyByYXRoZXIgdGhhbiBnb2luZyB0aHJvdWdoIGBqb2luUGF0aGAuIFRoZSBidWlsZCdzXG4gICAqIGBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzYCBob2xkIGJvdGggXCJwcmljaW5nXCIgYW5kIFwicHJpY2luZy9cIiBmb3IgYVxuICAgKiBgdHJhaWxpbmdTbGFzaGAgYXBwLCBhbmQgbm9ybWFsaXppbmcgdGhlIHNlY29uZCBvbmUgY29sbGFwc2VkIGl0IG9udG8gdGhlXG4gICAqIGZpcnN0OiBgYWRkQmVoYXZpb3JgIHdhc1xuICAgKiB0aGVuIGNhbGxlZCB0d2ljZSB3aXRoIGAvYmFzZS9wcmljaW5nYCwgd2hpY2ggQ2xvdWRGcm9udCByZWplY3RzIGF0IGRlcGxveVxuICAgKiAoXCJtb3JlIHRoYW4gb25lIGNhY2hlIGJlaGF2aW9yIGhhcyB0aGUgc2FtZSBwYXRoIHBhdHRlcm5cIiksIGFuZCB0aGVcbiAgICogY2Fub25pY2FsIGAvYmFzZS9wcmljaW5nL2Agd2FzIGxlZnQgdG8gdGhlIGAvYmFzZS8qYCBjYXRjaC1hbGwg4oCUIHRoZSBtaXNyb3V0ZVxuICAgKiB0aGUgc2Vjb25kIHBhdHRlcm4gZXhpc3RzIHRvIHByZXZlbnQuXG4gICAqL1xuICBwcml2YXRlIGdldFBhdGhQYXR0ZXJuKHBhdGhQYXR0ZXJuOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuYmFzZVBhdGgpIHtcbiAgICAgIHJldHVybiBwYXRoUGF0dGVybjtcbiAgICB9XG4gICAgcmV0dXJuIGAvJHt0aGlzLmJhc2VQYXRofS8ke3BhdGhQYXR0ZXJuLnJlcGxhY2UoL15cXC8rLywgXCJcIil9YDtcbiAgfVxufVxuXG4vKipcbiAqIFdoZXRoZXIgYGR5bmFtaWNDYWNoZVBvbGljeVByb3BzYCB0dXJucyB0aGUgZHluYW1pYyBjYWNoZSBvZmYsIGJ5IGNhcHBpbmcgZXZlcnlcbiAqIFRUTCBhdCAwLlxuICpcbiAqIENsb3VkRnJvbnQgcmVqZWN0cyBhIHBvbGljeSB0aGF0IGNhY2hlcyBub3RoaW5nIGJ1dCBzdGlsbCBoYXMgYSBjYWNoZSBrZXlcbiAqIChcIkhlYWRlckJlaGF2aW9yIGlzIGludmFsaWQgZm9yIHBvbGljeSB3aXRoIGNhY2hpbmcgZGlzYWJsZWRcIiksIHNvIHN1Y2ggYVxuICogcG9saWN5IGhhcyB0byBkcm9wIHRoZSBrZXkuIFVudGlsIHRoZSBkZWZhdWx0IFRUTCBiZWNhbWUgMCB0aGlzIGNvdWxkIG5vdFxuICogY29tZSB1cDogQ0RLIHJhaXNlcyBgbWF4VHRsYCB0byBgZGVmYXVsdFR0bGAgd2hlbiBpdCBpcyBsb3dlciwgc28gYW4gb3ZlcnJpZGVcbiAqIG9mIGBtYXhUdGw6IDBgIHN5bnRoZXNpemVkIGFzIGEgZGF5IGFuZCBkZXBsb3llZC4gTm93IGl0IGlzIGhvbm9yZWQsIGFuZFxuICogd2l0aG91dCB0aGlzIHRoZSB1cGdyYWRlIGRlcGxveSB3b3VsZCBmYWlsLlxuICpcbiAqIFRoZSBUVExzIGFyZSByZXNvbHZlZCB0aGUgd2F5IENESyByZXNvbHZlcyB0aGVtOiBgZGVmYXVsdFR0bGAgcmFpc2VkIHRvXG4gKiBgbWluVHRsYCwgdGhlbiBgbWF4VHRsYCByYWlzZWQgdG8gYGRlZmF1bHRUdGxgLiBDaGVja2luZyBgbWF4VHRsYCBhbG9uZSBjYWxsZWRcbiAqIGB7IG1heFR0bDogMCwgZGVmYXVsdFR0bDogMWggfWAgZGlzYWJsZWQsIGRyb3BwZWQgdGhlIGtleSwgYW5kIENESyB0aGVuXG4gKiBzeW50aGVzaXplZCBhIHBvbGljeSB0aGF0IGNhY2hlcyBmb3IgYW4gaG91ciBrZXllZCBvbiBub3RoaW5nIOKAlCBvbmUgdmlld2VyJ3NcbiAqIHBhZ2Ugc2VydmVkIHRvIGV2ZXJ5IHZpZXdlci5cbiAqL1xuZnVuY3Rpb24gaXNDYWNoaW5nRGlzYWJsZWQocHJvcHM6IENhY2hlUG9saWN5UHJvcHMgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgY29uc3QgdHRscyA9IFtwcm9wcz8ubWF4VHRsLCBwcm9wcz8uZGVmYXVsdFR0bCwgcHJvcHM/Lm1pblR0bF07XG4gIGlmIChwcm9wcz8ubWF4VHRsID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTsgLy8gQ0RLJ3MgZGVmYXVsdCBpcyBhIHllYXJcbiAgcmV0dXJuIHR0bHMuZXZlcnkoXG4gICAgKHR0bCkgPT5cbiAgICAgIHR0bCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAoIVRva2VuLmlzVW5yZXNvbHZlZCh0dGwudG9TdHJpbmcoKSkgJiYgdHRsLnRvU2Vjb25kcygpID09PSAwKSxcbiAgKTtcbn1cblxuLyoqIFRoZSBjYWNoZS1rZXkgaGFsZiBvZiB7QGxpbmsgQ2FjaGVQb2xpY3lQcm9wc30uICovXG5pbnRlcmZhY2UgQ2FjaGVLZXlQcm9wcyB7XG4gIHJlYWRvbmx5IHF1ZXJ5U3RyaW5nQmVoYXZpb3I6IENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvcjtcbiAgcmVhZG9ubHkgaGVhZGVyQmVoYXZpb3I6IENhY2hlSGVhZGVyQmVoYXZpb3I7XG4gIHJlYWRvbmx5IGNvb2tpZUJlaGF2aW9yOiBDYWNoZUNvb2tpZUJlaGF2aW9yO1xuICByZWFkb25seSBlbmFibGVBY2NlcHRFbmNvZGluZ0Jyb3RsaTogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZW5hYmxlQWNjZXB0RW5jb2RpbmdHemlwOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFdoYXQgdGhlIGR5bmFtaWMgY2FjaGUgcG9saWN5IGtleXMgb246IGV2ZXJ5IHJlcXVlc3QgaW5wdXQgYSBOZXh0LmpzIHJlc3BvbnNlXG4gKiB2YXJpZXMgYnkuXG4gKi9cbmNvbnN0IERZTkFNSUNfQ0FDSEVfS0VZOiBDYWNoZUtleVByb3BzID0ge1xuICBxdWVyeVN0cmluZ0JlaGF2aW9yOiBDYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IuYWxsKCksXG4gIGhlYWRlckJlaGF2aW9yOiBDYWNoZUhlYWRlckJlaGF2aW9yLmFsbG93TGlzdChcbiAgICAvLyBOT1RFOiBDbG91ZEZyb250IEN1c3RvbSBDYWNoZSBQb2xpY2llcyBoYXZlIHNvZnQgbWF4IG9mIDEwIGhlYWRlcnNcbiAgICAvLyBjZGstbmV4dGpzIGluY2x1ZGVzIHRoZSBtb3N0IGVzc2VudGlhbCBoZWFkZXJzIGZvciBOZXh0LmpzIGZ1bmN0aW9uYWxpdHlcbiAgICAvLyBidXQgaXQncyByZWNvbW1lbmRlZCB0byByZXF1ZXN0IHF1b3RhIGluY3JlYXNlIHRvIGluY2x1ZGUgYWxsIGhlYWRlcnMgKGNvbW1lbnRlZCBvdXQgb25lcyBiZWxvdylcbiAgICAvLyBtb3JlIGhlcmU6IGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jbG91ZGZyb250LWxpbWl0cy5odG1sI2xpbWl0cy1wb2xpY2llc1xuICAgIFwiYWNjZXB0XCIsIC8vIGNvbnRlbnQgbmVnb3RpYXRpb24gKEhUTUwgdnMgUlNDIHBheWxvYWQpXG4gICAgXCJyc2NcIiwgLy8gUmVhY3QgU2VydmVyIENvbXBvbmVudHMgcmVxdWVzdHNcbiAgICBcIm5leHQtdXJsXCIsIC8vIE5leHQuanMgcm91dGluZ1xuICAgIFwibmV4dC1yb3V0ZXItc3RhdGUtdHJlZVwiLCAvLyBBcHAgUm91dGVyIG5hdmlnYXRpb24gc3RhdGVcbiAgICBcIm5leHQtcm91dGVyLXByZWZldGNoXCIsIC8vIHByZWZldGNoIGJlaGF2aW9yXG4gICAgXCJuZXh0LXJvdXRlci1zZWdtZW50LXByZWZldGNoXCIsIC8vIHNlZ21lbnQtbGV2ZWwgcHJlZmV0Y2hpbmdcbiAgICBcIngtcHJlcmVuZGVyLXJldmFsaWRhdGVcIiwgLy8gb24tZGVtYW5kIElTUiByZXZhbGlkYXRpb25cbiAgICBcIngtcHJlcmVuZGVyLWJ5cGFzc1wiLCAvLyBkcmFmdCBtb2RlXG4gICAgLy8gXCJ4LW5leHRqcy1zdGFsZS10aW1lXCIsIC8vIHN0YWxlLXdoaWxlLXJldmFsaWRhdGUgYmVoYXZpb3JcbiAgICAvLyBcIngtbmV4dC1jYWNoZS10YWctdG9rZW5cIiwgLy8gYXV0aCB0b2tlbiBmb3IgY2FjaGUgdGFncyAob25seSBuZWVkZWQgd2l0aCByZXZhbGlkYXRlVGFnIGF1dGgpXG4gICAgLy8gXCJ4LW5leHRqcy1wb3N0cG9uZWRcIiwgLy8gUGFydGlhbCBQcmVyZW5kZXJpbmcgKGV4cGVyaW1lbnRhbCBmZWF0dXJlKVxuICAgIC8vIFwieC1wcmVyZW5kZXItcmV2YWxpZGF0ZS1pZi1nZW5lcmF0ZWRcIiwgLy8gY29uZGl0aW9uYWwgcmV2YWxpZGF0aW9uIChuaWNoZSB1c2UgY2FzZSlcbiAgKSxcbiAgY29va2llQmVoYXZpb3I6IENhY2hlQ29va2llQmVoYXZpb3IuYWxsKCksXG4gIGVuYWJsZUFjY2VwdEVuY29kaW5nQnJvdGxpOiB0cnVlLFxuICBlbmFibGVBY2NlcHRFbmNvZGluZ0d6aXA6IHRydWUsXG59O1xuXG4vKipcbiAqIEEgY2FjaGUga2V5IG9mIG5vdGhpbmcsIGZvciBhIHBvbGljeSB0aGF0IGNhY2hlcyBub3RoaW5nLiBGb3J3YXJkaW5nIGlzXG4gKiB1bmFmZmVjdGVkOiB0aGUgZHluYW1pYyBvcmlnaW4gcmVxdWVzdCBwb2xpY3kgc2VuZHMgZXZlcnkgdmlld2VyIGhlYWRlcixcbiAqIGNvb2tpZSBhbmQgcXVlcnkgc3RyaW5nIHJlZ2FyZGxlc3MuXG4gKi9cbmNvbnN0IERJU0FCTEVEX0NBQ0hFX0tFWTogQ2FjaGVLZXlQcm9wcyA9IHtcbiAgcXVlcnlTdHJpbmdCZWhhdmlvcjogQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLm5vbmUoKSxcbiAgaGVhZGVyQmVoYXZpb3I6IENhY2hlSGVhZGVyQmVoYXZpb3Iubm9uZSgpLFxuICBjb29raWVCZWhhdmlvcjogQ2FjaGVDb29raWVCZWhhdmlvci5ub25lKCksXG4gIGVuYWJsZUFjY2VwdEVuY29kaW5nQnJvdGxpOiBmYWxzZSxcbiAgZW5hYmxlQWNjZXB0RW5jb2RpbmdHemlwOiBmYWxzZSxcbn07XG5cbi8qKlxuICogQ2xvdWRGcm9udCdzIGRlZmF1bHQgXCJDYWNoZSBiZWhhdmlvcnMgcGVyIGRpc3RyaWJ1dGlvblwiIHF1b3RhLCB0aGUgZGVmYXVsdFxuICogYmVoYXZpb3IgaW5jbHVkZWQuIEFkanVzdGFibGUsIGhlbmNlIGBtYXhDYWNoZUJlaGF2aW9yc2AuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY2xvdWRmcm9udC1saW1pdHMuaHRtbCNsaW1pdHMtd2ViLWRpc3RyaWJ1dGlvbnNcbiAqL1xuY29uc3QgREVGQVVMVF9NQVhfQ0FDSEVfQkVIQVZJT1JTID0gNzU7XG5cbi8qKlxuICogV2hldGhlciBgY2hhcmAgaXMgaW4gQ2xvdWRGcm9udCdzIHBhdGggcGF0dGVybiBhbHBoYWJldDogdGhlIGxpdGVyYWxzLCBwbHVzIHRoZVxuICogYCpgIGFuZCBgP2Agd2lsZGNhcmRzLiBObyBzcGFjZSwgbm8gYCVgLCBub3RoaW5nIG5vbi1BU0NJSS5cbiAqL1xuZnVuY3Rpb24gaXNQYXRoUGF0dGVybkNoYXIoY2hhcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBjaGFyID09PSBcIipcIiB8fCBjaGFyID09PSBcIj9cIiB8fCBQQVRIX1BBVFRFUk5fTElURVJBTC50ZXN0KGNoYXIpO1xufVxuLyoqIENsb3VkRnJvbnQncyBwYXRoIHBhdHRlcm4gbGVuZ3RoIGxpbWl0LiAqL1xuY29uc3QgTUFYX1BBVEhfUEFUVEVSTl9MRU5HVEggPSAyNTU7XG5cbi8qKlxuICogQSBgcHVibGljL2AgZW50cnkncyBuYW1lIGFzIGEgQ2xvdWRGcm9udCBwYXRoIHBhdHRlcm4uXG4gKlxuICogYHB1YmxpYy9oZWxsbyB3b3JsZC5qcGdgIGlzIGEgdmFsaWQgTmV4dC5qcyBhc3NldCDigJQgYG5leHQgc3RhcnRgIHNlcnZlcyBpdCwgYW5kXG4gKiBgbmV4dC9pbWFnZWAgcG9pbnRzIGF0IGl0IOKAlCBidXQgYSBzcGFjZSBjYW5ub3QgYXBwZWFyIGluIGEgcGF0aCBwYXR0ZXJuLCBzb1xuICogY2RrLW5leHRqcyB1c2VkIHRvIHRocm93IGF0IHN5bnRoIGFuZCB0aGUgYXBwIGNvdWxkIG5vdCBiZSBkZXBsb3llZCBhdCBhbGxcbiAqIChgbmV4dC1pbWFnZS1sZWdhY3kvdW5pY29kZWAsIHdob3NlIGBwdWJsaWMvYCBhbHNvIGhvbGRzIGDDpMO2w7zFocSNxZnDrS5wbmdgKS5cbiAqXG4gKiBDbG91ZEZyb250IFVSTC1kZWNvZGVzIHRoZSByZXF1ZXN0IHBhdGggYmVmb3JlIG1hdGNoaW5nIGl0LCBzbyB0aGUgcGF0dGVybiBpc1xuICogbWF0Y2hlZCBhZ2FpbnN0IGBoZWxsbyB3b3JsZC5qcGdgLCBub3QgdGhlIGAvaGVsbG8lMjB3b3JsZC5qcGdgIG9uIHRoZSB3aXJlLlxuICogRWFjaCBjaGFyYWN0ZXIgb3V0c2lkZSB0aGUgYWxwaGFiZXQgaXMgcmVwbGFjZWQgYnkgb25lIGA/YCBwZXIgYnl0ZSBvZiBpdHNcbiAqIFVURi04IGVuY29kaW5nLCBiZWNhdXNlIHRoYXQgaXMgd2hhdCBgP2AgbWF0Y2hlczogYGhlbGxvP3dvcmxkLmpwZ2AgZm9yIHRoZVxuICogc3BhY2UsIGFuZCB0d28gYD9gIGZvciBlYWNoIGNoYXJhY3RlciBvZiBgw6TDtsO8xaHEjcWZw60ucG5nYC4gTWVhc3VyZWQgYWdhaW5zdCBhXG4gKiBkZXBsb3llZCBkaXN0cmlidXRpb247IGEgYD9gIHBlciAqcGVyY2VudC1lbmNvZGVkKiBjaGFyYWN0ZXIgKGBoZWxsbz8/P3dvcmxkYClcbiAqIHN5bnRoZXNpemVzIGZpbmUgYW5kIG5ldmVyIG1hdGNoZXMuIEEgYCpgIHdvdWxkIGJlIHNob3J0ZXIgYW5kIG11Y2ggd2lkZXI6XG4gKiBgw6TDtsO8xaHEjcWZw60ucG5nYCB3b3VsZCBiZWNvbWUgYCoucG5nYCwgd2hpY2ggd291bGQgcHVsbCBldmVyeSBgLnBuZ2AgcmVxdWVzdCBpblxuICogdGhlIGFwcCBvbnRvIHRoZSBzdGF0aWMgb3JpZ2luLlxuICovXG5mdW5jdGlvbiB0b1BhdGhQYXR0ZXJuKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBbLi4ubmFtZV1cbiAgICAubWFwKChjaGFyKSA9PlxuICAgICAgaXNQYXRoUGF0dGVybkNoYXIoY2hhcilcbiAgICAgICAgPyBjaGFyXG4gICAgICAgIDogXCI/XCIucmVwZWF0KEJ1ZmZlci5ieXRlTGVuZ3RoKGNoYXIsIFwidXRmOFwiKSksXG4gICAgKVxuICAgIC5qb2luKFwiXCIpO1xufVxuIl19
|
|
792
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWRpc3RyaWJ1dGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9uZXh0anMtZGlzdHJpYnV0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSw2Q0FBa0U7QUFFbEUsK0RBNEJvQztBQUNwQywrRUFNNEM7QUFFNUMsdURBQXFFO0FBRXJFLDJDQUF1QztBQUN2QywrREFJbUM7QUFDbkMsMkNBQXFEO0FBT3JELGlEQUF1RTtBQXdHdkUsTUFBYSxrQkFBbUIsU0FBUSxzQkFBUzs7SUFDL0MsWUFBWSxDQUFlO0lBRW5CLEtBQUssQ0FBMEI7SUFDdkM7Ozs7O09BS0c7SUFDSyxRQUFRLENBQVM7SUFDekI7Ozs7O09BS0c7SUFDSyxXQUFXLENBQVM7SUFDNUI7OztPQUdHO0lBQ0ssNkJBQTZCLEdBQW9DO1FBQ3ZFLGtCQUFrQixFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRTtRQUN2QyxZQUFZLEVBQUU7WUFDWixXQUFXLEVBQUUsbUNBQWtCLENBQUMsVUFBVTtZQUMxQyxRQUFRLEVBQUUsS0FBSztTQUNoQjtRQUNELGNBQWMsRUFBRTtZQUNkLFFBQVEsRUFBRSxLQUFLO1lBQ2YsY0FBYyxFQUFFLHNDQUFxQixDQUFDLCtCQUErQjtTQUN0RTtRQUVELHVCQUF1QixFQUFFO1lBQ3ZCLG1CQUFtQixFQUFFLHNCQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUN2QyxpQkFBaUIsRUFBRSxJQUFJO1lBQ3ZCLFFBQVEsRUFBRSxLQUFLO1lBQ2YsT0FBTyxFQUFFLElBQUk7U0FDZDtRQUNELGFBQWEsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFO0tBQ3RFLENBQUM7SUFDTSxZQUFZLENBQVU7SUFDdEIsYUFBYSxDQUFVO0lBQ3ZCLDJCQUEyQixDQUF1QjtJQUNsRCxxQ0FBcUMsQ0FBd0I7SUFDN0QsaUJBQWlCLENBQVU7SUFD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SUFBSSxFQUFFO0lBQzFDLGNBQWMsRUFBRSxvQ0FBbUIsQ0FBQyxJQUFJLEVBQUU7SUFDMUMsMEJBQTBCLEVBQUUsS0FBSztJQUNqQyx3QkFBd0IsRUFBRSxLQUFLO0NBQ2hDLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNILE1BQU0sMkJBQTJCLEdBQUcsRUFBRSxDQUFDO0FBRXZDOzs7R0FHRztBQUNILFNBQVMsaUJBQWlCLENBQUMsSUFBWTtJQUNyQyxPQUFPLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxLQUFLLEdBQUcsSUFBSSxzQ0FBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekUsQ0FBQztBQUNELDhDQUE4QztBQUM5QyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQUVwQzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxTQUFTLGFBQWEsQ0FBQyxJQUFZO0lBQ2pDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQztTQUNiLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ1osaUJBQWlCLENBQUMsSUFBSSxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxJQUFJO1FBQ04sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FDaEQ7U0FDQSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW5ub3RhdGlvbnMsIER1cmF0aW9uLCBTdGFjaywgVG9rZW4gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IElDZXJ0aWZpY2F0ZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBBY2Nlc3NMZXZlbCxcbiAgQWRkQmVoYXZpb3JPcHRpb25zLFxuICBBbGxvd2VkTWV0aG9kcyxcbiAgQmVoYXZpb3JPcHRpb25zLFxuICBDYWNoZUNvb2tpZUJlaGF2aW9yLFxuICBDYWNoZUhlYWRlckJlaGF2aW9yLFxuICBDYWNoZVBvbGljeSxcbiAgQ2FjaGVQb2xpY3lQcm9wcyxcbiAgQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLFxuICBDYWNoZWRNZXRob2RzLFxuICBGdW5jdGlvbiBhcyBDbG91ZEZyb250RnVuY3Rpb24sXG4gIERpc3RyaWJ1dGlvbixcbiAgRnVuY3Rpb25Bc3NvY2lhdGlvbixcbiAgRnVuY3Rpb25Db2RlLFxuICBGdW5jdGlvbkV2ZW50VHlwZSxcbiAgSGVhZGVyc0ZyYW1lT3B0aW9uLFxuICBIZWFkZXJzUmVmZXJyZXJQb2xpY3ksXG4gIEh0dHBWZXJzaW9uLFxuICBJT3JpZ2luLFxuICBJT3JpZ2luUmVxdWVzdFBvbGljeSxcbiAgT3JpZ2luUHJvdG9jb2xQb2xpY3ksXG4gIE9yaWdpblJlcXVlc3RQb2xpY3ksXG4gIFJlc3BvbnNlSGVhZGVyc1BvbGljeSxcbiAgUmVzcG9uc2VIZWFkZXJzUG9saWN5UHJvcHMsXG4gIFJlc3BvbnNlU2VjdXJpdHlIZWFkZXJzQmVoYXZpb3IsXG4gIFNlY3VyaXR5UG9saWN5UHJvdG9jb2wsXG4gIFZpZXdlclByb3RvY29sUG9saWN5LFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnRcIjtcbmltcG9ydCB7XG4gIEZ1bmN0aW9uVXJsT3JpZ2luLFxuICBGdW5jdGlvblVybE9yaWdpbldpdGhPQUNQcm9wcyxcbiAgUzNCdWNrZXRPcmlnaW4sXG4gIFZwY09yaWdpbixcbiAgVnBjT3JpZ2luV2l0aEVuZHBvaW50UHJvcHMsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udC1vcmlnaW5zXCI7XG5pbXBvcnQgeyBJQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjJcIjtcbmltcG9ydCB7IENmblBlcm1pc3Npb24sIElGdW5jdGlvblVybCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBJQnVja2V0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7XG4gIGNsb3VkRnJvbnRQYXR0ZXJuUmVnZXgsXG4gIERFRkFVTFRfRlVOQ1RJT05fR1JPVVAsXG4gIFBBVEhfUEFUVEVSTl9MSVRFUkFMLFxufSBmcm9tIFwiLi9hZGFwdGVyL2Z1bmN0aW9uLWdyb3Vwc1wiO1xuaW1wb3J0IHsgTE9HX1BSRUZJWCwgTmV4dGpzVHlwZSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgT3B0aW9uYWxEaXN0cmlidXRpb25Qcm9wcyB9IGZyb20gXCIuL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsRGlzdHJpYnV0aW9uUHJvcHNcIjtcbmltcG9ydCB7IE9wdGlvbmFsUzNPcmlnaW5CdWNrZXRXaXRoT0FDUHJvcHMgfSBmcm9tIFwiLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbFMzT3JpZ2luQnVja2V0V2l0aE9BQ1Byb3BzXCI7XG5pbXBvcnQge1xuICBOZXh0anNGdW5jdGlvbkdyb3VwQmVoYXZpb3IsXG4gIFB1YmxpY0RpckVudHJ5LFxufSBmcm9tIFwiLi9uZXh0anMtYnVpbGQvbmV4dGpzLWJ1aWxkXCI7XG5pbXBvcnQgeyBhc3NldFByZWZpeFBhdGgsIG5vcm1hbGl6ZUJhc2VQYXRoIH0gZnJvbSBcIi4vdXRpbHMvYmFzZS1wYXRoXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzRGlzdHJpYnV0aW9uT3ZlcnJpZGVzIHtcbiAgcmVhZG9ubHkgZGlzdHJpYnV0aW9uUHJvcHM/OiBPcHRpb25hbERpc3RyaWJ1dGlvblByb3BzO1xuICByZWFkb25seSBpbWFnZUJlaGF2aW9yT3B0aW9ucz86IEFkZEJlaGF2aW9yT3B0aW9ucztcbiAgcmVhZG9ubHkgaW1hZ2VDYWNoZVBvbGljeVByb3BzPzogQ2FjaGVQb2xpY3lQcm9wcztcbiAgcmVhZG9ubHkgaW1hZ2VSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcz86IFJlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzO1xuICByZWFkb25seSBkeW5hbWljQmVoYXZpb3JPcHRpb25zPzogQWRkQmVoYXZpb3JPcHRpb25zO1xuICByZWFkb25seSBkeW5hbWljQ2FjaGVQb2xpY3lQcm9wcz86IENhY2hlUG9saWN5UHJvcHM7XG4gIHJlYWRvbmx5IGR5bmFtaWNSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcz86IFJlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzO1xuICByZWFkb25seSBkeW5hbWljRnVuY3Rpb25VcmxPcmlnaW5XaXRoT0FDUHJvcHM/OiBGdW5jdGlvblVybE9yaWdpbldpdGhPQUNQcm9wcztcbiAgcmVhZG9ubHkgZHluYW1pY1ZwY09yaWdpbldpdGhFbmRwb2ludFByb3BzPzogVnBjT3JpZ2luV2l0aEVuZHBvaW50UHJvcHM7XG4gIHJlYWRvbmx5IHN0YXRpY0JlaGF2aW9yT3B0aW9ucz86IEFkZEJlaGF2aW9yT3B0aW9ucztcbiAgcmVhZG9ubHkgc3RhdGljUmVzcG9uc2VIZWFkZXJzUG9saWN5UHJvcHM/OiBSZXNwb25zZUhlYWRlcnNQb2xpY3lQcm9wcztcbiAgcmVhZG9ubHkgczNCdWNrZXRPcmlnaW5Qcm9wcz86IE9wdGlvbmFsUzNPcmlnaW5CdWNrZXRXaXRoT0FDUHJvcHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzRGlzdHJpYnV0aW9uUHJvcHMge1xuICAvKipcbiAgICogQnVja2V0IGNvbnRhaW5pbmcgc3RhdGljIGFzc2V0cy5cbiAgICogTXVzdCBiZSBwcm92aWRlZCBpZiB5b3Ugd2FudCB0byBzZXJ2ZSBzdGF0aWMgZmlsZXMuXG4gICAqL1xuICByZWFkb25seSBhc3NldHNCdWNrZXQ6IElCdWNrZXQ7XG4gIC8qKlxuICAgKiBUaGUgYXBwJ3Mgb3duIGBhc3NldFByZWZpeGAuIE5leHQuanMgZW1pdHMgYDxhc3NldFByZWZpeD4vX25leHQvc3RhdGljLy4uLmBcbiAgICogZm9yIGV2ZXJ5IGJ1bmRsZSB3aGlsZSB0aGUgb2JqZWN0cyBzdGF5IGF0IGA8YmFzZVBhdGg+L19uZXh0L3N0YXRpYy8uLi5gIGluXG4gICAqIFMzLCBzbyB0aGUgcHJlZml4J3MgcGF0aCBnZXRzIGEgY2FjaGUgYmVoYXZpb3Igb2YgaXRzIG93biB0aGF0IHJld3JpdGVzIGl0XG4gICAqIGF3YXkuXG4gICAqXG4gICAqIEVpdGhlciBmb3JtIGlzIGFjY2VwdGVkOiBhIHBhdGggKFwiL2NkblwiKSwgb3IgYW4gYWJzb2x1dGUgVVJMLCBpbiB3aGljaCBjYXNlXG4gICAqIG9ubHkgaXRzIHBhdGggY291bnRzIChcImh0dHBzOi8vY2RuLmV4YW1wbGUuY29tL2NkblwiIGJlaGF2ZXMgYXMgXCIvY2RuXCIsIGFuZFxuICAgKiBcImh0dHBzOi8vY2RuLmV4YW1wbGUuY29tXCIgbmVlZHMgbm8gYmVoYXZpb3IgYXQgYWxsKS4gQW4gYWJzb2x1dGUgcHJlZml4J3MgcGF0aFxuICAgKiBtYXR0ZXJzIGJlY2F1c2UgYG5leHQgYnVpbGRgIGNvbXBpbGVzIGEgYC9jZG4vX25leHQvOnBhdGgrYCByZXdyaXRlIG9mIGl0c1xuICAgKiBvd24sIHNvIGBuZXh0IHN0YXJ0YCBzZXJ2ZXMgZXZlcnkgYnVuZGxlIHVuZGVyIGl0IOKAlCBhIENETiBmcm9udGluZyB0aGlzXG4gICAqIGRpc3RyaWJ1dGlvbiB0aGVyZSBoYXMgdG8gYmUgYW5zd2VyZWQgdG9vLlxuICAgKlxuICAgKiBBcHBsaWVkIG9uIHRvcCBvZiBgYmFzZVBhdGhgLCBub3QgdW5kZXIgaXQsIGJlY2F1c2UgdGhhdCBpcyBob3cgTmV4dC5qc1xuICAgKiBidWlsZHMgdGhlIFVSTC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lOyBwYXNzIGBOZXh0anNCdWlsZC5uZXh0Q29uZmlnQXNzZXRQcmVmaXhQYXRoYFxuICAgKi9cbiAgcmVhZG9ubHkgYXNzZXRQcmVmaXg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBVUkkgcGF0aCBwcmVmaXggdGhlIGFwcCBpcyBzZXJ2ZWQgYXQuIFN1cnJvdW5kaW5nIHNsYXNoZXMgYXJlIG5vcm1hbGl6ZWRcbiAgICogYXdheSwgc28gXCIvYmFzZVwiLCBcImJhc2VcIiBhbmQgXCIvYmFzZS9cIiBhbGwgcHJvZHVjZSB0aGUgc2FtZSBjYWNoZSBiZWhhdmlvcnMuXG4gICAqL1xuICByZWFkb25seSBiYXNlUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGJ1dCBvbmx5IGFwcGxpY2FibGUgZm9yIGBOZXh0anNUeXBlLkdMT0JBTF9DT05UQUlORVJTYFxuICAgKi9cbiAgcmVhZG9ubHkgY2VydGlmaWNhdGU/OiBJQ2VydGlmaWNhdGU7XG4gIHJlYWRvbmx5IGRpc3RyaWJ1dGlvbj86IERpc3RyaWJ1dGlvbjtcbiAgLyoqXG4gICAqIFJlcXVpcmVkIGlmIGBOZXh0anNUeXBlLkdMT0JBTF9GVU5DVElPTlNgXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvblVybD86IElGdW5jdGlvblVybDtcbiAgLyoqXG4gICAqIFJlcXVpcmVkIGlmIGBOZXh0anNUeXBlLkdMT0JBTF9DT05UQUlORVJTYCBvciBgTmV4dGpzVHlwZS5SRUdJT05BTF9DT05UQUlORVJTYFxuICAgKi9cbiAgcmVhZG9ubHkgbG9hZEJhbGFuY2VyPzogSUFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyO1xuICByZWFkb25seSBuZXh0anNUeXBlOiBOZXh0anNUeXBlO1xuICAvKipcbiAgICogT3ZlcnJpZGUgcHJvcHMgZm9yIGV2ZXJ5IGNvbnN0cnVjdC5cbiAgICovXG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IE5leHRqc0Rpc3RyaWJ1dGlvbk92ZXJyaWRlcztcbiAgLyoqXG4gICAqIEVudHJpZXMgKGZpbGVzL2RpcmVjdG9yaWVzKSB3aXRoaW4gTmV4dC5qcyBhcHAncyBwdWJsaWMgZGlyZWN0b3J5LiBVc2VkIHRvXG4gICAqIGFkZCBzdGF0aWMgYmVoYXZpb3JzIHRvIGRpc3RyaWJ1dGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHB1YmxpY0RpckVudHJpZXM6IFB1YmxpY0RpckVudHJ5W107XG4gIC8qKlxuICAgKiBUaGUgbm9uLWBkZWZhdWx0YCBmdW5jdGlvbiBncm91cHMsIHRoZSBvcmlnaW5zXG4gICAqIHtAbGluayBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzfSByb3V0ZSB0by5cbiAgICogQGRlZmF1bHQgLSBubyBzcGxpdHRpbmc7IHRoZSBkZWZhdWx0IGJlaGF2aW9yIHNlcnZlcyBldmVyeSBkeW5hbWljIHJvdXRlXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbkdyb3Vwcz86IE5leHRqc0Rpc3RyaWJ1dGlvbkZ1bmN0aW9uR3JvdXBbXTtcbiAgLyoqXG4gICAqIGBOZXh0anNCdWlsZC5mdW5jdGlvbkdyb3VwQmVoYXZpb3JzYDogb25lIGNhY2hlIGJlaGF2aW9yIGVhY2gsIGFkZGVkIGluXG4gICAqIG9yZGVyLCBzbyB0aGUgcm91dGVzIGVhY2ggZ3JvdXAgd2FzIHBhY2thZ2VkIHdpdGggcmVhY2ggaXQgcmF0aGVyIHRoYW4gdGhlXG4gICAqIGRlZmF1bHQgZnVuY3Rpb24uXG4gICAqIEBkZWZhdWx0IC0gbm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycz86IE5leHRqc0Z1bmN0aW9uR3JvdXBCZWhhdmlvcltdO1xuICAvKipcbiAgICogVGhlIG1vc3QgY2FjaGUgYmVoYXZpb3JzIHRoZSBkaXN0cmlidXRpb24gbWF5IGhhdmUsIHRoZSBkZWZhdWx0IG9uZVxuICAgKiBpbmNsdWRlZC4gY2RrLW5leHRqcyBjb3VudHMgd2hhdCBpdCBhZGRzIGFnYWluc3QgdGhpcyBhdCBzeW50aCwgc28gcnVubmluZ1xuICAgKiBvdXQgaXMgYSBzeW50aCBlcnJvciBuYW1pbmcgd2hhdCB1c2VkIHRoZW0gcmF0aGVyIHRoYW4gYSBmYWlsZWQgZGVwbG95LlxuICAgKlxuICAgKiBSYWlzZSBpdCBhZnRlciByYWlzaW5nIHRoZSBcIkNhY2hlIGJlaGF2aW9ycyBwZXIgZGlzdHJpYnV0aW9uXCIgcXVvdGEgZm9yXG4gICAqIHlvdXIgYWNjb3VudC4gTG93ZXIgaXQgYnkgdGhlIGJlaGF2aW9ycyBhIHN1cHBsaWVkIHtAbGluayBkaXN0cmlidXRpb259XG4gICAqIChvciBgb3ZlcnJpZGVzLmRpc3RyaWJ1dGlvblByb3BzYCkgYWxyZWFkeSBoYXMsIHdoaWNoIGFyZSBub3QgY291bnRlZC5cbiAgICogQGRlZmF1bHQgNzUgLSBDbG91ZEZyb250J3MgZGVmYXVsdCBxdW90YVxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jbG91ZGZyb250LWxpbWl0cy5odG1sI2xpbWl0cy13ZWItZGlzdHJpYnV0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF4Q2FjaGVCZWhhdmlvcnM/OiBudW1iZXI7XG59XG5cbi8qKiBBIG5vbi1kZWZhdWx0IGZ1bmN0aW9uIGdyb3VwIGFuZCB0aGUgb3JpZ2luIGl0cyByb3V0ZXMgbXVzdCByZWFjaC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzRGlzdHJpYnV0aW9uRnVuY3Rpb25Hcm91cCB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqIFRoZSBncm91cCdzIExhbWJkYSBGdW5jdGlvbiBVUkwuICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uVXJsOiBJRnVuY3Rpb25Vcmw7XG59XG5cbmV4cG9ydCBjbGFzcyBOZXh0anNEaXN0cmlidXRpb24gZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBkaXN0cmlidXRpb246IERpc3RyaWJ1dGlvbjtcblxuICBwcml2YXRlIHByb3BzOiBOZXh0anNEaXN0cmlidXRpb25Qcm9wcztcbiAgLyoqXG4gICAqIGBwcm9wcy5iYXNlUGF0aGAgbm9ybWFsaXplZCB0byBhIGJhcmUgcGF0aCBzZWdtZW50LiBUaGlzIGNvbnN0cnVjdCBpcyB0aGVcbiAgICogb25lIHBsYWNlIHRoYXQgbmVlZHMgaXQgd2l0aCBhIGxlYWRpbmcgc2xhc2gg4oCUIENsb3VkRnJvbnQgcGF0aCBwYXR0ZXJucyBhcmVcbiAgICogd3JpdHRlbiBhZ2FpbnN0IHRoZSByZXF1ZXN0IHBhdGgg4oCUIHNvIGl0IHByZXBlbmRzIGl0cyBvd24gcmF0aGVyIHRoYW5cbiAgICogcmVseWluZyBvbiB0aGUgY2FsbGVyIGhhdmluZyBwYXNzZWQgb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBiYXNlUGF0aDogc3RyaW5nO1xuICAvKipcbiAgICogYHByb3BzLmFzc2V0UHJlZml4YCBub3JtYWxpemVkIHRvIGEgbGVhZGluZy1zbGFzaCBwYXRoLCBgXCJcImAgd2hlbiB0aGUgYXBwXG4gICAqIHNldHMgbm9uZSBvciBzZXRzIG9uZSB0aGF0IGFscmVhZHkgZXF1YWxzIHRoZSBgYmFzZVBhdGhgIHByZWZpeCDigJQgaW4gd2hpY2hcbiAgICogY2FzZSB0aGUgb3JkaW5hcnkgYF9uZXh0L3N0YXRpYypgIGJlaGF2aW9yIGFscmVhZHkgY292ZXJzIGl0IGFuZCBhIHNlY29uZCBvbmVcbiAgICogd291bGQgYmUgYSBkdXBsaWNhdGUgcGF0dGVybiBDbG91ZEZyb250IHJlamVjdHMuXG4gICAqL1xuICBwcml2YXRlIGFzc2V0UHJlZml4OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDb21tb24gc2VjdXJpdHkgaGVhZGVycyBhcHBsaWVkIGJ5IGRlZmF1bHQgdG8gYWxsIG9yaWdpbnNcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvdXNpbmctbWFuYWdlZC1yZXNwb25zZS1oZWFkZXJzLXBvbGljaWVzLmh0bWwjbWFuYWdlZC1yZXNwb25zZS1oZWFkZXJzLXBvbGljaWVzLXNlY3VyaXR5XG4gICAqL1xuICBwcml2YXRlIGNvbW1vblNlY3VyaXR5SGVhZGVyc0JlaGF2aW9yOiBSZXNwb25zZVNlY3VyaXR5SGVhZGVyc0JlaGF2aW9yID0ge1xuICAgIGNvbnRlbnRUeXBlT3B0aW9uczogeyBvdmVycmlkZTogZmFsc2UgfSxcbiAgICBmcmFtZU9wdGlvbnM6IHtcbiAgICAgIGZyYW1lT3B0aW9uOiBIZWFkZXJzRnJhbWVPcHRpb24uU0FNRU9SSUdJTixcbiAgICAgIG92ZXJyaWRlOiBmYWxzZSxcbiAgICB9LFxuICAgIHJlZmVycmVyUG9saWN5OiB7XG4gICAgICBvdmVycmlkZTogZmFsc2UsXG4gICAgICByZWZlcnJlclBvbGljeTogSGVhZGVyc1JlZmVycmVyUG9saWN5LlNUUklDVF9PUklHSU5fV0hFTl9DUk9TU19PUklHSU4sXG4gICAgfSxcblxuICAgIHN0cmljdFRyYW5zcG9ydFNlY3VyaXR5OiB7XG4gICAgICBhY2Nlc3NDb250cm9sTWF4QWdlOiBEdXJhdGlvbi5kYXlzKDM2NSksXG4gICAgICBpbmNsdWRlU3ViZG9tYWluczogdHJ1ZSxcbiAgICAgIG92ZXJyaWRlOiBmYWxzZSxcbiAgICAgIHByZWxvYWQ6IHRydWUsXG4gICAgfSxcbiAgICB4c3NQcm90ZWN0aW9uOiB7IG92ZXJyaWRlOiBmYWxzZSwgcHJvdGVjdGlvbjogdHJ1ZSwgbW9kZUJsb2NrOiB0cnVlIH0sXG4gIH07XG4gIHByaXZhdGUgc3RhdGljT3JpZ2luOiBJT3JpZ2luO1xuICBwcml2YXRlIGR5bmFtaWNPcmlnaW46IElPcmlnaW47XG4gIHByaXZhdGUgZHluYW1pY09yaWdpblJlc3BvbnNlUG9saWN5OiBJT3JpZ2luUmVxdWVzdFBvbGljeTtcbiAgcHJpdmF0ZSBkeW5hbWljQ2xvdWRGcm9udEZ1bmN0aW9uQXNzb2NpYXRpb25zOiBGdW5jdGlvbkFzc29jaWF0aW9uW107XG4gIHByaXZhdGUgaXNGdW5jdGlvbkNvbXB1dGU6IGJvb2xlYW47XG4gIHByaXZhdGUgc3RhdGljQmVoYXZpb3JPcHRpb25zOiBCZWhhdmlvck9wdGlvbnM7XG4gIHByaXZhdGUgZHluYW1pY0JlaGF2aW9yT3B0aW9uczogQmVoYXZpb3JPcHRpb25zO1xuICBwcml2YXRlIGltYWdlQmVoYXZpb3JPcHRpb25zOiBCZWhhdmlvck9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE5leHRqc0Rpc3RyaWJ1dGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgdGhpcy5iYXNlUGF0aCA9IG5vcm1hbGl6ZUJhc2VQYXRoKHByb3BzLmJhc2VQYXRoKTtcbiAgICB0aGlzLmFzc2V0UHJlZml4ID0gdGhpcy5yZXNvbHZlQXNzZXRQcmVmaXgoKTtcbiAgICB0aGlzLnN0YXRpY09yaWdpbiA9IHRoaXMuY3JlYXRlU3RhdGljT3JpZ2luKCk7XG4gICAgdGhpcy5pc0Z1bmN0aW9uQ29tcHV0ZSA9IHByb3BzLm5leHRqc1R5cGUgPT09IE5leHRqc1R5cGUuR0xPQkFMX0ZVTkNUSU9OUztcbiAgICB0aGlzLnZhbGlkYXRlRnVuY3Rpb25Hcm91cFByb3BzKCk7XG4gICAgdGhpcy5keW5hbWljT3JpZ2luID0gdGhpcy5jcmVhdGVEeW5hbWljT3JpZ2luKCk7XG4gICAgdGhpcy5keW5hbWljT3JpZ2luUmVzcG9uc2VQb2xpY3kgPSB0aGlzLmNyZWF0ZUR5bmFtaWNPcmlnaW5SZXF1ZXN0UG9saWN5KCk7XG4gICAgdGhpcy5keW5hbWljQ2xvdWRGcm9udEZ1bmN0aW9uQXNzb2NpYXRpb25zID1cbiAgICAgIHRoaXMuY3JlYXRlRHluYW1pY0Nsb3VkRnJvbnRGdW5jdGlvbkFzc29jaWF0aW9ucygpO1xuICAgIHRoaXMuc3RhdGljQmVoYXZpb3JPcHRpb25zID0gdGhpcy5jcmVhdGVTdGF0aWNCZWhhdmlvck9wdGlvbnMoKTtcbiAgICB0aGlzLmR5bmFtaWNCZWhhdmlvck9wdGlvbnMgPSB0aGlzLmNyZWF0ZUR5bmFtaWNCZWhhdmlvck9wdGlvbnMoKTtcbiAgICB0aGlzLmltYWdlQmVoYXZpb3JPcHRpb25zID0gdGhpcy5jcmVhdGVJbWFnZUJlaGF2aW9yT3B0aW9ucygpO1xuICAgIHRoaXMuZGlzdHJpYnV0aW9uID0gdGhpcy5nZXREaXN0cmlidXRpb24oKTtcbiAgICBpZiAodGhpcy5pc0Z1bmN0aW9uQ29tcHV0ZSkge1xuICAgICAgdGhpcy5ncmFudEludm9rZShERUZBVUxUX0ZVTkNUSU9OX0dST1VQLCBwcm9wcy5mdW5jdGlvblVybCEpO1xuICAgIH1cbiAgICB0aGlzLmFkZFN0YXRpY0JlaGF2aW9ycygpO1xuICAgIHRoaXMuYWRkRHluYW1pY0JlaGF2aW9ycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBDbG91ZEZyb250IGNvbW1lbnQgdGhhdCBpcyBzYWZlIGZvciB0aGUgMTI4IGNoYXJhY3RlciBsaW1pdC5cbiAgICogSWYgdGhlIGZ1bGwgY29tbWVudCB3aXRoIHN0YWNrIG5hbWUgZXhjZWVkcyAxMjggY2hhcmFjdGVycywgcmV0dXJucyB0aGUgYmFzZSBjb21tZW50IG9ubHkuXG4gICAqIEBwYXJhbSBiYXNlQ29tbWVudCBUaGUgYmFzZSBjb21tZW50IHRleHRcbiAgICogQHBhcmFtIHN0YWNrTmFtZSBUaGUgc3RhY2sgbmFtZSB0byBhcHBlbmRcbiAgICogQHJldHVybnMgQSBjb21tZW50IHN0cmluZyB0aGF0IGlzIGd1YXJhbnRlZWQgdG8gYmUgPCAxMjggY2hhcmFjdGVyc1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRDb21tZW50KGJhc2VDb21tZW50OiBzdHJpbmcsIHN0YWNrTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBmdWxsQ29tbWVudCA9IGAke2Jhc2VDb21tZW50fSBmb3IgJHtzdGFja05hbWV9YDtcbiAgICByZXR1cm4gZnVsbENvbW1lbnQubGVuZ3RoIDwgMTI4ID8gZnVsbENvbW1lbnQgOiBiYXNlQ29tbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU3RhdGljT3JpZ2luKCk6IElPcmlnaW4ge1xuICAgIHJldHVybiBTM0J1Y2tldE9yaWdpbi53aXRoT3JpZ2luQWNjZXNzQ29udHJvbCh0aGlzLnByb3BzLmFzc2V0c0J1Y2tldCwge1xuICAgICAgLy8gTElTVCBsZXRzIFMzIGFuc3dlciBhIG1pc3Npbmcga2V5IHdpdGggNDA0IGluc3RlYWQgb2YgNDAzXG4gICAgICBvcmlnaW5BY2Nlc3NMZXZlbHM6IFtBY2Nlc3NMZXZlbC5SRUFELCBBY2Nlc3NMZXZlbC5MSVNUXSxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5zM0J1Y2tldE9yaWdpblByb3BzLFxuICAgIH0pO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlRHluYW1pY09yaWdpbigpOiBJT3JpZ2luIHtcbiAgICBpZiAodGhpcy5pc0Z1bmN0aW9uQ29tcHV0ZSkge1xuICAgICAgaWYgKCF0aGlzLnByb3BzLmZ1bmN0aW9uVXJsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgTmV4dGpzRGlzdHJpYnV0aW9uUHJvcHMuZnVuY3Rpb25VcmxcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gRnVuY3Rpb25VcmxPcmlnaW4ud2l0aE9yaWdpbkFjY2Vzc0NvbnRyb2woXG4gICAgICAgIHRoaXMucHJvcHMuZnVuY3Rpb25VcmwsXG4gICAgICAgIHRoaXMucHJvcHMub3ZlcnJpZGVzPy5keW5hbWljRnVuY3Rpb25VcmxPcmlnaW5XaXRoT0FDUHJvcHMsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBsb2FkQmFsYW5jZXIgPSB0aGlzLnByb3BzLmxvYWRCYWxhbmNlcjtcbiAgICAgIGlmICghbG9hZEJhbGFuY2VyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgTmV4dGpzRGlzdHJpYnV0aW9uUHJvcHMubG9hZEJhbGFuY2VyXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFZwY09yaWdpbi53aXRoQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIobG9hZEJhbGFuY2VyLCB7XG4gICAgICAgIHByb3RvY29sUG9saWN5OiB0aGlzLnByb3BzLmNlcnRpZmljYXRlXG4gICAgICAgICAgPyBPcmlnaW5Qcm90b2NvbFBvbGljeS5IVFRQU19PTkxZXG4gICAgICAgICAgOiBPcmlnaW5Qcm90b2NvbFBvbGljeS5IVFRQX09OTFksXG4gICAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5keW5hbWljVnBjT3JpZ2luV2l0aEVuZHBvaW50UHJvcHMsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIExhbWJkYSBGdW5jdGlvbiBVUkxzIFwiZXhwZWN0IHRoZSBgSG9zdGAgaGVhZGVyIHRvIGNvbnRhaW4gdGhlIG9yaWdpbiBkb21haW5cbiAgICogbmFtZSwgbm90IHRoZSBkb21haW4gbmFtZSBvZiB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24uXCJcbiAgICpcbiAgICogQSBjb250YWluZXIgb3JpZ2luIGFsc28gZ2V0cyBDbG91ZEZyb250J3Mgb3duIGhlYWRlcnMsIGZvclxuICAgKiBgQ2xvdWRGcm9udC1Gb3J3YXJkZWQtUHJvdG9gOiB3aXRob3V0IGEgY2VydGlmaWNhdGUgQ2xvdWRGcm9udCByZWFjaGVzIHRoZVxuICAgKiBBTEIgb3ZlciBwbGFpbiBIVFRQLCBzbyB0aGUgQUxCJ3MgYFgtRm9yd2FyZGVkLVByb3RvYCBpcyBgaHR0cGAsIGFuZCB0aGVcbiAgICogcnVudGltZSB3b3VsZCBidWlsZCBldmVyeSBhYnNvbHV0ZSBVUkwgKGByZXF1ZXN0LnVybGAsIHRoZSBvcmlnaW4gYSBzZXJ2ZXJcbiAgICogYWN0aW9uIGlzIGZvcndhcmRlZCB0bykgYXMgYGh0dHA6Ly9gIGJlaGluZCBhIHZpZXdlciBvbiBIVFRQUy5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvdXNpbmctbWFuYWdlZC1vcmlnaW4tcmVxdWVzdC1wb2xpY2llcy5odG1sI21hbmFnZWQtb3JpZ2luLXJlcXVlc3QtcG9saWN5LWFsbC12aWV3ZXItZXhjZXB0LWhvc3QtaGVhZGVyXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL3VzaW5nLW1hbmFnZWQtb3JpZ2luLXJlcXVlc3QtcG9saWNpZXMuaHRtbCNtYW5hZ2VkLW9yaWdpbi1yZXF1ZXN0LXBvbGljeS1hbGwtdmlld2VyLWFuZC1jbG91ZGZyb250XG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUR5bmFtaWNPcmlnaW5SZXF1ZXN0UG9saWN5KCk6IElPcmlnaW5SZXF1ZXN0UG9saWN5IHtcbiAgICByZXR1cm4gdGhpcy5pc0Z1bmN0aW9uQ29tcHV0ZVxuICAgICAgPyBPcmlnaW5SZXF1ZXN0UG9saWN5LkFMTF9WSUVXRVJfRVhDRVBUX0hPU1RfSEVBREVSXG4gICAgICA6IE9yaWdpblJlcXVlc3RQb2xpY3kuQUxMX1ZJRVdFUl9BTkRfQ0xPVURGUk9OVF8yMDIyO1xuICB9XG4gIC8qKlxuICAgKiBFbnN1cmVzIE5leHQuanMgYHJlcXVlc3QudXJsYCB3aWxsIGJlIGNvcnJlY3QgZG9tYWluIGluc3RlYWQgb2YgVVJMIG9mXG4gICAqIGNvbXB1dGUgKExhbWJkYSBvciBGYXJnYXRlKVxuICAgKiBAc2VlIGh0dHBzOi8vb3Blbi1uZXh0LmpzLm9yZy9hZHZhbmNlZC93b3JrYXJvdW5kI3dvcmthcm91bmQtc2V0LXgtZm9yd2FyZGVkLWhvc3QtaGVhZGVyLWF3cy1zcGVjaWZpY1xuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVEeW5hbWljQ2xvdWRGcm9udEZ1bmN0aW9uQXNzb2NpYXRpb25zKCk6IEZ1bmN0aW9uQXNzb2NpYXRpb25bXSB7XG4gICAgY29uc3QgYXNzb2NpYXRpb25zOiBGdW5jdGlvbkFzc29jaWF0aW9uW10gPSBbXTtcbiAgICBpZiAodGhpcy5pc0Z1bmN0aW9uQ29tcHV0ZSkge1xuICAgICAgY29uc3QgY2xvdWRGcm9udEZuID0gbmV3IENsb3VkRnJvbnRGdW5jdGlvbih0aGlzLCBcIkNsb3VkRnJvbnRGblwiLCB7XG4gICAgICAgIC8vIGNsb3VkZnJvbnQtanMtMS4wLCBzbyBFUzUuMTogYHZhcmAsIG5vIGFycm93IGZ1bmN0aW9ucywgbm8gdGVtcGxhdGVcbiAgICAgICAgLy8gbGl0ZXJhbHMsIG5vIGBPYmplY3Qua2V5c2AuXG4gICAgICAgIGNvZGU6IEZ1bmN0aW9uQ29kZS5mcm9tSW5saW5lKGBcbiAgICAgICAgICBmdW5jdGlvbiBoYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgICAgICB2YXIgcmVxdWVzdCA9IGV2ZW50LnJlcXVlc3Q7XG4gICAgICAgICAgICB2YXIgdXJpID0gcmVxdWVzdC51cmk7XG5cbiAgICAgICAgICAgIC8vIE5leHQuanMgYW5zd2VycyBhbnkgcGF0aCBjb250YWluaW5nIGEgYmFja3NsYXNoIG9yIGEgcmVwZWF0ZWRcbiAgICAgICAgICAgIC8vIHNsYXNoIHdpdGggYSAzMDggdG8gdGhlIGNvbGxhcHNlZCBwYXRoXG4gICAgICAgICAgICAvLyAoXFxgbm9ybWFsaXplUmVwZWF0ZWRTbGFzaGVzXFxgLCBjYWxsZWQgZnJvbSBcXGBiYXNlLXNlcnZlci50c1xcYCksIGFuZCBzb1xuICAgICAgICAgICAgLy8gZG9lcyB0aGlzIHJ1bnRpbWUuIEJlaGluZCBhIExhbWJkYSBGdW5jdGlvbiBVUkwgdGhlIG9yaWdpbiBuZXZlclxuICAgICAgICAgICAgLy8gZ2V0cyB0aGUgY2hhbmNlOiBPcmlnaW4gQWNjZXNzIENvbnRyb2wgc2lnbnMgdGhlIHJhdyBwYXRoIHdoaWxlIHRoZVxuICAgICAgICAgICAgLy8gRnVuY3Rpb24gVVJMIGNhbm9uaWNhbGl6ZXMgaXQgYmVmb3JlIHZlcmlmeWluZywgc28gdGhlIG9yaWdpblxuICAgICAgICAgICAgLy8gYW5zd2VycyA0MDMgU2lnbmF0dXJlRG9lc05vdE1hdGNoLiBEb2luZyB0aGUgcmVkaXJlY3QgaGVyZSBpcyB3aGF0XG4gICAgICAgICAgICAvLyBtYWtlcyBcXGAvYmFzZXBhdGgvL3RvLXN2XFxgIGJlaGF2ZSBhcyBpdCBkb2VzIHVuZGVyIFxcYG5leHQgc3RhcnRcXGAuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gQSBiYXJlIFxcYC8vXFxgIHJlYWNoZXMgaGVyZSB0b28sIGFuZCBpcyBhbnN3ZXJlZCB0aGUgc2FtZSB3YXkgLVxuICAgICAgICAgICAgLy8gbWVhc3VyZWQsIGJlY2F1c2UgXFxgLy9cXGAgYXQgdGhlIHN0YXJ0IG9mIGEgcmVxdWVzdCB0YXJnZXQgaXMgYWxzbyB0aGVcbiAgICAgICAgICAgIC8vIGF1dGhvcml0eSBmb3JtIGFuZCBpdCB3YXMgbm90IG9idmlvdXMgQ2xvdWRGcm9udCB3b3VsZCByb3V0ZSBpdCB0byBhXG4gICAgICAgICAgICAvLyBmdW5jdGlvbiBhdCBhbGwuIEl0IGRvZXM6IFxcYEdFVCAvL1xcYCBhbnN3ZXJzIDMwOCB0byBcXGAvXFxgIHdpdGhcbiAgICAgICAgICAgIC8vIFxcYHgtY2FjaGU6IEZ1bmN0aW9uR2VuZXJhdGVkUmVzcG9uc2VcXGAsIG92ZXIgYm90aCBIVFRQLzEuMSBhbmQgSFRUUC8yLFxuICAgICAgICAgICAgLy8gd2hpY2ggaXMgd2hhdCBcXGB0ZXN0L2UyZS9oeWRyYXRpb25cXGAgYXNrcyBmb3IuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gVHdvIHRoaW5ncyBOZXh0LmpzIGRvZXMgdGhhdCB0aGlzIGNhbm5vdDpcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyAtIHRoZSBib2R5IGl0IHNlbmRzIHdpdGggaXRzIG93biByZWRpcmVjdCAodGhlIGRlc3RpbmF0aW9uLCBhc1xuICAgICAgICAgICAgLy8gICB0ZXh0KSwgYmVjYXVzZSBhIGdlbmVyYXRlZCByZXNwb25zZSBjYW4gb25seSBjYXJyeSBvbmUgb25cbiAgICAgICAgICAgIC8vICAgY2xvdWRmcm9udC1qcy0yLjAuIE5vIGtub3duIGNsaWVudCByZWFkcyBpdC5cbiAgICAgICAgICAgIC8vIC0gdGhlIG9yaWdpbmFsIG9yZGVyIG9mIHRoZSBxdWVyeSBzdHJpbmcuIFRoZSBldmVudCBleHBvc2VzXG4gICAgICAgICAgICAvLyAgIFxcYHF1ZXJ5c3RyaW5nXFxgIGFzIGFuIG9iamVjdCwgbmV2ZXIgYXMgdGhlIHJhdyBzdHJpbmcsIHNvXG4gICAgICAgICAgICAvLyAgIFxcYC94Ly95P2E9MSZiPTJcXGAgcmVkaXJlY3RzIHRvIFxcYC94L3k/Yj0yJmE9MVxcYC4gVGhlIHBhaXJzIGFsbFxuICAgICAgICAgICAgLy8gICBzdXJ2aXZlOyBvbmx5IHRoZWlyIG9yZGVyIGlzIENsb3VkRnJvbnQncyByYXRoZXIgdGhhbiB0aGVcbiAgICAgICAgICAgIC8vICAgY2xpZW50J3MsIGFuZCBhIHJlZGlyZWN0IHRhcmdldCBpcyBub3Qgb3JkZXItc2Vuc2l0aXZlLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIEEgcmVwZWF0ZWQga2V5J3MgXFxgbXVsdGlWYWx1ZVxcYCBhbHJlYWR5IGhvbGRzIGl0cyBmaXJzdCB2YWx1ZSwgd2hpY2hcbiAgICAgICAgICAgIC8vIFxcYHZhbHVlXFxgIHJlcGVhdHMsIHNvIGl0IGlzIG9uZSBvciB0aGUgb3RoZXIsIG5ldmVyIGJvdGguIE5hbWVzIGFuZFxuICAgICAgICAgICAgLy8gdmFsdWVzIGFycml2ZSBhcyB0aGUgY2xpZW50IHNlbnQgdGhlbSwgc3RpbGwgcGVyY2VudC1lbmNvZGVkXG4gICAgICAgICAgICAvLyAobWVhc3VyZWQ6IFxcYD9hPSUyMGIlMjZjJnA9MSsyXFxgIHJlYWRzIGJhY2sgdW5jaGFuZ2VkKSwgc28gdGhleSBhcmVcbiAgICAgICAgICAgIC8vIGpvaW5lZCBhcy1pczsgZW5jb2RpbmcgdGhlbSBhZ2FpbiB3b3VsZCB0dXJuIFxcYCUyMFxcYCBpbnRvIFxcYCUyNTIwXFxgLlxuICAgICAgICAgICAgaWYgKC9cXFxcXFxcXHxcXFxcL1xcXFwvLy50ZXN0KHVyaSkpIHtcbiAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gdXJpLnJlcGxhY2UoL1xcXFxcXFxcL2csIFwiL1wiKS5yZXBsYWNlKC9cXFxcL1xcXFwvKy9nLCBcIi9cIik7XG4gICAgICAgICAgICAgIHZhciBxcyA9IFtdO1xuICAgICAgICAgICAgICBmb3IgKHZhciBuYW1lIGluIHJlcXVlc3QucXVlcnlzdHJpbmcpIHtcbiAgICAgICAgICAgICAgICB2YXIgcSA9IHJlcXVlc3QucXVlcnlzdHJpbmdbbmFtZV07XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlcyA9IHEubXVsdGlWYWx1ZSB8fCBbcV07XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgIHZhciB2ID0gdmFsdWVzW2ldLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgcXMucHVzaCh2ID09PSBcIlwiID8gbmFtZSA6IG5hbWUgKyBcIj1cIiArIHYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAocXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbG9jYXRpb24gPSBsb2NhdGlvbiArIFwiP1wiICsgcXMuam9pbihcIiZcIik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiAzMDgsXG4gICAgICAgICAgICAgICAgc3RhdHVzRGVzY3JpcHRpb246IFwiUGVybWFuZW50IFJlZGlyZWN0XCIsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogeyBsb2NhdGlvbjogeyB2YWx1ZTogbG9jYXRpb24gfSB9LFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnNbXCJ4LWZvcndhcmRlZC1ob3N0XCJdID0gcmVxdWVzdC5oZWFkZXJzLmhvc3Q7XG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYCksXG4gICAgICB9KTtcbiAgICAgIGFzc29jaWF0aW9ucy5wdXNoKHtcbiAgICAgICAgZXZlbnRUeXBlOiBGdW5jdGlvbkV2ZW50VHlwZS5WSUVXRVJfUkVRVUVTVCxcbiAgICAgICAgZnVuY3Rpb246IGNsb3VkRnJvbnRGbixcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gYXNzb2NpYXRpb25zO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlU3RhdGljQmVoYXZpb3JPcHRpb25zKCk6IEJlaGF2aW9yT3B0aW9ucyB7XG4gICAgY29uc3Qgc3RhdGljQmVoYXZpb3JPcHRpb25zID0gdGhpcy5wcm9wcy5vdmVycmlkZXM/LnN0YXRpY0JlaGF2aW9yT3B0aW9ucztcbiAgICBjb25zdCByZXNwb25zZUhlYWRlcnNQb2xpY3kgPVxuICAgICAgc3RhdGljQmVoYXZpb3JPcHRpb25zPy5yZXNwb25zZUhlYWRlcnNQb2xpY3kgPz9cbiAgICAgIG5ldyBSZXNwb25zZUhlYWRlcnNQb2xpY3kodGhpcywgXCJTdGF0aWNSZXNwb25zZUhlYWRlcnNQb2xpY3lcIiwge1xuICAgICAgICBzZWN1cml0eUhlYWRlcnNCZWhhdmlvcjogdGhpcy5jb21tb25TZWN1cml0eUhlYWRlcnNCZWhhdmlvcixcbiAgICAgICAgY29tbWVudDogdGhpcy5nZXRDb21tZW50KFxuICAgICAgICAgIFwiTmV4dEpTIFN0YXRpYyBSZXNwb25zZSBIZWFkZXJzIFBvbGljeVwiLFxuICAgICAgICAgIFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZSxcbiAgICAgICAgKSxcbiAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LnN0YXRpY1Jlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzLFxuICAgICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgY2FjaGVkTWV0aG9kczogQ2FjaGVkTWV0aG9kcy5DQUNIRV9HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgY2FjaGVQb2xpY3k6IENhY2hlUG9saWN5LkNBQ0hJTkdfT1BUSU1JWkVELFxuICAgICAgb3JpZ2luOiB0aGlzLnN0YXRpY09yaWdpbixcbiAgICAgIHJlc3BvbnNlSGVhZGVyc1BvbGljeSxcbiAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICAgIC4uLnN0YXRpY0JlaGF2aW9yT3B0aW9ucyxcbiAgICB9O1xuICB9XG4gIHByaXZhdGUgY3JlYXRlRHluYW1pY0JlaGF2aW9yT3B0aW9ucygpOiBCZWhhdmlvck9wdGlvbnMge1xuICAgIGNvbnN0IGR5bmFtaWNCZWhhdmlvck9wdGlvbnMgPSB0aGlzLnByb3BzLm92ZXJyaWRlcz8uZHluYW1pY0JlaGF2aW9yT3B0aW9ucztcbiAgICBjb25zdCBjYWNoZVBvbGljeVByb3BzID0gdGhpcy5wcm9wcy5vdmVycmlkZXM/LmR5bmFtaWNDYWNoZVBvbGljeVByb3BzO1xuICAgIC8vIGNyZWF0ZSBkZWZhdWx0IGNhY2hlIHBvbGljeSBpZiBub3QgcHJvdmlkZWRcbiAgICBjb25zdCBjYWNoZVBvbGljeSA9XG4gICAgICBkeW5hbWljQmVoYXZpb3JPcHRpb25zPy5jYWNoZVBvbGljeSA/P1xuICAgICAgbmV3IENhY2hlUG9saWN5KHRoaXMsIFwiRHluYW1pY0NhY2hlUG9saWN5XCIsIHtcbiAgICAgICAgLi4uKGlzQ2FjaGluZ0Rpc2FibGVkKGNhY2hlUG9saWN5UHJvcHMpXG4gICAgICAgICAgPyBESVNBQkxFRF9DQUNIRV9LRVlcbiAgICAgICAgICA6IERZTkFNSUNfQ0FDSEVfS0VZKSxcbiAgICAgICAgLy8gQSByZXNwb25zZSB3aXRoIG5vIGBDYWNoZS1Db250cm9sYCBpcyBub3QgY2FjaGVkLCB3aGljaCBpcyB3aGF0IE5leHQuanNcbiAgICAgICAgLy8gYW5kIGV2ZXJ5IGFwcCB3cml0dGVuIGZvciBpdCBhc3N1bWU6IGEgZHluYW1pYyByb3V0ZSBoYW5kbGVyIHNldHMgbm9uZS5cbiAgICAgICAgLy8gQ0RLJ3MgZGVmYXVsdCBpcyBhIGRheSwgd2hpY2ggY2FjaGVkIGAvYXBpLypgIHJlc3BvbnNlcyBhdCB0aGUgZWRnZSBmb3JcbiAgICAgICAgLy8gMjQgaG91cnMuIEFueXRoaW5nIE5leHQuanMgKm1lYW5zKiB0byBjYWNoZSAtIElTUiwgU1NHLCBhIFBQUiBzaGVsbCAtXG4gICAgICAgIC8vIHNheXMgc28gd2l0aCBgcy1tYXhhZ2VgLCB3aGljaCBgbWF4VHRsYCBzdGlsbCBob25vcnMuXG4gICAgICAgIGRlZmF1bHRUdGw6IER1cmF0aW9uLnNlY29uZHMoMCksXG4gICAgICAgIGNvbW1lbnQ6IHRoaXMuZ2V0Q29tbWVudChcbiAgICAgICAgICBcIk5leHRKUyBEeW5hbWljIENhY2hlIFBvbGljeVwiLFxuICAgICAgICAgIFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZSxcbiAgICAgICAgKSxcbiAgICAgICAgLi4uY2FjaGVQb2xpY3lQcm9wcyxcbiAgICAgIH0pO1xuICAgIGNvbnN0IHJlc3BvbnNlSGVhZGVyc1BvbGljeSA9XG4gICAgICBkeW5hbWljQmVoYXZpb3JPcHRpb25zPy5yZXNwb25zZUhlYWRlcnNQb2xpY3kgPz9cbiAgICAgIG5ldyBSZXNwb25zZUhlYWRlcnNQb2xpY3kodGhpcywgXCJEeW5hbWljUmVzcG9uc2VIZWFkZXJzUG9saWN5XCIsIHtcbiAgICAgICAgc2VjdXJpdHlIZWFkZXJzQmVoYXZpb3I6IHRoaXMuY29tbW9uU2VjdXJpdHlIZWFkZXJzQmVoYXZpb3IsXG4gICAgICAgIGNvbW1lbnQ6IHRoaXMuZ2V0Q29tbWVudChcbiAgICAgICAgICBcIk5leHRKUyBEeW5hbWljIFJlc3BvbnNlIEhlYWRlcnMgUG9saWN5XCIsXG4gICAgICAgICAgU3RhY2sub2YodGhpcykuc3RhY2tOYW1lLFxuICAgICAgICApLFxuICAgICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uZHluYW1pY1Jlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzLFxuICAgICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19BTEwsXG4gICAgICBjYWNoZVBvbGljeSxcbiAgICAgIG9yaWdpbjogdGhpcy5keW5hbWljT3JpZ2luLFxuICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeTogdGhpcy5keW5hbWljT3JpZ2luUmVzcG9uc2VQb2xpY3ksXG4gICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3ksXG4gICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogVmlld2VyUHJvdG9jb2xQb2xpY3kuUkVESVJFQ1RfVE9fSFRUUFMsXG4gICAgICAuLi5keW5hbWljQmVoYXZpb3JPcHRpb25zLFxuICAgICAgZnVuY3Rpb25Bc3NvY2lhdGlvbnM6IHRoaXMud2l0aER5bmFtaWNGdW5jdGlvbkFzc29jaWF0aW9ucyhcbiAgICAgICAgXCJkeW5hbWljQmVoYXZpb3JPcHRpb25zXCIsXG4gICAgICAgIGR5bmFtaWNCZWhhdmlvck9wdGlvbnM/LmZ1bmN0aW9uQXNzb2NpYXRpb25zLFxuICAgICAgKSxcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBUaGUgYmVoYXZpb3IncyBmdW5jdGlvbiBhc3NvY2lhdGlvbnM6IGFuIG92ZXJyaWRlJ3MsIHBsdXMgdGhlIHZpZXdlci1yZXF1ZXN0XG4gICAqIGZ1bmN0aW9uIEdsb2JhbCBGdW5jdGlvbnMgZGVwZW5kcyBvbi5cbiAgICpcbiAgICogU3ByZWFkaW5nIHRoZSBvdmVycmlkZSdzIGBmdW5jdGlvbkFzc29jaWF0aW9uc2Agb3ZlciBvdXJzIHdvdWxkIHNpbGVudGx5XG4gICAqIGRyb3AgdGhhdCBmdW5jdGlvbiwgYW5kIHdpdGggaXQgdGhlIG9ubHkgdGhpbmcgc3RhbmRpbmcgYmV0d2VlbiBhIHZpZXdlcidzXG4gICAqIG93biBgWC1Gb3J3YXJkZWQtSG9zdGAgYW5kIHRoZSBydW50aW1lLCB3aGljaCB0cnVzdHMgdGhhdCBoZWFkZXIgb24gRnVuY3Rpb25cbiAgICogVVJMIGV2ZW50cyAoYGxhbWJkYS1ldmVudC50c2ApOiBob3N0IGluamVjdGlvbiBpbnRvIHJlZGlyZWN0cyBhbmQgYWJzb2x1dGVcbiAgICogVVJMcywgY2FjaGVkIGZvciBvdGhlciB2aWV3ZXJzIGJlY2F1c2UgdGhlIGhlYWRlciBpcyBub3QgaW4gdGhlIGNhY2hlIGtleS5cbiAgICogU28gb3VycyBpcyBrZXB0LCBhbmQgYW4gb3ZlcnJpZGUgY2xhaW1pbmcgVklFV0VSX1JFUVVFU1Qg4oCUIHdoaWNoIENsb3VkRnJvbnRcbiAgICogYWxsb3dzIG9ubHkgb25lIG9mIHBlciBiZWhhdmlvciDigJQgaXMgYW4gZXJyb3IgcmF0aGVyIHRoYW4gYSByZXBsYWNlbWVudC5cbiAgICovXG4gIHByaXZhdGUgd2l0aER5bmFtaWNGdW5jdGlvbkFzc29jaWF0aW9ucyhcbiAgICBvdmVycmlkZU5hbWU6IHN0cmluZyxcbiAgICBvdmVycmlkZGVuOiBGdW5jdGlvbkFzc29jaWF0aW9uW10gfCB1bmRlZmluZWQsXG4gICk6IEZ1bmN0aW9uQXNzb2NpYXRpb25bXSB7XG4gICAgaWYgKCFvdmVycmlkZGVuKSB7XG4gICAgICByZXR1cm4gdGhpcy5keW5hbWljQ2xvdWRGcm9udEZ1bmN0aW9uQXNzb2NpYXRpb25zO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNGdW5jdGlvbkNvbXB1dGUpIHtcbiAgICAgIHJldHVybiBvdmVycmlkZGVuO1xuICAgIH1cbiAgICBjb25zdCBjbGFpbWVkID0gb3ZlcnJpZGRlbi5zb21lKFxuICAgICAgKGFzc29jaWF0aW9uKSA9PlxuICAgICAgICBhc3NvY2lhdGlvbi5ldmVudFR5cGUgPT09IEZ1bmN0aW9uRXZlbnRUeXBlLlZJRVdFUl9SRVFVRVNULFxuICAgICk7XG4gICAgaWYgKGNsYWltZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYCR7TE9HX1BSRUZJWH0gXFxgb3ZlcnJpZGVzLiR7b3ZlcnJpZGVOYW1lfS5mdW5jdGlvbkFzc29jaWF0aW9uc1xcYCBgICtcbiAgICAgICAgICBgYXNzb2NpYXRlcyBhIENsb3VkRnJvbnQgZnVuY3Rpb24gd2l0aCBgICtcbiAgICAgICAgICBgJHtGdW5jdGlvbkV2ZW50VHlwZS5WSUVXRVJfUkVRVUVTVH0sIGJ1dCBOZXh0anNHbG9iYWxGdW5jdGlvbnMgbmVlZHMgYCArXG4gICAgICAgICAgYHRoYXQgZXZlbnQgdHlwZSBmb3IgaXRzIG93biBmdW5jdGlvbiwgd2hpY2ggb3ZlcndyaXRlcyBgICtcbiAgICAgICAgICBgXFxgeC1mb3J3YXJkZWQtaG9zdFxcYCB3aXRoIHRoZSB2aWV3ZXIncyBcXGBIb3N0XFxgICh0aGUgcnVudGltZSB0cnVzdHMgYCArXG4gICAgICAgICAgYHRoYXQgaGVhZGVyIGJlaGluZCBDbG91ZEZyb250KSBhbmQgcmVkaXJlY3RzIHJlcGVhdGVkIHNsYXNoZXMuIGAgK1xuICAgICAgICAgIGBDbG91ZEZyb250IHBlcm1pdHMgb25seSBvbmUgZnVuY3Rpb24gcGVyIGV2ZW50IHR5cGUgcGVyIGJlaGF2aW9yLiBgICtcbiAgICAgICAgICBgTW92ZSB0aGUgbG9naWMgdG8gJHtGdW5jdGlvbkV2ZW50VHlwZS5WSUVXRVJfUkVTUE9OU0V9LCBvciBpbnRvIGAgK1xuICAgICAgICAgIGB0aGUgYXBwJ3MgbWlkZGxld2FyZS5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIFsuLi5vdmVycmlkZGVuLCAuLi50aGlzLmR5bmFtaWNDbG91ZEZyb250RnVuY3Rpb25Bc3NvY2lhdGlvbnNdO1xuICB9XG4gIC8qKlxuICAgKiBgX25leHQvaW1hZ2UqYCBnb2VzIHRvIHRoZSBzYW1lIG9yaWdpbiBhcyBldmVyeXRoaW5nIGVsc2Ug4oCUIHRoZSBOZXh0LmpzXG4gICAqIHNlcnZlciBvcHRpbWl6ZXMgaW1hZ2VzIGluLXByb2Nlc3Mg4oCUIGJ1dCBrZWVwcyBpdHMgb3duIGJlaGF2aW9yIGZvciB0aGVcbiAgICogY2FjaGUgcG9saWN5OiBgcXVlcnlTdHJpbmdCZWhhdmlvcjogYWxsKClgIHBsdXMgYGFjY2VwdGAgaW4gdGhlIGNhY2hlIGtleSBpc1xuICAgKiByaWdodCBmb3IgaW1hZ2UgcmVxdWVzdHMgYW5kIHdyb25nIGZvciB0aGUgcmVzdC5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlSW1hZ2VCZWhhdmlvck9wdGlvbnMoKTogQmVoYXZpb3JPcHRpb25zIHtcbiAgICBjb25zdCBpbWFnZUJlaGF2aW9yT3B0aW9ucyA9IHRoaXMucHJvcHMub3ZlcnJpZGVzPy5pbWFnZUJlaGF2aW9yT3B0aW9ucztcbiAgICAvLyBhZGQgZGVmYXVsdCBjYWNoZSBwb2xpY3kgaWYgbm90IHByb3ZpZGVkXG4gICAgY29uc3QgY2FjaGVQb2xpY3kgPVxuICAgICAgaW1hZ2VCZWhhdmlvck9wdGlvbnM/LmNhY2hlUG9saWN5ID8/XG4gICAgICBuZXcgQ2FjaGVQb2xpY3kodGhpcywgXCJJbWFnZUNhY2hlUG9saWN5XCIsIHtcbiAgICAgICAgLy8gU0VDVVJJVFkgTk9URTogYnkgZGVmYXVsdCB3ZSBkb24ndCBpbmNsdWRlIGNvb2tpZXMgaW4gY2FjaGUgZm9yXG4gICAgICAgIC8vIGltYWdlcyBiL2MgaXQgc2lnbmlmaWNhbnRseSBpbXByb3ZlcyBpbWFnZSBwZXJmIGZvciBtb3N0IHNpdGVzIEJVVFxuICAgICAgICAvLyBpZiB5b3UgaGF2ZSBwcml2YXRlIGltYWdlcyBsb2NrZWQgYmVoaW5kIGF1dGggaW1wbGVtZW50ZWQgd2l0aCBjb29raWVzXG4gICAgICAgIC8vIHlvdSBuZWVkIHRvIG92ZXJyaWRlIHRoaXMuXG4gICAgICAgIHF1ZXJ5U3RyaW5nQmVoYXZpb3I6IENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvci5hbGwoKSxcbiAgICAgICAgaGVhZGVyQmVoYXZpb3I6IENhY2hlSGVhZGVyQmVoYXZpb3IuYWxsb3dMaXN0KFwiYWNjZXB0XCIpLFxuICAgICAgICBjb29raWVCZWhhdmlvcjogQ2FjaGVDb29raWVCZWhhdmlvci5ub25lKCksXG4gICAgICAgIGVuYWJsZUFjY2VwdEVuY29kaW5nQnJvdGxpOiB0cnVlLFxuICAgICAgICBlbmFibGVBY2NlcHRFbmNvZGluZ0d6aXA6IHRydWUsXG4gICAgICAgIGNvbW1lbnQ6IHRoaXMuZ2V0Q29tbWVudChcbiAgICAgICAgICBcIk5leHRKUyBJbWFnZSBDYWNoZSBQb2xpY3lcIixcbiAgICAgICAgICBTdGFjay5vZih0aGlzKS5zdGFja05hbWUsXG4gICAgICAgICksXG4gICAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5pbWFnZUNhY2hlUG9saWN5UHJvcHMsXG4gICAgICB9KTtcbiAgICAvLyBhZGQgZGVmYXVsdCByZXNwb25zZSBoZWFkZXJzIHBvbGljeSBpZiBub3QgcHJvdmlkZWRcbiAgICBjb25zdCByZXNwb25zZUhlYWRlcnNQb2xpY3kgPVxuICAgICAgaW1hZ2VCZWhhdmlvck9wdGlvbnM/LnJlc3BvbnNlSGVhZGVyc1BvbGljeSA/P1xuICAgICAgbmV3IFJlc3BvbnNlSGVhZGVyc1BvbGljeSh0aGlzLCBcIkltYWdlUmVzcG9uc2VIZWFkZXJzUG9saWN5XCIsIHtcbiAgICAgICAgc2VjdXJpdHlIZWFkZXJzQmVoYXZpb3I6IHRoaXMuY29tbW9uU2VjdXJpdHlIZWFkZXJzQmVoYXZpb3IsXG4gICAgICAgIGNvbW1lbnQ6IHRoaXMuZ2V0Q29tbWVudChcbiAgICAgICAgICBcIk5leHRKUyBJbWFnZSBSZXNwb25zZSBIZWFkZXJzIFBvbGljeVwiLFxuICAgICAgICAgIFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZSxcbiAgICAgICAgKSxcbiAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LmltYWdlUmVzcG9uc2VIZWFkZXJzUG9saWN5UHJvcHMsXG4gICAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgYWxsb3dlZE1ldGhvZHM6IEFsbG93ZWRNZXRob2RzLkFMTE9XX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICBjYWNoZWRNZXRob2RzOiBDYWNoZWRNZXRob2RzLkNBQ0hFX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICBvcmlnaW46IHRoaXMuZHluYW1pY09yaWdpbixcbiAgICAgIG9yaWdpblJlcXVlc3RQb2xpY3k6IHRoaXMuZHluYW1pY09yaWdpblJlc3BvbnNlUG9saWN5LFxuICAgICAgY2FjaGVQb2xpY3ksXG4gICAgICByZXNwb25zZUhlYWRlcnNQb2xpY3ksXG4gICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogVmlld2VyUHJvdG9jb2xQb2xpY3kuUkVESVJFQ1RfVE9fSFRUUFMsXG4gICAgICAuLi5pbWFnZUJlaGF2aW9yT3B0aW9ucyxcbiAgICAgIGZ1bmN0aW9uQXNzb2NpYXRpb25zOiB0aGlzLndpdGhEeW5hbWljRnVuY3Rpb25Bc3NvY2lhdGlvbnMoXG4gICAgICAgIFwiaW1hZ2VCZWhhdmlvck9wdGlvbnNcIixcbiAgICAgICAgaW1hZ2VCZWhhdmlvck9wdGlvbnM/LmZ1bmN0aW9uQXNzb2NpYXRpb25zLFxuICAgICAgKSxcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIG9yIHVzZXMgdXNlciBzcGVjaWZpZWQgQ2xvdWRGcm9udCBEaXN0cmlidXRpb25cbiAgICovXG4gIHByaXZhdGUgZ2V0RGlzdHJpYnV0aW9uKCk6IERpc3RyaWJ1dGlvbiB7XG4gICAgbGV0IGRpc3RyaWJ1dGlvbjogRGlzdHJpYnV0aW9uO1xuICAgIGlmICh0aGlzLnByb3BzLmRpc3RyaWJ1dGlvbikge1xuICAgICAgZGlzdHJpYnV0aW9uID0gdGhpcy5wcm9wcy5kaXN0cmlidXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpc3RyaWJ1dGlvbiA9IG5ldyBEaXN0cmlidXRpb24odGhpcywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgICBtaW5pbXVtUHJvdG9jb2xWZXJzaW9uOiBTZWN1cml0eVBvbGljeVByb3RvY29sLlRMU19WMV8yXzIwMjEsXG4gICAgICAgIGRlZmF1bHRCZWhhdmlvcjogdGhpcy5keW5hbWljQmVoYXZpb3JPcHRpb25zLFxuICAgICAgICAvLyBiZXN0IHRvIHVzZSBIVFRQIDIgYW5kIDMgZm9yIGNvbXBhdGFiaWxpdHkgKEhUVFAgMikgYW5kIHBlcmZvcm1hbmNlIChIVFRQMylcbiAgICAgICAgLy8gQ2xvdWRGcm9udCB3aWxsIGNob29zZSBiZXN0IG9wdGlvbiBmb3IgY2xpZW50XG4gICAgICAgIGh0dHBWZXJzaW9uOiBIdHRwVmVyc2lvbi5IVFRQMl9BTkRfMyxcbiAgICAgICAgY29tbWVudDogdGhpcy5nZXRDb21tZW50KFxuICAgICAgICAgIFwiTmV4dEpTIERpc3RyaWJ1dGlvblwiLFxuICAgICAgICAgIFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZSxcbiAgICAgICAgKSxcbiAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBkaXN0cmlidXRpb247XG4gIH1cbiAgcHJpdmF0ZSBhZGREeW5hbWljQmVoYXZpb3JzKCkge1xuICAgIC8vIEltYWdlIEJlaGF2aW9yXG4gICAgdGhpcy5kaXN0cmlidXRpb24uYWRkQmVoYXZpb3IoXG4gICAgICB0aGlzLmdldFBhdGhQYXR0ZXJuKFwiX25leHQvaW1hZ2UqXCIpLFxuICAgICAgdGhpcy5pbWFnZUJlaGF2aW9yT3B0aW9ucy5vcmlnaW4sXG4gICAgICB0aGlzLmltYWdlQmVoYXZpb3JPcHRpb25zLFxuICAgICk7XG4gICAgLy8gRnVuY3Rpb24gZ3JvdXAgYmVoYXZpb3JzLCBiZWZvcmUgdGhlIGJhc2VQYXRoIGNhdGNoLWFsbCBiZWxvdyBhbmQgYWZ0ZXJcbiAgICAvLyBgX25leHQvaW1hZ2UqYCAobm8gZ3JvdXAgcGF0dGVybiBjYW4gbWF0Y2ggYW4gaW1hZ2UgcmVxdWVzdCwgYW5kIGtlZXBpbmdcbiAgICAvLyB0aGUgb3JkZXIgb2YgdGhlIHVuc3BsaXQgY2FzZSBieXRlLWlkZW50aWNhbCBpcyB3b3J0aCBtb3JlIHRoYW4gc3ltbWV0cnkpLlxuICAgIHRoaXMuYWRkRnVuY3Rpb25Hcm91cEJlaGF2aW9ycygpO1xuICAgIC8vIFJvb3QgUGF0aCBCZWhhdmlvcnNcbiAgICBpZiAodGhpcy5iYXNlUGF0aCkge1xuICAgICAgLy8gYmVjYXVzZSB3ZSBhbHJlYWR5IGhhdmUgYSBiYXNlUGF0aCB3ZSBkb24ndCB1c2UgLyBpbnN0ZWFkIHdlIHVzZSAvYmFzZS1wYXRoXG4gICAgICB0aGlzLmRpc3RyaWJ1dGlvbi5hZGRCZWhhdmlvcihcbiAgICAgICAgYC8ke3RoaXMuYmFzZVBhdGh9YCxcbiAgICAgICAgdGhpcy5keW5hbWljQmVoYXZpb3JPcHRpb25zLm9yaWdpbixcbiAgICAgICAgdGhpcy5keW5hbWljQmVoYXZpb3JPcHRpb25zLFxuICAgICAgKTtcbiAgICAgIC8vIHdoZW4gYmFzZVBhdGggaXMgc2V0LCB3ZSBlbXVsYXRlIHRoZSBcImRlZmF1bHQgYmVoYXZpb3JcIiAoKikgZm9yIHRoZSBzaXRlIGFzIGAvYmFzZS1wYXRoLypgXG4gICAgICB0aGlzLmRpc3RyaWJ1dGlvbi5hZGRCZWhhdmlvcihcbiAgICAgICAgdGhpcy5nZXRQYXRoUGF0dGVybihcIipcIiksXG4gICAgICAgIHRoaXMuZHluYW1pY0JlaGF2aW9yT3B0aW9ucy5vcmlnaW4sXG4gICAgICAgIHRoaXMuZHluYW1pY0JlaGF2aW9yT3B0aW9ucyxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGlmIG5vIGJhc2UgcGF0aCwgdGhlbiBkZWZhdWx0IGJlaGF2aW9yIHdpbGwgaGFuZGxlIGFsbCBvdGhlciBwYXRoc1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQmVmb3JlIGFueSBiZWhhdmlvciBpcyBjb21wdXRlZDogdGhlIGJ1ZGdldCBhbmQgdGhlIGBwdWJsaWMvYCBjaGVja3MgYm90aFxuICAgKiBnZW5lcmF0ZSB0aGUgZ3JvdXAgcGF0dGVybnMsIGFuZCB3b3VsZCBvdGhlcndpc2UgZmFpbCBmaXJzdCB3aXRoIGEgbGVzc1xuICAgKiB1c2VmdWwgbWVzc2FnZS5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVGdW5jdGlvbkdyb3VwUHJvcHMoKSB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMucHJvcHMuZnVuY3Rpb25Hcm91cHM/Lmxlbmd0aCAmJlxuICAgICAgIXRoaXMucHJvcHMuZnVuY3Rpb25Hcm91cEJlaGF2aW9ycz8ubGVuZ3RoXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5pc0Z1bmN0aW9uQ29tcHV0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcImBmdW5jdGlvbkdyb3Vwc2AgaXMgb25seSBzdXBwb3J0ZWQgYnkgTmV4dGpzR2xvYmFsRnVuY3Rpb25zLlwiLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEV2ZXJ5IGdyb3VwIGJlaGF2aW9yLCBmaW5hbCBwYXRoIHBhdHRlcm4gaW5jbHVkZWQsIGluIHRoZSBvcmRlclxuICAgKiB7QGxpbmsgYWRkRnVuY3Rpb25Hcm91cEJlaGF2aW9yc30gYWRkcyB0aGVtLlxuICAgKi9cbiAgcHJpdmF0ZSBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzKCkge1xuICAgIHJldHVybiAodGhpcy5wcm9wcy5mdW5jdGlvbkdyb3VwQmVoYXZpb3JzID8/IFtdKS5tYXAoKGJlaGF2aW9yKSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IHRoaXMucHJvcHMuZnVuY3Rpb25Hcm91cHM/LmZpbmQoXG4gICAgICAgIChpdCkgPT4gaXQubmFtZSA9PT0gYmVoYXZpb3IuZ3JvdXAsXG4gICAgICApO1xuICAgICAgaWYgKCFncm91cCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYCR7TE9HX1BSRUZJWH0gXFxgZnVuY3Rpb25Hcm91cEJlaGF2aW9yc1xcYCByb3V0ZXMgdG8gZnVuY3Rpb24gZ3JvdXAgYCArXG4gICAgICAgICAgICBgXCIke2JlaGF2aW9yLmdyb3VwfVwiLCB3aGljaCBpcyBub3QgaW4gXFxgZnVuY3Rpb25Hcm91cHNcXGAuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmJlaGF2aW9yLFxuICAgICAgICBncm91cCxcbiAgICAgICAgcGF0aFBhdHRlcm46IHRoaXMuZ2V0UGF0aFBhdHRlcm4oYmVoYXZpb3IucGF0dGVybiksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBPbmUgYmVoYXZpb3IgcGVyIGdyb3VwIHBhdHRlcm4sIG1vc3Qgc3BlY2lmaWMgZmlyc3QuXG4gICAqXG4gICAqIFRoZSBvcmRlciBpcyB0aGUgd2hvbGUgbWVjaGFuaXNtLiBDbG91ZEZyb250IGV2YWx1YXRlcyBiZWhhdmlvcnMgaW4gb3JkZXJcbiAgICogYW5kIHN0b3BzIGF0IHRoZSBmaXJzdCB3aG9zZSBwYXRoIHBhdHRlcm4gbWF0Y2hlcywgYW5kIGBhZGRCZWhhdmlvcmBcbiAgICogYXBwZW5kcyDigJQgc28gYGFwaS8qYCBhZGRlZCBiZWZvcmUgYGFwaS9yZXBvcnRzLypgIHdvdWxkIHN3YWxsb3cgZXZlcnlcbiAgICogcmVwb3J0IHJlcXVlc3QgYW5kIHNlbmQgaXQgdG8gYSBmdW5jdGlvbiB3aG9zZSBwYWNrYWdlIGhhcyBubyByZXBvcnRcbiAgICogZW50cnlwb2ludC4gVGhlIGFkYXB0ZXIgc29ydGVkIHRoZSBsaXN0IHdoZW4gaXQgY2hlY2tlZCBpdCBhZ2FpbnN0IGhvd1xuICAgKiBgYXNzaWduUm91dGVzVG9Hcm91cHNgIHBhY2thZ2VkIHRoZSBzYW1lIHJvdXRlcywgc28gaXQgaXMgYWRkZWQgYXMgaXQgaXMuXG4gICAqL1xuICBwcml2YXRlIGFkZEZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMoKSB7XG4gICAgY29uc3Qgb3JpZ2luUGVyR3JvdXAgPSBuZXcgTWFwPHN0cmluZywgSU9yaWdpbj4oKTtcbiAgICBmb3IgKGNvbnN0IHsgZ3JvdXAsIHBhdGhQYXR0ZXJuIH0gb2YgdGhpcy5mdW5jdGlvbkdyb3VwQmVoYXZpb3JzKCkpIHtcbiAgICAgIGxldCBvcmlnaW4gPSBvcmlnaW5QZXJHcm91cC5nZXQoZ3JvdXAubmFtZSk7XG4gICAgICBpZiAoIW9yaWdpbikge1xuICAgICAgICBvcmlnaW4gPSBGdW5jdGlvblVybE9yaWdpbi53aXRoT3JpZ2luQWNjZXNzQ29udHJvbChcbiAgICAgICAgICBncm91cC5mdW5jdGlvblVybCxcbiAgICAgICAgICB0aGlzLnByb3BzLm92ZXJyaWRlcz8uZHluYW1pY0Z1bmN0aW9uVXJsT3JpZ2luV2l0aE9BQ1Byb3BzLFxuICAgICAgICApO1xuICAgICAgICBvcmlnaW5QZXJHcm91cC5zZXQoZ3JvdXAubmFtZSwgb3JpZ2luKTtcbiAgICAgICAgdGhpcy5ncmFudEludm9rZShncm91cC5uYW1lLCBncm91cC5mdW5jdGlvblVybCk7XG4gICAgICB9XG4gICAgICAvLyBTYW1lIGJlaGF2aW9yIG9wdGlvbnMgYXMgZXZlcnkgb3RoZXIgZHluYW1pYyByb3V0ZSDigJQgb25seSB0aGUgb3JpZ2luXG4gICAgICAvLyBkaWZmZXJzLCBhbmQgaXQgaXMgcGFzc2VkIHNlcGFyYXRlbHkuXG4gICAgICBjb25zdCB7IG9yaWdpbjogX2lnbm9yZWQsIC4uLmJlaGF2aW9yT3B0aW9ucyB9ID1cbiAgICAgICAgdGhpcy5keW5hbWljQmVoYXZpb3JPcHRpb25zO1xuICAgICAgdGhpcy5kaXN0cmlidXRpb24uYWRkQmVoYXZpb3IocGF0aFBhdHRlcm4sIG9yaWdpbiwgYmVoYXZpb3JPcHRpb25zKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIGBsYW1iZGE6SW52b2tlRnVuY3Rpb25gIGZvciBDbG91ZEZyb250LCB3aGljaCBhIEZ1bmN0aW9uIFVSTCBiZWhpbmQgT0FDXG4gICAqIG5lZWRzIGJlc2lkZXMgdGhlIGBsYW1iZGE6SW52b2tlRnVuY3Rpb25VcmxgIGBGdW5jdGlvblVybE9yaWdpbmAgZ3JhbnRzLFxuICAgKiBhbmQgc2NvcGVkIHRoZSBzYW1lIHdheTogdG8gdGhpcyBkaXN0cmlidXRpb24sIGFuZCB0byBjYWxscyB0aGF0IGNvbWVcbiAgICogdGhyb3VnaCB0aGUgRnVuY3Rpb24gVVJMLlxuICAgKi9cbiAgcHJpdmF0ZSBncmFudEludm9rZShncm91cDogc3RyaW5nLCBmdW5jdGlvblVybDogSUZ1bmN0aW9uVXJsKSB7XG4gICAgbmV3IENmblBlcm1pc3Npb24odGhpcywgYEludm9rZUZ1bmN0aW9uLSR7Z3JvdXB9YCwge1xuICAgICAgYWN0aW9uOiBcImxhbWJkYTpJbnZva2VGdW5jdGlvblwiLFxuICAgICAgcHJpbmNpcGFsOiBcImNsb3VkZnJvbnQuYW1hem9uYXdzLmNvbVwiLFxuICAgICAgZnVuY3Rpb25OYW1lOiBmdW5jdGlvblVybC5mdW5jdGlvbkFybixcbiAgICAgIHNvdXJjZUFybjogdGhpcy5kaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uQXJuLFxuICAgICAgaW52b2tlZFZpYUZ1bmN0aW9uVXJsOiB0cnVlLFxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgYGFzc2V0UHJlZml4YCBwYXRoIHRoYXQgbmVlZHMgYSBiZWhhdmlvciBvZiBpdHMgb3duLCBvciBgXCJcImAgZm9yIG5vbmUuXG4gICAqXG4gICAqIEFuIGFic29sdXRlIHByZWZpeCBjb250cmlidXRlcyBpdHMgKnBhdGgqOiBcImh0dHBzOi8vY2RuLmV4YW1wbGUuY29tXCIgbmVlZHMgbm9cbiAgICogYmVoYXZpb3IsIGJ1dCBcImh0dHBzOi8vY2RuLmV4YW1wbGUuY29tL2NkblwiIGRvZXMsIGJlY2F1c2UgYG5leHQgYnVpbGRgXG4gICAqIGNvbXBpbGVzIGEgYC9jZG4vX25leHQvOnBhdGgrYCByZXdyaXRlIG9mIGl0cyBvd24gYW5kIGBuZXh0IHN0YXJ0YCBzZXJ2ZXNcbiAgICogZXZlcnkgYnVuZGxlIHVuZGVyIHRoYXQgcGF0aCDigJQgc28gYSBDRE4gZnJvbnRpbmcgdGhpcyBkaXN0cmlidXRpb24gdGhlcmUgaGFzXG4gICAqIHRvIGJlIGFuc3dlcmVkLiBBIHByZWZpeCBlcXVhbCB0byB0aGUgYGJhc2VQYXRoYCBwcmVmaXggaXMgZHJvcHBlZCDigJQgdGhhdCBpc1xuICAgKiB0aGUgTmV4dC5qcyBkZWZhdWx0IHdoZW4gYGJhc2VQYXRoYCBpcyBzZXQsIGFuZCBgX25leHQvc3RhdGljKmAgYWxyZWFkeVxuICAgKiByZXNvbHZlcyB1bmRlciBpdCwgc28gYWRkaW5nIGEgc2Vjb25kIGlkZW50aWNhbCBwYXR0ZXJuIHdvdWxkIG1ha2UgQ2xvdWRGcm9udFxuICAgKiByZWplY3QgdGhlIGRpc3RyaWJ1dGlvbi5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUFzc2V0UHJlZml4KCk6IHN0cmluZyB7XG4gICAgY29uc3QgcHJlZml4ID0gYXNzZXRQcmVmaXhQYXRoKHRoaXMucHJvcHMuYXNzZXRQcmVmaXggPz8gXCJcIik7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZUJhc2VQYXRoKHByZWZpeCkgPT09IHRoaXMuYmFzZVBhdGggPyBcIlwiIDogcHJlZml4O1xuICB9XG4gIC8qKlxuICAgKiBTZXJ2ZXMgYDxhc3NldFByZWZpeD4vX25leHQvc3RhdGljLypgIGZyb20gdGhlIHNhbWUgUzMgb2JqZWN0cyBhc1xuICAgKiBgX25leHQvc3RhdGljLypgLlxuICAgKlxuICAgKiBOZWVkZWQgYmVjYXVzZSBOZXh0LmpzIHB1dHMgYGFzc2V0UHJlZml4YCBpbiBmcm9udCBvZiBldmVyeSBidW5kbGUgVVJMIGl0XG4gICAqIGVtaXRzIHdoaWxlIHRoZSBvYmplY3RzIGtlZXAgdGhlaXIgYDxiYXNlUGF0aD4vX25leHQvc3RhdGljLy4uLmAga2V5cywgYW5kXG4gICAqIGBhc3NldFByZWZpeGAgc2l0cyBvbiB0b3Agb2YgYGJhc2VQYXRoYCByYXRoZXIgdGhhbiB1bmRlciBpdCwgc29cbiAgICogYGdldFBhdGhQYXR0ZXJuYCBpcyBkZWxpYmVyYXRlbHkgbm90IHVzZWQgaGVyZS4gV2l0aG91dCB0aGlzIGJlaGF2aW9yIHRoZVxuICAgKiByZXF1ZXN0IGZhbGxzIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgb25lLCByZWFjaGVzIHRoZSBjb21wdXRlIG9yaWdpbiwgYW5kXG4gICAqIDQwNHM6IHRoZSBkZXBsb3ltZW50IHBhY2thZ2UgY2FycmllcyBubyBgLm5leHQvc3RhdGljYCBkaXJlY3RvcnkgYXQgYWxsLlxuICAgKlxuICAgKiBBIHZpZXdlci1yZXF1ZXN0IGZ1bmN0aW9uIGRvZXMgdGhlIHJld3JpdGUgYmVjYXVzZSBhbiBTMyBvcmlnaW4ga2V5cyBvbiB0aGVcbiAgICogcmVxdWVzdCBVUkkgYW5kIGBvcmlnaW5QYXRoYCBjYW4gb25seSBwcmVwZW5kLiBUaGUgcHJlZml4IGlzIGEgc3ludGgtdGltZVxuICAgKiBsaXRlcmFsLCBzbyB0aGUgZnVuY3Rpb24gaXMgYSBmaXhlZC1sZW5ndGggc3RyaW5nIG9wZXJhdGlvbiByYXRoZXIgdGhhbiBhXG4gICAqIHBhcnNlLlxuICAgKi9cbiAgcHJpdmF0ZSBhZGRBc3NldFByZWZpeEJlaGF2aW9yKCkge1xuICAgIC8vIENsb3VkRnJvbnQgYWxsb3dzIG9uZSBmdW5jdGlvbiBwZXIgZXZlbnQgdHlwZSBwZXIgYmVoYXZpb3IsIHNvIGFuIG92ZXJyaWRlXG4gICAgLy8gdGhhdCBhbHJlYWR5IGNsYWltcyBWSUVXRVJfUkVRVUVTVCBvbiB0aGUgc3RhdGljIGJlaGF2aW9yIGNhbm5vdCBjb2V4aXN0XG4gICAgLy8gd2l0aCB0aGUgcmV3cml0ZSBiZWxvdyDigJQgdGhlIGRpc3RyaWJ1dGlvbiB3b3VsZCBzeW50aCBhbmQgdGhlbiBiZSByZWplY3RlZFxuICAgIC8vIGF0IGRlcGxveSwgbmFtaW5nIG5laXRoZXIuIFRocm93biBoZXJlIGluc3RlYWQsIHdoZXJlIGJvdGggaGFsdmVzIGFyZVxuICAgIC8vIGtub3duLlxuICAgIGNvbnN0IGNsYWltZWQgPSAoXG4gICAgICB0aGlzLnN0YXRpY0JlaGF2aW9yT3B0aW9ucy5mdW5jdGlvbkFzc29jaWF0aW9ucyA/PyBbXVxuICAgICkuc29tZShcbiAgICAgIChhc3NvY2lhdGlvbikgPT5cbiAgICAgICAgYXNzb2NpYXRpb24uZXZlbnRUeXBlID09PSBGdW5jdGlvbkV2ZW50VHlwZS5WSUVXRVJfUkVRVUVTVCxcbiAgICApO1xuICAgIGlmIChjbGFpbWVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke0xPR19QUkVGSVh9IFxcYG92ZXJyaWRlcy5zdGF0aWNCZWhhdmlvck9wdGlvbnMuZnVuY3Rpb25Bc3NvY2lhdGlvbnNcXGAgYCArXG4gICAgICAgICAgYGFscmVhZHkgYXNzb2NpYXRlcyBhIENsb3VkRnJvbnQgZnVuY3Rpb24gd2l0aCBgICtcbiAgICAgICAgICBgJHtGdW5jdGlvbkV2ZW50VHlwZS5WSUVXRVJfUkVRVUVTVH0sIGJ1dCBzZXJ2aW5nIFxcYGFzc2V0UHJlZml4XFxgIGAgK1xuICAgICAgICAgIGAoXCIke3RoaXMuYXNzZXRQcmVmaXh9XCIpIG5lZWRzIHRoYXQgZXZlbnQgdHlwZSB0byByZXdyaXRlIHRoZSByZXF1ZXN0IGAgK1xuICAgICAgICAgIGBVUkkgdG8gdGhlIG9iamVjdCdzIGtleSwgYW5kIENsb3VkRnJvbnQgcGVybWl0cyBvbmx5IG9uZSBmdW5jdGlvbiBwZXIgYCArXG4gICAgICAgICAgYGV2ZW50IHR5cGUgcGVyIGJlaGF2aW9yLiBFaXRoZXIgZHJvcCB0aGUgb3ZlcnJpZGUsIG9yIGZvbGQgaXRzIGxvZ2ljIGAgK1xuICAgICAgICAgIGBpbnRvIGEgc2luZ2xlIGZ1bmN0aW9uIGFuZCBzZXQgXFxgYXNzZXRQcmVmaXhcXGAgdG8gXCJcIiBzbyB0aGlzIGAgK1xuICAgICAgICAgIGBjb25zdHJ1Y3QgYWRkcyBubyBiZWhhdmlvciBvZiBpdHMgb3duLmAsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCByZXdyaXRlID0gbmV3IENsb3VkRnJvbnRGdW5jdGlvbih0aGlzLCBcIkFzc2V0UHJlZml4Rm5cIiwge1xuICAgICAgY29tbWVudDogdGhpcy5nZXRDb21tZW50KFxuICAgICAgICBcIk5leHRKUyBhc3NldFByZWZpeCByZXdyaXRlXCIsXG4gICAgICAgIFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZSxcbiAgICAgICksXG4gICAgICBjb2RlOiBGdW5jdGlvbkNvZGUuZnJvbUlubGluZShgXG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQpIHtcbiAgICAgICAgICB2YXIgcmVxdWVzdCA9IGV2ZW50LnJlcXVlc3Q7XG4gICAgICAgICAgcmVxdWVzdC51cmkgPSAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgdGhpcy5iYXNlUGF0aCA/IGAvJHt0aGlzLmJhc2VQYXRofWAgOiBcIlwiLFxuICAgICAgICAgICl9ICsgcmVxdWVzdC51cmkuc2xpY2UoJHt0aGlzLmFzc2V0UHJlZml4Lmxlbmd0aH0pO1xuICAgICAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgICAgICB9XG4gICAgICAgIGApLFxuICAgIH0pO1xuICAgIHRoaXMuZGlzdHJpYnV0aW9uLmFkZEJlaGF2aW9yKFxuICAgICAgYCR7dGhpcy5hc3NldFByZWZpeH0vX25leHQvc3RhdGljKmAsXG4gICAgICB0aGlzLnN0YXRpY09yaWdpbixcbiAgICAgIHtcbiAgICAgICAgLi4udGhpcy5zdGF0aWNCZWhhdmlvck9wdGlvbnMsXG4gICAgICAgIGZ1bmN0aW9uQXNzb2NpYXRpb25zOiBbXG4gICAgICAgICAgLi4uKHRoaXMuc3RhdGljQmVoYXZpb3JPcHRpb25zLmZ1bmN0aW9uQXNzb2NpYXRpb25zID8/IFtdKSxcbiAgICAgICAgICB7IGV2ZW50VHlwZTogRnVuY3Rpb25FdmVudFR5cGUuVklFV0VSX1JFUVVFU1QsIGZ1bmN0aW9uOiByZXdyaXRlIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBhZGRTdGF0aWNCZWhhdmlvcnMoKSB7XG4gICAgdGhpcy5kaXN0cmlidXRpb24uYWRkQmVoYXZpb3IoXG4gICAgICB0aGlzLmdldFBhdGhQYXR0ZXJuKFwiX25leHQvc3RhdGljKlwiKSxcbiAgICAgIHRoaXMuc3RhdGljT3JpZ2luLFxuICAgICAgdGhpcy5zdGF0aWNCZWhhdmlvck9wdGlvbnMsXG4gICAgKTtcbiAgICBpZiAodGhpcy5hc3NldFByZWZpeCkge1xuICAgICAgdGhpcy5hZGRBc3NldFByZWZpeEJlaGF2aW9yKCk7XG4gICAgfVxuICAgIGNvbnN0IHB1YmxpY1BhdGhQYXR0ZXJucyA9IHRoaXMucHVibGljUGF0aFBhdHRlcm5zKCk7XG4gICAgdGhpcy5hc3NlcnRCZWhhdmlvckJ1ZGdldChwdWJsaWNQYXRoUGF0dGVybnMubGVuZ3RoKTtcbiAgICB0aGlzLmFzc2VydE5vUHVibGljQ29sbGlzaW9ucyhwdWJsaWNQYXRoUGF0dGVybnMpO1xuICAgIGZvciAoY29uc3QgcGF0aFBhdHRlcm4gb2YgcHVibGljUGF0aFBhdHRlcm5zKSB7XG4gICAgICB0aGlzLmRpc3RyaWJ1dGlvbi5hZGRCZWhhdmlvcihcbiAgICAgICAgcGF0aFBhdHRlcm4sXG4gICAgICAgIHRoaXMuc3RhdGljT3JpZ2luLFxuICAgICAgICB0aGlzLnN0YXRpY0JlaGF2aW9yT3B0aW9ucyxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBUaGUgYmVoYXZpb3IgcGF0aCBwYXR0ZXJuIGZvciBlYWNoIHRvcC1sZXZlbCBgcHVibGljL2AgZW50cnksIGZpbmFsIGZvcm06XG4gICAqIGAvKmAgZm9yIGEgZGlyZWN0b3J5IGFuZCB0aGUgYmFzZVBhdGggcHJlZml4IGJvdGggYXBwbGllZC5cbiAgICpcbiAgICogQW4gZW50cnkgd2hvc2UgbmFtZSBoYXMgbm8gY2hhcmFjdGVyIENsb3VkRnJvbnQgY2FuIHNwZWxsIGlzIGxlZnQgb3V0LCB3aXRoXG4gICAqIGEgd2FybmluZywgcmF0aGVyIHRoYW4gZ2l2ZW4gYSBwYXR0ZXJuIG9mIG5vdGhpbmcgYnV0IHdpbGRjYXJkcy4gYNGE0L7RgtC+L2AgaXNcbiAgICogYD8/Pz8/Pz8/LypgIOKAlCBhbnkgOC1ieXRlIGZpcnN0IHNlZ21lbnQg4oCUIGFuZCBwdWJsaWMvIGJlaGF2aW9ycyBhcmUgYWRkZWRcbiAgICogYWhlYWQgb2YgZXZlcnkgY29tcHV0ZSBiZWhhdmlvciwgc28gaXQgd291bGQgc2VuZCBgL3Byb2R1Y3RzLzQyYCBhbmRcbiAgICogYC9zZXR0aW5ncy8qYCB0byBTMywgd2hpY2ggYW5zd2VycyA0MDMuIExlYXZpbmcgdGhlIGVudHJ5IG91dCBjb3N0cyBpdHMgb3duXG4gICAqIGZpbGVzIGluc3RlYWQ6IHRob3NlIHJlcXVlc3RzIHJlYWNoIHRoZSBjb21wdXRlLCB3aGljaCBkb2VzIG5vdCBoYXZlIHRoZW0sXG4gICAqIGFuZCA0MDQuIE9uZSBsaXRlcmFsIGNoYXJhY3RlciBpcyBlbm91Z2ggdG8ga2VlcCBhIHBhdHRlcm4gbmFycm93IOKAlFxuICAgKiBgPz8/Pz8/Pz8uanBnYCBvbmx5IG1hdGNoZXMgYC5qcGdgIHJlcXVlc3RzIOKAlCBzbyBvbmx5IHRoZSBhbGwtd2lsZGNhcmQgb25lc1xuICAgKiBnby5cbiAgICpcbiAgICogVGhlIGxlbmd0aCBsaW1pdCBpcyBjaGVja2VkIGhlcmUsIG9uIHRoZSBmaW5hbCBwYXR0ZXJuLCByYXRoZXIgdGhhbiBpblxuICAgKiB7QGxpbmsgdG9QYXRoUGF0dGVybn06IHRoZSBgLypgIGFuZCB0aGUgYmFzZVBhdGggY291bnQgYWdhaW5zdCBpdCB0b28sIGFuZCBhXG4gICAqIHBhdHRlcm4gdGhhdCBwYXNzZWQgd2l0aG91dCB0aGVtIGZhaWxlZCBhdCBkZXBsb3kgaW5zdGVhZC5cbiAgICovXG4gIHByaXZhdGUgcHVibGljUGF0aFBhdHRlcm5zKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBwYXR0ZXJuczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCB1bm1hdGNoYWJsZTogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHB1YmxpY0ZpbGUgb2YgdGhpcy5wcm9wcy5wdWJsaWNEaXJFbnRyaWVzKSB7XG4gICAgICBjb25zdCBuYW1lID0gdG9QYXRoUGF0dGVybihwdWJsaWNGaWxlLm5hbWUpO1xuICAgICAgaWYgKCEvW14/Ki9dLy50ZXN0KG5hbWUpKSB7XG4gICAgICAgIHVubWF0Y2hhYmxlLnB1c2goYFwiJHtwdWJsaWNGaWxlLm5hbWV9XCJgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXRoUGF0dGVybiA9IHRoaXMuZ2V0UGF0aFBhdHRlcm4oXG4gICAgICAgIHB1YmxpY0ZpbGUuaXNEaXJlY3RvcnkgPyBgJHtuYW1lfS8qYCA6IG5hbWUsXG4gICAgICApO1xuICAgICAgaWYgKHBhdGhQYXR0ZXJuLmxlbmd0aCA+IE1BWF9QQVRIX1BBVFRFUk5fTEVOR1RIKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGhlIHB1YmxpYy8gZW50cnkgXCIke3B1YmxpY0ZpbGUubmFtZX1cIiBuZWVkcyBhIGAgK1xuICAgICAgICAgICAgYCR7cGF0aFBhdHRlcm4ubGVuZ3RofS1jaGFyYWN0ZXIgQ2xvdWRGcm9udCBwYXRoIHBhdHRlcm4sIG92ZXIgYCArXG4gICAgICAgICAgICBgdGhlICR7TUFYX1BBVEhfUEFUVEVSTl9MRU5HVEh9LWNoYXJhY3RlciBgICtcbiAgICAgICAgICAgIFwibGltaXQuIFJlbmFtZSBpdCwgb3IgbW92ZSBpdCBpbnRvIGEgc3ViZGlyZWN0b3J5IG9mIHB1YmxpYy8gd2hvc2UgXCIgK1xuICAgICAgICAgICAgXCJvd24gbmFtZSBpcyBzaG9ydCBlbm91Z2guIFNlZSBcIiArXG4gICAgICAgICAgICBcImh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9Eb3dubG9hZERpc3RWYWx1ZXNDYWNoZUJlaGF2aW9yLmh0bWwjRG93bmxvYWREaXN0VmFsdWVzUGF0aFBhdHRlcm5cIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHBhdHRlcm5zLnB1c2gocGF0aFBhdHRlcm4pO1xuICAgIH1cbiAgICBpZiAodW5tYXRjaGFibGUubGVuZ3RoID4gMCkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZyhcbiAgICAgICAgYCR7TE9HX1BSRUZJWH0gVGhlc2UgdG9wLWxldmVsIHB1YmxpYy8gZW50cmllcyBoYXZlIG5vIGNoYXJhY3RlciBhIGAgK1xuICAgICAgICAgIFwiQ2xvdWRGcm9udCBwYXRoIHBhdHRlcm4gY2FuIHNwZWxsLCBzbyB0aGVpciBwYXR0ZXJuIHdvdWxkIGJlIFwiICtcbiAgICAgICAgICBcIndpbGRjYXJkcyBhbG9uZSBhbmQgd291bGQgY2FwdHVyZSBldmVyeSBhcHAgcm91dGUgb2YgdGhlIHNhbWUgXCIgK1xuICAgICAgICAgIGBsZW5ndGguIFRoZXkgZ2V0IG5vIGJlaGF2aW9yLCBzbyB0aGVpciByZXF1ZXN0cyByZWFjaCB0aGUgc2VydmVyLCBgICtcbiAgICAgICAgICBgd2hpY2ggcmVhZHMgdGhlbSBmcm9tIFMzIGluc3RlYWQ6ICR7dW5tYXRjaGFibGUuam9pbihcIiwgXCIpfS4gVG8gc2VydmUgYCArXG4gICAgICAgICAgXCJ0aGVtIGZyb20gUzMgZGlyZWN0bHksIHJlbmFtZSB0aGVtLCBvciBtb3ZlIHRoZW0gaW50byBhIHB1YmxpYy8gXCIgK1xuICAgICAgICAgIFwic3ViZGlyZWN0b3J5IHdob3NlIG5hbWUgaGFzIGF0IGxlYXN0IG9uZSBBU0NJSSBsZXR0ZXIgb3IgZGlnaXQuXCIsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcGF0dGVybnM7XG4gIH1cbiAgLyoqXG4gICAqIFJlZnVzZSBhIGdyb3VwIGJlaGF2aW9yIHRoYXQgYSBgcHVibGljL2AgYmVoYXZpb3Igd291bGQgbWFrZSB1bnJlYWNoYWJsZS5cbiAgICpcbiAgICogYHB1YmxpYy9gIGJlaGF2aW9ycyBhcmUgYWRkZWQgZmlyc3QsIGFuZCBDbG91ZEZyb250IHN0b3BzIGF0IHRoZSBmaXJzdCBtYXRjaCxcbiAgICogc28gdHdvIGNhc2VzIHNlbmQgYSBncm91cCdzIHJvdXRlIHRvIFMzIGluc3RlYWQgb2YgaXRzIGZ1bmN0aW9uIOKAlCB3aGljaCBpc1xuICAgKiB3aHkgdGhpcyBpcyBjaGVja2VkIGF0IHN5bnRoLCB3aGVyZSBib3RoIHNpZGVzIGFyZSBrbm93bjpcbiAgICogLSB0aGUgc2FtZSBwYXR0ZXJuIHR3aWNlOiBgcHVibGljL2RvY3MvYCBhbmQgYC9kb2NzLyoqYCBib3RoIGRlcGxveSBhc1xuICAgKiAgIGBkb2NzLypgLiBUaGUgc3ludGggc3VjY2VlZGVkIGFuZCBDbG91ZEZyb250IHJlamVjdGVkIHRoZSBkZXBsb3kuXG4gICAqIC0gYSBncm91cCBwYXR0ZXJuIHVuZGVyIGEgcHVibGljIGRpcmVjdG9yeTogYC9kb2NzL2d1aWRlLyoqYCBiZWhpbmRcbiAgICogICBgZG9jcy8qYCBkZXBsb3lzIGFuZCBuZXZlciBtYXRjaGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3NlcnROb1B1YmxpY0NvbGxpc2lvbnMocHVibGljUGF0aFBhdHRlcm5zOiBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHB1YmxpY1JlZ2V4ZXMgPSBwdWJsaWNQYXRoUGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PiAoe1xuICAgICAgcGF0dGVybixcbiAgICAgIHJlZ2V4OiBjbG91ZEZyb250UGF0dGVyblJlZ2V4KGAvJHtwYXR0ZXJuLnJlcGxhY2UoL15cXC8rLywgXCJcIil9YCksXG4gICAgfSkpO1xuICAgIGZvciAoY29uc3QgeyBncm91cCwgcm91dGUsIHBhdGhQYXR0ZXJuIH0gb2YgdGhpcy5mdW5jdGlvbkdyb3VwQmVoYXZpb3JzKCkpIHtcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZSA9IHB1YmxpY1BhdGhQYXR0ZXJucy5pbmNsdWRlcyhwYXRoUGF0dGVybik7XG4gICAgICAvLyBNYXRjaGluZyB0aGUgZ3JvdXAgcGF0dGVybidzIG93biB0ZXh0IGlzIGVub3VnaDogaXRzIG9ubHkgd2lsZGNhcmQgaXMgYVxuICAgICAgLy8gdHJhaWxpbmcgYCpgLCBzbyBhIHB1YmxpYyBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyB0aGUgdGV4dCB1cCB0byBhbmRcbiAgICAgIC8vIGluY2x1ZGluZyBpdCBtYXRjaGVzIGV2ZXJ5IFVSTCB0aGUgZ3JvdXAgcGF0dGVybiBkb2VzLlxuICAgICAgY29uc3Qgc2hhZG93ID0gZHVwbGljYXRlXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogcHVibGljUmVnZXhlcy5maW5kKCh7IHJlZ2V4IH0pID0+XG4gICAgICAgICAgICByZWdleC50ZXN0KGAvJHtwYXRoUGF0dGVybi5yZXBsYWNlKC9eXFwvKy8sIFwiXCIpfWApLFxuICAgICAgICAgICk7XG4gICAgICBpZiAoIWR1cGxpY2F0ZSAmJiAhc2hhZG93KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtMT0dfUFJFRklYfSBcXGBmdW5jdGlvbkdyb3Vwc1xcYCBwYXR0ZXJuIFwiJHtyb3V0ZX1cIiAoZ3JvdXAgYCArXG4gICAgICAgICAgYFwiJHtncm91cC5uYW1lfVwiKSBgICtcbiAgICAgICAgICAoZHVwbGljYXRlXG4gICAgICAgICAgICA/IGBkZXBsb3lzIGFzIHRoZSBwYXRoIHBhdHRlcm4gXCIke3BhdGhQYXR0ZXJufVwiLCB3aGljaCBhIHRvcC1sZXZlbCBgICtcbiAgICAgICAgICAgICAgYHB1YmxpYy8gZW50cnkgYWxyZWFkeSB1c2VzIOKAlCBDbG91ZEZyb250IHJlamVjdHMgYSBkaXN0cmlidXRpb24gYCArXG4gICAgICAgICAgICAgIGB3aXRoIHR3byBiZWhhdmlvcnMgb24gb25lIHBhdGggcGF0dGVybi4gYFxuICAgICAgICAgICAgOiBgZGVwbG95cyBhcyBcIiR7cGF0aFBhdHRlcm59XCIsIGJ1dCB0aGUgdG9wLWxldmVsIHB1YmxpYy8gZW50cnkgYCArXG4gICAgICAgICAgICAgIGBiZWhpbmQgXCIke3NoYWRvdyEucGF0dGVybn1cIiBpcyBtYXRjaGVkIGZpcnN0IGFuZCBzZW5kcyBldmVyeSBgICtcbiAgICAgICAgICAgICAgYHN1Y2ggcmVxdWVzdCB0byBTMywgc28gdGhlIGdyb3VwJ3MgZnVuY3Rpb24gd291bGQgbmV2ZXIgc2VlIGAgK1xuICAgICAgICAgICAgICBgdGhlbS4gYCkgK1xuICAgICAgICAgIGBNb3ZlIHRob3NlIHB1YmxpYy8gZmlsZXMgdW5kZXIgYSBkaXJlY3Rvcnkgbm8gcm91dGUgdXNlcywgb3IgYCArXG4gICAgICAgICAgYGdyb3VwIGEgZGlmZmVyZW50IHBhdGguYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDbG91ZEZyb250IGhhcyBhIHBlci1kaXN0cmlidXRpb24gY2FjaGUgYmVoYXZpb3IgcXVvdGEsIGNvdW50aW5nIHRoZSBkZWZhdWx0XG4gICAqIG9uZSDigJQgNzUgdW5sZXNzIHJhaXNlZCwgYW5kIGBtYXhDYWNoZUJlaGF2aW9yc2Agc2F5cyB3aGljaCDigJQgYW5kIHRoZXJlIGFyZVxuICAgKiB0aHJlZSB0aGluZ3MgY29tcGV0aW5nIGZvciBpdDogYHB1YmxpYy9gIGVudHJpZXMsIGZ1bmN0aW9uIGdyb3VwcywgYW5kXG4gICAqIGNkay1uZXh0anMncyBvd24gZml4ZWQgc2V0LlxuICAgKiBDaGVja2VkIGluIG9uZSBwbGFjZSBzbyB0aGUgZXJyb3IgY2FuIHNheSB3aGljaCB0byBjdXQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2Nsb3VkZnJvbnQtbGltaXRzLmh0bWwjbGltaXRzLXdlYi1kaXN0cmlidXRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzc2VydEJlaGF2aW9yQnVkZ2V0KHB1YmxpY1BhdHRlcm5zOiBudW1iZXIpIHtcbiAgICBjb25zdCBsaW1pdCA9IHRoaXMucHJvcHMubWF4Q2FjaGVCZWhhdmlvcnMgPz8gREVGQVVMVF9NQVhfQ0FDSEVfQkVIQVZJT1JTO1xuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQobGltaXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGdyb3VwUGF0dGVybnMgPSB0aGlzLmZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMoKS5sZW5ndGg7XG4gICAgLy8gVGhlIGRlZmF1bHQgYmVoYXZpb3IsIGBfbmV4dC9pbWFnZSpgLCBgX25leHQvc3RhdGljKmAsIHBsdXMg4oCUIHdpdGggYVxuICAgIC8vIGJhc2VQYXRoIOKAlCB0aGUgdHdvIHRoYXQgc3RhbmQgaW4gZm9yIHRoZSBkZWZhdWx0IGJlaGF2aW9yJ3MgY292ZXJhZ2UsIGFuZFxuICAgIC8vIOKAlCB3aXRoIGEgcGF0aC1zdHlsZSBhc3NldFByZWZpeCDigJQgdGhlIG9uZSB0aGF0IHNlcnZlcyBidW5kbGVzIHVuZGVyIGl0LlxuICAgIC8vIGB0aGlzLmJhc2VQYXRoYCwgbm90IHRoZSByYXcgcHJvcDogYGJhc2VQYXRoOiBcIi9cImAgbm9ybWFsaXplcyB0byBgXCJcImAgYW5kXG4gICAgLy8gYWRkcyBubyBiZWhhdmlvcnMsIHNvIGNvdW50aW5nIGl0IGFkZGVkIDIgdG8gdGhlIHRvdGFsIGFuZCBjb3VsZCB0aHJvd1xuICAgIC8vIFwib3ZlciB0aGUgbGltaXRcIiBvbiBhbiBhcHAgdGhhdCBpcyB1bmRlciBpdC5cbiAgICBjb25zdCBmaXhlZCA9IDMgKyAodGhpcy5iYXNlUGF0aCA/IDIgOiAwKSArICh0aGlzLmFzc2V0UHJlZml4ID8gMSA6IDApO1xuICAgIGNvbnN0IHRvdGFsID0gZml4ZWQgKyBwdWJsaWNQYXR0ZXJucyArIGdyb3VwUGF0dGVybnM7XG4gICAgaWYgKHRvdGFsIDw9IGxpbWl0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBhcnRzID0gW1xuICAgICAgYCR7Zml4ZWR9IHVzZWQgYnkgY2RrLW5leHRqcyBpdHNlbGZgLFxuICAgICAgYCR7cHVibGljUGF0dGVybnN9IGZvciB0b3AtbGV2ZWwgcHVibGljLyBlbnRyaWVzYCxcbiAgICBdO1xuICAgIGlmIChncm91cFBhdHRlcm5zKSB7XG4gICAgICBwYXJ0cy5wdXNoKGAke2dyb3VwUGF0dGVybnN9IGZvciBcXGBmdW5jdGlvbkdyb3Vwc1xcYCBwYXR0ZXJuc2ApO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhpcyBOZXh0LmpzIGFwcCBuZWVkcyAke3RvdGFsfSBDbG91ZEZyb250IGNhY2hlIGJlaGF2aW9ycywgb3ZlciB0aGUgYCArXG4gICAgICAgIGBsaW1pdCBvZiAke2xpbWl0fSBwZXIgZGlzdHJpYnV0aW9uOiAke3BhcnRzLmpvaW4oXCIsIFwiKX0uIGAgK1xuICAgICAgICBgTW92ZSBwdWJsaWMvIGZpbGVzIGludG8gYSBzaW5nbGUgdG9wLWxldmVsIGRpcmVjdG9yeSAob25lIGJlaGF2aW9yIGAgK1xuICAgICAgICBgc2VydmVzIFxcYHN0YXRpYy8qXFxgKWAgK1xuICAgICAgICAoZ3JvdXBQYXR0ZXJuc1xuICAgICAgICAgID8gYCwgYW5kIHByZWZlciBvbmUgc3VidHJlZSBwYXR0ZXJuIHBlciBmdW5jdGlvbiBncm91cCBvdmVyIHNldmVyYWwgYCArXG4gICAgICAgICAgICBgZXhhY3QgcGF0aHNgXG4gICAgICAgICAgOiBgYCkgK1xuICAgICAgICBgLiBJZiB5b3VyIGFjY291bnQncyBxdW90YSBpcyBoaWdoZXIgdGhhbiAke2xpbWl0fSwgc2V0IGAgK1xuICAgICAgICBgXFxgbWF4Q2FjaGVCZWhhdmlvcnNcXGAgdG8gaXQuIFNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY2xvdWRmcm9udC1saW1pdHMuaHRtbCNsaW1pdHMtd2ViLWRpc3RyaWJ1dGlvbnNgLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIE9wdGlvbmFsbHkgcHJlcGVuZHMgYmFzZSBwYXRoIHRvIGdpdmVuIHBhdGggcGF0dGVybi5cbiAgICpcbiAgICogQSB0cmFpbGluZyBzbGFzaCBvbiBgcGF0aFBhdHRlcm5gIGlzIGxvYWQtYmVhcmluZyBhbmQgc3Vydml2ZXMsIHdoaWNoIGlzIHdoeVxuICAgKiB0aGlzIGNvbmNhdGVuYXRlcyByYXRoZXIgdGhhbiBnb2luZyB0aHJvdWdoIGBqb2luUGF0aGAuIFRoZSBidWlsZCdzXG4gICAqIGBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzYCBob2xkIGJvdGggXCJwcmljaW5nXCIgYW5kIFwicHJpY2luZy9cIiBmb3IgYVxuICAgKiBgdHJhaWxpbmdTbGFzaGAgYXBwLCBhbmQgbm9ybWFsaXppbmcgdGhlIHNlY29uZCBvbmUgY29sbGFwc2VkIGl0IG9udG8gdGhlXG4gICAqIGZpcnN0OiBgYWRkQmVoYXZpb3JgIHdhc1xuICAgKiB0aGVuIGNhbGxlZCB0d2ljZSB3aXRoIGAvYmFzZS9wcmljaW5nYCwgd2hpY2ggQ2xvdWRGcm9udCByZWplY3RzIGF0IGRlcGxveVxuICAgKiAoXCJtb3JlIHRoYW4gb25lIGNhY2hlIGJlaGF2aW9yIGhhcyB0aGUgc2FtZSBwYXRoIHBhdHRlcm5cIiksIGFuZCB0aGVcbiAgICogY2Fub25pY2FsIGAvYmFzZS9wcmljaW5nL2Agd2FzIGxlZnQgdG8gdGhlIGAvYmFzZS8qYCBjYXRjaC1hbGwg4oCUIHRoZSBtaXNyb3V0ZVxuICAgKiB0aGUgc2Vjb25kIHBhdHRlcm4gZXhpc3RzIHRvIHByZXZlbnQuXG4gICAqL1xuICBwcml2YXRlIGdldFBhdGhQYXR0ZXJuKHBhdGhQYXR0ZXJuOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuYmFzZVBhdGgpIHtcbiAgICAgIHJldHVybiBwYXRoUGF0dGVybjtcbiAgICB9XG4gICAgcmV0dXJuIGAvJHt0aGlzLmJhc2VQYXRofS8ke3BhdGhQYXR0ZXJuLnJlcGxhY2UoL15cXC8rLywgXCJcIil9YDtcbiAgfVxufVxuXG4vKipcbiAqIFdoZXRoZXIgYGR5bmFtaWNDYWNoZVBvbGljeVByb3BzYCB0dXJucyB0aGUgZHluYW1pYyBjYWNoZSBvZmYsIGJ5IGNhcHBpbmcgZXZlcnlcbiAqIFRUTCBhdCAwLlxuICpcbiAqIENsb3VkRnJvbnQgcmVqZWN0cyBhIHBvbGljeSB0aGF0IGNhY2hlcyBub3RoaW5nIGJ1dCBzdGlsbCBoYXMgYSBjYWNoZSBrZXlcbiAqIChcIkhlYWRlckJlaGF2aW9yIGlzIGludmFsaWQgZm9yIHBvbGljeSB3aXRoIGNhY2hpbmcgZGlzYWJsZWRcIiksIHNvIHN1Y2ggYVxuICogcG9saWN5IGhhcyB0byBkcm9wIHRoZSBrZXkuIFVudGlsIHRoZSBkZWZhdWx0IFRUTCBiZWNhbWUgMCB0aGlzIGNvdWxkIG5vdFxuICogY29tZSB1cDogQ0RLIHJhaXNlcyBgbWF4VHRsYCB0byBgZGVmYXVsdFR0bGAgd2hlbiBpdCBpcyBsb3dlciwgc28gYW4gb3ZlcnJpZGVcbiAqIG9mIGBtYXhUdGw6IDBgIHN5bnRoZXNpemVkIGFzIGEgZGF5IGFuZCBkZXBsb3llZC4gTm93IGl0IGlzIGhvbm9yZWQsIGFuZFxuICogd2l0aG91dCB0aGlzIHRoZSB1cGdyYWRlIGRlcGxveSB3b3VsZCBmYWlsLlxuICpcbiAqIFRoZSBUVExzIGFyZSByZXNvbHZlZCB0aGUgd2F5IENESyByZXNvbHZlcyB0aGVtOiBgZGVmYXVsdFR0bGAgcmFpc2VkIHRvXG4gKiBgbWluVHRsYCwgdGhlbiBgbWF4VHRsYCByYWlzZWQgdG8gYGRlZmF1bHRUdGxgLiBDaGVja2luZyBgbWF4VHRsYCBhbG9uZSBjYWxsZWRcbiAqIGB7IG1heFR0bDogMCwgZGVmYXVsdFR0bDogMWggfWAgZGlzYWJsZWQsIGRyb3BwZWQgdGhlIGtleSwgYW5kIENESyB0aGVuXG4gKiBzeW50aGVzaXplZCBhIHBvbGljeSB0aGF0IGNhY2hlcyBmb3IgYW4gaG91ciBrZXllZCBvbiBub3RoaW5nIOKAlCBvbmUgdmlld2VyJ3NcbiAqIHBhZ2Ugc2VydmVkIHRvIGV2ZXJ5IHZpZXdlci5cbiAqL1xuZnVuY3Rpb24gaXNDYWNoaW5nRGlzYWJsZWQocHJvcHM6IENhY2hlUG9saWN5UHJvcHMgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgY29uc3QgdHRscyA9IFtwcm9wcz8ubWF4VHRsLCBwcm9wcz8uZGVmYXVsdFR0bCwgcHJvcHM/Lm1pblR0bF07XG4gIGlmIChwcm9wcz8ubWF4VHRsID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTsgLy8gQ0RLJ3MgZGVmYXVsdCBpcyBhIHllYXJcbiAgcmV0dXJuIHR0bHMuZXZlcnkoXG4gICAgKHR0bCkgPT5cbiAgICAgIHR0bCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAoIVRva2VuLmlzVW5yZXNvbHZlZCh0dGwudG9TdHJpbmcoKSkgJiYgdHRsLnRvU2Vjb25kcygpID09PSAwKSxcbiAgKTtcbn1cblxuLyoqIFRoZSBjYWNoZS1rZXkgaGFsZiBvZiB7QGxpbmsgQ2FjaGVQb2xpY3lQcm9wc30uICovXG5pbnRlcmZhY2UgQ2FjaGVLZXlQcm9wcyB7XG4gIHJlYWRvbmx5IHF1ZXJ5U3RyaW5nQmVoYXZpb3I6IENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvcjtcbiAgcmVhZG9ubHkgaGVhZGVyQmVoYXZpb3I6IENhY2hlSGVhZGVyQmVoYXZpb3I7XG4gIHJlYWRvbmx5IGNvb2tpZUJlaGF2aW9yOiBDYWNoZUNvb2tpZUJlaGF2aW9yO1xuICByZWFkb25seSBlbmFibGVBY2NlcHRFbmNvZGluZ0Jyb3RsaTogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZW5hYmxlQWNjZXB0RW5jb2RpbmdHemlwOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFdoYXQgdGhlIGR5bmFtaWMgY2FjaGUgcG9saWN5IGtleXMgb246IGV2ZXJ5IHJlcXVlc3QgaW5wdXQgYSBOZXh0LmpzIHJlc3BvbnNlXG4gKiB2YXJpZXMgYnkuXG4gKi9cbmNvbnN0IERZTkFNSUNfQ0FDSEVfS0VZOiBDYWNoZUtleVByb3BzID0ge1xuICBxdWVyeVN0cmluZ0JlaGF2aW9yOiBDYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IuYWxsKCksXG4gIGhlYWRlckJlaGF2aW9yOiBDYWNoZUhlYWRlckJlaGF2aW9yLmFsbG93TGlzdChcbiAgICAvLyBOT1RFOiBDbG91ZEZyb250IEN1c3RvbSBDYWNoZSBQb2xpY2llcyBoYXZlIHNvZnQgbWF4IG9mIDEwIGhlYWRlcnNcbiAgICAvLyBjZGstbmV4dGpzIGluY2x1ZGVzIHRoZSBtb3N0IGVzc2VudGlhbCBoZWFkZXJzIGZvciBOZXh0LmpzIGZ1bmN0aW9uYWxpdHlcbiAgICAvLyBhbmQgbGVhdmVzIG91dCB0aGUgb25lIGNvbW1lbnRlZCBvdXQgYmVsb3c7IGtleWluZyBvbiBpdCBhcyB3ZWxsIG5lZWRzIGFcbiAgICAvLyBxdW90YSBpbmNyZWFzZVxuICAgIC8vIG1vcmUgaGVyZTogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2Nsb3VkZnJvbnQtbGltaXRzLmh0bWwjbGltaXRzLXBvbGljaWVzXG4gICAgXCJhY2NlcHRcIiwgLy8gY29udGVudCBuZWdvdGlhdGlvbiAoSFRNTCB2cyBSU0MgcGF5bG9hZClcbiAgICBcInJzY1wiLCAvLyBSZWFjdCBTZXJ2ZXIgQ29tcG9uZW50cyByZXF1ZXN0c1xuICAgIFwibmV4dC11cmxcIiwgLy8gTmV4dC5qcyByb3V0aW5nXG4gICAgXCJuZXh0LXJvdXRlci1zdGF0ZS10cmVlXCIsIC8vIEFwcCBSb3V0ZXIgbmF2aWdhdGlvbiBzdGF0ZVxuICAgIFwibmV4dC1yb3V0ZXItcHJlZmV0Y2hcIiwgLy8gcHJlZmV0Y2ggYmVoYXZpb3JcbiAgICBcIm5leHQtcm91dGVyLXNlZ21lbnQtcHJlZmV0Y2hcIiwgLy8gc2VnbWVudC1sZXZlbCBwcmVmZXRjaGluZ1xuICAgIFwieC1wcmVyZW5kZXItcmV2YWxpZGF0ZVwiLCAvLyBvbi1kZW1hbmQgSVNSIHJldmFsaWRhdGlvblxuICAgIC8vIERyYWZ0IG1vZGUgbmVlZHMgbm8gaGVhZGVyOiBpdCBpcyB0aGUgYF9fcHJlcmVuZGVyX2J5cGFzc2AgY29va2llLCB3aGljaFxuICAgIC8vIGBjb29raWVCZWhhdmlvci5hbGwoKWAgYWxyZWFkeSBrZXlzIG9uLlxuICAgIC8vIFwieC1wcmVyZW5kZXItcmV2YWxpZGF0ZS1pZi1nZW5lcmF0ZWRcIiwgLy8gY29uZGl0aW9uYWwgcmV2YWxpZGF0aW9uIChuaWNoZSB1c2UgY2FzZSlcbiAgKSxcbiAgY29va2llQmVoYXZpb3I6IENhY2hlQ29va2llQmVoYXZpb3IuYWxsKCksXG4gIGVuYWJsZUFjY2VwdEVuY29kaW5nQnJvdGxpOiB0cnVlLFxuICBlbmFibGVBY2NlcHRFbmNvZGluZ0d6aXA6IHRydWUsXG59O1xuXG4vKipcbiAqIEEgY2FjaGUga2V5IG9mIG5vdGhpbmcsIGZvciBhIHBvbGljeSB0aGF0IGNhY2hlcyBub3RoaW5nLiBGb3J3YXJkaW5nIGlzXG4gKiB1bmFmZmVjdGVkOiB0aGUgZHluYW1pYyBvcmlnaW4gcmVxdWVzdCBwb2xpY3kgc2VuZHMgZXZlcnkgdmlld2VyIGhlYWRlcixcbiAqIGNvb2tpZSBhbmQgcXVlcnkgc3RyaW5nIHJlZ2FyZGxlc3MuXG4gKi9cbmNvbnN0IERJU0FCTEVEX0NBQ0hFX0tFWTogQ2FjaGVLZXlQcm9wcyA9IHtcbiAgcXVlcnlTdHJpbmdCZWhhdmlvcjogQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLm5vbmUoKSxcbiAgaGVhZGVyQmVoYXZpb3I6IENhY2hlSGVhZGVyQmVoYXZpb3Iubm9uZSgpLFxuICBjb29raWVCZWhhdmlvcjogQ2FjaGVDb29raWVCZWhhdmlvci5ub25lKCksXG4gIGVuYWJsZUFjY2VwdEVuY29kaW5nQnJvdGxpOiBmYWxzZSxcbiAgZW5hYmxlQWNjZXB0RW5jb2RpbmdHemlwOiBmYWxzZSxcbn07XG5cbi8qKlxuICogQ2xvdWRGcm9udCdzIGRlZmF1bHQgXCJDYWNoZSBiZWhhdmlvcnMgcGVyIGRpc3RyaWJ1dGlvblwiIHF1b3RhLCB0aGUgZGVmYXVsdFxuICogYmVoYXZpb3IgaW5jbHVkZWQuIEFkanVzdGFibGUsIGhlbmNlIGBtYXhDYWNoZUJlaGF2aW9yc2AuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY2xvdWRmcm9udC1saW1pdHMuaHRtbCNsaW1pdHMtd2ViLWRpc3RyaWJ1dGlvbnNcbiAqL1xuY29uc3QgREVGQVVMVF9NQVhfQ0FDSEVfQkVIQVZJT1JTID0gNzU7XG5cbi8qKlxuICogV2hldGhlciBgY2hhcmAgaXMgaW4gQ2xvdWRGcm9udCdzIHBhdGggcGF0dGVybiBhbHBoYWJldDogdGhlIGxpdGVyYWxzLCBwbHVzIHRoZVxuICogYCpgIGFuZCBgP2Agd2lsZGNhcmRzLiBObyBzcGFjZSwgbm8gYCVgLCBub3RoaW5nIG5vbi1BU0NJSS5cbiAqL1xuZnVuY3Rpb24gaXNQYXRoUGF0dGVybkNoYXIoY2hhcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBjaGFyID09PSBcIipcIiB8fCBjaGFyID09PSBcIj9cIiB8fCBQQVRIX1BBVFRFUk5fTElURVJBTC50ZXN0KGNoYXIpO1xufVxuLyoqIENsb3VkRnJvbnQncyBwYXRoIHBhdHRlcm4gbGVuZ3RoIGxpbWl0LiAqL1xuY29uc3QgTUFYX1BBVEhfUEFUVEVSTl9MRU5HVEggPSAyNTU7XG5cbi8qKlxuICogQSBgcHVibGljL2AgZW50cnkncyBuYW1lIGFzIGEgQ2xvdWRGcm9udCBwYXRoIHBhdHRlcm4uXG4gKlxuICogYHB1YmxpYy9oZWxsbyB3b3JsZC5qcGdgIGlzIGEgdmFsaWQgTmV4dC5qcyBhc3NldCDigJQgYG5leHQgc3RhcnRgIHNlcnZlcyBpdCwgYW5kXG4gKiBgbmV4dC9pbWFnZWAgcG9pbnRzIGF0IGl0IOKAlCBidXQgYSBzcGFjZSBjYW5ub3QgYXBwZWFyIGluIGEgcGF0aCBwYXR0ZXJuLCBzb1xuICogY2RrLW5leHRqcyB1c2VkIHRvIHRocm93IGF0IHN5bnRoIGFuZCB0aGUgYXBwIGNvdWxkIG5vdCBiZSBkZXBsb3llZCBhdCBhbGxcbiAqIChgbmV4dC1pbWFnZS1sZWdhY3kvdW5pY29kZWAsIHdob3NlIGBwdWJsaWMvYCBhbHNvIGhvbGRzIGDDpMO2w7zFocSNxZnDrS5wbmdgKS5cbiAqXG4gKiBDbG91ZEZyb250IFVSTC1kZWNvZGVzIHRoZSByZXF1ZXN0IHBhdGggYmVmb3JlIG1hdGNoaW5nIGl0LCBzbyB0aGUgcGF0dGVybiBpc1xuICogbWF0Y2hlZCBhZ2FpbnN0IGBoZWxsbyB3b3JsZC5qcGdgLCBub3QgdGhlIGAvaGVsbG8lMjB3b3JsZC5qcGdgIG9uIHRoZSB3aXJlLlxuICogRWFjaCBjaGFyYWN0ZXIgb3V0c2lkZSB0aGUgYWxwaGFiZXQgaXMgcmVwbGFjZWQgYnkgb25lIGA/YCBwZXIgYnl0ZSBvZiBpdHNcbiAqIFVURi04IGVuY29kaW5nLCBiZWNhdXNlIHRoYXQgaXMgd2hhdCBgP2AgbWF0Y2hlczogYGhlbGxvP3dvcmxkLmpwZ2AgZm9yIHRoZVxuICogc3BhY2UsIGFuZCB0d28gYD9gIGZvciBlYWNoIGNoYXJhY3RlciBvZiBgw6TDtsO8xaHEjcWZw60ucG5nYC4gTWVhc3VyZWQgYWdhaW5zdCBhXG4gKiBkZXBsb3llZCBkaXN0cmlidXRpb247IGEgYD9gIHBlciAqcGVyY2VudC1lbmNvZGVkKiBjaGFyYWN0ZXIgKGBoZWxsbz8/P3dvcmxkYClcbiAqIHN5bnRoZXNpemVzIGZpbmUgYW5kIG5ldmVyIG1hdGNoZXMuIEEgYCpgIHdvdWxkIGJlIHNob3J0ZXIgYW5kIG11Y2ggd2lkZXI6XG4gKiBgw6TDtsO8xaHEjcWZw60ucG5nYCB3b3VsZCBiZWNvbWUgYCoucG5nYCwgd2hpY2ggd291bGQgcHVsbCBldmVyeSBgLnBuZ2AgcmVxdWVzdCBpblxuICogdGhlIGFwcCBvbnRvIHRoZSBzdGF0aWMgb3JpZ2luLlxuICovXG5mdW5jdGlvbiB0b1BhdGhQYXR0ZXJuKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBbLi4ubmFtZV1cbiAgICAubWFwKChjaGFyKSA9PlxuICAgICAgaXNQYXRoUGF0dGVybkNoYXIoY2hhcilcbiAgICAgICAgPyBjaGFyXG4gICAgICAgIDogXCI/XCIucmVwZWF0KEJ1ZmZlci5ieXRlTGVuZ3RoKGNoYXIsIFwidXRmOFwiKSksXG4gICAgKVxuICAgIC5qb2luKFwiXCIpO1xufVxuIl19
|
|
@@ -18,7 +18,7 @@ const base_path_1 = require("./utils/base-path");
|
|
|
18
18
|
* current build id AND are older than `msTtl`
|
|
19
19
|
*/
|
|
20
20
|
class NextjsPostDeploy extends constructs_1.Construct {
|
|
21
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsPostDeploy", version: "0.7.
|
|
21
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsPostDeploy", version: "0.7.11" };
|
|
22
22
|
customResource;
|
|
23
23
|
lambdaFunction;
|
|
24
24
|
props;
|
|
@@ -29,7 +29,7 @@ function staticAssetsObjectsPattern(keyPrefix) {
|
|
|
29
29
|
* Creates S3 Bucket for public and _next/static assets and deploys them using S3Deployment.
|
|
30
30
|
*/
|
|
31
31
|
class NextjsStaticAssets extends constructs_1.Construct {
|
|
32
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsStaticAssets", version: "0.7.
|
|
32
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsStaticAssets", version: "0.7.11" };
|
|
33
33
|
bucket;
|
|
34
34
|
deployment;
|
|
35
35
|
/**
|
|
@@ -15,7 +15,7 @@ const base_path_1 = require("../utils/base-path");
|
|
|
15
15
|
* Base class for all Next.js root constructs
|
|
16
16
|
*/
|
|
17
17
|
class NextjsBaseConstruct extends constructs_1.Construct {
|
|
18
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsBaseConstruct", version: "0.7.
|
|
18
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsBaseConstruct", version: "0.7.11" };
|
|
19
19
|
nextjsBuild;
|
|
20
20
|
nextjsStaticAssets;
|
|
21
21
|
nextjsCache;
|
|
@@ -14,7 +14,7 @@ const base_path_1 = require("../utils/base-path");
|
|
|
14
14
|
* for containers.
|
|
15
15
|
*/
|
|
16
16
|
class NextjsGlobalContainers extends nextjs_base_construct_1.NextjsBaseConstruct {
|
|
17
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsGlobalContainers", version: "0.7.
|
|
17
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsGlobalContainers", version: "0.7.11" };
|
|
18
18
|
nextjsContainers;
|
|
19
19
|
nextjsDistribution;
|
|
20
20
|
nextjsPostDeploy;
|
|
@@ -17,7 +17,7 @@ const base_path_1 = require("../utils/base-path");
|
|
|
17
17
|
* for functions.
|
|
18
18
|
*/
|
|
19
19
|
class NextjsGlobalFunctions extends nextjs_base_construct_1.NextjsBaseConstruct {
|
|
20
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsGlobalFunctions", version: "0.7.
|
|
20
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsGlobalFunctions", version: "0.7.11" };
|
|
21
21
|
nextjsFunctions;
|
|
22
22
|
nextjsDistribution;
|
|
23
23
|
nextjsPostDeploy;
|
|
@@ -13,7 +13,7 @@ const base_path_1 = require("../utils/base-path");
|
|
|
13
13
|
* for containers.
|
|
14
14
|
*/
|
|
15
15
|
class NextjsRegionalContainers extends nextjs_base_construct_1.NextjsBaseConstruct {
|
|
16
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsRegionalContainers", version: "0.7.
|
|
16
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsRegionalContainers", version: "0.7.11" };
|
|
17
17
|
nextjsContainers;
|
|
18
18
|
nextjsPostDeploy;
|
|
19
19
|
/**
|
|
@@ -11,7 +11,7 @@ const nextjs_base_construct_1 = require("./nextjs-base-construct");
|
|
|
11
11
|
* for routing requests and AWS Lambda Functions for server-side rendering.
|
|
12
12
|
*/
|
|
13
13
|
class NextjsRegionalFunctions extends nextjs_base_construct_1.NextjsBaseConstruct {
|
|
14
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsRegionalFunctions", version: "0.7.
|
|
14
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsRegionalFunctions", version: "0.7.11" };
|
|
15
15
|
nextjsFunctions;
|
|
16
16
|
nextjsApi;
|
|
17
17
|
nextjsPostDeploy;
|