UNPKG

jsii-docgen

Version:

generates api docs for jsii modules

161 lines 17.7 kB
"use strict"; 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.bestAssemblyMatch = bestAssemblyMatch; exports.discoverAssemblies = discoverAssemblies; const fs = __importStar(require("fs")); const path = __importStar(require("path")); const zlib = __importStar(require("zlib")); const spec_1 = require("@jsii/spec"); const fg = __importStar(require("fast-glob")); const semver = __importStar(require("semver")); ; /** * Given an AssemblyLookup map and an assembly name + version constraint, * returns the best possible match. * * This is not a strict semver implementation, instead the following algorithm is used: * 1. the highest (latest) version matching the semver constraint * 2. a matching major version, even if constraint doesn't match (this will use the lowest major version of the constraint) * 3. the highest available version of the dependency regardless of constraint * * @param assemblies a map of assembly identifier to name, version and path * @param constraint the assembly name and version to match * * @returns the best matching assembly info or undefined if no match was found */ function bestAssemblyMatch(assemblies, constraint) { const lastAtIndex = constraint.lastIndexOf('@'); const name = lastAtIndex === -1 ? constraint : constraint.substring(0, lastAtIndex); const versionConstraint = lastAtIndex === -1 ? undefined : constraint.substring(lastAtIndex + 1); const candidates = Object.values(assemblies).filter(a => a.name === name); if (candidates.length === 0) { return undefined; } candidates.sort((a, b) => semver.rcompare(a.version, b.version) || 0); if (!versionConstraint) { return candidates[0]; } // 1. Try semver constraint match const semverMatch = candidates.find(a => { try { return semver.satisfies(a.version, versionConstraint); } catch { return false; } }); if (semverMatch) { return semverMatch; } // 2. Try major version match const targetVersion = semver.valid(versionConstraint) || semver.minVersion(versionConstraint); if (targetVersion) { const constraintMajor = semver.major(targetVersion); const majorMatch = candidates.find(a => { try { return semver.major(a.version) === constraintMajor; } catch { return false; } }); if (majorMatch) { return majorMatch; } } // 3. Return highest version regardless of constraint return candidates[0]; } /** * Search a directory for jsii assemblies and return a map of assembly identifier to name, version and path. */ function discoverAssemblies(searchDir) { // searchDir might include backslashes on Windows. // The glob pattern must only used forward slashes, so we pass the assembliesDir as CWD which does not have this restriction const discovered = fg.sync(`**/${spec_1.SPEC_FILE_NAME}`, { cwd: path.normalize(searchDir), absolute: true, }); const assemblies = {}; for (let dotJsii of discovered) { const info = getAssemblyInfoFromFile(dotJsii); assemblies[`${info.name}@${info.version}`] = { ...info }; } return assemblies; } /** * Opens the assembly file to get the assemblies name and, * if present, follows instructions found in the file to unzip compressed assemblies. * * @param pathToFile the path to the SPEC_FILE_NAME file * @returns the assembly name */ function getAssemblyInfoFromFile(pathToFile) { const data = fs.readFileSync(pathToFile); try { const readFile = (filename) => fs.readFileSync(path.resolve(pathToFile, '..', filename)); let contents = JSON.parse(data.toString('utf-8')); // check if the file holds instructions to the actual assembly file while ((0, spec_1.isAssemblyRedirect)(contents)) { contents = followRedirect(contents, readFile); } return { name: contents.name, version: contents.version, path: pathToFile, }; } catch (e) { throw new Error(`Error loading assembly from file ${pathToFile}:\n${e}`); } } function followRedirect(assemblyRedirect, readFile) { // Validating the schema, this is cheap (the schema is small). (0, spec_1.validateAssemblyRedirect)(assemblyRedirect); let data = readFile(assemblyRedirect.filename); switch (assemblyRedirect.compression) { case 'gzip': data = zlib.gunzipSync(data); break; case undefined: break; default: throw new Error(`Unsupported compression algorithm: ${JSON.stringify(assemblyRedirect.compression)}`); } const json = data.toString('utf-8'); return JSON.parse(json); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZW1ibHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZG9jZ2VuL3ZpZXcvYXNzZW1ibHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE4QkEsOENBOENDO0FBS0QsZ0RBZUM7QUFoR0QsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3QiwyQ0FBNkI7QUFDN0IscUNBQTRHO0FBQzVHLDhDQUFnQztBQUVoQywrQ0FBaUM7QUFNaEMsQ0FBQztBQUlGOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxTQUFnQixpQkFBaUIsQ0FBQyxVQUEwQixFQUFFLFVBQWtCO0lBQzlFLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEQsTUFBTSxJQUFJLEdBQUcsV0FBVyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3BGLE1BQU0saUJBQWlCLEdBQUcsV0FBVyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2pHLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztJQUUxRSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDNUIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENB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USxDQUFDLEVBQUUsQ0FBQztZQUNwQyxRQUFRLEdBQUcsY0FBYyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBRUQsT0FBTztZQUNMLElBQUksRUFBRyxRQUFxQixDQUFDLElBQUk7WUFDakMsT0FBTyxFQUFHLFFBQXFCLENBQUMsT0FBTztZQUN2QyxJQUFJLEVBQUUsVUFBVTtTQUNqQixDQUFDO0lBQ0osQ0FBQztJQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7UUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsVUFBVSxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDM0UsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FDckIsZ0JBQWtDLEVBQ2xDLFFBQXNDO0lBRXRDLDhEQUE4RDtJQUM5RCxJQUFBLCtCQUF3QixFQUFDLGdCQUFnQixDQUFDLENBQUM7SUFFM0MsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQy9DLFFBQVEsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckMsS0FBSyxNQUFNO1lBQ1QsSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0IsTUFBTTtRQUNSLEtBQUssU0FBUztZQUNaLE1BQU07UUFDUjtZQUNFLE1BQU0sSUFBSSxLQUFLLENBQ2Isc0NBQXNDLElBQUksQ0FBQyxTQUFTLENBQ2xELGdCQUFnQixDQUFDLFdBQVcsQ0FDN0IsRUFBRSxDQUNKLENBQUM7SUFDTixDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDMUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyB6bGliIGZyb20gJ3psaWInO1xuaW1wb3J0IHsgQXNzZW1ibHlSZWRpcmVjdCwgaXNBc3NlbWJseVJlZGlyZWN0LCBTUEVDX0ZJTEVfTkFNRSwgdmFsaWRhdGVBc3NlbWJseVJlZGlyZWN0IH0gZnJvbSAnQGpzaWkvc3BlYyc7XG5pbXBvcnQgKiBhcyBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHsgQXNzZW1ibHkgfSBmcm9tICdqc2lpLXJlZmxlY3QnO1xuaW1wb3J0ICogYXMgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZW1ibHlJbmZvIHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEFzc2VtYmx5TG9va3VwID0gUmVjb3JkPHN0cmluZywgQXNzZW1ibHlJbmZvPjtcblxuLyoqXG4gKiBHaXZlbiBhbiBBc3NlbWJseUxvb2t1cCBtYXAgYW5kIGFuIGFzc2VtYmx5IG5hbWUgKyB2ZXJzaW9uIGNvbnN0cmFpbnQsXG4gKiByZXR1cm5zIHRoZSBiZXN0IHBvc3NpYmxlIG1hdGNoLlxuICpcbiAqIFRoaXMgaXMgbm90IGEgc3RyaWN0IHNlbXZlciBpbXBsZW1lbnRhdGlvbiwgaW5zdGVhZCB0aGUgZm9sbG93aW5nIGFsZ29yaXRobSBpcyB1c2VkOlxuICogICAxLiB0aGUgaGlnaGVzdCAobGF0ZXN0KSB2ZXJzaW9uIG1hdGNoaW5nIHRoZSBzZW12ZXIgY29uc3RyYWludFxuICogICAyLiBhIG1hdGNoaW5nIG1ham9yIHZlcnNpb24sIGV2ZW4gaWYgY29uc3RyYWludCBkb2Vzbid0IG1hdGNoICh0aGlzIHdpbGwgdXNlIHRoZSBsb3dlc3QgbWFqb3IgdmVyc2lvbiBvZiB0aGUgY29uc3RyYWludClcbiAqICAgMy4gdGhlIGhpZ2hlc3QgYXZhaWxhYmxlIHZlcnNpb24gb2YgdGhlIGRlcGVuZGVuY3kgcmVnYXJkbGVzcyBvZiBjb25zdHJhaW50XG4gKlxuICogQHBhcmFtIGFzc2VtYmxpZXMgYSBtYXAgb2YgYXNzZW1ibHkgaWRlbnRpZmllciB0byBuYW1lLCB2ZXJzaW9uIGFuZCBwYXRoXG4gKiBAcGFyYW0gY29uc3RyYWludCB0aGUgYXNzZW1ibHkgbmFtZSBhbmQgdmVyc2lvbiB0byBtYXRjaFxuICpcbiAqIEByZXR1cm5zIHRoZSBiZXN0IG1hdGNoaW5nIGFzc2VtYmx5IGluZm8gb3IgdW5kZWZpbmVkIGlmIG5vIG1hdGNoIHdhcyBmb3VuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gYmVzdEFzc2VtYmx5TWF0Y2goYXNzZW1ibGllczogQXNzZW1ibHlMb29rdXAsIGNvbnN0cmFpbnQ6IHN0cmluZyk6IEFzc2VtYmx5SW5mbyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGxhc3RBdEluZGV4ID0gY29uc3RyYWludC5sYXN0SW5kZXhPZignQCcpO1xuICBjb25zdCBuYW1lID0gbGFzdEF0SW5kZXggPT09IC0xID8gY29uc3RyYWludCA6IGNvbnN0cmFpbnQuc3Vic3RyaW5nKDAsIGxhc3RBdEluZGV4KTtcbiAgY29uc3QgdmVyc2lvbkNvbnN0cmFpbnQgPSBsYXN0QXRJbmRleCA9PT0gLTEgPyB1bmRlZmluZWQgOiBjb25zdHJhaW50LnN1YnN0cmluZyhsYXN0QXRJbmRleCArIDEpO1xuICBjb25zdCBjYW5kaWRhdGVzID0gT2JqZWN0LnZhbHVlcyhhc3NlbWJsaWVzKS5maWx0ZXIoYSA9PiBhLm5hbWUgPT09IG5hbWUpO1xuXG4gIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjYW5kaWRhdGVzLnNvcnQoKGEsIGIpID0+IHNlbXZlci5yY29tcGFyZShhLnZlcnNpb24sIGIudmVyc2lvbikgfHwgMCk7XG5cbiAgaWYgKCF2ZXJzaW9uQ29uc3RyYWludCkge1xuICAgIHJldHVybiBjYW5kaWRhdGVzWzBdO1xuICB9XG5cbiAgLy8gMS4gVHJ5IHNlbXZlciBjb25zdHJhaW50IG1hdGNoXG4gIGNvbnN0IHNlbXZlck1hdGNoID0gY2FuZGlkYXRlcy5maW5kKGEgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gc2VtdmVyLnNhdGlzZmllcyhhLnZlcnNpb24sIHZlcnNpb25Db25zdHJhaW50KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0pO1xuICBpZiAoc2VtdmVyTWF0Y2gpIHtcbiAgICByZXR1cm4gc2VtdmVyTWF0Y2g7XG4gIH1cblxuICAvLyAyLiBUcnkgbWFqb3IgdmVyc2lvbiBtYXRjaFxuICBjb25zdCB0YXJnZXRWZXJzaW9uID0gc2VtdmVyLnZhbGlkKHZlcnNpb25Db25zdHJhaW50KSB8fCBzZW12ZXIubWluVmVyc2lvbih2ZXJzaW9uQ29uc3RyYWludCk7XG4gIGlmICh0YXJnZXRWZXJzaW9uKSB7XG4gICAgY29uc3QgY29uc3RyYWludE1ham9yID0gc2VtdmVyLm1ham9yKHRhcmdldFZlcnNpb24pO1xuICAgIGNvbnN0IG1ham9yTWF0Y2ggPSBjYW5kaWRhdGVzLmZpbmQoYSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gc2VtdmVyLm1ham9yKGEudmVyc2lvbikgPT09IGNvbnN0cmFpbnRNYWpvcjtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKG1ham9yTWF0Y2gpIHtcbiAgICAgIHJldHVybiBtYWpvck1hdGNoO1xuICAgIH1cbiAgfVxuXG4gIC8vIDMuIFJldHVybiBoaWdoZXN0IHZlcnNpb24gcmVnYXJkbGVzcyBvZiBjb25zdHJhaW50XG4gIHJldHVybiBjYW5kaWRhdGVzWzBdO1xufVxuXG4vKipcbiAqIFNlYXJjaCBhIGRpcmVjdG9yeSBmb3IganNpaSBhc3NlbWJsaWVzIGFuZCByZXR1cm4gYSBtYXAgb2YgYXNzZW1ibHkgaWRlbnRpZmllciB0byBuYW1lLCB2ZXJzaW9uIGFuZCBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzY292ZXJBc3NlbWJsaWVzKHNlYXJjaERpcjogc3RyaW5nKTogQXNzZW1ibHlMb29rdXAge1xuICAvLyBzZWFyY2hEaXIgbWlnaHQgaW5jbHVkZSBiYWNrc2xhc2hlcyBvbiBXaW5kb3dzLlxuICAvLyBUaGUgZ2xvYiBwYXR0ZXJuIG11c3Qgb25seSB1c2VkIGZvcndhcmQgc2xhc2hlcywgc28gd2UgcGFzcyB0aGUgYXNzZW1ibGllc0RpciBhcyBDV0Qgd2hpY2ggZG9lcyBub3QgaGF2ZSB0aGlzIHJlc3RyaWN0aW9uXG4gIGNvbnN0IGRpc2NvdmVyZWQgPSBmZy5zeW5jKGAqKi8ke1NQRUNfRklMRV9OQU1FfWAsIHtcbiAgICBjd2Q6IHBhdGgubm9ybWFsaXplKHNlYXJjaERpciksXG4gICAgYWJzb2x1dGU6IHRydWUsXG4gIH0pO1xuXG4gIGNvbnN0IGFzc2VtYmxpZXM6IEFzc2VtYmx5TG9va3VwID0ge307XG4gIGZvciAobGV0IGRvdEpzaWkgb2YgZGlzY292ZXJlZCkge1xuICAgIGNvbnN0IGluZm8gPSBnZXRBc3NlbWJseUluZm9Gcm9tRmlsZShkb3RKc2lpKTtcbiAgICBhc3NlbWJsaWVzW2Ake2luZm8ubmFtZX1AJHtpbmZvLnZlcnNpb259YF0gPSB7IC4uLmluZm8gfTtcbiAgfVxuXG4gIHJldHVybiBhc3NlbWJsaWVzO1xufVxuXG4vKipcbiAqIE9wZW5zIHRoZSBhc3NlbWJseSBmaWxlIHRvIGdldCB0aGUgYXNzZW1ibGllcyBuYW1lIGFuZCxcbiAqIGlmIHByZXNlbnQsIGZvbGxvd3MgaW5zdHJ1Y3Rpb25zIGZvdW5kIGluIHRoZSBmaWxlIHRvIHVuemlwIGNvbXByZXNzZWQgYXNzZW1ibGllcy5cbiAqXG4gKiBAcGFyYW0gcGF0aFRvRmlsZSB0aGUgcGF0aCB0byB0aGUgU1BFQ19GSUxFX05BTUUgZmlsZVxuICogQHJldHVybnMgdGhlIGFzc2VtYmx5IG5hbWVcbiAqL1xuZnVuY3Rpb24gZ2V0QXNzZW1ibHlJbmZvRnJvbUZpbGUocGF0aFRvRmlsZTogc3RyaW5nKTogQXNzZW1ibHlJbmZvIHtcbiAgY29uc3QgZGF0YSA9IGZzLnJlYWRGaWxlU3luYyhwYXRoVG9GaWxlKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZWFkRmlsZSA9IChmaWxlbmFtZTogc3RyaW5nKSA9PiBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKHBhdGhUb0ZpbGUsICcuLicsIGZpbGVuYW1lKSk7XG4gICAgbGV0IGNvbnRlbnRzID0gSlNPTi5wYXJzZShkYXRhLnRvU3RyaW5nKCd1dGYtOCcpKTtcblxuICAgIC8vIGNoZWNrIGlmIHRoZSBmaWxlIGhvbGRzIGluc3RydWN0aW9ucyB0byB0aGUgYWN0dWFsIGFzc2VtYmx5IGZpbGVcbiAgICB3aGlsZSAoaXNBc3NlbWJseVJlZGlyZWN0KGNvbnRlbnRzKSkge1xuICAgICAgY29udGVudHMgPSBmb2xsb3dSZWRpcmVjdChjb250ZW50cywgcmVhZEZpbGUpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiAoY29udGVudHMgYXMgQXNzZW1ibHkpLm5hbWUsXG4gICAgICB2ZXJzaW9uOiAoY29udGVudHMgYXMgQXNzZW1ibHkpLnZlcnNpb24sXG4gICAgICBwYXRoOiBwYXRoVG9GaWxlLFxuICAgIH07XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgbG9hZGluZyBhc3NlbWJseSBmcm9tIGZpbGUgJHtwYXRoVG9GaWxlfTpcXG4ke2V9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9sbG93UmVkaXJlY3QoXG4gIGFzc2VtYmx5UmVkaXJlY3Q6IEFzc2VtYmx5UmVkaXJlY3QsXG4gIHJlYWRGaWxlOiAoZmlsZW5hbWU6IHN0cmluZykgPT4gQnVmZmVyLFxuKSB7XG4gIC8vIFZhbGlkYXRpbmcgdGhlIHNjaGVtYSwgdGhpcyBpcyBjaGVhcCAodGhlIHNjaGVtYSBpcyBzbWFsbCkuXG4gIHZhbGlkYXRlQXNzZW1ibHlSZWRpcmVjdChhc3NlbWJseVJlZGlyZWN0KTtcblxuICBsZXQgZGF0YSA9IHJlYWRGaWxlKGFzc2VtYmx5UmVkaXJlY3QuZmlsZW5hbWUpO1xuICBzd2l0Y2ggKGFzc2VtYmx5UmVkaXJlY3QuY29tcHJlc3Npb24pIHtcbiAgICBjYXNlICdnemlwJzpcbiAgICAgIGRhdGEgPSB6bGliLmd1bnppcFN5bmMoZGF0YSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBVbnN1cHBvcnRlZCBjb21wcmVzc2lvbiBhbGdvcml0aG06ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgYXNzZW1ibHlSZWRpcmVjdC5jb21wcmVzc2lvbixcbiAgICAgICAgKX1gLFxuICAgICAgKTtcbiAgfVxuICBjb25zdCBqc29uID0gZGF0YS50b1N0cmluZygndXRmLTgnKTtcbiAgcmV0dXJuIEpTT04ucGFyc2UoanNvbik7XG59XG4iXX0=