@riddance/deploy
Version:
105 lines • 17.3 kB
JavaScript
import { jsonResponse, okResponse, throwOnNotOK } from '@riddance/fetch';
import { setTimeout } from 'node:timers/promises';
import { awsRequest } from '../lite.js';
export async function getRole(context, prefix, service) {
const response = await awsRequest(context, 'GET', 'iam', `?Action=GetRole&RoleName=${prefix}-${service}-role&Version=2010-05-08`);
if (response.status === 404) {
return undefined;
}
await throwOnNotOK(response, 'Error getting role');
const body = (await response.json());
return body.GetRoleResponse.GetRoleResult.Role;
}
export async function syncRole(context, prefix, service, role) {
role ??= await createRole(context, prefix, service);
return role.Arn;
}
async function createRole(context, prefix, service) {
context.log.trace('creating role');
const response = await jsonResponse(awsRequest(context, 'GET', 'iam', `?${new URLSearchParams({
Action: 'CreateRole',
Version: '2010-05-08',
RoleName: `${prefix}-${service}-role`,
AssumeRolePolicyDocument: JSON.stringify({
Version: '2012-10-17',
Statement: [
{
Effect: 'Allow',
Principal: {
Service: 'lambda.amazonaws.com',
},
Action: 'sts:AssumeRole',
},
],
}),
'Tags.member.1.Key': 'framework',
'Tags.member.1.Value': 'riddance',
'Tags.member.2.Key': 'environment',
'Tags.member.2.Value': prefix,
'Tags.member.3.Key': 'service',
'Tags.member.3.Value': service,
}).toString()}`), 'Error creating role');
await setTimeout(10_000);
return response.CreateRoleResponse.CreateRoleResult.Role;
}
export async function assignPolicy(context, prefix, service, region, account, publishTopics, additionalStatements) {
context.log.trace('assigning policy');
await okResponse(awsRequest(context, 'GET', 'iam', `?${new URLSearchParams({
Action: 'PutRolePolicy',
Version: '2010-05-08',
RoleName: `${prefix}-${service}-role`,
PolicyName: `${prefix}-${service}-policy`,
PolicyDocument: JSON.stringify({
Version: '2012-10-17',
Statement: [
{
Effect: 'Allow',
Resource: `arn:aws:logs:${region}:${account}:*`,
Action: 'logs:CreateLogGroup',
},
{
Effect: 'Allow',
Resource: `arn:aws:logs:${region}:${account}:log-group:/aws/lambda/${prefix}-${service}-*`,
Action: ['logs:CreateLogStream', 'logs:PutLogEvents'],
},
{
Effect: 'Allow',
Resource: `arn:aws:dynamodb:${region}:${account}:table/${prefix}.${service}.*`,
Action: [
'dynamodb:CreateTable',
'dynamodb:BatchGetItem',
'dynamodb:ConditionCheckItem',
'dynamodb:PutItem',
'dynamodb:DeleteItem',
'dynamodb:GetItem',
'dynamodb:Scan',
'dynamodb:Query',
'dynamodb:UpdateItem',
'dynamodb:UpdateTable',
'dynamodb:GetRecords',
'dax:GetItem',
'dax:PutItem',
'dax:ConditionCheckItem',
'dax:BatchGetItem',
'dax:BatchWriteItem',
'dax:DeleteItem',
'dax:Query',
'dax:UpdateItem',
'dax:Scan',
],
},
...publishTopics.map(topic => ({
Effect: 'Allow',
Action: ['sns:Publish'],
Resource: `arn:aws:sns:${region}:${account}:${prefix}-${topic}-*`,
})),
...additionalStatements.map(as => ({
Effect: as.Effect,
Resource: as.Resource.replaceAll('$REGION', region).replaceAll('$ACCOUNT', account),
Action: as.Action,
})),
],
}),
}).toString()}`), 'Error assigning policy');
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJyb2xlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUN4RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFDakQsT0FBTyxFQUFnQixVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFnQnJELE1BQU0sQ0FBQyxLQUFLLFVBQVUsT0FBTyxDQUN6QixPQUFnQixFQUNoQixNQUFjLEVBQ2QsT0FBZTtJQUVmLE1BQU0sUUFBUSxHQUFHLE1BQU0sVUFBVSxDQUM3QixPQUFPLEVBQ1AsS0FBSyxFQUNMLEtBQUssRUFDTCw0QkFBNEIsTUFBTSxJQUFJLE9BQU8sMEJBQTBCLENBQzFFLENBQUE7SUFFRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDMUIsT0FBTyxTQUFTLENBQUE7SUFDcEIsQ0FBQztJQUNELE1BQU0sWUFBWSxDQUFDLFFBQVEsRUFBRSxvQkFBb0IsQ0FBQyxDQUFBO0lBQ2xELE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBTWxDLENBQUE7SUFDRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQTtBQUNsRCxDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxRQUFRLENBQzFCLE9BQWdCLEVBQ2hCLE1BQWMsRUFDZCxPQUFlLEVBQ2YsSUFBeUI7SUFFekIsSUFBSSxLQUFLLE1BQU0sVUFBVSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDbkQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFBO0FBQ25CLENBQUM7QUFFRCxLQUFLLFVBQVUsVUFBVSxDQUFDLE9BQWdCLEVBQUUsTUFBYyxFQUFFLE9BQWU7SUFDdkUsT0FB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QyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUMzQixNQUFNLEVBQUUsT0FBTztvQkFDZixNQUFNLEVBQUUsQ0FBQyxhQUFhLENBQUM7b0JBQ3ZCLFFBQVEsRUFBRSxlQUFlLE1BQU0sSUFBSSxPQUFPLElBQUksTUFBTSxJQUFJLEtBQUssSUFBSTtpQkFDcEUsQ0FBQyxDQUFDO2dCQUNILEdBQUcsb0JBQW9CLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDL0IsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNO29CQUNqQixRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FDMUQsVUFBVSxFQUNWLE9BQU8sQ0FDVjtvQkFDRCxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU07aUJBQ3BCLENBQUMsQ0FBQzthQUNOO1NBQ0osQ0FBQztLQUNMLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUNsQixFQUNELHdCQUF3QixDQUMzQixDQUFBO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpzb25SZXNwb25zZSwgb2tSZXNwb25zZSwgdGhyb3dPbk5vdE9LIH0gZnJvbSAnQHJpZGRhbmNlL2ZldGNoJ1xuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ25vZGU6dGltZXJzL3Byb21pc2VzJ1xuaW1wb3J0IHsgdHlwZSBDb250ZXh0LCBhd3NSZXF1ZXN0IH0gZnJvbSAnLi4vbGl0ZS5qcydcblxuZXhwb3J0IHR5cGUgQXdzUm9sZSA9IHtcbiAgICBBcm46IHN0cmluZ1xuICAgIEFzc3VtZVJvbGVQb2xpY3lEb2N1bWVudDogc3RyaW5nXG4gICAgQ3JlYXRlRGF0ZTogbnVtYmVyXG4gICAgRGVzY3JpcHRpb246IHN0cmluZ1xuICAgIE1heFNlc3Npb25EdXJhdGlvbjogbnVtYmVyXG4gICAgUGF0aDogc3RyaW5nXG4gICAgUGVybWlzc2lvbnNCb3VuZGFyeTogbnVsbFxuICAgIFJvbGVJZDogc3RyaW5nXG4gICAgUm9sZUxhc3RVc2VkOiB7IExhc3RVc2VkRGF0ZTogbnVtYmVyOyBSZWdpb246IHN0cmluZyB9XG4gICAgUm9sZU5hbWU6IHN0cmluZ1xuICAgIFRhZ3M6IG51bGxcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFJvbGUoXG4gICAgY29udGV4dDogQ29udGV4dCxcbiAgICBwcmVmaXg6IHN0cmluZyxcbiAgICBzZXJ2aWNlOiBzdHJpbmcsXG4pOiBQcm9taXNlPEF3c1JvbGUgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF3c1JlcXVlc3QoXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgICdHRVQnLFxuICAgICAgICAnaWFtJyxcbiAgICAgICAgYD9BY3Rpb249R2V0Um9sZSZSb2xlTmFtZT0ke3ByZWZpeH0tJHtzZXJ2aWNlfS1yb2xlJlZlcnNpb249MjAxMC0wNS0wOGAsXG4gICAgKVxuXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG4gICAgYXdhaXQgdGhyb3dPbk5vdE9LKHJlc3BvbnNlLCAnRXJyb3IgZ2V0dGluZyByb2xlJylcbiAgICBjb25zdCBib2R5ID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMge1xuICAgICAgICBHZXRSb2xlUmVzcG9uc2U6IHtcbiAgICAgICAgICAgIEdldFJvbGVSZXN1bHQ6IHtcbiAgICAgICAgICAgICAgICBSb2xlOiBBd3NSb2xlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJvZHkuR2V0Um9sZVJlc3BvbnNlLkdldFJvbGVSZXN1bHQuUm9sZVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3luY1JvbGUoXG4gICAgY29udGV4dDogQ29udGV4dCxcbiAgICBwcmVmaXg6IHN0cmluZyxcbiAgICBzZXJ2aWNlOiBzdHJpbmcsXG4gICAgcm9sZTogQXdzUm9sZSB8IHVuZGVmaW5lZCxcbikge1xuICAgIHJvbGUgPz89IGF3YWl0IGNyZWF0ZVJvbGUoY29udGV4dCwgcHJlZml4LCBzZXJ2aWNlKVxuICAgIHJldHVybiByb2xlLkFyblxufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVSb2xlKGNvbnRleHQ6IENvbnRleHQsIHByZWZpeDogc3RyaW5nLCBzZXJ2aWNlOiBzdHJpbmcpIHtcbiAgICBjb250ZXh0LmxvZy50cmFjZSgnY3JlYXRpbmcgcm9sZScpXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBqc29uUmVzcG9uc2U8e1xuICAgICAgICBDcmVhdGVSb2xlUmVzcG9uc2U6IHtcbiAgICAgICAgICAgIENyZWF0ZVJvbGVSZXN1bHQ6IHtcbiAgICAgICAgICAgICAgICBSb2xlOiBBd3NSb2xlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9PihcbiAgICAgICAgYXdzUmVxdWVzdChcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAnR0VUJyxcbiAgICAgICAgICAgICdpYW0nLFxuICAgICAgICAgICAgYD8ke25ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgICAgICAgICAgIEFjdGlvbjogJ0NyZWF0ZVJvbGUnLFxuICAgICAgICAgICAgICAgIFZlcnNpb246ICcyMDEwLTA1LTA4JyxcbiAgICAgICAgICAgICAgICBSb2xlTmFtZTogYCR7cHJlZml4fS0ke3NlcnZpY2V9LXJvbGVgLFxuICAgICAgICAgICAgICAgIEFzc3VtZVJvbGVQb2xpY3lEb2N1bWVudDogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICBWZXJzaW9uOiAnMjAxMi0xMC0xNycsXG4gICAgICAgICAgICAgICAgICAgIFN0YXRlbWVudDogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmluY2lwYWw6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZTogJ2xhbWJkYS5hbWF6b25hd3MuY29tJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ3N0czpBc3N1bWVSb2xlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgJ1RhZ3MubWVtYmVyLjEuS2V5JzogJ2ZyYW1ld29yaycsXG4gICAgICAgICAgICAgICAgJ1RhZ3MubWVtYmVyLjEuVmFsdWUnOiAncmlkZGFuY2UnLFxuICAgICAgICAgICAgICAgICdUYWdzLm1lbWJlci4yLktleSc6ICdlbnZpcm9ubWVudCcsXG4gICAgICAgICAgICAgICAgJ1RhZ3MubWVtYmVyLjIuVmFsdWUnOiBwcmVmaXgsXG4gICAgICAgICAgICAgICAgJ1RhZ3MubWVtYmVyLjMuS2V5JzogJ3NlcnZpY2UnLFxuICAgICAgICAgICAgICAgICdUYWdzLm1lbWJlci4zLlZhbHVlJzogc2VydmljZSxcbiAgICAgICAgICAgIH0pLnRvU3RyaW5nKCl9YCxcbiAgICAgICAgKSxcbiAgICAgICAgJ0Vycm9yIGNyZWF0aW5nIHJvbGUnLFxuICAgIClcbiAgICBhd2FpdCBzZXRUaW1lb3V0KDEwXzAwMClcbiAgICByZXR1cm4gcmVzcG9uc2UuQ3JlYXRlUm9sZVJlc3BvbnNlLkNyZWF0ZVJvbGVSZXN1bHQuUm9sZVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzaWduUG9saWN5KFxuICAgIGNvbnRleHQ6IENvbnRleHQsXG4gICAgcHJlZml4OiBzdHJpbmcsXG4gICAgc2VydmljZTogc3RyaW5nLFxuICAgIHJlZ2lvbjogc3RyaW5nLFxuICAgIGFjY291bnQ6IHN0cmluZyxcbiAgICBwdWJsaXNoVG9waWNzOiBzdHJpbmdbXSxcbiAgICBhZGRpdGlvbmFsU3RhdGVtZW50czogeyBFZmZlY3Q6IHN0cmluZzsgUmVzb3VyY2U6IHN0cmluZzsgQWN0aW9uOiBzdHJpbmdbXSB9W10sXG4pIHtcbiAgICBjb250ZXh0LmxvZy50cmFjZSgnYXNzaWduaW5nIHBvbGljeScpXG4gICAgYXdhaXQgb2tSZXNwb25zZShcbiAgICAgICAgYXdzUmVxdWVzdChcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAnR0VUJyxcbiAgICAgICAgICAgICdpYW0nLFxuICAgICAgICAgICAgYD8ke25ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgICAgICAgICAgIEFjdGlvbjogJ1B1dFJvbGVQb2xpY3knLFxuICAgICAgICAgICAgICAgIFZlcnNpb246ICcyMDEwLTA1LTA4JyxcbiAgICAgICAgICAgICAgICBSb2xlTmFtZTogYCR7cHJlZml4fS0ke3NlcnZpY2V9LXJvbGVgLFxuICAgICAgICAgICAgICAgIFBvbGljeU5hbWU6IGAke3ByZWZpeH0tJHtzZXJ2aWNlfS1wb2xpY3lgLFxuICAgICAgICAgICAgICAgIFBvbGljeURvY3VtZW50OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgIFZlcnNpb246ICcyMDEyLTEwLTE3JyxcbiAgICAgICAgICAgICAgICAgICAgU3RhdGVtZW50OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0OiAnQWxsb3cnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlOiBgYXJuOmF3czpsb2dzOiR7cmVnaW9ufToke2FjY291bnR9OipgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ2xvZ3M6Q3JlYXRlTG9nR3JvdXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2U6IGBhcm46YXdzOmxvZ3M6JHtyZWdpb259OiR7YWNjb3VudH06bG9nLWdyb3VwOi9hd3MvbGFtYmRhLyR7cHJlZml4fS0ke3NlcnZpY2V9LSpgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjogWydsb2dzOkNyZWF0ZUxvZ1N0cmVhbScsICdsb2dzOlB1dExvZ0V2ZW50cyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2U6IGBhcm46YXdzOmR5bmFtb2RiOiR7cmVnaW9ufToke2FjY291bnR9OnRhYmxlLyR7cHJlZml4fS4ke3NlcnZpY2V9LipgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZHluYW1vZGI6Q3JlYXRlVGFibGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZHluYW1vZGI6QmF0Y2hHZXRJdGVtJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2R5bmFtb2RiOkNvbmRpdGlvbkNoZWNrSXRlbScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkeW5hbW9kYjpQdXRJdGVtJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2R5bmFtb2RiOkRlbGV0ZUl0ZW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZHluYW1vZGI6R2V0SXRlbScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkeW5hbW9kYjpTY2FuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2R5bmFtb2RiOlF1ZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2R5bmFtb2RiOlVwZGF0ZUl0ZW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZHluYW1vZGI6VXBkYXRlVGFibGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZHluYW1vZGI6R2V0UmVjb3JkcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkYXg6R2V0SXRlbScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkYXg6UHV0SXRlbScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkYXg6Q29uZGl0aW9uQ2hlY2tJdGVtJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RheDpCYXRjaEdldEl0ZW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGF4OkJhdGNoV3JpdGVJdGVtJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RheDpEZWxldGVJdGVtJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RheDpRdWVyeScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkYXg6VXBkYXRlSXRlbScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkYXg6U2NhbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5wdWJsaXNoVG9waWNzLm1hcCh0b3BpYyA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb246IFsnc25zOlB1Ymxpc2gnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZTogYGFybjphd3M6c25zOiR7cmVnaW9ufToke2FjY291bnR9OiR7cHJlZml4fS0ke3RvcGljfS0qYCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmFkZGl0aW9uYWxTdGF0ZW1lbnRzLm1hcChhcyA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdDogYXMuRWZmZWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlOiBhcy5SZXNvdXJjZS5yZXBsYWNlQWxsKCckUkVHSU9OJywgcmVnaW9uKS5yZXBsYWNlQWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJEFDQ09VTlQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiBhcy5BY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9KS50b1N0cmluZygpfWAsXG4gICAgICAgICksXG4gICAgICAgICdFcnJvciBhc3NpZ25pbmcgcG9saWN5JyxcbiAgICApXG59XG4iXX0=