UNPKG

@coolwallet/sol

Version:
214 lines (212 loc) 29.6 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getCreateAndTransferSPLToken = getCreateAndTransferSPLToken; exports.getDelegateAndCreateAccountArguments = getDelegateAndCreateAccountArguments; exports.getScriptSigningActions = getScriptSigningActions; exports.getScriptSigningPreActions = getScriptSigningPreActions; exports.getSignInArguments = getSignInArguments; exports.getSignMessageArguments = getSignMessageArguments; exports.getSignVersionedArguments = getSignVersionedArguments; exports.getSmartContractArguments = getSmartContractArguments; exports.getSplTokenTransferArguments = getSplTokenTransferArguments; exports.getTransferArguments = getTransferArguments; exports.getUndelegateArguments = getUndelegateArguments; exports.getWithdrawArguments = getWithdrawArguments; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _core = require("@coolwallet/core"); var _config = require("@coolwallet/core/lib/config"); var _bs = _interopRequireDefault(require("bs58")); var _signIn = require("./signIn"); /** * getTransferArguments * * @param {Transaction} rawTx transaction with extracted fields from a regular sol transaction * @param {boolean} isPartialArgs is getting full rawTx as argument or not * @returns {Promise<string>} */ function getTransferArguments(rawTx, addressIndex) { var path = _core.utils.getFullPath({ pathType: _config.PathType.SLIP0010, pathString: "44'/501'/".concat(addressIndex, "'/0'") }); var SEPath = "11".concat(path); console.debug('SEPath: ', SEPath); var compiledMessage = rawTx.compileMessage(); var header = compiledMessage.serializeHeader(); return SEPath + header + compiledMessage.serializeTransferMessage(); } function getTokenInfoArgs(tokenInfo) { var _tokenInfo$signature; var scriptTokenSymbol = tokenInfo.symbol.slice(0, 7).toUpperCase(); var tokenSignature = (_tokenInfo$signature = tokenInfo.signature) !== null && _tokenInfo$signature !== void 0 ? _tokenInfo$signature : ''; var signature = tokenSignature.slice(82).padStart(144, '0'); var tokenInfoToHex = Buffer.from([+tokenInfo.decimals, scriptTokenSymbol.length]).toString('hex'); var tokenSymbol = Buffer.from(scriptTokenSymbol).toString('hex').padEnd(14, '0'); var tokenPublicKey = Buffer.from(_bs["default"].decode(tokenInfo.address)).toString('hex'); return tokenInfoToHex + tokenSymbol + tokenPublicKey + signature; } /** * getSplTokenTransferArguments * * @param {Transaction} rawTx transaction with extracted fields from a regular sol transaction * @param {boolean} isPartialArgs is getting full rawTx as argument or not * @returns {Promise<string>} */ function getSplTokenTransferArguments(rawTx, addressIndex, tokenInfo) { var path = _core.utils.getFullPath({ pathType: _config.PathType.SLIP0010, pathString: "44'/501'/".concat(addressIndex, "'/0'") }); var SEPath = "11".concat(path); console.debug('SEPath: ', SEPath); var tokenInfoArgs = ''; if (tokenInfo) tokenInfoArgs = getTokenInfoArgs(tokenInfo); var compiledMessage = rawTx.compileMessage(); var header = compiledMessage.serializeHeader(); return SEPath + header + compiledMessage.serializeTransferMessage() + tokenInfoArgs; } function getCreateAndTransferSPLToken(rawTx, addressIndex, tokenInfo) { var path = _core.utils.getFullPath({ pathType: _config.PathType.SLIP0010, pathString: "44'/501'/".concat(addressIndex, "'/0'") }); var SEPath = "11".concat(path); console.debug('SEPath: ', SEPath); var tokenInfoArgs = ''; if (tokenInfo) tokenInfoArgs = getTokenInfoArgs(tokenInfo); var compiledMessage = rawTx.compileMessage(); var header = compiledMessage.serializeHeader(); return SEPath + header + compiledMessage.serializeCreateAndTransferSPLToken() + tokenInfoArgs; } function getUndelegateArguments(rawTx, addressIndex) { var path = _core.utils.getFullPath({ pathType: _config.PathType.SLIP0010, pathString: "44'/501'/".concat(addressIndex, "'/0'") }); var SEPath = "11".concat(path); console.debug('SEPath: ', SEPath); var compiledMessage = rawTx.compileMessage(); var header = compiledMessage.serializeHeader(); return SEPath + header + compiledMessage.serializeUndelegate(); } function getWithdrawArguments(rawTx, addressIndex) { var path = _core.utils.getFullPath({ pathType: _config.PathType.SLIP0010, pathString: "44'/501'/".concat(addressIndex, "'/0'") }); var SEPath = "11".concat(path); console.debug('SEPath: ', SEPath); var compiledMessage = rawTx.compileMessage(); var header = compiledMessage.serializeHeader(); return SEPath + header + compiledMessage.serializeWithdraw(); } function getDelegateAndCreateAccountArguments(rawTx, addressIndex) { var path = _core.utils.getFullPath({ pathType: _config.PathType.SLIP0010, pathString: "44'/501'/".concat(addressIndex, "'/0'") }); var SEPath = "11".concat(path); console.debug('SEPath: ', SEPath); var compiledMessage = rawTx.compileMessage(); var header = compiledMessage.serializeHeader(); return SEPath + header + compiledMessage.serializeDelegateAndCreateAccountWithSeed(); } function getSmartContractArguments(rawTx, addressIndex) { var path = _core.utils.getFullPath({ pathType: _config.PathType.SLIP0010, pathString: "44'/501'/".concat(addressIndex, "'/0'") }); var SEPath = "11".concat(path); console.debug('SEPath: ', SEPath); return SEPath + Buffer.from(rawTx.compileMessage().serialize()).toString('hex'); } function getSignInArguments(message, addressIndex) { var PATH_LENGTH = '11'; var path = _core.utils.getFullPath({ pathType: _config.PathType.SLIP0010, pathString: "44'/501'/".concat(addressIndex, "'/0'") }); var SEPath = "".concat(PATH_LENGTH).concat(path); console.debug('SEPath: ', SEPath); var argument = (0, _signIn.createSignInMessage)(message, path); return SEPath + argument; } function getSignMessageArguments(message, addressIndex) { var PATH_LENGTH = '11'; var path = _core.utils.getFullPath({ pathType: _config.PathType.SLIP0010, pathString: "44'/501'/".concat(addressIndex, "'/0'") }); var SEPath = "".concat(PATH_LENGTH).concat(path); console.debug('SEPath: ', SEPath); var argument = message.startsWith('0x') ? message.slice(2) : message; return SEPath + argument; } function getSignVersionedArguments(rawTx, addressIndex) { var path = _core.utils.getFullPath({ pathType: _config.PathType.SLIP0010, pathString: "44'/501'/".concat(addressIndex, "'/0'") }); var SEPath = "11".concat(path); console.debug('SEPath: ', SEPath); return SEPath + Buffer.from(rawTx.serialize()).toString('hex'); } function getScriptSigningPreActions(signData, script) { var transport = signData.transport; var preActions = []; var sendScript = /*#__PURE__*/function () { var _ref = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() { return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return _core.apdu.tx.sendScript(transport, script); case 2: case "end": return _context.stop(); } } }, _callee); })); return function sendScript() { return _ref.apply(this, arguments); }; }(); preActions.push(sendScript); return { preActions: preActions }; } function getScriptSigningActions(signData) { var transport = signData.transport, appPrivateKey = signData.appPrivateKey, appId = signData.appId, addressIndex = signData.addressIndex; var versionedTxs = signData.transaction; var actions = versionedTxs.map(function (tx) { return /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() { var argument; return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: argument = getSignVersionedArguments(tx.message, addressIndex); return _context2.abrupt("return", _core.apdu.tx.executeScript(transport, appId, appPrivateKey, argument)); case 2: case "end": return _context2.stop(); } } }, _callee2); })); }); return { actions: actions }; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29yZSIsInJlcXVpcmUiLCJfY29uZmlnIiwiX2JzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9zaWduSW4iLCJnZXRUcmFuc2ZlckFyZ3VtZW50cyIsInJhd1R4IiwiYWRkcmVzc0luZGV4IiwicGF0aCIsInV0aWxzIiwiZ2V0RnVsbFBhdGgiLCJwYXRoVHlwZSIsIlBhdGhUeXBlIiwiU0xJUDAwMTAiLCJwYXRoU3RyaW5nIiwiY29uY2F0IiwiU0VQYXRoIiwiY29uc29sZSIsImRlYnVnIiwiY29tcGlsZWRNZXNzYWdlIiwiY29tcGlsZU1lc3NhZ2UiLCJoZWFkZXIiLCJzZXJpYWxpemVIZWFkZXIiLCJzZXJpYWxpemVUcmFuc2Zlck1lc3NhZ2UiLCJnZXRUb2tlbkluZm9BcmdzIiwidG9rZW5JbmZvIiwiX3Rva2VuSW5mbyRzaWduYXR1cmUiLCJzY3JpcHRUb2tlblN5bWJvbCIsInN5bWJvbCIsInNsaWNlIiwidG9VcHBlckNhc2UiLCJ0b2tlblNpZ25hdHVyZSIsInNpZ25hdHVyZSIsInBhZFN0YXJ0IiwidG9rZW5JbmZvVG9IZXgiLCJCdWZmZXIiLCJmcm9tIiwiZGVjaW1hbHMiLCJsZW5ndGgiLCJ0b1N0cmluZyIsInRva2VuU3ltYm9sIiwicGFkRW5kIiwidG9rZW5QdWJsaWNLZXkiLCJiYXNlNTgiLCJkZWNvZGUiLCJhZGRyZXNzIiwiZ2V0U3BsVG9rZW5UcmFuc2ZlckFyZ3VtZW50cyIsInRva2VuSW5mb0FyZ3MiLCJnZXRDcmVhdGVBbmRUcmFuc2ZlclNQTFRva2VuIiwic2VyaWFsaXplQ3JlYXRlQW5kVHJhbnNmZXJTUExUb2tlbiIsImdldFVuZGVsZWdhdGVBcmd1bWVudHMiLCJzZXJpYWxpemVVbmRlbGVnYXRlIiwiZ2V0V2l0aGRyYXdBcmd1bWVudHMiLCJzZXJpYWxpemVXaXRoZHJhdyIsImdldERlbGVnYXRlQW5kQ3JlYXRlQWNjb3VudEFyZ3VtZW50cyIsInNlcmlhbGl6ZURlbGVnYXRlQW5kQ3JlYXRlQWNjb3VudFdpdGhTZWVkIiwiZ2V0U21hcnRDb250cmFjdEFyZ3VtZW50cyIsInNlcmlhbGl6ZSIsImdldFNpZ25JbkFyZ3VtZW50cyIsIm1lc3NhZ2UiLCJQQVRIX0xFTkdUSCIsImFyZ3VtZW50IiwiY3JlYXRlU2lnbkluTWVzc2FnZSIsImdldFNpZ25NZXNzYWdlQXJndW1lbnRzIiwic3RhcnRzV2l0aCIsImdldFNpZ25WZXJzaW9uZWRBcmd1bWVudHMiLCJnZXRTY3JpcHRTaWduaW5nUHJlQWN0aW9ucyIsInNpZ25EYXRhIiwic2NyaXB0IiwidHJhbnNwb3J0IiwicHJlQWN0aW9ucyIsInNlbmRTY3JpcHQiLCJfcmVmIiwiX2FzeW5jVG9HZW5lcmF0b3IyIiwiX3JlZ2VuZXJhdG9yIiwibWFyayIsIl9jYWxsZWUiLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiYXBkdSIsInR4Iiwic3RvcCIsImFwcGx5IiwiYXJndW1lbnRzIiwicHVzaCIsImdldFNjcmlwdFNpZ25pbmdBY3Rpb25zIiwiYXBwUHJpdmF0ZUtleSIsImFwcElkIiwidmVyc2lvbmVkVHhzIiwidHJhbnNhY3Rpb24iLCJhY3Rpb25zIiwibWFwIiwiX2NhbGxlZTIiLCJfY2FsbGVlMiQiLCJfY29udGV4dDIiLCJhYnJ1cHQiLCJleGVjdXRlU2NyaXB0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3NjcmlwdFV0aWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXRpbHMgfSBmcm9tICdAY29vbHdhbGxldC9jb3JlJztcbmltcG9ydCB7IFBhdGhUeXBlIH0gZnJvbSAnQGNvb2x3YWxsZXQvY29yZS9saWIvY29uZmlnJztcbmltcG9ydCBiYXNlNTggZnJvbSAnYnM1OCc7XG5pbXBvcnQgKiBhcyB0eXBlcyBmcm9tICcuLi9jb25maWcvdHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlU2lnbkluTWVzc2FnZSB9IGZyb20gJy4vc2lnbkluJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi9UcmFuc2FjdGlvbic7XG5pbXBvcnQgeyBWZXJzaW9uZWRNZXNzYWdlIH0gZnJvbSAnLi4vbWVzc2FnZSc7XG5pbXBvcnQgeyBhcGR1IH0gZnJvbSAnQGNvb2x3YWxsZXQvY29yZSc7XG5cbi8qKlxuICogZ2V0VHJhbnNmZXJBcmd1bWVudHNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9ufSByYXdUeCB0cmFuc2FjdGlvbiB3aXRoIGV4dHJhY3RlZCBmaWVsZHMgZnJvbSBhIHJlZ3VsYXIgc29sIHRyYW5zYWN0aW9uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzUGFydGlhbEFyZ3MgaXMgZ2V0dGluZyBmdWxsIHJhd1R4IGFzIGFyZ3VtZW50IG9yIG5vdFxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn1cbiAqL1xuZnVuY3Rpb24gZ2V0VHJhbnNmZXJBcmd1bWVudHMocmF3VHg6IFRyYW5zYWN0aW9uLCBhZGRyZXNzSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHBhdGggPSB1dGlscy5nZXRGdWxsUGF0aCh7IHBhdGhUeXBlOiBQYXRoVHlwZS5TTElQMDAxMCwgcGF0aFN0cmluZzogYDQ0Jy81MDEnLyR7YWRkcmVzc0luZGV4fScvMCdgIH0pO1xuICBjb25zdCBTRVBhdGggPSBgMTEke3BhdGh9YDtcbiAgY29uc29sZS5kZWJ1ZygnU0VQYXRoOiAnLCBTRVBhdGgpO1xuICBjb25zdCBjb21waWxlZE1lc3NhZ2UgPSByYXdUeC5jb21waWxlTWVzc2FnZSgpO1xuICBjb25zdCBoZWFkZXIgPSBjb21waWxlZE1lc3NhZ2Uuc2VyaWFsaXplSGVhZGVyKCk7XG4gIHJldHVybiBTRVBhdGggKyBoZWFkZXIgKyBjb21waWxlZE1lc3NhZ2Uuc2VyaWFsaXplVHJhbnNmZXJNZXNzYWdlKCk7XG59XG5cbmZ1bmN0aW9uIGdldFRva2VuSW5mb0FyZ3ModG9rZW5JbmZvOiB0eXBlcy5Ub2tlbkluZm8pOiBzdHJpbmcge1xuICBjb25zdCBzY3JpcHRUb2tlblN5bWJvbCA9IHRva2VuSW5mby5zeW1ib2wuc2xpY2UoMCwgNykudG9VcHBlckNhc2UoKTtcblxuICBjb25zdCB0b2tlblNpZ25hdHVyZSA9IHRva2VuSW5mby5zaWduYXR1cmUgPz8gJyc7XG4gIGNvbnN0IHNpZ25hdHVyZSA9IHRva2VuU2lnbmF0dXJlLnNsaWNlKDgyKS5wYWRTdGFydCgxNDQsICcwJyk7XG4gIGNvbnN0IHRva2VuSW5mb1RvSGV4ID0gQnVmZmVyLmZyb20oWyt0b2tlbkluZm8uZGVjaW1hbHMsIHNjcmlwdFRva2VuU3ltYm9sLmxlbmd0aF0pLnRvU3RyaW5nKCdoZXgnKTtcbiAgY29uc3QgdG9rZW5TeW1ib2wgPSBCdWZmZXIuZnJvbShzY3JpcHRUb2tlblN5bWJvbCkudG9TdHJpbmcoJ2hleCcpLnBhZEVuZCgxNCwgJzAnKTtcbiAgY29uc3QgdG9rZW5QdWJsaWNLZXkgPSBCdWZmZXIuZnJvbShiYXNlNTguZGVjb2RlKHRva2VuSW5mby5hZGRyZXNzKSkudG9TdHJpbmcoJ2hleCcpO1xuXG4gIHJldHVybiB0b2tlbkluZm9Ub0hleCArIHRva2VuU3ltYm9sICsgdG9rZW5QdWJsaWNLZXkgKyBzaWduYXR1cmU7XG59XG5cbi8qKlxuICogZ2V0U3BsVG9rZW5UcmFuc2ZlckFyZ3VtZW50c1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb259IHJhd1R4IHRyYW5zYWN0aW9uIHdpdGggZXh0cmFjdGVkIGZpZWxkcyBmcm9tIGEgcmVndWxhciBzb2wgdHJhbnNhY3Rpb25cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNQYXJ0aWFsQXJncyBpcyBnZXR0aW5nIGZ1bGwgcmF3VHggYXMgYXJndW1lbnQgb3Igbm90XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fVxuICovXG5mdW5jdGlvbiBnZXRTcGxUb2tlblRyYW5zZmVyQXJndW1lbnRzKHJhd1R4OiBUcmFuc2FjdGlvbiwgYWRkcmVzc0luZGV4OiBudW1iZXIsIHRva2VuSW5mbz86IHR5cGVzLlRva2VuSW5mbyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhdGggPSB1dGlscy5nZXRGdWxsUGF0aCh7IHBhdGhUeXBlOiBQYXRoVHlwZS5TTElQMDAxMCwgcGF0aFN0cmluZzogYDQ0Jy81MDEnLyR7YWRkcmVzc0luZGV4fScvMCdgIH0pO1xuICBjb25zdCBTRVBhdGggPSBgMTEke3BhdGh9YDtcbiAgY29uc29sZS5kZWJ1ZygnU0VQYXRoOiAnLCBTRVBhdGgpO1xuICBsZXQgdG9rZW5JbmZvQXJncyA9ICcnO1xuICBpZiAodG9rZW5JbmZvKSB0b2tlbkluZm9BcmdzID0gZ2V0VG9rZW5JbmZvQXJncyh0b2tlbkluZm8pO1xuICBjb25zdCBjb21waWxlZE1lc3NhZ2UgPSByYXdUeC5jb21waWxlTWVzc2FnZSgpO1xuICBjb25zdCBoZWFkZXIgPSBjb21waWxlZE1lc3NhZ2Uuc2VyaWFsaXplSGVhZGVyKCk7XG4gIHJldHVybiBTRVBhdGggKyBoZWFkZXIgKyBjb21waWxlZE1lc3NhZ2Uuc2VyaWFsaXplVHJhbnNmZXJNZXNzYWdlKCkgKyB0b2tlbkluZm9BcmdzO1xufVxuXG5mdW5jdGlvbiBnZXRDcmVhdGVBbmRUcmFuc2ZlclNQTFRva2VuKHJhd1R4OiBUcmFuc2FjdGlvbiwgYWRkcmVzc0luZGV4OiBudW1iZXIsIHRva2VuSW5mbz86IHR5cGVzLlRva2VuSW5mbyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhdGggPSB1dGlscy5nZXRGdWxsUGF0aCh7IHBhdGhUeXBlOiBQYXRoVHlwZS5TTElQMDAxMCwgcGF0aFN0cmluZzogYDQ0Jy81MDEnLyR7YWRkcmVzc0luZGV4fScvMCdgIH0pO1xuICBjb25zdCBTRVBhdGggPSBgMTEke3BhdGh9YDtcbiAgY29uc29sZS5kZWJ1ZygnU0VQYXRoOiAnLCBTRVBhdGgpO1xuICBsZXQgdG9rZW5JbmZvQXJncyA9ICcnO1xuICBpZiAodG9rZW5JbmZvKSB0b2tlbkluZm9BcmdzID0gZ2V0VG9rZW5JbmZvQXJncyh0b2tlbkluZm8pO1xuICBjb25zdCBjb21waWxlZE1lc3NhZ2UgPSByYXdUeC5jb21waWxlTWVzc2FnZSgpO1xuICBjb25zdCBoZWFkZXIgPSBjb21waWxlZE1lc3NhZ2Uuc2VyaWFsaXplSGVhZGVyKCk7XG4gIHJldHVybiBTRVBhdGggKyBoZWFkZXIgKyBjb21waWxlZE1lc3NhZ2Uuc2VyaWFsaXplQ3JlYXRlQW5kVHJhbnNmZXJTUExUb2tlbigpICsgdG9rZW5JbmZvQXJncztcbn1cblxuZnVuY3Rpb24gZ2V0VW5kZWxlZ2F0ZUFyZ3VtZW50cyhyYXdUeDogVHJhbnNhY3Rpb24sIGFkZHJlc3NJbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgcGF0aCA9IHV0aWxzLmdldEZ1bGxQYXRoKHsgcGF0aFR5cGU6IFBhdGhUeXBlLlNMSVAwMDEwLCBwYXRoU3RyaW5nOiBgNDQnLzUwMScvJHthZGRyZXNzSW5kZXh9Jy8wJ2AgfSk7XG4gIGNvbnN0IFNFUGF0aCA9IGAxMSR7cGF0aH1gO1xuICBjb25zb2xlLmRlYnVnKCdTRVBhdGg6ICcsIFNFUGF0aCk7XG4gIGNvbnN0IGNvbXBpbGVkTWVzc2FnZSA9IHJhd1R4LmNvbXBpbGVNZXNzYWdlKCk7XG4gIGNvbnN0IGhlYWRlciA9IGNvbXBpbGVkTWVzc2FnZS5zZXJpYWxpemVIZWFkZXIoKTtcbiAgcmV0dXJuIFNFUGF0aCArIGhlYWRlciArIGNvbXBpbGVkTWVzc2FnZS5zZXJpYWxpemVVbmRlbGVnYXRlKCk7XG59XG5cbmZ1bmN0aW9uIGdldFdpdGhkcmF3QXJndW1lbnRzKHJhd1R4OiBUcmFuc2FjdGlvbiwgYWRkcmVzc0luZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBwYXRoID0gdXRpbHMuZ2V0RnVsbFBhdGgoeyBwYXRoVHlwZTogUGF0aFR5cGUuU0xJUDAwMTAsIHBhdGhTdHJpbmc6IGA0NCcvNTAxJy8ke2FkZHJlc3NJbmRleH0nLzAnYCB9KTtcbiAgY29uc3QgU0VQYXRoID0gYDExJHtwYXRofWA7XG4gIGNvbnNvbGUuZGVidWcoJ1NFUGF0aDogJywgU0VQYXRoKTtcbiAgY29uc3QgY29tcGlsZWRNZXNzYWdlID0gcmF3VHguY29tcGlsZU1lc3NhZ2UoKTtcbiAgY29uc3QgaGVhZGVyID0gY29tcGlsZWRNZXNzYWdlLnNlcmlhbGl6ZUhlYWRlcigpO1xuICByZXR1cm4gU0VQYXRoICsgaGVhZGVyICsgY29tcGlsZWRNZXNzYWdlLnNlcmlhbGl6ZVdpdGhkcmF3KCk7XG59XG5cbmZ1bmN0aW9uIGdldERlbGVnYXRlQW5kQ3JlYXRlQWNjb3VudEFyZ3VtZW50cyhyYXdUeDogVHJhbnNhY3Rpb24sIGFkZHJlc3NJbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgcGF0aCA9IHV0aWxzLmdldEZ1bGxQYXRoKHsgcGF0aFR5cGU6IFBhdGhUeXBlLlNMSVAwMDEwLCBwYXRoU3RyaW5nOiBgNDQnLzUwMScvJHthZGRyZXNzSW5kZXh9Jy8wJ2AgfSk7XG4gIGNvbnN0IFNFUGF0aCA9IGAxMSR7cGF0aH1gO1xuICBjb25zb2xlLmRlYnVnKCdTRVBhdGg6ICcsIFNFUGF0aCk7XG4gIGNvbnN0IGNvbXBpbGVkTWVzc2FnZSA9IHJhd1R4LmNvbXBpbGVNZXNzYWdlKCk7XG4gIGNvbnN0IGhlYWRlciA9IGNvbXBpbGVkTWVzc2FnZS5zZXJpYWxpemVIZWFkZXIoKTtcbiAgcmV0dXJuIFNFUGF0aCArIGhlYWRlciArIGNvbXBpbGVkTWVzc2FnZS5zZXJpYWxpemVEZWxlZ2F0ZUFuZENyZWF0ZUFjY291bnRXaXRoU2VlZCgpO1xufVxuXG5mdW5jdGlvbiBnZXRTbWFydENvbnRyYWN0QXJndW1lbnRzKHJhd1R4OiBUcmFuc2FjdGlvbiwgYWRkcmVzc0luZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBwYXRoID0gdXRpbHMuZ2V0RnVsbFBhdGgoeyBwYXRoVHlwZTogUGF0aFR5cGUuU0xJUDAwMTAsIHBhdGhTdHJpbmc6IGA0NCcvNTAxJy8ke2FkZHJlc3NJbmRleH0nLzAnYCB9KTtcbiAgY29uc3QgU0VQYXRoID0gYDExJHtwYXRofWA7XG4gIGNvbnNvbGUuZGVidWcoJ1NFUGF0aDogJywgU0VQYXRoKTtcblxuICByZXR1cm4gU0VQYXRoICsgQnVmZmVyLmZyb20ocmF3VHguY29tcGlsZU1lc3NhZ2UoKS5zZXJpYWxpemUoKSkudG9TdHJpbmcoJ2hleCcpO1xufVxuXG5mdW5jdGlvbiBnZXRTaWduSW5Bcmd1bWVudHMobWVzc2FnZTogdHlwZXMuU2lnbkluTWVzc2FnZSwgYWRkcmVzc0luZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBQQVRIX0xFTkdUSCA9ICcxMSc7XG4gIGNvbnN0IHBhdGggPSB1dGlscy5nZXRGdWxsUGF0aCh7IHBhdGhUeXBlOiBQYXRoVHlwZS5TTElQMDAxMCwgcGF0aFN0cmluZzogYDQ0Jy81MDEnLyR7YWRkcmVzc0luZGV4fScvMCdgIH0pO1xuICBjb25zdCBTRVBhdGggPSBgJHtQQVRIX0xFTkdUSH0ke3BhdGh9YDtcbiAgY29uc29sZS5kZWJ1ZygnU0VQYXRoOiAnLCBTRVBhdGgpO1xuICBjb25zdCBhcmd1bWVudCA9IGNyZWF0ZVNpZ25Jbk1lc3NhZ2UobWVzc2FnZSwgcGF0aCk7XG4gIHJldHVybiBTRVBhdGggKyBhcmd1bWVudDtcbn1cblxuZnVuY3Rpb24gZ2V0U2lnbk1lc3NhZ2VBcmd1bWVudHMobWVzc2FnZTogc3RyaW5nLCBhZGRyZXNzSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IFBBVEhfTEVOR1RIID0gJzExJztcbiAgY29uc3QgcGF0aCA9IHV0aWxzLmdldEZ1bGxQYXRoKHsgcGF0aFR5cGU6IFBhdGhUeXBlLlNMSVAwMDEwLCBwYXRoU3RyaW5nOiBgNDQnLzUwMScvJHthZGRyZXNzSW5kZXh9Jy8wJ2AgfSk7XG4gIGNvbnN0IFNFUGF0aCA9IGAke1BBVEhfTEVOR1RIfSR7cGF0aH1gO1xuICBjb25zb2xlLmRlYnVnKCdTRVBhdGg6ICcsIFNFUGF0aCk7XG4gIGNvbnN0IGFyZ3VtZW50ID0gbWVzc2FnZS5zdGFydHNXaXRoKCcweCcpID8gbWVzc2FnZS5zbGljZSgyKSA6IG1lc3NhZ2U7XG4gIHJldHVybiBTRVBhdGggKyBhcmd1bWVudDtcbn1cblxuZnVuY3Rpb24gZ2V0U2lnblZlcnNpb25lZEFyZ3VtZW50cyhyYXdUeDogVmVyc2lvbmVkTWVzc2FnZSwgYWRkcmVzc0luZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBwYXRoID0gdXRpbHMuZ2V0RnVsbFBhdGgoeyBwYXRoVHlwZTogUGF0aFR5cGUuU0xJUDAwMTAsIHBhdGhTdHJpbmc6IGA0NCcvNTAxJy8ke2FkZHJlc3NJbmRleH0nLzAnYCB9KTtcbiAgY29uc3QgU0VQYXRoID0gYDExJHtwYXRofWA7XG4gIGNvbnNvbGUuZGVidWcoJ1NFUGF0aDogJywgU0VQYXRoKTtcbiAgcmV0dXJuIFNFUGF0aCArIEJ1ZmZlci5mcm9tKHJhd1R4LnNlcmlhbGl6ZSgpKS50b1N0cmluZygnaGV4Jyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY3JpcHRTaWduaW5nUHJlQWN0aW9ucyhcbiAgc2lnbkRhdGE6IHR5cGVzLnNpZ25WZXJzaW9uZWRUcmFuc2FjdGlvbnMsXG4gIHNjcmlwdDogc3RyaW5nXG4pOiB7XG4gIHByZUFjdGlvbnM6IEFycmF5PCgpID0+IFByb21pc2U8dm9pZD4+O1xufSB7XG4gIGNvbnN0IHsgdHJhbnNwb3J0IH0gPSBzaWduRGF0YTtcblxuICBjb25zdCBwcmVBY3Rpb25zID0gW107XG4gIGNvbnN0IHNlbmRTY3JpcHQgPSBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgYXBkdS50eC5zZW5kU2NyaXB0KHRyYW5zcG9ydCwgc2NyaXB0KTtcbiAgfTtcbiAgcHJlQWN0aW9ucy5wdXNoKHNlbmRTY3JpcHQpO1xuXG4gIHJldHVybiB7IHByZUFjdGlvbnMgfTtcbn1cblxuZnVuY3Rpb24gZ2V0U2NyaXB0U2lnbmluZ0FjdGlvbnMoc2lnbkRhdGE6IHR5cGVzLnNpZ25WZXJzaW9uZWRUcmFuc2FjdGlvbnMpOiB7XG4gIGFjdGlvbnM6IEFycmF5PCgpID0+IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPj47XG59IHtcbiAgY29uc3QgeyB0cmFuc3BvcnQsIGFwcFByaXZhdGVLZXksIGFwcElkLCBhZGRyZXNzSW5kZXggfSA9IHNpZ25EYXRhO1xuICBjb25zdCB2ZXJzaW9uZWRUeHMgPSBzaWduRGF0YS50cmFuc2FjdGlvbjtcbiAgY29uc3QgYWN0aW9ucyA9IHZlcnNpb25lZFR4cy5tYXAoKHR4KSA9PiBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYXJndW1lbnQgPSBnZXRTaWduVmVyc2lvbmVkQXJndW1lbnRzKHR4Lm1lc3NhZ2UsIGFkZHJlc3NJbmRleCk7XG4gICAgcmV0dXJuIGFwZHUudHguZXhlY3V0ZVNjcmlwdCh0cmFuc3BvcnQsIGFwcElkLCBhcHBQcml2YXRlS2V5LCBhcmd1bWVudCk7XG4gIH0pO1xuICByZXR1cm4geyBhY3Rpb25zIH07XG59XG5cbmV4cG9ydCB7XG4gIGdldFNwbFRva2VuVHJhbnNmZXJBcmd1bWVudHMsXG4gIGdldENyZWF0ZUFuZFRyYW5zZmVyU1BMVG9rZW4sXG4gIGdldFRyYW5zZmVyQXJndW1lbnRzLFxuICBnZXRTbWFydENvbnRyYWN0QXJndW1lbnRzLFxuICBnZXRVbmRlbGVnYXRlQXJndW1lbnRzLFxuICBnZXRXaXRoZHJhd0FyZ3VtZW50cyxcbiAgZ2V0RGVsZWdhdGVBbmRDcmVhdGVBY2NvdW50QXJndW1lbnRzLFxuICBnZXRTaWduSW5Bcmd1bWVudHMsXG4gIGdldFNpZ25NZXNzYWdlQXJndW1lbnRzLFxuICBnZXRTaWduVmVyc2lvbmVkQXJndW1lbnRzLFxuICBnZXRTY3JpcHRTaWduaW5nQWN0aW9ucyxcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsS0FBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsR0FBQSxHQUFBQyxzQkFBQSxDQUFBSCxPQUFBO0FBRUEsSUFBQUksT0FBQSxHQUFBSixPQUFBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTSyxvQkFBb0JBLENBQUNDLEtBQWtCLEVBQUVDLFlBQW9CLEVBQVU7RUFDOUUsSUFBTUMsSUFBSSxHQUFH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