UNPKG

cdk-amazon-chime-resources

Version:

![Experimental](https://img.shields.io/badge/experimental-important.svg?style=for-the-badge)

318 lines 43.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DeleteVoiceConnector = exports.UpdateVoiceConnector = exports.CreateVoiceConnector = void 0; const client_chime_sdk_voice_1 = require("@aws-sdk/client-chime-sdk-voice"); const client_cloudwatch_logs_1 = require("@aws-sdk/client-cloudwatch-logs"); const client_ssm_1 = require("@aws-sdk/client-ssm"); var VoiceConnectorRegion; (function (VoiceConnectorRegion) { VoiceConnectorRegion["US_EAST_1"] = "us-east-1"; VoiceConnectorRegion["US_WEST_2"] = "us-west-2"; VoiceConnectorRegion["CA_CENTRAL_1"] = "ca-central-1"; VoiceConnectorRegion["AP_NORTHEAST_1"] = "ap-northeast-1"; VoiceConnectorRegion["AP_NORTHEAST_2"] = "ap-northeast-2"; VoiceConnectorRegion["AP_SOUTHEAST_1"] = "ap-southeast-1"; VoiceConnectorRegion["AP_SOUTHEAST_2"] = "ap-southeast-2"; VoiceConnectorRegion["EU_WEST_1"] = "eu-west-1"; VoiceConnectorRegion["EU_WEST_2"] = "eu-west-2"; VoiceConnectorRegion["EU_CENTRAL_1"] = "eu-central-1"; })(VoiceConnectorRegion || (VoiceConnectorRegion = {})); const chimeSDKVoiceClient = new client_chime_sdk_voice_1.ChimeSDKVoiceClient({ region: process.env.AWS_REGION, }); const ssmClient = new client_ssm_1.SSMClient({ region: process.env.AWS_REGION }); const logClient = new client_cloudwatch_logs_1.CloudWatchLogsClient({ region: process.env.AWS_REGION }); let createVoiceConnectorResponse; let createVoiceConnectorParams; let updateVoiceConnectorParams; let getParameterCommandOutput; let voiceConnectorId; let phoneNumbersToDisassociate; let routes; let terminationConfiguration; let streamingConfiguration; let loggingConfiguration; let deleteVoiceConnectorResponse; const CreateVoiceConnector = async (uid, props) => { console.log(`Creating Voice Connector: ${uid}`); console.log(`Create Voice Connector Props: ${JSON.stringify(props)}`); createVoiceConnectorParams = { Name: props.name, RequireEncryption: props.encryption, AwsRegion: props.region, }; console.log(`createVoiceConnectorParams: ${JSON.stringify(createVoiceConnectorParams)}`); try { createVoiceConnectorResponse = await chimeSDKVoiceClient.send(new client_chime_sdk_voice_1.CreateVoiceConnectorCommand(createVoiceConnectorParams)); console.log(`createVoiceConnectorResponse: ${JSON.stringify(createVoiceConnectorResponse)}`); if (createVoiceConnectorResponse.VoiceConnector && createVoiceConnectorResponse.VoiceConnector.VoiceConnectorId) { voiceConnectorId = createVoiceConnectorResponse.VoiceConnector?.VoiceConnectorId; } else { throw new Error('Voice Connector failed to create'); } } catch (error) { if (error instanceof Error) { console.error(error); throw error; } } console.log(`Voice Connector Created: ${voiceConnectorId}`); if (props.origination) { await putOrigination(voiceConnectorId, props.origination); } if (props.termination) { await putTermination(voiceConnectorId, props.termination); } if (props.streaming) { await putStreaming(voiceConnectorId, props.streaming); } if (props.logging) { await putLogging(voiceConnectorId, props.logging); } try { await ssmClient.send(new client_ssm_1.PutParameterCommand({ Name: '/chime/voiceConnector' + uid, Value: voiceConnectorId, Description: 'Voice Connector ID', Overwrite: true, Type: 'String', })); } catch (error) { if (error instanceof Error) { console.error(error); throw error; } } return { voiceConnectorId: voiceConnectorId, }; }; exports.CreateVoiceConnector = CreateVoiceConnector; const UpdateVoiceConnector = async (uid, props) => { console.log(`Updating Voice Connector: ${uid}`); console.log(`Updating Voice Connector Props: ${JSON.stringify(props)}`); updateVoiceConnectorParams = { Name: props.name, RequireEncryption: props.encryption, AwsRegion: props.region, }; console.log(`updateVoiceConnectorParams: ${JSON.stringify(updateVoiceConnectorParams)}`); try { getParameterCommandOutput = await ssmClient.send(new client_ssm_1.GetParameterCommand({ Name: '/chime/voiceConnector' + uid })); if (getParameterCommandOutput.Parameter && getParameterCommandOutput.Parameter.Value) { voiceConnectorId = getParameterCommandOutput.Parameter.Value; } } catch (error) { if (error instanceof Error) { console.error(error); throw error; } } if (props.origination) { await putOrigination(voiceConnectorId, props.origination); } if (props.termination) { await putTermination(voiceConnectorId, props.termination); } if (props.streaming) { await putStreaming(voiceConnectorId, props.streaming); } if (props.logging) { await putLogging(voiceConnectorId, props.logging); } return { voiceConnectorId: voiceConnectorId, }; }; exports.UpdateVoiceConnector = UpdateVoiceConnector; const DeleteVoiceConnector = async (uid) => { try { getParameterCommandOutput = await ssmClient.send(new client_ssm_1.GetParameterCommand({ Name: '/chime/voiceConnector' + uid })); if (getParameterCommandOutput.Parameter && getParameterCommandOutput.Parameter.Value) { voiceConnectorId = getParameterCommandOutput.Parameter.Value; } } catch (error) { if (error instanceof Error) { console.error(error); throw error; } } console.log(`voiceConnectorId to delete: ${voiceConnectorId}`); try { const phoneNumbersAssociated = await chimeSDKVoiceClient.send(new client_chime_sdk_voice_1.ListPhoneNumbersCommand({ FilterName: 'VoiceConnectorId', FilterValue: voiceConnectorId, })); console.log(`phoneNumbers to disassociate: ${JSON.stringify(phoneNumbersAssociated)}`); if (phoneNumbersAssociated.PhoneNumbers && phoneNumbersAssociated.PhoneNumbers.length > 0) { phoneNumbersAssociated.PhoneNumbers.forEach(async (phoneNumber) => { phoneNumbersToDisassociate.push(phoneNumber.PhoneNumberId); }); console.log(`Disassociate Phone Numbers: ${phoneNumbersToDisassociate}`); await chimeSDKVoiceClient.send(new client_chime_sdk_voice_1.DisassociatePhoneNumbersFromVoiceConnectorCommand({ VoiceConnectorId: voiceConnectorId, E164PhoneNumbers: phoneNumbersToDisassociate, })); } } catch (error) { if (error instanceof Error) { console.error(error); throw error; } } console.log(`Deleting Voice Connector: ${voiceConnectorId}`); try { deleteVoiceConnectorResponse = await chimeSDKVoiceClient.send(new client_chime_sdk_voice_1.DeleteVoiceConnectorCommand({ VoiceConnectorId: voiceConnectorId, })); console.log(`Delete Voice Connector Response: ${deleteVoiceConnectorResponse}`); await ssmClient.send(new client_ssm_1.DeleteParameterCommand({ Name: '/chime/voiceConnector' + uid })); } catch (error) { if (error instanceof Error) { console.error(error); throw error; } } }; exports.DeleteVoiceConnector = DeleteVoiceConnector; const putOrigination = async (originationVoiceConnectorId, originations) => { console.log(`originations: ${JSON.stringify(originations)}`); console.info(`voiceConnectorId: ${originationVoiceConnectorId}`); routes = []; originations.forEach(async (origination) => { routes.push({ Protocol: origination.protocol, Host: origination.host, Port: parseInt(origination.port), Priority: parseInt(origination.priority), Weight: parseInt(origination.weight), }); }); console.log(`routes: ${JSON.stringify(routes)}`); try { await chimeSDKVoiceClient.send(new client_chime_sdk_voice_1.PutVoiceConnectorOriginationCommand({ VoiceConnectorId: originationVoiceConnectorId, Origination: { Routes: routes, Disabled: false, }, })); } catch (error) { if (error instanceof Error) { console.error(error); throw error; } } }; const putTermination = async (terminationVoiceConnectorId, termination) => { console.log(`termination: ${JSON.stringify(termination)}`); console.info(`voiceConnectorId: ${terminationVoiceConnectorId}`); terminationConfiguration = { CallingRegions: termination.callingRegions, CidrAllowedList: termination.terminationCidrs, CpsLimit: parseInt(termination.cpsLimit), }; console.log(`terminationConfiguration: ${JSON.stringify(terminationConfiguration)}`); try { await chimeSDKVoiceClient.send(new client_chime_sdk_voice_1.PutVoiceConnectorTerminationCommand({ VoiceConnectorId: terminationVoiceConnectorId, Termination: terminationConfiguration, })); } catch (error) { if (error instanceof Error) { console.error(error); throw error; } } }; const putStreaming = async (streamingVoiceConnectorId, streaming) => { console.log(`streaming: ${JSON.stringify(streaming)}`); console.info(`voiceConnectorId: ${streamingVoiceConnectorId}`); streamingConfiguration = { StreamingNotificationTargets: streaming.notificationTarget, Disabled: false, DataRetentionInHours: parseInt(streaming.dataRetention), ...(streaming.mediaInsightsConfiguration && { MediaInsightsConfiguration: { Disabled: streaming.mediaInsightsConfiguration.disabled, ConfigurationArn: streaming.mediaInsightsConfiguration.configurationArn, }, }), }; console.log(`streamingConfiguration: ${JSON.stringify(streamingConfiguration)}`); try { await chimeSDKVoiceClient.send(new client_chime_sdk_voice_1.PutVoiceConnectorStreamingConfigurationCommand({ VoiceConnectorId: streamingVoiceConnectorId, StreamingConfiguration: streamingConfiguration, })); } catch (error) { if (error instanceof Error) { console.error(error); throw error; } } }; const putLogging = async (loggingVoiceConnectorId, logging) => { console.log(`logging: ${JSON.stringify(logging)}`); console.info(`voiceConnectorId: ${loggingVoiceConnectorId}`); try { console.log('Updating Resource Policy'); const policyDocument = JSON.stringify({ Version: '2012-10-17', Statement: [ { Sid: 'AWSLogDeliveryWrite', Effect: 'Allow', Principal: { Service: 'delivery.logs.amazonaws.com' }, Action: ['logs:CreateLogStream', 'logs:PutLogEvents'], Resource: ['*'], }, ], }); await logClient.send(new client_cloudwatch_logs_1.PutResourcePolicyCommand({ policyName: 'msk', policyDocument: policyDocument, })); } catch (error) { if (error instanceof Error) { console.error(error); throw error; } } loggingConfiguration = { ...(logging.enableSIPLogs && { EnableSIPLogs: logging.enableSIPLogs }), ...(logging.enableMediaMetricLogs && { EnableMediaMetricLogs: logging.enableMediaMetricLogs, }), }; console.log(`loggingConfiguration: ${JSON.stringify(loggingConfiguration)}`); try { await chimeSDKVoiceClient.send(new client_chime_sdk_voice_1.PutVoiceConnectorLoggingConfigurationCommand({ VoiceConnectorId: loggingVoiceConnectorId, LoggingConfiguration: loggingConfiguration, })); } catch (error) { if (error instanceof Error) { console.error(error); throw error; } } }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm9pY2VDb25uZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmVzb3VyY2VzL3BzdG4vdm9pY2VDb25uZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNEVBa0J5QztBQUN6Qyw0RUFHeUM7QUFDekMsb0RBTTZCO0FBTzdCLElBQUssb0JBV0o7QUFYRCxXQUFLLG9CQUFvQjtJQUN2QiwrQ0FBdUIsQ0FBQTtJQUN2QiwrQ0FBdUIsQ0FBQTtJQUN2QixxREFBNkIsQ0FBQTtJQUM3Qix5REFBaUMsQ0FBQTtJQUNqQyx5REFBaUMsQ0FBQTtJQUNqQyx5REFBaUMsQ0FBQTtJQUNqQyx5REFBaUMsQ0FBQTtJQUNqQywrQ0FBdUIsQ0FBQTtJQUN2QiwrQ0FBdUIsQ0FBQTtJQUN2QixxREFBNkIsQ0FBQTtBQUMvQixDQUFDLEVBWEksb0JBQW9CLEtBQXBCLG9CQUFvQixRQVd4QjtBQUNELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSw0Q0FBbUIsQ0FBQztJQUNsRCxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVO0NBQy9CLENBQUMsQ0FBQztBQUVILE1BQU0sU0FBUyxHQUFHLElBQUksc0JBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7QUFDcEUsTUFBTSxTQUFTLEdBQUcsSUFBSSw2Q0FBb0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7QUFFL0UsSUFBSSw0QkFBK0QsQ0FBQztBQUNwRSxJQUFJLDBCQUE0RCxDQUFDO0FBQ2pFLElBQUksMEJBQTRELENBQUM7QUFDakUsSUFBSSx5QkFBb0QsQ0FBQztBQUN6RCxJQUFJLGdCQUF3QixDQUFDO0FBQzdCLElBQUksMEJBQW9DLENBQUM7QUFDekMsSUFBSSxNQUEwQixDQUFDO0FBQy9CLElBQUksd0JBQXFDLENBQUM7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ZWN0b3JDb21tYW5kLFxuICBQdXRWb2ljZUNvbm5lY3RvckxvZ2dpbmdDb25maWd1cmF0aW9uQ29tbWFuZCxcbiAgUHV0Vm9pY2VDb25uZWN0b3JTdHJlYW1pbmdDb25maWd1cmF0aW9uQ29tbWFuZCxcbiAgUHV0Vm9pY2VDb25uZWN0b3JUZXJtaW5hdGlvbkNvbW1hbmQsXG4gIFB1dFZvaWNlQ29ubmVjdG9yT3JpZ2luYXRpb25Db21tYW5kLFxuICBEZWxldGVWb2ljZUNvbm5lY3RvckNvbW1hbmQsXG4gIERlbGV0ZVZvaWNlQ29ubmVjdG9yQ29tbWFuZE91dHB1dCxcbiAgRGlzYXNzb2NpYXRlUGhvbmVOdW1iZXJzRnJvbVZvaWNlQ29ubmVjdG9yQ29tbWFuZCxcbiAgQ3JlYXRlVm9pY2VDb25uZWN0b3JDb21tYW5kSW5wdXQsXG4gIENyZWF0ZVZvaWNlQ29ubmVjdG9yQ29tbWFuZE91dHB1dCxcbiAgVGVybWluYXRpb24sXG4gIE9yaWdpbmF0aW9uUm91dGUsXG4gIFN0cmVhbWluZ0NvbmZpZ3VyYXRpb24sXG4gIExvZ2dpbmdDb25maWd1cmF0aW9uLFxuICBMaXN0UGhvbmVOdW1iZXJzQ29tbWFuZCxcbiAgU3RyZWFtaW5nTm90aWZpY2F0aW9uVGFyZ2V0LFxufSBmcm9tICdAYXdzLXNkay9jbGllbnQtY2hpbWUtc2RrLXZvaWNlJztcbmltcG9ydCB7XG4gIENsb3VkV2F0Y2hMb2dzQ2xpZW50LFxuICBQdXRSZXNvdXJjZVBvbGljeUNvbW1hbmQsXG59IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1jbG91ZHdhdGNoLWxvZ3MnO1xuaW1wb3J0IHtcbiAgU1NNQ2xpZW50LFxuICBEZWxldGVQYXJhbWV0ZXJDb21tYW5kLFxuICBHZXRQYXJhbWV0ZXJDb21tYW5kLFxuICBHZXRQYXJhbWV0ZXJDb21tYW5kT3V0cHV0LFxuICBQdXRQYXJhbWV0ZXJDb21tYW5kLFxufSBmcm9tICdAYXdzLXNkay9jbGllbnQtc3NtJztcbmltcG9ydCB7XG4gIE1lZGlhSW5zaWdodHNDb25maWd1cmF0aW9uLFxuICBQcm90b2NvbCxcbn0gZnJvbSAnLi4vLi4vcHN0bi92b2ljZUNvbm5lY3Rvcic7XG5cblxuZW51bSBWb2ljZUNvbm5lY3RvclJlZ2lvbiB7XG4gIFVTX0VBU1RfMSA9ICd1cy1lYXN0LTEnLFxuICBVU19XRVNUXzIgPSAndXMtd2VzdC0yJyxcbiAgQ0FfQ0VOVFJBTF8xID0gJ2NhLWNlbnRyYWwtMScsXG4gIEFQX05PUlRIRUFTVF8xID0gJ2FwLW5vcnRoZWFzdC0xJyxcbiAgQVBfTk9SVEhFQVNUXzIgPSAnYXAtbm9ydGhlYXN0LTInLFxuICBBUF9TT1VUSEVBU1RfMSA9ICdhcC1zb3V0aGVhc3QtMScsXG4gIEFQX1NPVVRIRUFTVF8yID0gJ2FwLXNvdXRoZWFzdC0yJyxcbiAgRVVfV0VTVF8xID0gJ2V1LXdlc3QtMScsXG4gIEVVX1dFU1RfMiA9ICdldS13ZXN0LTInLFxuICBFVV9DRU5UUkFMXzEgPSAnZXUtY2VudHJhbC0xJyxcbn1cbmNvbnN0IGNoaW1lU0RLVm9pY2VDbGllbnQgPSBuZXcgQ2hpbWVTREtWb2ljZUNsaWVudCh7XG4gIHJlZ2lvbjogcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTixcbn0pO1xuXG5jb25zdCBzc21DbGllbnQgPSBuZXcgU1NNQ2xpZW50KHsgcmVnaW9uOiBwcm9jZXNzLmVudi5BV1NfUkVHSU9OIH0pO1xuY29uc3QgbG9nQ2xpZW50ID0gbmV3IENsb3VkV2F0Y2hMb2dzQ2xpZW50KHsgcmVnaW9uOiBwcm9jZXNzLmVudi5BV1NfUkVHSU9OIH0pO1xuXG5sZXQgY3JlYXRlVm9pY2VDb25uZWN0b3JSZXNwb25zZTogQ3JlYXRlVm9pY2VDb25uZWN0b3JDb21tYW5kT3V0cHV0O1xubGV0IGNyZWF0ZVZvaWNlQ29ubmVjdG9yUGFyYW1zOiBDcmVhdGVWb2ljZUNvbm5lY3RvckNvbW1hbmRJbnB1dDtcbmxldCB1cGRhdGVWb2ljZUNvbm5lY3RvclBhcmFtczogQ3JlYXRlVm9pY2VDb25uZWN0b3JDb21tYW5kSW5wdXQ7XG5sZXQgZ2V0UGFyYW1ldGVyQ29tbWFuZE91dHB1dDogR2V0UGFyYW1ldGVyQ29tbWFuZE91dHB1dDtcbmxldCB2b2ljZUNvbm5lY3RvcklkOiBzdHJpbmc7XG5sZXQgcGhvbmVOdW1iZXJzVG9EaXNhc3NvY2lhdGU6IHN0cmluZ1tdO1xubGV0IHJvdXRlczogT3JpZ2luYXRpb25Sb3V0ZVtdO1xubGV0IHRlcm1pbmF0aW9uQ29uZmlndXJhdGlvbjogVGVybWluYXRpb247XG5sZXQgc3RyZWFtaW5nQ29uZmlndXJhdGlvbjogU3RyZWFtaW5nQ29uZmlndXJhdGlvbjtcbmxldCBsb2dnaW5nQ29uZmlndXJhdGlvbjogTG9nZ2luZ0NvbmZpZ3VyYXRpb247XG5sZXQgZGVsZXRlVm9pY2VDb25uZWN0b3JSZXNwb25zZTogRGVsZXRlVm9pY2VDb25uZWN0b3JDb21tYW5kT3V0cHV0O1xuXG5pbnRlcmZhY2UgUm91dGVzIHtcbiAgcHJvdG9jb2w6IFByb3RvY29sO1xuICBob3N0OiBzdHJpbmc7XG4gIHBvcnQ6IHN0cmluZztcbiAgcHJpb3JpdHk6IHN0cmluZztcbiAgd2VpZ2h0OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUZXJtaW5hdGlvblByb3BzIHtcbiAgY2FsbGluZ1JlZ2lvbnM6IHN0cmluZ1tdO1xuICB0ZXJtaW5hdGlvbkNpZHJzOiBzdHJpbmdbXTtcbiAgY3BzTGltaXQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFN0cmVhbWluZ1Byb3BzIHtcbiAgZW5hYmxlZDogYm9vbGVhbjtcbiAgZGF0YVJldGVudGlvbjogc3RyaW5nO1xuICBub3RpZmljYXRpb25UYXJnZXQ6IFN0cmVhbWluZ05vdGlmaWNhdGlvblRhcmdldFtdO1xuICBtZWRpYUluc2lnaHRzQ29uZmlndXJhdGlvbjogTWVkaWFJbnNpZ2h0c0NvbmZpZ3VyYXRpb247XG59XG5cbmludGVyZmFjZSBMb2dnaW5nUHJvcHMge1xuICBlbmFibGVTSVBMb2dzOiBib29sZWFuO1xuICBlbmFibGVNZWRpYU1ldHJpY0xvZ3M6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlVm9pY2VDb25uZWN0b3JQcm9wcyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHJlZ2lvbj86IFZvaWNlQ29ubmVjdG9yUmVnaW9uO1xuICBlbmNyeXB0aW9uPzogYm9vbGVhbjtcbiAgdGVybWluYXRpb24/OiBUZXJtaW5hdGlvblByb3BzO1xuICBvcmlnaW5hdGlvbj86IFJvdXRlc1tdO1xuICBsb2dnaW5nPzogTG9nZ2luZ1Byb3BzO1xuICBzdHJlYW1pbmc/OiBTdHJlYW1pbmdQcm9wcztcbn1cblxuZXhwb3J0IGNvbnN0IENyZWF0ZVZvaWNlQ29ubmVjdG9yID0gYXN5bmMgKFxuICB1aWQ6IHN0cmluZyxcbiAgcHJvcHM6IENyZWF0ZVZvaWNlQ29ubmVjdG9yUHJvcHMsXG4pID0+IHtcbiAgY29uc29sZS5sb2coYENyZWF0aW5nIFZvaWNlIENvbm5lY3RvcjogJHt1aWR9YCk7XG4gIGNvbnNvbGUubG9nKGBDcmVhdGUgVm9pY2UgQ29ubmVjdG9yIFByb3BzOiAke0pTT04uc3RyaW5naWZ5KHByb3BzKX1gKTtcbiAgY3JlYXRlVm9pY2VDb25uZWN0b3JQYXJhbXMgPSB7XG4gICAgTmFtZTogcHJvcHMubmFtZSxcbiAgICBSZXF1aXJlRW5jcnlwdGlvbjogcHJvcHMuZW5jcnlwdGlvbixcbiAgICBBd3NSZWdpb246IHByb3BzLnJlZ2lvbixcbiAgfTtcbiAgY29uc29sZS5sb2coXG4gICAgYGNyZWF0ZVZvaWNlQ29ubmVjdG9yUGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KGNyZWF0ZVZvaWNlQ29ubmVjdG9yUGFyYW1zKX1gLFxuICApO1xuXG4gIHRyeSB7XG4gICAgY3JlYXRlVm9pY2VDb25uZWN0b3JSZXNwb25zZSA9IGF3YWl0IGNoaW1lU0RLVm9pY2VDbGllbnQuc2VuZChcbiAgICAgIG5ldyBDcmVhdGVWb2ljZUNvbm5lY3RvckNvbW1hbmQoY3JlYXRlVm9pY2VDb25uZWN0b3JQYXJhbXMpLFxuICAgICk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgY3JlYXRlVm9pY2VDb25uZWN0b3JSZXNwb25zZTogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgY3JlYXRlVm9pY2VDb25uZWN0b3JSZXNwb25zZSxcbiAgICAgICl9YCxcbiAgICApO1xuICAgIGlmIChcbiAgICAgIGNyZWF0ZVZvaWNlQ29ubmVjdG9yUmVzcG9uc2UuVm9pY2VDb25uZWN0b3IgJiZcbiAgICAgIGNyZWF0ZVZvaWNlQ29ubmVjdG9yUmVzcG9uc2UuVm9pY2VDb25uZWN0b3IuVm9pY2VDb25uZWN0b3JJZFxuICAgICkge1xuICAgICAgdm9pY2VDb25uZWN0b3JJZCA9XG4gICAgICAgIGNyZWF0ZVZvaWNlQ29ubmVjdG9yUmVzcG9uc2UuVm9pY2VDb25uZWN0b3I/LlZvaWNlQ29ubmVjdG9ySWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVm9pY2UgQ29ubmVjdG9yIGZhaWxlZCB0byBjcmVhdGUnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUubG9nKGBWb2ljZSBDb25uZWN0b3IgQ3JlYXRlZDogJHt2b2ljZUNvbm5lY3RvcklkfWApO1xuXG4gIGlmIChwcm9wcy5vcmlnaW5hdGlvbikge1xuICAgIGF3YWl0IHB1dE9yaWdpbmF0aW9uKHZvaWNlQ29ubmVjdG9ySWQsIHByb3BzLm9yaWdpbmF0aW9uKTtcbiAgfVxuXG4gIGlmIChwcm9wcy50ZXJtaW5hdGlvbikge1xuICAgIGF3YWl0IHB1dFRlcm1pbmF0aW9uKHZvaWNlQ29ubmVjdG9ySWQsIHByb3BzLnRlcm1pbmF0aW9uKTtcbiAgfVxuXG4gIGlmIChwcm9wcy5zdHJlYW1pbmcpIHtcbiAgICBhd2FpdCBwdXRTdHJlYW1pbmcodm9pY2VDb25uZWN0b3JJZCwgcHJvcHMuc3RyZWFtaW5nKTtcbiAgfVxuXG4gIGlmIChwcm9wcy5sb2dnaW5nKSB7XG4gICAgYXdhaXQgcHV0TG9nZ2luZyh2b2ljZUNvbm5lY3RvcklkLCBwcm9wcy5sb2dnaW5nKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgc3NtQ2xpZW50LnNlbmQoXG4gICAgICBuZXcgUHV0UGFyYW1ldGVyQ29tbWFuZCh7XG4gICAgICAgIE5hbWU6ICcvY2hpbWUvdm9pY2VDb25uZWN0b3InICsgdWlkLFxuICAgICAgICBWYWx1ZTogdm9pY2VDb25uZWN0b3JJZCxcbiAgICAgICAgRGVzY3JpcHRpb246ICdWb2ljZSBDb25uZWN0b3IgSUQnLFxuICAgICAgICBPdmVyd3JpdGU6IHRydWUsXG4gICAgICAgIFR5cGU6ICdTdHJpbmcnLFxuICAgICAgfSksXG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHZvaWNlQ29ubmVjdG9ySWQ6IHZvaWNlQ29ubmVjdG9ySWQsXG4gIH07XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZVZvaWNlQ29ubmVjdG9yUHJvcHMge1xuICBuYW1lPzogc3RyaW5nO1xuICByZWdpb24/OiBWb2ljZUNvbm5lY3RvclJlZ2lvbjtcbiAgZW5jcnlwdGlvbj86IGJvb2xlYW47XG4gIHRlcm1pbmF0aW9uPzogVGVybWluYXRpb25Qcm9wcztcbiAgb3JpZ2luYXRpb24/OiBSb3V0ZXNbXTtcbiAgbG9nZ2luZz86IExvZ2dpbmdQcm9wcztcbiAgc3RyZWFtaW5nPzogU3RyZWFtaW5nUHJvcHM7XG59XG5cbmV4cG9ydCBjb25zdCBVcGRhdGVWb2ljZUNvbm5lY3RvciA9IGFzeW5jIChcbiAgdWlkOiBzdHJpbmcsXG4gIHByb3BzOiBVcGRhdGVWb2ljZUNvbm5lY3RvclByb3BzLFxuKSA9PiB7XG4gIGNvbnNvbGUubG9nKGBVcGRhdGluZyBWb2ljZSBDb25uZWN0b3I6ICR7dWlkfWApO1xuICBjb25zb2xlLmxvZyhgVXBkYXRpbmcgVm9pY2UgQ29ubmVjdG9yIFByb3BzOiAke0pTT04uc3RyaW5naWZ5KHByb3BzKX1gKTtcbiAgdXBkYXRlVm9pY2VDb25uZWN0b3JQYXJhbXMgPSB7XG4gICAgTmFtZTogcHJvcHMubmFtZSxcbiAgICBSZXF1aXJlRW5jcnlwdGlvbjogcHJvcHMuZW5jcnlwdGlvbixcbiAgICBBd3NSZWdpb246IHByb3BzLnJlZ2lvbixcbiAgfTtcbiAgY29uc29sZS5sb2coXG4gICAgYHVwZGF0ZVZvaWNlQ29ubmVjdG9yUGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KHVwZGF0ZVZvaWNlQ29ubmVjdG9yUGFyYW1zKX1gLFxuICApO1xuXG4gIHRyeSB7XG4gICAgZ2V0UGFyYW1ldGVyQ29tbWFuZE91dHB1dCA9IGF3YWl0IHNzbUNsaWVudC5zZW5kKFxuICAgICAgbmV3IEdldFBhcmFtZXRlckNvbW1hbmQoeyBOYW1lOiAnL2NoaW1lL3ZvaWNlQ29ubmVjdG9yJyArIHVpZCB9KSxcbiAgICApO1xuICAgIGlmIChcbiAgICAgIGdldFBhcmFtZXRlckNvbW1hbmRPdXRwdXQuUGFyYW1ldGVyICYmXG4gICAgICBnZXRQYXJhbWV0ZXJDb21tYW5kT3V0cHV0LlBhcmFtZXRlci5WYWx1ZVxuICAgICkge1xuICAgICAgdm9pY2VDb25uZWN0b3JJZCA9IGdldFBhcmFtZXRlckNvbW1hbmRPdXRwdXQuUGFyYW1ldGVyLlZhbHVlO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBpZiAocHJvcHMub3JpZ2luYXRpb24pIHtcbiAgICBhd2FpdCBwdXRPcmlnaW5hdGlvbih2b2ljZUNvbm5lY3RvcklkLCBwcm9wcy5vcmlnaW5hdGlvbik7XG4gIH1cblxuICBpZiAocHJvcHMudGVybWluYXRpb24pIHtcbiAgICBhd2FpdCBwdXRUZXJtaW5hdGlvbih2b2ljZUNvbm5lY3RvcklkLCBwcm9wcy50ZXJtaW5hdGlvbik7XG4gIH1cblxuICBpZiAocHJvcHMuc3RyZWFtaW5nKSB7XG4gICAgYXdhaXQgcHV0U3RyZWFtaW5nKHZvaWNlQ29ubmVjdG9ySWQsIHByb3BzLnN0cmVhbWluZyk7XG4gIH1cblxuICBpZiAocHJvcHMubG9nZ2luZykge1xuICAgIGF3YWl0IHB1dExvZ2dpbmcodm9pY2VDb25uZWN0b3JJZCwgcHJvcHMubG9nZ2luZyk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB2b2ljZUNvbm5lY3RvcklkOiB2b2ljZUNvbm5lY3RvcklkLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IERlbGV0ZVZvaWNlQ29ubmVjdG9yID0gYXN5bmMgKHVpZDogc3RyaW5nKSA9PiB7XG4gIHRyeSB7XG4gICAgZ2V0UGFyYW1ldGVyQ29tbWFuZE91dHB1dCA9IGF3YWl0IHNzbUNsaWVudC5zZW5kKFxuICAgICAgbmV3IEdldFBhcmFtZXRlckNvbW1hbmQoeyBOYW1lOiAnL2NoaW1lL3ZvaWNlQ29ubmVjdG9yJyArIHVpZCB9KSxcbiAgICApO1xuICAgIGlmIChcbiAgICAgIGdldFBhcmFtZXRlckNvbW1hbmRPdXRwdXQuUGFyYW1ldGVyICYmXG4gICAgICBnZXRQYXJhbWV0ZXJDb21tYW5kT3V0cHV0LlBhcmFtZXRlci5WYWx1ZVxuICAgICkge1xuICAgICAgdm9pY2VDb25uZWN0b3JJZCA9IGdldFBhcmFtZXRlckNvbW1hbmRPdXRwdXQuUGFyYW1ldGVyLlZhbHVlO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5sb2coYHZvaWNlQ29ubmVjdG9ySWQgdG8gZGVsZXRlOiAke3ZvaWNlQ29ubmVjdG9ySWR9YCk7XG4gIHRyeSB7XG4gICAgY29uc3QgcGhvbmVOdW1iZXJzQXNzb2NpYXRlZCA9IGF3YWl0IGNoaW1lU0RLVm9pY2VDbGllbnQuc2VuZChcbiAgICAgIG5ldyBMaXN0UGhvbmVOdW1iZXJzQ29tbWFuZCh7XG4gICAgICAgIEZpbHRlck5hbWU6ICdWb2ljZUNvbm5lY3RvcklkJyxcbiAgICAgICAgRmlsdGVyVmFsdWU6IHZvaWNlQ29ubmVjdG9ySWQsXG4gICAgICB9KSxcbiAgICApO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYHBob25lTnVtYmVycyB0byBkaXNhc3NvY2lhdGU6ICAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICBwaG9uZU51bWJlcnNBc3NvY2lhdGVkLFxuICAgICAgKX1gLFxuICAgICk7XG4gICAgaWYgKFxuICAgICAgcGhvbmVOdW1iZXJzQXNzb2NpYXRlZC5QaG9uZU51bWJlcnMgJiZcbiAgICAgIHBob25lTnVtYmVyc0Fzc29jaWF0ZWQuUGhvbmVOdW1iZXJzLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIHBob25lTnVtYmVyc0Fzc29jaWF0ZWQuUGhvbmVOdW1iZXJzLmZvckVhY2goYXN5bmMgKHBob25lTnVtYmVyKSA9PiB7XG4gICAgICAgIHBob25lTnVtYmVyc1RvRGlzYXNzb2NpYXRlLnB1c2gocGhvbmVOdW1iZXIuUGhvbmVOdW1iZXJJZCEpO1xuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmxvZyhgRGlzYXNzb2NpYXRlIFBob25lIE51bWJlcnM6ICR7cGhvbmVOdW1iZXJzVG9EaXNhc3NvY2lhdGV9YCk7XG4gICAgICBhd2FpdCBjaGltZVNES1ZvaWNlQ2xpZW50LnNlbmQoXG4gICAgICAgIG5ldyBEaXNhc3NvY2lhdGVQaG9uZU51bWJlcnNGcm9tVm9pY2VDb25uZWN0b3JDb21tYW5kKHtcbiAgICAgICAgICBWb2ljZUNvbm5lY3RvcklkOiB2b2ljZUNvbm5lY3RvcklkLFxuICAgICAgICAgIEUxNjRQaG9uZU51bWJlcnM6IHBob25lTnVtYmVyc1RvRGlzYXNzb2NpYXRlLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuICBjb25zb2xlLmxvZyhgRGVsZXRpbmcgVm9pY2UgQ29ubmVjdG9yOiAke3ZvaWNlQ29ubmVjdG9ySWR9YCk7XG4gIHRyeSB7XG4gICAgZGVsZXRlVm9pY2VDb25uZWN0b3JSZXNwb25zZSA9IGF3YWl0IGNoaW1lU0RLVm9pY2VDbGllbnQuc2VuZChcbiAgICAgIG5ldyBEZWxldGVWb2ljZUNvbm5lY3RvckNvbW1hbmQoe1xuICAgICAgICBWb2ljZUNvbm5lY3RvcklkOiB2b2ljZUNvbm5lY3RvcklkLFxuICAgICAgfSksXG4gICAgKTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBEZWxldGUgVm9pY2UgQ29ubmVjdG9yIFJlc3BvbnNlOiAke2RlbGV0ZVZvaWNlQ29ubmVjdG9yUmVzcG9uc2V9YCxcbiAgICApO1xuICAgIGF3YWl0IHNzbUNsaWVudC5zZW5kKFxuICAgICAgbmV3IERlbGV0ZVBhcmFtZXRlckNvbW1hbmQoeyBOYW1lOiAnL2NoaW1lL3ZvaWNlQ29ubmVjdG9yJyArIHVpZCB9KSxcbiAgICApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgcHV0T3JpZ2luYXRpb24gPSBhc3luYyAoXG4gIG9yaWdpbmF0aW9uVm9pY2VDb25uZWN0b3JJZDogc3RyaW5nLFxuICBvcmlnaW5hdGlvbnM6IHtcbiAgICBwcm90b2NvbDogUHJvdG9jb2w7XG4gICAgaG9zdDogc3RyaW5nO1xuICAgIHBvcnQ6IHN0cmluZztcbiAgICBwcmlvcml0eTogc3RyaW5nO1xuICAgIHdlaWdodDogc3RyaW5nO1xuICB9W10sXG4pID0+IHtcbiAgY29uc29sZS5sb2coYG9yaWdpbmF0aW9uczogICR7SlNPTi5zdHJpbmdpZnkob3JpZ2luYXRpb25zKX1gKTtcbiAgY29uc29sZS5pbmZvKGB2b2ljZUNvbm5lY3RvcklkOiAke29yaWdpbmF0aW9uVm9pY2VDb25uZWN0b3JJZH1gKTtcbiAgcm91dGVzID0gW107XG4gIG9yaWdpbmF0aW9ucy5mb3JFYWNoKGFzeW5jIChvcmlnaW5hdGlvbikgPT4ge1xuICAgIHJvdXRlcy5wdXNoKHtcbiAgICAgIFByb3RvY29sOiBvcmlnaW5hdGlvbi5wcm90b2NvbCxcbiAgICAgIEhvc3Q6IG9yaWdpbmF0aW9uLmhvc3QsXG4gICAgICBQb3J0OiBwYXJzZUludChvcmlnaW5hdGlvbi5wb3J0KSxcbiAgICAgIFByaW9yaXR5OiBwYXJzZUludChvcmlnaW5hdGlvbi5wcmlvcml0eSksXG4gICAgICBXZWlnaHQ6IHBhcnNlSW50KG9yaWdpbmF0aW9uLndlaWdodCksXG4gICAgfSk7XG4gIH0pO1xuICBjb25zb2xlLmxvZyhgcm91dGVzOiAgJHtKU09OLnN0cmluZ2lmeShyb3V0ZXMpfWApO1xuICB0cnkge1xuICAgIGF3YWl0IGNoaW1lU0RLVm9pY2VDbGllbnQuc2VuZChcbiAgICAgIG5ldyBQdXRWb2ljZUNvbm5lY3Rvck9yaWdpbmF0aW9uQ29tbWFuZCh7XG4gICAgICAgIFZvaWNlQ29ubmVjdG9ySWQ6IG9yaWdpbmF0aW9uVm9pY2VDb25uZWN0b3JJZCxcbiAgICAgICAgT3JpZ2luYXRpb246IHtcbiAgICAgICAgICBSb3V0ZXM6IHJvdXRlcyxcbiAgICAgICAgICBEaXNhYmxlZDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgcHV0VGVybWluYXRpb24gPSBhc3luYyAoXG4gIHRlcm1pbmF0aW9uVm9pY2VDb25uZWN0b3JJZDogc3RyaW5nLFxuICB0ZXJtaW5hdGlvbjoge1xuICAgIGNhbGxpbmdSZWdpb25zOiBzdHJpbmdbXTtcbiAgICB0ZXJtaW5hdGlvbkNpZHJzOiBzdHJpbmdbXTtcbiAgICBjcHNMaW1pdDogc3RyaW5nO1xuICB9LFxuKSA9PiB7XG4gIGNvbnNvbGUubG9nKGB0ZXJtaW5hdGlvbjogICR7SlNPTi5zdHJpbmdpZnkodGVybWluYXRpb24pfWApO1xuICBjb25zb2xlLmluZm8oYHZvaWNlQ29ubmVjdG9ySWQ6ICR7dGVybWluYXRpb25Wb2ljZUNvbm5lY3RvcklkfWApO1xuICB0ZXJtaW5hdGlvbkNvbmZpZ3VyYXRpb24gPSB7XG4gICAgQ2FsbGluZ1JlZ2lvbnM6IHRlcm1pbmF0aW9uLmNhbGxpbmdSZWdpb25zLFxuICAgIENpZHJBbGxvd2VkTGlzdDogdGVybWluYXRpb24udGVybWluYXRpb25DaWRycyxcbiAgICBDcHNMaW1pdDogcGFyc2VJbnQodGVybWluYXRpb24uY3BzTGltaXQpLFxuICB9O1xuICBjb25zb2xlLmxvZyhcbiAgICBgdGVybWluYXRpb25Db25maWd1cmF0aW9uOiAgJHtKU09OLnN0cmluZ2lmeSh0ZXJtaW5hdGlvbkNvbmZpZ3VyYXRpb24pfWAsXG4gICk7XG4gIHRyeSB7XG4gICAgYXdhaXQgY2hpbWVTREtWb2ljZUNsaWVudC5zZW5kKFxuICAgICAgbmV3IFB1dFZvaWNlQ29ubmVjdG9yVGVybWluYXRpb25Db21tYW5kKHtcbiAgICAgICAgVm9pY2VDb25uZWN0b3JJZDogdGVybWluYXRpb25Wb2ljZUNvbm5lY3RvcklkLFxuICAgICAgICBUZXJtaW5hdGlvbjogdGVybWluYXRpb25Db25maWd1cmF0aW9uLFxuICAgICAgfSksXG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cbn07XG5cbmNvbnN0IHB1dFN0cmVhbWluZyA9IGFzeW5jIChcbiAgc3RyZWFtaW5nVm9pY2VDb25uZWN0b3JJZDogc3RyaW5nLFxuICBzdHJlYW1pbmc6IFN0cmVhbWluZ1Byb3BzLFxuKSA9PiB7XG4gIGNvbnNvbGUubG9nKGBzdHJlYW1pbmc6ICAke0pTT04uc3RyaW5naWZ5KHN0cmVhbWluZyl9YCk7XG4gIGNvbnNvbGUuaW5mbyhgdm9pY2VDb25uZWN0b3JJZDogJHtzdHJlYW1pbmdWb2ljZUNvbm5lY3RvcklkfWApO1xuXG4gIHN0cmVhbWluZ0NvbmZpZ3VyYXRpb24gPSB7XG4gICAgU3RyZWFtaW5nTm90aWZpY2F0aW9uVGFyZ2V0czogc3RyZWFtaW5nLm5vdGlmaWNhdGlvblRhcmdldCxcbiAgICBEaXNhYmxlZDogZmFsc2UsXG4gICAgRGF0YVJldGVudGlvbkluSG91cnM6IHBhcnNlSW50KHN0cmVhbWluZy5kYXRhUmV0ZW50aW9uKSxcbiAgICAuLi4oc3RyZWFtaW5nLm1lZGlhSW5zaWdodHNDb25maWd1cmF0aW9uICYmIHtcbiAgICAgIE1lZGlhSW5zaWdodHNDb25maWd1cmF0aW9uOiB7XG4gICAgICAgIERpc2FibGVkOiBzdHJlYW1pbmcubWVkaWFJbnNpZ2h0c0NvbmZpZ3VyYXRpb24uZGlzYWJsZWQsXG4gICAgICAgIENvbmZpZ3VyYXRpb25Bcm46IHN0cmVhbWluZy5tZWRpYUluc2lnaHRzQ29uZmlndXJhdGlvbi5jb25maWd1cmF0aW9uQXJuLFxuICAgICAgfSxcbiAgICB9KSxcbiAgfTtcbiAgY29uc29sZS5sb2coXG4gICAgYHN0cmVhbWluZ0NvbmZpZ3VyYXRpb246ICAke0pTT04uc3RyaW5naWZ5KHN0cmVhbWluZ0NvbmZpZ3VyYXRpb24pfWAsXG4gICk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBjaGltZVNES1ZvaWNlQ2xpZW50LnNlbmQoXG4gICAgICBuZXcgUHV0Vm9pY2VDb25uZWN0b3JTdHJlYW1pbmdDb25maWd1cmF0aW9uQ29tbWFuZCh7XG4gICAgICAgIFZvaWNlQ29ubmVjdG9ySWQ6IHN0cmVhbWluZ1ZvaWNlQ29ubmVjdG9ySWQsXG4gICAgICAgIFN0cmVhbWluZ0NvbmZpZ3VyYXRpb246IHN0cmVhbWluZ0NvbmZpZ3VyYXRpb24sXG4gICAgICB9KSxcbiAgICApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgcHV0TG9nZ2luZyA9IGFzeW5jIChcbiAgbG9nZ2luZ1ZvaWNlQ29ubmVjdG9ySWQ6IHN0cmluZyxcbiAgbG9nZ2luZzogTG9nZ2luZ1Byb3BzLFxuKSA9PiB7XG4gIGNvbnNvbGUubG9nKGBsb2dnaW5nOiAgJHtKU09OLnN0cmluZ2lmeShsb2dnaW5nKX1gKTtcbiAgY29uc29sZS5pbmZvKGB2b2ljZUNvbm5lY3RvcklkOiAke2xvZ2dpbmdWb2ljZUNvbm5lY3RvcklkfWApO1xuXG4gIHRyeSB7XG4gICAgY29uc29sZS5sb2coJ1VwZGF0aW5nIFJlc291cmNlIFBvbGljeScpO1xuICAgIGNvbnN0IHBvbGljeURvY3VtZW50ID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgVmVyc2lvbjogJzIwMTItMTAtMTcnLFxuICAgICAgU3RhdGVtZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICBTaWQ6ICdBV1NMb2dEZWxpdmVyeVdyaXRlJyxcbiAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXG4gICAgICAgICAgUHJpbmNpcGFsOiB7IFNlcnZpY2U6ICdkZWxpdmVyeS5sb2dzLmFtYXpvbmF3cy5jb20nIH0sXG4gICAgICAgICAgQWN0aW9uOiBbJ2xvZ3M6Q3JlYXRlTG9nU3RyZWFtJywgJ2xvZ3M6UHV0TG9nRXZlbnRzJ10sXG4gICAgICAgICAgUmVzb3VyY2U6IFsnKiddLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBhd2FpdCBsb2dDbGllbnQuc2VuZChcbiAgICAgIG5ldyBQdXRSZXNvdXJjZVBvbGljeUNvbW1hbmQoe1xuICAgICAgICBwb2xpY3lOYW1lOiAnbXNrJyxcbiAgICAgICAgcG9saWN5RG9jdW1lbnQ6IHBvbGljeURvY3VtZW50LFxuICAgICAgfSksXG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBsb2dnaW5nQ29uZmlndXJhdGlvbiA9IHtcbiAgICAuLi4obG9nZ2luZy5lbmFibGVTSVBMb2dzICYmIHsgRW5hYmxlU0lQTG9nczogbG9nZ2luZy5lbmFibGVTSVBMb2dzIH0pLFxuICAgIC4uLihsb2dnaW5nLmVuYWJsZU1lZGlhTWV0cmljTG9ncyAmJiB7XG4gICAgICBFbmFibGVNZWRpYU1ldHJpY0xvZ3M6IGxvZ2dpbmcuZW5hYmxlTWVkaWFNZXRyaWNMb2dzLFxuICAgIH0pLFxuICB9O1xuICBjb25zb2xlLmxvZyhgbG9nZ2luZ0NvbmZpZ3VyYXRpb246ICAke0pTT04uc3RyaW5naWZ5KGxvZ2dpbmdDb25maWd1cmF0aW9uKX1gKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBjaGltZVNES1ZvaWNlQ2xpZW50LnNlbmQoXG4gICAgICBuZXcgUHV0Vm9pY2VDb25uZWN0b3JMb2dnaW5nQ29uZmlndXJhdGlvbkNvbW1hbmQoe1xuICAgICAgICBWb2ljZUNvbm5lY3RvcklkOiBsb2dnaW5nVm9pY2VDb25uZWN0b3JJZCxcbiAgICAgICAgTG9nZ2luZ0NvbmZpZ3VyYXRpb246IGxvZ2dpbmdDb25maWd1cmF0aW9uLFxuICAgICAgfSksXG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cbn07XG4iXX0=