@aligent/cdk-prerender-proxy 0.2.4-beta → 0.2.4-beta1

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/index.d.ts CHANGED
@@ -3,5 +3,5 @@ import { PrerenderFunction } from "./lib/prerender-construct";
3
3
  import { PrerenderCheckFunction } from "./lib/prerender-check-construct";
4
4
  import { ErrorResponseFunction } from "./lib/error-response-construct";
5
5
  import { CloudFrontCacheControl, CloudFrontCacheControlOptions } from "./lib/prerender-cf-cache-control-construct";
6
- import { handler as PrerenderCheckFunctionHandler } from "./lib/handlers/prerender-check";
7
- export { PrerenderLambda, PrerenderFunction, PrerenderCheckFunction, ErrorResponseFunction, CloudFrontCacheControl, CloudFrontCacheControlOptions, PrerenderCheckFunctionHandler, };
6
+ import { sendToPrerender } from './lib/sendToPrerender';
7
+ export { PrerenderLambda, PrerenderFunction, PrerenderCheckFunction, ErrorResponseFunction, CloudFrontCacheControl, CloudFrontCacheControlOptions, sendToPrerender };
package/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PrerenderCheckFunctionHandler = exports.CloudFrontCacheControl = exports.ErrorResponseFunction = exports.PrerenderCheckFunction = exports.PrerenderFunction = exports.PrerenderLambda = void 0;
3
+ exports.sendToPrerender = exports.CloudFrontCacheControl = exports.ErrorResponseFunction = exports.PrerenderCheckFunction = exports.PrerenderFunction = exports.PrerenderLambda = void 0;
4
4
  const prerender_lambda_construct_1 = require("./lib/prerender-lambda-construct");
5
5
  Object.defineProperty(exports, "PrerenderLambda", { enumerable: true, get: function () { return prerender_lambda_construct_1.PrerenderLambda; } });
6
6
  const prerender_construct_1 = require("./lib/prerender-construct");
@@ -11,6 +11,6 @@ const error_response_construct_1 = require("./lib/error-response-construct");
11
11
  Object.defineProperty(exports, "ErrorResponseFunction", { enumerable: true, get: function () { return error_response_construct_1.ErrorResponseFunction; } });
12
12
  const prerender_cf_cache_control_construct_1 = require("./lib/prerender-cf-cache-control-construct");
13
13
  Object.defineProperty(exports, "CloudFrontCacheControl", { enumerable: true, get: function () { return prerender_cf_cache_control_construct_1.CloudFrontCacheControl; } });
14
- const prerender_check_1 = require("./lib/handlers/prerender-check");
15
- Object.defineProperty(exports, "PrerenderCheckFunctionHandler", { enumerable: true, get: function () { return prerender_check_1.handler; } });
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpRkFBbUU7QUFVakUsZ0dBVk8sNENBQWUsT0FVUDtBQVRqQixtRUFBOEQ7QUFVNUQsa0dBVk8sdUNBQWlCLE9BVVA7QUFUbkIsK0VBQXlFO0FBVXZFLHVHQVZPLGtEQUFzQixPQVVQO0FBVHhCLDZFQUF1RTtBQVVyRSxzR0FWTyxnREFBcUIsT0FVUDtBQVR2QixxR0FHb0Q7QUFPbEQsdUdBVEEsNkRBQXNCLE9BU0E7QUFOeEIsb0VBQTBGO0FBUXhGLDhHQVJrQix5QkFBNkIsT0FRbEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQcmVyZW5kZXJMYW1iZGEgfSBmcm9tIFwiLi9saWIvcHJlcmVuZGVyLWxhbWJkYS1jb25zdHJ1Y3RcIjtcbmltcG9ydCB7IFByZXJlbmRlckZ1bmN0aW9uIH0gZnJvbSBcIi4vbGliL3ByZXJlbmRlci1jb25zdHJ1Y3RcIjtcbmltcG9ydCB7IFByZXJlbmRlckNoZWNrRnVuY3Rpb24gfSBmcm9tIFwiLi9saWIvcHJlcmVuZGVyLWNoZWNrLWNvbnN0cnVjdFwiO1xuaW1wb3J0IHsgRXJyb3JSZXNwb25zZUZ1bmN0aW9uIH0gZnJvbSBcIi4vbGliL2Vycm9yLXJlc3BvbnNlLWNvbnN0cnVjdFwiO1xuaW1wb3J0IHtcbiAgQ2xvdWRGcm9udENhY2hlQ29udHJvbCxcbiAgQ2xvdWRGcm9udENhY2hlQ29udHJvbE9wdGlvbnMsXG59IGZyb20gXCIuL2xpYi9wcmVyZW5kZXItY2YtY2FjaGUtY29udHJvbC1jb25zdHJ1Y3RcIjtcbmltcG9ydCB7IGhhbmRsZXIgYXMgUHJlcmVuZGVyQ2hlY2tGdW5jdGlvbkhhbmRsZXIgfSBmcm9tIFwiLi9saWIvaGFuZGxlcnMvcHJlcmVuZGVyLWNoZWNrXCI7XG5leHBvcnQge1xuICBQcmVyZW5kZXJMYW1iZGEsXG4gIFByZXJlbmRlckZ1bmN0aW9uLFxuICBQcmVyZW5kZXJDaGVja0Z1bmN0aW9uLFxuICBFcnJvclJlc3BvbnNlRnVuY3Rpb24sXG4gIENsb3VkRnJvbnRDYWNoZUNvbnRyb2wsXG4gIENsb3VkRnJvbnRDYWNoZUNvbnRyb2xPcHRpb25zLFxuICBQcmVyZW5kZXJDaGVja0Z1bmN0aW9uSGFuZGxlcixcbn07XG4iXX0=
14
+ const sendToPrerender_1 = require("./lib/sendToPrerender");
15
+ Object.defineProperty(exports, "sendToPrerender", { enumerable: true, get: function () { return sendToPrerender_1.sendToPrerender; } });
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpRkFBbUU7QUFVakUsZ0dBVk8sNENBQWUsT0FVUDtBQVRqQixtRUFBOEQ7QUFVNUQsa0dBVk8sdUNBQWlCLE9BVVA7QUFUbkIsK0VBQXlFO0FBVXZFLHVHQVZPLGtEQUFzQixPQVVQO0FBVHhCLDZFQUF1RTtBQVVyRSxzR0FWTyxnREFBcUIsT0FVUDtBQVR2QixxR0FHb0Q7QUFPbEQsdUdBVEEsNkRBQXNCLE9BU0E7QUFOeEIsMkRBQXdEO0FBUXRELGdHQVJPLGlDQUFlLE9BUVAiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQcmVyZW5kZXJMYW1iZGEgfSBmcm9tIFwiLi9saWIvcHJlcmVuZGVyLWxhbWJkYS1jb25zdHJ1Y3RcIjtcbmltcG9ydCB7IFByZXJlbmRlckZ1bmN0aW9uIH0gZnJvbSBcIi4vbGliL3ByZXJlbmRlci1jb25zdHJ1Y3RcIjtcbmltcG9ydCB7IFByZXJlbmRlckNoZWNrRnVuY3Rpb24gfSBmcm9tIFwiLi9saWIvcHJlcmVuZGVyLWNoZWNrLWNvbnN0cnVjdFwiO1xuaW1wb3J0IHsgRXJyb3JSZXNwb25zZUZ1bmN0aW9uIH0gZnJvbSBcIi4vbGliL2Vycm9yLXJlc3BvbnNlLWNvbnN0cnVjdFwiO1xuaW1wb3J0IHtcbiAgQ2xvdWRGcm9udENhY2hlQ29udHJvbCxcbiAgQ2xvdWRGcm9udENhY2hlQ29udHJvbE9wdGlvbnMsXG59IGZyb20gXCIuL2xpYi9wcmVyZW5kZXItY2YtY2FjaGUtY29udHJvbC1jb25zdHJ1Y3RcIjtcbmltcG9ydCB7IHNlbmRUb1ByZXJlbmRlciB9IGZyb20gJy4vbGliL3NlbmRUb1ByZXJlbmRlcic7XG5leHBvcnQge1xuICBQcmVyZW5kZXJMYW1iZGEsXG4gIFByZXJlbmRlckZ1bmN0aW9uLFxuICBQcmVyZW5kZXJDaGVja0Z1bmN0aW9uLFxuICBFcnJvclJlc3BvbnNlRnVuY3Rpb24sXG4gIENsb3VkRnJvbnRDYWNoZUNvbnRyb2wsXG4gIENsb3VkRnJvbnRDYWNoZUNvbnRyb2xPcHRpb25zLFxuICBzZW5kVG9QcmVyZW5kZXIgXG59O1xuIl19
@@ -0,0 +1,13 @@
1
+ import 'source-map-support/register';
2
+ import {sendToPrerender} from '../sendToPrerender';
3
+ import { CloudFrontRequest, CloudFrontRequestEvent, CloudFrontResponse } from 'aws-lambda';
4
+
5
+ const PRERENDER_TOKEN = process.env.PRERENDER_TOKEN;
6
+ const PATH_PREFIX = process.env.PATH_PREFIX;
7
+ const PRERENDER_URL = process.env.PRERENDER_URL;
8
+
9
+ export const handler = async (event: CloudFrontRequestEvent): Promise<CloudFrontResponse|CloudFrontRequest> => {
10
+ let request = event.Records[0].cf.request;
11
+
12
+ return sendToPrerender(request)
13
+ }
@@ -0,0 +1,2 @@
1
+ import 'source-map-support/register';
2
+ export declare const sendToPrerender: (request: any) => any;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sendToPrerender = void 0;
4
+ require("source-map-support/register");
5
+ const PRERENDER_TOKEN = process.env.PRERENDER_TOKEN;
6
+ const PATH_PREFIX = process.env.PATH_PREFIX;
7
+ const PRERENDER_URL = process.env.PRERENDER_URL;
8
+ const sendToPrerender = (request) => {
9
+ // viewer-request function will determine whether we prerender or not
10
+ // if we should we add prerender as our custom origin
11
+ if (request.headers['x-request-prerender']) {
12
+ // Cloudfront will alter the request for / to /index.html
13
+ // since it is defined as the default root object
14
+ // we do not want to do this when prerendering the homepage
15
+ if (request.uri === `${PATH_PREFIX}/index.html`) {
16
+ request.uri = `${PATH_PREFIX}/`;
17
+ }
18
+ request.origin = {
19
+ custom: {
20
+ domainName: PRERENDER_URL,
21
+ port: 443,
22
+ protocol: 'https',
23
+ readTimeout: 20,
24
+ keepaliveTimeout: 5,
25
+ sslProtocols: ['TLSv1', 'TLSv1.1', 'TLSv1.2'],
26
+ path: '/https%3A%2F%2F' + request.headers['x-prerender-host'][0].value,
27
+ customHeaders: {
28
+ 'x-prerender-token': [{
29
+ key: 'x-prerender-token',
30
+ value: PRERENDER_TOKEN
31
+ }]
32
+ }
33
+ }
34
+ };
35
+ }
36
+ else {
37
+ request.uri = `${PATH_PREFIX}/index.html`;
38
+ }
39
+ return request;
40
+ };
41
+ exports.sendToPrerender = sendToPrerender;
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZFRvUHJlcmVuZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2VuZFRvUHJlcmVuZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVDQUFxQztBQUVyQyxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQztBQUNwRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQztBQUM1QyxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQztBQUV6QyxNQUFNLGVBQWUsR0FBRyxDQUFDLE9BQVksRUFBRSxFQUFFO0lBQzVDLHFFQUFxRTtJQUN2RSxxREFBcUQ7SUFDckQsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLEVBQUU7UUFDMUMseURBQXlEO1FBQ3pELGlEQUFpRDtRQUNqRCwyREFBMkQ7UUFDM0QsSUFBSSxPQUFPLENBQUMsR0FBRyxLQUFLLEdBQUcsV0FBVyxhQUFhLEVBQUU7WUFDNUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxHQUFHLFdBQVcsR0FBRyxDQUFDO1NBQ3BDO1FBRUQsT0FBTyxDQUFDLE1BQU0sR0FBRztZQUNaLE1BQU0sRUFBRTtnQkFDSCxVQUFVLEVBQUUsYUFBYTtnQkFDekIsSUFBSSxFQUFFLEdBQUc7Z0JBQ1QsUUFBUSxFQUFFLE9BQU87Z0JBQ2pCLFdBQVcsRUFBRSxFQUFFO2dCQUNmLGdCQUFnQixFQUFFLENBQUM7Z0JBQ25CLFlBQVksRUFBRSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDO2dCQUM3QyxJQUFJLEVBQUUsaUJBQWlCLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUs7Z0JBQ3RFLGFBQWEsRUFBRTtvQkFDVixtQkFBbUIsRUFBRSxDQUFDOzRCQUNqQixHQUFHLEVBQUUsbUJBQW1COzRCQUN4QixLQUFLLEVBQUUsZUFBZTt5QkFDMUIsQ0FBQztpQkFDTjthQUNMO1NBQ0wsQ0FBQztLQUNMO1NBQU07UUFDSCxPQUFPLENBQUMsR0FBRyxHQUFHLEdBQUcsV0FBVyxhQUFhLENBQUM7S0FDN0M7SUFFRCxPQUFPLE9BQU8sQ0FBQztBQUNmLENBQUMsQ0FBQTtBQWpDWSxRQUFBLGVBQWUsbUJBaUMzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnc291cmNlLW1hcC1zdXBwb3J0L3JlZ2lzdGVyJztcblxuY29uc3QgUFJFUkVOREVSX1RPS0VOID0gcHJvY2Vzcy5lbnYuUFJFUkVOREVSX1RPS0VOO1xuY29uc3QgUEFUSF9QUkVGSVggPSBwcm9jZXNzLmVudi5QQVRIX1BSRUZJWDtcbmNvbnN0IFBSRVJFTkRFUl9VUkwgPSBwcm9jZXNzLmVudi5QUkVSRU5ERVJfVVJMO1xuXG5leHBvcnQgY29uc3Qgc2VuZFRvUHJlcmVuZGVyID0gKHJlcXVlc3Q6IGFueSkgPT4ge1xuICAgIC8vIHZpZXdlci1yZXF1ZXN0IGZ1bmN0aW9uIHdpbGwgZGV0ZXJtaW5lIHdoZXRoZXIgd2UgcHJlcmVuZGVyIG9yIG5vdFxuICAvLyBpZiB3ZSBzaG91bGQgd2UgYWRkIHByZXJlbmRlciBhcyBvdXIgY3VzdG9tIG9yaWdpblxuICBpZiAocmVxdWVzdC5oZWFkZXJzWyd4LXJlcXVlc3QtcHJlcmVuZGVyJ10pIHtcbiAgICAvLyBDbG91ZGZyb250IHdpbGwgYWx0ZXIgdGhlIHJlcXVlc3QgZm9yIC8gdG8gL2luZGV4Lmh0bWxcbiAgICAvLyBzaW5jZSBpdCBpcyBkZWZpbmVkIGFzIHRoZSBkZWZhdWx0IHJvb3Qgb2JqZWN0XG4gICAgLy8gd2UgZG8gbm90IHdhbnQgdG8gZG8gdGhpcyB3aGVuIHByZXJlbmRlcmluZyB0aGUgaG9tZXBhZ2VcbiAgICBpZiAocmVxdWVzdC51cmkgPT09IGAke1BBVEhfUFJFRklYfS9pbmRleC5odG1sYCkge1xuICAgICAgICAgcmVxdWVzdC51cmkgPSBgJHtQQVRIX1BSRUZJWH0vYDtcbiAgICB9XG5cbiAgICByZXF1ZXN0Lm9yaWdpbiA9IHtcbiAgICAgICAgIGN1c3RvbToge1xuICAgICAgICAgICAgICBkb21haW5OYW1lOiBQUkVSRU5ERVJfVVJMLFxuICAgICAgICAgICAgICBwb3J0OiA0NDMsXG4gICAgICAgICAgICAgIHByb3RvY29sOiAnaHR0cHMnLFxuICAgICAgICAgICAgICByZWFkVGltZW91dDogMjAsXG4gICAgICAgICAgICAgIGtlZXBhbGl2ZVRpbWVvdXQ6IDUsXG4gICAgICAgICAgICAgIHNzbFByb3RvY29sczogWydUTFN2MScsICdUTFN2MS4xJywgJ1RMU3YxLjInXSxcbiAgICAgICAgICAgICAgcGF0aDogJy9odHRwcyUzQSUyRiUyRicgKyByZXF1ZXN0LmhlYWRlcnNbJ3gtcHJlcmVuZGVyLWhvc3QnXVswXS52YWx1ZSxcbiAgICAgICAgICAgICAgY3VzdG9tSGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICd4LXByZXJlbmRlci10b2tlbic6IFt7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICd4LXByZXJlbmRlci10b2tlbicsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogUFJFUkVOREVSX1RPS0VOXG4gICAgICAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgfVxuICAgIH07XG59IGVsc2Uge1xuICAgIHJlcXVlc3QudXJpID0gYCR7UEFUSF9QUkVGSVh9L2luZGV4Lmh0bWxgO1xufVxuXG5yZXR1cm4gcmVxdWVzdDtcbn0gIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aligent/cdk-prerender-proxy",
3
- "version": "0.2.4-beta",
3
+ "version": "0.2.4-beta1",
4
4
  "description": "A Cloudfront Lambda@Edge stack for integrating with prerender.io",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -1,3 +0,0 @@
1
- import 'source-map-support/register';
2
- import { CloudFrontRequest, CloudFrontRequestEvent } from 'aws-lambda';
3
- export declare const handler: (event: CloudFrontRequestEvent) => Promise<CloudFrontRequest>;
@@ -1,26 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.handler = void 0;
4
- require("source-map-support/register");
5
- const IS_BOT = /googlebot|chrome-lighthouse|lighthouse|adsbot\-google|Feedfetcher\-Google|bingbot|yandex|baiduspider|Facebot|facebookexternalhit|twitterbot|rogerbot|linkedinbot|embedly|quora link preview|showyoubot|outbrain|pinterest|slackbot|vkShare|W3C_Validator/i;
6
- const IS_FILE = /\.(js|css|xml|less|png|jpg|jpeg|gif|pdf|doc|txt|ico|rss|zip|mp3|rar|exe|wmv|doc|avi|ppt|mpg|mpeg|tif|wav|mov|psd|ai|xls|mp4|m4a|swf|dat|dmg|iso|flv|m4v|torrent|ttf|woff|svg|eot)$/i;
7
- const handler = async (event) => {
8
- let request = event.Records[0].cf.request;
9
- // If the request is from a bot, is not a file and is not from prerender
10
- // then set the x-request-prerender header so the origin-request lambda function
11
- // alters the origin to prerender.io
12
- if (!IS_FILE.test(request.uri)
13
- && IS_BOT.test(request.headers['user-agent'][0].value)
14
- && !request.headers['x-prerender']) {
15
- request.headers['x-request-prerender'] = [
16
- {
17
- key: 'x-request-prerender',
18
- value: 'true'
19
- }
20
- ];
21
- request.headers['x-prerender-host'] = [{ key: 'X-Prerender-Host', value: request.headers.host[0].value }];
22
- }
23
- return request;
24
- };
25
- exports.handler = handler;
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlcmVuZGVyLWNoZWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicHJlcmVuZGVyLWNoZWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVDQUFxQztBQUdyQyxNQUFNLE1BQU0sR0FBRywyUEFBMlAsQ0FBQztBQUMzUSxNQUFNLE9BQU8sR0FBRyxxTEFBcUwsQ0FBQztBQUUvTCxNQUFNLE9BQU8sR0FBRyxLQUFLLEVBQUUsS0FBNkIsRUFBOEIsRUFBRTtJQUN2RixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUM7SUFFMUMsd0VBQXdFO0lBQ3hFLGdGQUFnRjtJQUNoRixvQ0FBb0M7SUFDcEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztXQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1dBQ25ELENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRTtRQUNwQyxPQUFPLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLEdBQUc7WUFDckM7Z0JBQ0ksR0FBRyxFQUFFLHFCQUFxQjtnQkFDMUIsS0FBSyxFQUFFLE1BQU07YUFDaEI7U0FDSixDQUFDO1FBRUYsT0FBTyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBQyxDQUFDLENBQUM7S0FDNUc7SUFFRCxPQUFPLE9BQU8sQ0FBQztBQUNuQixDQUFDLENBQUE7QUFwQlksUUFBQSxPQUFPLFdBb0JuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnc291cmNlLW1hcC1zdXBwb3J0L3JlZ2lzdGVyJztcbmltcG9ydCB7IENsb3VkRnJvbnRSZXF1ZXN0LCBDbG91ZEZyb250UmVxdWVzdEV2ZW50IH0gZnJvbSAnYXdzLWxhbWJkYSc7XG5cbmNvbnN0IElTX0JPVCA9IC9nb29nbGVib3R8Y2hyb21lLWxpZ2h0aG91c2V8bGlnaHRob3VzZXxhZHNib3RcXC1nb29nbGV8RmVlZGZldGNoZXJcXC1Hb29nbGV8YmluZ2JvdHx5YW5kZXh8YmFpZHVzcGlkZXJ8RmFjZWJvdHxmYWNlYm9va2V4dGVybmFsaGl0fHR3aXR0ZXJib3R8cm9nZXJib3R8bGlua2VkaW5ib3R8ZW1iZWRseXxxdW9yYSBsaW5rIHByZXZpZXd8c2hvd3lvdWJvdHxvdXRicmFpbnxwaW50ZXJlc3R8c2xhY2tib3R8dmtTaGFyZXxXM0NfVmFsaWRhdG9yL2k7XG5jb25zdCBJU19GSUxFID0gL1xcLihqc3xjc3N8eG1sfGxlc3N8cG5nfGpwZ3xqcGVnfGdpZnxwZGZ8ZG9jfHR4dHxpY298cnNzfHppcHxtcDN8cmFyfGV4ZXx3bXZ8ZG9jfGF2aXxwcHR8bXBnfG1wZWd8dGlmfHdhdnxtb3Z8cHNkfGFpfHhsc3xtcDR8bTRhfHN3ZnxkYXR8ZG1nfGlzb3xmbHZ8bTR2fHRvcnJlbnR8dHRmfHdvZmZ8c3ZnfGVvdCkkL2k7XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVyID0gYXN5bmMgKGV2ZW50OiBDbG91ZEZyb250UmVxdWVzdEV2ZW50KTogUHJvbWlzZTxDbG91ZEZyb250UmVxdWVzdD4gPT4ge1xuICAgIGxldCByZXF1ZXN0ID0gZXZlbnQuUmVjb3Jkc1swXS5jZi5yZXF1ZXN0O1xuXG4gICAgLy8gSWYgdGhlIHJlcXVlc3QgaXMgZnJvbSBhIGJvdCwgaXMgbm90IGEgZmlsZSBhbmQgaXMgbm90IGZyb20gcHJlcmVuZGVyXG4gICAgLy8gdGhlbiBzZXQgdGhlIHgtcmVxdWVzdC1wcmVyZW5kZXIgaGVhZGVyIHNvIHRoZSBvcmlnaW4tcmVxdWVzdCBsYW1iZGEgZnVuY3Rpb25cbiAgICAvLyBhbHRlcnMgdGhlIG9yaWdpbiB0byBwcmVyZW5kZXIuaW9cbiAgICBpZiAoIUlTX0ZJTEUudGVzdChyZXF1ZXN0LnVyaSkgXG4gICAgICAgICYmIElTX0JPVC50ZXN0KHJlcXVlc3QuaGVhZGVyc1sndXNlci1hZ2VudCddWzBdLnZhbHVlKVxuICAgICAgICAmJiAhcmVxdWVzdC5oZWFkZXJzWyd4LXByZXJlbmRlciddKSB7XG4gICAgICAgIHJlcXVlc3QuaGVhZGVyc1sneC1yZXF1ZXN0LXByZXJlbmRlciddID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGtleTogJ3gtcmVxdWVzdC1wcmVyZW5kZXInLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAndHJ1ZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgXTtcblxuICAgICAgICByZXF1ZXN0LmhlYWRlcnNbJ3gtcHJlcmVuZGVyLWhvc3QnXSA9IFt7IGtleTogJ1gtUHJlcmVuZGVyLUhvc3QnLCB2YWx1ZTogcmVxdWVzdC5oZWFkZXJzLmhvc3RbMF0udmFsdWV9XTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVxdWVzdDtcbn1cbiJdfQ==