@coolwallet/kas
Version:
167 lines (166 loc) • 25.7 kB
JavaScript
;
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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