UNPKG

@nlabs/lex

Version:
253 lines (252 loc) 30.2 kB
/** * Copyright (c) 2018-Present, Nitrogen Labs, Inc. * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms. */ 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'; export const getDirName = ()=>{ try { return eval('new URL(".", import.meta.url).pathname'); } catch { return process.cwd(); } }; export 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); } }; export 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'); }; export 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); }; export 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}`; }; export 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; }; export 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 = (startDir)=>{ let checkDir = startDir; 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 ''; }; export 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 ''; }; export 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) { try { const lexPackagePath = getLexPackageJsonPath(); const lexPackageDir = dirname(lexPackagePath); const lexWebpackCli = pathResolve(lexPackageDir, 'node_modules/webpack-cli/bin/cli.js'); const lexWebpackBin = pathResolve(lexPackageDir, 'node_modules/.bin/webpack'); if (existsSync(lexWebpackCli)) { webpackPath = lexWebpackCli; } else if (existsSync(lexWebpackBin)) { webpackPath = lexWebpackBin; } else { webpackPath = 'npx'; } } catch { 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) { const lexPackagePath = getLexPackageJsonPath(); const lexPackageDir = dirname(lexPackagePath); const lexWebpackConfig = pathResolve(lexPackageDir, 'webpack.config.js'); if (existsSync(lexWebpackConfig)) { webpackConfig = lexWebpackConfig; } else { webpackConfig = pathResolve(currentDirname, '../../webpack.config.js'); } } return { webpackConfig, webpackPath }; }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9maWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQgZmluZEZpbGVVcCBmcm9tICdmaW5kLWZpbGUtdXAnO1xuaW1wb3J0IHtleGlzdHNTeW5jLCByZWFkRmlsZVN5bmN9IGZyb20gJ2ZzJztcbmltcG9ydCB7c3luYyBhcyBnbG9iU3luY30gZnJvbSAnZ2xvYic7XG5pbXBvcnQge3Jlc29sdmUgYXMgcGF0aFJlc29sdmUsIGRpcm5hbWV9IGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQge0xleENvbmZpZ30gZnJvbSAnLi4vTGV4Q29uZmlnLmpzJztcblxuZXhwb3J0IGNvbnN0IGdldERpck5hbWUgPSAoKTogc3RyaW5nID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZXZhbCgnbmV3IFVSTChcIi5cIiwgaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZScpO1xuICB9IGNhdGNoe1xuICAgIHJldHVybiBwcm9jZXNzLmN3ZCgpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RmlsZVBhdGggPSAocmVsYXRpdmVQYXRoOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBldmFsKCdyZXF1aXJlKFwidXJsXCIpLmZpbGVVUkxUb1BhdGgobmV3IFVSTChyZWxhdGl2ZVBhdGgsIGltcG9ydC5tZXRhLnVybCkpJyk7XG4gIH0gY2F0Y2h7XG4gICAgaWYocmVsYXRpdmVQYXRoID09PSAnLi4vLi4vLi4vcGFja2FnZS5qc29uJykge1xuICAgICAgcmV0dXJuIHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICdwYWNrYWdlLmpzb24nKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksIHJlbGF0aXZlUGF0aCk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRMZXhQYWNrYWdlSnNvblBhdGggPSAoKTogc3RyaW5nID0+IHtcbiAgY29uc3QgTEVYX1BBQ0tBR0VfTkFNRSA9ICdAbmxhYnMvbGV4JztcblxuICBjb25zdCBsZXhJbk5vZGVNb2R1bGVzID0gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ25vZGVfbW9kdWxlcy9AbmxhYnMvbGV4L3BhY2thZ2UuanNvbicpO1xuXG4gIGlmKGV4aXN0c1N5bmMobGV4SW5Ob2RlTW9kdWxlcykpIHtcbiAgICByZXR1cm4gbGV4SW5Ob2RlTW9kdWxlcztcbiAgfVxuXG4gIGxldCBzdGFydERpcjogc3RyaW5nO1xuXG4gIGlmKHByb2Nlc3MuZW52LkxFWF9ST09UKSB7XG4gICAgc3RhcnREaXIgPSBwcm9jZXNzLmVudi5MRVhfUk9PVDtcbiAgfSBlbHNlIHtcbiAgICB0cnkge1xuICAgICAgc3RhcnREaXIgPSBldmFsKCduZXcgVVJMKFwiLlwiLCBpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lJyk7XG4gICAgfSBjYXRjaHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0YXJ0RGlyID0gZXZhbCgnX19maWxlbmFtZSA/IHJlcXVpcmUoXCJwYXRoXCIpLmRpcm5hbWUoX19maWxlbmFtZSkgOiBudWxsJyk7XG4gICAgICAgIGlmKCFzdGFydERpcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignX19maWxlbmFtZSBub3QgYXZhaWxhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2h7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYocHJvY2Vzcy5hcmd2WzFdICYmICFwcm9jZXNzLmFyZ3ZbMV0uaW5jbHVkZXMoJ25vZGUnKSkge1xuICAgICAgICAgICAgc3RhcnREaXIgPSBkaXJuYW1lKHByb2Nlc3MuYXJndlsxXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5hcmd2WzFdIG5vdCBzdWl0YWJsZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaHtcbiAgICAgICAgICBzdGFydERpciA9IHByb2Nlc3MuY3dkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsZXQgZGlyID0gc3RhcnREaXI7XG4gIGZvcihsZXQgaSA9IDA7IGkgPCA4OyBpKyspIHtcbiAgICBjb25zdCBwa2dQYXRoID0gcGF0aFJlc29sdmUoZGlyLCAncGFja2FnZS5qc29uJyk7XG4gICAgaWYoZXhpc3RzU3luYyhwa2dQYXRoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGtnID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMocGtnUGF0aCwgJ3V0ZjgnKSk7XG4gICAgICAgIGlmKHBrZy5uYW1lID09PSBMRVhfUEFDS0FHRV9OQU1FKSB7XG4gICAgICAgICAgcmV0dXJuIHBrZ1BhdGg7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2h7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudCA9IGRpcm5hbWUoZGlyKTtcbiAgICBpZihwYXJlbnQgPT09IGRpcikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRpciA9IHBhcmVudDtcbiAgfVxuXG4gIHJldHVybiBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAncGFja2FnZS5qc29uJyk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVsYXRpdmVGaWxlUGF0aCA9IChmaWxlbmFtZTogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcgPSAnLi8nLCBiYWNrVXA6IG51bWJlciA9IDApOiBzdHJpbmcgPT4ge1xuICBjb25zdCBuZXN0RGVwdGg6IG51bWJlciA9IDEwO1xuXG4gIGlmKGJhY2tVcCkge1xuICAgIGNvbnN0IGZpbGVQYXRoOiBzdHJpbmcgPSBmaW5kRmlsZVVwLnN5bmMoZmlsZW5hbWUsIGRpclBhdGgsIG5lc3REZXB0aCk7XG4gICAgY29uc3QgcHJldmlvdXNQYXRoOiBzdHJpbmcgPSBBcnJheShiYWNrVXApLmZpbGwobnVsbCkubWFwKCgpID0+ICcuLi8nKS5qb2luKCcnKTtcbiAgICByZXR1cm4gcGF0aFJlc29sdmUoZmlsZVBhdGgsIHByZXZpb3VzUGF0aCk7XG4gIH1cblxuICByZXR1cm4gZmluZEZpbGVVcC5zeW5jKGZpbGVuYW1lLCBkaXJQYXRoLCBuZXN0RGVwdGgpO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbGF0aXZlTm9kZVBhdGggPSAoZmlsZW5hbWU6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nID0gJy4vJywgYmFja1VwOiBudW1iZXIgPSAwKTogc3RyaW5nID0+IHtcbiAgY29uc3QgbmVzdERlcHRoOiBudW1iZXIgPSAxMDtcbiAgY29uc3QgbW9kdWxlUGF0aCA9IGBub2RlX21vZHVsZXMvJHtmaWxlbmFtZX1gO1xuXG4gIGlmKGRpclBhdGggIT09ICcuLycpIHtcbiAgICBjb25zdCBsZXhNb2R1bGVQYXRoID0gcGF0aFJlc29sdmUoZGlyUGF0aCwgbW9kdWxlUGF0aCk7XG4gICAgaWYoZXhpc3RzU3luYyhsZXhNb2R1bGVQYXRoKSkge1xuICAgICAgcmV0dXJuIGxleE1vZHVsZVBhdGg7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdFBhdGggPSBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBtb2R1bGVQYXRoKTtcbiAgaWYoZXhpc3RzU3luYyhwcm9qZWN0UGF0aCkpIHtcbiAgICByZXR1cm4gcHJvamVjdFBhdGg7XG4gIH1cblxuICBpZihiYWNrVXApIHtcbiAgICBjb25zdCBmaWxlUGF0aDogc3RyaW5nID0gZmluZEZpbGVVcC5zeW5jKG1vZHVsZVBhdGgsIGRpclBhdGgsIG5lc3REZXB0aCk7XG4gICAgY29uc3QgcHJldmlvdXNQYXRoOiBzdHJpbmcgPSBBcnJheShuZXN0RGVwdGgpLmZpbGwobnVsbCkubWFwKCgpID0+ICcuLi8nKS5qb2luKCcnKTtcbiAgICByZXR1cm4gcGF0aFJlc29sdmUoZmlsZVBhdGgsIHByZXZpb3VzUGF0aCk7XG4gIH1cblxuICByZXR1cm4gZmluZEZpbGVVcC5zeW5jKG1vZHVsZVBhdGgsIGRpclBhdGgsIG5lc3REZXB0aCkgfHwgYC9ub2RlX21vZHVsZXMvJHtmaWxlbmFtZX1gO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE5vZGVQYXRoID0gKG1vZHVsZU5hbWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGRpck5hbWUgPSBnZXREaXJOYW1lKCk7XG4gIGNvbnN0IG1vZHVsZVBhdGg6IHN0cmluZyA9IGBub2RlX21vZHVsZXMvJHttb2R1bGVOYW1lfWA7XG5cbiAgY29uc3QgcHJvamVjdFBhdGggPSBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBtb2R1bGVQYXRoKTtcbiAgaWYoZXhpc3RzU3luYyhwcm9qZWN0UGF0aCkpIHtcbiAgICByZXR1cm4gcHJvamVjdFBhdGg7XG4gIH1cblxuICBjb25zdCByZXBvUGF0aDogc3RyaW5nID0gZmluZEZpbGVVcC5zeW5jKG1vZHVsZVBhdGgsIGRpck5hbWUpO1xuICBpZihyZXBvUGF0aCAmJiBleGlzdHNTeW5jKHJlcG9QYXRoKSkge1xuICAgIHJldHVybiByZXBvUGF0aDtcbiAgfVxuXG4gIGNvbnN0IGxvY2FsUGF0aDogc3RyaW5nID0gZmluZEZpbGVVcC5zeW5jKG1vZHVsZVBhdGgsICcuLycsIDEwKSB8fCBgLi8ke21vZHVsZVBhdGh9YDtcbiAgcmV0dXJuIGxvY2FsUGF0aDtcbn07XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlQmluYXJ5UGF0aCA9IChiaW5hcnlOYW1lOiBzdHJpbmcsIHBhY2thZ2VOYW1lPzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgbGV4RGlyID0gTGV4Q29uZmlnLmdldExleERpcigpO1xuXG4gIGNvbnN0IGxleEJpblBhdGggPSBwYXRoUmVzb2x2ZShsZXhEaXIsIGBub2RlX21vZHVsZXMvLmJpbi8ke2JpbmFyeU5hbWV9YCk7XG4gIGlmKGV4aXN0c1N5bmMobGV4QmluUGF0aCkpIHtcbiAgICByZXR1cm4gbGV4QmluUGF0aDtcbiAgfVxuXG4gIGlmKHBhY2thZ2VOYW1lKSB7XG4gICAgY29uc3QgbGV4UGFja2FnZUJpblBhdGggPSBwYXRoUmVzb2x2ZShsZXhEaXIsIGBub2RlX21vZHVsZXMvJHtwYWNrYWdlTmFtZX0vYmluLyR7YmluYXJ5TmFtZX1gKTtcbiAgICBpZihleGlzdHNTeW5jKGxleFBhY2thZ2VCaW5QYXRoKSkge1xuICAgICAgcmV0dXJuIGxleFBhY2thZ2VCaW5QYXRoO1xuICAgIH1cblxuICAgIGNvbnN0IGxleFBhY2thZ2VCaW5Kc1BhdGggPSBwYXRoUmVzb2x2ZShsZXhEaXIsIGBub2RlX21vZHVsZXMvJHtwYWNrYWdlTmFtZX0vYmluLyR7YmluYXJ5TmFtZX0uanNgKTtcbiAgICBpZihleGlzdHNTeW5jKGxleFBhY2thZ2VCaW5Kc1BhdGgpKSB7XG4gICAgICByZXR1cm4gbGV4UGFja2FnZUJpbkpzUGF0aDtcbiAgICB9XG5cbiAgICBjb25zdCBsZXhQYWNrYWdlQmluQ2pzUGF0aCA9IHBhdGhSZXNvbHZlKGxleERpciwgYG5vZGVfbW9kdWxlcy8ke3BhY2thZ2VOYW1lfS9iaW4vJHtiaW5hcnlOYW1lfS5janNgKTtcbiAgICBpZihleGlzdHNTeW5jKGxleFBhY2thZ2VCaW5DanNQYXRoKSkge1xuICAgICAgcmV0dXJuIGxleFBhY2thZ2VCaW5DanNQYXRoO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNoZWNrQmluVXAgPSAoc3RhcnREaXI6IHN0cmluZykgPT4ge1xuICAgIGxldCBjaGVja0RpciA9IHN0YXJ0RGlyO1xuICAgIGZvcihsZXQgaSA9IDA7IGkgPCA1OyBpKyspIHtcbiAgICAgIGNvbnN0IG1vbm9yZXBvQmluUGF0aCA9IHBhdGhSZXNvbHZlKGNoZWNrRGlyLCBgbm9kZV9tb2R1bGVzLy5iaW4vJHtiaW5hcnlOYW1lfWApO1xuICAgICAgaWYoZXhpc3RzU3luYyhtb25vcmVwb0JpblBhdGgpKSB7XG4gICAgICAgIHJldHVybiBtb25vcmVwb0JpblBhdGg7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJlbnREaXIgPSBwYXRoUmVzb2x2ZShjaGVja0RpciwgJy4uJyk7XG4gICAgICBpZihwYXJlbnREaXIgPT09IGNoZWNrRGlyKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2hlY2tEaXIgPSBwYXJlbnREaXI7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfTtcblxuICBjb25zdCBmcm9tQ3dkID0gY2hlY2tCaW5VcChwcm9jZXNzLmN3ZCgpKTtcbiAgaWYoZnJvbUN3ZCkge1xuICAgIHJldHVybiBmcm9tQ3dkO1xuICB9XG5cbiAgY29uc3QgZnJvbUxleCA9IGNoZWNrQmluVXAobGV4RGlyKTtcbiAgaWYoZnJvbUxleCkge1xuICAgIHJldHVybiBmcm9tTGV4O1xuICB9XG5cbiAgcmV0dXJuICcnO1xufTtcblxuZXhwb3J0IGNvbnN0IGZpbmRUYWlsd2luZENzc1BhdGggPSAoKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdGFpbHdpbmRQYXR0ZXJucyA9IFsnKiovdGFpbHdpbmQuY3NzJ107XG5cbiAgZm9yKGNvbnN0IHBhdHRlcm4gb2YgdGFpbHdpbmRQYXR0ZXJucykge1xuICAgIGNvbnN0IGZpbGVzID0gZ2xvYlN5bmMocGF0dGVybiwge1xuICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgICAgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi9kaXN0LyoqJywgJyoqL2xpYi8qKicsICcqKi9idWlsZC8qKicsICcqKi8uc3Rvcnlib29rLyoqJ11cbiAgICB9KTtcblxuICAgIGlmKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBmaWxlc1swXSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVXZWJwYWNrUGF0aHMgPSAoY3VycmVudERpcm5hbWU6IHN0cmluZyk6IHt3ZWJwYWNrUGF0aDogc3RyaW5nOyB3ZWJwYWNrQ29uZmlnOiBzdHJpbmd9ID0+IHtcbiAgY29uc3QgcG9zc2libGVXZWJwYWNrUGF0aHMgPSBbXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ25vZGVfbW9kdWxlcy93ZWJwYWNrLWNsaS9iaW4vY2xpLmpzJyksXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ25vZGVfbW9kdWxlcy8uYmluL3dlYnBhY2snKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnbm9kZV9tb2R1bGVzL0BubGFicy9sZXgnLCAnbm9kZV9tb2R1bGVzL3dlYnBhY2stY2xpL2Jpbi9jbGkuanMnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnbm9kZV9tb2R1bGVzL0BubGFicy9sZXgnLCAnbm9kZV9tb2R1bGVzLy5iaW4vd2VicGFjaycpLFxuICAgIHBhdGhSZXNvbHZlKGN1cnJlbnREaXJuYW1lLCAnbm9kZV9tb2R1bGVzL0BubGFicy9sZXgvbm9kZV9tb2R1bGVzL3dlYnBhY2stY2xpL2Jpbi9jbGkuanMnKSxcbiAgICBwYXRoUmVzb2x2ZShjdXJyZW50RGlybmFtZSwgJ25vZGVfbW9kdWxlcy9AbmxhYnMvbGV4L25vZGVfbW9kdWxlcy8uYmluL3dlYnBhY2snKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmVudi5MRVhfSE9NRSB8fCAnL25vZGVfbW9kdWxlcy9AbmxhYnMvbGV4JywgJ25vZGVfbW9kdWxlcy93ZWJwYWNrLWNsaS9iaW4vY2xpLmpzJyksXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5lbnYuTEVYX0hPTUUgfHwgJy9ub2RlX21vZHVsZXMvQG5sYWJzL2xleCcsICdub2RlX21vZHVsZXMvLmJpbi93ZWJwYWNrJylcbiAgXTtcblxuICBsZXQgd2VicGFja1BhdGggPSAnJztcblxuICBmb3IoY29uc3QgcGF0aCBvZiBwb3NzaWJsZVdlYnBhY2tQYXRocykge1xuICAgIGlmKGV4aXN0c1N5bmMocGF0aCkpIHtcbiAgICAgIHdlYnBhY2tQYXRoID0gcGF0aDtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmKCF3ZWJwYWNrUGF0aCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBsZXhQYWNrYWdlUGF0aCA9IGdldExleFBhY2thZ2VKc29uUGF0aCgpO1xuICAgICAgY29uc3QgbGV4UGFja2FnZURpciA9IGRpcm5hbWUobGV4UGFja2FnZVBhdGgpO1xuICAgICAgY29uc3QgbGV4V2VicGFja0NsaSA9IHBhdGhSZXNvbHZlKGxleFBhY2thZ2VEaXIsICdub2RlX21vZHVsZXMvd2VicGFjay1jbGkvYmluL2NsaS5qcycpO1xuICAgICAgY29uc3QgbGV4V2VicGFja0JpbiA9IHBhdGhSZXNvbHZlKGxleFBhY2thZ2VEaXIsICdub2RlX21vZHVsZXMvLmJpbi93ZWJwYWNrJyk7XG5cbiAgICAgIGlmKGV4aXN0c1N5bmMobGV4V2VicGFja0NsaSkpIHtcbiAgICAgICAgd2VicGFja1BhdGggPSBsZXhXZWJwYWNrQ2xpO1xuICAgICAgfSBlbHNlIGlmKGV4aXN0c1N5bmMobGV4V2VicGFja0JpbikpIHtcbiAgICAgICAgd2VicGFja1BhdGggPSBsZXhXZWJwYWNrQmluO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2VicGFja1BhdGggPSAnbnB4JztcbiAgICAgIH1cbiAgICB9IGNhdGNoe1xuICAgICAgd2VicGFja1BhdGggPSAnbnB4JztcbiAgICB9XG4gIH1cblxuICBjb25zdCBwb3NzaWJsZVdlYnBhY2tDb25maWdQYXRocyA9IFtcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnd2VicGFjay5jb25maWcuanMnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnd2VicGFjay5jb25maWcudHMnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnbm9kZV9tb2R1bGVzL0BubGFicy9sZXgvd2VicGFjay5jb25maWcuanMnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnbm9kZV9tb2R1bGVzL0BubGFicy9sZXgvd2VicGFjay5jb25maWcudHMnKSxcbiAgICBwYXRoUmVzb2x2ZShjdXJyZW50RGlybmFtZSwgJ25vZGVfbW9kdWxlcy9AbmxhYnMvbGV4L3dlYnBhY2suY29uZmlnLmpzJyksXG4gICAgcGF0aFJlc29sdmUoY3VycmVudERpcm5hbWUsICdub2RlX21vZHVsZXMvQG5sYWJzL2xleC93ZWJwYWNrLmNvbmZpZy50cycpLFxuICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuZW52LkxFWF9IT01FIHx8ICcvbm9kZV9tb2R1bGVzL0BubGFicy9sZXgnLCAnd2VicGFjay5jb25maWcuanMnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmVudi5MRVhfSE9NRSB8fCAnL25vZGVfbW9kdWxlcy9AbmxhYnMvbGV4JywgJ3dlYnBhY2suY29uZmlnLnRzJylcbiAgXTtcblxuICBsZXQgd2VicGFja0NvbmZpZyA9ICcnO1xuXG4gIGZvcihjb25zdCBwYXRoIG9mIHBvc3NpYmxlV2VicGFja0NvbmZpZ1BhdGhzKSB7XG4gICAgaWYoZXhpc3RzU3luYyhwYXRoKSkge1xuICAgICAgd2VicGFja0NvbmZpZyA9IHBhdGg7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZighd2VicGFja0NvbmZpZykge1xuICAgIGNvbnN0IGxleFBhY2thZ2VQYXRoID0gZ2V0TGV4UGFja2FnZUpzb25QYXRoKCk7XG4gICAgY29uc3QgbGV4UGFja2FnZURpciA9IGRpcm5hbWUobGV4UGFja2FnZVBhdGgpO1xuICAgIGNvbnN0IGxleFdlYnBhY2tDb25maWcgPSBwYXRoUmVzb2x2ZShsZXhQYWNrYWdlRGlyLCAnd2VicGFjay5jb25maWcuanMnKTtcblxuICAgIGlmKGV4aXN0c1N5bmMobGV4V2VicGFja0NvbmZpZykpIHtcbiAgICAgIHdlYnBhY2tDb25maWcgPSBsZXhXZWJwYWNrQ29uZmlnO1xuICAgIH0gZWxzZSB7XG4gICAgICB3ZWJwYWNrQ29uZmlnID0gcGF0aFJlc29sdmUoY3VycmVudERpcm5hbWUsICcuLi8uLi93ZWJwYWNrLmNvbmZpZy5qcycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7d2VicGFja0NvbmZpZywgd2VicGFja1BhdGh9O1xufTsiXSwibmFtZXMiOlsiZmluZEZpbGVVcCIsImV4aXN0c1N5bmMiLCJyZWFkRmlsZVN5bmMiLCJzeW5jIiwiZ2xvYlN5bmMiLCJyZXNvbHZlIiwicGF0aFJlc29sdmUiLCJkaXJuYW1lIiwiTGV4Q29uZmlnIiwiZ2V0RGlyTmFtZSIsImV2YWwiLCJwcm9jZXNzIiwiY3dkIiwiZ2V0RmlsZVBhdGgiLCJyZWxhdGl2ZVBhdGgiLCJnZXRMZXhQYWNrYWdlSnNvblBhdGgiLCJMRVhfUEFDS0FHRV9OQU1FIiwibGV4SW5Ob2RlTW9kdWxlcyIsInN0YXJ0RGlyIiwiZW52IiwiTEVYX1JPT1QiLCJFcnJvciIsImFyZ3YiLCJpbmNsdWRlcyIsImRpciIsImkiLCJwa2dQYXRoIiwicGtnIiwiSlNPTiIsInBhcnNlIiwibmFtZSIsInBhcmVudCIsInJlbGF0aXZlRmlsZVBhdGgiLCJmaWxlbmFtZSIsImRpclBhdGgiLCJiYWNrVXAiLCJuZXN0RGVwdGgiLCJmaWxlUGF0aCIsInByZXZpb3VzUGF0aCIsIkFycmF5IiwiZmlsbCIsIm1hcCIsImpvaW4iLCJyZWxhdGl2ZU5vZGVQYXRoIiwibW9kdWxlUGF0aCIsImxleE1vZHVsZVBhdGgiLCJwcm9qZWN0UGF0aCIsImdldE5vZGVQYXRoIiwibW9kdWxlTmFtZSIsImRpck5hbWUiLCJyZXBvUGF0aCIsImxvY2FsUGF0aCIsInJlc29sdmVCaW5hcnlQYXRoIiwiYmluYXJ5TmFtZSIsInBhY2thZ2VOYW1lIiwibGV4RGlyIiwiZ2V0TGV4RGlyIiwibGV4QmluUGF0aCIsImxleFBhY2thZ2VCaW5QYXRoIiwibGV4UGFja2FnZUJpbkpzUGF0aCIsImxleFBhY2thZ2VCaW5DanNQYXRoIiwiY2hlY2tCaW5VcCIsImNoZWNrRGlyIiwibW9ub3JlcG9CaW5QYXRoIiwicGFyZW50RGlyIiwiZnJvbUN3ZCIsImZyb21MZXgiLCJmaW5kVGFpbHdpbmRDc3NQYXRoIiwidGFpbHdpbmRQYXR0ZXJucyIsInBhdHRlcm4iLCJmaWxlcyIsImlnbm9yZSIsImxlbmd0aCIsInJlc29sdmVXZWJwYWNrUGF0aHMiLCJjdXJyZW50RGlybmFtZSIsInBvc3NpYmxlV2VicGFja1BhdGhzIiwiTEVYX0hPTUUiLCJ3ZWJwYWNrUGF0aCIsInBhdGgiLCJsZXhQYWNrYWdlUGF0aCIsImxleFBhY2thZ2VEaXIiLCJsZXhXZWJwYWNrQ2xpIiwibGV4V2VicGFja0JpbiIsInBvc3NpYmxlV2VicGFja0NvbmZpZ1BhdGhzIiwid2VicGFja0NvbmZpZyIsImxleFdlYnBhY2tDb25maWciXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELE9BQU9BLGdCQUFnQixlQUFlO0FBQ3RDLFNBQVFDLFVBQVUsRUFBRUMsWUFBWSxRQUFPLEtBQUs7QUFDNUMsU0FBUUMsUUFBUUMsUUFBUSxRQUFPLE9BQU87QUFDdEMsU0FBUUMsV0FBV0MsV0FBVyxFQUFFQyxPQUFPLFFBQU8sT0FBTztBQUVyRCxTQUFRQyxTQUFTLFFBQU8sa0JBQWtCO0FBRTFDLE9BQU8sTUFBTUMsYUFBYTtJQUN4QixJQUFJO1FBQ0YsT0FBT0MsS0FBSztJQUNkLEVBQUUsT0FBSztRQUNMLE9BQU9DLFFBQVFDLEdBQUc7SUFDcEI7QUFDRixFQUFFO0FBRUYsT0FBTyxNQUFNQyxjQUFjLENBQUNDO0lBQzFCLElBQUk7UUFDRixPQUFPSixLQUFLO0lBQ2QsRUFBRSxPQUFLO1FBQ0wsSUFBR0ksaUJBQWlCLHlCQUF5QjtZQUMzQyxPQUFPUixZQUFZSyxRQUFRQyxHQUFHLElBQUk7UUFDcEM7UUFDQSxPQUFPTixZQUFZSyxRQUFRQyxHQUFHLElBQUlFO0lBQ3BDO0FBQ0YsRUFBRTtBQUVGLE9BQU8sTUFBTUMsd0JBQXdCO0lBQ25DLE1BQU1DLG1CQUFtQjtJQUV6QixNQUFNQyxtQkFBbUJYLFlBQVlLLFFBQVFDLEdBQUcsSUFBSTtJQUVwRCxJ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