UNPKG

@aws-cdk/cx-api

Version:

Cloud executable protocol

199 lines 28.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** * Generate FEATURE_FLAGS.md, a report of all current feature flags */ const fs_1 = require("fs"); const path = require("path"); const validate_flags_1 = require("./validate-flags"); const feats = require("../lib/features"); const flag_modeling_1 = require("../lib/private/flag-modeling"); async function main() { (0, validate_flags_1.validateFlags)(); await updateMarkdownFile(path.join(__dirname, '..', 'FEATURE_FLAGS.md'), { table: flagsTable(), details: flagsDetails(), json: recommendedJson(), removed: removedFlags(), diff: changedFlags(), migratejson: migrateJson(), }); // Write to the package root await updateRecommendedFlagsFile(path.join(__dirname, '..', '..', 'recommended-feature-flags.json')); } function flagsTable() { return renderTable([ ['Flag', 'Summary', 'Since', 'Type'], ...v2flags().map(([name, flag]) => [ renderLink(mdEsc(name), githubHeadingLink(flagDetailsHeading(name, flag))), flag.summary, flag.introducedIn.v2 ?? '', renderType(flag.type, 'short'), ]), ]); } function removedFlags() { const removedInV2 = flags(flag => flag.introducedIn.v2 === undefined && flag.introducedIn.v1 !== undefined); return renderTable([ ['Flag', 'Summary', 'Type', 'Since'], ...removedInV2.map(([name, flag]) => [ renderLink(mdEsc(name), githubHeadingLink(flagDetailsHeading(name, flag))), flag.summary, renderType(flag.type, 'short'), flag.introducedIn.v1 ?? '', ]), ]); } function changedFlags() { const changedInV2 = flags(flag => !!flag.unconfiguredBehavesLike?.v2 && !!flag.introducedIn.v2); return renderTable([ ['Flag', 'Summary', 'Type', 'Since', 'v1 default', 'v2 default'], ...changedInV2.map(([name, flag]) => [ renderLink(mdEsc(name), githubHeadingLink(flagDetailsHeading(name, flag))), flag.summary, renderType(flag.type, 'short'), flag.introducedIn.v1 ?? '', renderValue(false), renderValue(flag.unconfiguredBehavesLike?.v2), ]), ]); } function migrateJson() { const changedInV2 = flags(flag => !!flag.unconfiguredBehavesLike?.v2 && !!flag.introducedIn.v2 && !!flag.introducedIn.v1); const context = Object.fromEntries(changedInV2.map(([name, _]) => [name, false])); return [ '```json', JSON.stringify({ context }, undefined, 2), '```', ].join('\n'); } function flagsDetails() { const allFlags = flags(_ => true); return allFlags.flatMap(([name, flag]) => [ `### ${flagDetailsHeading(name, flag)}`, '', `*${flag.summary}*`, '', `Flag type: ${renderType(flag.type, 'long')}`, '', dedent(flag.detailsMd), '', renderTable([ ['Since', 'Unset behaves like', 'Recommended value'], // V1 flag.introducedIn.v1 ? [flag.introducedIn.v1, renderValue(false), renderValue(flag.recommendedValue)] : ['(not in v1)', '', ''], // V2 flag.introducedIn.v2 ? [flag.introducedIn.v2, renderValue(flag.unconfiguredBehavesLike?.v2 ?? false), renderValue(flag.recommendedValue)] : flag.unconfiguredBehavesLike?.v2 !== undefined ? ['(not configurable in v2)', renderValue(flag.unconfiguredBehavesLike?.v2), ''] : ['(not in v2)', '', ''], ]), ...oldBehavior(flag) ? [ `**Compatibility with old behavior:** ${oldBehavior(flag)}`, '', ] : [], '', ]).join('\n'); } function oldBehavior(flag) { switch (flag.type) { case flag_modeling_1.FlagType.ApiDefault: return flag.compatibilityWithOldBehaviorMd; case flag_modeling_1.FlagType.BugFix: return flag.compatibilityWithOldBehaviorMd; case flag_modeling_1.FlagType.VisibleContext: return undefined; case flag_modeling_1.FlagType.Temporary: return flag.compatibilityWithOldBehaviorMd; } } function recommendedJson() { return [ '```json', JSON.stringify({ context: feats.CURRENTLY_RECOMMENDED_FLAGS }, undefined, 2), '```', ].join('\n'); } function v2flags() { return flags(flag => flag.introducedIn.v2 !== undefined); } function flags(pred) { const entries = Object.entries(feats.FLAGS) .filter(([_, flag]) => pred(flag)); entries.sort((a, b) => firstCmp( // Sort by versions first (0, flag_modeling_1.compareVersions)(a[1].introducedIn.v2, b[1].introducedIn.v2), (0, flag_modeling_1.compareVersions)(a[1].introducedIn.v1, b[1].introducedIn.v1), // Then sort by name a[0].localeCompare(b[0]))); return entries; } function renderType(type, flavor) { switch (type) { case flag_modeling_1.FlagType.ApiDefault: return longShort('New default behavior', 'new default'); case flag_modeling_1.FlagType.BugFix: return longShort('Backwards incompatible bugfix', 'fix'); case flag_modeling_1.FlagType.VisibleContext: return longShort('Configuration option', 'config'); case flag_modeling_1.FlagType.Temporary: return longShort('Temporary flag', 'temporary'); } function longShort(long, short) { return flavor === 'long' ? long : short; } } function renderTable(rows) { return [ '', '| ' + rows[0].join(' | ') + ' |', '| ' + rows[0].map(_ => '-----').join(' | ') + ' |', ...rows.slice(1).map(row => '| ' + row.join(' | ') + ' |'), '', ].join('\n'); } /** * Return the heading that will be used to caption this flag's details */ function flagDetailsHeading(name, _) { return name; } /** * Return a link that is valid on GitHub to refer to a heading */ function githubHeadingLink(heading) { return `#${heading.toLowerCase().replace(/ /g, '-').replace(/[^a-z0-9_-]/g, '')}`; } /** * Remove shared leading whitespace from all non-empty lines */ function dedent(body) { const lines = body.split('\n').filter((x) => x.trim() !== ''); const leadingWs = lines.map(x => x.match(/^ */)?.[0].length ?? 0); const sharedWs = Math.min(...leadingWs); const re = new RegExp('^' + ' '.repeat(sharedWs), 'mg'); return body.replace(re, '').trim(); } function renderValue(x) { return `\`${JSON.stringify(x)}\``; } function renderLink(caption, link) { return `[${caption}](${link})`; } function mdEsc(x) { return x.replace(/_/g, '\\_'); } async function updateMarkdownFile(filename, sections) { let contents = await fs_1.promises.readFile(filename, { encoding: 'utf-8' }); for (const [section, value] of Object.entries(sections)) { const re = new RegExp(`<!-- BEGIN ${section} -->(.*)<!-- END ${section} -->`, 's'); contents = contents.replace(re, `<!-- BEGIN ${section} -->\n${value}\n<!-- END ${section} -->`); } await fs_1.promises.writeFile(filename, contents, { encoding: 'utf-8' }); } async function updateRecommendedFlagsFile(filename) { await fs_1.promises.writeFile(filename, JSON.stringify(feats.CURRENTLY_RECOMMENDED_FLAGS, undefined, 2), { encoding: 'utf-8' }); } function firstCmp(...xs) { return xs.find(x => x !== 0) ?? 0; } main().catch(e => { // eslint-disable-next-line no-console console.error(e); process.exitCode = 1; }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxhZy1yZXBvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJmbGFnLXJlcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBOztHQUVHO0FBQ0gsMkJBQW9DO0FBQ3BDLDZCQUE2QjtBQUM3QixxREFBaUQ7QUFDakQseUNBQXlDO0FBQ3pDLGdFQUFtRjtBQUVuRixLQUFLLFVBQVUsSUFBSTtJQUNqQixJQUFBLDhCQUFhLEdBQUUsQ0FBQztJQUVoQixNQUFNLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxFQUFFO1FBQ3ZFLEtBQUssRUFBRSxVQUFVLEVBQUU7UUFDbkIsT0FBTyxFQUFFLFlBQVksRUFBRTtRQUN2QixJQUFJLEVBQUUsZUFBZSxFQUFFO1FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUU7UUFDdkIsSUFBSSxFQUFFLFlBQVksRUFBRTtRQUNwQixXQUFXLEVBQUUsV0FBVyxFQUFFO0tBQzNCLENBQUMsQ0FBQztJQUVILDRCQUE0QjtJQUM1QixNQUFNLDBCQUEwQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsZ0NBQWdDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZHLENBQUM7QUFFRCxTQUFTLFVBQVU7SUFDakIsT0FBTyxXQUFXLENBQUM7UUFDakIsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUM7UUFDcEMsR0FBRyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQ2hDO1lBQ0UsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUMxRSxJQUFJLENBQUMsT0FBTztZQUNaLElBQUksQ0FBQyxZ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UkVfRkxBR1MubWQsIGEgcmVwb3J0IG9mIGFsbCBjdXJyZW50IGZlYXR1cmUgZmxhZ3NcbiAqL1xuaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgdmFsaWRhdGVGbGFncyB9IGZyb20gJy4vdmFsaWRhdGUtZmxhZ3MnO1xuaW1wb3J0ICogYXMgZmVhdHMgZnJvbSAnLi4vbGliL2ZlYXR1cmVzJztcbmltcG9ydCB7IEZsYWdJbmZvLCBGbGFnVHlwZSwgY29tcGFyZVZlcnNpb25zIH0gZnJvbSAnLi4vbGliL3ByaXZhdGUvZmxhZy1tb2RlbGluZyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKSB7XG4gIHZhbGlkYXRlRmxhZ3MoKTtcblxuICBhd2FpdCB1cGRhdGVNYXJrZG93bkZpbGUocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJ0ZFQVRVUkVfRkxBR1MubWQnKSwge1xuICAgIHRhYmxlOiBmbGFnc1RhYmxlKCksXG4gICAgZGV0YWlsczogZmxhZ3NEZXRhaWxzKCksXG4gICAganNvbjogcmVjb21tZW5kZWRKc29uKCksXG4gICAgcmVtb3ZlZDogcmVtb3ZlZEZsYWdzKCksXG4gICAgZGlmZjogY2hhbmdlZEZsYWdzKCksXG4gICAgbWlncmF0ZWpzb246IG1pZ3JhdGVKc29uKCksXG4gIH0pO1xuXG4gIC8vIFdyaXRlIHRvIHRoZSBwYWNrYWdlIHJvb3RcbiAgYXdhaXQgdXBkYXRlUmVjb21tZW5kZWRGbGFnc0ZpbGUocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJ3JlY29tbWVuZGVkLWZlYXR1cmUtZmxhZ3MuanNvbicpKTtcbn1cblxuZnVuY3Rpb24gZmxhZ3NUYWJsZSgpIHtcbiAgcmV0dXJuIHJlbmRlclRhYmxlKFtcbiAgICBbJ0ZsYWcnLCAnU3VtbWFyeScsICdTaW5jZScsICdUeXBlJ10sXG4gICAgLi4udjJmbGFncygpLm1hcCgoW25hbWUsIGZsYWddKSA9PlxuICAgICAgW1xuICAgICAgICByZW5kZXJMaW5rKG1kRXNjKG5hbWUpLCBnaXRodWJIZWFkaW5nTGluayhmbGFnRGV0YWlsc0hlYWRpbmcobmFtZSwgZmxhZykpKSxcbiAgICAgICAgZmxhZy5zdW1tYXJ5LFxuICAgICAgICBmbGFnLmludHJvZHVjZWRJbi52MiA/PyAnJyxcbiAgICAgICAgcmVuZGVyVHlwZShmbGFnLnR5cGUsICdzaG9ydCcpLFxuICAgICAgXSxcbiAgICApLFxuICBdKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlZEZsYWdzKCkge1xuICBjb25zdCByZW1vdmVkSW5WMiA9IGZsYWdzKGZsYWcgPT4gZmxhZy5pbnRyb2R1Y2VkSW4udjIgPT09IHVuZGVmaW5lZCAmJiBmbGFnLmludHJvZHVjZWRJbi52MSAhPT0gdW5kZWZpbmVkKTtcblxuICByZXR1cm4gcmVuZGVyVGFibGUoW1xuICAgIFsnRmxhZycsICdTdW1tYXJ5JywgJ1R5cGUnLCAnU2luY2UnXSxcbiAgICAuLi5yZW1vdmVkSW5WMi5tYXAoKFtuYW1lLCBmbGFnXSkgPT4gW1xuICAgICAgcmVuZGVyTGluayhtZEVzYyhuYW1lKSwgZ2l0aHViSGVhZGluZ0xpbmsoZmxhZ0RldGFpbHNIZWFkaW5nKG5hbWUsIGZsYWcpKSksXG4gICAgICBmbGFnLnN1bW1hcnksXG4gICAgICByZW5kZXJUeXBlKGZsYWcudHlwZSwgJ3Nob3J0JyksXG4gICAgICBmbGFnLmludHJvZHVjZWRJbi52MSA/PyAnJyxcbiAgICBdKSxcbiAgXSk7XG59XG5cbmZ1bmN0aW9uIGNoYW5nZWRGbGFncygpIHtcbiAgY29uc3QgY2hhbmdlZEluVjIgPSBmbGFncyhmbGFnID0+ICEhZmxhZy51bmNvbmZpZ3VyZWRCZWhhdmVzTGlrZT8udjIgJiYgISFmbGFnLmludHJvZHVjZWRJbi52Mik7XG5cbiAgcmV0dXJuIHJlbmRlclRhYmxlKFtcbiAgICBbJ0ZsYWcnLCAnU3VtbWFyeScsICdUeXBlJywgJ1NpbmNlJywgJ3YxIGRlZmF1bHQnLCAndjIgZGVmYXVsdCddLFxuICAgIC4uLmNoYW5nZWRJblYyLm1hcCgoW25hbWUsIGZsYWddKSA9PiBbXG4gICAgICByZW5kZXJMaW5rKG1kRXNjKG5hbWUpLCBnaXRodWJIZWFkaW5nTGluayhmbGFnRGV0YWlsc0hlYWRpbmcobmFtZSwgZmxhZykpKSxcbiAgICAgIGZsYWcuc3VtbWFyeSxcbiAgICAgIHJlbmRlclR5cGUoZmxhZy50eXBlLCAnc2hvcnQnKSxcbiAgICAgIGZsYWcuaW50cm9kdWNlZEluLnYxID8/ICcnLFxuICAgICAgcmVuZGVyVmFsdWUoZmFsc2UpLFxuICAgICAgcmVuZGVyVmFsdWUoZmxhZy51bmNvbmZpZ3VyZWRCZWhhdmVzTGlrZT8udjIpLFxuICAgIF0pLFxuICBdKTtcbn1cblxuZnVuY3Rpb24gbWlncmF0ZUpzb24oKSB7XG4gIGNvbnN0IGNoYW5nZWRJblYyID0gZmxhZ3MoZmxhZyA9PiAhIWZsYWcudW5jb25maWd1cmVkQmVoYXZlc0xpa2U/LnYyICYmICEhZmxhZy5pbnRyb2R1Y2VkSW4udjIgJiYgISFmbGFnLmludHJvZHVjZWRJbi52MSk7XG5cbiAgY29uc3QgY29udGV4dCA9IE9iamVjdC5mcm9tRW50cmllcyhjaGFuZ2VkSW5WMi5tYXAoKFtuYW1lLCBfXSkgPT4gW25hbWUsIGZhbHNlXSkpO1xuXG4gIHJldHVybiBbXG4gICAgJ2BgYGpzb24nLFxuICAgIEpTT04uc3RyaW5naWZ5KHsgY29udGV4dCB9LCB1bmRlZmluZWQsIDIpLFxuICAgICdgYGAnLFxuICBdLmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiBmbGFnc0RldGFpbHMoKSB7XG4gIGNvbnN0IGFsbEZsYWdzID0gZmxhZ3MoXyA9PiB0cnVlKTtcblxuICByZXR1cm4gYWxsRmxhZ3MuZmxhdE1hcCgoW25hbWUsIGZsYWddKSA9PiBbXG4gICAgYCMjIyAke2ZsYWdEZXRhaWxzSGVhZGluZyhuYW1lLCBmbGFnKX1gLFxuICAgICcnLFxuICAgIGAqJHtmbGFnLnN1bW1hcnl9KmAsXG4gICAgJycsXG4gICAgYEZsYWcgdHlwZTogJHtyZW5kZXJUeXBlKGZsYWcudHlwZSwgJ2xvbmcnKX1gLFxuICAgICcnLFxuICAgIGRlZGVudChmbGFnLmRldGFpbHNNZCksXG4gICAgJycsXG4gICAgcmVuZGVyVGFibGUoW1xuICAgICAgWydTaW5jZScsICdVbnNldCBiZWhhdmVzIGxpa2UnLCAnUmVjb21tZW5kZWQgdmFsdWUnXSxcblxuICAgICAgLy8gVjFcbiAgICAgIGZsYWcuaW50cm9kdWNlZEluLnYxXG4gICAgICAgID8gW2ZsYWcuaW50cm9kdWNlZEluLnYxLCByZW5kZXJWYWx1ZShmYWxzZSksIHJlbmRlclZhbHVlKGZsYWcucmVjb21tZW5kZWRWYWx1ZSldXG4gICAgICAgIDogWycobm90IGluIHYxKScsICcnLCAnJ10sXG5cbiAgICAgIC8vIFYyXG4gICAgICBmbGFnLmludHJvZHVjZWRJbi52MlxuICAgICAgICA/IFtmbGFnLmludHJvZHVjZWRJbi52MiwgcmVuZGVyVmFsdWUoZmxhZy51bmNvbmZpZ3VyZWRCZWhhdmVzTGlrZT8udjIgPz8gZmFsc2UpLCByZW5kZXJWYWx1ZShmbGFnLnJlY29tbWVuZGVkVmFsdWUpXVxuICAgICAgICA6IGZsYWcudW5jb25maWd1cmVkQmVoYXZlc0xpa2U/LnYyICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IFsnKG5vdCBjb25maWd1cmFibGUgaW4gdjIpJywgcmVuZGVyVmFsdWUoZmxhZy51bmNvbmZpZ3VyZWRCZWhhdmVzTGlrZT8udjIpLCAnJ11cbiAgICAgICAgICA6IFsnKG5vdCBpbiB2MiknLCAnJywgJyddLFxuICAgIF0pLFxuICAgIC4uLm9sZEJlaGF2aW9yKGZsYWcpID8gW1xuICAgICAgYCoqQ29tcGF0aWJpbGl0eSB3aXRoIG9sZCBiZWhhdmlvcjoqKiAke29sZEJlaGF2aW9yKGZsYWcpfWAsXG4gICAgICAnJyxcbiAgICBdIDogW10sXG4gICAgJycsXG4gIF0pLmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiBvbGRCZWhhdmlvcihmbGFnOiBGbGFnSW5mbyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHN3aXRjaCAoZmxhZy50eXBlKSB7XG4gICAgY2FzZSBGbGFnVHlwZS5BcGlEZWZhdWx0OiByZXR1cm4gZmxhZy5jb21wYXRpYmlsaXR5V2l0aE9sZEJlaGF2aW9yTWQ7XG4gICAgY2FzZSBGbGFnVHlwZS5CdWdGaXg6IHJldHVybiBmbGFnLmNvbXBhdGliaWxpdHlXaXRoT2xkQmVoYXZpb3JNZDtcbiAgICBjYXNlIEZsYWdUeXBlLlZpc2libGVDb250ZXh0OiByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNhc2UgRmxhZ1R5cGUuVGVtcG9yYXJ5OiByZXR1cm4gZmxhZy5jb21wYXRpYmlsaXR5V2l0aE9sZEJlaGF2aW9yTWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVjb21tZW5kZWRKc29uKCkge1xuICByZXR1cm4gW1xuICAgICdgYGBqc29uJyxcbiAgICBKU09OLnN0cmluZ2lmeSh7IGNvbnRleHQ6IGZlYXRzLkNVUlJFTlRMWV9SRUNPTU1FTkRFRF9GTEFHUyB9LCB1bmRlZmluZWQsIDIpLFxuICAgICdgYGAnLFxuICBdLmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiB2MmZsYWdzKCkge1xuICByZXR1cm4gZmxhZ3MoZmxhZyA9PiBmbGFnLmludHJvZHVjZWRJbi52MiAhPT0gdW5kZWZpbmVkKTtcbn1cblxuZnVuY3Rpb24gZmxhZ3MocHJlZDogKHg6IEZsYWdJbmZvKSA9PiBib29sZWFuKSB7XG4gIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhmZWF0cy5GTEFHUylcbiAgICAuZmlsdGVyKChbXywgZmxhZ10pID0+IHByZWQoZmxhZykpO1xuXG4gIGVudHJpZXMuc29ydCgoYSwgYikgPT4gZmlyc3RDbXAoXG4gICAgLy8gU29ydCBieSB2ZXJzaW9ucyBmaXJzdFxuICAgIGNvbXBhcmVWZXJzaW9ucyhhWzFdLmludHJvZHVjZWRJbi52MiwgYlsxXS5pbnRyb2R1Y2VkSW4udjIpLFxuICAgIGNvbXBhcmVWZXJzaW9ucyhhWzFdLmludHJvZHVjZWRJbi52MSwgYlsxXS5pbnRyb2R1Y2VkSW4udjEpLFxuICAgIC8vIFRoZW4gc29ydCBieSBuYW1lXG4gICAgYVswXS5sb2NhbGVDb21wYXJlKGJbMF0pKSk7XG5cbiAgcmV0dXJuIGVudHJpZXM7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclR5cGUodHlwZTogRmxhZ1R5cGUsIGZsYXZvcjogJ3Nob3J0JyB8ICdsb25nJyk6IHN0cmluZyB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgRmxhZ1R5cGUuQXBpRGVmYXVsdDogcmV0dXJuIGxvbmdTaG9ydCgnTmV3IGRlZmF1bHQgYmVoYXZpb3InLCAnbmV3IGRlZmF1bHQnKTtcbiAgICBjYXNlIEZsYWdUeXBlLkJ1Z0ZpeDogcmV0dXJuIGxvbmdTaG9ydCgnQmFja3dhcmRzIGluY29tcGF0aWJsZSBidWdmaXgnLCAnZml4Jyk7XG4gICAgY2FzZSBGbGFnVHlwZS5WaXNpYmxlQ29udGV4dDogcmV0dXJuIGxvbmdTaG9ydCgnQ29uZmlndXJhdGlvbiBvcHRpb24nLCAnY29uZmlnJyk7XG4gICAgY2FzZSBGbGFnVHlwZS5UZW1wb3Jhcnk6IHJldHVybiBsb25nU2hvcnQoJ1RlbXBvcmFyeSBmbGFnJywgJ3RlbXBvcmFyeScpO1xuICB9XG5cbiAgZnVuY3Rpb24gbG9uZ1Nob3J0KGxvbmc6IHN0cmluZywgc2hvcnQ6IHN0cmluZykge1xuICAgIHJldHVybiBmbGF2b3IgPT09ICdsb25nJyA/IGxvbmcgOiBzaG9ydDtcbiAgfVxufVxuXG5mdW5jdGlvbiByZW5kZXJUYWJsZShyb3dzOiBzdHJpbmdbXVtdKSB7XG4gIHJldHVybiBbXG4gICAgJycsXG4gICAgJ3wgJyArIHJvd3NbMF0uam9pbignIHwgJykgKyAnIHwnLFxuICAgICd8ICcgKyByb3dzWzBdLm1hcChfID0+ICctLS0tLScpLmpvaW4oJyB8ICcpICsgJyB8JyxcbiAgICAuLi5yb3dzLnNsaWNlKDEpLm1hcChyb3cgPT4gJ3wgJyArIHJvdy5qb2luKCcgfCAnKSArICcgfCcpLFxuICAgICcnLFxuICBdLmpvaW4oJ1xcbicpO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgaGVhZGluZyB0aGF0IHdpbGwgYmUgdXNlZCB0byBjYXB0aW9uIHRoaXMgZmxhZydzIGRldGFpbHNcbiAqL1xuZnVuY3Rpb24gZmxhZ0RldGFpbHNIZWFkaW5nKG5hbWU6IHN0cmluZywgXzogRmxhZ0luZm8pIHtcbiAgcmV0dXJuIG5hbWU7XG59XG5cbi8qKlxuICogUmV0dXJuIGEgbGluayB0aGF0IGlzIHZhbGlkIG9uIEdpdEh1YiB0byByZWZlciB0byBhIGhlYWRpbmdcbiAqL1xuZnVuY3Rpb24gZ2l0aHViSGVhZGluZ0xpbmsoaGVhZGluZzogc3RyaW5nKSB7XG4gIHJldHVybiBgIyR7aGVhZGluZy50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoLyAvZywgJy0nKS5yZXBsYWNlKC9bXmEtejAtOV8tXS9nLCAnJyl9YDtcbn1cblxuLyoqXG4gKiBSZW1vdmUgc2hhcmVkIGxlYWRpbmcgd2hpdGVzcGFjZSBmcm9tIGFsbCBub24tZW1wdHkgbGluZXNcbiAqL1xuZnVuY3Rpb24gZGVkZW50KGJvZHk6IHN0cmluZykge1xuICBjb25zdCBsaW5lcyA9IGJvZHkuc3BsaXQoJ1xcbicpLmZpbHRlcigoeCkgPT4geC50cmltKCkgIT09ICcnKTtcbiAgY29uc3QgbGVhZGluZ1dzID0gbGluZXMubWFwKHggPT4geC5tYXRjaCgvXiAqLyk/LlswXS5sZW5ndGggPz8gMCk7XG4gIGNvbnN0IHNoYXJlZFdzID0gTWF0aC5taW4oLi4ubGVhZGluZ1dzKTtcbiAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKCdeJyArICcgJy5yZXBlYXQoc2hhcmVkV3MpLCAnbWcnKTtcbiAgcmV0dXJuIGJvZHkucmVwbGFjZShyZSwgJycpLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyVmFsdWUoeDogYW55KSB7XG4gIHJldHVybiBgXFxgJHtKU09OLnN0cmluZ2lmeSh4KX1cXGBgO1xufVxuXG5mdW5jdGlvbiByZW5kZXJMaW5rKGNhcHRpb246IHN0cmluZywgbGluazogc3RyaW5nKSB7XG4gIHJldHVybiBgWyR7Y2FwdGlvbn1dKCR7bGlua30pYDtcbn1cblxuZnVuY3Rpb24gbWRFc2MoeDogc3RyaW5nKSB7XG4gIHJldHVybiB4LnJlcGxhY2UoL18vZywgJ1xcXFxfJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZU1hcmtkb3duRmlsZShmaWxlbmFtZTogc3RyaW5nLCBzZWN0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xuICBsZXQgY29udGVudHMgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlbmFtZSwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcblxuICBmb3IgKGNvbnN0IFtzZWN0aW9uLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2VjdGlvbnMpKSB7XG4gICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKGA8IS0tIEJFR0lOICR7c2VjdGlvbn0gLS0+KC4qKTwhLS0gRU5EICR7c2VjdGlvbn0gLS0+YCwgJ3MnKTtcbiAgICBjb250ZW50cyA9IGNvbnRlbnRzLnJlcGxhY2UocmUsIGA8IS0tIEJFR0lOICR7c2VjdGlvbn0gLS0+XFxuJHt2YWx1ZX1cXG48IS0tIEVORCAke3NlY3Rpb259IC0tPmApO1xuICB9XG5cbiAgYXdhaXQgZnMud3JpdGVGaWxlKGZpbGVuYW1lLCBjb250ZW50cywgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlUmVjb21tZW5kZWRGbGFnc0ZpbGUoZmlsZW5hbWU6IHN0cmluZykge1xuICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZW5hbWUsIEpTT04uc3RyaW5naWZ5KGZlYXRzLkNVUlJFTlRMWV9SRUNPTU1FTkRFRF9GTEFHUywgdW5kZWZpbmVkLCAyKSwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcbn1cblxuZnVuY3Rpb24gZmlyc3RDbXAoLi4ueHM6IG51bWJlcltdKSB7XG4gIHJldHVybiB4cy5maW5kKHggPT4geCAhPT0gMCkgPz8gMDtcbn1cblxubWFpbigpLmNhdGNoKGUgPT4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICBjb25zb2xlLmVycm9yKGUpO1xuICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbn0pO1xuIl19