cdk-nextjs 0.7.12 → 0.7.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/.jsii +346 -100
  2. package/.jsii.tabl.json +1 -1
  3. package/API.md +208 -0
  4. package/README.md +115 -100
  5. package/docs/breaking-changes.md +4 -2
  6. package/docs/development-guide.md +10 -0
  7. package/docs/harness-coverage.md +16 -6
  8. package/docs/next-build-output-guide.md +1 -1
  9. package/lib/adapter/adapter.mjs +4 -1
  10. package/lib/generated-structs/OptionalNextjsApiProps.d.ts +6 -0
  11. package/lib/generated-structs/OptionalNextjsApiProps.js +1 -1
  12. package/lib/generated-structs/OptionalNextjsDistributionProps.d.ts +27 -0
  13. package/lib/generated-structs/OptionalNextjsDistributionProps.js +1 -1
  14. package/lib/nextjs-api.d.ts +11 -0
  15. package/lib/nextjs-api.js +63 -9
  16. package/lib/nextjs-api.test.js +127 -1
  17. package/lib/nextjs-build/nextjs-build.js +1 -1
  18. package/lib/nextjs-cache.js +1 -1
  19. package/lib/nextjs-compute/nextjs-containers.js +1 -1
  20. package/lib/nextjs-compute/nextjs-functions.js +1 -1
  21. package/lib/nextjs-distribution.d.ts +92 -2
  22. package/lib/nextjs-distribution.js +223 -109
  23. package/lib/nextjs-distribution.test.js +492 -12
  24. package/lib/nextjs-post-deploy.js +1 -1
  25. package/lib/nextjs-static-assets.js +1 -1
  26. package/lib/nextjs-static-assets.test.js +19 -7
  27. package/lib/root-constructs/nextjs-base-construct.d.ts +7 -0
  28. package/lib/root-constructs/nextjs-base-construct.js +14 -2
  29. package/lib/root-constructs/nextjs-global-containers.d.ts +16 -1
  30. package/lib/root-constructs/nextjs-global-containers.js +5 -2
  31. package/lib/root-constructs/nextjs-global-functions.d.ts +16 -1
  32. package/lib/root-constructs/nextjs-global-functions.js +5 -2
  33. package/lib/root-constructs/nextjs-regional-containers.js +1 -1
  34. package/lib/root-constructs/nextjs-regional-functions.js +3 -2
  35. package/lib/runtime/lambda.mjs +4 -1
  36. package/lib/runtime/server.mjs +4 -1
  37. package/lib/utils/viewer-request-functions.d.ts +53 -0
  38. package/lib/utils/viewer-request-functions.js +172 -0
  39. package/lib/utils/viewer-request-functions.test.d.ts +1 -0
  40. package/lib/utils/viewer-request-functions.test.js +43 -0
  41. package/package.json +4 -1
  42. package/scripts/e2e-harness/README.md +10 -8
  43. package/scripts/e2e-harness/app.js +7 -2
  44. package/scripts/render-diagrams.mjs +121 -0
@@ -4,6 +4,9 @@ const node_vm_1 = require("node:vm");
4
4
  const aws_cdk_lib_1 = require("aws-cdk-lib");
5
5
  const assertions_1 = require("aws-cdk-lib/assertions");
6
6
  const aws_cloudfront_1 = require("aws-cdk-lib/aws-cloudfront");
7
+ const aws_cloudfront_origins_1 = require("aws-cdk-lib/aws-cloudfront-origins");
8
+ const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
9
+ const aws_elasticloadbalancingv2_1 = require("aws-cdk-lib/aws-elasticloadbalancingv2");
7
10
  const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
8
11
  const aws_s3_1 = require("aws-cdk-lib/aws-s3");
9
12
  const function_groups_1 = require("./adapter/function-groups");
@@ -71,6 +74,137 @@ describe("NextjsDistribution function group behaviors", () => {
71
74
  new nextjs_distribution_1.NextjsDistribution(stack, "Distribution", distributionProps);
72
75
  expect(pathPatterns(stack)).toEqual(["_next/static*", "_next/image*"]);
73
76
  });
77
+ describe("service workers", () => {
78
+ const serviceWorkerPolicy = (stack) => {
79
+ const config = Object.values(assertions_1.Template.fromStack(stack).findResources("AWS::CloudFront::Distribution"))[0].Properties.DistributionConfig;
80
+ const behavior = config.CacheBehaviors.find(({ PathPattern }) => PathPattern.includes("service-worker"));
81
+ const policies = assertions_1.Template.fromStack(stack).findResources("AWS::CloudFront::ResponseHeadersPolicy");
82
+ return policies[behavior.ResponseHeadersPolicyId.Ref].Properties
83
+ .ResponseHeadersPolicyConfig;
84
+ };
85
+ it("sends Service-Worker-Allowed from a behavior ahead of _next/static*", () => {
86
+ // CloudFront stops at the first match, so after `_next/static*` it would
87
+ // never be reached.
88
+ const { stack, distributionProps } = setup([]);
89
+ new nextjs_distribution_1.NextjsDistribution(stack, "Distribution", {
90
+ ...distributionProps,
91
+ serviceWorkerAllowed: "/",
92
+ });
93
+ expect(pathPatterns(stack)).toEqual([
94
+ "_next/static/service-worker/*",
95
+ "_next/static*",
96
+ "_next/image*",
97
+ ]);
98
+ const policy = serviceWorkerPolicy(stack);
99
+ expect(policy.CustomHeadersConfig.Items).toEqual([
100
+ { Header: "Service-Worker-Allowed", Value: "/", Override: true },
101
+ ]);
102
+ // The security headers the other static behaviors send.
103
+ expect(policy.SecurityHeadersConfig.StrictTransportSecurity).toBeDefined();
104
+ });
105
+ it("prefixes the pattern with basePath", () => {
106
+ const { stack, distributionProps } = setup([], { basePath: "/base" });
107
+ new nextjs_distribution_1.NextjsDistribution(stack, "Distribution", {
108
+ ...distributionProps,
109
+ serviceWorkerAllowed: "/base",
110
+ });
111
+ expect(pathPatterns(stack)[0]).toBe("/base/_next/static/service-worker/*");
112
+ expect(serviceWorkerPolicy(stack).CustomHeadersConfig.Items).toEqual([
113
+ { Header: "Service-Worker-Allowed", Value: "/base", Override: true },
114
+ ]);
115
+ });
116
+ it("adds no behavior without service workers", () => {
117
+ const { stack, distributionProps } = setup([]);
118
+ new nextjs_distribution_1.NextjsDistribution(stack, "Distribution", distributionProps);
119
+ expect(pathPatterns(stack)).not.toContain("_next/static/service-worker/*");
120
+ });
121
+ it("keeps staticResponseHeadersPolicyProps, its custom headers included", () => {
122
+ const { stack, distributionProps } = setup([]);
123
+ new nextjs_distribution_1.NextjsDistribution(stack, "Distribution", {
124
+ ...distributionProps,
125
+ serviceWorkerAllowed: "/",
126
+ overrides: {
127
+ staticResponseHeadersPolicyProps: {
128
+ responseHeadersPolicyName: "static",
129
+ customHeadersBehavior: {
130
+ customHeaders: [{ header: "X-Team", value: "a", override: true }],
131
+ },
132
+ },
133
+ },
134
+ });
135
+ const policy = serviceWorkerPolicy(stack);
136
+ // Names are unique per account, so it can't share the static policy's.
137
+ expect(policy.Name).toBe("static-sw");
138
+ expect(policy.CustomHeadersConfig.Items).toEqual([
139
+ { Header: "X-Team", Value: "a", Override: true },
140
+ { Header: "Service-Worker-Allowed", Value: "/", Override: true },
141
+ ]);
142
+ });
143
+ it("keeps a suffixed policy name within CloudFront's 128 characters", () => {
144
+ const { stack, distributionProps } = setup([]);
145
+ new nextjs_distribution_1.NextjsDistribution(stack, "Distribution", {
146
+ ...distributionProps,
147
+ serviceWorkerAllowed: "/",
148
+ overrides: {
149
+ staticResponseHeadersPolicyProps: {
150
+ responseHeadersPolicyName: "a".repeat(128),
151
+ },
152
+ },
153
+ });
154
+ expect(serviceWorkerPolicy(stack).Name).toBe(`${"a".repeat(125)}-sw`);
155
+ });
156
+ it("keeps a Service-Worker-Allowed the static override sets", () => {
157
+ const { stack, distributionProps } = setup([]);
158
+ new nextjs_distribution_1.NextjsDistribution(stack, "Distribution", {
159
+ ...distributionProps,
160
+ serviceWorkerAllowed: "/",
161
+ overrides: {
162
+ staticResponseHeadersPolicyProps: {
163
+ customHeadersBehavior: {
164
+ customHeaders: [
165
+ {
166
+ header: "service-worker-allowed",
167
+ value: "/app",
168
+ override: true,
169
+ },
170
+ ],
171
+ },
172
+ },
173
+ },
174
+ });
175
+ expect(serviceWorkerPolicy(stack).CustomHeadersConfig.Items).toEqual([
176
+ { Header: "service-worker-allowed", Value: "/app", Override: true },
177
+ ]);
178
+ });
179
+ it("warns and uses a replaced static policy as it is", () => {
180
+ const { stack, distributionProps } = setup([]);
181
+ const distribution = new nextjs_distribution_1.NextjsDistribution(stack, "Distribution", {
182
+ ...distributionProps,
183
+ serviceWorkerAllowed: "/",
184
+ overrides: {
185
+ staticBehaviorOptions: {
186
+ responseHeadersPolicy: aws_cloudfront_1.ResponseHeadersPolicy.fromResponseHeadersPolicyId(stack, "Custom", "custom-policy"),
187
+ },
188
+ },
189
+ });
190
+ assertions_1.Annotations.fromStack(stack).hasWarning(`/${distribution.node.path}`, assertions_1.Match.stringLikeRegexp("Service-Worker-Allowed"));
191
+ const config = Object.values(assertions_1.Template.fromStack(stack).findResources("AWS::CloudFront::Distribution"))[0].Properties.DistributionConfig;
192
+ expect(config.CacheBehaviors[0]).toMatchObject({
193
+ PathPattern: "_next/static/service-worker/*",
194
+ ResponseHeadersPolicyId: "custom-policy",
195
+ });
196
+ });
197
+ it("counts its behavior against the budget", () => {
198
+ const { stack, distributionProps } = setup([], {
199
+ publicDirEntries: Array.from({ length: 72 }, (_, i) => `f${i}`),
200
+ });
201
+ // 3 fixed + 72 public = 75 fits; the service worker behavior makes 76.
202
+ expect(() => new nextjs_distribution_1.NextjsDistribution(stack, "Distribution", {
203
+ ...distributionProps,
204
+ serviceWorkerAllowed: "/",
205
+ })).toThrow(/needs 76 CloudFront cache behaviors/);
206
+ });
207
+ });
74
208
  it("lets the OAC principal list the bucket so a missing asset is a 404", () => {
75
209
  const { stack, distributionProps } = setup([]);
76
210
  new nextjs_distribution_1.NextjsDistribution(stack, "Distribution", distributionProps);
@@ -313,7 +447,7 @@ describe("NextjsDistribution function group behaviors", () => {
313
447
  ],
314
448
  },
315
449
  },
316
- })).toThrow(/already associates a CloudFront function with viewer-request/);
450
+ })).toThrow(/associates a CloudFront function with viewer-request, but serving `assetPrefix`/);
317
451
  });
318
452
  const userFn = (stack, eventType) => ({
319
453
  eventType,
@@ -650,38 +784,38 @@ describe("the viewer-request CloudFront Function", () => {
650
784
  ["/foo//bar", "/foo/bar"],
651
785
  ["/basepath//to-sv", "/basepath/to-sv"],
652
786
  ["/a\\b", "/a/b"],
653
- ])("redirects %s to %s with a 308", (uri, location) => {
654
- expect(redirect(send(uri))).toEqual({ statusCode: 308, location });
787
+ ])("redirects %s to %s with a 308", async (uri, location) => {
788
+ expect(redirect(await send(uri))).toEqual({ statusCode: 308, location });
655
789
  });
656
- it("keeps the query on the redirect, including repeated keys", () => {
790
+ it("keeps the query on the redirect, including repeated keys", async () => {
657
791
  // CloudFront's shape for a repeated key: `multiValue` holds every value,
658
792
  // the first included, and `value` repeats that first one.
659
- const result = send("/x//y", {
793
+ const result = await send("/x//y", {
660
794
  json: { value: "true" },
661
795
  a: { value: "1", multiValue: [{ value: "1" }, { value: "2" }] },
662
796
  flag: { value: "" },
663
797
  });
664
798
  expect(redirect(result).location).toBe("/x/y?json=true&a=1&a=2&flag");
665
799
  });
666
- it("passes percent-encoded query values through without re-encoding", () => {
800
+ it("passes percent-encoded query values through without re-encoding", async () => {
667
801
  // CloudFront hands the function the values still encoded, as sent.
668
- const result = send("/x//y", {
802
+ const result = await send("/x//y", {
669
803
  a: { value: "%20b%26c" },
670
804
  p: { value: "1+2" },
671
805
  });
672
806
  expect(redirect(result).location).toBe("/x/y?a=%20b%26c&p=1+2");
673
807
  });
674
- it("passes an ordinary path through with x-forwarded-host set", () => {
675
- const result = send("/a/b");
808
+ it("passes an ordinary path through with x-forwarded-host set", async () => {
809
+ const result = (await send("/a/b"));
676
810
  expect(result.uri).toBe("/a/b");
677
811
  // CloudFront rewrites `host` to the origin domain, so the app would otherwise
678
812
  // build every absolute URL against the Function URL's hostname.
679
813
  expect(result.headers["x-forwarded-host"].value).toBe("a.test");
680
814
  });
681
- it("overwrites a client-supplied x-forwarded-host", () => {
815
+ it("overwrites a client-supplied x-forwarded-host", async () => {
682
816
  // The runtime trusts this header behind the Function URL, so a viewer's
683
817
  // own value must not survive to build redirects or origin checks.
684
- const result = handler({
818
+ const result = (await handler({
685
819
  request: {
686
820
  uri: "/a",
687
821
  querystring: {},
@@ -690,8 +824,354 @@ describe("the viewer-request CloudFront Function", () => {
690
824
  "x-forwarded-host": { value: "evil.test" },
691
825
  },
692
826
  },
827
+ }));
828
+ expect(result.headers["x-forwarded-host"].value).toBe("a.test");
829
+ });
830
+ });
831
+ /**
832
+ * `viewerRequestFunctionCode`, run as CloudFront would run it on each behavior,
833
+ * for the same reason as the suite above.
834
+ */
835
+ describe("viewerRequestFunctionCode", () => {
836
+ const BASIC_AUTH = `
837
+ function viewerRequest(event) {
838
+ var auth = event.request.headers.authorization;
839
+ if (auth && auth.value === "Basic dXNlcjpwYXNz") return;
840
+ return {
841
+ statusCode: 401,
842
+ statusDescription: "Unauthorized",
843
+ headers: { "www-authenticate": { value: 'Basic realm="preview"' } },
844
+ };
845
+ }
846
+ `;
847
+ const AUTHORIZED = { authorization: "Basic dXNlcjpwYXNz" };
848
+ /** What `viewerRequestKeyValueStore` holds, as `cf.kvs()` would read it. */
849
+ const fakeCloudFrontModule = (values) => ({
850
+ kvs: () => ({
851
+ get: async (key) => {
852
+ if (!(key in values))
853
+ throw new Error(`key not found: ${key}`);
854
+ return values[key];
855
+ },
856
+ }),
857
+ });
858
+ const synth = (props = {}) => {
859
+ const stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), "TestStack");
860
+ const keyValueStore = props.keyValueStore
861
+ ? new aws_cloudfront_1.KeyValueStore(stack, "Kvs")
862
+ : undefined;
863
+ const compute = props.nextjsType === constants_1.NextjsType.GLOBAL_CONTAINERS
864
+ ? {
865
+ loadBalancer: new aws_elasticloadbalancingv2_1.ApplicationLoadBalancer(stack, "Alb", {
866
+ vpc: new aws_ec2_1.Vpc(stack, "Vpc"),
867
+ }),
868
+ }
869
+ : {
870
+ functionUrl: new aws_lambda_1.FunctionUrl(stack, "Url", {
871
+ function: new aws_lambda_1.Function(stack, "Fn", {
872
+ code: aws_lambda_1.Code.fromInline("exports.handler = () => {};"),
873
+ handler: "index.handler",
874
+ runtime: aws_lambda_1.Runtime.NODEJS_22_X,
875
+ }),
876
+ authType: aws_lambda_1.FunctionUrlAuthType.AWS_IAM,
877
+ }),
878
+ };
879
+ new nextjs_distribution_1.NextjsDistribution(stack, "Distribution", {
880
+ ...compute,
881
+ assetsBucket: new aws_s3_1.Bucket(stack, "Assets"),
882
+ assetPrefix: props.assetPrefix,
883
+ basePath: props.basePath,
884
+ nextjsType: props.nextjsType ?? constants_1.NextjsType.GLOBAL_FUNCTIONS,
885
+ overrides: props.overrides?.(stack),
886
+ publicDirEntries: [{ name: "favicon.ico", isDirectory: false }],
887
+ viewerRequestFunctionCode: props.code === undefined
888
+ ? undefined
889
+ : aws_cloudfront_1.FunctionCode.fromInline(props.code),
890
+ viewerRequestKeyValueStore: keyValueStore,
891
+ });
892
+ const template = assertions_1.Template.fromStack(stack);
893
+ const functions = template.findResources("AWS::CloudFront::Function");
894
+ const config = Object.values(template.findResources("AWS::CloudFront::Distribution"))[0].Properties.DistributionConfig;
895
+ const behaviors = [
896
+ { PathPattern: "*", ...config.DefaultCacheBehavior },
897
+ ...config.CacheBehaviors,
898
+ ];
899
+ /** The viewer-request function on the behavior for `pathPattern`. */
900
+ const functionFor = (pathPattern) => {
901
+ const behavior = behaviors.find((it) => it.PathPattern === pathPattern);
902
+ const association = behavior.FunctionAssociations.find((it) => it.EventType === "viewer-request");
903
+ return functions[association.FunctionARN["Fn::GetAtt"][0]].Properties;
904
+ };
905
+ /**
906
+ * That function's handler, runnable. `node:vm` scripts can't `import`, so
907
+ * the `cloudfront` module is handed in as the binding the import makes.
908
+ */
909
+ const handlerFor = (pathPattern, kvsValues = {}) => {
910
+ const code = functionFor(pathPattern).FunctionCode.replace(/^\s*import cf from "cloudfront";/, "");
911
+ return (0, node_vm_1.runInNewContext)(`${code}\nhandler`, {
912
+ cf: fakeCloudFrontModule(kvsValues),
913
+ });
914
+ };
915
+ return { behaviors, functions, functionFor, handlerFor, stack };
916
+ };
917
+ const request = (uri, headers = {}) => ({
918
+ request: {
919
+ uri,
920
+ querystring: {},
921
+ headers: Object.fromEntries(Object.entries({ host: "a.test", ...headers }).map(([name, value]) => [
922
+ name,
923
+ { value },
924
+ ])),
925
+ },
926
+ });
927
+ const status = (result) => result.statusCode;
928
+ it.each([constants_1.NextjsType.GLOBAL_FUNCTIONS, constants_1.NextjsType.GLOBAL_CONTAINERS])("gates every behavior on %s, static assets included", async (nextjsType) => {
929
+ const { behaviors, handlerFor } = synth({ code: BASIC_AUTH, nextjsType });
930
+ expect(behaviors.map((it) => it.PathPattern).sort()).toEqual([
931
+ "*",
932
+ "_next/image*",
933
+ "_next/static*",
934
+ "favicon.ico",
935
+ ]);
936
+ for (const { PathPattern } of behaviors) {
937
+ const handler = handlerFor(PathPattern);
938
+ expect(status(await handler(request("/x")))).toBe(401);
939
+ const passed = (await handler(request("/x", AUTHORIZED)));
940
+ expect(passed.uri).toBe("/x");
941
+ }
942
+ });
943
+ it("shares one pass-through function between dynamic and static on Global Containers", () => {
944
+ const { behaviors, functions } = synth({
945
+ code: BASIC_AUTH,
946
+ nextjsType: constants_1.NextjsType.GLOBAL_CONTAINERS,
693
947
  });
948
+ const [logicalId, ...rest] = Object.keys(functions);
949
+ expect(rest).toHaveLength(0);
950
+ expect(behaviors.map((it) => it.PathPattern).sort()).toEqual([
951
+ "*",
952
+ "_next/image*",
953
+ "_next/static*",
954
+ "favicon.ico",
955
+ ]);
956
+ for (const { FunctionAssociations } of behaviors) {
957
+ expect(FunctionAssociations).toEqual([
958
+ {
959
+ EventType: "viewer-request",
960
+ FunctionARN: { "Fn::GetAtt": [logicalId, "FunctionARN"] },
961
+ },
962
+ ]);
963
+ }
964
+ });
965
+ it("accepts viewerRequest declared after another variable", async () => {
966
+ const handler = synth({
967
+ code: `var x = 1, viewerRequest = (event) => ({ statusCode: 401 });`,
968
+ }).handlerFor("_next/static*");
969
+ expect(status(await handler(request("/x")))).toBe(401);
970
+ });
971
+ it("accepts viewerRequest defined as a const arrow function", async () => {
972
+ const handler = synth({
973
+ code: `const viewerRequest = async (event) => ({ statusCode: 401 });`,
974
+ }).handlerFor("_next/static*");
975
+ expect(status(await handler(request("/x")))).toBe(401);
976
+ });
977
+ it("runs before the repeated-slash redirect", async () => {
978
+ // Otherwise `/a//b` would answer 308 to a viewer who never authenticated.
979
+ const handler = synth({ code: BASIC_AUTH }).handlerFor("*");
980
+ expect(status(await handler(request("/a//b")))).toBe(401);
981
+ expect(status(await handler(request("/a//b", AUTHORIZED)))).toBe(308);
982
+ });
983
+ it("associates the store with every function it runs in", () => {
984
+ const { behaviors, functionFor, functions } = synth({
985
+ code: BASIC_AUTH,
986
+ keyValueStore: true,
987
+ assetPrefix: "/cdn",
988
+ });
989
+ expect(Object.keys(functions)).toHaveLength(3);
990
+ for (const { PathPattern } of behaviors) {
991
+ const { FunctionConfig } = functionFor(PathPattern);
992
+ expect(FunctionConfig.Runtime).toBe("cloudfront-js-2.0");
993
+ expect(FunctionConfig.KeyValueStoreAssociations).toEqual([
994
+ { KeyValueStoreARN: { "Fn::GetAtt": [expect.any(String), "Arn"] } },
995
+ ]);
996
+ }
997
+ });
998
+ it("reads credentials from the KeyValueStore", async () => {
999
+ const handler = synth({
1000
+ keyValueStore: true,
1001
+ code: `import cf from "cloudfront";
1002
+ const kvs = cf.kvs();
1003
+ async function viewerRequest(event) {
1004
+ const auth = event.request.headers.authorization;
1005
+ if (auth && auth.value === "Basic " + (await kvs.get("basic-auth"))) {
1006
+ return;
1007
+ }
1008
+ return { statusCode: 401, statusDescription: "Unauthorized" };
1009
+ }
1010
+ `,
1011
+ }).handlerFor("_next/static*", { "basic-auth": "dXNlcjpwYXNz" });
1012
+ expect(status(await handler(request("/x")))).toBe(401);
1013
+ expect((await handler(request("/x", AUTHORIZED))).uri).toBe("/x");
1014
+ });
1015
+ it("refuses a KeyValueStore without code to read it", () => {
1016
+ expect(() => synth({ keyValueStore: true })).toThrow(/`viewerRequestKeyValueStore` .* needs `viewerRequestFunctionCode`/);
1017
+ });
1018
+ it("can't keep a viewer's x-forwarded-host past cdk-nextjs's overwrite", async () => {
1019
+ const handler = synth({
1020
+ code: `
1021
+ function viewerRequest(event) {
1022
+ event.request.headers["x-forwarded-host"] = { value: "evil.test" };
1023
+ return event.request;
1024
+ }
1025
+ `,
1026
+ }).handlerFor("*");
1027
+ const result = (await handler(request("/x")));
694
1028
  expect(result.headers["x-forwarded-host"].value).toBe("a.test");
695
1029
  });
1030
+ it("carries on with a request it returns as a new object", async () => {
1031
+ const handler = synth({
1032
+ code: `
1033
+ function viewerRequest(event) {
1034
+ return { uri: "/y", querystring: {}, headers: event.request.headers };
1035
+ }
1036
+ `,
1037
+ }).handlerFor("_next/static*");
1038
+ expect((await handler(request("/x"))).uri).toBe("/y");
1039
+ });
1040
+ it("runs inside the assetPrefix rewrite, in place of the static function", async () => {
1041
+ const { behaviors, handlerFor } = synth({
1042
+ code: BASIC_AUTH,
1043
+ assetPrefix: "/cdn",
1044
+ });
1045
+ const prefixed = behaviors.find((it) => it.PathPattern === "/cdn/_next/static*");
1046
+ // One viewer-request function per behavior, or CloudFront rejects it.
1047
+ expect(prefixed.FunctionAssociations.filter((it) => it.EventType === "viewer-request")).toHaveLength(1);
1048
+ const handler = handlerFor("/cdn/_next/static*");
1049
+ expect(status(await handler(request("/cdn/_next/static/a.js")))).toBe(401);
1050
+ const passed = (await handler(request("/cdn/_next/static/a.js", AUTHORIZED)));
1051
+ expect(passed.uri).toBe("/_next/static/a.js");
1052
+ });
1053
+ it("adds no functions when unset", () => {
1054
+ const { behaviors, functions } = synth();
1055
+ const staticBehavior = behaviors.find((it) => it.PathPattern === "_next/static*");
1056
+ expect(staticBehavior.FunctionAssociations).toBeUndefined();
1057
+ const [fn, ...rest] = Object.values(functions).map((it) => it.Properties);
1058
+ expect(rest).toHaveLength(0);
1059
+ // The marker is dropped, not left in the deployed function.
1060
+ expect(fn.FunctionCode).toMatch(/^\s*async function handler\(event\) \{\n\s*const request/);
1061
+ expect(fn.FunctionConfig.KeyValueStoreAssociations).toBeUndefined();
1062
+ });
1063
+ it.each([false, true])("runs every cdk-nextjs function on cloudfront-js-2.0 (hook set: %s)", (hooked) => {
1064
+ const { functions } = synth({
1065
+ code: hooked ? BASIC_AUTH : undefined,
1066
+ assetPrefix: "/cdn",
1067
+ });
1068
+ const runtimes = Object.values(functions).map((it) => it.Properties.FunctionConfig.Runtime);
1069
+ expect(runtimes).toHaveLength(hooked ? 3 : 2);
1070
+ expect(new Set(runtimes)).toEqual(new Set(["cloudfront-js-2.0"]));
1071
+ });
1072
+ it.each(["dynamicBehaviorOptions", "imageBehaviorOptions"])("refuses a %s override that claims viewer-request on Global Containers", (overrideName) => {
1073
+ expect(() => synth({
1074
+ code: BASIC_AUTH,
1075
+ nextjsType: constants_1.NextjsType.GLOBAL_CONTAINERS,
1076
+ overrides: (stack) => ({
1077
+ [overrideName]: {
1078
+ functionAssociations: [
1079
+ {
1080
+ eventType: aws_cloudfront_1.FunctionEventType.VIEWER_REQUEST,
1081
+ function: new aws_cloudfront_1.Function(stack, "UserFn", {
1082
+ code: aws_cloudfront_1.FunctionCode.fromInline("function handler(event) { return event.request; }"),
1083
+ }),
1084
+ },
1085
+ ],
1086
+ },
1087
+ }),
1088
+ })).toThrow(new RegExp(`overrides\\.${overrideName}\\.functionAssociations.*viewerRequestFunctionCode`));
1089
+ });
1090
+ it("refuses a distributionProps.defaultBehavior override", () => {
1091
+ expect(() => synth({
1092
+ code: BASIC_AUTH,
1093
+ overrides: () => ({
1094
+ distributionProps: {
1095
+ defaultBehavior: {
1096
+ origin: new aws_cloudfront_origins_1.HttpOrigin("example.com"),
1097
+ },
1098
+ },
1099
+ }),
1100
+ })).toThrow(/overrides\.distributionProps\.defaultBehavior/);
1101
+ });
1102
+ it("lets a basePath app replace the default behavior", () => {
1103
+ expect(() => synth({
1104
+ code: BASIC_AUTH,
1105
+ basePath: "/app",
1106
+ overrides: () => ({
1107
+ distributionProps: {
1108
+ defaultBehavior: { origin: new aws_cloudfront_origins_1.HttpOrigin("example.com") },
1109
+ },
1110
+ }),
1111
+ })).not.toThrow();
1112
+ });
1113
+ it("keeps cdk-nextjs's code out of the deployed indentation", () => {
1114
+ const { functionFor } = synth({ code: BASIC_AUTH });
1115
+ const code = functionFor("*").FunctionCode;
1116
+ const own = code.slice(code.indexOf("async function handler"));
1117
+ expect(own).not.toMatch(/^[ \t]/m);
1118
+ });
1119
+ it("warns, rather than measures, when the code contains a token", () => {
1120
+ const { stack } = synth({
1121
+ code: `function viewerRequest(event) { return ${aws_cdk_lib_1.Lazy.string({ produce: () => '"x"' })}; }`,
1122
+ });
1123
+ assertions_1.Annotations.fromStack(stack).hasWarning("*", assertions_1.Match.stringLikeRegexp("contains a CDK token"));
1124
+ });
1125
+ it("refuses a static override that already claims viewer-request", () => {
1126
+ expect(() => synth({
1127
+ code: BASIC_AUTH,
1128
+ overrides: (stack) => ({
1129
+ staticBehaviorOptions: {
1130
+ functionAssociations: [
1131
+ {
1132
+ eventType: aws_cloudfront_1.FunctionEventType.VIEWER_REQUEST,
1133
+ function: new aws_cloudfront_1.Function(stack, "UserFn", {
1134
+ code: aws_cloudfront_1.FunctionCode.fromInline("function handler(event) { return event.request; }"),
1135
+ }),
1136
+ },
1137
+ ],
1138
+ },
1139
+ }),
1140
+ })).toThrow(/overrides\.staticBehaviorOptions\.functionAssociations/);
1141
+ });
1142
+ it.each([
1143
+ ["no viewerRequest", "var x = 1;", /must define `viewerRequest\(event\)`/],
1144
+ ...[
1145
+ "function handler(event) {}",
1146
+ "function* handler(event) {}",
1147
+ "const handler = (event) => event.request;",
1148
+ "let a = 1, handler = 2;",
1149
+ "var handler = (event) => event.request;",
1150
+ "var { handler } = { handler: (event) => event.request };",
1151
+ 'globalThis["handler"] = (event) => event.request;',
1152
+ "var cdkNextjsHandler; handler = cdkNextjsHandler;",
1153
+ ].map((declaration) => [
1154
+ `handler in \`${declaration}\``,
1155
+ `${declaration}\nfunction viewerRequest(event) {}`,
1156
+ /uses the name `handler`/,
1157
+ ]),
1158
+ [
1159
+ "viewerRequest only compared, never declared",
1160
+ 'const ok = typeof viewerRequest === "function";',
1161
+ /must define `viewerRequest\(event\)`/,
1162
+ ],
1163
+ [
1164
+ "viewerRequest only assigned as a property",
1165
+ "const cfg = {}; cfg.viewerRequest = function (event) {};",
1166
+ /must define `viewerRequest\(event\)`/,
1167
+ ],
1168
+ [
1169
+ "more than fits in a CloudFront Function",
1170
+ `function viewerRequest(event) {} /* ${"x".repeat(10 * 1024)} */`,
1171
+ /over CloudFront's limit of 10240/,
1172
+ ],
1173
+ ])("refuses code with %s", (_name, code, error) => {
1174
+ expect(() => synth({ code })).toThrow(error);
1175
+ });
696
1176
  });
697
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWRpc3RyaWJ1dGlvbi50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25leHRqcy1kaXN0cmlidXRpb24udGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHFDQUEwQztBQUMxQyw2Q0FBbUQ7QUFDbkQsdURBQXNFO0FBQ3RFLCtEQUlvQztBQUNwQyx1REFNZ0M7QUFDaEMsK0NBQTRDO0FBQzVDLCtEQUE0RDtBQUM1RCwyQ0FBeUM7QUFDekMsK0RBRytCO0FBRS9COzs7OztHQUtHO0FBQ0gsUUFBUSxDQUFDLDZDQUE2QyxFQUFFLEdBQUcsRUFBRTtJQUMzRCxNQUFNLEtBQUssR0FBRyxDQUNaLFVBQW9CLEVBQ3BCLFFBS0ksRUFBRSxFQUNOLEVBQUU7UUFDRixNQUFNLEtBQUssR0FBRyxJQUFJLG1CQUFLLENBQUMsSUFBSSxpQkFBRyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDaEQsTUFBTSxjQUFjLEdBQXNDLFVBQVUsQ0FBQyxHQUFHLENBQ3RFLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDUCxNQUFNLEVBQUUsR0FBRyxJQUFJLHFCQUFjLENBQUMsS0FBSyxFQUFFLEtBQUssSUFBSSxFQUFFLEVBQUU7Z0JBQ2hELElBQUksRUFBRSxpQkFBSSxDQUFDLFVBQVUsQ0FBQyw2QkFBNkIsQ0FBQztnQkFDcEQsT0FBTyxFQUFFLGVBQWU7Z0JBQ3hCLE9BQU8sRUFBRSxvQkFBTyxDQUFDLFdBQVc7YUFDN0IsQ0FBQyxDQUFDO1lBQ0gsT0FBTztnQkFDTCxJQUFJO2dCQUNKLFdBQVcsRUFBRSxJQUFJLHdCQUFXLENBQUMsS0FBSyxFQUFFLE1BQU0sSUFBSSxFQUFFLEVBQUU7b0JBQ2hELFFBQVEsRUFBRSxFQUFFO29CQUNaLFFBQVEsRUFBRSxnQ0FBbUIsQ0FBQyxPQUFPO2lCQUN0QyxDQUFDO2FBQ0gsQ0FBQztRQUNKLENBQUMsQ0FDRixDQUFDO1FBQ0YsdUVBQXVFO1FBQ3ZFLE1BQU0sc0JBQXNCLEdB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QUFRLENBQUMsQ0FBQztJQUNsRSxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcnVuSW5OZXdDb250ZXh0IH0gZnJvbSBcIm5vZGU6dm1cIjtcbmltcG9ydCB7IEFwcCwgRHVyYXRpb24sIFN0YWNrIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBBbm5vdGF0aW9ucywgTWF0Y2gsIFRlbXBsYXRlIH0gZnJvbSBcImF3cy1jZGstbGliL2Fzc2VydGlvbnNcIjtcbmltcG9ydCB7XG4gIEZ1bmN0aW9uIGFzIENsb3VkRnJvbnRGdW5jdGlvbixcbiAgRnVuY3Rpb25Db2RlLFxuICBGdW5jdGlvbkV2ZW50VHlwZSxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250XCI7XG5pbXBvcnQge1xuICBDb2RlLFxuICBGdW5jdGlvbiBhcyBMYW1iZGFGdW5jdGlvbixcbiAgRnVuY3Rpb25VcmwsXG4gIEZ1bmN0aW9uVXJsQXV0aFR5cGUsXG4gIFJ1bnRpbWUsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBCdWNrZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCI7XG5pbXBvcnQgeyBwYXRoUGF0dGVybnNGb3IgfSBmcm9tIFwiLi9hZGFwdGVyL2Z1bmN0aW9uLWdyb3Vwc1wiO1xuaW1wb3J0IHsgTmV4dGpzVHlwZSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgTmV4dGpzRGlzdHJpYnV0aW9uLFxuICBOZXh0anNEaXN0cmlidXRpb25GdW5jdGlvbkdyb3VwLFxufSBmcm9tIFwiLi9uZXh0anMtZGlzdHJpYnV0aW9uXCI7XG5cbi8qKlxuICogYGZ1bmN0aW9uR3JvdXBzYCByb3V0aW5nIGF0IHRoZSBlZGdlLiBgTmV4dGpzQnVpbGRgIGlzIGRlbGliZXJhdGVseSBub3RcbiAqIGludm9sdmVkOiB3aGljaCBiZWhhdmlvcnMgYSBncm91cCBnZXRzLCBhbmQgaW4gd2hhdCBvcmRlciwgaXMgdGhlIGFkYXB0ZXInc1xuICogZGVjaXNpb24gKGBmdW5jdGlvbi1ncm91cHMudGVzdC50c2ApLCBzbyB0aGVzZSBwYXNzIHRoZSBiZWhhdmlvcnMgaW4gZGlyZWN0bHlcbiAqIGFuZCBhc3NlcnQgb24gd2hhdCB0aGUgZGlzdHJpYnV0aW9uIGRvZXMgd2l0aCB0aGVtLlxuICovXG5kZXNjcmliZShcIk5leHRqc0Rpc3RyaWJ1dGlvbiBmdW5jdGlvbiBncm91cCBiZWhhdmlvcnNcIiwgKCkgPT4ge1xuICBjb25zdCBzZXR1cCA9IChcbiAgICBncm91cE5hbWVzOiBzdHJpbmdbXSxcbiAgICBwcm9wczoge1xuICAgICAgcm91dGVzRm9yPzogKG5hbWU6IHN0cmluZykgPT4gc3RyaW5nW107XG4gICAgICBwdWJsaWNEaXJFbnRyaWVzPzogc3RyaW5nW107XG4gICAgICBiYXNlUGF0aD86IHN0cmluZztcbiAgICAgIHRyYWlsaW5nU2xhc2g/OiBib29sZWFuO1xuICAgIH0gPSB7fSxcbiAgKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2sobmV3IEFwcCgpLCBcIlRlc3RTdGFja1wiKTtcbiAgICBjb25zdCBmdW5jdGlvbkdyb3VwczogTmV4dGpzRGlzdHJpYnV0aW9uRnVuY3Rpb25Hcm91cFtdID0gZ3JvdXBOYW1lcy5tYXAoXG4gICAgICAobmFtZSkgPT4ge1xuICAgICAgICBjb25zdCBmbiA9IG5ldyBMYW1iZGFGdW5jdGlvbihzdGFjaywgYEZuJHtuYW1lfWAsIHtcbiAgICAgICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoXCJleHBvcnRzLmhhbmRsZXIgPSAoKSA9PiB7fTtcIiksXG4gICAgICAgICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBmdW5jdGlvblVybDogbmV3IEZ1bmN0aW9uVXJsKHN0YWNrLCBgVXJsJHtuYW1lfWAsIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uOiBmbixcbiAgICAgICAgICAgIGF1dGhUeXBlOiBGdW5jdGlvblVybEF1dGhUeXBlLkFXU19JQU0sXG4gICAgICAgICAgfSksXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICk7XG4gICAgLy8gSW4gdGhlIG9yZGVyIGdpdmVuOiB0aGUgYnVpbGQncyBsaXN0IGlzIGFscmVhZHkgbW9zdCBzcGVjaWZpYyBmaXJzdC5cbiAgICBjb25zdCBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzID0gZ3JvdXBOYW1lcy5mbGF0TWFwKChncm91cCkgPT5cbiAgICAgIChwcm9wcy5yb3V0ZXNGb3I/Lihncm91cCkgPz8gW2AvJHtncm91cH0vKipgXSkuZmxhdE1hcCgocm91dGUpID0+XG4gICAgICAgIHBhdGhQYXR0ZXJuc0Zvcihyb3V0ZSwge1xuICAgICAgICAgIGhhc0RhdGFSb3V0ZXM6IGZhbHNlLFxuICAgICAgICAgIHRyYWlsaW5nU2xhc2g6IHByb3BzLnRyYWlsaW5nU2xhc2gsXG4gICAgICAgIH0pLm1hcCgocGF0dGVybikgPT4gKHsgZ3JvdXAsIHJvdXRlLCBwYXR0ZXJuIH0pKSxcbiAgICAgICksXG4gICAgKTtcbiAgICBjb25zdCBkZWZhdWx0Rm4gPSBuZXcgTGFtYmRhRnVuY3Rpb24oc3RhY2ssIFwiRm5EZWZhdWx0XCIsIHtcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZShcImV4cG9ydHMuaGFuZGxlciA9ICgpID0+IHt9O1wiKSxcbiAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhY2ssXG4gICAgICBmdW5jdGlvbkdyb3VwcyxcbiAgICAgIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsXG4gICAgICBkaXN0cmlidXRpb25Qcm9wczoge1xuICAgICAgICBhc3NldHNCdWNrZXQ6IG5ldyBCdWNrZXQoc3RhY2ssIFwiQXNzZXRzXCIpLFxuICAgICAgICBiYXNlUGF0aDogcHJvcHMuYmFzZVBhdGgsXG4gICAgICAgIGZ1bmN0aW9uVXJsOiBuZXcgRnVuY3Rpb25Vcmwoc3RhY2ssIFwiVXJsRGVmYXVsdFwiLCB7XG4gICAgICAgICAgZnVuY3Rpb246IGRlZmF1bHRGbixcbiAgICAgICAgICBhdXRoVHlwZTogRnVuY3Rpb25VcmxBdXRoVHlwZS5BV1NfSUFNLFxuICAgICAgICB9KSxcbiAgICAgICAgbmV4dGpzVHlwZTogTmV4dGpzVHlwZS5HTE9CQUxfRlVOQ1RJT05TLFxuICAgICAgICBwdWJsaWNEaXJFbnRyaWVzOiAocHJvcHMucHVibGljRGlyRW50cmllcyA/PyBbXSkubWFwKChuYW1lKSA9PiAoe1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgaXNEaXJlY3Rvcnk6IGZhbHNlLFxuICAgICAgICB9KSksXG4gICAgICB9LFxuICAgIH07XG4gIH07XG5cbiAgY29uc3QgcGF0aFBhdHRlcm5zID0gKHN0YWNrOiBTdGFjaykgPT4ge1xuICAgIGNvbnN0IGRpc3RyaWJ1dGlvbnMgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmZpbmRSZXNvdXJjZXMoXG4gICAgICBcIkFXUzo6Q2xvdWRGcm9udDo6RGlzdHJpYnV0aW9uXCIsXG4gICAgKTtcbiAgICBjb25zdCBjb25maWcgPVxuICAgICAgT2JqZWN0LnZhbHVlcyhkaXN0cmlidXRpb25zKVswXS5Qcm9wZXJ0aWVzLkRpc3RyaWJ1dGlvbkNvbmZpZztcbiAgICByZXR1cm4gKGNvbmZpZy5DYWNoZUJlaGF2aW9ycyBhcyBBcnJheTx7IFBhdGhQYXR0ZXJuOiBzdHJpbmcgfT4pLm1hcChcbiAgICAgIChiZWhhdmlvcikgPT4gYmVoYXZpb3IuUGF0aFBhdHRlcm4sXG4gICAgKTtcbiAgfTtcblxuICBpdChcImFkZHMgbm90aGluZyBleHRyYSB3aGVuIHRoZXJlIGFyZSBubyBncm91cHNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSk7XG4gICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwgZGlzdHJpYnV0aW9uUHJvcHMpO1xuICAgIGV4cGVjdChwYXRoUGF0dGVybnMoc3RhY2spKS50b0VxdWFsKFtcIl9uZXh0L3N0YXRpYypcIiwgXCJfbmV4dC9pbWFnZSpcIl0pO1xuICB9KTtcblxuICBpdChcImxldHMgdGhlIE9BQyBwcmluY2lwYWwgbGlzdCB0aGUgYnVja2V0IHNvIGEgbWlzc2luZyBhc3NldCBpcyBhIDQwNFwiLCAoKSA9PiB7XG4gICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdKTtcbiAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCBkaXN0cmlidXRpb25Qcm9wcyk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoXCJBV1M6OlMzOjpCdWNrZXRQb2xpY3lcIiwge1xuICAgICAgUG9saWN5RG9jdW1lbnQ6IHtcbiAgICAgICAgU3RhdGVtZW50OiBNYXRjaC5hcnJheVdpdGgoW1xuICAgICAgICAgIE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgICAgQWN0aW9uOiBbXCJzMzpHZXRPYmplY3RcIiwgXCJzMzpMaXN0QnVja2V0XCJdLFxuICAgICAgICAgICAgUHJpbmNpcGFsOiB7IFNlcnZpY2U6IFwiY2xvdWRmcm9udC5hbWF6b25hd3MuY29tXCIgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9KTtcblxuICBpdChcImFkZHMgZ3JvdXAgYmVoYXZpb3JzIGluIHRoZSBidWlsZCdzIG9yZGVyLCBhZnRlciB0aGUgaW1hZ2UgYmVoYXZpb3JcIiwgKCkgPT4ge1xuICAgIC8vIENsb3VkRnJvbnQgc3RvcHMgYXQgdGhlIGZpcnN0IG1hdGNoaW5nIGJlaGF2aW9yLCBzbyBgYXBpLypgIGFoZWFkIG9mXG4gICAgLy8gYGFwaS9yZXBvcnRzLypgIHdvdWxkIHNlbmQgZXZlcnkgcmVwb3J0IHJlcXVlc3QgdG8gdGhlIHdyb25nIGZ1bmN0aW9uLlxuICAgIC8vIFRoZSBidWlsZCBzb3J0ZWQgdGhlbSB3aGVuIGl0IGNoZWNrZWQgdGhlbTsgcmUtc29ydGluZyBoZXJlIGNvdWxkIG9ubHlcbiAgICAvLyBkaXNhZ3JlZSB3aXRoIHRoYXQuXG4gICAgY29uc3QgeyBzdGFjaywgZnVuY3Rpb25Hcm91cHMsIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsIGRpc3RyaWJ1dGlvblByb3BzIH0gPVxuICAgICAgc2V0dXAoW1wicmVwb3J0c1wiLCBcImFwaVwiXSwge1xuICAgICAgICByb3V0ZXNGb3I6IChuYW1lKSA9PlxuICAgICAgICAgIG5hbWUgPT09IFwiYXBpXCIgPyBbXCIvYXBpLyoqXCJdIDogW1wiL2FwaS9yZXBvcnRzLyoqXCJdLFxuICAgICAgfSk7XG4gICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICBmdW5jdGlvbkdyb3VwcyxcbiAgICAgIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsXG4gICAgfSk7XG4gICAgZXhwZWN0KHBhdGhQYXR0ZXJucyhzdGFjaykpLnRvRXF1YWwoW1xuICAgICAgXCJfbmV4dC9zdGF0aWMqXCIsXG4gICAgICBcIl9uZXh0L2ltYWdlKlwiLFxuICAgICAgXCJhcGkvcmVwb3J0cy8qXCIsXG4gICAgICBcImFwaS8qXCIsXG4gICAgXSk7XG4gIH0pO1xuXG4gIGl0KFwia2VlcHMgdGhlIHR3byBzbGFzaCB2YXJpYW50cyBkaXN0aW5jdCB1bmRlciBhIGJhc2VQYXRoXCIsICgpID0+IHtcbiAgICAvLyBgZ2V0UGF0aFBhdHRlcm5gIHVzZWQgdG8gam9pbiB0aHJvdWdoIGEgaGVscGVyIHRoYXQgc3RyaXBzIHRyYWlsaW5nXG4gICAgLy8gc2xhc2hlcywgc28gYHByaWNpbmdgIGFuZCBgcHJpY2luZy9gIGJvdGggYmVjYW1lIGAvYmFzZS9wcmljaW5nYDogdHdvXG4gICAgLy8gYmVoYXZpb3JzIHdpdGggdGhlIHNhbWUgcGF0aCBwYXR0ZXJuLCB3aGljaCBDbG91ZEZyb250IHJlamVjdHMgYXQgZGVwbG95XG4gICAgLy8gd2l0aCBubyBoaW50IHRoYXQgYHRyYWlsaW5nU2xhc2hgIGlzIHdoYXQgcHJvZHVjZWQgdGhlIGR1cGxpY2F0ZS5cbiAgICBjb25zdCB7IHN0YWNrLCBmdW5jdGlvbkdyb3VwcywgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9XG4gICAgICBzZXR1cChbXCJta3RcIl0sIHtcbiAgICAgICAgcm91dGVzRm9yOiAoKSA9PiBbXCIvcHJpY2luZ1wiXSxcbiAgICAgICAgYmFzZVBhdGg6IFwiL2Jhc2VcIixcbiAgICAgICAgdHJhaWxpbmdTbGFzaDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgZnVuY3Rpb25Hcm91cHMsXG4gICAgICBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzLFxuICAgIH0pO1xuICAgIGNvbnN0IHBhdHRlcm5zID0gcGF0aFBhdHRlcm5zKHN0YWNrKTtcbiAgICBleHBlY3QocGF0dGVybnMpLnRvQ29udGFpbihcIi9iYXNlL3ByaWNpbmdcIik7XG4gICAgZXhwZWN0KHBhdHRlcm5zKS50b0NvbnRhaW4oXCIvYmFzZS9wcmljaW5nL1wiKTtcbiAgfSk7XG5cbiAgaXQoXCJjb3VudHMgdGhlIGJhc2VQYXRoIGJlaGF2aW9ycyBhZ2FpbnN0IHRoZSBidWRnZXRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSwge1xuICAgICAgYmFzZVBhdGg6IFwiL2Jhc2VcIixcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IEFycmF5LmZyb20oeyBsZW5ndGg6IDIxIH0sIChfLCBpKSA9PiBgZmlsZSR7aX0udHh0YCksXG4gICAgfSk7XG4gICAgLy8gMyBmaXhlZCArIHRoZSAyIGEgYmFzZVBhdGggYWRkcyB0byBzdGFuZCBpbiBmb3IgdGhlIGRlZmF1bHQgYmVoYXZpb3IgKyAyMVxuICAgIC8vIHB1YmxpYyA9IDI2LiBDb3VudGluZyBvbmx5IHRoZSAzIHJlcG9ydGVkIDI0IGFuZCBsZXQgdGhlIHN5bnRoIHRocm91Z2gsIHNvXG4gICAgLy8gdGhlIGxpbWl0IGFycml2ZWQgYXMgYSBDbG91ZEZyb250IGRlcGxveSBmYWlsdXJlLlxuICAgIGV4cGVjdChcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgICAgICBtYXhDYWNoZUJlaGF2aW9yczogMjUsXG4gICAgICAgIH0pLFxuICAgICkudG9UaHJvdygvMjYgQ2xvdWRGcm9udCBjYWNoZSBiZWhhdmlvcnMuKjUgdXNlZCBieSBjZGstbmV4dGpzIGl0c2VsZi9zKTtcbiAgfSk7XG5cbiAgaXQoXCJkZWZhdWx0cyB0aGUgYnVkZ2V0IHRvIENsb3VkRnJvbnQncyBxdW90YSBvZiA3NVwiLCAoKSA9PiB7XG4gICAgLy8gVGhlIGhhcmQtY29kZWQgMjUgcHJlZGF0ZWQgdGhlIHF1b3RhJ3MgaW5jcmVhc2UgdG8gNzUuXG4gICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdLCB7XG4gICAgICBwdWJsaWNEaXJFbnRyaWVzOiBBcnJheS5mcm9tKHsgbGVuZ3RoOiA3MiB9LCAoXywgaSkgPT4gYGZpbGUke2l9LnR4dGApLFxuICAgIH0pO1xuICAgIGV4cGVjdChcbiAgICAgICgpID0+IG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIGRpc3RyaWJ1dGlvblByb3BzKSxcbiAgICApLm5vdC50b1Rocm93KCk7XG4gICAgY29uc3QgeyBzdGFjazogb3ZlciwgZGlzdHJpYnV0aW9uUHJvcHM6IG92ZXJQcm9wcyB9ID0gc2V0dXAoW10sIHtcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IEFycmF5LmZyb20oeyBsZW5ndGg6IDczIH0sIChfLCBpKSA9PiBgZmlsZSR7aX0udHh0YCksXG4gICAgfSk7XG4gICAgZXhwZWN0KFxuICAgICAgKCkgPT4gbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihvdmVyLCBcIkRpc3RyaWJ1dGlvblwiLCBvdmVyUHJvcHMpLFxuICAgICkudG9UaHJvdyhcbiAgICAgIC83NiBDbG91ZEZyb250IGNhY2hlIGJlaGF2aW9ycywgb3ZlciB0aGUgbGltaXQgb2YgNzUuKnNldCBgbWF4Q2FjaGVCZWhhdmlvcnNgL3MsXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJob25vcnMgYSByYWlzZWQgbWF4Q2FjaGVCZWhhdmlvcnNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSwge1xuICAgICAgcHVibGljRGlyRW50cmllczogQXJyYXkuZnJvbSh7IGxlbmd0aDogOTcgfSwgKF8sIGkpID0+IGBmaWxlJHtpfS50eHRgKSxcbiAgICB9KTtcbiAgICBleHBlY3QoXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICAgICAgbWF4Q2FjaGVCZWhhdmlvcnM6IDEwMCxcbiAgICAgICAgfSksXG4gICAgKS5ub3QudG9UaHJvdygpO1xuICB9KTtcblxuICBpdChcImRvZXMgbm90IGNvdW50IGJhc2VQYXRoIGJlaGF2aW9ycyBmb3IgYSBiYXNlUGF0aCBvZiAvXCIsICgpID0+IHtcbiAgICAvLyBgYmFzZVBhdGg6IFwiL1wiYCBub3JtYWxpemVzIHRvIG5vIGJhc2VQYXRoIGFuZCBhZGRzIG5vIGJlaGF2aW9ycywgc29cbiAgICAvLyBjb3VudGluZyAyIGZvciBpdCBjb3VsZCByZWplY3QgYW4gYXBwIHRoYXQgaXMgdW5kZXIgdGhlIGxpbWl0LlxuICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSwge1xuICAgICAgYmFzZVBhdGg6IFwiL1wiLFxuICAgICAgcHVibGljRGlyRW50cmllczogQXJyYXkuZnJvbSh7IGxlbmd0aDogMjIgfSwgKF8sIGkpID0+IGBmaWxlJHtpfS50eHRgKSxcbiAgICB9KTtcbiAgICBleHBlY3QoXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICAgICAgbWF4Q2FjaGVCZWhhdmlvcnM6IDI1LFxuICAgICAgICB9KSxcbiAgICApLm5vdC50b1Rocm93KCk7XG4gIH0pO1xuXG4gIGl0KFwicmVqZWN0cyBhIGJlaGF2aW9yIGZvciBhIGdyb3VwIGl0IHdhcyBub3QgZ2l2ZW5cIiwgKCkgPT4ge1xuICAgIGNvbnN0IHsgc3RhY2ssIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXCJhcGlcIl0pO1xuICAgIGV4cGVjdChcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgICAgICBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzLFxuICAgICAgICB9KSxcbiAgICApLnRvVGhyb3coXG4gICAgICAvcm91dGVzIHRvIGZ1bmN0aW9uIGdyb3VwIFwiYXBpXCIsIHdoaWNoIGlzIG5vdCBpbiBgZnVuY3Rpb25Hcm91cHNgLyxcbiAgICApO1xuICB9KTtcblxuICBpdChcInBvaW50cyBlYWNoIGdyb3VwJ3MgYmVoYXZpb3JzIGF0IHRoYXQgZ3JvdXAncyBvd24gb3JpZ2luXCIsICgpID0+IHtcbiAgICBjb25zdCB7IHN0YWNrLCBmdW5jdGlvbkdyb3VwcywgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9XG4gICAgICBzZXR1cChbXCJhcGlcIl0sIHtcbiAgICAgICAgcm91dGVzRm9yOiAoKSA9PiBbXCIvYXBpLyoqXCIsIFwiL2hlYWx0aFwiXSxcbiAgICAgIH0pO1xuICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgZnVuY3Rpb25Hcm91cHMsXG4gICAgICBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzLFxuICAgIH0pO1xuICAgIGNvbnN0IGRpc3RyaWJ1dGlvbnMgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmZpbmRSZXNvdXJjZXMoXG4gICAgICBcIkFXUzo6Q2xvdWRGcm9udDo6RGlzdHJpYnV0aW9uXCIsXG4gICAgKTtcbiAgICBjb25zdCBjb25maWcgPVxuICAgICAgT2JqZWN0LnZhbHVlcyhkaXN0cmlidXRpb25zKVswXS5Qcm9wZXJ0aWVzLkRpc3RyaWJ1dGlvbkNvbmZpZztcbiAgICBjb25zdCBiZWhhdmlvcnMgPSBjb25maWcuQ2FjaGVCZWhhdmlvcnMgYXMgQXJyYXk8e1xuICAgICAgUGF0aFBhdHRlcm46IHN0cmluZztcbiAgICAgIFRhcmdldE9yaWdpbklkOiBzdHJpbmc7XG4gICAgfT47XG4gICAgY29uc3QgZ3JvdXBPcmlnaW5zID0gbmV3IFNldChcbiAgICAgIGJlaGF2aW9yc1xuICAgICAgICAuZmlsdGVyKChiZWhhdmlvcikgPT5cbiAgICAgICAgICBbXCJhcGkvKlwiLCBcImhlYWx0aFwiXS5pbmNsdWRlcyhiZWhhdmlvci5QYXRoUGF0dGVybiksXG4gICAgICAgIClcbiAgICAgICAgLm1hcCgoYmVoYXZpb3IpID0+IGJlaGF2aW9yLlRhcmdldE9yaWdpbklkKSxcbiAgICApO1xuICAgIC8vIE9uZSBvcmlnaW4sIHNoYXJlZCBieSBib3RoIG9mIHRoZSBncm91cCdzIHBhdHRlcm5zLCBhbmQgbm90IHRoZSBkZWZhdWx0J3MuXG4gICAgZXhwZWN0KGdyb3VwT3JpZ2lucy5zaXplKS50b0JlKDEpO1xuICAgIGV4cGVjdChncm91cE9yaWdpbnMpLm5vdC50b0NvbnRhaW4oXG4gICAgICBjb25maWcuRGVmYXVsdENhY2hlQmVoYXZpb3IuVGFyZ2V0T3JpZ2luSWQsXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJwcmVmaXhlcyBncm91cCBwYXR0ZXJucyB3aXRoIGJhc2VQYXRoXCIsICgpID0+IHtcbiAgICBjb25zdCB7IHN0YWNrLCBmdW5jdGlvbkdyb3VwcywgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9XG4gICAgICBzZXR1cChbXCJhcGlcIl0sIHtcbiAgICAgICAgcm91dGVzRm9yOiAoKSA9PiBbXCIvYXBpLyoqXCJdLFxuICAgICAgICBiYXNlUGF0aDogXCIvYmFzZVwiLFxuICAgICAgfSk7XG4gICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICBmdW5jdGlvbkdyb3VwcyxcbiAgICAgIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsXG4gICAgfSk7XG4gICAgZXhwZWN0KHBhdGhQYXR0ZXJucyhzdGFjaykpLnRvQ29udGFpbihcIi9iYXNlL2FwaS8qXCIpO1xuICB9KTtcblxuICBpdChcIm5hbWVzIGV2ZXJ5IGNsYWltIG9uIHRoZSBiZWhhdmlvciBidWRnZXQgd2hlbiBpdCBpcyBleGNlZWRlZFwiLCAoKSA9PiB7XG4gICAgY29uc3QgeyBzdGFjaywgZnVuY3Rpb25Hcm91cHMsIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsIGRpc3RyaWJ1dGlvblByb3BzIH0gPVxuICAgICAgc2V0dXAoW1wiYXBpXCJdLCB7XG4gICAgICAgIHJvdXRlc0ZvcjogKCkgPT4gW1wiL2FwaS8qKlwiXSxcbiAgICAgICAgcHVibGljRGlyRW50cmllczogQXJyYXkuZnJvbSh7IGxlbmd0aDogMjIgfSwgKF8sIGkpID0+IGBmaWxlJHtpfS50eHRgKSxcbiAgICAgIH0pO1xuICAgIGV4cGVjdChcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgICAgICBmdW5jdGlvbkdyb3VwcyxcbiAgICAgICAgICBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzLFxuICAgICAgICAgIG1heENhY2hlQmVoYXZpb3JzOiAyNSxcbiAgICAgICAgfSksXG4gICAgKS50b1Rocm93KFxuICAgICAgLzI2IENsb3VkRnJvbnQgY2FjaGUgYmVoYXZpb3JzLioxIGZvciBgZnVuY3Rpb25Hcm91cHNgIHBhdHRlcm5zL3MsXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJyZWplY3RzIGEgZ3JvdXAgcGF0dGVybiB0aGF0IGR1cGxpY2F0ZXMgYSBwdWJsaWMvIGRpcmVjdG9yeSdzXCIsICgpID0+IHtcbiAgICAvLyBgcHVibGljL2RvY3MvYCBhbmQgYC9kb2NzLyoqYCBib3RoIGRlcGxveSBhcyBgZG9jcy8qYDogdGhlIHN5bnRoXG4gICAgLy8gc3VjY2VlZGVkIGFuZCBDbG91ZEZyb250IHJlamVjdGVkIHRoZSBkZXBsb3kuXG4gICAgY29uc3QgeyBzdGFjaywgZnVuY3Rpb25Hcm91cHMsIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsIGRpc3RyaWJ1dGlvblByb3BzIH0gPVxuICAgICAgc2V0dXAoW1wiZG9jc1wiXSk7XG4gICAgZXhwZWN0KFxuICAgICAgKCkgPT5cbiAgICAgICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgICAgIGZ1bmN0aW9uR3JvdXBzLFxuICAgICAgICAgIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsXG4gICAgICAgICAgcHVibGljRGlyRW50cmllczogW3sgbmFtZTogXCJkb2NzXCIsIGlzRGlyZWN0b3J5OiB0cnVlIH1dLFxuICAgICAgICB9KSxcbiAgICApLnRvVGhyb3coXG4gICAgICAvcGF0dGVybiBcIlxcL2RvY3NcXC9cXCpcXCpcIiBcXChncm91cCBcImRvY3NcIlxcKSBkZXBsb3lzIGFzIHRoZSBwYXRoIHBhdHRlcm4gXCJkb2NzXFwvXFwqXCIsIHdoaWNoIGEgdG9wLWxldmVsIHB1YmxpY1xcLyBlbnRyeSBhbHJlYWR5IHVzZXMvLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwicmVqZWN0cyBhIGdyb3VwIHBhdHRlcm4gYSBwdWJsaWMvIGRpcmVjdG9yeSdzIGJlaGF2aW9yIHdvdWxkIHNoYWRvd1wiLCAoKSA9PiB7XG4gICAgLy8gYGRvY3MvKmAgaXMgYWRkZWQgZmlyc3QsIHNvIGBkb2NzL2d1aWRlLypgIG5ldmVyIG1hdGNoZXMuXG4gICAgY29uc3QgeyBzdGFjaywgZnVuY3Rpb25Hcm91cHMsIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsIGRpc3RyaWJ1dGlvblByb3BzIH0gPVxuICAgICAgc2V0dXAoW1wiZ3VpZGVcIl0sIHtcbiAgICAgICAgcm91dGVzRm9yOiAoKSA9PiBbXCIvZG9jcy9ndWlkZS8qKlwiXSxcbiAgICAgIH0pO1xuICAgIGV4cGVjdChcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgICAgICBmdW5jdGlvbkdyb3VwcyxcbiAgICAgICAgICBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzLFxuICAgICAgICAgIHB1YmxpY0RpckVudHJpZXM6IFt7IG5hbWU6IFwiZG9jc1wiLCBpc0RpcmVjdG9yeTogdHJ1ZSB9XSxcbiAgICAgICAgfSksXG4gICAgKS50b1Rocm93KC9wdWJsaWNcXC8gZW50cnkgYmVoaW5kIFwiZG9jc1xcL1xcKlwiIGlzIG1hdGNoZWQgZmlyc3QvKTtcbiAgfSk7XG5cbiAgaXQoXCJyZWplY3RzIGFuIGV4YWN0IGdyb3VwIHBhdHRlcm4gZXF1YWwgdG8gYSBwdWJsaWMvIGZpbGUncywgYmFzZVBhdGggaW5jbHVkZWRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHsgc3RhY2ssIGZ1bmN0aW9uR3JvdXBzLCBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzLCBkaXN0cmlidXRpb25Qcm9wcyB9ID1cbiAgICAgIHNldHVwKFtcIm1rdFwiXSwge1xuICAgICAgICByb3V0ZXNGb3I6ICgpID0+IFtcIi9yb2JvdHMudHh0XCJdLFxuICAgICAgICBiYXNlUGF0aDogXCIvYmFzZVwiLFxuICAgICAgfSk7XG4gICAgZXhwZWN0KFxuICAgICAgKCkgPT5cbiAgICAgICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgICAgIGZ1bmN0aW9uR3JvdXBzLFxuICAgICAgICAgIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsXG4gICAgICAgICAgcHVibGljRGlyRW50cmllczogW3sgbmFtZTogXCJyb2JvdHMudHh0XCIsIGlzRGlyZWN0b3J5OiBmYWxzZSB9XSxcbiAgICAgICAgfSksXG4gICAgKS50b1Rocm93KC9kZXBsb3lzIGFzIHRoZSBwYXRoIHBhdHRlcm4gXCJcXC9iYXNlXFwvcm9ib3RzXFwudHh0XCIvKTtcbiAgfSk7XG5cbiAgaXQoXCJhbGxvd3MgYSBncm91cCBwYXR0ZXJuIGJlc2lkZSBhIHB1YmxpYy8gZW50cnkgaXQgZG9lcyBub3Qgb3ZlcmxhcFwiLCAoKSA9PiB7XG4gICAgLy8gYC9kb2NzYCBleGFjdCBpcyBub3QgdW5kZXIgYGRvY3MvKmAsIGFuZCBgZG9jcy8qYCBkb2VzIG5vdCBtYXRjaCBgL2RvY3NgLlxuICAgIGNvbnN0IHsgc3RhY2ssIGZ1bmN0aW9uR3JvdXBzLCBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzLCBkaXN0cmlidXRpb25Qcm9wcyB9ID1cbiAgICAgIHNldHVwKFtcImRvY3NcIl0sIHtcbiAgICAgICAgcm91dGVzRm9yOiAoKSA9PiBbXCIvZG9jc1wiXSxcbiAgICAgIH0pO1xuICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgZnVuY3Rpb25Hcm91cHMsXG4gICAgICBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzLFxuICAgICAgcHVibGljRGlyRW50cmllczogW3sgbmFtZTogXCJkb2NzXCIsIGlzRGlyZWN0b3J5OiB0cnVlIH1dLFxuICAgIH0pO1xuICAgIGV4cGVjdChwYXRoUGF0dGVybnMoc3RhY2spKS50b0VxdWFsKFxuICAgICAgZXhwZWN0LmFycmF5Q29udGFpbmluZyhbXCJkb2NzLypcIiwgXCJkb2NzXCJdKSxcbiAgICApO1xuICB9KTtcblxuICBpdChcInNlcnZlcyBidW5kbGVzIHVuZGVyIGEgcGF0aC1zdHlsZSBhc3NldFByZWZpeCwgcmV3cml0aW5nIHRoZSBwcmVmaXggYXdheVwiLCAoKSA9PiB7XG4gICAgLy8gTmV4dC5qcyBlbWl0cyBgPGFzc2V0UHJlZml4Pi9fbmV4dC9zdGF0aWMvLi4uYCBmb3IgZXZlcnkgYnVuZGxlIHdoaWxlIHRoZVxuICAgIC8vIG9iamVjdHMga2VlcCB0aGVpciB1bnByZWZpeGVkIFMzIGtleXMsIHNvIHdpdGhvdXQgYSBiZWhhdmlvciBvZiBpdHMgb3duIHRoZVxuICAgIC8vIHJlcXVlc3QgZmFsbHMgdGhyb3VnaCB0byB0aGUgY29tcHV0ZSBvcmlnaW4gYW5kIDQwNHMg4oCUIHRoZSBkZXBsb3ltZW50XG4gICAgLy8gcGFja2FnZSBjYXJyaWVzIG5vIGAubmV4dC9zdGF0aWNgLiBNZWFzdXJlZCBhZ2FpbnN0XG4gICAgLy8gYHRlc3QvZTJlL2FwcC1kaXIvYXNzZXQtcHJlZml4YCwgd2hlcmUgMiBvZiA3IGNhc2VzIGZhaWxlZCBvbiBleGFjdGx5IHRoYXQuXG4gICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdKTtcbiAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgIGFzc2V0UHJlZml4OiBcIi9jdXN0b20tYXNzZXQtcHJlZml4XCIsXG4gICAgfSk7XG4gICAgLy8gQWhlYWQgb2YgdGhlIGJhcmUgYF9uZXh0L3N0YXRpYypgIGluIG5vdGhpbmcgYnV0IGxpc3QgcG9zaXRpb247IHRoZSB0d29cbiAgICAvLyBwYXR0ZXJucyBjYW5ub3QgYm90aCBtYXRjaCBvbmUgcmVxdWVzdCwgc28gb3JkZXIgZG9lcyBub3QgbWF0dGVyIGhlcmUuXG4gICAgZXhwZWN0KHBhdGhQYXR0ZXJucyhzdGFjaykpLnRvRXF1YWwoW1xuICAgICAgXCJfbmV4dC9zdGF0aWMqXCIsXG4gICAgICBcIi9jdXN0b20tYXNzZXQtcHJlZml4L19uZXh0L3N0YXRpYypcIixcbiAgICAgIFwiX25leHQvaW1hZ2UqXCIsXG4gICAgXSk7XG4gICAgY29uc3QgZm5zID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5maW5kUmVzb3VyY2VzKFxuICAgICAgXCJBV1M6OkNsb3VkRnJvbnQ6OkZ1bmN0aW9uXCIsXG4gICAgKTtcbiAgICBjb25zdCBjb2RlID0gT2JqZWN0LnZhbHVlcyhmbnMpXG4gICAgICAubWFwKChmbikgPT4gZm4uUHJvcGVydGllcy5GdW5jdGlvbkNvZGUgYXMgc3RyaW5nKVxuICAgICAgLmZpbmQoKGl0KSA9PiBpdC5pbmNsdWRlcyhcInJlcXVlc3QudXJpLnNsaWNlXCIpKTtcbiAgICAvLyBgXCIvY3VzdG9tLWFzc2V0LXByZWZpeFwiLmxlbmd0aGAsIHNvIGAvY3VzdG9tLWFzc2V0LXByZWZpeC9fbmV4dC9zdGF0aWMveGBcbiAgICAvLyByZWFjaGVzIFMzIGFzIGBfbmV4dC9zdGF0aWMveGAuXG4gICAgZXhwZWN0KGNvZGUpLnRvQ29udGFpbignXCJcIiArIHJlcXVlc3QudXJpLnNsaWNlKDIwKScpO1xuICB9KTtcblxuICBpdChcInJlZnVzZXMgYW4gYXNzZXRQcmVmaXggd2hlbiBhbiBvdmVycmlkZSBhbHJlYWR5IGNsYWltcyBWSUVXRVJfUkVRVUVTVFwiLCAoKSA9PiB7XG4gICAgLy8gQ2xvdWRGcm9udCBwZXJtaXRzIG9uZSBmdW5jdGlvbiBwZXIgZXZlbnQgdHlwZSBwZXIgYmVoYXZpb3IsIHNvIHRoZVxuICAgIC8vIHJld3JpdGUgYW5kIHRoZSBvdmVycmlkZSBjYW5ub3QgY29leGlzdDogdGhlIHN0YWNrIHN5bnRoZWQgY2xlYW5seSBhbmQgd2FzXG4gICAgLy8gcmVqZWN0ZWQgYXQgZGVwbG95LCBuYW1pbmcgbmVpdGhlciB0aGUgb3ZlcnJpZGUgbm9yIGBhc3NldFByZWZpeGAuXG4gICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdKTtcbiAgICBleHBlY3QoXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICAgICAgYXNzZXRQcmVmaXg6IFwiL2NkblwiLFxuICAgICAgICAgIG92ZXJyaWRlczoge1xuICAgICAgICAgICAgc3RhdGljQmVoYXZpb3JPcHRpb25zOiB7XG4gICAgICAgICAgICAgIGZ1bmN0aW9uQXNzb2NpYXRpb25zOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBGdW5jdGlvbkV2ZW50VHlwZS5WSUVXRVJfUkVRVUVTVCxcbiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uOiBuZXcgQ2xvdWRGcm9udEZ1bmN0aW9uKHN0YWNrLCBcIlVzZXJGblwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IEZ1bmN0aW9uQ29kZS5mcm9tSW5saW5lKFxuICAgICAgICAgICAgICAgICAgICAgIFwiZnVuY3Rpb24gaGFuZGxlcihldmVudCkgeyByZXR1cm4gZXZlbnQucmVxdWVzdDsgfVwiLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgKS50b1Rocm93KC9hbHJlYWR5IGFzc29jaWF0ZXMgYSBDbG91ZEZyb250IGZ1bmN0aW9uIHdpdGggdmlld2VyLXJlcXVlc3QvKTtcbiAgfSk7XG5cbiAgY29uc3QgdXNlckZuID0gKHN0YWNrOiBTdGFjaywgZXZlbnRUeXBlOiBGdW5jdGlvbkV2ZW50VHlwZSkgPT4gKHtcbiAgICBldmVudFR5cGUsXG4gICAgZnVuY3Rpb246IG5ldyBDbG91ZEZyb250RnVuY3Rpb24oc3RhY2ssIGBVc2VyRm4ke2V2ZW50VHlwZX1gLCB7XG4gICAgICBjb2RlOiBGdW5jdGlvbkNvZGUuZnJvbUlubGluZShcbiAgICAgICAgXCJmdW5jdGlvbiBoYW5kbGVyKGV2ZW50KSB7IHJldHVybiBldmVudC5yZXF1ZXN0IHx8IGV2ZW50LnJlc3BvbnNlOyB9XCIsXG4gICAgICApLFxuICAgIH0pLFxuICB9KTtcblxuICBpdC5lYWNoKFtcImR5bmFtaWNCZWhhdmlvck9wdGlvbnNcIiwgXCJpbWFnZUJlaGF2aW9yT3B0aW9uc1wiXSBhcyBjb25zdCkoXG4gICAgXCJyZWZ1c2VzIGEgJXMgb3ZlcnJpZGUgdGhhdCB3b3VsZCByZXBsYWNlIHRoZSB4LWZvcndhcmRlZC1ob3N0IGZ1bmN0aW9uXCIsXG4gICAgKG92ZXJyaWRlTmFtZSkgPT4ge1xuICAgICAgLy8gVGhlIHJ1bnRpbWUgdHJ1c3RzIGB4LWZvcndhcmRlZC1ob3N0YCBvbiBGdW5jdGlvbiBVUkwgZXZlbnRzIGJlY2F1c2VcbiAgICAgIC8vIHRoaXMgZnVuY3Rpb24gb3ZlcndyaXRlcyBpdDsgcmVwbGFjZWQsIGEgdmlld2VyJ3Mgb3duIGhlYWRlciByZWFjaGVzIGl0LlxuICAgICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdKTtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAgICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgICAgICAgIG92ZXJyaWRlczoge1xuICAgICAgICAgICAgICBbb3ZlcnJpZGVOYW1lXToge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXNzb2NpYXRpb25zOiBbXG4gICAgICAgICAgICAgICAgICB1c2VyRm4oc3RhY2ssIEZ1bmN0aW9uRXZlbnRUeXBlLlZJRVdFUl9SRVFVRVNUKSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICkudG9UaHJvdyhcbiAgICAgICAgbmV3IFJlZ0V4cChgb3ZlcnJpZGVzXFxcXC4ke292ZXJyaWRlTmFtZX1cXFxcLmZ1bmN0aW9uQXNzb2NpYXRpb25zYCksXG4gICAgICApO1xuICAgIH0sXG4gICk7XG5cbiAgaXQoXCJrZWVwcyB0aGUgeC1mb3J3YXJkZWQtaG9zdCBmdW5jdGlvbiBuZXh0IHRvIGFuIG92ZXJyaWRlJ3Mgb3RoZXIgYXNzb2NpYXRpb25zXCIsICgpID0+IHtcbiAgICBjb25zdCB7IHN0YWNrLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW10pO1xuICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgb3ZlcnJpZGVzOiB7XG4gICAgICAgIGR5bmFtaWNCZWhhdmlvck9wdGlvbnM6IHtcbiAgICAgICAgICBmdW5jdGlvbkFzc29jaWF0aW9uczogW1xuICAgICAgICAgICAgdXNlckZuKHN0YWNrLCBGdW5jdGlvbkV2ZW50VHlwZS5WSUVXRVJfUkVTUE9OU0UpLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGNvbnN0IGNvbmZpZyA9IE9iamVjdC52YWx1ZXMoXG4gICAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmZpbmRSZXNvdXJjZXMoXCJBV1M6OkNsb3VkRnJvbnQ6OkRpc3RyaWJ1dGlvblwiKSxcbiAgICApWzBdLlByb3BlcnRpZXMuRGlzdHJpYnV0aW9uQ29uZmlnO1xuICAgIGNvbnN0IGV2ZW50VHlwZXMgPSAoXG4gICAgICBjb25maWcuRGVmYXVsdENhY2hlQmVoYXZpb3IuRnVuY3Rpb25Bc3NvY2lhdGlvbnMgYXMgQXJyYXk8e1xuICAgICAgICBFdmVudFR5cGU6IHN0cmluZztcbiAgICAgIH0+XG4gICAgKS5tYXAoKGFzc29jaWF0aW9uKSA9PiBhc3NvY2lhdGlvbi5FdmVudFR5cGUpO1xuICAgIGV4cGVjdChldmVudFR5cGVzLnNvcnQoKSkudG9FcXVhbChbXCJ2aWV3ZXItcmVxdWVzdFwiLCBcInZpZXdlci1yZXNwb25zZVwiXSk7XG4gIH0pO1xuXG4gIGl0KFwicmV3cml0ZXMgYW4gYXNzZXRQcmVmaXggYmFjayBvbnRvIHRoZSBiYXNlUGF0aCBTMyBrZXlzXCIsICgpID0+IHtcbiAgICBjb25zdCB7IHN0YWNrLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW10sIHsgYmFzZVBhdGg6IFwiL2Jhc2VcIiB9KTtcbiAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgIGFzc2V0UHJlZml4OiBcIi9jZG5cIixcbiAgICB9KTtcbiAgICBleHBlY3QocGF0aFBhdHRlcm5zKHN0YWNrKSkudG9Db250YWluKFwiL2Nkbi9fbmV4dC9zdGF0aWMqXCIpO1xuICAgIGNvbnN0IGZucyA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuZmluZFJlc291cmNlcyhcbiAgICAgIFwiQVdTOjpDbG91ZEZyb250OjpGdW5jdGlvblwiLFxuICAgICk7XG4gICAgY29uc3QgY29kZSA9IE9iamVjdC52YWx1ZXMoZm5zKVxuICAgICAgLm1hcCgoZm4pID0+IGZuLlByb3BlcnRpZXMuRnVuY3Rpb25Db2RlIGFzIHN0cmluZylcbiAgICAgIC5maW5kKChpdCkgPT4gaXQuaW5jbHVkZXMoXCJyZXF1ZXN0LnVyaS5zbGljZVwiKSk7XG4gICAgLy8gVGhlIG9iamVjdHMgYXJlIGF0IGBiYXNlL19uZXh0L3N0YXRpYy8uLi5gOiBgYXNzZXRQcmVmaXhgIHJlcGxhY2VzIHRoZVxuICAgIC8vIGBiYXNlUGF0aGAgcHJlZml4IGluIHRoZSBVUkwsIHNvIHRoZSByZXdyaXRlIGhhcyB0byBwdXQgaXQgYmFjay5cbiAgICBleHBlY3QoY29kZSkudG9Db250YWluKCdcIi9iYXNlXCIgKyByZXF1ZXN0LnVyaS5zbGljZSg0KScpO1xuICB9KTtcblxuICBpdChcInNlcnZlcyBidW5kbGVzIHVuZGVyIHRoZSBwYXRoIGFuIGFic29sdXRlIGFzc2V0UHJlZml4IGNhcnJpZXNcIiwgKCkgPT4ge1xuICAgIC8vIGBuZXh0IGJ1aWxkYCBjb21waWxlcyBhIGAvY3VzdG9tLWFzc2V0LXByZWZpeC9fbmV4dC86cGF0aCsg4oaSIC9fbmV4dC86cGF0aCtgXG4gICAgLy8gcmV3cml0ZSBvZiBpdHMgb3duIGZvciBhbiBhYnNvbHV0ZSBwcmVmaXggd2l0aCBhIHBhdGgsIHNvIGBuZXh0IHN0YXJ0YCBzZXJ2ZXNcbiAgICAvLyBldmVyeSBidW5kbGUgdW5kZXIgdGhhdCBwYXRoIGFzIHdlbGwuIEEgQ0ROIGZyb250aW5nIHRoaXMgZGlzdHJpYnV0aW9uIHRoZXJlXG4gICAgLy8gZ2V0cyB0aGUgc2FtZSByZXF1ZXN0LCBhbmQgd2l0aG91dCBhIGJlaGF2aW9yIGl0IHJlYWNoZXMgdGhlIGNvbXB1dGUgb3JpZ2luXG4gICAgLy8gYW5kIDQwNHMuIE1lYXN1cmVkIGFnYWluc3QgYHRlc3QvZTJlL2FwcC1kaXIvYXNzZXQtcHJlZml4LWFic29sdXRlYCwgd2hvc2VcbiAgICAvLyBvbmUgY2FzZSBmYWlsZWQgb24gZXhhY3RseSB0aGF0LlxuICAgIGZvciAoY29uc3QgYXNzZXRQcmVmaXggb2YgW1xuICAgICAgXCJodHRwczovL2V4YW1wbGUudmVyY2VsLnNoL2N1c3RvbS1hc3NldC1wcmVmaXhcIixcbiAgICAgIFwiLy9leGFtcGxlLnZlcmNlbC5zaC9jdXN0b20tYXNzZXQtcHJlZml4L1wiLFxuICAgIF0pIHtcbiAgICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSk7XG4gICAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgICBhc3NldFByZWZpeCxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHBhdGhQYXR0ZXJucyhzdGFjaykpLnRvQ29udGFpbihcbiAgICAgICAgXCIvY3VzdG9tLWFzc2V0LXByZWZpeC9fbmV4dC9zdGF0aWMqXCIsXG4gICAgICApO1xuICAgICAgY29uc3QgY29kZSA9IE9iamVjdC52YWx1ZXMoXG4gICAgICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuZmluZFJlc291cmNlcyhcIkFXUzo6Q2xvdWRGcm9udDo6RnVuY3Rpb25cIiksXG4gICAgICApXG4gICAgICAgIC5tYXAoKGZuKSA9PiBmbi5Qcm9wZXJ0aWVzLkZ1bmN0aW9uQ29kZSBhcyBzdHJpbmcpXG4gICAgICAgIC5maW5kKChpdCkgPT4gaXQuaW5jbHVkZXMoXCJyZXF1ZXN0LnVyaS5zbGljZVwiKSk7XG4gICAgICBleHBlY3QoY29kZSkudG9Db250YWluKCdcIlwiICsgcmVxdWVzdC51cmkuc2xpY2UoMjApJyk7XG4gICAgfVxuICB9KTtcblxuICBpdChcImFkZHMgbm8gYmVoYXZpb3IgZm9yIGFuIGFzc2V0UHJlZml4IHRoYXQgbmVlZHMgbm9uZVwiLCAoKSA9PiB7XG4gICAgLy8gQW4gYWJzb2x1dGUgcHJlZml4IHdpdGggbm8gcGF0aCBvZiBpdHMgb3duIG5hbWVzIGFuIG9yaWdpbiB0aGlzIGRpc3RyaWJ1dGlvblxuICAgIC8vIGRvZXMgbm90IHNlcnZlLCBhbmQgYSBwcmVmaXggZXF1YWwgdG8gdGhlIGJhc2VQYXRoIG9uZSBpcyB3aGF0IE5leHQuanNcbiAgICAvLyBkZWZhdWx0cyB0byB3aGVuIGBiYXNlUGF0aGAgaXMgc2V0IOKAlCBgX25leHQvc3RhdGljKmAgYWxyZWFkeSByZXNvbHZlcyB1bmRlclxuICAgIC8vIGl0LCBhbmQgYSBkdXBsaWNhdGUgcGF0dGVybiB3b3VsZCBtYWtlIENsb3VkRnJvbnQgcmVqZWN0IHRoZSBkaXN0cmlidXRpb24uXG4gICAgZm9yIChjb25zdCBbYXNzZXRQcmVmaXgsIGJhc2VQYXRoXSBvZiBbXG4gICAgICBbXCJodHRwczovL2Nkbi5leGFtcGxlLmNvbVwiLCB1bmRlZmluZWRdLFxuICAgICAgW1wiaHR0cHM6Ly9jZG4uZXhhbXBsZS5jb20vXCIsIHVuZGVmaW5lZF0sXG4gICAgICBbXCIvL2Nkbi5leGFtcGxlLmNvbVwiLCB1bmRlZmluZWRdLFxuICAgICAgW1wiL2Jhc2VcIiwgXCIvYmFzZVwiXSxcbiAgICAgIFtcImh0dHBzOi8vY2RuLmV4YW1wbGUuY29tL2Jhc2VcIiwgXCIvYmFzZVwiXSxcbiAgICAgIFtcIlwiLCB1bmRlZmluZWRdLFxuICAgIF0gYXMgY29uc3QpIHtcbiAgICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSwgeyBiYXNlUGF0aCB9KTtcbiAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICAgIGFzc2V0UHJlZml4LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBwYXR0ZXJucyA9IHBhdGhQYXR0ZXJucyhzdGFjayk7XG4gICAgICBleHBlY3QocGF0dGVybnMuZmlsdGVyKChwKSA9PiBwLmluY2x1ZGVzKFwiX25leHQvc3RhdGljXCIpKSkudG9IYXZlTGVuZ3RoKFxuICAgICAgICAxLFxuICAgICAgKTtcbiAgICAgIC8vIFRoZSB4LWZvcndhcmRlZC1ob3N0IGZ1bmN0aW9uIGlzIGFsd2F5cyB0aGVyZSBvbiBmdW5jdGlvbiBjb21wdXRlOyB0aGVcbiAgICAgIC8vIHJld3JpdGUgb25lIHNob3VsZCBub3QgYmUuXG4gICAgICBjb25zdCBjb2RlcyA9IE9iamVjdC52YWx1ZXMoXG4gICAgICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuZmluZFJlc291cmNlcyhcIkFXUzo6Q2xvdWRGcm9udDo6RnVuY3Rpb25cIiksXG4gICAgICApLm1hcCgoZm4pID0+IGZuLlByb3BlcnRpZXMuRnVuY3Rpb25Db2RlIGFzIHN0cmluZyk7XG4gICAgICBleHBlY3QoY29kZXMuc29tZSgoaXQpID0+IGl0LmluY2x1ZGVzKFwicmVxdWVzdC51cmkuc2xpY2VcIikpKS50b0JlKGZhbHNlKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KFwiY291bnRzIHRoZSBhc3NldFByZWZpeCBiZWhhdmlvciBhZ2FpbnN0IHRoZSBidWRnZXRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSwge1xuICAgICAgcHVibGljRGlyRW50cmllczogQXJyYXkuZnJvbSh7IGxlbmd0aDogMjIgfSwgKF8sIGkpID0+IGBmaWxlJHtpfS50eHRgKSxcbiAgICB9KTtcbiAgICAvLyAzIGZpeGVkICsgMjIgcHVibGljID0gMjUsIGV4YWN0bHkgdGhlIGxpbWl0OyB0aGUgYXNzZXRQcmVmaXggb25lIGlzIHRoZVxuICAgIC8vIDI2dGgsIGFuZCBhIGxpbWl0IGVycm9yIHRoYXQgZGlkIG5vdCBjb3VudCBpdCB3b3VsZCBjb21lIGFzIGEgZGVwbG95XG4gICAgLy8gZmFpbHVyZSBpbnN0ZWFkLlxuICAgIGV4cGVjdChcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgICAgICBhc3NldFByZWZpeDogXCIvY2RuXCIsXG4gICAgICAgICAgbWF4Q2FjaGVCZWhhdmlvcnM6IDI1LFxuICAgICAgICB9KSxcbiAgICApLnRvVGhyb3coLzI2IENsb3VkRnJvbnQgY2FjaGUgYmVoYXZpb3JzLio0IHVzZWQgYnkgY2RrLW5leHRqcyBpdHNlbGYvcyk7XG4gIH0pO1xuXG4gIGl0KFwiZG9lcyBub3QgY2FjaGUgYSBkeW5hbWljIHJlc3BvbnNlIHRoYXQgc2VuZHMgbm8gQ2FjaGUtQ29udHJvbFwiLCAoKSA9PiB7XG4gICAgLy8gQ0RLJ3MgYENhY2hlUG9saWN5YCBkZWZhdWx0IGlzIGEgZGF5LCB3aGljaCBjYWNoZWQgZXZlcnkgcm91dGUgaGFuZGxlclxuICAgIC8vIHdpdGhvdXQgYSBgQ2FjaGUtQ29udHJvbGAgLSBgL2FwaS9lY2hvYCBpbiBhcHAtcGxheWdyb3VuZCAtIGZvciAyNCBob3Vycy5cbiAgICBjb25zdCB7IHN0YWNrLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW10pO1xuICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIGRpc3RyaWJ1dGlvblByb3BzKTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcyhcbiAgICAgIFwiQVdTOjpDbG91ZEZyb250OjpDYWNoZVBvbGljeVwiLFxuICAgICAge1xuICAgICAgICBDYWNoZVBvbGljeUNvbmZpZzogTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgQ29tbWVudDogTWF0Y2guc3RyaW5nTGlrZVJlZ2V4cChcIkR5bmFtaWNcIiksXG4gICAgICAgICAgRGVmYXVsdFRUTDogMCxcbiAgICAgICAgICBNaW5UVEw6IDAsXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICApO1xuICB9KTtcblxuICBpdChcIndpbGRjYXJkcyBhIHB1YmxpYy8gbmFtZSBDbG91ZEZyb250IGNhbm5vdCBzcGVsbFwiLCAoKSA9PiB7XG4gICAgLy8gYHB1YmxpYy9oZWxsbyB3b3JsZC5qcGdgIGlzIGEgdmFsaWQgTmV4dC5qcyBhc3NldCwgYnV0IGEgc3BhY2UgY2Fubm90IGFwcGVhclxuICAgIC8vIGluIGEgcGF0aCBwYXR0ZXJuLCBzbyBjZGstbmV4dGpzIHRocmV3IGF0IHN5bnRoIGFuZCB0aGUgYXBwIGNvdWxkIG5vdCBiZVxuICAgIC8vIGRlcGxveWVkIGF0IGFsbC4gQ2xvdWRGcm9udCBtYXRjaGVzIHRoZSAqZGVjb2RlZCogcGF0aCwgYW5kIGA/YCBtYXRjaGVzIG9uZVxuICAgIC8vIGJ5dGUgb2YgaXQsIHNvIG9uZSBgP2AgcGVyIFVURi04IGJ5dGUgaXMgdGhlIG5hcnJvd2VzdCBwYXR0ZXJuIHRoYXRcbiAgICAvLyBtYXRjaGVzLiBOb3Qgb25lIHBlciBwZXJjZW50LWVuY29kZWQgY2hhcmFjdGVyOiBgaGVsbG8/Pz93b3JsZC5qcGdgXG4gICAgLy8gZGVwbG95cyBhbmQgdGhlbiBuZXZlciBtYXRjaGVzLCB3aGljaCBpcyBhIDQwNCByYXRoZXIgdGhhbiBhIHN5bnRoIGVycm9yLlxuICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSwge1xuICAgICAgcHVibGljRGlyRW50cmllczogW1wiaGVsbG8gd29ybGQuanBnXCIsIFwiw6TDtsO8xaHEjcWZw60ucG5nXCIsIFwiZmF2aWNvbi5pY29cIl0sXG4gICAgfSk7XG4gICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwgZGlzdHJpYnV0aW9uUHJvcHMpO1xuICAgIGV4cGVjdChwYXRoUGF0dGVybnMoc3RhY2spKS50b0VxdWFsKFxuICAgICAgZXhwZWN0LmFycmF5Q29udGFpbmluZyhbXG4gICAgICAgIFwiaGVsbG8/d29ybGQuanBnXCIsXG4gICAgICAgIC8vIDcgY2hhcmFjdGVycywgMiBVVEYtOCBieXRlcyBlYWNoLlxuICAgICAgICBgJHtcIj9cIi5yZXBlYXQoMTQpfS5wbmdgLFxuICAgICAgICBcImZhdmljb24uaWNvXCIsXG4gICAgICBdKSxcbiAgICApO1xuICB9KTtcblxuICBpdChcIndpbGRjYXJkcyBhIHB1YmxpYy8gZGlyZWN0b3J5IG5hbWUgdGhlIHNhbWUgd2F5XCIsICgpID0+IHtcbiAgICBjb25zdCB7IHN0YWNrLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW10pO1xuICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgcHVibGljRGlyRW50cmllczogW3sgbmFtZTogXCJteSBpbWFnZXNcIiwgaXNEaXJlY3Rvcnk6IHRydWUgfV0sXG4gICAgfSk7XG4gICAgZXhwZWN0KHBhdGhQYXR0ZXJucyhzdGFjaykpLnRvQ29udGFpbihcIm15P2ltYWdlcy8qXCIpO1xuICB9KTtcblxuICBpdChcInJlamVjdHMgYSBwdWJsaWMvIG5hbWUgdG9vIGxvbmcgdG8gZXhwcmVzcyBhcyBhIHBhdGggcGF0dGVyblwiLCAoKSA9PiB7XG4gICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdLCB7XG4gICAgICBwdWJsaWNEaXJFbnRyaWVzOiBbYCR7XCLDpFwiLnJlcGVhdCgxMzApfS5wbmdgXSxcbiAgICB9KTtcbiAgICBleHBlY3QoXG4gICAgICAoKSA9PiBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCBkaXN0cmlidXRpb25Qcm9wcyksXG4gICAgKS50b1Rocm93KC9uZWVkcyBhIDI2NC1jaGFyYWN0ZXIgQ2xvdWRGcm9udCBwYXRoIHBhdHRlcm4vKTtcbiAgfSk7XG5cbiAgaXQoXCJza2lwcyBhIHB1YmxpYy8gZW50cnkgd2hvc2UgcGF0dGVybiB3b3VsZCBiZSB3aWxkY2FyZHMgYWxvbmVcIiwgKCkgPT4ge1xuICAgIC8vIGDRhNC+0YLQvi9gIGlzIGA/Pz8/Pz8/Py8qYCwgd2hpY2ggbWF0Y2hlcyBhbnkgOC1ieXRlIGZpcnN0IHNlZ21lbnQuIFB1YmxpY1xuICAgIC8vIGJlaGF2aW9ycyBhcmUgYWRkZWQgYWhlYWQgb2YgdGhlIGNvbXB1dGUgb25lcywgc28gYC9wcm9kdWN0cy80MmAgd291bGQgZ29cbiAgICAvLyB0byBTMyBhbmQgNDAzLiBUaGUgZW50cnkgZ2V0cyBubyBiZWhhdmlvciBhbmQgYSB3YXJuaW5nIGluc3RlYWQuXG4gICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdKTtcbiAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IFtcbiAgICAgICAgeyBuYW1lOiBcItGE0L7RgtC+XCIsIGlzRGlyZWN0b3J5OiB0cnVlIH0sXG4gICAgICAgIHsgbmFtZTogXCLlm75cIiwgaXNEaXJlY3Rvcnk6IGZhbHNlIH0sXG4gICAgICAgIHsgbmFtZTogXCLRhNC+0YLQvi0xXCIsIGlzRGlyZWN0b3J5OiB0cnVlIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGNvbnN0IHBhdHRlcm5zID0gcGF0aFBhdHRlcm5zKHN0YWNrKTtcbiAgICBleHBlY3QocGF0dGVybnMpLm5vdC50b0NvbnRhaW4oYCR7XCI/XCIucmVwZWF0KDgpfS8qYCk7XG4gICAgZXhwZWN0KHBhdHRlcm5zKS5ub3QudG9Db250YWluKFwiPz8/XCIpO1xuICAgIC8vIE9uZSBsaXRlcmFsIGNoYXJhY3RlciBrZWVwcyBhIHBhdHRlcm4gbmFycm93IGVub3VnaCB0byBrZWVwLlxuICAgIGV4cGVjdChwYXR0ZXJucykudG9Db250YWluKGAke1wiP1wiLnJlcGVhdCg4KX0tMS8qYCk7XG4gICAgQW5ub3RhdGlvbnMuZnJvbVN0YWNrKHN0YWNrKS5oYXNXYXJuaW5nKFxuICAgICAgXCIqXCIsXG4gICAgICBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKCdcItGE0L7RgtC+XCIsIFwi5Zu+XCInKSxcbiAgICApO1xuICB9KTtcblxuICBpdChcImRvZXMgbm90IGNvdW50IGEgc2tpcHBlZCBwdWJsaWMvIGVudHJ5IGFnYWluc3QgdGhlIGJ1ZGdldFwiLCAoKSA9PiB7XG4gICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdLCB7XG4gICAgICBwdWJsaWNEaXJFbnRyaWVzOiBbXG4gICAgICAgIC4uLkFycmF5LmZyb20oeyBsZW5ndGg6IDIyIH0sIChfLCBpKSA9PiBgZmlsZSR7aX0udHh0YCksXG4gICAgICAgIFwi5Zu+XCIsXG4gICAgICBdLFxuICAgIH0pO1xuICAgIC8vIDMgZml4ZWQgKyAyMiA9IDI1LCBleGFjdGx5IHRoZSBsaW1pdDsgdGhlIHNraXBwZWQgZW50cnkgYWRkcyBub3RoaW5nLlxuICAgIGV4cGVjdChcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgICAgICBtYXhDYWNoZUJlaGF2aW9yczogMjUsXG4gICAgICAgIH0pLFxuICAgICkubm90LnRvVGhyb3coKTtcbiAgfSk7XG5cbiAgaXQoXCJjaGVja3MgdGhlIGxlbmd0aCBvZiB0aGUgZmluYWwgcGF0dGVybiwgYmFzZVBhdGggYW5kIC8qIGluY2x1ZGVkXCIsICgpID0+IHtcbiAgICAvLyA4MyB0aHJlZS1ieXRlIGNoYXJhY3RlcnMgKyBcIi5wZGZcIiBpcyBhIDI1My1jaGFyYWN0ZXIgcGF0dGVybiBvbiBpdHMgb3duLFxuICAgIC8vIHVuZGVyIHRoZSBsaW1pdDsgYC9kb2NzL2AgaW4gZnJvbnQgdGFrZXMgaXQgdG8gMjU5LCB3aGljaCBDbG91ZEZyb250XG4gICAgLy8gcmVqZWN0cyBhdCBkZXBsb3kuXG4gICAgY29uc3QgbmFtZSA9IGAke1wi5Zu+XCIucmVwZWF0KDgzKX0ucGRmYDtcbiAgICBjb25zdCB7IHN0YWNrLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW10sIHtcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IFtuYW1lXSxcbiAgICB9KTtcbiAgICBleHBlY3QoXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICAgICAgYmFzZVBhdGg6IFwiL2RvY3NcIixcbiAgICAgICAgfSksXG4gICAgKS50b1Rocm93KC9uZWVkcyBhIDI1OS1jaGFyYWN0ZXIgQ2xvdWRGcm9udCBwYXRoIHBhdHRlcm4vKTtcblxuICAgIGNvbnN0IHsgc3RhY2s6IGRpclN0YWNrLCBkaXN0cmlidXRpb25Qcm9wczogZGlyUHJvcHMgfSA9IHNldHVwKFtdKTtcbiAgICBleHBlY3QoXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKGRpclN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAgICAgLi4uZGlyUHJvcHMsXG4gICAgICAgICAgLy8gMjU0IGNoYXJhY3RlcnMsIHVuZGVyIHRoZSBsaW1pdCB1bnRpbCB0aGUgYC8qYC5cbiAgICAgICAgICBwdWJsaWNEaXJFbnRyaWVzOiBbXG4gICAgICAgICAgICB7IG5hbWU6IGBhYiR7XCLlm75cIi5yZXBlYXQoODQpfWAsIGlzRGlyZWN0b3J5OiB0cnVlIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSksXG4gICAgKS50b1Rocm93KC9uZWVkcyBhIDI1Ni1jaGFyYWN0ZXIvKTtcbiAgfSk7XG5cbiAgaXQoXCJkcm9wcyB0aGUgY2FjaGUga2V5IHdoZW4gYW4gb3ZlcnJpZGUgZGlzYWJsZXMgZHluYW1pYyBjYWNoaW5nXCIsICgpID0+IHtcbiAgICAvLyBDbG91ZEZyb250IHJlamVjdHMgYSBwb2xpY3kgdGhhdCBjYWNoZXMgbm90aGluZyBidXQga2V5cyBvbiBoZWFkZXJzLiBDREtcbiAgICAvLyB1c2VkIHRvIHJhaXNlIGBtYXhUdGw6IDBgIHRvIHRoZSBkYXktbG9uZyBkZWZhdWx0LCBzbyB0aGUgb3ZlcnJpZGVcbiAgICAvLyBkZXBsb3llZDsgd2l0aCBhIGRlZmF1bHQgb2YgMCBpdCBpcyBob25vcmVkLCBhbmQgbXVzdCBzdGF5IGRlcGxveWFibGUuXG4gICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdKTtcbiAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgIG92ZXJyaWRlczoge1xuICAgICAgICBkeW5hbWljQ2FjaGVQb2xpY3lQcm9wczogeyBtYXhUdGw6IER1cmF0aW9uLnNlY29uZHMoMCkgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoXG4gICAgICBcIkFXUzo6Q2xvdWRGcm9udDo6Q2FjaGVQb2xpY3lcIixcbiAgICAgIHtcbiAgICAgICAgQ2FjaGVQb2xpY3lDb25maWc6IE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgIENvbW1lbnQ6IE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoXCJEeW5hbWljXCIpLFxuICAgICAgICAgIERlZmF1bHRUVEw6IDAsXG4gICAgICAgICAgTWF4VFRMOiAwLFxuICAgICAgICAgIE1pblRUTDogMCxcbiAgICAgICAgICBQYXJhbWV0ZXJzSW5DYWNoZUtleUFuZEZvcndhcmRlZFRvT3JpZ2luOiB7XG4gICAgICAgICAgICBDb29raWVzQ29uZmlnOiB7IENvb2tpZUJlaGF2aW9yOiBcIm5vbmVcIiB9LFxuICAgICAgICAgICAgRW5hYmxlQWNjZXB0RW5jb2RpbmdCcm90bGk6IGZhbHNlLFxuICAgICAgICAgICAgRW5hYmxlQWNjZXB0RW5jb2RpbmdHemlwOiBmYWxzZSxcbiAgICAgICAgICAgIEhlYWRlcnNDb25maWc6IHsgSGVhZGVyQmVoYXZpb3I6IFwibm9uZVwiIH0sXG4gICAgICAgICAgICBRdWVyeVN0cmluZ3NDb25maWc6IHsgUXVlcnlTdHJpbmdCZWhhdmlvcjogXCJub25lXCIgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJrZWVwcyB0aGUgY2FjaGUga2V5IHdoZW4gYSB6ZXJvIG1heFR0bCBpcyByYWlzZWQgYnkgYW5vdGhlciBUVExcIiwgKCkgPT4ge1xuICAgIC8vIENESyByYWlzZXMgYG1heFR0bGAgdG8gYGRlZmF1bHRUdGxgLCBzbyB0aGlzIHBvbGljeSBjYWNoZXMgZm9yIGFuIGhvdXIuXG4gICAgLy8gRHJvcHBpbmcgdGhlIGtleSBmb3IgaXQgd291bGQgc2VydmUgb25lIHZpZXdlcidzIHBhZ2UgdG8gZXZlcnkgdmlld2VyLlxuICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSk7XG4gICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICBvdmVycmlkZXM6IHtcbiAgICAgICAgZHluYW1pY0NhY2hlUG9saWN5UHJvcHM6IHtcbiAgICAgICAgICBtYXhUdGw6IER1cmF0aW9uLnNlY29uZHMoMCksXG4gICAgICAgICAgZGVmYXVsdFR0bDogRHVyYXRpb24uaG91cnMoMSksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKFxuICAgICAgXCJBV1M6OkNsb3VkRnJvbnQ6OkNhY2hlUG9saWN5XCIsXG4gICAgICB7XG4gICAgICAgIENhY2hlUG9saWN5Q29uZmlnOiBNYXRjaC5vYmplY3RMaWtlKHtcbiAgICAgICAgICBDb21tZW50OiBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKFwiRHluYW1pY1wiKSxcbiAgICAgICAgICBNYXhUVEw6IDM2MDAsXG4gICAgICAgICAgUGFyYW1ldGVyc0luQ2FjaGVLZXlBbmRGb3J3YXJkZWRUb09yaWdpbjogTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgICBDb29raWVzQ29uZmlnOiB7IENvb2tpZUJlaGF2aW9yOiBcImFsbFwiIH0sXG4gICAgICAgICAgICBRdWVyeVN0cmluZ3NDb25maWc6IHsgUXVlcnlTdHJpbmdCZWhhdmlvcjogXCJhbGxcIiB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJrZXlzIHRoZSBkeW5hbWljIGNhY2hlIG9ubHkgb24gaGVhZGVycyB0aGUgb3JpZ2luIHJlYWRzXCIsICgpID0+IHtcbiAgICAvLyBgeC1tYXRjaGVkLXBhdGhgIGlzIHN0cmlwcGVkIGJ5IHRoZSBydW50aW1lIGFuZCBgeC1uZXh0LWNhY2hlLXRhZ3NgIGlzXG4gICAgLy8gbmV2ZXIgc2VudCBieSB2aWV3ZXJzOiBrZXlpbmcgb24gZWl0aGVyIHNwZW5kcyBhIGhlYWRlciBzbG90IGFuZCBsZXRzIGFcbiAgICAvLyBjbGllbnQgZnJhZ21lbnQgdGhlIGNhY2hlIGZvciBub3RoaW5nLlxuICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSk7XG4gICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwgZGlzdHJpYnV0aW9uUHJvcHMpO1xuICAgIGNvbnN0IHBvbGljaWVzID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5maW5kUmVzb3VyY2VzKFxuICAgICAgXCJBV1M6OkNsb3VkRnJvbnQ6OkNhY2hlUG9saWN5XCIsXG4gICAgICB7XG4gICAgICAgIFByb3BlcnRpZXM6IHtcbiAgICAgICAgICBDYWNoZVBvbGljeUNvbmZpZzogeyBDb21tZW50OiBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKFwiRHluYW1pY1wiKSB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuICAgIGNvbnN0IFtwb2xpY3ldID0gT2JqZWN0LnZhbHVlcyhwb2xpY2llcyk7XG4gICAgY29uc3QgaGVhZGVyczogc3RyaW5nW10gPVxuICAgICAgcG9saWN5LlByb3BlcnRpZXMuQ2FjaGVQb2xpY3lDb25maWdcbiAgICAgICAgLlBhcmFtZXRlcnNJbkNhY2hlS2V5QW5kRm9yd2FyZGVkVG9PcmlnaW4uSGVhZGVyc0NvbmZpZy5IZWFkZXJzO1xuICAgIGV4cGVjdChoZWFkZXJzKS5ub3QudG9Db250YWluKFwieC1tYXRjaGVkLXBhdGhcIik7XG4gICAgZXhwZWN0KGhlYWRlcnMpLm5vdC50b0NvbnRhaW4oXCJ4LW5leHQtY2FjaGUtdGFnc1wiKTtcbiAgICBleHBlY3QoaGVhZGVycykudG9Db250YWluKFwicnNjXCIpO1xuICB9KTtcblxuICBpdChcInJlamVjdHMgc3BsaXR0aW5nIG9uIGEgZGVwbG95bWVudCB0eXBlIHRoYXQgY2Fubm90IHJvdXRlIGl0XCIsICgpID0+IHtcbiAgICBjb25zdCB7IHN0YWNrLCBmdW5jdGlvbkdyb3VwcywgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9XG4gICAgICBzZXR1cChbXCJhcGlcIl0pO1xuICAgIGV4cGVjdChcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgICAgICBuZXh0anNUeXBlOiBOZXh0anNUeXBlLkdMT0JBTF9DT05UQUlORVJTLFxuICAgICAgICAgIGxvYWRCYWxhbmNlcjogdW5kZWZpbmVkLFxuICAgICAgICAgIGZ1bmN0aW9uR3JvdXBzLFxuICAgICAgICAgIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsXG4gICAgICAgIH0pLFxuICAgICkudG9UaHJvdygvb25seSBzdXBwb3J0ZWQgYnkgTmV4dGpzR2xvYmFsRnVuY3Rpb25zLyk7XG4gIH0pO1xufSk7XG5cbi8qKlxuICogVGhlIHZpZXdlci1yZXF1ZXN0IGZ1bmN0aW9uLCBydW4gYXMgQ2xvdWRGcm9udCB3b3VsZCBydW4gaXQuXG4gKlxuICogSXQgaXMgYXV0aG9yZWQgYXMgYSBzdHJpbmcgaW5zaWRlIGEgVHlwZVNjcmlwdCB0ZW1wbGF0ZSBsaXRlcmFsLCBzbyBldmVyeVxuICogYmFja3NsYXNoIGluIGl0IGlzIGVzY2FwZWQgdHdpY2UgLSBhbmQgYSByZWdleCB0aGF0IGNvbGxhcHNlcyBzbGFzaGVzIGlzIG5vdGhpbmdcbiAqIGJ1dCBiYWNrc2xhc2hlcy4gQXNzZXJ0aW5nIG9uIGJlaGF2aW9yIHJhdGhlciB0aGFuIG9uIHRoZSB0ZXh0IGlzIHdoYXQgY2F0Y2hlcyBhblxuICogZXNjYXBpbmcgbWlzdGFrZSwgd2hpY2ggYSBzbmFwc2hvdCB3b3VsZCBoYXBwaWx5IHJlY29yZC5cbiAqL1xuZGVzY3JpYmUoXCJ0aGUgdmlld2VyLXJlcXVlc3QgQ2xvdWRGcm9udCBGdW5jdGlvblwiLCAoKSA9PiB7XG4gIGludGVyZmFjZSBRdWVyeVZhbHVlIHtcbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIG11bHRpVmFsdWU/OiBBcnJheTx7IHZhbHVlOiBzdHJpbmcgfT47XG4gIH1cbiAgaW50ZXJmYWNlIEZ1bmN0aW9uUmVxdWVzdCB7XG4gICAgdXJpOiBzdHJpbmc7XG4gICAgcXVlcnlzdHJpbmc6IFJlY29yZDxzdHJpbmcsIFF1ZXJ5VmFsdWU+O1xuICAgIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHN0cmluZyB9PjtcbiAgfVxuICB0eXBlIEZ1bmN0aW9uUmVzdWx0ID1cbiAgICB8IEZ1bmN0aW9uUmVxdWVzdFxuICAgIHwgeyBzdGF0dXNDb2RlOiBudW1iZXI7IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHN0cmluZyB9PiB9O1xuXG4gIGNvbnN0IGhhbmRsZXIgPSAoKCkgPT4ge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKG5ldyBBcHAoKSwgXCJGblN0YWNrXCIpO1xuICAgIGNvbnN0IGZuID0gbmV3IExhbWJkYUZ1bmN0aW9uKHN0YWNrLCBcIkZuXCIsIHtcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZShcImV4cG9ydHMuaGFuZGxlciA9ICgpID0+IHt9O1wiKSxcbiAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICB9KTtcbiAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICBhc3NldHNCdWNrZXQ6IG5ldyBCdWNrZXQoc3RhY2ssIFwiQXNzZXRzXCIpLFxuICAgICAgZnVuY3Rpb25Vcmw6IG5ldyBGdW5jdGlvblVybChzdGFjaywgXCJVcmxcIiwge1xuICAgICAgICBmdW5jdGlvbjogZm4sXG4gICAgICAgIGF1dGhUeXBlOiBGdW5jdGlvblVybEF1dGhUeXBlLkFXU19JQU0sXG4gICAgICB9KSxcbiAgICAgIG5leHRqc1R5cGU6IE5leHRqc1R5cGUuR0xPQkFMX0ZVTkNUSU9OUyxcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IFtdLFxuICAgIH0pO1xuICAgIGNvbnN0IGZ1bmN0aW9ucyA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuZmluZFJlc291cmNlcyhcbiAgICAgIFwiQVdTOjpDbG91ZEZyb250OjpGdW5jdGlvblwiLFxuICAgICk7XG4gICAgY29uc3QgY29kZSA9IE9iamVjdC52YWx1ZXMoZnVuY3Rpb25zKVswXS5Qcm9wZXJ0aWVzLkZ1bmN0aW9uQ29kZSBhcyBzdHJpbmc7XG4gICAgcmV0dXJuIHJ1bkluTmV3Q29udGV4dChgJHtjb2RlfVxcbmhhbmRsZXJgKSBhcyAoZXZlbnQ6IHtcbiAgICAgIHJlcXVlc3Q6IEZ1bmN0aW9uUmVxdWVzdDtcbiAgICB9KSA9PiBGdW5jdGlvblJlc3VsdDtcbiAgfSkoKTtcblxuICBjb25zdCBzZW5kID0gKFxuICAgIHVyaTogc3RyaW5nLFxuICAgIHF1ZXJ5c3RyaW5nOiBSZWNvcmQ8c3RyaW5nLCBRdWVyeVZhbHVlPiA9IHt9LFxuICApOiBGdW5jdGlvblJlc3VsdCA9PlxuICAgIGhhbmRsZXIoe1xuICAgICAgcmVxdWVzdDogeyB1cmksIHF1ZXJ5c3RyaW5nLCBoZWFkZXJzOiB7IGhvc3Q6IHsgdmFsdWU6IFwiYS50ZXN0XCIgfSB9IH0sXG4gICAgfSk7XG5cbiAgY29uc3QgcmVkaXJlY3QgPSAocmVzdWx0OiBGdW5jdGlvblJlc3VsdCkgPT4gKHtcbiAgICBzdGF0dXNDb2RlOiAocmVzdWx0IGFzIHsgc3RhdHVzQ29kZTogbnVtYmVyIH0pLnN0YXR1c0NvZGUsXG4gICAgbG9jYXRpb246IHJlc3VsdC5oZWFkZXJzLmxvY2F0aW9uPy52YWx1ZSxcbiAgfSk7XG5cbiAgaXQuZWFjaChbXG4gICAgW1wiLy9cIiwgXCIvXCJdLFxuICAgIFtcIi8vL1wiLCBcIi9cIl0sXG4gICAgW1wiL2Zvby8vYmFyXCIsIFwiL2Zvby9iYXJcIl0sXG4gICAgW1wiL2Jhc2VwYXRoLy90by1zdlwiLCBcIi9iYXNlcGF0aC90by1zdlwiXSxcbiAgICBbXCIvYVxcXFxiXCIsIFwiL2EvYlwiXSxcbiAgXSkoXCJyZWRpcmVjdHMgJXMgdG8gJXMgd2l0aCBhIDMwOFwiLCAodXJpLCBsb2NhdGlvbikgPT4ge1xuICAgIGV4cGVjdChyZWRpcmVjdChzZW5kKHVyaSkpKS50b0VxdWFsKHsgc3RhdHVzQ29kZTogMzA4LCBsb2NhdGlvbiB9KTtcbiAgfSk7XG5cbiAgaXQoXCJrZWVwcyB0aGUgcXVlcnkgb24gdGhlIHJlZGlyZWN0LCBpbmNsdWRpbmcgcmVwZWF0ZWQga2V5c1wiLCAoKSA9PiB7XG4gICAgLy8gQ2xvdWRGcm9udCdzIHNoYXBlIGZvciBhIHJlcGVhdGVkIGtleTogYG11bHRpVmFsdWVgIGhvbGRzIGV2ZXJ5IHZhbHVlLFxuICAgIC8vIHRoZSBmaXJzdCBpbmNsdWRlZCwgYW5kIGB2YWx1ZWAgcmVwZWF0cyB0aGF0IGZpcnN0IG9uZS5cbiAgICBjb25zdCByZXN1bHQgPSBzZW5kKFwiL3gvL3lcIiwge1xuICAgICAganNvbjogeyB2YWx1ZTogXCJ0cnVlXCIgfSxcbiAgICAgIGE6IHsgdmFsdWU6IFwiMVwiLCBtdWx0aVZhbHVlOiBbeyB2YWx1ZTogXCIxXCIgfSwgeyB2YWx1ZTogXCIyXCIgfV0gfSxcbiAgICAgIGZsYWc6IHsgdmFsdWU6IFwiXCIgfSxcbiAgICB9KTtcbiAgICBleHBlY3QocmVkaXJlY3QocmVzdWx0KS5sb2NhdGlvbikudG9CZShcIi94L3k/anNvbj10cnVlJmE9MSZhPTImZmxhZ1wiKTtcbiAgfSk7XG5cbiAgaXQoXCJwYXNzZXMgcGVyY2VudC1lbmNvZGVkIHF1ZXJ5IHZhbHVlcyB0aHJvdWdoIHdpdGhvdXQgcmUtZW5jb2RpbmdcIiwgKCkgPT4ge1xuICAgIC8vIENsb3VkRnJvbnQgaGFuZHMgdGhlIGZ1bmN0aW9uIHRoZSB2YWx1ZXMgc3RpbGwgZW5jb2RlZCwgYXMgc2VudC5cbiAgICBjb25zdCByZXN1bHQgPSBzZW5kKFwiL3gvL3lcIiwge1xuICAgICAgYTogeyB2YWx1ZTogXCIlMjBiJTI2Y1wiIH0sXG4gICAgICBwOiB7IHZhbHVlOiBcIjErMlwiIH0sXG4gICAgfSk7XG4gICAgZXhwZWN0KHJlZGlyZWN0KHJlc3VsdCkubG9jYXRpb24pLnRvQmUoXCIveC95P2E9JTIwYiUyNmMmcD0xKzJcIik7XG4gIH0pO1xuXG4gIGl0KFwicGFzc2VzIGFuIG9yZGluYXJ5IHBhdGggdGhyb3VnaCB3aXRoIHgtZm9yd2FyZGVkLWhvc3Qgc2V0XCIsICgpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBzZW5kKFwiL2EvYlwiKSBhcyBGdW5jdGlvblJlcXVlc3Q7XG4gICAgZXhwZWN0KHJlc3VsdC51cmkpLnRvQmUoXCIvYS9iXCIpO1xuICAgIC8vIENsb3VkRnJvbnQgcmV3cml0ZXMgYGhvc3RgIHRvIHRoZSBvcmlnaW4gZG9tYWluLCBzbyB0aGUgYXBwIHdvdWxkIG90aGVyd2lzZVxuICAgIC8vIGJ1aWxkIGV2ZXJ5IGFic29sdXRlIFVSTCBhZ2FpbnN0IHRoZSBGdW5jdGlvbiBVUkwncyBob3N0bmFtZS5cbiAgICBleHBlY3QocmVzdWx0LmhlYWRlcnNbXCJ4LWZvcndhcmRlZC1ob3N0XCJdLnZhbHVlKS50b0JlKFwiYS50ZXN0XCIpO1xuICB9KTtcblxuICBpdChcIm92ZXJ3cml0ZXMgYSBjbGllbnQtc3VwcGxpZWQgeC1mb3J3YXJkZWQtaG9zdFwiLCAoKSA9PiB7XG4gICAgLy8gVGhlIHJ1bnRpbWUgdHJ1c3RzIHRoaXMgaGVhZGVyIGJlaGluZCB0aGUgRnVuY3Rpb24gVVJMLCBzbyBhIHZpZXdlcidzXG4gICAgLy8gb3duIHZhbHVlIG11c3Qgbm90IHN1cnZpdmUgdG8gYnVpbGQgcmVkaXJlY3RzIG9yIG9yaWdpbiBjaGVja3MuXG4gICAgY29uc3QgcmVzdWx0ID0gaGFuZGxlcih7XG4gICAgICByZXF1ZXN0OiB7XG4gICAgICAgIHVyaTogXCIvYVwiLFxuICAgICAgICBxdWVyeXN0cmluZzoge30sXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBob3N0OiB7IHZhbHVlOiBcImEudGVzdFwiIH0sXG4gICAgICAgICAgXCJ4LWZvcndhcmRlZC1ob3N0XCI6IHsgdmFsdWU6IFwiZXZpbC50ZXN0XCIgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSkgYXMgRnVuY3Rpb25SZXF1ZXN0O1xuICAgIGV4cGVjdChyZXN1bHQuaGVhZGVyc1tcIngtZm9yd2FyZGVkLWhvc3RcIl0udmFsdWUpLnRvQmUoXCJhLnRlc3RcIik7XG4gIH0pO1xufSk7XG4iXX0=
1177
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWRpc3RyaWJ1dGlvbi50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25leHRqcy1kaXN0cmlidXRpb24udGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHFDQUEwQztBQUMxQyw2Q0FBeUQ7QUFDekQsdURBQXNFO0FBQ3RFLCtEQU1vQztBQUNwQywrRUFBZ0U7QUFDaEUsaURBQTBDO0FBQzFDLHVGQUFpRjtBQUNqRix1REFNZ0M7QUFDaEMsK0NBQTRDO0FBQzVDLCtEQUE0RDtBQUM1RCwyQ0FBeUM7QUFDekMsK0RBSStCO0FBRS9COzs7OztHQUtHO0FBQ0gsUUFBUSxDQUFDLDZDQUE2QyxFQUFFLEdBQUcsRUFBRTtJQUMzRCxNQUFNLEtBQUssR0FBRyxDQUNaLFVBQW9CLEVBQ3BCLFFBS0ksRUFBRSxFQUNOLEVBQUU7UUFDRixNQUFNLEtBQUssR0FBRyxJQUFJLG1CQUFLLENBQUMsSUFBSSxpQkFBRyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDaEQsTUFBTSxjQUFjLEdBQXNDLFVBQVUsQ0FBQyxHQUFHLENBQ3RFLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDUCxNQUFNLEVBQUUsR0FBRyxJQUFJLHFCQUFjLENBQUMsS0FBSyxFQUFFLEtBQUssSUFBSSxFQUFFLEVBQUU7Z0JBQ2hELElBQUksRUFBRSxpQkFBSSxDQUFDLFVBQVUsQ0FBQyw2QkFBNkIsQ0FBQztnQkFDcEQsT0FBTyxFQUFFLGVBQWU7Z0JBQ3hCLE9BQU8sRUFBRSxvQkFBTyxDQUFDLFdBQVc7YUFDN0IsQ0FBQyxDQUFDO1lBQ0gsT0FBTztnQkFDTCxJQUFJO2dCQUNKLFdBQVcsRUFBRSxJQUFJLHdCQUFXLENBQUMsS0FBSyxFQUFFLE1BQU0sSUFBSSxFQUFFLEVBQUU7b0JBQ2hELFFBQVEsRUFBRSxFQUFFO29CQUNaLFFBQVEsRUFBRSxnQ0FBbUIsQ0FBQyxPQUFPO2lCQUN0QyxDQUFDO2FBQ0gsQ0FBQztRQUNKLENBQUMsQ0FD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MUIsQ0FBQztRQUNGO1lBQ0UsNkNBQTZDO1lBQzdDLGlEQUFpRDtZQUNqRCxzQ0FBc0M7U0FDdkM7UUFDRDtZQUNFLDJDQUEyQztZQUMzQywwREFBMEQ7WUFDMUQsc0NBQXNDO1NBQ3ZDO1FBQ0Q7WUFDRSx5Q0FBeUM7WUFDekMsdUNBQXVDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLO1lBQ2pFLGtDQUFrQztTQUNuQztLQUNGLENBQUMsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDaEQsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0MsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJ1bkluTmV3Q29udGV4dCB9IGZyb20gXCJub2RlOnZtXCI7XG5pbXBvcnQgeyBBcHAsIER1cmF0aW9uLCBMYXp5LCBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgQW5ub3RhdGlvbnMsIE1hdGNoLCBUZW1wbGF0ZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hc3NlcnRpb25zXCI7XG5pbXBvcnQge1xuICBGdW5jdGlvbiBhcyBDbG91ZEZyb250RnVuY3Rpb24sXG4gIEZ1bmN0aW9uQ29kZSxcbiAgRnVuY3Rpb25FdmVudFR5cGUsXG4gIEtleVZhbHVlU3RvcmUsXG4gIFJlc3BvbnNlSGVhZGVyc1BvbGljeSxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250XCI7XG5pbXBvcnQgeyBIdHRwT3JpZ2luIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250LW9yaWdpbnNcIjtcbmltcG9ydCB7IFZwYyB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlciB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWxhc3RpY2xvYWRiYWxhbmNpbmd2MlwiO1xuaW1wb3J0IHtcbiAgQ29kZSxcbiAgRnVuY3Rpb24gYXMgTGFtYmRhRnVuY3Rpb24sXG4gIEZ1bmN0aW9uVXJsLFxuICBGdW5jdGlvblVybEF1dGhUeXBlLFxuICBSdW50aW1lLFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHsgQnVja2V0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiO1xuaW1wb3J0IHsgcGF0aFBhdHRlcm5zRm9yIH0gZnJvbSBcIi4vYWRhcHRlci9mdW5jdGlvbi1ncm91cHNcIjtcbmltcG9ydCB7IE5leHRqc1R5cGUgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIE5leHRqc0Rpc3RyaWJ1dGlvbixcbiAgTmV4dGpzRGlzdHJpYnV0aW9uRnVuY3Rpb25Hcm91cCxcbiAgTmV4dGpzRGlzdHJpYnV0aW9uT3ZlcnJpZGVzLFxufSBmcm9tIFwiLi9uZXh0anMtZGlzdHJpYnV0aW9uXCI7XG5cbi8qKlxuICogYGZ1bmN0aW9uR3JvdXBzYCByb3V0aW5nIGF0IHRoZSBlZGdlLiBgTmV4dGpzQnVpbGRgIGlzIGRlbGliZXJhdGVseSBub3RcbiAqIGludm9sdmVkOiB3aGljaCBiZWhhdmlvcnMgYSBncm91cCBnZXRzLCBhbmQgaW4gd2hhdCBvcmRlciwgaXMgdGhlIGFkYXB0ZXInc1xuICogZGVjaXNpb24gKGBmdW5jdGlvbi1ncm91cHMudGVzdC50c2ApLCBzbyB0aGVzZSBwYXNzIHRoZSBiZWhhdmlvcnMgaW4gZGlyZWN0bHlcbiAqIGFuZCBhc3NlcnQgb24gd2hhdCB0aGUgZGlzdHJpYnV0aW9uIGRvZXMgd2l0aCB0aGVtLlxuICovXG5kZXNjcmliZShcIk5leHRqc0Rpc3RyaWJ1dGlvbiBmdW5jdGlvbiBncm91cCBiZWhhdmlvcnNcIiwgKCkgPT4ge1xuICBjb25zdCBzZXR1cCA9IChcbiAgICBncm91cE5hbWVzOiBzdHJpbmdbXSxcbiAgICBwcm9wczoge1xuICAgICAgcm91dGVzRm9yPzogKG5hbWU6IHN0cmluZykgPT4gc3RyaW5nW107XG4gICAgICBwdWJsaWNEaXJFbnRyaWVzPzogc3RyaW5nW107XG4gICAgICBiYXNlUGF0aD86IHN0cmluZztcbiAgICAgIHRyYWlsaW5nU2xhc2g/OiBib29sZWFuO1xuICAgIH0gPSB7fSxcbiAgKSA9PiB7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2sobmV3IEFwcCgpLCBcIlRlc3RTdGFja1wiKTtcbiAgICBjb25zdCBmdW5jdGlvbkdyb3VwczogTmV4dGpzRGlzdHJpYnV0aW9uRnVuY3Rpb25Hcm91cFtdID0gZ3JvdXBOYW1lcy5tYXAoXG4gICAgICAobmFtZSkgPT4ge1xuICAgICAgICBjb25zdCBmbiA9IG5ldyBMYW1iZGFGdW5jdGlvbihzdGFjaywgYEZuJHtuYW1lfWAsIHtcbiAgICAgICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoXCJleHBvcnRzLmhhbmRsZXIgPSAoKSA9PiB7fTtcIiksXG4gICAgICAgICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBmdW5jdGlvblVybDogbmV3IEZ1bmN0aW9uVXJsKHN0YWNrLCBgVXJsJHtuYW1lfWAsIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uOiBmbixcbiAgICAgICAgICAgIGF1dGhUeXBlOiBGdW5jdGlvblVybEF1dGhUeXBlLkFXU19JQU0sXG4gICAgICAgICAgfSksXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICk7XG4gICAgLy8gSW4gdGhlIG9yZGVyIGdpdmVuOiB0aGUgYnVpbGQncyBsaXN0IGlzIGFscmVhZHkgbW9zdCBzcGVjaWZpYyBmaXJzdC5cbiAgICBjb25zdCBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzID0gZ3JvdXBOYW1lcy5mbGF0TWFwKChncm91cCkgPT5cbiAgICAgIChwcm9wcy5yb3V0ZXNGb3I/Lihncm91cCkgPz8gW2AvJHtncm91cH0vKipgXSkuZmxhdE1hcCgocm91dGUpID0+XG4gICAgICAgIHBhdGhQYXR0ZXJuc0Zvcihyb3V0ZSwge1xuICAgICAgICAgIGhhc0RhdGFSb3V0ZXM6IGZhbHNlLFxuICAgICAgICAgIHRyYWlsaW5nU2xhc2g6IHByb3BzLnRyYWlsaW5nU2xhc2gsXG4gICAgICAgIH0pLm1hcCgocGF0dGVybikgPT4gKHsgZ3JvdXAsIHJvdXRlLCBwYXR0ZXJuIH0pKSxcbiAgICAgICksXG4gICAgKTtcbiAgICBjb25zdCBkZWZhdWx0Rm4gPSBuZXcgTGFtYmRhRnVuY3Rpb24oc3RhY2ssIFwiRm5EZWZhdWx0XCIsIHtcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZShcImV4cG9ydHMuaGFuZGxlciA9ICgpID0+IHt9O1wiKSxcbiAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhY2ssXG4gICAgICBmdW5jdGlvbkdyb3VwcyxcbiAgICAgIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsXG4gICAgICBkaXN0cmlidXRpb25Qcm9wczoge1xuICAgICAgICBhc3NldHNCdWNrZXQ6IG5ldyBCdWNrZXQoc3RhY2ssIFwiQXNzZXRzXCIpLFxuICAgICAgICBiYXNlUGF0aDogcHJvcHMuYmFzZVBhdGgsXG4gICAgICAgIGZ1bmN0aW9uVXJsOiBuZXcgRnVuY3Rpb25Vcmwoc3RhY2ssIFwiVXJsRGVmYXVsdFwiLCB7XG4gICAgICAgICAgZnVuY3Rpb246IGRlZmF1bHRGbixcbiAgICAgICAgICBhdXRoVHlwZTogRnVuY3Rpb25VcmxBdXRoVHlwZS5BV1NfSUFNLFxuICAgICAgICB9KSxcbiAgICAgICAgbmV4dGpzVHlwZTogTmV4dGpzVHlwZS5HTE9CQUxfRlVOQ1RJT05TLFxuICAgICAgICBwdWJsaWNEaXJFbnRyaWVzOiAocHJvcHMucHVibGljRGlyRW50cmllcyA/PyBbXSkubWFwKChuYW1lKSA9PiAoe1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgaXNEaXJlY3Rvcnk6IGZhbHNlLFxuICAgICAgICB9KSksXG4gICAgICB9LFxuICAgIH07XG4gIH07XG5cbiAgY29uc3QgcGF0aFBhdHRlcm5zID0gKHN0YWNrOiBTdGFjaykgPT4ge1xuICAgIGNvbnN0IGRpc3RyaWJ1dGlvbnMgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmZpbmRSZXNvdXJjZXMoXG4gICAgICBcIkFXUzo6Q2xvdWRGcm9udDo6RGlzdHJpYnV0aW9uXCIsXG4gICAgKTtcbiAgICBjb25zdCBjb25maWcgPVxuICAgICAgT2JqZWN0LnZhbHVlcyhkaXN0cmlidXRpb25zKVswXS5Qcm9wZXJ0aWVzLkRpc3RyaWJ1dGlvbkNvbmZpZztcbiAgICByZXR1cm4gKGNvbmZpZy5DYWNoZUJlaGF2aW9ycyBhcyBBcnJheTx7IFBhdGhQYXR0ZXJuOiBzdHJpbmcgfT4pLm1hcChcbiAgICAgIChiZWhhdmlvcikgPT4gYmVoYXZpb3IuUGF0aFBhdHRlcm4sXG4gICAgKTtcbiAgfTtcblxuICBpdChcImFkZHMgbm90aGluZyBleHRyYSB3aGVuIHRoZXJlIGFyZSBubyBncm91cHNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSk7XG4gICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwgZGlzdHJpYnV0aW9uUHJvcHMpO1xuICAgIGV4cGVjdChwYXRoUGF0dGVybnMoc3RhY2spKS50b0VxdWFsKFtcIl9uZXh0L3N0YXRpYypcIiwgXCJfbmV4dC9pbWFnZSpcIl0pO1xuICB9KTtcblxuICBkZXNjcmliZShcInNlcnZpY2Ugd29ya2Vyc1wiLCAoKSA9PiB7XG4gICAgY29uc3Qgc2VydmljZVdvcmtlclBvbGljeSA9IChzdGFjazogU3RhY2spID0+IHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IE9iamVjdC52YWx1ZXMoXG4gICAgICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuZmluZFJlc291cmNlcyhcbiAgICAgICAgICBcIkFXUzo6Q2xvdWRGcm9udDo6RGlzdHJpYnV0aW9uXCIsXG4gICAgICAgICksXG4gICAgICApWzBdLlByb3BlcnRpZXMuRGlzdHJpYnV0aW9uQ29uZmlnO1xuICAgICAgY29uc3QgYmVoYXZpb3IgPSAoXG4gICAgICAgIGNvbmZpZy5DYWNoZUJlaGF2aW9ycyBhcyBBcnJheTx7XG4gICAgICAgICAgUGF0aFBhdHRlcm46IHN0cmluZztcbiAgICAgICAgICBSZXNwb25zZUhlYWRlcnNQb2xpY3lJZDogeyBSZWY6IHN0cmluZyB9O1xuICAgICAgICB9PlxuICAgICAgKS5maW5kKCh7IFBhdGhQYXR0ZXJuIH0pID0+IFBhdGhQYXR0ZXJuLmluY2x1ZGVzKFwic2VydmljZS13b3JrZXJcIikpITtcbiAgICAgIGNvbnN0IHBvbGljaWVzID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5maW5kUmVzb3VyY2VzKFxuICAgICAgICBcIkFXUzo6Q2xvdWRGcm9udDo6UmVzcG9uc2VIZWFkZXJzUG9saWN5XCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHBvbGljaWVzW2JlaGF2aW9yLlJlc3BvbnNlSGVhZGVyc1BvbGljeUlkLlJlZl0uUHJvcGVydGllc1xuICAgICAgICAuUmVzcG9uc2VIZWFkZXJzUG9saWN5Q29uZmlnO1xuICAgIH07XG5cbiAgICBpdChcInNlbmRzIFNlcnZpY2UtV29ya2VyLUFsbG93ZWQgZnJvbSBhIGJlaGF2aW9yIGFoZWFkIG9mIF9uZXh0L3N0YXRpYypcIiwgKCkgPT4ge1xuICAgICAgLy8gQ2xvdWRGcm9udCBzdG9wcyBhdCB0aGUgZmlyc3QgbWF0Y2gsIHNvIGFmdGVyIGBfbmV4dC9zdGF0aWMqYCBpdCB3b3VsZFxuICAgICAgLy8gbmV2ZXIgYmUgcmVhY2hlZC5cbiAgICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSk7XG4gICAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgICBzZXJ2aWNlV29ya2VyQWxsb3dlZDogXCIvXCIsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChwYXRoUGF0dGVybnMoc3RhY2spKS50b0VxdWFsKFtcbiAgICAgICAgXCJfbmV4dC9zdGF0aWMvc2VydmljZS13b3JrZXIvKlwiLFxuICAgICAgICBcIl9uZXh0L3N0YXRpYypcIixcbiAgICAgICAgXCJfbmV4dC9pbWFnZSpcIixcbiAgICAgIF0pO1xuICAgICAgY29uc3QgcG9saWN5ID0gc2VydmljZVdvcmtlclBvbGljeShzdGFjayk7XG4gICAgICBleHBlY3QocG9saWN5LkN1c3RvbUhlYWRlcnNDb25maWcuSXRlbXMpLnRvRXF1YWwoW1xuICAgICAgICB7IEhlYWRlcjogXCJTZXJ2aWNlLVdvcmtlci1BbGxvd2VkXCIsIFZhbHVlOiBcIi9cIiwgT3ZlcnJpZGU6IHRydWUgfSxcbiAgICAgIF0pO1xuICAgICAgLy8gVGhlIHNlY3VyaXR5IGhlYWRlcnMgdGhlIG90aGVyIHN0YXRpYyBiZWhhdmlvcnMgc2VuZC5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgcG9saWN5LlNlY3VyaXR5SGVhZGVyc0NvbmZpZy5TdHJpY3RUcmFuc3BvcnRTZWN1cml0eSxcbiAgICAgICkudG9CZURlZmluZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KFwicHJlZml4ZXMgdGhlIHBhdHRlcm4gd2l0aCBiYXNlUGF0aFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHN0YWNrLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW10sIHsgYmFzZVBhdGg6IFwiL2Jhc2VcIiB9KTtcbiAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICAgIHNlcnZpY2VXb3JrZXJBbGxvd2VkOiBcIi9iYXNlXCIsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChwYXRoUGF0dGVybnMoc3RhY2spWzBdKS50b0JlKFxuICAgICAgICBcIi9iYXNlL19uZXh0L3N0YXRpYy9zZXJ2aWNlLXdvcmtlci8qXCIsXG4gICAgICApO1xuICAgICAgZXhwZWN0KHNlcnZpY2VXb3JrZXJQb2xpY3koc3RhY2spLkN1c3RvbUhlYWRlcnNDb25maWcuSXRlbXMpLnRvRXF1YWwoW1xuICAgICAgICB7IEhlYWRlcjogXCJTZXJ2aWNlLVdvcmtlci1BbGxvd2VkXCIsIFZhbHVlOiBcIi9iYXNlXCIsIE92ZXJyaWRlOiB0cnVlIH0sXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KFwiYWRkcyBubyBiZWhhdmlvciB3aXRob3V0IHNlcnZpY2Ugd29ya2Vyc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHN0YWNrLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW10pO1xuICAgICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwgZGlzdHJpYnV0aW9uUHJvcHMpO1xuICAgICAgZXhwZWN0KHBhdGhQYXR0ZXJucyhzdGFjaykpLm5vdC50b0NvbnRhaW4oXG4gICAgICAgIFwiX25leHQvc3RhdGljL3NlcnZpY2Utd29ya2VyLypcIixcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdChcImtlZXBzIHN0YXRpY1Jlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzLCBpdHMgY3VzdG9tIGhlYWRlcnMgaW5jbHVkZWRcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdKTtcbiAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICAgIHNlcnZpY2VXb3JrZXJBbGxvd2VkOiBcIi9cIixcbiAgICAgICAgb3ZlcnJpZGVzOiB7XG4gICAgICAgICAgc3RhdGljUmVzcG9uc2VIZWFkZXJzUG9saWN5UHJvcHM6IHtcbiAgICAgICAgICAgIHJlc3BvbnNlSGVhZGVyc1BvbGljeU5hbWU6IFwic3RhdGljXCIsXG4gICAgICAgICAgICBjdXN0b21IZWFkZXJzQmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgY3VzdG9tSGVhZGVyczogW3sgaGVhZGVyOiBcIlgtVGVhbVwiLCB2YWx1ZTogXCJhXCIsIG92ZXJyaWRlOiB0cnVlIH1dLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBwb2xpY3kgPSBzZXJ2aWNlV29ya2VyUG9saWN5KHN0YWNrKTtcbiAgICAgIC8vIE5hbWVzIGFyZSB1bmlxdWUgcGVyIGFjY291bnQsIHNvIGl0IGNhbid0IHNoYXJlIHRoZSBzdGF0aWMgcG9saWN5J3MuXG4gICAgICBleHBlY3QocG9saWN5Lk5hbWUpLnRvQmUoXCJzdGF0aWMtc3dcIik7XG4gICAgICBleHBlY3QocG9saWN5LkN1c3RvbUhlYWRlcnNDb25maWcuSXRlbXMpLnRvRXF1YWwoW1xuICAgICAgICB7IEhlYWRlcjogXCJYLVRlYW1cIiwgVmFsdWU6IFwiYVwiLCBPdmVycmlkZTogdHJ1ZSB9LFxuICAgICAgICB7IEhlYWRlcjogXCJTZXJ2aWNlLVdvcmtlci1BbGxvd2VkXCIsIFZhbHVlOiBcIi9cIiwgT3ZlcnJpZGU6IHRydWUgfSxcbiAgICAgIF0pO1xuICAgIH0pO1xuXG4gICAgaXQoXCJrZWVwcyBhIHN1ZmZpeGVkIHBvbGljeSBuYW1lIHdpdGhpbiBDbG91ZEZyb250J3MgMTI4IGNoYXJhY3RlcnNcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdKTtcbiAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICAgIHNlcnZpY2VXb3JrZXJBbGxvd2VkOiBcIi9cIixcbiAgICAgICAgb3ZlcnJpZGVzOiB7XG4gICAgICAgICAgc3RhdGljUmVzcG9uc2VIZWFkZXJzUG9saWN5UHJvcHM6IHtcbiAgICAgICAgICAgIHJlc3BvbnNlSGVhZGVyc1BvbGljeU5hbWU6IFwiYVwiLnJlcGVhdCgxMjgpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChzZXJ2aWNlV29ya2VyUG9saWN5KHN0YWNrKS5OYW1lKS50b0JlKGAke1wiYVwiLnJlcGVhdCgxMjUpfS1zd2ApO1xuICAgIH0pO1xuXG4gICAgaXQoXCJrZWVwcyBhIFNlcnZpY2UtV29ya2VyLUFsbG93ZWQgdGhlIHN0YXRpYyBvdmVycmlkZSBzZXRzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSk7XG4gICAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgICBzZXJ2aWNlV29ya2VyQWxsb3dlZDogXCIvXCIsXG4gICAgICAgIG92ZXJyaWRlczoge1xuICAgICAgICAgIHN0YXRpY1Jlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzOiB7XG4gICAgICAgICAgICBjdXN0b21IZWFkZXJzQmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgY3VzdG9tSGVhZGVyczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGhlYWRlcjogXCJzZXJ2aWNlLXdvcmtlci1hbGxvd2VkXCIsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogXCIvYXBwXCIsXG4gICAgICAgICAgICAgICAgICBvdmVycmlkZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBleHBlY3Qoc2VydmljZVdvcmtlclBvbGljeShzdGFjaykuQ3VzdG9tSGVhZGVyc0NvbmZpZy5JdGVtcykudG9FcXVhbChbXG4gICAgICAgIHsgSGVhZGVyOiBcInNlcnZpY2Utd29ya2VyLWFsbG93ZWRcIiwgVmFsdWU6IFwiL2FwcFwiLCBPdmVycmlkZTogdHJ1ZSB9LFxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdChcIndhcm5zIGFuZCB1c2VzIGEgcmVwbGFjZWQgc3RhdGljIHBvbGljeSBhcyBpdCBpc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHN0YWNrLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW10pO1xuICAgICAgY29uc3QgZGlzdHJpYnV0aW9uID0gbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgICAgc2VydmljZVdvcmtlckFsbG93ZWQ6IFwiL1wiLFxuICAgICAgICBvdmVycmlkZXM6IHtcbiAgICAgICAgICBzdGF0aWNCZWhhdmlvck9wdGlvbnM6IHtcbiAgICAgICAgICAgIHJlc3BvbnNlSGVhZGVyc1BvbGljeTpcbiAgICAgICAgICAgICAgUmVzcG9uc2VIZWFkZXJzUG9saWN5LmZyb21SZXNwb25zZUhlYWRlcnNQb2xpY3lJZChcbiAgICAgICAgICAgICAgICBzdGFjayxcbiAgICAgICAgICAgICAgICBcIkN1c3RvbVwiLFxuICAgICAgICAgICAgICAgIFwiY3VzdG9tLXBvbGljeVwiLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIEFubm90YXRpb25zLmZyb21TdGFjayhzdGFjaykuaGFzV2FybmluZyhcbiAgICAgICAgYC8ke2Rpc3RyaWJ1dGlvbi5ub2RlLnBhdGh9YCxcbiAgICAgICAgTWF0Y2guc3RyaW5nTGlrZVJlZ2V4cChcIlNlcnZpY2UtV29ya2VyLUFsbG93ZWRcIiksXG4gICAgICApO1xuICAgICAgY29uc3QgY29uZmlnID0gT2JqZWN0LnZhbHVlcyhcbiAgICAgICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5maW5kUmVzb3VyY2VzKFxuICAgICAgICAgIFwiQVdTOjpDbG91ZEZyb250OjpEaXN0cmlidXRpb25cIixcbiAgICAgICAgKSxcbiAgICAgIClbMF0uUHJvcGVydGllcy5EaXN0cmlidXRpb25Db25maWc7XG4gICAgICBleHBlY3QoY29uZmlnLkNhY2hlQmVoYXZpb3JzWzBdKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgUGF0aFBhdHRlcm46IFwiX25leHQvc3RhdGljL3NlcnZpY2Utd29ya2VyLypcIixcbiAgICAgICAgUmVzcG9uc2VIZWFkZXJzUG9saWN5SWQ6IFwiY3VzdG9tLXBvbGljeVwiLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdChcImNvdW50cyBpdHMgYmVoYXZpb3IgYWdhaW5zdCB0aGUgYnVkZ2V0XCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSwge1xuICAgICAgICBwdWJsaWNEaXJFbnRyaWVzOiBBcnJheS5mcm9tKHsgbGVuZ3RoOiA3MiB9LCAoXywgaSkgPT4gYGYke2l9YCksXG4gICAgICB9KTtcbiAgICAgIC8vIDMgZml4ZWQgKyA3MiBwdWJsaWMgPSA3NSBmaXRzOyB0aGUgc2VydmljZSB3b3JrZXIgYmVoYXZpb3IgbWFrZXMgNzYuXG4gICAgICBleHBlY3QoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICAgICAgICBzZXJ2aWNlV29ya2VyQWxsb3dlZDogXCIvXCIsXG4gICAgICAgICAgfSksXG4gICAgICApLnRvVGhyb3coL25lZWRzIDc2IENsb3VkRnJvbnQgY2FjaGUgYmVoYXZpb3JzLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwibGV0cyB0aGUgT0FDIHByaW5jaXBhbCBsaXN0IHRoZSBidWNrZXQgc28gYSBtaXNzaW5nIGFzc2V0IGlzIGEgNDA0XCIsICgpID0+IHtcbiAgICBjb25zdCB7IHN0YWNrLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW10pO1xuICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIGRpc3RyaWJ1dGlvblByb3BzKTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcyhcIkFXUzo6UzM6OkJ1Y2tldFBvbGljeVwiLCB7XG4gICAgICBQb2xpY3lEb2N1bWVudDoge1xuICAgICAgICBTdGF0ZW1lbnQ6IE1hdGNoLmFycmF5V2l0aChbXG4gICAgICAgICAgTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgICBBY3Rpb246IFtcInMzOkdldE9iamVjdFwiLCBcInMzOkxpc3RCdWNrZXRcIl0sXG4gICAgICAgICAgICBQcmluY2lwYWw6IHsgU2VydmljZTogXCJjbG91ZGZyb250LmFtYXpvbmF3cy5jb21cIiB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICBdKSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwiYWRkcyBncm91cCBiZWhhdmlvcnMgaW4gdGhlIGJ1aWxkJ3Mgb3JkZXIsIGFmdGVyIHRoZSBpbWFnZSBiZWhhdmlvclwiLCAoKSA9PiB7XG4gICAgLy8gQ2xvdWRGcm9udCBzdG9wcyBhdCB0aGUgZmlyc3QgbWF0Y2hpbmcgYmVoYXZpb3IsIHNvIGBhcGkvKmAgYWhlYWQgb2ZcbiAgICAvLyBgYXBpL3JlcG9ydHMvKmAgd291bGQgc2VuZCBldmVyeSByZXBvcnQgcmVxdWVzdCB0byB0aGUgd3JvbmcgZnVuY3Rpb24uXG4gICAgLy8gVGhlIGJ1aWxkIHNvcnRlZCB0aGVtIHdoZW4gaXQgY2hlY2tlZCB0aGVtOyByZS1zb3J0aW5nIGhlcmUgY291bGQgb25seVxuICAgIC8vIGRpc2FncmVlIHdpdGggdGhhdC5cbiAgICBjb25zdCB7IHN0YWNrLCBmdW5jdGlvbkdyb3VwcywgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9XG4gICAgICBzZXR1cChbXCJyZXBvcnRzXCIsIFwiYXBpXCJdLCB7XG4gICAgICAgIHJvdXRlc0ZvcjogKG5hbWUpID0+XG4gICAgICAgICAgbmFtZSA9PT0gXCJhcGlcIiA/IFtcIi9hcGkvKipcIl0gOiBbXCIvYXBpL3JlcG9ydHMvKipcIl0sXG4gICAgICB9KTtcbiAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgIGZ1bmN0aW9uR3JvdXBzLFxuICAgICAgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycyxcbiAgICB9KTtcbiAgICBleHBlY3QocGF0aFBhdHRlcm5zKHN0YWNrKSkudG9FcXVhbChbXG4gICAgICBcIl9uZXh0L3N0YXRpYypcIixcbiAgICAgIFwiX25leHQvaW1hZ2UqXCIsXG4gICAgICBcImFwaS9yZXBvcnRzLypcIixcbiAgICAgIFwiYXBpLypcIixcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoXCJrZWVwcyB0aGUgdHdvIHNsYXNoIHZhcmlhbnRzIGRpc3RpbmN0IHVuZGVyIGEgYmFzZVBhdGhcIiwgKCkgPT4ge1xuICAgIC8vIGBnZXRQYXRoUGF0dGVybmAgdXNlZCB0byBqb2luIHRocm91Z2ggYSBoZWxwZXIgdGhhdCBzdHJpcHMgdHJhaWxpbmdcbiAgICAvLyBzbGFzaGVzLCBzbyBgcHJpY2luZ2AgYW5kIGBwcmljaW5nL2AgYm90aCBiZWNhbWUgYC9iYXNlL3ByaWNpbmdgOiB0d29cbiAgICAvLyBiZWhhdmlvcnMgd2l0aCB0aGUgc2FtZSBwYXRoIHBhdHRlcm4sIHdoaWNoIENsb3VkRnJvbnQgcmVqZWN0cyBhdCBkZXBsb3lcbiAgICAvLyB3aXRoIG5vIGhpbnQgdGhhdCBgdHJhaWxpbmdTbGFzaGAgaXMgd2hhdCBwcm9kdWNlZCB0aGUgZHVwbGljYXRlLlxuICAgIGNvbnN0IHsgc3RhY2ssIGZ1bmN0aW9uR3JvdXBzLCBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzLCBkaXN0cmlidXRpb25Qcm9wcyB9ID1cbiAgICAgIHNldHVwKFtcIm1rdFwiXSwge1xuICAgICAgICByb3V0ZXNGb3I6ICgpID0+IFtcIi9wcmljaW5nXCJdLFxuICAgICAgICBiYXNlUGF0aDogXCIvYmFzZVwiLFxuICAgICAgICB0cmFpbGluZ1NsYXNoOiB0cnVlLFxuICAgICAgfSk7XG4gICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICBmdW5jdGlvbkdyb3VwcyxcbiAgICAgIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsXG4gICAgfSk7XG4gICAgY29uc3QgcGF0dGVybnMgPSBwYXRoUGF0dGVybnMoc3RhY2spO1xuICAgIGV4cGVjdChwYXR0ZXJucykudG9Db250YWluKFwiL2Jhc2UvcHJpY2luZ1wiKTtcbiAgICBleHBlY3QocGF0dGVybnMpLnRvQ29udGFpbihcIi9iYXNlL3ByaWNpbmcvXCIpO1xuICB9KTtcblxuICBpdChcImNvdW50cyB0aGUgYmFzZVBhdGggYmVoYXZpb3JzIGFnYWluc3QgdGhlIGJ1ZGdldFwiLCAoKSA9PiB7XG4gICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdLCB7XG4gICAgICBiYXNlUGF0aDogXCIvYmFzZVwiLFxuICAgICAgcHVibGljRGlyRW50cmllczogQXJyYXkuZnJvbSh7IGxlbmd0aDogMjEgfSwgKF8sIGkpID0+IGBmaWxlJHtpfS50eHRgKSxcbiAgICB9KTtcbiAgICAvLyAzIGZpeGVkICsgdGhlIDIgYSBiYXNlUGF0aCBhZGRzIHRvIHN0YW5kIGluIGZvciB0aGUgZGVmYXVsdCBiZWhhdmlvciArIDIxXG4gICAgLy8gcHVibGljID0gMjYuIENvdW50aW5nIG9ubHkgdGhlIDMgcmVwb3J0ZWQgMjQgYW5kIGxldCB0aGUgc3ludGggdGhyb3VnaCwgc29cbiAgICAvLyB0aGUgbGltaXQgYXJyaXZlZCBhcyBhIENsb3VkRnJvbnQgZGVwbG95IGZhaWx1cmUuXG4gICAgZXhwZWN0KFxuICAgICAgKCkgPT5cbiAgICAgICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgICAgIG1heENhY2hlQmVoYXZpb3JzOiAyNSxcbiAgICAgICAgfSksXG4gICAgKS50b1Rocm93KC8yNiBDbG91ZEZyb250IGNhY2hlIGJlaGF2aW9ycy4qNSB1c2VkIGJ5IGNkay1uZXh0anMgaXRzZWxmL3MpO1xuICB9KTtcblxuICBpdChcImRlZmF1bHRzIHRoZSBidWRnZXQgdG8gQ2xvdWRGcm9udCdzIHF1b3RhIG9mIDc1XCIsICgpID0+IHtcbiAgICAvLyBUaGUgaGFyZC1jb2RlZCAyNSBwcmVkYXRlZCB0aGUgcXVvdGEncyBpbmNyZWFzZSB0byA3NS5cbiAgICBjb25zdCB7IHN0YWNrLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW10sIHtcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IEFycmF5LmZyb20oeyBsZW5ndGg6IDcyIH0sIChfLCBpKSA9PiBgZmlsZSR7aX0udHh0YCksXG4gICAgfSk7XG4gICAgZXhwZWN0KFxuICAgICAgKCkgPT4gbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwgZGlzdHJpYnV0aW9uUHJvcHMpLFxuICAgICkubm90LnRvVGhyb3coKTtcbiAgICBjb25zdCB7IHN0YWNrOiBvdmVyLCBkaXN0cmlidXRpb25Qcm9wczogb3ZlclByb3BzIH0gPSBzZXR1cChbXSwge1xuICAgICAgcHVibGljRGlyRW50cmllczogQXJyYXkuZnJvbSh7IGxlbmd0aDogNzMgfSwgKF8sIGkpID0+IGBmaWxlJHtpfS50eHRgKSxcbiAgICB9KTtcbiAgICBleHBlY3QoXG4gICAgICAoKSA9PiBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKG92ZXIsIFwiRGlzdHJpYnV0aW9uXCIsIG92ZXJQcm9wcyksXG4gICAgKS50b1Rocm93KFxuICAgICAgLzc2IENsb3VkRnJvbnQgY2FjaGUgYmVoYXZpb3JzLCBvdmVyIHRoZSBsaW1pdCBvZiA3NS4qc2V0IGBtYXhDYWNoZUJlaGF2aW9yc2AvcyxcbiAgICApO1xuICB9KTtcblxuICBpdChcImhvbm9ycyBhIHJhaXNlZCBtYXhDYWNoZUJlaGF2aW9yc1wiLCAoKSA9PiB7XG4gICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdLCB7XG4gICAgICBwdWJsaWNEaXJFbnRyaWVzOiBBcnJheS5mcm9tKHsgbGVuZ3RoOiA5NyB9LCAoXywgaSkgPT4gYGZpbGUke2l9LnR4dGApLFxuICAgIH0pO1xuICAgIGV4cGVjdChcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgICAgICBtYXhDYWNoZUJlaGF2aW9yczogMTAwLFxuICAgICAgICB9KSxcbiAgICApLm5vdC50b1Rocm93KCk7XG4gIH0pO1xuXG4gIGl0KFwiZG9lcyBub3QgY291bnQgYmFzZVBhdGggYmVoYXZpb3JzIGZvciBhIGJhc2VQYXRoIG9mIC9cIiwgKCkgPT4ge1xuICAgIC8vIGBiYXNlUGF0aDogXCIvXCJgIG5vcm1hbGl6ZXMgdG8gbm8gYmFzZVBhdGggYW5kIGFkZHMgbm8gYmVoYXZpb3JzLCBzb1xuICAgIC8vIGNvdW50aW5nIDIgZm9yIGl0IGNvdWxkIHJlamVjdCBhbiBhcHAgdGhhdCBpcyB1bmRlciB0aGUgbGltaXQuXG4gICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdLCB7XG4gICAgICBiYXNlUGF0aDogXCIvXCIsXG4gICAgICBwdWJsaWNEaXJFbnRyaWVzOiBBcnJheS5mcm9tKHsgbGVuZ3RoOiAyMiB9LCAoXywgaSkgPT4gYGZpbGUke2l9LnR4dGApLFxuICAgIH0pO1xuICAgIGV4cGVjdChcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgICAgICBtYXhDYWNoZUJlaGF2aW9yczogMjUsXG4gICAgICAgIH0pLFxuICAgICkubm90LnRvVGhyb3coKTtcbiAgfSk7XG5cbiAgaXQoXCJyZWplY3RzIGEgYmVoYXZpb3IgZm9yIGEgZ3JvdXAgaXQgd2FzIG5vdCBnaXZlblwiLCAoKSA9PiB7XG4gICAgY29uc3QgeyBzdGFjaywgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtcImFwaVwiXSk7XG4gICAgZXhwZWN0KFxuICAgICAgKCkgPT5cbiAgICAgICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgICAgIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsXG4gICAgICAgIH0pLFxuICAgICkudG9UaHJvdyhcbiAgICAgIC9yb3V0ZXMgdG8gZnVuY3Rpb24gZ3JvdXAgXCJhcGlcIiwgd2hpY2ggaXMgbm90IGluIGBmdW5jdGlvbkdyb3Vwc2AvLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwicG9pbnRzIGVhY2ggZ3JvdXAncyBiZWhhdmlvcnMgYXQgdGhhdCBncm91cCdzIG93biBvcmlnaW5cIiwgKCkgPT4ge1xuICAgIGNvbnN0IHsgc3RhY2ssIGZ1bmN0aW9uR3JvdXBzLCBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzLCBkaXN0cmlidXRpb25Qcm9wcyB9ID1cbiAgICAgIHNldHVwKFtcImFwaVwiXSwge1xuICAgICAgICByb3V0ZXNGb3I6ICgpID0+IFtcIi9hcGkvKipcIiwgXCIvaGVhbHRoXCJdLFxuICAgICAgfSk7XG4gICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICBmdW5jdGlvbkdyb3VwcyxcbiAgICAgIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsXG4gICAgfSk7XG4gICAgY29uc3QgZGlzdHJpYnV0aW9ucyA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuZmluZFJlc291cmNlcyhcbiAgICAgIFwiQVdTOjpDbG91ZEZyb250OjpEaXN0cmlidXRpb25cIixcbiAgICApO1xuICAgIGNvbnN0IGNvbmZpZyA9XG4gICAgICBPYmplY3QudmFsdWVzKGRpc3RyaWJ1dGlvbnMpWzBdLlByb3BlcnRpZXMuRGlzdHJpYnV0aW9uQ29uZmlnO1xuICAgIGNvbnN0IGJlaGF2aW9ycyA9IGNvbmZpZy5DYWNoZUJlaGF2aW9ycyBhcyBBcnJheTx7XG4gICAgICBQYXRoUGF0dGVybjogc3RyaW5nO1xuICAgICAgVGFyZ2V0T3JpZ2luSWQ6IHN0cmluZztcbiAgICB9PjtcbiAgICBjb25zdCBncm91cE9yaWdpbnMgPSBuZXcgU2V0KFxuICAgICAgYmVoYXZpb3JzXG4gICAgICAgIC5maWx0ZXIoKGJlaGF2aW9yKSA9PlxuICAgICAgICAgIFtcImFwaS8qXCIsIFwiaGVhbHRoXCJdLmluY2x1ZGVzKGJlaGF2aW9yLlBhdGhQYXR0ZXJuKSxcbiAgICAgICAgKVxuICAgICAgICAubWFwKChiZWhhdmlvcikgPT4gYmVoYXZpb3IuVGFyZ2V0T3JpZ2luSWQpLFxuICAgICk7XG4gICAgLy8gT25lIG9yaWdpbiwgc2hhcmVkIGJ5IGJvdGggb2YgdGhlIGdyb3VwJ3MgcGF0dGVybnMsIGFuZCBub3QgdGhlIGRlZmF1bHQncy5cbiAgICBleHBlY3QoZ3JvdXBPcmlnaW5zLnNpemUpLnRvQmUoMSk7XG4gICAgZXhwZWN0KGdyb3VwT3JpZ2lucykubm90LnRvQ29udGFpbihcbiAgICAgIGNvbmZpZy5EZWZhdWx0Q2FjaGVCZWhhdmlvci5UYXJnZXRPcmlnaW5JZCxcbiAgICApO1xuICB9KTtcblxuICBpdChcInByZWZpeGVzIGdyb3VwIHBhdHRlcm5zIHdpdGggYmFzZVBhdGhcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHsgc3RhY2ssIGZ1bmN0aW9uR3JvdXBzLCBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzLCBkaXN0cmlidXRpb25Qcm9wcyB9ID1cbiAgICAgIHNldHVwKFtcImFwaVwiXSwge1xuICAgICAgICByb3V0ZXNGb3I6ICgpID0+IFtcIi9hcGkvKipcIl0sXG4gICAgICAgIGJhc2VQYXRoOiBcIi9iYXNlXCIsXG4gICAgICB9KTtcbiAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgIGZ1bmN0aW9uR3JvdXBzLFxuICAgICAgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycyxcbiAgICB9KTtcbiAgICBleHBlY3QocGF0aFBhdHRlcm5zKHN0YWNrKSkudG9Db250YWluKFwiL2Jhc2UvYXBpLypcIik7XG4gIH0pO1xuXG4gIGl0KFwibmFtZXMgZXZlcnkgY2xhaW0gb24gdGhlIGJlaGF2aW9yIGJ1ZGdldCB3aGVuIGl0IGlzIGV4Y2VlZGVkXCIsICgpID0+IHtcbiAgICBjb25zdCB7IHN0YWNrLCBmdW5jdGlvbkdyb3VwcywgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9XG4gICAgICBzZXR1cChbXCJhcGlcIl0sIHtcbiAgICAgICAgcm91dGVzRm9yOiAoKSA9PiBbXCIvYXBpLyoqXCJdLFxuICAgICAgICBwdWJsaWNEaXJFbnRyaWVzOiBBcnJheS5mcm9tKHsgbGVuZ3RoOiAyMiB9LCAoXywgaSkgPT4gYGZpbGUke2l9LnR4dGApLFxuICAgICAgfSk7XG4gICAgZXhwZWN0KFxuICAgICAgKCkgPT5cbiAgICAgICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgICAgIGZ1bmN0aW9uR3JvdXBzLFxuICAgICAgICAgIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsXG4gICAgICAgICAgbWF4Q2FjaGVCZWhhdmlvcnM6IDI1LFxuICAgICAgICB9KSxcbiAgICApLnRvVGhyb3coXG4gICAgICAvMjYgQ2xvdWRGcm9udCBjYWNoZSBiZWhhdmlvcnMuKjEgZm9yIGBmdW5jdGlvbkdyb3Vwc2AgcGF0dGVybnMvcyxcbiAgICApO1xuICB9KTtcblxuICBpdChcInJlamVjdHMgYSBncm91cCBwYXR0ZXJuIHRoYXQgZHVwbGljYXRlcyBhIHB1YmxpYy8gZGlyZWN0b3J5J3NcIiwgKCkgPT4ge1xuICAgIC8vIGBwdWJsaWMvZG9jcy9gIGFuZCBgL2RvY3MvKipgIGJvdGggZGVwbG95IGFzIGBkb2NzLypgOiB0aGUgc3ludGhcbiAgICAvLyBzdWNjZWVkZWQgYW5kIENsb3VkRnJvbnQgcmVqZWN0ZWQgdGhlIGRlcGxveS5cbiAgICBjb25zdCB7IHN0YWNrLCBmdW5jdGlvbkdyb3VwcywgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9XG4gICAgICBzZXR1cChbXCJkb2NzXCJdKTtcbiAgICBleHBlY3QoXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICAgICAgZnVuY3Rpb25Hcm91cHMsXG4gICAgICAgICAgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycyxcbiAgICAgICAgICBwdWJsaWNEaXJFbnRyaWVzOiBbeyBuYW1lOiBcImRvY3NcIiwgaXNEaXJlY3Rvcnk6IHRydWUgfV0sXG4gICAgICAgIH0pLFxuICAgICkudG9UaHJvdyhcbiAgICAgIC9wYXR0ZXJuIFwiXFwvZG9jc1xcL1xcKlxcKlwiIFxcKGdyb3VwIFwiZG9jc1wiXFwpIGRlcGxveXMgYXMgdGhlIHBhdGggcGF0dGVybiBcImRvY3NcXC9cXCpcIiwgd2hpY2ggYSB0b3AtbGV2ZWwgcHVibGljXFwvIGVudHJ5IGFscmVhZHkgdXNlcy8sXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJyZWplY3RzIGEgZ3JvdXAgcGF0dGVybiBhIHB1YmxpYy8gZGlyZWN0b3J5J3MgYmVoYXZpb3Igd291bGQgc2hhZG93XCIsICgpID0+IHtcbiAgICAvLyBgZG9jcy8qYCBpcyBhZGRlZCBmaXJzdCwgc28gYGRvY3MvZ3VpZGUvKmAgbmV2ZXIgbWF0Y2hlcy5cbiAgICBjb25zdCB7IHN0YWNrLCBmdW5jdGlvbkdyb3VwcywgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9XG4gICAgICBzZXR1cChbXCJndWlkZVwiXSwge1xuICAgICAgICByb3V0ZXNGb3I6ICgpID0+IFtcIi9kb2NzL2d1aWRlLyoqXCJdLFxuICAgICAgfSk7XG4gICAgZXhwZWN0KFxuICAgICAgKCkgPT5cbiAgICAgICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgICAgIGZ1bmN0aW9uR3JvdXBzLFxuICAgICAgICAgIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsXG4gICAgICAgICAgcHVibGljRGlyRW50cmllczogW3sgbmFtZTogXCJkb2NzXCIsIGlzRGlyZWN0b3J5OiB0cnVlIH1dLFxuICAgICAgICB9KSxcbiAgICApLnRvVGhyb3coL3B1YmxpY1xcLyBlbnRyeSBiZWhpbmQgXCJkb2NzXFwvXFwqXCIgaXMgbWF0Y2hlZCBmaXJzdC8pO1xuICB9KTtcblxuICBpdChcInJlamVjdHMgYW4gZXhhY3QgZ3JvdXAgcGF0dGVybiBlcXVhbCB0byBhIHB1YmxpYy8gZmlsZSdzLCBiYXNlUGF0aCBpbmNsdWRlZFwiLCAoKSA9PiB7XG4gICAgY29uc3QgeyBzdGFjaywgZnVuY3Rpb25Hcm91cHMsIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsIGRpc3RyaWJ1dGlvblByb3BzIH0gPVxuICAgICAgc2V0dXAoW1wibWt0XCJdLCB7XG4gICAgICAgIHJvdXRlc0ZvcjogKCkgPT4gW1wiL3JvYm90cy50eHRcIl0sXG4gICAgICAgIGJhc2VQYXRoOiBcIi9iYXNlXCIsXG4gICAgICB9KTtcbiAgICBleHBlY3QoXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICAgICAgZnVuY3Rpb25Hcm91cHMsXG4gICAgICAgICAgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycyxcbiAgICAgICAgICBwdWJsaWNEaXJFbnRyaWVzOiBbeyBuYW1lOiBcInJvYm90cy50eHRcIiwgaXNEaXJlY3Rvcnk6IGZhbHNlIH1dLFxuICAgICAgICB9KSxcbiAgICApLnRvVGhyb3coL2RlcGxveXMgYXMgdGhlIHBhdGggcGF0dGVybiBcIlxcL2Jhc2VcXC9yb2JvdHNcXC50eHRcIi8pO1xuICB9KTtcblxuICBpdChcImFsbG93cyBhIGdyb3VwIHBhdHRlcm4gYmVzaWRlIGEgcHVibGljLyBlbnRyeSBpdCBkb2VzIG5vdCBvdmVybGFwXCIsICgpID0+IHtcbiAgICAvLyBgL2RvY3NgIGV4YWN0IGlzIG5vdCB1bmRlciBgZG9jcy8qYCwgYW5kIGBkb2NzLypgIGRvZXMgbm90IG1hdGNoIGAvZG9jc2AuXG4gICAgY29uc3QgeyBzdGFjaywgZnVuY3Rpb25Hcm91cHMsIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsIGRpc3RyaWJ1dGlvblByb3BzIH0gPVxuICAgICAgc2V0dXAoW1wiZG9jc1wiXSwge1xuICAgICAgICByb3V0ZXNGb3I6ICgpID0+IFtcIi9kb2NzXCJdLFxuICAgICAgfSk7XG4gICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICBmdW5jdGlvbkdyb3VwcyxcbiAgICAgIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsXG4gICAgICBwdWJsaWNEaXJFbnRyaWVzOiBbeyBuYW1lOiBcImRvY3NcIiwgaXNEaXJlY3Rvcnk6IHRydWUgfV0sXG4gICAgfSk7XG4gICAgZXhwZWN0KHBhdGhQYXR0ZXJucyhzdGFjaykpLnRvRXF1YWwoXG4gICAgICBleHBlY3QuYXJyYXlDb250YWluaW5nKFtcImRvY3MvKlwiLCBcImRvY3NcIl0pLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwic2VydmVzIGJ1bmRsZXMgdW5kZXIgYSBwYXRoLXN0eWxlIGFzc2V0UHJlZml4LCByZXdyaXRpbmcgdGhlIHByZWZpeCBhd2F5XCIsICgpID0+IHtcbiAgICAvLyBOZXh0LmpzIGVtaXRzIGA8YXNzZXRQcmVmaXg+L19uZXh0L3N0YXRpYy8uLi5gIGZvciBldmVyeSBidW5kbGUgd2hpbGUgdGhlXG4gICAgLy8gb2JqZWN0cyBrZWVwIHRoZWlyIHVucHJlZml4ZWQgUzMga2V5cywgc28gd2l0aG91dCBhIGJlaGF2aW9yIG9mIGl0cyBvd24gdGhlXG4gICAgLy8gcmVxdWVzdCBmYWxscyB0aHJvdWdoIHRvIHRoZSBjb21wdXRlIG9yaWdpbiBhbmQgNDA0cyDigJQgdGhlIGRlcGxveW1lbnRcbiAgICAvLyBwYWNrYWdlIGNhcnJpZXMgbm8gYC5uZXh0L3N0YXRpY2AuIE1lYXN1cmVkIGFnYWluc3RcbiAgICAvLyBgdGVzdC9lMmUvYXBwLWRpci9hc3NldC1wcmVmaXhgLCB3aGVyZSAyIG9mIDcgY2FzZXMgZmFpbGVkIG9uIGV4YWN0bHkgdGhhdC5cbiAgICBjb25zdCB7IHN0YWNrLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW10pO1xuICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgYXNzZXRQcmVmaXg6IFwiL2N1c3RvbS1hc3NldC1wcmVmaXhcIixcbiAgICB9KTtcbiAgICAvLyBBaGVhZCBvZiB0aGUgYmFyZSBgX25leHQvc3RhdGljKmAgaW4gbm90aGluZyBidXQgbGlzdCBwb3NpdGlvbjsgdGhlIHR3b1xuICAgIC8vIHBhdHRlcm5zIGNhbm5vdCBib3RoIG1hdGNoIG9uZSByZXF1ZXN0LCBzbyBvcmRlciBkb2VzIG5vdCBtYXR0ZXIgaGVyZS5cbiAgICBleHBlY3QocGF0aFBhdHRlcm5zKHN0YWNrKSkudG9FcXVhbChbXG4gICAgICBcIl9uZXh0L3N0YXRpYypcIixcbiAgICAgIFwiL2N1c3RvbS1hc3NldC1wcmVmaXgvX25leHQvc3RhdGljKlwiLFxuICAgICAgXCJfbmV4dC9pbWFnZSpcIixcbiAgICBdKTtcbiAgICBjb25zdCBmbnMgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmZpbmRSZXNvdXJjZXMoXG4gICAgICBcIkFXUzo6Q2xvdWRGcm9udDo6RnVuY3Rpb25cIixcbiAgICApO1xuICAgIGNvbnN0IGNvZGUgPSBPYmplY3QudmFsdWVzKGZucylcbiAgICAgIC5tYXAoKGZuKSA9PiBmbi5Qcm9wZXJ0aWVzLkZ1bmN0aW9uQ29kZSBhcyBzdHJpbmcpXG4gICAgICAuZmluZCgoaXQpID0+IGl0LmluY2x1ZGVzKFwicmVxdWVzdC51cmkuc2xpY2VcIikpO1xuICAgIC8vIGBcIi9jdXN0b20tYXNzZXQtcHJlZml4XCIubGVuZ3RoYCwgc28gYC9jdXN0b20tYXNzZXQtcHJlZml4L19uZXh0L3N0YXRpYy94YFxuICAgIC8vIHJlYWNoZXMgUzMgYXMgYF9uZXh0L3N0YXRpYy94YC5cbiAgICBleHBlY3QoY29kZSkudG9Db250YWluKCdcIlwiICsgcmVxdWVzdC51cmkuc2xpY2UoMjApJyk7XG4gIH0pO1xuXG4gIGl0KFwicmVmdXNlcyBhbiBhc3NldFByZWZpeCB3aGVuIGFuIG92ZXJyaWRlIGFscmVhZHkgY2xhaW1zIFZJRVdFUl9SRVFVRVNUXCIsICgpID0+IHtcbiAgICAvLyBDbG91ZEZyb250IHBlcm1pdHMgb25lIGZ1bmN0aW9uIHBlciBldmVudCB0eXBlIHBlciBiZWhhdmlvciwgc28gdGhlXG4gICAgLy8gcmV3cml0ZSBhbmQgdGhlIG92ZXJyaWRlIGNhbm5vdCBjb2V4aXN0OiB0aGUgc3RhY2sgc3ludGhlZCBjbGVhbmx5IGFuZCB3YXNcbiAgICAvLyByZWplY3RlZCBhdCBkZXBsb3ksIG5hbWluZyBuZWl0aGVyIHRoZSBvdmVycmlkZSBub3IgYGFzc2V0UHJlZml4YC5cbiAgICBjb25zdCB7IHN0YWNrLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW10pO1xuICAgIGV4cGVjdChcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgICAgICBhc3NldFByZWZpeDogXCIvY2RuXCIsXG4gICAgICAgICAgb3ZlcnJpZGVzOiB7XG4gICAgICAgICAgICBzdGF0aWNCZWhhdmlvck9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgZnVuY3Rpb25Bc3NvY2lhdGlvbnM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBldmVudFR5cGU6IEZ1bmN0aW9uRXZlbnRUeXBlLlZJRVdFUl9SRVFVRVNULFxuICAgICAgICAgICAgICAgICAgZnVuY3Rpb246IG5ldyBDbG91ZEZyb250RnVuY3Rpb24oc3RhY2ssIFwiVXNlckZuXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogRnVuY3Rpb25Db2RlLmZyb21JbmxpbmUoXG4gICAgICAgICAgICAgICAgICAgICAgXCJmdW5jdGlvbiBoYW5kbGVyKGV2ZW50KSB7IHJldHVybiBldmVudC5yZXF1ZXN0OyB9XCIsXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICApLnRvVGhyb3coXG4gICAgICAvYXNzb2NpYXRlcyBhIENsb3VkRnJvbnQgZnVuY3Rpb24gd2l0aCB2aWV3ZXItcmVxdWVzdCwgYnV0IHNlcnZpbmcgYGFzc2V0UHJlZml4YC8sXG4gICAgKTtcbiAgfSk7XG5cbiAgY29uc3QgdXNlckZuID0gKHN0YWNrOiBTdGFjaywgZXZlbnRUeXBlOiBGdW5jdGlvbkV2ZW50VHlwZSkgPT4gKHtcbiAgICBldmVudFR5cGUsXG4gICAgZnVuY3Rpb246IG5ldyBDbG91ZEZyb250RnVuY3Rpb24oc3RhY2ssIGBVc2VyRm4ke2V2ZW50VHlwZX1gLCB7XG4gICAgICBjb2RlOiBGdW5jdGlvbkNvZGUuZnJvbUlubGluZShcbiAgICAgICAgXCJmdW5jdGlvbiBoYW5kbGVyKGV2ZW50KSB7IHJldHVybiBldmVudC5yZXF1ZXN0IHx8IGV2ZW50LnJlc3BvbnNlOyB9XCIsXG4gICAgICApLFxuICAgIH0pLFxuICB9KTtcblxuICBpdC5lYWNoKFtcImR5bmFtaWNCZWhhdmlvck9wdGlvbnNcIiwgXCJpbWFnZUJlaGF2aW9yT3B0aW9uc1wiXSBhcyBjb25zdCkoXG4gICAgXCJyZWZ1c2VzIGEgJXMgb3ZlcnJpZGUgdGhhdCB3b3VsZCByZXBsYWNlIHRoZSB4LWZvcndhcmRlZC1ob3N0IGZ1bmN0aW9uXCIsXG4gICAgKG92ZXJyaWRlTmFtZSkgPT4ge1xuICAgICAgLy8gVGhlIHJ1bnRpbWUgdHJ1c3RzIGB4LWZvcndhcmRlZC1ob3N0YCBvbiBGdW5jdGlvbiBVUkwgZXZlbnRzIGJlY2F1c2VcbiAgICAgIC8vIHRoaXMgZnVuY3Rpb24gb3ZlcndyaXRlcyBpdDsgcmVwbGFjZWQsIGEgdmlld2VyJ3Mgb3duIGhlYWRlciByZWFjaGVzIGl0LlxuICAgICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdKTtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAgICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgICAgICAgIG92ZXJyaWRlczoge1xuICAgICAgICAgICAgICBbb3ZlcnJpZGVOYW1lXToge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXNzb2NpYXRpb25zOiBbXG4gICAgICAgICAgICAgICAgICB1c2VyRm4oc3RhY2ssIEZ1bmN0aW9uRXZlbnRUeXBlLlZJRVdFUl9SRVFVRVNUKSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICkudG9UaHJvdyhcbiAgICAgICAgbmV3IFJlZ0V4cChgb3ZlcnJpZGVzXFxcXC4ke292ZXJyaWRlTmFtZX1cXFxcLmZ1bmN0aW9uQXNzb2NpYXRpb25zYCksXG4gICAgICApO1xuICAgIH0sXG4gICk7XG5cbiAgaXQoXCJrZWVwcyB0aGUgeC1mb3J3YXJkZWQtaG9zdCBmdW5jdGlvbiBuZXh0IHRvIGFuIG92ZXJyaWRlJ3Mgb3RoZXIgYXNzb2NpYXRpb25zXCIsICgpID0+IHtcbiAgICBjb25zdCB7IHN0YWNrLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW10pO1xuICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgb3ZlcnJpZGVzOiB7XG4gICAgICAgIGR5bmFtaWNCZWhhdmlvck9wdGlvbnM6IHtcbiAgICAgICAgICBmdW5jdGlvbkFzc29jaWF0aW9uczogW1xuICAgICAgICAgICAgdXNlckZuKHN0YWNrLCBGdW5jdGlvbkV2ZW50VHlwZS5WSUVXRVJfUkVTUE9OU0UpLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGNvbnN0IGNvbmZpZyA9IE9iamVjdC52YWx1ZXMoXG4gICAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmZpbmRSZXNvdXJjZXMoXCJBV1M6OkNsb3VkRnJvbnQ6OkRpc3RyaWJ1dGlvblwiKSxcbiAgICApWzBdLlByb3BlcnRpZXMuRGlzdHJpYnV0aW9uQ29uZmlnO1xuICAgIGNvbnN0IGV2ZW50VHlwZXMgPSAoXG4gICAgICBjb25maWcuRGVmYXVsdENhY2hlQmVoYXZpb3IuRnVuY3Rpb25Bc3NvY2lhdGlvbnMgYXMgQXJyYXk8e1xuICAgICAgICBFdmVudFR5cGU6IHN0cmluZztcbiAgICAgIH0+XG4gICAgKS5tYXAoKGFzc29jaWF0aW9uKSA9PiBhc3NvY2lhdGlvbi5FdmVudFR5cGUpO1xuICAgIGV4cGVjdChldmVudFR5cGVzLnNvcnQoKSkudG9FcXVhbChbXCJ2aWV3ZXItcmVxdWVzdFwiLCBcInZpZXdlci1yZXNwb25zZVwiXSk7XG4gIH0pO1xuXG4gIGl0KFwicmV3cml0ZXMgYW4gYXNzZXRQcmVmaXggYmFjayBvbnRvIHRoZSBiYXNlUGF0aCBTMyBrZXlzXCIsICgpID0+IHtcbiAgICBjb25zdCB7IHN0YWNrLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW10sIHsgYmFzZVBhdGg6IFwiL2Jhc2VcIiB9KTtcbiAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgIGFzc2V0UHJlZml4OiBcIi9jZG5cIixcbiAgICB9KTtcbiAgICBleHBlY3QocGF0aFBhdHRlcm5zKHN0YWNrKSkudG9Db250YWluKFwiL2Nkbi9fbmV4dC9zdGF0aWMqXCIpO1xuICAgIGNvbnN0IGZucyA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuZmluZFJlc291cmNlcyhcbiAgICAgIFwiQVdTOjpDbG91ZEZyb250OjpGdW5jdGlvblwiLFxuICAgICk7XG4gICAgY29uc3QgY29kZSA9IE9iamVjdC52YWx1ZXMoZm5zKVxuICAgICAgLm1hcCgoZm4pID0+IGZuLlByb3BlcnRpZXMuRnVuY3Rpb25Db2RlIGFzIHN0cmluZylcbiAgICAgIC5maW5kKChpdCkgPT4gaXQuaW5jbHVkZXMoXCJyZXF1ZXN0LnVyaS5zbGljZVwiKSk7XG4gICAgLy8gVGhlIG9iamVjdHMgYXJlIGF0IGBiYXNlL19uZXh0L3N0YXRpYy8uLi5gOiBgYXNzZXRQcmVmaXhgIHJlcGxhY2VzIHRoZVxuICAgIC8vIGBiYXNlUGF0aGAgcHJlZml4IGluIHRoZSBVUkwsIHNvIHRoZSByZXdyaXRlIGhhcyB0byBwdXQgaXQgYmFjay5cbiAgICBleHBlY3QoY29kZSkudG9Db250YWluKCdcIi9iYXNlXCIgKyByZXF1ZXN0LnVyaS5zbGljZSg0KScpO1xuICB9KTtcblxuICBpdChcInNlcnZlcyBidW5kbGVzIHVuZGVyIHRoZSBwYXRoIGFuIGFic29sdXRlIGFzc2V0UHJlZml4IGNhcnJpZXNcIiwgKCkgPT4ge1xuICAgIC8vIGBuZXh0IGJ1aWxkYCBjb21waWxlcyBhIGAvY3VzdG9tLWFzc2V0LXByZWZpeC9fbmV4dC86cGF0aCsg4oaSIC9fbmV4dC86cGF0aCtgXG4gICAgLy8gcmV3cml0ZSBvZiBpdHMgb3duIGZvciBhbiBhYnNvbHV0ZSBwcmVmaXggd2l0aCBhIHBhdGgsIHNvIGBuZXh0IHN0YXJ0YCBzZXJ2ZXNcbiAgICAvLyBldmVyeSBidW5kbGUgdW5kZXIgdGhhdCBwYXRoIGFzIHdlbGwuIEEgQ0ROIGZyb250aW5nIHRoaXMgZGlzdHJpYnV0aW9uIHRoZXJlXG4gICAgLy8gZ2V0cyB0aGUgc2FtZSByZXF1ZXN0LCBhbmQgd2l0aG91dCBhIGJlaGF2aW9yIGl0IHJlYWNoZXMgdGhlIGNvbXB1dGUgb3JpZ2luXG4gICAgLy8gYW5kIDQwNHMuIE1lYXN1cmVkIGFnYWluc3QgYHRlc3QvZTJlL2FwcC1kaXIvYXNzZXQtcHJlZml4LWFic29sdXRlYCwgd2hvc2VcbiAgICAvLyBvbmUgY2FzZSBmYWlsZWQgb24gZXhhY3RseSB0aGF0LlxuICAgIGZvciAoY29uc3QgYXNzZXRQcmVmaXggb2YgW1xuICAgICAgXCJodHRwczovL2V4YW1wbGUudmVyY2VsLnNoL2N1c3RvbS1hc3NldC1wcmVmaXhcIixcbiAgICAgIFwiLy9leGFtcGxlLnZlcmNlbC5zaC9jdXN0b20tYXNzZXQtcHJlZml4L1wiLFxuICAgIF0pIHtcbiAgICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSk7XG4gICAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgICBhc3NldFByZWZpeCxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHBhdGhQYXR0ZXJucyhzdGFjaykpLnRvQ29udGFpbihcbiAgICAgICAgXCIvY3VzdG9tLWFzc2V0LXByZWZpeC9fbmV4dC9zdGF0aWMqXCIsXG4gICAgICApO1xuICAgICAgY29uc3QgY29kZSA9IE9iamVjdC52YWx1ZXMoXG4gICAgICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuZmluZFJlc291cmNlcyhcIkFXUzo6Q2xvdWRGcm9udDo6RnVuY3Rpb25cIiksXG4gICAgICApXG4gICAgICAgIC5tYXAoKGZuKSA9PiBmbi5Qcm9wZXJ0aWVzLkZ1bmN0aW9uQ29kZSBhcyBzdHJpbmcpXG4gICAgICAgIC5maW5kKChpdCkgPT4gaXQuaW5jbHVkZXMoXCJyZXF1ZXN0LnVyaS5zbGljZVwiKSk7XG4gICAgICBleHBlY3QoY29kZSkudG9Db250YWluKCdcIlwiICsgcmVxdWVzdC51cmkuc2xpY2UoMjApJyk7XG4gICAgfVxuICB9KTtcblxuICBpdChcImFkZHMgbm8gYmVoYXZpb3IgZm9yIGFuIGFzc2V0UHJlZml4IHRoYXQgbmVlZHMgbm9uZVwiLCAoKSA9PiB7XG4gICAgLy8gQW4gYWJzb2x1dGUgcHJlZml4IHdpdGggbm8gcGF0aCBvZiBpdHMgb3duIG5hbWVzIGFuIG9yaWdpbiB0aGlzIGRpc3RyaWJ1dGlvblxuICAgIC8vIGRvZXMgbm90IHNlcnZlLCBhbmQgYSBwcmVmaXggZXF1YWwgdG8gdGhlIGJhc2VQYXRoIG9uZSBpcyB3aGF0IE5leHQuanNcbiAgICAvLyBkZWZhdWx0cyB0byB3aGVuIGBiYXNlUGF0aGAgaXMgc2V0IOKAlCBgX25leHQvc3RhdGljKmAgYWxyZWFkeSByZXNvbHZlcyB1bmRlclxuICAgIC8vIGl0LCBhbmQgYSBkdXBsaWNhdGUgcGF0dGVybiB3b3VsZCBtYWtlIENsb3VkRnJvbnQgcmVqZWN0IHRoZSBkaXN0cmlidXRpb24uXG4gICAgZm9yIChjb25zdCBbYXNzZXRQcmVmaXgsIGJhc2VQYXRoXSBvZiBbXG4gICAgICBbXCJodHRwczovL2Nkbi5leGFtcGxlLmNvbVwiLCB1bmRlZmluZWRdLFxuICAgICAgW1wiaHR0cHM6Ly9jZG4uZXhhbXBsZS5jb20vXCIsIHVuZGVmaW5lZF0sXG4gICAgICBbXCIvL2Nkbi5leGFtcGxlLmNvbVwiLCB1bmRlZmluZWRdLFxuICAgICAgW1wiL2Jhc2VcIiwgXCIvYmFzZVwiXSxcbiAgICAgIFtcImh0dHBzOi8vY2RuLmV4YW1wbGUuY29tL2Jhc2VcIiwgXCIvYmFzZVwiXSxcbiAgICAgIFtcIlwiLCB1bmRlZmluZWRdLFxuICAgIF0gYXMgY29uc3QpIHtcbiAgICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSwgeyBiYXNlUGF0aCB9KTtcbiAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICAgIGFzc2V0UHJlZml4LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBwYXR0ZXJucyA9IHBhdGhQYXR0ZXJucyhzdGFjayk7XG4gICAgICBleHBlY3QocGF0dGVybnMuZmlsdGVyKChwKSA9PiBwLmluY2x1ZGVzKFwiX25leHQvc3RhdGljXCIpKSkudG9IYXZlTGVuZ3RoKFxuICAgICAgICAxLFxuICAgICAgKTtcbiAgICAgIC8vIFRoZSB4LWZvcndhcmRlZC1ob3N0IGZ1bmN0aW9uIGlzIGFsd2F5cyB0aGVyZSBvbiBmdW5jdGlvbiBjb21wdXRlOyB0aGVcbiAgICAgIC8vIHJld3JpdGUgb25lIHNob3VsZCBub3QgYmUuXG4gICAgICBjb25zdCBjb2RlcyA9IE9iamVjdC52YWx1ZXMoXG4gICAgICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuZmluZFJlc291cmNlcyhcIkFXUzo6Q2xvdWRGcm9udDo6RnVuY3Rpb25cIiksXG4gICAgICApLm1hcCgoZm4pID0+IGZuLlByb3BlcnRpZXMuRnVuY3Rpb25Db2RlIGFzIHN0cmluZyk7XG4gICAgICBleHBlY3QoY29kZXMuc29tZSgoaXQpID0+IGl0LmluY2x1ZGVzKFwicmVxdWVzdC51cmkuc2xpY2VcIikpKS50b0JlKGZhbHNlKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KFwiY291bnRzIHRoZSBhc3NldFByZWZpeCBiZWhhdmlvciBhZ2FpbnN0IHRoZSBidWRnZXRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSwge1xuICAgICAgcHVibGljRGlyRW50cmllczogQXJyYXkuZnJvbSh7IGxlbmd0aDogMjIgfSwgKF8sIGkpID0+IGBmaWxlJHtpfS50eHRgKSxcbiAgICB9KTtcbiAgICAvLyAzIGZpeGVkICsgMjIgcHVibGljID0gMjUsIGV4YWN0bHkgdGhlIGxpbWl0OyB0aGUgYXNzZXRQcmVmaXggb25lIGlzIHRoZVxuICAgIC8vIDI2dGgsIGFuZCBhIGxpbWl0IGVycm9yIHRoYXQgZGlkIG5vdCBjb3VudCBpdCB3b3VsZCBjb21lIGFzIGEgZGVwbG95XG4gICAgLy8gZmFpbHVyZSBpbnN0ZWFkLlxuICAgIGV4cGVjdChcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgICAgICBhc3NldFByZWZpeDogXCIvY2RuXCIsXG4gICAgICAgICAgbWF4Q2FjaGVCZWhhdmlvcnM6IDI1LFxuICAgICAgICB9KSxcbiAgICApLnRvVGhyb3coLzI2IENsb3VkRnJvbnQgY2FjaGUgYmVoYXZpb3JzLio0IHVzZWQgYnkgY2RrLW5leHRqcyBpdHNlbGYvcyk7XG4gIH0pO1xuXG4gIGl0KFwiZG9lcyBub3QgY2FjaGUgYSBkeW5hbWljIHJlc3BvbnNlIHRoYXQgc2VuZHMgbm8gQ2FjaGUtQ29udHJvbFwiLCAoKSA9PiB7XG4gICAgLy8gQ0RLJ3MgYENhY2hlUG9saWN5YCBkZWZhdWx0IGlzIGEgZGF5LCB3aGljaCBjYWNoZWQgZXZlcnkgcm91dGUgaGFuZGxlclxuICAgIC8vIHdpdGhvdXQgYSBgQ2FjaGUtQ29udHJvbGAgLSBgL2FwaS9lY2hvYCBpbiBhcHAtcGxheWdyb3VuZCAtIGZvciAyNCBob3Vycy5cbiAgICBjb25zdCB7IHN0YWNrLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW10pO1xuICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIGRpc3RyaWJ1dGlvblByb3BzKTtcbiAgICBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spLmhhc1Jlc291cmNlUHJvcGVydGllcyhcbiAgICAgIFwiQVdTOjpDbG91ZEZyb250OjpDYWNoZVBvbGljeVwiLFxuICAgICAge1xuICAgICAgICBDYWNoZVBvbGljeUNvbmZpZzogTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgQ29tbWVudDogTWF0Y2guc3RyaW5nTGlrZVJlZ2V4cChcIkR5bmFtaWNcIiksXG4gICAgICAgICAgRGVmYXVsdFRUTDogMCxcbiAgICAgICAgICBNaW5UVEw6IDAsXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICApO1xuICB9KTtcblxuICBpdChcIndpbGRjYXJkcyBhIHB1YmxpYy8gbmFtZSBDbG91ZEZyb250IGNhbm5vdCBzcGVsbFwiLCAoKSA9PiB7XG4gICAgLy8gYHB1YmxpYy9oZWxsbyB3b3JsZC5qcGdgIGlzIGEgdmFsaWQgTmV4dC5qcyBhc3NldCwgYnV0IGEgc3BhY2UgY2Fubm90IGFwcGVhclxuICAgIC8vIGluIGEgcGF0aCBwYXR0ZXJuLCBzbyBjZGstbmV4dGpzIHRocmV3IGF0IHN5bnRoIGFuZCB0aGUgYXBwIGNvdWxkIG5vdCBiZVxuICAgIC8vIGRlcGxveWVkIGF0IGFsbC4gQ2xvdWRGcm9udCBtYXRjaGVzIHRoZSAqZGVjb2RlZCogcGF0aCwgYW5kIGA/YCBtYXRjaGVzIG9uZVxuICAgIC8vIGJ5dGUgb2YgaXQsIHNvIG9uZSBgP2AgcGVyIFVURi04IGJ5dGUgaXMgdGhlIG5hcnJvd2VzdCBwYXR0ZXJuIHRoYXRcbiAgICAvLyBtYXRjaGVzLiBOb3Qgb25lIHBlciBwZXJjZW50LWVuY29kZWQgY2hhcmFjdGVyOiBgaGVsbG8/Pz93b3JsZC5qcGdgXG4gICAgLy8gZGVwbG95cyBhbmQgdGhlbiBuZXZlciBtYXRjaGVzLCB3aGljaCBpcyBhIDQwNCByYXRoZXIgdGhhbiBhIHN5bnRoIGVycm9yLlxuICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSwge1xuICAgICAgcHVibGljRGlyRW50cmllczogW1wiaGVsbG8gd29ybGQuanBnXCIsIFwiw6TDtsO8xaHEjcWZw60ucG5nXCIsIFwiZmF2aWNvbi5pY29cIl0sXG4gICAgfSk7XG4gICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwgZGlzdHJpYnV0aW9uUHJvcHMpO1xuICAgIGV4cGVjdChwYXRoUGF0dGVybnMoc3RhY2spKS50b0VxdWFsKFxuICAgICAgZXhwZWN0LmFycmF5Q29udGFpbmluZyhbXG4gICAgICAgIFwiaGVsbG8/d29ybGQuanBnXCIsXG4gICAgICAgIC8vIDcgY2hhcmFjdGVycywgMiBVVEYtOCBieXRlcyBlYWNoLlxuICAgICAgICBgJHtcIj9cIi5yZXBlYXQoMTQpfS5wbmdgLFxuICAgICAgICBcImZhdmljb24uaWNvXCIsXG4gICAgICBdKSxcbiAgICApO1xuICB9KTtcblxuICBpdChcIndpbGRjYXJkcyBhIHB1YmxpYy8gZGlyZWN0b3J5IG5hbWUgdGhlIHNhbWUgd2F5XCIsICgpID0+IHtcbiAgICBjb25zdCB7IHN0YWNrLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW10pO1xuICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgIC4uLmRpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgcHVibGljRGlyRW50cmllczogW3sgbmFtZTogXCJteSBpbWFnZXNcIiwgaXNEaXJlY3Rvcnk6IHRydWUgfV0sXG4gICAgfSk7XG4gICAgZXhwZWN0KHBhdGhQYXR0ZXJucyhzdGFjaykpLnRvQ29udGFpbihcIm15P2ltYWdlcy8qXCIpO1xuICB9KTtcblxuICBpdChcInJlamVjdHMgYSBwdWJsaWMvIG5hbWUgdG9vIGxvbmcgdG8gZXhwcmVzcyBhcyBhIHBhdGggcGF0dGVyblwiLCAoKSA9PiB7XG4gICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdLCB7XG4gICAgICBwdWJsaWNEaXJFbnRyaWVzOiBbYCR7XCLDpFwiLnJlcGVhdCgxMzApfS5wbmdgXSxcbiAgICB9KTtcbiAgICBleHBlY3QoXG4gICAgICAoKSA9PiBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCBkaXN0cmlidXRpb25Qcm9wcyksXG4gICAgKS50b1Rocm93KC9uZWVkcyBhIDI2NC1jaGFyYWN0ZXIgQ2xvdWRGcm9udCBwYXRoIHBhdHRlcm4vKTtcbiAgfSk7XG5cbiAgaXQoXCJza2lwcyBhIHB1YmxpYy8gZW50cnkgd2hvc2UgcGF0dGVybiB3b3VsZCBiZSB3aWxkY2FyZHMgYWxvbmVcIiwgKCkgPT4ge1xuICAgIC8vIGDRhNC+0YLQvi9gIGlzIGA/Pz8/Pz8/Py8qYCwgd2hpY2ggbWF0Y2hlcyBhbnkgOC1ieXRlIGZpcnN0IHNlZ21lbnQuIFB1YmxpY1xuICAgIC8vIGJlaGF2aW9ycyBhcmUgYWRkZWQgYWhlYWQgb2YgdGhlIGNvbXB1dGUgb25lcywgc28gYC9wcm9kdWN0cy80MmAgd291bGQgZ29cbiAgICAvLyB0byBTMyBhbmQgNDAzLiBUaGUgZW50cnkgZ2V0cyBubyBiZWhhdmlvciBhbmQgYSB3YXJuaW5nIGluc3RlYWQuXG4gICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdKTtcbiAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IFtcbiAgICAgICAgeyBuYW1lOiBcItGE0L7RgtC+XCIsIGlzRGlyZWN0b3J5OiB0cnVlIH0sXG4gICAgICAgIHsgbmFtZTogXCLlm75cIiwgaXNEaXJlY3Rvcnk6IGZhbHNlIH0sXG4gICAgICAgIHsgbmFtZTogXCLRhNC+0YLQvi0xXCIsIGlzRGlyZWN0b3J5OiB0cnVlIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGNvbnN0IHBhdHRlcm5zID0gcGF0aFBhdHRlcm5zKHN0YWNrKTtcbiAgICBleHBlY3QocGF0dGVybnMpLm5vdC50b0NvbnRhaW4oYCR7XCI/XCIucmVwZWF0KDgpfS8qYCk7XG4gICAgZXhwZWN0KHBhdHRlcm5zKS5ub3QudG9Db250YWluKFwiPz8/XCIpO1xuICAgIC8vIE9uZSBsaXRlcmFsIGNoYXJhY3RlciBrZWVwcyBhIHBhdHRlcm4gbmFycm93IGVub3VnaCB0byBrZWVwLlxuICAgIGV4cGVjdChwYXR0ZXJucykudG9Db250YWluKGAke1wiP1wiLnJlcGVhdCg4KX0tMS8qYCk7XG4gICAgQW5ub3RhdGlvbnMuZnJvbVN0YWNrKHN0YWNrKS5oYXNXYXJuaW5nKFxuICAgICAgXCIqXCIsXG4gICAgICBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKCdcItGE0L7RgtC+XCIsIFwi5Zu+XCInKSxcbiAgICApO1xuICB9KTtcblxuICBpdChcImRvZXMgbm90IGNvdW50IGEgc2tpcHBlZCBwdWJsaWMvIGVudHJ5IGFnYWluc3QgdGhlIGJ1ZGdldFwiLCAoKSA9PiB7XG4gICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdLCB7XG4gICAgICBwdWJsaWNEaXJFbnRyaWVzOiBbXG4gICAgICAgIC4uLkFycmF5LmZyb20oeyBsZW5ndGg6IDIyIH0sIChfLCBpKSA9PiBgZmlsZSR7aX0udHh0YCksXG4gICAgICAgIFwi5Zu+XCIsXG4gICAgICBdLFxuICAgIH0pO1xuICAgIC8vIDMgZml4ZWQgKyAyMiA9IDI1LCBleGFjdGx5IHRoZSBsaW1pdDsgdGhlIHNraXBwZWQgZW50cnkgYWRkcyBub3RoaW5nLlxuICAgIGV4cGVjdChcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgICAgICBtYXhDYWNoZUJlaGF2aW9yczogMjUsXG4gICAgICAgIH0pLFxuICAgICkubm90LnRvVGhyb3coKTtcbiAgfSk7XG5cbiAgaXQoXCJjaGVja3MgdGhlIGxlbmd0aCBvZiB0aGUgZmluYWwgcGF0dGVybiwgYmFzZVBhdGggYW5kIC8qIGluY2x1ZGVkXCIsICgpID0+IHtcbiAgICAvLyA4MyB0aHJlZS1ieXRlIGNoYXJhY3RlcnMgKyBcIi5wZGZcIiBpcyBhIDI1My1jaGFyYWN0ZXIgcGF0dGVybiBvbiBpdHMgb3duLFxuICAgIC8vIHVuZGVyIHRoZSBsaW1pdDsgYC9kb2NzL2AgaW4gZnJvbnQgdGFrZXMgaXQgdG8gMjU5LCB3aGljaCBDbG91ZEZyb250XG4gICAgLy8gcmVqZWN0cyBhdCBkZXBsb3kuXG4gICAgY29uc3QgbmFtZSA9IGAke1wi5Zu+XCIucmVwZWF0KDgzKX0ucGRmYDtcbiAgICBjb25zdCB7IHN0YWNrLCBkaXN0cmlidXRpb25Qcm9wcyB9ID0gc2V0dXAoW10sIHtcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IFtuYW1lXSxcbiAgICB9KTtcbiAgICBleHBlY3QoXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICAgICAgYmFzZVBhdGg6IFwiL2RvY3NcIixcbiAgICAgICAgfSksXG4gICAgKS50b1Rocm93KC9uZWVkcyBhIDI1OS1jaGFyYWN0ZXIgQ2xvdWRGcm9udCBwYXRoIHBhdHRlcm4vKTtcblxuICAgIGNvbnN0IHsgc3RhY2s6IGRpclN0YWNrLCBkaXN0cmlidXRpb25Qcm9wczogZGlyUHJvcHMgfSA9IHNldHVwKFtdKTtcbiAgICBleHBlY3QoXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKGRpclN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAgICAgLi4uZGlyUHJvcHMsXG4gICAgICAgICAgLy8gMjU0IGNoYXJhY3RlcnMsIHVuZGVyIHRoZSBsaW1pdCB1bnRpbCB0aGUgYC8qYC5cbiAgICAgICAgICBwdWJsaWNEaXJFbnRyaWVzOiBbXG4gICAgICAgICAgICB7IG5hbWU6IGBhYiR7XCLlm75cIi5yZXBlYXQoODQpfWAsIGlzRGlyZWN0b3J5OiB0cnVlIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSksXG4gICAgKS50b1Rocm93KC9uZWVkcyBhIDI1Ni1jaGFyYWN0ZXIvKTtcbiAgfSk7XG5cbiAgaXQoXCJkcm9wcyB0aGUgY2FjaGUga2V5IHdoZW4gYW4gb3ZlcnJpZGUgZGlzYWJsZXMgZHluYW1pYyBjYWNoaW5nXCIsICgpID0+IHtcbiAgICAvLyBDbG91ZEZyb250IHJlamVjdHMgYSBwb2xpY3kgdGhhdCBjYWNoZXMgbm90aGluZyBidXQga2V5cyBvbiBoZWFkZXJzLiBDREtcbiAgICAvLyB1c2VkIHRvIHJhaXNlIGBtYXhUdGw6IDBgIHRvIHRoZSBkYXktbG9uZyBkZWZhdWx0LCBzbyB0aGUgb3ZlcnJpZGVcbiAgICAvLyBkZXBsb3llZDsgd2l0aCBhIGRlZmF1bHQgb2YgMCBpdCBpcyBob25vcmVkLCBhbmQgbXVzdCBzdGF5IGRlcGxveWFibGUuXG4gICAgY29uc3QgeyBzdGFjaywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9IHNldHVwKFtdKTtcbiAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgIG92ZXJyaWRlczoge1xuICAgICAgICBkeW5hbWljQ2FjaGVQb2xpY3lQcm9wczogeyBtYXhUdGw6IER1cmF0aW9uLnNlY29uZHMoMCkgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoXG4gICAgICBcIkFXUzo6Q2xvdWRGcm9udDo6Q2FjaGVQb2xpY3lcIixcbiAgICAgIHtcbiAgICAgICAgQ2FjaGVQb2xpY3lDb25maWc6IE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgIENvbW1lbnQ6IE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoXCJEeW5hbWljXCIpLFxuICAgICAgICAgIERlZmF1bHRUVEw6IDAsXG4gICAgICAgICAgTWF4VFRMOiAwLFxuICAgICAgICAgIE1pblRUTDogMCxcbiAgICAgICAgICBQYXJhbWV0ZXJzSW5DYWNoZUtleUFuZEZvcndhcmRlZFRvT3JpZ2luOiB7XG4gICAgICAgICAgICBDb29raWVzQ29uZmlnOiB7IENvb2tpZUJlaGF2aW9yOiBcIm5vbmVcIiB9LFxuICAgICAgICAgICAgRW5hYmxlQWNjZXB0RW5jb2RpbmdCcm90bGk6IGZhbHNlLFxuICAgICAgICAgICAgRW5hYmxlQWNjZXB0RW5jb2RpbmdHemlwOiBmYWxzZSxcbiAgICAgICAgICAgIEhlYWRlcnNDb25maWc6IHsgSGVhZGVyQmVoYXZpb3I6IFwibm9uZVwiIH0sXG4gICAgICAgICAgICBRdWVyeVN0cmluZ3NDb25maWc6IHsgUXVlcnlTdHJpbmdCZWhhdmlvcjogXCJub25lXCIgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJrZWVwcyB0aGUgY2FjaGUga2V5IHdoZW4gYSB6ZXJvIG1heFR0bCBpcyByYWlzZWQgYnkgYW5vdGhlciBUVExcIiwgKCkgPT4ge1xuICAgIC8vIENESyByYWlzZXMgYG1heFR0bGAgdG8gYGRlZmF1bHRUdGxgLCBzbyB0aGlzIHBvbGljeSBjYWNoZXMgZm9yIGFuIGhvdXIuXG4gICAgLy8gRHJvcHBpbmcgdGhlIGtleSBmb3IgaXQgd291bGQgc2VydmUgb25lIHZpZXdlcidzIHBhZ2UgdG8gZXZlcnkgdmlld2VyLlxuICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSk7XG4gICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwge1xuICAgICAgLi4uZGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgICBvdmVycmlkZXM6IHtcbiAgICAgICAgZHluYW1pY0NhY2hlUG9saWN5UHJvcHM6IHtcbiAgICAgICAgICBtYXhUdGw6IER1cmF0aW9uLnNlY29uZHMoMCksXG4gICAgICAgICAgZGVmYXVsdFR0bDogRHVyYXRpb24uaG91cnMoMSksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKFxuICAgICAgXCJBV1M6OkNsb3VkRnJvbnQ6OkNhY2hlUG9saWN5XCIsXG4gICAgICB7XG4gICAgICAgIENhY2hlUG9saWN5Q29uZmlnOiBNYXRjaC5vYmplY3RMaWtlKHtcbiAgICAgICAgICBDb21tZW50OiBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKFwiRHluYW1pY1wiKSxcbiAgICAgICAgICBNYXhUVEw6IDM2MDAsXG4gICAgICAgICAgUGFyYW1ldGVyc0luQ2FjaGVLZXlBbmRGb3J3YXJkZWRUb09yaWdpbjogTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgICBDb29raWVzQ29uZmlnOiB7IENvb2tpZUJlaGF2aW9yOiBcImFsbFwiIH0sXG4gICAgICAgICAgICBRdWVyeVN0cmluZ3NDb25maWc6IHsgUXVlcnlTdHJpbmdCZWhhdmlvcjogXCJhbGxcIiB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJrZXlzIHRoZSBkeW5hbWljIGNhY2hlIG9ubHkgb24gaGVhZGVycyB0aGUgb3JpZ2luIHJlYWRzXCIsICgpID0+IHtcbiAgICAvLyBgeC1tYXRjaGVkLXBhdGhgIGlzIHN0cmlwcGVkIGJ5IHRoZSBydW50aW1lIGFuZCBgeC1uZXh0LWNhY2hlLXRhZ3NgIGlzXG4gICAgLy8gbmV2ZXIgc2VudCBieSB2aWV3ZXJzOiBrZXlpbmcgb24gZWl0aGVyIHNwZW5kcyBhIGhlYWRlciBzbG90IGFuZCBsZXRzIGFcbiAgICAvLyBjbGllbnQgZnJhZ21lbnQgdGhlIGNhY2hlIGZvciBub3RoaW5nLlxuICAgIGNvbnN0IHsgc3RhY2ssIGRpc3RyaWJ1dGlvblByb3BzIH0gPSBzZXR1cChbXSk7XG4gICAgbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbihzdGFjaywgXCJEaXN0cmlidXRpb25cIiwgZGlzdHJpYnV0aW9uUHJvcHMpO1xuICAgIGNvbnN0IHBvbGljaWVzID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5maW5kUmVzb3VyY2VzKFxuICAgICAgXCJBV1M6OkNsb3VkRnJvbnQ6OkNhY2hlUG9saWN5XCIsXG4gICAgICB7XG4gICAgICAgIFByb3BlcnRpZXM6IHtcbiAgICAgICAgICBDYWNoZVBvbGljeUNvbmZpZzogeyBDb21tZW50OiBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKFwiRHluYW1pY1wiKSB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuICAgIGNvbnN0IFtwb2xpY3ldID0gT2JqZWN0LnZhbHVlcyhwb2xpY2llcyk7XG4gICAgY29uc3QgaGVhZGVyczogc3RyaW5nW10gPVxuICAgICAgcG9saWN5LlByb3BlcnRpZXMuQ2FjaGVQb2xpY3lDb25maWdcbiAgICAgICAgLlBhcmFtZXRlcnNJbkNhY2hlS2V5QW5kRm9yd2FyZGVkVG9PcmlnaW4uSGVhZGVyc0NvbmZpZy5IZWFkZXJzO1xuICAgIGV4cGVjdChoZWFkZXJzKS5ub3QudG9Db250YWluKFwieC1tYXRjaGVkLXBhdGhcIik7XG4gICAgZXhwZWN0KGhlYWRlcnMpLm5vdC50b0NvbnRhaW4oXCJ4LW5leHQtY2FjaGUtdGFnc1wiKTtcbiAgICBleHBlY3QoaGVhZGVycykudG9Db250YWluKFwicnNjXCIpO1xuICB9KTtcblxuICBpdChcInJlamVjdHMgc3BsaXR0aW5nIG9uIGEgZGVwbG95bWVudCB0eXBlIHRoYXQgY2Fubm90IHJvdXRlIGl0XCIsICgpID0+IHtcbiAgICBjb25zdCB7IHN0YWNrLCBmdW5jdGlvbkdyb3VwcywgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycywgZGlzdHJpYnV0aW9uUHJvcHMgfSA9XG4gICAgICBzZXR1cChbXCJhcGlcIl0pO1xuICAgIGV4cGVjdChcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBOZXh0anNEaXN0cmlidXRpb24oc3RhY2ssIFwiRGlzdHJpYnV0aW9uXCIsIHtcbiAgICAgICAgICAuLi5kaXN0cmlidXRpb25Qcm9wcyxcbiAgICAgICAgICBuZXh0anNUeXBlOiBOZXh0anNUeXBlLkdMT0JBTF9DT05UQUlORVJTLFxuICAgICAgICAgIGxvYWRCYWxhbmNlcjogdW5kZWZpbmVkLFxuICAgICAgICAgIGZ1bmN0aW9uR3JvdXBzLFxuICAgICAgICAgIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsXG4gICAgICAgIH0pLFxuICAgICkudG9UaHJvdygvb25seSBzdXBwb3J0ZWQgYnkgTmV4dGpzR2xvYmFsRnVuY3Rpb25zLyk7XG4gIH0pO1xufSk7XG5cbi8qKlxuICogVGhlIHZpZXdlci1yZXF1ZXN0IGZ1bmN0aW9uLCBydW4gYXMgQ2xvdWRGcm9udCB3b3VsZCBydW4gaXQuXG4gKlxuICogSXQgaXMgYXV0aG9yZWQgYXMgYSBzdHJpbmcgaW5zaWRlIGEgVHlwZVNjcmlwdCB0ZW1wbGF0ZSBsaXRlcmFsLCBzbyBldmVyeVxuICogYmFja3NsYXNoIGluIGl0IGlzIGVzY2FwZWQgdHdpY2UgLSBhbmQgYSByZWdleCB0aGF0IGNvbGxhcHNlcyBzbGFzaGVzIGlzIG5vdGhpbmdcbiAqIGJ1dCBiYWNrc2xhc2hlcy4gQXNzZXJ0aW5nIG9uIGJlaGF2aW9yIHJhdGhlciB0aGFuIG9uIHRoZSB0ZXh0IGlzIHdoYXQgY2F0Y2hlcyBhblxuICogZXNjYXBpbmcgbWlzdGFrZSwgd2hpY2ggYSBzbmFwc2hvdCB3b3VsZCBoYXBwaWx5IHJlY29yZC5cbiAqL1xuZGVzY3JpYmUoXCJ0aGUgdmlld2VyLXJlcXVlc3QgQ2xvdWRGcm9udCBGdW5jdGlvblwiLCAoKSA9PiB7XG4gIGludGVyZmFjZSBRdWVyeVZhbHVlIHtcbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIG11bHRpVmFsdWU/OiBBcnJheTx7IHZhbHVlOiBzdHJpbmcgfT47XG4gIH1cbiAgaW50ZXJmYWNlIEZ1bmN0aW9uUmVxdWVzdCB7XG4gICAgdXJpOiBzdHJpbmc7XG4gICAgcXVlcnlzdHJpbmc6IFJlY29yZDxzdHJpbmcsIFF1ZXJ5VmFsdWU+O1xuICAgIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHN0cmluZyB9PjtcbiAgfVxuICB0eXBlIEZ1bmN0aW9uUmVzdWx0ID1cbiAgICB8IEZ1bmN0aW9uUmVxdWVzdFxuICAgIHwgeyBzdGF0dXNDb2RlOiBudW1iZXI7IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHN0cmluZyB9PiB9O1xuXG4gIGNvbnN0IGhhbmRsZXIgPSAoKCkgPT4ge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKG5ldyBBcHAoKSwgXCJGblN0YWNrXCIpO1xuICAgIGNvbnN0IGZuID0gbmV3IExhbWJkYUZ1bmN0aW9uKHN0YWNrLCBcIkZuXCIsIHtcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZShcImV4cG9ydHMuaGFuZGxlciA9ICgpID0+IHt9O1wiKSxcbiAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICB9KTtcbiAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICBhc3NldHNCdWNrZXQ6IG5ldyBCdWNrZXQoc3RhY2ssIFwiQXNzZXRzXCIpLFxuICAgICAgZnVuY3Rpb25Vcmw6IG5ldyBGdW5jdGlvblVybChzdGFjaywgXCJVcmxcIiwge1xuICAgICAgICBmdW5jdGlvbjogZm4sXG4gICAgICAgIGF1dGhUeXBlOiBGdW5jdGlvblVybEF1dGhUeXBlLkFXU19JQU0sXG4gICAgICB9KSxcbiAgICAgIG5leHRqc1R5cGU6IE5leHRqc1R5cGUuR0xPQkFMX0ZVTkNUSU9OUyxcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IFtdLFxuICAgIH0pO1xuICAgIGNvbnN0IGZ1bmN0aW9ucyA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuZmluZFJlc291cmNlcyhcbiAgICAgIFwiQVdTOjpDbG91ZEZyb250OjpGdW5jdGlvblwiLFxuICAgICk7XG4gICAgY29uc3QgY29kZSA9IE9iamVjdC52YWx1ZXMoZnVuY3Rpb25zKVswXS5Qcm9wZXJ0aWVzLkZ1bmN0aW9uQ29kZSBhcyBzdHJpbmc7XG4gICAgcmV0dXJuIHJ1bkluTmV3Q29udGV4dChgJHtjb2RlfVxcbmhhbmRsZXJgKSBhcyAoZXZlbnQ6IHtcbiAgICAgIHJlcXVlc3Q6IEZ1bmN0aW9uUmVxdWVzdDtcbiAgICB9KSA9PiBQcm9taXNlPEZ1bmN0aW9uUmVzdWx0PjtcbiAgfSkoKTtcblxuICBjb25zdCBzZW5kID0gKFxuICAgIHVyaTogc3RyaW5nLFxuICAgIHF1ZXJ5c3RyaW5nOiBSZWNvcmQ8c3RyaW5nLCBRdWVyeVZhbHVlPiA9IHt9LFxuICApOiBQcm9taXNlPEZ1bmN0aW9uUmVzdWx0PiA9PlxuICAgIGhhbmRsZXIoe1xuICAgICAgcmVxdWVzdDogeyB1cmksIHF1ZXJ5c3RyaW5nLCBoZWFkZXJzOiB7IGhvc3Q6IHsgdmFsdWU6IFwiYS50ZXN0XCIgfSB9IH0sXG4gICAgfSk7XG5cbiAgY29uc3QgcmVkaXJlY3QgPSAocmVzdWx0OiBGdW5jdGlvblJlc3VsdCkgPT4gKHtcbiAgICBzdGF0dXNDb2RlOiAocmVzdWx0IGFzIHsgc3RhdHVzQ29kZTogbnVtYmVyIH0pLnN0YXR1c0NvZGUsXG4gICAgbG9jYXRpb246IHJlc3VsdC5oZWFkZXJzLmxvY2F0aW9uPy52YWx1ZSxcbiAgfSk7XG5cbiAgaXQuZWFjaChbXG4gICAgW1wiLy9cIiwgXCIvXCJdLFxuICAgIFtcIi8vL1wiLCBcIi9cIl0sXG4gICAgW1wiL2Zvby8vYmFyXCIsIFwiL2Zvby9iYXJcIl0sXG4gICAgW1wiL2Jhc2VwYXRoLy90by1zdlwiLCBcIi9iYXNlcGF0aC90by1zdlwiXSxcbiAgICBbXCIvYVxcXFxiXCIsIFwiL2EvYlwiXSxcbiAgXSkoXCJyZWRpcmVjdHMgJXMgdG8gJXMgd2l0aCBhIDMwOFwiLCBhc3luYyAodXJpLCBsb2NhdGlvbikgPT4ge1xuICAgIGV4cGVjdChyZWRpcmVjdChhd2FpdCBzZW5kKHVyaSkpKS50b0VxdWFsKHsgc3RhdHVzQ29kZTogMzA4LCBsb2NhdGlvbiB9KTtcbiAgfSk7XG5cbiAgaXQoXCJrZWVwcyB0aGUgcXVlcnkgb24gdGhlIHJlZGlyZWN0LCBpbmNsdWRpbmcgcmVwZWF0ZWQga2V5c1wiLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gQ2xvdWRGcm9udCdzIHNoYXBlIGZvciBhIHJlcGVhdGVkIGtleTogYG11bHRpVmFsdWVgIGhvbGRzIGV2ZXJ5IHZhbHVlLFxuICAgIC8vIHRoZSBmaXJzdCBpbmNsdWRlZCwgYW5kIGB2YWx1ZWAgcmVwZWF0cyB0aGF0IGZpcnN0IG9uZS5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZW5kKFwiL3gvL3lcIiwge1xuICAgICAganNvbjogeyB2YWx1ZTogXCJ0cnVlXCIgfSxcbiAgICAgIGE6IHsgdmFsdWU6IFwiMVwiLCBtdWx0aVZhbHVlOiBbeyB2YWx1ZTogXCIxXCIgfSwgeyB2YWx1ZTogXCIyXCIgfV0gfSxcbiAgICAgIGZsYWc6IHsgdmFsdWU6IFwiXCIgfSxcbiAgICB9KTtcbiAgICBleHBlY3QocmVkaXJlY3QocmVzdWx0KS5sb2NhdGlvbikudG9CZShcIi94L3k/anNvbj10cnVlJmE9MSZhPTImZmxhZ1wiKTtcbiAgfSk7XG5cbiAgaXQoXCJwYXNzZXMgcGVyY2VudC1lbmNvZGVkIHF1ZXJ5IHZhbHVlcyB0aHJvdWdoIHdpdGhvdXQgcmUtZW5jb2RpbmdcIiwgYXN5bmMgKCkgPT4ge1xuICAgIC8vIENsb3VkRnJvbnQgaGFuZHMgdGhlIGZ1bmN0aW9uIHRoZSB2YWx1ZXMgc3RpbGwgZW5jb2RlZCwgYXMgc2VudC5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZW5kKFwiL3gvL3lcIiwge1xuICAgICAgYTogeyB2YWx1ZTogXCIlMjBiJTI2Y1wiIH0sXG4gICAgICBwOiB7IHZhbHVlOiBcIjErMlwiIH0sXG4gICAgfSk7XG4gICAgZXhwZWN0KHJlZGlyZWN0KHJlc3VsdCkubG9jYXRpb24pLnRvQmUoXCIveC95P2E9JTIwYiUyNmMmcD0xKzJcIik7XG4gIH0pO1xuXG4gIGl0KFwicGFzc2VzIGFuIG9yZGluYXJ5IHBhdGggdGhyb3VnaCB3aXRoIHgtZm9yd2FyZGVkLWhvc3Qgc2V0XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgc2VuZChcIi9hL2JcIikpIGFzIEZ1bmN0aW9uUmVxdWVzdDtcbiAgICBleHBlY3QocmVzdWx0LnVyaSkudG9CZShcIi9hL2JcIik7XG4gICAgLy8gQ2xvdWRGcm9udCByZXdyaXRlcyBgaG9zdGAgdG8gdGhlIG9yaWdpbiBkb21haW4sIHNvIHRoZSBhcHAgd291bGQgb3RoZXJ3aXNlXG4gICAgLy8gYnVpbGQgZXZlcnkgYWJzb2x1dGUgVVJMIGFnYWluc3QgdGhlIEZ1bmN0aW9uIFVSTCdzIGhvc3RuYW1lLlxuICAgIGV4cGVjdChyZXN1bHQuaGVhZGVyc1tcIngtZm9yd2FyZGVkLWhvc3RcIl0udmFsdWUpLnRvQmUoXCJhLnRlc3RcIik7XG4gIH0pO1xuXG4gIGl0KFwib3ZlcndyaXRlcyBhIGNsaWVudC1zdXBwbGllZCB4LWZvcndhcmRlZC1ob3N0XCIsIGFzeW5jICgpID0+IHtcbiAgICAvLyBUaGUgcnVudGltZSB0cnVzdHMgdGhpcyBoZWFkZXIgYmVoaW5kIHRoZSBGdW5jdGlvbiBVUkwsIHNvIGEgdmlld2VyJ3NcbiAgICAvLyBvd24gdmFsdWUgbXVzdCBub3Qgc3Vydml2ZSB0byBidWlsZCByZWRpcmVjdHMgb3Igb3JpZ2luIGNoZWNrcy5cbiAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgaGFuZGxlcih7XG4gICAgICByZXF1ZXN0OiB7XG4gICAgICAgIHVyaTogXCIvYVwiLFxuICAgICAgICBxdWVyeXN0cmluZzoge30sXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBob3N0OiB7IHZhbHVlOiBcImEudGVzdFwiIH0sXG4gICAgICAgICAgXCJ4LWZvcndhcmRlZC1ob3N0XCI6IHsgdmFsdWU6IFwiZXZpbC50ZXN0XCIgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSkpIGFzIEZ1bmN0aW9uUmVxdWVzdDtcbiAgICBleHBlY3QocmVzdWx0LmhlYWRlcnNbXCJ4LWZvcndhcmRlZC1ob3N0XCJdLnZhbHVlKS50b0JlKFwiYS50ZXN0XCIpO1xuICB9KTtcbn0pO1xuXG4vKipcbiAqIGB2aWV3ZXJSZXF1ZXN0RnVuY3Rpb25Db2RlYCwgcnVuIGFzIENsb3VkRnJvbnQgd291bGQgcnVuIGl0IG9uIGVhY2ggYmVoYXZpb3IsXG4gKiBmb3IgdGhlIHNhbWUgcmVhc29uIGFzIHRoZSBzdWl0ZSBhYm92ZS5cbiAqL1xuZGVzY3JpYmUoXCJ2aWV3ZXJSZXF1ZXN0RnVuY3Rpb25Db2RlXCIsICgpID0+IHtcbiAgY29uc3QgQkFTSUNfQVVUSCA9IGBcbiAgICBmdW5jdGlvbiB2aWV3ZXJSZXF1ZXN0KGV2ZW50KSB7XG4gICAgICB2YXIgYXV0aCA9IGV2ZW50LnJlcXVlc3QuaGVhZGVycy5hdXRob3JpemF0aW9uO1xuICAgICAgaWYgKGF1dGggJiYgYXV0aC52YWx1ZSA9PT0gXCJCYXNpYyBkWE5sY2pwd1lYTnpcIikgcmV0dXJuO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdHVzQ29kZTogNDAxLFxuICAgICAgICBzdGF0dXNEZXNjcmlwdGlvbjogXCJVbmF1dGhvcml6ZWRcIixcbiAgICAgICAgaGVhZGVyczogeyBcInd3dy1hdXRoZW50aWNhdGVcIjogeyB2YWx1ZTogJ0Jhc2ljIHJlYWxtPVwicHJldmlld1wiJyB9IH0sXG4gICAgICB9O1xuICAgIH1cbiAgYDtcbiAgY29uc3QgQVVUSE9SSVpFRCA9IHsgYXV0aG9yaXphdGlvbjogXCJCYXNpYyBkWE5sY2pwd1lYTnpcIiB9O1xuXG4gIGludGVyZmFjZSBGdW5jdGlvblJlcXVlc3Qge1xuICAgIHVyaTogc3RyaW5nO1xuICAgIHF1ZXJ5c3RyaW5nOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiBzdHJpbmcgfT47XG4gICAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogc3RyaW5nIH0+O1xuICB9XG4gIHR5cGUgRnVuY3Rpb25SZXN1bHQgPVxuICAgIHwgRnVuY3Rpb25SZXF1ZXN0XG4gICAgfCB7IHN0YXR1c0NvZGU6IG51bWJlcjsgaGVhZGVyczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogc3RyaW5nIH0+IH07XG4gIHR5cGUgSGFuZGxlciA9IChldmVudDoge1xuICAgIHJlcXVlc3Q6IEZ1bmN0aW9uUmVxdWVzdDtcbiAgfSkgPT4gUHJvbWlzZTxGdW5jdGlvblJlc3VsdD47XG4gIC8qKiBXaGF0IGB2aWV3ZXJSZXF1ZXN0S2V5VmFsdWVTdG9yZWAgaG9sZHMsIGFzIGBjZi5rdnMoKWAgd291bGQgcmVhZCBpdC4gKi9cbiAgY29uc3QgZmFrZUNsb3VkRnJvbnRNb2R1bGUgPSAodmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSA9PiAoe1xuICAgIGt2czogKCkgPT4gKHtcbiAgICAgIGdldDogYXN5bmMgKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmICghKGtleSBpbiB2YWx1ZXMpKSB0aHJvdyBuZXcgRXJyb3IoYGtleSBub3QgZm91bmQ6ICR7a2V5fWApO1xuICAgICAgICByZXR1cm4gdmFsdWVzW2tleV07XG4gICAgICB9LFxuICAgIH0pLFxuICB9KTtcbiAgaW50ZXJmYWNlIEJlaGF2aW9yIHtcbiAgICBQYXRoUGF0dGVybjogc3RyaW5nO1xuICAgIEZ1bmN0aW9uQXNzb2NpYXRpb25zPzogQXJyYXk8e1xuICAgICAgRXZlbnRUeXBlOiBzdHJpbmc7XG4gICAgICBGdW5jdGlvbkFSTjogeyBcIkZuOjpHZXRBdHRcIjogW3N0cmluZywgc3RyaW5nXSB9O1xuICAgIH0+O1xuICB9XG5cbiAgY29uc3Qgc3ludGggPSAoXG4gICAgcHJvcHM6IHtcbiAgICAgIGNvZGU/OiBzdHJpbmc7XG4gICAgICBuZXh0anNUeXBlPzogTmV4dGpzVHlwZTtcbiAgICAgIGFzc2V0UHJlZml4Pzogc3RyaW5nO1xuICAgICAgYmFzZVBhdGg/OiBzdHJpbmc7XG4gICAgICBrZXlWYWx1ZVN0b3JlPzogYm9vbGVhbjtcbiAgICAgIG92ZXJyaWRlcz86IChzdGFjazogU3RhY2spID0+IE5leHRqc0Rpc3RyaWJ1dGlvbk92ZXJyaWRlcztcbiAgICB9ID0ge30sXG4gICkgPT4ge1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKG5ldyBBcHAoKSwgXCJUZXN0U3RhY2tcIik7XG4gICAgY29uc3Qga2V5VmFsdWVTdG9yZSA9IHByb3BzLmtleVZhbHVlU3RvcmVcbiAgICAgID8gbmV3IEtleVZhbHVlU3RvcmUoc3RhY2ssIFwiS3ZzXCIpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjb21wdXRlID1cbiAgICAgIHByb3BzLm5leHRqc1R5cGUgPT09IE5leHRqc1R5cGUuR0xPQkFMX0NPTlRBSU5FUlNcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBsb2FkQmFsYW5jZXI6IG5ldyBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcihzdGFjaywgXCJBbGJcIiwge1xuICAgICAgICAgICAgICB2cGM6IG5ldyBWcGMoc3RhY2ssIFwiVnBjXCIpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIGZ1bmN0aW9uVXJsOiBuZXcgRnVuY3Rpb25Vcmwoc3RhY2ssIFwiVXJsXCIsIHtcbiAgICAgICAgICAgICAgZnVuY3Rpb246IG5ldyBMYW1iZGFGdW5jdGlvbihzdGFjaywgXCJGblwiLCB7XG4gICAgICAgICAgICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKFwiZXhwb3J0cy5oYW5kbGVyID0gKCkgPT4ge307XCIpLFxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBhdXRoVHlwZTogRnVuY3Rpb25VcmxBdXRoVHlwZS5BV1NfSUFNLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfTtcbiAgICBuZXcgTmV4dGpzRGlzdHJpYnV0aW9uKHN0YWNrLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICAuLi5jb21wdXRlLFxuICAgICAgYXNzZXRzQnVja2V0OiBuZXcgQnVja2V0KHN0YWNrLCBcIkFzc2V0c1wiKSxcbiAgICAgIGFzc2V0UHJlZml4OiBwcm9wcy5hc3NldFByZWZpeCxcbiAgICAgIGJhc2VQYXRoOiBwcm9wcy5iYXNlUGF0aCxcbiAgICAgIG5leHRqc1R5cGU6IHByb3BzLm5leHRqc1R5cGUgPz8gTmV4dGpzVHlwZS5HTE9CQUxfRlVOQ1RJT05TLFxuICAgICAgb3ZlcnJpZGVzOiBwcm9wcy5vdmVycmlkZXM/LihzdGFjayksXG4gICAgICBwdWJsaWNEaXJFbnRyaWVzOiBbeyBuYW1lOiBcImZhdmljb24uaWNvXCIsIGlzRGlyZWN0b3J5OiBmYWxzZSB9XSxcbiAgICAgIHZpZXdlclJlcXVlc3RGdW5jdGlvbkNvZGU6XG4gICAgICAgIHByb3BzLmNvZGUgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiBGdW5jdGlvbkNvZGUuZnJvbUlubGluZShwcm9wcy5jb2RlKSxcbiAgICAgIHZpZXdlclJlcXVlc3RLZXlWYWx1ZVN0b3JlOiBrZXlWYWx1ZVN0b3JlLFxuICAgIH0pO1xuICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgICBjb25zdCBmdW5jdGlvbnMgPSB0ZW1wbGF0ZS5maW5kUmVzb3VyY2VzKFwiQVdTOjpDbG91ZEZyb250OjpGdW5jdGlvblwiKTtcbiAgICBjb25zdCBjb25maWcgPSBPYmplY3QudmFsdWVzKFxuICAgICAgdGVtcGxhdGUuZmluZFJlc291cmNlcyhcIkFXUzo6Q2xvdWRGcm9udDo6RGlzdHJpYnV0aW9uXCIpLFxuICAgIClbMF0uUHJvcGVydGllcy5EaXN0cmlidXRpb25Db25maWc7XG4gICAgY29uc3QgYmVoYXZpb3JzOiBCZWhhdmlvcltdID0gW1xuICAgICAgeyBQYXRoUGF0dGVybjogXCIqXCIsIC4uLmNvbmZpZy5EZWZhdWx0Q2FjaGVCZWhhdmlvciB9LFxuICAgICAgLi4uY29uZmlnLkNhY2hlQmVoYXZpb3JzLFxuICAgIF07XG4gICAgLyoqIFRoZSB2aWV3ZXItcmVxdWVzdCBmdW5jdGlvbiBvbiB0aGUgYmVoYXZpb3IgZm9yIGBwYXRoUGF0dGVybmAuICovXG4gICAgY29uc3QgZnVuY3Rpb25Gb3IgPSAocGF0aFBhdHRlcm46IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgYmVoYXZpb3IgPSBiZWhhdmlvcnMuZmluZCgoaXQpID0+IGl0LlBhdGhQYXR0ZXJuID09PSBwYXRoUGF0dGVybikhO1xuICAgICAgY29uc3QgYXNzb2NpYXRpb24gPSBiZWhhdmlvci5GdW5jdGlvbkFzc29jaWF0aW9ucyEuZmluZChcbiAgICAgICAgKGl0KSA9PiBpdC5FdmVudFR5cGUgPT09IFwidmlld2VyLXJlcXVlc3RcIixcbiAgICAgICkhO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uc1thc3NvY2lhdGlvbi5GdW5jdGlvbkFSTltcIkZuOjpHZXRBdHRcIl1bMF1dLlByb3BlcnRpZXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBUaGF0IGZ1bmN0aW9uJ3MgaGFuZGxlciwgcnVubmFibGUuIGBub2RlOnZtYCBzY3JpcHRzIGNhbid0IGBpbXBvcnRgLCBzb1xuICAgICAqIHRoZSBgY2xvdWRmcm9udGAgbW9kdWxlIGlzIGhhbmRlZCBpbiBhcyB0aGUgYmluZGluZyB0aGUgaW1wb3J0IG1ha2VzLlxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZXJGb3IgPSAoXG4gICAgICBwYXRoUGF0dGVybjogc3RyaW5nLFxuICAgICAga3ZzVmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge30sXG4gICAgKTogSGFuZGxlciA9PiB7XG4gICAgICBjb25zdCBjb2RlID0gKGZ1bmN0aW9uRm9yKHBhdGhQYXR0ZXJuKS5GdW5jdGlvbkNvZGUgYXMgc3RyaW5nKS5yZXBsYWNlKFxuICAgICAgICAvXlxccyppbXBvcnQgY2YgZnJvbSBcImNsb3VkZnJvbnRcIjsvLFxuICAgICAgICBcIlwiLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBydW5Jbk5ld0NvbnRleHQoYCR7Y29kZX1cXG5oYW5kbGVyYCwge1xuICAgICAgICBjZjogZmFrZUNsb3VkRnJvbnRNb2R1bGUoa3ZzVmFsdWVzKSxcbiAgICAgIH0pIGFzIEhhbmRsZXI7XG4gICAgfTtcbiAgICByZXR1cm4geyBiZWhhdmlvcnMsIGZ1bmN0aW9ucywgZnVuY3Rpb25Gb3IsIGhhbmRsZXJGb3IsIHN0YWNrIH07XG4gIH07XG5cbiAgY29uc3QgcmVxdWVzdCA9ICh1cmk6IHN0cmluZywgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9KSA9PiAoe1xuICAgIHJlcXVlc3Q6IHtcbiAgICAgIHVyaSxcbiAgICAgIHF1ZXJ5c3RyaW5nOiB7fSxcbiAgICAgIGhlYWRlcnM6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoeyBob3N0OiBcImEudGVzdFwiLCAuLi5oZWFkZXJzIH0pLm1hcCgoW25hbWUsIHZhbHVlXSkgPT4gW1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgeyB2YWx1ZSB9LFxuICAgICAgICBdKSxcbiAgICAgICksXG4gICAgfSxcbiAgfSk7XG4gIGNvbnN0IHN0YXR1cyA9IChyZXN1bHQ6IEZ1bmN0aW9uUmVzdWx0KSA9PlxuICAgIChyZXN1bHQgYXMgeyBzdGF0dXNDb2RlPzogbnVtYmVyIH0pLnN0YXR1c0NvZGU7XG5cbiAgaXQuZWFjaChbTmV4dGpzVHlwZS5HTE9CQUxfRlVOQ1RJT05TLCBOZXh0anNUeXBlLkdMT0JBTF9DT05UQUlORVJTXSkoXG4gICAgXCJnYXRlcyBldmVyeSBiZWhhdmlvciBvbiAlcywgc3RhdGljIGFzc2V0cyBpbmNsdWRlZFwiLFxuICAgIGFzeW5jIChuZXh0anNUeXBlKSA9PiB7XG4gICAgICBjb25zdCB7IGJlaGF2aW9ycywgaGFuZGxlckZvciB9ID0gc3ludGgoeyBjb2RlOiBCQVNJQ19BVVRILCBuZXh0anNUeXBlIH0pO1xuICAgICAgZXhwZWN0KGJlaGF2aW9ycy5tYXAoKGl0KSA9PiBpdC5QYXRoUGF0dGVybikuc29ydCgpKS50b0VxdWFsKFtcbiAgICAgICAgXCIqXCIsXG4gICAgICAgIFwiX25leHQvaW1hZ2UqXCIsXG4gICAgICAgIFwiX25leHQvc3RhdGljKlwiLFxuICAgICAgICBcImZhdmljb24uaWNvXCIsXG4gICAgICBdKTtcbiAgICAgIGZvciAoY29uc3QgeyBQYXRoUGF0dGVybiB9IG9mIGJlaGF2aW9ycykge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlckZvcihQYXRoUGF0dGVybik7XG4gICAgICAgIGV4cGVjdChzdGF0dXMoYXdhaXQgaGFuZGxlcihyZXF1ZXN0KFwiL3hcIikpKSkudG9CZSg0MDEpO1xuICAgICAgICBjb25zdCBwYXNzZWQgPSAoYXdhaXQgaGFuZGxlcihcbiAgICAgICAgICByZXF1ZXN0KFwiL3hcIiwgQVVUSE9SSVpFRCksXG4gICAgICAgICkpIGFzIEZ1bmN0aW9uUmVxdWVzdDtcbiAgICAgICAgZXhwZWN0KHBhc3NlZC51cmkpLnRvQmUoXCIveFwiKTtcbiAgICAgIH1cbiAgICB9LFxuICApO1xuXG4gIGl0KFwic2hhcmVzIG9uZSBwYXNzLXRocm91Z2ggZnVuY3Rpb24gYmV0d2VlbiBkeW5hbWljIGFuZCBzdGF0aWMgb24gR2xvYmFsIENvbnRhaW5lcnNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHsgYmVoYXZpb3JzLCBmdW5jdGlvbnMgfSA9IHN5bnRoKHtcbiAgICAgIGNvZGU6IEJBU0lDX0FVVEgsXG4gICAgICBuZXh0anNUeXBlOiBOZXh0anNUeXBlLkdMT0JBTF9DT05UQUlORVJTLFxuICAgIH0pO1xuICAgIGNvbnN0IFtsb2dpY2FsSWQsIC4uLnJlc3RdID0gT2JqZWN0LmtleXMoZnVuY3Rpb25zKTtcbiAgICBleHBlY3QocmVzdCkudG9IYXZlTGVuZ3RoKDApO1xuICAgIGV4cGVjdChiZWhhdmlvcnMubWFwKChpdCkgPT4gaXQuUGF0aFBhdHRlcm4pLnNvcnQoKSkudG9FcXVhbChbXG4gICAgICBcIipcIixcbiAgICAgIFwiX25leHQvaW1hZ2UqXCIsXG4gICAgICBcIl9uZXh0L3N0YXRpYypcIixcbiAgICAgIFwiZmF2aWNvbi5pY29cIixcbiAgICBdKTtcbiAgICBmb3IgKGNvbnN0IHsgRnVuY3Rpb25Bc3NvY2lhdGlvbnMgfSBvZiBiZWhhdmlvcnMpIHtcbiAgICAgIGV4cGVjdChGdW5jdGlvbkFzc29jaWF0aW9ucykudG9FcXVhbChbXG4gICAgICAgIHtcbiAgICAgICAgICBFdmVudFR5cGU6IFwidmlld2VyLXJlcXVlc3RcIixcbiAgICAgICAgICBGdW5jdGlvbkFSTjogeyBcIkZuOjpHZXRBdHRcIjogW2xvZ2ljYWxJZCwgXCJGdW5jdGlvbkFSTlwiXSB9LFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfVxuICB9KTtcblxuICBpdChcImFjY2VwdHMgdmlld2VyUmVxdWVzdCBkZWNsYXJlZCBhZnRlciBhbm90aGVyIHZhcmlhYmxlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBoYW5kbGVyID0gc3ludGgoe1xuICAgICAgY29kZTogYHZhciB4ID0gMSwgdmlld2VyUmVxdWVzdCA9IChldmVudCkgPT4gKHsgc3RhdHVzQ29kZTogNDAxIH0pO2AsXG4gICAgfSkuaGFuZGxlckZvcihcIl9uZXh0L3N0YXRpYypcIik7XG4gICAgZXhwZWN0KHN0YXR1cyhhd2FpdCBoYW5kbGVyKHJlcXVlc3QoXCIveFwiKSkpKS50b0JlKDQwMSk7XG4gIH0pO1xuXG4gIGl0KFwiYWNjZXB0cyB2aWV3ZXJSZXF1ZXN0IGRlZmluZWQgYXMgYSBjb25zdCBhcnJvdyBmdW5jdGlvblwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlciA9IHN5bnRoKHtcbiAgICAgIGNvZGU6IGBjb25zdCB2aWV3ZXJSZXF1ZXN0ID0gYXN5bmMgKGV2ZW50KSA9PiAoeyBzdGF0dXNDb2RlOiA0MDEgfSk7YCxcbiAgICB9KS5oYW5kbGVyRm9yKFwiX25leHQvc3RhdGljKlwiKTtcbiAgICBleHBlY3Qoc3RhdHVzKGF3YWl0IGhhbmRsZXIocmVxdWVzdChcIi94XCIpKSkpLnRvQmUoNDAxKTtcbiAgfSk7XG5cbiAgaXQoXCJydW5zIGJlZm9yZSB0aGUgcmVwZWF0ZWQtc2xhc2ggcmVkaXJlY3RcIiwgYXN5bmMgKCkgPT4ge1xuICAgIC8vIE90aGVyd2lzZSBgL2EvL2JgIHdvdWxkIGFuc3dlciAzMDggdG8gYSB2aWV3ZXIgd2hvIG5ldmVyIGF1dGhlbnRpY2F0ZWQuXG4gICAgY29uc3QgaGFuZGxlciA9IHN5bnRoKHsgY29kZTogQkFTSUNfQVVUSCB9KS5oYW5kbGVyRm9yKFwiKlwiKTtcbiAgICBleHBlY3Qoc3RhdHVzKGF3YWl0IGhhbmRsZXIocmVxdWVzdChcIi9hLy9iXCIpKSkpLnRvQmUoNDAxKTtcbiAgICBleHBlY3Qoc3RhdHVzKGF3YWl0IGhhbmRsZXIocmVxdWVzdChcIi9hLy9iXCIsIEFVVEhPUklaRUQpKSkpLnRvQmUoMzA4KTtcbiAgfSk7XG5cbiAgaXQoXCJhc3NvY2lhdGVzIHRoZSBzdG9yZSB3aXRoIGV2ZXJ5IGZ1bmN0aW9uIGl0IHJ1bnMgaW5cIiwgKCkgPT4ge1xuICAgIGNvbnN0IHsgYmVoYXZpb3JzLCBmdW5jdGlvbkZvciwgZnVuY3Rpb25zIH0gPSBzeW50aCh7XG4gICAgICBjb2RlOiBCQVNJQ19BVVRILFxuICAgICAga2V5VmFsdWVTdG9yZTogdHJ1ZSxcbiAgICAgIGFzc2V0UHJlZml4OiBcIi9jZG5cIixcbiAgICB9KTtcbiAgICBleHBlY3QoT2JqZWN0LmtleXMoZnVuY3Rpb25zKSkudG9IYXZlTGVuZ3RoKDMpO1xuICAgIGZvciAoY29uc3QgeyBQYXRoUGF0dGVybiB9IG9mIGJlaGF2aW9ycykge1xuICAgICAgY29uc3QgeyBGdW5jdGlvbkNvbmZpZyB9ID0gZnVuY3Rpb25Gb3IoUGF0aFBhdHRlcm4pO1xuICAgICAgZXhwZWN0KEZ1bmN0aW9uQ29uZmlnLlJ1bnRpbWUpLnRvQmUoXCJjbG91ZGZyb250LWpzLTIuMFwiKTtcbiAgICAgIGV4cGVjdChGdW5jdGlvbkNvbmZpZy5LZXlWYWx1ZVN0b3JlQXNzb2NpYXRpb25zKS50b0VxdWFsKFtcbiAgICAgICAgeyBLZXlWYWx1ZVN0b3JlQVJOOiB7IFwiRm46OkdldEF0dFwiOiBbZXhwZWN0LmFueShTdHJpbmcpLCBcIkFyblwiXSB9IH0sXG4gICAgICBdKTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KFwicmVhZHMgY3JlZGVudGlhbHMgZnJvbSB0aGUgS2V5VmFsdWVTdG9yZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlciA9IHN5bnRoKHtcbiAgICAgIGtleVZhbHVlU3RvcmU6IHRydWUsXG4gICAgICBjb2RlOiBgaW1wb3J0IGNmIGZyb20gXCJjbG91ZGZyb250XCI7XG4gICAgICAgIGNvbnN0IGt2cyA9IGNmLmt2cygpO1xuICAgICAgICBhc3luYyBmdW5jdGlvbiB2aWV3ZXJSZXF1ZXN0KGV2ZW50KSB7XG4gICAgICAgICAgY29uc3QgYXV0aCA9IGV2ZW50LnJlcXVlc3QuaGVhZGVycy5hdXRob3JpemF0aW9uO1xuICAgICAgICAgIGlmIChhdXRoICYmIGF1dGgudmFsdWUgPT09IFwiQmFzaWMgXCIgKyAoYXdhaXQga3ZzLmdldChcImJhc2ljLWF1dGhcIikpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7IHN0YXR1c0NvZGU6IDQwMSwgc3RhdHVzRGVzY3JpcHRpb246IFwiVW5hdXRob3JpemVkXCIgfTtcbiAgICAgICAgfVxuICAgICAgYCxcbiAgICB9KS5oYW5kbGVyRm9yKFwiX25leHQvc3RhdGljKlwiLCB7IFwiYmFzaWMtYXV0aFwiOiBcImRYTmxjanB3WVhOelwiIH0pO1xuICAgIGV4cGVjdChzdGF0dXMoYXdhaXQgaGFuZGxlcihyZXF1ZXN0KFwiL3hcIikpKSkudG9CZSg0MDEpO1xuICAgIGV4cGVjdChcbiAgICAgICgoYXdhaXQgaGFuZGxlcihyZXF1ZXN0KFwiL3hcIiwgQVVUSE9SSVpFRCkpKSBhcyBGdW5jdGlvblJlcXVlc3QpLnVyaSxcbiAgICApLnRvQmUoXCIveFwiKTtcbiAgfSk7XG5cbiAgaXQoXCJyZWZ1c2VzIGEgS2V5VmFsdWVTdG9yZSB3aXRob3V0IGNvZGUgdG8gcmVhZCBpdFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KCgpID0+IHN5bnRoKHsga2V5VmFsdWVTdG9yZTogdHJ1ZSB9KSkudG9UaHJvdyhcbiAgICAgIC9gdmlld2VyUmVxdWVzdEtleVZhbHVlU3RvcmVgIC4qIG5lZWRzIGB2aWV3ZXJSZXF1ZXN0RnVuY3Rpb25Db2RlYC8sXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJjYW4ndCBrZWVwIGEgdmlld2VyJ3MgeC1mb3J3YXJkZWQtaG9zdCBwYXN0IGNkay1uZXh0anMncyBvdmVyd3JpdGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZXIgPSBzeW50aCh7XG4gICAgICBjb2RlOiBgXG4gICAgICAgIGZ1bmN0aW9uIHZpZXdlclJlcXVlc3QoZXZlbnQpIHtcbiAgICAgICAgICBldmVudC5yZXF1ZXN0LmhlYWRlcnNbXCJ4LWZvcndhcmRlZC1ob3N0XCJdID0geyB2YWx1ZTogXCJldmlsLnRlc3RcIiB9O1xuICAgICAgICAgIHJldHVybiBldmVudC5yZXF1ZXN0O1xuICAgICAgICB9XG4gICAgICBgLFxuICAgIH0pLmhhbmRsZXJGb3IoXCIqXCIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IChhd2FpdCBoYW5kbGVyKHJlcXVlc3QoXCIveFwiKSkpIGFzIEZ1bmN0aW9uUmVxdWVzdDtcbiAgICBleHBlY3QocmVzdWx0LmhlYWRlcnNbXCJ4LWZvcndhcmRlZC1ob3N0XCJdLnZhbHVlKS50b0JlKFwiYS50ZXN0XCIpO1xuICB9KTtcblxuICBpdChcImNhcnJpZXMgb24gd2l0aCBhIHJlcXVlc3QgaXQgcmV0dXJucyBhcyBhIG5ldyBvYmplY3RcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZXIgPSBzeW50aCh7XG4gICAgICBjb2RlOiBgXG4gICAgICAgIGZ1bmN0aW9uIHZpZXdlclJlcXVlc3QoZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4geyB1cmk6IFwiL3lcIiwgcXVlcnlzdHJpbmc6IHt9LCBoZWFkZXJzOiBldmVudC5yZXF1ZXN0LmhlYWRlcnMgfTtcbiAgICAgICAgfVxuICAgICAgYCxcbiAgICB9KS5oYW5kbGVyRm9yKFwiX25leHQvc3RhdGljKlwiKTtcbiAgICBleHBlY3QoKChhd2FpdCBoYW5kbGVyKHJlcXVlc3QoXCIveFwiKSkpIGFzIEZ1bmN0aW9uUmVxdWVzdCkudXJpKS50b0JlKFwiL3lcIik7XG4gIH0pO1xuXG4gIGl0KFwicnVucyBpbnNpZGUgdGhlIGFzc2V0UHJlZml4IHJld3JpdGUsIGluIHBsYWNlIG9mIHRoZSBzdGF0aWMgZnVuY3Rpb25cIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgYmVoYXZpb3JzLCBoYW5kbGVyRm9yIH0gPSBzeW50aCh7XG4gICAgICBjb2RlOiBCQVNJQ19BVVRILFxuICAgICAgYXNzZXRQcmVmaXg6IFwiL2NkblwiLFxuICAgIH0pO1xuICAgIGNvbnN0IHByZWZpeGVkID0gYmVoYXZpb3JzLmZpbmQoXG4gICAgICAoaXQpID0+IGl0LlBhdGhQYXR0ZXJuID09PSBcIi9jZG4vX25leHQvc3RhdGljKlwiLFxuICAgICkhO1xuICAgIC8vIE9uZSB2aWV3ZXItcmVxdWVzdCBmdW5jdGlvbiBwZXIgYmVoYXZpb3IsIG9yIENsb3VkRnJvbnQgcmVqZWN0cyBpdC5cbiAgICBleHBlY3QoXG4gICAgICBwcmVmaXhlZC5GdW5jdGlvbkFzc29jaWF0aW9ucyEuZmlsdGVyKFxuICAgICAgICAoaXQpID0+IGl0LkV2ZW50VHlwZSA9PT0gXCJ2aWV3ZXItcmVxdWVzdFwiLFxuICAgICAgKSxcbiAgICApLnRvSGF2ZUxlbmd0aCgxKTtcbiAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlckZvcihcIi9jZG4vX25leHQvc3RhdGljKlwiKTtcbiAgICBleHBlY3Qoc3RhdHVzKGF3YWl0IGhhbmRsZXIocmVxdWVzdChcIi9jZG4vX25leHQvc3RhdGljL2EuanNcIikpKSkudG9CZSg0MDEpO1xuICAgIGNvbnN0IHBhc3NlZCA9IChhd2FpdCBoYW5kbGVyKFxuICAgICAgcmVxdWVzdChcIi9jZG4vX25leHQvc3RhdGljL2EuanNcIiwgQVVUSE9SSVpFRCksXG4gICAgKSkgYXMgRnVuY3Rpb25SZXF1ZXN0O1xuICAgIGV4cGVjdChwYXNzZWQudXJpKS50b0JlKFwiL19uZXh0L3N0YXRpYy9hLmpzXCIpO1xuICB9KTtcblxuICBpdChcImFkZHMgbm8gZnVuY3Rpb25zIHdoZW4gdW5zZXRcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHsgYmVoYXZpb3JzLCBmdW5jdGlvbnMgfSA9IHN5bnRoKCk7XG4gICAgY29uc3Qgc3RhdGljQmVoYXZpb3IgPSBiZWhhdmlvcnMuZmluZChcbiAgICAgIChpdCkgPT4gaXQuUGF0aFBhdHRlcm4gPT09IFwiX25leHQvc3RhdGljKlwiLFxuICAgICkhO1xuICAgIGV4cGVjdChzdGF0aWNCZWhhdmlvci5GdW5jdGlvbkFzc29jaWF0aW9ucykudG9CZVVuZGVmaW5lZCgpO1xuICAgIGNvbnN0IFtmbiwgLi4ucmVzdF0gPSBPYmplY3QudmFsdWVzKGZ1bmN0aW9ucykubWFwKChpdCkgPT4gaXQuUHJvcGVydGllcyk7XG4gICAgZXhwZWN0KHJlc3QpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgICAvLyBUaGUgbWFya2VyIGlzIGRyb3BwZWQsIG5vdCBsZWZ0IGluIHRoZSBkZXBsb3llZCBmdW5jdGlvbi5cbiAgICBleHBlY3QoZm4uRnVuY3Rpb25Db2RlKS50b01hdGNoKFxuICAgICAgL15cXHMqYXN5bmMgZnVuY3Rpb24gaGFuZGxlclxcKGV2ZW50XFwpIFxce1xcblxccypjb25zdCByZXF1ZXN0LyxcbiAgICApO1xuICAgIGV4cGVjdChmbi5GdW5jdGlvbkNvbmZpZy5LZXlWYWx1ZVN0b3JlQXNzb2NpYXRpb25zKS50b0JlVW5kZWZpbmVkKCk7XG4gIH0pO1xuXG4gIGl0LmVhY2goW2ZhbHNlLCB0cnVlXSkoXG4gICAgXCJydW5zIGV2ZXJ5IGNkay1uZXh0anMgZnVuY3Rpb24gb24gY2xvdWRmcm9udC1qcy0yLjAgKGhvb2sgc2V0OiAlcylcIixcbiAgICAoaG9va2VkKSA9PiB7XG4gICAgICBjb25zdCB7IGZ1bmN0aW9ucyB9ID0gc3ludGgoe1xuICAgICAgICBjb2RlOiBob29rZWQgPyBCQVNJQ19BVVRIIDogdW5kZWZpbmVkLFxuICAgICAgICBhc3NldFByZWZpeDogXCIvY2RuXCIsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJ1bnRpbWVzID0gT2JqZWN0LnZhbHVlcyhmdW5jdGlvbnMpLm1hcChcbiAgICAgICAgKGl0KSA9PiBpdC5Qcm9wZXJ0aWVzLkZ1bmN0aW9uQ29uZmlnLlJ1bnRpbWUsXG4gICAgICApO1xuICAgICAgZXhwZWN0KHJ1bnRpbWVzKS50b0hhdmVMZW5ndGgoaG9va2VkID8gMyA6IDIpO1xuICAgICAgZXhwZWN0KG5ldyBTZXQocnVudGltZXMpKS50b0VxdWFsKG5ldyBTZXQoW1wiY2xvdWRmcm9udC1qcy0yLjBcIl0pKTtcbiAgICB9LFxuICApO1xuXG4gIGl0LmVhY2goW1wiZHluYW1pY0JlaGF2aW9yT3B0aW9uc1wiLCBcImltYWdlQmVoYXZpb3JPcHRpb25zXCJdIGFzIGNvbnN0KShcbiAgICBcInJlZnVzZXMgYSAlcyBvdmVycmlkZSB0aGF0IGNsYWltcyB2aWV3ZXItcmVxdWVzdCBvbiBHbG9iYWwgQ29udGFpbmVyc1wiLFxuICAgIChvdmVycmlkZU5hbWUpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PlxuICAgICAgICBzeW50aCh7XG4gICAgICAgICAgY29kZTogQkFTSUNfQVVUSCxcbiAgICAgICAgICBuZXh0anNUeXBlOiBOZXh0anNUeXBlLkdMT0JBTF9DT05UQUlORVJTLFxuICAgICAgICAgIG92ZXJyaWRlczogKHN0YWNrKSA9PiAoe1xuICAgICAgICAgICAgW292ZXJyaWRlTmFtZV06IHtcbiAgICAgICAgICAgICAgZnVuY3Rpb25Bc3NvY2lhdGlvbnM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBldmVudFR5cGU6IEZ1bmN0aW9uRXZlbnRUeXBlLlZJRVdFUl9SRVFVRVNULFxuICAgICAgICAgICAgICAgICAgZnVuY3Rpb246IG5ldyBDbG91ZEZyb250RnVuY3Rpb24oc3RhY2ssIFwiVXNlckZuXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogRnVuY3Rpb25Db2RlLmZyb21JbmxpbmUoXG4gICAgICAgICAgICAgICAgICAgICAgXCJmdW5jdGlvbiBoYW5kbGVyKGV2ZW50KSB7IHJldHVybiBldmVudC5yZXF1ZXN0OyB9XCIsXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSksXG4gICAgICApLnRvVGhyb3coXG4gICAgICAgIG5ldyBSZWdFeHAoXG4gICAgICAgICAgYG92ZXJyaWRlc1xcXFwuJHtvdmVycmlkZU5hbWV9XFxcXC5mdW5jdGlvbkFzc29jaWF0aW9ucy4qdmlld2VyUmVxdWVzdEZ1bmN0aW9uQ29kZWAsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH0sXG4gICk7XG5cbiAgaXQoXCJyZWZ1c2VzIGEgZGlzdHJpYnV0aW9uUHJvcHMuZGVmYXVsdEJlaGF2aW9yIG92ZXJyaWRlXCIsICgpID0+IHtcbiAgICBleHBlY3QoKCkgPT5cbiAgICAgIHN5bnRoKHtcbiAgICAgICAgY29kZTogQkFTSUNfQVVUSCxcbiAgICAgICAgb3ZlcnJpZGVzOiAoKSA9PiAoe1xuICAgICAgICAgIGRpc3RyaWJ1dGlvblByb3BzOiB7XG4gICAgICAgICAgICBkZWZhdWx0QmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgb3JpZ2luOiBuZXcgSHR0cE9yaWdpbihcImV4YW1wbGUuY29tXCIpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgICkudG9UaHJvdygvb3ZlcnJpZGVzXFwuZGlzdHJpYnV0aW9uUHJvcHNcXC5kZWZhdWx0QmVoYXZpb3IvKTtcbiAgfSk7XG5cbiAgaXQoXCJsZXRzIGEgYmFzZVBhdGggYXBwIHJlcGxhY2UgdGhlIGRlZmF1bHQgYmVoYXZpb3JcIiwgKCkgPT4ge1xuICAgIGV4cGVjdCgoKSA9PlxuICAgICAgc3ludGgoe1xuICAgICAgICBjb2RlOiBCQVNJQ19BVVRILFxuICAgICAgICBiYXNlUGF0aDogXCIvYXBwXCIsXG4gICAgICAgIG92ZXJyaWRlczogKCkgPT4gKHtcbiAgICAgICAgICBkaXN0cmlidXRpb25Qcm9wczoge1xuICAgICAgICAgICAgZGVmYXVsdEJlaGF2aW9yOiB7IG9yaWdpbjogbmV3IEh0dHBPcmlnaW4oXCJleGFtcGxlLmNvbVwiKSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgfSksXG4gICAgKS5ub3QudG9UaHJvdygpO1xuICB9KTtcblxuICBpdChcImtlZXBzIGNkay1uZXh0anMncyBjb2RlIG91dCBvZiB0aGUgZGVwbG95ZWQgaW5kZW50YXRpb25cIiwgKCkgPT4ge1xuICAgIGNvbnN0IHsgZnVuY3Rpb25Gb3IgfSA9IHN5bnRoKHsgY29kZTogQkFTSUNfQVVUSCB9KTtcbiAgICBjb25zdCBjb2RlID0gZnVuY3Rpb25Gb3IoXCIqXCIpLkZ1bmN0aW9uQ29kZSBhcyBzdHJpbmc7XG4gICAgY29uc3Qgb3duID0gY29kZS5zbGljZShjb2RlLmluZGV4T2YoXCJhc3luYyBmdW5jdGlvbiBoYW5kbGVyXCIpKTtcbiAgICBleHBlY3Qob3duKS5ub3QudG9NYXRjaCgvXlsgXFx0XS9tKTtcbiAgfSk7XG5cbiAgaXQoXCJ3YXJucywgcmF0aGVyIHRoYW4gbWVhc3VyZXMsIHdoZW4gdGhlIGNvZGUgY29udGFpbnMgYSB0b2tlblwiLCAoKSA9PiB7XG4gICAgY29uc3QgeyBzdGFjayB9ID0gc3ludGgoe1xuICAgICAgY29kZTogYGZ1bmN0aW9uIHZpZXdlclJlcXVlc3QoZXZlbnQpIHsgcmV0dXJuICR7TGF6eS5zdHJpbmcoeyBwcm9kdWNlOiAoKSA9PiAnXCJ4XCInIH0pfTsgfWAsXG4gICAgfSk7XG4gICAgQW5ub3RhdGlvbnMuZnJvbVN0YWNrKHN0YWNrKS5oYXNXYXJuaW5nKFxuICAgICAgXCIqXCIsXG4gICAgICBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKFwiY29udGFpbnMgYSBDREsgdG9rZW5cIiksXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJyZWZ1c2VzIGEgc3RhdGljIG92ZXJyaWRlIHRoYXQgYWxyZWFkeSBjbGFpbXMgdmlld2VyLXJlcXVlc3RcIiwgKCkgPT4ge1xuICAgIGV4cGVjdCgoKSA9PlxuICAgICAgc3ludGgoe1xuICAgICAgICBjb2RlOiBCQVNJQ19BVVRILFxuICAgICAgICBvdmVycmlkZXM6IChzdGFjaykgPT4gKHtcbiAgICAgICAgICBzdGF0aWNCZWhhdmlvck9wdGlvbnM6IHtcbiAgICAgICAgICAgIGZ1bmN0aW9uQXNzb2NpYXRpb25zOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6IEZ1bmN0aW9uRXZlbnRUeXBlLlZJRVdFUl9SRVFVRVNULFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uOiBuZXcgQ2xvdWRGcm9udEZ1bmN0aW9uKHN0YWNrLCBcIlVzZXJGblwiLCB7XG4gICAgICAgICAgICAgICAgICBjb2RlOiBGdW5jdGlvbkNvZGUuZnJvbUlubGluZShcbiAgICAgICAgICAgICAgICAgICAgXCJmdW5jdGlvbiBoYW5kbGVyKGV2ZW50KSB7IHJldHVybiBldmVudC5yZXF1ZXN0OyB9XCIsXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgICkudG9UaHJvdygvb3ZlcnJpZGVzXFwuc3RhdGljQmVoYXZpb3JPcHRpb25zXFwuZnVuY3Rpb25Bc3NvY2lhdGlvbnMvKTtcbiAgfSk7XG5cbiAgaXQuZWFjaChbXG4gICAgW1wibm8gdmlld2VyUmVxdWVzdFwiLCBcInZhciB4ID0gMTtcIiwgL211c3QgZGVmaW5lIGB2aWV3ZXJSZXF1ZXN0XFwoZXZlbnRcXClgL10sXG4gICAgLi4uW1xuICAgICAgXCJmdW5jdGlvbiBoYW5kbGVyKGV2ZW50KSB7fVwiLFxuICAgICAgXCJmdW5jdGlvbiogaGFuZGxlcihldmVudCkge31cIixcbiAgICAgIFwiY29uc3QgaGFuZGxlciA9IChldmVudCkgPT4gZXZlbnQucmVxdWVzdDtcIixcbiAgICAgIFwibGV0IGEgPSAxLCBoYW5kbGVyID0gMjtcIixcbiAgICAgIFwidmFyIGhhbmRsZXIgPSAoZXZlbnQpID0+IGV2ZW50LnJlcXVlc3Q7XCIsXG4gICAgICBcInZhciB7IGhhbmRsZXIgfSA9IHsgaGFuZGxlcjogKGV2ZW50KSA9PiBldmVudC5yZXF1ZXN0IH07XCIsXG4gICAgICAnZ2xvYmFsVGhpc1tcImhhbmRsZXJcIl0gPSAoZXZlbnQpID0+IGV2ZW50LnJlcXVlc3Q7JyxcbiAgICAgIFwidmFyIGNka05leHRqc0hhbmRsZXI7IGhhbmRsZXIgPSBjZGtOZXh0anNIYW5kbGVyO1wiLFxuICAgIF0ubWFwKChkZWNsYXJhdGlvbik6IFtzdHJpbmcsIHN0cmluZywgUmVnRXhwXSA9PiBbXG4gICAgICBgaGFuZGxlciBpbiBcXGAke2RlY2xhcmF0aW9ufVxcYGAsXG4gICAgICBgJHtkZWNsYXJhdGlvbn1cXG5mdW5jdGlvbiB2aWV3ZXJSZXF1ZXN0KGV2ZW50KSB7fWAsXG4gICAgICAvdXNlcyB0aGUgbmFtZSBgaGFuZGxlcmAvLFxuICAgIF0pLFxuICAgIFtcbiAgICAgIFwidmlld2VyUmVxdWVzdCBvbmx5IGNvbXBhcmVkLCBuZXZlciBkZWNsYXJlZFwiLFxuICAgICAgJ2NvbnN0IG9rID0gdHlwZW9mIHZpZXdlclJlcXVlc3QgPT09IFwiZnVuY3Rpb25cIjsnLFxuICAgICAgL211c3QgZGVmaW5lIGB2aWV3ZXJSZXF1ZXN0XFwoZXZlbnRcXClgLyxcbiAgICBdLFxuICAgIFtcbiAgICAgIFwidmlld2VyUmVxdWVzdCBvbmx5IGFzc2lnbmVkIGFzIGEgcHJvcGVydHlcIixcbiAgICAgIFwiY29uc3QgY2ZnID0ge307IGNmZy52aWV3ZXJSZXF1ZXN0ID0gZnVuY3Rpb24gKGV2ZW50KSB7fTtcIixcbiAgICAgIC9tdXN0IGRlZmluZSBgdmlld2VyUmVxdWVzdFxcKGV2ZW50XFwpYC8sXG4gICAgXSxcbiAgICBbXG4gICAgICBcIm1vcmUgdGhhbiBmaXRzIGluIGEgQ2xvdWRGcm9udCBGdW5jdGlvblwiLFxuICAgICAgYGZ1bmN0aW9uIHZpZXdlclJlcXVlc3QoZXZlbnQpIHt9IC8qICR7XCJ4XCIucmVwZWF0KDEwICogMTAyNCl9ICovYCxcbiAgICAgIC9vdmVyIENsb3VkRnJvbnQncyBsaW1pdCBvZiAxMDI0MC8sXG4gICAgXSxcbiAgXSkoXCJyZWZ1c2VzIGNvZGUgd2l0aCAlc1wiLCAoX25hbWUsIGNvZGUsIGVycm9yKSA9PiB7XG4gICAgZXhwZWN0KCgpID0+IHN5bnRoKHsgY29kZSB9KSkudG9UaHJvdyhlcnJvcik7XG4gIH0pO1xufSk7XG4iXX0=