cdk-nextjs 0.5.15 → 0.6.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.
Files changed (53) hide show
  1. package/.jsii +821 -253
  2. package/.jsii.tabl.json +1 -1
  3. package/API.md +787 -18
  4. package/README.md +3 -3
  5. package/docs/breaking-changes.md +86 -0
  6. package/docs/caching-guide.md +6 -0
  7. package/docs/plans/adapter-runtime-release.md +362 -0
  8. package/docs/plans/phase-0-image-function-opt-in.md +295 -0
  9. package/lib/generated-structs/OptionalNextjsDistributionProps.d.ts +13 -0
  10. package/lib/generated-structs/OptionalNextjsDistributionProps.js +1 -1
  11. package/lib/image-optimization/handler-utils.d.ts +34 -0
  12. package/lib/image-optimization/handler-utils.js +83 -0
  13. package/lib/image-optimization/handler-utils.test.d.ts +1 -0
  14. package/lib/image-optimization/handler-utils.test.js +178 -0
  15. package/lib/image-optimization/handler.mjs +56126 -0
  16. package/lib/index.d.ts +2 -1
  17. package/lib/index.js +4 -2
  18. package/lib/nextjs-api.d.ts +44 -0
  19. package/lib/nextjs-api.js +64 -20
  20. package/lib/nextjs-api.test.d.ts +1 -0
  21. package/lib/nextjs-api.test.js +144 -0
  22. package/lib/nextjs-build/nextjs-build.d.ts +60 -0
  23. package/lib/nextjs-build/nextjs-build.js +184 -27
  24. package/lib/nextjs-cache.js +1 -1
  25. package/lib/nextjs-compute/nextjs-containers.js +1 -1
  26. package/lib/nextjs-compute/nextjs-functions.js +1 -1
  27. package/lib/nextjs-compute/nextjs-image-function.d.ts +53 -0
  28. package/lib/nextjs-compute/nextjs-image-function.js +59 -0
  29. package/lib/nextjs-distribution.d.ts +33 -0
  30. package/lib/nextjs-distribution.js +39 -11
  31. package/lib/nextjs-post-deploy.js +1 -1
  32. package/lib/nextjs-static-assets.d.ts +18 -0
  33. package/lib/nextjs-static-assets.js +33 -6
  34. package/lib/nextjs-static-assets.test.d.ts +1 -0
  35. package/lib/nextjs-static-assets.test.js +58 -0
  36. package/lib/root-constructs/nextjs-base-construct.d.ts +62 -2
  37. package/lib/root-constructs/nextjs-base-construct.js +81 -3
  38. package/lib/root-constructs/nextjs-global-containers.d.ts +6 -1
  39. package/lib/root-constructs/nextjs-global-containers.js +11 -5
  40. package/lib/root-constructs/nextjs-global-functions.d.ts +16 -5
  41. package/lib/root-constructs/nextjs-global-functions.js +23 -21
  42. package/lib/root-constructs/nextjs-regional-containers.js +1 -1
  43. package/lib/root-constructs/nextjs-regional-functions.d.ts +11 -5
  44. package/lib/root-constructs/nextjs-regional-functions.js +17 -21
  45. package/lib/utils/base-path.d.ts +40 -0
  46. package/lib/utils/base-path.js +123 -0
  47. package/lib/utils/base-path.test.d.ts +1 -0
  48. package/lib/utils/base-path.test.js +163 -0
  49. package/lib/utils/experimental-flags.d.ts +24 -0
  50. package/lib/utils/experimental-flags.js +30 -0
  51. package/lib/utils/get-architecture.d.ts +10 -0
  52. package/lib/utils/get-architecture.js +17 -2
  53. package/package.json +3 -1
package/lib/index.d.ts CHANGED
@@ -1,11 +1,12 @@
1
1
  export { NextjsType } from "./constants";
2
2
  export { NextjsApi, NextjsApiProps, NextjsApiOverrides } from "./nextjs-api";
3
- export { NextjsBaseConstructOverrides, NextjsBaseOverrides, NextjsBaseConstruct, NextjsBaseProps, NextjsBaseConstructProps, } from "./root-constructs/nextjs-base-construct";
3
+ export { NextjsBaseConstructOverrides, NextjsFunctionsConstructOverrides, NextjsBaseOverrides, NextjsBaseConstruct, NextjsBaseProps, NextjsBaseConstructProps, } from "./root-constructs/nextjs-base-construct";
4
4
  export { NextjsBuild, NextjsBuildProps, PublicDirEntry, } from "./nextjs-build/nextjs-build";
5
5
  export { NextjsComputeBaseProps } from "./nextjs-compute/nextjs-compute-base-props";
6
6
  export { NextjsContainers, NextjsContainersOverrides, NextjsContainersProps, } from "./nextjs-compute/nextjs-containers";
7
7
  export { NextjsDistribution, NextjsDistributionOverrides, NextjsDistributionProps, } from "./nextjs-distribution";
8
8
  export { NextjsFunctions, NextjsFunctionsOverrides, NextjsFunctionsProps, } from "./nextjs-compute/nextjs-functions";
9
+ export { NextjsImageFunction, NextjsImageFunctionOverrides, NextjsImageFunctionProps, } from "./nextjs-compute/nextjs-image-function";
9
10
  export { NextjsCache, NextjsCacheOverrides, NextjsCacheProps, } from "./nextjs-cache";
10
11
  export { NextjsGlobalContainers, NextjsGlobalContainersConstructOverrides, NextjsGlobalContainersOverrides, NextjsGlobalContainersProps, } from "./root-constructs/nextjs-global-containers";
11
12
  export { NextjsGlobalFunctions, NextjsGlobalFunctionsConstructOverrides, NextjsGlobalFunctionsOverrides, NextjsGlobalFunctionsProps, } from "./root-constructs/nextjs-global-functions";
package/lib/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.NextjsStaticAssets = exports.NextjsPostDeploy = exports.NextjsRegionalFunctions = exports.NextjsRegionalContainers = exports.NextjsGlobalFunctions = exports.NextjsGlobalContainers = exports.NextjsCache = exports.NextjsFunctions = exports.NextjsDistribution = exports.NextjsContainers = exports.NextjsBuild = exports.NextjsBaseConstruct = exports.NextjsApi = exports.NextjsType = void 0;
3
+ exports.NextjsStaticAssets = exports.NextjsPostDeploy = exports.NextjsRegionalFunctions = exports.NextjsRegionalContainers = exports.NextjsGlobalFunctions = exports.NextjsGlobalContainers = exports.NextjsCache = exports.NextjsImageFunction = exports.NextjsFunctions = exports.NextjsDistribution = exports.NextjsContainers = exports.NextjsBuild = exports.NextjsBaseConstruct = exports.NextjsApi = exports.NextjsType = void 0;
4
4
  var constants_1 = require("./constants");
5
5
  Object.defineProperty(exports, "NextjsType", { enumerable: true, get: function () { return constants_1.NextjsType; } });
6
6
  var nextjs_api_1 = require("./nextjs-api");
@@ -15,6 +15,8 @@ var nextjs_distribution_1 = require("./nextjs-distribution");
15
15
  Object.defineProperty(exports, "NextjsDistribution", { enumerable: true, get: function () { return nextjs_distribution_1.NextjsDistribution; } });
16
16
  var nextjs_functions_1 = require("./nextjs-compute/nextjs-functions");
17
17
  Object.defineProperty(exports, "NextjsFunctions", { enumerable: true, get: function () { return nextjs_functions_1.NextjsFunctions; } });
18
+ var nextjs_image_function_1 = require("./nextjs-compute/nextjs-image-function");
19
+ Object.defineProperty(exports, "NextjsImageFunction", { enumerable: true, get: function () { return nextjs_image_function_1.NextjsImageFunction; } });
18
20
  var nextjs_cache_1 = require("./nextjs-cache");
19
21
  Object.defineProperty(exports, "NextjsCache", { enumerable: true, get: function () { return nextjs_cache_1.NextjsCache; } });
20
22
  var nextjs_global_containers_1 = require("./root-constructs/nextjs-global-containers");
@@ -29,4 +31,4 @@ var nextjs_post_deploy_1 = require("./nextjs-post-deploy");
29
31
  Object.defineProperty(exports, "NextjsPostDeploy", { enumerable: true, get: function () { return nextjs_post_deploy_1.NextjsPostDeploy; } });
30
32
  var nextjs_static_assets_1 = require("./nextjs-static-assets");
31
33
  Object.defineProperty(exports, "NextjsStaticAssets", { enumerable: true, get: function () { return nextjs_static_assets_1.NextjsStaticAssets; } });
32
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQXlDO0FBQWhDLHVHQUFBLFVBQVUsT0FBQTtBQUNuQiwyQ0FBNkU7QUFBcEUsdUdBQUEsU0FBUyxPQUFBO0FBRWxCLGlGQU1pRDtBQUgvQyw0SEFBQSxtQkFBbUIsT0FBQTtBQUlyQiw0REFJcUM7QUFIbkMsMkdBQUEsV0FBVyxPQUFBO0FBS2Isd0VBSTRDO0FBSDFDLHFIQUFBLGdCQUFnQixPQUFBO0FBSWxCLDZEQUkrQjtBQUg3Qix5SEFBQSxrQkFBa0IsT0FBQTtBQUlwQixzRUFJMkM7QUFIekMsbUhBQUEsZUFBZSxPQUFBO0FBSWpCLCtDQUl3QjtBQUh0QiwyR0FBQSxXQUFXLE9BQUE7QUFJYix1RkFLb0Q7QUFKbEQsa0lBQUEsc0JBQXNCLE9BQUE7QUFLeEIscUZBS21EO0FBSmpELGdJQUFBLHFCQUFxQixPQUFBO0FBS3ZCLDJGQUtzRDtBQUpwRCxzSUFBQSx3QkFBd0IsT0FBQTtBQUsxQix5RkFLcUQ7QUFKbkQsb0lBQUEsdUJBQXVCLE9BQUE7QUFLekIsMkRBSzhCO0FBSjVCLHNIQUFBLGdCQUFnQixPQUFBO0FBS2xCLCtEQUlnQztBQUg5QiwwSEFBQSxrQkFBa0IsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IE5leHRqc1R5cGUgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCB7IE5leHRqc0FwaSwgTmV4dGpzQXBpUHJvcHMsIE5leHRqc0FwaU92ZXJyaWRlcyB9IGZyb20gXCIuL25leHRqcy1hcGlcIjtcblxuZXhwb3J0IHtcbiAgTmV4dGpzQmFzZUNvbnN0cnVjdE92ZXJyaWRlcyxcbiAgTmV4dGpzQmFzZU92ZXJyaWRlcyxcbiAgTmV4dGpzQmFzZUNvbnN0cnVjdCxcbiAgTmV4dGpzQmFzZVByb3BzLFxuICBOZXh0anNCYXNlQ29uc3RydWN0UHJvcHMsXG59IGZyb20gXCIuL3Jvb3QtY29uc3RydWN0cy9uZXh0anMtYmFzZS1jb25zdHJ1Y3RcIjtcbmV4cG9ydCB7XG4gIE5leHRqc0J1aWxkLFxuICBOZXh0anNCdWlsZFByb3BzLFxuICBQdWJsaWNEaXJFbnRyeSxcbn0gZnJvbSBcIi4vbmV4dGpzLWJ1aWxkL25leHRqcy1idWlsZFwiO1xuZXhwb3J0IHsgTmV4dGpzQ29tcHV0ZUJhc2VQcm9wcyB9IGZyb20gXCIuL25leHRqcy1jb21wdXRlL25leHRqcy1jb21wdXRlLWJhc2UtcHJvcHNcIjtcbmV4cG9ydCB7XG4gIE5leHRqc0NvbnRhaW5lcnMsXG4gIE5leHRqc0NvbnRhaW5lcnNPdmVycmlkZXMsXG4gIE5leHRqc0NvbnRhaW5lcnNQcm9wcyxcbn0gZnJvbSBcIi4vbmV4dGpzLWNvbXB1dGUvbmV4dGpzLWNvbnRhaW5lcnNcIjtcbmV4cG9ydCB7XG4gIE5leHRqc0Rpc3RyaWJ1dGlvbixcbiAgTmV4dGpzRGlzdHJpYnV0aW9uT3ZlcnJpZGVzLFxuICBOZXh0anNEaXN0cmlidXRpb25Qcm9wcyxcbn0gZnJvbSBcIi4vbmV4dGpzLWRpc3RyaWJ1dGlvblwiO1xuZXhwb3J0IHtcbiAgTmV4dGpzRnVuY3Rpb25zLFxuICBOZXh0anNGdW5jdGlvbnNPdmVycmlkZXMsXG4gIE5leHRqc0Z1bmN0aW9uc1Byb3BzLFxufSBmcm9tIFwiLi9uZXh0anMtY29tcHV0ZS9uZXh0anMtZnVuY3Rpb25zXCI7XG5leHBvcnQge1xuICBOZXh0anNDYWNoZSxcbiAgTmV4dGpzQ2FjaGVPdmVycmlkZXMsXG4gIE5leHRqc0NhY2hlUHJvcHMsXG59IGZyb20gXCIuL25leHRqcy1jYWNoZVwiO1xuZXhwb3J0IHtcbiAgTmV4dGpzR2xvYmFsQ29udGFpbmVycyxcbiAgTmV4dGpzR2xvYmFsQ29udGFpbmVyc0NvbnN0cnVjdE92ZXJyaWRlcyxcbiAgTmV4dGpzR2xvYmFsQ29udGFpbmVyc092ZXJyaWRlcyxcbiAgTmV4dGpzR2xvYmFsQ29udGFpbmVyc1Byb3BzLFxufSBmcm9tIFwiLi9yb290LWNvbnN0cnVjdHMvbmV4dGpzLWdsb2JhbC1jb250YWluZXJzXCI7XG5leHBvcnQge1xuICBOZXh0anNHbG9iYWxGdW5jdGlvbnMsXG4gIE5leHRqc0dsb2JhbEZ1bmN0aW9uc0NvbnN0cnVjdE92ZXJyaWRlcyxcbiAgTmV4dGpzR2xvYmFsRnVuY3Rpb25zT3ZlcnJpZGVzLFxuICBOZXh0anNHbG9iYWxGdW5jdGlvbnNQcm9wcyxcbn0gZnJvbSBcIi4vcm9vdC1jb25zdHJ1Y3RzL25leHRqcy1nbG9iYWwtZnVuY3Rpb25zXCI7XG5leHBvcnQge1xuICBOZXh0anNSZWdpb25hbENvbnRhaW5lcnMsXG4gIE5leHRqc1JlZ2lvbmFsQ29udGFpbmVyc0NvbnN0cnVjdE92ZXJyaWRlcyxcbiAgTmV4dGpzUmVnaW9uYWxDb250YWluZXJzT3ZlcnJpZGVzLFxuICBOZXh0anNSZWdpb25hbENvbnRhaW5lcnNQcm9wcyxcbn0gZnJvbSBcIi4vcm9vdC1jb25zdHJ1Y3RzL25leHRqcy1yZWdpb25hbC1jb250YWluZXJzXCI7XG5leHBvcnQge1xuICBOZXh0anNSZWdpb25hbEZ1bmN0aW9ucyxcbiAgTmV4dGpzUmVnaW9uYWxGdW5jdGlvbnNDb25zdHJ1Y3RPdmVycmlkZXMsXG4gIE5leHRqc1JlZ2lvbmFsRnVuY3Rpb25zT3ZlcnJpZGVzLFxuICBOZXh0anNSZWdpb25hbEZ1bmN0aW9uc1Byb3BzLFxufSBmcm9tIFwiLi9yb290LWNvbnN0cnVjdHMvbmV4dGpzLXJlZ2lvbmFsLWZ1bmN0aW9uc1wiO1xuZXhwb3J0IHtcbiAgTmV4dGpzUG9zdERlcGxveSxcbiAgTmV4dGpzUG9zdERlcGxveU92ZXJyaWRlcyxcbiAgTmV4dGpzUG9zdERlcGxveVByb3BzLFxuICBQb3N0RGVwbG95Q3VzdG9tUmVzb3VyY2VQcm9wZXJ0aWVzLFxufSBmcm9tIFwiLi9uZXh0anMtcG9zdC1kZXBsb3lcIjtcbmV4cG9ydCB7XG4gIE5leHRqc1N0YXRpY0Fzc2V0cyxcbiAgTmV4dGpzU3RhdGljQXNzZXRzT3ZlcnJpZGVzLFxuICBOZXh0anNTdGF0aWNBc3NldHNQcm9wcyxcbn0gZnJvbSBcIi4vbmV4dGpzLXN0YXRpYy1hc3NldHNcIjtcblxuZXhwb3J0IHsgT3B0aW9uYWxOZXh0anNCdWlsZFByb3BzIH0gZnJvbSBcIi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxOZXh0anNCdWlsZFByb3BzXCI7XG5leHBvcnQgeyBPcHRpb25hbE5leHRqc0NvbnRhaW5lcnNQcm9wcyB9IGZyb20gXCIuL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsTmV4dGpzQ29udGFpbmVyc1Byb3BzXCI7XG5leHBvcnQgeyBPcHRpb25hbE5leHRqc0Rpc3RyaWJ1dGlvblByb3BzIH0gZnJvbSBcIi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxOZXh0anNEaXN0cmlidXRpb25Qcm9wc1wiO1xuZXhwb3J0IHsgT3B0aW9uYWxOZXh0anNDYWNoZVByb3BzIH0gZnJvbSBcIi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxOZXh0anNDYWNoZVByb3BzXCI7XG5leHBvcnQgeyBPcHRpb25hbEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VkVGFza0ltYWdlT3B0aW9ucyB9IGZyb20gXCIuL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsQXBwbGljYXRpb25Mb2FkQmFsYW5jZWRUYXNrSW1hZ2VPcHRpb25zXCI7XG5leHBvcnQgeyBPcHRpb25hbENsb3VkRnJvbnRGdW5jdGlvblByb3BzIH0gZnJvbSBcIi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxDbG91ZEZyb250RnVuY3Rpb25Qcm9wc1wiO1xuZXhwb3J0IHsgT3B0aW9uYWxDbHVzdGVyUHJvcHMgfSBmcm9tIFwiLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbENsdXN0ZXJQcm9wc1wiO1xuZXhwb3J0IHsgT3B0aW9uYWxEaXN0cmlidXRpb25Qcm9wcyB9IGZyb20gXCIuL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsRGlzdHJpYnV0aW9uUHJvcHNcIjtcbmV4cG9ydCB7IE9wdGlvbmFsRG9ja2VySW1hZ2VBc3NldFByb3BzIH0gZnJvbSBcIi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxEb2NrZXJJbWFnZUFzc2V0UHJvcHNcIjtcbmV4cG9ydCB7IE9wdGlvbmFsRG9ja2VySW1hZ2VGdW5jdGlvblByb3BzIH0gZnJvbSBcIi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxEb2NrZXJJbWFnZUZ1bmN0aW9uUHJvcHNcIjtcbmV4cG9ydCB7IE9wdGlvbmFsRWRnZUZ1bmN0aW9uUHJvcHMgfSBmcm9tIFwiLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbEVkZ2VGdW5jdGlvblByb3BzXCI7XG5leHBvcnQgeyBPcHRpb25hbEZ1bmN0aW9uUHJvcHMgfSBmcm9tIFwiLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbEZ1bmN0aW9uUHJvcHNcIjtcbmV4cG9ydCB7IE9wdGlvbmFsRnVuY3Rpb25VcmxQcm9wcyB9IGZyb20gXCIuL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsRnVuY3Rpb25VcmxQcm9wc1wiO1xuZXhwb3J0IHsgT3B0aW9uYWxTM09yaWdpbkJ1Y2tldFdpdGhPQUNQcm9wcyB9IGZyb20gXCIuL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsUzNPcmlnaW5CdWNrZXRXaXRoT0FDUHJvcHNcIjtcbmV4cG9ydCB7IE9wdGlvbmFsVnBjUHJvcHMgfSBmcm9tIFwiLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbFZwY1Byb3BzXCI7XG5leHBvcnQgeyBPcHRpb25hbEN1c3RvbVJlc291cmNlUHJvcHMgfSBmcm9tIFwiLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbEN1c3RvbVJlc291cmNlUHJvcHNcIjtcbmV4cG9ydCB7IE9wdGlvbmFsUG9zdERlcGxveUN1c3RvbVJlc291cmNlUHJvcGVydGllcyB9IGZyb20gXCIuL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsUG9zdERlcGxveUN1c3RvbVJlc291cmNlUHJvcGVydGllc1wiO1xuZXhwb3J0IHsgT3B0aW9uYWxOZXh0anNQb3N0RGVwbG95UHJvcHMgfSBmcm9tIFwiLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbE5leHRqc1Bvc3REZXBsb3lQcm9wc1wiO1xuIl19
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQXlDO0FBQWhDLHVHQUFBLFVBQVUsT0FBQTtBQUNuQiwyQ0FBNkU7QUFBcEUsdUdBQUEsU0FBUyxPQUFBO0FBRWxCLGlGQU9pRDtBQUgvQyw0SEFBQSxtQkFBbUIsT0FBQTtBQUlyQiw0REFJcUM7QUFIbkMsMkdBQUEsV0FBVyxPQUFBO0FBS2Isd0VBSTRDO0FBSDFDLHFIQUFBLGdCQUFnQixPQUFBO0FBSWxCLDZEQUkrQjtBQUg3Qix5SEFBQSxrQkFBa0IsT0FBQTtBQUlwQixzRUFJMkM7QUFIekMsbUhBQUEsZUFBZSxPQUFBO0FBSWpCLGdGQUlnRDtBQUg5Qyw0SEFBQSxtQkFBbUIsT0FBQTtBQUlyQiwrQ0FJd0I7QUFIdEIsMkdBQUEsV0FBVyxPQUFBO0FBSWIsdUZBS29EO0FBSmxELGtJQUFBLHNCQUFzQixPQUFBO0FBS3hCLHFGQUttRDtBQUpqRCxnSUFBQSxxQkFBcUIsT0FBQTtBQUt2QiwyRkFLc0Q7QUFKcEQsc0lBQUEsd0JBQXdCLE9BQUE7QUFLMUIseUZBS3FEO0FBSm5ELG9JQUFBLHVCQUF1QixPQUFBO0FBS3pCLDJEQUs4QjtBQUo1QixzSEFBQSxnQkFBZ0IsT0FBQTtBQUtsQiwrREFJZ0M7QUFIOUIsMEhBQUEsa0JBQWtCLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBOZXh0anNUeXBlIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgeyBOZXh0anNBcGksIE5leHRqc0FwaVByb3BzLCBOZXh0anNBcGlPdmVycmlkZXMgfSBmcm9tIFwiLi9uZXh0anMtYXBpXCI7XG5cbmV4cG9ydCB7XG4gIE5leHRqc0Jhc2VDb25zdHJ1Y3RPdmVycmlkZXMsXG4gIE5leHRqc0Z1bmN0aW9uc0NvbnN0cnVjdE92ZXJyaWRlcyxcbiAgTmV4dGpzQmFzZU92ZXJyaWRlcyxcbiAgTmV4dGpzQmFzZUNvbnN0cnVjdCxcbiAgTmV4dGpzQmFzZVByb3BzLFxuICBOZXh0anNCYXNlQ29uc3RydWN0UHJvcHMsXG59IGZyb20gXCIuL3Jvb3QtY29uc3RydWN0cy9uZXh0anMtYmFzZS1jb25zdHJ1Y3RcIjtcbmV4cG9ydCB7XG4gIE5leHRqc0J1aWxkLFxuICBOZXh0anNCdWlsZFByb3BzLFxuICBQdWJsaWNEaXJFbnRyeSxcbn0gZnJvbSBcIi4vbmV4dGpzLWJ1aWxkL25leHRqcy1idWlsZFwiO1xuZXhwb3J0IHsgTmV4dGpzQ29tcHV0ZUJhc2VQcm9wcyB9IGZyb20gXCIuL25leHRqcy1jb21wdXRlL25leHRqcy1jb21wdXRlLWJhc2UtcHJvcHNcIjtcbmV4cG9ydCB7XG4gIE5leHRqc0NvbnRhaW5lcnMsXG4gIE5leHRqc0NvbnRhaW5lcnNPdmVycmlkZXMsXG4gIE5leHRqc0NvbnRhaW5lcnNQcm9wcyxcbn0gZnJvbSBcIi4vbmV4dGpzLWNvbXB1dGUvbmV4dGpzLWNvbnRhaW5lcnNcIjtcbmV4cG9ydCB7XG4gIE5leHRqc0Rpc3RyaWJ1dGlvbixcbiAgTmV4dGpzRGlzdHJpYnV0aW9uT3ZlcnJpZGVzLFxuICBOZXh0anNEaXN0cmlidXRpb25Qcm9wcyxcbn0gZnJvbSBcIi4vbmV4dGpzLWRpc3RyaWJ1dGlvblwiO1xuZXhwb3J0IHtcbiAgTmV4dGpzRnVuY3Rpb25zLFxuICBOZXh0anNGdW5jdGlvbnNPdmVycmlkZXMsXG4gIE5leHRqc0Z1bmN0aW9uc1Byb3BzLFxufSBmcm9tIFwiLi9uZXh0anMtY29tcHV0ZS9uZXh0anMtZnVuY3Rpb25zXCI7XG5leHBvcnQge1xuICBOZXh0anNJbWFnZUZ1bmN0aW9uLFxuICBOZXh0anNJbWFnZUZ1bmN0aW9uT3ZlcnJpZGVzLFxuICBOZXh0anNJbWFnZUZ1bmN0aW9uUHJvcHMsXG59IGZyb20gXCIuL25leHRqcy1jb21wdXRlL25leHRqcy1pbWFnZS1mdW5jdGlvblwiO1xuZXhwb3J0IHtcbiAgTmV4dGpzQ2FjaGUsXG4gIE5leHRqc0NhY2hlT3ZlcnJpZGVzLFxuICBOZXh0anNDYWNoZVByb3BzLFxufSBmcm9tIFwiLi9uZXh0anMtY2FjaGVcIjtcbmV4cG9ydCB7XG4gIE5leHRqc0dsb2JhbENvbnRhaW5lcnMsXG4gIE5leHRqc0dsb2JhbENvbnRhaW5lcnNDb25zdHJ1Y3RPdmVycmlkZXMsXG4gIE5leHRqc0dsb2JhbENvbnRhaW5lcnNPdmVycmlkZXMsXG4gIE5leHRqc0dsb2JhbENvbnRhaW5lcnNQcm9wcyxcbn0gZnJvbSBcIi4vcm9vdC1jb25zdHJ1Y3RzL25leHRqcy1nbG9iYWwtY29udGFpbmVyc1wiO1xuZXhwb3J0IHtcbiAgTmV4dGpzR2xvYmFsRnVuY3Rpb25zLFxuICBOZXh0anNHbG9iYWxGdW5jdGlvbnNDb25zdHJ1Y3RPdmVycmlkZXMsXG4gIE5leHRqc0dsb2JhbEZ1bmN0aW9uc092ZXJyaWRlcyxcbiAgTmV4dGpzR2xvYmFsRnVuY3Rpb25zUHJvcHMsXG59IGZyb20gXCIuL3Jvb3QtY29uc3RydWN0cy9uZXh0anMtZ2xvYmFsLWZ1bmN0aW9uc1wiO1xuZXhwb3J0IHtcbiAgTmV4dGpzUmVnaW9uYWxDb250YWluZXJzLFxuICBOZXh0anNSZWdpb25hbENvbnRhaW5lcnNDb25zdHJ1Y3RPdmVycmlkZXMsXG4gIE5leHRqc1JlZ2lvbmFsQ29udGFpbmVyc092ZXJyaWRlcyxcbiAgTmV4dGpzUmVnaW9uYWxDb250YWluZXJzUHJvcHMsXG59IGZyb20gXCIuL3Jvb3QtY29uc3RydWN0cy9uZXh0anMtcmVnaW9uYWwtY29udGFpbmVyc1wiO1xuZXhwb3J0IHtcbiAgTmV4dGpzUmVnaW9uYWxGdW5jdGlvbnMsXG4gIE5leHRqc1JlZ2lvbmFsRnVuY3Rpb25zQ29uc3RydWN0T3ZlcnJpZGVzLFxuICBOZXh0anNSZWdpb25hbEZ1bmN0aW9uc092ZXJyaWRlcyxcbiAgTmV4dGpzUmVnaW9uYWxGdW5jdGlvbnNQcm9wcyxcbn0gZnJvbSBcIi4vcm9vdC1jb25zdHJ1Y3RzL25leHRqcy1yZWdpb25hbC1mdW5jdGlvbnNcIjtcbmV4cG9ydCB7XG4gIE5leHRqc1Bvc3REZXBsb3ksXG4gIE5leHRqc1Bvc3REZXBsb3lPdmVycmlkZXMsXG4gIE5leHRqc1Bvc3REZXBsb3lQcm9wcyxcbiAgUG9zdERlcGxveUN1c3RvbVJlc291cmNlUHJvcGVydGllcyxcbn0gZnJvbSBcIi4vbmV4dGpzLXBvc3QtZGVwbG95XCI7XG5leHBvcnQge1xuICBOZXh0anNTdGF0aWNBc3NldHMsXG4gIE5leHRqc1N0YXRpY0Fzc2V0c092ZXJyaWRlcyxcbiAgTmV4dGpzU3RhdGljQXNzZXRzUHJvcHMsXG59IGZyb20gXCIuL25leHRqcy1zdGF0aWMtYXNzZXRzXCI7XG5cbmV4cG9ydCB7IE9wdGlvbmFsTmV4dGpzQnVpbGRQcm9wcyB9IGZyb20gXCIuL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsTmV4dGpzQnVpbGRQcm9wc1wiO1xuZXhwb3J0IHsgT3B0aW9uYWxOZXh0anNDb250YWluZXJzUHJvcHMgfSBmcm9tIFwiLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbE5leHRqc0NvbnRhaW5lcnNQcm9wc1wiO1xuZXhwb3J0IHsgT3B0aW9uYWxOZXh0anNEaXN0cmlidXRpb25Qcm9wcyB9IGZyb20gXCIuL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsTmV4dGpzRGlzdHJpYnV0aW9uUHJvcHNcIjtcbmV4cG9ydCB7IE9wdGlvbmFsTmV4dGpzQ2FjaGVQcm9wcyB9IGZyb20gXCIuL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsTmV4dGpzQ2FjaGVQcm9wc1wiO1xuZXhwb3J0IHsgT3B0aW9uYWxBcHBsaWNhdGlvbkxvYWRCYWxhbmNlZFRhc2tJbWFnZU9wdGlvbnMgfSBmcm9tIFwiLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VkVGFza0ltYWdlT3B0aW9uc1wiO1xuZXhwb3J0IHsgT3B0aW9uYWxDbG91ZEZyb250RnVuY3Rpb25Qcm9wcyB9IGZyb20gXCIuL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsQ2xvdWRGcm9udEZ1bmN0aW9uUHJvcHNcIjtcbmV4cG9ydCB7IE9wdGlvbmFsQ2x1c3RlclByb3BzIH0gZnJvbSBcIi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxDbHVzdGVyUHJvcHNcIjtcbmV4cG9ydCB7IE9wdGlvbmFsRGlzdHJpYnV0aW9uUHJvcHMgfSBmcm9tIFwiLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbERpc3RyaWJ1dGlvblByb3BzXCI7XG5leHBvcnQgeyBPcHRpb25hbERvY2tlckltYWdlQXNzZXRQcm9wcyB9IGZyb20gXCIuL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsRG9ja2VySW1hZ2VBc3NldFByb3BzXCI7XG5leHBvcnQgeyBPcHRpb25hbERvY2tlckltYWdlRnVuY3Rpb25Qcm9wcyB9IGZyb20gXCIuL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsRG9ja2VySW1hZ2VGdW5jdGlvblByb3BzXCI7XG5leHBvcnQgeyBPcHRpb25hbEVkZ2VGdW5jdGlvblByb3BzIH0gZnJvbSBcIi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxFZGdlRnVuY3Rpb25Qcm9wc1wiO1xuZXhwb3J0IHsgT3B0aW9uYWxGdW5jdGlvblByb3BzIH0gZnJvbSBcIi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxGdW5jdGlvblByb3BzXCI7XG5leHBvcnQgeyBPcHRpb25hbEZ1bmN0aW9uVXJsUHJvcHMgfSBmcm9tIFwiLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbEZ1bmN0aW9uVXJsUHJvcHNcIjtcbmV4cG9ydCB7IE9wdGlvbmFsUzNPcmlnaW5CdWNrZXRXaXRoT0FDUHJvcHMgfSBmcm9tIFwiLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbFMzT3JpZ2luQnVja2V0V2l0aE9BQ1Byb3BzXCI7XG5leHBvcnQgeyBPcHRpb25hbFZwY1Byb3BzIH0gZnJvbSBcIi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxWcGNQcm9wc1wiO1xuZXhwb3J0IHsgT3B0aW9uYWxDdXN0b21SZXNvdXJjZVByb3BzIH0gZnJvbSBcIi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxDdXN0b21SZXNvdXJjZVByb3BzXCI7XG5leHBvcnQgeyBPcHRpb25hbFBvc3REZXBsb3lDdXN0b21SZXNvdXJjZVByb3BlcnRpZXMgfSBmcm9tIFwiLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbFBvc3REZXBsb3lDdXN0b21SZXNvdXJjZVByb3BlcnRpZXNcIjtcbmV4cG9ydCB7IE9wdGlvbmFsTmV4dGpzUG9zdERlcGxveVByb3BzIH0gZnJvbSBcIi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxOZXh0anNQb3N0RGVwbG95UHJvcHNcIjtcbiJdfQ==
@@ -9,6 +9,7 @@ export interface NextjsApiOverrides {
9
9
  readonly staticIntegrationProps?: AwsIntegrationProps;
10
10
  readonly s3MethodOptions?: MethodOptions;
11
11
  readonly dynamicIntegrationProps?: LambdaIntegrationOptions;
12
+ readonly imageIntegrationProps?: LambdaIntegrationOptions;
12
13
  }
13
14
  export interface NextjsApiProps {
14
15
  /**
@@ -28,10 +29,34 @@ export interface NextjsApiProps {
28
29
  * Required if `NextjsRegionalFunctions`. The Lambda function for server-side rendering
29
30
  */
30
31
  readonly serverFunction?: IFunction;
32
+ /**
33
+ * Dedicated image optimization Lambda for the `_next/image` route. When
34
+ * omitted, no `_next/image` resource is created and those requests fall
35
+ * through to `serverFunction` via the `{proxy+}` catch-all.
36
+ *
37
+ * When provided, it is assumed to support Lambda response streaming (as the
38
+ * dedicated image Lambda this package builds does) and is invoked with
39
+ * `ResponseTransferMode.STREAM` accordingly. If you supply a custom
40
+ * `imageFunction` that doesn't support streaming, override
41
+ * `responseTransferMode` to `BUFFERED` via `overrides.imageIntegrationProps`,
42
+ * otherwise API Gateway returns a 502.
43
+ */
44
+ readonly imageFunction?: IFunction;
31
45
  /**
32
46
  * The S3 bucket containing static assets
33
47
  */
34
48
  readonly staticAssetsBucket: IBucket;
49
+ /**
50
+ * S3 key prefix the static assets were uploaded under, i.e.
51
+ * `NextjsStaticAssets.keyPrefix`, which namespaces a shared bucket.
52
+ *
53
+ * Independent of `basePath` above: that one is the URL prefix the REST API
54
+ * serves the app at (commonly the API Gateway stage), while this one is where
55
+ * the objects live in the bucket. `_next/static` and public directory
56
+ * requests are mapped to S3 keys directly, so they 404 unless this prefix is
57
+ * applied.
58
+ */
59
+ readonly staticAssetsKeyPrefix?: string;
35
60
  /**
36
61
  * [Future] Required if `NextjsRegionalContainers`. VPC to create VPC Link and ECS Service Discovery
37
62
  */
@@ -45,6 +70,16 @@ export declare class NextjsApi extends Construct {
45
70
  * The API Gateway REST API
46
71
  */
47
72
  readonly api: RestApi;
73
+ /**
74
+ * Public URL of the app, including every path segment the API nests it under.
75
+ * Prefers a custom domain configured through `overrides.restApiProps.domainName`
76
+ * over the execute-api endpoint.
77
+ *
78
+ * A domain attached after this construct is created (`api.addDomainName()`) is
79
+ * still used for the host, but CDK keeps its base path mappings private, so a
80
+ * mapping added that way won't show up here.
81
+ */
82
+ get url(): string;
48
83
  private readonly baseResource;
49
84
  private readonly nextResource;
50
85
  private readonly props;
@@ -58,6 +93,11 @@ export declare class NextjsApi extends Construct {
58
93
  private createBaseResource;
59
94
  private createStaticIntegrationRole;
60
95
  private createStaticIntegrations;
96
+ /**
97
+ * Prefixes a request path with the key prefix the assets were uploaded under,
98
+ * since the S3 integrations address objects by key rather than by URL.
99
+ */
100
+ private s3Key;
61
101
  /**
62
102
  * Maps API request to S3 request.
63
103
  * @see https://docs.aws.amazon.com/apigateway/latest/developerguide/rest-api-parameter-mapping-sources.html
@@ -65,6 +105,10 @@ export declare class NextjsApi extends Construct {
65
105
  */
66
106
  private createS3Integration;
67
107
  private getStaticMethodOptions;
108
+ /**
109
+ * Create Lambda Proxy integration for the `_next/image` route.
110
+ */
111
+ private createImageIntegration;
68
112
  /**
69
113
  * Create Lambda Proxy integration for all other routes
70
114
  */
package/lib/nextjs-api.js CHANGED
@@ -6,15 +6,40 @@ const aws_cdk_lib_1 = require("aws-cdk-lib");
6
6
  const aws_apigateway_1 = require("aws-cdk-lib/aws-apigateway");
7
7
  const aws_iam_1 = require("aws-cdk-lib/aws-iam");
8
8
  const constructs_1 = require("constructs");
9
+ const base_path_1 = require("./utils/base-path");
9
10
  /**
10
11
  * Creates an API Gateway REST API for Next.js applications
11
12
  */
12
13
  class NextjsApi extends constructs_1.Construct {
13
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsApi", version: "0.5.15" };
14
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsApi", version: "0.6.0" };
14
15
  /**
15
16
  * The API Gateway REST API
16
17
  */
17
18
  api;
19
+ /**
20
+ * Public URL of the app, including every path segment the API nests it under.
21
+ * Prefers a custom domain configured through `overrides.restApiProps.domainName`
22
+ * over the execute-api endpoint.
23
+ *
24
+ * A domain attached after this construct is created (`api.addDomainName()`) is
25
+ * still used for the host, but CDK keeps its base path mappings private, so a
26
+ * mapping added that way won't show up here.
27
+ */
28
+ get url() {
29
+ const customDomain = this.api.domainName;
30
+ // A custom domain reaches the stage through a base path mapping, so the
31
+ // stage name isn't in the path there; the mapping may be, when set.
32
+ const [origin, prefix] = customDomain
33
+ ? [
34
+ `https://${customDomain.domainName}`,
35
+ this.props.overrides?.restApiProps?.domainName?.basePath,
36
+ ]
37
+ : [
38
+ `https://${this.api.restApiId}.execute-api.${aws_cdk_lib_1.Stack.of(this).region}.amazonaws.com`,
39
+ this.api.deploymentStage.stageName,
40
+ ];
41
+ return (0, base_path_1.joinPath)(origin, prefix, this.props.basePath);
42
+ }
18
43
  baseResource;
19
44
  nextResource;
20
45
  props;
@@ -29,6 +54,11 @@ class NextjsApi extends constructs_1.Construct {
29
54
  this.staticIntegrationRole = this.createStaticIntegrationRole();
30
55
  this.createStaticIntegrations();
31
56
  if (props.serverFunction) {
57
+ // Without a dedicated image function, `_next/image` falls through to the
58
+ // `{proxy+}` catch-all on the server function.
59
+ if (props.imageFunction) {
60
+ this.createImageIntegration(props.imageFunction);
61
+ }
32
62
  this.createDynamicIntegration(props.serverFunction);
33
63
  }
34
64
  else if (props.vpc) {
@@ -54,14 +84,8 @@ class NextjsApi extends constructs_1.Construct {
54
84
  */
55
85
  createBaseResource(basePath) {
56
86
  // Create base resource path if needed
57
- let baseResource = this.api.root;
58
- if (basePath) {
59
- const _basePath = basePath.startsWith("/")
60
- ? basePath.substring(1)
61
- : basePath;
62
- baseResource = this.api.root.addResource(_basePath);
63
- }
64
- return baseResource;
87
+ const normalized = (0, base_path_1.normalizeBasePath)(basePath);
88
+ return normalized ? this.api.root.addResource(normalized) : this.api.root;
65
89
  }
66
90
  createStaticIntegrationRole() {
67
91
  // Create S3 integration role
@@ -81,22 +105,31 @@ class NextjsApi extends constructs_1.Construct {
81
105
  this.nextResource
82
106
  .addResource("static")
83
107
  .addResource("{proxy+}")
84
- .addMethod("GET", this.createS3Integration({ key: "_next/static/{key}" }), this.getStaticMethodOptions({ proxy: true }));
108
+ .addMethod("GET", this.createS3Integration({ key: this.s3Key("_next/static/{key}") }), this.getStaticMethodOptions({ proxy: true }));
85
109
  // add public directory files/directories that exist at top level but need to go to S3.
86
110
  for (const publicDirEntry of this.props.publicDirEntries) {
87
111
  if (publicDirEntry.isDirectory) {
88
112
  this.baseResource
89
113
  .addResource(publicDirEntry.name)
90
114
  .addResource("{proxy+}")
91
- .addMethod("GET", this.createS3Integration({ key: `${publicDirEntry.name}/{key}` }), this.getStaticMethodOptions({ proxy: true }));
115
+ .addMethod("GET", this.createS3Integration({
116
+ key: this.s3Key(`${publicDirEntry.name}/{key}`),
117
+ }), this.getStaticMethodOptions({ proxy: true }));
92
118
  }
93
119
  else {
94
120
  this.baseResource
95
121
  .addResource(publicDirEntry.name)
96
- .addMethod("GET", this.createS3Integration({ key: publicDirEntry.name }), this.getStaticMethodOptions());
122
+ .addMethod("GET", this.createS3Integration({ key: this.s3Key(publicDirEntry.name) }), this.getStaticMethodOptions());
97
123
  }
98
124
  }
99
125
  }
126
+ /**
127
+ * Prefixes a request path with the key prefix the assets were uploaded under,
128
+ * since the S3 integrations address objects by key rather than by URL.
129
+ */
130
+ s3Key(key) {
131
+ return (0, base_path_1.joinPath)(this.props.staticAssetsKeyPrefix, key);
132
+ }
100
133
  /**
101
134
  * Maps API request to S3 request.
102
135
  * @see https://docs.aws.amazon.com/apigateway/latest/developerguide/rest-api-parameter-mapping-sources.html
@@ -162,17 +195,28 @@ class NextjsApi extends constructs_1.Construct {
162
195
  };
163
196
  }
164
197
  /**
165
- * Create Lambda Proxy integration for all other routes
198
+ * Create Lambda Proxy integration for the `_next/image` route.
166
199
  */
167
- createDynamicIntegration(serverFunction) {
168
- // Image optimization requires buffered mode (no streaming) for binary data
169
- const imageIntegration = new aws_apigateway_1.LambdaIntegration(serverFunction, {
170
- responseTransferMode: aws_apigateway_1.ResponseTransferMode.BUFFERED, // required for images, otherwise 502
171
- ...this.props.overrides?.dynamicIntegrationProps,
200
+ createImageIntegration(imageFunction) {
201
+ // imageFunction is assumed to be the dedicated, streaming-capable image
202
+ // Lambda (see its doc comment); override responseTransferMode via
203
+ // imageIntegrationProps if that assumption doesn't hold for a custom
204
+ // imageFunction, otherwise API Gateway returns a 502. Deliberately
205
+ // doesn't inherit dynamicIntegrationProps: that's for serverFunction,
206
+ // a different Lambda with different (and possibly conflicting, e.g.
207
+ // BUFFERED for a non-streaming Lambda Web Adapter setup) streaming
208
+ // requirements than the always-streaming dedicated image Lambda.
209
+ const imageIntegration = new aws_apigateway_1.LambdaIntegration(imageFunction, {
210
+ responseTransferMode: aws_apigateway_1.ResponseTransferMode.STREAM,
211
+ ...this.props.overrides?.imageIntegrationProps,
172
212
  });
173
- // Add _next/image route with buffered integration
174
213
  const imageResource = this.nextResource.addResource("image");
175
214
  imageResource.addMethod("ANY", imageIntegration);
215
+ }
216
+ /**
217
+ * Create Lambda Proxy integration for all other routes
218
+ */
219
+ createDynamicIntegration(serverFunction) {
176
220
  // All other routes use streaming for better performance
177
221
  const streamingIntegration = new aws_apigateway_1.LambdaIntegration(serverFunction, {
178
222
  responseTransferMode: aws_apigateway_1.ResponseTransferMode.STREAM,
@@ -185,4 +229,4 @@ class NextjsApi extends constructs_1.Construct {
185
229
  }
186
230
  }
187
231
  exports.NextjsApi = NextjsApi;
188
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9uZXh0anMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSw2Q0FBMEM7QUFDMUMsK0RBWW9DO0FBRXBDLGlEQUs2QjtBQUc3QiwyQ0FBdUM7QUFzQ3ZDOztHQUVHO0FBQ0gsTUFBYSxTQUFVLFNBQVEsc0JBQVM7O0lBQ3RDOztPQUVHO0lBQ2EsR0FBRyxDQUFVO0lBRVosWUFBWSxDQUFZO0lBQ3hCLFlBQVksQ0FBWTtJQUN4QixLQUFLLENBQWlCO0lBQy9CLHFCQUFxQixDQUFRO0lBRXJDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBcUI7UUFDN0QsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUVuQixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUNoRSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUNoQyxJQUFJLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3RELENBQUM7YUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNyQiw4RUFBOEU7UUFDaEYsQ0FBQztJQUNI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V0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdELGFBQWEsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFFakQsd0RBQXdEO1FBQ3hELE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxrQ0FBaUIsQ0FBQyxjQUFjLEVBQUU7WUFDakUsb0JBQW9CLEVBQUUscUNBQW9CLENBQUMsTUFBTTtZQUNqRCxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLHVCQUF1QjtTQUNqRCxDQUFDLENBQUM7UUFFSCw0RUFBNEU7UUFDNUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFDekQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEUsYUFBYSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztJQUN2RCxDQUFDOztBQTNNSCw4QkE0TUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTaXplLCBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtcbiAgUmVzdEFwaSxcbiAgTGFtYmRhSW50ZWdyYXRpb24sXG4gIEF3c0ludGVncmF0aW9uLFxuICBNZXRob2RPcHRpb25zLFxuICBJUmVzb3VyY2UsXG4gIEVuZHBvaW50VHlwZSxcbiAgUmVzdEFwaVByb3BzLFxuICBBd3NJbnRlZ3JhdGlvblByb3BzLFxuICBMYW1iZGFJbnRlZ3JhdGlvbk9wdGlvbnMsXG4gIFBhc3N0aHJvdWdoQmVoYXZpb3IsXG4gIFJlc3BvbnNlVHJhbnNmZXJNb2RlLFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXlcIjtcbmltcG9ydCB7IElWcGMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHtcbiAgUm9sZSxcbiAgU2VydmljZVByaW5jaXBhbCxcbiAgUG9saWN5U3RhdGVtZW50LFxuICBJUm9sZSxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IElGdW5jdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBJQnVja2V0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IFB1YmxpY0RpckVudHJ5IH0gZnJvbSBcIi4vbmV4dGpzLWJ1aWxkL25leHRqcy1idWlsZFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0FwaU92ZXJyaWRlcyB7XG4gIHJlYWRvbmx5IHJlc3RBcGlQcm9wcz86IFJlc3RBcGlQcm9wcztcbiAgcmVhZG9ubHkgc3RhdGljSW50ZWdyYXRpb25Qcm9wcz86IEF3c0ludGVncmF0aW9uUHJvcHM7XG4gIHJlYWRvbmx5IHMzTWV0aG9kT3B0aW9ucz86IE1ldGhvZE9wdGlvbnM7XG4gIHJlYWRvbmx5IGR5bmFtaWNJbnRlZ3JhdGlvblByb3BzPzogTGFtYmRhSW50ZWdyYXRpb25PcHRpb25zO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0FwaVByb3BzIHtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGJhc2UgcGF0aCBmb3IgdGhlIGFwcGxpY2F0aW9uXG4gICAqL1xuICByZWFkb25seSBiYXNlUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIE92ZXJyaWRlIHByb3BzIGZvciBldmVyeSBjb25zdHJ1Y3QuXG4gICAqL1xuICByZWFkb25seSBvdmVycmlkZXM/OiBOZXh0anNBcGlPdmVycmlkZXM7XG4gIC8qKlxuICAgKiBQYXRoIHRvIGRpcmVjdG9yeSBvZiBOZXh0LmpzIGFwcCdzIHB1YmxpYyBkaXJlY3RvcnkuIFVzZWQgdG8gYWRkIHJlc291cmNlc1xuICAgKiB0byBBUEkgR2F0ZXdheSBSRVNUIEFQSSBmb3IgcHVibGljIGRpcmVjdG9yeSB0byBnbyBkaXJlY3RseSB0byBTMy5cbiAgICovXG4gIHJlYWRvbmx5IHB1YmxpY0RpckVudHJpZXM6IFB1YmxpY0RpckVudHJ5W107XG4gIC8qKlxuICAgKiBSZXF1aXJlZCBpZiBgTmV4dGpzUmVnaW9uYWxGdW5jdGlvbnNgLiBUaGUgTGFtYmRhIGZ1bmN0aW9uIGZvciBzZXJ2ZXItc2lkZSByZW5kZXJpbmdcbiAgICovXG4gIHJlYWRvbmx5IHNlcnZlckZ1bmN0aW9uPzogSUZ1bmN0aW9uO1xuICAvKipcbiAgICogVGhlIFMzIGJ1Y2tldCBjb250YWluaW5nIHN0YXRpYyBhc3NldHNcbiAgICovXG4gIHJlYWRvbmx5IHN0YXRpY0Fzc2V0c0J1Y2tldDogSUJ1Y2tldDtcbiAgLyoqXG4gICAqIFtGdXR1cmVdIFJlcXVpcmVkIGlmIGBOZXh0anNSZWdpb25hbENvbnRhaW5lcnNgLiBWUEMgdG8gY3JlYXRlIFZQQyBMaW5rIGFuZCBFQ1MgU2VydmljZSBEaXNjb3ZlcnlcbiAgICovXG4gIHJlYWRvbmx5IHZwYz86IElWcGM7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBBUEkgR2F0ZXdheSBSRVNUIEFQSSBmb3IgTmV4dC5qcyBhcHBsaWNhdGlvbnNcbiAqL1xuZXhwb3J0IGNsYXNzIE5leHRqc0FwaSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBUaGUgQVBJIEdhdGV3YXkgUkVTVCBBUElcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhcGk6IFJlc3RBcGk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlUmVzb3VyY2U6IElSZXNvdXJjZTtcbiAgcHJpdmF0ZSByZWFkb25seSBuZXh0UmVzb3VyY2U6IElSZXNvdXJjZTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcm9wczogTmV4dGpzQXBpUHJvcHM7XG4gIHByaXZhdGUgc3RhdGljSW50ZWdyYXRpb25Sb2xlOiBJUm9sZTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTmV4dGpzQXBpUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcblxuICAgIHRoaXMudmFsaWRhdGVQcm9wcyhwcm9wcyk7XG4gICAgdGhpcy5hcGkgPSB0aGlzLmNyZWF0ZVJlc3RBcGkoKTtcbiAgICB0aGlzLmJhc2VSZXNvdXJjZSA9IHRoaXMuY3JlYXRlQmFzZVJlc291cmNlKHByb3BzLmJhc2VQYXRoKTtcbiAgICB0aGlzLm5leHRSZXNvdXJjZSA9IHRoaXMuYmFzZVJlc291cmNlLmFkZFJlc291cmNlKFwiX25leHRcIik7XG4gICAgdGhpcy5zdGF0aWNJbnRlZ3JhdGlvblJvbGUgPSB0aGlzLmNyZWF0ZVN0YXRpY0ludGVncmF0aW9uUm9sZSgpO1xuICAgIHRoaXMuY3JlYXRlU3RhdGljSW50ZWdyYXRpb25zKCk7XG4gICAgaWYgKHByb3BzLnNlcnZlckZ1bmN0aW9uKSB7XG4gICAgICB0aGlzLmNyZWF0ZUR5bmFtaWNJbnRlZ3JhdGlvbihwcm9wcy5zZXJ2ZXJGdW5jdGlvbik7XG4gICAgfSBlbHNlIGlmIChwcm9wcy52cGMpIHtcbiAgICAgIC8vIFtGdXR1cmVdIGNyZWF0ZSBpbnRlZ3JhdGlvbiB3aXRoIEVDUyB2aWEgVlBDIExpbmsgYW5kIEVDUyBTZXJ2aWNlIERpc2NvdmVyeVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVQcm9wcyhwcm9wczogTmV4dGpzQXBpUHJvcHMpIHtcbiAgICBpZiAoIXByb3BzLnNlcnZlckZ1bmN0aW9uICYmICFwcm9wcy52cGMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInNlcnZlckZ1bmN0aW9uIG9yIHZwYyBtdXN0IGJlIHNldCBpbiBOZXh0anNBcGlQcm9wc1wiKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJlc3RBcGkoKTogUmVzdEFwaSB7XG4gICAgcmV0dXJuIG5ldyBSZXN0QXBpKHRoaXMsIFwiUmVzdEFwaVwiLCB7XG4gICAgICBiaW5hcnlNZWRpYVR5cGVzOiBbXCIqLypcIl0sXG4gICAgICBkZXNjcmlwdGlvbjogYGNkay1uZXh0anMgUkVTVCBBUEkgZm9yICR7U3RhY2sub2YodGhpcykuc3RhY2tOYW1lfWAsXG4gICAgICBlbmRwb2ludFR5cGVzOiBbRW5kcG9pbnRUeXBlLlJFR0lPTkFMXSxcbiAgICAgIG1pbkNvbXByZXNzaW9uU2l6ZTogU2l6ZS5ieXRlcygwKSwgLy8gY29tcHJlc3MgYWxsIHJlc3BvbnNlcyBmb3IgYmV0dGVyIHBlcmZcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5yZXN0QXBpUHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGJhc2UgcmVzb3VyY2UgcGF0aCBpZiBuZWVkZWQuIEltcG9ydGFudCBpZiBgYmFzZVBhdGhgIGlzIHNldC5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQmFzZVJlc291cmNlKGJhc2VQYXRoPzogc3RyaW5nKTogSVJlc291cmNlIHtcbiAgICAvLyBDcmVhdGUgYmFzZSByZXNvdXJjZSBwYXRoIGlmIG5lZWRlZFxuICAgIGxldCBiYXNlUmVzb3VyY2UgPSB0aGlzLmFwaS5yb290O1xuICAgIGlmIChiYXNlUGF0aCkge1xuICAgICAgY29uc3QgX2Jhc2VQYXRoID0gYmFzZVBhdGguc3RhcnRzV2l0aChcIi9cIilcbiAgICAgICAgPyBiYXNlUGF0aC5zdWJzdHJpbmcoMSlcbiAgICAgICAgOiBiYXNlUGF0aDtcblxuICAgICAgYmFzZVJlc291cmNlID0gdGhpcy5hcGkucm9vdC5hZGRSZXNvdXJjZShfYmFzZVBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gYmFzZVJlc291cmNlO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTdGF0aWNJbnRlZ3JhdGlvblJvbGUoKSB7XG4gICAgLy8gQ3JlYXRlIFMzIGludGVncmF0aW9uIHJvbGVcbiAgICBjb25zdCBzdGF0aWNJbnRlZ3JhdGlvblJvbGUgPSBuZXcgUm9sZSh0aGlzLCBcIlN0YXRpY0ludGVncmF0aW9uUm9sZVwiLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBTZXJ2aWNlUHJpbmNpcGFsKFwiYXBpZ2F0ZXdheS5hbWF6b25hd3MuY29tXCIpLFxuICAgIH0pO1xuXG4gICAgc3RhdGljSW50ZWdyYXRpb25Sb2xlLmFkZFRvUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtcInMzOkdldE9iamVjdFwiLCBcInMzOkxpc3RCdWNrZXRcIl0sXG4gICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgIHRoaXMucHJvcHMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldEFybixcbiAgICAgICAgICBgJHt0aGlzLnByb3BzLnN0YXRpY0Fzc2V0c0J1Y2tldC5idWNrZXRBcm59LypgLFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgKTtcbiAgICByZXR1cm4gc3RhdGljSW50ZWdyYXRpb25Sb2xlO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTdGF0aWNJbnRlZ3JhdGlvbnMoKSB7XG4gICAgdGhpcy5uZXh0UmVzb3VyY2VcbiAgICAgIC5hZGRSZXNvdXJjZShcInN0YXRpY1wiKVxuICAgICAgLmFkZFJlc291cmNlKFwie3Byb3h5K31cIilcbiAgICAgIC5hZGRNZXRob2QoXG4gICAgICAgIFwiR0VUXCIsXG4gICAgICAgIHRoaXMuY3JlYXRlUzNJbnRlZ3JhdGlvbih7IGtleTogXCJfbmV4dC9zdGF0aWMve2tleX1cIiB9KSxcbiAgICAgICAgdGhpcy5nZXRTdGF0aWNNZXRob2RPcHRpb25zKHsgcHJveHk6IHRydWUgfSksXG4gICAgICApO1xuICAgIC8vIGFkZCBwdWJsaWMgZGlyZWN0b3J5IGZpbGVzL2RpcmVjdG9yaWVzIHRoYXQgZXhpc3QgYXQgdG9wIGxldmVsIGJ1dCBuZWVkIHRvIGdvIHRvIFMzLlxuICAgIGZvciAoY29uc3QgcHVibGljRGlyRW50cnkgb2YgdGhpcy5wcm9wcy5wdWJsaWNEaXJFbnRyaWVzKSB7XG4gICAgICBpZiAocHVibGljRGlyRW50cnkuaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgdGhpcy5iYXNlUmVzb3VyY2VcbiAgICAgICAgICAuYWRkUmVzb3VyY2UocHVibGljRGlyRW50cnkubmFtZSlcbiAgICAgICAgICAuYWRkUmVzb3VyY2UoXCJ7cHJveHkrfVwiKVxuICAgICAgICAgIC5hZGRNZXRob2QoXG4gICAgICAgICAgICBcIkdFVFwiLFxuICAgICAgICAgICAgdGhpcy5jcmVhdGVTM0ludGVncmF0aW9uKHsga2V5OiBgJHtwdWJsaWNEaXJFbnRyeS5uYW1lfS97a2V5fWAgfSksXG4gICAgICAgICAgICB0aGlzLmdldFN0YXRpY01ldGhvZE9wdGlvbnMoeyBwcm94eTogdHJ1ZSB9KSxcbiAgICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5iYXNlUmVzb3VyY2VcbiAgICAgICAgICAuYWRkUmVzb3VyY2UocHVibGljRGlyRW50cnkubmFtZSlcbiAgICAgICAgICAuYWRkTWV0aG9kKFxuICAgICAgICAgICAgXCJHRVRcIixcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlUzNJbnRlZ3JhdGlvbih7IGtleTogcHVibGljRGlyRW50cnkubmFtZSB9KSxcbiAgICAgICAgICAgIHRoaXMuZ2V0U3RhdGljTWV0aG9kT3B0aW9ucygpLFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgQVBJIHJlcXVlc3QgdG8gUzMgcmVxdWVzdC5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvcmVzdC1hcGktcGFyYW1ldGVyLW1hcHBpbmctc291cmNlcy5odG1sXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2ludGVncmF0aW5nLWFwaS13aXRoLWF3cy1zZXJ2aWNlcy1zMy5odG1sI2FwaS1pdGVtcy1pbi1mb2xkZXItYXMtczMtb2JqZWN0cy1pbi1idWNrZXRcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlUzNJbnRlZ3JhdGlvbih7IGtleSB9OiB7IGtleTogc3RyaW5nIH0pIHtcbiAgICBjb25zdCBzM0ludGVncmF0aW9uID0gbmV3IEF3c0ludGVncmF0aW9uKHtcbiAgICAgIHNlcnZpY2U6IFwiczNcIixcbiAgICAgIGludGVncmF0aW9uSHR0cE1ldGhvZDogXCJHRVRcIixcbiAgICAgIHBhdGg6IGAke3RoaXMucHJvcHMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldE5hbWV9LyR7a2V5fWAsXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIGNyZWRlbnRpYWxzUm9sZTogdGhpcy5zdGF0aWNJbnRlZ3JhdGlvblJvbGUsXG4gICAgICAgIHBhc3N0aHJvdWdoQmVoYXZpb3I6IFBhc3N0aHJvdWdoQmVoYXZpb3IuV0hFTl9OT19URU1QTEFURVMsIC8vIHJlY29tbWVuZGVkXG4gICAgICAgIHJlcXVlc3RQYXJhbWV0ZXJzOiBrZXkuaW5jbHVkZXMoXCJ7a2V5fVwiKVxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBcImludGVncmF0aW9uLnJlcXVlc3QucGF0aC5rZXlcIjogXCJtZXRob2QucmVxdWVzdC5wYXRoLnByb3h5XCIsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGludGVncmF0aW9uUmVzcG9uc2VzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3RhdHVzQ29kZTogXCIyMDBcIixcbiAgICAgICAgICAgIHJlc3BvbnNlUGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICBcIm1ldGhvZC5yZXNwb25zZS5oZWFkZXIuQ29udGVudC1UeXBlXCI6XG4gICAgICAgICAgICAgICAgXCJpbnRlZ3JhdGlvbi5yZXNwb25zZS5oZWFkZXIuQ29udGVudC1UeXBlXCIsXG4gICAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5Db250ZW50LUxlbmd0aFwiOlxuICAgICAgICAgICAgICAgIFwiaW50ZWdyYXRpb24ucmVzcG9uc2UuaGVhZGVyLkNvbnRlbnQtTGVuZ3RoXCIsXG4gICAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5DYWNoZS1Db250cm9sXCI6XG4gICAgICAgICAgICAgICAgXCJpbnRlZ3JhdGlvbi5yZXNwb25zZS5oZWFkZXIuQ2FjaGUtQ29udHJvbFwiLFxuICAgICAgICAgICAgICBcIm1ldGhvZC5yZXNwb25zZS5oZWFkZXIuRVRhZ1wiOiBcImludGVncmF0aW9uLnJlc3BvbnNlLmhlYWRlci5FVGFnXCIsXG4gICAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5MYXN0LU1vZGlmaWVkXCI6XG4gICAgICAgICAgICAgICAgXCJpbnRlZ3JhdGlvbi5yZXNwb25zZS5oZWFkZXIuTGFzdC1Nb2RpZmllZFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHN0YXR1c0NvZGU6IFwiNDA0XCIsXG4gICAgICAgICAgICBzZWxlY3Rpb25QYXR0ZXJuOiBcIjQwNFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LnN0YXRpY0ludGVncmF0aW9uUHJvcHMsXG4gICAgfSk7XG4gICAgcmV0dXJuIHMzSW50ZWdyYXRpb247XG4gIH1cblxuICBwcml2YXRlIGdldFN0YXRpY01ldGhvZE9wdGlvbnMoeyBwcm94eSB9ID0geyBwcm94eTogZmFsc2UgfSk6IE1ldGhvZE9wdGlvbnMge1xuICAgIHJldHVybiB7XG4gICAgICByZXF1ZXN0UGFyYW1ldGVyczogcHJveHlcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBcIm1ldGhvZC5yZXF1ZXN0LnBhdGgucHJveHlcIjogdHJ1ZSxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgbWV0aG9kUmVzcG9uc2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBzdGF0dXNDb2RlOiBcIjIwMFwiLFxuICAgICAgICAgIHJlc3BvbnNlUGFyYW1ldGVyczoge1xuICAgICAgICAgICAgXCJtZXRob2QucmVzcG9uc2UuaGVhZGVyLkNvbnRlbnQtVHlwZVwiOiB0cnVlLFxuICAgICAgICAgICAgXCJtZXRob2QucmVzcG9uc2UuaGVhZGVyLkNvbnRlbnQtTGVuZ3RoXCI6IHRydWUsXG4gICAgICAgICAgICBcIm1ldGhvZC5yZXNwb25zZS5oZWFkZXIuQ2FjaGUtQ29udHJvbFwiOiB0cnVlLFxuICAgICAgICAgICAgXCJtZXRob2QucmVzcG9uc2UuaGVhZGVyLkVUYWdcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5MYXN0LU1vZGlmaWVkXCI6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHN0YXR1c0NvZGU6IFwiNDA0XCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LnMzTWV0aG9kT3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBMYW1iZGEgUHJveHkgaW50ZWdyYXRpb24gZm9yIGFsbCBvdGhlciByb3V0ZXNcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRHluYW1pY0ludGVncmF0aW9uKHNlcnZlckZ1bmN0aW9uOiBJRnVuY3Rpb24pIHtcbiAgICAvLyBJbWFnZSBvcHRpbWl6YXRpb24gcmVxdWlyZXMgYnVmZmVyZWQgbW9kZSAobm8gc3RyZWFtaW5nKSBmb3IgYmluYXJ5IGRhdGFcbiAgICBjb25zdCBpbWFnZUludGVncmF0aW9uID0gbmV3IExhbWJkYUludGVncmF0aW9uKHNlcnZlckZ1bmN0aW9uLCB7XG4gICAgICByZXNwb25zZVRyYW5zZmVyTW9kZTogUmVzcG9uc2VUcmFuc2Zlck1vZGUuQlVGRkVSRUQsIC8vIHJlcXVpcmVkIGZvciBpbWFnZXMsIG90aGVyd2lzZSA1MDJcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5keW5hbWljSW50ZWdyYXRpb25Qcm9wcyxcbiAgICB9KTtcbiAgICAvLyBBZGQgX25leHQvaW1hZ2Ugcm91dGUgd2l0aCBidWZmZXJlZCBpbnRlZ3JhdGlvblxuICAgIGNvbnN0IGltYWdlUmVzb3VyY2UgPSB0aGlzLm5leHRSZXNvdXJjZS5hZGRSZXNvdXJjZShcImltYWdlXCIpO1xuICAgIGltYWdlUmVzb3VyY2UuYWRkTWV0aG9kKFwiQU5ZXCIsIGltYWdlSW50ZWdyYXRpb24pO1xuXG4gICAgLy8gQWxsIG90aGVyIHJvdXRlcyB1c2Ugc3RyZWFtaW5nIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAgICBjb25zdCBzdHJlYW1pbmdJbnRlZ3JhdGlvbiA9IG5ldyBMYW1iZGFJbnRlZ3JhdGlvbihzZXJ2ZXJGdW5jdGlvbiwge1xuICAgICAgcmVzcG9uc2VUcmFuc2Zlck1vZGU6IFJlc3BvbnNlVHJhbnNmZXJNb2RlLlNUUkVBTSxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5keW5hbWljSW50ZWdyYXRpb25Qcm9wcyxcbiAgICB9KTtcblxuICAgIC8vIEFkZCBjYXRjaC1hbGwgcm91dGVzIHdpdGggc3RyZWFtaW5nIGludGVncmF0aW9uIGZvciBzZXJ2ZXItc2lkZSByZW5kZXJpbmdcbiAgICB0aGlzLmJhc2VSZXNvdXJjZS5hZGRNZXRob2QoXCJBTllcIiwgc3RyZWFtaW5nSW50ZWdyYXRpb24pO1xuICAgIGNvbnN0IHByb3h5UmVzb3VyY2UgPSB0aGlzLmJhc2VSZXNvdXJjZS5hZGRSZXNvdXJjZShcIntwcm94eSt9XCIpO1xuICAgIHByb3h5UmVzb3VyY2UuYWRkTWV0aG9kKFwiQU5ZXCIsIHN0cmVhbWluZ0ludGVncmF0aW9uKTtcbiAgfVxufVxuIl19
232
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9uZXh0anMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSw2Q0FBMEM7QUFDMUMsK0RBWW9DO0FBRXBDLGlEQUs2QjtBQUc3QiwyQ0FBdUM7QUFFdkMsaURBQWdFO0FBOERoRTs7R0FFRztBQUNILE1BQWEsU0FBVSxTQUFRLHNCQUFTOztJQUN0Qzs7T0FFRztJQUNhLEdBQUcsQ0FBVTtJQUU3Qjs7Ozs7Ozs7T0FRRztJQUNILElBQUksR0FBRztRQUNMLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO1FBQ3pDLHdFQUF3RTtRQUN4RSxvRUFBb0U7UUFDcEUsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxZQUFZO1lBQ25DLENBQUMsQ0FBQztnQkFDRSxXQUFXLFlBQVksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsUUFBUTthQUN6RDtZQUNILENBQUMsQ0FBQztnQkFDRSxXQUFXLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxnQkFBZ0IsbUJBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxnQkFBZ0I7Z0JBQ2xGLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLFNBQVM7YUFDbkMsQ0FBQztRQUNOLE9BQU8sSUFBQSxvQkFBUSxFQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRWdCLFlBQVksQ0FBWTtJQUN4QixZQUFZLENBQVk7SUFDeEIsS0FBSyxDQUFpQjtJQUMvQixxQkFBcUIsQ0FBUTtJQUVyQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXFCO1FBQzdELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFB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QUNLLHdCQUF3QixDQUFDLGNBQXlCO1FBQ3hELHdEQUF3RDtRQUN4RCxNQUFNLG9CQUFvQixHQUFHLElBQUksa0NBQWlCLENBQUMsY0FBYyxFQUFFO1lBQ2pFLG9CQUFvQixFQUFFLHFDQUFvQixDQUFDLE1BQU07WUFDakQsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSx1QkFBdUI7U0FDakQsQ0FBQyxDQUFDO1FBRUgsNEVBQTRFO1FBQzVFLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hFLGFBQWEsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFDdkQsQ0FBQzs7QUF2UEgsOEJBd1BDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2l6ZSwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7XG4gIFJlc3RBcGksXG4gIExhbWJkYUludGVncmF0aW9uLFxuICBBd3NJbnRlZ3JhdGlvbixcbiAgTWV0aG9kT3B0aW9ucyxcbiAgSVJlc291cmNlLFxuICBFbmRwb2ludFR5cGUsXG4gIFJlc3RBcGlQcm9wcyxcbiAgQXdzSW50ZWdyYXRpb25Qcm9wcyxcbiAgTGFtYmRhSW50ZWdyYXRpb25PcHRpb25zLFxuICBQYXNzdGhyb3VnaEJlaGF2aW9yLFxuICBSZXNwb25zZVRyYW5zZmVyTW9kZSxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5XCI7XG5pbXBvcnQgeyBJVnBjIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7XG4gIFJvbGUsXG4gIFNlcnZpY2VQcmluY2lwYWwsXG4gIFBvbGljeVN0YXRlbWVudCxcbiAgSVJvbGUsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgeyBJRnVuY3Rpb24gfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHsgSUJ1Y2tldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBQdWJsaWNEaXJFbnRyeSB9IGZyb20gXCIuL25leHRqcy1idWlsZC9uZXh0anMtYnVpbGRcIjtcbmltcG9ydCB7IGpvaW5QYXRoLCBub3JtYWxpemVCYXNlUGF0aCB9IGZyb20gXCIuL3V0aWxzL2Jhc2UtcGF0aFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0FwaU92ZXJyaWRlcyB7XG4gIHJlYWRvbmx5IHJlc3RBcGlQcm9wcz86IFJlc3RBcGlQcm9wcztcbiAgcmVhZG9ubHkgc3RhdGljSW50ZWdyYXRpb25Qcm9wcz86IEF3c0ludGVncmF0aW9uUHJvcHM7XG4gIHJlYWRvbmx5IHMzTWV0aG9kT3B0aW9ucz86IE1ldGhvZE9wdGlvbnM7XG4gIHJlYWRvbmx5IGR5bmFtaWNJbnRlZ3JhdGlvblByb3BzPzogTGFtYmRhSW50ZWdyYXRpb25PcHRpb25zO1xuICByZWFkb25seSBpbWFnZUludGVncmF0aW9uUHJvcHM/OiBMYW1iZGFJbnRlZ3JhdGlvbk9wdGlvbnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzQXBpUHJvcHMge1xuICAvKipcbiAgICogT3B0aW9uYWwgYmFzZSBwYXRoIGZvciB0aGUgYXBwbGljYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGJhc2VQYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogT3ZlcnJpZGUgcHJvcHMgZm9yIGV2ZXJ5IGNvbnN0cnVjdC5cbiAgICovXG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IE5leHRqc0FwaU92ZXJyaWRlcztcbiAgLyoqXG4gICAqIFBhdGggdG8gZGlyZWN0b3J5IG9mIE5leHQuanMgYXBwJ3MgcHVibGljIGRpcmVjdG9yeS4gVXNlZCB0byBhZGQgcmVzb3VyY2VzXG4gICAqIHRvIEFQSSBHYXRld2F5IFJFU1QgQVBJIGZvciBwdWJsaWMgZGlyZWN0b3J5IHRvIGdvIGRpcmVjdGx5IHRvIFMzLlxuICAgKi9cbiAgcmVhZG9ubHkgcHVibGljRGlyRW50cmllczogUHVibGljRGlyRW50cnlbXTtcbiAgLyoqXG4gICAqIFJlcXVpcmVkIGlmIGBOZXh0anNSZWdpb25hbEZ1bmN0aW9uc2AuIFRoZSBMYW1iZGEgZnVuY3Rpb24gZm9yIHNlcnZlci1zaWRlIHJlbmRlcmluZ1xuICAgKi9cbiAgcmVhZG9ubHkgc2VydmVyRnVuY3Rpb24/OiBJRnVuY3Rpb247XG4gIC8qKlxuICAgKiBEZWRpY2F0ZWQgaW1hZ2Ugb3B0aW1pemF0aW9uIExhbWJkYSBmb3IgdGhlIGBfbmV4dC9pbWFnZWAgcm91dGUuIFdoZW5cbiAgICogb21pdHRlZCwgbm8gYF9uZXh0L2ltYWdlYCByZXNvdXJjZSBpcyBjcmVhdGVkIGFuZCB0aG9zZSByZXF1ZXN0cyBmYWxsXG4gICAqIHRocm91Z2ggdG8gYHNlcnZlckZ1bmN0aW9uYCB2aWEgdGhlIGB7cHJveHkrfWAgY2F0Y2gtYWxsLlxuICAgKlxuICAgKiBXaGVuIHByb3ZpZGVkLCBpdCBpcyBhc3N1bWVkIHRvIHN1cHBvcnQgTGFtYmRhIHJlc3BvbnNlIHN0cmVhbWluZyAoYXMgdGhlXG4gICAqIGRlZGljYXRlZCBpbWFnZSBMYW1iZGEgdGhpcyBwYWNrYWdlIGJ1aWxkcyBkb2VzKSBhbmQgaXMgaW52b2tlZCB3aXRoXG4gICAqIGBSZXNwb25zZVRyYW5zZmVyTW9kZS5TVFJFQU1gIGFjY29yZGluZ2x5LiBJZiB5b3Ugc3VwcGx5IGEgY3VzdG9tXG4gICAqIGBpbWFnZUZ1bmN0aW9uYCB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBzdHJlYW1pbmcsIG92ZXJyaWRlXG4gICAqIGByZXNwb25zZVRyYW5zZmVyTW9kZWAgdG8gYEJVRkZFUkVEYCB2aWEgYG92ZXJyaWRlcy5pbWFnZUludGVncmF0aW9uUHJvcHNgLFxuICAgKiBvdGhlcndpc2UgQVBJIEdhdGV3YXkgcmV0dXJucyBhIDUwMi5cbiAgICovXG4gIHJlYWRvbmx5IGltYWdlRnVuY3Rpb24/OiBJRnVuY3Rpb247XG4gIC8qKlxuICAgKiBUaGUgUzMgYnVja2V0IGNvbnRhaW5pbmcgc3RhdGljIGFzc2V0c1xuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGljQXNzZXRzQnVja2V0OiBJQnVja2V0O1xuICAvKipcbiAgICogUzMga2V5IHByZWZpeCB0aGUgc3RhdGljIGFzc2V0cyB3ZXJlIHVwbG9hZGVkIHVuZGVyLCBpLmUuXG4gICAqIGBOZXh0anNTdGF0aWNBc3NldHMua2V5UHJlZml4YCwgd2hpY2ggbmFtZXNwYWNlcyBhIHNoYXJlZCBidWNrZXQuXG4gICAqXG4gICAqIEluZGVwZW5kZW50IG9mIGBiYXNlUGF0aGAgYWJvdmU6IHRoYXQgb25lIGlzIHRoZSBVUkwgcHJlZml4IHRoZSBSRVNUIEFQSVxuICAgKiBzZXJ2ZXMgdGhlIGFwcCBhdCAoY29tbW9ubHkgdGhlIEFQSSBHYXRld2F5IHN0YWdlKSwgd2hpbGUgdGhpcyBvbmUgaXMgd2hlcmVcbiAgICogdGhlIG9iamVjdHMgbGl2ZSBpbiB0aGUgYnVja2V0LiBgX25leHQvc3RhdGljYCBhbmQgcHVibGljIGRpcmVjdG9yeVxuICAgKiByZXF1ZXN0cyBhcmUgbWFwcGVkIHRvIFMzIGtleXMgZGlyZWN0bHksIHNvIHRoZXkgNDA0IHVubGVzcyB0aGlzIHByZWZpeCBpc1xuICAgKiBhcHBsaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGljQXNzZXRzS2V5UHJlZml4Pzogc3RyaW5nO1xuICAvKipcbiAgICogW0Z1dHVyZV0gUmVxdWlyZWQgaWYgYE5leHRqc1JlZ2lvbmFsQ29udGFpbmVyc2AuIFZQQyB0byBjcmVhdGUgVlBDIExpbmsgYW5kIEVDUyBTZXJ2aWNlIERpc2NvdmVyeVxuICAgKi9cbiAgcmVhZG9ubHkgdnBjPzogSVZwYztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIEFQSSBHYXRld2F5IFJFU1QgQVBJIGZvciBOZXh0LmpzIGFwcGxpY2F0aW9uc1xuICovXG5leHBvcnQgY2xhc3MgTmV4dGpzQXBpIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFRoZSBBUEkgR2F0ZXdheSBSRVNUIEFQSVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFwaTogUmVzdEFwaTtcblxuICAvKipcbiAgICogUHVibGljIFVSTCBvZiB0aGUgYXBwLCBpbmNsdWRpbmcgZXZlcnkgcGF0aCBzZWdtZW50IHRoZSBBUEkgbmVzdHMgaXQgdW5kZXIuXG4gICAqIFByZWZlcnMgYSBjdXN0b20gZG9tYWluIGNvbmZpZ3VyZWQgdGhyb3VnaCBgb3ZlcnJpZGVzLnJlc3RBcGlQcm9wcy5kb21haW5OYW1lYFxuICAgKiBvdmVyIHRoZSBleGVjdXRlLWFwaSBlbmRwb2ludC5cbiAgICpcbiAgICogQSBkb21haW4gYXR0YWNoZWQgYWZ0ZXIgdGhpcyBjb25zdHJ1Y3QgaXMgY3JlYXRlZCAoYGFwaS5hZGREb21haW5OYW1lKClgKSBpc1xuICAgKiBzdGlsbCB1c2VkIGZvciB0aGUgaG9zdCwgYnV0IENESyBrZWVwcyBpdHMgYmFzZSBwYXRoIG1hcHBpbmdzIHByaXZhdGUsIHNvIGFcbiAgICogbWFwcGluZyBhZGRlZCB0aGF0IHdheSB3b24ndCBzaG93IHVwIGhlcmUuXG4gICAqL1xuICBnZXQgdXJsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgY3VzdG9tRG9tYWluID0gdGhpcy5hcGkuZG9tYWluTmFtZTtcbiAgICAvLyBBIGN1c3RvbSBkb21haW4gcmVhY2hlcyB0aGUgc3RhZ2UgdGhyb3VnaCBhIGJhc2UgcGF0aCBtYXBwaW5nLCBzbyB0aGVcbiAgICAvLyBzdGFnZSBuYW1lIGlzbid0IGluIHRoZSBwYXRoIHRoZXJlOyB0aGUgbWFwcGluZyBtYXkgYmUsIHdoZW4gc2V0LlxuICAgIGNvbnN0IFtvcmlnaW4sIHByZWZpeF0gPSBjdXN0b21Eb21haW5cbiAgICAgID8gW1xuICAgICAgICAgIGBodHRwczovLyR7Y3VzdG9tRG9tYWluLmRvbWFpbk5hbWV9YCxcbiAgICAgICAgICB0aGlzLnByb3BzLm92ZXJyaWRlcz8ucmVzdEFwaVByb3BzPy5kb21haW5OYW1lPy5iYXNlUGF0aCxcbiAgICAgICAgXVxuICAgICAgOiBbXG4gICAgICAgICAgYGh0dHBzOi8vJHt0aGlzLmFwaS5yZXN0QXBpSWR9LmV4ZWN1dGUtYXBpLiR7U3RhY2sub2YodGhpcykucmVnaW9ufS5hbWF6b25hd3MuY29tYCxcbiAgICAgICAgICB0aGlzLmFwaS5kZXBsb3ltZW50U3RhZ2Uuc3RhZ2VOYW1lLFxuICAgICAgICBdO1xuICAgIHJldHVybiBqb2luUGF0aChvcmlnaW4sIHByZWZpeCwgdGhpcy5wcm9wcy5iYXNlUGF0aCk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGJhc2VSZXNvdXJjZTogSVJlc291cmNlO1xuICBwcml2YXRlIHJlYWRvbmx5IG5leHRSZXNvdXJjZTogSVJlc291cmNlO1xuICBwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBOZXh0anNBcGlQcm9wcztcbiAgcHJpdmF0ZSBzdGF0aWNJbnRlZ3JhdGlvblJvbGU6IElSb2xlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBOZXh0anNBcGlQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuXG4gICAgdGhpcy52YWxpZGF0ZVByb3BzKHByb3BzKTtcbiAgICB0aGlzLmFwaSA9IHRoaXMuY3JlYXRlUmVzdEFwaSgpO1xuICAgIHRoaXMuYmFzZVJlc291cmNlID0gdGhpcy5jcmVhdGVCYXNlUmVzb3VyY2UocHJvcHMuYmFzZVBhdGgpO1xuICAgIHRoaXMubmV4dFJlc291cmNlID0gdGhpcy5iYXNlUmVzb3VyY2UuYWRkUmVzb3VyY2UoXCJfbmV4dFwiKTtcbiAgICB0aGlzLnN0YXRpY0ludGVncmF0aW9uUm9sZSA9IHRoaXMuY3JlYXRlU3RhdGljSW50ZWdyYXRpb25Sb2xlKCk7XG4gICAgdGhpcy5jcmVhdGVTdGF0aWNJbnRlZ3JhdGlvbnMoKTtcbiAgICBpZiAocHJvcHMuc2VydmVyRnVuY3Rpb24pIHtcbiAgICAgIC8vIFdpdGhvdXQgYSBkZWRpY2F0ZWQgaW1hZ2UgZnVuY3Rpb24sIGBfbmV4dC9pbWFnZWAgZmFsbHMgdGhyb3VnaCB0byB0aGVcbiAgICAgIC8vIGB7cHJveHkrfWAgY2F0Y2gtYWxsIG9uIHRoZSBzZXJ2ZXIgZnVuY3Rpb24uXG4gICAgICBpZiAocHJvcHMuaW1hZ2VGdW5jdGlvbikge1xuICAgICAgICB0aGlzLmNyZWF0ZUltYWdlSW50ZWdyYXRpb24ocHJvcHMuaW1hZ2VGdW5jdGlvbik7XG4gICAgICB9XG4gICAgICB0aGlzLmNyZWF0ZUR5bmFtaWNJbnRlZ3JhdGlvbihwcm9wcy5zZXJ2ZXJGdW5jdGlvbik7XG4gICAgfSBlbHNlIGlmIChwcm9wcy52cGMpIHtcbiAgICAgIC8vIFtGdXR1cmVdIGNyZWF0ZSBpbnRlZ3JhdGlvbiB3aXRoIEVDUyB2aWEgVlBDIExpbmsgYW5kIEVDUyBTZXJ2aWNlIERpc2NvdmVyeVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVQcm9wcyhwcm9wczogTmV4dGpzQXBpUHJvcHMpIHtcbiAgICBpZiAoIXByb3BzLnNlcnZlckZ1bmN0aW9uICYmICFwcm9wcy52cGMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInNlcnZlckZ1bmN0aW9uIG9yIHZwYyBtdXN0IGJlIHNldCBpbiBOZXh0anNBcGlQcm9wc1wiKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJlc3RBcGkoKTogUmVzdEFwaSB7XG4gICAgcmV0dXJuIG5ldyBSZXN0QXBpKHRoaXMsIFwiUmVzdEFwaVwiLCB7XG4gICAgICBiaW5hcnlNZWRpYVR5cGVzOiBbXCIqLypcIl0sXG4gICAgICBkZXNjcmlwdGlvbjogYGNkay1uZXh0anMgUkVTVCBBUEkgZm9yICR7U3RhY2sub2YodGhpcykuc3RhY2tOYW1lfWAsXG4gICAgICBlbmRwb2ludFR5cGVzOiBbRW5kcG9pbnRUeXBlLlJFR0lPTkFMXSxcbiAgICAgIG1pbkNvbXByZXNzaW9uU2l6ZTogU2l6ZS5ieXRlcygwKSwgLy8gY29tcHJlc3MgYWxsIHJlc3BvbnNlcyBmb3IgYmV0dGVyIHBlcmZcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5yZXN0QXBpUHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGJhc2UgcmVzb3VyY2UgcGF0aCBpZiBuZWVkZWQuIEltcG9ydGFudCBpZiBgYmFzZVBhdGhgIGlzIHNldC5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQmFzZVJlc291cmNlKGJhc2VQYXRoPzogc3RyaW5nKTogSVJlc291cmNlIHtcbiAgICAvLyBDcmVhdGUgYmFzZSByZXNvdXJjZSBwYXRoIGlmIG5lZWRlZFxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVCYXNlUGF0aChiYXNlUGF0aCk7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWQgPyB0aGlzLmFwaS5yb290LmFkZFJlc291cmNlKG5vcm1hbGl6ZWQpIDogdGhpcy5hcGkucm9vdDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU3RhdGljSW50ZWdyYXRpb25Sb2xlKCkge1xuICAgIC8vIENyZWF0ZSBTMyBpbnRlZ3JhdGlvbiByb2xlXG4gICAgY29uc3Qgc3RhdGljSW50ZWdyYXRpb25Sb2xlID0gbmV3IFJvbGUodGhpcywgXCJTdGF0aWNJbnRlZ3JhdGlvblJvbGVcIiwge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgU2VydmljZVByaW5jaXBhbChcImFwaWdhdGV3YXkuYW1hem9uYXdzLmNvbVwiKSxcbiAgICB9KTtcblxuICAgIHN0YXRpY0ludGVncmF0aW9uUm9sZS5hZGRUb1BvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbXCJzMzpHZXRPYmplY3RcIiwgXCJzMzpMaXN0QnVja2V0XCJdLFxuICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICB0aGlzLnByb3BzLnN0YXRpY0Fzc2V0c0J1Y2tldC5idWNrZXRBcm4sXG4gICAgICAgICAgYCR7dGhpcy5wcm9wcy5zdGF0aWNBc3NldHNCdWNrZXQuYnVja2V0QXJufS8qYCxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIHN0YXRpY0ludGVncmF0aW9uUm9sZTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU3RhdGljSW50ZWdyYXRpb25zKCkge1xuICAgIHRoaXMubmV4dFJlc291cmNlXG4gICAgICAuYWRkUmVzb3VyY2UoXCJzdGF0aWNcIilcbiAgICAgIC5hZGRSZXNvdXJjZShcIntwcm94eSt9XCIpXG4gICAgICAuYWRkTWV0aG9kKFxuICAgICAgICBcIkdFVFwiLFxuICAgICAgICB0aGlzLmNyZWF0ZVMzSW50ZWdyYXRpb24oeyBrZXk6IHRoaXMuczNLZXkoXCJfbmV4dC9zdGF0aWMve2tleX1cIikgfSksXG4gICAgICAgIHRoaXMuZ2V0U3RhdGljTWV0aG9kT3B0aW9ucyh7IHByb3h5OiB0cnVlIH0pLFxuICAgICAgKTtcbiAgICAvLyBhZGQgcHVibGljIGRpcmVjdG9yeSBmaWxlcy9kaXJlY3RvcmllcyB0aGF0IGV4aXN0IGF0IHRvcCBsZXZlbCBidXQgbmVlZCB0byBnbyB0byBTMy5cbiAgICBmb3IgKGNvbnN0IHB1YmxpY0RpckVudHJ5IG9mIHRoaXMucHJvcHMucHVibGljRGlyRW50cmllcykge1xuICAgICAgaWYgKHB1YmxpY0RpckVudHJ5LmlzRGlyZWN0b3J5KSB7XG4gICAgICAgIHRoaXMuYmFzZVJlc291cmNlXG4gICAgICAgICAgLmFkZFJlc291cmNlKHB1YmxpY0RpckVudHJ5Lm5hbWUpXG4gICAgICAgICAgLmFkZFJlc291cmNlKFwie3Byb3h5K31cIilcbiAgICAgICAgICAuYWRkTWV0aG9kKFxuICAgICAgICAgICAgXCJHRVRcIixcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlUzNJbnRlZ3JhdGlvbih7XG4gICAgICAgICAgICAgIGtleTogdGhpcy5zM0tleShgJHtwdWJsaWNEaXJFbnRyeS5uYW1lfS97a2V5fWApLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aGlzLmdldFN0YXRpY01ldGhvZE9wdGlvbnMoeyBwcm94eTogdHJ1ZSB9KSxcbiAgICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5iYXNlUmVzb3VyY2VcbiAgICAgICAgICAuYWRkUmVzb3VyY2UocHVibGljRGlyRW50cnkubmFtZSlcbiAgICAgICAgICAuYWRkTWV0aG9kKFxuICAgICAgICAgICAgXCJHRVRcIixcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlUzNJbnRlZ3JhdGlvbih7IGtleTogdGhpcy5zM0tleShwdWJsaWNEaXJFbnRyeS5uYW1lKSB9KSxcbiAgICAgICAgICAgIHRoaXMuZ2V0U3RhdGljTWV0aG9kT3B0aW9ucygpLFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZWZpeGVzIGEgcmVxdWVzdCBwYXRoIHdpdGggdGhlIGtleSBwcmVmaXggdGhlIGFzc2V0cyB3ZXJlIHVwbG9hZGVkIHVuZGVyLFxuICAgKiBzaW5jZSB0aGUgUzMgaW50ZWdyYXRpb25zIGFkZHJlc3Mgb2JqZWN0cyBieSBrZXkgcmF0aGVyIHRoYW4gYnkgVVJMLlxuICAgKi9cbiAgcHJpdmF0ZSBzM0tleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGpvaW5QYXRoKHRoaXMucHJvcHMuc3RhdGljQXNzZXRzS2V5UHJlZml4LCBrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgQVBJIHJlcXVlc3QgdG8gUzMgcmVxdWVzdC5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvcmVzdC1hcGktcGFyYW1ldGVyLW1hcHBpbmctc291cmNlcy5odG1sXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2ludGVncmF0aW5nLWFwaS13aXRoLWF3cy1zZXJ2aWNlcy1zMy5odG1sI2FwaS1pdGVtcy1pbi1mb2xkZXItYXMtczMtb2JqZWN0cy1pbi1idWNrZXRcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlUzNJbnRlZ3JhdGlvbih7IGtleSB9OiB7IGtleTogc3RyaW5nIH0pIHtcbiAgICBjb25zdCBzM0ludGVncmF0aW9uID0gbmV3IEF3c0ludGVncmF0aW9uKHtcbiAgICAgIHNlcnZpY2U6IFwiczNcIixcbiAgICAgIGludGVncmF0aW9uSHR0cE1ldGhvZDogXCJHRVRcIixcbiAgICAgIHBhdGg6IGAke3RoaXMucHJvcHMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldE5hbWV9LyR7a2V5fWAsXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIGNyZWRlbnRpYWxzUm9sZTogdGhpcy5zdGF0aWNJbnRlZ3JhdGlvblJvbGUsXG4gICAgICAgIHBhc3N0aHJvdWdoQmVoYXZpb3I6IFBhc3N0aHJvdWdoQmVoYXZpb3IuV0hFTl9OT19URU1QTEFURVMsIC8vIHJlY29tbWVuZGVkXG4gICAgICAgIHJlcXVlc3RQYXJhbWV0ZXJzOiBrZXkuaW5jbHVkZXMoXCJ7a2V5fVwiKVxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBcImludGVncmF0aW9uLnJlcXVlc3QucGF0aC5rZXlcIjogXCJtZXRob2QucmVxdWVzdC5wYXRoLnByb3h5XCIsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGludGVncmF0aW9uUmVzcG9uc2VzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3RhdHVzQ29kZTogXCIyMDBcIixcbiAgICAgICAgICAgIHJlc3BvbnNlUGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICBcIm1ldGhvZC5yZXNwb25zZS5oZWFkZXIuQ29udGVudC1UeXBlXCI6XG4gICAgICAgICAgICAgICAgXCJpbnRlZ3JhdGlvbi5yZXNwb25zZS5oZWFkZXIuQ29udGVudC1UeXBlXCIsXG4gICAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5Db250ZW50LUxlbmd0aFwiOlxuICAgICAgICAgICAgICAgIFwiaW50ZWdyYXRpb24ucmVzcG9uc2UuaGVhZGVyLkNvbnRlbnQtTGVuZ3RoXCIsXG4gICAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5DYWNoZS1Db250cm9sXCI6XG4gICAgICAgICAgICAgICAgXCJpbnRlZ3JhdGlvbi5yZXNwb25zZS5oZWFkZXIuQ2FjaGUtQ29udHJvbFwiLFxuICAgICAgICAgICAgICBcIm1ldGhvZC5yZXNwb25zZS5oZWFkZXIuRVRhZ1wiOiBcImludGVncmF0aW9uLnJlc3BvbnNlLmhlYWRlci5FVGFnXCIsXG4gICAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5MYXN0LU1vZGlmaWVkXCI6XG4gICAgICAgICAgICAgICAgXCJpbnRlZ3JhdGlvbi5yZXNwb25zZS5oZWFkZXIuTGFzdC1Nb2RpZmllZFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHN0YXR1c0NvZGU6IFwiNDA0XCIsXG4gICAgICAgICAgICBzZWxlY3Rpb25QYXR0ZXJuOiBcIjQwNFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LnN0YXRpY0ludGVncmF0aW9uUHJvcHMsXG4gICAgfSk7XG4gICAgcmV0dXJuIHMzSW50ZWdyYXRpb247XG4gIH1cblxuICBwcml2YXRlIGdldFN0YXRpY01ldGhvZE9wdGlvbnMoeyBwcm94eSB9ID0geyBwcm94eTogZmFsc2UgfSk6IE1ldGhvZE9wdGlvbnMge1xuICAgIHJldHVybiB7XG4gICAgICByZXF1ZXN0UGFyYW1ldGVyczogcHJveHlcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBcIm1ldGhvZC5yZXF1ZXN0LnBhdGgucHJveHlcIjogdHJ1ZSxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgbWV0aG9kUmVzcG9uc2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBzdGF0dXNDb2RlOiBcIjIwMFwiLFxuICAgICAgICAgIHJlc3BvbnNlUGFyYW1ldGVyczoge1xuICAgICAgICAgICAgXCJtZXRob2QucmVzcG9uc2UuaGVhZGVyLkNvbnRlbnQtVHlwZVwiOiB0cnVlLFxuICAgICAgICAgICAgXCJtZXRob2QucmVzcG9uc2UuaGVhZGVyLkNvbnRlbnQtTGVuZ3RoXCI6IHRydWUsXG4gICAgICAgICAgICBcIm1ldGhvZC5yZXNwb25zZS5oZWFkZXIuQ2FjaGUtQ29udHJvbFwiOiB0cnVlLFxuICAgICAgICAgICAgXCJtZXRob2QucmVzcG9uc2UuaGVhZGVyLkVUYWdcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5MYXN0LU1vZGlmaWVkXCI6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHN0YXR1c0NvZGU6IFwiNDA0XCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LnMzTWV0aG9kT3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBMYW1iZGEgUHJveHkgaW50ZWdyYXRpb24gZm9yIHRoZSBgX25leHQvaW1hZ2VgIHJvdXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVJbWFnZUludGVncmF0aW9uKGltYWdlRnVuY3Rpb246IElGdW5jdGlvbikge1xuICAgIC8vIGltYWdlRnVuY3Rpb24gaXMgYXNzdW1lZCB0byBiZSB0aGUgZGVkaWNhdGVkLCBzdHJlYW1pbmctY2FwYWJsZSBpbWFnZVxuICAgIC8vIExhbWJkYSAoc2VlIGl0cyBkb2MgY29tbWVudCk7IG92ZXJyaWRlIHJlc3BvbnNlVHJhbnNmZXJNb2RlIHZpYVxuICAgIC8vIGltYWdlSW50ZWdyYXRpb25Qcm9wcyBpZiB0aGF0IGFzc3VtcHRpb24gZG9lc24ndCBob2xkIGZvciBhIGN1c3RvbVxuICAgIC8vIGltYWdlRnVuY3Rpb24sIG90aGVyd2lzZSBBUEkgR2F0ZXdheSByZXR1cm5zIGEgNTAyLiBEZWxpYmVyYXRlbHlcbiAgICAvLyBkb2Vzbid0IGluaGVyaXQgZHluYW1pY0ludGVncmF0aW9uUHJvcHM6IHRoYXQncyBmb3Igc2VydmVyRnVuY3Rpb24sXG4gICAgLy8gYSBkaWZmZXJlbnQgTGFtYmRhIHdpdGggZGlmZmVyZW50IChhbmQgcG9zc2libHkgY29uZmxpY3RpbmcsIGUuZy5cbiAgICAvLyBCVUZGRVJFRCBmb3IgYSBub24tc3RyZWFtaW5nIExhbWJkYSBXZWIgQWRhcHRlciBzZXR1cCkgc3RyZWFtaW5nXG4gICAgLy8gcmVxdWlyZW1lbnRzIHRoYW4gdGhlIGFsd2F5cy1zdHJlYW1pbmcgZGVkaWNhdGVkIGltYWdlIExhbWJkYS5cbiAgICBjb25zdCBpbWFnZUludGVncmF0aW9uID0gbmV3IExhbWJkYUludGVncmF0aW9uKGltYWdlRnVuY3Rpb24sIHtcbiAgICAgIHJlc3BvbnNlVHJhbnNmZXJNb2RlOiBSZXNwb25zZVRyYW5zZmVyTW9kZS5TVFJFQU0sXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uaW1hZ2VJbnRlZ3JhdGlvblByb3BzLFxuICAgIH0pO1xuICAgIGNvbnN0IGltYWdlUmVzb3VyY2UgPSB0aGlzLm5leHRSZXNvdXJjZS5hZGRSZXNvdXJjZShcImltYWdlXCIpO1xuICAgIGltYWdlUmVzb3VyY2UuYWRkTWV0aG9kKFwiQU5ZXCIsIGltYWdlSW50ZWdyYXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBMYW1iZGEgUHJveHkgaW50ZWdyYXRpb24gZm9yIGFsbCBvdGhlciByb3V0ZXNcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRHluYW1pY0ludGVncmF0aW9uKHNlcnZlckZ1bmN0aW9uOiBJRnVuY3Rpb24pIHtcbiAgICAvLyBBbGwgb3RoZXIgcm91dGVzIHVzZSBzdHJlYW1pbmcgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICAgIGNvbnN0IHN0cmVhbWluZ0ludGVncmF0aW9uID0gbmV3IExhbWJkYUludGVncmF0aW9uKHNlcnZlckZ1bmN0aW9uLCB7XG4gICAgICByZXNwb25zZVRyYW5zZmVyTW9kZTogUmVzcG9uc2VUcmFuc2Zlck1vZGUuU1RSRUFNLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LmR5bmFtaWNJbnRlZ3JhdGlvblByb3BzLFxuICAgIH0pO1xuXG4gICAgLy8gQWRkIGNhdGNoLWFsbCByb3V0ZXMgd2l0aCBzdHJlYW1pbmcgaW50ZWdyYXRpb24gZm9yIHNlcnZlci1zaWRlIHJlbmRlcmluZ1xuICAgIHRoaXMuYmFzZVJlc291cmNlLmFkZE1ldGhvZChcIkFOWVwiLCBzdHJlYW1pbmdJbnRlZ3JhdGlvbik7XG4gICAgY29uc3QgcHJveHlSZXNvdXJjZSA9IHRoaXMuYmFzZVJlc291cmNlLmFkZFJlc291cmNlKFwie3Byb3h5K31cIik7XG4gICAgcHJveHlSZXNvdXJjZS5hZGRNZXRob2QoXCJBTllcIiwgc3RyZWFtaW5nSW50ZWdyYXRpb24pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /* eslint-disable import/no-extraneous-dependencies */
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const assertions_1 = require("aws-cdk-lib/assertions");
6
+ const aws_certificatemanager_1 = require("aws-cdk-lib/aws-certificatemanager");
7
+ const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
8
+ const aws_s3_1 = require("aws-cdk-lib/aws-s3");
9
+ const nextjs_api_1 = require("./nextjs-api");
10
+ describe("NextjsApi", () => {
11
+ let stack;
12
+ beforeEach(() => {
13
+ stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), "TestStack", {
14
+ env: { account: "123456789012", region: "us-east-1" },
15
+ });
16
+ });
17
+ function createApi(staticAssetsKeyPrefix) {
18
+ return new nextjs_api_1.NextjsApi(stack, "NextjsApi", {
19
+ staticAssetsBucket: aws_s3_1.Bucket.fromBucketName(stack, "Bucket", "my-bucket"),
20
+ staticAssetsKeyPrefix,
21
+ serverFunction: new aws_lambda_1.Function(stack, "ServerFn", {
22
+ runtime: aws_lambda_1.Runtime.NODEJS_22_X,
23
+ handler: "index.handler",
24
+ code: aws_lambda_1.Code.fromInline("exports.handler = async () => {};"),
25
+ }),
26
+ publicDirEntries: [
27
+ { name: "favicon.ico", isDirectory: false },
28
+ { name: "images", isDirectory: true },
29
+ ],
30
+ });
31
+ }
32
+ /**
33
+ * The S3 integrations address objects by key, so the uploaded key prefix has
34
+ * to appear in the integration URI or every static request 404s.
35
+ */
36
+ function s3IntegrationKeys() {
37
+ const methods = assertions_1.Template.fromStack(stack).findResources("AWS::ApiGateway::Method");
38
+ const marker = "s3:path/my-bucket/";
39
+ return Object.values(methods)
40
+ .flatMap((method) => method.Properties.Integration.Uri["Fn::Join"][1])
41
+ .filter((part) => typeof part === "string" && part.includes(marker))
42
+ .map((part) => part.split(marker)[1]);
43
+ }
44
+ it("addresses objects at the bucket root when no key prefix is set", () => {
45
+ createApi();
46
+ expect(s3IntegrationKeys().sort()).toEqual([
47
+ "_next/static/{key}",
48
+ "favicon.ico",
49
+ "images/{key}",
50
+ ]);
51
+ });
52
+ it("prefixes every S3 integration key with the static assets key prefix", () => {
53
+ createApi("branch-x");
54
+ expect(s3IntegrationKeys().sort()).toEqual([
55
+ "branch-x/_next/static/{key}",
56
+ "branch-x/favicon.ico",
57
+ "branch-x/images/{key}",
58
+ ]);
59
+ });
60
+ it("normalizes surrounding slashes on the key prefix", () => {
61
+ createApi("/branch-x/");
62
+ expect(s3IntegrationKeys()).toContain("branch-x/_next/static/{key}");
63
+ });
64
+ it("keeps the key prefix independent of basePath, which is the URL prefix", () => {
65
+ // A NextjsRegionalFunctions app whose `basePath` matches the API Gateway
66
+ // stage still has its assets at the bucket root.
67
+ new nextjs_api_1.NextjsApi(stack, "NextjsApi", {
68
+ staticAssetsBucket: aws_s3_1.Bucket.fromBucketName(stack, "Bucket", "my-bucket"),
69
+ basePath: "/prod",
70
+ serverFunction: new aws_lambda_1.Function(stack, "ServerFn", {
71
+ runtime: aws_lambda_1.Runtime.NODEJS_22_X,
72
+ handler: "index.handler",
73
+ code: aws_lambda_1.Code.fromInline("exports.handler = async () => {};"),
74
+ }),
75
+ publicDirEntries: [],
76
+ });
77
+ expect(s3IntegrationKeys()).toEqual(["_next/static/{key}"]);
78
+ // ...served under the stage-matching URL prefix.
79
+ assertions_1.Template.fromStack(stack).hasResourceProperties("AWS::ApiGateway::Resource", { PathPart: "prod" });
80
+ });
81
+ describe("url", () => {
82
+ function createApiWithOverrides(props = {}) {
83
+ return new nextjs_api_1.NextjsApi(stack, "NextjsApi", {
84
+ staticAssetsBucket: aws_s3_1.Bucket.fromBucketName(stack, "Bucket", "my-bucket"),
85
+ serverFunction: new aws_lambda_1.Function(stack, "ServerFn", {
86
+ runtime: aws_lambda_1.Runtime.NODEJS_22_X,
87
+ handler: "index.handler",
88
+ code: aws_lambda_1.Code.fromInline("exports.handler = async () => {};"),
89
+ }),
90
+ publicDirEntries: [],
91
+ ...props,
92
+ });
93
+ }
94
+ function domainName(basePath) {
95
+ return {
96
+ domainName: "app.example.com",
97
+ certificate: aws_certificatemanager_1.Certificate.fromCertificateArn(stack, "Cert", "arn:aws:acm:us-east-1:123456789012:certificate/abc"),
98
+ basePath,
99
+ };
100
+ }
101
+ /**
102
+ * The REST API id, the stage name and the domain name are all tokens that
103
+ * only resolve at deploy time, so flatten the resolved `Fn::Join` and stand
104
+ * each reference in for the resource it points at (minus CDK's logical id
105
+ * hash suffix). That keeps the assertions about *which* resource supplies
106
+ * each part of the URL, which is the whole question here.
107
+ */
108
+ function resolveUrl(api) {
109
+ const resolved = stack.resolve(api.url);
110
+ if (typeof resolved === "string") {
111
+ return resolved;
112
+ }
113
+ return resolved["Fn::Join"][1]
114
+ .map((part) => typeof part === "string"
115
+ ? part
116
+ : `{${part.Ref.replace(/[0-9A-F]{8}$/, "")}}`)
117
+ .join("");
118
+ }
119
+ it("reports the execute-api endpoint with the stage appended when there's no custom domain", () => {
120
+ // The stage is in the path only here, which is the whole reason the
121
+ // regional-functions example sets an app basePath of "/prod".
122
+ expect(resolveUrl(createApiWithOverrides())).toBe("https://{NextjsApiRestApi}.execute-api.us-east-1.amazonaws.com/{NextjsApiRestApiDeploymentStageprod}");
123
+ });
124
+ it("appends basePath, which nests every resource a level down", () => {
125
+ expect(resolveUrl(createApiWithOverrides({ basePath: "/my-base-path" }))).toBe("https://{NextjsApiRestApi}.execute-api.us-east-1.amazonaws.com/{NextjsApiRestApiDeploymentStageprod}/my-base-path");
126
+ });
127
+ it("prefers a custom domain and drops the stage from the path", () => {
128
+ // A domain mapped at the root is the cleanest Regional setup: no stage in
129
+ // the URL means no basePath and no stage workarounds anywhere. The stage is
130
+ // reached through the domain's base path mapping instead.
131
+ expect(resolveUrl(createApiWithOverrides({
132
+ overrides: { restApiProps: { domainName: domainName() } },
133
+ }))).toBe("https://{NextjsApiRestApiCustomDomain}");
134
+ });
135
+ it("includes a custom domain's base path mapping", () => {
136
+ // CDK rejects surrounding slashes on a mapping, so it's always a bare
137
+ // segment by the time it gets here.
138
+ expect(resolveUrl(createApiWithOverrides({
139
+ overrides: { restApiProps: { domainName: domainName("team-a") } },
140
+ }))).toBe("https://{NextjsApiRestApiCustomDomain}/team-a");
141
+ });
142
+ });
143
+ });
144
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWFwaS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25leHRqcy1hcGkudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNEQUFzRDtBQUN0RCw2Q0FBeUM7QUFDekMsdURBQWtEO0FBQ2xELCtFQUFpRTtBQUNqRSx1REFJZ0M7QUFDaEMsK0NBQTRDO0FBQzVDLDZDQUF5RDtBQUV6RCxRQUFRLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRTtJQUN6QixJQUFJLEtBQVksQ0FBQztJQUVqQixVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsS0FBSyxHQUFHLElBQUksbUJBQUssQ0FBQyxJQUFJLGlCQUFHLEVBQUUsRUFBRSxXQUFXLEVBQUU7WUFDeEMsR0FBRyxFQUFFLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFO1NBQ3RELENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsU0FBUyxTQUFTLENBQUMscUJBQThCO1FBQy9DLE9BQU8sSUFBSSxzQkFBUyxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUU7WUFDdkMsa0JBQWtCLEVBQUUsZUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQztZQUN2RSxxQkFBcUI7WUFDckIsY0FBYyxFQUFFLElBQUkscUJBQWMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFO2dCQUNwRCxPQUFPLEVBQUUsb0JBQU8sQ0FBQyxXQUFXO2dCQUM1QixPQUFPLEVBQUUsZUFBZTtnQkFDeEIsSUFBSSxFQUFFLGlCQUFJLENBQUMsVUFBVSxDQUFDLG1DQUFtQyxDQUFDO2FBQzNELENBQUM7WUFDRixnQkFBZ0IsRUFBRTtnQkFDaEIsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUU7Z0JBQzNDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO2FB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InNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuaW1wb3J0IHsgQXBwLCBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXNzZXJ0aW9uc1wiO1xuaW1wb3J0IHsgQ2VydGlmaWNhdGUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlclwiO1xuaW1wb3J0IHtcbiAgQ29kZSxcbiAgRnVuY3Rpb24gYXMgTGFtYmRhRnVuY3Rpb24sXG4gIFJ1bnRpbWUsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBCdWNrZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCI7XG5pbXBvcnQgeyBOZXh0anNBcGksIE5leHRqc0FwaVByb3BzIH0gZnJvbSBcIi4vbmV4dGpzLWFwaVwiO1xuXG5kZXNjcmliZShcIk5leHRqc0FwaVwiLCAoKSA9PiB7XG4gIGxldCBzdGFjazogU3RhY2s7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgc3RhY2sgPSBuZXcgU3RhY2sobmV3IEFwcCgpLCBcIlRlc3RTdGFja1wiLCB7XG4gICAgICBlbnY6IHsgYWNjb3VudDogXCIxMjM0NTY3ODkwMTJcIiwgcmVnaW9uOiBcInVzLWVhc3QtMVwiIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZUFwaShzdGF0aWNBc3NldHNLZXlQcmVmaXg/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IE5leHRqc0FwaShzdGFjaywgXCJOZXh0anNBcGlcIiwge1xuICAgICAgc3RhdGljQXNzZXRzQnVja2V0OiBCdWNrZXQuZnJvbUJ1Y2tldE5hbWUoc3RhY2ssIFwiQnVja2V0XCIsIFwibXktYnVja2V0XCIpLFxuICAgICAgc3RhdGljQXNzZXRzS2V5UHJlZml4LFxuICAgICAgc2VydmVyRnVuY3Rpb246IG5ldyBMYW1iZGFGdW5jdGlvbihzdGFjaywgXCJTZXJ2ZXJGblwiLCB7XG4gICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoXCJleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiB7fTtcIiksXG4gICAgICB9KSxcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IFtcbiAgICAgICAgeyBuYW1lOiBcImZhdmljb24uaWNvXCIsIGlzRGlyZWN0b3J5OiBmYWxzZSB9LFxuICAgICAgICB7IG5hbWU6IFwiaW1hZ2VzXCIsIGlzRGlyZWN0b3J5OiB0cnVlIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBTMyBpbnRlZ3JhdGlvbnMgYWRkcmVzcyBvYmplY3RzIGJ5IGtleSwgc28gdGhlIHVwbG9hZGVkIGtleSBwcmVmaXggaGFzXG4gICAqIHRvIGFwcGVhciBpbiB0aGUgaW50ZWdyYXRpb24gVVJJIG9yIGV2ZXJ5IHN0YXRpYyByZXF1ZXN0IDQwNHMuXG4gICAqL1xuICBmdW5jdGlvbiBzM0ludGVncmF0aW9uS2V5cygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgbWV0aG9kcyA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuZmluZFJlc291cmNlcyhcbiAgICAgIFwiQVdTOjpBcGlHYXRld2F5OjpNZXRob2RcIixcbiAgICApO1xuICAgIGNvbnN0IG1hcmtlciA9IFwiczM6cGF0aC9teS1idWNrZXQvXCI7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMobWV0aG9kcylcbiAgICAgIC5mbGF0TWFwKChtZXRob2QpID0+IG1ldGhvZC5Qcm9wZXJ0aWVzLkludGVncmF0aW9uLlVyaVtcIkZuOjpKb2luXCJdWzFdKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHBhcnQ6IHVua25vd24pOiBwYXJ0IGlzIHN0cmluZyA9PlxuICAgICAgICAgIHR5cGVvZiBwYXJ0ID09PSBcInN0cmluZ1wiICYmIHBhcnQuaW5jbHVkZXMobWFya2VyKSxcbiAgICAgIClcbiAgICAgIC5tYXAoKHBhcnQpID0+IHBhcnQuc3BsaXQobWFya2VyKVsxXSk7XG4gIH1cblxuICBpdChcImFkZHJlc3NlcyBvYmplY3RzIGF0IHRoZSBidWNrZXQgcm9vdCB3aGVuIG5vIGtleSBwcmVmaXggaXMgc2V0XCIsICgpID0+IHtcbiAgICBjcmVhdGVBcGkoKTtcblxuICAgIGV4cGVjdChzM0ludGVncmF0aW9uS2V5cygpLnNvcnQoKSkudG9FcXVhbChbXG4gICAgICBcIl9uZXh0L3N0YXRpYy97a2V5fVwiLFxuICAgICAgXCJmYXZpY29uLmljb1wiLFxuICAgICAgXCJpbWFnZXMve2tleX1cIixcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoXCJwcmVmaXhlcyBldmVyeSBTMyBpbnRlZ3JhdGlvbiBrZXkgd2l0aCB0aGUgc3RhdGljIGFzc2V0cyBrZXkgcHJlZml4XCIsICgpID0+IHtcbiAgICBjcmVhdGVBcGkoXCJicmFuY2gteFwiKTtcblxuICAgIGV4cGVjdChzM0ludGVncmF0aW9uS2V5cygpLnNvcnQoKSkudG9FcXVhbChbXG4gICAgICBcImJyYW5jaC14L19uZXh0L3N0YXRpYy97a2V5fVwiLFxuICAgICAgXCJicmFuY2gteC9mYXZpY29uLmljb1wiLFxuICAgICAgXCJicmFuY2gteC9pbWFnZXMve2tleX1cIixcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoXCJub3JtYWxpemVzIHN1cnJvdW5kaW5nIHNsYXNoZXMgb24gdGhlIGtleSBwcmVmaXhcIiwgKCkgPT4ge1xuICAgIGNyZWF0ZUFwaShcIi9icmFuY2gteC9cIik7XG5cbiAgICBleHBlY3QoczNJbnRlZ3JhdGlvbktleXMoKSkudG9Db250YWluKFwiYnJhbmNoLXgvX25leHQvc3RhdGljL3trZXl9XCIpO1xuICB9KTtcblxuICBpdChcImtlZXBzIHRoZSBrZXkgcHJlZml4IGluZGVwZW5kZW50IG9mIGJhc2VQYXRoLCB3aGljaCBpcyB0aGUgVVJMIHByZWZpeFwiLCAoKSA9PiB7XG4gICAgLy8gQSBOZXh0anNSZWdpb25hbEZ1bmN0aW9ucyBhcHAgd2hvc2UgYGJhc2VQYXRoYCBtYXRjaGVzIHRoZSBBUEkgR2F0ZXdheVxuICAgIC8vIHN0YWdlIHN0aWxsIGhhcyBpdHMgYXNzZXRzIGF0IHRoZSBidWNrZXQgcm9vdC5cbiAgICBuZXcgTmV4dGpzQXBpKHN0YWNrLCBcIk5leHRqc0FwaVwiLCB7XG4gICAgICBzdGF0aWNBc3NldHNCdWNrZXQ6IEJ1Y2tldC5mcm9tQnVja2V0TmFtZShzdGFjaywgXCJCdWNrZXRcIiwgXCJteS1idWNrZXRcIiksXG4gICAgICBiYXNlUGF0aDogXCIvcHJvZFwiLFxuICAgICAgc2VydmVyRnVuY3Rpb246IG5ldyBMYW1iZGFGdW5jdGlvbihzdGFjaywgXCJTZXJ2ZXJGblwiLCB7XG4gICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoXCJleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiB7fTtcIiksXG4gICAgICB9KSxcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IFtdLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KHMzSW50ZWdyYXRpb25LZXlzKCkpLnRvRXF1YWwoW1wiX25leHQvc3RhdGljL3trZXl9XCJdKTtcbiAgICAvLyAuLi5zZXJ2ZWQgdW5kZXIgdGhlIHN0YWdlLW1hdGNoaW5nIFVSTCBwcmVmaXguXG4gICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoXG4gICAgICBcIkFXUzo6QXBpR2F0ZXdheTo6UmVzb3VyY2VcIixcbiAgICAgIHsgUGF0aFBhcnQ6IFwicHJvZFwiIH0sXG4gICAgKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJ1cmxcIiwgKCkgPT4ge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUFwaVdpdGhPdmVycmlkZXMoXG4gICAgICBwcm9wczogUGFydGlhbDxOZXh0anNBcGlQcm9wcz4gPSB7fSxcbiAgICApOiBOZXh0anNBcGkge1xuICAgICAgcmV0dXJuIG5ldyBOZXh0anNBcGkoc3RhY2ssIFwiTmV4dGpzQXBpXCIsIHtcbiAgICAgICAgc3RhdGljQXNzZXRzQnVja2V0OiBCdWNrZXQuZnJvbUJ1Y2tldE5hbWUoc3RhY2ssIFwiQnVja2V0XCIsIFwibXktYnVja2V0XCIpLFxuICAgICAgICBzZXJ2ZXJGdW5jdGlvbjogbmV3IExhbWJkYUZ1bmN0aW9uKHN0YWNrLCBcIlNlcnZlckZuXCIsIHtcbiAgICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZShcImV4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+IHt9O1wiKSxcbiAgICAgICAgfSksXG4gICAgICAgIHB1YmxpY0RpckVudHJpZXM6IFtdLFxuICAgICAgICAuLi5wcm9wcyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRvbWFpbk5hbWUoYmFzZVBhdGg/OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRvbWFpbk5hbWU6IFwiYXBwLmV4YW1wbGUuY29tXCIsXG4gICAgICAgIGNlcnRpZmljYXRlOiBDZXJ0aWZpY2F0ZS5mcm9tQ2VydGlmaWNhdGVBcm4oXG4gICAgICAgICAgc3RhY2ssXG4gICAgICAgICAgXCJDZXJ0XCIsXG4gICAgICAgICAgXCJhcm46YXdzOmFjbTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmNlcnRpZmljYXRlL2FiY1wiLFxuICAgICAgICApLFxuICAgICAgICBiYXNlUGF0aCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIFJFU1QgQVBJIGlkLCB0aGUgc3RhZ2UgbmFtZSBhbmQgdGhlIGRvbWFpbiBuYW1lIGFyZSBhbGwgdG9rZW5zIHRoYXRcbiAgICAgKiBvbmx5IHJlc29sdmUgYXQgZGVwbG95IHRpbWUsIHNvIGZsYXR0ZW4gdGhlIHJlc29sdmVkIGBGbjo6Sm9pbmAgYW5kIHN0YW5kXG4gICAgICogZWFjaCByZWZlcmVuY2UgaW4gZm9yIHRoZSByZXNvdXJjZSBpdCBwb2ludHMgYXQgKG1pbnVzIENESydzIGxvZ2ljYWwgaWRcbiAgICAgKiBoYXNoIHN1ZmZpeCkuIFRoYXQga2VlcHMgdGhlIGFzc2VydGlvbnMgYWJvdXQgKndoaWNoKiByZXNvdXJjZSBzdXBwbGllc1xuICAgICAqIGVhY2ggcGFydCBvZiB0aGUgVVJMLCB3aGljaCBpcyB0aGUgd2hvbGUgcXVlc3Rpb24gaGVyZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXNvbHZlVXJsKGFwaTogTmV4dGpzQXBpKTogc3RyaW5nIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gc3RhY2sucmVzb2x2ZShhcGkudXJsKTtcbiAgICAgIGlmICh0eXBlb2YgcmVzb2x2ZWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc29sdmVkW1wiRm46OkpvaW5cIl1bMV1cbiAgICAgICAgLm1hcCgocGFydDogdW5rbm93bikgPT5cbiAgICAgICAgICB0eXBlb2YgcGFydCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgPyBwYXJ0XG4gICAgICAgICAgICA6IGB7JHsocGFydCBhcyB7IFJlZjogc3RyaW5nIH0pLlJlZi5yZXBsYWNlKC9bMC05QS1GXXs4fSQvLCBcIlwiKX19YCxcbiAgICAgICAgKVxuICAgICAgICAuam9pbihcIlwiKTtcbiAgICB9XG5cbiAgICBpdChcInJlcG9ydHMgdGhlIGV4ZWN1dGUtYXBpIGVuZHBvaW50IHdpdGggdGhlIHN0YWdlIGFwcGVuZGVkIHdoZW4gdGhlcmUncyBubyBjdXN0b20gZG9tYWluXCIsICgpID0+IHtcbiAgICAgIC8vIFRoZSBzdGFnZSBpcyBpbiB0aGUgcGF0aCBvbmx5IGhlcmUsIHdoaWNoIGlzIHRoZSB3aG9sZSByZWFzb24gdGhlXG4gICAgICAvLyByZWdpb25hbC1mdW5jdGlvbnMgZXhhbXBsZSBzZXRzIGFuIGFwcCBiYXNlUGF0aCBvZiBcIi9wcm9kXCIuXG4gICAgICBleHBlY3QocmVzb2x2ZVVybChjcmVhdGVBcGlXaXRoT3ZlcnJpZGVzKCkpKS50b0JlKFxuICAgICAgICBcImh0dHBzOi8ve05leHRqc0FwaVJlc3RBcGl9LmV4ZWN1dGUtYXBpLnVzLWVhc3QtMS5hbWF6b25hd3MuY29tL3tOZXh0anNBcGlSZXN0QXBpRGVwbG95bWVudFN0YWdlcHJvZH1cIixcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdChcImFwcGVuZHMgYmFzZVBhdGgsIHdoaWNoIG5lc3RzIGV2ZXJ5IHJlc291cmNlIGEgbGV2ZWwgZG93blwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVVcmwoY3JlYXRlQXBpV2l0aE92ZXJyaWRlcyh7IGJhc2VQYXRoOiBcIi9teS1iYXNlLXBhdGhcIiB9KSksXG4gICAgICApLnRvQmUoXG4gICAgICAgIFwiaHR0cHM6Ly97TmV4dGpzQXBpUmVzdEFwaX0uZXhlY3V0ZS1hcGkudXMtZWFzdC0xLmFtYXpvbmF3cy5jb20ve05leHRqc0FwaVJlc3RBcGlEZXBsb3ltZW50U3RhZ2Vwcm9kfS9teS1iYXNlLXBhdGhcIixcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdChcInByZWZlcnMgYSBjdXN0b20gZG9tYWluIGFuZCBkcm9wcyB0aGUgc3RhZ2UgZnJvbSB0aGUgcGF0aFwiLCAoKSA9PiB7XG4gICAgICAvLyBBIGRvbWFpbiBtYXBwZWQgYXQgdGhlIHJvb3QgaXMgdGhlIGNsZWFuZXN0IFJlZ2lvbmFsIHNldHVwOiBubyBzdGFnZSBpblxuICAgICAgLy8gdGhlIFVSTCBtZWFucyBubyBiYXNlUGF0aCBhbmQgbm8gc3RhZ2Ugd29ya2Fyb3VuZHMgYW55d2hlcmUuIFRoZSBzdGFnZSBpc1xuICAgICAgLy8gcmVhY2hlZCB0aHJvdWdoIHRoZSBkb21haW4ncyBiYXNlIHBhdGggbWFwcGluZyBpbnN0ZWFkLlxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlVXJsKFxuICAgICAgICAgIGNyZWF0ZUFwaVdpdGhPdmVycmlkZXMoe1xuICAgICAgICAgICAgb3ZlcnJpZGVzOiB7IHJlc3RBcGlQcm9wczogeyBkb21haW5OYW1lOiBkb21haW5OYW1lKCkgfSB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgKS50b0JlKFwiaHR0cHM6Ly97TmV4dGpzQXBpUmVzdEFwaUN1c3RvbURvbWFpbn1cIik7XG4gICAgfSk7XG5cbiAgICBpdChcImluY2x1ZGVzIGEgY3VzdG9tIGRvbWFpbidzIGJhc2UgcGF0aCBtYXBwaW5nXCIsICgpID0+IHtcbiAgICAgIC8vIENESyByZWplY3RzIHN1cnJvdW5kaW5nIHNsYXNoZXMgb24gYSBtYXBwaW5nLCBzbyBpdCdzIGFsd2F5cyBhIGJhcmVcbiAgICAgIC8vIHNlZ21lbnQgYnkgdGhlIHRpbWUgaXQgZ2V0cyBoZXJlLlxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlVXJsKFxuICAgICAgICAgIGNyZWF0ZUFwaVdpdGhPdmVycmlkZXMoe1xuICAgICAgICAgICAgb3ZlcnJpZGVzOiB7IHJlc3RBcGlQcm9wczogeyBkb21haW5OYW1lOiBkb21haW5OYW1lKFwidGVhbS1hXCIpIH0gfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICAgICkudG9CZShcImh0dHBzOi8ve05leHRqc0FwaVJlc3RBcGlDdXN0b21Eb21haW59L3RlYW0tYVwiKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==