@nlabs/lex
Version:
230 lines (229 loc) • 25.2 kB
JavaScript
import findFileUp from "find-file-up";
import { existsSync, readFileSync } from "fs";
import { sync as globSync } from "glob";
import { resolve as pathResolve, dirname } from "path";
import { LexConfig } from "../LexConfig.js";
const getDirName = () => {
try {
return eval('new URL(".", import.meta.url).pathname');
} catch {
return process.cwd();
}
};
const getFilePath = (relativePath) => {
try {
return eval('require("url").fileURLToPath(new URL(relativePath, import.meta.url))');
} catch {
if (relativePath === "../../../package.json") {
return pathResolve(process.cwd(), "package.json");
}
return pathResolve(process.cwd(), relativePath);
}
};
const getLexPackageJsonPath = () => {
const LEX_PACKAGE_NAME = "@nlabs/lex";
const lexInNodeModules = pathResolve(process.cwd(), "node_modules/@nlabs/lex/package.json");
if (existsSync(lexInNodeModules)) {
return lexInNodeModules;
}
let startDir;
if (process.env.LEX_ROOT) {
startDir = process.env.LEX_ROOT;
} else {
try {
startDir = eval('new URL(".", import.meta.url).pathname');
} catch {
try {
startDir = eval('__filename ? require("path").dirname(__filename) : null');
if (!startDir) {
throw new Error("__filename not available");
}
} catch {
try {
if (process.argv[1] && !process.argv[1].includes("node")) {
startDir = dirname(process.argv[1]);
} else {
throw new Error("process.argv[1] not suitable");
}
} catch {
startDir = process.cwd();
}
}
}
}
let dir = startDir;
for (let i = 0; i < 8; i++) {
const pkgPath = pathResolve(dir, "package.json");
if (existsSync(pkgPath)) {
try {
const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
if (pkg.name === LEX_PACKAGE_NAME) {
return pkgPath;
}
} catch {
}
}
const parent = dirname(dir);
if (parent === dir) {
break;
}
dir = parent;
}
return pathResolve(process.cwd(), "package.json");
};
const relativeFilePath = (filename, dirPath = "./", backUp = 0) => {
const nestDepth = 10;
if (backUp) {
const filePath = findFileUp.sync(filename, dirPath, nestDepth);
const previousPath = Array(backUp).fill(null).map(() => "../").join("");
return pathResolve(filePath, previousPath);
}
return findFileUp.sync(filename, dirPath, nestDepth);
};
const relativeNodePath = (filename, dirPath = "./", backUp = 0) => {
const nestDepth = 10;
const modulePath = `node_modules/${filename}`;
if (dirPath !== "./") {
const lexModulePath = pathResolve(dirPath, modulePath);
if (existsSync(lexModulePath)) {
return lexModulePath;
}
}
const projectPath = pathResolve(process.cwd(), modulePath);
if (existsSync(projectPath)) {
return projectPath;
}
if (backUp) {
const filePath = findFileUp.sync(modulePath, dirPath, nestDepth);
const previousPath = Array(nestDepth).fill(null).map(() => "../").join("");
return pathResolve(filePath, previousPath);
}
return findFileUp.sync(modulePath, dirPath, nestDepth) || `/node_modules/${filename}`;
};
const getNodePath = (moduleName) => {
const dirName = getDirName();
const modulePath = `node_modules/${moduleName}`;
const projectPath = pathResolve(process.cwd(), modulePath);
if (existsSync(projectPath)) {
return projectPath;
}
const repoPath = findFileUp.sync(modulePath, dirName);
if (repoPath && existsSync(repoPath)) {
return repoPath;
}
const localPath = findFileUp.sync(modulePath, "./", 10) || `./${modulePath}`;
return localPath;
};
const resolveBinaryPath = (binaryName, packageName) => {
const lexDir = LexConfig.getLexDir();
const lexBinPath = pathResolve(lexDir, `node_modules/.bin/${binaryName}`);
if (existsSync(lexBinPath)) {
return lexBinPath;
}
if (packageName) {
const lexPackageBinPath = pathResolve(lexDir, `node_modules/${packageName}/bin/${binaryName}`);
if (existsSync(lexPackageBinPath)) {
return lexPackageBinPath;
}
const lexPackageBinJsPath = pathResolve(lexDir, `node_modules/${packageName}/bin/${binaryName}.js`);
if (existsSync(lexPackageBinJsPath)) {
return lexPackageBinJsPath;
}
const lexPackageBinCjsPath = pathResolve(lexDir, `node_modules/${packageName}/bin/${binaryName}.cjs`);
if (existsSync(lexPackageBinCjsPath)) {
return lexPackageBinCjsPath;
}
}
const checkBinUp = (startDir2) => {
let checkDir = startDir2;
for (let i = 0; i < 5; i++) {
const monorepoBinPath = pathResolve(checkDir, `node_modules/.bin/${binaryName}`);
if (existsSync(monorepoBinPath)) {
return monorepoBinPath;
}
const parentDir = pathResolve(checkDir, "..");
if (parentDir === checkDir) {
break;
}
checkDir = parentDir;
}
return "";
};
const fromCwd = checkBinUp(process.cwd());
if (fromCwd) {
return fromCwd;
}
const fromLex = checkBinUp(lexDir);
if (fromLex) {
return fromLex;
}
return "";
};
const findTailwindCssPath = () => {
const tailwindPatterns = ["**/tailwind.css"];
for (const pattern of tailwindPatterns) {
const files = globSync(pattern, {
cwd: process.cwd(),
ignore: ["**/node_modules/**", "**/dist/**", "**/lib/**", "**/build/**", "**/.storybook/**"]
});
if (files.length > 0) {
return pathResolve(process.cwd(), files[0]);
}
}
return "";
};
const resolveWebpackPaths = (currentDirname) => {
const possibleWebpackPaths = [
pathResolve(process.cwd(), "node_modules/webpack-cli/bin/cli.js"),
pathResolve(process.cwd(), "node_modules/.bin/webpack"),
pathResolve(process.cwd(), "node_modules/@nlabs/lex", "node_modules/webpack-cli/bin/cli.js"),
pathResolve(process.cwd(), "node_modules/@nlabs/lex", "node_modules/.bin/webpack"),
pathResolve(currentDirname, "node_modules/@nlabs/lex/node_modules/webpack-cli/bin/cli.js"),
pathResolve(currentDirname, "node_modules/@nlabs/lex/node_modules/.bin/webpack"),
pathResolve(process.env.LEX_HOME || "/node_modules/@nlabs/lex", "node_modules/webpack-cli/bin/cli.js"),
pathResolve(process.env.LEX_HOME || "/node_modules/@nlabs/lex", "node_modules/.bin/webpack")
];
let webpackPath = "";
for (const path of possibleWebpackPaths) {
if (existsSync(path)) {
webpackPath = path;
break;
}
}
if (!webpackPath) {
webpackPath = "npx";
}
const possibleWebpackConfigPaths = [
pathResolve(process.cwd(), "webpack.config.js"),
pathResolve(process.cwd(), "webpack.config.ts"),
pathResolve(process.cwd(), "node_modules/@nlabs/lex/webpack.config.js"),
pathResolve(process.cwd(), "node_modules/@nlabs/lex/webpack.config.ts"),
pathResolve(currentDirname, "node_modules/@nlabs/lex/webpack.config.js"),
pathResolve(currentDirname, "node_modules/@nlabs/lex/webpack.config.ts"),
pathResolve(process.env.LEX_HOME || "/node_modules/@nlabs/lex", "webpack.config.js"),
pathResolve(process.env.LEX_HOME || "/node_modules/@nlabs/lex", "webpack.config.ts")
];
let webpackConfig = "";
for (const path of possibleWebpackConfigPaths) {
if (existsSync(path)) {
webpackConfig = path;
break;
}
}
if (!webpackConfig) {
webpackConfig = pathResolve(currentDirname, "../../webpack.config.js");
}
return { webpackConfig, webpackPath };
};
export {
findTailwindCssPath,
getDirName,
getFilePath,
getLexPackageJsonPath,
getNodePath,
relativeFilePath,
relativeNodePath,
resolveBinaryPath,
resolveWebpackPaths
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3V0aWxzL2ZpbGUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQgZmluZEZpbGVVcCBmcm9tICdmaW5kLWZpbGUtdXAnO1xuaW1wb3J0IHtleGlzdHNTeW5jLCByZWFkRmlsZVN5bmN9IGZyb20gJ2ZzJztcbmltcG9ydCB7c3luYyBhcyBnbG9iU3luY30gZnJvbSAnZ2xvYic7XG5pbXBvcnQge3Jlc29sdmUgYXMgcGF0aFJlc29sdmUsIGRpcm5hbWV9IGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQge0xleENvbmZpZ30gZnJvbSAnLi4vTGV4Q29uZmlnLmpzJztcblxuZXhwb3J0IGNvbnN0IGdldERpck5hbWUgPSAoKTogc3RyaW5nID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZXZhbCgnbmV3IFVSTChcIi5cIiwgaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZScpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5jd2QoKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldEZpbGVQYXRoID0gKHJlbGF0aXZlUGF0aDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZXZhbCgncmVxdWlyZShcInVybFwiKS5maWxlVVJMVG9QYXRoKG5ldyBVUkwocmVsYXRpdmVQYXRoLCBpbXBvcnQubWV0YS51cmwpKScpO1xuICB9IGNhdGNoIHtcbiAgICBpZihyZWxhdGl2ZVBhdGggPT09ICcuLi8uLi8uLi9wYWNrYWdlLmpzb24nKSB7XG4gICAgICByZXR1cm4gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ3BhY2thZ2UuanNvbicpO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgcmVsYXRpdmVQYXRoKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldExleFBhY2thZ2VKc29uUGF0aCA9ICgpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBMRVhfUEFDS0FHRV9OQU1FID0gJ0BubGFicy9sZXgnO1xuXG4gIGNvbnN0IGxleEluTm9kZU1vZHVsZXMgPSBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnbm9kZV9tb2R1bGVzL0BubGFicy9sZXgvcGFja2FnZS5qc29uJyk7XG5cbiAgaWYoZXhpc3RzU3luYyhsZXhJbk5vZGVNb2R1bGVzKSkge1xuICAgIHJldHVybiBsZXhJbk5vZGVNb2R1bGVzO1xuICB9XG5cbiAgbGV0IHN0YXJ0RGlyOiBzdHJpbmc7XG5cbiAgaWYocHJvY2Vzcy5lbnYuTEVYX1JPT1QpIHtcbiAgICBzdGFydERpciA9IHByb2Nlc3MuZW52LkxFWF9ST09UO1xuICB9IGVsc2Uge1xuICAgIHRyeSB7XG4gICAgICBzdGFydERpciA9IGV2YWwoJ25ldyBVUkwoXCIuXCIsIGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0YXJ0RGlyID0gZXZhbCgnX19maWxlbmFtZSA/IHJlcXVpcmUoXCJwYXRoXCIpLmRpcm5hbWUoX19maWxlbmFtZSkgOiBudWxsJyk7XG4gICAgICAgIGlmKCFzdGFydERpcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignX19maWxlbmFtZSBub3QgYXZhaWxhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmKHByb2Nlc3MuYXJndlsxXSAmJiAhcHJvY2Vzcy5hcmd2WzFdLmluY2x1ZGVzKCdub2RlJykpIHtcbiAgICAgICAgICAgIHN0YXJ0RGlyID0gZGlybmFtZShwcm9jZXNzLmFyZ3ZbMV0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYXJndlsxXSBub3Qgc3VpdGFibGUnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHN0YXJ0RGlyID0gcHJvY2Vzcy5jd2QoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxldCBkaXIgPSBzdGFydERpcjtcbiAgZm9yKGxldCBpID0gMDsgaSA8IDg7IGkrKykge1xuICAgIGNvbnN0IHBrZ1BhdGggPSBwYXRoUmVzb2x2ZShkaXIsICdwYWNrYWdlLmpzb24nKTtcbiAgICBpZihleGlzdHNTeW5jKHBrZ1BhdGgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwa2cgPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhwa2dQYXRoLCAndXRmOCcpKTtcbiAgICAgICAgaWYocGtnLm5hbWUgPT09IExFWF9QQUNLQUdFX05BTUUpIHtcbiAgICAgICAgICByZXR1cm4gcGtnUGF0aDtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudCA9IGRpcm5hbWUoZGlyKTtcbiAgICBpZihwYXJlbnQgPT09IGRpcikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRpciA9IHBhcmVudDtcbiAgfVxuXG4gIHJldHVybiBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAncGFja2FnZS5qc29uJyk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVsYXRpdmVGaWxlUGF0aCA9IChmaWxlbmFtZTogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcgPSAnLi8nLCBiYWNrVXA6IG51bWJlciA9IDApOiBzdHJpbmcgPT4ge1xuICBjb25zdCBuZXN0RGVwdGg6IG51bWJlciA9IDEwO1xuXG4gIGlmKGJhY2tVcCkge1xuICAgIGNvbnN0IGZpbGVQYXRoOiBzdHJpbmcgPSBmaW5kRmlsZVVwLnN5bmMoZmlsZW5hbWUsIGRpclBhdGgsIG5lc3REZXB0aCk7XG4gICAgY29uc3QgcHJldmlvdXNQYXRoOiBzdHJpbmcgPSBBcnJheShiYWNrVXApLmZpbGwobnVsbCkubWFwKCgpID0+ICcuLi8nKS5qb2luKCcnKTtcbiAgICByZXR1cm4gcGF0aFJlc29sdmUoZmlsZVBhdGgsIHByZXZpb3VzUGF0aCk7XG4gIH1cblxuICByZXR1cm4gZmluZEZpbGVVcC5zeW5jKGZpbGVuYW1lLCBkaXJQYXRoLCBuZXN0RGVwdGgpO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbGF0aXZlTm9kZVBhdGggPSAoZmlsZW5hbWU6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nID0gJy4vJywgYmFja1VwOiBudW1iZXIgPSAwKTogc3RyaW5nID0+IHtcbiAgY29uc3QgbmVzdERlcHRoOiBudW1iZXIgPSAxMDtcbiAgY29uc3QgbW9kdWxlUGF0aCA9IGBub2RlX21vZHVsZXMvJHtmaWxlbmFtZX1gO1xuXG4gIGlmKGRpclBhdGggIT09ICcuLycpIHtcbiAgICBjb25zdCBsZXhNb2R1bGVQYXRoID0gcGF0aFJlc29sdmUoZGlyUGF0aCwgbW9kdWxlUGF0aCk7XG4gICAgaWYoZXhpc3RzU3luYyhsZXhNb2R1bGVQYXRoKSkge1xuICAgICAgcmV0dXJuIGxleE1vZHVsZVBhdGg7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdFBhdGggPSBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBtb2R1bGVQYXRoKTtcbiAgaWYoZXhpc3RzU3luYyhwcm9qZWN0UGF0aCkpIHtcbiAgICByZXR1cm4gcHJvamVjdFBhdGg7XG4gIH1cblxuICBpZihiYWNrVXApIHtcbiAgICBjb25zdCBmaWxlUGF0aDogc3RyaW5nID0gZmluZEZpbGVVcC5zeW5jKG1vZHVsZVBhdGgsIGRpclBhdGgsIG5lc3REZXB0aCk7XG4gICAgY29uc3QgcHJldmlvdXNQYXRoOiBzdHJpbmcgPSBBcnJheShuZXN0RGVwdGgpLmZpbGwobnVsbCkubWFwKCgpID0+ICcuLi8nKS5qb2luKCcnKTtcbiAgICByZXR1cm4gcGF0aFJlc29sdmUoZmlsZVBhdGgsIHByZXZpb3VzUGF0aCk7XG4gIH1cblxuICByZXR1cm4gZmluZEZpbGVVcC5zeW5jKG1vZHVsZVBhdGgsIGRpclBhdGgsIG5lc3REZXB0aCkgfHwgYC9ub2RlX21vZHVsZXMvJHtmaWxlbmFtZX1gO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE5vZGVQYXRoID0gKG1vZHVsZU5hbWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGRpck5hbWUgPSBnZXREaXJOYW1lKCk7XG4gIGNvbnN0IG1vZHVsZVBhdGg6IHN0cmluZyA9IGBub2RlX21vZHVsZXMvJHttb2R1bGVOYW1lfWA7XG5cbiAgY29uc3QgcHJvamVjdFBhdGggPSBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBtb2R1bGVQYXRoKTtcbiAgaWYoZXhpc3RzU3luYyhwcm9qZWN0UGF0aCkpIHtcbiAgICByZXR1cm4gcHJvamVjdFBhdGg7XG4gIH1cblxuICBjb25zdCByZXBvUGF0aDogc3RyaW5nID0gZmluZEZpbGVVcC5zeW5jKG1vZHVsZVBhdGgsIGRpck5hbWUpO1xuICBpZihyZXBvUGF0aCAmJiBleGlzdHNTeW5jKHJlcG9QYXRoKSkge1xuICAgIHJldHVybiByZXBvUGF0aDtcbiAgfVxuXG4gIGNvbnN0IGxvY2FsUGF0aDogc3RyaW5nID0gZmluZEZpbGVVcC5zeW5jKG1vZHVsZVBhdGgsICcuLycsIDEwKSB8fCBgLi8ke21vZHVsZVBhdGh9YDtcbiAgcmV0dXJuIGxvY2FsUGF0aDtcbn07XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlQmluYXJ5UGF0aCA9IChiaW5hcnlOYW1lOiBzdHJpbmcsIHBhY2thZ2VOYW1lPzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgbGV4RGlyID0gTGV4Q29uZmlnLmdldExleERpcigpO1xuXG4gIGNvbnN0IGxleEJpblBhdGggPSBwYXRoUmVzb2x2ZShsZXhEaXIsIGBub2RlX21vZHVsZXMvLmJpbi8ke2JpbmFyeU5hbWV9YCk7XG4gIGlmKGV4aXN0c1N5bmMobGV4QmluUGF0aCkpIHtcbiAgICByZXR1cm4gbGV4QmluUGF0aDtcbiAgfVxuXG4gIGlmKHBhY2thZ2VOYW1lKSB7XG4gICAgY29uc3QgbGV4UGFja2FnZUJpblBhdGggPSBwYXRoUmVzb2x2ZShsZXhEaXIsIGBub2RlX21vZHVsZXMvJHtwYWNrYWdlTmFtZX0vYmluLyR7YmluYXJ5TmFtZX1gKTtcbiAgICBpZihleGlzdHNTeW5jKGxleFBhY2thZ2VCaW5QYXRoKSkge1xuICAgICAgcmV0dXJuIGxleFBhY2thZ2VCaW5QYXRoO1xuICAgIH1cblxuICAgIGNvbnN0IGxleFBhY2thZ2VCaW5Kc1BhdGggPSBwYXRoUmVzb2x2ZShsZXhEaXIsIGBub2RlX21vZHVsZXMvJHtwYWNrYWdlTmFtZX0vYmluLyR7YmluYXJ5TmFtZX0uanNgKTtcbiAgICBpZihleGlzdHNTeW5jKGxleFBhY2thZ2VCaW5Kc1BhdGgpKSB7XG4gICAgICByZXR1cm4gbGV4UGFja2FnZUJpbkpzUGF0aDtcbiAgICB9XG5cbiAgICBjb25zdCBsZXhQYWNrYWdlQmluQ2pzUGF0aCA9IHBhdGhSZXNvbHZlKGxleERpciwgYG5vZGVfbW9kdWxlcy8ke3BhY2thZ2VOYW1lfS9iaW4vJHtiaW5hcnlOYW1lfS5janNgKTtcbiAgICBpZihleGlzdHNTeW5jKGxleFBhY2thZ2VCaW5DanNQYXRoKSkge1xuICAgICAgcmV0dXJuIGxleFBhY2thZ2VCaW5DanNQYXRoO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNoZWNrQmluVXAgPSAoc3RhcnREaXI6IHN0cmluZykgPT4ge1xuICAgIGxldCBjaGVja0RpciA9IHN0YXJ0RGlyO1xuICAgIGZvcihsZXQgaSA9IDA7IGkgPCA1OyBpKyspIHtcbiAgICAgIGNvbnN0IG1vbm9yZXBvQmluUGF0aCA9IHBhdGhSZXNvbHZlKGNoZWNrRGlyLCBgbm9kZV9tb2R1bGVzLy5iaW4vJHtiaW5hcnlOYW1lfWApO1xuICAgICAgaWYoZXhpc3RzU3luYyhtb25vcmVwb0JpblBhdGgpKSB7XG4gICAgICAgIHJldHVybiBtb25vcmVwb0JpblBhdGg7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJlbnREaXIgPSBwYXRoUmVzb2x2ZShjaGVja0RpciwgJy4uJyk7XG4gICAgICBpZihwYXJlbnREaXIgPT09IGNoZWNrRGlyKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2hlY2tEaXIgPSBwYXJlbnREaXI7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfTtcblxuICBjb25zdCBmcm9tQ3dkID0gY2hlY2tCaW5VcChwcm9jZXNzLmN3ZCgpKTtcbiAgaWYoZnJvbUN3ZCkge1xuICAgIHJldHVybiBmcm9tQ3dkO1xuICB9XG5cbiAgY29uc3QgZnJvbUxleCA9IGNoZWNrQmluVXAobGV4RGlyKTtcbiAgaWYoZnJvbUxleCkge1xuICAgIHJldHVybiBmcm9tTGV4O1xuICB9XG5cbiAgcmV0dXJuICcnO1xufTtcblxuZXhwb3J0IGNvbnN0IGZpbmRUYWlsd2luZENzc1BhdGggPSAoKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdGFpbHdpbmRQYXR0ZXJucyA9IFsnKiovdGFpbHdpbmQuY3NzJ107XG5cbiAgZm9yKGNvbnN0IHBhdHRlcm4gb2YgdGFpbHdpbmRQYXR0ZXJucykge1xuICAgIGNvbnN0IGZpbGVzID0gZ2xvYlN5bmMocGF0dGVybiwge1xuICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgICAgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi9kaXN0LyoqJywgJyoqL2xpYi8qKicsICcqKi9idWlsZC8qKicsICcqKi8uc3Rvcnlib29rLyoqJ11cbiAgICB9KTtcblxuICAgIGlmKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBmaWxlc1swXSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVXZWJwYWNrUGF0aHMgPSAoY3VycmVudERpcm5hbWU6IHN0cmluZyk6IHt3ZWJwYWNrUGF0aDogc3RyaW5nOyB3ZWJwYWNrQ29uZmlnOiBzdHJpbmd9ID0+IHtcbiAgY29uc3QgcG9zc2libGVXZWJwYWNrUGF0aHMgPSBbXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ25vZGVfbW9kdWxlcy93ZWJwYWNrLWNsaS9iaW4vY2xpLmpzJyksXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ25vZGVfbW9kdWxlcy8uYmluL3dlYnBhY2snKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnbm9kZV9tb2R1bGVzL0BubGFicy9sZXgnLCAnbm9kZV9tb2R1bGVzL3dlYnBhY2stY2xpL2Jpbi9jbGkuanMnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnbm9kZV9tb2R1bGVzL0BubGFicy9sZXgnLCAnbm9kZV9tb2R1bGVzLy5iaW4vd2VicGFjaycpLFxuICAgIHBhdGhSZXNvbHZlKGN1cnJlbnREaXJuYW1lLCAnbm9kZV9tb2R1bGVzL0BubGFicy9sZXgvbm9kZV9tb2R1bGVzL3dlYnBhY2stY2xpL2Jpbi9jbGkuanMnKSxcbiAgICBwYXRoUmVzb2x2ZShjdXJyZW50RGlybmFtZSwgJ25vZGVfbW9kdWxlcy9AbmxhYnMvbGV4L25vZGVfbW9kdWxlcy8uYmluL3dlYnBhY2snKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmVudi5MRVhfSE9NRSB8fCAnL25vZGVfbW9kdWxlcy9AbmxhYnMvbGV4JywgJ25vZGVfbW9kdWxlcy93ZWJwYWNrLWNsaS9iaW4vY2xpLmpzJyksXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5lbnYuTEVYX0hPTUUgfHwgJy9ub2RlX21vZHVsZXMvQG5sYWJzL2xleCcsICdub2RlX21vZHVsZXMvLmJpbi93ZWJwYWNrJylcbiAgXTtcblxuICBsZXQgd2VicGFja1BhdGggPSAnJztcblxuICBmb3IoY29uc3QgcGF0aCBvZiBwb3NzaWJsZVdlYnBhY2tQYXRocykge1xuICAgIGlmKGV4aXN0c1N5bmMocGF0aCkpIHtcbiAgICAgIHdlYnBhY2tQYXRoID0gcGF0aDtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmKCF3ZWJwYWNrUGF0aCkge1xuICAgIHdlYnBhY2tQYXRoID0gJ25weCc7XG4gIH1cblxuICBjb25zdCBwb3NzaWJsZVdlYnBhY2tDb25maWdQYXRocyA9IFtcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnd2VicGFjay5jb25maWcuanMnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnd2VicGFjay5jb25maWcudHMnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnbm9kZV9tb2R1bGVzL0BubGFicy9sZXgvd2VicGFjay5jb25maWcuanMnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnbm9kZV9tb2R1bGVzL0BubGFicy9sZXgvd2VicGFjay5jb25maWcudHMnKSxcbiAgICBwYXRoUmVzb2x2ZShjdXJyZW50RGlybmFtZSwgJ25vZGVfbW9kdWxlcy9AbmxhYnMvbGV4L3dlYnBhY2suY29uZmlnLmpzJyksXG4gICAgcGF0aFJlc29sdmUoY3VycmVudERpcm5hbWUsICdub2RlX21vZHVsZXMvQG5sYWJzL2xleC93ZWJwYWNrLmNvbmZpZy50cycpLFxuICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuZW52LkxFWF9IT01FIHx8ICcvbm9kZV9tb2R1bGVzL0BubGFicy9sZXgnLCAnd2VicGFjay5jb25maWcuanMnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmVudi5MRVhfSE9NRSB8fCAnL25vZGVfbW9kdWxlcy9AbmxhYnMvbGV4JywgJ3dlYnBhY2suY29uZmlnLnRzJylcbiAgXTtcblxuICBsZXQgd2VicGFja0NvbmZpZyA9ICcnO1xuXG4gIGZvcihjb25zdCBwYXRoIG9mIHBvc3NpYmxlV2VicGFja0NvbmZpZ1BhdGhzKSB7XG4gICAgaWYoZXhpc3RzU3luYyhwYXRoKSkge1xuICAgICAgd2VicGFja0NvbmZpZyA9IHBhdGg7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZighd2VicGFja0NvbmZpZykge1xuICAgIHdlYnBhY2tDb25maWcgPSBwYXRoUmVzb2x2ZShjdXJyZW50RGlybmFtZSwgJy4uLy4uL3dlYnBhY2suY29uZmlnLmpzJyk7XG4gIH1cblxuICByZXR1cm4ge3dlYnBhY2tDb25maWcsIHdlYnBhY2tQYXRofTtcbn07Il0sCiAgIm1hcHBpbmdzIjogIkFBSUEsT0FBTyxnQkFBZ0I7QUFDdkIsU0FBUSxZQUFZLG9CQUFtQjtBQUN2QyxTQUFRLFFBQVEsZ0JBQWU7QUFDL0IsU0FBUSxXQUFXLGFBQWEsZUFBYztBQUU5QyxTQUFRLGlCQUFnQjtBQUVqQixNQUFNLGFBQWEsTUFBYztBQUN0QyxNQUFJO0FBQ0YsV0FBTyxLQUFLLHdDQUF3QztBQUFBLEVBQ3RELFFBQVE7QUFDTixXQUFPLFFBQVEsSUFBSTtBQUFBLEVBQ3JCO0FBQ0Y7QUFFTyxNQUFNLGNBQWMsQ0FBQyxpQkFBaUM7QUFDM0QsTUFBSTtBQUNGLFdBQU8sS0FBSyxzRUFBc0U7QUFBQSxFQUNwRixRQUFRO0FBQ04sUUFBRyxpQkFBaUIseUJBQXlCO0FBQzNDLGFBQU8sWUFBWSxRQUFRLElBQUksR0FBRyxjQUFjO0FBQUEsSUFDbEQ7QUFDQSxXQUFPLFlBQVksUUFBUSxJQUFJLEdBQUcsWUFBWTtBQUFBLEVBQ2hEO0FBQ0Y7QUFFTyxNQUFNLHdCQUF3QixNQUFjO0FBQ2pELFFBQU0sbUJBQW1CO0FBRXpCLFFBQU0sbUJBQW1CLFlBQVksUUFBUSxJQUFJLEdBQUcsc0NBQXNDO0FBRTFGLE1BQUcsV0FBVyxnQkFBZ0IsR0FBRztBQUMvQixXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUk7QUFFSixNQUFHLFFBQVEsSUFBSSxVQUFVO0FBQ3ZCLGVBQVcsUUFBUSxJQUFJO0FBQUEsRUFDekIsT0FBTztBQUNMLFFBQUk7QUFDRixpQkFBVyxLQUFLLHdDQUF3QztBQUFBLElBQzFELFFBQVE7QUFDTixVQUFJO0FB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