cdk-nextjs 0.6.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +2467 -2714
- package/.jsii.tabl.json +1 -1
- package/API.md +1725 -1909
- package/CLAUDE.md +2 -1
- package/README.md +429 -130
- package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +152 -170
- package/assets/lambdas/redeploy-stage/redeploy-stage.lambda/index.js +875 -0
- package/docs/adapter-runtime.md +185 -0
- package/docs/breaking-changes.md +687 -4
- package/docs/caching-guide.md +156 -112
- package/docs/cdk-nextjs-cfn-exec-policy.json +2 -1
- package/docs/development-guide.md +1 -1
- package/docs/harness-coverage.md +598 -0
- package/docs/init-cache-deployment.md +32 -1
- package/docs/next-build-output-guide.md +30 -20
- package/examples/README.md +5 -1
- package/lib/adapter/__fixtures__/app-playground-base-path.json +4926 -0
- package/lib/adapter/__fixtures__/app-playground.json +4917 -0
- package/lib/adapter/__fixtures__/pages-i18n.json +1728 -0
- package/lib/adapter/adapter.mjs +1548 -185
- package/lib/adapter/adapter.test.js +106 -0
- package/lib/adapter/aws-cache-store.d.ts +489 -0
- package/lib/adapter/aws-cache-store.js +1004 -0
- package/lib/adapter/aws-cache-store.test.d.ts +1 -0
- package/lib/adapter/aws-cache-store.test.js +361 -0
- package/lib/adapter/build-outputs.d.ts +80 -0
- package/lib/adapter/build-outputs.js +852 -0
- package/lib/adapter/build-outputs.test.d.ts +1 -0
- package/lib/adapter/build-outputs.test.js +861 -0
- package/lib/adapter/cache-handler.d.ts +9 -2
- package/lib/adapter/cache-handler.js +72 -96
- package/lib/adapter/cache-handler.mjs +18956 -17774
- package/lib/adapter/cache-handler.test.js +263 -31
- package/lib/adapter/cache-kinds.d.ts +32 -0
- package/lib/adapter/cache-kinds.js +35 -0
- package/lib/adapter/cache-kinds.test.d.ts +1 -0
- package/lib/adapter/cache-kinds.test.js +69 -0
- package/lib/adapter/cache-utils.d.ts +90 -0
- package/lib/adapter/cache-utils.js +199 -4
- package/lib/adapter/cache-utils.test.d.ts +1 -0
- package/lib/adapter/cache-utils.test.js +179 -0
- package/lib/adapter/function-groups.d.ts +215 -0
- package/lib/adapter/function-groups.js +1099 -0
- package/lib/adapter/function-groups.test.d.ts +1 -0
- package/lib/adapter/function-groups.test.js +743 -0
- package/lib/adapter/init-cache.d.ts +6 -0
- package/lib/adapter/init-cache.js +245 -0
- package/lib/adapter/init-cache.test.d.ts +1 -0
- package/lib/adapter/init-cache.test.js +137 -0
- package/lib/adapter/local-file-cache-handler.d.ts +23 -0
- package/lib/adapter/local-file-cache-handler.js +52 -1
- package/lib/adapter/memory-cache-handler.d.ts +26 -17
- package/lib/adapter/memory-cache-handler.js +32 -50
- package/lib/adapter/memory-cache-handler.test.js +105 -85
- package/lib/adapter/s3-cache-handler.d.ts +179 -40
- package/lib/adapter/s3-cache-handler.js +807 -277
- package/lib/adapter/s3-cache-handler.test.js +1186 -31
- package/lib/adapter/use-cache-common.d.ts +90 -0
- package/lib/adapter/use-cache-common.js +250 -0
- package/lib/adapter/use-cache-common.test.d.ts +1 -0
- package/lib/adapter/use-cache-common.test.js +646 -0
- package/lib/adapter/use-cache-default-handler.d.ts +24 -0
- package/lib/adapter/use-cache-default-handler.js +90 -0
- package/lib/adapter/use-cache-default-handler.mjs +38645 -0
- package/lib/adapter/use-cache-handlers.test.d.ts +1 -0
- package/lib/adapter/use-cache-handlers.test.js +349 -0
- package/lib/adapter/use-cache-remote-handler.d.ts +26 -0
- package/lib/adapter/use-cache-remote-handler.js +186 -0
- package/lib/{image-optimization/handler.mjs → adapter/use-cache-remote-handler.mjs} +33572 -38798
- package/lib/generated-structs/OptionalNextjsApiProps.d.ts +59 -0
- package/lib/generated-structs/OptionalNextjsApiProps.js +3 -0
- package/lib/generated-structs/OptionalNextjsCacheProps.d.ts +15 -6
- package/lib/generated-structs/OptionalNextjsCacheProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsContainersProps.d.ts +25 -11
- package/lib/generated-structs/OptionalNextjsContainersProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsDistributionProps.d.ts +31 -9
- package/lib/generated-structs/OptionalNextjsDistributionProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsPostDeployProps.d.ts +13 -0
- package/lib/generated-structs/OptionalNextjsPostDeployProps.js +1 -1
- package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.d.ts +11 -2
- package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.js +1 -1
- package/lib/index.d.ts +6 -7
- package/lib/index.js +2 -4
- package/lib/lambdas/post-deploy/post-deploy.lambda.js +3 -2
- package/lib/lambdas/post-deploy/prune-cache-bucket.d.ts +7 -3
- package/lib/lambdas/post-deploy/prune-cache-bucket.js +57 -71
- package/lib/lambdas/post-deploy/prune-cache-bucket.test.d.ts +1 -0
- package/lib/lambdas/post-deploy/prune-cache-bucket.test.js +114 -0
- package/lib/lambdas/post-deploy/prune-revalidation-table.d.ts +1 -0
- package/lib/lambdas/post-deploy/prune-revalidation-table.js +23 -31
- package/lib/lambdas/post-deploy/prune-revalidation-table.test.d.ts +1 -0
- package/lib/lambdas/post-deploy/prune-revalidation-table.test.js +71 -0
- package/lib/lambdas/post-deploy/prune-s3.d.ts +19 -3
- package/lib/lambdas/post-deploy/prune-s3.js +54 -15
- package/lib/lambdas/post-deploy/prune-s3.test.d.ts +1 -0
- package/lib/lambdas/post-deploy/prune-s3.test.js +255 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage-function.d.ts +13 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage-function.js +55 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.d.ts +24 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.js +68 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.lambda.d.ts +20 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.lambda.js +24 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.test.d.ts +1 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.test.js +93 -0
- package/lib/nextjs-api.d.ts +107 -18
- package/lib/nextjs-api.js +349 -39
- package/lib/nextjs-api.test.js +582 -1
- package/lib/nextjs-build/global-containers.Dockerfile +15 -10
- package/lib/nextjs-build/nextjs-build.d.ts +339 -63
- package/lib/nextjs-build/nextjs-build.js +684 -327
- package/lib/nextjs-build/nextjs-build.test.d.ts +1 -0
- package/lib/nextjs-build/nextjs-build.test.js +412 -0
- package/lib/nextjs-build/patch-fetch.js +1 -1
- package/lib/nextjs-build/patch-fetch.test.js +166 -11
- package/lib/nextjs-build/regional-containers.Dockerfile +17 -10
- package/lib/nextjs-cache.d.ts +82 -4
- package/lib/nextjs-cache.js +186 -10
- package/lib/nextjs-cache.test.js +176 -1
- package/lib/nextjs-compute/nextjs-compute-base-props.d.ts +21 -8
- package/lib/nextjs-compute/nextjs-compute-base-props.js +41 -1
- package/lib/nextjs-compute/nextjs-compute-base-props.test.d.ts +1 -0
- package/lib/nextjs-compute/nextjs-compute-base-props.test.js +44 -0
- package/lib/nextjs-compute/nextjs-containers.d.ts +19 -0
- package/lib/nextjs-compute/nextjs-containers.js +57 -20
- package/lib/nextjs-compute/nextjs-functions.d.ts +122 -7
- package/lib/nextjs-compute/nextjs-functions.js +113 -67
- package/lib/nextjs-compute/nextjs-functions.test.d.ts +1 -0
- package/lib/nextjs-compute/nextjs-functions.test.js +99 -0
- package/lib/nextjs-distribution.d.ts +194 -23
- package/lib/nextjs-distribution.js +535 -62
- package/lib/nextjs-distribution.test.d.ts +1 -0
- package/lib/nextjs-distribution.test.js +697 -0
- package/lib/nextjs-post-deploy.d.ts +23 -3
- package/lib/nextjs-post-deploy.js +14 -10
- package/lib/nextjs-post-deploy.test.d.ts +1 -0
- package/lib/nextjs-post-deploy.test.js +34 -0
- package/lib/nextjs-static-assets.d.ts +23 -4
- package/lib/nextjs-static-assets.js +29 -6
- package/lib/nextjs-static-assets.test.js +20 -1
- package/lib/root-constructs/nextjs-base-construct.d.ts +105 -45
- package/lib/root-constructs/nextjs-base-construct.js +144 -34
- package/lib/root-constructs/nextjs-global-containers.d.ts +18 -20
- package/lib/root-constructs/nextjs-global-containers.js +20 -70
- package/lib/root-constructs/nextjs-global-functions.d.ts +26 -28
- package/lib/root-constructs/nextjs-global-functions.js +52 -69
- package/lib/root-constructs/nextjs-regional-containers.d.ts +25 -5
- package/lib/root-constructs/nextjs-regional-containers.js +17 -15
- package/lib/root-constructs/nextjs-regional-functions.d.ts +22 -18
- package/lib/root-constructs/nextjs-regional-functions.js +8 -25
- package/lib/runtime/api-gateway-path.d.ts +34 -0
- package/lib/runtime/api-gateway-path.js +71 -0
- package/lib/runtime/api-gateway-path.test.d.ts +1 -0
- package/lib/runtime/api-gateway-path.test.js +65 -0
- package/lib/runtime/case-redirect.d.ts +22 -0
- package/lib/runtime/case-redirect.js +63 -0
- package/lib/runtime/case-redirect.test.d.ts +1 -0
- package/lib/runtime/case-redirect.test.js +32 -0
- package/lib/runtime/core.d.ts +234 -0
- package/lib/runtime/core.js +1213 -0
- package/lib/runtime/core.test.d.ts +1 -0
- package/lib/runtime/core.test.js +1678 -0
- package/lib/runtime/deployment-root.d.ts +13 -0
- package/lib/runtime/deployment-root.js +29 -0
- package/lib/runtime/dispatch.d.ts +331 -0
- package/lib/runtime/dispatch.js +751 -0
- package/lib/runtime/dispatch.test.d.ts +1 -0
- package/lib/runtime/dispatch.test.js +853 -0
- package/lib/runtime/entrypoints.d.ts +57 -0
- package/lib/runtime/entrypoints.js +115 -0
- package/lib/runtime/http/abort-signal.d.ts +6 -0
- package/lib/runtime/http/abort-signal.js +19 -0
- package/lib/runtime/http/abort-signal.test.d.ts +1 -0
- package/lib/runtime/http/abort-signal.test.js +49 -0
- package/lib/runtime/http/node-server.d.ts +38 -0
- package/lib/runtime/http/node-server.js +99 -0
- package/lib/runtime/http/node-server.test.d.ts +1 -0
- package/lib/runtime/http/node-server.test.js +96 -0
- package/lib/runtime/http/node-sink.d.ts +16 -0
- package/lib/runtime/http/node-sink.js +48 -0
- package/lib/runtime/http/node-sink.test.d.ts +1 -0
- package/lib/runtime/http/node-sink.test.js +66 -0
- package/lib/runtime/http/request.d.ts +62 -0
- package/lib/runtime/http/request.js +134 -0
- package/lib/runtime/http/request.test.d.ts +1 -0
- package/lib/runtime/http/request.test.js +103 -0
- package/lib/runtime/http/response.d.ts +77 -0
- package/lib/runtime/http/response.js +229 -0
- package/lib/runtime/http/response.test.d.ts +1 -0
- package/lib/runtime/http/response.test.js +178 -0
- package/lib/runtime/http/sink.d.ts +73 -0
- package/lib/runtime/http/sink.js +188 -0
- package/lib/runtime/http/sink.test.d.ts +1 -0
- package/lib/runtime/http/sink.test.js +257 -0
- package/lib/runtime/image-utils.d.ts +78 -0
- package/lib/runtime/image-utils.js +129 -0
- package/lib/runtime/image-utils.test.d.ts +1 -0
- package/lib/runtime/image-utils.test.js +237 -0
- package/lib/runtime/image.d.ts +76 -0
- package/lib/runtime/image.js +296 -0
- package/lib/runtime/image.test.d.ts +1 -0
- package/lib/runtime/image.test.js +405 -0
- package/lib/runtime/lambda-event.d.ts +4 -0
- package/lib/runtime/lambda-event.js +113 -0
- package/lib/runtime/lambda-event.test.d.ts +1 -0
- package/lib/runtime/lambda-event.test.js +119 -0
- package/lib/runtime/lambda.mjs +41595 -0
- package/lib/runtime/load-module.d.ts +8 -0
- package/lib/runtime/load-module.js +35 -0
- package/lib/runtime/manifest.d.ts +215 -0
- package/lib/runtime/manifest.js +118 -0
- package/lib/runtime/middleware.d.ts +43 -0
- package/lib/runtime/middleware.js +113 -0
- package/lib/runtime/middleware.test.d.ts +1 -0
- package/lib/runtime/middleware.test.js +259 -0
- package/lib/runtime/next-modules.d.ts +55 -0
- package/lib/runtime/next-modules.js +124 -0
- package/lib/runtime/next-modules.test.d.ts +1 -0
- package/lib/runtime/next-modules.test.js +34 -0
- package/lib/runtime/public-files.d.ts +32 -0
- package/lib/runtime/public-files.js +117 -0
- package/lib/runtime/public-files.test.d.ts +1 -0
- package/lib/runtime/public-files.test.js +97 -0
- package/lib/runtime/server.mjs +41588 -0
- package/lib/runtime/static-files.d.ts +50 -0
- package/lib/runtime/static-files.js +266 -0
- package/lib/runtime/static-files.test.d.ts +1 -0
- package/lib/runtime/static-files.test.js +118 -0
- package/lib/runtime/util.d.ts +28 -0
- package/lib/runtime/util.js +79 -0
- package/lib/utils/base-path.d.ts +123 -11
- package/lib/utils/base-path.js +276 -39
- package/lib/utils/base-path.test.js +275 -50
- package/lib/utils/get-architecture.d.ts +7 -8
- package/lib/utils/get-architecture.js +12 -13
- package/lib/utils/zip-directory.d.ts +14 -0
- package/lib/utils/zip-directory.js +121 -0
- package/lib/utils/zip-directory.test.d.ts +1 -0
- package/lib/utils/zip-directory.test.js +99 -0
- package/package.json +22 -3
- package/scripts/capture-adapter-fixture.mjs +325 -0
- package/scripts/e2e-deploy.sh +398 -0
- package/scripts/e2e-harness/README.md +707 -0
- package/scripts/e2e-harness/app.js +370 -0
- package/scripts/e2e-harness/common.sh +249 -0
- package/scripts/e2e-harness/screen.mjs +302 -0
- package/scripts/e2e-harness/stage-proxy.mjs +145 -0
- package/scripts/e2e-harness/type-filters.mjs +47 -0
- package/scripts/e2e-logs.sh +75 -0
- package/scripts/e2e-offline.sh +91 -0
- package/scripts/e2e-sweep.sh +370 -0
- package/scripts/e2e-warm.sh +114 -0
- package/scripts/zero-config-build.mjs +418 -0
- package/docs/1k-concurrent-users-executions.png +0 -0
- package/docs/plans/adapter-runtime-release.md +0 -362
- package/docs/plans/phase-0-image-function-opt-in.md +0 -295
- package/lib/generated-structs/OptionalDockerImageFunctionProps.d.ts +0 -425
- package/lib/generated-structs/OptionalDockerImageFunctionProps.js +0 -3
- package/lib/image-optimization/handler-utils.d.ts +0 -34
- package/lib/image-optimization/handler-utils.js +0 -83
- package/lib/image-optimization/handler-utils.test.js +0 -178
- package/lib/nextjs-build/functions.Dockerfile +0 -31
- package/lib/nextjs-compute/nextjs-image-function.d.ts +0 -53
- package/lib/nextjs-compute/nextjs-image-function.js +0 -59
- package/lib/utils/experimental-flags.d.ts +0 -24
- package/lib/utils/experimental-flags.js +0 -30
- /package/lib/{image-optimization/handler-utils.test.d.ts → adapter/adapter.test.d.ts} +0 -0
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const node_fs_1 = require("node:fs");
|
|
4
|
-
const node_os_1 = require("node:os");
|
|
5
|
-
const node_path_1 = require("node:path");
|
|
6
3
|
const constants_1 = require("../constants");
|
|
7
4
|
const base_path_1 = require("./base-path");
|
|
8
5
|
const GLOBAL = [constants_1.NextjsType.GLOBAL_FUNCTIONS, constants_1.NextjsType.GLOBAL_CONTAINERS];
|
|
@@ -22,6 +19,21 @@ describe("normalizeBasePath", () => {
|
|
|
22
19
|
expect((0, base_path_1.normalizeBasePath)("/team/app/")).toBe("team/app");
|
|
23
20
|
});
|
|
24
21
|
});
|
|
22
|
+
describe("wholeAppInvalidationPaths", () => {
|
|
23
|
+
it("is the whole distribution without a basePath", () => {
|
|
24
|
+
expect((0, base_path_1.wholeAppInvalidationPaths)()).toEqual(["/*"]);
|
|
25
|
+
expect((0, base_path_1.wholeAppInvalidationPaths)("")).toEqual(["/*"]);
|
|
26
|
+
});
|
|
27
|
+
it("covers the app's root and RSC payload, but no sibling prefix", () => {
|
|
28
|
+
for (const basePath of ["/base", "base", "/base/"]) {
|
|
29
|
+
expect((0, base_path_1.wholeAppInvalidationPaths)(basePath)).toEqual([
|
|
30
|
+
"/base",
|
|
31
|
+
"/base?*",
|
|
32
|
+
"/base/*",
|
|
33
|
+
]);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
});
|
|
25
37
|
describe("joinPath", () => {
|
|
26
38
|
const origin = "https://d111111abcdef8.cloudfront.net";
|
|
27
39
|
it("drops empty parts", () => {
|
|
@@ -41,48 +53,152 @@ describe("joinPath", () => {
|
|
|
41
53
|
expect((0, base_path_1.joinPath)()).toBe("");
|
|
42
54
|
expect((0, base_path_1.joinPath)(undefined, "", "/")).toBe("");
|
|
43
55
|
});
|
|
56
|
+
// How `NextjsRegionalContainers.url` appends the app's basePath: the ALB
|
|
57
|
+
// forwards every path to the container unchanged, so the app only answers
|
|
58
|
+
// under its own basePath and the bare ALB URL would 404.
|
|
59
|
+
it("appends an app basePath to a bare ALB origin", () => {
|
|
60
|
+
const alb = "http://my-alb-123.us-east-1.elb.amazonaws.com";
|
|
61
|
+
expect((0, base_path_1.joinPath)(alb, "base")).toBe(`${alb}/base`);
|
|
62
|
+
expect((0, base_path_1.joinPath)(alb, "team/app")).toBe(`${alb}/team/app`);
|
|
63
|
+
// An app with no basePath is served at the origin itself.
|
|
64
|
+
expect((0, base_path_1.joinPath)(alb, "")).toBe(alb);
|
|
65
|
+
});
|
|
44
66
|
});
|
|
45
|
-
describe("
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
(
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
expect((0, base_path_1.
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
//
|
|
71
|
-
//
|
|
72
|
-
//
|
|
73
|
-
//
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
expect(
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
67
|
+
describe("prefixWithBasePath", () => {
|
|
68
|
+
// The health check path is handed to things that talk to the app directly (an
|
|
69
|
+
// ALB target group, the container's own health probe), and the app only
|
|
70
|
+
// answers under its basePath. Unprefixed, every check 404s: the target never
|
|
71
|
+
// turns healthy, so tasks are killed on the health check interval and the
|
|
72
|
+
// deployment rolls back.
|
|
73
|
+
it("prefixes a health check path with the app's basePath", () => {
|
|
74
|
+
expect((0, base_path_1.prefixWithBasePath)("base", "/api/health")).toBe("/base/api/health");
|
|
75
|
+
expect((0, base_path_1.prefixWithBasePath)("/base/", "/api/health")).toBe("/base/api/health");
|
|
76
|
+
});
|
|
77
|
+
it("leaves the path untouched when the app sets no basePath", () => {
|
|
78
|
+
expect((0, base_path_1.prefixWithBasePath)(undefined, "/api/health")).toBe("/api/health");
|
|
79
|
+
expect((0, base_path_1.prefixWithBasePath)("", "/api/health")).toBe("/api/health");
|
|
80
|
+
expect((0, base_path_1.prefixWithBasePath)("/", "/api/health")).toBe("/api/health");
|
|
81
|
+
});
|
|
82
|
+
it("always returns a leading slash, whatever the path came with", () => {
|
|
83
|
+
// The ALB health check and the readiness check URL both need an absolute
|
|
84
|
+
// path, so the result can't come back bare. Without a basePath a bare path
|
|
85
|
+
// used to pass straight through, which concatenated into
|
|
86
|
+
// "http://127.0.0.1:3000api/health" as the readiness check URL.
|
|
87
|
+
expect((0, base_path_1.prefixWithBasePath)("base", "api/health")).toBe("/base/api/health");
|
|
88
|
+
expect((0, base_path_1.prefixWithBasePath)(undefined, "api/health")).toBe("/api/health");
|
|
89
|
+
expect((0, base_path_1.prefixWithBasePath)("", "api/health")).toBe("/api/health");
|
|
90
|
+
});
|
|
91
|
+
// The path is what the app routes, without basePath, and it is prefixed
|
|
92
|
+
// whether or not it already looks prefixed: an app can route "/base/base/..."
|
|
93
|
+
// legitimately, so treating a leading "/base" as already-prefixed would make
|
|
94
|
+
// that path unreachable and give the prop two meanings. Users who prefixed
|
|
95
|
+
// `healthCheckPath` by hand to work around the missing prefix drop it on
|
|
96
|
+
// upgrade — documented in docs/breaking-changes.md under 0.6.0.
|
|
97
|
+
it("prefixes a path that already looks prefixed", () => {
|
|
98
|
+
expect((0, base_path_1.prefixWithBasePath)("base", "/base/api/health")).toBe("/base/base/api/health");
|
|
99
|
+
});
|
|
100
|
+
// A `trailingSlash: true` app redirects "/api/health" to "/api/health/" with a
|
|
101
|
+
// 308, which an ALB health check doesn't count as healthy, so the slash the
|
|
102
|
+
// user wrote has to survive.
|
|
103
|
+
it("preserves a trailing slash", () => {
|
|
104
|
+
expect((0, base_path_1.prefixWithBasePath)("base", "/api/health/")).toBe("/base/api/health/");
|
|
105
|
+
expect((0, base_path_1.prefixWithBasePath)(undefined, "/api/health/")).toBe("/api/health/");
|
|
106
|
+
});
|
|
107
|
+
it("handles a nested basePath, as REGIONAL_FUNCTIONS can produce", () => {
|
|
108
|
+
// An app at the `prod` stage nested under "/base" sets `basePath:
|
|
109
|
+
// "/prod/base"`, and the readiness check hits the local server, so the
|
|
110
|
+
// whole prefix has to be there.
|
|
111
|
+
expect((0, base_path_1.prefixWithBasePath)("/prod/base", "/api/health")).toBe("/prod/base/api/health");
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
describe("basePathPrefix", () => {
|
|
115
|
+
it("spells every basePath the way Next.js does", () => {
|
|
116
|
+
for (const value of ["/base", "base", "/base/", "//base//"]) {
|
|
117
|
+
expect((0, base_path_1.basePathPrefix)(value)).toBe("/base");
|
|
118
|
+
}
|
|
119
|
+
expect((0, base_path_1.basePathPrefix)("/a/b/")).toBe("/a/b");
|
|
120
|
+
expect((0, base_path_1.basePathPrefix)("/")).toBe("");
|
|
121
|
+
expect((0, base_path_1.basePathPrefix)(undefined)).toBe("");
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
describe("relativeAssetPrefix", () => {
|
|
125
|
+
it("reads a path-style assetPrefix with one leading slash", () => {
|
|
126
|
+
expect((0, base_path_1.relativeAssetPrefix)("/custom-asset-prefix")).toBe("/custom-asset-prefix");
|
|
127
|
+
expect((0, base_path_1.relativeAssetPrefix)("custom-asset-prefix/")).toBe("/custom-asset-prefix");
|
|
128
|
+
expect((0, base_path_1.relativeAssetPrefix)("")).toBe("");
|
|
129
|
+
expect((0, base_path_1.relativeAssetPrefix)("/")).toBe("");
|
|
130
|
+
});
|
|
131
|
+
it("ignores an absolute assetPrefix", () => {
|
|
132
|
+
// It names an origin cdk-nextjs does not serve, so there is no behavior to
|
|
133
|
+
// add and nothing the distribution could get wrong.
|
|
134
|
+
for (const assetPrefix of [
|
|
135
|
+
"https://cdn.example.com",
|
|
136
|
+
"http://cdn.example.com/x",
|
|
137
|
+
"//cdn.example.com",
|
|
138
|
+
]) {
|
|
139
|
+
expect((0, base_path_1.relativeAssetPrefix)(assetPrefix)).toBe("");
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
describe("assetPrefixPath", () => {
|
|
144
|
+
it("reports the path an absolute assetPrefix carries too", () => {
|
|
145
|
+
// `relativeAssetPrefix` answers "is this a prefix the regional NextjsTypes
|
|
146
|
+
// cannot serve"; this answers "what path do bundle URLs carry", and an
|
|
147
|
+
// absolute prefix with a path carries one — `next build` compiles a
|
|
148
|
+
// rewrite for it, so `next start` serves bundles there. See
|
|
149
|
+
// `test/e2e/app-dir/asset-prefix-absolute`.
|
|
150
|
+
for (const [assetPrefix, path] of [
|
|
151
|
+
["https://example.vercel.sh/custom-asset-prefix", "/custom-asset-prefix"],
|
|
152
|
+
["//example.vercel.sh/cdn/", "/cdn"],
|
|
153
|
+
["https://example.vercel.sh/", ""],
|
|
154
|
+
["https://example.vercel.sh", ""],
|
|
155
|
+
["/cdn", "/cdn"],
|
|
156
|
+
["", ""],
|
|
157
|
+
]) {
|
|
158
|
+
expect((0, base_path_1.assetPrefixPath)(assetPrefix)).toBe(path);
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
describe("isAssetPrefixUnserved", () => {
|
|
163
|
+
const REGIONAL = [
|
|
164
|
+
constants_1.NextjsType.REGIONAL_FUNCTIONS,
|
|
165
|
+
constants_1.NextjsType.REGIONAL_CONTAINERS,
|
|
166
|
+
];
|
|
167
|
+
it.each(REGIONAL)("%s: does not flag the assetPrefix Next.js derives from basePath", (nextjsType) => {
|
|
168
|
+
// The regression this function was extracted for. An app that sets only
|
|
169
|
+
// `basePath: "/prod"` — `examples/regional-functions`, and every regional
|
|
170
|
+
// deployment with a basePath — gets
|
|
171
|
+
// `{"assetPrefix":"/prod","basePath":"/prod"}` in
|
|
172
|
+
// `required-server-files.json`, because Next.js resolves one from the other.
|
|
173
|
+
// Flagging that told users their bundles would 404 at the one path that does
|
|
174
|
+
// serve them, on every synth.
|
|
175
|
+
expect((0, base_path_1.isAssetPrefixUnserved)(nextjsType, "/prod", "prod")).toBe(false);
|
|
176
|
+
// Both sides arrive in different shapes — the assetPrefix reader adds a
|
|
177
|
+
// leading slash, the basePath reader strips one — so the comparison has to
|
|
178
|
+
// normalize rather than compare strings.
|
|
179
|
+
expect((0, base_path_1.isAssetPrefixUnserved)(nextjsType, "/prod", "/prod/")).toBe(false);
|
|
180
|
+
expect((0, base_path_1.isAssetPrefixUnserved)(nextjsType, "/a/b", "a/b")).toBe(false);
|
|
181
|
+
});
|
|
182
|
+
it.each(REGIONAL)("%s: flags a prefix nothing serves", (nextjsType) => {
|
|
183
|
+
// A genuinely different prefix is the case the warning exists for: bundles are
|
|
184
|
+
// requested at `/cdn/_next/static/...` and neither API Gateway's
|
|
185
|
+
// `_next/static` resource nor the container's own files answer there.
|
|
186
|
+
expect((0, base_path_1.isAssetPrefixUnserved)(nextjsType, "/cdn", "prod")).toBe(true);
|
|
187
|
+
expect((0, base_path_1.isAssetPrefixUnserved)(nextjsType, "/cdn", undefined)).toBe(true);
|
|
188
|
+
// A prefix *under* the basePath is still a different path, not a match.
|
|
189
|
+
expect((0, base_path_1.isAssetPrefixUnserved)(nextjsType, "/prod/cdn", "prod")).toBe(true);
|
|
190
|
+
});
|
|
191
|
+
it.each(GLOBAL)("%s: flags nothing, having a behavior for it", (nextjsType) => {
|
|
192
|
+
// `NextjsDistribution` adds a cache behavior for the prefix, so on these types
|
|
193
|
+
// any prefix is served.
|
|
194
|
+
expect((0, base_path_1.isAssetPrefixUnserved)(nextjsType, "/cdn", "prod")).toBe(false);
|
|
195
|
+
expect((0, base_path_1.isAssetPrefixUnserved)(nextjsType, "/cdn", undefined)).toBe(false);
|
|
196
|
+
});
|
|
197
|
+
it.each(Object.values(constants_1.NextjsType))("%s: flags nothing when there is no prefix", (nextjsType) => {
|
|
198
|
+
// `relativeAssetPrefix` already reduces an absolute prefix to `""`,
|
|
199
|
+
// which is the supported way to serve assets from another origin.
|
|
200
|
+
expect((0, base_path_1.isAssetPrefixUnserved)(nextjsType, "", "prod")).toBe(false);
|
|
201
|
+
expect((0, base_path_1.isAssetPrefixUnserved)(nextjsType, "", undefined)).toBe(false);
|
|
86
202
|
});
|
|
87
203
|
});
|
|
88
204
|
describe("resolveBasePath", () => {
|
|
@@ -120,12 +236,71 @@ describe("resolveBasePath", () => {
|
|
|
120
236
|
});
|
|
121
237
|
});
|
|
122
238
|
describe(constants_1.NextjsType.REGIONAL_FUNCTIONS, () => {
|
|
239
|
+
const RF = constants_1.NextjsType.REGIONAL_FUNCTIONS;
|
|
240
|
+
const stage = (name) => ({
|
|
241
|
+
strippedPrefix: name,
|
|
242
|
+
customDomain: false,
|
|
243
|
+
});
|
|
244
|
+
const domain = (mapping = "") => ({
|
|
245
|
+
strippedPrefix: mapping,
|
|
246
|
+
customDomain: true,
|
|
247
|
+
});
|
|
248
|
+
let warn;
|
|
249
|
+
beforeEach(() => {
|
|
250
|
+
warn = jest.spyOn(console, "warn").mockImplementation(() => { });
|
|
251
|
+
});
|
|
252
|
+
afterEach(() => warn.mockRestore());
|
|
123
253
|
// API Gateway strips the stage before matching resources, so an app served
|
|
124
|
-
// at the default `prod` stage sets basePath: "/prod" and
|
|
125
|
-
//
|
|
126
|
-
//
|
|
127
|
-
|
|
128
|
-
|
|
254
|
+
// at the default `prod` stage sets basePath: "/prod" and its resources live
|
|
255
|
+
// at the root. Mounting them under "prod" would nest every resource under a
|
|
256
|
+
// path the stage already consumed.
|
|
257
|
+
// A domain attached with `addDomainName({ basePath: "v1" })` strips "/v1"
|
|
258
|
+
// where synth can't see it; "/" is how the user says so. Deriving would
|
|
259
|
+
// mount everything under "v1", which the stripped requests never reach.
|
|
260
|
+
it('mounts at the root when the prop is "/", instead of deriving', () => {
|
|
261
|
+
expect((0, base_path_1.resolveBasePath)(RF, "/", "/v1")).toBeUndefined();
|
|
262
|
+
expect((0, base_path_1.resolveBasePath)(RF, "/", "/v1", domain())).toBeUndefined();
|
|
263
|
+
expect((0, base_path_1.resolveBasePath)(RF, "/", "/prod/base")).toBeUndefined();
|
|
264
|
+
// Unset still derives.
|
|
265
|
+
expect((0, base_path_1.resolveBasePath)(RF, undefined, "/v1")).toBe("v1");
|
|
266
|
+
});
|
|
267
|
+
it("mounts an app whose basePath is the stage at the root", () => {
|
|
268
|
+
expect((0, base_path_1.resolveBasePath)(RF, undefined, "/prod")).toBeUndefined();
|
|
269
|
+
expect((0, base_path_1.resolveBasePath)(RF, undefined, "/test", stage("test"))).toBeUndefined();
|
|
270
|
+
expect(warn).not.toHaveBeenCalled();
|
|
271
|
+
});
|
|
272
|
+
it("mounts the rest of a basePath nested below the stage", () => {
|
|
273
|
+
expect((0, base_path_1.resolveBasePath)(RF, undefined, "/prod/base")).toBe("base");
|
|
274
|
+
expect((0, base_path_1.resolveBasePath)(RF, undefined, "/v2/a/b", stage("v2"))).toBe("a/b");
|
|
275
|
+
});
|
|
276
|
+
// The case that used to 404 every bundle: a custom domain mapped at the root
|
|
277
|
+
// strips nothing, so the app's basePath is a real resource path, and left at
|
|
278
|
+
// the root `_next/static` fell through to the Lambda catch-all.
|
|
279
|
+
it("mounts an app under its whole basePath when nothing strips it", () => {
|
|
280
|
+
expect((0, base_path_1.resolveBasePath)(RF, undefined, "/docs", domain())).toBe("docs");
|
|
281
|
+
expect(warn).not.toHaveBeenCalled();
|
|
282
|
+
});
|
|
283
|
+
it("strips a custom domain's base path mapping like a stage", () => {
|
|
284
|
+
expect((0, base_path_1.resolveBasePath)(RF, undefined, "/app", domain("app"))).toBeUndefined();
|
|
285
|
+
expect((0, base_path_1.resolveBasePath)(RF, undefined, "/app/docs", domain("app"))).toBe("docs");
|
|
286
|
+
});
|
|
287
|
+
it("matches the stage on a segment boundary", () => {
|
|
288
|
+
expect((0, base_path_1.resolveBasePath)(RF, undefined, "/production", domain())).toBe("production");
|
|
289
|
+
expect((0, base_path_1.resolveBasePath)(RF, undefined, "/production", stage("prod"))).toBe("production");
|
|
290
|
+
});
|
|
291
|
+
// Without a custom domain the app's own links miss the stage, which synth
|
|
292
|
+
// can say but not fix - a domain attached with `addDomainName` is invisible.
|
|
293
|
+
it("warns when an execute-api app's basePath lacks the stage", () => {
|
|
294
|
+
expect((0, base_path_1.resolveBasePath)(RF, undefined, "/docs")).toBe("docs");
|
|
295
|
+
expect(warn).toHaveBeenCalledWith(expect.stringContaining('Set `basePath: "/prod/docs"`'));
|
|
296
|
+
});
|
|
297
|
+
it("warns when a custom domain's base path mapping is missing from the app's basePath", () => {
|
|
298
|
+
expect((0, base_path_1.resolveBasePath)(RF, undefined, "/docs", domain("v1"))).toBe("docs");
|
|
299
|
+
expect(warn).toHaveBeenCalledWith(expect.stringContaining('Set `basePath: "/v1/docs"`'));
|
|
300
|
+
});
|
|
301
|
+
it("derives nothing when the stage is a token", () => {
|
|
302
|
+
expect((0, base_path_1.resolveBasePath)(RF, undefined, "/docs", { customDomain: false })).toBeUndefined();
|
|
303
|
+
expect(warn).not.toHaveBeenCalled();
|
|
129
304
|
});
|
|
130
305
|
// The stripped prefix is part of what the app emits but never part of the
|
|
131
306
|
// resource path, so an app at the `prod` stage nested under "/base" sets
|
|
@@ -139,6 +314,56 @@ describe("resolveBasePath", () => {
|
|
|
139
314
|
// emit "/prod/..." while the resources live under "/prod/base/...".
|
|
140
315
|
expect(() => (0, base_path_1.resolveBasePath)(constants_1.NextjsType.REGIONAL_FUNCTIONS, "/prod", "/prod/base")).toThrow(/nests every API Gateway resource under that path/);
|
|
141
316
|
});
|
|
317
|
+
// Any other leading prefix is served at `/prod/base/...` while the app
|
|
318
|
+
// links to `/foo/base/...`, so only the stripped prefix itself qualifies.
|
|
319
|
+
// Behind a custom domain synth can see, that is certain.
|
|
320
|
+
it("only accepts the stripped prefix in front of the prop", () => {
|
|
321
|
+
expect((0, base_path_1.resolveBasePath)(RF, "/docs", "/app/docs", domain("app"))).toBe("docs");
|
|
322
|
+
expect(() => (0, base_path_1.resolveBasePath)(RF, "/docs", "/prod/docs", domain("app"))).toThrow(/nests every API Gateway resource under that path/);
|
|
323
|
+
// A custom domain mapped at the root strips nothing, so only equality works.
|
|
324
|
+
expect(() => (0, base_path_1.resolveBasePath)(RF, "/docs", "/v1/docs", domain())).toThrow(/nests every API Gateway resource under that path/);
|
|
325
|
+
});
|
|
326
|
+
// On the execute-api endpoint a domain attached later with
|
|
327
|
+
// `addDomainName({ basePath: "v1" })` can strip the leading part, and an
|
|
328
|
+
// explicit prop wins, so any other leading prefix warns instead.
|
|
329
|
+
it("warns on another leading prefix when only the stage is known", () => {
|
|
330
|
+
expect((0, base_path_1.resolveBasePath)(RF, "/app", "/v1/app")).toBe("app");
|
|
331
|
+
expect(warn).toHaveBeenCalledWith(expect.stringContaining('addDomainName({ basePath: "v1" })'));
|
|
332
|
+
warn.mockClear();
|
|
333
|
+
expect((0, base_path_1.resolveBasePath)(RF, "/base", "/prod/x/base")).toBe("base");
|
|
334
|
+
expect(warn).toHaveBeenCalledWith(expect.stringContaining('addDomainName({ basePath: "prod/x" })'));
|
|
335
|
+
});
|
|
336
|
+
it("falls back to a trailing segment when the stage is a token", () => {
|
|
337
|
+
expect((0, base_path_1.resolveBasePath)(RF, "/base", "/foo/base", { customDomain: false })).toBe("base");
|
|
338
|
+
});
|
|
339
|
+
// Agreeing with the app is not enough when the value starts with the stage:
|
|
340
|
+
// resources under "prod" are only reached at "/prod/prod/...".
|
|
341
|
+
// Certain behind a custom domain synth can see; on the execute-api
|
|
342
|
+
// endpoint an `addDomainName()` domain mapped at the root makes it right,
|
|
343
|
+
// so there it only warns.
|
|
344
|
+
it("rejects a prop equal to an app basePath that starts with the stage", () => {
|
|
345
|
+
expect(() => (0, base_path_1.resolveBasePath)(RF, "/app", "/app", domain("app"))).toThrow(/strips "\/app"/);
|
|
346
|
+
expect(() => (0, base_path_1.resolveBasePath)(RF, "/app/base", "/app/base", domain("app"))).toThrow(/Leave the prop unset/);
|
|
347
|
+
expect((0, base_path_1.resolveBasePath)(RF, "/prod", "/prod")).toBe("prod");
|
|
348
|
+
expect(warn).toHaveBeenCalledWith(expect.stringContaining('strips "/prod" before matching resources'));
|
|
349
|
+
warn.mockClear();
|
|
350
|
+
expect((0, base_path_1.resolveBasePath)(RF, "/prod/base", "/prod/base")).toBe("prod/base");
|
|
351
|
+
expect(warn).toHaveBeenCalledWith(expect.stringContaining("addDomainName()"));
|
|
352
|
+
});
|
|
353
|
+
it("accepts a matching prop and app basePath nothing strips", () => {
|
|
354
|
+
expect((0, base_path_1.resolveBasePath)(RF, "/docs", "/docs", domain())).toBe("docs");
|
|
355
|
+
expect((0, base_path_1.resolveBasePath)(RF, "/prod", "/prod", { customDomain: false })).toBe("prod");
|
|
356
|
+
expect(warn).not.toHaveBeenCalled();
|
|
357
|
+
});
|
|
358
|
+
// Matching the app is the unset case's problem again when a stage or
|
|
359
|
+
// mapping is stripped that the app's basePath lacks, so it warns the same.
|
|
360
|
+
it("warns when a matching prop and app basePath lack the stage", () => {
|
|
361
|
+
expect((0, base_path_1.resolveBasePath)(RF, "/production", "/production")).toBe("production");
|
|
362
|
+
expect(warn).toHaveBeenCalledWith(expect.stringContaining('Set `basePath: "/prod/production"`'));
|
|
363
|
+
warn.mockClear();
|
|
364
|
+
expect((0, base_path_1.resolveBasePath)(RF, "/docs", "/docs", domain("v1"))).toBe("docs");
|
|
365
|
+
expect(warn).toHaveBeenCalledWith(expect.stringContaining('Set `basePath: "/v1/docs"`'));
|
|
366
|
+
});
|
|
142
367
|
// The reverse is never right: the prop nests every resource, including the
|
|
143
368
|
// catch-all, under a path the app never links to.
|
|
144
369
|
it("rejects the prop setting a basePath the app doesn't", () => {
|
|
@@ -160,4 +385,4 @@ describe("resolveBasePath", () => {
|
|
|
160
385
|
});
|
|
161
386
|
});
|
|
162
387
|
});
|
|
163
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1wYXRoLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvYmFzZS1wYXRoLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxQ0FBNkQ7QUFDN0QscUNBQWlDO0FBQ2pDLHlDQUFpQztBQUNqQyw0Q0FBMEM7QUFDMUMsMkNBS3FCO0FBRXJCLE1BQU0sTUFBTSxHQUFHLENBQUMsc0JBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxzQkFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFFM0UsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtJQUNqQyxFQUFFLENBQUMsNkRBQTZELEVBQUUsR0FBRyxFQUFFO1FBQ3JFLE1BQU0sQ0FBQyxJQUFBLDZCQUFpQixFQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxJQUFBLDZCQUFpQixFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxJQUFBLDZCQUFpQixFQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELE1BQU0sQ0FBQyxJQUFBLDZCQUFpQixFQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG9EQUFvRCxFQUFFLEdBQUcsRUFBRTtRQUM1RCxNQUFNLENBQUMsSUFBQSw2QkFBaUIsRUFBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QyxNQUFNLENBQUMsSUFBQSw2QkFBaUIsRUFBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QyxNQUFNLENBQUMsSUFBQSw2QkFBaUIs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LHNCQUFVLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUMzRCxDQUFDLE9BQU8sQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsc0JBQVUsQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLEVBQUU7UUFDNUMsMkVBQTJFO1FBQzNFLDJFQUEyRTtRQUMzRSw0RUFBNEU7UUFDNUUsRUFBRSxDQUFDLGtEQUFrRCxFQUFFLEdBQUcsRUFBRTtZQUMxRCxNQUFNLFVBQVUsR0FBRyxzQkFBVSxDQUFDLG1CQUFtQixDQUFDO1lBQ2xELE1BQU0sQ0FBQyxJQUFBLDJCQUFlLEVBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxRCxNQUFNLENBQUMsSUFBQSwyQkFBZSxFQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwRCxNQUFNLENBQUMsSUFBQSwyQkFBZSxFQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2RSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBta2R0ZW1wU3luYywgcm1TeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgTmV4dGpzVHlwZSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIGpvaW5QYXRoLFxuICBub3JtYWxpemVCYXNlUGF0aCxcbiAgcmVhZE5leHRDb25maWdCYXNlUGF0aCxcbiAgcmVzb2x2ZUJhc2VQYXRoLFxufSBmcm9tIFwiLi9iYXNlLXBhdGhcIjtcblxuY29uc3QgR0xPQkFMID0gW05leHRqc1R5cGUuR0xPQkFMX0ZVTkNUSU9OUywgTmV4dGpzVHlwZS5HTE9CQUxfQ09OVEFJTkVSU107XG5cbmRlc2NyaWJlKFwibm9ybWFsaXplQmFzZVBhdGhcIiwgKCkgPT4ge1xuICBpdChcInJlZHVjZXMgdmFsdWVzIGFkZHJlc3NpbmcgdGhlIHNhbWUgcGF0aCB0byB0aGUgc2FtZSBzZWdtZW50XCIsICgpID0+IHtcbiAgICBleHBlY3Qobm9ybWFsaXplQmFzZVBhdGgoXCIvYmFzZVwiKSkudG9CZShcImJhc2VcIik7XG4gICAgZXhwZWN0KG5vcm1hbGl6ZUJhc2VQYXRoKFwiYmFzZVwiKSkudG9CZShcImJhc2VcIik7XG4gICAgZXhwZWN0KG5vcm1hbGl6ZUJhc2VQYXRoKFwiL2Jhc2UvXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgICBleHBlY3Qobm9ybWFsaXplQmFzZVBhdGgoXCIvL2Jhc2UvL1wiKSkudG9CZShcImJhc2VcIik7XG4gIH0pO1xuXG4gIGl0KFwibWFwcyB1bmRlZmluZWQgYW5kIGVtcHR5IHZhbHVlcyB0byBhbiBlbXB0eSBzdHJpbmdcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChub3JtYWxpemVCYXNlUGF0aCh1bmRlZmluZWQpKS50b0JlKFwiXCIpO1xuICAgIGV4cGVjdChub3JtYWxpemVCYXNlUGF0aChcIlwiKSkudG9CZShcIlwiKTtcbiAgICBleHBlY3Qobm9ybWFsaXplQmFzZVBhdGgoXCIvXCIpKS50b0JlKFwiXCIpO1xuICB9KTtcblxuICBpdChcImtlZXBzIGludGVyaW9yIHNsYXNoZXMgb2YgYSBuZXN0ZWQgYmFzZVBhdGhcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChub3JtYWxpemVCYXNlUGF0aChcIi90ZWFtL2FwcC9cIikpLnRvQmUoXCJ0ZWFtL2FwcFwiKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJqb2luUGF0aFwiLCAoKSA9PiB7XG4gIGNvbnN0IG9yaWdpbiA9IFwiaHR0cHM6Ly9kMTExMTExYWJjZGVmOC5jbG91ZGZyb250Lm5ldFwiO1xuXG4gIGl0KFwiZHJvcHMgZW1wdHkgcGFydHNcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChqb2luUGF0aChvcmlnaW4pKS50b0JlKG9yaWdpbik7XG4gICAgZXhwZWN0KGpvaW5QYXRoKG9yaWdpbiwgXCJcIikpLnRvQmUob3JpZ2luKTtcbiAgICBleHBlY3Qoam9pblBhdGgob3JpZ2luLCB1bmRlZmluZWQpKS50b0JlKG9yaWdpbik7XG4gICAgZXhwZWN0KGpvaW5QYXRoKG9yaWdpbiwgXCIvXCIpKS50b0JlKG9yaWdpbik7XG4gICAgZXhwZWN0KGpvaW5QYXRoKFwiXCIsIFwiYmFzZVwiLCB1bmRlZmluZWQsIFwiX25leHQvc3RhdGljXCIpKS50b0JlKFxuICAgICAgXCJiYXNlL19uZXh0L3N0YXRpY1wiLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwiam9pbnMgd2l0aCBleGFjdGx5IG9uZSBzbGFzaCByZWdhcmRsZXNzIG9mIGVhY2ggcGFydCdzIHNsYXNoZXNcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChqb2luUGF0aChvcmlnaW4sIFwiL2Jhc2VcIikpLnRvQmUoYCR7b3JpZ2lufS9iYXNlYCk7XG4gICAgZXhwZWN0KGpvaW5QYXRoKG9yaWdpbiwgXCJiYXNlL1wiKSkudG9CZShgJHtvcmlnaW59L2Jhc2VgKTtcbiAgICBleHBlY3Qoam9pblBhdGgob3JpZ2luLCBcIi90ZWFtL2FwcC9cIikpLnRvQmUoYCR7b3JpZ2lufS90ZWFtL2FwcGApO1xuICAgIGV4cGVjdChqb2luUGF0aChcIi9iYXNlL1wiLCBcIi9fbmV4dC9zdGF0aWMve2tleX1cIikpLnRvQmUoXG4gICAgICBcImJhc2UvX25leHQvc3RhdGljL3trZXl9XCIsXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJyZXR1cm5zIGFuIGVtcHR5IHN0cmluZyB3aGVuIGV2ZXJ5IHBhcnQgaXMgZW1wdHlcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChqb2luUGF0aCgpKS50b0JlKFwiXCIpO1xuICAgIGV4cGVjdChqb2luUGF0aCh1bmRlZmluZWQsIFwiXCIsIFwiL1wiKSkudG9CZShcIlwiKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJyZWFkTmV4dENvbmZpZ0Jhc2VQYXRoXCIsICgpID0+IHtcbiAgbGV0IGRvdE5leHRQYXRoOiBzdHJpbmc7XG4gIGxldCB3YXJuOiBqZXN0LlNweUluc3RhbmNlO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGRvdE5leHRQYXRoID0gbWtkdGVtcFN5bmMoam9pbih0bXBkaXIoKSwgXCJiYXNlLXBhdGgtXCIpKTtcbiAgICB3YXJuID0gamVzdC5zcHlPbihjb25zb2xlLCBcIndhcm5cIikubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHt9KTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICB3YXJuLm1vY2tSZXN0b3JlKCk7XG4gICAgcm1TeW5jKGRvdE5leHRQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHdyaXRlUmVxdWlyZWRTZXJ2ZXJGaWxlcyhjb250ZW50czogc3RyaW5nKSB7XG4gICAgd3JpdGVGaWxlU3luYyhqb2luKGRvdE5leHRQYXRoLCBcInJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uXCIpLCBjb250ZW50cyk7XG4gIH1cblxuICBpdChcInJlYWRzIHRoZSBhcHAncyBiYXNlUGF0aCBhbmQgc3RyaXBzIHRoZSBsZWFkaW5nIHNsYXNoXCIsICgpID0+IHtcbiAgICB3cml0ZVJlcXVpcmVkU2VydmVyRmlsZXMoSlNPTi5zdHJpbmdpZnkoeyBjb25maWc6IHsgYmFzZVBhdGg6IFwiL3Byb2RcIiB9IH0pKTtcblxuICAgIGV4cGVjdChyZWFkTmV4dENvbmZpZ0Jhc2VQYXRoKGRvdE5leHRQYXRoKSkudG9CZShcInByb2RcIik7XG4gICAgZXhwZWN0KHdhcm4pLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KFwicmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgd2hlbiB0aGUgYXBwIHNldHMgbm8gYmFzZVBhdGhcIiwgKCkgPT4ge1xuICAgIC8vIGBuZXh0IGJ1aWxkYCB3cml0ZXMgYmFzZVBhdGg6IFwiXCIgcmF0aGVyIHRoYW4gb21pdHRpbmcgaXQuXG4gICAgd3JpdGVSZXF1aXJlZFNlcnZlckZpbGVzKEpTT04uc3RyaW5naWZ5KHsgY29uZmlnOiB7IGJhc2VQYXRoOiBcIlwiIH0gfSkpO1xuXG4gICAgZXhwZWN0KHJlYWROZXh0Q29uZmlnQmFzZVBhdGgoZG90TmV4dFBhdGgpKS50b0JlKFwiXCIpO1xuICAgIGV4cGVjdCh3YXJuKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICB9KTtcblxuICAvLyBEZWdyYWRpbmcgdG8gXCJcIiBpcyBkZWxpYmVyYXRlLCBidXQgaXQncyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGFuIGFwcCB0aGF0XG4gIC8vIHNldHMgbm8gYmFzZVBhdGgsIHNvIGl0IGhhcyB0byBiZSB2aXNpYmxlOiB0aGUgR2xvYmFsIGNvbnN0cnVjdHMgZGVyaXZlXG4gIC8vIHRoZWlyIGJhc2VQYXRoIGZyb20gdGhpcyB2YWx1ZSBhbmQgd291bGQgb3RoZXJ3aXNlIDQwNCBldmVyeSBzdGF0aWMgYXNzZXRcbiAgLy8gd2l0aCBub3RoaW5nIGJ1dCBhIHNpbGVudCBmYWxsYmFjayB0byBleHBsYWluIGl0LlxuICBpdChcIndhcm5zIHdoZW4gcmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb24gaXMgbWlzc2luZ1wiLCAoKSA9PiB7XG4gICAgZXhwZWN0KHJlYWROZXh0Q29uZmlnQmFzZVBhdGgoZG90TmV4dFBhdGgpKS50b0JlKFwiXCIpO1xuICAgIGV4cGVjdCh3YXJuKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgIGV4cGVjdC5zdHJpbmdDb250YWluaW5nKFwicmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb25cIiksXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJ3YXJucyB3aGVuIHRoZSBmaWxlIGlzbid0IHZhbGlkIEpTT05cIiwgKCkgPT4ge1xuICAgIHdyaXRlUmVxdWlyZWRTZXJ2ZXJGaWxlcyhcIm5vdCBqc29uXCIpO1xuXG4gICAgZXhwZWN0KHJlYWROZXh0Q29uZmlnQmFzZVBhdGgoZG90TmV4dFBhdGgpKS50b0JlKFwiXCIpO1xuICAgIGV4cGVjdCh3YXJuKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgIGV4cGVjdC5zdHJpbmdDb250YWluaW5nKFwiQ291bGQgbm90IHJlYWQgYmFzZVBhdGhcIiksXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJyZXR1cm5zIGFuIGVtcHR5IHN0cmluZyB3aGVuIHRoZSBmaWxlIGhhcyBubyBjb25maWcga2V5XCIsICgpID0+IHtcbiAgICB3cml0ZVJlcXVpcmVkU2VydmVyRmlsZXMoSlNPTi5zdHJpbmdpZnkoeyBmaWxlczogW10gfSkpO1xuXG4gICAgZXhwZWN0KHJlYWROZXh0Q29uZmlnQmFzZVBhdGgoZG90TmV4dFBhdGgpKS50b0JlKFwiXCIpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcInJlc29sdmVCYXNlUGF0aFwiLCAoKSA9PiB7XG4gIGRlc2NyaWJlLmVhY2goT2JqZWN0LnZhbHVlcyhOZXh0anNUeXBlKSkoXCIlc1wiLCAobmV4dGpzVHlwZSkgPT4ge1xuICAgIGl0KFwicmVzb2x2ZXMgdG8gdW5kZWZpbmVkIHdoZW4gYm90aCBhcmUgdW5zZXRcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCBcIlwiLCBcIlwiKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgLy8gTm9ybWFsaXplcyB0byBlbXB0eSwgc28gaXQncyB0aGUgc2FtZSBhcyB1bnNldCByYXRoZXIgdGhhbiBhIHByZWZpeC5cbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgXCIvXCIpKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICAvLyBPbmUgc2hhcGUgb3V0LCB3aGF0ZXZlciBzaGFwZSBjYW1lIGluOiBjb25zdW1lcnMgdGhhdCBuZWVkIGEgbGVhZGluZ1xuICAgIC8vIHNsYXNoIChvbmx5IGBOZXh0anNEaXN0cmlidXRpb25gJ3MgcGF0aCBwYXR0ZXJucykgYWRkIHRoZWlyIG93biwgc29cbiAgICAvLyBub3RoaW5nIGRvd25zdHJlYW0gaGFzIHRvIHJlLW5vcm1hbGl6ZS5cbiAgICBpdChcIm5vcm1hbGl6ZXMgdGhlIHByb3Agd2hlbiBpdCBtYXRjaGVzIHRoZSBhcHBcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCBcIi9iYXNlXCIsIFwiL2Jhc2VcIikpLnRvQmUoXCJiYXNlXCIpO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCBcImJhc2VcIiwgXCIvYmFzZVwiKSkudG9CZShcImJhc2VcIik7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKG5leHRqc1R5cGUsIFwiL2Jhc2UvXCIsIFwiL2Jhc2VcIikpLnRvQmUoXCJiYXNlXCIpO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCBcImJhc2UvL1wiLCBcIi9iYXNlXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUuZWFjaChHTE9CQUwpKFwiJXNcIiwgKG5leHRqc1R5cGUpID0+IHtcbiAgICAvLyBDbG91ZEZyb250IHVzZXMgdGhlIHJlcXVlc3QgcGF0aCB2ZXJiYXRpbSBhcyB0aGUgUzMgb2JqZWN0IGtleSwgc28gdGhlXG4gICAgLy8gcHJvcCBoYXMgdG8gYmUgdGhlIHByZWZpeCB0aGUgYXBwIGVtaXRzIOKAlCB0aGVyZSdzIGV4YWN0bHkgb25lIHZhbGlkIHZhbHVlLFxuICAgIC8vIHdoaWNoIG1ha2VzIHRoZSBhcHAncyBjb25maWcgdGhlIHNvdXJjZSBvZiB0cnV0aC5cbiAgICBpdChcImRlcml2ZXMgdGhlIHByb3AgZnJvbSB0aGUgYXBwJ3MgYmFzZVBhdGhcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCB1bmRlZmluZWQsIFwiL2Jhc2VcIikpLnRvQmUoXCJiYXNlXCIpO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCBcIlwiLCBcImJhc2VcIikpLnRvQmUoXCJiYXNlXCIpO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCB1bmRlZmluZWQsIFwiL3RlYW0vYXBwL1wiKSkudG9CZShcbiAgICAgICAgXCJ0ZWFtL2FwcFwiLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KFwicmVqZWN0cyB0aGUgcHJvcCBzZXR0aW5nIGEgYmFzZVBhdGggdGhlIGFwcCBkb2Vzbid0XCIsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PiByZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgXCIvYmFzZVwiKSkudG9UaHJvdyhcbiAgICAgICAgL0Nsb3VkRnJvbnQgc2VydmVzIHN0YXRpYyBhc3NldHMgc3RyYWlnaHQgZnJvbSBTMy8sXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoXCJyZWplY3RzIHR3byBkaWZmZXJlbnQgdmFsdWVzXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PiByZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgXCIvYVwiLCBcIi9iXCIpKS50b1Rocm93KFxuICAgICAgICAncHJvcCBpcyBcIi9hXCIgYnV0IHlvdXIgTmV4dC5qcyBhcHBcXCdzIGNvbmZpZyBzZXRzIGBiYXNlUGF0aGAgdG8gXCIvYlwiJyxcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKE5leHRqc1R5cGUuUkVHSU9OQUxfRlVOQ1RJT05TLCAoKSA9PiB7XG4gICAgLy8gQVBJIEdhdGV3YXkgc3RyaXBzIHRoZSBzdGFnZSBiZWZvcmUgbWF0Y2hpbmcgcmVzb3VyY2VzLCBzbyBhbiBhcHAgc2VydmVkXG4gICAgLy8gYXQgdGhlIGRlZmF1bHQgYHByb2RgIHN0YWdlIHNldHMgYmFzZVBhdGg6IFwiL3Byb2RcIiBhbmQgbGVhdmVzIHRoZSBwcm9wXG4gICAgLy8gdW5zZXQuIFNhbWUgc2hhcGUgYXMgYSBjdXN0b20gZG9tYWluIGJhc2UgcGF0aCBtYXBwaW5nLiBEZXJpdmluZyBoZXJlXG4gICAgLy8gd291bGQgbmVzdCBldmVyeSByZXNvdXJjZSB1bmRlciBhIHBhdGggdGhlIHN0YWdlIGFscmVhZHkgY29uc3VtZWQuXG4gICAgaXQoXCJkb2VzIG5vdCBkZXJpdmUgdGhlIGFwcCdzIGJhc2VQYXRoXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUJhc2VQYXRoKE5leHRqc1R5cGUuUkVHSU9OQUxfRlVOQ1RJT05TLCB1bmRlZmluZWQsIFwiL3Byb2RcIiksXG4gICAgICApLnRvQmVVbmRlZmluZWQoKTtcbiAgICB9KTtcblxuICAgIC8vIFRoZSBzdHJpcHBlZCBwcmVmaXggaXMgcGFydCBvZiB3aGF0IHRoZSBhcHAgZW1pdHMgYnV0IG5ldmVyIHBhcnQgb2YgdGhlXG4gICAgLy8gcmVzb3VyY2UgcGF0aCwgc28gYW4gYXBwIGF0IHRoZSBgcHJvZGAgc3RhZ2UgbmVzdGVkIHVuZGVyIFwiL2Jhc2VcIiBzZXRzXG4gICAgLy8gYmFzZVBhdGg6IFwiL3Byb2QvYmFzZVwiIGFuZCB0aGUgcHJvcCB0byBcIi9iYXNlXCIuXG4gICAgaXQoXCJhY2NlcHRzIGFuIGFwcCBiYXNlUGF0aCB0aGF0IGVuZHMgd2l0aCB0aGUgcHJvcFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVCYXNlUGF0aChOZXh0anNUeXBlLlJFR0lPTkFMX0ZVTkNUSU9OUywgXCIvYmFzZVwiLCBcIi9wcm9kL2Jhc2VcIiksXG4gICAgICApLnRvQmUoXCJiYXNlXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJvbmx5IGFjY2VwdHMgdGhlIHByb3AgYXMgYSB3aG9sZSB0cmFpbGluZyBwYXRoIHNlZ21lbnRcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KCgpID0+XG4gICAgICAgIHJlc29sdmVCYXNlUGF0aChOZXh0anNUeXBlLlJFR0lPTkFMX0ZVTkNUSU9OUywgXCIvc2VcIiwgXCIvcHJvZC9iYXNlXCIpLFxuICAgICAgKS50b1Rocm93KC9uZXN0cyBldmVyeSBBUEkgR2F0ZXdheSByZXNvdXJjZSB1bmRlciB0aGF0IHBhdGgvKTtcbiAgICAgIC8vIExlYWRpbmcsIG5vdCB0cmFpbGluZzogQVBJIEdhdGV3YXkgc3RyaXBzIHRoZSBzdGFnZSwgc28gdGhlIGFwcCB3b3VsZFxuICAgICAgLy8gZW1pdCBcIi9wcm9kLy4uLlwiIHdoaWxlIHRoZSByZXNvdXJjZXMgbGl2ZSB1bmRlciBcIi9wcm9kL2Jhc2UvLi4uXCIuXG4gICAgICBleHBlY3QoKCkgPT5cbiAgICAgICAgcmVzb2x2ZUJhc2VQYXRoKE5leHRqc1R5cGUuUkVHSU9OQUxfRlVOQ1RJT05TLCBcIi9wcm9kXCIsIFwiL3Byb2QvYmFzZVwiKSxcbiAgICAgICkudG9UaHJvdygvbmVzdHMgZXZlcnkgQVBJIEdhdGV3YXkgcmVzb3VyY2UgdW5kZXIgdGhhdCBwYXRoLyk7XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgcmV2ZXJzZSBpcyBuZXZlciByaWdodDogdGhlIHByb3AgbmVzdHMgZXZlcnkgcmVzb3VyY2UsIGluY2x1ZGluZyB0aGVcbiAgICAvLyBjYXRjaC1hbGwsIHVuZGVyIGEgcGF0aCB0aGUgYXBwIG5ldmVyIGxpbmtzIHRvLlxuICAgIGl0KFwicmVqZWN0cyB0aGUgcHJvcCBzZXR0aW5nIGEgYmFzZVBhdGggdGhlIGFwcCBkb2Vzbid0XCIsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PlxuICAgICAgICByZXNvbHZlQmFzZVBhdGgoTmV4dGpzVHlwZS5SRUdJT05BTF9GVU5DVElPTlMsIFwiL2Jhc2VcIiksXG4gICAgICApLnRvVGhyb3coL25lc3RzIGV2ZXJ5IEFQSSBHYXRld2F5IHJlc291cmNlIHVuZGVyIHRoYXQgcGF0aC8pO1xuICAgIH0pO1xuXG4gICAgaXQoXCJyZWplY3RzIHR3byBkaWZmZXJlbnQgdmFsdWVzXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PlxuICAgICAgICByZXNvbHZlQmFzZVBhdGgoTmV4dGpzVHlwZS5SRUdJT05BTF9GVU5DVElPTlMsIFwiL2FcIiwgXCIvYlwiKSxcbiAgICAgICkudG9UaHJvdygvbmVzdHMgZXZlcnkgQVBJIEdhdGV3YXkgcmVzb3VyY2UgdW5kZXIgdGhhdCBwYXRoLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKE5leHRqc1R5cGUuUkVHSU9OQUxfQ09OVEFJTkVSUywgKCkgPT4ge1xuICAgIC8vIGJhc2VQYXRoIG9ubHkgbmFtZXNwYWNlcyB0aGUgUzMgYnVja2V0IGhlcmU6IHRoZSBBTEIgZm9yd2FyZHMgZXZlcnkgcGF0aFxuICAgIC8vIHRvIHRoZSBjb250YWluZXIsIHdoaWNoIHNlcnZlcyBpdHMgb3duIHN0YXRpYyBhc3NldHMuIFNvIGFueSBjb21iaW5hdGlvblxuICAgIC8vIGlzIHZhbGlkLCBhbmQgdGhlIGFwcCdzIGJhc2VQYXRoIGlzIG5ldmVyIGRlcml2ZWQgaW50byB0aGUgYnVja2V0IHByZWZpeC5cbiAgICBpdChcImFjY2VwdHMgYW55IGNvbWJpbmF0aW9uLCBhbHdheXMga2VlcGluZyB0aGUgcHJvcFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBuZXh0anNUeXBlID0gTmV4dGpzVHlwZS5SRUdJT05BTF9DT05UQUlORVJTO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCBcIi9hXCIsIFwiL2JcIikpLnRvQmUoXCJhXCIpO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCBcIi9hXCIpKS50b0JlKFwiYVwiKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgdW5kZWZpbmVkLCBcIi9iXCIpKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
388
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1wYXRoLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvYmFzZS1wYXRoLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw0Q0FBMEM7QUFDMUMsMkNBVXFCO0FBRXJCLE1BQU0sTUFBTSxHQUFHLENBQUMsc0JBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxzQkFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFFM0UsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtJQUNqQyxFQUFFLENBQUMsNkRBQTZELEVBQUUsR0FBRyxFQUFFO1FBQ3JFLE1BQU0sQ0FBQyxJQUFBLDZCQUFpQixFQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxJQUFBLDZCQUFpQixFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxJQUFBLDZCQUFpQixFQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELE1BQU0sQ0FBQyxJQUFBLDZCQUFpQixFQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG9EQUFvRCxFQUFFLEdBQUcsRUFBRTtRQUM1RCxNQUFNLENBQUMsSUFBQSw2QkFBaUIsRUFBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QyxNQUFNLENBQUMsSUFBQSw2QkFBaUIsRUFBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QyxNQUFNLENBQUMsSUFBQSw2QkFBaUIsRUFBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFF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QUFDLHNCQUFVLENBQUMsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLENBQ3hELENBQUMsT0FBTyxDQUFDLGtEQUFrRCxDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsOEJBQThCLEVBQUUsR0FBRyxFQUFFO1lBQ3RDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FDVixJQUFBLDJCQUFlLEVBQUMsc0JBQVUsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQzNELENBQUMsT0FBTyxDQUFDLGtEQUFrRCxDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxzQkFBVSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtRQUM1QywyRUFBMkU7UUFDM0UsMkVBQTJFO1FBQzNFLDRFQUE0RTtRQUM1RSxFQUFFLENBQUMsa0RBQWtELEVBQUUsR0FBRyxFQUFFO1lBQzFELE1BQU0sVUFBVSxHQUFHLHNCQUFVLENBQUMsbUJBQW1CLENBQUM7WUFDbEQsTUFBTSxDQUFDLElBQUEsMkJBQWUsRUFBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFELE1BQU0sQ0FBQyxJQUFBLDJCQUFlLEVBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BELE1BQU0sQ0FBQyxJQUFBLDJCQUFlLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5leHRqc1R5cGUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBhc3NldFByZWZpeFBhdGgsXG4gIGJhc2VQYXRoUHJlZml4LFxuICBpc0Fzc2V0UHJlZml4VW5zZXJ2ZWQsXG4gIGpvaW5QYXRoLFxuICBub3JtYWxpemVCYXNlUGF0aCxcbiAgcHJlZml4V2l0aEJhc2VQYXRoLFxuICByZWxhdGl2ZUFzc2V0UHJlZml4LFxuICByZXNvbHZlQmFzZVBhdGgsXG4gIHdob2xlQXBwSW52YWxpZGF0aW9uUGF0aHMsXG59IGZyb20gXCIuL2Jhc2UtcGF0aFwiO1xuXG5jb25zdCBHTE9CQUwgPSBbTmV4dGpzVHlwZS5HTE9CQUxfRlVOQ1RJT05TLCBOZXh0anNUeXBlLkdMT0JBTF9DT05UQUlORVJTXTtcblxuZGVzY3JpYmUoXCJub3JtYWxpemVCYXNlUGF0aFwiLCAoKSA9PiB7XG4gIGl0KFwicmVkdWNlcyB2YWx1ZXMgYWRkcmVzc2luZyB0aGUgc2FtZSBwYXRoIHRvIHRoZSBzYW1lIHNlZ21lbnRcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChub3JtYWxpemVCYXNlUGF0aChcIi9iYXNlXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgICBleHBlY3Qobm9ybWFsaXplQmFzZVBhdGgoXCJiYXNlXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgICBleHBlY3Qobm9ybWFsaXplQmFzZVBhdGgoXCIvYmFzZS9cIikpLnRvQmUoXCJiYXNlXCIpO1xuICAgIGV4cGVjdChub3JtYWxpemVCYXNlUGF0aChcIi8vYmFzZS8vXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgfSk7XG5cbiAgaXQoXCJtYXBzIHVuZGVmaW5lZCBhbmQgZW1wdHkgdmFsdWVzIHRvIGFuIGVtcHR5IHN0cmluZ1wiLCAoKSA9PiB7XG4gICAgZXhwZWN0KG5vcm1hbGl6ZUJhc2VQYXRoKHVuZGVmaW5lZCkpLnRvQmUoXCJcIik7XG4gICAgZXhwZWN0KG5vcm1hbGl6ZUJhc2VQYXRoKFwiXCIpKS50b0JlKFwiXCIpO1xuICAgIGV4cGVjdChub3JtYWxpemVCYXNlUGF0aChcIi9cIikpLnRvQmUoXCJcIik7XG4gIH0pO1xuXG4gIGl0KFwia2VlcHMgaW50ZXJpb3Igc2xhc2hlcyBvZiBhIG5lc3RlZCBiYXNlUGF0aFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KG5vcm1hbGl6ZUJhc2VQYXRoKFwiL3RlYW0vYXBwL1wiKSkudG9CZShcInRlYW0vYXBwXCIpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcIndob2xlQXBwSW52YWxpZGF0aW9uUGF0aHNcIiwgKCkgPT4ge1xuICBpdChcImlzIHRoZSB3aG9sZSBkaXN0cmlidXRpb24gd2l0aG91dCBhIGJhc2VQYXRoXCIsICgpID0+IHtcbiAgICBleHBlY3Qod2hvbGVBcHBJbnZhbGlkYXRpb25QYXRocygpKS50b0VxdWFsKFtcIi8qXCJdKTtcbiAgICBleHBlY3Qod2hvbGVBcHBJbnZhbGlkYXRpb25QYXRocyhcIlwiKSkudG9FcXVhbChbXCIvKlwiXSk7XG4gIH0pO1xuXG4gIGl0KFwiY292ZXJzIHRoZSBhcHAncyByb290IGFuZCBSU0MgcGF5bG9hZCwgYnV0IG5vIHNpYmxpbmcgcHJlZml4XCIsICgpID0+IHtcbiAgICBmb3IgKGNvbnN0IGJhc2VQYXRoIG9mIFtcIi9iYXNlXCIsIFwiYmFzZVwiLCBcIi9iYXNlL1wiXSkge1xuICAgICAgZXhwZWN0KHdob2xlQXBwSW52YWxpZGF0aW9uUGF0aHMoYmFzZVBhdGgpKS50b0VxdWFsKFtcbiAgICAgICAgXCIvYmFzZVwiLFxuICAgICAgICBcIi9iYXNlPypcIixcbiAgICAgICAgXCIvYmFzZS8qXCIsXG4gICAgICBdKTtcbiAgICB9XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwiam9pblBhdGhcIiwgKCkgPT4ge1xuICBjb25zdCBvcmlnaW4gPSBcImh0dHBzOi8vZDExMTExMWFiY2RlZjguY2xvdWRmcm9udC5uZXRcIjtcblxuICBpdChcImRyb3BzIGVtcHR5IHBhcnRzXCIsICgpID0+IHtcbiAgICBleHBlY3Qoam9pblBhdGgob3JpZ2luKSkudG9CZShvcmlnaW4pO1xuICAgIGV4cGVjdChqb2luUGF0aChvcmlnaW4sIFwiXCIpKS50b0JlKG9yaWdpbik7XG4gICAgZXhwZWN0KGpvaW5QYXRoKG9yaWdpbiwgdW5kZWZpbmVkKSkudG9CZShvcmlnaW4pO1xuICAgIGV4cGVjdChqb2luUGF0aChvcmlnaW4sIFwiL1wiKSkudG9CZShvcmlnaW4pO1xuICAgIGV4cGVjdChqb2luUGF0aChcIlwiLCBcImJhc2VcIiwgdW5kZWZpbmVkLCBcIl9uZXh0L3N0YXRpY1wiKSkudG9CZShcbiAgICAgIFwiYmFzZS9fbmV4dC9zdGF0aWNcIixcbiAgICApO1xuICB9KTtcblxuICBpdChcImpvaW5zIHdpdGggZXhhY3RseSBvbmUgc2xhc2ggcmVnYXJkbGVzcyBvZiBlYWNoIHBhcnQncyBzbGFzaGVzXCIsICgpID0+IHtcbiAgICBleHBlY3Qoam9pblBhdGgob3JpZ2luLCBcIi9iYXNlXCIpKS50b0JlKGAke29yaWdpbn0vYmFzZWApO1xuICAgIGV4cGVjdChqb2luUGF0aChvcmlnaW4sIFwiYmFzZS9cIikpLnRvQmUoYCR7b3JpZ2lufS9iYXNlYCk7XG4gICAgZXhwZWN0KGpvaW5QYXRoKG9yaWdpbiwgXCIvdGVhbS9hcHAvXCIpKS50b0JlKGAke29yaWdpbn0vdGVhbS9hcHBgKTtcbiAgICBleHBlY3Qoam9pblBhdGgoXCIvYmFzZS9cIiwgXCIvX25leHQvc3RhdGljL3trZXl9XCIpKS50b0JlKFxuICAgICAgXCJiYXNlL19uZXh0L3N0YXRpYy97a2V5fVwiLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwicmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgd2hlbiBldmVyeSBwYXJ0IGlzIGVtcHR5XCIsICgpID0+IHtcbiAgICBleHBlY3Qoam9pblBhdGgoKSkudG9CZShcIlwiKTtcbiAgICBleHBlY3Qoam9pblBhdGgodW5kZWZpbmVkLCBcIlwiLCBcIi9cIikpLnRvQmUoXCJcIik7XG4gIH0pO1xuXG4gIC8vIEhvdyBgTmV4dGpzUmVnaW9uYWxDb250YWluZXJzLnVybGAgYXBwZW5kcyB0aGUgYXBwJ3MgYmFzZVBhdGg6IHRoZSBBTEJcbiAgLy8gZm9yd2FyZHMgZXZlcnkgcGF0aCB0byB0aGUgY29udGFpbmVyIHVuY2hhbmdlZCwgc28gdGhlIGFwcCBvbmx5IGFuc3dlcnNcbiAgLy8gdW5kZXIgaXRzIG93biBiYXNlUGF0aCBhbmQgdGhlIGJhcmUgQUxCIFVSTCB3b3VsZCA0MDQuXG4gIGl0KFwiYXBwZW5kcyBhbiBhcHAgYmFzZVBhdGggdG8gYSBiYXJlIEFMQiBvcmlnaW5cIiwgKCkgPT4ge1xuICAgIGNvbnN0IGFsYiA9IFwiaHR0cDovL215LWFsYi0xMjMudXMtZWFzdC0xLmVsYi5hbWF6b25hd3MuY29tXCI7XG4gICAgZXhwZWN0KGpvaW5QYXRoKGFsYiwgXCJiYXNlXCIpKS50b0JlKGAke2FsYn0vYmFzZWApO1xuICAgIGV4cGVjdChqb2luUGF0aChhbGIsIFwidGVhbS9hcHBcIikpLnRvQmUoYCR7YWxifS90ZWFtL2FwcGApO1xuICAgIC8vIEFuIGFwcCB3aXRoIG5vIGJhc2VQYXRoIGlzIHNlcnZlZCBhdCB0aGUgb3JpZ2luIGl0c2VsZi5cbiAgICBleHBlY3Qoam9pblBhdGgoYWxiLCBcIlwiKSkudG9CZShhbGIpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcInByZWZpeFdpdGhCYXNlUGF0aFwiLCAoKSA9PiB7XG4gIC8vIFRoZSBoZWFsdGggY2hlY2sgcGF0aCBpcyBoYW5kZWQgdG8gdGhpbmdzIHRoYXQgdGFsayB0byB0aGUgYXBwIGRpcmVjdGx5IChhblxuICAvLyBBTEIgdGFyZ2V0IGdyb3VwLCB0aGUgY29udGFpbmVyJ3Mgb3duIGhlYWx0aCBwcm9iZSksIGFuZCB0aGUgYXBwIG9ubHlcbiAgLy8gYW5zd2VycyB1bmRlciBpdHMgYmFzZVBhdGguIFVucHJlZml4ZWQsIGV2ZXJ5IGNoZWNrIDQwNHM6IHRoZSB0YXJnZXQgbmV2ZXJcbiAgLy8gdHVybnMgaGVhbHRoeSwgc28gdGFza3MgYXJlIGtpbGxlZCBvbiB0aGUgaGVhbHRoIGNoZWNrIGludGVydmFsIGFuZCB0aGVcbiAgLy8gZGVwbG95bWVudCByb2xscyBiYWNrLlxuICBpdChcInByZWZpeGVzIGEgaGVhbHRoIGNoZWNrIHBhdGggd2l0aCB0aGUgYXBwJ3MgYmFzZVBhdGhcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChwcmVmaXhXaXRoQmFzZVBhdGgoXCJiYXNlXCIsIFwiL2FwaS9oZWFsdGhcIikpLnRvQmUoXCIvYmFzZS9hcGkvaGVhbHRoXCIpO1xuICAgIGV4cGVjdChwcmVmaXhXaXRoQmFzZVBhdGgoXCIvYmFzZS9cIiwgXCIvYXBpL2hlYWx0aFwiKSkudG9CZShcbiAgICAgIFwiL2Jhc2UvYXBpL2hlYWx0aFwiLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwibGVhdmVzIHRoZSBwYXRoIHVudG91Y2hlZCB3aGVuIHRoZSBhcHAgc2V0cyBubyBiYXNlUGF0aFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KHByZWZpeFdpdGhCYXNlUGF0aCh1bmRlZmluZWQsIFwiL2FwaS9oZWFsdGhcIikpLnRvQmUoXCIvYXBpL2hlYWx0aFwiKTtcbiAgICBleHBlY3QocHJlZml4V2l0aEJhc2VQYXRoKFwiXCIsIFwiL2FwaS9oZWFsdGhcIikpLnRvQmUoXCIvYXBpL2hlYWx0aFwiKTtcbiAgICBleHBlY3QocHJlZml4V2l0aEJhc2VQYXRoKFwiL1wiLCBcIi9hcGkvaGVhbHRoXCIpKS50b0JlKFwiL2FwaS9oZWFsdGhcIik7XG4gIH0pO1xuXG4gIGl0KFwiYWx3YXlzIHJldHVybnMgYSBsZWFkaW5nIHNsYXNoLCB3aGF0ZXZlciB0aGUgcGF0aCBjYW1lIHdpdGhcIiwgKCkgPT4ge1xuICAgIC8vIFRoZSBBTEIgaGVhbHRoIGNoZWNrIGFuZCB0aGUgcmVhZGluZXNzIGNoZWNrIFVSTCBib3RoIG5lZWQgYW4gYWJzb2x1dGVcbiAgICAvLyBwYXRoLCBzbyB0aGUgcmVzdWx0IGNhbid0IGNvbWUgYmFjayBiYXJlLiBXaXRob3V0IGEgYmFzZVBhdGggYSBiYXJlIHBhdGhcbiAgICAvLyB1c2VkIHRvIHBhc3Mgc3RyYWlnaHQgdGhyb3VnaCwgd2hpY2ggY29uY2F0ZW5hdGVkIGludG9cbiAgICAvLyBcImh0dHA6Ly8xMjcuMC4wLjE6MzAwMGFwaS9oZWFsdGhcIiBhcyB0aGUgcmVhZGluZXNzIGNoZWNrIFVSTC5cbiAgICBleHBlY3QocHJlZml4V2l0aEJhc2VQYXRoKFwiYmFzZVwiLCBcImFwaS9oZWFsdGhcIikpLnRvQmUoXCIvYmFzZS9hcGkvaGVhbHRoXCIpO1xuICAgIGV4cGVjdChwcmVmaXhXaXRoQmFzZVBhdGgodW5kZWZpbmVkLCBcImFwaS9oZWFsdGhcIikpLnRvQmUoXCIvYXBpL2hlYWx0aFwiKTtcbiAgICBleHBlY3QocHJlZml4V2l0aEJhc2VQYXRoKFwiXCIsIFwiYXBpL2hlYWx0aFwiKSkudG9CZShcIi9hcGkvaGVhbHRoXCIpO1xuICB9KTtcblxuICAvLyBUaGUgcGF0aCBpcyB3aGF0IHRoZSBhcHAgcm91dGVzLCB3aXRob3V0IGJhc2VQYXRoLCBhbmQgaXQgaXMgcHJlZml4ZWRcbiAgLy8gd2hldGhlciBvciBub3QgaXQgYWxyZWFkeSBsb29rcyBwcmVmaXhlZDogYW4gYXBwIGNhbiByb3V0ZSBcIi9iYXNlL2Jhc2UvLi4uXCJcbiAgLy8gbGVnaXRpbWF0ZWx5LCBzbyB0cmVhdGluZyBhIGxlYWRpbmcgXCIvYmFzZVwiIGFzIGFscmVhZHktcHJlZml4ZWQgd291bGQgbWFrZVxuICAvLyB0aGF0IHBhdGggdW5yZWFjaGFibGUgYW5kIGdpdmUgdGhlIHByb3AgdHdvIG1lYW5pbmdzLiBVc2VycyB3aG8gcHJlZml4ZWRcbiAgLy8gYGhlYWx0aENoZWNrUGF0aGAgYnkgaGFuZCB0byB3b3JrIGFyb3VuZCB0aGUgbWlzc2luZyBwcmVmaXggZHJvcCBpdCBvblxuICAvLyB1cGdyYWRlIOKAlCBkb2N1bWVudGVkIGluIGRvY3MvYnJlYWtpbmctY2hhbmdlcy5tZCB1bmRlciAwLjYuMC5cbiAgaXQoXCJwcmVmaXhlcyBhIHBhdGggdGhhdCBhbHJlYWR5IGxvb2tzIHByZWZpeGVkXCIsICgpID0+IHtcbiAgICBleHBlY3QocHJlZml4V2l0aEJhc2VQYXRoKFwiYmFzZVwiLCBcIi9iYXNlL2FwaS9oZWFsdGhcIikpLnRvQmUoXG4gICAgICBcIi9iYXNlL2Jhc2UvYXBpL2hlYWx0aFwiLFxuICAgICk7XG4gIH0pO1xuXG4gIC8vIEEgYHRyYWlsaW5nU2xhc2g6IHRydWVgIGFwcCByZWRpcmVjdHMgXCIvYXBpL2hlYWx0aFwiIHRvIFwiL2FwaS9oZWFsdGgvXCIgd2l0aCBhXG4gIC8vIDMwOCwgd2hpY2ggYW4gQUxCIGhlYWx0aCBjaGVjayBkb2Vzbid0IGNvdW50IGFzIGhlYWx0aHksIHNvIHRoZSBzbGFzaCB0aGVcbiAgLy8gdXNlciB3cm90ZSBoYXMgdG8gc3Vydml2ZS5cbiAgaXQoXCJwcmVzZXJ2ZXMgYSB0cmFpbGluZyBzbGFzaFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KHByZWZpeFdpdGhCYXNlUGF0aChcImJhc2VcIiwgXCIvYXBpL2hlYWx0aC9cIikpLnRvQmUoXG4gICAgICBcIi9iYXNlL2FwaS9oZWFsdGgvXCIsXG4gICAgKTtcbiAgICBleHBlY3QocHJlZml4V2l0aEJhc2VQYXRoKHVuZGVmaW5lZCwgXCIvYXBpL2hlYWx0aC9cIikpLnRvQmUoXCIvYXBpL2hlYWx0aC9cIik7XG4gIH0pO1xuXG4gIGl0KFwiaGFuZGxlcyBhIG5lc3RlZCBiYXNlUGF0aCwgYXMgUkVHSU9OQUxfRlVOQ1RJT05TIGNhbiBwcm9kdWNlXCIsICgpID0+IHtcbiAgICAvLyBBbiBhcHAgYXQgdGhlIGBwcm9kYCBzdGFnZSBuZXN0ZWQgdW5kZXIgXCIvYmFzZVwiIHNldHMgYGJhc2VQYXRoOlxuICAgIC8vIFwiL3Byb2QvYmFzZVwiYCwgYW5kIHRoZSByZWFkaW5lc3MgY2hlY2sgaGl0cyB0aGUgbG9jYWwgc2VydmVyLCBzbyB0aGVcbiAgICAvLyB3aG9sZSBwcmVmaXggaGFzIHRvIGJlIHRoZXJlLlxuICAgIGV4cGVjdChwcmVmaXhXaXRoQmFzZVBhdGgoXCIvcHJvZC9iYXNlXCIsIFwiL2FwaS9oZWFsdGhcIikpLnRvQmUoXG4gICAgICBcIi9wcm9kL2Jhc2UvYXBpL2hlYWx0aFwiLFxuICAgICk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwiYmFzZVBhdGhQcmVmaXhcIiwgKCkgPT4ge1xuICBpdChcInNwZWxscyBldmVyeSBiYXNlUGF0aCB0aGUgd2F5IE5leHQuanMgZG9lc1wiLCAoKSA9PiB7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBbXCIvYmFzZVwiLCBcImJhc2VcIiwgXCIvYmFzZS9cIiwgXCIvL2Jhc2UvL1wiXSkge1xuICAgICAgZXhwZWN0KGJhc2VQYXRoUHJlZml4KHZhbHVlKSkudG9CZShcIi9iYXNlXCIpO1xuICAgIH1cbiAgICBleHBlY3QoYmFzZVBhdGhQcmVmaXgoXCIvYS9iL1wiKSkudG9CZShcIi9hL2JcIik7XG4gICAgZXhwZWN0KGJhc2VQYXRoUHJlZml4KFwiL1wiKSkudG9CZShcIlwiKTtcbiAgICBleHBlY3QoYmFzZVBhdGhQcmVmaXgodW5kZWZpbmVkKSkudG9CZShcIlwiKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJyZWxhdGl2ZUFzc2V0UHJlZml4XCIsICgpID0+IHtcbiAgaXQoXCJyZWFkcyBhIHBhdGgtc3R5bGUgYXNzZXRQcmVmaXggd2l0aCBvbmUgbGVhZGluZyBzbGFzaFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KHJlbGF0aXZlQXNzZXRQcmVmaXgoXCIvY3VzdG9tLWFzc2V0LXByZWZpeFwiKSkudG9CZShcbiAgICAgIFwiL2N1c3RvbS1hc3NldC1wcmVmaXhcIixcbiAgICApO1xuICAgIGV4cGVjdChyZWxhdGl2ZUFzc2V0UHJlZml4KFwiY3VzdG9tLWFzc2V0LXByZWZpeC9cIikpLnRvQmUoXG4gICAgICBcIi9jdXN0b20tYXNzZXQtcHJlZml4XCIsXG4gICAgKTtcbiAgICBleHBlY3QocmVsYXRpdmVBc3NldFByZWZpeChcIlwiKSkudG9CZShcIlwiKTtcbiAgICBleHBlY3QocmVsYXRpdmVBc3NldFByZWZpeChcIi9cIikpLnRvQmUoXCJcIik7XG4gIH0pO1xuXG4gIGl0KFwiaWdub3JlcyBhbiBhYnNvbHV0ZSBhc3NldFByZWZpeFwiLCAoKSA9PiB7XG4gICAgLy8gSXQgbmFtZXMgYW4gb3JpZ2luIGNkay1uZXh0anMgZG9lcyBub3Qgc2VydmUsIHNvIHRoZXJlIGlzIG5vIGJlaGF2aW9yIHRvXG4gICAgLy8gYWRkIGFuZCBub3RoaW5nIHRoZSBkaXN0cmlidXRpb24gY291bGQgZ2V0IHdyb25nLlxuICAgIGZvciAoY29uc3QgYXNzZXRQcmVmaXggb2YgW1xuICAgICAgXCJodHRwczovL2Nkbi5leGFtcGxlLmNvbVwiLFxuICAgICAgXCJodHRwOi8vY2RuLmV4YW1wbGUuY29tL3hcIixcbiAgICAgIFwiLy9jZG4uZXhhbXBsZS5jb21cIixcbiAgICBdKSB7XG4gICAgICBleHBlY3QocmVsYXRpdmVBc3NldFByZWZpeChhc3NldFByZWZpeCkpLnRvQmUoXCJcIik7XG4gICAgfVxuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcImFzc2V0UHJlZml4UGF0aFwiLCAoKSA9PiB7XG4gIGl0KFwicmVwb3J0cyB0aGUgcGF0aCBhbiBhYnNvbHV0ZSBhc3NldFByZWZpeCBjYXJyaWVzIHRvb1wiLCAoKSA9PiB7XG4gICAgLy8gYHJlbGF0aXZlQXNzZXRQcmVmaXhgIGFuc3dlcnMgXCJpcyB0aGlzIGEgcHJlZml4IHRoZSByZWdpb25hbCBOZXh0anNUeXBlc1xuICAgIC8vIGNhbm5vdCBzZXJ2ZVwiOyB0aGlzIGFuc3dlcnMgXCJ3aGF0IHBhdGggZG8gYnVuZGxlIFVSTHMgY2FycnlcIiwgYW5kIGFuXG4gICAgLy8gYWJzb2x1dGUgcHJlZml4IHdpdGggYSBwYXRoIGNhcnJpZXMgb25lIOKAlCBgbmV4dCBidWlsZGAgY29tcGlsZXMgYVxuICAgIC8vIHJld3JpdGUgZm9yIGl0LCBzbyBgbmV4dCBzdGFydGAgc2VydmVzIGJ1bmRsZXMgdGhlcmUuIFNlZVxuICAgIC8vIGB0ZXN0L2UyZS9hcHAtZGlyL2Fzc2V0LXByZWZpeC1hYnNvbHV0ZWAuXG4gICAgZm9yIChjb25zdCBbYXNzZXRQcmVmaXgsIHBhdGhdIG9mIFtcbiAgICAgIFtcImh0dHBzOi8vZXhhbXBsZS52ZXJjZWwuc2gvY3VzdG9tLWFzc2V0LXByZWZpeFwiLCBcIi9jdXN0b20tYXNzZXQtcHJlZml4XCJdLFxuICAgICAgW1wiLy9leGFtcGxlLnZlcmNlbC5zaC9jZG4vXCIsIFwiL2NkblwiXSxcbiAgICAgIFtcImh0dHBzOi8vZXhhbXBsZS52ZXJjZWwuc2gvXCIsIFwiXCJdLFxuICAgICAgW1wiaHR0cHM6Ly9leGFtcGxlLnZlcmNlbC5zaFwiLCBcIlwiXSxcbiAgICAgIFtcIi9jZG5cIiwgXCIvY2RuXCJdLFxuICAgICAgW1wiXCIsIFwiXCJdLFxuICAgIF0gYXMgY29uc3QpIHtcbiAgICAgIGV4cGVjdChhc3NldFByZWZpeFBhdGgoYXNzZXRQcmVmaXgpKS50b0JlKHBhdGgpO1xuICAgIH1cbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJpc0Fzc2V0UHJlZml4VW5zZXJ2ZWRcIiwgKCkgPT4ge1xuICBjb25zdCBSRUdJT05BTCA9IFtcbiAgICBOZXh0anNUeXBlLlJFR0lPTkFMX0ZVTkNUSU9OUyxcbiAgICBOZXh0anNUeXBlLlJFR0lPTkFMX0NPTlRBSU5FUlMsXG4gIF07XG5cbiAgaXQuZWFjaChSRUdJT05BTCkoXG4gICAgXCIlczogZG9lcyBub3QgZmxhZyB0aGUgYXNzZXRQcmVmaXggTmV4dC5qcyBkZXJpdmVzIGZyb20gYmFzZVBhdGhcIixcbiAgICAobmV4dGpzVHlwZSkgPT4ge1xuICAgICAgLy8gVGhlIHJlZ3Jlc3Npb24gdGhpcyBmdW5jdGlvbiB3YXMgZXh0cmFjdGVkIGZvci4gQW4gYXBwIHRoYXQgc2V0cyBvbmx5XG4gICAgICAvLyBgYmFzZVBhdGg6IFwiL3Byb2RcImAg4oCUIGBleGFtcGxlcy9yZWdpb25hbC1mdW5jdGlvbnNgLCBhbmQgZXZlcnkgcmVnaW9uYWxcbiAgICAgIC8vIGRlcGxveW1lbnQgd2l0aCBhIGJhc2VQYXRoIOKAlCBnZXRzXG4gICAgICAvLyBge1wiYXNzZXRQcmVmaXhcIjpcIi9wcm9kXCIsXCJiYXNlUGF0aFwiOlwiL3Byb2RcIn1gIGluXG4gICAgICAvLyBgcmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb25gLCBiZWNhdXNlIE5leHQuanMgcmVzb2x2ZXMgb25lIGZyb20gdGhlIG90aGVyLlxuICAgICAgLy8gRmxhZ2dpbmcgdGhhdCB0b2xkIHVzZXJzIHRoZWlyIGJ1bmRsZXMgd291bGQgNDA0IGF0IHRoZSBvbmUgcGF0aCB0aGF0IGRvZXNcbiAgICAgIC8vIHNlcnZlIHRoZW0sIG9uIGV2ZXJ5IHN5bnRoLlxuICAgICAgZXhwZWN0KGlzQXNzZXRQcmVmaXhVbnNlcnZlZChuZXh0anNUeXBlLCBcIi9wcm9kXCIsIFwicHJvZFwiKSkudG9CZShmYWxzZSk7XG4gICAgICAvLyBCb3RoIHNpZGVzIGFycml2ZSBpbiBkaWZmZXJlbnQgc2hhcGVzIOKAlCB0aGUgYXNzZXRQcmVmaXggcmVhZGVyIGFkZHMgYVxuICAgICAgLy8gbGVhZGluZyBzbGFzaCwgdGhlIGJhc2VQYXRoIHJlYWRlciBzdHJpcHMgb25lIOKAlCBzbyB0aGUgY29tcGFyaXNvbiBoYXMgdG9cbiAgICAgIC8vIG5vcm1hbGl6ZSByYXRoZXIgdGhhbiBjb21wYXJlIHN0cmluZ3MuXG4gICAgICBleHBlY3QoaXNBc3NldFByZWZpeFVuc2VydmVkKG5leHRqc1R5cGUsIFwiL3Byb2RcIiwgXCIvcHJvZC9cIikpLnRvQmUoZmFsc2UpO1xuICAgICAgZXhwZWN0KGlzQXNzZXRQcmVmaXhVbnNlcnZlZChuZXh0anNUeXBlLCBcIi9hL2JcIiwgXCJhL2JcIikpLnRvQmUoZmFsc2UpO1xuICAgIH0sXG4gICk7XG5cbiAgaXQuZWFjaChSRUdJT05BTCkoXCIlczogZmxhZ3MgYSBwcmVmaXggbm90aGluZyBzZXJ2ZXNcIiwgKG5leHRqc1R5cGUpID0+IHtcbiAgICAvLyBBIGdlbnVpbmVseSBkaWZmZXJlbnQgcHJlZml4IGlzIHRoZSBjYXNlIHRoZSB3YXJuaW5nIGV4aXN0cyBmb3I6IGJ1bmRsZXMgYXJlXG4gICAgLy8gcmVxdWVzdGVkIGF0IGAvY2RuL19uZXh0L3N0YXRpYy8uLi5gIGFuZCBuZWl0aGVyIEFQSSBHYXRld2F5J3NcbiAgICAvLyBgX25leHQvc3RhdGljYCByZXNvdXJjZSBub3IgdGhlIGNvbnRhaW5lcidzIG93biBmaWxlcyBhbnN3ZXIgdGhlcmUuXG4gICAgZXhwZWN0KGlzQXNzZXRQcmVmaXhVbnNlcnZlZChuZXh0anNUeXBlLCBcIi9jZG5cIiwgXCJwcm9kXCIpKS50b0JlKHRydWUpO1xuICAgIGV4cGVjdChpc0Fzc2V0UHJlZml4VW5zZXJ2ZWQobmV4dGpzVHlwZSwgXCIvY2RuXCIsIHVuZGVmaW5lZCkpLnRvQmUodHJ1ZSk7XG4gICAgLy8gQSBwcmVmaXggKnVuZGVyKiB0aGUgYmFzZVBhdGggaXMgc3RpbGwgYSBkaWZmZXJlbnQgcGF0aCwgbm90IGEgbWF0Y2guXG4gICAgZXhwZWN0KGlzQXNzZXRQcmVmaXhVbnNlcnZlZChuZXh0anNUeXBlLCBcIi9wcm9kL2NkblwiLCBcInByb2RcIikpLnRvQmUodHJ1ZSk7XG4gIH0pO1xuXG4gIGl0LmVhY2goR0xPQkFMKShcbiAgICBcIiVzOiBmbGFncyBub3RoaW5nLCBoYXZpbmcgYSBiZWhhdmlvciBmb3IgaXRcIixcbiAgICAobmV4dGpzVHlwZSkgPT4ge1xuICAgICAgLy8gYE5leHRqc0Rpc3RyaWJ1dGlvbmAgYWRkcyBhIGNhY2hlIGJlaGF2aW9yIGZvciB0aGUgcHJlZml4LCBzbyBvbiB0aGVzZSB0eXBlc1xuICAgICAgLy8gYW55IHByZWZpeCBpcyBzZXJ2ZWQuXG4gICAgICBleHBlY3QoaXNBc3NldFByZWZpeFVuc2VydmVkKG5leHRqc1R5cGUsIFwiL2NkblwiLCBcInByb2RcIikpLnRvQmUoZmFsc2UpO1xuICAgICAgZXhwZWN0KGlzQXNzZXRQcmVmaXhVbnNlcnZlZChuZXh0anNUeXBlLCBcIi9jZG5cIiwgdW5kZWZpbmVkKSkudG9CZShmYWxzZSk7XG4gICAgfSxcbiAgKTtcblxuICBpdC5lYWNoKE9iamVjdC52YWx1ZXMoTmV4dGpzVHlwZSkpKFxuICAgIFwiJXM6IGZsYWdzIG5vdGhpbmcgd2hlbiB0aGVyZSBpcyBubyBwcmVmaXhcIixcbiAgICAobmV4dGpzVHlwZSkgPT4ge1xuICAgICAgLy8gYHJlbGF0aXZlQXNzZXRQcmVmaXhgIGFscmVhZHkgcmVkdWNlcyBhbiBhYnNvbHV0ZSBwcmVmaXggdG8gYFwiXCJgLFxuICAgICAgLy8gd2hpY2ggaXMgdGhlIHN1cHBvcnRlZCB3YXkgdG8gc2VydmUgYXNzZXRzIGZyb20gYW5vdGhlciBvcmlnaW4uXG4gICAgICBleHBlY3QoaXNBc3NldFByZWZpeFVuc2VydmVkKG5leHRqc1R5cGUsIFwiXCIsIFwicHJvZFwiKSkudG9CZShmYWxzZSk7XG4gICAgICBleHBlY3QoaXNBc3NldFByZWZpeFVuc2VydmVkKG5leHRqc1R5cGUsIFwiXCIsIHVuZGVmaW5lZCkpLnRvQmUoZmFsc2UpO1xuICAgIH0sXG4gICk7XG59KTtcblxuZGVzY3JpYmUoXCJyZXNvbHZlQmFzZVBhdGhcIiwgKCkgPT4ge1xuICBkZXNjcmliZS5lYWNoKE9iamVjdC52YWx1ZXMoTmV4dGpzVHlwZSkpKFwiJXNcIiwgKG5leHRqc1R5cGUpID0+IHtcbiAgICBpdChcInJlc29sdmVzIHRvIHVuZGVmaW5lZCB3aGVuIGJvdGggYXJlIHVuc2V0XCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSkpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgXCJcIiwgXCJcIikpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIC8vIE5vcm1hbGl6ZXMgdG8gZW1wdHksIHNvIGl0J3MgdGhlIHNhbWUgYXMgdW5zZXQgcmF0aGVyIHRoYW4gYSBwcmVmaXguXG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKG5leHRqc1R5cGUsIFwiL1wiKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgLy8gT25lIHNoYXBlIG91dCwgd2hhdGV2ZXIgc2hhcGUgY2FtZSBpbjogY29uc3VtZXJzIHRoYXQgbmVlZCBhIGxlYWRpbmdcbiAgICAvLyBzbGFzaCAob25seSBgTmV4dGpzRGlzdHJpYnV0aW9uYCdzIHBhdGggcGF0dGVybnMpIGFkZCB0aGVpciBvd24sIHNvXG4gICAgLy8gbm90aGluZyBkb3duc3RyZWFtIGhhcyB0byByZS1ub3JtYWxpemUuXG4gICAgaXQoXCJub3JtYWxpemVzIHRoZSBwcm9wIHdoZW4gaXQgbWF0Y2hlcyB0aGUgYXBwXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgXCIvYmFzZVwiLCBcIi9iYXNlXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgXCJiYXNlXCIsIFwiL2Jhc2VcIikpLnRvQmUoXCJiYXNlXCIpO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCBcIi9iYXNlL1wiLCBcIi9iYXNlXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgXCJiYXNlLy9cIiwgXCIvYmFzZVwiKSkudG9CZShcImJhc2VcIik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlLmVhY2goR0xPQkFMKShcIiVzXCIsIChuZXh0anNUeXBlKSA9PiB7XG4gICAgLy8gQ2xvdWRGcm9udCB1c2VzIHRoZSByZXF1ZXN0IHBhdGggdmVyYmF0aW0gYXMgdGhlIFMzIG9iamVjdCBrZXksIHNvIHRoZVxuICAgIC8vIHByb3AgaGFzIHRvIGJlIHRoZSBwcmVmaXggdGhlIGFwcCBlbWl0cyDigJQgdGhlcmUncyBleGFjdGx5IG9uZSB2YWxpZCB2YWx1ZSxcbiAgICAvLyB3aGljaCBtYWtlcyB0aGUgYXBwJ3MgY29uZmlnIHRoZSBzb3VyY2Ugb2YgdHJ1dGguXG4gICAgaXQoXCJkZXJpdmVzIHRoZSBwcm9wIGZyb20gdGhlIGFwcCdzIGJhc2VQYXRoXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgdW5kZWZpbmVkLCBcIi9iYXNlXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgXCJcIiwgXCJiYXNlXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgdW5kZWZpbmVkLCBcIi90ZWFtL2FwcC9cIikpLnRvQmUoXG4gICAgICAgIFwidGVhbS9hcHBcIixcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdChcInJlamVjdHMgdGhlIHByb3Agc2V0dGluZyBhIGJhc2VQYXRoIHRoZSBhcHAgZG9lc24ndFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT4gcmVzb2x2ZUJhc2VQYXRoKG5leHRqc1R5cGUsIFwiL2Jhc2VcIikpLnRvVGhyb3coXG4gICAgICAgIC9DbG91ZEZyb250IHNlcnZlcyBzdGF0aWMgYXNzZXRzIHN0cmFpZ2h0IGZyb20gUzMvLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KFwicmVqZWN0cyB0d28gZGlmZmVyZW50IHZhbHVlc1wiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT4gcmVzb2x2ZUJhc2VQYXRoKG5leHRqc1R5cGUsIFwiL2FcIiwgXCIvYlwiKSkudG9UaHJvdyhcbiAgICAgICAgJ3Byb3AgaXMgXCIvYVwiIGJ1dCB5b3VyIE5leHQuanMgYXBwXFwncyBjb25maWcgc2V0cyBgYmFzZVBhdGhgIHRvIFwiL2JcIicsXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShOZXh0anNUeXBlLlJFR0lPTkFMX0ZVTkNUSU9OUywgKCkgPT4ge1xuICAgIGNvbnN0IFJGID0gTmV4dGpzVHlwZS5SRUdJT05BTF9GVU5DVElPTlM7XG4gICAgY29uc3Qgc3RhZ2UgPSAobmFtZTogc3RyaW5nKSA9PiAoe1xuICAgICAgc3RyaXBwZWRQcmVmaXg6IG5hbWUsXG4gICAgICBjdXN0b21Eb21haW46IGZhbHNlLFxuICAgIH0pO1xuICAgIGNvbnN0IGRvbWFpbiA9IChtYXBwaW5nID0gXCJcIikgPT4gKHtcbiAgICAgIHN0cmlwcGVkUHJlZml4OiBtYXBwaW5nLFxuICAgICAgY3VzdG9tRG9tYWluOiB0cnVlLFxuICAgIH0pO1xuICAgIGxldCB3YXJuOiBqZXN0LlNweUluc3RhbmNlO1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgd2FybiA9IGplc3Quc3B5T24oY29uc29sZSwgXCJ3YXJuXCIpLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7fSk7XG4gICAgfSk7XG4gICAgYWZ0ZXJFYWNoKCgpID0+IHdhcm4ubW9ja1Jlc3RvcmUoKSk7XG5cbiAgICAvLyBBUEkgR2F0ZXdheSBzdHJpcHMgdGhlIHN0YWdlIGJlZm9yZSBtYXRjaGluZyByZXNvdXJjZXMsIHNvIGFuIGFwcCBzZXJ2ZWRcbiAgICAvLyBhdCB0aGUgZGVmYXVsdCBgcHJvZGAgc3RhZ2Ugc2V0cyBiYXNlUGF0aDogXCIvcHJvZFwiIGFuZCBpdHMgcmVzb3VyY2VzIGxpdmVcbiAgICAvLyBhdCB0aGUgcm9vdC4gTW91bnRpbmcgdGhlbSB1bmRlciBcInByb2RcIiB3b3VsZCBuZXN0IGV2ZXJ5IHJlc291cmNlIHVuZGVyIGFcbiAgICAvLyBwYXRoIHRoZSBzdGFnZSBhbHJlYWR5IGNvbnN1bWVkLlxuICAgIC8vIEEgZG9tYWluIGF0dGFjaGVkIHdpdGggYGFkZERvbWFpbk5hbWUoeyBiYXNlUGF0aDogXCJ2MVwiIH0pYCBzdHJpcHMgXCIvdjFcIlxuICAgIC8vIHdoZXJlIHN5bnRoIGNhbid0IHNlZSBpdDsgXCIvXCIgaXMgaG93IHRoZSB1c2VyIHNheXMgc28uIERlcml2aW5nIHdvdWxkXG4gICAgLy8gbW91bnQgZXZlcnl0aGluZyB1bmRlciBcInYxXCIsIHdoaWNoIHRoZSBzdHJpcHBlZCByZXF1ZXN0cyBuZXZlciByZWFjaC5cbiAgICBpdCgnbW91bnRzIGF0IHRoZSByb290IHdoZW4gdGhlIHByb3AgaXMgXCIvXCIsIGluc3RlYWQgb2YgZGVyaXZpbmcnLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCBcIi9cIiwgXCIvdjFcIikpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgoUkYsIFwiL1wiLCBcIi92MVwiLCBkb21haW4oKSkpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgoUkYsIFwiL1wiLCBcIi9wcm9kL2Jhc2VcIikpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIC8vIFVuc2V0IHN0aWxsIGRlcml2ZXMuXG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCB1bmRlZmluZWQsIFwiL3YxXCIpKS50b0JlKFwidjFcIik7XG4gICAgfSk7XG5cbiAgICBpdChcIm1vdW50cyBhbiBhcHAgd2hvc2UgYmFzZVBhdGggaXMgdGhlIHN0YWdlIGF0IHRoZSByb290XCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgoUkYsIHVuZGVmaW5lZCwgXCIvcHJvZFwiKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlQmFzZVBhdGgoUkYsIHVuZGVmaW5lZCwgXCIvdGVzdFwiLCBzdGFnZShcInRlc3RcIikpLFxuICAgICAgKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgICBleHBlY3Qod2Fybikubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KFwibW91bnRzIHRoZSByZXN0IG9mIGEgYmFzZVBhdGggbmVzdGVkIGJlbG93IHRoZSBzdGFnZVwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCB1bmRlZmluZWQsIFwiL3Byb2QvYmFzZVwiKSkudG9CZShcImJhc2VcIik7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCB1bmRlZmluZWQsIFwiL3YyL2EvYlwiLCBzdGFnZShcInYyXCIpKSkudG9CZShcbiAgICAgICAgXCJhL2JcIixcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgY2FzZSB0aGF0IHVzZWQgdG8gNDA0IGV2ZXJ5IGJ1bmRsZTogYSBjdXN0b20gZG9tYWluIG1hcHBlZCBhdCB0aGUgcm9vdFxuICAgIC8vIHN0cmlwcyBub3RoaW5nLCBzbyB0aGUgYXBwJ3MgYmFzZVBhdGggaXMgYSByZWFsIHJlc291cmNlIHBhdGgsIGFuZCBsZWZ0IGF0XG4gICAgLy8gdGhlIHJvb3QgYF9uZXh0L3N0YXRpY2AgZmVsbCB0aHJvdWdoIHRvIHRoZSBMYW1iZGEgY2F0Y2gtYWxsLlxuICAgIGl0KFwibW91bnRzIGFuIGFwcCB1bmRlciBpdHMgd2hvbGUgYmFzZVBhdGggd2hlbiBub3RoaW5nIHN0cmlwcyBpdFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCB1bmRlZmluZWQsIFwiL2RvY3NcIiwgZG9tYWluKCkpKS50b0JlKFwiZG9jc1wiKTtcbiAgICAgIGV4cGVjdCh3YXJuKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzdHJpcHMgYSBjdXN0b20gZG9tYWluJ3MgYmFzZSBwYXRoIG1hcHBpbmcgbGlrZSBhIHN0YWdlXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUJhc2VQYXRoKFJGLCB1bmRlZmluZWQsIFwiL2FwcFwiLCBkb21haW4oXCJhcHBcIikpLFxuICAgICAgKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCB1bmRlZmluZWQsIFwiL2FwcC9kb2NzXCIsIGRvbWFpbihcImFwcFwiKSkpLnRvQmUoXG4gICAgICAgIFwiZG9jc1wiLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KFwibWF0Y2hlcyB0aGUgc3RhZ2Ugb24gYSBzZWdtZW50IGJvdW5kYXJ5XCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgoUkYsIHVuZGVmaW5lZCwgXCIvcHJvZHVjdGlvblwiLCBkb21haW4oKSkpLnRvQmUoXG4gICAgICAgIFwicHJvZHVjdGlvblwiLFxuICAgICAgKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgoUkYsIHVuZGVmaW5lZCwgXCIvcHJvZHVjdGlvblwiLCBzdGFnZShcInByb2RcIikpKS50b0JlKFxuICAgICAgICBcInByb2R1Y3Rpb25cIixcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyBXaXRob3V0IGEgY3VzdG9tIGRvbWFpbiB0aGUgYXBwJ3Mgb3duIGxpbmtzIG1pc3MgdGhlIHN0YWdlLCB3aGljaCBzeW50aFxuICAgIC8vIGNhbiBzYXkgYnV0IG5vdCBmaXggLSBhIGRvbWFpbiBhdHRhY2hlZCB3aXRoIGBhZGREb21haW5OYW1lYCBpcyBpbnZpc2libGUuXG4gICAgaXQoXCJ3YXJucyB3aGVuIGFuIGV4ZWN1dGUtYXBpIGFwcCdzIGJhc2VQYXRoIGxhY2tzIHRoZSBzdGFnZVwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCB1bmRlZmluZWQsIFwiL2RvY3NcIikpLnRvQmUoXCJkb2NzXCIpO1xuICAgICAgZXhwZWN0KHdhcm4pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBleHBlY3Quc3RyaW5nQ29udGFpbmluZygnU2V0IGBiYXNlUGF0aDogXCIvcHJvZC9kb2NzXCJgJyksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoXCJ3YXJucyB3aGVuIGEgY3VzdG9tIGRvbWFpbidzIGJhc2UgcGF0aCBtYXBwaW5nIGlzIG1pc3NpbmcgZnJvbSB0aGUgYXBwJ3MgYmFzZVBhdGhcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChSRiwgdW5kZWZpbmVkLCBcIi9kb2NzXCIsIGRvbWFpbihcInYxXCIpKSkudG9CZShcbiAgICAgICAgXCJkb2NzXCIsXG4gICAgICApO1xuICAgICAgZXhwZWN0KHdhcm4pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBleHBlY3Quc3RyaW5nQ29udGFpbmluZygnU2V0IGBiYXNlUGF0aDogXCIvdjEvZG9jc1wiYCcpLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KFwiZGVyaXZlcyBub3RoaW5nIHdoZW4gdGhlIHN0YWdlIGlzIGEgdG9rZW5cIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlQmFzZVBhdGgoUkYsIHVuZGVmaW5lZCwgXCIvZG9jc1wiLCB7IGN1c3RvbURvbWFpbjogZmFsc2UgfSksXG4gICAgICApLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGV4cGVjdCh3YXJuKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIHN0cmlwcGVkIHByZWZpeCBpcyBwYXJ0IG9mIHdoYXQgdGhlIGFwcCBlbWl0cyBidXQgbmV2ZXIgcGFydCBvZiB0aGVcbiAgICAvLyByZXNvdXJjZSBwYXRoLCBzbyBhbiBhcHAgYXQgdGhlIGBwcm9kYCBzdGFnZSBuZXN0ZWQgdW5kZXIgXCIvYmFzZVwiIHNldHNcbiAgICAvLyBiYXNlUGF0aDogXCIvcHJvZC9iYXNlXCIgYW5kIHRoZSBwcm9wIHRvIFwiL2Jhc2VcIi5cbiAgICBpdChcImFjY2VwdHMgYW4gYXBwIGJhc2VQYXRoIHRoYXQgZW5kcyB3aXRoIHRoZSBwcm9wXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUJhc2VQYXRoKE5leHRqc1R5cGUuUkVHSU9OQUxfRlVOQ1RJT05TLCBcIi9iYXNlXCIsIFwiL3Byb2QvYmFzZVwiKSxcbiAgICAgICkudG9CZShcImJhc2VcIik7XG4gICAgfSk7XG5cbiAgICBpdChcIm9ubHkgYWNjZXB0cyB0aGUgcHJvcCBhcyBhIHdob2xlIHRyYWlsaW5nIHBhdGggc2VnbWVudFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT5cbiAgICAgICAgcmVzb2x2ZUJhc2VQYXRoKE5leHRqc1R5cGUuUkVHSU9OQUxfRlVOQ1RJT05TLCBcIi9zZVwiLCBcIi9wcm9kL2Jhc2VcIiksXG4gICAgICApLnRvVGhyb3coL25lc3RzIGV2ZXJ5IEFQSSBHYXRld2F5IHJlc291cmNlIHVuZGVyIHRoYXQgcGF0aC8pO1xuICAgICAgLy8gTGVhZGluZywgbm90IHRyYWlsaW5nOiBBUEkgR2F0ZXdheSBzdHJpcHMgdGhlIHN0YWdlLCBzbyB0aGUgYXBwIHdvdWxkXG4gICAgICAvLyBlbWl0IFwiL3Byb2QvLi4uXCIgd2hpbGUgdGhlIHJlc291cmNlcyBsaXZlIHVuZGVyIFwiL3Byb2QvYmFzZS8uLi5cIi5cbiAgICAgIGV4cGVjdCgoKSA9PlxuICAgICAgICByZXNvbHZlQmFzZVBhdGgoTmV4dGpzVHlwZS5SRUdJT05BTF9GVU5DVElPTlMsIFwiL3Byb2RcIiwgXCIvcHJvZC9iYXNlXCIpLFxuICAgICAgKS50b1Rocm93KC9uZXN0cyBldmVyeSBBUEkgR2F0ZXdheSByZXNvdXJjZSB1bmRlciB0aGF0IHBhdGgvKTtcbiAgICB9KTtcblxuICAgIC8vIEFueSBvdGhlciBsZWFkaW5nIHByZWZpeCBpcyBzZXJ2ZWQgYXQgYC9wcm9kL2Jhc2UvLi4uYCB3aGlsZSB0aGUgYXBwXG4gICAgLy8gbGlua3MgdG8gYC9mb28vYmFzZS8uLi5gLCBzbyBvbmx5IHRoZSBzdHJpcHBlZCBwcmVmaXggaXRzZWxmIHF1YWxpZmllcy5cbiAgICAvLyBCZWhpbmQgYSBjdXN0b20gZG9tYWluIHN5bnRoIGNhbiBzZWUsIHRoYXQgaXMgY2VydGFpbi5cbiAgICBpdChcIm9ubHkgYWNjZXB0cyB0aGUgc3RyaXBwZWQgcHJlZml4IGluIGZyb250IG9mIHRoZSBwcm9wXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgoUkYsIFwiL2RvY3NcIiwgXCIvYXBwL2RvY3NcIiwgZG9tYWluKFwiYXBwXCIpKSkudG9CZShcbiAgICAgICAgXCJkb2NzXCIsXG4gICAgICApO1xuICAgICAgZXhwZWN0KCgpID0+XG4gICAgICAgIHJlc29sdmVCYXNlUGF0aChSRiwgXCIvZG9jc1wiLCBcIi9wcm9kL2RvY3NcIiwgZG9tYWluKFwiYXBwXCIpKSxcbiAgICAgICkudG9UaHJvdygvbmVzdHMgZXZlcnkgQVBJIEdhdGV3YXkgcmVzb3VyY2UgdW5kZXIgdGhhdCBwYXRoLyk7XG4gICAgICAvLyBBIGN1c3RvbSBkb21haW4gbWFwcGVkIGF0IHRoZSByb290IHN0cmlwcyBub3RoaW5nLCBzbyBvbmx5IGVxdWFsaXR5IHdvcmtzLlxuICAgICAgZXhwZWN0KCgpID0+IHJlc29sdmVCYXNlUGF0aChSRiwgXCIvZG9jc1wiLCBcIi92MS9kb2NzXCIsIGRvbWFpbigpKSkudG9UaHJvdyhcbiAgICAgICAgL25lc3RzIGV2ZXJ5IEFQSSBHYXRld2F5IHJlc291cmNlIHVuZGVyIHRoYXQgcGF0aC8sXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLy8gT24gdGhlIGV4ZWN1dGUtYXBpIGVuZHBvaW50IGEgZG9tYWluIGF0dGFjaGVkIGxhdGVyIHdpdGhcbiAgICAvLyBgYWRkRG9tYWluTmFtZSh7IGJhc2VQYXRoOiBcInYxXCIgfSlgIGNhbiBzdHJpcCB0aGUgbGVhZGluZyBwYXJ0LCBhbmQgYW5cbiAgICAvLyBleHBsaWNpdCBwcm9wIHdpbnMsIHNvIGFueSBvdGhlciBsZWFkaW5nIHByZWZpeCB3YXJucyBpbnN0ZWFkLlxuICAgIGl0KFwid2FybnMgb24gYW5vdGhlciBsZWFkaW5nIHByZWZpeCB3aGVuIG9ubHkgdGhlIHN0YWdlIGlzIGtub3duXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgoUkYsIFwiL2FwcFwiLCBcIi92MS9hcHBcIikpLnRvQmUoXCJhcHBcIik7XG4gICAgICBleHBlY3Qod2FybikudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgIGV4cGVjdC5zdHJpbmdDb250YWluaW5nKCdhZGREb21haW5OYW1lKHsgYmFzZVBhdGg6IFwidjFcIiB9KScpLFxuICAgICAgKTtcbiAgICAgIHdhcm4ubW9ja0NsZWFyKCk7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCBcIi9iYXNlXCIsIFwiL3Byb2QveC9iYXNlXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgICAgIGV4cGVjdCh3YXJuKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoJ2FkZERvbWFpbk5hbWUoeyBiYXNlUGF0aDogXCJwcm9kL3hcIiB9KScpLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KFwiZmFsbHMgYmFjayB0byBhIHRyYWlsaW5nIHNlZ21lbnQgd2hlbiB0aGUgc3RhZ2UgaXMgYSB0b2tlblwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVCYXNlUGF0aChSRiwgXCIvYmFzZVwiLCBcIi9mb28vYmFzZVwiLCB7IGN1c3RvbURvbWFpbjogZmFsc2UgfSksXG4gICAgICApLnRvQmUoXCJiYXNlXCIpO1xuICAgIH0pO1xuXG4gICAgLy8gQWdyZWVpbmcgd2l0aCB0aGUgYXBwIGlzIG5vdCBlbm91Z2ggd2hlbiB0aGUgdmFsdWUgc3RhcnRzIHdpdGggdGhlIHN0YWdlOlxuICAgIC8vIHJlc291cmNlcyB1bmRlciBcInByb2RcIiBhcmUgb25seSByZWFjaGVkIGF0IFwiL3Byb2QvcHJvZC8uLi5cIi5cbiAgICAvLyBDZXJ0YWluIGJlaGluZCBhIGN1c3RvbSBkb21haW4gc3ludGggY2FuIHNlZTsgb24gdGhlIGV4ZWN1dGUtYXBpXG4gICAgLy8gZW5kcG9pbnQgYW4gYGFkZERvbWFpbk5hbWUoKWAgZG9tYWluIG1hcHBlZCBhdCB0aGUgcm9vdCBtYWtlcyBpdCByaWdodCxcbiAgICAvLyBzbyB0aGVyZSBpdCBvbmx5IHdhcm5zLlxuICAgIGl0KFwicmVqZWN0cyBhIHByb3AgZXF1YWwgdG8gYW4gYXBwIGJhc2VQYXRoIHRoYXQgc3RhcnRzIHdpdGggdGhlIHN0YWdlXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PiByZXNvbHZlQmFzZVBhdGgoUkYsIFwiL2FwcFwiLCBcIi9hcHBcIiwgZG9tYWluKFwiYXBwXCIpKSkudG9UaHJvdyhcbiAgICAgICAgL3N0cmlwcyBcIlxcL2FwcFwiLyxcbiAgICAgICk7XG4gICAgICBleHBlY3QoKCkgPT5cbiAgICAgICAgcmVzb2x2ZUJhc2VQYXRoKFJGLCBcIi9hcHAvYmFzZVwiLCBcIi9hcHAvYmFzZVwiLCBkb21haW4oXCJhcHBcIikpLFxuICAgICAgKS50b1Rocm93KC9MZWF2ZSB0aGUgcHJvcCB1bnNldC8pO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChSRiwgXCIvcHJvZFwiLCBcIi9wcm9kXCIpKS50b0JlKFwicHJvZFwiKTtcbiAgICAgIGV4cGVjdCh3YXJuKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoJ3N0cmlwcyBcIi9wcm9kXCIgYmVmb3JlIG1hdGNoaW5nIHJlc291cmNlcycpLFxuICAgICAgKTtcbiAgICAgIHdhcm4ubW9ja0NsZWFyKCk7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCBcIi9wcm9kL2Jhc2VcIiwgXCIvcHJvZC9iYXNlXCIpKS50b0JlKFwicHJvZC9iYXNlXCIpO1xuICAgICAgZXhwZWN0KHdhcm4pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBleHBlY3Quc3RyaW5nQ29udGFpbmluZyhcImFkZERvbWFpbk5hbWUoKVwiKSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdChcImFjY2VwdHMgYSBtYXRjaGluZyBwcm9wIGFuZCBhcHAgYmFzZVBhdGggbm90aGluZyBzdHJpcHNcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChSRiwgXCIvZG9jc1wiLCBcIi9kb2NzXCIsIGRvbWFpbigpKSkudG9CZShcImRvY3NcIik7XG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVCYXNlUGF0aChSRiwgXCIvcHJvZFwiLCBcIi9wcm9kXCIsIHsgY3VzdG9tRG9tYWluOiBmYWxzZSB9KSxcbiAgICAgICkudG9CZShcInByb2RcIik7XG4gICAgICBleHBlY3Qod2Fybikubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIC8vIE1hdGNoaW5nIHRoZSBhcHAgaXMgdGhlIHVuc2V0IGNhc2UncyBwcm9ibGVtIGFnYWluIHdoZW4gYSBzdGFnZSBvclxuICAgIC8vIG1hcHBpbmcgaXMgc3RyaXBwZWQgdGhhdCB0aGUgYXBwJ3MgYmFzZVBhdGggbGFja3MsIHNvIGl0IHdhcm5zIHRoZSBzYW1lLlxuICAgIGl0KFwid2FybnMgd2hlbiBhIG1hdGNoaW5nIHByb3AgYW5kIGFwcCBiYXNlUGF0aCBsYWNrIHRoZSBzdGFnZVwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCBcIi9wcm9kdWN0aW9uXCIsIFwiL3Byb2R1Y3Rpb25cIikpLnRvQmUoXG4gICAgICAgIFwicHJvZHVjdGlvblwiLFxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3YXJuKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoJ1NldCBgYmFzZVBhdGg6IFwiL3Byb2QvcHJvZHVjdGlvblwiYCcpLFxuICAgICAgKTtcbiAgICAgIHdhcm4ubW9ja0NsZWFyKCk7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCBcIi9kb2NzXCIsIFwiL2RvY3NcIiwgZG9tYWluKFwidjFcIikpKS50b0JlKFwiZG9jc1wiKTtcbiAgICAgIGV4cGVjdCh3YXJuKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoJ1NldCBgYmFzZVBhdGg6IFwiL3YxL2RvY3NcImAnKSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgcmV2ZXJzZSBpcyBuZXZlciByaWdodDogdGhlIHByb3AgbmVzdHMgZXZlcnkgcmVzb3VyY2UsIGluY2x1ZGluZyB0aGVcbiAgICAvLyBjYXRjaC1hbGwsIHVuZGVyIGEgcGF0aCB0aGUgYXBwIG5ldmVyIGxpbmtzIHRvLlxuICAgIGl0KFwicmVqZWN0cyB0aGUgcHJvcCBzZXR0aW5nIGEgYmFzZVBhdGggdGhlIGFwcCBkb2Vzbid0XCIsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PlxuICAgICAgICByZXNvbHZlQmFzZVBhdGgoTmV4dGpzVHlwZS5SRUdJT05BTF9GVU5DVElPTlMsIFwiL2Jhc2VcIiksXG4gICAgICApLnRvVGhyb3coL25lc3RzIGV2ZXJ5IEFQSSBHYXRld2F5IHJlc291cmNlIHVuZGVyIHRoYXQgcGF0aC8pO1xuICAgIH0pO1xuXG4gICAgaXQoXCJyZWplY3RzIHR3byBkaWZmZXJlbnQgdmFsdWVzXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PlxuICAgICAgICByZXNvbHZlQmFzZVBhdGgoTmV4dGpzVHlwZS5SRUdJT05BTF9GVU5DVElPTlMsIFwiL2FcIiwgXCIvYlwiKSxcbiAgICAgICkudG9UaHJvdygvbmVzdHMgZXZlcnkgQVBJIEdhdGV3YXkgcmVzb3VyY2UgdW5kZXIgdGhhdCBwYXRoLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKE5leHRqc1R5cGUuUkVHSU9OQUxfQ09OVEFJTkVSUywgKCkgPT4ge1xuICAgIC8vIGJhc2VQYXRoIG9ubHkgbmFtZXNwYWNlcyB0aGUgUzMgYnVja2V0IGhlcmU6IHRoZSBBTEIgZm9yd2FyZHMgZXZlcnkgcGF0aFxuICAgIC8vIHRvIHRoZSBjb250YWluZXIsIHdoaWNoIHNlcnZlcyBpdHMgb3duIHN0YXRpYyBhc3NldHMuIFNvIGFueSBjb21iaW5hdGlvblxuICAgIC8vIGlzIHZhbGlkLCBhbmQgdGhlIGFwcCdzIGJhc2VQYXRoIGlzIG5ldmVyIGRlcml2ZWQgaW50byB0aGUgYnVja2V0IHByZWZpeC5cbiAgICBpdChcImFjY2VwdHMgYW55IGNvbWJpbmF0aW9uLCBhbHdheXMga2VlcGluZyB0aGUgcHJvcFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBuZXh0anNUeXBlID0gTmV4dGpzVHlwZS5SRUdJT05BTF9DT05UQUlORVJTO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCBcIi9hXCIsIFwiL2JcIikpLnRvQmUoXCJhXCIpO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCBcIi9hXCIpKS50b0JlKFwiYVwiKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgdW5kZWZpbmVkLCBcIi9iXCIpKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { Architecture } from "aws-cdk-lib/aws-lambda";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* The Lambda's architecture and the Sharp binaries bundled into its asset must
|
|
7
|
-
* come from this one value: deriving them separately lets them disagree on a
|
|
8
|
-
* host that is neither x64 nor arm (e.g. s390x), which produces a Lambda that
|
|
9
|
-
* fails to load its own bindings.
|
|
3
|
+
* The host's architecture as a Lambda one: the Functions types' default, so
|
|
4
|
+
* any native dependency `next build` traced from this machine runs as built.
|
|
10
5
|
*/
|
|
11
|
-
export declare function getNodeArchitecture(): string;
|
|
12
6
|
export declare function getLambdaArchitecture(): Architecture;
|
|
7
|
+
/**
|
|
8
|
+
* `architecture` spelled the way Sharp's `@img/sharp-<platform>-<arch>`
|
|
9
|
+
* packages spell it.
|
|
10
|
+
*/
|
|
11
|
+
export declare function toNodeArchitecture(architecture: Architecture): string;
|
|
@@ -1,23 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getNodeArchitecture = getNodeArchitecture;
|
|
4
3
|
exports.getLambdaArchitecture = getLambdaArchitecture;
|
|
4
|
+
exports.toNodeArchitecture = toNodeArchitecture;
|
|
5
5
|
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* The Lambda's architecture and the Sharp binaries bundled into its asset must
|
|
11
|
-
* come from this one value: deriving them separately lets them disagree on a
|
|
12
|
-
* host that is neither x64 nor arm (e.g. s390x), which produces a Lambda that
|
|
13
|
-
* fails to load its own bindings.
|
|
7
|
+
* The host's architecture as a Lambda one: the Functions types' default, so
|
|
8
|
+
* any native dependency `next build` traced from this machine runs as built.
|
|
14
9
|
*/
|
|
15
|
-
function getNodeArchitecture() {
|
|
16
|
-
return process.arch.startsWith("arm") ? "arm64" : "x64";
|
|
17
|
-
}
|
|
18
10
|
function getLambdaArchitecture() {
|
|
19
|
-
return
|
|
11
|
+
return process.arch.startsWith("arm")
|
|
20
12
|
? aws_lambda_1.Architecture.ARM_64
|
|
21
13
|
: aws_lambda_1.Architecture.X86_64;
|
|
22
14
|
}
|
|
23
|
-
|
|
15
|
+
/**
|
|
16
|
+
* `architecture` spelled the way Sharp's `@img/sharp-<platform>-<arch>`
|
|
17
|
+
* packages spell it.
|
|
18
|
+
*/
|
|
19
|
+
function toNodeArchitecture(architecture) {
|
|
20
|
+
return architecture.name === aws_lambda_1.Architecture.ARM_64.name ? "arm64" : "x64";
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWFyY2hpdGVjdHVyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9nZXQtYXJjaGl0ZWN0dXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBTUEsc0RBSUM7QUFNRCxnREFFQztBQWxCRCx1REFBc0Q7QUFFdEQ7OztHQUdHO0FBQ0gsU0FBZ0IscUJBQXFCO0lBQ25DLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQ25DLENBQUMsQ0FBQyx5QkFBWSxDQUFDLE1BQU07UUFDckIsQ0FBQyxDQUFDLHlCQUFZLENBQUMsTUFBTSxDQUFDO0FBQzFCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxZQUEwQjtJQUMzRCxPQUFPLFlBQVksQ0FBQyxJQUFJLEtBQUsseUJBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUMxRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXJjaGl0ZWN0dXJlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcblxuLyoqXG4gKiBUaGUgaG9zdCdzIGFyY2hpdGVjdHVyZSBhcyBhIExhbWJkYSBvbmU6IHRoZSBGdW5jdGlvbnMgdHlwZXMnIGRlZmF1bHQsIHNvXG4gKiBhbnkgbmF0aXZlIGRlcGVuZGVuY3kgYG5leHQgYnVpbGRgIHRyYWNlZCBmcm9tIHRoaXMgbWFjaGluZSBydW5zIGFzIGJ1aWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGFtYmRhQXJjaGl0ZWN0dXJlKCk6IEFyY2hpdGVjdHVyZSB7XG4gIHJldHVybiBwcm9jZXNzLmFyY2guc3RhcnRzV2l0aChcImFybVwiKVxuICAgID8gQXJjaGl0ZWN0dXJlLkFSTV82NFxuICAgIDogQXJjaGl0ZWN0dXJlLlg4Nl82NDtcbn1cblxuLyoqXG4gKiBgYXJjaGl0ZWN0dXJlYCBzcGVsbGVkIHRoZSB3YXkgU2hhcnAncyBgQGltZy9zaGFycC08cGxhdGZvcm0+LTxhcmNoPmBcbiAqIHBhY2thZ2VzIHNwZWxsIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Ob2RlQXJjaGl0ZWN0dXJlKGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlKTogc3RyaW5nIHtcbiAgcmV0dXJuIGFyY2hpdGVjdHVyZS5uYW1lID09PSBBcmNoaXRlY3R1cmUuQVJNXzY0Lm5hbWUgPyBcImFybTY0XCIgOiBcIng2NFwiO1xufVxuIl19
|