electron-forge
Version:
A complete tool for building modern Electron applications
529 lines (401 loc) • 34.1 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _getIterator2 = require('babel-runtime/core-js/get-iterator');
var _getIterator3 = _interopRequireDefault(_getIterator2);
var _regenerator = require('babel-runtime/regenerator');
var _regenerator2 = _interopRequireDefault(_regenerator);
var _assign = require('babel-runtime/core-js/object/assign');
var _assign2 = _interopRequireDefault(_assign);
var _bluebird = require('bluebird');
require('colors');
var _fsExtra = require('fs-extra');
var _fsExtra2 = _interopRequireDefault(_fsExtra);
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _oraHandler = require('../util/ora-handler');
var _oraHandler2 = _interopRequireDefault(_oraHandler);
var _electronHostArch = require('../util/electron-host-arch');
var _electronHostArch2 = _interopRequireDefault(_electronHostArch);
var _forgeConfig = require('../util/forge-config');
var _forgeConfig2 = _interopRequireDefault(_forgeConfig);
var _hook = require('../util/hook');
var _hook2 = _interopRequireDefault(_hook);
var _messages = require('../util/messages');
var _readPackageJson = require('../util/read-package-json');
var _readPackageJson2 = _interopRequireDefault(_readPackageJson);
var _requireSearch = require('../util/require-search');
var _resolveDir = require('../util/resolve-dir');
var _resolveDir2 = _interopRequireDefault(_resolveDir);
var _package = require('./package');
var _package2 = _interopRequireDefault(_package);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* @typedef {Object} MakeOptions
* @property {string} [dir=process.cwd()] The path to the app from which distributables are generated
* @property {boolean} [interactive=false] Whether to use sensible defaults or prompt the user visually
* @property {boolean} [skipPackage=false] Whether to skip the pre-make packaging step
* @property {Array<string>} [overrideTargets] An array of make targets to override your forge config
* @property {string} [arch=host architecture] The target architecture
* @property {string} [platform=process.platform] The target platform.
* @property {string} [outDir=`${dir}/out`] The path to the directory containing generated distributables
*/
/**
* Make distributables for an Electron application.
*
* @param {MakeOptions} providedOptions - Options for the make method
* @return {Promise} Will resolve when the make process is complete
*/
exports.default = function () {
var _ref = (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee3() {
var providedOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var _Object$assign, dir, interactive, skipPackage, overrideTargets, arch, platform, outDir, forgeConfig, makers, targets, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, target, maker, declaredArch, targetArchs, packageJSON, appName, outputs, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _loop, _iterator2, _step2, result;
return _regenerator2.default.wrap(function _callee3$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
// eslint-disable-next-line prefer-const, no-unused-vars
_Object$assign = (0, _assign2.default)({
dir: process.cwd(),
interactive: false,
skipPackage: false,
arch: (0, _electronHostArch2.default)(),
platform: process.platform
}, providedOptions), dir = _Object$assign.dir, interactive = _Object$assign.interactive, skipPackage = _Object$assign.skipPackage, overrideTargets = _Object$assign.overrideTargets, arch = _Object$assign.arch, platform = _Object$assign.platform;
outDir = providedOptions.outDir || _path2.default.resolve(dir, 'out');
_oraHandler2.default.interactive = interactive;
forgeConfig = void 0;
_context5.next = 6;
return (0, _oraHandler2.default)('Resolving Forge Config', (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee() {
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return (0, _resolveDir2.default)(dir);
case 2:
dir = _context.sent;
if (dir) {
_context.next = 5;
break;
}
throw 'Failed to locate makeable Electron application';
case 5:
_context.next = 7;
return (0, _forgeConfig2.default)(dir);
case 7:
forgeConfig = _context.sent;
case 8:
case 'end':
return _context.stop();
}
}
}, _callee, undefined);
})));
case 6:
if (['darwin', 'win32', 'linux'].includes(platform)) {
_context5.next = 8;
break;
}
throw new Error('\'' + platform + '\' is an invalid platform. Choices are \'darwin\', \'win32\' or \'linux\'');
case 8:
makers = {};
targets = overrideTargets || forgeConfig.make_targets[platform];
_iteratorNormalCompletion = true;
_didIteratorError = false;
_iteratorError = undefined;
_context5.prev = 13;
_iterator = (0, _getIterator3.default)(targets);
case 15:
if (_iteratorNormalCompletion = (_step = _iterator.next()).done) {
_context5.next = 30;
break;
}
target = _step.value;
maker = (0, _requireSearch.requireSearchRaw)(__dirname, ['../makers/' + platform + '/' + target + '.js', '../makers/generic/' + target + '.js', 'electron-forge-maker-' + target, target, _path2.default.resolve(dir, target), _path2.default.resolve(dir, 'node_modules', target)]);
if (maker) {
_context5.next = 20;
break;
}
throw new Error(['Could not find a build target with the name: ', target + ' for the platform: ' + platform].join(''));
case 20:
if (maker.isSupportedOnCurrentPlatform) {
_context5.next = 22;
break;
}
throw new Error(['Maker for target ' + target + ' is incompatible with this version of ', 'electron-forge, please upgrade or contact the maintainer ', '(needs to implement \'isSupportedOnCurrentPlatform)\')'].join(''));
case 22:
_context5.next = 24;
return maker.isSupportedOnCurrentPlatform();
case 24:
if (_context5.sent) {
_context5.next = 26;
break;
}
throw new Error(['Cannot build for ' + platform + ' target ' + target + ': the maker declared ', 'that it cannot run on ' + process.platform].join(''));
case 26:
makers[target] = maker.default || maker;
case 27:
_iteratorNormalCompletion = true;
_context5.next = 15;
break;
case 30:
_context5.next = 36;
break;
case 32:
_context5.prev = 32;
_context5.t0 = _context5['catch'](13);
_didIteratorError = true;
_iteratorError = _context5.t0;
case 36:
_context5.prev = 36;
_context5.prev = 37;
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
case 39:
_context5.prev = 39;
if (!_didIteratorError) {
_context5.next = 42;
break;
}
throw _iteratorError;
case 42:
return _context5.finish(39);
case 43:
return _context5.finish(36);
case 44:
if (skipPackage) {
_context5.next = 50;
break;
}
(0, _messages.info)(interactive, 'We need to package your application before we can make it'.green);
_context5.next = 48;
return (0, _package2.default)({
dir: dir,
interactive: interactive,
arch: arch,
platform: platform,
outDir: outDir
});
case 48:
_context5.next = 51;
break;
case 50:
(0, _messages.warn)(interactive, 'WARNING: Skipping the packaging step, this could result in an out of date build'.red);
case 51:
declaredArch = arch;
(0, _messages.info)(interactive, 'Making for the following targets:', ('' + targets.join(', ')).cyan);
targetArchs = [declaredArch];
if (!(declaredArch === 'all')) {
_context5.next = 64;
break;
}
_context5.t1 = platform;
_context5.next = _context5.t1 === 'darwin' ? 58 : _context5.t1 === 'linux' ? 60 : _context5.t1 === 'win32' ? 62 : 62;
break;
case 58:
targetArchs = ['x64'];
return _context5.abrupt('break', 64);
case 60:
targetArchs = ['ia32', 'x64', 'armv7l'];
return _context5.abrupt('break', 64);
case 62:
targetArchs = ['ia32', 'x64'];
return _context5.abrupt('break', 64);
case 64:
_context5.next = 66;
return (0, _readPackageJson2.default)(dir);
case 66:
packageJSON = _context5.sent;
appName = forgeConfig.electronPackagerConfig.name || packageJSON.productName || packageJSON.name;
outputs = [];
_context5.next = 71;
return (0, _hook2.default)(forgeConfig, 'preMake');
case 71:
_iteratorNormalCompletion2 = true;
_didIteratorError2 = false;
_iteratorError2 = undefined;
_context5.prev = 74;
_loop = _regenerator2.default.mark(function _loop() {
var targetArch, packageDir, _iteratorNormalCompletion3, _didIteratorError3, _iteratorError3, _loop2, _iterator3, _step3;
return _regenerator2.default.wrap(function _loop$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
targetArch = _step2.value;
packageDir = _path2.default.resolve(outDir, appName + '-' + platform + '-' + targetArch);
_context4.next = 4;
return _fsExtra2.default.pathExists(packageDir);
case 4:
if (_context4.sent) {
_context4.next = 6;
break;
}
throw new Error('Couldn\'t find packaged app at: ' + packageDir);
case 6:
_iteratorNormalCompletion3 = true;
_didIteratorError3 = false;
_iteratorError3 = undefined;
_context4.prev = 9;
_loop2 = _regenerator2.default.mark(function _loop2() {
var target, maker;
return _regenerator2.default.wrap(function _loop2$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
target = _step3.value;
maker = makers[target];
// eslint-disable-next-line no-loop-func
_context3.next = 4;
return (0, _oraHandler2.default)('Making for target: ' + target.cyan + ' - On platform: ' + platform.cyan + ' - For arch: ' + targetArch.cyan, (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee2() {
return _regenerator2.default.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
_context2.prev = 0;
_context2.t0 = outputs;
_context2.next = 4;
return maker({
dir: packageDir,
appName: appName,
targetPlatform: platform,
targetArch: targetArch,
forgeConfig: forgeConfig,
packageJSON: packageJSON
});
case 4:
_context2.t1 = _context2.sent;
_context2.t0.push.call(_context2.t0, _context2.t1);
_context2.next = 15;
break;
case 8:
_context2.prev = 8;
_context2.t2 = _context2['catch'](0);
if (!_context2.t2) {
_context2.next = 14;
break;
}
throw {
message: 'An error occured while making for target: ' + target,
stack: _context2.t2.message + '\n' + _context2.t2.stack
};
case 14:
throw new Error('An unknown error occured while making for target: ' + target);
case 15:
case 'end':
return _context2.stop();
}
}
}, _callee2, undefined, [[0, 8]]);
})));
case 4:
case 'end':
return _context3.stop();
}
}
}, _loop2, undefined);
});
_iterator3 = (0, _getIterator3.default)(targets);
case 12:
if (_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done) {
_context4.next = 17;
break;
}
return _context4.delegateYield(_loop2(), 't0', 14);
case 14:
_iteratorNormalCompletion3 = true;
_context4.next = 12;
break;
case 17:
_context4.next = 23;
break;
case 19:
_context4.prev = 19;
_context4.t1 = _context4['catch'](9);
_didIteratorError3 = true;
_iteratorError3 = _context4.t1;
case 23:
_context4.prev = 23;
_context4.prev = 24;
if (!_iteratorNormalCompletion3 && _iterator3.return) {
_iterator3.return();
}
case 26:
_context4.prev = 26;
if (!_didIteratorError3) {
_context4.next = 29;
break;
}
throw _iteratorError3;
case 29:
return _context4.finish(26);
case 30:
return _context4.finish(23);
case 31:
case 'end':
return _context4.stop();
}
}
}, _loop, undefined, [[9, 19, 23, 31], [24,, 26, 30]]);
});
_iterator2 = (0, _getIterator3.default)(targetArchs);
case 77:
if (_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done) {
_context5.next = 82;
break;
}
return _context5.delegateYield(_loop(), 't2', 79);
case 79:
_iteratorNormalCompletion2 = true;
_context5.next = 77;
break;
case 82:
_context5.next = 88;
break;
case 84:
_context5.prev = 84;
_context5.t3 = _context5['catch'](74);
_didIteratorError2 = true;
_iteratorError2 = _context5.t3;
case 88:
_context5.prev = 88;
_context5.prev = 89;
if (!_iteratorNormalCompletion2 && _iterator2.return) {
_iterator2.return();
}
case 91:
_context5.prev = 91;
if (!_didIteratorError2) {
_context5.next = 94;
break;
}
throw _iteratorError2;
case 94:
return _context5.finish(91);
case 95:
return _context5.finish(88);
case 96:
_context5.next = 98;
return (0, _hook2.default)(forgeConfig, 'postMake', outputs);
case 98:
result = _context5.sent;
// If the postMake hooks modifies the locations / names of the outputs it must return
// the new locations so that the publish step knows where to look
if (Array.isArray(result)) {
outputs = result;
}
return _context5.abrupt('return', outputs);
case 101:
case 'end':
return _context5.stop();
}
}
}, _callee3, undefined, [[13, 32, 36, 44], [37,, 39, 43], [74, 84, 88, 96], [89,, 91, 95]]);
}));
return function () {
return _ref.apply(this, arguments);
};
}();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFwaS9tYWtlLmpzIl0sIm5hbWVzIjpbInByb3ZpZGVkT3B0aW9ucyIsImRpciIsInByb2Nlc3MiLCJjd2QiLCJpbnRlcmFjdGl2ZSIsInNraXBQYWNrYWdlIiwiYXJjaCIsInBsYXRmb3JtIiwib3ZlcnJpZGVUYXJnZXRzIiwib3V0RGlyIiwicmVzb2x2ZSIsImZvcmdlQ29uZmlnIiwiaW5jbHVkZXMiLCJFcnJvciIsIm1ha2VycyIsInRhcmdldHMiLCJtYWtlX3RhcmdldHMiLCJ0YXJnZXQiLCJtYWtlciIsIl9fZGlybmFtZSIsImpvaW4iLCJpc1N1cHBvcnRlZE9uQ3VycmVudFBsYXRmb3JtIiwiZGVmYXVsdCIsImdyZWVuIiwicmVkIiwiZGVjbGFyZWRBcmNoIiwiY3lhbiIsInRhcmdldEFyY2hzIiwicGFja2FnZUpTT04iLCJhcHBOYW1lIiwiZWxlY3Ryb25QYWNrYWdlckNvbmZpZyIsIm5hbWUiLCJwcm9kdWN0TmFtZSIsIm91dHB1dHMiLCJ0YXJnZXRBcmNoIiwicGFja2FnZURpciIsInBhdGhFeGlzdHMiLCJ0YXJnZXRQbGF0Zm9ybSIsInB1c2giLCJtZXNzYWdlIiwic3RhY2siLCJyZXN1bHQiLCJBcnJheSIsImlzQXJyYXkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7Ozs7QUFDQTs7OztBQUVBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7OztBQUVBOzs7Ozs7QUFFQTs7Ozs7Ozs7Ozs7QUFXQTs7Ozs7OztpRUFNZTtBQUFBLFFBQU9BLGVBQVAsdUVBQXlCLEVBQXpCOztBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ2I7QUFEYSw2QkFFNEQsc0JBQWM7QUFDckZDLG1CQUFLQyxRQUFRQyxHQUFSLEVBRGdGO0FBRXJGQywyQkFBYSxLQUZ3RTtBQUdyRkMsMkJBQWEsS0FId0U7QUFJckZDLG9CQUFNLGlDQUorRTtBQUtyRkMsd0JBQVVMLFFBQVFLO0FB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QUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsOERBOEdVRixPQTlHVjs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTs7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxvREF3R1lZLFdBeEdaOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBOztBQUFBO0FBQUE7O0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUEsbUJBMElRLG9CQUFRaEIsV0FBUixFQUFxQixVQUFyQixFQUFpQ3NCLE9BQWpDLENBMUlSOztBQUFBO0FBMElQUSxrQkExSU87O0FBMkliO0FBQ0E7QUFDQSxnQkFBSUMsTUFBTUMsT0FBTixDQUFjRixNQUFkLENBQUosRUFBMkI7QUFDekJSLHdCQUFVUSxNQUFWO0FBQ0Q7O0FBL0lZLDhDQWlKTlIsT0FqSk07O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRyIsImZpbGUiOiJhcGkvbWFrZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnY29sb3JzJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IGFzeW5jT3JhIGZyb20gJy4uL3V0aWwvb3JhLWhhbmRsZXInO1xuaW1wb3J0IGVsZWN0cm9uSG9zdEFyY2ggZnJvbSAnLi4vdXRpbC9lbGVjdHJvbi1ob3N0LWFyY2gnO1xuaW1wb3J0IGdldEZvcmdlQ29uZmlnIGZyb20gJy4uL3V0aWwvZm9yZ2UtY29uZmlnJztcbmltcG9ydCBydW5Ib29rIGZyb20gJy4uL3V0aWwvaG9vayc7XG5pbXBvcnQgeyBpbmZvLCB3YXJuIH0gZnJvbSAnLi4vdXRpbC9tZXNzYWdlcyc7XG5pbXBvcnQgcmVhZFBhY2thZ2VKU09OIGZyb20gJy4uL3V0aWwvcmVhZC1wYWNrYWdlLWpzb24nO1xuaW1wb3J0IHsgcmVxdWlyZVNlYXJjaFJhdyB9IGZyb20gJy4uL3V0aWwvcmVxdWlyZS1zZWFyY2gnO1xuaW1wb3J0IHJlc29sdmVEaXIgZnJvbSAnLi4vdXRpbC9yZXNvbHZlLWRpcic7XG5cbmltcG9ydCBwYWNrYWdlciBmcm9tICcuL3BhY2thZ2UnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1ha2VPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Rpcj1wcm9jZXNzLmN3ZCgpXSBUaGUgcGF0aCB0byB0aGUgYXBwIGZyb20gd2hpY2ggZGlzdHJpYnV0YWJsZXMgYXJlIGdlbmVyYXRlZFxuICogQHByb3BlcnR5IHtib29sZWFufSBbaW50ZXJhY3RpdmU9ZmFsc2VdIFdoZXRoZXIgdG8gdXNlIHNlbnNpYmxlIGRlZmF1bHRzIG9yIHByb21wdCB0aGUgdXNlciB2aXN1YWxseVxuICogQHByb3BlcnR5IHtib29sZWFufSBbc2tpcFBhY2thZ2U9ZmFsc2VdIFdoZXRoZXIgdG8gc2tpcCB0aGUgcHJlLW1ha2UgcGFja2FnaW5nIHN0ZXBcbiAqIEBwcm9wZXJ0eSB7QXJyYXk8c3RyaW5nPn0gW292ZXJyaWRlVGFyZ2V0c10gQW4gYXJyYXkgb2YgbWFrZSB0YXJnZXRzIHRvIG92ZXJyaWRlIHlvdXIgZm9yZ2UgY29uZmlnXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FyY2g9aG9zdCBhcmNoaXRlY3R1cmVdIFRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3BsYXRmb3JtPXByb2Nlc3MucGxhdGZvcm1dIFRoZSB0YXJnZXQgcGxhdGZvcm0uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW291dERpcj1gJHtkaXJ9L291dGBdIFRoZSBwYXRoIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBnZW5lcmF0ZWQgZGlzdHJpYnV0YWJsZXNcbiAqL1xuXG4vKipcbiAqIE1ha2UgZGlzdHJpYnV0YWJsZXMgZm9yIGFuIEVsZWN0cm9uIGFwcGxpY2F0aW9uLlxuICpcbiAqIEBwYXJhbSB7TWFrZU9wdGlvbnN9IHByb3ZpZGVkT3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBtYWtlIG1ldGhvZFxuICogQHJldHVybiB7UHJvbWlzZX0gV2lsbCByZXNvbHZlIHdoZW4gdGhlIG1ha2UgcHJvY2VzcyBpcyBjb21wbGV0ZVxuICovXG5leHBvcnQgZGVmYXVsdCBhc3luYyAocHJvdmlkZWRPcHRpb25zID0ge30pID0+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdCwgbm8tdW51c2VkLXZhcnNcbiAgbGV0IHsgZGlyLCBpbnRlcmFjdGl2ZSwgc2tpcFBhY2thZ2UsIG92ZXJyaWRlVGFyZ2V0cywgYXJjaCwgcGxhdGZvcm0gfSA9IE9iamVjdC5hc3NpZ24oe1xuICAgIGRpcjogcHJvY2Vzcy5jd2QoKSxcbiAgICBpbnRlcmFjdGl2ZTogZmFsc2UsXG4gICAgc2tpcFBhY2thZ2U6IGZhbHNlLFxuICAgIGFyY2g6IGVsZWN0cm9uSG9zdEFyY2goKSxcbiAgICBwbGF0Zm9ybTogcHJvY2Vzcy5wbGF0Zm9ybSxcbiAgfSwgcHJvdmlkZWRPcHRpb25zKTtcblxuICBjb25zdCBvdXREaXIgPSBwcm92aWRlZE9wdGlvbnMub3V0RGlyIHx8IHBhdGgucmVzb2x2ZShkaXIsICdvdXQnKTtcbiAgYXN5bmNPcmEuaW50ZXJhY3RpdmUgPSBpbnRlcmFjdGl2ZTtcblxuICBsZXQgZm9yZ2VDb25maWc7XG4gIGF3YWl0IGFzeW5jT3JhKCdSZXNvbHZpbmcgRm9yZ2UgQ29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGRpciA9IGF3YWl0IHJlc29sdmVEaXIoZGlyKTtcbiAgICBpZiAoIWRpcikge1xuICAgICAgdGhyb3cgJ0ZhaWxlZCB0byBsb2NhdGUgbWFrZWFibGUgRWxlY3Ryb24gYXBwbGljYXRpb24nO1xuICAgIH1cblxuICAgIGZvcmdlQ29uZmlnID0gYXdhaXQgZ2V0Rm9yZ2VDb25maWcoZGlyKTtcbiAgfSk7XG5cbiAgaWYgKCFbJ2RhcndpbicsICd3aW4zMicsICdsaW51eCddLmluY2x1ZGVzKHBsYXRmb3JtKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJyR7cGxhdGZvcm19JyBpcyBhbiBpbnZhbGlkIHBsYXRmb3JtLiBDaG9pY2VzIGFyZSAnZGFyd2luJywgJ3dpbjMyJyBvciAnbGludXgnYCk7XG4gIH1cblxuICBjb25zdCBtYWtlcnMgPSB7fTtcbiAgY29uc3QgdGFyZ2V0cyA9IG92ZXJyaWRlVGFyZ2V0cyB8fCBmb3JnZUNvbmZpZy5tYWtlX3RhcmdldHNbcGxhdGZvcm1dO1xuXG4gIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICBjb25zdCBtYWtlciA9IHJlcXVpcmVTZWFyY2hSYXcoX19kaXJuYW1lLCBbXG4gICAgICBgLi4vbWFrZXJzLyR7cGxhdGZvcm19LyR7dGFyZ2V0fS5qc2AsXG4gICAgICBgLi4vbWFrZXJzL2dlbmVyaWMvJHt0YXJnZXR9LmpzYCxcbiAgICAgIGBlbGVjdHJvbi1mb3JnZS1tYWtlci0ke3RhcmdldH1gLFxuICAgICAgdGFyZ2V0LFxuICAgICAgcGF0aC5yZXNvbHZlKGRpciwgdGFyZ2V0KSxcbiAgICAgIHBhdGgucmVzb2x2ZShkaXIsICdub2RlX21vZHVsZXMnLCB0YXJnZXQpLFxuICAgIF0pO1xuXG4gICAgaWYgKCFtYWtlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFtcbiAgICAgICAgJ0NvdWxkIG5vdCBmaW5kIGEgYnVpbGQgdGFyZ2V0IHdpdGggdGhlIG5hbWU6ICcsXG4gICAgICAgIGAke3RhcmdldH0gZm9yIHRoZSBwbGF0Zm9ybTogJHtwbGF0Zm9ybX1gLFxuICAgICAgXS5qb2luKCcnKSk7XG4gICAgfVxuXG4gICAgaWYgKCFtYWtlci5pc1N1cHBvcnRlZE9uQ3VycmVudFBsYXRmb3JtKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoW1xuICAgICAgICBgTWFrZXIgZm9yIHRhcmdldCAke3RhcmdldH0gaXMgaW5jb21wYXRpYmxlIHdpdGggdGhpcyB2ZXJzaW9uIG9mIGAsXG4gICAgICAgICdlbGVjdHJvbi1mb3JnZSwgcGxlYXNlIHVwZ3JhZGUgb3IgY29udGFjdCB0aGUgbWFpbnRhaW5lciAnLFxuICAgICAgICAnKG5lZWRzIHRvIGltcGxlbWVudCBcXCdpc1N1cHBvcnRlZE9uQ3VycmVudFBsYXRmb3JtKVxcJyknLFxuICAgICAgXS5qb2luKCcnKSk7XG4gICAgfVxuXG4gICAgaWYgKCFhd2FpdCBtYWtlci5pc1N1cHBvcnRlZE9uQ3VycmVudFBsYXRmb3JtKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihbXG4gICAgICAgIGBDYW5ub3QgYnVpbGQgZm9yICR7cGxhdGZvcm19IHRhcmdldCAke3RhcmdldH06IHRoZSBtYWtlciBkZWNsYXJlZCBgLFxuICAgICAgICBgdGhhdCBpdCBjYW5ub3QgcnVuIG9uICR7cHJvY2Vzcy5wbGF0Zm9ybX1gLFxuICAgICAgXS5qb2luKCcnKSk7XG4gICAgfVxuXG4gICAgbWFrZXJzW3RhcmdldF0gPSBtYWtlci5kZWZhdWx0IHx8IG1ha2VyO1xuICB9XG5cbiAgaWYgKCFza2lwUGFja2FnZSkge1xuICAgIGluZm8oaW50ZXJhY3RpdmUsICdXZSBuZWVkIHRvIHBhY2thZ2UgeW91ciBhcHBsaWNhdGlvbiBiZWZvcmUgd2UgY2FuIG1ha2UgaXQnLmdyZWVuKTtcbiAgICBhd2FpdCBwYWNrYWdlcih7XG4gICAgICBkaXIsXG4gICAgICBpbnRlcmFjdGl2ZSxcbiAgICAgIGFyY2gsXG4gICAgICBwbGF0Zm9ybSxcbiAgICAgIG91dERpcixcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICB3YXJuKGludGVyYWN0aXZlLCAnV0FSTklORzogU2tpcHBpbmcgdGhlIHBhY2thZ2luZyBzdGVwLCB0aGlzIGNvdWxkIHJlc3VsdCBpbiBhbiBvdXQgb2YgZGF0ZSBidWlsZCcucmVkKTtcbiAgfVxuXG4gIGNvbnN0IGRlY2xhcmVkQXJjaCA9IGFyY2g7XG5cbiAgaW5mbyhpbnRlcmFjdGl2ZSwgJ01ha2luZyBmb3IgdGhlIGZvbGxvd2luZyB0YXJnZXRzOicsIGAke3RhcmdldHMuam9pbignLCAnKX1gLmN5YW4pO1xuXG4gIGxldCB0YXJnZXRBcmNocyA9IFtkZWNsYXJlZEFyY2hdO1xuICBpZiAoZGVjbGFyZWRBcmNoID09PSAnYWxsJykge1xuICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgIGNhc2UgJ2Rhcndpbic6XG4gICAgICAgIHRhcmdldEFyY2hzID0gWyd4NjQnXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdsaW51eCc6XG4gICAgICAgIHRhcmdldEFyY2hzID0gWydpYTMyJywgJ3g2NCcsICdhcm12N2wnXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd3aW4zMic6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0YXJnZXRBcmNocyA9IFsnaWEzMicsICd4NjQnXTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGFja2FnZUpTT04gPSBhd2FpdCByZWFkUGFja2FnZUpTT04oZGlyKTtcbiAgY29uc3QgYXBwTmFtZSA9IGZvcmdlQ29uZmlnLmVsZWN0cm9uUGFja2FnZXJDb25maWcubmFtZSB8fCBwYWNrYWdlSlNPTi5wcm9kdWN0TmFtZSB8fCBwYWNrYWdlSlNPTi5uYW1lO1xuICBsZXQgb3V0cHV0cyA9IFtdO1xuXG4gIGF3YWl0IHJ1bkhvb2soZm9yZ2VDb25maWcsICdwcmVNYWtlJyk7XG5cbiAgZm9yIChjb25zdCB0YXJnZXRBcmNoIG9mIHRhcmdldEFyY2hzKSB7XG4gICAgY29uc3QgcGFja2FnZURpciA9IHBhdGgucmVzb2x2ZShvdXREaXIsIGAke2FwcE5hbWV9LSR7cGxhdGZvcm19LSR7dGFyZ2V0QXJjaH1gKTtcbiAgICBpZiAoIShhd2FpdCBmcy5wYXRoRXhpc3RzKHBhY2thZ2VEaXIpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kIHBhY2thZ2VkIGFwcCBhdDogJHtwYWNrYWdlRGlyfWApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgIGNvbnN0IG1ha2VyID0gbWFrZXJzW3RhcmdldF07XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1sb29wLWZ1bmNcbiAgICAgIGF3YWl0IGFzeW5jT3JhKGBNYWtpbmcgZm9yIHRhcmdldDogJHt0YXJnZXQuY3lhbn0gLSBPbiBwbGF0Zm9ybTogJHtwbGF0Zm9ybS5jeWFufSAtIEZvciBhcmNoOiAke3RhcmdldEFyY2guY3lhbn1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgb3V0cHV0cy5wdXNoKGF3YWl0IG1ha2VyKHtcbiAgICAgICAgICAgIGRpcjogcGFja2FnZURpcixcbiAgICAgICAgICAgIGFwcE5hbWUsXG4gICAgICAgICAgICB0YXJnZXRQbGF0Zm9ybTogcGxhdGZvcm0sXG4gICAgICAgICAgICB0YXJnZXRBcmNoLFxuICAgICAgICAgICAgZm9yZ2VDb25maWcsXG4gICAgICAgICAgICBwYWNrYWdlSlNPTixcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHRocm93IHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogYEFuIGVycm9yIG9jY3VyZWQgd2hpbGUgbWFraW5nIGZvciB0YXJnZXQ6ICR7dGFyZ2V0fWAsXG4gICAgICAgICAgICAgIHN0YWNrOiBgJHtlcnIubWVzc2FnZX1cXG4ke2Vyci5zdGFja31gLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBbiB1bmtub3duIGVycm9yIG9jY3VyZWQgd2hpbGUgbWFraW5nIGZvciB0YXJnZXQ6ICR7dGFyZ2V0fWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuSG9vayhmb3JnZUNvbmZpZywgJ3Bvc3RNYWtlJywgb3V0cHV0cyk7XG4gIC8vIElmIHRoZSBwb3N0TWFrZSBob29rcyBtb2RpZmllcyB0aGUgbG9jYXRpb25zIC8gbmFtZXMgb2YgdGhlIG91dHB1dHMgaXQgbXVzdCByZXR1cm5cbiAgLy8gdGhlIG5ldyBsb2NhdGlvbnMgc28gdGhhdCB0aGUgcHVibGlzaCBzdGVwIGtub3dzIHdoZXJlIHRvIGxvb2tcbiAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgIG91dHB1dHMgPSByZXN1bHQ7XG4gIH1cblxuICByZXR1cm4gb3V0cHV0cztcbn07XG4iXX0=