electron-compile
Version:
Electron supporting package to compile JS and CSS in Electron applications
492 lines (372 loc) • 30.1 kB
JavaScript
'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