UNPKG

@bitgo-beta/utxo-lib

Version:

Client-side Bitcoin JavaScript library

109 lines • 15.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DashTransaction = void 0; const bufferutils_1 = require("bitcoinjs-lib/src/bufferutils"); const bitcoinjs_lib_1 = require("bitcoinjs-lib"); const UtxoTransaction_1 = require("../UtxoTransaction"); const networks_1 = require("../../networks"); class DashTransaction extends UtxoTransaction_1.UtxoTransaction { constructor(network, tx, amountType) { super(network, tx, amountType); this.type = 0; if (!networks_1.isDash(network)) { throw new Error(`invalid network`); } if (tx) { this.version = tx.version; if (tx instanceof DashTransaction) { this.type = tx.type; this.extraPayload = tx.extraPayload; } } // since `__toBuffer` is private we have to do a little hack here this.__toBuffer = this.toBufferWithExtraPayload; } static newTransaction(network, transaction, amountType) { return new DashTransaction(network, transaction, amountType); } static fromBuffer(buffer, noStrict, amountType = 'number', network) { const tx = super.fromBuffer(buffer, true, amountType, network); tx.type = tx.version >> 16; tx.version = tx.version & 0xffff; if (tx.byteLength() !== buffer.length) { const bufferReader = new bufferutils_1.BufferReader(buffer, tx.byteLength()); tx.extraPayload = bufferReader.readVarSlice(); } return tx; } clone(amountType) { return new DashTransaction(this.network, this, amountType); } byteLength(_ALLOW_WITNESS) { return super.byteLength(_ALLOW_WITNESS) + (this.extraPayload ? UtxoTransaction_1.varSliceSize(this.extraPayload) : 0); } /** * Helper to override `__toBuffer()` of bitcoinjs.Transaction. * Since the method is private, we use a hack in the constructor to make it work. * * TODO: remove `private` modifier in bitcoinjs `__toBuffer()` or find some other solution * * @param buffer - optional target buffer * @param initialOffset - can only be undefined or 0. Other values are only used for serialization in blocks. * @param _ALLOW_WITNESS - ignored */ toBufferWithExtraPayload(buffer, initialOffset, _ALLOW_WITNESS = false) { // We can ignore the `_ALLOW_WITNESS` parameter here since it has no effect. if (!buffer) { buffer = Buffer.allocUnsafe(this.byteLength(false)); } if (initialOffset !== undefined && initialOffset !== 0) { throw new Error(`not supported`); } // Start out with regular bitcoin byte sequence. // This buffer will have excess size because it uses `byteLength()` to allocate. const baseBuffer = bitcoinjs_lib_1.Transaction.prototype.__toBuffer.call(this); baseBuffer.copy(buffer); // overwrite leading version bytes (uint16 version, uint16 type) const bufferWriter = new bufferutils_1.BufferWriter(buffer, 0); bufferWriter.writeUInt32((this.version & 0xffff) | (this.type << 16)); // Seek to end of original byte sequence and add extraPayload. // We must use the byteLength as calculated by the bitcoinjs implementation since // `baseBuffer` has an excess size. if (this.extraPayload) { bufferWriter.offset = bitcoinjs_lib_1.Transaction.prototype.byteLength.call(this); bufferWriter.writeVarSlice(this.extraPayload); } return buffer; } getHash(forWitness) { if (forWitness) { throw new Error(`invalid argument`); } return bitcoinjs_lib_1.crypto.hash256(this.toBuffer()); } /** * Build a hash for all or none of the transaction inputs depending on the hashtype * @param hashType * @returns Buffer */ getPrevoutHash(hashType) { if (!(hashType & UtxoTransaction_1.UtxoTransaction.SIGHASH_ANYONECANPAY)) { const bufferWriter = new bufferutils_1.BufferWriter(Buffer.allocUnsafe(36 * this.ins.length)); this.ins.forEach(function (txIn) { bufferWriter.writeSlice(txIn.hash); bufferWriter.writeUInt32(txIn.index); }); return bitcoinjs_lib_1.crypto.hash256(bufferWriter.buffer); } return Buffer.alloc(32, 0); } } exports.DashTransaction = DashTransaction; DashTransaction.DASH_NORMAL = 0; DashTransaction.DASH_PROVIDER_REGISTER = 1; DashTransaction.DASH_PROVIDER_UPDATE_SERVICE = 2; DashTransaction.DASH_PROVIDER_UPDATE_REGISTRAR = 3; DashTransaction.DASH_PROVIDER_UPDATE_REVOKE = 4; DashTransaction.DASH_COINBASE = 5; DashTransaction.DASH_QUORUM_COMMITMENT = 6; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGFzaFRyYW5zYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2JpdGdvL2Rhc2gvRGFzaFRyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtEQUEyRTtBQUMzRSxpREFBK0Q7QUFFL0Qsd0RBQW1FO0FBQ25FLDZDQUFpRDtBQUVqRCxNQUFhLGVBQTBELFNBQVEsaUNBQXdCO0lBWXJHLFlBQVksT0FBZ0IsRUFBRSxFQUFpQyxFQUFFLFVBQWdDO1FBQy9GLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBSjFCLFNBQUksR0FBRyxDQUFDLENBQUM7UUFNZCxJQUFJLENBQUMsaUJBQU0sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7U0FDcEM7UUFFRCxJQUFJLEVBQUUsRUFBRTtZQUNOLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUUxQixJQUFJLEVBQUUsWUFBWSxlQUFlLEVBQUU7Z0JBQ2pDLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztnQkFDcEIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDO2FBQ3JDO1NBQ0Y7UUFFRCxpRUFBaUU7UUFDaEUsSUFBWSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUM7SUFDM0QsQ0FBQztJQUVTLE1BQU0sQ0FBQyxjQUFjLENBQzdCLE9BQWdCLEVBQ2hCLFdBQThDLEVBQzlDLFVBQWdDO1FBRWhDLE9BQU8sSUFBSSxlQUFlLENBQVUsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsTUFBTSxDQUFDLFVBQVUsQ0FDZixNQUFjLEVBQ2QsUUFBaUIsRUFDakIsYUFBa0MsUUFBUSxFQUMxQyxPQUFnQjtR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QUFDLEVBQUU7WUFDdEQsTUFBTSxZQUFZLEdBQUcsSUFBSSwwQkFBWSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUVoRixJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLElBQUk7Z0JBQzdCLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNuQyxZQUFZLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QyxDQUFDLENBQUMsQ0FBQztZQUVILE9BQU8sc0JBQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzdDO1FBRUQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3QixDQUFDOztBQWpJSCwwQ0FrSUM7QUFqSVEsMkJBQVcsR0FBRyxDQUFDLENBQUM7QUFDaEIsc0NBQXNCLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLDRDQUE0QixHQUFHLENBQUMsQ0FBQztBQUNqQyw4Q0FBOEIsR0FBRyxDQUFDLENBQUM7QUFDbkMsMkNBQTJCLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLDZCQUFhLEdBQUcsQ0FBQyxDQUFDO0FBQ2xCLHNDQUFzQixHQUFHLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1ZmZlclJlYWRlciwgQnVmZmVyV3JpdGVyIH0gZnJvbSAnYml0Y29pbmpzLWxpYi9zcmMvYnVmZmVydXRpbHMnO1xuaW1wb3J0IHsgY3J5cHRvIGFzIGJjcnlwdG8sIFRyYW5zYWN0aW9uIH0gZnJvbSAnYml0Y29pbmpzLWxpYic7XG5cbmltcG9ydCB7IFV0eG9UcmFuc2FjdGlvbiwgdmFyU2xpY2VTaXplIH0gZnJvbSAnLi4vVXR4b1RyYW5zYWN0aW9uJztcbmltcG9ydCB7IGlzRGFzaCwgTmV0d29yayB9IGZyb20gJy4uLy4uL25ldHdvcmtzJztcblxuZXhwb3J0IGNsYXNzIERhc2hUcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiBleHRlbmRzIFV0eG9UcmFuc2FjdGlvbjxUTnVtYmVyPiB7XG4gIHN0YXRpYyBEQVNIX05PUk1BTCA9IDA7XG4gIHN0YXRpYyBEQVNIX1BST1ZJREVSX1JFR0lTVEVSID0gMTtcbiAgc3RhdGljIERBU0hfUFJPVklERVJfVVBEQVRFX1NFUlZJQ0UgPSAyO1xuICBzdGF0aWMgREFTSF9QUk9WSURFUl9VUERBVEVfUkVHSVNUUkFSID0gMztcbiAgc3RhdGljIERBU0hfUFJPVklERVJfVVBEQVRFX1JFVk9LRSA9IDQ7XG4gIHN0YXRpYyBEQVNIX0NPSU5CQVNFID0gNTtcbiAgc3RhdGljIERBU0hfUVVPUlVNX0NPTU1JVE1FTlQgPSA2O1xuXG4gIHB1YmxpYyB0eXBlID0gMDtcbiAgcHVibGljIGV4dHJhUGF5bG9hZD86IEJ1ZmZlcjtcblxuICBjb25zdHJ1Y3RvcihuZXR3b3JrOiBOZXR3b3JrLCB0eD86IFRyYW5zYWN0aW9uPGJpZ2ludCB8IG51bWJlcj4sIGFtb3VudFR5cGU/OiAnYmlnaW50JyB8ICdudW1iZXInKSB7XG4gICAgc3VwZXIobmV0d29yaywgdHgsIGFtb3VudFR5cGUpO1xuXG4gICAgaWYgKCFpc0Rhc2gobmV0d29yaykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBuZXR3b3JrYCk7XG4gICAgfVxuXG4gICAgaWYgKHR4KSB7XG4gICAgICB0aGlzLnZlcnNpb24gPSB0eC52ZXJzaW9uO1xuXG4gICAgICBpZiAodHggaW5zdGFuY2VvZiBEYXNoVHJhbnNhY3Rpb24pIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHgudHlwZTtcbiAgICAgICAgdGhpcy5leHRyYVBheWxvYWQgPSB0eC5leHRyYVBheWxvYWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2luY2UgYF9fdG9CdWZmZXJgIGlzIHByaXZhdGUgd2UgaGF2ZSB0byBkbyBhIGxpdHRsZSBoYWNrIGhlcmVcbiAgICAodGhpcyBhcyBhbnkpLl9fdG9CdWZmZXIgPSB0aGlzLnRvQnVmZmVyV2l0aEV4dHJhUGF5bG9hZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgbmV3VHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gICAgbmV0d29yazogTmV0d29yayxcbiAgICB0cmFuc2FjdGlvbj86IERhc2hUcmFuc2FjdGlvbjxudW1iZXIgfCBiaWdpbnQ+LFxuICAgIGFtb3VudFR5cGU/OiAnbnVtYmVyJyB8ICdiaWdpbnQnXG4gICk6IERhc2hUcmFuc2FjdGlvbjxUTnVtYmVyPiB7XG4gICAgcmV0dXJuIG5ldyBEYXNoVHJhbnNhY3Rpb248VE51bWJlcj4obmV0d29yaywgdHJhbnNhY3Rpb24sIGFtb3VudFR5cGUpO1xuICB9XG5cbiAgc3RhdGljIGZyb21CdWZmZXI8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gICAgYnVmZmVyOiBCdWZmZXIsXG4gICAgbm9TdHJpY3Q6IGJvb2xlYW4sXG4gICAgYW1vdW50VHlwZTogJ251bWJlcicgfCAnYmlnaW50JyA9ICdudW1iZXInLFxuICAgIG5ldHdvcms6IE5ldHdvcmtcbiAgKTogRGFzaFRyYW5zYWN0aW9uPFROdW1iZXI+IHtcbiAgICBjb25zdCB0eCA9IHN1cGVyLmZyb21CdWZmZXI8VE51bWJlcj4oYnVmZmVyLCB0cnVlLCBhbW91bnRUeXBlLCBuZXR3b3JrKSBhcyBEYXNoVHJhbnNhY3Rpb248VE51bWJlcj47XG4gICAgdHgudHlwZSA9IHR4LnZlcnNpb24gPj4gMTY7XG4gICAgdHgudmVyc2lvbiA9IHR4LnZlcnNpb24gJiAweGZmZmY7XG4gICAgaWYgKHR4LmJ5dGVMZW5ndGgoKSAhPT0gYnVmZmVyLmxlbmd0aCkge1xuICAgICAgY29uc3QgYnVmZmVyUmVhZGVyID0gbmV3IEJ1ZmZlclJlYWRlcihidWZmZXIsIHR4LmJ5dGVMZW5ndGgoKSk7XG4gICAgICB0eC5leHRyYVBheWxvYWQgPSBidWZmZXJSZWFkZXIucmVhZFZhclNsaWNlKCk7XG4gICAgfVxuICAgIHJldHVybiB0eDtcbiAgfVxuXG4gIGNsb25lPFROMiBleHRlbmRzIGJpZ2ludCB8IG51bWJlciA9IFROdW1iZXI+KGFtb3VudFR5cGU/OiAnbnVtYmVyJyB8ICdiaWdpbnQnKTogRGFzaFRyYW5zYWN0aW9uPFROMj4ge1xuICAgIHJldHVybiBuZXcgRGFzaFRyYW5zYWN0aW9uPFROMj4odGhpcy5uZXR3b3JrLCB0aGlzLCBhbW91bnRUeXBlKTtcbiAgfVxuXG4gIGJ5dGVMZW5ndGgoX0FMTE9XX1dJVE5FU1M/OiBib29sZWFuKTogbnVtYmVyIHtcbiAgICByZXR1cm4gc3VwZXIuYnl0ZUxlbmd0aChfQUxMT1dfV0lUTkVTUykgKyAodGhpcy5leHRyYVBheWxvYWQgPyB2YXJTbGljZVNpemUodGhpcy5leHRyYVBheWxvYWQpIDogMCk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIHRvIG92ZXJyaWRlIGBfX3RvQnVmZmVyKClgIG9mIGJpdGNvaW5qcy5UcmFuc2FjdGlvbi5cbiAgICogU2luY2UgdGhlIG1ldGhvZCBpcyBwcml2YXRlLCB3ZSB1c2UgYSBoYWNrIGluIHRoZSBjb25zdHJ1Y3RvciB0byBtYWtlIGl0IHdvcmsuXG4gICAqXG4gICAqIFRPRE86IHJlbW92ZSBgcHJpdmF0ZWAgbW9kaWZpZXIgaW4gYml0Y29pbmpzIGBfX3RvQnVmZmVyKClgIG9yIGZpbmQgc29tZSBvdGhlciBzb2x1dGlvblxuICAgKlxuICAgKiBAcGFyYW0gYnVmZmVyIC0gb3B0aW9uYWwgdGFyZ2V0IGJ1ZmZlclxuICAgKiBAcGFyYW0gaW5pdGlhbE9mZnNldCAtIGNhbiBvbmx5IGJlIHVuZGVmaW5lZCBvciAwLiBPdGhlciB2YWx1ZXMgYXJlIG9ubHkgdXNlZCBmb3Igc2VyaWFsaXphdGlvbiBpbiBibG9ja3MuXG4gICAqIEBwYXJhbSBfQUxMT1dfV0lUTkVTUyAtIGlnbm9yZWRcbiAgICovXG4gIHByaXZhdGUgdG9CdWZmZXJXaXRoRXh0cmFQYXlsb2FkKGJ1ZmZlcj86IEJ1ZmZlciwgaW5pdGlhbE9mZnNldD86IG51bWJlciwgX0FMTE9XX1dJVE5FU1MgPSBmYWxzZSk6IEJ1ZmZlciB7XG4gICAgLy8gV2UgY2FuIGlnbm9yZSB0aGUgYF9BTExPV19XSVRORVNTYCBwYXJhbWV0ZXIgaGVyZSBzaW5jZSBpdCBoYXMgbm8gZWZmZWN0LlxuICAgIGlmICghYnVmZmVyKSB7XG4gICAgICBidWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUodGhpcy5ieXRlTGVuZ3RoKGZhbHNlKSk7XG4gICAgfVxuXG4gICAgaWYgKGluaXRpYWxPZmZzZXQgIT09IHVuZGVmaW5lZCAmJiBpbml0aWFsT2Zmc2V0ICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vdCBzdXBwb3J0ZWRgKTtcbiAgICB9XG5cbiAgICAvLyBTdGFydCBvdXQgd2l0aCByZWd1bGFyIGJpdGNvaW4gYnl0ZSBzZXF1ZW5jZS5cbiAgICAvLyBUaGlzIGJ1ZmZlciB3aWxsIGhhdmUgZXhjZXNzIHNpemUgYmVjYXVzZSBpdCB1c2VzIGBieXRlTGVuZ3RoKClgIHRvIGFsbG9jYXRlLlxuICAgIGNvbnN0IGJhc2VCdWZmZXIgPSAoVHJhbnNhY3Rpb24ucHJvdG90eXBlIGFzIGFueSkuX190b0J1ZmZlci5jYWxsKHRoaXMpO1xuICAgIGJhc2VCdWZmZXIuY29weShidWZmZXIpO1xuXG4gICAgLy8gb3ZlcndyaXRlIGxlYWRpbmcgdmVyc2lvbiBieXRlcyAodWludDE2IHZlcnNpb24sIHVpbnQxNiB0eXBlKVxuICAgIGNvbnN0IGJ1ZmZlcldyaXRlciA9IG5ldyBCdWZmZXJXcml0ZXIoYnVmZmVyLCAwKTtcbiAgICBidWZmZXJXcml0ZXIud3JpdGVVSW50MzIoKHRoaXMudmVyc2lvbiAmIDB4ZmZmZikgfCAodGhpcy50eXBlIDw8IDE2KSk7XG5cbiAgICAvLyBTZWVrIHRvIGVuZCBvZiBvcmlnaW5hbCBieXRlIHNlcXVlbmNlIGFuZCBhZGQgZXh0cmFQYXlsb2FkLlxuICAgIC8vIFdlIG11c3QgdXNlIHRoZSBieXRlTGVuZ3RoIGFzIGNhbGN1bGF0ZWQgYnkgdGhlIGJpdGNvaW5qcyBpbXBsZW1lbnRhdGlvbiBzaW5jZVxuICAgIC8vIGBiYXNlQnVmZmVyYCBoYXMgYW4gZXhjZXNzIHNpemUuXG4gICAgaWYgKHRoaXMuZXh0cmFQYXlsb2FkKSB7XG4gICAgICBidWZmZXJXcml0ZXIub2Zmc2V0ID0gVHJhbnNhY3Rpb24ucHJvdG90eXBlLmJ5dGVMZW5ndGguY2FsbCh0aGlzKTtcbiAgICAgIGJ1ZmZlcldyaXRlci53cml0ZVZhclNsaWNlKHRoaXMuZXh0cmFQYXlsb2FkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVmZmVyO1xuICB9XG5cbiAgZ2V0SGFzaChmb3JXaXRuZXNzPzogYm9vbGVhbik6IEJ1ZmZlciB7XG4gICAgaWYgKGZvcldpdG5lc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBhcmd1bWVudGApO1xuICAgIH1cbiAgICByZXR1cm4gYmNyeXB0by5oYXNoMjU2KHRoaXMudG9CdWZmZXIoKSk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBoYXNoIGZvciBhbGwgb3Igbm9uZSBvZiB0aGUgdHJhbnNhY3Rpb24gaW5wdXRzIGRlcGVuZGluZyBvbiB0aGUgaGFzaHR5cGVcbiAgICogQHBhcmFtIGhhc2hUeXBlXG4gICAqIEByZXR1cm5zIEJ1ZmZlclxuICAgKi9cbiAgZ2V0UHJldm91dEhhc2goaGFzaFR5cGU6IG51bWJlcik6IEJ1ZmZlciB7XG4gICAgaWYgKCEoaGFzaFR5cGUgJiBVdHhvVHJhbnNhY3Rpb24uU0lHSEFTSF9BTllPTkVDQU5QQVkpKSB7XG4gICAgICBjb25zdCBidWZmZXJXcml0ZXIgPSBuZXcgQnVmZmVyV3JpdGVyKEJ1ZmZlci5hbGxvY1Vuc2FmZSgzNiAqIHRoaXMuaW5zLmxlbmd0aCkpO1xuXG4gICAgICB0aGlzLmlucy5mb3JFYWNoKGZ1bmN0aW9uICh0eEluKSB7XG4gICAgICAgIGJ1ZmZlcldyaXRlci53cml0ZVNsaWNlKHR4SW4uaGFzaCk7XG4gICAgICAgIGJ1ZmZlcldyaXRlci53cml0ZVVJbnQzMih0eEluLmluZGV4KTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYmNyeXB0by5oYXNoMjU2KGJ1ZmZlcldyaXRlci5idWZmZXIpO1xuICAgIH1cblxuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMzIsIDApO1xuICB9XG59XG4iXX0=