UNPKG

aws-cdk

Version:

CDK Toolkit, the command line tool for CDK apps

155 lines 19.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.realHandler = void 0; const chalk = require("chalk"); const minimatch_1 = require("minimatch"); const version = require("../../lib/version"); const logging_1 = require("../logging"); const settings_1 = require("../settings"); const util_1 = require("../util"); async function realHandler(options) { const { configuration, args } = options; if (args.clear) { configuration.context.clear(); await configuration.saveContext(); (0, logging_1.print)('All context values cleared.'); } else if (args.reset) { invalidateContext(configuration.context, args.reset, args.force); await configuration.saveContext(); } else { // List -- support '--json' flag if (args.json) { const contextValues = configuration.context.all; process.stdout.write(JSON.stringify(contextValues, undefined, 2)); } else { listContext(configuration.context); } } await version.displayVersionMessage(); return 0; } exports.realHandler = realHandler; function listContext(context) { const keys = contextKeys(context); if (keys.length === 0) { (0, logging_1.print)('This CDK application does not have any saved context values yet.'); (0, logging_1.print)(''); (0, logging_1.print)('Context will automatically be saved when you synthesize CDK apps'); (0, logging_1.print)('that use environment context information like AZ information, VPCs,'); (0, logging_1.print)('SSM parameters, and so on.'); return; } // Print config by default const data = [[chalk.green('#'), chalk.green('Key'), chalk.green('Value')]]; for (const [i, key] of keys) { const jsonWithoutNewlines = JSON.stringify(context.all[key], undefined, 2).replace(/\s+/g, ' '); data.push([i, key, jsonWithoutNewlines]); } (0, logging_1.print)('Context found in %s:', chalk.blue(settings_1.PROJECT_CONFIG)); (0, logging_1.print)(''); (0, logging_1.print)((0, util_1.renderTable)(data, process.stdout.columns)); // eslint-disable-next-line max-len (0, logging_1.print)(`Run ${chalk.blue('cdk context --reset KEY_OR_NUMBER')} to remove a context key. It will be refreshed on the next CDK synthesis run.`); } function invalidateContext(context, key, force) { const i = parseInt(key, 10); if (`${i}` === key) { // was a number and we fully parsed it. key = keyByNumber(context, i); } // Unset! if (context.has(key)) { context.unset(key); // check if the value was actually unset. if (!context.has(key)) { (0, logging_1.print)('Context value %s reset. It will be refreshed on next synthesis', chalk.blue(key)); return; } // Value must be in readonly bag (0, logging_1.error)('Only context values specified in %s can be reset through the CLI', chalk.blue(settings_1.PROJECT_CONTEXT)); if (!force) { throw new Error(`Cannot reset readonly context value with key: ${key}`); } } // check if value is expression matching keys const matches = keysByExpression(context, key); if (matches.length > 0) { matches.forEach((match) => { context.unset(match); }); const { unset, readonly } = getUnsetAndReadonly(context, matches); // output the reset values printUnset(unset); // warn about values not reset printReadonly(readonly); // throw when none of the matches were reset if (!force && unset.length === 0) { throw new Error('None of the matched context values could be reset'); } return; } if (!force) { throw new Error(`No context value matching key: ${key}`); } } function printUnset(unset) { if (unset.length === 0) return; (0, logging_1.print)('The following matched context values reset. They will be refreshed on next synthesis'); unset.forEach((match) => { (0, logging_1.print)(' %s', match); }); } function printReadonly(readonly) { if (readonly.length === 0) return; (0, logging_1.warning)('The following matched context values could not be reset through the CLI'); readonly.forEach((match) => { (0, logging_1.print)(' %s', match); }); (0, logging_1.print)(''); (0, logging_1.print)('This usually means they are configured in %s or %s', chalk.blue(settings_1.PROJECT_CONFIG), chalk.blue(settings_1.USER_DEFAULTS)); } function keysByExpression(context, expression) { return context.keys.filter(minimatch_1.minimatch.filter(expression)); } function getUnsetAndReadonly(context, matches) { return matches.reduce((acc, match) => { if (context.has(match)) { acc.readonly.push(match); } else { acc.unset.push(match); } return acc; }, { unset: [], readonly: [] }); } function keyByNumber(context, n) { for (const [i, key] of contextKeys(context)) { if (n === i) { return key; } } throw new Error(`No context key with number: ${n}`); } /** * Return enumerated keys in a definitive order */ function contextKeys(context) { const keys = context.keys; keys.sort(); return enumerate1(keys); } function enumerate1(xs) { const ret = new Array(); let i = 1; for (const x of xs) { ret.push([i, x]); i += 1; } return ret; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0JBQStCO0FBQy9CLHlDQUFzQztBQUN0Qyw2Q0FBNkM7QUFFN0Msd0NBQW1EO0FBQ25ELDBDQUFzRjtBQUN0RixrQ0FBc0M7QUFFL0IsS0FBSyxVQUFVLFdBQVcsQ0FBQyxPQUF1QjtJQUN2RCxNQUFNLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUN4QyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7UUFDZCxhQUFhLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzlCLE1BQU0sYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2xDLElBQUEsZUFBSyxFQUFDLDZCQUE2QixDQUFDLENBQUM7S0FDdEM7U0FBTSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7UUFDckIsaUJBQWlCLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBZSxFQUFFLElBQUksQ0FBQyxLQUFnQixDQUFDLENBQUM7UUFDdEYsTUFBTSxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7S0FDbkM7U0FBTTtRQUNMLGdDQUFnQztRQUNoQyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDYixNQUFNLGFBQWEsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUNoRCxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuRTthQUFNO1lBQ0wsV0FBVyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNwQztLQUNGO0lBQ0QsTUFBTSxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUV0QyxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFyQkQsa0NBcUJDO0FBRUQsU0FBUyxXQUFXLENBQUMsT0FBZ0I7SUFDbkMsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRWxDLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDckIsSUFBQSxlQUFLLEVBQUMsa0VBQWtFLENBQUMsQ0FBQztRQUMxRSxJQUFBLGVBQUssRUFBQyxFQUFFLENBQUMsQ0FBQztRQUNWLElBQUEsZUFBSyxFQUFDLGtFQUFrRSxDQUFDLENBQUM7UUFDMUUsSUFBQSxlQUFLLEVBQUMscUVBQXFFLENBQUMsQ0FBQztRQUM3RSxJQUFBLGVBQUssRUFBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBRXBDLE9BQU87S0FDUjtJQUVELDBCQUEwQjtJQUMxQixNQUFNLElBQUksR0FBVSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25GLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUU7UUFDM0IsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDaEcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO0tBQzFDO0lBQ0QsSUFBQSxlQUFLLEVBQUMsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyx5QkFBYyxDQUFDLENBQUMsQ0FBQztJQUMxRCxJQUFBLGVBQUssRUFBQyxFQUFFLENBQUMsQ0FBQztJQUNWLElBQUEsZUFBSyxFQUFDLElBQUEsa0JBQVcsRUFBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRWpELG1DQUFtQztJQUNuQyxJQUFBLGVBQUssRUFBQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsbUNBQW1DLENBQUMsK0VBQStFLENBQUMsQ0FBQztBQUMvSSxDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxPQUFnQixFQUFFLEdBQVcsRUFBRSxLQUFjO0lBQ3RFLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDNUIsSUFBSSxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsRUFBRTtRQUNsQix1Q0FBdUM7UUFDdkMsR0FBRyxHQUFHLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDL0I7SUFDRCxTQUFTO0lBQ1QsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ3BCLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkIseUNBQXlDO1FBQ3pDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3JCLElBQUEsZUFBSyxFQUFDLGdFQUFnRSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN6RixPQUFPO1NBQ1I7UUFFRCxnQ0FBZ0M7UUFDaEMsSUFBQSxlQUFLLEVBQUMsa0VBQWtFLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQywwQkFBZSxDQUFDLENBQUMsQ0FBQztRQUN2RyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsR0FBRyxFQUFFLENBQUMsQ0FBQztTQUN6RTtLQUNGO0lBRUQsNkNBQTZDO0lBQzdDLE1BQU0sT0FBTyxHQUFHLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUUvQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBRXRCLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN4QixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFbEUsMEJBQTBCO1FBQzFCLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVsQiw4QkFBOEI7UUFDOUIsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXhCLDRDQUE0QztRQUM1QyxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQztTQUN0RTtRQUNELE9BQU87S0FDUjtJQUNELElBQUksQ0FBQyxLQUFLLEVBQUU7UUFDVixNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0tBQzFEO0FBQ0gsQ0FBQztBQUNELFNBQVMsVUFBVSxDQUFDLEtBQWU7SUFDakMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPO0lBQy9CLElBQUEsZUFBSyxFQUFDLHNGQUFzRixDQUFDLENBQUM7SUFDOUYsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ3RCLElBQUEsZUFBSyxFQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN2QixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFDRCxTQUFTLGFBQWEsQ0FBQyxRQUFrQjtJQUN2QyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU87SUFDbEMsSUFBQSxpQkFBTyxFQUFDLHlFQUF5RSxDQUFDLENBQUM7SUFDbkYsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ3pCLElBQUEsZUFBSyxFQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN2QixDQUFDLENBQUMsQ0FBQztJQUNILElBQUEsZUFBSyxFQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ1YsSUFBQSxlQUFLLEVBQUMsb0RBQW9ELEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyx5QkFBYyxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyx3QkFBYSxDQUFDLENBQUMsQ0FBQztBQUNySCxDQUFDO0FBQ0QsU0FBUyxnQkFBZ0IsQ0FBQyxPQUFnQixFQUFFLFVBQWtCO0lBQzVELE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMscUJBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxPQUFnQixFQUFFLE9BQWlCO0lBQzlELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBMEMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDNUUsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3RCLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzFCO2FBQU07WUFDTCxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN2QjtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsT0FBZ0IsRUFBRSxDQUFTO0lBQzlDLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDM0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ1gsT0FBTyxHQUFHLENBQUM7U0FDWjtLQUNGO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLFdBQVcsQ0FBQyxPQUFnQjtJQUNuQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQzFCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNaLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFCLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBSSxFQUFPO0lBQzVCLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxFQUFlLENBQUM7SUFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDbEIsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDUjtJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IG1pbmltYXRjaCB9IGZyb20gJ21pbmltYXRjaCc7XG5pbXBvcnQgKiBhcyB2ZXJzaW9uIGZyb20gJy4uLy4uL2xpYi92ZXJzaW9uJztcbmltcG9ydCB7IENvbW1hbmRPcHRpb25zIH0gZnJvbSAnLi4vY29tbWFuZC1hcGknO1xuaW1wb3J0IHsgcHJpbnQsIGVycm9yLCB3YXJuaW5nIH0gZnJvbSAnLi4vbG9nZ2luZyc7XG5pbXBvcnQgeyBDb250ZXh0LCBQUk9KRUNUX0NPTkZJRywgUFJPSkVDVF9DT05URVhULCBVU0VSX0RFRkFVTFRTIH0gZnJvbSAnLi4vc2V0dGluZ3MnO1xuaW1wb3J0IHsgcmVuZGVyVGFibGUgfSBmcm9tICcuLi91dGlsJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWxIYW5kbGVyKG9wdGlvbnM6IENvbW1hbmRPcHRpb25zKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgeyBjb25maWd1cmF0aW9uLCBhcmdzIH0gPSBvcHRpb25zO1xuICBpZiAoYXJncy5jbGVhcikge1xuICAgIGNvbmZpZ3VyYXRpb24uY29udGV4dC5jbGVhcigpO1xuICAgIGF3YWl0IGNvbmZpZ3VyYXRpb24uc2F2ZUNvbnRleHQoKTtcbiAgICBwcmludCgnQWxsIGNvbnRleHQgdmFsdWVzIGNsZWFyZWQuJyk7XG4gIH0gZWxzZSBpZiAoYXJncy5yZXNldCkge1xuICAgIGludmFsaWRhdGVDb250ZXh0KGNvbmZpZ3VyYXRpb24uY29udGV4dCwgYXJncy5yZXNldCBhcyBzdHJpbmcsIGFyZ3MuZm9yY2UgYXMgYm9vbGVhbik7XG4gICAgYXdhaXQgY29uZmlndXJhdGlvbi5zYXZlQ29udGV4dCgpO1xuICB9IGVsc2Uge1xuICAgIC8vIExpc3QgLS0gc3VwcG9ydCAnLS1qc29uJyBmbGFnXG4gICAgaWYgKGFyZ3MuanNvbikge1xuICAgICAgY29uc3QgY29udGV4dFZhbHVlcyA9IGNvbmZpZ3VyYXRpb24uY29udGV4dC5hbGw7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShKU09OLnN0cmluZ2lmeShjb250ZXh0VmFsdWVzLCB1bmRlZmluZWQsIDIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGlzdENvbnRleHQoY29uZmlndXJhdGlvbi5jb250ZXh0KTtcbiAgICB9XG4gIH1cbiAgYXdhaXQgdmVyc2lvbi5kaXNwbGF5VmVyc2lvbk1lc3NhZ2UoKTtcblxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gbGlzdENvbnRleHQoY29udGV4dDogQ29udGV4dCkge1xuICBjb25zdCBrZXlzID0gY29udGV4dEtleXMoY29udGV4dCk7XG5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgcHJpbnQoJ1RoaXMgQ0RLIGFwcGxpY2F0aW9uIGRvZXMgbm90IGhhdmUgYW55IHNhdmVkIGNvbnRleHQgdmFsdWVzIHlldC4nKTtcbiAgICBwcmludCgnJyk7XG4gICAgcHJpbnQoJ0NvbnRleHQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHNhdmVkIHdoZW4geW91IHN5bnRoZXNpemUgQ0RLIGFwcHMnKTtcbiAgICBwcmludCgndGhhdCB1c2UgZW52aXJvbm1lbnQgY29udGV4dCBpbmZvcm1hdGlvbiBsaWtlIEFaIGluZm9ybWF0aW9uLCBWUENzLCcpO1xuICAgIHByaW50KCdTU00gcGFyYW1ldGVycywgYW5kIHNvIG9uLicpO1xuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gUHJpbnQgY29uZmlnIGJ5IGRlZmF1bHRcbiAgY29uc3QgZGF0YTogYW55W10gPSBbW2NoYWxrLmdyZWVuKCcjJyksIGNoYWxrLmdyZWVuKCdLZXknKSwgY2hhbGsuZ3JlZW4oJ1ZhbHVlJyldXTtcbiAgZm9yIChjb25zdCBbaSwga2V5XSBvZiBrZXlzKSB7XG4gICAgY29uc3QganNvbldpdGhvdXROZXdsaW5lcyA9IEpTT04uc3RyaW5naWZ5KGNvbnRleHQuYWxsW2tleV0sIHVuZGVmaW5lZCwgMikucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xuICAgIGRhdGEucHVzaChbaSwga2V5LCBqc29uV2l0aG91dE5ld2xpbmVzXSk7XG4gIH1cbiAgcHJpbnQoJ0NvbnRleHQgZm91bmQgaW4gJXM6JywgY2hhbGsuYmx1ZShQUk9KRUNUX0NPTkZJRykpO1xuICBwcmludCgnJyk7XG4gIHByaW50KHJlbmRlclRhYmxlKGRhdGEsIHByb2Nlc3Muc3Rkb3V0LmNvbHVtbnMpKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICBwcmludChgUnVuICR7Y2hhbGsuYmx1ZSgnY2RrIGNvbnRleHQgLS1yZXNldCBLRVlfT1JfTlVNQkVSJyl9IHRvIHJlbW92ZSBhIGNvbnRleHQga2V5LiBJdCB3aWxsIGJlIHJlZnJlc2hlZCBvbiB0aGUgbmV4dCBDREsgc3ludGhlc2lzIHJ1bi5gKTtcbn1cblxuZnVuY3Rpb24gaW52YWxpZGF0ZUNvbnRleHQoY29udGV4dDogQ29udGV4dCwga2V5OiBzdHJpbmcsIGZvcmNlOiBib29sZWFuKSB7XG4gIGNvbnN0IGkgPSBwYXJzZUludChrZXksIDEwKTtcbiAgaWYgKGAke2l9YCA9PT0ga2V5KSB7XG4gICAgLy8gd2FzIGEgbnVtYmVyIGFuZCB3ZSBmdWxseSBwYXJzZWQgaXQuXG4gICAga2V5ID0ga2V5QnlOdW1iZXIoY29udGV4dCwgaSk7XG4gIH1cbiAgLy8gVW5zZXQhXG4gIGlmIChjb250ZXh0LmhhcyhrZXkpKSB7XG4gICAgY29udGV4dC51bnNldChrZXkpO1xuICAgIC8vIGNoZWNrIGlmIHRoZSB2YWx1ZSB3YXMgYWN0dWFsbHkgdW5zZXQuXG4gICAgaWYgKCFjb250ZXh0LmhhcyhrZXkpKSB7XG4gICAgICBwcmludCgnQ29udGV4dCB2YWx1ZSAlcyByZXNldC4gSXQgd2lsbCBiZSByZWZyZXNoZWQgb24gbmV4dCBzeW50aGVzaXMnLCBjaGFsay5ibHVlKGtleSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFZhbHVlIG11c3QgYmUgaW4gcmVhZG9ubHkgYmFnXG4gICAgZXJyb3IoJ09ubHkgY29udGV4dCB2YWx1ZXMgc3BlY2lmaWVkIGluICVzIGNhbiBiZSByZXNldCB0aHJvdWdoIHRoZSBDTEknLCBjaGFsay5ibHVlKFBST0pFQ1RfQ09OVEVYVCkpO1xuICAgIGlmICghZm9yY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlc2V0IHJlYWRvbmx5IGNvbnRleHQgdmFsdWUgd2l0aCBrZXk6ICR7a2V5fWApO1xuICAgIH1cbiAgfVxuXG4gIC8vIGNoZWNrIGlmIHZhbHVlIGlzIGV4cHJlc3Npb24gbWF0Y2hpbmcga2V5c1xuICBjb25zdCBtYXRjaGVzID0ga2V5c0J5RXhwcmVzc2lvbihjb250ZXh0LCBrZXkpO1xuXG4gIGlmIChtYXRjaGVzLmxlbmd0aCA+IDApIHtcblxuICAgIG1hdGNoZXMuZm9yRWFjaCgobWF0Y2gpID0+IHtcbiAgICAgIGNvbnRleHQudW5zZXQobWF0Y2gpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgeyB1bnNldCwgcmVhZG9ubHkgfSA9IGdldFVuc2V0QW5kUmVhZG9ubHkoY29udGV4dCwgbWF0Y2hlcyk7XG5cbiAgICAvLyBvdXRwdXQgdGhlIHJlc2V0IHZhbHVlc1xuICAgIHByaW50VW5zZXQodW5zZXQpO1xuXG4gICAgLy8gd2FybiBhYm91dCB2YWx1ZXMgbm90IHJlc2V0XG4gICAgcHJpbnRSZWFkb25seShyZWFkb25seSk7XG5cbiAgICAvLyB0aHJvdyB3aGVuIG5vbmUgb2YgdGhlIG1hdGNoZXMgd2VyZSByZXNldFxuICAgIGlmICghZm9yY2UgJiYgdW5zZXQubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vbmUgb2YgdGhlIG1hdGNoZWQgY29udGV4dCB2YWx1ZXMgY291bGQgYmUgcmVzZXQnKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghZm9yY2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvbnRleHQgdmFsdWUgbWF0Y2hpbmcga2V5OiAke2tleX1gKTtcbiAgfVxufVxuZnVuY3Rpb24gcHJpbnRVbnNldCh1bnNldDogc3RyaW5nW10pIHtcbiAgaWYgKHVuc2V0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICBwcmludCgnVGhlIGZvbGxvd2luZyBtYXRjaGVkIGNvbnRleHQgdmFsdWVzIHJlc2V0LiBUaGV5IHdpbGwgYmUgcmVmcmVzaGVkIG9uIG5leHQgc3ludGhlc2lzJyk7XG4gIHVuc2V0LmZvckVhY2goKG1hdGNoKSA9PiB7XG4gICAgcHJpbnQoJyAgJXMnLCBtYXRjaCk7XG4gIH0pO1xufVxuZnVuY3Rpb24gcHJpbnRSZWFkb25seShyZWFkb25seTogc3RyaW5nW10pIHtcbiAgaWYgKHJlYWRvbmx5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICB3YXJuaW5nKCdUaGUgZm9sbG93aW5nIG1hdGNoZWQgY29udGV4dCB2YWx1ZXMgY291bGQgbm90IGJlIHJlc2V0IHRocm91Z2ggdGhlIENMSScpO1xuICByZWFkb25seS5mb3JFYWNoKChtYXRjaCkgPT4ge1xuICAgIHByaW50KCcgICVzJywgbWF0Y2gpO1xuICB9KTtcbiAgcHJpbnQoJycpO1xuICBwcmludCgnVGhpcyB1c3VhbGx5IG1lYW5zIHRoZXkgYXJlIGNvbmZpZ3VyZWQgaW4gJXMgb3IgJXMnLCBjaGFsay5ibHVlKFBST0pFQ1RfQ09ORklHKSwgY2hhbGsuYmx1ZShVU0VSX0RFRkFVTFRTKSk7XG59XG5mdW5jdGlvbiBrZXlzQnlFeHByZXNzaW9uKGNvbnRleHQ6IENvbnRleHQsIGV4cHJlc3Npb246IHN0cmluZykge1xuICByZXR1cm4gY29udGV4dC5rZXlzLmZpbHRlcihtaW5pbWF0Y2guZmlsdGVyKGV4cHJlc3Npb24pKTtcbn1cblxuZnVuY3Rpb24gZ2V0VW5zZXRBbmRSZWFkb25seShjb250ZXh0OiBDb250ZXh0LCBtYXRjaGVzOiBzdHJpbmdbXSkge1xuICByZXR1cm4gbWF0Y2hlcy5yZWR1Y2U8eyB1bnNldDogc3RyaW5nW10sIHJlYWRvbmx5OiBzdHJpbmdbXSB9PigoYWNjLCBtYXRjaCkgPT4ge1xuICAgIGlmIChjb250ZXh0LmhhcyhtYXRjaCkpIHtcbiAgICAgIGFjYy5yZWFkb25seS5wdXNoKG1hdGNoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWNjLnVuc2V0LnB1c2gobWF0Y2gpO1xuICAgIH1cbiAgICByZXR1cm4gYWNjO1xuICB9LCB7IHVuc2V0OiBbXSwgcmVhZG9ubHk6IFtdIH0pO1xufVxuXG5mdW5jdGlvbiBrZXlCeU51bWJlcihjb250ZXh0OiBDb250ZXh0LCBuOiBudW1iZXIpIHtcbiAgZm9yIChjb25zdCBbaSwga2V5XSBvZiBjb250ZXh0S2V5cyhjb250ZXh0KSkge1xuICAgIGlmIChuID09PSBpKSB7XG4gICAgICByZXR1cm4ga2V5O1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvbnRleHQga2V5IHdpdGggbnVtYmVyOiAke259YCk7XG59XG5cbi8qKlxuICogUmV0dXJuIGVudW1lcmF0ZWQga2V5cyBpbiBhIGRlZmluaXRpdmUgb3JkZXJcbiAqL1xuZnVuY3Rpb24gY29udGV4dEtleXMoY29udGV4dDogQ29udGV4dCk6IFtudW1iZXIsIHN0cmluZ11bXSB7XG4gIGNvbnN0IGtleXMgPSBjb250ZXh0LmtleXM7XG4gIGtleXMuc29ydCgpO1xuICByZXR1cm4gZW51bWVyYXRlMShrZXlzKTtcbn1cblxuZnVuY3Rpb24gZW51bWVyYXRlMTxUPih4czogVFtdKTogQXJyYXk8W251bWJlciwgVF0+IHtcbiAgY29uc3QgcmV0ID0gbmV3IEFycmF5PFtudW1iZXIsIFRdPigpO1xuICBsZXQgaSA9IDE7XG4gIGZvciAoY29uc3QgeCBvZiB4cykge1xuICAgIHJldC5wdXNoKFtpLCB4XSk7XG4gICAgaSArPSAxO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG4iXX0=