UNPKG

cdk-nextjs-standalone

Version:

Deploy a NextJS app to AWS using CDK and OpenNext.

225 lines 26.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const sign_fn_url_1 = require("./sign-fn-url"); describe('LambdaOriginRequestIamAuth', () => { const originalEnv = process.env; beforeEach(() => { // dummy AWS credentials process.env = { ...process.env, ...getFakeAwsCreds() }; }); afterEach(() => { process.env = { ...originalEnv }; }); test('signRequest should add x-amz headers', async () => { const event = getFakePageRequest(); const request = event.Records[0].cf.request; await (0, sign_fn_url_1.signRequest)(request); const securityHeaders = [ 'x-amz-date', 'x-amz-security-token', 'x-amz-content-sha256', 'authorization', 'origin-authorization', ]; const hasSignedHeaders = securityHeaders.every((h) => h in request.headers); expect(hasSignedHeaders).toBe(true); }); test('signRequest should omit volatile headers', async () => { const event = getFakePageRequest(); const request = event.Records[0].cf.request; await (0, sign_fn_url_1.signRequest)(request); const signedAuthorizationHeader = request.headers.authorization[0].value; const volatileHeaders = ['via', 'x-forwarded-for']; volatileHeaders.forEach((h) => expect(signedAuthorizationHeader).not.toContain(h)); }); test('getRegionFromLambdaUrl should correctly get region', () => { const event = getFakePageRequest(); const request = event.Records[0].cf.request; const actual = (0, sign_fn_url_1.getRegionFromLambdaUrl)(request.origin?.custom?.domainName || ''); expect(actual).toBe('us-east-1'); }); }); function getFakePageRequest() { return { Records: [ { cf: { config: { distributionDomainName: 'd6b8brjqfujeb.cloudfront.net', distributionId: 'EHX2SDUU61T7U', eventType: 'origin-request', requestId: '', }, request: { clientIp: '1.1.1.1', headers: { authorization: [ { key: 'Authorization', value: 'Bearer token', }, ], host: [ { key: 'Host', value: 'd6b8brjqfujeb.cloudfront.net', }, ], 'accept-language': [ { key: 'Accept-Language', value: 'en-US,en;q=0.9', }, ], referer: [ { key: 'Referer', value: 'https://d6b8brjqfujeb.cloudfront.net/some/path', }, ], 'x-forwarded-for': [ { key: 'X-Forwarded-For', value: '1.1.1.1', }, ], 'user-agent': [ { key: 'User-Agent', value: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36', }, ], via: [ { key: 'Via', value: '2.0 8bf94e29f889f8d0076c4502ae008b58.cloudfront.net (CloudFront)', }, ], 'accept-encoding': [ { key: 'Accept-Encoding', value: 'br,gzip', }, ], 'sec-ch-ua': [ { key: 'sec-ch-ua', value: '"Google Chrome";v="113", "Chromium";v="113", "Not-A.Brand";v="24"', }, ], }, method: 'GET', querystring: '', uri: '/some/path', origin: { custom: { customHeaders: {}, domainName: 'kjtbbx7u533q7p7n5font6gpci0phrng.lambda-url.us-east-1.on.aws', keepaliveTimeout: 5, path: '', port: 443, protocol: 'https', readTimeout: 30, sslProtocols: ['TLSv1.2'], }, }, body: { action: 'read-only', data: '', encoding: 'base64', inputTruncated: false, }, }, }, }, ], }; } function getFakeAwsCreds() { return { AWS_REGION: 'us-east-1', AWS_ACCESS_KEY_ID: 'ZSBAT5GENDHC3XYRH36I', AWS_SECRET_ACCESS_KEY: 'jpWfApw1AO0xzGZeeT1byQq1zqfQITVqVhTkkql4', AWS_SESSION_TOKEN: 'ZQoJb3JpZ2luX2VjEFgaCXVzLWVhc3QtMSJGMEQCIHijzdTXh59aSe2hRfCWpFd2/jacPUC+8rCq3qBIiuG2AiAGX8jqld+p04nPYfuShi1lLN/Z1hEXG9QSNEmEFLTxGSqmAgiR//////////8BEAIaDDI2ODkxNDQ2NTIzMSIMrAMO5/GTvMgoG+chKvoB4f4V1TfkZiHOlmeMK6Ep58mav65A0WU3K9WPzdrJojnGqqTuS85zTlKhm3lfmMxCOtwS/OlOuiBQ1MZNlksK2je1FazgbXN46fNSi+iHiY9VfyRAd0wSLmXB8FFrCGsU92QOy/+deji0qIVadsjEyvBRxzQj5oIUI5sb74Yt7uNvka9fVZcT4s4IndYda0N7oZwIrApCuzzBMuoMAhabmgVrZTbiLmvOiFHS2XZWBySABdygqaIzfV7G4hjckvcXhtxpkw+HJUZTNzVUlspghzte1UG6VvIRV8ax3kWA3zqm8nA/1gHkl40DubJIXz1AJbg5Cps5moE1pjD7vNijBjqeAZh0Q/e0awIHnV4dXMfXUu5mWJ7Db9K1eUlSSL9FyiKeKd94HEdrbIrnPuIWVT/I/5RjNm7NgPYiqmpyx3fSpVcq9CKws0oEfBw6J9Hxk0IhV8yWFZYNMWIarUUZdmL9vVeJmFZmwyL4JjY1s/SZIU/oa8DtvkmP4RG4tTJfpyyhoKL0wJOevkYyoigNllBlLN59SZAT8CCADpN/B+sK', }; } // function getFakeImageEvent(): CloudFrontRequestEvent { // return { // Records: [ // { // cf: { // config: { // distributionDomainName: 'd6b8brjqfujeb.cloudfront.net', // distributionId: 'EHX2SDUU61T7U', // eventType: 'origin-request', // requestId: '', // }, // request: { // body: { // action: 'read-only', // data: '', // encoding: 'base64', // inputTruncated: false, // }, // clientIp: '35.148.139.0', // headers: { // accept: [ // { // key: 'Accept', // value: // 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', // }, // ], // 'x-forwarded-for': [ // { // key: 'X-Forwarded-For', // value: '35.148.139.0', // }, // ], // 'user-agent': [ // { // key: 'User-Agent', // value: 'Amazon CloudFront', // }, // ], // via: [ // { // key: 'Via', // value: '2.0 56233ac1c78ee7b920e664cc0c7f287e.cloudfront.net (CloudFront)', // }, // ], // 'accept-encoding': [ // { // key: 'Accept-Encoding', // value: 'br,gzip', // }, // ], // host: [ // { // key: 'Host', // value: 'lqlihcxizzcsefhpfcx2rnkgnu0pzrar.lambda-url.us-east-1.on.aws', // }, // ], // }, // method: 'GET', // origin: { // custom: { // customHeaders: {}, // domainName: 'lqlihcxizzcsefhpfcx2rnkgnu0pzrar.lambda-url.us-east-1.on.aws', // keepaliveTimeout: 5, // path: '', // port: 443, // protocol: 'https', // readTimeout: 30, // sslProtocols: ['TLSv1.2'], // }, // }, // querystring: 'url=%2Fprince-akachi-LWkFHEGpleE-unsplash.jpg&w=96&q=75&badParam=bad', // uri: '/_next/image', // }, // }, // }, // ], // }; // } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi1mbi11cmwudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYW1iZGFzL3NpZ24tZm4tdXJsLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSwrQ0FBb0U7QUFFcEUsUUFBUSxDQUFDLDRCQUE0QixFQUFFLEdBQUcsRUFBRTtJQUMxQyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDO0lBRWhDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCx3QkFBd0I7UUFDeEIsT0FBTyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLGVBQWUsRUFBRSxFQUFFLENBQUM7SUFDekQsQ0FBQyxDQUFDLENBQUM7SUFFSCxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsT0FBTyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsV0FBVyxFQUFFLENBQUM7SUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsc0NBQXNDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDdEQsTUFBTSxLQUFLLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztRQUNuQyxNQUFNLE9BQU8sR0FBc0IsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDO1FBRS9ELE1BQU0sSUFBQSx5QkFBVyxFQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTNCLE1BQU0sZUFBZSxHQUFHO1lBQ3RCLFlBQVk7WUFDWixzQkFBc0I7WUFDdEIsc0JBQXNCO1lBQ3RCLGVBQWU7WUFDZixzQkFBc0I7U0FDdkIsQ0FBQztRQUNGLE1BQU0sZ0JBQWdCLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1RSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFB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O0FBQzNCLGlLQUFpSztBQUNqSyxxQkFBcUI7QUFDckIsbUJBQW1CO0FBQ25CLHFDQUFxQztBQUNyQyxvQkFBb0I7QUFDcEIsNENBQTRDO0FBQzVDLDJDQUEyQztBQUMzQyxxQkFBcUI7QUFDckIsbUJBQW1CO0FBQ25CLGdDQUFnQztBQUNoQyxvQkFBb0I7QUFDcEIsdUNBQXVDO0FBQ3ZDLGdEQUFnRDtBQUNoRCxxQkFBcUI7QUFDckIsbUJBQW1CO0FBQ25CLHVCQUF1QjtBQUN2QixvQkFBb0I7QUFDcEIsZ0NBQWdDO0FBQ2hDLCtGQUErRjtBQUMvRixxQkFBcUI7QUFDckIsbUJBQW1CO0FBQ25CLHFDQUFxQztBQUNyQyxvQkFBb0I7QUFDcEIsNENBQTRDO0FBQzVDLHNDQUFzQztBQUN0QyxxQkFBcUI7QUFDckIsbUJBQW1CO0FBQ25CLHdCQUF3QjtBQUN4QixvQkFBb0I7QUFDcEIsaUNBQWlDO0FBQ2pDLDJGQUEyRjtBQUMzRixxQkFBcUI7QUFDckIsbUJBQW1CO0FBQ25CLGlCQUFpQjtBQUNqQiw2QkFBNkI7QUFDN0Isd0JBQXdCO0FBQ3hCLDBCQUEwQjtBQUMxQixxQ0FBcUM7QUFDckMsOEZBQThGO0FBQzlGLHVDQUF1QztBQUN2Qyw0QkFBNEI7QUFDNUIsNkJBQTZCO0FBQzdCLHFDQUFxQztBQUNyQyxtQ0FBbUM7QUFDbkMsNkNBQTZDO0FBQzdDLG1CQUFtQjtBQUNuQixpQkFBaUI7QUFDakIsbUdBQW1HO0FBQ25HLG1DQUFtQztBQUNuQyxlQUFlO0FBQ2YsYUFBYTtBQUNiLFdBQVc7QUFDWCxTQUFTO0FBQ1QsT0FBTztBQUNQLElBQUkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENsb3VkRnJvbnRSZXF1ZXN0LCBDbG91ZEZyb250UmVxdWVzdEV2ZW50IH0gZnJvbSAnYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBnZXRSZWdpb25Gcm9tTGFtYmRhVXJsLCBzaWduUmVxdWVzdCB9IGZyb20gJy4vc2lnbi1mbi11cmwnO1xuXG5kZXNjcmliZSgnTGFtYmRhT3JpZ2luUmVxdWVzdElhbUF1dGgnLCAoKSA9PiB7XG4gIGNvbnN0IG9yaWdpbmFsRW52ID0gcHJvY2Vzcy5lbnY7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgLy8gZHVtbXkgQVdTIGNyZWRlbnRpYWxzXG4gICAgcHJvY2Vzcy5lbnYgPSB7IC4uLnByb2Nlc3MuZW52LCAuLi5nZXRGYWtlQXdzQ3JlZHMoKSB9O1xuICB9KTtcblxuICBhZnRlckVhY2goKCkgPT4ge1xuICAgIHByb2Nlc3MuZW52ID0geyAuLi5vcmlnaW5hbEVudiB9O1xuICB9KTtcblxuICB0ZXN0KCdzaWduUmVxdWVzdCBzaG91bGQgYWRkIHgtYW16IGhlYWRlcnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZXZlbnQgPSBnZXRGYWtlUGFnZVJlcXVlc3QoKTtcbiAgICBjb25zdCByZXF1ZXN0OiBDbG91ZEZyb250UmVxdWVzdCA9IGV2ZW50LlJlY29yZHNbMF0uY2YucmVxdWVzdDtcblxuICAgIGF3YWl0IHNpZ25SZXF1ZXN0KHJlcXVlc3QpO1xuXG4gICAgY29uc3Qgc2VjdXJpdHlIZWFkZXJzID0gW1xuICAgICAgJ3gtYW16LWRhdGUnLFxuICAgICAgJ3gtYW16LXNlY3VyaXR5LXRva2VuJyxcbiAgICAgICd4LWFtei1jb250ZW50LXNoYTI1NicsXG4gICAgICAnYXV0aG9yaXphdGlvbicsXG4gICAgICAnb3JpZ2luLWF1dGhvcml6YXRpb24nLFxuICAgIF07XG4gICAgY29uc3QgaGFzU2lnbmVkSGVhZGVycyA9IHNlY3VyaXR5SGVhZGVycy5ldmVyeSgoaCkgPT4gaCBpbiByZXF1ZXN0LmhlYWRlcnMpO1xuICAgIGV4cGVjdChoYXNTaWduZWRIZWFkZXJzKS50b0JlKHRydWUpO1xuICB9KTtcblxuICB0ZXN0KCdzaWduUmVxdWVzdCBzaG91bGQgb21pdCB2b2xhdGlsZSBoZWFkZXJzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGV2ZW50ID0gZ2V0RmFrZVBhZ2VSZXF1ZXN0KCk7XG4gICAgY29uc3QgcmVxdWVzdDogQ2xvdWRGcm9udFJlcXVlc3QgPSBldmVudC5SZWNvcmRzWzBdLmNmLnJlcXVlc3Q7XG5cbiAgICBhd2FpdCBzaWduUmVxdWVzdChyZXF1ZXN0KTtcbiAgICBjb25zdCBzaWduZWRBdXRob3JpemF0aW9uSGVhZGVyID0gcmVxdWVzdC5oZWFkZXJzLmF1dGhvcml6YXRpb25bMF0udmFsdWU7XG5cbiAgICBjb25zdCB2b2xhdGlsZUhlYWRlcnMgPSBbJ3ZpYScsICd4LWZvcndhcmRlZC1mb3InXTtcbiAgICB2b2xhdGlsZUhlYWRlcnMuZm9yRWFjaCgoaCkgPT4gZXhwZWN0KHNpZ25lZEF1dGhvcml6YXRpb25IZWFkZXIpLm5vdC50b0NvbnRhaW4oaCkpO1xuICB9KTtcblxuICB0ZXN0KCdnZXRSZWdpb25Gcm9tTGFtYmRhVXJsIHNob3VsZCBjb3JyZWN0bHkgZ2V0IHJlZ2lvbicsICgpID0+IHtcbiAgICBjb25zdCBldmVudCA9IGdldEZha2VQYWdlUmVxdWVzdCgpO1xuICAgIGNvbnN0IHJlcXVlc3QgPSBldmVudC5SZWNvcmRzWzBdLmNmLnJlcXVlc3Q7XG4gICAgY29uc3QgYWN0dWFsID0gZ2V0UmVnaW9uRnJvbUxhbWJkYVVybChyZXF1ZXN0Lm9yaWdpbj8uY3VzdG9tPy5kb21haW5OYW1lIHx8ICcnKTtcbiAgICBleHBlY3QoYWN0dWFsKS50b0JlKCd1cy1lYXN0LTEnKTtcbiAgfSk7XG59KTtcblxuZnVuY3Rpb24gZ2V0RmFrZVBhZ2VSZXF1ZXN0KCk6IENsb3VkRnJvbnRSZXF1ZXN0RXZlbnQge1xuICByZXR1cm4ge1xuICAgIFJlY29yZHM6IFtcbiAgICAgIHtcbiAgICAgICAgY2Y6IHtcbiAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgIGRpc3RyaWJ1dGlvbkRvbWFpbk5hbWU6ICdkNmI4YnJqcWZ1amViLmNsb3VkZnJvbnQubmV0JyxcbiAgICAgICAgICAgIGRpc3RyaWJ1dGlvbklkOiAnRUhYMlNEVVU2MVQ3VScsXG4gICAgICAgICAgICBldmVudFR5cGU6ICdvcmlnaW4tcmVxdWVzdCcsXG4gICAgICAgICAgICByZXF1ZXN0SWQ6ICcnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgICAgY2xpZW50SXA6ICcxLjEuMS4xJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgYXV0aG9yaXphdGlvbjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGtleTogJ0F1dGhvcml6YXRpb24nLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6ICdCZWFyZXIgdG9rZW4nLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIGhvc3Q6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBrZXk6ICdIb3N0JyxcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiAnZDZiOGJyanFmdWplYi5jbG91ZGZyb250Lm5ldCcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgJ2FjY2VwdC1sYW5ndWFnZSc6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBrZXk6ICdBY2NlcHQtTGFuZ3VhZ2UnLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6ICdlbi1VUyxlbjtxPTAuOScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgcmVmZXJlcjogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGtleTogJ1JlZmVyZXInLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6ICdodHRwczovL2Q2YjhicmpxZnVqZWIuY2xvdWRmcm9udC5uZXQvc29tZS9wYXRoJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAneC1mb3J3YXJkZWQtZm9yJzogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGtleTogJ1gtRm9yd2FyZGVkLUZvcicsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogJzEuMS4xLjEnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICd1c2VyLWFnZW50JzogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGtleTogJ1VzZXItQWdlbnQnLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6XG4gICAgICAgICAgICAgICAgICAgICdNb3ppbGxhLzUuMCAoTWFjaW50b3NoOyBJbnRlbCBNYWMgT1MgWCAxMF8xNV83KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTEzLjAuMC4wIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHZpYTogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGtleTogJ1ZpYScsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogJzIuMCA4YmY5NGUyOWY4ODlmOGQwMDc2YzQ1MDJhZTAwOGI1OC5jbG91ZGZyb250Lm5ldCAoQ2xvdWRGcm9udCknLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICdhY2NlcHQtZW5jb2RpbmcnOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAga2V5OiAnQWNjZXB0LUVuY29kaW5nJyxcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiAnYnIsZ3ppcCcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgJ3NlYy1jaC11YSc6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBrZXk6ICdzZWMtY2gtdWEnLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6ICdcIkdvb2dsZSBDaHJvbWVcIjt2PVwiMTEzXCIsIFwiQ2hyb21pdW1cIjt2PVwiMTEzXCIsIFwiTm90LUEuQnJhbmRcIjt2PVwiMjRcIicsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgcXVlcnlzdHJpbmc6ICcnLFxuICAgICAgICAgICAgdXJpOiAnL3NvbWUvcGF0aCcsXG4gICAgICAgICAgICBvcmlnaW46IHtcbiAgICAgICAgICAgICAgY3VzdG9tOiB7XG4gICAgICAgICAgICAgICAgY3VzdG9tSGVhZGVyczoge30sXG4gICAgICAgICAgICAgICAgZG9tYWluTmFtZTogJ2tqdGJieDd1NTMzcTdwN241Zm9udDZncGNpMHBocm5nLmxhbWJkYS11cmwudXMtZWFzdC0xLm9uLmF3cycsXG4gICAgICAgICAgICAgICAga2VlcGFsaXZlVGltZW91dDogNSxcbiAgICAgICAgICAgICAgICBwYXRoOiAnJyxcbiAgICAgICAgICAgICAgICBwb3J0OiA0NDMsXG4gICAgICAgICAgICAgICAgcHJvdG9jb2w6ICdodHRwcycsXG4gICAgICAgICAgICAgICAgcmVhZFRpbWVvdXQ6IDMwLFxuICAgICAgICAgICAgICAgIHNzbFByb3RvY29sczogWydUTFN2MS4yJ10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICBhY3Rpb246ICdyZWFkLW9ubHknLFxuICAgICAgICAgICAgICBkYXRhOiAnJyxcbiAgICAgICAgICAgICAgZW5jb2Rpbmc6ICdiYXNlNjQnLFxuICAgICAgICAgICAgICBpbnB1dFRydW5jYXRlZDogZmFsc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldEZha2VBd3NDcmVkcygpIHtcbiAgcmV0dXJuIHtcbiAgICBBV1NfUkVHSU9OOiAndXMtZWFzdC0xJyxcbiAgICBBV1NfQUNDRVNTX0tFWV9JRDogJ1pTQkFUNUdFTkRIQzNYWVJIMzZJJyxcbiAgICBBV1NfU0VDUkVUX0FDQ0VTU19LRVk6ICdqcFdmQXB3MUFPMHh6R1plZVQxYnlRcTF6cWZRSVRWcVZoVGtrcWw0JyxcbiAgICBBV1NfU0VTU0lPTl9UT0tFTjpcbiAgICAgICdaUW9KYjNKcFoybHVYMlZqRUZnYUNYVnpMV1ZoYzNRdE1TSkdNRVFDSUhpanpkVFhoNTlhU2UyaFJmQ1dwRmQyL2phY1BVQys4ckNxM3FCSWl1RzJBaUFHWDhqcWxkK3AwNG5QWWZ1U2hpMWxMTi9aMWhFWEc5UVNORW1FRkxUeEdTcW1BZ2lSLy8vLy8vLy8vLzhCRUFJYURESTJPRGt4TkRRMk5USXpNU0lNckFNTzUvR1R2TWdvRytjaEt2b0I0ZjRWMVRma1ppSE9sbWVNSzZFcDU4bWF2NjVBMFdVM0s5V1B6ZHJKb2puR3FxVHVTODV6VGxLaG0zbGZtTXhDT3R3Uy9PbE91aUJRMU1aTmxrc0syamUxRmF6Z2JYTjQ2Zk5TaStpSGlZOVZmeVJBZDB3U0xtWEI4RkZyQ0dzVTkyUU95LytkZWppMHFJVmFkc2pFeXZCUnh6UWo1b0lVSTVzYjc0WXQ3dU52a2E5ZlZaY1Q0czRJbmRZZGEwTjdvWndJckFwQ3V6ekJNdW9NQWhhYm1nVnJaVGJpTG12T2lGSFMyWFpXQnlTQUJkeWdxYUl6ZlY3RzRoamNrdmNYaHR4cGt3K0hKVVpUTnpWVWxzcGdoenRlMVVHNlZ2SVJWOGF4M2tXQTN6cW04bkEvMWdIa2w0MER1YkpJWHoxQUpiZzVDcHM1bW9FMXBqRDd2TmlqQmpxZUFaaDBRL2UwYXdJSG5WNGRYTWZYVXU1bVdKN0RiOUsxZVVsU1NMOUZ5aUtlS2Q5NEhFZHJiSXJuUHVJV1ZUL0kvNVJqTm03TmdQWWlxbXB5eDNmU3BWY3E5Q0t3czBvRWZCdzZKOUh4azBJaFY4eVdGWllOTVdJYXJVVVpkbUw5dlZlSm1GWm13eUw0SmpZMXMvU1pJVS9vYThEdHZrbVA0Ukc0dFRKZnB5eWhvS0wwd0pPZXZrWXlvaWdObGxCbExONTlTWkFUOENDQURwTi9CK3NLJyxcbiAgfTtcbn1cblxuLy8gZnVuY3Rpb24gZ2V0RmFrZUltYWdlRXZlbnQoKTogQ2xvdWRGcm9udFJlcXVlc3RFdmVudCB7XG4vLyAgIHJldHVybiB7XG4vLyAgICAgUmVjb3JkczogW1xuLy8gICAgICAge1xuLy8gICAgICAgICBjZjoge1xuLy8gICAgICAgICAgIGNvbmZpZzoge1xuLy8gICAgICAgICAgICAgZGlzdHJpYnV0aW9uRG9tYWluTmFtZTogJ2Q2YjhicmpxZnVqZWIuY2xvdWRmcm9udC5uZXQnLFxuLy8gICAgICAgICAgICAgZGlzdHJpYnV0aW9uSWQ6ICdFSFgyU0RVVTYxVDdVJyxcbi8vICAgICAgICAgICAgIGV2ZW50VHlwZTogJ29yaWdpbi1yZXF1ZXN0Jyxcbi8vICAgICAgICAgICAgIHJlcXVlc3RJZDogJycsXG4vLyAgICAgICAgICAgfSxcbi8vICAgICAgICAgICByZXF1ZXN0OiB7XG4vLyAgICAgICAgICAgICBib2R5OiB7XG4vLyAgICAgICAgICAgICAgIGFjdGlvbjogJ3JlYWQtb25seScsXG4vLyAgICAgICAgICAgICAgIGRhdGE6ICcnLFxuLy8gICAgICAgICAgICAgICBlbmNvZGluZzogJ2Jhc2U2NCcsXG4vLyAgICAgICAgICAgICAgIGlucHV0VHJ1bmNhdGVkOiBmYWxzZSxcbi8vICAgICAgICAgICAgIH0sXG4vLyAgICAgICAgICAgICBjbGllbnRJcDogJzM1LjE0OC4xMzkuMCcsXG4vLyAgICAgICAgICAgICBoZWFkZXJzOiB7XG4vLyAgICAgICAgICAgICAgIGFjY2VwdDogW1xuLy8gICAgICAgICAgICAgICAgIHtcbi8vICAgICAgICAgICAgICAgICAgIGtleTogJ0FjY2VwdCcsXG4vLyAgICAgICAgICAgICAgICAgICB2YWx1ZTpcbi8vICAgICAgICAgICAgICAgICAgICAgJ3RleHQvaHRtbCxhcHBsaWNhdGlvbi94aHRtbCt4bWwsYXBwbGljYXRpb24veG1sO3E9MC45LGltYWdlL2F2aWYsaW1hZ2Uvd2VicCxpbWFnZS9hcG5nLCovKjtxPTAuOCxhcHBsaWNhdGlvbi9zaWduZWQtZXhjaGFuZ2U7dj1iMztxPTAuNycsXG4vLyAgICAgICAgICAgICAgICAgfSxcbi8vICAgICAgICAgICAgICAgXSxcbi8vICAgICAgICAgICAgICAgJ3gtZm9yd2FyZGVkLWZvcic6IFtcbi8vICAgICAgICAgICAgICAgICB7XG4vLyAgICAgICAgICAgICAgICAgICBrZXk6ICdYLUZvcndhcmRlZC1Gb3InLFxuLy8gICAgICAgICAgICAgICAgICAgdmFsdWU6ICczNS4xNDguMTM5LjAnLFxuLy8gICAgICAgICAgICAgICAgIH0sXG4vLyAgICAgICAgICAgICAgIF0sXG4vLyAgICAgICAgICAgICAgICd1c2VyLWFnZW50JzogW1xuLy8gICAgICAgICAgICAgICAgIHtcbi8vICAgICAgICAgICAgICAgICAgIGtleTogJ1VzZXItQWdlbnQnLFxuLy8gICAgICAgICAgICAgICAgICAgdmFsdWU6ICdBbWF6b24gQ2xvdWRGcm9udCcsXG4vLyAgICAgICAgICAgICAgICAgfSxcbi8vICAgICAgICAgICAgICAgXSxcbi8vICAgICAgICAgICAgICAgdmlhOiBbXG4vLyAgICAgICAgICAgICAgICAge1xuLy8gICAgICAgICAgICAgICAgICAga2V5OiAnVmlhJyxcbi8vICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnMi4wIDU2MjMzYWMxYzc4ZWU3YjkyMGU2NjRjYzBjN2YyODdlLmNsb3VkZnJvbnQubmV0IChDbG91ZEZyb250KScsXG4vLyAgICAgICAgICAgICAgICAgfSxcbi8vICAgICAgICAgICAgICAgXSxcbi8vICAgICAgICAgICAgICAgJ2FjY2VwdC1lbmNvZGluZyc6IFtcbi8vICAgICAgICAgICAgICAgICB7XG4vLyAgICAgICAgICAgICAgICAgICBrZXk6ICdBY2NlcHQtRW5jb2RpbmcnLFxuLy8gICAgICAgICAgICAgICAgICAgdmFsdWU6ICdicixnemlwJyxcbi8vICAgICAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgICBdLFxuLy8gICAgICAgICAgICAgICBob3N0OiBbXG4vLyAgICAgICAgICAgICAgICAge1xuLy8gICAgICAgICAgICAgICAgICAga2V5OiAnSG9zdCcsXG4vLyAgICAgICAgICAgICAgICAgICB2YWx1ZTogJ2xxbGloY3hpenpjc2VmaHBmY3gycm5rZ251MHB6cmFyLmxhbWJkYS11cmwudXMtZWFzdC0xLm9uLmF3cycsXG4vLyAgICAgICAgICAgICAgICAgfSxcbi8vICAgICAgICAgICAgICAgXSxcbi8vICAgICAgICAgICAgIH0sXG4vLyAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuLy8gICAgICAgICAgICAgb3JpZ2luOiB7XG4vLyAgICAgICAgICAgICAgIGN1c3RvbToge1xuLy8gICAgICAgICAgICAgICAgIGN1c3RvbUhlYWRlcnM6IHt9LFxuLy8gICAgICAgICAgICAgICAgIGRvbWFpbk5hbWU6ICdscWxpaGN4aXp6Y3NlZmhwZmN4MnJua2dudTBwenJhci5sYW1iZGEtdXJsLnVzLWVhc3QtMS5vbi5hd3MnLFxuLy8gICAgICAgICAgICAgICAgIGtlZXBhbGl2ZVRpbWVvdXQ6IDUsXG4vLyAgICAgICAgICAgICAgICAgcGF0aDogJycsXG4vLyAgICAgICAgICAgICAgICAgcG9ydDogNDQzLFxuLy8gICAgICAgICAgICAgICAgIHByb3RvY29sOiAnaHR0cHMnLFxuLy8gICAgICAgICAgICAgICAgIHJlYWRUaW1lb3V0OiAzMCxcbi8vICAgICAgICAgICAgICAgICBzc2xQcm90b2NvbHM6IFsnVExTdjEuMiddLFxuLy8gICAgICAgICAgICAgICB9LFxuLy8gICAgICAgICAgICAgfSxcbi8vICAgICAgICAgICAgIHF1ZXJ5c3RyaW5nOiAndXJsPSUyRnByaW5jZS1ha2FjaGktTFdrRkhFR3BsZUUtdW5zcGxhc2guanBnJnc9OTYmcT03NSZiYWRQYXJhbT1iYWQnLFxuLy8gICAgICAgICAgICAgdXJpOiAnL19uZXh0L2ltYWdlJyxcbi8vICAgICAgICAgICB9LFxuLy8gICAgICAgICB9LFxuLy8gICAgICAgfSxcbi8vICAgICBdLFxuLy8gICB9O1xuLy8gfVxuIl19