UNPKG

aws-cdk

Version:

CDK Toolkit, the command line tool for CDK apps

147 lines 25.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.isHotswappableAppSyncChange = void 0; const common_1 = require("./common"); async function isHotswappableAppSyncChange(logicalId, change, evaluateCfnTemplate) { const isResolver = change.newValue.Type === 'AWS::AppSync::Resolver'; const isFunction = change.newValue.Type === 'AWS::AppSync::FunctionConfiguration'; const isGraphQLSchema = change.newValue.Type === 'AWS::AppSync::GraphQLSchema'; const isAPIKey = change.newValue.Type === 'AWS::AppSync::ApiKey'; if (!isResolver && !isFunction && !isGraphQLSchema && !isAPIKey) { return []; } const ret = []; const classifiedChanges = (0, common_1.classifyChanges)(change, [ 'RequestMappingTemplate', 'RequestMappingTemplateS3Location', 'ResponseMappingTemplate', 'ResponseMappingTemplateS3Location', 'Code', 'CodeS3Location', 'Definition', 'DefinitionS3Location', 'Expires', ]); classifiedChanges.reportNonHotswappablePropertyChanges(ret); const namesOfHotswappableChanges = Object.keys(classifiedChanges.hotswappableProps); if (namesOfHotswappableChanges.length > 0) { let physicalName = undefined; const arn = await evaluateCfnTemplate.establishResourcePhysicalName(logicalId, isFunction ? change.newValue.Properties?.Name : undefined); if (isResolver) { const arnParts = arn?.split('/'); physicalName = arnParts ? `${arnParts[3]}.${arnParts[5]}` : undefined; } else { physicalName = arn; } ret.push({ hotswappable: true, resourceType: change.newValue.Type, propsChanged: namesOfHotswappableChanges, service: 'appsync', resourceNames: [`${change.newValue.Type} '${physicalName}'`], apply: async (sdk) => { if (!physicalName) { return; } const sdkProperties = { ...change.oldValue.Properties, Definition: change.newValue.Properties?.Definition, DefinitionS3Location: change.newValue.Properties?.DefinitionS3Location, requestMappingTemplate: change.newValue.Properties?.RequestMappingTemplate, requestMappingTemplateS3Location: change.newValue.Properties?.RequestMappingTemplateS3Location, responseMappingTemplate: change.newValue.Properties?.ResponseMappingTemplate, responseMappingTemplateS3Location: change.newValue.Properties?.ResponseMappingTemplateS3Location, code: change.newValue.Properties?.Code, codeS3Location: change.newValue.Properties?.CodeS3Location, expires: change.newValue.Properties?.Expires, }; const evaluatedResourceProperties = await evaluateCfnTemplate.evaluateCfnExpression(sdkProperties); const sdkRequestObject = (0, common_1.transformObjectKeys)(evaluatedResourceProperties, common_1.lowerCaseFirstCharacter); // resolve s3 location files as SDK doesn't take in s3 location but inline code if (sdkRequestObject.requestMappingTemplateS3Location) { sdkRequestObject.requestMappingTemplate = (await fetchFileFromS3(sdkRequestObject.requestMappingTemplateS3Location, sdk))?.toString('utf8'); delete sdkRequestObject.requestMappingTemplateS3Location; } if (sdkRequestObject.responseMappingTemplateS3Location) { sdkRequestObject.responseMappingTemplate = (await fetchFileFromS3(sdkRequestObject.responseMappingTemplateS3Location, sdk))?.toString('utf8'); delete sdkRequestObject.responseMappingTemplateS3Location; } if (sdkRequestObject.definitionS3Location) { sdkRequestObject.definition = (await fetchFileFromS3(sdkRequestObject.definitionS3Location, sdk))?.toString('utf8'); delete sdkRequestObject.definitionS3Location; } if (sdkRequestObject.codeS3Location) { sdkRequestObject.code = (await fetchFileFromS3(sdkRequestObject.codeS3Location, sdk))?.toString('utf8'); delete sdkRequestObject.codeS3Location; } if (isResolver) { await sdk.appsync().updateResolver(sdkRequestObject).promise(); } else if (isFunction) { // Function version is only applicable when using VTL and mapping templates // Runtime only applicable when using code (JS mapping templates) if (sdkRequestObject.code) { delete sdkRequestObject.functionVersion; } else { delete sdkRequestObject.runtime; } const { functions } = await sdk.appsync().listFunctions({ apiId: sdkRequestObject.apiId }).promise(); const { functionId } = functions?.find(fn => fn.name === physicalName) ?? {}; // Updating multiple functions at the same time or along with graphql schema results in `ConcurrentModificationException` await simpleRetry(() => sdk.appsync().updateFunction({ ...sdkRequestObject, functionId: functionId }).promise(), 5, 'ConcurrentModificationException'); } else if (isGraphQLSchema) { let schemaCreationResponse = await sdk.appsync().startSchemaCreation(sdkRequestObject).promise(); while (schemaCreationResponse.status && ['PROCESSING', 'DELETING'].some(status => status === schemaCreationResponse.status)) { await sleep(1000); // poll every second const getSchemaCreationStatusRequest = { apiId: sdkRequestObject.apiId, }; schemaCreationResponse = await sdk.appsync().getSchemaCreationStatus(getSchemaCreationStatusRequest).promise(); } if (schemaCreationResponse.status === 'FAILED') { throw new Error(schemaCreationResponse.details); } } else { //isApiKey if (!sdkRequestObject.id) { // ApiKeyId is optional in CFN but required in SDK. Grab the KeyId from physicalArn if not available as part of CFN template const arnParts = physicalName?.split('/'); if (arnParts && arnParts.length === 4) { sdkRequestObject.id = arnParts[3]; } } await sdk.appsync().updateApiKey(sdkRequestObject).promise(); } }, }); } return ret; } exports.isHotswappableAppSyncChange = isHotswappableAppSyncChange; async function fetchFileFromS3(s3Url, sdk) { const s3PathParts = s3Url.split('/'); const s3Bucket = s3PathParts[2]; // first two are "s3:" and "" due to s3:// const s3Key = s3PathParts.splice(3).join('/'); // after removing first three we reconstruct the key return (await sdk.s3().getObject({ Bucket: s3Bucket, Key: s3Key }).promise()).Body; } async function simpleRetry(fn, numOfRetries, errorCodeToRetry) { try { await fn(); } catch (error) { if (error && error.code === errorCodeToRetry && numOfRetries > 0) { await sleep(1000); // wait a whole second await simpleRetry(fn, numOfRetries - 1, errorCodeToRetry); } else { throw error; } } } async function sleep(ms) { return new Promise(ok => setTimeout(ok, ms)); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwc3luYy1tYXBwaW5nLXRlbXBsYXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImFwcHN5bmMtbWFwcGluZy10ZW1wbGF0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EscUNBQTJJO0FBS3BJLEtBQUssVUFBVSwyQkFBMkIsQ0FDL0MsU0FBaUIsRUFBRSxNQUFtQyxFQUFFLG1CQUFtRDtJQUUzRyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyx3QkFBd0IsQ0FBQztJQUNyRSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxxQ0FBcUMsQ0FBQztJQUNsRixNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyw2QkFBNkIsQ0FBQztJQUMvRSxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxzQkFBc0IsQ0FBQztJQUNqRSxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsZUFBZSxJQUFJLENBQUMsUUFBUSxFQUFFO1FBQy9ELE9BQU8sRUFBRSxDQUFDO0tBQ1g7SUFFRCxNQUFNLEdBQUcsR0FBd0IsRUFBRSxDQUFDO0lBRXBDLE1BQU0saUJBQWlCLEdBQUcsSUFBQSx3QkFBZSxFQUFDLE1BQU0sRUFBRTtRQUNoRCx3QkFBd0I7UUFDeEIsa0NBQWtDO1FBQ2xDLHlCQUF5QjtRQUN6QixtQ0FBbUM7UUFDbkMsTUFBTTtRQUNOLGdCQUFnQjtRQUNoQixZQUFZO1FBQ1osc0JBQXNCO1FBQ3RCLFNBQVM7S0FDVixDQUFDLENBQUM7SUFDSCxpQkFBaUIsQ0FBQyxvQ0FBb0MsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUU1RCxNQUFNLDBCQUEwQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNwRixJQUFJLDBCQUEwQixDQUFDLE1B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QUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLHNCQUFzQjtZQUN6QyxNQUFNLFdBQVcsQ0FBQyxFQUFFLEVBQUUsWUFBWSxHQUFHLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1NBQzNEO2FBQU07WUFDTCxNQUFNLEtBQUssQ0FBQztTQUNiO0tBQ0Y7QUFDSCxDQUFDO0FBRUQsS0FBSyxVQUFVLEtBQUssQ0FBQyxFQUFVO0lBQzdCLE9BQU8sSUFBSSxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEdldFNjaGVtYUNyZWF0aW9uU3RhdHVzUmVxdWVzdCwgR2V0U2NoZW1hQ3JlYXRpb25TdGF0dXNSZXNwb25zZSB9IGZyb20gJ2F3cy1zZGsvY2xpZW50cy9hcHBzeW5jJztcbmltcG9ydCB7IENoYW5nZUhvdHN3YXBSZXN1bHQsIGNsYXNzaWZ5Q2hhbmdlcywgSG90c3dhcHBhYmxlQ2hhbmdlQ2FuZGlkYXRlLCBsb3dlckNhc2VGaXJzdENoYXJhY3RlciwgdHJhbnNmb3JtT2JqZWN0S2V5cyB9IGZyb20gJy4vY29tbW9uJztcbmltcG9ydCB7IElTREsgfSBmcm9tICcuLi9hd3MtYXV0aCc7XG5cbmltcG9ydCB7IEV2YWx1YXRlQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZSB9IGZyb20gJy4uL2V2YWx1YXRlLWNsb3VkZm9ybWF0aW9uLXRlbXBsYXRlJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzSG90c3dhcHBhYmxlQXBwU3luY0NoYW5nZShcbiAgbG9naWNhbElkOiBzdHJpbmcsIGNoYW5nZTogSG90c3dhcHBhYmxlQ2hhbmdlQ2FuZGlkYXRlLCBldmFsdWF0ZUNmblRlbXBsYXRlOiBFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGUsXG4pOiBQcm9taXNlPENoYW5nZUhvdHN3YXBSZXN1bHQ+IHtcbiAgY29uc3QgaXNSZXNvbHZlciA9IGNoYW5nZS5uZXdWYWx1ZS5UeXBlID09PSAnQVdTOjpBcHBTeW5jOjpSZXNvbHZlcic7XG4gIGNvbnN0IGlzRnVuY3Rpb24gPSBjaGFuZ2UubmV3VmFsdWUuVHlwZSA9PT0gJ0FXUzo6QXBwU3luYzo6RnVuY3Rpb25Db25maWd1cmF0aW9uJztcbiAgY29uc3QgaXNHcmFwaFFMU2NoZW1hID0gY2hhbmdlLm5ld1ZhbHVlLlR5cGUgPT09ICdBV1M6OkFwcFN5bmM6OkdyYXBoUUxTY2hlbWEnO1xuICBjb25zdCBpc0FQSUtleSA9IGNoYW5nZS5uZXdWYWx1ZS5UeXBlID09PSAnQVdTOjpBcHBTeW5jOjpBcGlLZXknO1xuICBpZiAoIWlzUmVzb2x2ZXIgJiYgIWlzRnVuY3Rpb24gJiYgIWlzR3JhcGhRTFNjaGVtYSAmJiAhaXNBUElLZXkpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCByZXQ6IENoYW5nZUhvdHN3YXBSZXN1bHQgPSBbXTtcblxuICBjb25zdCBjbGFzc2lmaWVkQ2hhbmdlcyA9IGNsYXNzaWZ5Q2hhbmdlcyhjaGFuZ2UsIFtcbiAgICAnUmVxdWVzdE1hcHBpbmdUZW1wbGF0ZScsXG4gICAgJ1JlcXVlc3RNYXBwaW5nVGVtcGxhdGVTM0xvY2F0aW9uJyxcbiAgICAnUmVzcG9uc2VNYXBwaW5nVGVtcGxhdGUnLFxuICAgICdSZXNwb25zZU1hcHBpbmdUZW1wbGF0ZVMzTG9jYXRpb24nLFxuICAgICdDb2RlJyxcbiAgICAnQ29kZVMzTG9jYXRpb24nLFxuICAgICdEZWZpbml0aW9uJyxcbiAgICAnRGVmaW5pdGlvblMzTG9jYXRpb24nLFxuICAgICdFeHBpcmVzJyxcbiAgXSk7XG4gIGNsYXNzaWZpZWRDaGFuZ2VzLnJlcG9ydE5vbkhvdHN3YXBwYWJsZVByb3BlcnR5Q2hhbmdlcyhyZXQpO1xuXG4gIGNvbnN0IG5hbWVzT2ZIb3Rzd2FwcGFibGVDaGFuZ2VzID0gT2JqZWN0LmtleXMoY2xhc3NpZmllZENoYW5nZXMuaG90c3dhcHBhYmxlUHJvcHMpO1xuICBpZiAobmFtZXNPZkhvdHN3YXBwYWJsZUNoYW5nZXMubGVuZ3RoID4gMCkge1xuICAgIGxldCBwaHlzaWNhbE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBjb25zdCBhcm4gPSBhd2FpdCBldmFsdWF0ZUNmblRlbXBsYXRlLmVzdGFibGlzaFJlc291cmNlUGh5c2ljYWxOYW1lKGxvZ2ljYWxJZCwgaXNGdW5jdGlvbiA/IGNoYW5nZS5uZXdWYWx1ZS5Qcm9wZXJ0aWVzPy5OYW1lIDogdW5kZWZpbmVkKTtcbiAgICBpZiAoaXNSZXNvbHZlcikge1xuICAgICAgY29uc3QgYXJuUGFydHMgPSBhcm4/LnNwbGl0KCcvJyk7XG4gICAgICBwaHlzaWNhbE5hbWUgPSBhcm5QYXJ0cyA/IGAke2FyblBhcnRzWzNdfS4ke2FyblBhcnRzWzVdfWAgOiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBoeXNpY2FsTmFtZSA9IGFybjtcbiAgICB9XG4gICAgcmV0LnB1c2goe1xuICAgICAgaG90c3dhcHBhYmxlOiB0cnVlLFxuICAgICAgcmVzb3VyY2VUeXBlOiBjaGFuZ2UubmV3VmFsdWUuVHlwZSxcbiAgICAgIHByb3BzQ2hhbmdlZDogbmFtZXNPZkhvdHN3YXBwYWJsZUNoYW5nZXMsXG4gICAgICBzZXJ2aWNlOiAnYXBwc3luYycsXG4gICAgICByZXNvdXJjZU5hbWVzOiBbYCR7Y2hhbmdlLm5ld1ZhbHVlLlR5cGV9ICcke3BoeXNpY2FsTmFtZX0nYF0sXG4gICAgICBhcHBseTogYXN5bmMgKHNkazogSVNESykgPT4ge1xuICAgICAgICBpZiAoIXBoeXNpY2FsTmFtZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNka1Byb3BlcnRpZXM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9ID0ge1xuICAgICAgICAgIC4uLmNoYW5nZS5vbGRWYWx1ZS5Qcm9wZXJ0aWVzLFxuICAgICAgICAgIERlZmluaXRpb246IGNoYW5nZS5uZXdWYWx1ZS5Qcm9wZXJ0aWVzPy5EZWZpbml0aW9uLFxuICAgICAgICAgIERlZmluaXRpb25TM0xvY2F0aW9uOiBjaGFuZ2UubmV3VmFsdWUuUHJvcGVydGllcz8uRGVmaW5pdGlvblMzTG9jYXRpb24sXG4gICAgICAgICAgcmVxdWVzdE1hcHBpbmdUZW1wbGF0ZTogY2hhbmdlLm5ld1ZhbHVlLlByb3BlcnRpZXM/LlJlcXVlc3RNYXBwaW5nVGVtcGxhdGUsXG4gICAgICAgICAgcmVxdWVzdE1hcHBpbmdUZW1wbGF0ZVMzTG9jYXRpb246IGNoYW5nZS5uZXdWYWx1ZS5Qcm9wZXJ0aWVzPy5SZXF1ZXN0TWFwcGluZ1RlbXBsYXRlUzNMb2NhdGlvbixcbiAgICAgICAgICByZXNwb25zZU1hcHBpbmdUZW1wbGF0ZTogY2hhbmdlLm5ld1ZhbHVlLlByb3BlcnRpZXM/LlJlc3BvbnNlTWFwcGluZ1RlbXBsYXRlLFxuICAgICAgICAgIHJlc3BvbnNlTWFwcGluZ1RlbXBsYXRlUzNMb2NhdGlvbjogY2hhbmdlLm5ld1ZhbHVlLlByb3BlcnRpZXM/LlJlc3BvbnNlTWFwcGluZ1RlbXBsYXRlUzNMb2NhdGlvbixcbiAgICAgICAgICBjb2RlOiBjaGFuZ2UubmV3VmFsdWUuUHJvcGVydGllcz8uQ29kZSxcbiAgICAgICAgICBjb2RlUzNMb2NhdGlvbjogY2hhbmdlLm5ld1ZhbHVlLlByb3BlcnRpZXM/LkNvZGVTM0xvY2F0aW9uLFxuICAgICAgICAgIGV4cGlyZXM6IGNoYW5nZS5uZXdWYWx1ZS5Qcm9wZXJ0aWVzPy5FeHBpcmVzLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBldmFsdWF0ZWRSZXNvdXJjZVByb3BlcnRpZXMgPSBhd2FpdCBldmFsdWF0ZUNmblRlbXBsYXRlLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbihzZGtQcm9wZXJ0aWVzKTtcbiAgICAgICAgY29uc3Qgc2RrUmVxdWVzdE9iamVjdCA9IHRyYW5zZm9ybU9iamVjdEtleXMoZXZhbHVhdGVkUmVzb3VyY2VQcm9wZXJ0aWVzLCBsb3dlckNhc2VGaXJzdENoYXJhY3Rlcik7XG5cbiAgICAgICAgLy8gcmVzb2x2ZSBzMyBsb2NhdGlvbiBmaWxlcyBhcyBTREsgZG9lc24ndCB0YWtlIGluIHMzIGxvY2F0aW9uIGJ1dCBpbmxpbmUgY29kZVxuICAgICAgICBpZiAoc2RrUmVxdWVzdE9iamVjdC5yZXF1ZXN0TWFwcGluZ1RlbXBsYXRlUzNMb2NhdGlvbikge1xuICAgICAgICAgIHNka1JlcXVlc3RPYmplY3QucmVxdWVzdE1hcHBpbmdUZW1wbGF0ZSA9IChhd2FpdCBmZXRjaEZpbGVGcm9tUzMoc2RrUmVxdWVzdE9iamVjdC5yZXF1ZXN0TWFwcGluZ1RlbXBsYXRlUzNMb2NhdGlvbiwgc2RrKSk/LnRvU3RyaW5nKCd1dGY4Jyk7XG4gICAgICAgICAgZGVsZXRlIHNka1JlcXVlc3RPYmplY3QucmVxdWVzdE1hcHBpbmdUZW1wbGF0ZVMzTG9jYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNka1JlcXVlc3RPYmplY3QucmVzcG9uc2VNYXBwaW5nVGVtcGxhdGVTM0xvY2F0aW9uKSB7XG4gICAgICAgICAgc2RrUmVxdWVzdE9iamVjdC5yZXNwb25zZU1hcHBpbmdUZW1wbGF0ZSA9IChhd2FpdCBmZXRjaEZpbGVGcm9tUzMoc2RrUmVxdWVzdE9iamVjdC5yZXNwb25zZU1hcHBpbmdUZW1wbGF0ZVMzTG9jYXRpb24sIHNkaykpPy50b1N0cmluZygndXRmOCcpO1xuICAgICAgICAgIGRlbGV0ZSBzZGtSZXF1ZXN0T2JqZWN0LnJlc3BvbnNlTWFwcGluZ1RlbXBsYXRlUzNMb2NhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2RrUmVxdWVzdE9iamVjdC5kZWZpbml0aW9uUzNMb2NhdGlvbikge1xuICAgICAgICAgIHNka1JlcXVlc3RPYmplY3QuZGVmaW5pdGlvbiA9IChhd2FpdCBmZXRjaEZpbGVGcm9tUzMoc2RrUmVxdWVzdE9iamVjdC5kZWZpbml0aW9uUzNMb2NhdGlvbiwgc2RrKSk/LnRvU3RyaW5nKCd1dGY4Jyk7XG4gICAgICAgICAgZGVsZXRlIHNka1JlcXVlc3RPYmplY3QuZGVmaW5pdGlvblMzTG9jYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNka1JlcXVlc3RPYmplY3QuY29kZVMzTG9jYXRpb24pIHtcbiAgICAgICAgICBzZGtSZXF1ZXN0T2JqZWN0LmNvZGUgPSAoYXdhaXQgZmV0Y2hGaWxlRnJvbVMzKHNka1JlcXVlc3RPYmplY3QuY29kZVMzTG9jYXRpb24sIHNkaykpPy50b1N0cmluZygndXRmOCcpO1xuICAgICAgICAgIGRlbGV0ZSBzZGtSZXF1ZXN0T2JqZWN0LmNvZGVTM0xvY2F0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzUmVzb2x2ZXIpIHtcbiAgICAgICAgICBhd2FpdCBzZGsuYXBwc3luYygpLnVwZGF0ZVJlc29sdmVyKHNka1JlcXVlc3RPYmplY3QpLnByb21pc2UoKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKSB7XG5cbiAgICAgICAgICAvLyBGdW5jdGlvbiB2ZXJzaW9uIGlzIG9ubHkgYXBwbGljYWJsZSB3aGVuIHVzaW5nIFZUTCBhbmQgbWFwcGluZyB0ZW1wbGF0ZXNcbiAgICAgICAgICAvLyBSdW50aW1lIG9ubHkgYXBwbGljYWJsZSB3aGVuIHVzaW5nIGNvZGUgKEpTIG1hcHBpbmcgdGVtcGxhdGVzKVxuICAgICAgICAgIGlmIChzZGtSZXF1ZXN0T2JqZWN0LmNvZGUpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBzZGtSZXF1ZXN0T2JqZWN0LmZ1bmN0aW9uVmVyc2lvbjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVsZXRlIHNka1JlcXVlc3RPYmplY3QucnVudGltZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB7IGZ1bmN0aW9ucyB9ID0gYXdhaXQgc2RrLmFwcHN5bmMoKS5saXN0RnVuY3Rpb25zKHsgYXBpSWQ6IHNka1JlcXVlc3RPYmplY3QuYXBpSWQgfSkucHJvbWlzZSgpO1xuICAgICAgICAgIGNvbnN0IHsgZnVuY3Rpb25JZCB9ID0gZnVuY3Rpb25zPy5maW5kKGZuID0+IGZuLm5hbWUgPT09IHBoeXNpY2FsTmFtZSkgPz8ge307XG4gICAgICAgICAgLy8gVXBkYXRpbmcgbXVsdGlwbGUgZnVuY3Rpb25zIGF0IHRoZSBzYW1lIHRpbWUgb3IgYWxvbmcgd2l0aCBncmFwaHFsIHNjaGVtYSByZXN1bHRzIGluIGBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uYFxuICAgICAgICAgIGF3YWl0IHNpbXBsZVJldHJ5KFxuICAgICAgICAgICAgKCkgPT4gc2RrLmFwcHN5bmMoKS51cGRhdGVGdW5jdGlvbih7IC4uLnNka1JlcXVlc3RPYmplY3QsIGZ1bmN0aW9uSWQ6IGZ1bmN0aW9uSWQhIH0pLnByb21pc2UoKSxcbiAgICAgICAgICAgIDUsXG4gICAgICAgICAgICAnQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbicpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzR3JhcGhRTFNjaGVtYSkge1xuICAgICAgICAgIGxldCBzY2hlbWFDcmVhdGlvblJlc3BvbnNlOiBHZXRTY2hlbWFDcmVhdGlvblN0YXR1c1Jlc3BvbnNlID0gYXdhaXQgc2RrLmFwcHN5bmMoKS5zdGFydFNjaGVtYUNyZWF0aW9uKHNka1JlcXVlc3RPYmplY3QpLnByb21pc2UoKTtcbiAgICAgICAgICB3aGlsZSAoc2NoZW1hQ3JlYXRpb25SZXNwb25zZS5zdGF0dXMgJiYgWydQUk9DRVNTSU5HJywgJ0RFTEVUSU5HJ10uc29tZShzdGF0dXMgPT4gc3RhdHVzID09PSBzY2hlbWFDcmVhdGlvblJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICAgICAgICAgIGF3YWl0IHNsZWVwKDEwMDApOyAvLyBwb2xsIGV2ZXJ5IHNlY29uZFxuICAgICAgICAgICAgY29uc3QgZ2V0U2NoZW1hQ3JlYXRpb25TdGF0dXNSZXF1ZXN0OiBHZXRTY2hlbWFDcmVhdGlvblN0YXR1c1JlcXVlc3QgPSB7XG4gICAgICAgICAgICAgIGFwaUlkOiBzZGtSZXF1ZXN0T2JqZWN0LmFwaUlkLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHNjaGVtYUNyZWF0aW9uUmVzcG9uc2UgPSBhd2FpdCBzZGsuYXBwc3luYygpLmdldFNjaGVtYUNyZWF0aW9uU3RhdHVzKGdldFNjaGVtYUNyZWF0aW9uU3RhdHVzUmVxdWVzdCkucHJvbWlzZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2NoZW1hQ3JlYXRpb25SZXNwb25zZS5zdGF0dXMgPT09ICdGQUlMRUQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc2NoZW1hQ3JlYXRpb25SZXNwb25zZS5kZXRhaWxzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7IC8vaXNBcGlLZXlcbiAgICAgICAgICBpZiAoIXNka1JlcXVlc3RPYmplY3QuaWQpIHtcbiAgICAgICAgICAgIC8vIEFwaUtleUlkIGlzIG9wdGlvbmFsIGluIENGTiBidXQgcmVxdWlyZWQgaW4gU0RLLiBHcmFiIHRoZSBLZXlJZCBmcm9tIHBoeXNpY2FsQXJuIGlmIG5vdCBhdmFpbGFibGUgYXMgcGFydCBvZiBDRk4gdGVtcGxhdGVcbiAgICAgICAgICAgIGNvbnN0IGFyblBhcnRzID0gcGh5c2ljYWxOYW1lPy5zcGxpdCgnLycpO1xuICAgICAgICAgICAgaWYgKGFyblBhcnRzICYmIGFyblBhcnRzLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgICBzZGtSZXF1ZXN0T2JqZWN0LmlkID0gYXJuUGFydHNbM107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IHNkay5hcHBzeW5jKCkudXBkYXRlQXBpS2V5KHNka1JlcXVlc3RPYmplY3QpLnByb21pc2UoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoRmlsZUZyb21TMyhzM1VybDogc3RyaW5nLCBzZGs6IElTREspIHtcbiAgY29uc3QgczNQYXRoUGFydHMgPSBzM1VybC5zcGxpdCgnLycpO1xuICBjb25zdCBzM0J1Y2tldCA9IHMzUGF0aFBhcnRzWzJdOyAvLyBmaXJzdCB0d28gYXJlIFwiczM6XCIgYW5kIFwiXCIgZHVlIHRvIHMzOi8vXG4gIGNvbnN0IHMzS2V5ID0gczNQYXRoUGFydHMuc3BsaWNlKDMpLmpvaW4oJy8nKTsgLy8gYWZ0ZXIgcmVtb3ZpbmcgZmlyc3QgdGhyZWUgd2UgcmVjb25zdHJ1Y3QgdGhlIGtleVxuICByZXR1cm4gKGF3YWl0IHNkay5zMygpLmdldE9iamVjdCh7IEJ1Y2tldDogczNCdWNrZXQsIEtleTogczNLZXkgfSkucHJvbWlzZSgpKS5Cb2R5O1xufVxuXG5hc3luYyBmdW5jdGlvbiBzaW1wbGVSZXRyeShmbjogKCkgPT4gUHJvbWlzZTxhbnk+LCBudW1PZlJldHJpZXM6IG51bWJlciwgZXJyb3JDb2RlVG9SZXRyeTogc3RyaW5nKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIGlmIChlcnJvciAmJiBlcnJvci5jb2RlID09PSBlcnJvckNvZGVUb1JldHJ5ICYmIG51bU9mUmV0cmllcyA+IDApIHtcbiAgICAgIGF3YWl0IHNsZWVwKDEwMDApOyAvLyB3YWl0IGEgd2hvbGUgc2Vjb25kXG4gICAgICBhd2FpdCBzaW1wbGVSZXRyeShmbiwgbnVtT2ZSZXRyaWVzIC0gMSwgZXJyb3JDb2RlVG9SZXRyeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShvayA9PiBzZXRUaW1lb3V0KG9rLCBtcykpO1xufVxuIl19