UNPKG

electron-forge

Version:

A complete tool for building modern Electron applications

430 lines (334 loc) 20.3 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _from = require('babel-runtime/core-js/array/from'); var _from2 = _interopRequireDefault(_from); var _stringify = require('babel-runtime/core-js/json/stringify'); var _stringify2 = _interopRequireDefault(_stringify); var _regenerator = require('babel-runtime/regenerator'); var _regenerator2 = _interopRequireDefault(_regenerator); var _getIterator2 = require('babel-runtime/core-js/get-iterator'); var _getIterator3 = _interopRequireDefault(_getIterator2); var _bluebird = require('bluebird'); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _crypto = require('crypto'); var _crypto2 = _interopRequireDefault(_crypto); var _fsExtra = require('fs-extra'); var _fsExtra2 = _interopRequireDefault(_fsExtra); var _path = require('path'); var _path2 = _interopRequireDefault(_path); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var EXTENSION = '.forge.publish'; var PublishState = function () { (0, _createClass3.default)(PublishState, null, [{ key: 'loadFromDirectory', value: function () { var _ref = (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee(directory) { var _this = this; var publishes, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _loop, _iterator, _step; return _regenerator2.default.wrap(function _callee$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _context2.next = 2; return _fsExtra2.default.exists(directory); case 2: if (_context2.sent) { _context2.next = 4; break; } throw new Error('Attempted to load publish state from a missing directory: ' + directory); case 4: publishes = []; _iteratorNormalCompletion = true; _didIteratorError = false; _iteratorError = undefined; _context2.prev = 8; _loop = _regenerator2.default.mark(function _loop() { var dirName, subDir, states, filePaths, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, filePath, state; return _regenerator2.default.wrap(function _loop$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: dirName = _step.value; subDir = _path2.default.resolve(directory, dirName); states = []; _context.next = 5; return _fsExtra2.default.stat(subDir); case 5: if (!_context.sent.isDirectory()) { _context.next = 39; break; } _context.next = 8; return _fsExtra2.default.readdir(subDir); case 8: _context.t0 = function (fileName) { return fileName.endsWith(EXTENSION); }; _context.t1 = function (fileName) { return _path2.default.resolve(subDir, fileName); }; filePaths = _context.sent.filter(_context.t0).map(_context.t1); _iteratorNormalCompletion2 = true; _didIteratorError2 = false; _iteratorError2 = undefined; _context.prev = 14; _iterator2 = (0, _getIterator3.default)(filePaths); case 16: if (_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done) { _context.next = 25; break; } filePath = _step2.value; state = new PublishState(filePath); _context.next = 21; return state.load(); case 21: states.push(state); case 22: _iteratorNormalCompletion2 = true; _context.next = 16; break; case 25: _context.next = 31; break; case 27: _context.prev = 27; _context.t2 = _context['catch'](14); _didIteratorError2 = true; _iteratorError2 = _context.t2; case 31: _context.prev = 31; _context.prev = 32; if (!_iteratorNormalCompletion2 && _iterator2.return) { _iterator2.return(); } case 34: _context.prev = 34; if (!_didIteratorError2) { _context.next = 37; break; } throw _iteratorError2; case 37: return _context.finish(34); case 38: return _context.finish(31); case 39: publishes.push(states); case 40: case 'end': return _context.stop(); } } }, _loop, _this, [[14, 27, 31, 39], [32,, 34, 38]]); }); _context2.t0 = _getIterator3.default; _context2.next = 13; return _fsExtra2.default.readdir(directory); case 13: _context2.t1 = _context2.sent; _iterator = (0, _context2.t0)(_context2.t1); case 15: if (_iteratorNormalCompletion = (_step = _iterator.next()).done) { _context2.next = 20; break; } return _context2.delegateYield(_loop(), 't2', 17); case 17: _iteratorNormalCompletion = true; _context2.next = 15; break; case 20: _context2.next = 26; break; case 22: _context2.prev = 22; _context2.t3 = _context2['catch'](8); _didIteratorError = true; _iteratorError = _context2.t3; case 26: _context2.prev = 26; _context2.prev = 27; if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } case 29: _context2.prev = 29; if (!_didIteratorError) { _context2.next = 32; break; } throw _iteratorError; case 32: return _context2.finish(29); case 33: return _context2.finish(26); case 34: return _context2.abrupt('return', publishes); case 35: case 'end': return _context2.stop(); } } }, _callee, this, [[8, 22, 26, 34], [27,, 29, 33]]); })); function loadFromDirectory(_x) { return _ref.apply(this, arguments); } return loadFromDirectory; }() }, { key: 'saveToDirectory', value: function () { var _ref2 = (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee2(directory, artifacts) { var id, _iteratorNormalCompletion3, _didIteratorError3, _iteratorError3, _iterator3, _step3, artifact, state; return _regenerator2.default.wrap(function _callee2$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: id = _crypto2.default.createHash('md5').update((0, _stringify2.default)(artifacts)).digest('hex'); _iteratorNormalCompletion3 = true; _didIteratorError3 = false; _iteratorError3 = undefined; _context3.prev = 4; _iterator3 = (0, _getIterator3.default)(artifacts); case 6: if (_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done) { _context3.next = 15; break; } artifact = _step3.value; state = new PublishState(_path2.default.resolve(directory, id, 'null'), '', false); state.setState({ paths: (0, _from2.default)(artifact), platform: artifact.platform, arch: artifact.arch, packageJSON: artifact.packageJSON, forgeConfig: artifact.forgeConfig }); _context3.next = 12; return state.saveToDisk(); case 12: _iteratorNormalCompletion3 = true; _context3.next = 6; break; case 15: _context3.next = 21; break; case 17: _context3.prev = 17; _context3.t0 = _context3['catch'](4); _didIteratorError3 = true; _iteratorError3 = _context3.t0; case 21: _context3.prev = 21; _context3.prev = 22; if (!_iteratorNormalCompletion3 && _iterator3.return) { _iterator3.return(); } case 24: _context3.prev = 24; if (!_didIteratorError3) { _context3.next = 27; break; } throw _iteratorError3; case 27: return _context3.finish(24); case 28: return _context3.finish(21); case 29: case 'end': return _context3.stop(); } } }, _callee2, this, [[4, 17, 21, 29], [22,, 24, 28]]); })); function saveToDirectory(_x2, _x3) { return _ref2.apply(this, arguments); } return saveToDirectory; }() }]); function PublishState(filePath) { var hasHash = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; (0, _classCallCheck3.default)(this, PublishState); this.dir = _path2.default.dirname(filePath); this.path = filePath; this.hasHash = hasHash; } (0, _createClass3.default)(PublishState, [{ key: 'generateHash', value: function generateHash() { var content = (0, _stringify2.default)(this.state || {}); return _crypto2.default.createHash('md5').update(content).digest('hex'); } }, { key: 'setState', value: function setState(state) { this.state = state; } }, { key: 'load', value: function () { var _ref3 = (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee3() { return _regenerator2.default.wrap(function _callee3$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: _context4.next = 2; return _fsExtra2.default.readJson(this.path); case 2: this.state = _context4.sent; case 3: case 'end': return _context4.stop(); } } }, _callee3, this); })); function load() { return _ref3.apply(this, arguments); } return load; }() }, { key: 'saveToDisk', value: function () { var _ref4 = (0, _bluebird.coroutine)(_regenerator2.default.mark(function _callee4() { return _regenerator2.default.wrap(function _callee4$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: if (!this.hasHash) { this.path = _path2.default.resolve(this.dir, '' + this.generateHash() + EXTENSION); this.hasHash = true; } _context5.next = 3; return _fsExtra2.default.mkdirs(_path2.default.dirname(this.path)); case 3: _context5.next = 5; return _fsExtra2.default.writeJson(this.path, this.state); case 5: case 'end': return _context5.stop(); } } }, _callee4, this); })); function saveToDisk() { return _ref4.apply(this, arguments); } return saveToDisk; }() }]); return PublishState; }(); exports.default = PublishState; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInV0aWwvcHVibGlzaC1zdGF0ZS5qcyJdLCJuYW1lcyI6WyJFWFRFTlNJT04iLCJQdWJsaXNoU3RhdGUiLCJkaXJlY3RvcnkiLCJleGlzdHMiLCJFcnJvciIsInB1Ymxpc2hlcyIsImRpck5hbWUiLCJzdWJEaXIiLCJyZXNvbHZlIiwic3RhdGVzIiwic3RhdCIsImlzRGlyZWN0b3J5IiwicmVhZGRpciIsImZpbGVOYW1lIiwiZW5kc1dpdGgiLCJmaWxlUGF0aHMiLCJmaWx0ZXIiLCJtYXAiLCJmaWxlUGF0aCIsInN0YXRlIiwibG9hZCIsInB1c2giLCJhcnRpZmFjdHMiLCJpZCIsImNyZWF0ZUhhc2giLCJ1cGRhdGUiLCJkaWdlc3QiLCJhcnRpZmFjdCIsInNldFN0YXRlIiwicGF0aHMiLCJwbGF0Zm9ybSIsImFyY2giLCJwYWNrYWdlSlNPTiIsImZvcmdlQ29uZmlnIiwic2F2ZVRvRGlzayIsImhhc0hhc2giLCJkaXIiLCJkaXJuYW1lIiwicGF0aCIsImNvbnRlbnQiLCJyZWFkSnNvbiIsImdlbmVyYXRlSGFzaCIsIm1rZGlycyIsIndyaXRlSnNvbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7OztBQUNBOzs7O0FBQ0E7Ozs7OztBQUVBLElBQU1BLFlBQVksZ0JBQWxCOztJQUVxQkMsWTs7OztzRkFDWUMsUzs7Ozs7Ozs7Ozt1QkFDbEIsa0JBQUdDLE1BQUgsQ0FBVUQsU0FBVixDOzs7Ozs7OztzQkFDSCxJQUFJRSxLQUFKLGdFQUF1RUYsU0FBdkUsQzs7O0FBR0ZHLHlCLEdBQVksRTs7Ozs7Ozs7Ozs7O0FBQ1BDLGlDO0FBQ0hDLGdDLEdBQVMsZUFBS0MsT0FBTCxDQUFhTixTQUFiLEVBQXdCSSxPQUF4QixDO0FBQ1RHLGdDLEdBQVMsRTs7aUNBQ0osa0JBQUdDLElBQUgsQ0FBUUgsTUFBUixDOzs7NkNBQWlCSSxXOzs7Ozs7aUNBQ0Qsa0JBQUdDLE9BQUgsQ0FBV0wsTUFBWCxDOzs7d0NBQ2Y7QUFBQSxtQ0FBWU0sU0FBU0MsUUFBVCxDQUFrQmQsU0FBbEIsQ0FBWjtBQUFBLDJCOzt3Q0FDSDtBQUFBLG1DQUFZLGVBQUtRLE9BQUwsQ0FBYUQsTUFBYixFQUFxQk0sUUFBckIsQ0FBWjtBQUFBLDJCOztBQUZERSxtQyxpQkFDSEMsTSxjQUNBQyxHOzs7OztrRUFFb0JGLFM7Ozs7Ozs7O0FBQVpHLGtDO0FBQ0hDLCtCLEdBQVEsSUFBSWxCLFlBQUosQ0FBaUJpQixRQUFqQixDOztpQ0FDUkMsTUFBTUMsSUFBTixFOzs7QUFDTlgsaUNBQU9ZLElBQVAsQ0FBWUYsS0FBWjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0pkLG9DQUFVZ0IsSUFBVixDQUFlWixNQUFmOzs7Ozs7Ozs7Ozt1QkFkMEIsa0JBQUdHLE9BQUgsQ0FBV1YsU0FBWCxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7a0RBZ0JyQkcsUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozt3RkFHb0JILFMsRUFBV29CLFM7Ozs7Ozs7QUFDaENDLGtCLEdBQUssaUJBQU9DLFVBQVAsQ0FBa0IsS0FBbEIsRUFBeUJDLE1BQXpCLENBQWdDLHlCQUFlSCxTQUFmLENBQWhDLEVBQTJESSxNQUEzRCxDQUFrRSxLQUFsRSxDOzs7Ozt3REFDWUosUzs7Ozs7Ozs7QUFBWkssd0I7QUFDSFIscUIsR0FBUSxJQUFJbEIsWUFBSixDQUFpQixlQUFLTyxPQUFMLENBQWFOLFNBQWIsRUFBd0JxQixFQUF4QixFQUE0QixNQUE1QixDQUFqQixFQUFzRCxFQUF0RCxFQUEwRCxLQUExRCxDOztBQUNkSixzQkFBTVMsUUFBTixDQUFlO0FBQ2JDLHlCQUFPLG9CQUFXRixRQUFYLENBRE07QUFFYkcsNEJBQVVILFNBQVNHLFFBRk47QUFHYkMsd0JBQU1KLFNBQVNJLElBSEY7QUFJYkMsK0JBQWFMLFNBQVNLLFdBSlQ7QUFLYkMsK0JBQWFOLFNBQVNNO0FBTFQsaUJBQWY7O3VCQU9NZCxNQUFNZSxVQUFOLEU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUlWLHdCQUFZaEIsUUFBWixFQUFzQztBQUFBLFFBQWhCaUIsT0FBZ0IsdUVBQU4sSUFBTTtBQUFBOztBQUNwQyxTQUFLQyxHQUFMLEdBQVcsZUFBS0MsT0FBTCxDQUFhbkIsUUFBYixDQUFYO0FBQ0EsU0FBS29CLElBQUwsR0FBWXBCLFFBQVo7QUFDQSxTQUFLaUIsT0FBTCxHQUFlQSxPQUFmO0FBQ0Q7Ozs7bUNBRWM7QUFDYixVQUFNSSxVQUFVLHlCQUFlLEtBQUtwQixLQUFMLElBQWMsRUFBN0IsQ0FBaEI7QUFDQSxhQUFPLGlCQUFPSyxVQUFQLENBQWtCLEtBQWxCLEVBQXlCQyxNQUF6QixDQUFnQ2MsT0FBaEMsRUFBeUNiLE1BQXpDLENBQWdELEtBQWhELENBQVA7QUFDRDs7OzZCQUVRUCxLLEVBQU87QUFDZCxXQUFLQSxLQUFMLEdBQWFBLEtBQWI7QUFDRDs7Ozs7Ozs7Ozt1QkFHb0Isa0JBQUdxQixRQUFILENBQVksS0FBS0YsSUFBakIsQzs7O0FBQW5CLHFCQUFLbkIsSzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBSUwsb0JBQUksQ0FBQyxLQUFLZ0IsT0FBVixFQUFtQjtBQUNqQix1QkFBS0csSUFBTCxHQUFZLGVBQUs5QixPQUFMLENBQWEsS0FBSzRCLEdBQWxCLE9BQTBCLEtBQUtLLFlBQUwsRUFBMUIsR0FBZ0R6QyxTQUFoRCxDQUFaO0FBQ0EsdUJBQUttQyxPQUFMLEdBQWUsSUFBZjtBQUNEOzs7dUJBRUssa0JBQUdPLE1BQUgsQ0FBVSxlQUFLTCxPQUFMLENBQWEsS0FBS0MsSUFBbEIsQ0FBVixDOzs7O3VCQUNBLGtCQUFHSyxTQUFILENBQWEsS0FBS0wsSUFBbEIsRUFBd0IsS0FBS25CLEtBQTdCLEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tCQW5FV2xCLFkiLCJmaWxlIjoidXRpbC9wdWJsaXNoLXN0YXRlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuXG5jb25zdCBFWFRFTlNJT04gPSAnLmZvcmdlLnB1Ymxpc2gnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQdWJsaXNoU3RhdGUge1xuICBzdGF0aWMgYXN5bmMgbG9hZEZyb21EaXJlY3RvcnkoZGlyZWN0b3J5KSB7XG4gICAgaWYgKCFhd2FpdCBmcy5leGlzdHMoZGlyZWN0b3J5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBdHRlbXB0ZWQgdG8gbG9hZCBwdWJsaXNoIHN0YXRlIGZyb20gYSBtaXNzaW5nIGRpcmVjdG9yeTogJHtkaXJlY3Rvcnl9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcHVibGlzaGVzID0gW107XG4gICAgZm9yIChjb25zdCBkaXJOYW1lIG9mIGF3YWl0IGZzLnJlYWRkaXIoZGlyZWN0b3J5KSkge1xuICAgICAgY29uc3Qgc3ViRGlyID0gcGF0aC5yZXNvbHZlKGRpcmVjdG9yeSwgZGlyTmFtZSk7XG4gICAgICBjb25zdCBzdGF0ZXMgPSBbXTtcbiAgICAgIGlmICgoYXdhaXQgZnMuc3RhdChzdWJEaXIpKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRocyA9IChhd2FpdCBmcy5yZWFkZGlyKHN1YkRpcikpXG4gICAgICAgICAgLmZpbHRlcihmaWxlTmFtZSA9PiBmaWxlTmFtZS5lbmRzV2l0aChFWFRFTlNJT04pKVxuICAgICAgICAgIC5tYXAoZmlsZU5hbWUgPT4gcGF0aC5yZXNvbHZlKHN1YkRpciwgZmlsZU5hbWUpKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVQYXRocykge1xuICAgICAgICAgIGNvbnN0IHN0YXRlID0gbmV3IFB1Ymxpc2hTdGF0ZShmaWxlUGF0aCk7XG4gICAgICAgICAgYXdhaXQgc3RhdGUubG9hZCgpO1xuICAgICAgICAgIHN0YXRlcy5wdXNoKHN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcHVibGlzaGVzLnB1c2goc3RhdGVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHB1Ymxpc2hlcztcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBzYXZlVG9EaXJlY3RvcnkoZGlyZWN0b3J5LCBhcnRpZmFjdHMpIHtcbiAgICBjb25zdCBpZCA9IGNyeXB0by5jcmVhdGVIYXNoKCdtZDUnKS51cGRhdGUoSlNPTi5zdHJpbmdpZnkoYXJ0aWZhY3RzKSkuZGlnZXN0KCdoZXgnKTtcbiAgICBmb3IgKGNvbnN0IGFydGlmYWN0IG9mIGFydGlmYWN0cykge1xuICAgICAgY29uc3Qgc3RhdGUgPSBuZXcgUHVibGlzaFN0YXRlKHBhdGgucmVzb2x2ZShkaXJlY3RvcnksIGlkLCAnbnVsbCcpLCAnJywgZmFsc2UpO1xuICAgICAgc3RhdGUuc2V0U3RhdGUoe1xuICAgICAgICBwYXRoczogQXJyYXkuZnJvbShhcnRpZmFjdCksXG4gICAgICAgIHBsYXRmb3JtOiBhcnRpZmFjdC5wbGF0Zm9ybSxcbiAgICAgICAgYXJjaDogYXJ0aWZhY3QuYXJjaCxcbiAgICAgICAgcGFja2FnZUpTT046IGFydGlmYWN0LnBhY2thZ2VKU09OLFxuICAgICAgICBmb3JnZUNvbmZpZzogYXJ0aWZhY3QuZm9yZ2VDb25maWcsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHN0YXRlLnNhdmVUb0Rpc2soKTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihmaWxlUGF0aCwgaGFzSGFzaCA9IHRydWUpIHtcbiAgICB0aGlzLmRpciA9IHBhdGguZGlybmFtZShmaWxlUGF0aCk7XG4gICAgdGhpcy5wYXRoID0gZmlsZVBhdGg7XG4gICAgdGhpcy5oYXNIYXNoID0gaGFzSGFzaDtcbiAgfVxuXG4gIGdlbmVyYXRlSGFzaCgpIHtcbiAgICBjb25zdCBjb250ZW50ID0gSlNPTi5zdHJpbmdpZnkodGhpcy5zdGF0ZSB8fCB7fSk7XG4gICAgcmV0dXJuIGNyeXB0by5jcmVhdGVIYXNoKCdtZDUnKS51cGRhdGUoY29udGVudCkuZGlnZXN0KCdoZXgnKTtcbiAgfVxuXG4gIHNldFN0YXRlKHN0YXRlKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICB9XG5cbiAgYXN5bmMgbG9hZCgpIHtcbiAgICB0aGlzLnN0YXRlID0gYXdhaXQgZnMucmVhZEpzb24odGhpcy5wYXRoKTtcbiAgfVxuXG4gIGFzeW5jIHNhdmVUb0Rpc2soKSB7XG4gICAgaWYgKCF0aGlzLmhhc0hhc2gpIHtcbiAgICAgIHRoaXMucGF0aCA9IHBhdGgucmVzb2x2ZSh0aGlzLmRpciwgYCR7dGhpcy5nZW5lcmF0ZUhhc2goKX0ke0VYVEVOU0lPTn1gKTtcbiAgICAgIHRoaXMuaGFzSGFzaCA9IHRydWU7XG4gICAgfVxuXG4gICAgYXdhaXQgZnMubWtkaXJzKHBhdGguZGlybmFtZSh0aGlzLnBhdGgpKTtcbiAgICBhd2FpdCBmcy53cml0ZUpzb24odGhpcy5wYXRoLCB0aGlzLnN0YXRlKTtcbiAgfVxufVxuIl19