jsii-docgen
Version:
generates api docs for jsii modules
123 lines • 18.1 kB
JavaScript
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.main = main;
const fs = __importStar(require("fs/promises"));
const path = __importStar(require("node:path"));
const yargs = __importStar(require("yargs"));
const transpile_1 = require("./docgen/transpile/transpile");
const index_1 = require("./index");
async function generateForLanguage(docs, options) {
const { format, output } = options;
// e.g. API.typescript as name
const splitByLanguage = output.endsWith(`.${options.language.name}`);
const submoduleSuffix = splitByLanguage ? `${options.language.name}.${format}` : format;
// Ensure the output path exists
const outputPath = path.dirname(output);
await fs.mkdir(outputPath, { recursive: true });
if (options.splitBySubmodules) {
if (format !== 'md') {
throw new Error('split-by-submodule is only supported for markdown');
}
const submodules = await docs.listSubmodules();
for (const submodule of submodules) {
const content = await docs.toMarkdown({
...options,
submodule: submodule.fqn,
allSubmodules: false,
header: { title: `\`${(0, transpile_1.submoduleRelName)(submodule)}\` Submodule`, id: submodule.fqn },
});
await fs.writeFile(path.join(outputPath, `${(0, transpile_1.submoduleRelName)(submodule)}.${submoduleSuffix}`), content.render());
}
await fs.writeFile(`${output}.${format}`, await (await docs.toIndexMarkdown(submoduleSuffix, options)).render());
}
else {
const content = await (format === 'md' ? docs.toMarkdown(options) : docs.toJson(options));
await fs.writeFile(`${output}.${format}`, content.render());
}
}
async function main() {
const args = await yargs
.usage('Usage: $0')
.option('output', { alias: 'o', type: 'string', required: false, desc: 'Output filename, the file type is automatically added. Defaults to API.md if format is markdown (-f md) or API.json if format is JSON (-f json). If more than one language is passed, then the language will be included in the filename e.g. API.typescript.md' })
.option('format', { alias: 'f', default: 'md', choices: ['md', 'json'], desc: 'Output format, markdown or json' })
.option('language', { array: true, alias: 'l', default: ['typescript'], choices: transpile_1.Language.values().map(x => x.toString()), desc: 'Output language' })
.option('package', { alias: 'p', type: 'string', required: false, desc: 'The name@version of an NPM package to document', defaultDescription: 'The package in the current directory' })
.option('readme', { alias: 'r', type: 'boolean', required: false, desc: 'Include the user defined README.md in the documentation.' })
.option('submodule', { alias: 's', type: 'string', required: false, desc: 'Generate docs for a specific submodule (or "root")' })
.option('split-by-submodule', { type: 'boolean', required: false, desc: 'Generate a separate file for each submodule' })
.example('$0', 'Generate documentation for the current module as a single file (auto-resolves node dependencies)')
.argv;
const submodule = args.submodule === 'root' ? undefined : args.submodule;
const allSubmodules = !args.submodule;
const readme = args.readme;
const splitBySubmodules = args['split-by-submodule'];
const docs = await (args.package
? index_1.Documentation.forPackage(args.package)
: index_1.Documentation.forProject(process.cwd()));
const options = (lang, output = 'API', includeLanguageInOutputName = false) => {
const format = args.format === 'md' ? 'md' : 'json';
// Clean the user provided output of a possible file ending
let outputFileName = output.endsWith(`.${format}`)
? output.slice(0, -(format.length + 1))
: output;
// for multi language docs, include the language in the filename
if (includeLanguageInOutputName) {
outputFileName = `${outputFileName}.${lang}`;
}
return ({
readme,
language: transpile_1.Language.fromString(lang),
submodule,
allSubmodules,
splitBySubmodules,
format,
output: outputFileName,
});
};
if (args.language.length <= 1) {
await generateForLanguage(docs, options(args.language[0], args.output));
}
else {
for (const lang of args.language) {
await generateForLanguage(docs, options(lang, args.output, true));
}
}
}
main().catch(e => {
console.error(e);
process.exit(1);
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW1EQSxvQkFvREM7QUF2R0QsZ0RBQWtDO0FBQ2xDLGdEQUFrQztBQUNsQyw2Q0FBK0I7QUFDL0IsNERBQTBFO0FBQzFFLG1DQUF3QztBQVl4QyxLQUFLLFVBQVUsbUJBQW1CLENBQUMsSUFBbUIsRUFBRSxPQUF3QjtJQUM5RSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUNuQyw4QkFBOEI7SUFDOUIsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNyRSxNQUFNLGVBQWUsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUV4RixnQ0FBZ0M7SUFDaEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFFaEQsSUFBSSxPQUFPLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUM5QixJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7UUFDdkUsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQy9DLEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFLENBQUM7WUFDbkMsTUFBTSxPQUFPLEdBQUcs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QUNoQyxjQUFjLEdBQUcsR0FBRyxjQUFjLElBQUksSUFBSSxFQUFFLENBQUM7UUFDL0MsQ0FBQztRQUVELE9BQU8sQ0FBQztZQUNOLE1BQU07WUFDTixRQUFRLEVBQUUsb0JBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQ25DLFNBQVM7WUFDVCxhQUFhO1lBQ2IsaUJBQWlCO1lBQ2pCLE1BQU07WUFDTixNQUFNLEVBQUUsY0FBYztTQUN2QixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUM7SUFFRixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzlCLE1BQU0sbUJBQW1CLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzFFLENBQUM7U0FBTSxDQUFDO1FBQ04sS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDakMsTUFBTSxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDcEUsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0ICogYXMgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgTGFuZ3VhZ2UsIHN1Ym1vZHVsZVJlbE5hbWUgfSBmcm9tICcuL2RvY2dlbi90cmFuc3BpbGUvdHJhbnNwaWxlJztcbmltcG9ydCB7IERvY3VtZW50YXRpb24gfSBmcm9tICcuL2luZGV4JztcblxudHlwZSBHZW5lcmF0ZU9wdGlvbnMgPSB7XG4gIHJlYWRtZT86IGJvb2xlYW47XG4gIGxhbmd1YWdlOiBMYW5ndWFnZTtcbiAgc3VibW9kdWxlPzogc3RyaW5nO1xuICBhbGxTdWJtb2R1bGVzPzogYm9vbGVhbjtcbiAgc3BsaXRCeVN1Ym1vZHVsZXM/OiBib29sZWFuO1xuICBmb3JtYXQ6ICdtZCcgfCAnanNvbic7XG4gIG91dHB1dDogc3RyaW5nO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUZvckxhbmd1YWdlKGRvY3M6IERvY3VtZW50YXRpb24sIG9wdGlvbnM6IEdlbmVyYXRlT3B0aW9ucykge1xuICBjb25zdCB7IGZvcm1hdCwgb3V0cHV0IH0gPSBvcHRpb25zO1xuICAvLyBlLmcuIEFQSS50eXBlc2NyaXB0IGFzIG5hbWVcbiAgY29uc3Qgc3BsaXRCeUxhbmd1YWdlID0gb3V0cHV0LmVuZHNXaXRoKGAuJHtvcHRpb25zLmxhbmd1YWdlLm5hbWV9YCk7XG4gIGNvbnN0IHN1Ym1vZHVsZVN1ZmZpeCA9IHNwbGl0QnlMYW5ndWFnZSA/IGAke29wdGlvbnMubGFuZ3VhZ2UubmFtZX0uJHtmb3JtYXR9YCA6IGZvcm1hdDtcblxuICAvLyBFbnN1cmUgdGhlIG91dHB1dCBwYXRoIGV4aXN0c1xuICBjb25zdCBvdXRwdXRQYXRoID0gcGF0aC5kaXJuYW1lKG91dHB1dCk7XG4gIGF3YWl0IGZzLm1rZGlyKG91dHB1dFBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGlmIChvcHRpb25zLnNwbGl0QnlTdWJtb2R1bGVzKSB7XG4gICAgaWYgKGZvcm1hdCAhPT0gJ21kJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzcGxpdC1ieS1zdWJtb2R1bGUgaXMgb25seSBzdXBwb3J0ZWQgZm9yIG1hcmtkb3duJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3VibW9kdWxlcyA9IGF3YWl0IGRvY3MubGlzdFN1Ym1vZHVsZXMoKTtcbiAgICBmb3IgKGNvbnN0IHN1Ym1vZHVsZSBvZiBzdWJtb2R1bGVzKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZG9jcy50b01hcmtkb3duKHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgc3VibW9kdWxlOiBzdWJtb2R1bGUuZnFuLFxuICAgICAgICBhbGxTdWJtb2R1bGVzOiBmYWxzZSxcbiAgICAgICAgaGVhZGVyOiB7IHRpdGxlOiBgXFxgJHtzdWJtb2R1bGVSZWxOYW1lKHN1Ym1vZHVsZSl9XFxgIFN1Ym1vZHVsZWAsIGlkOiBzdWJtb2R1bGUuZnFuIH0sXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGguam9pbihvdXRwdXRQYXRoLCBgJHtzdWJtb2R1bGVSZWxOYW1lKHN1Ym1vZHVsZSl9LiR7c3VibW9kdWxlU3VmZml4fWApLCBjb250ZW50LnJlbmRlcigpKTtcbiAgICB9XG5cbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoYCR7b3V0cHV0fS4ke2Zvcm1hdH1gLCBhd2FpdCAoYXdhaXQgZG9jcy50b0luZGV4TWFya2Rvd24oc3VibW9kdWxlU3VmZml4LCBvcHRpb25zKSkucmVuZGVyKCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCAoZm9ybWF0ID09PSAnbWQnID8gZG9jcy50b01hcmtkb3duKG9wdGlvbnMpIDogZG9jcy50b0pzb24ob3B0aW9ucykpO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShgJHtvdXRwdXR9LiR7Zm9ybWF0fWAsIGNvbnRlbnQucmVuZGVyKCkpO1xuICB9XG59XG5cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1haW4oKSB7XG4gIGNvbnN0IGFyZ3MgPSBhd2FpdCB5YXJnc1xuICAgIC51c2FnZSgnVXNhZ2U6ICQwJylcbiAgICAub3B0aW9uKCdvdXRwdXQnLCB7IGFsaWFzOiAnbycsIHR5cGU6ICdzdHJpbmcnLCByZXF1aXJlZDogZmFsc2UsIGRlc2M6ICdPdXRwdXQgZmlsZW5hbWUsIHRoZSBmaWxlIHR5cGUgaXMgYXV0b21hdGljYWxseSBhZGRlZC4gRGVmYXVsdHMgdG8gQVBJLm1kIGlmIGZvcm1hdCBpcyBtYXJrZG93biAoLWYgbWQpIG9yIEFQSS5qc29uIGlmIGZvcm1hdCBpcyBKU09OICgtZiBqc29uKS4gSWYgbW9yZSB0aGFuIG9uZSBsYW5ndWFnZSBpcyBwYXNzZWQsIHRoZW4gdGhlIGxhbmd1YWdlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGZpbGVuYW1lIGUuZy4gQVBJLnR5cGVzY3JpcHQubWQnIH0pXG4gICAgLm9wdGlvbignZm9ybWF0JywgeyBhbGlhczogJ2YnLCBkZWZhdWx0OiAnbWQnLCBjaG9pY2VzOiBbJ21kJywgJ2pzb24nXSwgZGVzYzogJ091dHB1dCBmb3JtYXQsIG1hcmtkb3duIG9yIGpzb24nIH0pXG4gICAgLm9wdGlvbignbGFuZ3VhZ2UnLCB7IGFycmF5OiB0cnVlLCBhbGlhczogJ2wnLCBkZWZhdWx0OiBbJ3R5cGVzY3JpcHQnXSwgY2hvaWNlczogTGFuZ3VhZ2UudmFsdWVzKCkubWFwKHggPT4geC50b1N0cmluZygpKSwgZGVzYzogJ091dHB1dCBsYW5ndWFnZScgfSlcbiAgICAub3B0aW9uKCdwYWNrYWdlJywgeyBhbGlhczogJ3AnLCB0eXBlOiAnc3RyaW5nJywgcmVxdWlyZWQ6IGZhbHNlLCBkZXNjOiAnVGhlIG5hbWVAdmVyc2lvbiBvZiBhbiBOUE0gcGFja2FnZSB0byBkb2N1bWVudCcsIGRlZmF1bHREZXNjcmlwdGlvbjogJ1RoZSBwYWNrYWdlIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeScgfSlcbiAgICAub3B0aW9uKCdyZWFkbWUnLCB7IGFsaWFzOiAncicsIHR5cGU6ICdib29sZWFuJywgcmVxdWlyZWQ6IGZhbHNlLCBkZXNjOiAnSW5jbHVkZSB0aGUgdXNlciBkZWZpbmVkIFJFQURNRS5tZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4nIH0pXG4gICAgLm9wdGlvbignc3VibW9kdWxlJywgeyBhbGlhczogJ3MnLCB0eXBlOiAnc3RyaW5nJywgcmVxdWlyZWQ6IGZhbHNlLCBkZXNjOiAnR2VuZXJhdGUgZG9jcyBmb3IgYSBzcGVjaWZpYyBzdWJtb2R1bGUgKG9yIFwicm9vdFwiKScgfSlcbiAgICAub3B0aW9uKCdzcGxpdC1ieS1zdWJtb2R1bGUnLCB7IHR5cGU6ICdib29sZWFuJywgcmVxdWlyZWQ6IGZhbHNlLCBkZXNjOiAnR2VuZXJhdGUgYSBzZXBhcmF0ZSBmaWxlIGZvciBlYWNoIHN1Ym1vZHVsZScgfSlcbiAgICAuZXhhbXBsZSgnJDAnLCAnR2VuZXJhdGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGN1cnJlbnQgbW9kdWxlIGFzIGEgc2luZ2xlIGZpbGUgKGF1dG8tcmVzb2x2ZXMgbm9kZSBkZXBlbmRlbmNpZXMpJylcbiAgICAuYXJndjtcblxuICBjb25zdCBzdWJtb2R1bGUgPSBhcmdzLnN1Ym1vZHVsZSA9PT0gJ3Jvb3QnID8gdW5kZWZpbmVkIDogYXJncy5zdWJtb2R1bGU7XG4gIGNvbnN0IGFsbFN1Ym1vZHVsZXMgPSAhYXJncy5zdWJtb2R1bGU7XG4gIGNvbnN0IHJlYWRtZSA9IGFyZ3MucmVhZG1lO1xuICBjb25zdCBzcGxpdEJ5U3VibW9kdWxlcyA9IGFyZ3NbJ3NwbGl0LWJ5LXN1Ym1vZHVsZSddO1xuICBjb25zdCBkb2NzID0gYXdhaXQgKGFyZ3MucGFja2FnZVxuICAgID8gRG9jdW1lbnRhdGlvbi5mb3JQYWNrYWdlKGFyZ3MucGFja2FnZSlcbiAgICA6IERvY3VtZW50YXRpb24uZm9yUHJvamVjdChwcm9jZXNzLmN3ZCgpKSk7XG5cbiAgY29uc3Qgb3B0aW9ucyA9IChsYW5nOiBzdHJpbmcsIG91dHB1dDogc3RyaW5nID0gJ0FQSScsIGluY2x1ZGVMYW5ndWFnZUluT3V0cHV0TmFtZSA9IGZhbHNlKTogR2VuZXJhdGVPcHRpb25zID0+IHtcbiAgICBjb25zdCBmb3JtYXQgPSBhcmdzLmZvcm1hdCA9PT0gJ21kJyA/ICdtZCcgOiAnanNvbic7XG5cbiAgICAvLyBDbGVhbiB0aGUgdXNlciBwcm92aWRlZCBvdXRwdXQgb2YgYSBwb3NzaWJsZSBmaWxlIGVuZGluZ1xuICAgIGxldCBvdXRwdXRGaWxlTmFtZSA9IG91dHB1dC5lbmRzV2l0aChgLiR7Zm9ybWF0fWApXG4gICAgICA/IG91dHB1dC5zbGljZSgwLCAtKGZvcm1hdC5sZW5ndGggKyAxKSlcbiAgICAgIDogb3V0cHV0O1xuXG4gICAgLy8gZm9yIG11bHRpIGxhbmd1YWdlIGRvY3MsIGluY2x1ZGUgdGhlIGxhbmd1YWdlIGluIHRoZSBmaWxlbmFtZVxuICAgIGlmIChpbmNsdWRlTGFuZ3VhZ2VJbk91dHB1dE5hbWUpIHtcbiAgICAgIG91dHB1dEZpbGVOYW1lID0gYCR7b3V0cHV0RmlsZU5hbWV9LiR7bGFuZ31gO1xuICAgIH1cblxuICAgIHJldHVybiAoe1xuICAgICAgcmVhZG1lLFxuICAgICAgbGFuZ3VhZ2U6IExhbmd1YWdlLmZyb21TdHJpbmcobGFuZyksXG4gICAgICBzdWJtb2R1bGUsXG4gICAgICBhbGxTdWJtb2R1bGVzLFxuICAgICAgc3BsaXRCeVN1Ym1vZHVsZXMsXG4gICAgICBmb3JtYXQsXG4gICAgICBvdXRwdXQ6IG91dHB1dEZpbGVOYW1lLFxuICAgIH0pO1xuICB9O1xuXG4gIGlmIChhcmdzLmxhbmd1YWdlLmxlbmd0aCA8PSAxKSB7XG4gICAgYXdhaXQgZ2VuZXJhdGVGb3JMYW5ndWFnZShkb2NzLCBvcHRpb25zKGFyZ3MubGFuZ3VhZ2VbMF0sIGFyZ3Mub3V0cHV0KSk7XG4gIH0gZWxzZSB7XG4gICAgZm9yIChjb25zdCBsYW5nIG9mIGFyZ3MubGFuZ3VhZ2UpIHtcbiAgICAgIGF3YWl0IGdlbmVyYXRlRm9yTGFuZ3VhZ2UoZG9jcywgb3B0aW9ucyhsYW5nLCBhcmdzLm91dHB1dCwgdHJ1ZSkpO1xuICAgIH1cbiAgfVxufVxuXG5tYWluKCkuY2F0Y2goZSA9PiB7XG4gIGNvbnNvbGUuZXJyb3IoZSk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn0pO1xuXG4iXX0=
;