jsii-docgen
Version:
generates api docs for jsii modules
161 lines • 17.7 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.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=