UNPKG

@coolwallet/kas

Version:
167 lines (166 loc) 25.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Transaction = void 0; var _address = require("../utils/address"); var _utils = require("../utils/utils"); var _hash = require("../utils/hash"); var _bignumber = _interopRequireDefault(require("bignumber.js")); var _estimateFee = require("../utils/estimateFee"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } var Transaction = exports.Transaction = /*#__PURE__*/function () { function Transaction(txData) { var _this = this; _classCallCheck(this, Transaction); _defineProperty(this, "version", 0); _defineProperty(this, "inputs", []); _defineProperty(this, "outputs", []); _defineProperty(this, "lockTime", 0); _defineProperty(this, "subnetworkId", '0000000000000000000000000000000000000000'); _defineProperty(this, "utxos", []); _defineProperty(this, "feeValue", '0'); var totalInput = 0; txData.inputs.forEach(function (input) { var _input$pubkeyBuf; _this.inputs.push({ previousOutpoint: { transactionId: input.preTxHash, index: input.preIndex }, signatureScript: '', sequence: 0, sigOpCount: 1, addressIndex: input.addressIndex }); var inputPreValueBN = new _bignumber["default"](input.preValue); var pubKey = (_input$pubkeyBuf = input.pubkeyBuf) === null || _input$pubkeyBuf === void 0 ? void 0 : _input$pubkeyBuf.toString('hex'); var inputScriptType = input.scriptType; var _getPubkeyOrScriptHas = (0, _address.getPubkeyOrScriptHash)(inputScriptType, pubKey), pubkeyOrScriptHash = _getPubkeyOrScriptHas.pubkeyOrScriptHash, addressVersion = _getPubkeyOrScriptHas.addressVersion; _this.utxos.push({ version: 0, pkScript: (0, _address.pubkeyOrScriptHashToPayment)(pubkeyOrScriptHash, addressVersion).outScript, scriptType: inputScriptType, amount: inputPreValueBN.toNumber() }); totalInput = inputPreValueBN.plus(new _bignumber["default"](totalInput)).toNumber(); }); var totalOutput = 0; var output = txData.output; var outputValueBN = new _bignumber["default"](output.value); var _addressToOutScript = (0, _address.addressToOutScript)(output.address), outputScriptType = _addressToOutScript.scriptType, outScript = _addressToOutScript.outScript, outPubkeyOrHash = _addressToOutScript.outPubkeyOrHash; this.outputs.push({ scriptPublicKey: { version: 0, scriptType: outputScriptType, scriptPublicKey: (0, _utils.toHex)(outScript), publicKeyOrScriptHash: (0, _utils.toHex)(outPubkeyOrHash) }, amount: outputValueBN.toNumber() }); totalOutput += outputValueBN.plus(new _bignumber["default"](totalOutput)).toNumber(); this.feeValue = new _bignumber["default"](totalInput).minus(new _bignumber["default"](totalOutput)).toFixed(); var change = txData.change; if (change) { var _change$pubkeyBuf; var changeValueBN = new _bignumber["default"](change.value); var pubKey = (_change$pubkeyBuf = change.pubkeyBuf) === null || _change$pubkeyBuf === void 0 ? void 0 : _change$pubkeyBuf.toString('hex'); var changeScriptType = change.scriptType; var _getPubkeyOrScriptHas2 = (0, _address.getPubkeyOrScriptHash)(changeScriptType, pubKey), pubkeyOrScriptHash = _getPubkeyOrScriptHas2.pubkeyOrScriptHash, addressVersion = _getPubkeyOrScriptHas2.addressVersion; var _pubkeyOrScriptHashTo = (0, _address.pubkeyOrScriptHashToPayment)(pubkeyOrScriptHash, addressVersion), changeScript = _pubkeyOrScriptHashTo.outScript; this.outputs.push({ scriptPublicKey: { version: 0, scriptType: changeScriptType, scriptPublicKey: (0, _utils.toHex)(changeScript), publicKeyOrScriptHash: pubkeyOrScriptHash }, amount: changeValueBN.toNumber(), addressIndex: change.addressIndex }); this.feeValue = new _bignumber["default"](this.feeValue).minus(changeValueBN).toFixed(); } } _createClass(Transaction, [{ key: "addSignatures", value: function addSignatures(signatures) { this.inputs.forEach(function (input, i) { if (input.signatureScript.length > 0) return; var signature = signatures[i]; input.signatureScript = (0, _utils.toHex)(Buffer.concat([Buffer.from([0x41]), signature, Buffer.from([_hash.SIGHASH_ALL])])); }); return this; } }, { key: "getTxInfo", value: function getTxInfo() { return (0, _estimateFee.getMassAndSize)(this.inputs, this.outputs); } }, { key: "estimateFee", value: function estimateFee() { var feeRate = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1000; var _this$getTxInfo = this.getTxInfo(), mass = _this$getTxInfo.mass; return (0, _estimateFee.minimumRequiredTransactionRelayFee)(mass, feeRate); } }, { key: "getMessage", value: function getMessage() { return JSON.stringify({ transaction: { version: this.version, inputs: this.inputs.map(function (_ref) { var previousOutpoint = _ref.previousOutpoint, signatureScript = _ref.signatureScript, sequence = _ref.sequence, sigOpCount = _ref.sigOpCount; return { previousOutpoint: previousOutpoint, signatureScript: signatureScript, sequence: sequence, sigOpCount: sigOpCount }; }), outputs: this.outputs.map(function (_ref2) { var amount = _ref2.amount, scriptPublicKey = _ref2.scriptPublicKey; return { amount: amount, scriptPublicKey: { version: 0, // TODO: USE REAL SCRIPT VERSION scriptPublicKey: scriptPublicKey.scriptPublicKey } }; }), lockTime: this.lockTime, subnetworkId: this.subnetworkId }, allowOrphan: false }); } }], [{ key: "fromTxData", value: function fromTxData(txData) { return new Transaction(txData); } }]); return Transaction; }(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYWRkcmVzcyIsInJlcXVpcmUiLCJfdXRpbHMiLCJfaGFzaCIsIl9iaWdudW1iZXIiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2VzdGltYXRlRmVlIiwib2JqIiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJvIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJjb25zdHJ1Y3RvciIsInByb3RvdHlwZSIsIl9jbGFzc0NhbGxDaGVjayIsImluc3RhbmNlIiwiQ29uc3RydWN0b3IiLCJUeXBlRXJyb3IiLCJfZGVmaW5lUHJvcGVydGllcyIsInRhcmdldCIsInByb3BzIiwiaSIsImxlbmd0aCIsImRlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsIl90b1Byb3BlcnR5S2V5Iiwia2V5IiwiX2NyZWF0ZUNsYXNzIiwicHJvdG9Qcm9wcyIsInN0YXRpY1Byb3BzIiwiX2RlZmluZVByb3BlcnR5IiwidmFsdWUiLCJ0IiwiX3RvUHJpbWl0aXZlIiwiU3RyaW5nIiwiciIsImUiLCJ0b1ByaW1pdGl2ZSIsImNhbGwiLCJOdW1iZXIiLCJUcmFuc2FjdGlvbiIsImV4cG9ydHMiLCJ0eERhdGEiLCJfdGhpcyIsInRvdGFsSW5wdXQiLCJpbnB1dHMiLCJmb3JFYWNoIiwiaW5wdXQiLCJfaW5wdXQkcHVia2V5QnVmIiwicHVzaCIsInByZXZpb3VzT3V0cG9pbnQiLCJ0cmFuc2FjdGlvbklkIiwicHJlVHhIYXNoIiwiaW5kZXgiLCJwcmVJbmRleCIsInNpZ25hdHVyZVNjcmlwdCIsInNlcXVlbmNlIiwic2lnT3BDb3VudCIsImFkZHJlc3NJbmRleCIsImlucHV0UHJlVmFsdWVCTiIsIkJpZ051bWJlciIsInByZVZhbHVlIiwicHViS2V5IiwicHVia2V5QnVmIiwidG9TdHJpbmciLCJpbnB1dFNjcmlwdFR5cGUiLCJzY3JpcHRUeXBlIiwiX2dldFB1YmtleU9yU2NyaXB0SGFzIiwiZ2V0UHVia2V5T3JTY3JpcHRIYXNoIiwicHVia2V5T3JTY3JpcHRIYXNoIiwiYWRkcmVzc1ZlcnNpb24iLCJ1dHhvcyIsInZlcnNpb24iLCJwa1NjcmlwdCIsInB1YmtleU9yU2NyaXB0SGFzaFRvUGF5bWVudCIsIm91dFNjcmlwdCIsImFtb3VudCIsInRvTnVtYmVyIiwicGx1cyIsInRvdGFsT3V0cHV0Iiwib3V0cHV0Iiwib3V0cHV0VmFsdWVCTiIsIl9hZGRyZXNzVG9PdXRTY3JpcHQiLCJhZGRyZXNzVG9PdXRTY3JpcHQiLCJhZGRyZXNzIiwib3V0cHV0U2NyaXB0VHlwZSIsIm91dFB1YmtleU9ySGFzaCIsIm91dHB1dHMiLCJzY3JpcHRQdWJsaWNLZXkiLCJ0b0hleCIsInB1YmxpY0tleU9yU2NyaXB0SGFzaCIsImZlZVZhbHVlIiwibWludXMiLCJ0b0ZpeGVkIiwiY2hhbmdlIiwiX2NoYW5nZSRwdWJrZXlCdWYiLCJjaGFuZ2VWYWx1ZUJOIiwiY2hhbmdlU2NyaXB0VHlwZSIsIl9nZXRQdWJrZXlPclNjcmlwdEhhczIiLCJfcHVia2V5T3JTY3JpcHRIYXNoVG8iLCJjaGFuZ2VTY3JpcHQiLCJhZGRTaWduYXR1cmVzIiwic2lnbmF0dXJlcyIsInNpZ25hdHVyZSIsIkJ1ZmZlciIsImNvbmNhdCIsImZyb20iLCJTSUdIQVNIX0FMTCIsImdldFR4SW5mbyIsImdldE1hc3NBbmRTaXplIiwiZXN0aW1hdGVGZWUiLCJmZWVSYXRlIiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwiX3RoaXMkZ2V0VHhJbmZvIiwibWFzcyIsIm1pbmltdW1SZXF1aXJlZFRyYW5zYWN0aW9uUmVsYXlGZWUiLCJnZXRNZXNzYWdlIiwiSlNPTiIsInN0cmluZ2lmeSIsInRyYW5zYWN0aW9uIiwibWFwIiwiX3JlZiIsIl9yZWYyIiwibG9ja1RpbWUiLCJzdWJuZXR3b3JrSWQiLCJhbGxvd09ycGhhbiIsImZyb21UeERhdGEiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdHJhbnNhY3Rpb24vaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2NyaXB0VHlwZSwgVHJhbnNhY3Rpb25JbnB1dCwgVHJhbnNhY3Rpb25PdXRwdXQsIFRyYW5zYWN0aW9uVXR4bywgVHhEYXRhLCBUeEluZm8gfSBmcm9tICcuLi9jb25maWcvdHlwZXMnO1xuaW1wb3J0IHtcbiAgYWRkcmVzc1RvT3V0U2NyaXB0LFxuICBnZXRQdWJrZXlPclNjcmlwdEhhc2gsXG4gIHB1YmtleU9yU2NyaXB0SGFzaFRvUGF5bWVudCxcbn0gZnJvbSAnLi4vdXRpbHMvYWRkcmVzcyc7XG5pbXBvcnQgeyB0b0hleCB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCB7IFNJR0hBU0hfQUxMIH0gZnJvbSAnLi4vdXRpbHMvaGFzaCc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgeyBnZXRNYXNzQW5kU2l6ZSwgbWluaW11bVJlcXVpcmVkVHJhbnNhY3Rpb25SZWxheUZlZSB9IGZyb20gJy4uL3V0aWxzL2VzdGltYXRlRmVlJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uIHtcbiAgdmVyc2lvbjogbnVtYmVyID0gMDtcbiAgaW5wdXRzOiBUcmFuc2FjdGlvbklucHV0W10gPSBbXTtcbiAgb3V0cHV0czogVHJhbnNhY3Rpb25PdXRwdXRbXSA9IFtdO1xuICBsb2NrVGltZTogbnVtYmVyID0gMDtcbiAgc3VibmV0d29ya0lkOiBzdHJpbmcgPSAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCc7XG4gIHV0eG9zOiBUcmFuc2FjdGlvblV0eG9bXSA9IFtdO1xuICBmZWVWYWx1ZTogc3RyaW5nID0gJzAnO1xuXG4gIHN0YXRpYyBmcm9tVHhEYXRhKHR4RGF0YTogVHhEYXRhKTogVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb24odHhEYXRhKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHR4RGF0YTogVHhEYXRhKSB7XG4gICAgbGV0IHRvdGFsSW5wdXQgPSAwO1xuICAgIHR4RGF0YS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgIHRoaXMuaW5wdXRzLnB1c2goe1xuICAgICAgICBwcmV2aW91c091dHBvaW50OiB7XG4gICAgICAgICAgdHJhbnNhY3Rpb25JZDogaW5wdXQucHJlVHhIYXNoLFxuICAgICAgICAgIGluZGV4OiBpbnB1dC5wcmVJbmRleCxcbiAgICAgICAgfSxcbiAgICAgICAgc2lnbmF0dXJlU2NyaXB0OiAnJyxcbiAgICAgICAgc2VxdWVuY2U6IDAsXG4gICAgICAgIHNpZ09wQ291bnQ6IDEsXG4gICAgICAgIGFkZHJlc3NJbmRleDogaW5wdXQuYWRkcmVzc0luZGV4LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGlucHV0UHJlVmFsdWVCTiA9IG5ldyBCaWdOdW1iZXIoaW5wdXQucHJlVmFsdWUpO1xuICAgICAgY29uc3QgcHViS2V5ID0gaW5wdXQucHVia2V5QnVmPy50b1N0cmluZygnaGV4JykgYXMgc3RyaW5nO1xuICAgICAgY29uc3QgaW5wdXRTY3JpcHRUeXBlID0gaW5wdXQuc2NyaXB0VHlwZSBhcyBTY3JpcHRUeXBlO1xuICAgICAgY29uc3QgeyBwdWJrZXlPclNjcmlwdEhhc2gsIGFkZHJlc3NWZXJzaW9uIH0gPSBnZXRQdWJrZXlPclNjcmlwdEhhc2goaW5wdXRTY3JpcHRUeXBlLCBwdWJLZXkpO1xuICAgICAgdGhpcy51dHhvcy5wdXNoKHtcbiAgICAgICAgdmVyc2lvbjogMCxcbiAgICAgICAgcGtTY3JpcHQ6IHB1YmtleU9yU2NyaXB0SGFzaFRvUGF5bWVudChwdWJrZXlPclNjcmlwdEhhc2gsIGFkZHJlc3NWZXJzaW9uKS5vdXRTY3JpcHQsXG4gICAgICAgIHNjcmlwdFR5cGU6IGlucHV0U2NyaXB0VHlwZSxcbiAgICAgICAgYW1vdW50OiBpbnB1dFByZVZhbHVlQk4udG9OdW1iZXIoKSxcbiAgICAgIH0pO1xuICAgICAgdG90YWxJbnB1dCA9IGlucHV0UHJlVmFsdWVCTi5wbHVzKG5ldyBCaWdOdW1iZXIodG90YWxJbnB1dCkpLnRvTnVtYmVyKCk7XG4gICAgfSk7XG5cbiAgICBsZXQgdG90YWxPdXRwdXQgPSAwO1xuICAgIGNvbnN0IG91dHB1dCA9IHR4RGF0YS5vdXRwdXQ7XG4gICAgY29uc3Qgb3V0cHV0VmFsdWVCTiA9IG5ldyBCaWdOdW1iZXIob3V0cHV0LnZhbHVlKTtcbiAgICBjb25zdCB7IHNjcmlwdFR5cGU6IG91dHB1dFNjcmlwdFR5cGUsIG91dFNjcmlwdCwgb3V0UHVia2V5T3JIYXNoIH0gPSBhZGRyZXNzVG9PdXRTY3JpcHQob3V0cHV0LmFkZHJlc3MpO1xuICAgIHRoaXMub3V0cHV0cy5wdXNoKHtcbiAgICAgIHNjcmlwdFB1YmxpY0tleToge1xuICAgICAgICB2ZXJzaW9uOiAwLFxuICAgICAgICBzY3JpcHRUeXBlOiBvdXRwdXRTY3JpcHRUeXBlLFxuICAgICAgICBzY3JpcHRQdWJsaWNLZXk6IHRvSGV4KG91dFNjcmlwdCksXG4gICAgICAgIHB1YmxpY0tleU9yU2NyaXB0SGFzaDogdG9IZXgob3V0UHVia2V5T3JIYXNoKSxcbiAgICAgIH0sXG4gICAgICBhbW91bnQ6IG91dHB1dFZhbHVlQk4udG9OdW1iZXIoKSxcbiAgICB9KTtcbiAgICB0b3RhbE91dHB1dCArPSBvdXRwdXRWYWx1ZUJOLnBsdXMobmV3IEJpZ051bWJlcih0b3RhbE91dHB1dCkpLnRvTnVtYmVyKCk7XG5cbiAgICB0aGlzLmZlZVZhbHVlID0gbmV3IEJpZ051bWJlcih0b3RhbElucHV0KS5taW51cyhuZXcgQmlnTnVtYmVyKHRvdGFsT3V0cHV0KSkudG9GaXhlZCgpO1xuICAgIGNvbnN0IGNoYW5nZSA9IHR4RGF0YS5jaGFuZ2U7XG4gICAgaWYgKGNoYW5nZSkge1xuICAgICAgY29uc3QgY2hhbmdlVmFsdWVCTiA9IG5ldyBCaWdOdW1iZXIoY2hhbmdlLnZhbHVlKTtcbiAgICAgIGNvbnN0IHB1YktleSA9IGNoYW5nZS5wdWJrZXlCdWY/LnRvU3RyaW5nKCdoZXgnKSBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBjaGFuZ2VTY3JpcHRUeXBlID0gY2hhbmdlLnNjcmlwdFR5cGUgYXMgU2NyaXB0VHlwZTtcbiAgICAgIGNvbnN0IHsgcHVia2V5T3JTY3JpcHRIYXNoLCBhZGRyZXNzVmVyc2lvbiB9ID0gZ2V0UHVia2V5T3JTY3JpcHRIYXNoKGNoYW5nZVNjcmlwdFR5cGUsIHB1YktleSk7XG4gICAgICBjb25zdCB7IG91dFNjcmlwdDogY2hhbmdlU2NyaXB0IH0gPSBwdWJrZXlPclNjcmlwdEhhc2hUb1BheW1lbnQocHVia2V5T3JTY3JpcHRIYXNoLCBhZGRyZXNzVmVyc2lvbik7XG4gICAgICB0aGlzLm91dHB1dHMucHVzaCh7XG4gICAgICAgIHNjcmlwdFB1YmxpY0tleToge1xuICAgICAgICAgIHZlcnNpb246IDAsXG4gICAgICAgICAgc2NyaXB0VHlwZTogY2hhbmdlU2NyaXB0VHlwZSxcbiAgICAgICAgICBzY3JpcHRQdWJsaWNLZXk6IHRvSGV4KGNoYW5nZVNjcmlwdCksXG4gICAgICAgICAgcHVibGljS2V5T3JTY3JpcHRIYXNoOiBwdWJrZXlPclNjcmlwdEhhc2gsXG4gICAgICAgIH0sXG4gICAgICAgIGFtb3VudDogY2hhbmdlVmFsdWVCTi50b051bWJlcigpLFxuICAgICAgICBhZGRyZXNzSW5kZXg6IGNoYW5nZS5hZGRyZXNzSW5kZXgsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZmVlVmFsdWUgPSBuZXcgQmlnTnVtYmVyKHRoaXMuZmVlVmFsdWUpLm1pbnVzKGNoYW5nZVZhbHVlQk4pLnRvRml4ZWQoKTtcbiAgICB9XG4gIH1cblxuICBhZGRTaWduYXR1cmVzKHNpZ25hdHVyZXM6IEJ1ZmZlcltdKTogdGhpcyB7XG4gICAgdGhpcy5pbnB1dHMuZm9yRWFjaCgoaW5wdXQsIGkpID0+IHtcbiAgICAgIGlmIChpbnB1dC5zaWduYXR1cmVTY3JpcHQubGVuZ3RoID4gMCkgcmV0dXJuO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlID0gc2lnbmF0dXJlc1tpXTtcbiAgICAgIGlucHV0LnNpZ25hdHVyZVNjcmlwdCA9IHRvSGV4KEJ1ZmZlci5jb25jYXQoW0J1ZmZlci5mcm9tKFsweDQxXSksIHNpZ25hdHVyZSwgQnVmZmVyLmZyb20oW1NJR0hBU0hfQUxMXSldKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBnZXRUeEluZm8oKTogVHhJbmZvIHtcbiAgICByZXR1cm4gZ2V0TWFzc0FuZFNpemUodGhpcy5pbnB1dHMsIHRoaXMub3V0cHV0cyk7XG4gIH1cblxuICBlc3RpbWF0ZUZlZShmZWVSYXRlID0gMTAwMCk6IG51bWJlciB7XG4gICAgY29uc3QgeyBtYXNzIH0gPSB0aGlzLmdldFR4SW5mbygpO1xuICAgIHJldHVybiBtaW5pbXVtUmVxdWlyZWRUcmFuc2FjdGlvblJlbGF5RmVlKG1hc3MsIGZlZVJhdGUpO1xuICB9XG5cbiAgZ2V0TWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICB0cmFuc2FjdGlvbjoge1xuICAgICAgICB2ZXJzaW9uOiB0aGlzLnZlcnNpb24sXG4gICAgICAgIGlucHV0czogdGhpcy5pbnB1dHMubWFwKCh7IHByZXZpb3VzT3V0cG9pbnQsIHNpZ25hdHVyZVNjcmlwdCwgc2VxdWVuY2UsIHNpZ09wQ291bnQgfSkgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwcmV2aW91c091dHBvaW50LFxuICAgICAgICAgICAgc2lnbmF0dXJlU2NyaXB0LFxuICAgICAgICAgICAgc2VxdWVuY2UsXG4gICAgICAgICAgICBzaWdPcENvdW50LFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgICBvdXRwdXRzOiB0aGlzLm91dHB1dHMubWFwKCh7IGFtb3VudCwgc2NyaXB0UHVibGljS2V5IH0pID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYW1vdW50LFxuICAgICAgICAgICAgc2NyaXB0UHVibGljS2V5OiB7XG4gICAgICAgICAgICAgIHZlcnNpb246IDAsIC8vIFRPRE86IFVTRSBSRUFMIFNDUklQVCBWRVJTSU9OXG4gICAgICAgICAgICAgIHNjcmlwdFB1YmxpY0tleTogc2NyaXB0UHVibGljS2V5LnNjcmlwdFB1YmxpY0tleSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfSksXG4gICAgICAgIGxvY2tUaW1lOiB0aGlzLmxvY2tUaW1lLFxuICAgICAgICBzdWJuZXR3b3JrSWQ6IHRoaXMuc3VibmV0d29ya0lkLFxuICAgICAgfSxcbiAgICAgIGFsbG93T3JwaGFuOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSxJQUFBQSxRQUFBLEdBQUFDLE9BQUE7QUFLQSxJQUFBQyxNQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxLQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxVQUFBLEdBQUFDLHNCQUFBLENBQUFKLE9BQUE7QUFDQSxJQUFBSyxZQUFBLEdBQUFMLE9BQUE7QUFBMEYsU0FBQUksdUJBQUFFLEdBQUEsV0FBQUEsR0FBQSxJQUFBQSxHQUFBLENBQUFDLFVBQUEsR0FBQUQsR0FBQSxnQkFBQUEsR0FBQTtBQUFBLFNBQUFFLFFBQUFDLENBQUEsc0NBQUFELE9BQUEsd0JBQUFFLE1BQUEsdUJBQUFBLE1BQUEsQ0FBQUMsUUFBQSxhQUFBRixDQUFBLGtCQUFBQSxDQUFBLGdCQUFBQSxDQUFBLFdBQUFBLENBQUEseUJBQUFDLE1BQUEsSUFBQUQsQ0FBQSxDQUFBRyxXQUFBLEtBQUFGLE1BQUEsSUFBQUQsQ0FBQSxLQUFBQyxNQUFBLENBQUFHLFNBQUEscUJBQUFKLENBQUEsS0FBQUQsT0FBQSxDQUFBQyxDQUFBO0FBQUEsU0FBQUssZ0JBQUFDLFFBQUEsRUFBQUMsV0FBQSxVQUFBRCxRQUFBLFlBQUFDLFdBQUEsZUFBQUMsU0FBQTtBQUFBLFNBQUFDLGtCQUFBQyxNQUFBLEVBQUFDLEtBQUEsYUFBQUMsQ0FBQSxNQUFBQSxDQUFBLEdBQUFELEtBQUEsQ0FBQUUsTUFBQSxFQUFBRCxDQUFBLFVBQUFFLFVBQUEs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