UNPKG

@nlabs/lex

Version:
230 lines (229 loc) 25.2 kB
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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