UNPKG

electron-compile

Version:

Electron supporting package to compile JS and CSS in Electron applications

492 lines (372 loc) 30.1 kB
#!/usr/bin/env node 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.packagerMain = exports.runAsarArchive = exports.packageDirToResourcesDir = undefined; var _getIterator2 = require('babel-runtime/core-js/get-iterator'); var _getIterator3 = _interopRequireDefault(_getIterator2); var _stringify = require('babel-runtime/core-js/json/stringify'); var _stringify2 = _interopRequireDefault(_stringify); var _regenerator = require('babel-runtime/regenerator'); var _regenerator2 = _interopRequireDefault(_regenerator); var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator'); var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); var packageDirToResourcesDir = exports.packageDirToResourcesDir = function () { var _ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee(packageDir) { var appDir; return _regenerator2.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return _promise.pfs.readdir(packageDir); case 2: _context.t0 = function (x) { return x.match(/\.app$/i); }; appDir = _context.sent.find(_context.t0); if (!appDir) { _context.next = 8; break; } return _context.abrupt('return', _path2.default.join(packageDir, appDir, 'Contents', 'Resources', 'app')); case 8: return _context.abrupt('return', _path2.default.join(packageDir, 'resources', 'app')); case 9: case 'end': return _context.stop(); } } }, _callee, this); })); return function packageDirToResourcesDir(_x) { return _ref.apply(this, arguments); }; }(); var copySmallFile = function () { var _ref2 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee2(from, to) { var buf; return _regenerator2.default.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: d('Copying ' + from + ' => ' + to); _context2.next = 3; return _promise.pfs.readFile(from); case 3: buf = _context2.sent; _context2.next = 6; return _promise.pfs.writeFile(to, buf); case 6: case 'end': return _context2.stop(); } } }, _callee2, this); })); return function copySmallFile(_x2, _x3) { return _ref2.apply(this, arguments); }; }(); var compileAndShim = function () { var _ref3 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee3(packageDir) { var appDir, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, entry, fullPath, stat, packageJson, index; return _regenerator2.default.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: _context3.next = 2; return packageDirToResourcesDir(packageDir); case 2: appDir = _context3.sent; d('Looking in ' + appDir); _iteratorNormalCompletion = true; _didIteratorError = false; _iteratorError = undefined; _context3.prev = 7; _context3.next = 10; return _promise.pfs.readdir(appDir); case 10: _context3.t0 = _context3.sent; _iterator = (0, _getIterator3.default)(_context3.t0); case 12: if (_iteratorNormalCompletion = (_step = _iterator.next()).done) { _context3.next = 28; break; } entry = _step.value; if (!entry.match(/^(node_modules|bower_components)$/)) { _context3.next = 16; break; } return _context3.abrupt('continue', 25); case 16: fullPath = _path2.default.join(appDir, entry); _context3.next = 19; return _promise.pfs.stat(fullPath); case 19: stat = _context3.sent; if (stat.isDirectory()) { _context3.next = 22; break; } return _context3.abrupt('continue', 25); case 22: d('Executing electron-compile: ' + appDir + ' => ' + entry); _context3.next = 25; return (0, _cli.main)(appDir, [fullPath]); case 25: _iteratorNormalCompletion = true; _context3.next = 12; break; case 28: _context3.next = 34; break; case 30: _context3.prev = 30; _context3.t1 = _context3['catch'](7); _didIteratorError = true; _iteratorError = _context3.t1; case 34: _context3.prev = 34; _context3.prev = 35; if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } case 37: _context3.prev = 37; if (!_didIteratorError) { _context3.next = 40; break; } throw _iteratorError; case 40: return _context3.finish(37); case 41: return _context3.finish(34); case 42: d('Copying in es6-shim'); _context3.t2 = JSON; _context3.next = 46; return _promise.pfs.readFile(_path2.default.join(appDir, 'package.json'), 'utf8'); case 46: _context3.t3 = _context3.sent; packageJson = _context3.t2.parse.call(_context3.t2, _context3.t3); index = packageJson.main || 'index.js'; packageJson.originalMain = index; packageJson.main = 'es6-shim.js'; _context3.next = 53; return copySmallFile(_path2.default.join(__dirname, 'es6-shim.js'), _path2.default.join(appDir, 'es6-shim.js')); case 53: _context3.next = 55; return _promise.pfs.writeFile(_path2.default.join(appDir, 'package.json'), (0, _stringify2.default)(packageJson, null, 2)); case 55: case 'end': return _context3.stop(); } } }, _callee3, this, [[7, 30, 34, 42], [35,, 37, 41]]); })); return function compileAndShim(_x4) { return _ref3.apply(this, arguments); }; }(); var runAsarArchive = exports.runAsarArchive = function () { var _ref4 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee4(packageDir, asarUnpackDir) { var appDir, asarArgs, _findExecutableOrGues, cmd, args; return _regenerator2.default.wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: _context4.next = 2; return packageDirToResourcesDir(packageDir); case 2: appDir = _context4.sent; asarArgs = ['pack', 'app', 'app.asar']; if (asarUnpackDir) { asarArgs.push('--unpack-dir', asarUnpackDir); } _findExecutableOrGues = findExecutableOrGuess('asar', asarArgs); cmd = _findExecutableOrGues.cmd; args = _findExecutableOrGues.args; d('Running ' + cmd + ' ' + (0, _stringify2.default)(args)); _context4.next = 11; return (0, _spawnRx.spawnPromise)(cmd, args, { cwd: _path2.default.join(appDir, '..') }); case 11: _rimraf2.default.sync(_path2.default.join(appDir)); case 12: case 'end': return _context4.stop(); } } }, _callee4, this); })); return function runAsarArchive(_x5, _x6) { return _ref4.apply(this, arguments); }; }(); var packagerMain = exports.packagerMain = function () { var _ref5 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee5(argv) { var _splitOutAsarArgument, packagerArgs, asarArgs, _findExecutableOrGues2, cmd, args, packagerOutput, packageDirs, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, packageDir, asarUnpackDir; return _regenerator2.default.wrap(function _callee5$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: d('argv: ' + (0, _stringify2.default)(argv)); argv = argv.splice(2); _splitOutAsarArgument = splitOutAsarArguments(argv); packagerArgs = _splitOutAsarArgument.packagerArgs; asarArgs = _splitOutAsarArgument.asarArgs; _findExecutableOrGues2 = findExecutableOrGuess(electronPackager, packagerArgs); cmd = _findExecutableOrGues2.cmd; args = _findExecutableOrGues2.args; d('Spawning electron-packager: ' + (0, _stringify2.default)(args)); _context5.next = 11; return (0, _spawnRx.spawnPromise)(cmd, args); case 11: packagerOutput = _context5.sent; packageDirs = parsePackagerOutput(packagerOutput); d('Starting compilation for ' + (0, _stringify2.default)(packageDirs)); _iteratorNormalCompletion2 = true; _didIteratorError2 = false; _iteratorError2 = undefined; _context5.prev = 17; _iterator2 = (0, _getIterator3.default)(packageDirs); case 19: if (_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done) { _context5.next = 33; break; } packageDir = _step2.value; _context5.next = 23; return compileAndShim(packageDir); case 23: if (asarArgs) { _context5.next = 25; break; } return _context5.abrupt('continue', 30); case 25: d('Starting ASAR packaging'); asarUnpackDir = null; if (asarArgs.length === 2) { asarUnpackDir = asarArgs[1]; } _context5.next = 30; return runAsarArchive(packageDir, asarUnpackDir); case 30: _iteratorNormalCompletion2 = true; _context5.next = 19; break; case 33: _context5.next = 39; break; case 35: _context5.prev = 35; _context5.t0 = _context5['catch'](17); _didIteratorError2 = true; _iteratorError2 = _context5.t0; case 39: _context5.prev = 39; _context5.prev = 40; if (!_iteratorNormalCompletion2 && _iterator2.return) { _iterator2.return(); } case 42: _context5.prev = 42; if (!_didIteratorError2) { _context5.next = 45; break; } throw _iteratorError2; case 45: return _context5.finish(42); case 46: return _context5.finish(39); case 47: case 'end': return _context5.stop(); } } }, _callee5, this, [[17, 35, 39, 47], [40,, 42, 46]]); })); return function packagerMain(_x7) { return _ref5.apply(this, arguments); }; }(); exports.splitOutAsarArguments = splitOutAsarArguments; exports.parsePackagerOutput = parsePackagerOutput; exports.findExecutableOrGuess = findExecutableOrGuess; require('./babel-maybefill'); var _path = require('path'); var _path2 = _interopRequireDefault(_path); var _rimraf = require('rimraf'); var _rimraf2 = _interopRequireDefault(_rimraf); var _promise = require('./promise'); var _cli = require('./cli'); var _spawnRx = require('spawn-rx'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var d = require('debug-electron')('electron-compile:packager'); var electronPackager = 'electron-packager'; function splitOutAsarArguments(argv) { if (argv.find(function (x) { return x.match(/^--asar-unpack$/); })) { throw new Error("electron-compile doesn't support --asar-unpack at the moment, use asar-unpack-dir"); } // Strip --asar altogether var ret = argv.filter(function (x) { return !x.match(/^--asar/); }); if (ret.length === argv.length) { return { packagerArgs: ret, asarArgs: null }; } var indexOfUnpack = ret.findIndex(function (x) { return x.match(/^--asar-unpack-dir$/); }); if (indexOfUnpack < 0) { return { packagerArgs: ret, asarArgs: [] }; } var unpackArgs = ret.slice(indexOfUnpack, indexOfUnpack + 1); var notUnpackArgs = ret.slice(0, indexOfUnpack).concat(ret.slice(indexOfUnpack + 2)); return { packagerArgs: notUnpackArgs, asarArgs: unpackArgs }; } function parsePackagerOutput(output) { // NB: Yes, this is fragile as fuck. :-/ console.log(output); var lines = output.split('\n'); var idx = lines.findIndex(function (x) { return x.match(/Wrote new app/i); }); if (idx < 1) throw new Error('Packager output is invalid: ' + output); lines = lines.splice(idx); // Multi-platform case if (lines[0].match(/Wrote new apps/)) { return lines.splice(1).filter(function (x) { return x.length > 1; }); } else { return [lines[0].replace(/^.*new app to /, '')]; } } function findExecutableOrGuess(cmdToFind, argsToUse) { var _findActualExecutable = (0, _spawnRx.findActualExecutable)(cmdToFind, argsToUse); var cmd = _findActualExecutable.cmd; var args = _findActualExecutable.args; if (cmd === electronPackager) { d('Can\'t find ' + cmdToFind + ', falling back to where it should be as a guess!'); cmd = (0, _spawnRx.findActualExecutable)(_path2.default.resolve(__dirname, '..', '..', '.bin', cmdToFind)).cmd; } return { cmd: cmd, args: args }; } if (process.mainModule === module) { packagerMain(process.argv).then(function () { return process.exit(0); }).catch(function (e) { console.error(e.message || e); d(e.stack); process.exit(-1); }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9wYWNrYWdlci1jbGkuanMiXSwibmFtZXMiOlsicGFja2FnZURpciIsInJlYWRkaXIiLCJ4IiwibWF0Y2giLCJhcHBEaXIiLCJmaW5kIiwiam9pbiIsInBhY2thZ2VEaXJUb1Jlc291cmNlc0RpciIsImZyb20iLCJ0byIsImQiLCJyZWFkRmlsZSIsImJ1ZiIsIndyaXRlRmlsZSIsImNvcHlTbWFsbEZpbGUiLCJlbnRyeSIsImZ1bGxQYXRoIiwic3RhdCIsImlzRGlyZWN0b3J5IiwiSlNPTiIsInBhY2thZ2VKc29uIiwicGFyc2UiLCJpbmRleCIsIm1haW4iLCJvcmlnaW5hbE1haW4iLCJfX2Rpcm5hbWUiLCJjb21waWxlQW5kU2hpbSIsImFzYXJVbnBhY2tEaXIiLCJhc2FyQXJncyIsInB1c2giLCJmaW5kRXhlY3V0YWJsZU9yR3Vlc3MiLCJjbWQiLCJhcmdzIiwiY3dkIiwic3luYyIsInJ1bkFzYXJBcmNoaXZlIiwiYXJndiIsInNwbGljZSIsInNwbGl0T3V0QXNhckFyZ3VtZW50cyIsInBhY2thZ2VyQXJncyIsImVsZWN0cm9uUGFja2FnZXIiLCJwYWNrYWdlck91dHB1dCIsInBhY2thZ2VEaXJzIiwicGFyc2VQYWNrYWdlck91dHB1dCIsImxlbmd0aCIsInBhY2thZ2VyTWFpbiIsInJlcXVpcmUiLCJFcnJvciIsInJldCIsImZpbHRlciIsImluZGV4T2ZVbnBhY2siLCJmaW5kSW5kZXgiLCJ1bnBhY2tBcmdzIiwic2xpY2UiLCJub3RVbnBhY2tBcmdzIiwiY29uY2F0Iiwib3V0cHV0IiwiY29uc29sZSIsImxvZyIsImxpbmVzIiwic3BsaXQiLCJpZHgiLCJyZXBsYWNlIiwiY21kVG9GaW5kIiwiYXJnc1RvVXNlIiwicmVzb2x2ZSIsInByb2Nlc3MiLCJtYWluTW9kdWxlIiwibW9kdWxlIiwidGhlbiIsImV4aXQiLCJjYXRjaCIsImUiLCJlcnJvciIsIm1lc3NhZ2UiLCJzdGFjayJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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MUQsTUFBSUQsUUFBUVMsZ0JBQVosRUFBOEI7QUFDNUI5Qix1QkFBZ0JxRCxTQUFoQjtBQUNBaEMsVUFBTSxtQ0FBcUIsZUFBS2tDLE9BQUwsQ0FBYXhDLFNBQWIsRUFBd0IsSUFBeEIsRUFBOEIsSUFBOUIsRUFBb0MsTUFBcEMsRUFBNENzQyxTQUE1QyxDQUFyQixFQUE2RWhDLEdBQW5GO0FBQ0Q7O0FBRUQsU0FBTyxFQUFFQSxRQUFGLEVBQU9DLFVBQVAsRUFBUDtBQUNEOztBQTZCRCxJQUFJa0MsUUFBUUMsVUFBUixLQUF1QkMsTUFBM0IsRUFBbUM7QUFDakN2QixlQUFhcUIsUUFBUTlCLElBQXJCLEVBQ0dpQyxJQURILENBQ1E7QUFBQSxXQUFNSCxRQUFRSSxJQUFSLENBQWEsQ0FBYixDQUFOO0FBQUEsR0FEUixFQUVHQyxLQUZILENBRVMsVUFBQ0MsQ0FBRCxFQUFPO0FBQ1pmLFlBQVFnQixLQUFSLENBQWNELEVBQUVFLE9BQUYsSUFBYUYsQ0FBM0I7QUFDQTlELE1BQUU4RCxFQUFFRyxLQUFKOztBQUVBVCxZQUFRSSxJQUFSLENBQWEsQ0FBQyxDQUFkO0FBQ0QsR0FQSDtBQVFEIiwiZmlsZSI6InBhY2thZ2VyLWNsaS5qcyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0ICcuL2JhYmVsLW1heWJlZmlsbCc7XG5cbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHJpbXJhZiBmcm9tICdyaW1yYWYnO1xuXG5pbXBvcnQge3Bmc30gZnJvbSAnLi9wcm9taXNlJztcbmltcG9ydCB7bWFpbn0gZnJvbSAnLi9jbGknO1xuXG5pbXBvcnQge3NwYXduUHJvbWlzZSwgZmluZEFjdHVhbEV4ZWN1dGFibGV9IGZyb20gJ3NwYXduLXJ4JztcblxuY29uc3QgZCA9IHJlcXVpcmUoJ2RlYnVnLWVsZWN0cm9uJykoJ2VsZWN0cm9uLWNvbXBpbGU6cGFja2FnZXInKTtcbmNvbnN0IGVsZWN0cm9uUGFja2FnZXIgPSAnZWxlY3Ryb24tcGFja2FnZXInO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFja2FnZURpclRvUmVzb3VyY2VzRGlyKHBhY2thZ2VEaXIpIHtcbiAgbGV0IGFwcERpciA9IChhd2FpdCBwZnMucmVhZGRpcihwYWNrYWdlRGlyKSkuZmluZCgoeCkgPT4geC5tYXRjaCgvXFwuYXBwJC9pKSk7XG4gIGlmIChhcHBEaXIpIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHBhY2thZ2VEaXIsIGFwcERpciwgJ0NvbnRlbnRzJywgJ1Jlc291cmNlcycsICdhcHAnKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHBhY2thZ2VEaXIsICdyZXNvdXJjZXMnLCAnYXBwJyk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY29weVNtYWxsRmlsZShmcm9tLCB0bykge1xuICBkKGBDb3B5aW5nICR7ZnJvbX0gPT4gJHt0b31gKTtcblxuICBsZXQgYnVmID0gYXdhaXQgcGZzLnJlYWRGaWxlKGZyb20pO1xuICBhd2FpdCBwZnMud3JpdGVGaWxlKHRvLCBidWYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRPdXRBc2FyQXJndW1lbnRzKGFyZ3YpIHtcbiAgaWYgKGFyZ3YuZmluZCgoeCkgPT4geC5tYXRjaCgvXi0tYXNhci11bnBhY2skLykpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiZWxlY3Ryb24tY29tcGlsZSBkb2Vzbid0IHN1cHBvcnQgLS1hc2FyLXVucGFjayBhdCB0aGUgbW9tZW50LCB1c2UgYXNhci11bnBhY2stZGlyXCIpO1xuICB9XG5cbiAgLy8gU3RyaXAgLS1hc2FyIGFsdG9nZXRoZXJcbiAgbGV0IHJldCA9IGFyZ3YuZmlsdGVyKCh4KSA9PiAheC5tYXRjaCgvXi0tYXNhci8pKTtcblxuICBpZiAocmV0Lmxlbmd0aCA9PT0gYXJndi5sZW5ndGgpIHsgcmV0dXJuIHsgcGFja2FnZXJBcmdzOiByZXQsIGFzYXJBcmdzOiBudWxsIH07IH1cblxuICBsZXQgaW5kZXhPZlVucGFjayA9IHJldC5maW5kSW5kZXgoKHgpID0+IHgubWF0Y2goL14tLWFzYXItdW5wYWNrLWRpciQvKSk7XG4gIGlmIChpbmRleE9mVW5wYWNrIDwgMCkge1xuICAgIHJldHVybiB7IHBhY2thZ2VyQXJnczogcmV0LCBhc2FyQXJnczogW10gfTtcbiAgfVxuXG4gIGxldCB1bnBhY2tBcmdzID0gcmV0LnNsaWNlKGluZGV4T2ZVbnBhY2ssIGluZGV4T2ZVbnBhY2srMSk7XG4gIGxldCBub3RVbnBhY2tBcmdzID0gcmV0LnNsaWNlKDAsIGluZGV4T2ZVbnBhY2spLmNvbmNhdChyZXQuc2xpY2UoaW5kZXhPZlVucGFjaysyKSk7XG5cbiAgcmV0dXJuIHsgcGFja2FnZXJBcmdzOiBub3RVbnBhY2tBcmdzLCBhc2FyQXJnczogdW5wYWNrQXJncyB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQYWNrYWdlck91dHB1dChvdXRwdXQpIHtcbiAgLy8gTkI6IFllcywgdGhpcyBpcyBmcmFnaWxlIGFzIGZ1Y2suIDotL1xuICBjb25zb2xlLmxvZyhvdXRwdXQpO1xuICBsZXQgbGluZXMgPSBvdXRwdXQuc3BsaXQoJ1xcbicpO1xuXG4gIGxldCBpZHggPSBsaW5lcy5maW5kSW5kZXgoKHgpID0+IHgubWF0Y2goL1dyb3RlIG5ldyBhcHAvaSkpO1xuICBpZiAoaWR4IDwgMSkgdGhyb3cgbmV3IEVycm9yKGBQYWNrYWdlciBvdXRwdXQgaXMgaW52YWxpZDogJHtvdXRwdXR9YCk7XG4gIGxpbmVzID0gbGluZXMuc3BsaWNlKGlkeCk7XG5cbiAgLy8gTXVsdGktcGxhdGZvcm0gY2FzZVxuICBpZiAobGluZXNbMF0ubWF0Y2goL1dyb3RlIG5ldyBhcHBzLykpIHtcbiAgICByZXR1cm4gbGluZXMuc3BsaWNlKDEpLmZpbHRlcigoeCkgPT4geC5sZW5ndGggPiAxKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gW2xpbmVzWzBdLnJlcGxhY2UoL14uKm5ldyBhcHAgdG8gLywgJycpXTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjb21waWxlQW5kU2hpbShwYWNrYWdlRGlyKSB7XG4gIGxldCBhcHBEaXIgPSBhd2FpdCBwYWNrYWdlRGlyVG9SZXNvdXJjZXNEaXIocGFja2FnZURpcik7XG5cbiAgZChgTG9va2luZyBpbiAke2FwcERpcn1gKTtcbiAgZm9yIChsZXQgZW50cnkgb2YgYXdhaXQgcGZzLnJlYWRkaXIoYXBwRGlyKSkge1xuICAgIGlmIChlbnRyeS5tYXRjaCgvXihub2RlX21vZHVsZXN8Ym93ZXJfY29tcG9uZW50cykkLykpIGNvbnRpbnVlO1xuXG4gICAgbGV0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGFwcERpciwgZW50cnkpO1xuICAgIGxldCBzdGF0ID0gYXdhaXQgcGZzLnN0YXQoZnVsbFBhdGgpO1xuXG4gICAgaWYgKCFzdGF0LmlzRGlyZWN0b3J5KCkpIGNvbnRpbnVlO1xuXG4gICAgZChgRXhlY3V0aW5nIGVsZWN0cm9uLWNvbXBpbGU6ICR7YXBwRGlyfSA9PiAke2VudHJ5fWApO1xuICAgIGF3YWl0IG1haW4oYXBwRGlyLCBbZnVsbFBhdGhdKTtcbiAgfVxuXG4gIGQoJ0NvcHlpbmcgaW4gZXM2LXNoaW0nKTtcbiAgbGV0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShcbiAgICBhd2FpdCBwZnMucmVhZEZpbGUocGF0aC5qb2luKGFwcERpciwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKTtcblxuICBsZXQgaW5kZXggPSBwYWNrYWdlSnNvbi5tYWluIHx8ICdpbmRleC5qcyc7XG4gIHBhY2thZ2VKc29uLm9yaWdpbmFsTWFpbiA9IGluZGV4O1xuICBwYWNrYWdlSnNvbi5tYWluID0gJ2VzNi1zaGltLmpzJztcblxuICBhd2FpdCBjb3B5U21hbGxGaWxlKFxuICAgIHBhdGguam9pbihfX2Rpcm5hbWUsICdlczYtc2hpbS5qcycpLFxuICAgIHBhdGguam9pbihhcHBEaXIsICdlczYtc2hpbS5qcycpKTtcblxuICBhd2FpdCBwZnMud3JpdGVGaWxlKFxuICAgIHBhdGguam9pbihhcHBEaXIsICdwYWNrYWdlLmpzb24nKSxcbiAgICBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiwgbnVsbCwgMikpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQXNhckFyY2hpdmUocGFja2FnZURpciwgYXNhclVucGFja0Rpcikge1xuICBsZXQgYXBwRGlyID0gYXdhaXQgcGFja2FnZURpclRvUmVzb3VyY2VzRGlyKHBhY2thZ2VEaXIpO1xuXG4gIGxldCBhc2FyQXJncyA9IFsncGFjaycsICdhcHAnLCAnYXBwLmFzYXInXTtcbiAgaWYgKGFzYXJVbnBhY2tEaXIpIHtcbiAgICBhc2FyQXJncy5wdXNoKCctLXVucGFjay1kaXInLCBhc2FyVW5wYWNrRGlyKTtcbiAgfVxuXG4gIGxldCB7IGNtZCwgYXJncyB9ID0gZmluZEV4ZWN1dGFibGVPckd1ZXNzKCdhc2FyJywgYXNhckFyZ3MpO1xuXG4gIGQoYFJ1bm5pbmcgJHtjbWR9ICR7SlNPTi5zdHJpbmdpZnkoYXJncyl9YCk7XG4gIGF3YWl0IHNwYXduUHJvbWlzZShjbWQsIGFyZ3MsIHsgY3dkOiBwYXRoLmpvaW4oYXBwRGlyLCAnLi4nKSB9KTtcbiAgcmltcmFmLnN5bmMocGF0aC5qb2luKGFwcERpcikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZEV4ZWN1dGFibGVPckd1ZXNzKGNtZFRvRmluZCwgYXJnc1RvVXNlKSB7XG4gIGxldCB7IGNtZCwgYXJncyB9ID0gZmluZEFjdHVhbEV4ZWN1dGFibGUoY21kVG9GaW5kLCBhcmdzVG9Vc2UpO1xuICBpZiAoY21kID09PSBlbGVjdHJvblBhY2thZ2VyKSB7XG4gICAgZChgQ2FuJ3QgZmluZCAke2NtZFRvRmluZH0sIGZhbGxpbmcgYmFjayB0byB3aGVyZSBpdCBzaG91bGQgYmUgYXMgYSBndWVzcyFgKTtcbiAgICBjbWQgPSBmaW5kQWN0dWFsRXhlY3V0YWJsZShwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAnLmJpbicsIGNtZFRvRmluZCkpLmNtZDtcbiAgfVxuXG4gIHJldHVybiB7IGNtZCwgYXJncyB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFja2FnZXJNYWluKGFyZ3YpIHtcbiAgZChgYXJndjogJHtKU09OLnN0cmluZ2lmeShhcmd2KX1gKTtcbiAgYXJndiA9IGFyZ3Yuc3BsaWNlKDIpO1xuXG4gIGxldCB7IHBhY2thZ2VyQXJncywgYXNhckFyZ3MgfSA9IHNwbGl0T3V0QXNhckFyZ3VtZW50cyhhcmd2KTtcbiAgbGV0IHsgY21kLCBhcmdzIH0gPSBmaW5kRXhlY3V0YWJsZU9yR3Vlc3MoZWxlY3Ryb25QYWNrYWdlciwgcGFja2FnZXJBcmdzKTtcblxuICBkKGBTcGF3bmluZyBlbGVjdHJvbi1wYWNrYWdlcjogJHtKU09OLnN0cmluZ2lmeShhcmdzKX1gKTtcbiAgbGV0IHBhY2thZ2VyT3V0cHV0ID0gYXdhaXQgc3Bhd25Qcm9taXNlKGNtZCwgYXJncyk7XG4gIGxldCBwYWNrYWdlRGlycyA9IHBhcnNlUGFja2FnZXJPdXRwdXQocGFja2FnZXJPdXRwdXQpO1xuXG4gIGQoYFN0YXJ0aW5nIGNvbXBpbGF0aW9uIGZvciAke0pTT04uc3RyaW5naWZ5KHBhY2thZ2VEaXJzKX1gKTtcbiAgZm9yIChsZXQgcGFja2FnZURpciBvZiBwYWNrYWdlRGlycykge1xuICAgIGF3YWl0IGNvbXBpbGVBbmRTaGltKHBhY2thZ2VEaXIpO1xuXG4gICAgaWYgKCFhc2FyQXJncykgY29udGludWU7XG5cbiAgICBkKCdTdGFydGluZyBBU0FSIHBhY2thZ2luZycpO1xuICAgIGxldCBhc2FyVW5wYWNrRGlyID0gbnVsbDtcbiAgICBpZiAoYXNhckFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICBhc2FyVW5wYWNrRGlyID0gYXNhckFyZ3NbMV07XG4gICAgfVxuXG4gICAgYXdhaXQgcnVuQXNhckFyY2hpdmUocGFja2FnZURpciwgYXNhclVucGFja0Rpcik7XG4gIH1cbn1cblxuaWYgKHByb2Nlc3MubWFpbk1vZHVsZSA9PT0gbW9kdWxlKSB7XG4gIHBhY2thZ2VyTWFpbihwcm9jZXNzLmFyZ3YpXG4gICAgLnRoZW4oKCkgPT4gcHJvY2Vzcy5leGl0KDApKVxuICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcihlLm1lc3NhZ2UgfHwgZSk7XG4gICAgICBkKGUuc3RhY2spO1xuXG4gICAgICBwcm9jZXNzLmV4aXQoLTEpO1xuICAgIH0pO1xufVxuIl19