@coolwallet/ton
Version:
179 lines (170 loc) • 36.6 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getArgument = getArgument;
exports.getTransferTokenArgument = getTransferTokenArgument;
exports.saveBitAsByte = saveBitAsByte;
var _bn = _interopRequireDefault(require("bn.js"));
var _tonweb = _interopRequireDefault(require("tonweb"));
var _core = require("@coolwallet/core");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
var removeHex0x = function removeHex0x(hex) {
return hex.slice(0, 2) === '0x' ? hex.slice(2) : hex;
};
var evenHexDigit = function evenHexDigit(hex) {
return hex.length % 2 !== 0 ? "0".concat(hex) : hex;
};
var handleHex = function handleHex(hex) {
return evenHexDigit(removeHex0x(hex));
};
/**
1. Currently, Pro card firmware only supports writing data in Byte, so each bit needs to be written
as a byte, and the bits must be converted into bytes before signing.
2. Each toncoin transaction data is composed of one or more Cells, and each Cell contains 1023 bits of data.
*/
function saveBitAsByte(hex) {
hex = evenHexDigit(hex);
var buffer = Buffer.from(hex, 'hex');
var result = '';
var _iterator = _createForOfIteratorHelper(buffer),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var _byte = _step.value;
var _iterator2 = _createForOfIteratorHelper(_byte.toString(2).padStart(8, '0')),
_step2;
try {
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
var bit = _step2.value;
result += bit === '0' ? '00' : '01';
}
} catch (err) {
_iterator2.e(err);
} finally {
_iterator2.f();
}
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
return result;
}
function getSEPath(addressIndex) {
var pathLength = '0D';
var path = _core.utils.getFullPath({
pathString: "44'/607'/".concat(addressIndex, "'"),
pathType: _core.config.PathType.SLIP0010
});
var SEPath = "".concat(pathLength).concat(path);
return SEPath;
}
// [seqno(4B)] [expireAt(4B)] [sendMode(1B)] [cell2Length(8B)] [isBounceable(1B)] [toAddress(256B)] [amountLength(4B)] [amount(120B)] [memo(512B)]
function getArgument(transaction, addressIndex) {
console.debug("scriptUtils.getArgument transaction=".concat(JSON.stringify(transaction, null, 2)));
var seqno = transaction.seqno,
expireAt = transaction.expireAt,
toAddress = transaction.toAddress,
amount = transaction.amount,
payload = transaction.payload,
sendMode = transaction.sendMode;
var _TonWeb$Address = new _tonweb["default"].Address(toAddress),
isBounceable = _TonWeb$Address.isBounceable,
hashPart = _TonWeb$Address.hashPart;
var amountBuffer = new _bn["default"](amount).toBuffer();
var seqnoArg = seqno.toString(16).padStart(8, '0');
var expireAtArg = expireAt.toString(16).padStart(8, '0');
var sendModeArg = sendMode.toString(16).padStart(2, '0');
var isBounceableArg = isBounceable ? '01' : '00';
var toAddressArg = Buffer.from(hashPart).toString('hex');
var amountLengthArg = amountBuffer.byteLength.toString(16);
var amountArg = amountBuffer.toString('hex');
var memoArg = payload ? '00000000' + Buffer.from(new TextEncoder().encode(payload || '')).toString('hex') : '';
var memoLength = (memoArg.length / 2 * 8).toString(16).padStart(4, '0');
var cell2LengthArg = (96 + memoArg.length + amountArg.length).toString(16);
var argument = seqnoArg + expireAtArg + sendModeArg + saveBitAsByte(cell2LengthArg) + isBounceableArg + saveBitAsByte(toAddressArg) + saveBitAsByte(amountLengthArg).slice(8, 16) + saveBitAsByte(amountArg).padEnd(240, '0') + memoLength + saveBitAsByte(memoArg).padEnd(1024, '0');
return getSEPath(addressIndex) + argument;
}
// Cell3: [cell3Length(8B)][jettonAmountLength(4B)][jettonAmount(120B)][receiver(256B)][receiverWorkchain(8B)][responser(256B)][responserWorkchain(8B)][forwardAmountLength(4B)][forwardAmount(120B)][memoLength(2B)][memo(512)]
// Cell2: [cell2Length(8B)][fromTokenAccount(256B)][fromTokenAccountIsBounceable(1B)][fromTokenAccountWorkchain(8B)][amountLength(4B)][amount(120B)]
// Cell1: [seqno(4B)][expireAt(4B)][sendMode(1B)]
// Token: [tokenDecimal(1B)][tokenNameLength(1B)][tokenName(7B)][tokenContractAddress(36B)][tokenSign(72B)]
function getTransferTokenArgument(transaction, addressIndex) {
console.debug("scriptUtils.getArgument transaction=".concat(JSON.stringify(transaction, null, 2)));
var seqno = transaction.seqno,
expireAt = transaction.expireAt,
fromTokenAccount = transaction.toAddress,
amount = transaction.amount,
payload = transaction.payload,
sendMode = transaction.sendMode,
tokenInfo = transaction.tokenInfo;
var jettonAmount = payload.jettonAmount,
receiver = payload.toAddress,
forwardAmount = payload.forwardAmount,
forwardPayload = payload.forwardPayload,
responseAddress = payload.responseAddress;
var symbol = tokenInfo.symbol,
decimals = tokenInfo.decimals,
tokenAddress = tokenInfo.address,
_tokenInfo$signature = tokenInfo.signature,
tokenSignature = _tokenInfo$signature === void 0 ? '' : _tokenInfo$signature;
// Cell3
var _TonWeb$Address2 = new _tonweb["default"].Address(receiver),
receiverWorkchain = _TonWeb$Address2.wc,
receiverHashPart = _TonWeb$Address2.hashPart;
var _TonWeb$Address3 = new _tonweb["default"].Address(responseAddress),
responserWorkchain = _TonWeb$Address3.wc,
responserHashPart = _TonWeb$Address3.hashPart;
var forwardAmountBuffer = new _bn["default"](forwardAmount).toBuffer();
var jettonAmountBuffer = new _bn["default"](jettonAmount).toBuffer();
var jettonAmountLengthArg = jettonAmountBuffer.byteLength.toString(16);
var jettonAmountArg = jettonAmountBuffer.toString('hex');
var receiverArg = Buffer.from(receiverHashPart).toString('hex');
var receiverWorkchainArg = new _bn["default"](receiverWorkchain).toString('hex');
var responserArg = Buffer.from(responserHashPart).toString('hex');
var responserWorkchainArg = new _bn["default"](responserWorkchain).toString('hex');
var forwardAmountLengthArg = forwardAmountBuffer.byteLength.toString(16);
var forwardAmountArg = forwardAmountBuffer.toString('hex');
var memoArg = '00000000' + Buffer.from(new TextEncoder().encode(forwardPayload || '')).toString('hex');
var memoLength = (memoArg.length / 2 * 8).toString(16).padStart(4, '0');
var cell3LengthArg = (160 + memoArg.length + jettonAmountArg.length + forwardAmountArg.length).toString(16);
// Cell2
var _TonWeb$Address4 = new _tonweb["default"].Address(fromTokenAccount),
fromTokenAccountWorkchain = _TonWeb$Address4.wc,
fromTokenAccountHashPart = _TonWeb$Address4.hashPart,
isBounceable = _TonWeb$Address4.isBounceable;
var amountBuffer = new _bn["default"](amount).toBuffer();
var fromTokenAccountArg = Buffer.from(fromTokenAccountHashPart).toString('hex');
var fromTokenAccountIsBounceableArg = isBounceable ? '01' : '00';
var fromTokenAccountWorkchainArg = new _bn["default"](fromTokenAccountWorkchain).toString('hex');
var amountLengthArg = amountBuffer.byteLength.toString(16);
var amountArg = amountBuffer.toString('hex');
var cell2LengthArg = (96 + amountArg.length).toString(16);
// Cell1
var seqnoArg = seqno.toString(16).padStart(8, '0');
var expireAtArg = expireAt.toString(16).padStart(8, '0');
var sendModeArg = sendMode.toString(16).padStart(2, '0');
// display info
var decimalsHex = handleHex(parseInt(decimals.toString(), 10).toString(16));
var symbolLengthHex = handleHex(symbol.length.toString(16));
var symbolHex = handleHex(Buffer.from(symbol).toString('hex'));
var tokenInfoArg = decimalsHex + symbolLengthHex + symbolHex.padEnd(14, '0') + removeHex0x(Buffer.from(tokenAddress, 'base64').toString('hex'));
var signatureArg = tokenSignature.padStart(144, '0');
var argument =
// Cell3
saveBitAsByte(cell3LengthArg) + saveBitAsByte(jettonAmountLengthArg).slice(8, 16) + saveBitAsByte(jettonAmountArg).padEnd(240, '0') + saveBitAsByte(receiverArg) + saveBitAsByte(receiverWorkchainArg) + saveBitAsByte(responserArg) + saveBitAsByte(responserWorkchainArg) + saveBitAsByte(forwardAmountLengthArg).slice(8, 16) + saveBitAsByte(forwardAmountArg).padEnd(240, '0') + memoLength + saveBitAsByte(memoArg).padEnd(1024, '0') +
// Cell2
saveBitAsByte(cell2LengthArg) + saveBitAsByte(fromTokenAccountArg) + fromTokenAccountIsBounceableArg + saveBitAsByte(fromTokenAccountWorkchainArg) + saveBitAsByte(amountLengthArg).slice(8, 16) + saveBitAsByte(amountArg).padEnd(240, '0') +
// Cell1
seqnoArg + expireAtArg + sendModeArg +
// Token Info
tokenInfoArg + signatureArg;
console.debug("argument: ".concat(argument));
return getSEPath(addressIndex) + argument;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYm4iLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl90b253ZWIiLCJfY29yZSIsIm9iaiIsIl9fZXNNb2R1bGUiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIm8iLCJhbGxvd0FycmF5TGlrZSIsIml0IiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJBcnJheSIsImlzQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJsZW5ndGgiLCJpIiwiRiIsInMiLCJuIiwiZG9uZSIsInZhbHVlIiwiZSIsIl9lIiwiZiIsIlR5cGVFcnJvciIsIm5vcm1hbENvbXBsZXRpb24iLCJkaWRFcnIiLCJlcnIiLCJjYWxsIiwic3RlcCIsIm5leHQiLCJfZTIiLCJtaW5MZW4iLCJfYXJyYXlMaWtlVG9BcnJheSIsIk9iamVjdCIsInByb3RvdHlwZSIsInRvU3RyaW5nIiwic2xpY2UiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJmcm9tIiwidGVzdCIsImFyciIsImxlbiIsImFycjIiLCJyZW1vdmVIZXgweCIsImhleCIsImV2ZW5IZXhEaWdpdCIsImNvbmNhdCIsImhhbmRsZUhleCIsInNhdmVCaXRBc0J5dGUiLCJidWZmZXIiLCJCdWZmZXIiLCJyZXN1bHQiLCJfaXRlcmF0b3IiLCJfc3RlcCIsImJ5dGUiLCJfaXRlcmF0b3IyIiwicGFkU3RhcnQiLCJfc3RlcDIiLCJiaXQiLCJnZXRTRVBhdGgiLCJhZGRyZXNzSW5kZXgiLCJwYXRoTGVuZ3RoIiwicGF0aCIsInV0aWxzIiwiZ2V0RnVsbFBhdGgiLCJwYXRoU3RyaW5nIiwicGF0aFR5cGUiLCJjb25maWciLCJQYXRoVHlwZSIsIlNMSVAwMDEwIiwiU0VQYXRoIiwiZ2V0QXJndW1lbnQiLCJ0cmFuc2FjdGlvbiIsImNvbnNvbGUiLCJkZWJ1ZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJzZXFubyIsImV4cGlyZUF0IiwidG9BZGRyZXNzIiwiYW1vdW50IiwicGF5bG9hZCIsInNlbmRNb2RlIiwiX1RvbldlYiRBZGRyZXNzIiwiVG9uV2ViIiwiQWRkcmVzcyIsImlzQm91bmNlYWJsZSIsImhhc2hQYXJ0IiwiYW1vdW50QnVmZmVyIiwiQk4iLCJ0b0J1ZmZlciIsInNlcW5vQXJnIiwiZXhwaXJlQXRBcmciLCJzZW5kTW9kZUFyZyIsImlzQm91bmNlYWJsZUFyZyIsInRvQWRkcmVzc0FyZyIsImFtb3VudExlbmd0aEFyZyIsImJ5dGVMZW5ndGgiLCJhbW91bnRBcmciLCJtZW1vQXJnIiwiVGV4dEVuY29kZXIiLCJlbmNvZGUiLCJtZW1vTGVuZ3RoIiwiY2VsbDJMZW5ndGhBcmciLCJhcmd1bWVudCIsInBhZEVuZCIsImdldFRyYW5zZmVyVG9rZW5Bcmd1bWVudCIsImZyb21Ub2tlbkFjY291bnQiLCJ0b2tlbkluZm8iLCJqZXR0b25BbW91bnQiLCJyZWNlaXZlciIsImZvcndhcmRBbW91bnQiLCJmb3J3YXJkUGF5bG9hZCIsInJlc3BvbnNlQWRkcmVzcyIsInN5bWJvbCIsImRlY2ltYWxzIiwidG9rZW5BZGRyZXNzIiwiYWRkcmVzcyIsIl90b2tlbkluZm8kc2lnbmF0dXJlIiwic2lnbmF0dXJlIiwidG9rZW5TaWduYXR1cmUiLCJfVG9uV2ViJEFkZHJlc3MyIiwicmVjZWl2ZXJXb3JrY2hhaW4iLCJ3YyIsInJlY2VpdmVySGFzaFBhcnQiLCJfVG9uV2ViJEFkZHJlc3MzIiwicmVzcG9uc2VyV29ya2NoYWluIiwicmVzcG9uc2VySGFzaFBhcnQiLCJmb3J3YXJkQW1vdW50QnVmZmVyIiwiamV0dG9uQW1vdW50QnVmZmVyIiwiamV0dG9uQW1vdW50TGVuZ3RoQXJnIiwiamV0dG9uQW1vdW50QXJnIiwicmVjZWl2ZXJBcmciLCJyZWNlaXZlcldvcmtjaGFpbkFyZyIsInJlc3BvbnNlckFyZyIsInJlc3BvbnNlcldvcmtjaGFpbkFyZyIsImZvcndhcmRBbW91bnRMZW5ndGhBcmciLCJmb3J3YXJkQW1vdW50QXJnIiwiY2VsbDNMZW5ndGhBcmciLCJfVG9uV2ViJEFkZHJlc3M0IiwiZnJvbVRva2VuQWNjb3VudFdvcmtjaGFpbiIsImZyb21Ub2tlbkFjY291bnRIYXNoUGFydCIsImZyb21Ub2tlbkFjY291bnRBcmciLCJmcm9tVG9rZW5BY2NvdW50SXNCb3VuY2VhYmxlQXJnIiwiZnJvbVRva2VuQWNjb3VudFdvcmtjaGFpbkFyZyIsImRlY2ltYWxzSGV4IiwicGFyc2VJbnQiLCJzeW1ib2xMZW5ndGhIZXgiLCJzeW1ib2xIZXgiLCJ0b2tlbkluZm9BcmciLCJzaWduYXR1cmVBcmciXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvc2NyaXB0VXRpbHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJOIGZyb20gJ2JuLmpzJztcbmltcG9ydCB7IFRyYW5zZmVyVG9rZW5UcmFuc2FjdGlvbiwgVHJhbnNmZXJUcmFuc2FjdGlvbiB9IGZyb20gJy4uL2NvbmZpZy90eXBlcyc7XG5pbXBvcnQgVG9uV2ViIGZyb20gJ3RvbndlYic7XG5pbXBvcnQgeyBjb25maWcsIHV0aWxzIH0gZnJvbSAnQGNvb2x3YWxsZXQvY29yZSc7XG5cbmNvbnN0IHJlbW92ZUhleDB4ID0gKGhleDogc3RyaW5nKTogc3RyaW5nID0+IChoZXguc2xpY2UoMCwgMikgPT09ICcweCcgPyBoZXguc2xpY2UoMikgOiBoZXgpO1xuY29uc3QgZXZlbkhleERpZ2l0ID0gKGhleDogc3RyaW5nKTogc3RyaW5nID0+IChoZXgubGVuZ3RoICUgMiAhPT0gMCA/IGAwJHtoZXh9YCA6IGhleCk7XG5jb25zdCBoYW5kbGVIZXggPSAoaGV4OiBzdHJpbmcpOiBzdHJpbmcgPT4gZXZlbkhleERpZ2l0KHJlbW92ZUhleDB4KGhleCkpO1xuXG4vKipcbiAgMS4gQ3VycmVudGx5LCBQcm8gY2FyZCBmaXJtd2FyZSBvbmx5IHN1cHBvcnRzIHdyaXRpbmcgZGF0YSBpbiBCeXRlLCBzbyBlYWNoIGJpdCBuZWVkcyB0byBiZSB3cml0dGVuXG4gIGFzIGEgYnl0ZSwgYW5kIHRoZSBiaXRzIG11c3QgYmUgY29udmVydGVkIGludG8gYnl0ZXMgYmVmb3JlIHNpZ25pbmcuXG5cbiAgMi4gRWFjaCB0b25jb2luIHRyYW5zYWN0aW9uIGRhdGEgaXMgY29tcG9zZWQgb2Ygb25lIG9yIG1vcmUgQ2VsbHMsIGFuZCBlYWNoIENlbGwgY29udGFpbnMgMTAyMyBiaXRzIG9mIGRhdGEuXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHNhdmVCaXRBc0J5dGUoaGV4OiBzdHJpbmcpOiBzdHJpbmcge1xuICBoZXggPSBldmVuSGV4RGlnaXQoaGV4KTtcblxuICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShoZXgsICdoZXgnKTtcblxuICBsZXQgcmVzdWx0ID0gJyc7XG4gIGZvciAobGV0IGJ5dGUgb2YgYnVmZmVyKSB7XG4gICAgZm9yIChsZXQgYml0IG9mIGJ5dGUudG9TdHJpbmcoMikucGFkU3RhcnQoOCwgJzAnKSkge1xuICAgICAgcmVzdWx0ICs9IGJpdCA9PT0gJzAnID8gJzAwJyA6ICcwMSc7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGdldFNFUGF0aChhZGRyZXNzSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHBhdGhMZW5ndGggPSAnMEQnO1xuICBjb25zdCBwYXRoID0gdXRpbHMuZ2V0RnVsbFBhdGgoeyBwYXRoU3RyaW5nOiBgNDQnLzYwNycvJHthZGRyZXNzSW5kZXh9J2AsIHBhdGhUeXBlOiBjb25maWcuUGF0aFR5cGUuU0xJUDAwMTAgfSk7XG4gIGNvbnN0IFNFUGF0aCA9IGAke3BhdGhMZW5ndGh9JHtwYXRofWA7XG4gIHJldHVybiBTRVBhdGg7XG59XG5cbi8vIFtzZXFubyg0QildIFtleHBpcmVBdCg0QildIFtzZW5kTW9kZSgxQildIFtjZWxsMkxlbmd0aCg4QildIFtpc0JvdW5jZWFibGUoMUIpXSBbdG9BZGRyZXNzKDI1NkIpXSBbYW1vdW50TGVuZ3RoKDRCKV0gW2Ftb3VudCgxMjBCKV0gW21lbW8oNTEyQildXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXJndW1lbnQodHJhbnNhY3Rpb246IFJlcXVpcmVkPFRyYW5zZmVyVHJhbnNhY3Rpb24+LCBhZGRyZXNzSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnNvbGUuZGVidWcoYHNjcmlwdFV0aWxzLmdldEFyZ3VtZW50IHRyYW5zYWN0aW9uPSR7SlNPTi5zdHJpbmdpZnkodHJhbnNhY3Rpb24sIG51bGwsIDIpfWApO1xuICBjb25zdCB7IHNlcW5vLCBleHBpcmVBdCwgdG9BZGRyZXNzLCBhbW91bnQsIHBheWxvYWQsIHNlbmRNb2RlIH0gPSB0cmFuc2FjdGlvbjtcblxuICBjb25zdCB7IGlzQm91bmNlYWJsZSwgaGFzaFBhcnQgfSA9IG5ldyBUb25XZWIuQWRkcmVzcyh0b0FkZHJlc3MpO1xuICBjb25zdCBhbW91bnRCdWZmZXIgPSBuZXcgQk4oYW1vdW50KS50b0J1ZmZlcigpO1xuXG4gIGNvbnN0IHNlcW5vQXJnID0gc2Vxbm8udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDgsICcwJyk7XG4gIGNvbnN0IGV4cGlyZUF0QXJnID0gZXhwaXJlQXQudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDgsICcwJyk7XG4gIGNvbnN0IHNlbmRNb2RlQXJnID0gc2VuZE1vZGUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyk7XG4gIGNvbnN0IGlzQm91bmNlYWJsZUFyZyA9IGlzQm91bmNlYWJsZSA/ICcwMScgOiAnMDAnO1xuICBjb25zdCB0b0FkZHJlc3NBcmcgPSBCdWZmZXIuZnJvbShoYXNoUGFydCkudG9TdHJpbmcoJ2hleCcpO1xuICBjb25zdCBhbW91bnRMZW5ndGhBcmcgPSBhbW91bnRCdWZmZXIuYnl0ZUxlbmd0aC50b1N0cmluZygxNik7XG4gIGNvbnN0IGFtb3VudEFyZyA9IGFtb3VudEJ1ZmZlci50b1N0cmluZygnaGV4Jyk7XG4gIGNvbnN0IG1lbW9BcmcgPSBwYXlsb2FkID8gJzAwMDAwMDAwJyArIEJ1ZmZlci5mcm9tKG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShwYXlsb2FkIHx8ICcnKSkudG9TdHJpbmcoJ2hleCcpIDogJyc7XG4gIGNvbnN0IG1lbW9MZW5ndGggPSAoKG1lbW9BcmcubGVuZ3RoIC8gMikgKiA4KS50b1N0cmluZygxNikucGFkU3RhcnQoNCwgJzAnKTtcbiAgY29uc3QgY2VsbDJMZW5ndGhBcmcgPSAoOTYgKyBtZW1vQXJnLmxlbmd0aCArIGFtb3VudEFyZy5sZW5ndGgpLnRvU3RyaW5nKDE2KTtcblxuICBjb25zdCBhcmd1bWVudCA9XG4gICAgc2Vxbm9BcmcgK1xuICAgIGV4cGlyZUF0QXJnICtcbiAgICBzZW5kTW9kZUFyZyArXG4gICAgc2F2ZUJpdEFzQnl0ZShjZWxsMkxlbmd0aEFyZykgK1xuICAgIGlzQm91bmNlYWJsZUFyZyArXG4gICAgc2F2ZUJpdEFzQnl0ZSh0b0FkZHJlc3NBcmcpICtcbiAgICBzYXZlQml0QXNCeXRlKGFtb3VudExlbmd0aEFyZykuc2xpY2UoOCwgMTYpICtcbiAgICBzYXZlQml0QXNCeXRlKGFtb3VudEFyZykucGFkRW5kKDI0MCwgJzAnKSArXG4gICAgbWVtb0xlbmd0aCArXG4gICAgc2F2ZUJpdEFzQnl0ZShtZW1vQXJnKS5wYWRFbmQoMTAyNCwgJzAnKTtcblxuICByZXR1cm4gZ2V0U0VQYXRoKGFkZHJlc3NJbmRleCkgKyBhcmd1bWVudDtcbn1cblxuLy8gQ2VsbDM6IFtjZWxsM0xlbmd0aCg4QildW2pldHRvbkFtb3VudExlbmd0aCg0QildW2pldHRvbkFtb3VudCgxMjBCKV1bcmVjZWl2ZXIoMjU2QildW3JlY2VpdmVyV29ya2NoYWluKDhCKV1bcmVzcG9uc2VyKDI1NkIpXVtyZXNwb25zZXJXb3JrY2hhaW4oOEIpXVtmb3J3YXJkQW1vdW50TGVuZ3RoKDRCKV1bZm9yd2FyZEFtb3VudCgxMjBCKV1bbWVtb0xlbmd0aCgyQildW21lbW8oNTEyKV1cbi8vIENlbGwyOiBbY2VsbDJMZW5ndGgoOEIpXVtmcm9tVG9rZW5BY2NvdW50KDI1NkIpXVtmcm9tVG9rZW5BY2NvdW50SXNCb3VuY2VhYmxlKDFCKV1bZnJvbVRva2VuQWNjb3VudFdvcmtjaGFpbig4QildW2Ftb3VudExlbmd0aCg0QildW2Ftb3VudCgxMjBCKV1cbi8vIENlbGwxOiBbc2Vxbm8oNEIpXVtleHBpcmVBdCg0QildW3NlbmRNb2RlKDFCKV1cbi8vIFRva2VuOiBbdG9rZW5EZWNpbWFsKDFCKV1bdG9rZW5OYW1lTGVuZ3RoKDFCKV1bdG9rZW5OYW1lKDdCKV1bdG9rZW5Db250cmFjdEFkZHJlc3MoMzZCKV1bdG9rZW5TaWduKDcyQildXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJhbnNmZXJUb2tlbkFyZ3VtZW50KFxuICB0cmFuc2FjdGlvbjogUmVxdWlyZWQ8VHJhbnNmZXJUb2tlblRyYW5zYWN0aW9uPixcbiAgYWRkcmVzc0luZGV4OiBudW1iZXJcbik6IHN0cmluZyB7XG4gIGNvbnNvbGUuZGVidWcoYHNjcmlwdFV0aWxzLmdldEFyZ3VtZW50IHRyYW5zYWN0aW9uPSR7SlNPTi5zdHJpbmdpZnkodHJhbnNhY3Rpb24sIG51bGwsIDIpfWApO1xuICBjb25zdCB7IHNlcW5vLCBleHBpcmVBdCwgdG9BZGRyZXNzOiBmcm9tVG9rZW5BY2NvdW50LCBhbW91bnQsIHBheWxvYWQsIHNlbmRNb2RlLCB0b2tlbkluZm8gfSA9IHRyYW5zYWN0aW9uO1xuICBjb25zdCB7IGpldHRvbkFtb3VudCwgdG9BZGRyZXNzOiByZWNlaXZlciwgZm9yd2FyZEFtb3VudCwgZm9yd2FyZFBheWxvYWQsIHJlc3BvbnNlQWRkcmVzcyB9ID0gcGF5bG9hZDtcbiAgY29uc3QgeyBzeW1ib2wsIGRlY2ltYWxzLCBhZGRyZXNzOiB0b2tlbkFkZHJlc3MsIHNpZ25hdHVyZTogdG9rZW5TaWduYXR1cmUgPSAnJyB9ID0gdG9rZW5JbmZvO1xuXG4gIC8vIENlbGwzXG4gIGNvbnN0IHsgd2M6IHJlY2VpdmVyV29ya2NoYWluLCBoYXNoUGFydDogcmVjZWl2ZXJIYXNoUGFydCB9ID0gbmV3IFRvbldlYi5BZGRyZXNzKHJlY2VpdmVyKTtcbiAgY29uc3QgeyB3YzogcmVzcG9uc2VyV29ya2NoYWluLCBoYXNoUGFydDogcmVzcG9uc2VySGFzaFBhcnQgfSA9IG5ldyBUb25XZWIuQWRkcmVzcyhyZXNwb25zZUFkZHJlc3MpO1xuICBjb25zdCBmb3J3YXJkQW1vdW50QnVmZmVyID0gbmV3IEJOKGZvcndhcmRBbW91bnQpLnRvQnVmZmVyKCk7XG4gIGNvbnN0IGpldHRvbkFtb3VudEJ1ZmZlciA9IG5ldyBCTihqZXR0b25BbW91bnQpLnRvQnVmZmVyKCk7XG5cbiAgY29uc3QgamV0dG9uQW1vdW50TGVuZ3RoQXJnID0gamV0dG9uQW1vdW50QnVmZmVyLmJ5dGVMZW5ndGgudG9TdHJpbmcoMTYpO1xuICBjb25zdCBqZXR0b25BbW91bnRBcmcgPSBqZXR0b25BbW91bnRCdWZmZXIudG9TdHJpbmcoJ2hleCcpO1xuICBjb25zdCByZWNlaXZlckFyZyA9IEJ1ZmZlci5mcm9tKHJlY2VpdmVySGFzaFBhcnQpLnRvU3RyaW5nKCdoZXgnKTtcbiAgY29uc3QgcmVjZWl2ZXJXb3JrY2hhaW5BcmcgPSBuZXcgQk4ocmVjZWl2ZXJXb3JrY2hhaW4pLnRvU3RyaW5nKCdoZXgnKTtcbiAgY29uc3QgcmVzcG9uc2VyQXJnID0gQnVmZmVyLmZyb20ocmVzcG9uc2VySGFzaFBhcnQpLnRvU3RyaW5nKCdoZXgnKTtcbiAgY29uc3QgcmVzcG9uc2VyV29ya2NoYWluQXJnID0gbmV3IEJOKHJlc3BvbnNlcldvcmtjaGFpbikudG9TdHJpbmcoJ2hleCcpO1xuICBjb25zdCBmb3J3YXJkQW1vdW50TGVuZ3RoQXJnID0gZm9yd2FyZEFtb3VudEJ1ZmZlci5ieXRlTGVuZ3RoLnRvU3RyaW5nKDE2KTtcbiAgY29uc3QgZm9yd2FyZEFtb3VudEFyZyA9IGZvcndhcmRBbW91bnRCdWZmZXIudG9TdHJpbmcoJ2hleCcpO1xuICBjb25zdCBtZW1vQXJnID0gJzAwMDAwMDAwJyArIEJ1ZmZlci5mcm9tKG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShmb3J3YXJkUGF5bG9hZCB8fCAnJykpLnRvU3RyaW5nKCdoZXgnKTtcbiAgY29uc3QgbWVtb0xlbmd0aCA9ICgobWVtb0FyZy5sZW5ndGggLyAyKSAqIDgpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg0LCAnMCcpO1xuICBjb25zdCBjZWxsM0xlbmd0aEFyZyA9ICgxNjAgKyBtZW1vQXJnLmxlbmd0aCArIGpldHRvbkFtb3VudEFyZy5sZW5ndGggKyBmb3J3YXJkQW1vdW50QXJnLmxlbmd0aCkudG9TdHJpbmcoMTYpO1xuXG4gIC8vIENlbGwyXG4gIGNvbnN0IHtcbiAgICB3YzogZnJvbVRva2VuQWNjb3VudFdvcmtjaGFpbixcbiAgICBoYXNoUGFydDogZnJvbVRva2VuQWNjb3VudEhhc2hQYXJ0LFxuICAgIGlzQm91bmNlYWJsZSxcbiAgfSA9IG5ldyBUb25XZWIuQWRkcmVzcyhmcm9tVG9rZW5BY2NvdW50KTtcbiAgY29uc3QgYW1vdW50QnVmZmVyID0gbmV3IEJOKGFtb3VudCkudG9CdWZmZXIoKTtcblxuICBjb25zdCBmcm9tVG9rZW5BY2NvdW50QXJnID0gQnVmZmVyLmZyb20oZnJvbVRva2VuQWNjb3VudEhhc2hQYXJ0KS50b1N0cmluZygnaGV4Jyk7XG4gIGNvbnN0IGZyb21Ub2tlbkFjY291bnRJc0JvdW5jZWFibGVBcmcgPSBpc0JvdW5jZWFibGUgPyAnMDEnIDogJzAwJztcbiAgY29uc3QgZnJvbVRva2VuQWNjb3VudFdvcmtjaGFpbkFyZyA9IG5ldyBCTihmcm9tVG9rZW5BY2NvdW50V29ya2NoYWluKS50b1N0cmluZygnaGV4Jyk7XG4gIGNvbnN0IGFtb3VudExlbmd0aEFyZyA9IGFtb3VudEJ1ZmZlci5ieXRlTGVuZ3RoLnRvU3RyaW5nKDE2KTtcbiAgY29uc3QgYW1vdW50QXJnID0gYW1vdW50QnVmZmVyLnRvU3RyaW5nKCdoZXgnKTtcbiAgY29uc3QgY2VsbDJMZW5ndGhBcmcgPSAoOTYgKyBhbW91bnRBcmcubGVuZ3RoKS50b1N0cmluZygxNik7XG5cbiAgLy8gQ2VsbDFcbiAgY29uc3Qgc2Vxbm9BcmcgPSBzZXFuby50b1N0cmluZygxNikucGFkU3RhcnQoOCwgJzAnKTtcbiAgY29uc3QgZXhwaXJlQXRBcmcgPSBleHBpcmVBdC50b1N0cmluZygxNikucGFkU3RhcnQoOCwgJzAnKTtcbiAgY29uc3Qgc2VuZE1vZGVBcmcgPSBzZW5kTW9kZS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKTtcblxuICAvLyBkaXNwbGF5IGluZm9cbiAgY29uc3QgZGVjaW1hbHNIZXggPSBoYW5kbGVIZXgocGFyc2VJbnQoZGVjaW1hbHMudG9TdHJpbmcoKSwgMTApLnRvU3RyaW5nKDE2KSk7XG4gIGNvbnN0IHN5bWJvbExlbmd0aEhleCA9IGhhbmRsZUhleChzeW1ib2wubGVuZ3RoLnRvU3RyaW5nKDE2KSk7XG4gIGNvbnN0IHN5bWJvbEhleCA9IGhhbmRsZUhleChCdWZmZXIuZnJvbShzeW1ib2wpLnRvU3RyaW5nKCdoZXgnKSk7XG4gIGNvbnN0IHRva2VuSW5mb0FyZyA9XG4gICAgZGVjaW1hbHNIZXggK1xuICAgIHN5bWJvbExlbmd0aEhleCArXG4gICAgc3ltYm9sSGV4LnBhZEVuZCgxNCwgJzAnKSArXG4gICAgcmVtb3ZlSGV4MHgoQnVmZmVyLmZyb20odG9rZW5BZGRyZXNzLCAnYmFzZTY0JykudG9TdHJpbmcoJ2hleCcpKTtcbiAgY29uc3Qgc2lnbmF0dXJlQXJnID0gdG9rZW5TaWduYXR1cmUucGFkU3RhcnQoMTQ0LCAnMCcpO1xuXG4gIGNvbnN0IGFyZ3VtZW50ID1cbiAgICAvLyBDZWxsM1xuICAgIHNhdmVCaXRBc0J5dGUoY2VsbDNMZW5ndGhBcmcpICtcbiAgICBzYXZlQml0QXNCeXRlKGpldHRvbkFtb3VudExlbmd0aEFyZykuc2xpY2UoOCwgMTYpICtcbiAgICBzYXZlQml0QXNCeXRlKGpldHRvbkFtb3VudEFyZykucGFkRW5kKDI0MCwgJzAnKSArXG4gICAgc2F2ZUJpdEFzQnl0ZShyZWNlaXZlckFyZykgK1xuICAgIHNhdmVCaXRBc0J5dGUocmVjZWl2ZXJXb3JrY2hhaW5BcmcpICtcbiAgICBzYXZlQml0QXNCeXRlKHJlc3BvbnNlckFyZykgK1xuICAgIHNhdmVCaXRBc0J5dGUocmVzcG9uc2VyV29ya2NoYWluQXJnKSArXG4gICAgc2F2ZUJpdEFzQnl0ZShmb3J3YXJkQW1vdW50TGVuZ3RoQXJnKS5zbGljZSg4LCAxNikgK1xuICAgIHNhdmVCaXRBc0J5dGUoZm9yd2FyZEFtb3VudEFyZykucGFkRW5kKDI0MCwgJzAnKSArXG4gICAgbWVtb0xlbmd0aCArXG4gICAgc2F2ZUJpdEFzQnl0ZShtZW1vQXJnKS5wYWRFbmQoMTAyNCwgJzAnKSArXG4gICAgLy8gQ2VsbDJcbiAgICBzYXZlQml0QXNCeXRlKGNlbGwyTGVuZ3RoQXJnKSArXG4gICAgc2F2ZUJpdEFzQnl0ZShmcm9tVG9rZW5BY2NvdW50QXJnKSArXG4gICAgZnJvbVRva2VuQWNjb3VudElzQm91bmNlYWJsZUFyZyArXG4gICAgc2F2ZUJpdEFzQnl0ZShmcm9tVG9rZW5BY2NvdW50V29ya2NoYWluQXJnKSArXG4gICAgc2F2ZUJpdEFzQnl0ZShhbW91bnRMZW5ndGhBcmcpLnNsaWNlKDgsIDE2KSArXG4gICAgc2F2ZUJpdEFzQnl0ZShhbW91bnRBcmcpLnBhZEVuZCgyNDAsICcwJykgK1xuICAgIC8vIENlbGwxXG4gICAgc2Vxbm9BcmcgK1xuICAgIGV4cGlyZUF0QXJnICtcbiAgICBzZW5kTW9kZUFyZyArXG4gICAgLy8gVG9rZW4gSW5mb1xuICAgIHRva2VuSW5mb0FyZyArXG4gICAgc2lnbmF0dXJlQXJnO1xuXG4gIGNvbnNvbGUuZGVidWcoYGFyZ3VtZW50OiAke2FyZ3VtZW50fWApO1xuXG4gIHJldHVybiBnZXRTRVBhdGgoYWRkcmVzc0luZGV4KSArIGFyZ3VtZW50O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLEdBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFDLE9BQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLEtBQUEsR0FBQUYsT0FBQTtBQUFpRCxTQUFBRCx1QkFBQUksR0FBQSxXQUFBQSxHQUFBLElBQUFBLEdBQUEsQ0FBQUMsVUFBQSxHQUFBRCxHQUFBLGdCQUFBQSxHQUFBO0FBQUEsU0FB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