electron-forge
Version:
A complete tool for building modern Electron applications
253 lines (191 loc) • 16.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _regenerator = require('babel-runtime/regenerator');
var _regenerator2 = _interopRequireDefault(_regenerator);
var _getIterator2 = require('babel-runtime/core-js/get-iterator');
var _getIterator3 = _interopRequireDefault(_getIterator2);
var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
var _assign = require('babel-runtime/core-js/object/assign');
var _assign2 = _interopRequireDefault(_assign);
var _bluebird = require('bluebird');
require('colors');
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _oraHandler = require('../util/ora-handler');
var _oraHandler2 = _interopRequireDefault(_oraHandler);
var _deprecate = require('../util/deprecate');
var _deprecate2 = _interopRequireDefault(_deprecate);
var _forgeConfig = require('../util/forge-config');
var _forgeConfig2 = _interopRequireDefault(_forgeConfig);
var _readPackageJson = require('../util/read-package-json');
var _readPackageJson2 = _interopRequireDefault(_readPackageJson);
var _requireSearch = require('../util/require-search');
var _requireSearch2 = _interopRequireDefault(_requireSearch);
var _resolveDir = require('../util/resolve-dir');
var _resolveDir2 = _interopRequireDefault(_resolveDir);
var _make = require('./make');
var _make2 = _interopRequireDefault(_make);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* @typedef {Object} PublishOptions
* @property {string} [dir=process.cwd()] The path to the app to be published
* @property {boolean} [interactive=false] Whether to use sensible defaults or prompt the user visually
* @property {string} [authToken] An authentication token to use when publishing
* @property {string} [tag=packageJSON.version] The string to tag this release with
* @property {string} [target=github] The publish target
* @property {MakeOptions} [makeOptions] Options object to passed through to make()
*/
/**
* Publish an Electron application into the given target service.
*
* @param {PublishOptions} providedOptions - Options for the Publish method
* @return {Promise} Will resolve when the publish process is complete
*/
exports.default = function () {
var _ref = (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee2() {
var providedOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var _Object$assign, dir, interactive, authToken, tag, target, makeOptions, publishTargets, makeResults, artifacts, packageJSON, forgeConfig, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _loop, _iterator, _step;
return _regenerator2.default.wrap(function _callee2$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
// eslint-disable-next-line prefer-const, no-unused-vars
_Object$assign = (0, _assign2.default)({
dir: process.cwd(),
interactive: false,
tag: null,
makeOptions: {},
target: null
}, providedOptions), dir = _Object$assign.dir, interactive = _Object$assign.interactive, authToken = _Object$assign.authToken, tag = _Object$assign.tag, target = _Object$assign.target, makeOptions = _Object$assign.makeOptions;
_oraHandler2.default.interactive = interactive;
// FIXME(MarshallOfSound): Change the method param to publishTargets in the next major bump
publishTargets = target;
_context3.next = 5;
return (0, _make2.default)((0, _assign2.default)({
dir: dir,
interactive: interactive
}, makeOptions));
case 5:
makeResults = _context3.sent;
_context3.next = 8;
return (0, _resolveDir2.default)(dir);
case 8:
dir = _context3.sent;
if (dir) {
_context3.next = 11;
break;
}
throw 'Failed to locate publishable Electron application';
case 11:
artifacts = makeResults.reduce(function (accum, arr) {
accum.push.apply(accum, (0, _toConsumableArray3.default)(arr));
return accum;
}, []);
_context3.next = 14;
return (0, _readPackageJson2.default)(dir);
case 14:
packageJSON = _context3.sent;
_context3.next = 17;
return (0, _forgeConfig2.default)(dir);
case 17:
forgeConfig = _context3.sent;
if (publishTargets === null) {
publishTargets = forgeConfig.publish_targets[makeOptions.platform || process.platform];
} else if (typeof publishTargets === 'string') {
// FIXME(MarshallOfSound): Remove this fallback string typeof check in the next major bump
(0, _deprecate2.default)('publish target as a string').replaceWith('an array of publish targets');
publishTargets = [publishTargets];
}
_iteratorNormalCompletion = true;
_didIteratorError = false;
_iteratorError = undefined;
_context3.prev = 22;
_loop = _regenerator2.default.mark(function _loop() {
var publishTarget, publisher;
return _regenerator2.default.wrap(function _loop$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
publishTarget = _step.value;
publisher = void 0;
_context2.next = 4;
return (0, _oraHandler2.default)('Resolving publish target: ' + ('' + publishTarget).cyan, (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee() {
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
// eslint-disable-line no-loop-func
publisher = (0, _requireSearch2.default)(__dirname, ['../publishers/' + publishTarget + '.js', 'electron-forge-publisher-' + publishTarget, publishTarget, _path2.default.resolve(dir, publishTarget), _path2.default.resolve(dir, 'node_modules', publishTarget)]);
if (publisher) {
_context.next = 3;
break;
}
throw 'Could not find a publish target with the name: ' + publishTarget;
case 3:
case 'end':
return _context.stop();
}
}
}, _callee, undefined);
})));
case 4:
_context2.next = 6;
return publisher(artifacts, packageJSON, forgeConfig, authToken, tag, makeOptions.platform || process.platform, makeOptions.arch || process.arch);
case 6:
case 'end':
return _context2.stop();
}
}
}, _loop, undefined);
});
_iterator = (0, _getIterator3.default)(publishTargets);
case 25:
if (_iteratorNormalCompletion = (_step = _iterator.next()).done) {
_context3.next = 30;
break;
}
return _context3.delegateYield(_loop(), 't0', 27);
case 27:
_iteratorNormalCompletion = true;
_context3.next = 25;
break;
case 30:
_context3.next = 36;
break;
case 32:
_context3.prev = 32;
_context3.t1 = _context3['catch'](22);
_didIteratorError = true;
_iteratorError = _context3.t1;
case 36:
_context3.prev = 36;
_context3.prev = 37;
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
case 39:
_context3.prev = 39;
if (!_didIteratorError) {
_context3.next = 42;
break;
}
throw _iteratorError;
case 42:
return _context3.finish(39);
case 43:
return _context3.finish(36);
case 44:
case 'end':
return _context3.stop();
}
}
}, _callee2, undefined, [[22, 32, 36, 44], [37,, 39, 43]]);
}));
return function () {
return _ref.apply(this, arguments);
};
}();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFwaS9wdWJsaXNoLmpzIl0sIm5hbWVzIjpbInByb3ZpZGVkT3B0aW9ucyIsImRpciIsInByb2Nlc3MiLCJjd2QiLCJpbnRlcmFjdGl2ZSIsInRhZyIsIm1ha2VPcHRpb25zIiwidGFyZ2V0IiwiYXV0aFRva2VuIiwicHVibGlzaFRhcmdldHMiLCJtYWtlUmVzdWx0cyIsImFydGlmYWN0cyIsInJlZHVjZSIsImFjY3VtIiwiYXJyIiwicHVzaCIsInBhY2thZ2VKU09OIiwiZm9yZ2VDb25maWciLCJwdWJsaXNoX3RhcmdldHMiLCJwbGF0Zm9ybSIsInJlcGxhY2VXaXRoIiwicHVibGlzaFRhcmdldCIsInB1Ymxpc2hlciIsImN5YW4iLCJfX2Rpcm5hbWUiLCJyZXNvbHZlIiwiYXJjaCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7Ozs7QUFFQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFFQTs7Ozs7O0FBRUE7Ozs7Ozs7Ozs7QUFVQTs7Ozs7OztpRUFNZTtBQUFBLFFBQU9BLGVBQVAsdUVBQXlCLEVBQXpCOztBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ2I7QUFEYSw2QkFFbUQsc0JBQWM7QUFDNUVDLG1CQUFLQyxRQUFRQyxHQUFSLEVBRHVFO0FBRTVFQywyQkFBYSxLQUYrRDtBQUc1RUMsbUJBQUssSUFIdUU7QUFJNUVDLDJCQUFhLEVBSitEO0FBSzVFQyxzQkFBUTtBQUxvRSxhQUFkLEVBTTdEUCxlQU42RCxDQUZuRCxFQUVQQyxHQUZPLGtCQUVQQSxHQUZPLEVBRUZHLFdBRkUsa0JBRUZBLFdBRkUsRUFFV0ksU0FGWCxrQkFFV0EsU0FGWCxFQUVzQkgsR0FGdEIsa0JBRXNCQSxHQUZ0QixFQUUyQkUsTUFGM0Isa0JBRTJCQSxNQUYzQixFQUVtQ0QsV0FGbkMsa0JBRW1DQSxXQUZuQzs7QUFTYixpQ0FBU0YsV0FBVCxHQUF1QkEsV0FBdkI7QUFDQTtBQUNJSywwQkFYUyxHQVdRRixNQVhSO0FBQUE7QUFBQSxtQkFhYSxvQkFBSyxzQkFBYztBQUMzQ04sc0JBRDJDO0FBRTNDRztBQUYyQyxhQUFkLEVBRzVCRSxXQUg0QixDQUFMLENBYmI7O0FBQUE7QUFhUEksdUJBYk87QUFBQTtBQUFBLG1CQWtCRCwwQkFBV1QsR0FBWCxDQWxCQzs7QUFBQTtBQWtCYkEsZUFsQmE7O0FBQUEsZ0JBbUJSQSxHQW5CUTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxrQkFvQkwsbURBcEJLOztBQUFBO0FBdUJQVSxxQkF2Qk8sR0F1QktELFlBQVlFLE1BQVosQ0FBbUIsVUFBQ0MsS0FBRCxFQUFRQyxHQUFSLEVBQWdCO0FBQ25ERCxvQkFBTUUsSUFBTiwrQ0FBY0QsR0FBZDtBQUNBLHFCQUFPRCxLQUFQO0FBQ0QsYUFIaUIsRUFHZixFQUhlLENBdkJMO0FBQUE7QUFBQSxtQkE0QmEsK0JBQWdCWixHQUFoQixDQTVCYjs7QUFBQTtBQTRCUGUsdUJBNUJPO0FBQUE7QUFBQSxtQkE4QmEsMkJBQWVmLEdBQWYsQ0E5QmI7O0FBQUE7QUE4QlBnQix1QkE5Qk87OztBQWdDYixnQkFBSVIsbUJBQW1CLElBQXZCLEVBQTZCO0FBQzNCQSwrQkFBaUJRLFlBQVlDLGVBQVosQ0FBNEJaLFlBQVlhLFFBQVosSUFBd0JqQixRQUFRaUIsUUFBNUQsQ0FBakI7QUFDRCxhQUZELE1BRU8sSUFBSSxPQUFPVixjQUFQLEtBQTBCLFFBQTlCLEVBQXdDO0FBQzdDO0FBQ0EsdUNBQVUsNEJBQVYsRUFBd0NXLFdBQXhDLENBQW9ELDZCQUFwRDtBQUNBWCwrQkFBaUIsQ0FBQ0EsY0FBRCxDQUFqQjtBQUNEOztBQXRDWTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXdDRlksbUNBeENFO0FBeUNQQywrQkF6Q087QUFBQTtBQUFBLDZCQTBDTCx5REFBc0MsTUFBR0QsYUFBSCxFQUFtQkUsSUFBekQsc0RBQWlFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBYztBQUNuRkQsNENBQVksNkJBQWNFLFNBQWQsRUFBeUIsb0JBQ2xCSCxhQURrQix3Q0FFUEEsYUFGTyxFQUduQ0EsYUFIbUMsRUFJbkMsZUFBS0ksT0FBTCxDQUFheEIsR0FBYixFQUFrQm9CLGFBQWxCLENBSm1DLEVBS25DLGVBQUtJLE9BQUwsQ0FBYXhCLEdBQWIsRUFBa0IsY0FBbEIsRUFBa0NvQixhQUFsQyxDQUxtQyxDQUF6QixDQUFaOztBQURxRSxvQ0FRaEVDLFNBUmdFO0FBQUE7QUFBQTtBQUFBOztBQUFBLDBGQVNYRCxhQVRXOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHVCQUFqRSxHQTFDSzs7QUFBQTtBQUFBO0FBQUEsNkJBdURMQyxVQUFVWCxTQUFWLEVBQXFCSyxXQUFyQixFQUFrQ0MsV0FBbEMsRUFBK0NULFNBQS9DLEVBQTBESCxHQUExRCxFQUErREMsWUFBWWEsUUFBWixJQUF3QmpCLFFBQVFpQixRQUEvRixFQUF5R2IsWUFBWW9CLElBQVosSUFBb0J4QixRQUFRd0IsSUFBckksQ0F2REs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtREF3Q2VqQixjQXhDZjs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTs7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRyIsImZpbGUiOiJhcGkvcHVibGlzaC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnY29sb3JzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgYXN5bmNPcmEgZnJvbSAnLi4vdXRpbC9vcmEtaGFuZGxlcic7XG5pbXBvcnQgZGVwcmVjYXRlIGZyb20gJy4uL3V0aWwvZGVwcmVjYXRlJztcbmltcG9ydCBnZXRGb3JnZUNvbmZpZyBmcm9tICcuLi91dGlsL2ZvcmdlLWNvbmZpZyc7XG5pbXBvcnQgcmVhZFBhY2thZ2VKU09OIGZyb20gJy4uL3V0aWwvcmVhZC1wYWNrYWdlLWpzb24nO1xuaW1wb3J0IHJlcXVpcmVTZWFyY2ggZnJvbSAnLi4vdXRpbC9yZXF1aXJlLXNlYXJjaCc7XG5pbXBvcnQgcmVzb2x2ZURpciBmcm9tICcuLi91dGlsL3Jlc29sdmUtZGlyJztcblxuaW1wb3J0IG1ha2UgZnJvbSAnLi9tYWtlJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQdWJsaXNoT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtkaXI9cHJvY2Vzcy5jd2QoKV0gVGhlIHBhdGggdG8gdGhlIGFwcCB0byBiZSBwdWJsaXNoZWRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ludGVyYWN0aXZlPWZhbHNlXSBXaGV0aGVyIHRvIHVzZSBzZW5zaWJsZSBkZWZhdWx0cyBvciBwcm9tcHQgdGhlIHVzZXIgdmlzdWFsbHlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYXV0aFRva2VuXSBBbiBhdXRoZW50aWNhdGlvbiB0b2tlbiB0byB1c2Ugd2hlbiBwdWJsaXNoaW5nXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RhZz1wYWNrYWdlSlNPTi52ZXJzaW9uXSBUaGUgc3RyaW5nIHRvIHRhZyB0aGlzIHJlbGVhc2Ugd2l0aFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXQ9Z2l0aHViXSBUaGUgcHVibGlzaCB0YXJnZXRcbiAqIEBwcm9wZXJ0eSB7TWFrZU9wdGlvbnN9IFttYWtlT3B0aW9uc10gT3B0aW9ucyBvYmplY3QgdG8gcGFzc2VkIHRocm91Z2ggdG8gbWFrZSgpXG4gKi9cblxuLyoqXG4gKiBQdWJsaXNoIGFuIEVsZWN0cm9uIGFwcGxpY2F0aW9uIGludG8gdGhlIGdpdmVuIHRhcmdldCBzZXJ2aWNlLlxuICpcbiAqIEBwYXJhbSB7UHVibGlzaE9wdGlvbnN9IHByb3ZpZGVkT3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBQdWJsaXNoIG1ldGhvZFxuICogQHJldHVybiB7UHJvbWlzZX0gV2lsbCByZXNvbHZlIHdoZW4gdGhlIHB1Ymxpc2ggcHJvY2VzcyBpcyBjb21wbGV0ZVxuICovXG5leHBvcnQgZGVmYXVsdCBhc3luYyAocHJvdmlkZWRPcHRpb25zID0ge30pID0+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdCwgbm8tdW51c2VkLXZhcnNcbiAgbGV0IHsgZGlyLCBpbnRlcmFjdGl2ZSwgYXV0aFRva2VuLCB0YWcsIHRhcmdldCwgbWFrZU9wdGlvbnMgfSA9IE9iamVjdC5hc3NpZ24oe1xuICAgIGRpcjogcHJvY2Vzcy5jd2QoKSxcbiAgICBpbnRlcmFjdGl2ZTogZmFsc2UsXG4gICAgdGFnOiBudWxsLFxuICAgIG1ha2VPcHRpb25zOiB7fSxcbiAgICB0YXJnZXQ6IG51bGwsXG4gIH0sIHByb3ZpZGVkT3B0aW9ucyk7XG4gIGFzeW5jT3JhLmludGVyYWN0aXZlID0gaW50ZXJhY3RpdmU7XG4gIC8vIEZJWE1FKE1hcnNoYWxsT2ZTb3VuZCk6IENoYW5nZSB0aGUgbWV0aG9kIHBhcmFtIHRvIHB1Ymxpc2hUYXJnZXRzIGluIHRoZSBuZXh0IG1ham9yIGJ1bXBcbiAgbGV0IHB1Ymxpc2hUYXJnZXRzID0gdGFyZ2V0O1xuXG4gIGNvbnN0IG1ha2VSZXN1bHRzID0gYXdhaXQgbWFrZShPYmplY3QuYXNzaWduKHtcbiAgICBkaXIsXG4gICAgaW50ZXJhY3RpdmUsXG4gIH0sIG1ha2VPcHRpb25zKSk7XG5cbiAgZGlyID0gYXdhaXQgcmVzb2x2ZURpcihkaXIpO1xuICBpZiAoIWRpcikge1xuICAgIHRocm93ICdGYWlsZWQgdG8gbG9jYXRlIHB1Ymxpc2hhYmxlIEVsZWN0cm9uIGFwcGxpY2F0aW9uJztcbiAgfVxuXG4gIGNvbnN0IGFydGlmYWN0cyA9IG1ha2VSZXN1bHRzLnJlZHVjZSgoYWNjdW0sIGFycikgPT4ge1xuICAgIGFjY3VtLnB1c2goLi4uYXJyKTtcbiAgICByZXR1cm4gYWNjdW07XG4gIH0sIFtdKTtcblxuICBjb25zdCBwYWNrYWdlSlNPTiA9IGF3YWl0IHJlYWRQYWNrYWdlSlNPTihkaXIpO1xuXG4gIGNvbnN0IGZvcmdlQ29uZmlnID0gYXdhaXQgZ2V0Rm9yZ2VDb25maWcoZGlyKTtcblxuICBpZiAocHVibGlzaFRhcmdldHMgPT09IG51bGwpIHtcbiAgICBwdWJsaXNoVGFyZ2V0cyA9IGZvcmdlQ29uZmlnLnB1Ymxpc2hfdGFyZ2V0c1ttYWtlT3B0aW9ucy5wbGF0Zm9ybSB8fCBwcm9jZXNzLnBsYXRmb3JtXTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgcHVibGlzaFRhcmdldHMgPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gRklYTUUoTWFyc2hhbGxPZlNvdW5kKTogUmVtb3ZlIHRoaXMgZmFsbGJhY2sgc3RyaW5nIHR5cGVvZiBjaGVjayBpbiB0aGUgbmV4dCBtYWpvciBidW1wXG4gICAgZGVwcmVjYXRlKCdwdWJsaXNoIHRhcmdldCBhcyBhIHN0cmluZycpLnJlcGxhY2VXaXRoKCdhbiBhcnJheSBvZiBwdWJsaXNoIHRhcmdldHMnKTtcbiAgICBwdWJsaXNoVGFyZ2V0cyA9IFtwdWJsaXNoVGFyZ2V0c107XG4gIH1cblxuICBmb3IgKGNvbnN0IHB1Ymxpc2hUYXJnZXQgb2YgcHVibGlzaFRhcmdldHMpIHtcbiAgICBsZXQgcHVibGlzaGVyO1xuICAgIGF3YWl0IGFzeW5jT3JhKGBSZXNvbHZpbmcgcHVibGlzaCB0YXJnZXQ6ICR7YCR7cHVibGlzaFRhcmdldH1gLmN5YW59YCwgYXN5bmMgKCkgPT4geyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWxvb3AtZnVuY1xuICAgICAgcHVibGlzaGVyID0gcmVxdWlyZVNlYXJjaChfX2Rpcm5hbWUsIFtcbiAgICAgICAgYC4uL3B1Ymxpc2hlcnMvJHtwdWJsaXNoVGFyZ2V0fS5qc2AsXG4gICAgICAgIGBlbGVjdHJvbi1mb3JnZS1wdWJsaXNoZXItJHtwdWJsaXNoVGFyZ2V0fWAsXG4gICAgICAgIHB1Ymxpc2hUYXJnZXQsXG4gICAgICAgIHBhdGgucmVzb2x2ZShkaXIsIHB1Ymxpc2hUYXJnZXQpLFxuICAgICAgICBwYXRoLnJlc29sdmUoZGlyLCAnbm9kZV9tb2R1bGVzJywgcHVibGlzaFRhcmdldCksXG4gICAgICBdKTtcbiAgICAgIGlmICghcHVibGlzaGVyKSB7XG4gICAgICAgIHRocm93IGBDb3VsZCBub3QgZmluZCBhIHB1Ymxpc2ggdGFyZ2V0IHdpdGggdGhlIG5hbWU6ICR7cHVibGlzaFRhcmdldH1gO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgYXdhaXQgcHVibGlzaGVyKGFydGlmYWN0cywgcGFja2FnZUpTT04sIGZvcmdlQ29uZmlnLCBhdXRoVG9rZW4sIHRhZywgbWFrZU9wdGlvbnMucGxhdGZvcm0gfHwgcHJvY2Vzcy5wbGF0Zm9ybSwgbWFrZU9wdGlvbnMuYXJjaCB8fCBwcm9jZXNzLmFyY2gpO1xuICB9XG59O1xuIl19