@c4tplatform/caminojs
Version:
Camino Platform JS Library
201 lines • 22.8 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Vertex = void 0;
/**
* @packageDocumentation
* @module API-AVM-Vertex
*/
const buffer_1 = require("buffer/");
const bintools_1 = __importDefault(require("../../utils/bintools"));
const constants_1 = require("./constants");
const tx_1 = require("./tx");
const utils_1 = require("../../utils");
const bn_js_1 = __importDefault(require("bn.js"));
/**
* @ignore
*/
const bintools = bintools_1.default.getInstance();
/**
* Class representing a Vertex
*/
class Vertex extends utils_1.Serializable {
/**
* Returns the NetworkID as a number
*/
getNetworkID() {
return this.networkID;
}
/**
* Returns the BlockchainID as a CB58 string
*/
getBlockchainID() {
return bintools.cb58Encode(this.blockchainID);
}
/**
* Returns the Height as a {@link https://github.com/indutny/bn.js/|BN}.
*/
getHeight() {
return this.height;
}
/**
* Returns the Epoch as a number.
*/
getEpoch() {
return this.epoch;
}
/**
* @returns An array of Buffers
*/
getParentIDs() {
return this.parentIDs;
}
/**
* Returns array of UnsignedTxs.
*/
getTxs() {
return this.txs;
}
/**
* @returns An array of Buffers
*/
getRestrictions() {
return this.restrictions;
}
/**
* Set the codecID
*
* @param codecID The codecID to set
*/
setCodecID(codecID) {
if (codecID !== 0 && codecID !== 1) {
/* istanbul ignore next */
throw new utils_1.CodecIdError("Error - Vertex.setCodecID: invalid codecID. Valid codecIDs are 0 and 1.");
}
this._codecID = codecID;
this._typeID =
this._codecID === 0 ? constants_1.AVMConstants.VERTEX : constants_1.AVMConstants.VERTEX_CODECONE;
}
/**
* Takes a {@link https://github.com/feross/buffer|Buffer} containing an [[Vertex]], parses it, populates the class, and returns the length of the Vertex in bytes.
*
* @param bytes A {@link https://github.com/feross/buffer|Buffer} containing a raw [[Vertex]]
*
* @returns The length of the raw [[Vertex]]
*
* @remarks assume not-checksummed
*/
fromBuffer(bytes, offset = 0) {
offset += 2;
this.blockchainID = bintools.copyFrom(bytes, offset, offset + 32);
offset += 32;
const h = bintools.copyFrom(bytes, offset, offset + 8);
this.height = bintools.fromBufferToBN(h);
offset += 8;
const e = bintools.copyFrom(bytes, offset, offset + 4);
this.epoch = e.readInt32BE(0);
offset += 4;
const nPIDs = bintools.copyFrom(bytes, offset, offset + 4);
this.numParentIDs = nPIDs.readInt32BE(0);
offset += 4;
for (let i = 0; i < this.numParentIDs; i++) {
const parentID = bintools.copyFrom(bytes, offset, offset + 32);
offset += 32;
this.parentIDs.push(parentID);
}
const nTxs = bintools.copyFrom(bytes, offset, offset + 4);
this.numTxs = nTxs.readInt32BE(0);
// account for tx-size bytes
offset += 8;
for (let i = 0; i < this.numTxs; i++) {
const tx = new tx_1.Tx();
offset += tx.fromBuffer(bintools.copyFrom(bytes, offset));
this.txs.push(tx);
}
if (bytes.byteLength > offset && bytes.byteLength - offset > 4) {
const nRs = bintools.copyFrom(bytes, offset, offset + 4);
this.numRestrictions = nRs.readInt32BE(0);
offset += 4;
for (let i = 0; i < this.numRestrictions; i++) {
const tx = bintools.copyFrom(bytes, offset, offset + 32);
offset += 32;
this.restrictions.push(tx);
}
}
return offset;
}
/**
* Returns a {@link https://github.com/feross/buffer|Buffer} representation of the [[Vertex]].
*/
toBuffer() {
const codec = this.getCodecID();
const codecBuf = buffer_1.Buffer.alloc(2);
codecBuf.writeUInt16BE(codec, 0);
const epochBuf = buffer_1.Buffer.alloc(4);
epochBuf.writeInt32BE(this.epoch, 0);
const numParentIDsBuf = buffer_1.Buffer.alloc(4);
numParentIDsBuf.writeInt32BE(this.numParentIDs, 0);
let barr = [
codecBuf,
this.blockchainID,
bintools.fromBNToBuffer(this.height, 8),
epochBuf,
numParentIDsBuf
];
this.parentIDs.forEach((parentID) => {
barr.push(parentID);
});
const txs = this.getTxs();
const numTxs = buffer_1.Buffer.alloc(4);
numTxs.writeUInt32BE(txs.length, 0);
barr.push(numTxs);
let size = 0;
const txSize = buffer_1.Buffer.alloc(4);
txs.forEach((tx) => {
const b = tx.toBuffer();
size += b.byteLength;
});
txSize.writeUInt32BE(size, 0);
barr.push(txSize);
txs.forEach((tx) => {
const b = tx.toBuffer();
barr.push(b);
});
return buffer_1.Buffer.concat(barr);
}
clone() {
let vertex = new Vertex();
vertex.fromBuffer(this.toBuffer());
return vertex;
}
/**
* Class representing a Vertex which is a container for AVM Transactions.
*
* @param networkID Optional, [[DefaultNetworkID]]
* @param blockchainID Optional, default "2oYMBNV4eNHyqk2fjjV5nVQLDbtmNJzq5s3qs3Lo6ftnC6FByM"
* @param height Optional, default new BN(0)
* @param epoch Optional, default new BN(0)
* @param parentIDs Optional, default []
* @param txs Optional, default []
* @param restrictions Optional, default []
*/
constructor(networkID = utils_1.DefaultNetworkID, blockchainID = "2oYMBNV4eNHyqk2fjjV5nVQLDbtmNJzq5s3qs3Lo6ftnC6FByM", height = new bn_js_1.default(0), epoch = 0, parentIDs = [], txs = [], restrictions = []) {
super();
this._typeName = "Vertex";
this._codecID = constants_1.AVMConstants.LATESTCODEC;
this.networkID = networkID;
this.blockchainID = bintools.cb58Decode(blockchainID);
this.height = height;
this.epoch = epoch;
this.parentIDs = parentIDs;
this.numParentIDs = parentIDs.length;
this.txs = txs;
this.numTxs = txs.length;
this.restrictions = restrictions;
this.numRestrictions = restrictions.length;
}
}
exports.Vertex = Vertex;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVydGV4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaXMvYXZtL3ZlcnRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7O0dBR0c7QUFDSCxvQ0FBZ0M7QUFDaEMsb0VBQTJDO0FBQzNDLDJDQUEwQztBQUMxQyw2QkFBeUI7QUFDekIsdUNBQTBFO0FBQzFFLGtEQUFzQjtBQUV0Qjs7R0FFRztBQUNILE1BQU0sUUFBUSxHQUFhLGtCQUFRLENBQUMsV0FBVyxFQUFFLENBQUE7QUFFakQ7O0dBRUc7QUFDSCxNQUFhLE1BQU8sU0FBUSxvQkFBWTtJQWdCdEM7O09BRUc7SUFDSCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFBO0lBQ3ZCLENBQUM7SUFDRDs7T0FFRztJQUNILGVBQWU7UUFDYixPQUFPLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFBO0lBQy9DLENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUE7SUFDcEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQTtJQUNuQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFBO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUE7SUFDakIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQTtJQUMxQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFVBQVUsQ0FBQyxPQUFlO1FBQ3hCLElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxPQUFPLEtBQUssQ0FBQyxFQUFFO1lBQ2xDLDBCQUEwQjtZQUMxQixNQUFNLElBQUksb0JBQVksQ0FDcEIseUVBQXlF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QVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtRQUNsQyxPQUFPLE1BQWMsQ0FBQTtJQUN2QixDQUFDO0lBQ0Q7Ozs7Ozs7Ozs7T0FVRztJQUNILFlBQ0UsWUFBb0Isd0JBQWdCLEVBQ3BDLGVBQXVCLG9EQUFvRCxFQUMzRSxTQUFhLElBQUksZUFBRSxDQUFDLENBQUMsQ0FBQyxFQUN0QixRQUFnQixDQUFDLEVBQ2pCLFlBQXNCLEVBQUUsRUFDeEIsTUFBWSxFQUFFLEVBQ2QsZUFBeUIsRUFBRTtRQUUzQixLQUFLLEVBQUUsQ0FBQTtRQWhOQyxjQUFTLEdBQUcsUUFBUSxDQUFBO1FBQ3BCLGFBQVEsR0FBRyx3QkFBWSxDQUFDLFdBQVcsQ0FBQTtRQWdOM0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUE7UUFDMUIsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQ3JELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO1FBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO1FBQ2xCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFBO1FBQzFCLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQTtRQUNwQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQTtRQUNkLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQTtRQUN4QixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQTtRQUNoQyxJQUFJLENBQUMsZUFBZSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUE7SUFDNUMsQ0FBQztDQUNGO0FBN05ELHdCQTZOQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBAbW9kdWxlIEFQSS1BVk0tVmVydGV4XG4gKi9cbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gXCJidWZmZXIvXCJcbmltcG9ydCBCaW5Ub29scyBmcm9tIFwiLi4vLi4vdXRpbHMvYmludG9vbHNcIlxuaW1wb3J0IHsgQVZNQ29uc3RhbnRzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCJcbmltcG9ydCB7IFR4IH0gZnJvbSBcIi4vdHhcIlxuaW1wb3J0IHsgU2VyaWFsaXphYmxlLCBDb2RlY0lkRXJyb3IsIERlZmF1bHROZXR3b3JrSUQgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIlxuaW1wb3J0IEJOIGZyb20gXCJibi5qc1wiXG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5jb25zdCBiaW50b29sczogQmluVG9vbHMgPSBCaW5Ub29scy5nZXRJbnN0YW5jZSgpXG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgVmVydGV4XG4gKi9cbmV4cG9ydCBjbGFzcyBWZXJ0ZXggZXh0ZW5kcyBTZXJpYWxpemFibGUge1xuICBwcm90ZWN0ZWQgX3R5cGVOYW1lID0gXCJWZXJ0ZXhcIlxuICBwcm90ZWN0ZWQgX2NvZGVjSUQgPSBBVk1Db25zdGFudHMuTEFURVNUQ09ERUNcbiAgLy8gc2VyaWFsaXplIGlzIGluaGVyaXRlZFxuICAvLyBkZXNlcmlhbGl6ZSBpcyBpbmhlcml0ZWRcbiAgcHJvdGVjdGVkIG5ldHdvcmtJRDogbnVtYmVyXG4gIHByb3RlY3RlZCBibG9ja2NoYWluSUQ6IEJ1ZmZlclxuICBwcm90ZWN0ZWQgaGVpZ2h0OiBCTlxuICBwcm90ZWN0ZWQgZXBvY2g6IG51bWJlclxuICBwcm90ZWN0ZWQgcGFyZW50SURzOiBCdWZmZXJbXVxuICBwcm90ZWN0ZWQgbnVtUGFyZW50SURzOiBudW1iZXJcbiAgcHJvdGVjdGVkIHR4czogVHhbXVxuICBwcm90ZWN0ZWQgbnVtVHhzOiBudW1iZXJcbiAgcHJvdGVjdGVkIHJlc3RyaWN0aW9uczogQnVmZmVyW11cbiAgcHJvdGVjdGVkIG51bVJlc3RyaWN0aW9uczogbnVtYmVyXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIE5ldHdvcmtJRCBhcyBhIG51bWJlclxuICAgKi9cbiAgZ2V0TmV0d29ya0lEKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubmV0d29ya0lEXG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIEJsb2NrY2hhaW5JRCBhcyBhIENCNTggc3RyaW5nXG4gICAqL1xuICBnZXRCbG9ja2NoYWluSUQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYmludG9vbHMuY2I1OEVuY29kZSh0aGlzLmJsb2NrY2hhaW5JRClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBIZWlnaHQgYXMgYSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2luZHV0bnkvYm4uanMvfEJOfS5cbiAgICovXG4gIGdldEhlaWdodCgpOiBCTiB7XG4gICAgcmV0dXJuIHRoaXMuaGVpZ2h0XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgRXBvY2ggYXMgYSBudW1iZXIuXG4gICAqL1xuICBnZXRFcG9jaCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmVwb2NoXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgQnVmZmVyc1xuICAgKi9cbiAgZ2V0UGFyZW50SURzKCk6IEJ1ZmZlcltdIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRJRHNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFycmF5IG9mIFVuc2lnbmVkVHhzLlxuICAgKi9cbiAgZ2V0VHhzKCk6IFR4W10ge1xuICAgIHJldHVybiB0aGlzLnR4c1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIEJ1ZmZlcnNcbiAgICovXG4gIGdldFJlc3RyaWN0aW9ucygpOiBCdWZmZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMucmVzdHJpY3Rpb25zXG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBjb2RlY0lEXG4gICAqXG4gICAqIEBwYXJhbSBjb2RlY0lEIFRoZSBjb2RlY0lEIHRvIHNldFxuICAgKi9cbiAgc2V0Q29kZWNJRChjb2RlY0lEOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoY29kZWNJRCAhPT0gMCAmJiBjb2RlY0lEICE9PSAxKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgdGhyb3cgbmV3IENvZGVjSWRFcnJvcihcbiAgICAgICAgXCJFcnJvciAtIFZlcnRleC5zZXRDb2RlY0lEOiBpbnZhbGlkIGNvZGVjSUQuIFZhbGlkIGNvZGVjSURzIGFyZSAwIGFuZCAxLlwiXG4gICAgICApXG4gICAgfVxuICAgIHRoaXMuX2NvZGVjSUQgPSBjb2RlY0lEXG4gICAgdGhpcy5fdHlwZUlEID1cbiAgICAgIHRoaXMuX2NvZGVjSUQgPT09IDAgPyBBVk1Db25zdGFudHMuVkVSVEVYIDogQVZNQ29uc3RhbnRzLlZFUlRFWF9DT0RFQ09ORVxuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIGEge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyfEJ1ZmZlcn0gY29udGFpbmluZyBhbiBbW1ZlcnRleF1dLCBwYXJzZXMgaXQsIHBvcHVsYXRlcyB0aGUgY2xhc3MsIGFuZCByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIFZlcnRleCBpbiBieXRlcy5cbiAgICpcbiAgICogQHBhcmFtIGJ5dGVzIEEge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyfEJ1ZmZlcn0gY29udGFpbmluZyBhIHJhdyBbW1ZlcnRleF1dXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBsZW5ndGggb2YgdGhlIHJhdyBbW1ZlcnRleF1dXG4gICAqXG4gICAqIEByZW1hcmtzIGFzc3VtZSBub3QtY2hlY2tzdW1tZWRcbiAgICovXG4gIGZyb21CdWZmZXIoYnl0ZXM6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIgPSAwKTogbnVtYmVyIHtcbiAgICBvZmZzZXQgKz0gMlxuICAgIHRoaXMuYmxvY2tjaGFpbklEID0gYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgMzIpXG4gICAgb2Zmc2V0ICs9IDMyXG5cbiAgICBjb25zdCBoOiBCdWZmZXIgPSBiaW50b29scy5jb3B5RnJvbShieXRlcywgb2Zmc2V0LCBvZmZzZXQgKyA4KVxuICAgIHRoaXMuaGVpZ2h0ID0gYmludG9vbHMuZnJvbUJ1ZmZlclRvQk4oaClcbiAgICBvZmZzZXQgKz0gOFxuXG4gICAgY29uc3QgZTogQnVmZmVyID0gYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgNClcbiAgICB0aGlzLmVwb2NoID0gZS5yZWFkSW50MzJCRSgwKVxuICAgIG9mZnNldCArPSA0XG5cbiAgICBjb25zdCBuUElEczogQnVmZmVyID0gYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgNClcbiAgICB0aGlzLm51bVBhcmVudElEcyA9IG5QSURzLnJlYWRJbnQzMkJFKDApXG4gICAgb2Zmc2V0ICs9IDRcblxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLm51bVBhcmVudElEczsgaSsrKSB7XG4gICAgICBjb25zdCBwYXJlbnRJRDogQnVmZmVyID0gYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgMzIpXG4gICAgICBvZmZzZXQgKz0gMzJcbiAgICAgIHRoaXMucGFyZW50SURzLnB1c2gocGFyZW50SUQpXG4gICAgfVxuXG4gICAgY29uc3QgblR4czogQnVmZmVyID0gYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgNClcbiAgICB0aGlzLm51bVR4cyA9IG5UeHMucmVhZEludDMyQkUoMClcbiAgICAvLyBhY2NvdW50IGZvciB0eC1zaXplIGJ5dGVzXG4gICAgb2Zmc2V0ICs9IDhcblxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLm51bVR4czsgaSsrKSB7XG4gICAgICBjb25zdCB0eDogVHggPSBuZXcgVHgoKVxuICAgICAgb2Zmc2V0ICs9IHR4LmZyb21CdWZmZXIoYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCkpXG4gICAgICB0aGlzLnR4cy5wdXNoKHR4KVxuICAgIH1cblxuICAgIGlmIChieXRlcy5ieXRlTGVuZ3RoID4gb2Zmc2V0ICYmIGJ5dGVzLmJ5dGVMZW5ndGggLSBvZmZzZXQgPiA0KSB7XG4gICAgICBjb25zdCBuUnM6IEJ1ZmZlciA9IGJpbnRvb2xzLmNvcHlGcm9tKGJ5dGVzLCBvZmZzZXQsIG9mZnNldCArIDQpXG4gICAgICB0aGlzLm51bVJlc3RyaWN0aW9ucyA9IG5Scy5yZWFkSW50MzJCRSgwKVxuICAgICAgb2Zmc2V0ICs9IDRcbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLm51bVJlc3RyaWN0aW9uczsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHR4OiBCdWZmZXIgPSBiaW50b29scy5jb3B5RnJvbShieXRlcywgb2Zmc2V0LCBvZmZzZXQgKyAzMilcbiAgICAgICAgb2Zmc2V0ICs9IDMyXG4gICAgICAgIHRoaXMucmVzdHJpY3Rpb25zLnB1c2godHgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9mZnNldFxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfSByZXByZXNlbnRhdGlvbiBvZiB0aGUgW1tWZXJ0ZXhdXS5cbiAgICovXG4gIHRvQnVmZmVyKCk6IEJ1ZmZlciB7XG4gICAgY29uc3QgY29kZWM6IG51bWJlciA9IHRoaXMuZ2V0Q29kZWNJRCgpXG4gICAgY29uc3QgY29kZWNCdWY6IEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygyKVxuICAgIGNvZGVjQnVmLndyaXRlVUludDE2QkUoY29kZWMsIDApXG5cbiAgICBjb25zdCBlcG9jaEJ1ZjogQnVmZmVyID0gQnVmZmVyLmFsbG9jKDQpXG4gICAgZXBvY2hCdWYud3JpdGVJbnQzMkJFKHRoaXMuZXBvY2gsIDApXG5cbiAgICBjb25zdCBudW1QYXJlbnRJRHNCdWY6IEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg0KVxuICAgIG51bVBhcmVudElEc0J1Zi53cml0ZUludDMyQkUodGhpcy5udW1QYXJlbnRJRHMsIDApXG4gICAgbGV0IGJhcnI6IEJ1ZmZlcltdID0gW1xuICAgICAgY29kZWNCdWYsXG4gICAgICB0aGlzLmJsb2NrY2hhaW5JRCxcbiAgICAgIGJpbnRvb2xzLmZyb21CTlRvQnVmZmVyKHRoaXMuaGVpZ2h0LCA4KSxcbiAgICAgIGVwb2NoQnVmLFxuICAgICAgbnVtUGFyZW50SURzQnVmXG4gICAgXVxuICAgIHRoaXMucGFyZW50SURzLmZvckVhY2goKHBhcmVudElEOiBCdWZmZXIpOiB2b2lkID0+IHtcbiAgICAgIGJhcnIucHVzaChwYXJlbnRJRClcbiAgICB9KVxuXG4gICAgY29uc3QgdHhzOiBUeFtdID0gdGhpcy5nZXRUeHMoKVxuICAgIGNvbnN0IG51bVR4czogQnVmZmVyID0gQnVmZmVyLmFsbG9jKDQpXG4gICAgbnVtVHhzLndyaXRlVUludDMyQkUodHhzLmxlbmd0aCwgMClcbiAgICBiYXJyLnB1c2gobnVtVHhzKVxuXG4gICAgbGV0IHNpemU6IG51bWJlciA9IDBcbiAgICBjb25zdCB0eFNpemU6IEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg0KVxuICAgIHR4cy5mb3JFYWNoKCh0eDogVHgpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGI6IEJ1ZmZlciA9IHR4LnRvQnVmZmVyKClcbiAgICAgIHNpemUgKz0gYi5ieXRlTGVuZ3RoXG4gICAgfSlcbiAgICB0eFNpemUud3JpdGVVSW50MzJCRShzaXplLCAwKVxuICAgIGJhcnIucHVzaCh0eFNpemUpXG5cbiAgICB0eHMuZm9yRWFjaCgodHg6IFR4KTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBiOiBCdWZmZXIgPSB0eC50b0J1ZmZlcigpXG4gICAgICBiYXJyLnB1c2goYilcbiAgICB9KVxuXG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoYmFycilcbiAgfVxuXG4gIGNsb25lKCk6IHRoaXMge1xuICAgIGxldCB2ZXJ0ZXg6IFZlcnRleCA9IG5ldyBWZXJ0ZXgoKVxuICAgIHZlcnRleC5mcm9tQnVmZmVyKHRoaXMudG9CdWZmZXIoKSlcbiAgICByZXR1cm4gdmVydGV4IGFzIHRoaXNcbiAgfVxuICAvKipcbiAgICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgVmVydGV4IHdoaWNoIGlzIGEgY29udGFpbmVyIGZvciBBVk0gVHJhbnNhY3Rpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gbmV0d29ya0lEIE9wdGlvbmFsLCBbW0RlZmF1bHROZXR3b3JrSURdXVxuICAgKiBAcGFyYW0gYmxvY2tjaGFpbklEIE9wdGlvbmFsLCBkZWZhdWx0IFwiMm9ZTUJOVjRlTkh5cWsyZmpqVjVuVlFMRGJ0bU5KenE1czNxczNMbzZmdG5DNkZCeU1cIlxuICAgKiBAcGFyYW0gaGVpZ2h0IE9wdGlvbmFsLCBkZWZhdWx0IG5ldyBCTigwKVxuICAgKiBAcGFyYW0gZXBvY2ggT3B0aW9uYWwsIGRlZmF1bHQgbmV3IEJOKDApXG4gICAqIEBwYXJhbSBwYXJlbnRJRHMgT3B0aW9uYWwsIGRlZmF1bHQgW11cbiAgICogQHBhcmFtIHR4cyBPcHRpb25hbCwgZGVmYXVsdCBbXVxuICAgKiBAcGFyYW0gcmVzdHJpY3Rpb25zIE9wdGlvbmFsLCBkZWZhdWx0IFtdXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBuZXR3b3JrSUQ6IG51bWJlciA9IERlZmF1bHROZXR3b3JrSUQsXG4gICAgYmxvY2tjaGFpbklEOiBzdHJpbmcgPSBcIjJvWU1CTlY0ZU5IeXFrMmZqalY1blZRTERidG1OSnpxNXMzcXMzTG82ZnRuQzZGQnlNXCIsXG4gICAgaGVpZ2h0OiBCTiA9IG5ldyBCTigwKSxcbiAgICBlcG9jaDogbnVtYmVyID0gMCxcbiAgICBwYXJlbnRJRHM6IEJ1ZmZlcltdID0gW10sXG4gICAgdHhzOiBUeFtdID0gW10sXG4gICAgcmVzdHJpY3Rpb25zOiBCdWZmZXJbXSA9IFtdXG4gICkge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLm5ldHdvcmtJRCA9IG5ldHdvcmtJRFxuICAgIHRoaXMuYmxvY2tjaGFpbklEID0gYmludG9vbHMuY2I1OERlY29kZShibG9ja2NoYWluSUQpXG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHRcbiAgICB0aGlzLmVwb2NoID0gZXBvY2hcbiAgICB0aGlzLnBhcmVudElEcyA9IHBhcmVudElEc1xuICAgIHRoaXMubnVtUGFyZW50SURzID0gcGFyZW50SURzLmxlbmd0aFxuICAgIHRoaXMudHhzID0gdHhzXG4gICAgdGhpcy5udW1UeHMgPSB0eHMubGVuZ3RoXG4gICAgdGhpcy5yZXN0cmljdGlvbnMgPSByZXN0cmljdGlvbnNcbiAgICB0aGlzLm51bVJlc3RyaWN0aW9ucyA9IHJlc3RyaWN0aW9ucy5sZW5ndGhcbiAgfVxufVxuIl19