react-scripts
Version:
Configuration and scripts for Create React App.
246 lines (189 loc) • 21.3 kB
JavaScript
exports.__esModule = true;
exports.CASE_SENSITIVE_FS = undefined;
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; };
exports.relative = relative;
exports.default = resolve;
var _es6Map = require('es6-map');
var _es6Map2 = _interopRequireDefault(_es6Map);
var _es6Set = require('es6-set');
var _es6Set2 = _interopRequireDefault(_es6Set);
var _objectAssign = require('object-assign');
var _objectAssign2 = _interopRequireDefault(_objectAssign);
var _pkgDir = require('pkg-dir');
var _pkgDir2 = _interopRequireDefault(_pkgDir);
var _fs = require('fs');
var _fs2 = _interopRequireDefault(_fs);
var _path = require('path');
var path = _interopRequireWildcard(_path);
var _crypto = require('crypto');
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var CASE_SENSITIVE_FS = exports.CASE_SENSITIVE_FS = !_fs2.default.existsSync(path.join(__dirname, 'reSOLVE.js'));
var fileExistsCache = new _es6Map2.default();
function cachePath(cacheKey, result) {
fileExistsCache.set(cacheKey, { result: result, lastSeen: Date.now() });
}
function checkCache(cacheKey, _ref) {
var lifetime = _ref.lifetime;
if (fileExistsCache.has(cacheKey)) {
var _fileExistsCache$get = fileExistsCache.get(cacheKey);
var result = _fileExistsCache$get.result;
var lastSeen = _fileExistsCache$get.lastSeen;
// check fresness
if (Date.now() - lastSeen < lifetime * 1000) return result;
}
// cache miss
return undefined;
}
// http://stackoverflow.com/a/27382838
function fileExistsWithCaseSync(filepath, cacheSettings) {
// don't care if the FS is case-sensitive
if (CASE_SENSITIVE_FS) return true;
// null means it resolved to a builtin
if (filepath === null) return true;
var dir = path.dirname(filepath);
var result = checkCache(filepath, cacheSettings);
if (result != null) return result;
// base case
if (dir === '/' || dir === '.' || /^[A-Z]:\\$/i.test(dir)) {
result = true;
} else {
var filenames = _fs2.default.readdirSync(dir);
if (filenames.indexOf(path.basename(filepath)) === -1) {
result = false;
} else {
result = fileExistsWithCaseSync(dir, cacheSettings);
}
}
cachePath(filepath, result);
return result;
}
function relative(modulePath, sourceFile, settings) {
return fullResolve(modulePath, sourceFile, settings).path;
}
function fullResolve(modulePath, sourceFile, settings) {
// check if this is a bonus core module
var coreSet = new _es6Set2.default(settings['import/core-modules']);
if (coreSet != null && coreSet.has(modulePath)) return { found: true, path: null };
var sourceDir = path.dirname(sourceFile),
cacheKey = sourceDir + hashObject(settings) + modulePath;
var cacheSettings = (0, _objectAssign2.default)({
lifetime: 30 }, settings['import/cache']);
// parse infinity
if (cacheSettings.lifetime === '∞' || cacheSettings.lifetime === 'Infinity') {
cacheSettings.lifetime = Infinity;
}
var cachedPath = checkCache(cacheKey, cacheSettings);
if (cachedPath !== undefined) return { found: true, path: cachedPath };
function cache(resolvedPath) {
cachePath(cacheKey, resolvedPath);
}
function withResolver(resolver, config) {
function v1() {
try {
var _resolved = resolver.resolveImport(modulePath, sourceFile, config);
if (_resolved === undefined) return { found: false };
return { found: true, path: _resolved };
} catch (err) {
return { found: false };
}
}
function v2() {
return resolver.resolve(modulePath, sourceFile, config);
}
switch (resolver.interfaceVersion) {
case 2:
return v2();
default:
case 1:
return v1();
}
}
var configResolvers = settings['import/resolver'] || { 'node': settings['import/resolve'] }; // backward compatibility
var resolvers = resolverReducer(configResolvers, new _es6Map2.default());
var resolved = { found: false };
resolvers.forEach(function (config, name) {
if (!resolved.found) {
var resolver = requireResolver(name, sourceFile);
resolved = withResolver(resolver, config);
if (resolved.found) {
// resolvers imply file existence, this double-check just ensures the case matches
if (fileExistsWithCaseSync(resolved.path, cacheSettings)) {
// else, counts
cache(resolved.path);
} else {
resolved = { found: false };
}
}
}
});
return resolved;
}
function resolverReducer(resolvers, map) {
if (resolvers instanceof Array) {
resolvers.forEach(function (r) {
return resolverReducer(r, map);
});
return map;
}
if (typeof resolvers === 'string') {
map.set(resolvers, null);
return map;
}
if ((typeof resolvers === 'undefined' ? 'undefined' : _typeof(resolvers)) === 'object') {
for (var key in resolvers) {
map.set(key, resolvers[key]);
}
return map;
}
throw new Error('invalid resolver config');
}
function requireResolver(name, sourceFile) {
// Try to resolve package with conventional name
try {
return require('eslint-import-resolver-' + name);
} catch (err) {} /* continue */
// Try to resolve package with custom name (@myorg/resolver-name)
try {
return require(name);
} catch (err) {} /* continue */
// Try to resolve package with path, relative to closest package.json
// or current working directory
try {
var baseDir = _pkgDir2.default.sync(sourceFile) || process.cwd();
// absolute paths ignore base, so this covers both
return require(path.resolve(baseDir, name));
} catch (err) {} /* continue */
// all else failed
throw new Error('unable to load resolver "' + name + '".');
}
var erroredContexts = new _es6Set2.default();
/**
* Given
* @param {string} p - module path
* @param {object} context - ESLint context
* @return {string} - the full module filesystem path;
* null if package is core;
* undefined if not found
*/
function resolve(p, context) {
try {
return relative(p, context.getFilename(), context.settings);
} catch (err) {
if (!erroredContexts.has(context)) {
context.report({
message: 'Resolve error: ' + err.message,
loc: { line: 1, col: 0 }
});
erroredContexts.add(context);
}
}
}
resolve.relative = relative;
function hashObject(object) {
var settingsShasum = (0, _crypto.createHash)('sha1');
settingsShasum.update(JSON.stringify(object));
return settingsShasum.digest('hex');
}
//# sourceMappingURL=data:application/json;base64,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QjtBQUMxQixNQUFNLGlCQUFpQix3QkFBVyxNQUFYLENBQXZCO0FBQ0EsaUJBQWUsTUFBZixDQUFzQixLQUFLLFNBQUwsQ0FBZSxNQUFmLENBQXRCO0FBQ0EsU0FBTyxlQUFlLE1BQWYsQ0FBc0IsS0FBdEIsQ0FBUDtBQUNEIiwiZmlsZSI6ImNvcmUvcmVzb2x2ZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBNYXAgZnJvbSAnZXM2LW1hcCdcbmltcG9ydCBTZXQgZnJvbSAnZXM2LXNldCdcbmltcG9ydCBhc3NpZ24gZnJvbSAnb2JqZWN0LWFzc2lnbidcbmltcG9ydCBwa2dEaXIgZnJvbSAncGtnLWRpcidcblxuaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJ1xuXG5leHBvcnQgY29uc3QgQ0FTRV9TRU5TSVRJVkVfRlMgPSAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oX19kaXJuYW1lLCAncmVTT0xWRS5qcycpKVxuXG5jb25zdCBmaWxlRXhpc3RzQ2FjaGUgPSBuZXcgTWFwKClcblxuZnVuY3Rpb24gY2FjaGVQYXRoKGNhY2hlS2V5LCByZXN1bHQpIHtcbiAgZmlsZUV4aXN0c0NhY2hlLnNldChjYWNoZUtleSwgeyByZXN1bHQsIGxhc3RTZWVuOiBEYXRlLm5vdygpIH0pXG59XG5cbmZ1bmN0aW9uIGNoZWNrQ2FjaGUoY2FjaGVLZXksIHsgbGlmZXRpbWUgfSkge1xuICBpZiAoZmlsZUV4aXN0c0NhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICBjb25zdCB7IHJlc3VsdCwgbGFzdFNlZW4gfSA9IGZpbGVFeGlzdHNDYWNoZS5nZXQoY2FjaGVLZXkpXG4gICAgLy8gY2hlY2sgZnJlc25lc3NcbiAgICBpZiAoRGF0ZS5ub3coKSAtIGxhc3RTZWVuIDwgKGxpZmV0aW1lICogMTAwMCkpIHJldHVybiByZXN1bHRcbiAgfVxuICAvLyBjYWNoZSBtaXNzXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjczODI4MzhcbmZ1bmN0aW9uIGZpbGVFeGlzdHNXaXRoQ2FzZVN5bmMoZmlsZXBhdGgsIGNhY2hlU2V0dGluZ3MpIHtcbiAgLy8gZG9uJ3QgY2FyZSBpZiB0aGUgRlMgaXMgY2FzZS1zZW5zaXRpdmVcbiAgaWYgKENBU0VfU0VOU0lUSVZFX0ZTKSByZXR1cm4gdHJ1ZVxuXG4gIC8vIG51bGwgbWVhbnMgaXQgcmVzb2x2ZWQgdG8gYSBidWlsdGluXG4gIGlmIChmaWxlcGF0aCA9PT0gbnVsbCkgcmV0dXJuIHRydWVcblxuICBjb25zdCBkaXIgPSBwYXRoLmRpcm5hbWUoZmlsZXBhdGgpXG5cbiAgbGV0IHJlc3VsdCA9IGNoZWNrQ2FjaGUoZmlsZXBhdGgsIGNhY2hlU2V0dGluZ3MpXG4gIGlmIChyZXN1bHQgIT0gbnVsbCkgcmV0dXJuIHJlc3VsdFxuXG4gIC8vIGJhc2UgY2FzZVxuICBpZiAoZGlyID09PSAnLycgfHwgZGlyID09PSAnLicgfHwgL15bQS1aXTpcXFxcJC9pLnRlc3QoZGlyKSkge1xuICAgIHJlc3VsdCA9IHRydWVcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBmaWxlbmFtZXMgPSBmcy5yZWFkZGlyU3luYyhkaXIpXG4gICAgaWYgKGZpbGVuYW1lcy5pbmRleE9mKHBhdGguYmFzZW5hbWUoZmlsZXBhdGgpKSA9PT0gLTEpIHtcbiAgICAgIHJlc3VsdCA9IGZhbHNlXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGZpbGVFeGlzdHNXaXRoQ2FzZVN5bmMoZGlyLCBjYWNoZVNldHRpbmdzKVxuICAgIH1cbiAgfVxuICBjYWNoZVBhdGgoZmlsZXBhdGgsIHJlc3VsdClcbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVsYXRpdmUobW9kdWxlUGF0aCwgc291cmNlRmlsZSwgc2V0dGluZ3MpIHtcbiAgcmV0dXJuIGZ1bGxSZXNvbHZlKG1vZHVsZVBhdGgsIHNvdXJjZUZpbGUsIHNldHRpbmdzKS5wYXRoXG59XG5cbmZ1bmN0aW9uIGZ1bGxSZXNvbHZlKG1vZHVsZVBhdGgsIHNvdXJjZUZpbGUsIHNldHRpbmdzKSB7XG4gIC8vIGNoZWNrIGlmIHRoaXMgaXMgYSBib251cyBjb3JlIG1vZHVsZVxuICBjb25zdCBjb3JlU2V0ID0gbmV3IFNldChzZXR0aW5nc1snaW1wb3J0L2NvcmUtbW9kdWxlcyddKVxuICBpZiAoY29yZVNldCAhPSBudWxsICYmIGNvcmVTZXQuaGFzKG1vZHVsZVBhdGgpKSByZXR1cm4geyBmb3VuZDogdHJ1ZSwgcGF0aDogbnVsbCB9XG5cbiAgY29uc3Qgc291cmNlRGlyID0gcGF0aC5kaXJuYW1lKHNvdXJjZUZpbGUpXG4gICAgICAsIGNhY2hlS2V5ID0gc291cmNlRGlyICsgaGFzaE9iamVjdChzZXR0aW5ncykgKyBtb2R1bGVQYXRoXG5cbiAgY29uc3QgY2FjaGVTZXR0aW5ncyA9IGFzc2lnbih7XG4gICAgbGlmZXRpbWU6IDMwLCAgLy8gc2Vjb25kc1xuICB9LCBzZXR0aW5nc1snaW1wb3J0L2NhY2hlJ10pXG5cbiAgLy8gcGFyc2UgaW5maW5pdHlcbiAgaWYgKGNhY2hlU2V0dGluZ3MubGlmZXRpbWUgPT09ICfiiJ4nIHx8IGNhY2hlU2V0dGluZ3MubGlmZXRpbWUgPT09ICdJbmZpbml0eScpIHtcbiAgICBjYWNoZVNldHRpbmdzLmxpZmV0aW1lID0gSW5maW5pdHlcbiAgfVxuXG4gIGNvbnN0IGNhY2hlZFBhdGggPSBjaGVja0NhY2hlKGNhY2hlS2V5LCBjYWNoZVNldHRpbmdzKVxuICBpZiAoY2FjaGVkUGF0aCAhPT0gdW5kZWZpbmVkKSByZXR1cm4geyBmb3VuZDogdHJ1ZSwgcGF0aDogY2FjaGVkUGF0aCB9XG5cbiAgZnVuY3Rpb24gY2FjaGUocmVzb2x2ZWRQYXRoKSB7XG4gICAgY2FjaGVQYXRoKGNhY2hlS2V5LCByZXNvbHZlZFBhdGgpXG4gIH1cblxuICBmdW5jdGlvbiB3aXRoUmVzb2x2ZXIocmVzb2x2ZXIsIGNvbmZpZykge1xuXG4gICAgZnVuY3Rpb24gdjEoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVyLnJlc29sdmVJbXBvcnQobW9kdWxlUGF0aCwgc291cmNlRmlsZSwgY29uZmlnKVxuICAgICAgICBpZiAocmVzb2x2ZWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHsgZm91bmQ6IGZhbHNlIH1cbiAgICAgICAgcmV0dXJuIHsgZm91bmQ6IHRydWUsIHBhdGg6IHJlc29sdmVkIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4geyBmb3VuZDogZmFsc2UgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHYyKCkge1xuICAgICAgcmV0dXJuIHJlc29sdmVyLnJlc29sdmUobW9kdWxlUGF0aCwgc291cmNlRmlsZSwgY29uZmlnKVxuICAgIH1cblxuICAgIHN3aXRjaCAocmVzb2x2ZXIuaW50ZXJmYWNlVmVyc2lvbikge1xuICAgICAgY2FzZSAyOlxuICAgICAgICByZXR1cm4gdjIoKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgY2FzZSAxOlxuICAgICAgICByZXR1cm4gdjEoKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNvbmZpZ1Jlc29sdmVycyA9IChzZXR0aW5nc1snaW1wb3J0L3Jlc29sdmVyJ11cbiAgICB8fCB7ICdub2RlJzogc2V0dGluZ3NbJ2ltcG9ydC9yZXNvbHZlJ10gfSkgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuXG4gIGNvbnN0IHJlc29sdmVycyA9IHJlc29sdmVyUmVkdWNlcihjb25maWdSZXNvbHZlcnMsIG5ldyBNYXAoKSlcblxuICBsZXQgcmVzb2x2ZWQgPSB7IGZvdW5kOiBmYWxzZSB9XG4gIHJlc29sdmVycy5mb3JFYWNoKGZ1bmN0aW9uIChjb25maWcsIG5hbWUpICB7XG4gICAgaWYgKCFyZXNvbHZlZC5mb3VuZCkge1xuICAgICAgY29uc3QgcmVzb2x2ZXIgPSByZXF1aXJlUmVzb2x2ZXIobmFtZSwgc291cmNlRmlsZSlcbiAgICAgIHJlc29sdmVkID0gd2l0aFJlc29sdmVyKHJlc29sdmVyLCBjb25maWcpXG4gICAgICBpZiAocmVzb2x2ZWQuZm91bmQpIHtcbiAgICAgICAgLy8gcmVzb2x2ZXJzIGltcGx5IGZpbGUgZXhpc3RlbmNlLCB0aGlzIGRvdWJsZS1jaGVjayBqdXN0IGVuc3VyZXMgdGhlIGNhc2UgbWF0Y2hlc1xuICAgICAgICBpZiAoZmlsZUV4aXN0c1dpdGhDYXNlU3luYyhyZXNvbHZlZC5wYXRoLCBjYWNoZVNldHRpbmdzKSkge1xuICAgICAgICAgIC8vIGVsc2UsIGNvdW50c1xuICAgICAgICAgIGNhY2hlKHJlc29sdmVkLnBhdGgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZWQgPSB7IGZvdW5kOiBmYWxzZSB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIHJlc29sdmVkXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVyUmVkdWNlcihyZXNvbHZlcnMsIG1hcCkge1xuICBpZiAocmVzb2x2ZXJzIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICByZXNvbHZlcnMuZm9yRWFjaChyID0+IHJlc29sdmVyUmVkdWNlcihyLCBtYXApKVxuICAgIHJldHVybiBtYXBcbiAgfVxuXG4gIGlmICh0eXBlb2YgcmVzb2x2ZXJzID09PSAnc3RyaW5nJykge1xuICAgIG1hcC5zZXQocmVzb2x2ZXJzLCBudWxsKVxuICAgIHJldHVybiBtYXBcbiAgfVxuXG4gIGlmICh0eXBlb2YgcmVzb2x2ZXJzID09PSAnb2JqZWN0Jykge1xuICAgIGZvciAobGV0IGtleSBpbiByZXNvbHZlcnMpIHtcbiAgICAgIG1hcC5zZXQoa2V5LCByZXNvbHZlcnNba2V5XSlcbiAgICB9XG4gICAgcmV0dXJuIG1hcFxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJlc29sdmVyIGNvbmZpZycpXG59XG5cbmZ1bmN0aW9uIHJlcXVpcmVSZXNvbHZlcihuYW1lLCBzb3VyY2VGaWxlKSB7XG4gIC8vIFRyeSB0byByZXNvbHZlIHBhY2thZ2Ugd2l0aCBjb252ZW50aW9uYWwgbmFtZVxuICB0cnkge1xuICAgIHJldHVybiByZXF1aXJlKGBlc2xpbnQtaW1wb3J0LXJlc29sdmVyLSR7bmFtZX1gKVxuICB9IGNhdGNoIChlcnIpIHsgLyogY29udGludWUgKi8gfVxuXG4gIC8vIFRyeSB0byByZXNvbHZlIHBhY2thZ2Ugd2l0aCBjdXN0b20gbmFtZSAoQG15b3JnL3Jlc29sdmVyLW5hbWUpXG4gIHRyeSB7XG4gICAgcmV0dXJuIHJlcXVpcmUobmFtZSlcbiAgfSBjYXRjaCAoZXJyKSB7IC8qIGNvbnRpbnVlICovIH1cblxuICAvLyBUcnkgdG8gcmVzb2x2ZSBwYWNrYWdlIHdpdGggcGF0aCwgcmVsYXRpdmUgdG8gY2xvc2VzdCBwYWNrYWdlLmpzb25cbiAgLy8gb3IgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeVxuICB0cnkge1xuICAgIGNvbnN0IGJhc2VEaXIgPSBwa2dEaXIuc3luYyhzb3VyY2VGaWxlKSB8fCBwcm9jZXNzLmN3ZCgpXG4gICAgLy8gYWJzb2x1dGUgcGF0aHMgaWdub3JlIGJhc2UsIHNvIHRoaXMgY292ZXJzIGJvdGhcbiAgICByZXR1cm4gcmVxdWlyZShwYXRoLnJlc29sdmUoYmFzZURpciwgbmFtZSkpXG4gIH0gY2F0Y2ggKGVycikgeyAvKiBjb250aW51ZSAqLyB9XG5cbiAgLy8gYWxsIGVsc2UgZmFpbGVkXG4gIHRocm93IG5ldyBFcnJvcihgdW5hYmxlIHRvIGxvYWQgcmVzb2x2ZXIgXCIke25hbWV9XCIuYClcbn1cblxuY29uc3QgZXJyb3JlZENvbnRleHRzID0gbmV3IFNldCgpXG5cbi8qKlxuICogR2l2ZW5cbiAqIEBwYXJhbSAge3N0cmluZ30gcCAtIG1vZHVsZSBwYXRoXG4gKiBAcGFyYW0gIHtvYmplY3R9IGNvbnRleHQgLSBFU0xpbnQgY29udGV4dFxuICogQHJldHVybiB7c3RyaW5nfSAtIHRoZSBmdWxsIG1vZHVsZSBmaWxlc3lzdGVtIHBhdGg7XG4gKiAgICAgICAgICAgICAgICAgICAgbnVsbCBpZiBwYWNrYWdlIGlzIGNvcmU7XG4gKiAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZXNvbHZlKHAsIGNvbnRleHQpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcmVsYXRpdmUoIHBcbiAgICAgICAgICAgICAgICAgICAsIGNvbnRleHQuZ2V0RmlsZW5hbWUoKVxuICAgICAgICAgICAgICAgICAgICwgY29udGV4dC5zZXR0aW5nc1xuICAgICAgICAgICAgICAgICAgIClcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKCFlcnJvcmVkQ29udGV4dHMuaGFzKGNvbnRleHQpKSB7XG4gICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgIG1lc3NhZ2U6IGBSZXNvbHZlIGVycm9yOiAke2Vyci5tZXNzYWdlfWAsXG4gICAgICAgIGxvYzogeyBsaW5lOiAxLCBjb2w6IDAgfSxcbiAgICAgIH0pXG4gICAgICBlcnJvcmVkQ29udGV4dHMuYWRkKGNvbnRleHQpXG4gICAgfVxuICB9XG59XG5yZXNvbHZlLnJlbGF0aXZlID0gcmVsYXRpdmVcblxuXG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnY3J5cHRvJ1xuZnVuY3Rpb24gaGFzaE9iamVjdChvYmplY3QpIHtcbiAgY29uc3Qgc2V0dGluZ3NTaGFzdW0gPSBjcmVhdGVIYXNoKCdzaGExJylcbiAgc2V0dGluZ3NTaGFzdW0udXBkYXRlKEpTT04uc3RyaW5naWZ5KG9iamVjdCkpXG4gIHJldHVybiBzZXR0aW5nc1NoYXN1bS5kaWdlc3QoJ2hleCcpXG59XG4iXX0=
;