UNPKG

zater-docx-pdf2

Version:
339 lines (285 loc) 41.9 kB
'use strict'; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _ErrorDocxPdf = require('../lib/ErrorDocxPdf'); var _ErrorDocxPdf2 = _interopRequireDefault(_ErrorDocxPdf); var _path = require('path'); var _path2 = _interopRequireDefault(_path); var _date = require('../lib/date'); var _date2 = _interopRequireDefault(_date); var _base64IMGtoBuffer = require('../lib/base64IMGtoBuffer'); var _base64IMGtoBuffer2 = _interopRequireDefault(_base64IMGtoBuffer); var _ContractDecorator = require('../decorators/ContractDecorator'); var _ContractDecorator2 = _interopRequireDefault(_ContractDecorator); var _nodeFetch = require('node-fetch'); var _nodeFetch2 = _interopRequireDefault(_nodeFetch); var _moment = require('moment'); var _moment2 = _interopRequireDefault(_moment); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } const numeroPorExtenso = require('numero-por-extenso'); const CPF = require('cpf'); class Contract extends _ContractDecorator2.default { constructor(Docx, DigitalData, S3Storage, PdfGenerator) { super(); this.Storage = S3Storage; this.Docx = Docx; this.PdfGenerator = PdfGenerator; this.setDigitalData(DigitalData); } setConfig(config) { this.config = config; this.Storage = this.Storage(config); } makeCPF(data) { return _asyncToGenerator(function* () { const cotacao = yield (0, _nodeFetch2.default)('http://icoinomia.com.br/api/CotacaoCrypto'); let cotacaoJson = yield cotacao.json(); if (data.coin_id) { switch (data.coin_id) { case "-LTIsI_I5BwSOhFpGsUC": cotacaoJson = cotacaoJson.cotacao.find(function (row) { return row.Codigo === 'LEAXBRL'; }).Valor; data.type = +data.type + 3; if (data.type == 9) { data.type = 6; } break; case "-L8lxvN2Md2BthLFjMYp": cotacaoJson = cotacaoJson.cotacao.find(function (row) { return row.Codigo === 'BTCBRL'; }).Valor; break; } } if (Object.prototype.toString.call(data.clientWallet) === '[object Array]') { let clientWalletByCoin = data.clientWallet.filter(function (row) { if (row.coin == data.coin_id) return row; }); data.clientWallet = clientWalletByCoin[0].data.address; } else { console.log('CWALLET NÃO É UM ARRAY'); } if (!data.amountMoney) { //console.log('TAMOS AQUIII') const calculateValue = function () { if (typeof parseFloat(data.amountCrypt) !== 'number' || isNaN(parseFloat(data.amountCrypt))) throw "It's not a float amount Object!"; if (typeof parseFloat(cotacaoJson) !== 'number' || isNaN(parseFloat(cotacaoJson))) throw "It's not a float money Object"; const calc = parseFloat(data.amountCrypt) * parseFloat(cotacaoJson); return parseFloat(calc); }; const val = numeroPorExtenso.porExtenso(calculateValue(), numeroPorExtenso.estilo.monetario); const formato = { minimumFractionDigits: 2, style: 'currency', currency: 'BRL' }; data.amountMoney = `${calculateValue().toLocaleString('pt-BR', formato)} (${val})`; // console.log('não veio o amount money') // console.log(data.amountMoney) // console.log('TAMOS AQUIII') // console.log('VIXI VAI VENDO') } if (Object.prototype.toString.call(data.coins) === '[object Array]') { data.contractCoin = data.coins[0]; } else { console.log('COIN NÃO É UM ARRAY'); } let bankName = data.bank.name.replace("#", " "); // console.log(bankName) // console.log(data.contractPorcent) // console.log(data.contractPorcentTotal) // console.log(data.duration) const contract = _extends({ contractCoin: data.contractCoin, investmentId: data.id, type: data.type, duration: data.duration, penaltyPorcent: data.penaltyPorcent || 0, penaltyAdv: data.penaltyAdv || 0, clientName: data.clientName || 'Daniel Silva Miranda', productName: data.productName || 'Produto de Testes', managerName: data.managerName || 'Daniel Silva Miranda', contractNumber: data.contractNumber || 'Exemplo', contractEnd: data.contractEnd || '00/00/0000', contractTaxe: data.contractTaxe || 0, contractTrade: data.contractTrade || 0, amountCrypt: data.amountCrypt || 0, contractPorcent: data.contractPorcent || 0, contractPorcentTotal: data.contractPorcentTotal || 0, bankName: bankName, bankTitular: data.bank.userName || 'BTC Banco', bankAgency: data.bank.agency || '0000', bankAccount: data.bank.account || '0000-00', bankCode: data.bank.code || '0000-00', // eslint-disable-next-line image: (0, _base64IMGtoBuffer2.default)(data.image), vpSignature: 'data:image/png;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7', comercialSignature: 'data:image/png;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7', firstRandomSignature: 'data:image/png;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7', secondRandomSignature: 'data:image/png;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7', amountMoney: data.amountMoney }, (0, _date2.default)(), { clientCPF: `${data.clientCPF ? CPF.format(data.clientCPF) : ''}`, date: (0, _moment2.default)(new Date()).format('DD/MM/YYYY'), clientWallet: data.clientWallet || '1CfUYUVsc1gb9caCDQjwTwQ8jDY3B1ZRU3', clientResume: `${data.clientName}, natural de ${data.clientNationality}, ${data.clientCivilState}, ${data.clientOccupation}, portador do RG nº ${data.clientRG}, inscrito no CPF sob o nº ${data.clientCPF ? CPF.format(data.clientCPF) : ''}, residente e domiciliado a ${data.clientStreet} ${data.clientComplement || ''}, CEP ${data.clientCEP}, ${data.clientCity} ${data.clientState}` || ' ' }); return contract; })(); } makeCNPJ(data) { var _this = this; return _asyncToGenerator(function* () { const result = yield _this.makeCPF(data); result.clientName = data.socialReason; const contract = _extends({}, result, { clientResume: `${data.socialReason}, pessoa jurídica de direito privado, inscrita no CNPJ nº ${data.clientCNPJ}, com sede na ${data.companyStreet}${data.companyComplement ? ' ' + data.companyComplement : ''}, CEP ${data.companyCEP}, ${data.companyCity}, ${data.companyState}, representado por ${data.partnerClientName}, ${data.partnerCivilState}${data.partnerProfession != '' ? ', ' + data.partnerProfession : ''}, portador do RG nº ${data.partnerPersonalRegister}, inscrito no CPF sob o nº ${CPF.format(data.partnerPersonalDocument)}, residente e domiciliado a ${data.partnerAddress} ${data.partnerAddressComplement ? ' ' + data.partnerAddressComplement : ''}, CEP ${data.partnerPostalCode}` }); return contract; })(); } make(userId, dataContract, config) { var _this2 = this; return _asyncToGenerator(function* () { try { yield _this2.setConfig(config.aws); yield _this2.setType(config.contract); dataContract.contractNumber = yield _this2.generatorLast(); if (_this2.config === undefined) throw new _ErrorDocxPdf2.default('Configuração não inicializada'); let data; // let file; if (dataContract.clientCNPJ !== undefined) { data = yield _this2.makeCNPJ(dataContract); // file = path.resolve(__dirname, './../../assets/docEx.docx'); } else { data = yield _this2.makeCPF(dataContract); // file = path.resolve(__dirname, './../../assets/docEx.docx'); } yield _this2.PdfGenerator.generate(data, userId, false); return Promise.resolve(_this2.Storage.setBucket(config.bucket)).then(function () { return _this2.Storage.setDestinationDir('contracts'); }) // .then(() => this.Docx.makeContract(file, data)) // .then(() => this.PdfGenerator.generate(data)) // .then(res => Buffer.from(res, 'base64')) // .then(res => this.Storage.setFileBuffer({ data: res, type: 'pdf' })) .then(function () { return _this2.Storage.setFile(`./${userId}.pdf`); }).then(function () { return _this2.Storage.upload(); }).then(function (res) { return JSON.stringify(res); }).then(function (res) { return JSON.parse(res); }).then(function (res) { return Promise.resolve(data).then(function (result) { return _extends({}, result, { contractUrl: res.Location, status: 'Ativo' }); }); }).then(function (res) { return _this2.save(userId, res); }).catch(function (e) { throw e; }); } catch (e) { return Promise.reject(e); } })(); } view(dataContract, config) { var _this3 = this; return _asyncToGenerator(function* () { //console.log(dataContract) try { yield _this3.setConfig(config.aws); yield _this3.setType(config.contract); if (_this3.config === undefined) throw new _ErrorDocxPdf2.default('Configuração não inicializada'); const data = dataContract; yield _this3.PdfGenerator.generate(data, data.clientId, false); return Promise.resolve(_this3.Storage.setBucket(config.bucket)).then(function () { return _this3.Storage.setDestinationDir('contracts'); }).then(function () { return _this3.Storage.setFile(`./${data.clientId}.pdf`); }).then(function () { return _this3.Storage.upload(); }).then(function (res) { return Promise.resolve(data).then(function (result) { return _extends({}, result, { contractUrl: res.Location, status: 'Ativo' }); }); }).then(function (res) { return _this3.update(res); }).catch(function (e) { throw e; }); } catch (e) { return Promise.reject(e); } })(); } insertSignature(userId, dataContract, config) { var _this4 = this; return _asyncToGenerator(function* () { try { yield _this4.setConfig(config.aws); yield _this4.setType(config.contract); if (_this4.config === undefined) throw new _ErrorDocxPdf2.default('Configuração não inicializada'); const data = yield _this4.makeDocument(dataContract.data); // data.image = dataContract.data.image; // console.log('AQUI TEM QUE TER TODOS OS DADOS DO DOCUMENTO CERTINHOOOOOOO') // console.log(data) yield _this4.PdfGenerator.generate(data, userId, true); return Promise.resolve(_this4.Storage.setBucket(config.bucket)).then(function () { return _this4.Storage.setDestinationDir('contracts'); }) //.then(() => this.Docx.makeContract(file, dataContract.data)) //.then(res => Buffer.from(res, 'base64')) //.then(res => this.Storage.setFileBuffer({ data: res, type: 'docx' })) .then(function () { return _this4.Storage.setFile('./' + userId + '.pdf'); }).then(function () { return _this4.Storage.upload(); }).then(function (res) { return JSON.stringify(res); }).then(function (res) { return JSON.parse(res); }).then(function (res) { let dataReturn = {}; dataReturn.contractUrl = res.Location; dataReturn.status = 'Assinado'; return dataReturn; }).then(function (res) { return _this4.update(res, dataContract.id); }).catch(function (e) { throw e; }); } catch (e) { return Promise.reject(e); } })(); } makeDocument(dataContract) { var _this5 = this; return _asyncToGenerator(function* () { if (dataContract.clientCNPJ !== undefined) { return yield _this5.makeCNPJ(dataContract); //file = path.resolve(__dirname, './../../assets/docEx.docx'); } else { return yield _this5.makeCPF(dataContract); //file = path.resolve(__dirname, './../../assets/docEx.docx'); } })(); } } module.exports = (Docx, DigitalData, Storage, PdfGenerator) => new Contract(Docx, DigitalData, Storage, PdfGenerator); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kb21haW4vQ29udHJhY3QuanMiXSwibmFtZXMiOlsibnVtZXJvUG9yRXh0ZW5zbyIsInJlcXVpcmUiLCJDUEYiLCJDb250cmFjdCIsIkNvbnRyYWN0RGVjb3JhdG9yIiwiY29uc3RydWN0b3IiLCJEb2N4IiwiRGlnaXRhbERhdGEiLCJTM1N0b3JhZ2UiLCJQZGZHZW5lcmF0b3IiLCJTdG9yYWdlIiwic2V0RGlnaXRhbERhdGEiLCJzZXRDb25maWciLCJjb25maWciLCJtYWtlQ1BGIiwiZGF0YSIsImNvdGFjYW8iLCJjb3RhY2FvSnNvbiIsImpzb24iLCJjb2luX2lkIiwiZmluZCIsInJvdyIsIkNvZGlnbyIsIlZhbG9yIiwidHlwZSIsIk9iamVjdCIsInByb3RvdHlwZSIsInRvU3RyaW5nIiwiY2FsbCIsImNsaWVudFdhbGxldCIsImNsaWVudFdhbGxldEJ5Q29pbiIsImZpbHRlciIsImNvaW4iLCJhZGRyZXNzIiwiY29uc29sZSIsImxvZyIsImFtb3VudE1vbmV5IiwiY2FsY3VsYXRlVmFsdWUiLCJwYXJzZUZsb2F0IiwiYW1vdW50Q3J5cHQiLCJpc05hTiIsImNhbGMiLCJ2YWwiLCJwb3JFeHRlbnNvIiwiZXN0aWxvIiwibW9uZXRhcmlvIiwiZm9ybWF0byIsIm1pbmltdW1GcmFjdGlvbkRpZ2l0cyIsInN0eWxlIiwiY3VycmVuY3kiLCJ0b0xvY2FsZVN0cmluZyIsImNvaW5zIiwiY29udHJhY3RDb2luIiwiYmFua05hbWUiLCJiYW5rIiwibmFtZSIsInJlcGxhY2UiLCJjb250cmFjdCIsImludmVzdG1lbnRJZCIsImlkIiwiZHVyYXRpb24iLCJwZW5hbHR5UG9yY2VudCIsInBlbmFsdHlBZHYiLCJjbGllbnROYW1lIiwicHJvZHVjdE5hbWUiLCJtYW5hZ2VyTmFtZSIsImNvbnRyYWN0TnVtYmVyIiwiY29udHJhY3RFbmQiLCJjb250cmFjdFRheGUiLCJjb250cmFjdFRyYWRlIiwiY29udHJhY3RQb3JjZW50IiwiY29udHJhY3RQb3JjZW50VG90YWwiLCJiYW5rVGl0dWxhciIsInVzZXJOYW1lIiwiYmFua0FnZW5jeSIsImFnZW5jeSIsImJhbmtBY2NvdW50IiwiYWNjb3VudCIsImJhbmtDb2RlIiwiY29kZSIsImltYWdlIiwidnBTaWduYXR1cmUiLCJjb21lcmNpYWxTaWduYXR1cmUiLCJmaXJzdFJhbmRvbVNpZ25hdHVyZSIsInNlY29uZFJhbmRvbVNpZ25hdHVyZSIsImNsaWVudENQRiIsImZvcm1hdCIsImRhdGUiLCJEYXRlIiwiY2xpZW50UmVzdW1lIiwiY2xpZW50TmF0aW9uYWxpdHkiLCJjbGllbnRDaXZpbFN0YXRlIiwiY2xpZW50T2NjdXBhdGlvbiIsImNsaWVudFJHIiwiY2xpZW50U3RyZWV0IiwiY2xpZW50Q29tcGxlbWVudCIsImNsaWVudENFUCIsImNsaWVudENpdHkiLCJjbGllbnRTdGF0ZSIsIm1ha2VDTlBKIiwicmVzdWx0Iiwic29jaWFsUmVhc29uIiwiY2xpZW50Q05QSiIsImNvbXBhbnlTdHJlZXQiLCJjb21wYW55Q29tcGxlbWVudCIsImNvbXBhbnlDRVAiLCJjb21wYW55Q2l0eSIsImNvbXBhbnlTdGF0ZSIsInBhcnRuZXJDbGllbnROYW1lIiwicGFydG5lckNpdmlsU3RhdGUiLCJwYXJ0bmVyUHJvZmVzc2lvbiIsInBhcnRuZXJQZXJzb25hbFJlZ2lzdGVyIiwicGFydG5lclBlcnNvbmFsRG9jdW1lbnQiLCJwYXJ0bmVyQWRkcmVzcyIsInBhcnRuZXJBZGRyZXNzQ29tcGxlbWVudCIsInBhcnRuZXJQb3N0YWxDb2RlIiwibWFrZSIsInVzZXJJZCIsImRhdGFDb250cmFjdCIsImF3cyIsInNldFR5cGUiLCJnZW5lcmF0b3JMYXN0IiwidW5kZWZpbmVkIiwiRXJyb3JEb2N4UGRmIiwiZ2VuZXJhdGUiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNldEJ1Y2tldCIsImJ1Y2tldCIsInRoZW4iLCJzZXREZXN0aW5hdGlvbkRpciIsInNldEZpbGUiLCJ1cGxvYWQiLCJKU09OIiwic3RyaW5naWZ5IiwicmVzIiwicGFyc2UiLCJjb250cmFjdFVybCIsIkxvY2F0aW9uIiwic3RhdHVzIiwic2F2ZSIsImNhdGNoIiwiZSIsInJlamVjdCIsInZpZXciLCJjbGllbnRJZCIsInVwZGF0ZSIsImluc2VydFNpZ25hdHVyZSIsIm1ha2VEb2N1bWVudCIsImRhdGFSZXR1cm4iLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7O0FBQ0EsTUFBTUEsbUJBQW1CQyxRQUFRLG9CQUFSLENBQXpCO0FBQ0EsTUFBTUMsTUFBTUQsUUFBUSxLQUFSLENBQVo7O0FBRUEsTUFBTUUsUUFBTixTQUF1QkMsMkJBQXZCLENBQXlDO0FBQ3hDQyxhQUFZQyxJQUFaLEVBQWtCQyxXQUFsQixFQUErQkMsU0FBL0IsRUFBMENDLFlBQTFDLEVBQXdEO0FBQ3ZEO0FBQ0EsT0FBS0MsT0FBTCxHQUFlRixTQUFmO0FBQ0EsT0FBS0YsSUFBTCxHQUFZQSxJQUFaO0FBQ0EsT0FBS0csWUFBTCxHQUFvQkEsWUFBcEI7QUFDQSxPQUFLRSxjQUFMLENBQW9CSixXQUFwQjtBQUNBOztBQUVESyxXQUFVQyxNQUFWLEVBQWtCO0FBQ2pCLE9BQUtBLE1BQUwsR0FBY0EsTUFBZDtBQUNBLE9BQUtILE9BQUwsR0FBZSxLQUFLQSxPQUFMLENBQWFHLE1BQWIsQ0FBZjtBQUNBOztBQUVLQyxRQUFOLENBQWNDLElBQWQsRUFBb0I7QUFBQTs7QUFFbkIsU0FBTUMsVUFBVSxNQUFNLHlCQUFNLDJDQUFOLENBQXRCOztBQUVFLE9BQUlDLGNBQWMsTUFBTUQsUUFBUUUsSUFBUixFQUF4Qjs7QUFHQSxPQUFHSCxLQUFLSSxPQUFSLEVBQ0E7QUFDQyxZQUFRSixLQUFLSSxPQUFiO0FBQ0MsVUFBSyxzQkFBTDtBQUNDRixvQkFBY0EsWUFBWUQsT0FBWixDQUFvQkksSUFBcEIsQ0FBeUI7QUFBQSxjQUFPQyxJQUFJQyxNQUFKLEtBQWUsU0FBdEI7QUFBQSxPQUF6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VyxnQkFBV1YsTUFBWCxHQUFvQixVQUFwQjtBQUNBLFlBQU9VLFVBQVA7QUFDQSxLQWRGLEVBZUVwQixJQWZGLENBZU87QUFBQSxZQUFPLE9BQUtpQixNQUFMLENBQVlYLEdBQVosRUFBaUJqQixhQUFhM0QsRUFBOUIsQ0FBUDtBQUFBLEtBZlAsRUFnQkVrRixLQWhCRixDQWdCUSxhQUFLO0FBQ1gsV0FBTUMsQ0FBTjtBQUNBLEtBbEJGLENBREQ7QUFxQkEsSUFuQ0QsQ0FtQ0UsT0FBT0EsQ0FBUCxFQUFVO0FBQ1gsV0FBT2pCLFFBQVFrQixNQUFSLENBQWVELENBQWYsQ0FBUDtBQUNBO0FBdENrRDtBQXVDbkQ7O0FBRUtNLGFBQU4sQ0FBbUI5QixZQUFuQixFQUFpQztBQUFBOztBQUFBO0FBQ2hDLE9BQUlBLGFBQWFoQixVQUFiLEtBQTRCb0IsU0FBaEMsRUFBMkM7QUFDMUMsV0FBTyxNQUFNLE9BQUt2QixRQUFMLENBQWNtQixZQUFkLENBQWI7QUFDQTtBQUNBLElBSEQsTUFHTztBQUNOLFdBQU8sTUFBTSxPQUFLeEcsT0FBTCxDQUFhd0csWUFBYixDQUFiO0FBQ0E7QUFDQTtBQVArQjtBQVFoQztBQXBUdUM7O0FBdVR6Q2dDLE9BQU9DLE9BQVAsR0FBaUIsQ0FBQ2pKLElBQUQsRUFBT0MsV0FBUCxFQUFvQkcsT0FBcEIsRUFBNkJELFlBQTdCLEtBQ2hCLElBQUlOLFFBQUosQ0FBYUcsSUFBYixFQUFtQkMsV0FBbkIsRUFBZ0NHLE9BQWhDLEVBQXlDRCxZQUF6QyxDQUREIiwiZmlsZSI6IkNvbnRyYWN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEVycm9yRG9jeFBkZiBmcm9tICcuLi9saWIvRXJyb3JEb2N4UGRmJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGRhdGVGb3JtYXQgZnJvbSAnLi4vbGliL2RhdGUnO1xuaW1wb3J0IGJhc2U2NElNR0J1ZmZlciBmcm9tICcuLi9saWIvYmFzZTY0SU1HdG9CdWZmZXInO1xuaW1wb3J0IENvbnRyYWN0RGVjb3JhdG9yIGZyb20gJy4uL2RlY29yYXRvcnMvQ29udHJhY3REZWNvcmF0b3InO1xuaW1wb3J0IGZldGNoIGZyb20gJ25vZGUtZmV0Y2gnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuY29uc3QgbnVtZXJvUG9yRXh0ZW5zbyA9IHJlcXVpcmUoJ251bWVyby1wb3ItZXh0ZW5zbycpO1xuY29uc3QgQ1BGID0gcmVxdWlyZSgnY3BmJyk7XG5cbmNsYXNzIENvbnRyYWN0IGV4dGVuZHMgQ29udHJhY3REZWNvcmF0b3Ige1xuXHRjb25zdHJ1Y3RvcihEb2N4LCBEaWdpdGFsRGF0YSwgUzNTdG9yYWdlLCBQZGZHZW5lcmF0b3IpIHtcblx0XHRzdXBlcigpO1xuXHRcdHRoaXMuU3RvcmFnZSA9IFMzU3RvcmFnZTtcblx0XHR0aGlzLkRvY3ggPSBEb2N4O1xuXHRcdHRoaXMuUGRmR2VuZXJhdG9yID0gUGRmR2VuZXJhdG9yO1xuXHRcdHRoaXMuc2V0RGlnaXRhbERhdGEoRGlnaXRhbERhdGEpO1xuXHR9XG5cblx0c2V0Q29uZmlnKGNvbmZpZykge1xuXHRcdHRoaXMuY29uZmlnID0gY29uZmlnO1xuXHRcdHRoaXMuU3RvcmFnZSA9IHRoaXMuU3RvcmFnZShjb25maWcpO1xuXHR9XG5cblx0YXN5bmMgbWFrZUNQRihkYXRhKSB7XG5cdFx0XG5cdFx0Y29uc3QgY290YWNhbyA9IGF3YWl0IGZldGNoKCdodHRwOi8vaWNvaW5vbWlhLmNvbS5ici9hcGkvQ290YWNhb0NyeXB0bycpO1xuICAgIFxuICAgIGxldCBjb3RhY2FvSnNvbiA9IGF3YWl0IGNvdGFjYW8uanNvbigpOyAgICBcblxuXG4gICAgaWYoZGF0YS5jb2luX2lkKVxuICAgIHtcblx0ICAgIHN3aXRjaCAoZGF0YS5jb2luX2lkKSB7XG5cdCAgICBcdGNhc2UgXCItTFRJc0lfSTVCd1NPaEZwR3NVQ1wiOlxuXHQgICAgXHRcdGNvdGFjYW9Kc29uID0gY290YWNhb0pzb24uY290YWNhby5maW5kKHJvdyA9PiByb3cuQ29kaWdvID09PSAnTEVBWEJSTCcpLlZhbG9yO1xuXHRcdFx0XHRcdGRhdGEudHlwZSA9ICtkYXRhLnR5cGUgKyAzIDtcblx0XHRcdFx0XHRpZihkYXRhLnR5cGUgPT0gOSlcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRkYXRhLnR5cGUgPSA2XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHQgICAgXHRjYXNlIFwiLUw4bHh2TjJNZDJCdGhMRmpNWXBcIjpcblx0ICAgIFx0XHRjb3RhY2FvSnNvbiA9IGNvdGFjYW9Kc29uLmNvdGFjYW8uZmluZChyb3cgPT4gcm93LkNvZGlnbyA9PT0gJ0JUQ0JSTCcpLlZhbG9yO1xuXHQgICAgXHRcdGJyZWFrO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIGlmKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkYXRhLmNsaWVudFdhbGxldCkgPT09ICdbb2JqZWN0IEFycmF5XScpXG5cdCAge1xuXHQgIFx0bGV0IGNsaWVudFdhbGxldEJ5Q29pbiA9IGRhdGEuY2xpZW50V2FsbGV0LmZpbHRlcihmdW5jdGlvbihyb3cpe1xuXHQgICAgXHRpZihyb3cuY29pbiA9PSBkYXRhLmNvaW5faWQpXG5cdCAgICBcdFx0cmV0dXJuIHJvd1xuXHQgICAgfSlcblx0ICBcdGRhdGEuY2xpZW50V2FsbGV0ID0gY2xpZW50V2FsbGV0QnlDb2luWzBdLmRhdGEuYWRkcmVzc1x0XHRcblx0ICB9ZWxzZSB7XG5cdCAgXHRjb25zb2xlLmxvZygnQ1dBTExFVCBOw4NPIMOJIFVNIEFSUkFZJylcblx0ICB9XG5cblx0ICBpZighZGF0YS5hbW91bnRNb25leSlcblx0ICB7XG5cdCAgXHQvL2NvbnNvbGUubG9nKCdUQU1PUyBBUVVJSUknKVxuXHQgIFx0Y29uc3QgY2FsY3VsYXRlVmFsdWUgPSAoKSA9PiB7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHR0eXBlb2YgcGFyc2VGbG9hdChkYXRhLmFtb3VudENyeXB0KSAhPT0gJ251bWJlcicgfHxcblx0XHRcdFx0XHRpc05hTihwYXJzZUZsb2F0KGRhdGEuYW1vdW50Q3J5cHQpKVxuXHRcdFx0XHQpXG5cdFx0XHRcdFx0dGhyb3cgXCJJdCdzIG5vdCBhIGZsb2F0IGFtb3VudCBPYmplY3QhXCI7XG5cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHR5cGVvZiBwYXJzZUZsb2F0KGNvdGFjYW9Kc29uKSAhPT0gJ251bWJlcicgfHxcblx0XHRcdFx0XHRpc05hTihwYXJzZUZsb2F0KGNvdGFjYW9Kc29uKSlcblx0XHRcdFx0KVxuXHRcdFx0XHRcdHRocm93IFwiSXQncyBub3QgYSBmbG9hdCBtb25leSBPYmplY3RcIjtcblxuXHRcdFx0XHRjb25zdCBjYWxjID0gcGFyc2VGbG9hdChkYXRhLmFtb3VudENyeXB0KSAqIHBhcnNlRmxvYXQoY290YWNhb0pzb24pO1xuXG5cdFx0XHRcdHJldHVybiBwYXJzZUZsb2F0KGNhbGMpO1xuXHRcdFx0fTtcblxuXHRcdFx0Y29uc3QgdmFsID0gbnVtZXJvUG9yRXh0ZW5zby5wb3JFeHRlbnNvKFxuXHRcdFx0XHRjYWxjdWxhdGVWYWx1ZSgpLFxuXHRcdFx0XHRudW1lcm9Qb3JFeHRlbnNvLmVzdGlsby5tb25ldGFyaW9cblx0XHRcdCk7XG5cdFx0XHRjb25zdCBmb3JtYXRvID0ge1xuXHRcdFx0XHRtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IDIsXG5cdFx0XHRcdHN0eWxlOiAnY3VycmVuY3knLFxuXHRcdFx0XHRjdXJyZW5jeTogJ0JSTCdcblx0XHRcdH07XG5cdFx0XHRkYXRhLmFtb3VudE1vbmV5ID0gYCR7Y2FsY3VsYXRlVmFsdWUoKS50b0xvY2FsZVN0cmluZygncHQtQlInLCBmb3JtYXRvKX0gKCR7dmFsfSlgO1xuXHRcdFx0Ly8gY29uc29sZS5sb2coJ27Do28gdmVpbyBvIGFtb3VudCBtb25leScpXG5cdFx0XHQvLyBjb25zb2xlLmxvZyhkYXRhLmFtb3VudE1vbmV5KVxuXHRcdFx0Ly8gY29uc29sZS5sb2coJ1RBTU9TIEFRVUlJSScpXG5cdFx0XHQvLyBjb25zb2xlLmxvZygnVklYSSBWQUkgVkVORE8nKVxuXHQgIH1cblx0XHRcblx0XHRpZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZGF0YS5jb2lucykgPT09ICdbb2JqZWN0IEFycmF5XScpXG5cdCAge1xuXHQgIFx0ZGF0YS5jb250cmFjdENvaW4gPSBkYXRhLmNvaW5zWzBdO1xuXHQgIH1lbHNlIHtcblx0ICBcdGNvbnNvbGUubG9nKCdDT0lOIE7Dg08gw4kgVU0gQVJSQVknKTtcblx0ICB9XG5cblx0ICBsZXQgYmFua05hbWUgPSBkYXRhLmJhbmsubmFtZS5yZXBsYWNlKFwiI1wiLCBcIiBcIik7XG5cdCAgLy8gY29uc29sZS5sb2coYmFua05hbWUpXG5cdCAgLy8gY29uc29sZS5sb2coZGF0YS5jb250cmFjdFBvcmNlbnQpXG5cdCAgLy8gY29uc29sZS5sb2coZGF0YS5jb250cmFjdFBvcmNlbnRUb3RhbClcblx0ICAvLyBjb25zb2xlLmxvZyhkYXRhLmR1cmF0aW9uKVxuXG5cdFx0Y29uc3QgY29udHJhY3QgPSB7XG5cdFx0XHRjb250cmFjdENvaW46IGRhdGEuY29udHJhY3RDb2luLFxuXHRcdFx0aW52ZXN0bWVudElkOiBkYXRhLmlkLFxuXHRcdFx0dHlwZTogZGF0YS50eXBlLFxuXHRcdFx0ZHVyYXRpb246IGRhdGEuZHVyYXRpb24sXG5cdFx0XHRwZW5hbHR5UG9yY2VudDogZGF0YS5wZW5hbHR5UG9yY2VudCB8fCAwLFxuXHRcdFx0cGVuYWx0eUFkdjogZGF0YS5wZW5hbHR5QWR2IHx8IDAsXG5cdFx0XHRjbGllbnROYW1lOiBkYXRhLmNsaWVudE5hbWUgfHwgJ0RhbmllbCBTaWx2YSBNaXJhbmRhJyxcblx0XHRcdHByb2R1Y3ROYW1lOiBkYXRhLnByb2R1Y3ROYW1lIHx8ICdQcm9kdXRvIGRlIFRlc3RlcycsXG5cdFx0XHRtYW5hZ2VyTmFtZTogZGF0YS5tYW5hZ2VyTmFtZSB8fCAnRGFuaWVsIFNpbHZhIE1pcmFuZGEnLFxuXHRcdFx0Y29udHJhY3ROdW1iZXI6IGRhdGEuY29udHJhY3ROdW1iZXIgfHwgJ0V4ZW1wbG8nLFxuXHRcdFx0Y29udHJhY3RFbmQ6IGRhdGEuY29udHJhY3RFbmQgfHwgJzAwLzAwLzAwMDAnLFxuXHRcdFx0Y29udHJhY3RUYXhlOiBkYXRhLmNvbnRyYWN0VGF4ZSB8fCAwLFxuXHRcdFx0Y29udHJhY3RUcmFkZTogZGF0YS5jb250cmFjdFRyYWRlIHx8IDAsXG5cdFx0XHRhbW91bnRDcnlwdDogZGF0YS5hbW91bnRDcnlwdCB8fCAwLFxuXHRcdFx0Y29udHJhY3RQb3JjZW50OiBkYXRhLmNvbnRyYWN0UG9yY2VudCB8fCAwLFxuXHRcdFx0Y29udHJhY3RQb3JjZW50VG90YWw6IGRhdGEuY29udHJhY3RQb3JjZW50VG90YWwgfHwgMCxcblx0XHRcdGJhbmtOYW1lOiBiYW5rTmFtZSxcblx0XHRcdGJhbmtUaXR1bGFyOiBkYXRhLmJhbmsudXNlck5hbWUgfHwgJ0JUQyBCYW5jbycsXG5cdFx0XHRiYW5rQWdlbmN5OiBkYXRhLmJhbmsuYWdlbmN5IHx8ICcwMDAwJyxcblx0XHRcdGJhbmtBY2NvdW50OiBkYXRhLmJhbmsuYWNjb3VudCB8fCAnMDAwMC0wMCcsXG5cdFx0XHRiYW5rQ29kZTogZGF0YS5iYW5rLmNvZGUgfHwgJzAwMDAtMDAnLFxuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG5cdFx0XHRpbWFnZTogYmFzZTY0SU1HQnVmZmVyKGRhdGEuaW1hZ2UpLFxuXHRcdFx0dnBTaWduYXR1cmU6XG5cdFx0XHRcdCdkYXRhOmltYWdlL3BuZztiYXNlNjQsUjBsR09EbGhBUUFCQUlBQUFBQUFBUC8vL3lINUJBRUFBQUFBTEFBQUFBQUJBQUVBQUFJQlJBQTcnLFxuXHRcdFx0Y29tZXJjaWFsU2lnbmF0dXJlOlxuXHRcdFx0XHQnZGF0YTppbWFnZS9wbmc7YmFzZTY0LFIwbEdPRGxoQVFBQkFJQUFBQUFBQVAvLy95SDVCQUVBQUFBQUxBQUFBQUFCQUFFQUFBSUJSQUE3Jyxcblx0XHRcdGZpcnN0UmFuZG9tU2lnbmF0dXJlOlxuXHRcdFx0XHQnZGF0YTppbWFnZS9wbmc7YmFzZTY0LFIwbEdPRGxoQVFBQkFJQUFBQUFBQVAvLy95SDVCQUVBQUFBQUxBQUFBQUFCQUFFQUFBSUJSQUE3Jyxcblx0XHRcdHNlY29uZFJhbmRvbVNpZ25hdHVyZTpcblx0XHRcdFx0J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxSMGxHT0RsaEFRQUJBSUFBQUFBQUFQLy8veUg1QkFFQUFBQUFMQUFBQUFBQkFBRUFBQUlCUkFBNycsXG5cdFx0XHRhbW91bnRNb25leTogZGF0YS5hbW91bnRNb25leSxcblx0XHRcdC4uLmRhdGVGb3JtYXQoKSxcblx0XHRcdGNsaWVudENQRjogYCR7ZGF0YS5jbGllbnRDUEYgPyBDUEYuZm9ybWF0KGRhdGEuY2xpZW50Q1BGKSA6ICcnfWAsXG5cdFx0XHRkYXRlOiBtb21lbnQobmV3IERhdGUoKSkuZm9ybWF0KCdERC9NTS9ZWVlZJyksXG5cdFx0XHRjbGllbnRXYWxsZXQ6IGRhdGEuY2xpZW50V2FsbGV0IHx8ICcxQ2ZVWVVWc2MxZ2I5Y2FDRFFqd1R3UThqRFkzQjFaUlUzJyxcblx0XHRcdGNsaWVudFJlc3VtZTpcblx0XHRcdFx0YCR7ZGF0YS5jbGllbnROYW1lfSwgbmF0dXJhbCBkZSAke2RhdGEuY2xpZW50TmF0aW9uYWxpdHl9LCAke1xuXHRcdFx0XHRcdGRhdGEuY2xpZW50Q2l2aWxTdGF0ZVxuXHRcdFx0XHR9LFxuICAgICAgJHtkYXRhLmNsaWVudE9jY3VwYXRpb259LFxuICAgICAgcG9ydGFkb3IgZG8gUkcgbsK6ICR7ZGF0YS5jbGllbnRSR30sIGluc2NyaXRvIG5vIENQRiBzb2IgbyBuwrogJHtcblx0XHRcdFx0XHRkYXRhLmNsaWVudENQRiA/IENQRi5mb3JtYXQoZGF0YS5jbGllbnRDUEYpIDogJydcblx0XHRcdFx0fSwgcmVzaWRlbnRlIGUgXG4gICAgICBkb21pY2lsaWFkbyBhXG4gICAgICAke2RhdGEuY2xpZW50U3RyZWV0fVxuICAgICAgJHtkYXRhLmNsaWVudENvbXBsZW1lbnQgfHwgJyd9LCBDRVAgJHtkYXRhLmNsaWVudENFUH0sICR7XG5cdFx0XHRcdFx0ZGF0YS5jbGllbnRDaXR5XG5cdFx0XHRcdH0gJHtkYXRhLmNsaWVudFN0YXRlfWAgfHwgJyAnXG5cdFx0fTtcblxuXHRcdHJldHVybiBjb250cmFjdDtcblx0fVxuXG5cdGFzeW5jIG1ha2VDTlBKKGRhdGEpIHtcblx0ICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMubWFrZUNQRihkYXRhKTtcblx0ICAgIHJlc3VsdC5jbGllbnROYW1lID0gZGF0YS5zb2NpYWxSZWFzb25cblx0XHRjb25zdCBjb250cmFjdCA9IHtcblx0XHRcdC4uLnJlc3VsdCxcblx0XHRcdGNsaWVudFJlc3VtZTogYCR7XG5cdFx0XHRcdGRhdGEuc29jaWFsUmVhc29uXG5cdFx0XHR9LCBwZXNzb2EganVyw61kaWNhIGRlIGRpcmVpdG8gcHJpdmFkbywgaW5zY3JpdGEgbm8gQ05QSiBuwrogJHtcblx0XHRcdFx0ZGF0YS5jbGllbnRDTlBKXG5cdFx0XHR9LCBjb20gc2VkZSBuYSAke2RhdGEuY29tcGFueVN0cmVldH0ke1xuXHRcdFx0XHRkYXRhLmNvbXBhbnlDb21wbGVtZW50ID8gJyAnICsgZGF0YS5jb21wYW55Q29tcGxlbWVudCA6ICcnXG5cdFx0XHR9LCBDRVAgJHtkYXRhLmNvbXBhbnlDRVB9LCAke2RhdGEuY29tcGFueUNpdHl9LCAke1xuXHRcdFx0XHRkYXRhLmNvbXBhbnlTdGF0ZVxuXHRcdFx0fSwgcmVwcmVzZW50YWRvIHBvciAke2RhdGEucGFydG5lckNsaWVudE5hbWV9LCAke2RhdGEucGFydG5lckNpdmlsU3RhdGV9JHtcblx0XHRcdFx0ZGF0YS5wYXJ0bmVyUHJvZmVzc2lvbiAhPSAnJyA/ICcsICcgKyBkYXRhLnBhcnRuZXJQcm9mZXNzaW9uIDogJydcblx0XHRcdH0sIHBvcnRhZG9yIGRvIFJHIG7CuiAke1xuXHRcdFx0XHRkYXRhLnBhcnRuZXJQZXJzb25hbFJlZ2lzdGVyXG5cdFx0XHR9LCBpbnNjcml0byBubyBDUEYgc29iIG8gbsK6ICR7Q1BGLmZvcm1hdChcblx0XHRcdFx0ZGF0YS5wYXJ0bmVyUGVyc29uYWxEb2N1bWVudFxuXHRcdFx0KX0sIHJlc2lkZW50ZSBlIGRvbWljaWxpYWRvIGEgJHtkYXRhLnBhcnRuZXJBZGRyZXNzfSAke1xuXHRcdFx0XHRkYXRhLnBhcnRuZXJBZGRyZXNzQ29tcGxlbWVudCA/ICcgJyArIGRhdGEucGFydG5lckFkZHJlc3NDb21wbGVtZW50IDogJydcblx0XHRcdH0sIENFUCAke2RhdGEucGFydG5lclBvc3RhbENvZGV9YFxuXHRcdH07XG5cdFx0cmV0dXJuIGNvbnRyYWN0O1xuXHR9XG5cblx0YXN5bmMgbWFrZSh1c2VySWQsIGRhdGFDb250cmFjdCwgY29uZmlnKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc2V0Q29uZmlnKGNvbmZpZy5hd3MpO1xuXHRcdFx0YXdhaXQgdGhpcy5zZXRUeXBlKGNvbmZpZy5jb250cmFjdCk7XG5cdFx0XHRkYXRhQ29udHJhY3QuY29udHJhY3ROdW1iZXIgPSBhd2FpdCB0aGlzLmdlbmVyYXRvckxhc3QoKTtcblx0XHRcdGlmICh0aGlzLmNvbmZpZyA9PT0gdW5kZWZpbmVkKVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3JEb2N4UGRmKCdDb25maWd1cmHDp8OjbyBuw6NvIGluaWNpYWxpemFkYScpO1xuXHRcdFx0bGV0IGRhdGE7XG5cdFx0XHQvLyBsZXQgZmlsZTtcblxuXHRcdFx0aWYgKGRhdGFDb250cmFjdC5jbGllbnRDTlBKICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0ZGF0YSA9IGF3YWl0IHRoaXMubWFrZUNOUEooZGF0YUNvbnRyYWN0KTtcblx0XHRcdFx0Ly8gZmlsZSA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuLy4uLy4uL2Fzc2V0cy9kb2NFeC5kb2N4Jyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkYXRhID0gYXdhaXQgdGhpcy5tYWtlQ1BGKGRhdGFDb250cmFjdCk7XG5cdFx0XHRcdC8vIGZpbGUgPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi8uLi8uLi9hc3NldHMvZG9jRXguZG9jeCcpO1xuXHRcdFx0fVxuXG5cdFx0XHRhd2FpdCB0aGlzLlBkZkdlbmVyYXRvci5nZW5lcmF0ZShkYXRhLCB1c2VySWQsIGZhbHNlKTtcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFByb21pc2UucmVzb2x2ZSh0aGlzLlN0b3JhZ2Uuc2V0QnVja2V0KGNvbmZpZy5idWNrZXQpKVxuXHRcdFx0XHRcdC50aGVuKCgpID0+IHRoaXMuU3RvcmFnZS5zZXREZXN0aW5hdGlvbkRpcignY29udHJhY3RzJykpXG5cdFx0XHRcdFx0Ly8gLnRoZW4oKCkgPT4gdGhpcy5Eb2N4Lm1ha2VDb250cmFjdChmaWxlLCBkYXRhKSlcblx0XHRcdFx0XHQvLyAudGhlbigoKSA9PiB0aGlzLlBkZkdlbmVyYXRvci5nZW5lcmF0ZShkYXRhKSlcblx0XHRcdFx0XHQvLyAudGhlbihyZXMgPT4gQnVmZmVyLmZyb20ocmVzLCAnYmFzZTY0JykpXG5cdFx0XHRcdFx0Ly8gLnRoZW4ocmVzID0+IHRoaXMuU3RvcmFnZS5zZXRGaWxlQnVmZmVyKHsgZGF0YTogcmVzLCB0eXBlOiAncGRmJyB9KSlcblx0XHRcdFx0XHQudGhlbigoKSA9PiB0aGlzLlN0b3JhZ2Uuc2V0RmlsZShgLi8ke3VzZXJJZH0ucGRmYCkpXG5cdFx0XHRcdFx0LnRoZW4oKCkgPT4gdGhpcy5TdG9yYWdlLnVwbG9hZCgpKVxuXHRcdFx0XHRcdC50aGVuKHJlcyA9PiBKU09OLnN0cmluZ2lmeShyZXMpKVxuXHRcdFx0XHRcdC50aGVuKHJlcyA9PiBKU09OLnBhcnNlKHJlcykpXG5cdFx0XHRcdFx0LnRoZW4ocmVzID0+XG5cdFx0XHRcdFx0XHRQcm9taXNlLnJlc29sdmUoZGF0YSkudGhlbihyZXN1bHQgPT4gKHtcblx0XHRcdFx0XHRcdFx0Li4ucmVzdWx0LFxuXHRcdFx0XHRcdFx0XHRjb250cmFjdFVybDogcmVzLkxvY2F0aW9uLFxuXHRcdFx0XHRcdFx0XHRzdGF0dXM6ICdBdGl2bydcblx0XHRcdFx0XHRcdH0pKVxuXHRcdFx0XHRcdClcblx0XHRcdFx0XHQudGhlbihyZXMgPT4gdGhpcy5zYXZlKHVzZXJJZCwgcmVzKSlcblx0XHRcdFx0XHQuY2F0Y2goZSA9PiB7XG5cdFx0XHRcdFx0XHR0aHJvdyBlO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlKTtcblx0XHR9XG5cdH1cblxuXHRhc3luYyB2aWV3KGRhdGFDb250cmFjdCwgY29uZmlnKSB7XG5cdFx0Ly9jb25zb2xlLmxvZyhkYXRhQ29udHJhY3QpXG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zZXRDb25maWcoY29uZmlnLmF3cyk7XG5cdFx0XHRhd2FpdCB0aGlzLnNldFR5cGUoY29uZmlnLmNvbnRyYWN0KTtcblx0XHRcdGlmICh0aGlzLmNvbmZpZyA9PT0gdW5kZWZpbmVkKVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3JEb2N4UGRmKCdDb25maWd1cmHDp8OjbyBuw6NvIGluaWNpYWxpemFkYScpO1xuXG5cdFx0XHRjb25zdCBkYXRhID0gZGF0YUNvbnRyYWN0O1xuXG5cdFx0XHRhd2FpdCB0aGlzLlBkZkdlbmVyYXRvci5nZW5lcmF0ZShkYXRhLCBkYXRhLmNsaWVudElkLCBmYWxzZSk7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuU3RvcmFnZS5zZXRCdWNrZXQoY29uZmlnLmJ1Y2tldCkpXG5cdFx0XHRcdC50aGVuKCgpID0+IHRoaXMuU3RvcmFnZS5zZXREZXN0aW5hdGlvbkRpcignY29udHJhY3RzJykpXG5cdFx0XHRcdC50aGVuKCgpID0+IHRoaXMuU3RvcmFnZS5zZXRGaWxlKGAuLyR7ZGF0YS5jbGllbnRJZH0ucGRmYCkpXG5cdFx0XHRcdC50aGVuKCgpID0+IHRoaXMuU3RvcmFnZS51cGxvYWQoKSlcblx0XHRcdFx0LnRoZW4ocmVzID0+XG5cdFx0XHRcdFx0UHJvbWlzZS5yZXNvbHZlKGRhdGEpLnRoZW4ocmVzdWx0ID0+ICh7XG5cdFx0XHRcdFx0XHQuLi5yZXN1bHQsXG5cdFx0XHRcdFx0XHRjb250cmFjdFVybDogcmVzLkxvY2F0aW9uLFxuXHRcdFx0XHRcdFx0c3RhdHVzOiAnQXRpdm8nXG5cdFx0XHRcdFx0fSkpXG5cdFx0XHRcdClcblx0XHRcdFx0LnRoZW4ocmVzID0+IHRoaXMudXBkYXRlKHJlcykpXG5cdFx0XHRcdC5jYXRjaChlID0+IHtcblx0XHRcdFx0XHR0aHJvdyBlO1xuXHRcdFx0XHR9KTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgaW5zZXJ0U2lnbmF0dXJlKHVzZXJJZCwgZGF0YUNvbnRyYWN0LCBjb25maWcpIHtcblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zZXRDb25maWcoY29uZmlnLmF3cyk7XG5cdFx0XHRhd2FpdCB0aGlzLnNldFR5cGUoY29uZmlnLmNvbnRyYWN0KTtcblx0XHRcdGlmICh0aGlzLmNvbmZpZyA9PT0gdW5kZWZpbmVkKVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3JEb2N4UGRmKCdDb25maWd1cmHDp8OjbyBuw6NvIGluaWNpYWxpemFkYScpO1xuXHRcdFx0XG5cdFx0XHRjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5tYWtlRG9jdW1lbnQoZGF0YUNvbnRyYWN0LmRhdGEpO1xuXG5cdFx0XHQvLyBkYXRhLmltYWdlID0gZGF0YUNvbnRyYWN0LmRhdGEuaW1hZ2U7XG5cblx0XHRcdC8vIGNvbnNvbGUubG9nKCdBUVVJIFRFTSBRVUUgVEVSIFRPRE9TIE9TIERBRE9TIERPIERPQ1VNRU5UTyBDRVJUSU5IT09PT09PTycpXG5cdFx0XHQvLyBjb25zb2xlLmxvZyhkYXRhKVxuXG5cdFx0XHRhd2FpdCB0aGlzLlBkZkdlbmVyYXRvci5nZW5lcmF0ZShkYXRhLCB1c2VySWQsIHRydWUpO1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0UHJvbWlzZS5yZXNvbHZlKHRoaXMuU3RvcmFnZS5zZXRCdWNrZXQoY29uZmlnLmJ1Y2tldCkpXG5cdFx0XHRcdFx0LnRoZW4oKCkgPT4gdGhpcy5TdG9yYWdlLnNldERlc3RpbmF0aW9uRGlyKCdjb250cmFjdHMnKSlcblx0XHRcdFx0XHQvLy50aGVuKCgpID0+IHRoaXMuRG9jeC5tYWtlQ29udHJhY3QoZmlsZSwgZGF0YUNvbnRyYWN0LmRhdGEpKVxuXHRcdFx0XHRcdC8vLnRoZW4ocmVzID0+IEJ1ZmZlci5mcm9tKHJlcywgJ2Jhc2U2NCcpKVxuXHRcdFx0XHRcdC8vLnRoZW4ocmVzID0+IHRoaXMuU3RvcmFnZS5zZXRGaWxlQnVmZmVyKHsgZGF0YTogcmVzLCB0eXBlOiAnZG9jeCcgfSkpXG5cdFx0XHRcdFx0LnRoZW4oKCkgPT4gdGhpcy5TdG9yYWdlLnNldEZpbGUoJy4vJyArIHVzZXJJZCArICcucGRmJykpXG5cdFx0XHRcdFx0LnRoZW4oKCkgPT4gdGhpcy5TdG9yYWdlLnVwbG9hZCgpKVxuXHRcdFx0XHRcdC50aGVuKHJlcyA9PiBKU09OLnN0cmluZ2lmeShyZXMpKVxuXHRcdFx0XHRcdC50aGVuKHJlcyA9PiBKU09OLnBhcnNlKHJlcykpXG5cdFx0XHRcdFx0LnRoZW4ocmVzID0+IHtcblx0XHRcdFx0XHRcdGxldCBkYXRhUmV0dXJuID0ge31cblx0XHRcdFx0XHRcdGRhdGFSZXR1cm4uY29udHJhY3RVcmwgPSByZXMuTG9jYXRpb247XG5cdFx0XHRcdFx0XHRkYXRhUmV0dXJuLnN0YXR1cyA9ICdBc3NpbmFkbyc7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZGF0YVJldHVybjtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC50aGVuKHJlcyA9PiB0aGlzLnVwZGF0ZShyZXMsIGRhdGFDb250cmFjdC5pZCkpXG5cdFx0XHRcdFx0LmNhdGNoKGUgPT4ge1xuXHRcdFx0XHRcdFx0dGhyb3cgZTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0KTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgbWFrZURvY3VtZW50KGRhdGFDb250cmFjdCkge1xuXHRcdGlmIChkYXRhQ29udHJhY3QuY2xpZW50Q05QSiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gYXdhaXQgdGhpcy5tYWtlQ05QSihkYXRhQ29udHJhY3QpO1xuXHRcdFx0Ly9maWxlID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vLi4vLi4vYXNzZXRzL2RvY0V4LmRvY3gnKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGF3YWl0IHRoaXMubWFrZUNQRihkYXRhQ29udHJhY3QpO1xuXHRcdFx0Ly9maWxlID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vLi4vLi4vYXNzZXRzL2RvY0V4LmRvY3gnKTtcblx0XHR9XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSAoRG9jeCwgRGlnaXRhbERhdGEsIFN0b3JhZ2UsIFBkZkdlbmVyYXRvcikgPT5cblx0bmV3IENvbnRyYWN0KERvY3gsIERpZ2l0YWxEYXRhLCBTdG9yYWdlLCBQZGZHZW5lcmF0b3IpO1xuIl19