Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

slopes

Package Overview
Dependencies
Maintainers
1
Versions
62
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

slopes - npm Package Compare versions

Comparing version 1.1.6 to 1.1.7

2

package.json
{
"name": "slopes",
"version": "1.1.6",
"version": "1.1.7",
"description": "AVA Platform JS Library",

@@ -5,0 +5,0 @@ "main": "typings/src/index.js",

@@ -158,3 +158,3 @@ /**

*/
getUTXOs = async (addresses:Array<string>, persistOpts:PersistanceOptions | boolean = false ):Promise<UTXOSet> => {
getUTXOs = async (addresses:Array<string>, persistOpts:PersistanceOptions = undefined ):Promise<UTXOSet> => {
let params = {

@@ -197,5 +197,2 @@ "addresses": addresses

* @param threshold The number of signatures required to spend the funds in the resultant UTXO
* @param fallAddresses The fallback addresses which can spend the funds in the resultant UTXO
* @param fallLocktime The fallback locktime timestamp which is greater than the locktime and used as an expiration date for the locktime as a {@link https://github.com/indutny/bn.js/|BN}
* @param fallThreshold The fallback threshold for the number of signatures required from the fallback addresses to spend the resultant UTXO
*

@@ -210,4 +207,3 @@ * @returns An unsigned transaction created from the passed in parameters.

changeAddresses:Array<string>, assetID:Buffer | string = undefined, asOf:BN = UnixNow(),
locktime:BN = new BN(0), threshold:number = 1, fallAddresses:Array<string> = undefined,
fallLocktime:BN = UnixNow(), fallThreshold:number = 1
locktime:BN = new BN(0), threshold:number = 1
):TxUnsigned => {

@@ -220,4 +216,3 @@ if(typeof assetID === "string"){

amount, toAddresses, fromAddresses, changeAddresses,
assetID, asOf, locktime, threshold,
fallAddresses, fallLocktime, fallThreshold
assetID, asOf, locktime, threshold
);

@@ -267,5 +262,5 @@ }

* @param core A reference to the Slopes class
* @param baseurl Defaults to the string "/ext/subnet/avm" as the path to subnets baseurl
* @param baseurl Defaults to the string "/ext/bc/avm" as the path to subnets baseurl
*/
constructor(core:SlopesCore, baseurl:string = "/ext/subnet/avm", blockchainID:string = ""){
constructor(core:SlopesCore, baseurl:string = "/ext/bc/avm", blockchainID:string = ""){
super(core, baseurl);

@@ -272,0 +267,0 @@ this.keychain = new AVMKeyChain();

@@ -7,3 +7,3 @@ /**

import BN from "bn.js";
import { SigIdx } from './types';
import { SigIdx, Constants } from './types';

@@ -15,2 +15,4 @@ /**

const SECPINPUTID = 6;
/**

@@ -30,10 +32,6 @@ * Class representing an Input for a transaction.

export class Input {
protected id:Buffer = Buffer.alloc(4);
protected txid:Buffer = Buffer.alloc(32);
protected txidx:Buffer = Buffer.alloc(4);
protected assetid:Buffer = Buffer.alloc(32);
protected amount:Buffer = Buffer.alloc(8);
protected amountValue:BN = new BN(0);
protected numAddr:Buffer = Buffer.alloc(4);
protected sigIdxs:Array<SigIdx> = []; // idxs of signers from utxo
protected inputid:Buffer = Buffer.alloc(4);

@@ -43,3 +41,3 @@ /**

*/
static comparitor = ():(a:Input, b:Input) => (1|-1|0) => {
static comparator = ():(a:Input, b:Input) => (1|-1|0) => {
return function(a:Input, b:Input):(1|-1|0) {

@@ -58,13 +56,6 @@ return Buffer.compare(a.toBuffer(), b.toBuffer()) as (1|-1|0);

/**
* Returns the array of [[SigIdx]] for this [[Input]]
*/
getSigIdxs = ():Array<SigIdx> => {
return this.sigIdxs;
}
/**
* Returns the number for the input type of the output class.
*/
getInputType = ():number => {
return this.id.readUInt32BE(0);
getInputID = ():number => {
return this.inputid.readUInt32BE(0);
};

@@ -82,7 +73,91 @@

*/
protected _basicTxInBuffer = (): Buffer => {
protected _basicInBuffer = (): Buffer => {
try {
let bsize:number = this.txid.length + this.txidx.length + this.assetid.length + this.inputid.length ;
let barr:Array<Buffer> = [this.txid, this.txidx, this.assetid, this.inputid];
let buff: Buffer = Buffer.concat(barr,bsize);
return buff;
} catch(e) {
/* istanbul ignore next */
let emsg:string = "Error - TxOut._basicTxBuffer: " + e;
/* istanbul ignore next */
throw new Error(emsg);
}
}
/**
* Takes a {@link https://github.com/feross/buffer|Buffer} containing an [[Input]], parses it, populates the class, and returns the length of the Input in bytes.
*
* @param bytes A {@link https://github.com/feross/buffer|Buffer} containing a raw [[Input]]
*
* @returns The length of the raw [[Input]]
*/
fromBuffer = (bytes:Buffer):number => {
let offset:number = 0;
this.txid = bintools.copyFrom(bytes, offset, offset + 32);
offset += 32;
this.txidx = bintools.copyFrom(bytes, offset, offset + 4);
offset += 4;
this.assetid = bintools.copyFrom(bytes, offset, offset + 32);
offset += 32;
this.inputid = bintools.copyFrom(bytes, offset, offset + 4);
offset += 4;
return offset;
}
/**
* Returns a {@link https://github.com/feross/buffer|Buffer} representation of the [[Input]].
*/
toBuffer = ():Buffer => {
return this._basicInBuffer();
}
/**
* Returns a base-58 representation of the [[Input]].
*/
toString = ():string => {
return bintools.bufferToB58(this.toBuffer());
}
/**
* Class representing an Input for a transaction.
*
* @param txid A {@link https://github.com/feross/buffer|Buffer} containing the transaction ID of the referenced UTXO
* @param txidx A {@link https://github.com/feross/buffer|Buffer} containing the index of the output in the transaction consumed in the [[Input]]
* @param assetID A {@link https://github.com/feross/buffer|Buffer} representing the assetID of the [[Input]]
* @param inputid A number representing the InputID of the [[Input]]
*/
constructor(txid?:Buffer, txidx?:Buffer, assetID?:Buffer, inputid?:number) {
if(txid && txidx && assetID && inputid){
this.inputid.writeUInt32BE(inputid,0);
this.txid = txid;
this.txidx = txidx;
this.assetid = assetID;
}
}
}
export class SecpInput extends Input {
protected amount:Buffer = Buffer.alloc(8);
protected amountValue:BN = new BN(0);
protected numAddr:Buffer = Buffer.alloc(4);
protected sigIdxs:Array<SigIdx> = []; // idxs of signers from utxo
/**
* Returns the array of [[SigIdx]] for this [[Input]]
*/
getSigIdxs = ():Array<SigIdx> => {
return this.sigIdxs;
}
/**
* @ignore
*/
protected _basicSecpInBuffer = (): Buffer => {
try {
this.numAddr.writeUInt32BE(this.sigIdxs.length, 0);
let bsize:number = this.id.length + this.txid.length + this.txidx.length + this.assetid.length + this.amount.length + this.numAddr.length;
let barr:Array<Buffer> = [this.id, this.txid, this.txidx, this.assetid, this.amount, this.numAddr];
let bsize:number = this.amount.length + this.numAddr.length;
let barr:Array<Buffer> = [this.amount, this.numAddr];
for(let i = 0; i < this.sigIdxs.length; i++) {

@@ -112,10 +187,2 @@ let b:Buffer = this.sigIdxs[i].toBuffer();

let offset:number = 0;
this.id = bintools.copyFrom(bytes, offset, offset + 4);
offset += 4;
this.txid = bintools.copyFrom(bytes, offset, offset + 32);
offset += 32;
this.txidx = bintools.copyFrom(bytes, offset, offset + 4);
offset += 4;
this.assetid = bintools.copyFrom(bytes, offset, offset + 32);
offset += 32;
this.amount = bintools.copyFrom(bytes, offset, offset + 8);

@@ -141,3 +208,5 @@ offset += 8;

toBuffer = ():Buffer => {
return this._basicTxInBuffer();
let basicin:Buffer = this._basicInBuffer();
let secp:Buffer = this._basicSecpInBuffer();
return Buffer.concat([basicin, secp]);
}

@@ -177,4 +246,5 @@

constructor(txid?:Buffer, txidx?:Buffer, amount?:BN, assetID?:Buffer) {
super(txid, txidx, assetID, Constants.SECPINPUTID);
if(txid && txidx && amount && assetID){
this.id.writeUInt32BE(0,0);
this.inputid.writeUInt32BE(Constants.SECPINPUTID,0);
this.txid = txid;

@@ -181,0 +251,0 @@ this.txidx = txidx;

@@ -9,3 +9,3 @@ /**

import { Signature, SigIdx } from './types';
import { Input } from './inputs';
import { SecpInput, Input } from './inputs';
import createHash from "create-hash";

@@ -186,3 +186,3 @@ import { KeyPair, KeyChain } from '../../utils/types';

*/
constructor(entropy:Buffer | boolean = false) {
constructor(entropy:Buffer = undefined) {
super();

@@ -208,3 +208,3 @@ this.generateKey();

*/
makeKey = (entropy:Buffer | boolean = false):string => {
makeKey = (entropy:Buffer = undefined):string => {
let keypair:AVMKeyPair = new AVMKeyPair(entropy);

@@ -247,6 +247,7 @@ this.addKey(keypair);

let msg:Buffer = Buffer.from(createHash('sha256').update(txbuff).digest());
let sigs:Array<Signature> = [];
let sigs:Array<Array<Signature>> = [];
let ins:Array<Input> = utx.getIns();
for(let i = 0; i < ins.length; i++){
let sigidxs:Array<SigIdx> = ins[i].getSigIdxs();
let arrsigs:Array<Signature> = [];
let sigidxs:Array<SigIdx> = (ins[i] as SecpInput).getSigIdxs();
for(let j = 0; j < sigidxs.length; j++){

@@ -257,4 +258,5 @@ let keypair:AVMKeyPair = this.getKey(sigidxs[j].getSource());

sig.fromBuffer(signval);
sigs.push(sig);
arrsigs.push(sig);
}
sigs.push(arrsigs);
}

@@ -261,0 +263,0 @@ return new Tx(utx, sigs);

@@ -7,10 +7,12 @@ /**

import BN from "bn.js";
import { Address, UnixNow } from './types';
import { Address, UnixNow, Constants } from './types';
const bintools = BinTools.getInstance();
const SECPFXID = 4;
/**
* Output:
*
* Output Payment:
* OutputID | 04 bytes
* AssetID | 32 bytes
* Amount | 08 bytes

@@ -46,9 +48,8 @@ * Locktime | 08 bytes

export const SelectOutputClass = (outbuffer:Buffer, args:Array<any> = []):Output => {
let outputid:number = outbuffer.readUInt32BE(0);
if(outputid == 0){
return new OutPayment(bintools.copyFrom(outbuffer,4,36), ...args);
} else if (outputid == 1){
return new OutTakeOrLeave(bintools.copyFrom(outbuffer,4,36), ...args);
} else if(outputid == 2) {
return new OutCreateAsset(...args);
let assetid:Buffer = bintools.copyFrom(outbuffer, 0, 32);
let outputid:number = outbuffer.readUInt32BE(32);
if(outputid == Constants.SECPOUTPUTID){
let secpout:SecpOutput = new SecpOutput(assetid, ...args);
secpout.fromBuffer(outbuffer);
return secpout;
}

@@ -62,14 +63,9 @@ throw new Error("Error - SelectOutputClass: unknown outputid " + outputid);

export abstract class Output {
protected id:Buffer = Buffer.alloc(4);
protected idnum:number;
protected amount:Buffer = Buffer.alloc(8);
protected amountValue:BN;
protected outputid:Buffer = Buffer.alloc(4);
protected outputidnum:number;
protected assetid:Buffer = Buffer.alloc(32);
abstract getOutputType:() => number;
abstract getAmount:() => BN;
abstract getOutputID:() => number;
abstract getAssetID:() => Buffer;
abstract getAddresses:() => {[address:string]: BN};// address: locktimes
abstract getAddressIdx:(address:string) => [number, boolean];
abstract getAddress:(idx:number, tol:boolean) => string;
abstract fromBuffer:(utxobuff:Buffer) => number;

@@ -79,6 +75,3 @@ abstract toBuffer:() => Buffer;

abstract getSpenders:(addresses:Array<string>, asOf:BN | boolean) => Array<string>;
abstract meetsThreshold:(addresses:Array<string>, asOf:BN | boolean) => boolean;
static comparitor = ():(a:Output, b:Output) => (1|-1|0) => {
static comparator = ():(a:Output, b:Output) => (1|-1|0) => {
return function(a:Output, b:Output):(1|-1|0) {

@@ -89,6 +82,7 @@ return Buffer.compare(a.toBuffer(), b.toBuffer()) as (1|-1|0);

constructor(amount?:BN, assetID?:Buffer) {
if(amount){
this.amountValue = amount.clone();
this.amount = bintools.fromBNToBuffer(this.amountValue, 8);
constructor(outputidnum:number, assetID?:Buffer) {
this.outputid.writeUInt32BE(outputidnum, 0);
this.outputidnum = outputidnum;
if(assetID){
this.assetid = assetID;
}

@@ -99,270 +93,5 @@ }

/**
* An [[Output]] class which creates an assetID.
*/
export class OutCreateAsset extends Output {
protected locktime:Buffer = Buffer.alloc(8);
protected threshold:Buffer = Buffer.alloc(4);
protected numaddrs:Buffer = Buffer.alloc(4);
protected addresses:Array<Address> = [];
/**
* @ignore
*/
protected _CAGetAddresses = ():{[address:string]: BN} => {
let result:{[address:string]: BN} = {};
for(let i = 0; i < this.addresses.length; i++) {
result[this.addresses[i].toString()] = bintools.fromBufferToBN(this.locktime);
}
return result;
}
/**
* Returns the number for the output type of the output class.
*/
getOutputType = ():number => {
return this.idnum;
};
/**
* Returns the amount as a {@link https://github.com/indutny/bn.js/|BN}.
*/
getAmount = ():BN => {
return this.amountValue.clone();
}
/**
* Returns the threshold of signers required to spend this output.
*/
getThreshold = ():number => {
return this.threshold.readUInt32BE(0);
}
/**
* Returns the a {@link https://github.com/indutny/bn.js/|BN} repersenting the UNIX Timestamp when the lock is made available.
*/
getLocktime = ():BN => {
return bintools.fromBufferToBN(this.locktime);
}
/**
* Returns the assetID as a {@link https://github.com/feross/buffer|Buffer}.
*/
getAssetID = ():Buffer => {
return undefined;
}
/**
* Returns a map from all addresses as string keys to their locktime represented in {@link https://github.com/indutny/bn.js/|BN}.
*/
getAddresses = ():{[address:string]: BN} => {
return this._CAGetAddresses();
}
/**
* Returns an array of length 2 with the first index being the index of the provided address and the second being false (as fallback addresses are not available in this output type).
*
* @param address Address to look up to return its index.
*
* @returns An array of length 2, first index is the index the address resides in, second index is false.
*/
getAddressIdx = (address:string):[number, boolean] => {
let idx:number = -1;
for(let i = 0; i < this.addresses.length; i++){
if(this.addresses[i].toString() == address){
idx = i;
break;
}
}
return [idx, false];
}
/**
* Returns the address from the index provided.
*
* @param idx The index of the address.
* @param tol Unused, there for compatibility.
*
* @returns Returns the string representing the address.
*/
getAddress = (idx:number, tol:boolean = false):string => {
if(idx < this.addresses.length){
return this.addresses[idx].toString();
}
throw new Error("Error - OutPayment.getAddress: idx out of range");
}
/**
* @ignore
*/
protected _OCAParseBuffer = (utxobuff:Buffer, offset:number):number => {
this.id = bintools.copyFrom(utxobuff, offset, offset + 4); //copied
this.idnum = this.id.readUInt32BE(0);
offset += 4;
this.amount = bintools.copyFrom(utxobuff, offset, offset + 8);
this.amountValue = bintools.fromBufferToBN(this.amount);
offset += 8;
this.locktime = bintools.copyFrom(utxobuff, offset, offset + 8);
offset += 8;
this.threshold = bintools.copyFrom(utxobuff, offset, offset + 4);
offset += 4;
this.numaddrs = bintools.copyFrom(utxobuff, offset, offset + 4);
offset += 4;
let numaddrs:number = this.numaddrs.readUInt32BE(0);
this.addresses = [];
for(let i = 0; i < numaddrs; i++){
let addr:Address = new Address();
let offsetEnd:number = offset + addr.getSize();
let copied:Buffer = bintools.copyFrom(utxobuff, offset, offsetEnd);
addr.fromBuffer(copied);
this.addresses.push(addr);
offset = offsetEnd;
}
this.addresses.sort(Address.comparitor());
return offset;
}
/**
* Popuates the instance from a {@link https://github.com/feross/buffer|Buffer} representing the [[OutCreateAsset]] and returns the size of the output.
*/
fromBuffer = (utxobuff:Buffer):number => {
return this._OCAParseBuffer(utxobuff, 0);
}
/**
* @ignore
*/
protected _OCATxBuffer = (): Buffer => {
try {
this.addresses.sort(Address.comparitor());
let bsize:number = this.id.length + this.amount.length + this.locktime.length + this.threshold.length + this.numaddrs.length;;
this.numaddrs.writeUInt32BE(this.addresses.length, 0);
let barr:Array<Buffer> = [this.id, this.amount, this.locktime, this.threshold, this.numaddrs];
for(let i = 0; i < this.addresses.length; i++) {
let b: Buffer = this.addresses[i].toBuffer();
barr.push(b as Buffer);
bsize += b.length;
}
let buff: Buffer = Buffer.concat(barr,bsize);
return buff;
} catch(e) {
/* istanbul ignore next */
let emsg:string = "Error - TxOut._OPCABuffer: " + e;
/* istanbul ignore next */
throw new Error(emsg);
}
}
/**
* Returns the buffer representing the [[OutCreateAsset]] instance.
*/
toBuffer = ():Buffer => {
return this._OCATxBuffer();
}
/**
* Returns a base-58 string representing the [[OutCreateAsset]].
*/
toString = ():string => {
return bintools.bufferToB58(this.toBuffer());
}
/**
* @ignore
*/
protected _OCAQualified = (addresses:Array<string>, asOf:BN | boolean = false):Array<string> => {
let qualified:Array<string> = [];
let now:BN;
if(typeof asOf === 'boolean'){
now = UnixNow();
} else {
now = asOf;
}
let locktime:BN = bintools.fromBufferToBN(this.locktime);
if(now.lte(locktime)){ //not unlocked, not spendable
return qualified;
}
let threshold:number = this.threshold.readUInt32BE(0);
for(let i = 0; i < this.addresses.length && qualified.length < threshold; i++) {
for(let j = 0; j < addresses.length && qualified.length < threshold; j++){
if(addresses[j] == this.addresses[i].toString()){
qualified.push(addresses[j]);
}
}
}
if(qualified.length >= threshold){
return qualified;
}
return []
}
/**
* Given an array of addresses and an optional timestamp, select an array of address strings of qualified spenders for the output.
*/
getSpenders = (addresses:Array<string>, asOf:BN | boolean = false):Array<string> => {
return this._OCAQualified(addresses, asOf);
}
/**
* Given an array of addresses and an optional timestamp, returns true if the addresses meet the threshold required to spend the output.
*/
meetsThreshold = (addresses:Array<string>, asOf:BN | boolean = false):boolean => {
let now:BN;
if(typeof asOf === 'boolean'){
now = UnixNow();
} else {
now = asOf;
}
let locktime:BN = bintools.fromBufferToBN(this.locktime);
let qualified:Array<string> = this._OCAQualified(addresses, now);
let threshold:number = this.threshold.readUInt32BE(0);
if(now.lte(locktime)){
return false;
}
if(qualified.length >= threshold){
return true;
}
return false;
}
/**
* An [[Output]] class which creates an assetID.
*
* @param amount A {@link https://github.com/indutny/bn.js/|BN} representing the amount in the output
* @param addresses An array of strings representing addresses
* @param locktime A {@link https://github.com/indutny/bn.js/|BN} representing the locktime
* @param threshold A number representing the the threshold number of signers required to sign the transaction
*/
constructor(amount?:BN, addresses?:Array<string>, locktime?:BN, threshold?:number){
super(amount);
this.idnum = 2;
this.id.writeUInt32BE(this.idnum, 0);
if(amount && addresses){
this.amountValue = amount.clone();
let addrs:Array<Address> = [];
for(let i = 0; i < addresses.length; i++){
addrs[i] = new Address();
addrs[i].fromString(addresses[i]);
}
this.addresses = addrs;
this.addresses.sort(Address.comparitor());
this.numaddrs.writeUInt32BE(this.addresses.length, 0);
this.threshold.writeUInt32BE((threshold ? threshold : 1), 0);
if(!(locktime)){
/* istanbul ignore next */
locktime = new BN(0);
}
this.locktime = bintools.fromBNToBuffer(locktime, 8);
}
}
}
/**
* An [[Output]] class which issues a payment on an assetID.
*/
export class OutPayment extends Output {
protected assetid:Buffer = Buffer.alloc(32);
export class SecpOutput extends Output {
protected locktime:Buffer = Buffer.alloc(8);

@@ -372,2 +101,4 @@ protected threshold:Buffer = Buffer.alloc(4);

protected addresses:Array<Address> = [];
protected amount:Buffer = Buffer.alloc(8);
protected amountValue:BN = new BN(0);

@@ -388,4 +119,4 @@ /**

*/
getOutputType = ():number => {
return this.idnum;
getOutputID = ():number => {
return this.outputidnum;
};

@@ -435,11 +166,9 @@

*/
getAddressIdx = (address:string):[number, boolean] => {
let idx:number = -1;
getAddressIdx = (address:string):number => {
for(let i = 0; i < this.addresses.length; i++){
if(this.addresses[i].toString() == address){
idx = i;
break;
return i
}
}
return [idx, false];
return -1;
}

@@ -451,7 +180,6 @@

* @param idx The index of the address.
* @param tol Unused, there for compatibility.
*
* @returns Returns the string representing the address.
*/
getAddress = (idx:number, tol:boolean = false):string => {
getAddress = (idx:number):string => {
if(idx < this.addresses.length){

@@ -467,7 +195,7 @@ return this.addresses[idx].toString();

protected _OPParseBuffer = (utxobuff:Buffer, offset:number):number => {
this.id = bintools.copyFrom(utxobuff, offset, offset + 4); //copied
this.idnum = this.id.readUInt32BE(0);
offset += 4;
this.assetid = bintools.copyFrom(utxobuff, offset, offset + 32);
offset += 32;
this.outputid = bintools.copyFrom(utxobuff, offset, offset + 4); //copied
this.outputidnum = this.outputid.readUInt32BE(0);
offset += 4;
this.amount = bintools.copyFrom(utxobuff, offset, offset + 8);

@@ -509,5 +237,5 @@ this.amountValue = bintools.fromBufferToBN(this.amount);

this.addresses.sort(Address.comparitor());
let bsize:number = this.id.length + this.assetid.length + this.amount.length + this.locktime.length + this.threshold.length + this.numaddrs.length;
let bsize:number = this.assetid.length + this.outputid.length + this.amount.length + this.locktime.length + this.threshold.length + this.numaddrs.length;
this.numaddrs.writeUInt32BE(this.addresses.length, 0);
let barr:Array<Buffer> = [this.id, this.assetid, this.amount, this.locktime, this.threshold, this.numaddrs];
let barr:Array<Buffer> = [this.assetid, this.outputid, this.amount, this.locktime, this.threshold, this.numaddrs];
for(let i = 0; i < this.addresses.length; i++) {

@@ -545,6 +273,6 @@ let b: Buffer = this.addresses[i].toBuffer();

*/
protected _OPQualified = (addresses:Array<string>, asOf:BN | boolean = false):Array<string> => {
protected _OPQualified = (addresses:Array<string>, asOf:BN = undefined):Array<string> => {
let qualified:Array<string> = [];
let now:BN;
if(typeof asOf === 'boolean'){
if(typeof asOf === 'undefined'){
now = UnixNow();

@@ -575,3 +303,3 @@ } else {

*/
getSpenders = (addresses:Array<string>, asOf:BN | boolean = false):Array<string> => {
getSpenders = (addresses:Array<string>, asOf:BN = undefined):Array<string> => {
return this._OPQualified(addresses, asOf);

@@ -583,5 +311,5 @@ }

*/
meetsThreshold = (addresses:Array<string>, asOf:BN | boolean = false):boolean => {
meetsThreshold = (addresses:Array<string>, asOf:BN = undefined):boolean => {
let now:BN;
if(typeof asOf === 'boolean'){
if(typeof asOf === 'undefined'){
now = UnixNow();

@@ -614,9 +342,6 @@ } else {

constructor(assetid:Buffer, amount?:BN, addresses?:Array<string>, locktime?:BN, threshold?:number){
super(amount);
this.assetid = assetid;
this.idnum = 0;
this.id.writeUInt32BE(this.idnum, 0);
super(SECPFXID, assetid);
if(amount && addresses){
this.amountValue = amount.clone();
this.amount = bintools.fromBNToBuffer(amount, 8);
let addrs:Array<Address> = [];

@@ -640,263 +365,2 @@ for(let i = 0; i < addresses.length; i++){

/**
* An [[Output]] class which issues a payment on an assetID and has fallback addresses and locktimes.
*/
export class OutTakeOrLeave extends OutPayment {
protected fallLocktime:Buffer = Buffer.alloc(8);
protected fallThreshold:Buffer = Buffer.alloc(4);
protected numfalladdrs:Buffer = Buffer.alloc(4);
protected fallAddresses:Array<Address>;
/**
* Returns the threshold of fallback signers required to spend this output.
*/
getFallThreshold = ():number => {
return this.fallThreshold.readUInt32BE(0);
}
/**
* Returns the a {@link https://github.com/indutny/bn.js/|BN} repersenting the UNIX Timestamp when the fallback lock is made available.
*/
getFallLocktime = ():BN => {
return bintools.fromBufferToBN(this.fallLocktime);
}
/**
* @ignore
*/
protected _TOLGetAddresses = ():{[address:string]: BN} => {
let result:{[address:string]: BN} = {};
for(let i = 0; i < this.fallAddresses.length; i++){
result[this.fallAddresses[i].toString()] = bintools.fromBufferToBN(this.fallLocktime);
}
return result;
}
/**
* Returns a map from all addresses as string keys to their locktime represented in {@link https://github.com/indutny/bn.js/|BN}.
*/
getAddresses = ():{[address:string]: BN} => {
return {...this._TOLGetAddresses(), ...this._OPGetAddresses() };
}
/**
* Returns an array of length 2 with the first index being the index of the provided address and the second being false (as fallback addresses are not available in this output type).
*
* @param address Address to look up to return its index.
*
* @returns An array of length 2, first index is the index the address resides in, second index is false.
*/
getAddressIdx = (address:string):[number, boolean] => {
let idx:number = -1;
let tol:boolean = false;
for(let i = 0; i < this.addresses.length; i++){
if(this.addresses[i].toString() == address){
idx = i;
break;
}
}
if(idx == -1){
for(let i = 0; i < this.fallAddresses.length; i++){
if(this.fallAddresses[i].toString() == address){
idx = i;
tol = true;
break;
}
}
}
return [idx, tol];
}
/**
* Returns the address from the index provided.
*
* @param idx The index of the address.
* @param tol Indicates whether the address is a take it or leave it
*
* @returns Returns the string representing the address.
*/
getAddress = (idx:number, tol:boolean = false):string => {
if(!tol && idx < this.addresses.length){
return this.addresses[idx].toString();
} else if(tol && idx < this.fallAddresses.length){
return this.fallAddresses[idx].toString();
}
throw new Error("Error - OutPayment.getAddress: idx out of range");
}
/**
* @ignore
*/
protected _TOLParseBuffer = (utxobuff:Buffer, offset:number) => {
this.fallLocktime = bintools.copyFrom(utxobuff, offset, offset + 8);
offset += 8;
this.fallThreshold = bintools.copyFrom(utxobuff, offset, offset + 4);
offset += 4;
this.numfalladdrs = bintools.copyFrom(utxobuff, offset, offset + 4);
offset += 4;
let numfalladdrs = this.numfalladdrs.readUInt32BE(0);
this.fallAddresses = [];
for(let i = 0; i < numfalladdrs; i++){
let addr = new Address();
let offsetEnd = offset + addr.getSize();
let copied = bintools.copyFrom(utxobuff, offset, offsetEnd);
addr.fromBuffer(copied);
this.fallAddresses.push(addr);
offset = offsetEnd;
}
this.fallAddresses.sort(Address.comparitor());
return offset;
}
/**
* Popuates the instance from a {@link https://github.com/feross/buffer|Buffer} representing the [[OutTakeOrLeave]] and returns the size of the output.
*/
fromBuffer = (utxobuff:Buffer):number => {
let offset:number = this._OPParseBuffer(utxobuff, 0);
let offset2:number = this._TOLParseBuffer(utxobuff, offset);
return offset2;
}
/**
* @ignore
*/
protected _TOLBuffer = (): Buffer => {
try {
this.fallAddresses.sort(Address.comparitor());
let bsize:number = this.fallLocktime.length + this.fallThreshold.length + this.numfalladdrs.length;
this.numfalladdrs.writeUInt32BE(this.fallAddresses.length, 0);
let barr:Array<Buffer> = [this.fallLocktime, this.fallThreshold, this.numfalladdrs];
for(let i = 0; i < this.fallAddresses.length; i++) {
let b:Buffer = this.fallAddresses[i].toBuffer();
barr.push(b);
bsize += b.length;
}
let buff: Buffer = Buffer.concat(barr,bsize);
return buff;
} catch(e) {
/* istanbul ignore next */
let emsg:string = "Error - TxTakeOrLeave._TOLBuffer: " + e;
/* istanbul ignore next */
throw new Error(emsg);
}
}
/**
* Returns the buffer representing the [[OutTakeOrLeave]] instance.
*/
toBuffer = ():Buffer => {
let pt1: Buffer = this._OPBuffer();
let pt2: Buffer = this._TOLBuffer();
return Buffer.concat([pt1, pt2], pt1.length + pt2.length)
}
/**
* Returns a base-58 string representing the [[OutTakeOrLeave]].
*/
toString = ():string => {
return bintools.bufferToB58(this.toBuffer());
}
/**
* @ignore
*/
protected _TOLQualified = (addresses:Array<string>, asOf:BN | boolean = false):Array<string> => {
let qualified:Array<string> = [];
let now:BN;
if(typeof asOf === 'boolean'){
now = UnixNow();
} else {
now = asOf;
}
let locktime:BN = bintools.fromBufferToBN(this.fallLocktime);
if(now.lte(locktime)){ //not unlocked, not spendable
return qualified;
}
let threshold:number = this.fallThreshold.readUInt32BE(0);
for(let i = 0; i < this.fallAddresses.length && qualified.length < threshold; i++) {
for(let j = 0; j < addresses.length && qualified.length < threshold; j++){
if(addresses[j] == this.fallAddresses[i].toString()){
qualified.push(addresses[j]);
}
}
}
return qualified;
}
/**
* Given an array of addresses and an optional timestamp, select an array of address strings of qualified spenders for the output.
*/
getSpenders = (addresses:Array<string>, asOf:BN | boolean = false):Array<string> => {
let qualified:Array<string> = this._OPQualified(addresses, asOf);
qualified = qualified.concat(this._TOLQualified(addresses, asOf));
return [...new Set(qualified)];
}
/**
* Given an array of addresses and an optional timestamp, returns true if the addresses meet the threshold required to spend the output.
*/
meetsThreshold = (addresses:Array<string>, asOf:BN | boolean = false):boolean => {
let now:BN;
if(typeof asOf === 'boolean'){
now = UnixNow();
} else {
now = asOf;
}
let locktime:BN = bintools.fromBufferToBN(this.locktime);
let fallLocktime:BN = bintools.fromBufferToBN(this.fallLocktime);
let qualified:Array<string> = this._OPQualified(addresses, now);
let threshold:number = this.threshold.readUInt32BE(0);
if(now.lte(locktime)){
return false;
}
if(qualified.length >= threshold){
return true;
}
qualified = this._TOLQualified(addresses, now);
threshold = this.fallThreshold.readUInt32BE(0);
if(now.lte(fallLocktime)){
return false;
}
if(qualified.length >= threshold){
return true;
}
return false;
}
/**
* An [[Output]] class which issues a payment on an assetID and has fallback addresses and locktimes.
*
* @param assetid A {@link https://github.com/feross/buffer|Buffer} representing the AssetID
* @param amount A {@link https://github.com/indutny/bn.js/|BN} representing the amount in the output
* @param addresses An array of strings representing addresses
* @param falladdresses An array of strings representing fallback addresses
* @param locktime A {@link https://github.com/indutny/bn.js/|BN} representing the locktime
* @param falllocktime A {@link https://github.com/indutny/bn.js/|BN} representing the fallback locktime
* @param threshold A number representing the threshold number of signers required to sign the transaction
* @param fallthreshold A number representing the fallback threshold number of signers required to sign the transaction
*/
constructor(assetid:Buffer, amount?:BN, addresses?:Array<string>, falladdresses?:Array<string>, locktime?:BN, falllocktime?:BN, threshold?:number, fallthreshold?:number){
super(assetid, amount, addresses, locktime, threshold);
this.idnum = 1;
this.id.writeUInt32BE(this.idnum, 0);
if(amount && addresses && falladdresses && falllocktime){
let addrs:Array<Address> = [];
for(let i = 0; i < falladdresses.length; i++){
addrs[i] = new Address();
addrs[i].fromString(falladdresses[i]);
}
this.fallAddresses = addrs;
this.fallAddresses.sort(Address.comparitor());
this.numfalladdrs.writeUInt32BE(this.fallAddresses.length, 0);
this.fallThreshold.writeUInt32BE((fallthreshold ? fallthreshold : 1), 0);
if(!falllocktime) {
/* istanbul ignore next */
falllocktime = new BN(1);
}
this.fallLocktime = bintools.fromBNToBuffer(falllocktime, 8);
}
}
}

@@ -5,3 +5,3 @@ /**

import {Buffer} from "buffer/";
import { Signature } from './types';
import { Signature, Constants } from './types';
import { Output, SelectOutputClass } from './outputs';

@@ -21,3 +21,3 @@ import { Input } from './inputs';

* Unsigned Tx:
* Codec | 4 bytes
* TxID | 4 bytes
* NetworkID | 4 bytes

@@ -42,3 +42,3 @@ * BlockchainID | 32 bytes

export class TxUnsigned {
protected codec:Buffer = Buffer.alloc(4);
protected txtype:Buffer = Buffer.alloc(4);
protected networkid:Buffer = Buffer.alloc(4);

@@ -52,6 +52,6 @@ protected blockchainid:Buffer = Buffer.alloc(32);

/**
* Returns the number representation of the codec
* Returns the number representation of the txtype
*/
getCodec = ():number => {
return this.codec.readUInt32BE(0);
getTxType = ():number => {
return this.txtype.readUInt32BE(0);
}

@@ -98,3 +98,3 @@

let offset:number = 0;
this.codec = bintools.copyFrom(bytes, offset, offset + 4);
this.txtype = bintools.copyFrom(bytes, offset, offset + 4);
offset += 4;

@@ -133,8 +133,8 @@ this.networkid = bintools.copyFrom(bytes, offset, offset + 4);

try {
this.outs.sort(Output.comparitor());
this.ins.sort(Input.comparitor());
this.outs.sort(Output.comparator());
this.ins.sort(Input.comparator());
this.numouts.writeUInt32BE(this.outs.length, 0);
this.numins.writeUInt32BE(this.ins.length, 0);
let bsize:number = this.codec.length + this.networkid.length + this.blockchainid.length + this.numouts.length;
let barr:Array<Buffer> = [this.codec, this.networkid, this.blockchainid, this.numouts];
let bsize:number = this.txtype.length + this.networkid.length + this.blockchainid.length + this.numouts.length;
let barr:Array<Buffer> = [this.txtype, this.networkid, this.blockchainid, this.numouts];
for(let i = 0; i < this.outs.length; i++) {

@@ -183,6 +183,6 @@ let b:Buffer = this.outs[i].toBuffer();

* @param blockchainid Optional blockchainid, default Buffer.alloc(32, 16)
* @param codec Optional codec, default 2
* @param txtype Optional txtype, default 2
*/
constructor(ins?:Array<Input>, outs?:Array<Output>, networkid:number = 2, blockchainid:Buffer = Buffer.alloc(32, 16), codec:number = 2) {
this.codec.writeUInt32BE(codec, 0);
constructor(ins?:Array<Input>, outs?:Array<Output>, networkid:number = 2, blockchainid:Buffer = Buffer.alloc(32, 16), txtype:number = 0) {
this.txtype.writeUInt32BE(txtype, 0);
this.networkid.writeUInt32BE(networkid, 0);

@@ -192,5 +192,5 @@ this.blockchainid = blockchainid;

this.numouts.writeUInt32BE(outs.length, 0);
this.outs = outs.sort(Output.comparitor());
this.outs = outs.sort(Output.comparator());
this.numins.writeUInt32BE(ins.length, 0);
this.ins = ins.sort(Input.comparitor());
this.ins = ins.sort(Input.comparator());
}

@@ -205,3 +205,3 @@ }

protected tx:TxUnsigned = new TxUnsigned();
protected signatures:Array<Signature> = [];
protected signatures:Array<Array<Signature>> = [];

@@ -218,15 +218,21 @@ /**

let offset:number = this.tx.fromBuffer(bytes);
if((bytes.length - offset) % 65 == 0){
let numsigs:number = (bytes.length - offset) / 65;
let numcreds:number = bintools.copyFrom(bytes, offset, offset + 4).readUInt32BE(0);
offset += 4;
this.signatures = [];
for(let i = 0; i < numsigs; i++){
let sig:Signature = new Signature();
sig.fromBuffer(bintools.copyFrom(bytes, offset, offset + 65));
this.signatures.push(sig);
offset += 65;
for(let i = 0; i < numcreds; i++){
let sigarray:Array<Signature> = [];
let credential:number = bintools.copyFrom(bytes, offset, offset + 4).readUInt32BE(0);
if(credential != Constants.SECPCREDENTIAL){
throw new Error("Error - Tx.fromBuffer: Invalid credentialID " + credential);
}
let numsigs:number = bintools.copyFrom(bytes, offset, offset + 4).readUInt32BE(0);
offset += 4;
for(let j = 0; j < numsigs; j++) {
let sig:Signature = new Signature();
sig.fromBuffer(bintools.copyFrom(bytes, offset, offset + 65));
sigarray.push(sig);
offset += 65;
}
this.signatures.push(sigarray);
}
} else {
/* istanbul ignore next */
throw new Error("Error - Tx.fromBuffer: the signature block's byte length isn't evenly divisible by 65 and it should be");
}
return offset;

@@ -254,8 +260,21 @@ }

let txbuff: Buffer = this.tx.toBuffer();
let barr:Array<Buffer> = [txbuff];
let bsize:number = txbuff.length;
let sigarrlen:Buffer = Buffer.alloc(4);
sigarrlen.writeUInt32BE(this.signatures.length, 0);
let barr:Array<Buffer> = [txbuff, sigarrlen];
bsize += sigarrlen.length;
for(let i = 0; i < this.signatures.length; i++){
let b:Buffer = this.signatures[i].toBuffer();
barr.push(b);
bsize += b.length
let siglen:Buffer = Buffer.alloc(4);
siglen.writeUInt32BE(this.signatures[i].length, 0);
let credentialID = Buffer.alloc(4);
credentialID.writeUInt32BE(Constants.SECPCREDENTIAL, 0);
barr.push(credentialID);
bsize += credentialID.length;
barr.push(siglen);
bsize += siglen.length;
for(let j = 0; j < this.signatures[i].length; j++){
let b:Buffer = this.signatures[i][j].toBuffer();
barr.push(b);
bsize += b.length;
}
}

@@ -288,3 +307,3 @@ let buff:Buffer = Buffer.concat(barr, bsize);

*/
constructor(tx?:TxUnsigned, signatures?:Array<Signature>) {
constructor(tx?:TxUnsigned, signatures?:Array<Array<Signature>>) {
if(tx){

@@ -291,0 +310,0 @@ this.tx = tx;

@@ -113,2 +113,9 @@ /**

export class Constants {
static SECPOUTPUTID:number = 4;
static SECPINPUTID:number = 6;
static BASETX:number = 0;
static SECPCREDENTIAL:number =7;
}
/**

@@ -115,0 +122,0 @@ * Rules used when merging sets

@@ -7,6 +7,6 @@ /**

import BN from "bn.js";
import { Output, OutTakeOrLeave, OutPayment, SelectOutputClass, OutCreateAsset } from './outputs';
import { MergeRule, UnixNow } from './types';
import { Output, SecpOutput, SelectOutputClass } from './outputs';
import { MergeRule, UnixNow, Constants } from './types';
import { TxUnsigned } from './tx';
import { Input } from './inputs';
import { SecpInput } from './inputs';

@@ -18,15 +18,132 @@ /**

/**
* Takes a buffer representing the output and returns the proper UTXO instance.
*
* @param utxobuffer A {@link https://github.com/feross/buffer|Buffer} containing the [[UTXO]] raw data.
*
* @returns An instance of an [[UTXO]]-extended class. ex. [[SecpUTXO]].
*/
export const SelectUTXOClass = (utxobuffer:Buffer, args:Array<any> = []):UTXO => {
let txid:Buffer = bintools.copyFrom(utxobuffer, 0, 32);
let txidx:number = utxobuffer.readUInt32BE(32);
let outputbuff:Buffer = bintools.copyFrom(utxobuffer, 36);
let output:Output = SelectOutputClass(outputbuff);
let outputid:number = output.getOutputID();
if(outputid == Constants.SECPOUTPUTID){
let secpout:SecpOutput = output as SecpOutput;
let utxo:SecpUTXO = new SecpUTXO(txid, txidx, secpout);
return utxo;
}
throw new Error("Error - SelectUTXOClass: unknown outputid " + outputid);
}
/**
* Class for representing a single UTXO.
*/
export class UTXO {
export abstract class UTXO {
protected txid:Buffer = Buffer.alloc(32);
protected txidx:Buffer = Buffer.alloc(4);
protected output:Output = undefined;
getOuputType = ():number => {
return this.output.getOutputType();
abstract getOuputID:() => number;
/**
* Returns a {@link https://github.com/feross/buffer|Buffer} of the TxID.
*/
getTxID = ():Buffer => {
return this.txid;
}
/**
* Returns a {@link https://github.com/feross/buffer|Buffer} of the TxIdx.
*/
getTxIdx = ():Buffer => {
return this.txidx;
}
/**
* Returns the UTXOID as a base-58 string (UTXOID is a string )
*/
getUTXOID = ():string => {
return bintools.bufferToB58(Buffer.concat([this.getTxID(), this.getTxIdx()]));
}
_basicUTXOBuffer = (utxobuff) => {
this.txid = bintools.copyFrom(utxobuff, 0, 32);
this.txidx = bintools.copyFrom(utxobuff, 32, 36);
}
/**
* Takes a {@link https://github.com/feross/buffer|Buffer} containing an [[UTXO]], parses it, populates the class, and returns the length of the UTXO in bytes.
*
* @param bytes A {@link https://github.com/feross/buffer|Buffer} containing a raw [[UTXO]]
*/
fromBuffer = (utxobuff:Buffer) => {
this._basicUTXOBuffer(utxobuff);
}
/**
* Takes a base-58 string containing an [[UTXO]], parses it, populates the class, and returns the length of the UTXO in bytes.
*
* @param serialized A base-58 string containing a raw [[UTXO]]
*
* @returns The length of the raw [[UTXO]]
*
* @remarks
* unlike most fromStrings, it expects the string to be serialized in AVA format
*/
fromString = (serialized:string) => {
return this.fromBuffer( bintools.avaDeserialize(serialized) );
}
/**
* Returns a {@link https://github.com/feross/buffer|Buffer} representation of the [[UTXO]].
*/
toBuffer = ():Buffer => {
try {
let barr:Array<Buffer> = [this.txid, this.txidx];
return Buffer.concat(barr, this.txid.length + this.txidx.length)
} catch(e) {
/* istanbul ignore next */
let emsg:string = "Error - UTXO.toBuffer: " + e;
/* istanbul ignore next */
throw new Error(emsg);
}
}
/**
* Returns a base-58 representation of the [[UTXO]].
*
* @remarks
* unlike most toStrings, this returns in AVA serialization format
*/
toString = ():string => {
return bintools.avaSerialize(this.toBuffer());
}
/**
* Class for representing a single UTXO.
*
* @param serialized Optional parameter of the serialized string representing a UTXO
*/
constructor(txid?:Buffer, txidx:number = undefined) {
if(txid && typeof txidx === "number") {
this.txid = txid;
this.txidx.writeUInt32BE(txidx, 0);
}
}
}
/**
* Class for representing a single UTXO.
*/
export class SecpUTXO extends UTXO {
protected output:SecpOutput = undefined;
getOuputID = ():number => {
return this.output.getOutputID();
}
/**
* Gets the amount in the UTXO as a {@link https://github.com/indutny/bn.js/|BN}.

@@ -50,3 +167,3 @@ */

*/
getAddressIdx = (address:string):[number, boolean] => {
getAddressIdx = (address:string):number => {
return this.output.getAddressIdx(address);

@@ -59,8 +176,7 @@ }

* @param idx The index of the address
* @param tol Boolean indicating if this should be looked up in the fallback addresses (TakeItOrLeaveIt)
*
* @returns A string representing the address.
*/
getAddress = (idx:number, tol:boolean):string => {
return this.output.getAddress(idx, tol);
getAddress = (idx:number):string => {
return this.output.getAddress(idx);
}

@@ -106,6 +222,5 @@

fromBuffer = (utxobuff:Buffer) => {
this.txid = bintools.copyFrom(utxobuff, 0, 32);
this.txidx = bintools.copyFrom(utxobuff, 32, 36);
this._basicUTXOBuffer(utxobuff);
let utxoOut = bintools.copyFrom(utxobuff, 36, utxobuff.length);
this.output = SelectOutputClass(utxoOut);
this.output = SelectOutputClass(utxoOut) as SecpOutput;
this.output.fromBuffer(utxoOut);

@@ -157,3 +272,3 @@ }

*/
getSpenders = (addresses:Array<string>, asOf:BN | boolean = false):Array<string> => {
getSpenders = (addresses:Array<string>, asOf:BN = undefined):Array<string> => {
return this.output.getSpenders(addresses, asOf);

@@ -165,3 +280,3 @@ }

*/
meetsThreshold = (addresses:Array<string>, asOf:BN | boolean = false) => {
meetsThreshold = (addresses:Array<string>, asOf:BN = undefined) => {
return this.output.meetsThreshold(addresses, asOf);

@@ -173,7 +288,9 @@ }

*
* @param serialized Optional parameter of the serialized string representing a UTXO
* @param txid Optional {@link https://github.com/feross/buffer|Buffer} representing the transaction ID
* @param txidx Optional number for the transaction index
*/
constructor(serialized?:string) {
if(serialized) {
this.fromString(serialized);
constructor(txid:Buffer = undefined, txidx:number = undefined, secpoutput:SecpOutput) {
super(txid, txidx);
if(secpoutput){
this.output = secpoutput;
}

@@ -187,3 +304,3 @@ }

export class UTXOSet {
protected utxos:{[utxoid: string]: UTXO } = {};
protected utxos:{[utxoid: string]: SecpUTXO } = {};
protected addressUTXOs:{[address: string]: {[utxoid: string]: BN}} = {}; // maps address to utxoids:locktime

@@ -200,3 +317,3 @@

if(typeof utxo === 'string') {
utxoX = new UTXO(utxo);
utxoX = SelectUTXOClass(bintools.avaDeserialize(utxo));
} else {

@@ -221,11 +338,17 @@ utxoX = utxo; //forces a copy

if(typeof utxo === 'string') {
utxoX = new UTXO(utxo);
utxoX = SelectUTXOClass(bintools.avaDeserialize(utxo));
} else {
utxoX = new UTXO(utxo.toString()); //forces a copy
utxoX = SelectUTXOClass(utxo.toBuffer()); //forces a copy
}
let utxoid:string = utxoX.getUTXOID();
let secputxo;
try {
secputxo = utxoX as SecpUTXO;
} catch (e) {
return false;
}
let utxoid:string = secputxo.getUTXOID();
if(!(utxoid in this.utxos) || overwrite === true){
this.utxos[utxoid] = utxoX;
this.utxos[utxoid] = secputxo;
let addresses:{[address:string]: BN} = utxoX.getAddresses(); //gets addresses and their locktime
let addresses:{[address:string]: BN} = secputxo.getAddresses(); //gets addresses and their locktime
for(let [address, locktime] of Object.entries(addresses)){

@@ -254,7 +377,6 @@ if(!(address in this.addressUTXOs)){

let u:UTXO;
if(typeof utxos[i] === 'string'){
u = new UTXO(utxos[i] as string);
} else {
u = utxos[i] as UTXO;
u = new UTXO(u.toString()); //force copy
if(typeof utxos[i] === 'string') {
u = SelectUTXOClass(bintools.avaDeserialize(utxos[i] as string));
} else {
u = SelectUTXOClass((utxos[i] as UTXO).toBuffer()); //forces a copy
}

@@ -279,5 +401,5 @@ if(this.add(u, overwrite)){

if(typeof utxo === 'string') {
utxoX = new UTXO(utxo);
utxoX = SelectUTXOClass(bintools.avaDeserialize(utxo));
} else {
utxoX = new UTXO(utxo.toString()); //forces a copy
utxoX = SelectUTXOClass(utxo.toBuffer()); //forces a copy
}

@@ -310,7 +432,6 @@ let utxoid:string = utxoX.getUTXOID();

let u:UTXO;
if(typeof utxos[i] === 'string'){
u = new UTXO(utxos[i] as string);
} else {
u = utxos[i] as UTXO;
u = new UTXO(u.toString()); //force copy
if(typeof utxos[i] === 'string') {
u = SelectUTXOClass(bintools.avaDeserialize(utxos[i] as string));
} else {
u = SelectUTXOClass((utxos[i] as UTXO).toBuffer()); //forces a copy
}

@@ -342,5 +463,5 @@ if(this.remove(u)){

*/
getAllUTXOs = (utxoids:Array<string> | boolean = false ):Array<UTXO> => {
let results:Array<UTXO> = [];
if(typeof utxoids !== 'boolean' && Array.isArray(utxoids)){
getAllUTXOs = (utxoids:Array<string> = undefined):Array<SecpUTXO> => {
let results:Array<SecpUTXO> = [];
if(typeof utxoids !== 'undefined' && Array.isArray(utxoids)){
for(let i = 0; i < utxoids.length; i++){

@@ -364,6 +485,6 @@ if(utxoids[i] in this.utxos && !(utxoids[i] in results)){

*/
getAllUTXOStrings = (utxoids:Array<string> | boolean = false):Array<string> => {
getAllUTXOStrings = (utxoids:Array<string> = undefined):Array<string> => {
let results:Array<string> = [];
let utxos = Object.keys(this.utxos);
if(typeof utxoids !== 'boolean' && Array.isArray(utxoids)){
if(typeof utxoids !== 'undefined' && Array.isArray(utxoids)){
for(let i = 0; i < utxoids.length; i++){

@@ -432,5 +553,5 @@ if(utxoids[i] in this.utxos){

*/
getBalance = (addresses:Array<string>, assetID:Buffer|string, asOf:BN | boolean = false):BN => {
getBalance = (addresses:Array<string>, assetID:Buffer|string, asOf:BN = undefined):BN => {
let utxoids:Array<string> = this.getUTXOIDsByAddress(addresses);
let utxos:Array<UTXO> = this.getAllUTXOs(utxoids);
let utxos:Array<SecpUTXO> = this.getAllUTXOs(utxoids);
let spend:BN = new BN(0);

@@ -491,5 +612,2 @@ let asset:Buffer;

* @param threshold The number of signatures required to spend the funds in the resultant UTXO
* @param fallAddresses The fallback addresses which can spend the funds in the resultant UTXO
* @param fallLocktime The fallback locktime timestamp which is greater than the locktime and used as an expiration date for the locktime as a {@link https://github.com/indutny/bn.js/|BN}
* @param fallThreshold The fallback threshold for the number of signatures required from the fallback addresses to spend the resultant UTXO
*

@@ -499,18 +617,12 @@ * @returns An unsigned transaction created from the passed in parameters.

*/
makeUnsignedTx = (networkid:number, blockchainid:Buffer, amount:BN, toAddresses:Array<string>, fromAddresses:Array<string>, changeAddresses:Array<string>, assetID:Buffer = undefined, asOf:BN = UnixNow(), locktime:BN = new BN(0), threshold:number = 1, fallAddresses:Array<string> = undefined, fallLocktime:BN = UnixNow(), fallThreshold:number = 1):TxUnsigned => {
makeUnsignedTx = (networkid:number, blockchainid:Buffer, amount:BN, toAddresses:Array<string>, fromAddresses:Array<string>, changeAddresses:Array<string>, assetID:Buffer = undefined, asOf:BN = UnixNow(), locktime:BN = new BN(0), threshold:number = 1):TxUnsigned => {
const zero:BN = new BN(0);
let spendamount:BN = zero.clone();
let utxos:Array<UTXO> = this.getAllUTXOs(this.getUTXOIDsByAddress(fromAddresses));
let utxos:Array<SecpUTXO> = this.getAllUTXOs(this.getUTXOIDsByAddress(fromAddresses));
let change:BN = zero.clone();
let outs:Array<Output> = [];
let ins:Array<Input> = [];
let outs:Array<SecpOutput> = [];
let ins:Array<SecpInput> = [];
if(fallAddresses && assetID){
outs.push(new OutTakeOrLeave(assetID, amount, toAddresses, fallAddresses, locktime, fallLocktime, threshold, fallThreshold));
} else if(assetID) {
outs.push(new OutPayment(assetID, amount, toAddresses, locktime, threshold));
} else {
outs.push(new OutCreateAsset(amount, toAddresses, locktime, threshold))
}
outs.push(new SecpOutput(assetID, amount, toAddresses, locktime, threshold));

@@ -526,7 +638,7 @@ for(let i = 0; i < utxos.length && spendamount.lt(amount); i++){

let txidx:Buffer = utxos[i].getTxIdx();
let input:Input = new Input(txid, txidx, amt, assetID);
let input:SecpInput = new SecpInput(txid, txidx, amt, assetID);
let spenders:Array<string> = utxos[i].getSpenders(fromAddresses, asOf);
for(let j = 0; j < spenders.length; j++){
let idx:number, tol:boolean;
[idx, tol] = utxos[i].getAddressIdx(spenders[j]);
let idx:number;
idx = utxos[i].getAddressIdx(spenders[j]);
if(idx == -1){

@@ -542,3 +654,3 @@ /* istanbul ignore next */

if(assetID) {
outs.push(new OutPayment(assetID, change, changeAddresses, zero.clone(), 1));
outs.push(new SecpOutput(assetID, change, changeAddresses, zero.clone(), 1));
}

@@ -552,5 +664,6 @@ break;

} else {
break;
continue;
}
}
if(spendamount.lt(amount)){

@@ -572,3 +685,3 @@ /* istanbul ignore next */

*/
merge = (utxoset:UTXOSet, hasUTXOIDs:Array<string> | boolean = false): UTXOSet => {
merge = (utxoset:UTXOSet, hasUTXOIDs:Array<string> = undefined): UTXOSet => {
let results:UTXOSet = new UTXOSet();

@@ -684,2 +797,2 @@ let utxos1:Array<UTXO> = this.getAllUTXOs(hasUTXOIDs);

}
}
}

@@ -79,7 +79,7 @@ /**

* @param core A reference to the Slopes class
* @param baseurl Defaults to the string "/ext/subnet/platform" as the path to subnets baseurl
* @param baseurl Defaults to the string "/ext/platform" as the path to subnets baseurl
*/
constructor(core:SlopesCore, baseurl:string = "/ext/subnet/platform"){ super(core, baseurl); }
constructor(core:SlopesCore, baseurl:string = "/ext/platform"){ super(core, baseurl); }
}
export default PlatformAPI;

@@ -73,3 +73,3 @@ /**

this.addAPI("admin", AdminAPI);
this.addAPI("avm", AVMAPI, "/ext/subnet/avm", chainid);
this.addAPI("avm", AVMAPI, "/ext/bc/avm", chainid);
this.addAPI("platform", PlatformAPI);

@@ -96,6 +96,6 @@ this.addAPI("keystore", KeystoreAPI);

export {Tx, TxUnsigned} from './apis/avm/tx';
export {UTXO, UTXOSet} from './apis/avm/utxos';
export {UTXO, SecpUTXO, UTXOSet} from './apis/avm/utxos';
export {SigIdx, Signature, UnixNow, Address} from './apis/avm/types';
export {OutCreateAsset, OutPayment, OutTakeOrLeave, Output, SelectOutputClass} from './apis/avm/outputs';
export {Input} from './apis/avm/inputs';
export {SecpOutput, Output, SelectOutputClass} from './apis/avm/outputs';
export {SecpInput, Input} from './apis/avm/inputs';
export {AVMKeyPair, AVMKeyChain} from './apis/avm/keychain';

@@ -102,0 +102,0 @@

@@ -252,3 +252,3 @@ /**

*/
makeKey:(entropy:Buffer | boolean) => string;
makeKey:(entropy?:Buffer) => string;

@@ -274,3 +274,3 @@ /**

/**
* Adds the key pair to the list of the keys manages in the keychain.
* Adds the key pair to the list of the keys managed in the keychain.
*

@@ -284,2 +284,26 @@ * @param newKey A key pair of the appropriate class to be added to the keychain

/**
* Removes the key pair from the list of they keys managed in the keychain.
*
* @param key A string for the address or KPClass to remove
*
* @returns The boolean true if a key was removed.
*/
removeKey = (key:KPClass | string) => {
let kaddr:string;
if(typeof key !== "string"){
kaddr = key.getAddress();
} else if(typeof key === 'string'){
kaddr = key;
} else {
return false;
}
if(kaddr in this.keys){
delete this.keys[kaddr];
return true;
} else {
return false;
}
}
/**
* Checks if there is a key associated with the provided address.

@@ -286,0 +310,0 @@ *

@@ -106,3 +106,3 @@ /**

*/
getUTXOs: (addresses: string[], persistOpts?: boolean | PersistanceOptions) => Promise<UTXOSet>;
getUTXOs: (addresses: string[], persistOpts?: PersistanceOptions) => Promise<UTXOSet>;
/**

@@ -121,5 +121,2 @@ * Helper function which creates an unsigned transaction. For more granular control, you may create your own

* @param threshold The number of signatures required to spend the funds in the resultant UTXO
* @param fallAddresses The fallback addresses which can spend the funds in the resultant UTXO
* @param fallLocktime The fallback locktime timestamp which is greater than the locktime and used as an expiration date for the locktime as a {@link https://github.com/indutny/bn.js/|BN}
* @param fallThreshold The fallback threshold for the number of signatures required from the fallback addresses to spend the resultant UTXO
*

@@ -131,3 +128,3 @@ * @returns An unsigned transaction created from the passed in parameters.

*/
makeUnsignedTx: (utxoset: UTXOSet, amount: BN, toAddresses: string[], fromAddresses: string[], changeAddresses: string[], assetID?: string | Buffer, asOf?: BN, locktime?: BN, threshold?: number, fallAddresses?: string[], fallLocktime?: BN, fallThreshold?: number) => TxUnsigned;
makeUnsignedTx: (utxoset: UTXOSet, amount: BN, toAddresses: string[], fromAddresses: string[], changeAddresses: string[], assetID?: string | Buffer, asOf?: BN, locktime?: BN, threshold?: number) => TxUnsigned;
/**

@@ -153,3 +150,3 @@ * Helper function which takes an unsigned transaction and signs it, returning the resulting [[Tx]].

* @param core A reference to the Slopes class
* @param baseurl Defaults to the string "/ext/subnet/avm" as the path to subnets baseurl
* @param baseurl Defaults to the string "/ext/bc/avm" as the path to subnets baseurl
*/

@@ -156,0 +153,0 @@ constructor(core: SlopesCore, baseurl?: string, blockchainID?: string);

@@ -88,5 +88,5 @@ "use strict";

* @param core A reference to the Slopes class
* @param baseurl Defaults to the string "/ext/subnet/avm" as the path to subnets baseurl
* @param baseurl Defaults to the string "/ext/bc/avm" as the path to subnets baseurl
*/
constructor(core, baseurl = "/ext/subnet/avm", blockchainID = "") {
constructor(core, baseurl = "/ext/bc/avm", blockchainID = "") {
super(core, baseurl);

@@ -164,3 +164,3 @@ /**

*/
this.getUTXOs = (addresses, persistOpts = false) => __awaiter(this, void 0, void 0, function* () {
this.getUTXOs = (addresses, persistOpts = undefined) => __awaiter(this, void 0, void 0, function* () {
let params = {

@@ -202,5 +202,2 @@ "addresses": addresses

* @param threshold The number of signatures required to spend the funds in the resultant UTXO
* @param fallAddresses The fallback addresses which can spend the funds in the resultant UTXO
* @param fallLocktime The fallback locktime timestamp which is greater than the locktime and used as an expiration date for the locktime as a {@link https://github.com/indutny/bn.js/|BN}
* @param fallThreshold The fallback threshold for the number of signatures required from the fallback addresses to spend the resultant UTXO
*

@@ -212,7 +209,7 @@ * @returns An unsigned transaction created from the passed in parameters.

*/
this.makeUnsignedTx = (utxoset, amount, toAddresses, fromAddresses, changeAddresses, assetID = undefined, asOf = types_2.UnixNow(), locktime = new bn_js_1.default(0), threshold = 1, fallAddresses = undefined, fallLocktime = types_2.UnixNow(), fallThreshold = 1) => {
this.makeUnsignedTx = (utxoset, amount, toAddresses, fromAddresses, changeAddresses, assetID = undefined, asOf = types_2.UnixNow(), locktime = new bn_js_1.default(0), threshold = 1) => {
if (typeof assetID === "string") {
assetID = bintools.avaDeserialize(assetID);
}
return utxoset.makeUnsignedTx(this.core.getNetworkID(), bintools.avaDeserialize(this.blockchainID), amount, toAddresses, fromAddresses, changeAddresses, assetID, asOf, locktime, threshold, fallAddresses, fallLocktime, fallThreshold);
return utxoset.makeUnsignedTx(this.core.getNetworkID(), bintools.avaDeserialize(this.blockchainID), amount, toAddresses, fromAddresses, changeAddresses, assetID, asOf, locktime, threshold);
};

@@ -263,2 +260,2 @@ /**

exports.default = AVMAPI;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwaXMvYXZtL2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUlBLG9DQUFpQztBQUNqQyw2Q0FBaUU7QUFDakUsbUNBQWtDO0FBQ2xDLG1DQUE2QztBQUM3Qyx5Q0FBeUM7QUFDekMsNkJBQXNDO0FBQ3RDLGtEQUF1QjtBQUN2QixvRUFBNEM7QUFFNUM7O0dBRUc7QUFDSCxNQUFNLFFBQVEsR0FBRyxrQkFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBRXhDOzs7R0FHRztBQUNILE1BQWEsa0JBQWtCO0lBMEIzQjs7Ozs7Ozs7Ozs7Ozs7O09BZUc7SUFDSCxZQUFZLElBQVcsRUFBRSxZQUFvQixLQUFLLEVBQUUsU0FBbUI7UUF6QzdELFNBQUksR0FBVSxTQUFTLENBQUM7UUFDeEIsY0FBUyxHQUFXLEtBQUssQ0FBQztRQUMxQixjQUFTLEdBQWEsT0FBTyxDQUFDO1FBRXhDOztXQUVHO1FBQ0gsWUFBTyxHQUFHLEdBQVUsRUFBRTtZQUNsQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDckIsQ0FBQyxDQUFBO1FBRUQ7O1dBRUc7UUFDSCxpQkFBWSxHQUFHLEdBQVcsRUFBRTtZQUN4QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDMUIsQ0FBQyxDQUFBO1FBRUQ7O1dBRUc7UUFDSCxpQkFBWSxHQUFHLEdBQWEsRUFBRTtZQUMxQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDMUIsQ0FBQyxDQUFBO1FBbUJHLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQy9CLENBQUM7Q0FDSjtBQS9DRCxnREErQ0M7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLE1BQU8sU0FBUSxlQUFPO0lBb0x4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WUFBWSxHQUFHLFlBQVksQ0FBQTtJQUNwQyxDQUFDO0NBQ0o7QUFFRCxrQkFBZSxNQUFNLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgQVZNQVBJXG4gKi9cbmltcG9ydCBTbG9wZXNDb3JlIGZyb20gJy4uLy4uL3Nsb3Blcyc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tIFwiYnVmZmVyL1wiO1xuaW1wb3J0IHsgSlJQQ0FQSSwgUmVxdWVzdFJlc3BvbnNlRGF0YSB9IGZyb20gXCIuLi8uLi91dGlscy90eXBlc1wiO1xuaW1wb3J0IHsgVVRYT1NldCB9IGZyb20gJy4vdXR4b3MnO1xuaW1wb3J0IHsgTWVyZ2VSdWxlLCBVbml4Tm93IH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBBVk1LZXlDaGFpbiB9IGZyb20gJy4va2V5Y2hhaW4nO1xuaW1wb3J0IHsgVHhVbnNpZ25lZCwgVHggfSBmcm9tICcuL3R4JztcbmltcG9ydCBCTiBmcm9tIFwiYm4uanNcIjtcbmltcG9ydCBCaW5Ub29scyBmcm9tICcuLi8uLi91dGlscy9iaW50b29scyc7XG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5jb25zdCBiaW50b29scyA9IEJpblRvb2xzLmdldEluc3RhbmNlKCk7XG5cbi8qKlxuICogQSBjbGFzcyBmb3IgZGVmaW5pbmcgdGhlIHBlcnNpc3RhbmNlIGJlaGF2aW9yIG9mIHRoaXMgYW4gQVBJIGNhbGwuXG4gKiBcbiAqL1xuZXhwb3J0IGNsYXNzIFBlcnNpc3RhbmNlT3B0aW9ucyB7XG4gICAgcHJvdGVjdGVkIG5hbWU6c3RyaW5nID0gdW5kZWZpbmVkO1xuICAgIHByb3RlY3RlZCBvdmVyd3JpdGU6Ym9vbGVhbiA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBtZXJnZVJ1bGU6TWVyZ2VSdWxlID0gXCJ1bmlvblwiO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbmFtZXNwYWNlIG9mIHRoZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGdldE5hbWUgPSAoKTpzdHJpbmcgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG92ZXJ3cml0ZSBydWxlIG9mIHRoZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGdldE92ZXJ3cml0ZSA9ICgpOmJvb2xlYW4gPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5vdmVyd3JpdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgW1tNZXJnZVJ1bGVdXSBvZiB0aGUgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBnZXRNZXJnZVJ1bGUgPSAoKTpNZXJnZVJ1bGUgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXJnZVJ1bGU7XG4gICAgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIGRhdGFiYXNlIHRoZSBkYXRhXG4gICAgICogQHBhcmFtIG92ZXJ3cml0ZSBUcnVlIGlmIHRoZSBkYXRhIHNob3VsZCBiZSBjb21wbGV0ZXkgb3ZlcndyaXR0ZW5cbiAgICAgKiBAcGFyYW0gTWVyZ2VSdWxlIFRoZSB0eXBlIG9mIHByb2Nlc3MgdXNlZCB0byBtZXJnZSB3aXRoIGV4aXN0aW5nIGRhdGE6IFwiaW50ZXJzZWN0aW9uXCIsIFwiZGlmZmVyZW5jZVNlbGZcIiwgXCJkaWZmZXJlbmNlTmV3XCIsIFwic3ltRGlmZmVyZW5jZVwiLCBcInVuaW9uXCIsIFwidW5pb25NaW51c05ld1wiLCBcInVuaW9uTWludXNTZWxmXCJcbiAgICAgKiBcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSBtZXJnZSBydWxlcyBhcmUgYXMgZm9sbG93czpcbiAgICAgKiAgICogXCJpbnRlcnNlY3Rpb25cIiAtIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHNldFxuICAgICAqICAgKiBcImRpZmZlcmVuY2VTZWxmXCIgLSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBleGlzdGluZyBkYXRhIGFuZCBuZXcgc2V0XG4gICAgICogICAqIFwiZGlmZmVyZW5jZU5ld1wiIC0gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbmV3IGRhdGEgYW5kIHRoZSBleGlzdGluZyBzZXRcbiAgICAgKiAgICogXCJzeW1EaWZmZXJlbmNlXCIgLSB0aGUgdW5pb24gb2YgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYm90aCBzZXRzIG9mIGRhdGFcbiAgICAgKiAgICogXCJ1bmlvblwiIC0gdGhlIHVuaXF1ZSBzZXQgb2YgYWxsIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiBib3RoIHNldHNcbiAgICAgKiAgICogXCJ1bmlvbk1pbnVzTmV3XCIgLSB0aGUgdW5pcXVlIHNldCBvZiBhbGwgZWxlbWVudHMgY29udGFpbmVkIGluIGJvdGggc2V0cywgZXhjbHVkaW5nIHZhbHVlcyBvbmx5IGZvdW5kIGluIHRoZSBuZXcgc2V0XG4gICAgICogICAqIFwidW5pb25NaW51c1NlbGZcIiAtIHRoZSB1bmlxdWUgc2V0IG9mIGFsbCBlbGVtZW50cyBjb250YWluZWQgaW4gYm90aCBzZXRzLCBleGNsdWRpbmcgdmFsdWVzIG9ubHkgZm91bmQgaW4gdGhlIGV4aXN0aW5nIHNldFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5hbWU6c3RyaW5nLCBvdmVyd3JpdGU6Ym9vbGVhbiA9IGZhbHNlLCBtZXJnZVJ1bGU6TWVyZ2VSdWxlKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMub3ZlcndyaXRlID0gb3ZlcndyaXRlO1xuICAgICAgICB0aGlzLm1lcmdlUnVsZSA9IG1lcmdlUnVsZTtcbiAgICB9XG59XG5cbi8qKlxuICogQ2xhc3MgZm9yIGludGVyYWN0aW5nIHdpdGggYSBub2RlIGVuZHBvaW50IHRoYXQgaXMgdXNpbmcgdGhlIEFWTS5cbiAqIFxuICogQGNhdGVnb3J5IFJQQ0FQSXNcbiAqIFxuICogQHJlbWFya3MgVGhpcyBleHRlbmRzIHRoZSBbW0pSUENBUEldXSBjbGFzcy4gVGhpcyBjbGFzcyBzaG91bGQgbm90IGJlIGRpcmVjdGx5IGNhbGxlZC4gSW5zdGVhZCwgdXNlIHRoZSBbW1Nsb3Blcy5hZGRBUEldXSBmdW5jdGlvbiB0byByZWdpc3RlciB0aGlzIGludGVyZmFjZSB3aXRoIFNsb3Blcy5cbiAqLyBcbmNsYXNzIEFWTUFQSSBleHRlbmRzIEpSUENBUEl7XG5cbiAgICAvKipcbiAgICAgKiBAaWdub3JlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGtleWNoYWluOkFWTUtleUNoYWluID0gbmV3IEFWTUtleUNoYWluKCk7XG4gICAgcHJvdGVjdGVkIGJsb2NrY2hhaW5JRDpzdHJpbmcgPSBcIlwiO1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYmxvY2tjaGFpbklEIGFuZCByZXR1cm5zIGl0LlxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIFRoZSB0aGUgcHJvdmlkZWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgYmxvY2tjaGFpbklEXG4gICAgICovXG4gICAgZ2V0QmxvY2tjaGFpbklEID0gKCk6c3RyaW5nID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tjaGFpbklEO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYSByZWZlcmVuY2UgdG8gdGhlIGtleWNoYWluIGZvciB0aGlzIGNsYXNzLlxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIFRoZSBpbnN0YW5jZSBvZiBbW0FWTUtleUNoYWluXV0gZm9yIHRoaXMgY2xhc3NcbiAgICAgKi9cbiAgICBrZXlDaGFpbiA9ICgpOkFWTUtleUNoYWluID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5Y2hhaW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGlnbm9yZVxuICAgICAqL1xuICAgIG5ld0tleUNoYWluID0gKCk6QVZNS2V5Q2hhaW4gPT4ge1xuICAgICAgICAvL3dhcm5pbmcsIG92ZXJ3cml0ZXMgdGhlIG9sZCBrZXljaGFpblxuICAgICAgICB0aGlzLmtleWNoYWluID0gbmV3IEFWTUtleUNoYWluKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmtleWNoYWluO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXNzZXQgb2YgYSBnaXZlbiBhbW91bnQgYW5kIGFzc2lnbnMgaXQgdG8gdGhlIGFkZHJlc3MgcHJvdmlkZWQuXG4gICAgICogXG4gICAgICogQHBhcmFtIGFtb3VudCBUaGUgYW1vdW50IG9mIHRoZSBhc3NldCB0byBiZSBjcmVhdGVkLiBJZiBBbW91bnQgaXMgMTAsIGZvciBleGFtcGxlLCB0aGVyZSB3aWxsIGJlIGV4aXN0IDEwIHVuaXRzIG9mIHRoZSBuZXcgYXNzZXRcbiAgICAgKiBAcGFyYW0gYWRkcmVzcyBUaGUgYmFzZSA1OCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFkZHJlc3MgdGhhdCBob2xkcyBhbGwgdW5pdHMgb2YgdGhlIG5ldyBhc3NldCB1cG9uIGNyZWF0aW9uIG9mIHRoZSBhc3NldFxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIFJldHVybnMgYSBQcm9taXNlPHN0cmluZz4gY29udGFpbmluZyB0aGUgYmFzZSA1OCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIElEIG9mIHRoZSBuZXdseSBjcmVhdGVkIGFzc2V0LlxuICAgICAqL1xuICAgIGNyZWF0ZUFzc2V0ID0gYXN5bmMgKGFtb3VudDpudW1iZXIsIGFkZHJlc3M6c3RyaW5nKTpQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgICAgICBsZXQgcGFyYW1zID0ge1xuICAgICAgICAgICAgXCJhbW91bnRcIjogYW1vdW50LFxuICAgICAgICAgICAgXCJhZGRyZXNzXCI6IGFkZHJlc3NcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbE1ldGhvZChcImF2bS5jcmVhdGVBc3NldFwiLCBwYXJhbXMpLnRoZW4oKHJlc3BvbnNlOlJlcXVlc3RSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhW1wicmVzdWx0XCJdW1wiYXNzZXRJRFwiXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc3RhdHVzIG9mIGEgcHJvdmlkZWQgdHJhbnNhY3Rpb24gSUQgYnkgY2FsbGluZyB0aGUgbm9kZSdzIGBnZXRUeFN0YXR1c2AgbWV0aG9kLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB0eGlkIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRyYW5zYWN0aW9uIElEXG4gICAgICogXG4gICAgICogQHJldHVybnMgUmV0dXJucyBhIFByb21pc2U8c3RyaW5nPiBjb250YWluaW5nIHRoZSBzdGF0dXMgcmV0cmlldmVkIGZyb20gdGhlIG5vZGVcbiAgICAgKi9cbiAgICBnZXRUeFN0YXR1cyA9IGFzeW5jICh0eGlkOnN0cmluZyk6UHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgbGV0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgIFwidHhJRFwiOiB0eGlkXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxNZXRob2QoXCJhdm0uZ2V0VHhTdGF0dXNcIiwgcGFyYW1zKS50aGVuKChyZXNwb25zZTpSZXF1ZXN0UmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YVtcInJlc3VsdFwiXVtcInN0YXR1c1wiXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSBVVFhPcyByZWxhdGVkIHRvIHRoZSBhZGRyZXNzZXMgcHJvdmlkZWQgZnJvbSB0aGUgbm9kZSdzIGBnZXRVVFhPc2AgbWV0aG9kLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBhZGRyZXNzZXMgQW4gYXJyYXkgb2YgYWRkcmVzc2VzIGFzIHN0cmluZ3NcbiAgICAgKiBAcGFyYW0gcGVyc2lzdE9wdHMgT3B0aW9ucyBhdmFpbGFibGUgdG8gcGVyc2lzdCB0aGVzZSBVVFhPcyBpbiBsb2NhbCBzdG9yYWdlXG4gICAgICogXG4gICAgICogQHJlbWFya3MgXG4gICAgICogcGVyc2lzdE9wdHMgaXMgb3B0aW9uYWwgYW5kIG11c3QgYmUgb2YgdHlwZSBbW1BlcnNpc3RhbmNlT3B0aW9uc11dXG4gICAgICogXG4gICAgICovXG4gICAgZ2V0VVRYT3MgPSBhc3luYyAoYWRkcmVzc2VzOkFycmF5PHN0cmluZz4sIHBlcnNpc3RPcHRzOlBlcnNpc3RhbmNlT3B0aW9ucyB8IGJvb2xlYW4gPSBmYWxzZSApOlByb21pc2U8VVRYT1NldD4gPT4ge1xuICAgICAgICBsZXQgcGFyYW1zID0ge1xuICAgICAgICAgICAgXCJhZGRyZXNzZXNcIjogYWRkcmVzc2VzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxNZXRob2QoXCJhdm0uZ2V0VVRYT3NcIiwgcGFyYW1zKS50aGVuKChyZXNwb25zZTpSZXF1ZXN0UmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgICAgICBsZXQgdXR4b3M6VVRYT1NldCA9IG5ldyBVVFhPU2V0KCk7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHJlc3BvbnNlLmRhdGFbXCJyZXN1bHRcIl1bXCJ1dHhvc1wiXTtcbiAgICAgICAgICAgIGlmKHBlcnNpc3RPcHRzICYmIHR5cGVvZiBwZXJzaXN0T3B0cyA9PT0gJ29iamVjdCcpe1xuICAgICAgICAgICAgICAgIGlmKHRoaXMuZGIuaGFzKHBlcnNpc3RPcHRzLmdldE5hbWUoKSkpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZkFycmF5OkFycmF5PHN0cmluZz4gPSB0aGlzLmRiLmdldChwZXJzaXN0T3B0cy5nZXROYW1lKCkpO1xuICAgICAgICAgICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHNlbGZBcnJheSkpe1xuICAgICAgICAgICAgICAgICAgICAgICAgdXR4b3MuYWRkQXJyYXkoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZjpVVFhPU2V0ID0gbmV3IFVUWE9TZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkQXJyYXkoc2VsZkFycmF5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWVyZ2VCeVJ1bGUodXR4b3MsIHBlcnNpc3RPcHRzLmdldE1lcmdlUnVsZSgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYuZ2V0QWxsVVRYT1N0cmluZ3MoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmRiLnNldChwZXJzaXN0T3B0cy5nZXROYW1lKCksIGRhdGEsIHBlcnNpc3RPcHRzLmdldE92ZXJ3cml0ZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHV0eG9zLmFkZEFycmF5KGRhdGEpO1xuICAgICAgICAgICAgcmV0dXJuIHV0eG9zO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gd2hpY2ggY3JlYXRlcyBhbiB1bnNpZ25lZCB0cmFuc2FjdGlvbi4gRm9yIG1vcmUgZ3JhbnVsYXIgY29udHJvbCwgeW91IG1heSBjcmVhdGUgeW91ciBvd25cbiAgICAgKiBbW1R4VW5zaWduZWRdXSBtYW51YWxseSAod2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIFtbSW5wdXRdXXMgYW5kIFtbT3V0cHV0XV1zLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB1dHhvc2V0IEEgc2V0IG9mIFVUWE9zIHRoYXQgdGhlIHRyYW5zYWN0aW9uIGlzIGJ1aWx0IG9uXG4gICAgICogQHBhcmFtIGFtb3VudCBUaGUgYW1vdW50IG9mIEFWQSB0byBiZSBzcGVudCBpbiBOYW5vQVZBXG4gICAgICogQHBhcmFtIHRvQWRkcmVzc2VzIFRoZSBhZGRyZXNzZXMgdG8gc2VuZCB0aGUgZnVuZHNcbiAgICAgKiBAcGFyYW0gZnJvbUFkZHJlc3NlcyBUaGUgYWRkcmVzc2VzIGJlaW5nIHVzZWQgdG8gc2VuZCB0aGUgZnVuZHMgZnJvbSB0aGUgVVRYT3MgcHJvdmlkZWRcbiAgICAgKiBAcGFyYW0gY2hhbmdlQWRkcmVzc2VzIFRoZSBhZGRyZXNzZXMgdGhhdCBjYW4gc3BlbmQgdGhlIGNoYW5nZSByZW1haW5pbmcgZnJvbSB0aGUgc3BlbnQgVVRYT3NcbiAgICAgKiBAcGFyYW0gYXNzZXRJRCBUaGUgYXNzZXRJRCBvZiB0aGUgdmFsdWUgYmVpbmcgc2VudFxuICAgICAqIEBwYXJhbSBhc09mIFRoZSB0aW1lc3RhbXAgdG8gdmVyaWZ5IHRoZSB0cmFuc2FjdGlvbiBhZ2FpbnN0IGFzIGEge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9pbmR1dG55L2JuLmpzL3xCTn1cbiAgICAgKiBAcGFyYW0gbG9ja3RpbWUgVGhlIGxvY2t0aW1lIGZpZWxkIGNyZWF0ZWQgaW4gdGhlIHJlc3VsdGluZyBvdXRwdXRzXG4gICAgICogQHBhcmFtIHRocmVzaG9sZCBUaGUgbnVtYmVyIG9mIHNpZ25hdHVyZXMgcmVxdWlyZWQgdG8gc3BlbmQgdGhlIGZ1bmRzIGluIHRoZSByZXN1bHRhbnQgVVRYT1xuICAgICAqIEBwYXJhbSBmYWxsQWRkcmVzc2VzIFRoZSBmYWxsYmFjayBhZGRyZXNzZXMgd2hpY2ggY2FuIHNwZW5kIHRoZSBmdW5kcyBpbiB0aGUgcmVzdWx0YW50IFVUWE9cbiAgICAgKiBAcGFyYW0gZmFsbExvY2t0aW1lIFRoZSBmYWxsYmFjayBsb2NrdGltZSB0aW1lc3RhbXAgd2hpY2ggaXMgZ3JlYXRlciB0aGFuIHRoZSBsb2NrdGltZSBhbmQgdXNlZCBhcyBhbiBleHBpcmF0aW9uIGRhdGUgZm9yIHRoZSBsb2NrdGltZSBhcyBhIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vaW5kdXRueS9ibi5qcy98Qk59XG4gICAgICogQHBhcmFtIGZhbGxUaHJlc2hvbGQgVGhlIGZhbGxiYWNrIHRocmVzaG9sZCBmb3IgdGhlIG51bWJlciBvZiBzaWduYXR1cmVzIHJlcXVpcmVkIGZyb20gdGhlIGZhbGxiYWNrIGFkZHJlc3NlcyB0byBzcGVuZCB0aGUgcmVzdWx0YW50IFVUWE9cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBBbiB1bnNpZ25lZCB0cmFuc2FjdGlvbiBjcmVhdGVkIGZyb20gdGhlIHBhc3NlZCBpbiBwYXJhbWV0ZXJzLlxuICAgICAqIFxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBoZWxwZXIgZXhpc3RzIGJlY2F1c2UgdGhlIGVuZHBvaW50IEFQSSBzaG91bGQgYmUgdGhlIHByaW1hcnkgcG9pbnQgb2YgZW50cnkgZm9yIG1vc3QgZnVuY3Rpb25hbGl0eS5cbiAgICAgKi9cbiAgICBtYWtlVW5zaWduZWRUeCA9IChcbiAgICAgICAgdXR4b3NldDpVVFhPU2V0LCBhbW91bnQ6Qk4sIHRvQWRkcmVzc2VzOkFycmF5PHN0cmluZz4sIGZyb21BZGRyZXNzZXM6QXJyYXk8c3RyaW5nPiwgXG4gICAgICAgIGNoYW5nZUFkZHJlc3NlczpBcnJheTxzdHJpbmc+LCBhc3NldElEOkJ1ZmZlciB8IHN0cmluZyA9IHVuZGVmaW5lZCwgYXNPZjpCTiA9IFVuaXhOb3coKSwgXG4gICAgICAgIGxvY2t0aW1lOkJOID0gbmV3IEJOKDApLCB0aHJlc2hvbGQ6bnVtYmVyID0gMSwgZmFsbEFkZHJlc3NlczpBcnJheTxzdHJpbmc+ID0gdW5kZWZpbmVkLCBcbiAgICAgICAgZmFsbExvY2t0aW1lOkJOID0gVW5peE5vdygpLCBmYWxsVGhyZXNob2xkOm51bWJlciA9IDFcbiAgICApOlR4VW5zaWduZWQgPT4ge1xuICAgICAgICBpZih0eXBlb2YgYXNzZXRJRCA9PT0gXCJzdHJpbmdcIil7XG4gICAgICAgICAgICBhc3NldElEID0gYmludG9vbHMuYXZhRGVzZXJpYWxpemUoYXNzZXRJRCk7XG4gICAgICAgIH0gXG4gICAgICAgIHJldHVybiB1dHhvc2V0Lm1ha2VVbnNpZ25lZFR4KFxuICAgICAgICAgICAgdGhpcy5jb3JlLmdldE5ldHdvcmtJRCgpLCBiaW50b29scy5hdmFEZXNlcmlhbGl6ZSh0aGlzLmJsb2NrY2hhaW5JRCksIFxuICAgICAgICAgICAgYW1vdW50LCB0b0FkZHJlc3NlcywgZnJvbUFkZHJlc3NlcywgY2hhbmdlQWRkcmVzc2VzLCBcbiAgICAgICAgICAgIGFzc2V0SUQsIGFzT2YsIGxvY2t0aW1lLCB0aHJlc2hvbGQsIFxuICAgICAgICAgICAgZmFsbEFkZHJlc3NlcywgZmFsbExvY2t0aW1lLCBmYWxsVGhyZXNob2xkXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIHdoaWNoIHRha2VzIGFuIHVuc2lnbmVkIHRyYW5zYWN0aW9uIGFuZCBzaWducyBpdCwgcmV0dXJuaW5nIHRoZSByZXN1bHRpbmcgW1tUeF1dLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB1dHggVGhlIHVuc2lnbmVkIHRyYW5zYWN0aW9uIG9mIHR5cGUgW1tUeFVuc2lnbmVkXV1cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBBIHNpZ25lZCB0cmFuc2FjdGlvbiBvZiB0eXBlIFtbVHhdXVxuICAgICAqL1xuICAgIHNpZ25UeCA9ICh1dHg6VHhVbnNpZ25lZCk6VHggPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5rZXljaGFpbi5zaWduVHgodXR4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxscyB0aGUgbm9kZSdzIGlzc3VlVHggbWV0aG9kIGZyb20gdGhlIEFQSSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0aW5nIHRyYW5zYWN0aW9uIElEIGFzIGEgc3RyaW5nLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB0eCBBIHN0cmluZywge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyfEJ1ZmZlcn0sIG9yIFtbVHhdXSByZXByZXNlbnRpbmcgYSB0cmFuc2FjdGlvblxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIEEgUHJvbWlzZTxzdHJpbmc+IHJlcHJlc2VudGluZyB0aGUgdHJhbnNhY3Rpb24gSUQgb2YgdGhlIHBvc3RlZCB0cmFuc2FjdGlvbi5cbiAgICAgKi9cbiAgICBpc3N1ZVR4ID0gYXN5bmMgKHR4OnN0cmluZyB8IEJ1ZmZlciB8IFR4KTpQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgICAgICBsZXQgVHJhbnNhY3Rpb24gPSBuZXcgVHgoKTtcbiAgICAgICAgaWYodHlwZW9mIHR4ID09PSAnc3RyaW5nJyl7XG4gICAgICAgICAgICBUcmFuc2FjdGlvbi5mcm9tQnVmZmVyKGJpbnRvb2xzLmF2YURlc2VyaWFsaXplKHR4KSk7XG4gICAgICAgIH0gZWxzZSBpZih0eCBpbnN0YW5jZW9mIEJ1ZmZlcil7XG4gICAgICAgICAgICBUcmFuc2FjdGlvbi5mcm9tQnVmZmVyKHR4KTtcbiAgICAgICAgfSBlbHNlIGlmKHR4IGluc3RhbmNlb2YgVHgpIHtcbiAgICAgICAgICAgIFRyYW5zYWN0aW9uID0gdHg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXJyb3IgLSBhdm0uaXNzdWVUeDogcHJvdmlkZWQgdHggaXMgbm90IGV4cGVjdGVkIHR5cGUgb2Ygc3RyaW5nLCBCdWZmZXIsIG9yIFR4XCIpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwYXJhbXMgPSB7XG4gICAgICAgICAgICBcIlR4XCI6IFRyYW5zYWN0aW9uLnRvU3RyaW5nKClcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbE1ldGhvZChcImF2bS5pc3N1ZVR4XCIsIHBhcmFtcykudGhlbigocmVzcG9uc2U6UmVxdWVzdFJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGFbXCJyZXN1bHRcIl1bXCJ0eElEXCJdO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBjbGFzcyBzaG91bGQgbm90IGJlIGluc3RhbnRpYXRlZCBkaXJlY3RseS4gSW5zdGVhZCB1c2UgdGhlIFtbU2xvcGVzLmFkZEFQSV1dIG1ldGhvZC5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gY29yZSBBIHJlZmVyZW5jZSB0byB0aGUgU2xvcGVzIGNsYXNzXG4gICAgICogQHBhcmFtIGJhc2V1cmwgRGVmYXVsdHMgdG8gdGhlIHN0cmluZyBcIi9leHQvc3VibmV0L2F2bVwiIGFzIHRoZSBwYXRoIHRvIHN1Ym5ldHMgYmFzZXVybFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvcmU6U2xvcGVzQ29yZSwgYmFzZXVybDpzdHJpbmcgPSBcIi9leHQvc3VibmV0L2F2bVwiLCBibG9ja2NoYWluSUQ6c3RyaW5nID0gXCJcIil7IFxuICAgICAgICBzdXBlcihjb3JlLCBiYXNldXJsKTtcbiAgICAgICAgdGhpcy5rZXljaGFpbiA9IG5ldyBBVk1LZXlDaGFpbigpO1xuICAgICAgICB0aGlzLmJsb2NrY2hhaW5JRCA9IGJsb2NrY2hhaW5JRFxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQVZNQVBJOyJdfQ==
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwaXMvYXZtL2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUlBLG9DQUFpQztBQUNqQyw2Q0FBaUU7QUFDakUsbUNBQWtDO0FBQ2xDLG1DQUE2QztBQUM3Qyx5Q0FBeUM7QUFDekMsNkJBQXNDO0FBQ3RDLGtEQUF1QjtBQUN2QixvRUFBNEM7QUFFNUM7O0dBRUc7QUFDSCxNQUFNLFFBQVEsR0FBRyxrQkFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBRXhDOzs7R0FHRztBQUNILE1BQWEsa0JBQWtCO0lBMEIzQjs7Ozs7Ozs7Ozs7Ozs7O09BZUc7SUFDSCxZQUFZLElBQVcsRUFBRSxZQUFvQixLQUFLLEVBQUUsU0FBbUI7UUF6QzdELFNBQUksR0FBVSxTQUFTLENBQUM7UUFDeEIsY0FBUyxHQUFXLEtBQUssQ0FBQztRQUMxQixjQUFTLEdBQWEsT0FBTyxDQUFDO1FBRXhDOztXQUVHO1FBQ0gsWUFBTyxHQUFHLEdBQVUsRUFBRTtZQUNsQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDckIsQ0FBQyxDQUFBO1FBRUQ7O1dBRUc7UUFDSCxpQkFBWSxHQUFHLEdBQVcsRUFBRTtZQUN4QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDMUIsQ0FBQyxDQUFBO1FBRUQ7O1dBRUc7UUFDSCxpQkFBWSxHQUFHLEdBQWEsRUFBRTtZQUMxQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDMUIsQ0FBQyxDQUFBO1FBbUJHLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQy9CLENBQUM7Q0FDSjtBQS9DRCxnREErQ0M7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLE1BQU8sU0FBUSxlQUFPO0lBK0t4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IEFWTUFQSVxuICovXG5pbXBvcnQgU2xvcGVzQ29yZSBmcm9tICcuLi8uLi9zbG9wZXMnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSBcImJ1ZmZlci9cIjtcbmltcG9ydCB7IEpSUENBUEksIFJlcXVlc3RSZXNwb25zZURhdGEgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdHlwZXNcIjtcbmltcG9ydCB7IFVUWE9TZXQgfSBmcm9tICcuL3V0eG9zJztcbmltcG9ydCB7IE1lcmdlUnVsZSwgVW5peE5vdyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgQVZNS2V5Q2hhaW4gfSBmcm9tICcuL2tleWNoYWluJztcbmltcG9ydCB7IFR4VW5zaWduZWQsIFR4IH0gZnJvbSAnLi90eCc7XG5pbXBvcnQgQk4gZnJvbSBcImJuLmpzXCI7XG5pbXBvcnQgQmluVG9vbHMgZnJvbSAnLi4vLi4vdXRpbHMvYmludG9vbHMnO1xuXG4vKipcbiAqIEBpZ25vcmVcbiAqL1xuY29uc3QgYmludG9vbHMgPSBCaW5Ub29scy5nZXRJbnN0YW5jZSgpO1xuXG4vKipcbiAqIEEgY2xhc3MgZm9yIGRlZmluaW5nIHRoZSBwZXJzaXN0YW5jZSBiZWhhdmlvciBvZiB0aGlzIGFuIEFQSSBjYWxsLlxuICogXG4gKi9cbmV4cG9ydCBjbGFzcyBQZXJzaXN0YW5jZU9wdGlvbnMge1xuICAgIHByb3RlY3RlZCBuYW1lOnN0cmluZyA9IHVuZGVmaW5lZDtcbiAgICBwcm90ZWN0ZWQgb3ZlcndyaXRlOmJvb2xlYW4gPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgbWVyZ2VSdWxlOk1lcmdlUnVsZSA9IFwidW5pb25cIjtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG5hbWVzcGFjZSBvZiB0aGUgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBnZXROYW1lID0gKCk6c3RyaW5nID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBvdmVyd3JpdGUgcnVsZSBvZiB0aGUgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBnZXRPdmVyd3JpdGUgPSAoKTpib29sZWFuID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3ZlcndyaXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIFtbTWVyZ2VSdWxlXV0gb2YgdGhlIGluc3RhbmNlXG4gICAgICovXG4gICAgZ2V0TWVyZ2VSdWxlID0gKCk6TWVyZ2VSdWxlID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVyZ2VSdWxlO1xuICAgIH1cbiAgICBcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZXNwYWNlIG9mIHRoZSBkYXRhYmFzZSB0aGUgZGF0YVxuICAgICAqIEBwYXJhbSBvdmVyd3JpdGUgVHJ1ZSBpZiB0aGUgZGF0YSBzaG91bGQgYmUgY29tcGxldGV5IG92ZXJ3cml0dGVuXG4gICAgICogQHBhcmFtIE1lcmdlUnVsZSBUaGUgdHlwZSBvZiBwcm9jZXNzIHVzZWQgdG8gbWVyZ2Ugd2l0aCBleGlzdGluZyBkYXRhOiBcImludGVyc2VjdGlvblwiLCBcImRpZmZlcmVuY2VTZWxmXCIsIFwiZGlmZmVyZW5jZU5ld1wiLCBcInN5bURpZmZlcmVuY2VcIiwgXCJ1bmlvblwiLCBcInVuaW9uTWludXNOZXdcIiwgXCJ1bmlvbk1pbnVzU2VsZlwiXG4gICAgICogXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGUgbWVyZ2UgcnVsZXMgYXJlIGFzIGZvbGxvd3M6XG4gICAgICogICAqIFwiaW50ZXJzZWN0aW9uXCIgLSB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSBzZXRcbiAgICAgKiAgICogXCJkaWZmZXJlbmNlU2VsZlwiIC0gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZXhpc3RpbmcgZGF0YSBhbmQgbmV3IHNldFxuICAgICAqICAgKiBcImRpZmZlcmVuY2VOZXdcIiAtIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG5ldyBkYXRhIGFuZCB0aGUgZXhpc3Rpbmcgc2V0XG4gICAgICogICAqIFwic3ltRGlmZmVyZW5jZVwiIC0gdGhlIHVuaW9uIG9mIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGJvdGggc2V0cyBvZiBkYXRhXG4gICAgICogICAqIFwidW5pb25cIiAtIHRoZSB1bmlxdWUgc2V0IG9mIGFsbCBlbGVtZW50cyBjb250YWluZWQgaW4gYm90aCBzZXRzXG4gICAgICogICAqIFwidW5pb25NaW51c05ld1wiIC0gdGhlIHVuaXF1ZSBzZXQgb2YgYWxsIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiBib3RoIHNldHMsIGV4Y2x1ZGluZyB2YWx1ZXMgb25seSBmb3VuZCBpbiB0aGUgbmV3IHNldFxuICAgICAqICAgKiBcInVuaW9uTWludXNTZWxmXCIgLSB0aGUgdW5pcXVlIHNldCBvZiBhbGwgZWxlbWVudHMgY29udGFpbmVkIGluIGJvdGggc2V0cywgZXhjbHVkaW5nIHZhbHVlcyBvbmx5IGZvdW5kIGluIHRoZSBleGlzdGluZyBzZXRcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihuYW1lOnN0cmluZywgb3ZlcndyaXRlOmJvb2xlYW4gPSBmYWxzZSwgbWVyZ2VSdWxlOk1lcmdlUnVsZSkge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLm92ZXJ3cml0ZSA9IG92ZXJ3cml0ZTtcbiAgICAgICAgdGhpcy5tZXJnZVJ1bGUgPSBtZXJnZVJ1bGU7XG4gICAgfVxufVxuXG4vKipcbiAqIENsYXNzIGZvciBpbnRlcmFjdGluZyB3aXRoIGEgbm9kZSBlbmRwb2ludCB0aGF0IGlzIHVzaW5nIHRoZSBBVk0uXG4gKiBcbiAqIEBjYXRlZ29yeSBSUENBUElzXG4gKiBcbiAqIEByZW1hcmtzIFRoaXMgZXh0ZW5kcyB0aGUgW1tKUlBDQVBJXV0gY2xhc3MuIFRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBiZSBkaXJlY3RseSBjYWxsZWQuIEluc3RlYWQsIHVzZSB0aGUgW1tTbG9wZXMuYWRkQVBJXV0gZnVuY3Rpb24gdG8gcmVnaXN0ZXIgdGhpcyBpbnRlcmZhY2Ugd2l0aCBTbG9wZXMuXG4gKi8gXG5jbGFzcyBBVk1BUEkgZXh0ZW5kcyBKUlBDQVBJe1xuXG4gICAgLyoqXG4gICAgICogQGlnbm9yZVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBrZXljaGFpbjpBVk1LZXlDaGFpbiA9IG5ldyBBVk1LZXlDaGFpbigpO1xuICAgIHByb3RlY3RlZCBibG9ja2NoYWluSUQ6c3RyaW5nID0gXCJcIjtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGJsb2NrY2hhaW5JRCBhbmQgcmV0dXJucyBpdC5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBUaGUgdGhlIHByb3ZpZGVkIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGJsb2NrY2hhaW5JRFxuICAgICAqL1xuICAgIGdldEJsb2NrY2hhaW5JRCA9ICgpOnN0cmluZyA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmJsb2NrY2hhaW5JRDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSBrZXljaGFpbiBmb3IgdGhpcyBjbGFzcy5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBUaGUgaW5zdGFuY2Ugb2YgW1tBVk1LZXlDaGFpbl1dIGZvciB0aGlzIGNsYXNzXG4gICAgICovXG4gICAga2V5Q2hhaW4gPSAoKTpBVk1LZXlDaGFpbiA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmtleWNoYWluO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpZ25vcmVcbiAgICAgKi9cbiAgICBuZXdLZXlDaGFpbiA9ICgpOkFWTUtleUNoYWluID0+IHtcbiAgICAgICAgLy93YXJuaW5nLCBvdmVyd3JpdGVzIHRoZSBvbGQga2V5Y2hhaW5cbiAgICAgICAgdGhpcy5rZXljaGFpbiA9IG5ldyBBVk1LZXlDaGFpbigpO1xuICAgICAgICByZXR1cm4gdGhpcy5rZXljaGFpbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFzc2V0IG9mIGEgZ2l2ZW4gYW1vdW50IGFuZCBhc3NpZ25zIGl0IHRvIHRoZSBhZGRyZXNzIHByb3ZpZGVkLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBhbW91bnQgVGhlIGFtb3VudCBvZiB0aGUgYXNzZXQgdG8gYmUgY3JlYXRlZC4gSWYgQW1vdW50IGlzIDEwLCBmb3IgZXhhbXBsZSwgdGhlcmUgd2lsbCBiZSBleGlzdCAxMCB1bml0cyBvZiB0aGUgbmV3IGFzc2V0XG4gICAgICogQHBhcmFtIGFkZHJlc3MgVGhlIGJhc2UgNTggc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhZGRyZXNzIHRoYXQgaG9sZHMgYWxsIHVuaXRzIG9mIHRoZSBuZXcgYXNzZXQgdXBvbiBjcmVhdGlvbiBvZiB0aGUgYXNzZXRcbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBSZXR1cm5zIGEgUHJvbWlzZTxzdHJpbmc+IGNvbnRhaW5pbmcgdGhlIGJhc2UgNTggc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBJRCBvZiB0aGUgbmV3bHkgY3JlYXRlZCBhc3NldC5cbiAgICAgKi9cbiAgICBjcmVhdGVBc3NldCA9IGFzeW5jIChhbW91bnQ6bnVtYmVyLCBhZGRyZXNzOnN0cmluZyk6UHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgbGV0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgIFwiYW1vdW50XCI6IGFtb3VudCxcbiAgICAgICAgICAgIFwiYWRkcmVzc1wiOiBhZGRyZXNzXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxNZXRob2QoXCJhdm0uY3JlYXRlQXNzZXRcIiwgcGFyYW1zKS50aGVuKChyZXNwb25zZTpSZXF1ZXN0UmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YVtcInJlc3VsdFwiXVtcImFzc2V0SURcIl07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHN0YXR1cyBvZiBhIHByb3ZpZGVkIHRyYW5zYWN0aW9uIElEIGJ5IGNhbGxpbmcgdGhlIG5vZGUncyBgZ2V0VHhTdGF0dXNgIG1ldGhvZC5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gdHhpZCBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbiBJRFxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIFJldHVybnMgYSBQcm9taXNlPHN0cmluZz4gY29udGFpbmluZyB0aGUgc3RhdHVzIHJldHJpZXZlZCBmcm9tIHRoZSBub2RlXG4gICAgICovXG4gICAgZ2V0VHhTdGF0dXMgPSBhc3luYyAodHhpZDpzdHJpbmcpOlByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgICAgIGxldCBwYXJhbXMgPSB7XG4gICAgICAgICAgICBcInR4SURcIjogdHhpZFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxsTWV0aG9kKFwiYXZtLmdldFR4U3RhdHVzXCIsIHBhcmFtcykudGhlbigocmVzcG9uc2U6UmVxdWVzdFJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGFbXCJyZXN1bHRcIl1bXCJzdGF0dXNcIl07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgVVRYT3MgcmVsYXRlZCB0byB0aGUgYWRkcmVzc2VzIHByb3ZpZGVkIGZyb20gdGhlIG5vZGUncyBgZ2V0VVRYT3NgIG1ldGhvZC5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gYWRkcmVzc2VzIEFuIGFycmF5IG9mIGFkZHJlc3NlcyBhcyBzdHJpbmdzXG4gICAgICogQHBhcmFtIHBlcnNpc3RPcHRzIE9wdGlvbnMgYXZhaWxhYmxlIHRvIHBlcnNpc3QgdGhlc2UgVVRYT3MgaW4gbG9jYWwgc3RvcmFnZVxuICAgICAqIFxuICAgICAqIEByZW1hcmtzIFxuICAgICAqIHBlcnNpc3RPcHRzIGlzIG9wdGlvbmFsIGFuZCBtdXN0IGJlIG9mIHR5cGUgW1tQZXJzaXN0YW5jZU9wdGlvbnNdXVxuICAgICAqIFxuICAgICAqL1xuICAgIGdldFVUWE9zID0gYXN5bmMgKGFkZHJlc3NlczpBcnJheTxzdHJpbmc+LCBwZXJzaXN0T3B0czpQZXJzaXN0YW5jZU9wdGlvbnMgPSB1bmRlZmluZWQgKTpQcm9taXNlPFVUWE9TZXQ+ID0+IHtcbiAgICAgICAgbGV0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgIFwiYWRkcmVzc2VzXCI6IGFkZHJlc3Nlc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxsTWV0aG9kKFwiYXZtLmdldFVUWE9zXCIsIHBhcmFtcykudGhlbigocmVzcG9uc2U6UmVxdWVzdFJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICAgICAgbGV0IHV0eG9zOlVUWE9TZXQgPSBuZXcgVVRYT1NldCgpO1xuICAgICAgICAgICAgbGV0IGRhdGEgPSByZXNwb25zZS5kYXRhW1wicmVzdWx0XCJdW1widXR4b3NcIl07XG4gICAgICAgICAgICBpZihwZXJzaXN0T3B0cyAmJiB0eXBlb2YgcGVyc2lzdE9wdHMgPT09ICdvYmplY3QnKXtcbiAgICAgICAgICAgICAgICBpZih0aGlzLmRiLmhhcyhwZXJzaXN0T3B0cy5nZXROYW1lKCkpKXtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGZBcnJheTpBcnJheTxzdHJpbmc+ID0gdGhpcy5kYi5nZXQocGVyc2lzdE9wdHMuZ2V0TmFtZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShzZWxmQXJyYXkpKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHV0eG9zLmFkZEFycmF5KGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGY6VVRYT1NldCA9IG5ldyBVVFhPU2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZEFycmF5KHNlbGZBcnJheSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1lcmdlQnlSdWxlKHV0eG9zLCBwZXJzaXN0T3B0cy5nZXRNZXJnZVJ1bGUoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLmdldEFsbFVUWE9TdHJpbmdzKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5kYi5zZXQocGVyc2lzdE9wdHMuZ2V0TmFtZSgpLCBkYXRhLCBwZXJzaXN0T3B0cy5nZXRPdmVyd3JpdGUoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1dHhvcy5hZGRBcnJheShkYXRhKTtcbiAgICAgICAgICAgIHJldHVybiB1dHhvcztcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIHdoaWNoIGNyZWF0ZXMgYW4gdW5zaWduZWQgdHJhbnNhY3Rpb24uIEZvciBtb3JlIGdyYW51bGFyIGNvbnRyb2wsIHlvdSBtYXkgY3JlYXRlIHlvdXIgb3duXG4gICAgICogW1tUeFVuc2lnbmVkXV0gbWFudWFsbHkgKHdpdGggdGhlaXIgY29ycmVzcG9uZGluZyBbW0lucHV0XV1zIGFuZCBbW091dHB1dF1dcy5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gdXR4b3NldCBBIHNldCBvZiBVVFhPcyB0aGF0IHRoZSB0cmFuc2FjdGlvbiBpcyBidWlsdCBvblxuICAgICAqIEBwYXJhbSBhbW91bnQgVGhlIGFtb3VudCBvZiBBVkEgdG8gYmUgc3BlbnQgaW4gTmFub0FWQVxuICAgICAqIEBwYXJhbSB0b0FkZHJlc3NlcyBUaGUgYWRkcmVzc2VzIHRvIHNlbmQgdGhlIGZ1bmRzXG4gICAgICogQHBhcmFtIGZyb21BZGRyZXNzZXMgVGhlIGFkZHJlc3NlcyBiZWluZyB1c2VkIHRvIHNlbmQgdGhlIGZ1bmRzIGZyb20gdGhlIFVUWE9zIHByb3ZpZGVkXG4gICAgICogQHBhcmFtIGNoYW5nZUFkZHJlc3NlcyBUaGUgYWRkcmVzc2VzIHRoYXQgY2FuIHNwZW5kIHRoZSBjaGFuZ2UgcmVtYWluaW5nIGZyb20gdGhlIHNwZW50IFVUWE9zXG4gICAgICogQHBhcmFtIGFzc2V0SUQgVGhlIGFzc2V0SUQgb2YgdGhlIHZhbHVlIGJlaW5nIHNlbnRcbiAgICAgKiBAcGFyYW0gYXNPZiBUaGUgdGltZXN0YW1wIHRvIHZlcmlmeSB0aGUgdHJhbnNhY3Rpb24gYWdhaW5zdCBhcyBhIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vaW5kdXRueS9ibi5qcy98Qk59XG4gICAgICogQHBhcmFtIGxvY2t0aW1lIFRoZSBsb2NrdGltZSBmaWVsZCBjcmVhdGVkIGluIHRoZSByZXN1bHRpbmcgb3V0cHV0c1xuICAgICAqIEBwYXJhbSB0aHJlc2hvbGQgVGhlIG51bWJlciBvZiBzaWduYXR1cmVzIHJlcXVpcmVkIHRvIHNwZW5kIHRoZSBmdW5kcyBpbiB0aGUgcmVzdWx0YW50IFVUWE9cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBBbiB1bnNpZ25lZCB0cmFuc2FjdGlvbiBjcmVhdGVkIGZyb20gdGhlIHBhc3NlZCBpbiBwYXJhbWV0ZXJzLlxuICAgICAqIFxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBoZWxwZXIgZXhpc3RzIGJlY2F1c2UgdGhlIGVuZHBvaW50IEFQSSBzaG91bGQgYmUgdGhlIHByaW1hcnkgcG9pbnQgb2YgZW50cnkgZm9yIG1vc3QgZnVuY3Rpb25hbGl0eS5cbiAgICAgKi9cbiAgICBtYWtlVW5zaWduZWRUeCA9IChcbiAgICAgICAgdXR4b3NldDpVVFhPU2V0LCBhbW91bnQ6Qk4sIHRvQWRkcmVzc2VzOkFycmF5PHN0cmluZz4sIGZyb21BZGRyZXNzZXM6QXJyYXk8c3RyaW5nPiwgXG4gICAgICAgIGNoYW5nZUFkZHJlc3NlczpBcnJheTxzdHJpbmc+LCBhc3NldElEOkJ1ZmZlciB8IHN0cmluZyA9IHVuZGVmaW5lZCwgYXNPZjpCTiA9IFVuaXhOb3coKSwgXG4gICAgICAgIGxvY2t0aW1lOkJOID0gbmV3IEJOKDApLCB0aHJlc2hvbGQ6bnVtYmVyID0gMVxuICAgICk6VHhVbnNpZ25lZCA9PiB7XG4gICAgICAgIGlmKHR5cGVvZiBhc3NldElEID09PSBcInN0cmluZ1wiKXtcbiAgICAgICAgICAgIGFzc2V0SUQgPSBiaW50b29scy5hdmFEZXNlcmlhbGl6ZShhc3NldElEKTtcbiAgICAgICAgfSBcbiAgICAgICAgcmV0dXJuIHV0eG9zZXQubWFrZVVuc2lnbmVkVHgoXG4gICAgICAgICAgICB0aGlzLmNvcmUuZ2V0TmV0d29ya0lEKCksIGJpbnRvb2xzLmF2YURlc2VyaWFsaXplKHRoaXMuYmxvY2tjaGFpbklEKSwgXG4gICAgICAgICAgICBhbW91bnQsIHRvQWRkcmVzc2VzLCBmcm9tQWRkcmVzc2VzLCBjaGFuZ2VBZGRyZXNzZXMsIFxuICAgICAgICAgICAgYXNzZXRJRCwgYXNPZiwgbG9ja3RpbWUsIHRocmVzaG9sZFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhlbHBlciBmdW5jdGlvbiB3aGljaCB0YWtlcyBhbiB1bnNpZ25lZCB0cmFuc2FjdGlvbiBhbmQgc2lnbnMgaXQsIHJldHVybmluZyB0aGUgcmVzdWx0aW5nIFtbVHhdXS5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gdXR4IFRoZSB1bnNpZ25lZCB0cmFuc2FjdGlvbiBvZiB0eXBlIFtbVHhVbnNpZ25lZF1dXG4gICAgICogXG4gICAgICogQHJldHVybnMgQSBzaWduZWQgdHJhbnNhY3Rpb24gb2YgdHlwZSBbW1R4XV1cbiAgICAgKi9cbiAgICBzaWduVHggPSAodXR4OlR4VW5zaWduZWQpOlR4ID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5Y2hhaW4uc2lnblR4KHV0eCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbHMgdGhlIG5vZGUncyBpc3N1ZVR4IG1ldGhvZCBmcm9tIHRoZSBBUEkgYW5kIHJldHVybnMgdGhlIHJlc3VsdGluZyB0cmFuc2FjdGlvbiBJRCBhcyBhIHN0cmluZy5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gdHggQSBzdHJpbmcsIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlcnxCdWZmZXJ9LCBvciBbW1R4XV0gcmVwcmVzZW50aW5nIGEgdHJhbnNhY3Rpb25cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBBIFByb21pc2U8c3RyaW5nPiByZXByZXNlbnRpbmcgdGhlIHRyYW5zYWN0aW9uIElEIG9mIHRoZSBwb3N0ZWQgdHJhbnNhY3Rpb24uXG4gICAgICovXG4gICAgaXNzdWVUeCA9IGFzeW5jICh0eDpzdHJpbmcgfCBCdWZmZXIgfCBUeCk6UHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgbGV0IFRyYW5zYWN0aW9uID0gbmV3IFR4KCk7XG4gICAgICAgIGlmKHR5cGVvZiB0eCA9PT0gJ3N0cmluZycpe1xuICAgICAgICAgICAgVHJhbnNhY3Rpb24uZnJvbUJ1ZmZlcihiaW50b29scy5hdmFEZXNlcmlhbGl6ZSh0eCkpO1xuICAgICAgICB9IGVsc2UgaWYodHggaW5zdGFuY2VvZiBCdWZmZXIpe1xuICAgICAgICAgICAgVHJhbnNhY3Rpb24uZnJvbUJ1ZmZlcih0eCk7XG4gICAgICAgIH0gZWxzZSBpZih0eCBpbnN0YW5jZW9mIFR4KSB7XG4gICAgICAgICAgICBUcmFuc2FjdGlvbiA9IHR4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycm9yIC0gYXZtLmlzc3VlVHg6IHByb3ZpZGVkIHR4IGlzIG5vdCBleHBlY3RlZCB0eXBlIG9mIHN0cmluZywgQnVmZmVyLCBvciBUeFwiKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcGFyYW1zID0ge1xuICAgICAgICAgICAgXCJUeFwiOiBUcmFuc2FjdGlvbi50b1N0cmluZygpXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxNZXRob2QoXCJhdm0uaXNzdWVUeFwiLCBwYXJhbXMpLnRoZW4oKHJlc3BvbnNlOlJlcXVlc3RSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhW1wicmVzdWx0XCJdW1widHhJRFwiXTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHkuIEluc3RlYWQgdXNlIHRoZSBbW1Nsb3Blcy5hZGRBUEldXSBtZXRob2QuXG4gICAgICogXG4gICAgICogQHBhcmFtIGNvcmUgQSByZWZlcmVuY2UgdG8gdGhlIFNsb3BlcyBjbGFzc1xuICAgICAqIEBwYXJhbSBiYXNldXJsIERlZmF1bHRzIHRvIHRoZSBzdHJpbmcgXCIvZXh0L2JjL2F2bVwiIGFzIHRoZSBwYXRoIHRvIHN1Ym5ldHMgYmFzZXVybFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvcmU6U2xvcGVzQ29yZSwgYmFzZXVybDpzdHJpbmcgPSBcIi9leHQvYmMvYXZtXCIsIGJsb2NrY2hhaW5JRDpzdHJpbmcgPSBcIlwiKXsgXG4gICAgICAgIHN1cGVyKGNvcmUsIGJhc2V1cmwpO1xuICAgICAgICB0aGlzLmtleWNoYWluID0gbmV3IEFWTUtleUNoYWluKCk7XG4gICAgICAgIHRoaXMuYmxvY2tjaGFpbklEID0gYmxvY2tjaGFpbklEXG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBBVk1BUEk7Il19

@@ -21,14 +21,10 @@ /**

export declare class Input {
protected id: Buffer;
protected txid: Buffer;
protected txidx: Buffer;
protected assetid: Buffer;
protected amount: Buffer;
protected amountValue: BN;
protected numAddr: Buffer;
protected sigIdxs: Array<SigIdx>;
protected inputid: Buffer;
/**
* Returns a function used to sort an array of [[Input]]s
*/
static comparitor: () => (a: Input, b: Input) => 0 | 1 | -1;
static comparator: () => (a: Input, b: Input) => 0 | 1 | -1;
/**

@@ -39,9 +35,5 @@ * Returns a base-58 string representation of the UTXOID this [[Input]] references.

/**
* Returns the array of [[SigIdx]] for this [[Input]]
*/
getSigIdxs: () => SigIdx[];
/**
* Returns the number for the input type of the output class.
*/
getInputType: () => number;
getInputID: () => number;
/**

@@ -54,3 +46,3 @@ * Returns the assetID of the input.

*/
protected _basicTxInBuffer: () => Buffer;
protected _basicInBuffer: () => Buffer;
/**

@@ -73,2 +65,41 @@ * Takes a {@link https://github.com/feross/buffer|Buffer} containing an [[Input]], parses it, populates the class, and returns the length of the Input in bytes.

/**
* Class representing an Input for a transaction.
*
* @param txid A {@link https://github.com/feross/buffer|Buffer} containing the transaction ID of the referenced UTXO
* @param txidx A {@link https://github.com/feross/buffer|Buffer} containing the index of the output in the transaction consumed in the [[Input]]
* @param assetID A {@link https://github.com/feross/buffer|Buffer} representing the assetID of the [[Input]]
* @param inputid A number representing the InputID of the [[Input]]
*/
constructor(txid?: Buffer, txidx?: Buffer, assetID?: Buffer, inputid?: number);
}
export declare class SecpInput extends Input {
protected amount: Buffer;
protected amountValue: BN;
protected numAddr: Buffer;
protected sigIdxs: Array<SigIdx>;
/**
* Returns the array of [[SigIdx]] for this [[Input]]
*/
getSigIdxs: () => SigIdx[];
/**
* @ignore
*/
protected _basicSecpInBuffer: () => Buffer;
/**
* Takes a {@link https://github.com/feross/buffer|Buffer} containing an [[Input]], parses it, populates the class, and returns the length of the Input in bytes.
*
* @param bytes A {@link https://github.com/feross/buffer|Buffer} containing a raw [[Input]]
*
* @returns The length of the raw [[Input]]
*/
fromBuffer: (bytes: Buffer) => number;
/**
* Returns a {@link https://github.com/feross/buffer|Buffer} representation of the [[Input]].
*/
toBuffer: () => Buffer;
/**
* Returns a base-58 representation of the [[Input]].
*/
toString: () => string;
/**
* Creates and adds a [[SigIdx]] to the [[Input]].

@@ -75,0 +106,0 @@ *

@@ -17,2 +17,3 @@ "use strict";

const bintools = bintools_1.default.getInstance();
const SECPINPUTID = 6;
/**

@@ -38,13 +39,9 @@ * Class representing an Input for a transaction.

* @param assetID A {@link https://github.com/feross/buffer|Buffer} representing the assetID of the [[Input]]
* @param amount A {@link https://github.com/indutny/bn.js/|BN} containing the amount of the output to be consumed
* @param inputid A number representing the InputID of the [[Input]]
*/
constructor(txid, txidx, amount, assetID) {
this.id = buffer_1.Buffer.alloc(4);
constructor(txid, txidx, assetID, inputid) {
this.txid = buffer_1.Buffer.alloc(32);
this.txidx = buffer_1.Buffer.alloc(4);
this.assetid = buffer_1.Buffer.alloc(32);
this.amount = buffer_1.Buffer.alloc(8);
this.amountValue = new bn_js_1.default(0);
this.numAddr = buffer_1.Buffer.alloc(4);
this.sigIdxs = []; // idxs of signers from utxo
this.inputid = buffer_1.Buffer.alloc(4);
/**

@@ -57,12 +54,6 @@ * Returns a base-58 string representation of the UTXOID this [[Input]] references.

/**
* Returns the array of [[SigIdx]] for this [[Input]]
*/
this.getSigIdxs = () => {
return this.sigIdxs;
};
/**
* Returns the number for the input type of the output class.
*/
this.getInputType = () => {
return this.id.readUInt32BE(0);
this.getInputID = () => {
return this.inputid.readUInt32BE(0);
};

@@ -78,7 +69,93 @@ /**

*/
this._basicTxInBuffer = () => {
this._basicInBuffer = () => {
try {
let bsize = this.txid.length + this.txidx.length + this.assetid.length + this.inputid.length;
let barr = [this.txid, this.txidx, this.assetid, this.inputid];
let buff = buffer_1.Buffer.concat(barr, bsize);
return buff;
}
catch (e) {
/* istanbul ignore next */
let emsg = "Error - TxOut._basicTxBuffer: " + e;
/* istanbul ignore next */
throw new Error(emsg);
}
};
/**
* Takes a {@link https://github.com/feross/buffer|Buffer} containing an [[Input]], parses it, populates the class, and returns the length of the Input in bytes.
*
* @param bytes A {@link https://github.com/feross/buffer|Buffer} containing a raw [[Input]]
*
* @returns The length of the raw [[Input]]
*/
this.fromBuffer = (bytes) => {
let offset = 0;
this.txid = bintools.copyFrom(bytes, offset, offset + 32);
offset += 32;
this.txidx = bintools.copyFrom(bytes, offset, offset + 4);
offset += 4;
this.assetid = bintools.copyFrom(bytes, offset, offset + 32);
offset += 32;
this.inputid = bintools.copyFrom(bytes, offset, offset + 4);
offset += 4;
return offset;
};
/**
* Returns a {@link https://github.com/feross/buffer|Buffer} representation of the [[Input]].
*/
this.toBuffer = () => {
return this._basicInBuffer();
};
/**
* Returns a base-58 representation of the [[Input]].
*/
this.toString = () => {
return bintools.bufferToB58(this.toBuffer());
};
if (txid && txidx && assetID && inputid) {
this.inputid.writeUInt32BE(inputid, 0);
this.txid = txid;
this.txidx = txidx;
this.assetid = assetID;
}
}
}
exports.Input = Input;
/**
* Returns a function used to sort an array of [[Input]]s
*/
Input.comparator = () => {
return function (a, b) {
return buffer_1.Buffer.compare(a.toBuffer(), b.toBuffer());
};
};
class SecpInput extends Input {
/**
* Class representing an Input for a transaction.
*
* @param txid A {@link https://github.com/feross/buffer|Buffer} containing the transaction ID of the referenced UTXO
* @param txidx A {@link https://github.com/feross/buffer|Buffer} containing the index of the output in the transaction consumed in the [[Input]]
* @param assetID A {@link https://github.com/feross/buffer|Buffer} representing the assetID of the [[Input]]
* @param amount A {@link https://github.com/indutny/bn.js/|BN} containing the amount of the output to be consumed
*/
constructor(txid, txidx, amount, assetID) {
super(txid, txidx, assetID, types_1.Constants.SECPINPUTID);
this.amount = buffer_1.Buffer.alloc(8);
this.amountValue = new bn_js_1.default(0);
this.numAddr = buffer_1.Buffer.alloc(4);
this.sigIdxs = []; // idxs of signers from utxo
/**
* Returns the array of [[SigIdx]] for this [[Input]]
*/
this.getSigIdxs = () => {
return this.sigIdxs;
};
/**
* @ignore
*/
this._basicSecpInBuffer = () => {
try {
this.numAddr.writeUInt32BE(this.sigIdxs.length, 0);
let bsize = this.id.length + this.txid.length + this.txidx.length + this.assetid.length + this.amount.length + this.numAddr.length;
let barr = [this.id, this.txid, this.txidx, this.assetid, this.amount, this.numAddr];
let bsize = this.amount.length + this.numAddr.length;
let barr = [this.amount, this.numAddr];
for (let i = 0; i < this.sigIdxs.length; i++) {

@@ -108,10 +185,2 @@ let b = this.sigIdxs[i].toBuffer();

let offset = 0;
this.id = bintools.copyFrom(bytes, offset, offset + 4);
offset += 4;
this.txid = bintools.copyFrom(bytes, offset, offset + 32);
offset += 32;
this.txidx = bintools.copyFrom(bytes, offset, offset + 4);
offset += 4;
this.assetid = bintools.copyFrom(bytes, offset, offset + 32);
offset += 32;
this.amount = bintools.copyFrom(bytes, offset, offset + 8);

@@ -136,3 +205,5 @@ offset += 8;

this.toBuffer = () => {
return this._basicTxInBuffer();
let basicin = this._basicInBuffer();
let secp = this._basicSecpInBuffer();
return buffer_1.Buffer.concat([basicin, secp]);
};

@@ -161,3 +232,3 @@ /**

if (txid && txidx && amount && assetID) {
this.id.writeUInt32BE(0, 0);
this.inputid.writeUInt32BE(types_1.Constants.SECPINPUTID, 0);
this.txid = txid;

@@ -172,11 +243,3 @@ this.txidx = txidx;

}
exports.Input = Input;
/**
* Returns a function used to sort an array of [[Input]]s
*/
Input.comparitor = () => {
return function (a, b) {
return buffer_1.Buffer.compare(a.toBuffer(), b.toBuffer());
};
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwaXMvYXZtL2lucHV0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBOztHQUVHO0FBQ0gsb0NBQStCO0FBQy9CLG9FQUE0QztBQUM1QyxrREFBdUI7QUFDdkIsbUNBQWlDO0FBRWpDOztHQUVHO0FBQ0gsTUFBTSxRQUFRLEdBQUcsa0JBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUV4Qzs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFhLEtBQUs7SUFxSWQ7Ozs7Ozs7T0FPRztJQUNILFlBQVksSUFBWSxFQUFFLEtBQWEsRUFBRSxNQUFVLEVBQUUsT0FBZTtRQTVJMUQsT0FBRSxHQUFVLGVBQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsU0FBSSxHQUFVLGVBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0IsVUFBSyxHQUFVLGVBQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsWUFBTyxHQUFVLGVBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEMsV0FBTSxHQUFVLGVBQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEMsZ0JBQVcsR0FBTSxJQUFJLGVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixZQUFPLEdBQVUsZUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxZQUFPLEdBQWlCLEVBQUUsQ0FBQyxDQUFDLDRCQUE0QjtRQVdsRTs7V0FFRztRQUNILGNBQVMsR0FBRyxHQUFVLEVBQUU7WUFDcEIsT0FBTyxRQUFRLENBQUMsV0FBVyxDQUFDLGVBQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEUsQ0FBQyxDQUFB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R0FBa0MsRUFBRTtJQUNwRCxPQUFPLFVBQVMsQ0FBTyxFQUFFLENBQU87UUFDNUIsT0FBTyxlQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQWEsQ0FBQztJQUNsRSxDQUFDLENBQUE7QUFDTCxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgQVZNQVBJXG4gKi9cbmltcG9ydCB7QnVmZmVyfSBmcm9tIFwiYnVmZmVyL1wiO1xuaW1wb3J0IEJpblRvb2xzIGZyb20gJy4uLy4uL3V0aWxzL2JpbnRvb2xzJztcbmltcG9ydCBCTiBmcm9tIFwiYm4uanNcIjtcbmltcG9ydCB7IFNpZ0lkeCB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIEBpZ25vcmVcbiAqL1xuY29uc3QgYmludG9vbHMgPSBCaW5Ub29scy5nZXRJbnN0YW5jZSgpO1xuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBhbiBJbnB1dCBmb3IgYSB0cmFuc2FjdGlvbi5cbiAqIFxuICogQHJlbWFya3MgXG4gKiBJbnB1dDpcbiAqIE9iamVjdElEIHwgMDQgYnl0ZXNcbiAqIFR4SUQgICAgIHwgMzIgYnl0ZXNcbiAqIFR4SW5kZXggIHwgMDQgYnl0ZXNcbiAqIEFtb3VudCAgIHwgMDggYnl0ZXNcbiAqIE51bVNpZ3MgIHwgMDQgYnl0ZXNcbiAqIFJlcGVhdGVkIChOdW1TaWdzKTpcbiAqICAgICBTaWdJZHggIHwgMDQgYnl0ZXNcbiAqL1xuZXhwb3J0IGNsYXNzIElucHV0IHtcbiAgICBwcm90ZWN0ZWQgaWQ6QnVmZmVyID0gQnVmZmVyLmFsbG9jKDQpO1xuICAgIHByb3RlY3RlZCB0eGlkOkJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygzMik7XG4gICAgcHJvdGVjdGVkIHR4aWR4OkJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgICBwcm90ZWN0ZWQgYXNzZXRpZDpCdWZmZXIgPSBCdWZmZXIuYWxsb2MoMzIpO1xuICAgIHByb3RlY3RlZCBhbW91bnQ6QnVmZmVyID0gQnVmZmVyLmFsbG9jKDgpO1xuICAgIHByb3RlY3RlZCBhbW91bnRWYWx1ZTpCTiA9IG5ldyBCTigwKTtcbiAgICBwcm90ZWN0ZWQgbnVtQWRkcjpCdWZmZXIgPSBCdWZmZXIuYWxsb2MoNCk7XG4gICAgcHJvdGVjdGVkIHNpZ0lkeHM6QXJyYXk8U2lnSWR4PiA9IFtdOyAvLyBpZHhzIG9mIHNpZ25lcnMgZnJvbSB1dHhvXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgZnVuY3Rpb24gdXNlZCB0byBzb3J0IGFuIGFycmF5IG9mIFtbSW5wdXRdXXNcbiAgICAgKi9cbiAgICBzdGF0aWMgY29tcGFyaXRvciA9ICgpOihhOklucHV0LCBiOklucHV0KSA9PiAoMXwtMXwwKSA9PiB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbihhOklucHV0LCBiOklucHV0KTooMXwtMXwwKSB7IFxuICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKGEudG9CdWZmZXIoKSwgYi50b0J1ZmZlcigpKSBhcyAoMXwtMXwwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBiYXNlLTU4IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgVVRYT0lEIHRoaXMgW1tJbnB1dF1dIHJlZmVyZW5jZXMuXG4gICAgICovXG4gICAgZ2V0VVRYT0lEID0gKCk6c3RyaW5nID0+IHtcbiAgICAgICAgcmV0dXJuIGJpbnRvb2xzLmJ1ZmZlclRvQjU4KEJ1ZmZlci5jb25jYXQoW3RoaXMudHhpZCwgdGhpcy50eGlkeF0pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBbW1NpZ0lkeF1dIGZvciB0aGlzIFtbSW5wdXRdXSBcbiAgICAgKi9cbiAgICBnZXRTaWdJZHhzID0gKCk6QXJyYXk8U2lnSWR4PiA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNpZ0lkeHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIGZvciB0aGUgaW5wdXQgdHlwZSBvZiB0aGUgb3V0cHV0IGNsYXNzLlxuICAgICAqL1xuICAgIGdldElucHV0VHlwZSA9ICgpOm51bWJlciA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlkLnJlYWRVSW50MzJCRSgwKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYXNzZXRJRCBvZiB0aGUgaW5wdXQuXG4gICAgICovXG4gICAgZ2V0QXNzZXRJRCA9ICgpOkJ1ZmZlciA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFzc2V0aWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGlnbm9yZVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfYmFzaWNUeEluQnVmZmVyID0gKCk6IEJ1ZmZlciA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLm51bUFkZHIud3JpdGVVSW50MzJCRSh0aGlzLnNpZ0lkeHMubGVuZ3RoLCAwKTtcbiAgICAgICAgICAgIGxldCBic2l6ZTpudW1iZXIgPSB0aGlzLmlkLmxlbmd0aCArIHRoaXMudHhpZC5sZW5ndGggKyB0aGlzLnR4aWR4Lmxlbmd0aCArIHRoaXMuYXNzZXRpZC5sZW5ndGggKyB0aGlzLmFtb3VudC5sZW5ndGggKyB0aGlzLm51bUFkZHIubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IGJhcnI6QXJyYXk8QnVmZmVyPiA9IFt0aGlzLmlkLCB0aGlzLnR4aWQsIHRoaXMudHhpZHgsIHRoaXMuYXNzZXRpZCwgdGhpcy5hbW91bnQsIHRoaXMubnVtQWRkcl07XG4gICAgICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhpcy5zaWdJZHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGI6QnVmZmVyID0gdGhpcy5zaWdJZHhzW2ldLnRvQnVmZmVyKCk7XG4gICAgICAgICAgICAgICAgYmFyci5wdXNoKGIpO1xuICAgICAgICAgICAgICAgIGJzaXplICs9IGIubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGJ1ZmY6IEJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoYmFycixic2l6ZSk7XG4gICAgICAgICAgICByZXR1cm4gYnVmZjtcbiAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgICAgbGV0IGVtc2c6c3RyaW5nID0gXCJFcnJvciAtIFR4T3V0Ll9iYXNpY1R4QnVmZmVyOiBcIiArIGU7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVtc2cpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGFrZXMgYSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfSBjb250YWluaW5nIGFuIFtbSW5wdXRdXSwgcGFyc2VzIGl0LCBwb3B1bGF0ZXMgdGhlIGNsYXNzLCBhbmQgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBJbnB1dCBpbiBieXRlcy5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gYnl0ZXMgQSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfSBjb250YWluaW5nIGEgcmF3IFtbSW5wdXRdXVxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIFRoZSBsZW5ndGggb2YgdGhlIHJhdyBbW0lucHV0XV1cbiAgICAgKi9cbiAgICBmcm9tQnVmZmVyID0gKGJ5dGVzOkJ1ZmZlcik6bnVtYmVyID0+IHtcbiAgICAgICAgbGV0IG9mZnNldDpudW1iZXIgPSAwO1xuICAgICAgICB0aGlzLmlkID0gYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgNCk7XG4gICAgICAgIG9mZnNldCArPSA0O1xuICAgICAgICB0aGlzLnR4aWQgPSBiaW50b29scy5jb3B5RnJvbShieXRlcywgb2Zmc2V0LCBvZmZzZXQgKyAzMik7XG4gICAgICAgIG9mZnNldCArPSAzMjtcbiAgICAgICAgdGhpcy50eGlkeCA9IGJpbnRvb2xzLmNvcHlGcm9tKGJ5dGVzLCBvZmZzZXQsIG9mZnNldCArIDQpO1xuICAgICAgICBvZmZzZXQgKz0gNDtcbiAgICAgICAgdGhpcy5hc3NldGlkID0gYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgMzIpO1xuICAgICAgICBvZmZzZXQgKz0gMzI7XG4gICAgICAgIHRoaXMuYW1vdW50ID0gYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgOCk7XG4gICAgICAgIG9mZnNldCArPSA4O1xuICAgICAgICB0aGlzLmFtb3VudFZhbHVlID0gYmludG9vbHMuZnJvbUJ1ZmZlclRvQk4odGhpcy5hbW91bnQpO1xuICAgICAgICB0aGlzLm51bUFkZHIgPSBiaW50b29scy5jb3B5RnJvbShieXRlcywgb2Zmc2V0LCBvZmZzZXQgKyA0KTtcbiAgICAgICAgb2Zmc2V0ICs9IDQ7XG4gICAgICAgIGxldCBudW1hZGRyOm51bWJlciA9IHRoaXMubnVtQWRkci5yZWFkVUludDMyQkUoMCk7XG4gICAgICAgIHRoaXMuc2lnSWR4cyA9IFtdO1xuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgbnVtYWRkcjsgaSsrKXtcbiAgICAgICAgICAgIGxldCBzaWdpZHggPSBuZXcgU2lnSWR4KCk7XG4gICAgICAgICAgICBzaWdpZHguZnJvbUJ1ZmZlcihiaW50b29scy5jb3B5RnJvbShieXRlcywgb2Zmc2V0LCBvZmZzZXQgKyA0KSk7XG4gICAgICAgICAgICBvZmZzZXQgKz0gNDtcbiAgICAgICAgICAgIHRoaXMuc2lnSWR4cy5wdXNoKHNpZ2lkeCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyfEJ1ZmZlcn0gcmVwcmVzZW50YXRpb24gb2YgdGhlIFtbSW5wdXRdXS5cbiAgICAgKi9cbiAgICB0b0J1ZmZlciA9ICgpOkJ1ZmZlciA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iYXNpY1R4SW5CdWZmZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgYmFzZS01OCByZXByZXNlbnRhdGlvbiBvZiB0aGUgW1tJbnB1dF1dLlxuICAgICAqL1xuICAgIHRvU3RyaW5nID0gKCk6c3RyaW5nID0+IHtcbiAgICAgICAgcmV0dXJuIGJpbnRvb2xzLmJ1ZmZlclRvQjU4KHRoaXMudG9CdWZmZXIoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbmQgYWRkcyBhIFtbU2lnSWR4XV0gdG8gdGhlIFtbSW5wdXRdXS5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gYWRkcmVzc0lkeCBUaGUgaW5kZXggb2YgdGhlIGFkZHJlc3MgdG8gcmVmZXJlbmNlIGluIHRoZSBzaWduYXR1cmVzXG4gICAgICogQHBhcmFtIGFkZHJlc3MgVGhlIGFkZHJlc3Mgb2YgdGhlIHNvdXJjZSBvZiB0aGUgc2lnbmF0dXJlXG4gICAgICovXG4gICAgYWRkU2lnbmF0dXJlSWR4ID0gKGFkZHJlc3NJZHg6bnVtYmVyLCBhZGRyZXNzOnN0cmluZykgPT4ge1xuICAgICAgICBsZXQgc2lnaWR4OlNpZ0lkeCA9IG5ldyBTaWdJZHgoKTtcbiAgICAgICAgbGV0IGI6QnVmZmVyID0gQnVmZmVyLmFsbG9jKDQpO1xuICAgICAgICBiLndyaXRlVUludDMyQkUoYWRkcmVzc0lkeCwgMCk7XG4gICAgICAgIHNpZ2lkeC5mcm9tQnVmZmVyKGIpO1xuICAgICAgICBzaWdpZHguc2V0U291cmNlKGFkZHJlc3MpO1xuICAgICAgICB0aGlzLnNpZ0lkeHMucHVzaChzaWdpZHgpO1xuICAgICAgICB0aGlzLm51bUFkZHIud3JpdGVVSW50MzJCRSh0aGlzLnNpZ0lkeHMubGVuZ3RoLDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsYXNzIHJlcHJlc2VudGluZyBhbiBJbnB1dCBmb3IgYSB0cmFuc2FjdGlvbi5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gdHhpZCBBIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlcnxCdWZmZXJ9IGNvbnRhaW5pbmcgdGhlIHRyYW5zYWN0aW9uIElEIG9mIHRoZSByZWZlcmVuY2VkIFVUWE9cbiAgICAgKiBAcGFyYW0gdHhpZHggQSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfSBjb250YWluaW5nIHRoZSBpbmRleCBvZiB0aGUgb3V0cHV0IGluIHRoZSB0cmFuc2FjdGlvbiBjb25zdW1lZCBpbiB0aGUgW1tJbnB1dF1dXG4gICAgICogQHBhcmFtIGFzc2V0SUQgQSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfSByZXByZXNlbnRpbmcgdGhlIGFzc2V0SUQgb2YgdGhlIFtbSW5wdXRdXVxuICAgICAqIEBwYXJhbSBhbW91bnQgQSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2luZHV0bnkvYm4uanMvfEJOfSBjb250YWluaW5nIHRoZSBhbW91bnQgb2YgdGhlIG91dHB1dCB0byBiZSBjb25zdW1lZFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHR4aWQ/OkJ1ZmZlciwgdHhpZHg/OkJ1ZmZlciwgYW1vdW50PzpCTiwgYXNzZXRJRD86QnVmZmVyKSB7XG4gICAgICAgIGlmKHR4aWQgJiYgdHhpZHggJiYgYW1vdW50ICYmIGFzc2V0SUQpe1xuICAgICAgICAgICAgdGhpcy5pZC53cml0ZVVJbnQzMkJFKDAsMCk7XG4gICAgICAgICAgICB0aGlzLnR4aWQgPSB0eGlkO1xuICAgICAgICAgICAgdGhpcy50eGlkeCA9IHR4aWR4O1xuICAgICAgICAgICAgdGhpcy5hc3NldGlkID0gYXNzZXRJRDtcbiAgICAgICAgICAgIHRoaXMuYW1vdW50VmFsdWUgPSBhbW91bnQ7XG4gICAgICAgICAgICB0aGlzLmFtb3VudCA9IGJpbnRvb2xzLmZyb21CTlRvQnVmZmVyKGFtb3VudCwgOCk7XG4gICAgICAgICAgICB0aGlzLnNpZ0lkeHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICB9XG59Il19
exports.SecpInput = SecpInput;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwaXMvYXZtL2lucHV0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBOztHQUVHO0FBQ0gsb0NBQStCO0FBQy9CLG9FQUE0QztBQUM1QyxrREFBdUI7QUFDdkIsbUNBQTRDO0FBRTVDOztHQUVHO0FBQ0gsTUFBTSxRQUFRLEdBQUcsa0JBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUV4QyxNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFFdEI7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBYSxLQUFLO0lBdUZkOzs7Ozs7O09BT0c7SUFDSCxZQUFZLElBQVksRUFBRSxLQUFhLEVBQUUsT0FBZSxFQUFFLE9BQWU7UUE5Ri9ELFNBQUksR0FBVSxlQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLFVBQUssR0FBVSxlQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLFlBQU8sR0FBVSxlQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLFlBQU8sR0FBVSxlQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBVzNDOztXQUVHO1FBQ0gsY0FBUyxHQUFHLEdBQVUsRUFBRTtZQUNwQixPQUFPLFFBQVEsQ0FBQyxXQUFXLENBQUMsZUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RSxDQUFDLENBQUE7UUFFRDs7V0FFRztRQUNILGVBQVUsR0FBRyxHQUFVLEVBQUU7WUFDckIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUM7UUFFRjs7V0FFRztRQUNILGVBQVUsR0FBRyxHQUFVLEVBQUU7WUFDckIsT0FBTyxJ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QUM7WUFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFBO1FBWUcsSUFBRyxJQUFJLElBQUksS0FBSyxJQUFJLE1BQU0sSUFBSSxPQUFPLEVBQUM7WUFDbEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsaUJBQVMsQ0FBQyxXQUFXLEVBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7WUFDakIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7WUFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUM7WUFDMUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztTQUNyQjtJQUVMLENBQUM7Q0FDSjtBQW5IRCw4QkFtSEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgQVZNQVBJXG4gKi9cbmltcG9ydCB7QnVmZmVyfSBmcm9tIFwiYnVmZmVyL1wiO1xuaW1wb3J0IEJpblRvb2xzIGZyb20gJy4uLy4uL3V0aWxzL2JpbnRvb2xzJztcbmltcG9ydCBCTiBmcm9tIFwiYm4uanNcIjtcbmltcG9ydCB7IFNpZ0lkeCwgQ29uc3RhbnRzIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5jb25zdCBiaW50b29scyA9IEJpblRvb2xzLmdldEluc3RhbmNlKCk7XG5cbmNvbnN0IFNFQ1BJTlBVVElEID0gNjtcblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgYW4gSW5wdXQgZm9yIGEgdHJhbnNhY3Rpb24uXG4gKiBcbiAqIEByZW1hcmtzIFxuICogSW5wdXQ6XG4gKiBPYmplY3RJRCB8IDA0IGJ5dGVzXG4gKiBUeElEICAgICB8IDMyIGJ5dGVzXG4gKiBUeEluZGV4ICB8IDA0IGJ5dGVzXG4gKiBBbW91bnQgICB8IDA4IGJ5dGVzXG4gKiBOdW1TaWdzICB8IDA0IGJ5dGVzXG4gKiBSZXBlYXRlZCAoTnVtU2lncyk6XG4gKiAgICAgU2lnSWR4ICB8IDA0IGJ5dGVzXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnB1dCB7XG4gICAgcHJvdGVjdGVkIHR4aWQ6QnVmZmVyID0gQnVmZmVyLmFsbG9jKDMyKTtcbiAgICBwcm90ZWN0ZWQgdHhpZHg6QnVmZmVyID0gQnVmZmVyLmFsbG9jKDQpO1xuICAgIHByb3RlY3RlZCBhc3NldGlkOkJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygzMik7XG4gICAgcHJvdGVjdGVkIGlucHV0aWQ6QnVmZmVyID0gQnVmZmVyLmFsbG9jKDQpO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGZ1bmN0aW9uIHVzZWQgdG8gc29ydCBhbiBhcnJheSBvZiBbW0lucHV0XV1zXG4gICAgICovXG4gICAgc3RhdGljIGNvbXBhcmF0b3IgPSAoKTooYTpJbnB1dCwgYjpJbnB1dCkgPT4gKDF8LTF8MCkgPT4ge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24oYTpJbnB1dCwgYjpJbnB1dCk6KDF8LTF8MCkgeyBcbiAgICAgICAgICAgIHJldHVybiBCdWZmZXIuY29tcGFyZShhLnRvQnVmZmVyKCksIGIudG9CdWZmZXIoKSkgYXMgKDF8LTF8MCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgYmFzZS01OCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFVUWE9JRCB0aGlzIFtbSW5wdXRdXSByZWZlcmVuY2VzLlxuICAgICAqL1xuICAgIGdldFVUWE9JRCA9ICgpOnN0cmluZyA9PiB7XG4gICAgICAgIHJldHVybiBiaW50b29scy5idWZmZXJUb0I1OChCdWZmZXIuY29uY2F0KFt0aGlzLnR4aWQsIHRoaXMudHhpZHhdKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIGZvciB0aGUgaW5wdXQgdHlwZSBvZiB0aGUgb3V0cHV0IGNsYXNzLlxuICAgICAqL1xuICAgIGdldElucHV0SUQgPSAoKTpudW1iZXIgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnB1dGlkLnJlYWRVSW50MzJCRSgwKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYXNzZXRJRCBvZiB0aGUgaW5wdXQuXG4gICAgICovXG4gICAgZ2V0QXNzZXRJRCA9ICgpOkJ1ZmZlciA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFzc2V0aWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGlnbm9yZVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfYmFzaWNJbkJ1ZmZlciA9ICgpOiBCdWZmZXIgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGJzaXplOm51bWJlciA9IHRoaXMudHhpZC5sZW5ndGggKyB0aGlzLnR4aWR4Lmxlbmd0aCArIHRoaXMuYXNzZXRpZC5sZW5ndGggKyB0aGlzLmlucHV0aWQubGVuZ3RoIDtcbiAgICAgICAgICAgIGxldCBiYXJyOkFycmF5PEJ1ZmZlcj4gPSBbdGhpcy50eGlkLCB0aGlzLnR4aWR4LCB0aGlzLmFzc2V0aWQsIHRoaXMuaW5wdXRpZF07XG4gICAgICAgICAgICBsZXQgYnVmZjogQnVmZmVyID0gQnVmZmVyLmNvbmNhdChiYXJyLGJzaXplKTtcbiAgICAgICAgICAgIHJldHVybiBidWZmO1xuICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgICBsZXQgZW1zZzpzdHJpbmcgPSBcIkVycm9yIC0gVHhPdXQuX2Jhc2ljVHhCdWZmZXI6IFwiICsgZTtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZW1zZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUYWtlcyBhIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlcnxCdWZmZXJ9IGNvbnRhaW5pbmcgYW4gW1tJbnB1dF1dLCBwYXJzZXMgaXQsIHBvcHVsYXRlcyB0aGUgY2xhc3MsIGFuZCByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIElucHV0IGluIGJ5dGVzLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBieXRlcyBBIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlcnxCdWZmZXJ9IGNvbnRhaW5pbmcgYSByYXcgW1tJbnB1dF1dXG4gICAgICogXG4gICAgICogQHJldHVybnMgVGhlIGxlbmd0aCBvZiB0aGUgcmF3IFtbSW5wdXRdXVxuICAgICAqL1xuICAgIGZyb21CdWZmZXIgPSAoYnl0ZXM6QnVmZmVyKTpudW1iZXIgPT4ge1xuICAgICAgICBsZXQgb2Zmc2V0Om51bWJlciA9IDA7XG4gICAgICAgIHRoaXMudHhpZCA9IGJpbnRvb2xzLmNvcHlGcm9tKGJ5dGVzLCBvZmZzZXQsIG9mZnNldCArIDMyKTtcbiAgICAgICAgb2Zmc2V0ICs9IDMyO1xuICAgICAgICB0aGlzLnR4aWR4ID0gYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgNCk7XG4gICAgICAgIG9mZnNldCArPSA0O1xuICAgICAgICB0aGlzLmFzc2V0aWQgPSBiaW50b29scy5jb3B5RnJvbShieXRlcywgb2Zmc2V0LCBvZmZzZXQgKyAzMik7XG4gICAgICAgIG9mZnNldCArPSAzMjtcbiAgICAgICAgdGhpcy5pbnB1dGlkID0gYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgNCk7XG4gICAgICAgIG9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfSByZXByZXNlbnRhdGlvbiBvZiB0aGUgW1tJbnB1dF1dLlxuICAgICAqL1xuICAgIHRvQnVmZmVyID0gKCk6QnVmZmVyID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Jhc2ljSW5CdWZmZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgYmFzZS01OCByZXByZXNlbnRhdGlvbiBvZiB0aGUgW1tJbnB1dF1dLlxuICAgICAqL1xuICAgIHRvU3RyaW5nID0gKCk6c3RyaW5nID0+IHtcbiAgICAgICAgcmV0dXJuIGJpbnRvb2xzLmJ1ZmZlclRvQjU4KHRoaXMudG9CdWZmZXIoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xhc3MgcmVwcmVzZW50aW5nIGFuIElucHV0IGZvciBhIHRyYW5zYWN0aW9uLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB0eGlkIEEge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyfEJ1ZmZlcn0gY29udGFpbmluZyB0aGUgdHJhbnNhY3Rpb24gSUQgb2YgdGhlIHJlZmVyZW5jZWQgVVRYT1xuICAgICAqIEBwYXJhbSB0eGlkeCBBIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlcnxCdWZmZXJ9IGNvbnRhaW5pbmcgdGhlIGluZGV4IG9mIHRoZSBvdXRwdXQgaW4gdGhlIHRyYW5zYWN0aW9uIGNvbnN1bWVkIGluIHRoZSBbW0lucHV0XV1cbiAgICAgKiBAcGFyYW0gYXNzZXRJRCBBIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlcnxCdWZmZXJ9IHJlcHJlc2VudGluZyB0aGUgYXNzZXRJRCBvZiB0aGUgW1tJbnB1dF1dXG4gICAgICogQHBhcmFtIGlucHV0aWQgQSBudW1iZXIgcmVwcmVzZW50aW5nIHRoZSBJbnB1dElEIG9mIHRoZSBbW0lucHV0XV1cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0eGlkPzpCdWZmZXIsIHR4aWR4PzpCdWZmZXIsIGFzc2V0SUQ/OkJ1ZmZlciwgaW5wdXRpZD86bnVtYmVyKSB7XG4gICAgICAgIGlmKHR4aWQgJiYgdHhpZHggJiYgYXNzZXRJRCAmJiBpbnB1dGlkKXtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRpZC53cml0ZVVJbnQzMkJFKGlucHV0aWQsMCk7XG4gICAgICAgICAgICB0aGlzLnR4aWQgPSB0eGlkO1xuICAgICAgICAgICAgdGhpcy50eGlkeCA9IHR4aWR4O1xuICAgICAgICAgICAgdGhpcy5hc3NldGlkID0gYXNzZXRJRDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG5leHBvcnQgY2xhc3MgU2VjcElucHV0IGV4dGVuZHMgSW5wdXQge1xuICAgIHByb3RlY3RlZCBhbW91bnQ6QnVmZmVyID0gQnVmZmVyLmFsbG9jKDgpO1xuICAgIHByb3RlY3RlZCBhbW91bnRWYWx1ZTpCTiA9IG5ldyBCTigwKTtcbiAgICBwcm90ZWN0ZWQgbnVtQWRkcjpCdWZmZXIgPSBCdWZmZXIuYWxsb2MoNCk7XG4gICAgcHJvdGVjdGVkIHNpZ0lkeHM6QXJyYXk8U2lnSWR4PiA9IFtdOyAvLyBpZHhzIG9mIHNpZ25lcnMgZnJvbSB1dHhvXG5cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGFycmF5IG9mIFtbU2lnSWR4XV0gZm9yIHRoaXMgW1tJbnB1dF1dIFxuICAgICAqL1xuICAgIGdldFNpZ0lkeHMgPSAoKTpBcnJheTxTaWdJZHg+ID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2lnSWR4cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaWdub3JlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9iYXNpY1NlY3BJbkJ1ZmZlciA9ICgpOiBCdWZmZXIgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5udW1BZGRyLndyaXRlVUludDMyQkUodGhpcy5zaWdJZHhzLmxlbmd0aCwgMCk7XG4gICAgICAgICAgICBsZXQgYnNpemU6bnVtYmVyID0gdGhpcy5hbW91bnQubGVuZ3RoICsgdGhpcy5udW1BZGRyLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBiYXJyOkFycmF5PEJ1ZmZlcj4gPSBbdGhpcy5hbW91bnQsIHRoaXMubnVtQWRkcl07XG4gICAgICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhpcy5zaWdJZHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGI6QnVmZmVyID0gdGhpcy5zaWdJZHhzW2ldLnRvQnVmZmVyKCk7XG4gICAgICAgICAgICAgICAgYmFyci5wdXNoKGIpO1xuICAgICAgICAgICAgICAgIGJzaXplICs9IGIubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGJ1ZmY6IEJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoYmFycixic2l6ZSk7XG4gICAgICAgICAgICByZXR1cm4gYnVmZjtcbiAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgICAgbGV0IGVtc2c6c3RyaW5nID0gXCJFcnJvciAtIFR4T3V0Ll9iYXNpY1R4QnVmZmVyOiBcIiArIGU7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVtc2cpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGFrZXMgYSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfSBjb250YWluaW5nIGFuIFtbSW5wdXRdXSwgcGFyc2VzIGl0LCBwb3B1bGF0ZXMgdGhlIGNsYXNzLCBhbmQgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBJbnB1dCBpbiBieXRlcy5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gYnl0ZXMgQSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfSBjb250YWluaW5nIGEgcmF3IFtbSW5wdXRdXVxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIFRoZSBsZW5ndGggb2YgdGhlIHJhdyBbW0lucHV0XV1cbiAgICAgKi9cbiAgICBmcm9tQnVmZmVyID0gKGJ5dGVzOkJ1ZmZlcik6bnVtYmVyID0+IHtcbiAgICAgICAgbGV0IG9mZnNldDpudW1iZXIgPSAwO1xuICAgICAgICB0aGlzLmFtb3VudCA9IGJpbnRvb2xzLmNvcHlGcm9tKGJ5dGVzLCBvZmZzZXQsIG9mZnNldCArIDgpO1xuICAgICAgICBvZmZzZXQgKz0gODtcbiAgICAgICAgdGhpcy5hbW91bnRWYWx1ZSA9IGJpbnRvb2xzLmZyb21CdWZmZXJUb0JOKHRoaXMuYW1vdW50KTtcbiAgICAgICAgdGhpcy5udW1BZGRyID0gYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgNCk7XG4gICAgICAgIG9mZnNldCArPSA0O1xuICAgICAgICBsZXQgbnVtYWRkcjpudW1iZXIgPSB0aGlzLm51bUFkZHIucmVhZFVJbnQzMkJFKDApO1xuICAgICAgICB0aGlzLnNpZ0lkeHMgPSBbXTtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IG51bWFkZHI7IGkrKyl7XG4gICAgICAgICAgICBsZXQgc2lnaWR4ID0gbmV3IFNpZ0lkeCgpO1xuICAgICAgICAgICAgc2lnaWR4LmZyb21CdWZmZXIoYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgNCkpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7XG4gICAgICAgICAgICB0aGlzLnNpZ0lkeHMucHVzaChzaWdpZHgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlcnxCdWZmZXJ9IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBbW0lucHV0XV0uXG4gICAgICovXG4gICAgdG9CdWZmZXIgPSAoKTpCdWZmZXIgPT4ge1xuICAgICAgICBsZXQgYmFzaWNpbjpCdWZmZXIgPSB0aGlzLl9iYXNpY0luQnVmZmVyKCk7XG4gICAgICAgIGxldCBzZWNwOkJ1ZmZlciA9IHRoaXMuX2Jhc2ljU2VjcEluQnVmZmVyKCk7XG4gICAgICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFtiYXNpY2luLCBzZWNwXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGJhc2UtNTggcmVwcmVzZW50YXRpb24gb2YgdGhlIFtbSW5wdXRdXS5cbiAgICAgKi9cbiAgICB0b1N0cmluZyA9ICgpOnN0cmluZyA9PiB7XG4gICAgICAgIHJldHVybiBiaW50b29scy5idWZmZXJUb0I1OCh0aGlzLnRvQnVmZmVyKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW5kIGFkZHMgYSBbW1NpZ0lkeF1dIHRvIHRoZSBbW0lucHV0XV0uXG4gICAgICogXG4gICAgICogQHBhcmFtIGFkZHJlc3NJZHggVGhlIGluZGV4IG9mIHRoZSBhZGRyZXNzIHRvIHJlZmVyZW5jZSBpbiB0aGUgc2lnbmF0dXJlc1xuICAgICAqIEBwYXJhbSBhZGRyZXNzIFRoZSBhZGRyZXNzIG9mIHRoZSBzb3VyY2Ugb2YgdGhlIHNpZ25hdHVyZVxuICAgICAqL1xuICAgIGFkZFNpZ25hdHVyZUlkeCA9IChhZGRyZXNzSWR4Om51bWJlciwgYWRkcmVzczpzdHJpbmcpID0+IHtcbiAgICAgICAgbGV0IHNpZ2lkeDpTaWdJZHggPSBuZXcgU2lnSWR4KCk7XG4gICAgICAgIGxldCBiOkJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgICAgICAgYi53cml0ZVVJbnQzMkJFKGFkZHJlc3NJZHgsIDApO1xuICAgICAgICBzaWdpZHguZnJvbUJ1ZmZlcihiKTtcbiAgICAgICAgc2lnaWR4LnNldFNvdXJjZShhZGRyZXNzKTtcbiAgICAgICAgdGhpcy5zaWdJZHhzLnB1c2goc2lnaWR4KTtcbiAgICAgICAgdGhpcy5udW1BZGRyLndyaXRlVUludDMyQkUodGhpcy5zaWdJZHhzLmxlbmd0aCwwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGFzcyByZXByZXNlbnRpbmcgYW4gSW5wdXQgZm9yIGEgdHJhbnNhY3Rpb24uXG4gICAgICogXG4gICAgICogQHBhcmFtIHR4aWQgQSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfSBjb250YWluaW5nIHRoZSB0cmFuc2FjdGlvbiBJRCBvZiB0aGUgcmVmZXJlbmNlZCBVVFhPXG4gICAgICogQHBhcmFtIHR4aWR4IEEge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyfEJ1ZmZlcn0gY29udGFpbmluZyB0aGUgaW5kZXggb2YgdGhlIG91dHB1dCBpbiB0aGUgdHJhbnNhY3Rpb24gY29uc3VtZWQgaW4gdGhlIFtbSW5wdXRdXVxuICAgICAqIEBwYXJhbSBhc3NldElEIEEge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyfEJ1ZmZlcn0gcmVwcmVzZW50aW5nIHRoZSBhc3NldElEIG9mIHRoZSBbW0lucHV0XV1cbiAgICAgKiBAcGFyYW0gYW1vdW50IEEge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9pbmR1dG55L2JuLmpzL3xCTn0gY29udGFpbmluZyB0aGUgYW1vdW50IG9mIHRoZSBvdXRwdXQgdG8gYmUgY29uc3VtZWRcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0eGlkPzpCdWZmZXIsIHR4aWR4PzpCdWZmZXIsIGFtb3VudD86Qk4sIGFzc2V0SUQ/OkJ1ZmZlcikge1xuICAgICAgICBzdXBlcih0eGlkLCB0eGlkeCwgYXNzZXRJRCwgQ29uc3RhbnRzLlNFQ1BJTlBVVElEKTtcbiAgICAgICAgaWYodHhpZCAmJiB0eGlkeCAmJiBhbW91bnQgJiYgYXNzZXRJRCl7XG4gICAgICAgICAgICB0aGlzLmlucHV0aWQud3JpdGVVSW50MzJCRShDb25zdGFudHMuU0VDUElOUFVUSUQsMCk7XG4gICAgICAgICAgICB0aGlzLnR4aWQgPSB0eGlkO1xuICAgICAgICAgICAgdGhpcy50eGlkeCA9IHR4aWR4O1xuICAgICAgICAgICAgdGhpcy5hc3NldGlkID0gYXNzZXRJRDtcbiAgICAgICAgICAgIHRoaXMuYW1vdW50VmFsdWUgPSBhbW91bnQ7XG4gICAgICAgICAgICB0aGlzLmFtb3VudCA9IGJpbnRvb2xzLmZyb21CTlRvQnVmZmVyKGFtb3VudCwgOCk7XG4gICAgICAgICAgICB0aGlzLnNpZ0lkeHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICB9XG59Il19

@@ -86,3 +86,3 @@ /**

*/
constructor(entropy?: Buffer | boolean);
constructor(entropy?: Buffer);
}

@@ -102,3 +102,3 @@ /**

*/
makeKey: (entropy?: boolean | Buffer) => string;
makeKey: (entropy?: Buffer) => string;
/**

@@ -105,0 +105,0 @@ * Given a private key, makes a new key pair, returns the address.

@@ -50,3 +50,3 @@ "use strict";

*/
constructor(entropy = false) {
constructor(entropy = undefined) {
super();

@@ -201,3 +201,3 @@ /**

*/
this.makeKey = (entropy = false) => {
this.makeKey = (entropy = undefined) => {
let keypair = new AVMKeyPair(entropy);

@@ -242,2 +242,3 @@ this.addKey(keypair);

for (let i = 0; i < ins.length; i++) {
let arrsigs = [];
let sigidxs = ins[i].getSigIdxs();

@@ -249,4 +250,5 @@ for (let j = 0; j < sigidxs.length; j++) {

sig.fromBuffer(signval);
sigs.push(sig);
arrsigs.push(sig);
}
sigs.push(arrsigs);
}

@@ -258,2 +260,2 @@ return new tx_1.Tx(utx, sigs);

exports.AVMKeyChain = AVMKeyChain;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2hhaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpcy9hdm0va2V5Y2hhaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUE7O0dBRUc7QUFDSCxvQ0FBK0I7QUFDL0IsbURBQXFDO0FBQ3JDLG9FQUE0QztBQUM1Qyw2QkFBc0M7QUFDdEMsbUNBQTRDO0FBRTVDLDhEQUFxQztBQUNyQyw2Q0FBc0Q7QUFFdEQ7O0dBRUc7QUFDSCxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDO0FBRXZCOztHQUVHO0FBQ0gsTUFBTSxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFL0I7O0dBRUc7QUFDSCxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDO0FBRTFCOztHQUVHO0FBQ0gsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7QUFFbEM7O0dBRUc7QUFDSCxNQUFNLFFBQVEsR0FBRyxrQkFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBR3hDOztHQUVHO0FBQ0gsTUFBYSxVQUFXLFNBQVEsZUFBTztJQTRJbkM7O09BRUc7SUFDSCxZQUFZLFVBQTJCLEtBQUs7UUFDeEMsS0FBSyxFQUFFLENBQUM7UUE3SVo7O1dBRUc7UUFDTyxzQkFBaUIsR0FBRyxDQUFDLEdBQVUsRUFBK0IsRUFBRTtZQUN0RSxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMvQyxJQUFJLGFBQWEsR0FBVSxRQUFRLENBQUMsUUFBUSxDQUFDLEdB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QyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7b0JBQzdELElBQUksT0FBTyxHQUFVLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7b0JBQ3RDLElBQUksR0FBRyxHQUFhLElBQUksaUJBQVMsRUFBRSxDQUFDO29CQUNwQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUNsQjthQUNKO1lBQ0QsT0FBTyxJQUFJLE9BQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFBO0lBT0QsQ0FBQztDQUNKO0FBcEVELGtDQW9FQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG1vZHVsZSBBVk1BUElcbiAqL1xuaW1wb3J0IHtCdWZmZXJ9IGZyb20gXCJidWZmZXIvXCI7XG5pbXBvcnQgKiBhcyBlbGxpcHRpYyBmcm9tIFwiZWxsaXB0aWNcIjtcbmltcG9ydCBCaW5Ub29scyBmcm9tICcuLi8uLi91dGlscy9iaW50b29scyc7XG5pbXBvcnQgeyBUeFVuc2lnbmVkLCBUeCB9IGZyb20gJy4vdHgnO1xuaW1wb3J0IHsgU2lnbmF0dXJlLCBTaWdJZHggfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IElucHV0IH0gZnJvbSAnLi9pbnB1dHMnO1xuaW1wb3J0IGNyZWF0ZUhhc2ggZnJvbSBcImNyZWF0ZS1oYXNoXCI7XG5pbXBvcnQgeyBLZXlQYWlyLCBLZXlDaGFpbiB9IGZyb20gJy4uLy4uL3V0aWxzL3R5cGVzJztcblxuLyoqXG4gKiBAaWdub3JlXG4gKi9cbmNvbnN0IEVDID0gZWxsaXB0aWMuZWM7XG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5jb25zdCBlYyA9IG5ldyBFQygnc2VjcDI1NmsxJyk7XG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5jb25zdCBlY3BhcmFtcyA9IGVjLmN1cnZlO1xuXG4vKipcbiAqIEBpZ25vcmVcbiAqL1xuY29uc3QgQk4gPSBlY3BhcmFtcy5uLmNvbnN0cnVjdG9yO1xuXG4vKipcbiAqIEBpZ25vcmVcbiAqL1xuY29uc3QgYmludG9vbHMgPSBCaW5Ub29scy5nZXRJbnN0YW5jZSgpO1xuXG5cbi8qKlxuICogQ2xhc3MgZm9yIHJlcHJlc2VudGluZyBhIHByaXZhdGUgYW5kIHB1YmxpYyBrZXlwYWlyIGluIEFWQUpTLiBcbiAqL1xuZXhwb3J0IGNsYXNzIEFWTUtleVBhaXIgZXh0ZW5kcyBLZXlQYWlyIHtcbiAgICBwcm90ZWN0ZWQga2V5cGFpcjplbGxpcHRpYy5lYy5LZXlQYWlyXG5cbiAgICAvKipcbiAgICAgKiBAaWdub3JlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9zaWdGcm9tU2lnQnVmZmVyID0gKHNpZzpCdWZmZXIpOmVsbGlwdGljLmVjLlNpZ25hdHVyZU9wdGlvbnMgPT4ge1xuICAgICAgICBsZXQgciA9IG5ldyBCTihiaW50b29scy5jb3B5RnJvbShzaWcsIDAsIDMyKSk7XG4gICAgICAgIGxldCBzID0gbmV3IEJOKGJpbnRvb2xzLmNvcHlGcm9tKHNpZywgMzIsIDY0KSk7XG4gICAgICAgIGxldCByZWNvdmVyeVBhcmFtOm51bWJlciA9IGJpbnRvb2xzLmNvcHlGcm9tKHNpZywgNjQsIDY1KS5yZWFkVUludEJFKDAsIDEpO1xuICAgICAgICBsZXQgc2lnT3B0ID0ge1xuICAgICAgICAgICAgcjpyLFxuICAgICAgICAgICAgczpzLFxuICAgICAgICAgICAgcmVjb3ZlcnlQYXJhbTpyZWNvdmVyeVBhcmFtXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBzaWdPcHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIGEgbmV3IGtleXBhaXIuXG4gICAgICogXG4gICAgICogQHBhcmFtIGVudHJvcHkgT3B0aW9uYWwgcGFyYW1ldGVyIHRoYXQgbWF5IGJlIG5lY2Vzc2FyeSB0byBwcm9kdWNlIHNlY3VyZSBrZXlzXG4gICAgICovXG4gICAgZ2VuZXJhdGVLZXkgPSAoZW50cm9weT86QnVmZmVyKSA9PiB7XG4gICAgICAgIHRoaXMua2V5cGFpciA9IGVjLmdlbktleVBhaXIoKTtcblxuICAgICAgICAvLyBkb2luZyBoZXggdHJhbnNsYXRpb24gdG8gZ2V0IEJ1ZmZlciBjbGFzc1xuICAgICAgICB0aGlzLnByaXZrID0gQnVmZmVyLmZyb20odGhpcy5rZXlwYWlyLmdldFByaXZhdGUoXCJoZXhcIiksIFwiaGV4XCIpO1xuICAgICAgICB0aGlzLnB1YmsgPSBCdWZmZXIuZnJvbSh0aGlzLmtleXBhaXIuZ2V0UHVibGljKHRydWUsIFwiaGV4XCIpLCBcImhleFwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbXBvcnRzIGEgcHJpdmF0ZSBrZXkgYW5kIGdlbmVyYXRlcyB0aGUgYXBwcm9wcmlhdGUgcHVibGljIGtleS5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gcHJpdmsgQSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfSByZXByZXNlbnRpbmcgdGhlIHByaXZhdGUga2V5IFxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZVxuICAgICAqL1xuICAgIGltcG9ydEtleSA9IChwcml2azpCdWZmZXIpOmJvb2xlYW4gPT4ge1xuICAgICAgICB0aGlzLmtleXBhaXIgPSBlYy5rZXlGcm9tUHJpdmF0ZShwcml2ay50b1N0cmluZyhcImhleFwiKSxcImhleFwiKTtcbiAgICAgICAgLy8gZG9pbmcgaGV4IHRyYW5zbGF0aW9uIHRvIGdldCBCdWZmZXIgY2xhc3NcbiAgICAgICAgdGhpcy5wcml2ayA9IEJ1ZmZlci5mcm9tKHRoaXMua2V5cGFpci5nZXRQcml2YXRlKFwiaGV4XCIpLCBcImhleFwiKTtcbiAgICAgICAgdGhpcy5wdWJrID0gQnVmZmVyLmZyb20odGhpcy5rZXlwYWlyLmdldFB1YmxpYyh0cnVlLCBcImhleFwiKSwgXCJoZXhcIik7XG4gICAgICAgIHJldHVybiB0cnVlOyAvL3NpbGx5IEkga25vdywgYnV0IHRoZSBpbnRlcmZhY2UgcmVxdWlyZXMgc28gaXQgcmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIHNvIGlmIEJ1ZmZlciBmYWlscyB2YWxpZGF0aW9uLi4uXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYWRkcmVzcy5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWRkcmVzc1xuICAgICAqL1xuICAgIGdldEFkZHJlc3MgPSAoKTpzdHJpbmcgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRyZXNzRnJvbVB1YmxpY0tleSh0aGlzLnB1YmspO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYWRkcmVzcyBnaXZlbiBhIHB1YmxpYyBrZXkuXG4gICAgICogXG4gICAgICogQHBhcmFtIHB1YmsgQSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfSByZXByZXNlbnRpbmcgdGhlIHB1YmxpYyBrZXlcbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBBIHN0cmluZyBmb3IgdGhlIGFkZHJlc3Mgb2YgdGhlIHB1YmxpYyBrZXkuXG4gICAgICovXG4gICAgYWRkcmVzc0Zyb21QdWJsaWNLZXkgPSAocHViazpCdWZmZXIpOiBzdHJpbmcgPT4ge1xuICAgICAgICBsZXQgYWRkcmVzczpzdHJpbmcgPSBcIlwiO1xuICAgICAgICBpZihwdWJrLmxlbmd0aCA9PSA2NSkge1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICAgIHB1YmsgPSBCdWZmZXIuZnJvbShlYy5rZXlGcm9tUHVibGljKHB1YmspLmdldFB1YmxpYyh0cnVlLCBcImhleFwiKSwgXCJoZXhcIik7IC8vbWFrZSBjb21wYWN0LCBzdGljayBiYWNrIGludG8gYnVmZmVyXG4gICAgICAgIH0gXG4gICAgICAgIGlmKHB1YmsubGVuZ3RoID09IDMzKXtcbiAgICAgICAgICAgIGxldCBzaGEyNTY6QnVmZmVyID0gQnVmZmVyLmZyb20oY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKHB1YmspLmRpZ2VzdCgpKTtcbiAgICAgICAgICAgIGxldCByaXBlc2hhOkJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGNyZWF0ZUhhc2goJ3JtZDE2MCcpLnVwZGF0ZShzaGEyNTYpLmRpZ2VzdCgpKTtcbiAgICAgICAgICAgIGFkZHJlc3MgPSBiaW50b29scy5hdmFTZXJpYWxpemUocmlwZXNoYSk7XG4gICAgICAgICAgICByZXR1cm4gYWRkcmVzcztcbiAgICAgICAgfVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gbWFrZSBhZGRyZXNzLlwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcml2YXRlIGtleS5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBBbiBBVkEgc2VyaWFsaXplZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHB1YmxpYyBrZXlcbiAgICAgKi9cbiAgICBnZXRQcml2YXRlS2V5U3RyaW5nID0gKCk6c3RyaW5nID0+IHtcbiAgICAgICAgcmV0dXJuIGJpbnRvb2xzLmF2YVNlcmlhbGl6ZSh0aGlzLnByaXZrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwdWJsaWMga2V5LlxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIEFuIEFWQSBzZXJpYWxpemVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHVibGljIGtleVxuICAgICAqL1xuICAgIGdldFB1YmxpY0tleVN0cmluZyA9ICgpOnN0cmluZyA9PiB7XG4gICAgICAgIHJldHVybiBiaW50b29scy5hdmFTZXJpYWxpemUodGhpcy5wdWJrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUYWtlcyBhIG1lc3NhZ2UsIHNpZ25zIGl0LCBhbmQgcmV0dXJucyB0aGUgc2lnbmF0dXJlLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBtc2cgVGhlIG1lc3NhZ2UgdG8gc2lnbiwgYmUgc3VyZSB0byBoYXNoIGZpcnN0IGlmIGV4cGVjdGVkXG4gICAgICogXG4gICAgICogQHJldHVybnMgQSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfSBjb250YWluaW5nIHRoZSBzaWduYXR1cmVcbiAgICAgKi9cbiAgICBzaWduID0gKG1zZzpCdWZmZXIpOkJ1ZmZlciA9PiB7XG4gICAgICAgIGxldCBzaWdPYmogPSB0aGlzLmtleXBhaXIuc2lnbihtc2csIHVuZGVmaW5lZCwgeyBjYW5vbmljYWw6IHRydWUgfSk7XG4gICAgICAgIGxldCByZWNvdmVyeTpCdWZmZXIgPSBCdWZmZXIuYWxsb2MoMSk7XG4gICAgICAgIHJlY292ZXJ5LndyaXRlVUludDgoc2lnT2JqLnJlY292ZXJ5UGFyYW0sIDApO1xuICAgICAgICBsZXQgcjpCdWZmZXIgPSBCdWZmZXIuZnJvbShzaWdPYmouci50b0FycmF5KFwiYmVcIiwgMzIpKTsgLy93ZSBoYXZlIHRvIHNraXAgbmF0aXZlIEJ1ZmZlciBjbGFzcywgc28gdGhpcyBpcyB0aGUgd2F5XG4gICAgICAgIGxldCBzOkJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHNpZ09iai5zLnRvQXJyYXkoXCJiZVwiLCAzMikpOyAvL3dlIGhhdmUgdG8gc2tpcCBuYXRpdmUgQnVmZmVyIGNsYXNzLCBzbyB0aGlzIGlzIHRoZSB3YXlcbiAgICAgICAgbGV0IHJlc3VsdDpCdWZmZXIgPSBCdWZmZXIuY29uY2F0KFtyLHMsIHJlY292ZXJ5XSwgNjUpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBcbiAgICAvKipcbiAgICAgKiBWZXJpZmllcyB0aGF0IHRoZSBwcml2YXRlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3ZpZGVkIHB1YmxpYyBrZXkgcHJvZHVjZXMgdGhlIHNpZ25hdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UuXG4gICAgICogXG4gICAgICogQHBhcmFtIG1zZyBUaGUgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNpZ25hdHVyZVxuICAgICAqIEBwYXJhbSBzaWcgVGhlIHNpZ25hdHVyZSBvZiB0aGUgc2lnbmVkIG1lc3NhZ2VcbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBUcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmVcbiAgICAgKi9cbiAgICB2ZXJpZnkgPSAobXNnOkJ1ZmZlciwgc2lnOkJ1ZmZlcik6Ym9vbGVhbiA9PiB7IFxuICAgICAgICBsZXQgc2lnT2JqOmVsbGlwdGljLmVjLlNpZ25hdHVyZU9wdGlvbnMgPSB0aGlzLl9zaWdGcm9tU2lnQnVmZmVyKHNpZyk7XG4gICAgICAgIHJldHVybiBlYy52ZXJpZnkobXNnLCBzaWdPYmosIHRoaXMua2V5cGFpcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjb3ZlcnMgdGhlIHB1YmxpYyBrZXkgb2YgYSBtZXNzYWdlIHNpZ25lciBmcm9tIGEgbWVzc2FnZSBhbmQgaXRzIGFzc29jaWF0ZWQgc2lnbmF0dXJlLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBtc2cgVGhlIG1lc3NhZ2UgdGhhdCdzIHNpZ25lZFxuICAgICAqIEBwYXJhbSBzaWcgVGhlIHNpZ25hdHVyZSB0aGF0J3Mgc2lnbmVkIG9uIHRoZSBtZXNzYWdlXG4gICAgICogXG4gICAgICogQHJldHVybnMgQSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfSBjb250YWluaW5nIHRoZSBwdWJsaWMga2V5IG9mIHRoZSBzaWduZXJcbiAgICAgKi9cbiAgICByZWNvdmVyID0gKG1zZzpCdWZmZXIsIHNpZzpCdWZmZXIpOkJ1ZmZlciA9PiB7XG4gICAgICAgIGxldCBzaWdPYmo6ZWxsaXB0aWMuZWMuU2lnbmF0dXJlT3B0aW9ucyA9IHRoaXMuX3NpZ0Zyb21TaWdCdWZmZXIoc2lnKTtcbiAgICAgICAgbGV0IHB1YmsgPSBlYy5yZWNvdmVyUHViS2V5KG1zZywgc2lnT2JqLCBzaWdPYmoucmVjb3ZlcnlQYXJhbSk7XG4gICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShwdWJrLmVuY29kZUNvbXByZXNzZWQoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xhc3MgZm9yIHJlcHJlc2VudGluZyBhIHByaXZhdGUgYW5kIHB1YmxpYyBrZXlwYWlyIGluIEFWQUpTLiBcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihlbnRyb3B5OkJ1ZmZlciB8IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmdlbmVyYXRlS2V5KCk7XG4gICAgfVxuICAgIFxufVxuXG4vKipcbiAqIENsYXNzIGZvciByZXByZXNlbnRpbmcgYSBrZXkgY2hhaW4gaW4gQVZBSlMuIFxuICogXG4gKiBAdHlwZXBhcmFtIEFWTUtleVBhaXIgQ2xhc3MgZXh0ZW5kaW5nIFtbS2V5UGFpcl1dIHdoaWNoIGlzIHVzZWQgYXMgdGhlIGtleSBpbiBbW0FWTUtleUNoYWluXV1cbiAqL1xuZXhwb3J0IGNsYXNzIEFWTUtleUNoYWluIGV4dGVuZHMgS2V5Q2hhaW48QVZNS2V5UGFpcj4ge1xuXG4gICAgLyoqXG4gICAgICogTWFrZXMgYSBuZXcga2V5IHBhaXIsIHJldHVybnMgdGhlIGFkZHJlc3MuXG4gICAgICogXG4gICAgICogQHBhcmFtIGVudHJvcHkgT3B0aW9uYWwgcGFyYW1ldGVyIHRoYXQgbWF5IGJlIG5lY2Vzc2FyeSB0byBwcm9kdWNlIHNlY3VyZSBrZXlzXG4gICAgICogXG4gICAgICogQHJldHVybnMgQWRkcmVzcyBvZiB0aGUgbmV3IGtleSBwYWlyXG4gICAgICovXG4gICAgbWFrZUtleSA9IChlbnRyb3B5OkJ1ZmZlciB8IGJvb2xlYW4gPSBmYWxzZSk6c3RyaW5nID0+IHtcbiAgICAgICAgbGV0IGtleXBhaXI6QVZNS2V5UGFpciA9IG5ldyBBVk1LZXlQYWlyKGVudHJvcHkpO1xuICAgICAgICB0aGlzLmFkZEtleShrZXlwYWlyKTtcbiAgICAgICAgcmV0dXJuIGtleXBhaXIuZ2V0QWRkcmVzcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgcHJpdmF0ZSBrZXksIG1ha2VzIGEgbmV3IGtleSBwYWlyLCByZXR1cm5zIHRoZSBhZGRyZXNzLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBwcml2ayBBIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlcnxCdWZmZXJ9IG9yIEFWQSBzZXJpYWxpemVkIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHByaXZhdGUga2V5IFxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIEFkZHJlc3Mgb2YgdGhlIG5ldyBrZXkgcGFpclxuICAgICAqL1xuICAgIGltcG9ydEtleSA9IChwcml2azpCdWZmZXIgfCBzdHJpbmcpOnN0cmluZyA9PiB7XG4gICAgICAgIGxldCBrZXlwYWlyOkFWTUtleVBhaXIgPSBuZXcgQVZNS2V5UGFpcigpO1xuICAgICAgICBsZXQgcGs6QnVmZmVyO1xuICAgICAgICBpZih0eXBlb2YgcHJpdmsgPT09ICdzdHJpbmcnKXtcbiAgICAgICAgICAgIHBrID0gYmludG9vbHMuYXZhRGVzZXJpYWxpemUocHJpdmspO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGsgPSBiaW50b29scy5jb3B5RnJvbShwcml2ayk7XG4gICAgICAgIH1cbiAgICAgICAga2V5cGFpci5pbXBvcnRLZXkocGspO1xuICAgICAgICBpZighKGtleXBhaXIuZ2V0QWRkcmVzcygpIGluIHRoaXMua2V5cykpe1xuICAgICAgICAgICAgdGhpcy5hZGRLZXkoa2V5cGFpcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGtleXBhaXIuZ2V0QWRkcmVzcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNpZ25zIGEgW1tUeFVuc2lnbmVkXV0gYW5kIHJldHVybnMgc2lnbmVkIFtbVHhdXVxuICAgICAqIFxuICAgICAqIEBwYXJhbSB1dHggQSBbW1R4VW5zaWduZWRdXSB0aGF0IG5lZWRzIHRvIGJlIHNpZ25lZFxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIEEgc2lnbmVkIFtbVHhdXVxuICAgICAqL1xuICAgIHNpZ25UeCA9ICh1dHg6VHhVbnNpZ25lZCk6VHggPT4ge1xuICAgICAgICBsZXQgdHhidWZmID0gdXR4LnRvQnVmZmVyKCk7XG4gICAgICAgIGxldCBtc2c6QnVmZmVyID0gQnVmZmVyLmZyb20oY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKHR4YnVmZikuZGlnZXN0KCkpOyBcbiAgICAgICAgbGV0IHNpZ3M6QXJyYXk8U2lnbmF0dXJlPiA9IFtdO1xuICAgICAgICBsZXQgaW5zOkFycmF5PElucHV0PiA9IHV0eC5nZXRJbnMoKTtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGlucy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICBsZXQgc2lnaWR4czpBcnJheTxTaWdJZHg+ID0gaW5zW2ldLmdldFNpZ0lkeHMoKTtcbiAgICAgICAgICAgIGZvcihsZXQgaiA9IDA7IGogPCBzaWdpZHhzLmxlbmd0aDsgaisrKXtcbiAgICAgICAgICAgICAgICBsZXQga2V5cGFpcjpBVk1LZXlQYWlyID0gdGhpcy5nZXRLZXkoc2lnaWR4c1tqXS5nZXRTb3VyY2UoKSk7XG4gICAgICAgICAgICAgICAgbGV0IHNpZ252YWw6QnVmZmVyID0ga2V5cGFpci5zaWduKG1zZylcbiAgICAgICAgICAgICAgICBsZXQgc2lnOlNpZ25hdHVyZSA9IG5ldyBTaWduYXR1cmUoKTtcbiAgICAgICAgICAgICAgICBzaWcuZnJvbUJ1ZmZlcihzaWdudmFsKTtcbiAgICAgICAgICAgICAgICBzaWdzLnB1c2goc2lnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFR4KHV0eCwgc2lncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpbnN0YW5jZSBvZiBBVk1LZXlDaGFpbi5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn0iXX0=
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2hhaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpcy9hdm0va2V5Y2hhaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUE7O0dBRUc7QUFDSCxvQ0FBK0I7QUFDL0IsbURBQXFDO0FBQ3JDLG9FQUE0QztBQUM1Qyw2QkFBc0M7QUFDdEMsbUNBQTRDO0FBRTVDLDhEQUFxQztBQUNyQyw2Q0FBc0Q7QUFFdEQ7O0dBRUc7QUFDSCxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDO0FBRXZCOztHQUVHO0FBQ0gsTUFBTSxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFL0I7O0dBRUc7QUFDSCxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDO0FBRTFCOztHQUVHO0FBQ0gsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7QUFFbEM7O0dBRUc7QUFDSCxNQUFNLFFBQVEsR0FBRyxrQkFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBR3hDOztHQUVHO0FBQ0gsTUFBYSxVQUFXLFNBQVEsZUFBTztJQTRJbkM7O09BRUc7SUFDSCxZQUFZLFVBQWlCLFNBQVM7UUFDbEMsS0FBSyxFQUFFLENBQUM7UUE3SVo7O1dBRUc7UUFDTyxzQkFBaUIsR0FBRyxDQUFDLEdBQVUsRUFBK0IsRUFBRTtZQUN0RSxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMvQyxJQUFJLGFBQWEsR0FBVSxRQUFRLENBQUMsUUFBUSxDQUFDLEdB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QUM7b0JBQ25DLElBQUksT0FBTyxHQUFjLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7b0JBQzdELElBQUksT0FBTyxHQUFVLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7b0JBQ3RDLElBQUksR0FBRyxHQUFhLElBQUksaUJBQVMsRUFBRSxDQUFDO29CQUNwQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUN4QixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUNyQjtnQkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ3RCO1lBQ0QsT0FBTyxJQUFJLE9BQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFBO0lBT0QsQ0FBQztDQUNKO0FBdEVELGtDQXNFQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG1vZHVsZSBBVk1BUElcbiAqL1xuaW1wb3J0IHtCdWZmZXJ9IGZyb20gXCJidWZmZXIvXCI7XG5pbXBvcnQgKiBhcyBlbGxpcHRpYyBmcm9tIFwiZWxsaXB0aWNcIjtcbmltcG9ydCBCaW5Ub29scyBmcm9tICcuLi8uLi91dGlscy9iaW50b29scyc7XG5pbXBvcnQgeyBUeFVuc2lnbmVkLCBUeCB9IGZyb20gJy4vdHgnO1xuaW1wb3J0IHsgU2lnbmF0dXJlLCBTaWdJZHggfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IFNlY3BJbnB1dCwgSW5wdXQgfSBmcm9tICcuL2lucHV0cyc7XG5pbXBvcnQgY3JlYXRlSGFzaCBmcm9tIFwiY3JlYXRlLWhhc2hcIjtcbmltcG9ydCB7IEtleVBhaXIsIEtleUNoYWluIH0gZnJvbSAnLi4vLi4vdXRpbHMvdHlwZXMnO1xuXG4vKipcbiAqIEBpZ25vcmVcbiAqL1xuY29uc3QgRUMgPSBlbGxpcHRpYy5lYztcblxuLyoqXG4gKiBAaWdub3JlXG4gKi9cbmNvbnN0IGVjID0gbmV3IEVDKCdzZWNwMjU2azEnKTtcblxuLyoqXG4gKiBAaWdub3JlXG4gKi9cbmNvbnN0IGVjcGFyYW1zID0gZWMuY3VydmU7XG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5jb25zdCBCTiA9IGVjcGFyYW1zLm4uY29uc3RydWN0b3I7XG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5jb25zdCBiaW50b29scyA9IEJpblRvb2xzLmdldEluc3RhbmNlKCk7XG5cblxuLyoqXG4gKiBDbGFzcyBmb3IgcmVwcmVzZW50aW5nIGEgcHJpdmF0ZSBhbmQgcHVibGljIGtleXBhaXIgaW4gQVZBSlMuIFxuICovXG5leHBvcnQgY2xhc3MgQVZNS2V5UGFpciBleHRlbmRzIEtleVBhaXIge1xuICAgIHByb3RlY3RlZCBrZXlwYWlyOmVsbGlwdGljLmVjLktleVBhaXJcblxuICAgIC8qKlxuICAgICAqIEBpZ25vcmVcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3NpZ0Zyb21TaWdCdWZmZXIgPSAoc2lnOkJ1ZmZlcik6ZWxsaXB0aWMuZWMuU2lnbmF0dXJlT3B0aW9ucyA9PiB7XG4gICAgICAgIGxldCByID0gbmV3IEJOKGJpbnRvb2xzLmNvcHlGcm9tKHNpZywgMCwgMzIpKTtcbiAgICAgICAgbGV0IHMgPSBuZXcgQk4oYmludG9vbHMuY29weUZyb20oc2lnLCAzMiwgNjQpKTtcbiAgICAgICAgbGV0IHJlY292ZXJ5UGFyYW06bnVtYmVyID0gYmludG9vbHMuY29weUZyb20oc2lnLCA2NCwgNjUpLnJlYWRVSW50QkUoMCwgMSk7XG4gICAgICAgIGxldCBzaWdPcHQgPSB7XG4gICAgICAgICAgICByOnIsXG4gICAgICAgICAgICBzOnMsXG4gICAgICAgICAgICByZWNvdmVyeVBhcmFtOnJlY292ZXJ5UGFyYW1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHNpZ09wdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSBuZXcga2V5cGFpci5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gZW50cm9weSBPcHRpb25hbCBwYXJhbWV0ZXIgdGhhdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHByb2R1Y2Ugc2VjdXJlIGtleXNcbiAgICAgKi9cbiAgICBnZW5lcmF0ZUtleSA9IChlbnRyb3B5PzpCdWZmZXIpID0+IHtcbiAgICAgICAgdGhpcy5rZXlwYWlyID0gZWMuZ2VuS2V5UGFpcigpO1xuXG4gICAgICAgIC8vIGRvaW5nIGhleCB0cmFuc2xhdGlvbiB0byBnZXQgQnVmZmVyIGNsYXNzXG4gICAgICAgIHRoaXMucHJpdmsgPSBCdWZmZXIuZnJvbSh0aGlzLmtleXBhaXIuZ2V0UHJpdmF0ZShcImhleFwiKSwgXCJoZXhcIik7XG4gICAgICAgIHRoaXMucHViayA9IEJ1ZmZlci5mcm9tKHRoaXMua2V5cGFpci5nZXRQdWJsaWModHJ1ZSwgXCJoZXhcIiksIFwiaGV4XCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEltcG9ydHMgYSBwcml2YXRlIGtleSBhbmQgZ2VuZXJhdGVzIHRoZSBhcHByb3ByaWF0ZSBwdWJsaWMga2V5LlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBwcml2ayBBIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlcnxCdWZmZXJ9IHJlcHJlc2VudGluZyB0aGUgcHJpdmF0ZSBrZXkgXG4gICAgICogXG4gICAgICogQHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlXG4gICAgICovXG4gICAgaW1wb3J0S2V5ID0gKHByaXZrOkJ1ZmZlcik6Ym9vbGVhbiA9PiB7XG4gICAgICAgIHRoaXMua2V5cGFpciA9IGVjLmtleUZyb21Qcml2YXRlKHByaXZrLnRvU3RyaW5nKFwiaGV4XCIpLFwiaGV4XCIpO1xuICAgICAgICAvLyBkb2luZyBoZXggdHJhbnNsYXRpb24gdG8gZ2V0IEJ1ZmZlciBjbGFzc1xuICAgICAgICB0aGlzLnByaXZrID0gQnVmZmVyLmZyb20odGhpcy5rZXlwYWlyLmdldFByaXZhdGUoXCJoZXhcIiksIFwiaGV4XCIpO1xuICAgICAgICB0aGlzLnB1YmsgPSBCdWZmZXIuZnJvbSh0aGlzLmtleXBhaXIuZ2V0UHVibGljKHRydWUsIFwiaGV4XCIpLCBcImhleFwiKTtcbiAgICAgICAgcmV0dXJuIHRydWU7IC8vc2lsbHkgSSBrbm93LCBidXQgdGhlIGludGVyZmFjZSByZXF1aXJlcyBzbyBpdCByZXR1cm5zIHRydWUgb24gc3VjY2Vzcywgc28gaWYgQnVmZmVyIGZhaWxzIHZhbGlkYXRpb24uLi5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBhZGRyZXNzLlxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhZGRyZXNzXG4gICAgICovXG4gICAgZ2V0QWRkcmVzcyA9ICgpOnN0cmluZyA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3NGcm9tUHVibGljS2V5KHRoaXMucHViayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhZGRyZXNzIGdpdmVuIGEgcHVibGljIGtleS5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gcHViayBBIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlcnxCdWZmZXJ9IHJlcHJlc2VudGluZyB0aGUgcHVibGljIGtleVxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIGZvciB0aGUgYWRkcmVzcyBvZiB0aGUgcHVibGljIGtleS5cbiAgICAgKi9cbiAgICBhZGRyZXNzRnJvbVB1YmxpY0tleSA9IChwdWJrOkJ1ZmZlcik6IHN0cmluZyA9PiB7XG4gICAgICAgIGxldCBhZGRyZXNzOnN0cmluZyA9IFwiXCI7XG4gICAgICAgIGlmKHB1YmsubGVuZ3RoID09IDY1KSB7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgICAgcHViayA9IEJ1ZmZlci5mcm9tKGVjLmtleUZyb21QdWJsaWMocHViaykuZ2V0UHVibGljKHRydWUsIFwiaGV4XCIpLCBcImhleFwiKTsgLy9tYWtlIGNvbXBhY3QsIHN0aWNrIGJhY2sgaW50byBidWZmZXJcbiAgICAgICAgfSBcbiAgICAgICAgaWYocHViay5sZW5ndGggPT0gMzMpe1xuICAgICAgICAgICAgbGV0IHNoYTI1NjpCdWZmZXIgPSBCdWZmZXIuZnJvbShjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUocHViaykuZGlnZXN0KCkpO1xuICAgICAgICAgICAgbGV0IHJpcGVzaGE6QnVmZmVyID0gQnVmZmVyLmZyb20oY3JlYXRlSGFzaCgncm1kMTYwJykudXBkYXRlKHNoYTI1NikuZGlnZXN0KCkpO1xuICAgICAgICAgICAgYWRkcmVzcyA9IGJpbnRvb2xzLmF2YVNlcmlhbGl6ZShyaXBlc2hhKTtcbiAgICAgICAgICAgIHJldHVybiBhZGRyZXNzO1xuICAgICAgICB9XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBtYWtlIGFkZHJlc3MuXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHByaXZhdGUga2V5LlxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIEFuIEFWQSBzZXJpYWxpemVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHVibGljIGtleVxuICAgICAqL1xuICAgIGdldFByaXZhdGVLZXlTdHJpbmcgPSAoKTpzdHJpbmcgPT4ge1xuICAgICAgICByZXR1cm4gYmludG9vbHMuYXZhU2VyaWFsaXplKHRoaXMucHJpdmspO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHB1YmxpYyBrZXkuXG4gICAgICogXG4gICAgICogQHJldHVybnMgQW4gQVZBIHNlcmlhbGl6ZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwdWJsaWMga2V5XG4gICAgICovXG4gICAgZ2V0UHVibGljS2V5U3RyaW5nID0gKCk6c3RyaW5nID0+IHtcbiAgICAgICAgcmV0dXJuIGJpbnRvb2xzLmF2YVNlcmlhbGl6ZSh0aGlzLnB1YmspO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRha2VzIGEgbWVzc2FnZSwgc2lnbnMgaXQsIGFuZCByZXR1cm5zIHRoZSBzaWduYXR1cmUuXG4gICAgICogXG4gICAgICogQHBhcmFtIG1zZyBUaGUgbWVzc2FnZSB0byBzaWduLCBiZSBzdXJlIHRvIGhhc2ggZmlyc3QgaWYgZXhwZWN0ZWRcbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBBIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlcnxCdWZmZXJ9IGNvbnRhaW5pbmcgdGhlIHNpZ25hdHVyZVxuICAgICAqL1xuICAgIHNpZ24gPSAobXNnOkJ1ZmZlcik6QnVmZmVyID0+IHtcbiAgICAgICAgbGV0IHNpZ09iaiA9IHRoaXMua2V5cGFpci5zaWduKG1zZywgdW5kZWZpbmVkLCB7IGNhbm9uaWNhbDogdHJ1ZSB9KTtcbiAgICAgICAgbGV0IHJlY292ZXJ5OkJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygxKTtcbiAgICAgICAgcmVjb3Zlcnkud3JpdGVVSW50OChzaWdPYmoucmVjb3ZlcnlQYXJhbSwgMCk7XG4gICAgICAgIGxldCByOkJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHNpZ09iai5yLnRvQXJyYXkoXCJiZVwiLCAzMikpOyAvL3dlIGhhdmUgdG8gc2tpcCBuYXRpdmUgQnVmZmVyIGNsYXNzLCBzbyB0aGlzIGlzIHRoZSB3YXlcbiAgICAgICAgbGV0IHM6QnVmZmVyID0gQnVmZmVyLmZyb20oc2lnT2JqLnMudG9BcnJheShcImJlXCIsIDMyKSk7IC8vd2UgaGF2ZSB0byBza2lwIG5hdGl2ZSBCdWZmZXIgY2xhc3MsIHNvIHRoaXMgaXMgdGhlIHdheVxuICAgICAgICBsZXQgcmVzdWx0OkJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoW3IscywgcmVjb3ZlcnldLCA2NSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIFZlcmlmaWVzIHRoYXQgdGhlIHByaXZhdGUga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgcHVibGljIGtleSBwcm9kdWNlcyB0aGUgc2lnbmF0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gbXNnIFRoZSBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2lnbmF0dXJlXG4gICAgICogQHBhcmFtIHNpZyBUaGUgc2lnbmF0dXJlIG9mIHRoZSBzaWduZWQgbWVzc2FnZVxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIFRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZVxuICAgICAqL1xuICAgIHZlcmlmeSA9IChtc2c6QnVmZmVyLCBzaWc6QnVmZmVyKTpib29sZWFuID0+IHsgXG4gICAgICAgIGxldCBzaWdPYmo6ZWxsaXB0aWMuZWMuU2lnbmF0dXJlT3B0aW9ucyA9IHRoaXMuX3NpZ0Zyb21TaWdCdWZmZXIoc2lnKTtcbiAgICAgICAgcmV0dXJuIGVjLnZlcmlmeShtc2csIHNpZ09iaiwgdGhpcy5rZXlwYWlyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWNvdmVycyB0aGUgcHVibGljIGtleSBvZiBhIG1lc3NhZ2Ugc2lnbmVyIGZyb20gYSBtZXNzYWdlIGFuZCBpdHMgYXNzb2NpYXRlZCBzaWduYXR1cmUuXG4gICAgICogXG4gICAgICogQHBhcmFtIG1zZyBUaGUgbWVzc2FnZSB0aGF0J3Mgc2lnbmVkXG4gICAgICogQHBhcmFtIHNpZyBUaGUgc2lnbmF0dXJlIHRoYXQncyBzaWduZWQgb24gdGhlIG1lc3NhZ2VcbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBBIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlcnxCdWZmZXJ9IGNvbnRhaW5pbmcgdGhlIHB1YmxpYyBrZXkgb2YgdGhlIHNpZ25lclxuICAgICAqL1xuICAgIHJlY292ZXIgPSAobXNnOkJ1ZmZlciwgc2lnOkJ1ZmZlcik6QnVmZmVyID0+IHtcbiAgICAgICAgbGV0IHNpZ09iajplbGxpcHRpYy5lYy5TaWduYXR1cmVPcHRpb25zID0gdGhpcy5fc2lnRnJvbVNpZ0J1ZmZlcihzaWcpO1xuICAgICAgICBsZXQgcHViayA9IGVjLnJlY292ZXJQdWJLZXkobXNnLCBzaWdPYmosIHNpZ09iai5yZWNvdmVyeVBhcmFtKTtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHB1YmsuZW5jb2RlQ29tcHJlc3NlZCgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGFzcyBmb3IgcmVwcmVzZW50aW5nIGEgcHJpdmF0ZSBhbmQgcHVibGljIGtleXBhaXIgaW4gQVZBSlMuIFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGVudHJvcHk6QnVmZmVyID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVLZXkoKTtcbiAgICB9XG4gICAgXG59XG5cbi8qKlxuICogQ2xhc3MgZm9yIHJlcHJlc2VudGluZyBhIGtleSBjaGFpbiBpbiBBVkFKUy4gXG4gKiBcbiAqIEB0eXBlcGFyYW0gQVZNS2V5UGFpciBDbGFzcyBleHRlbmRpbmcgW1tLZXlQYWlyXV0gd2hpY2ggaXMgdXNlZCBhcyB0aGUga2V5IGluIFtbQVZNS2V5Q2hhaW5dXVxuICovXG5leHBvcnQgY2xhc3MgQVZNS2V5Q2hhaW4gZXh0ZW5kcyBLZXlDaGFpbjxBVk1LZXlQYWlyPiB7XG5cbiAgICAvKipcbiAgICAgKiBNYWtlcyBhIG5ldyBrZXkgcGFpciwgcmV0dXJucyB0aGUgYWRkcmVzcy5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gZW50cm9weSBPcHRpb25hbCBwYXJhbWV0ZXIgdGhhdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHByb2R1Y2Ugc2VjdXJlIGtleXNcbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBBZGRyZXNzIG9mIHRoZSBuZXcga2V5IHBhaXJcbiAgICAgKi9cbiAgICBtYWtlS2V5ID0gKGVudHJvcHk6QnVmZmVyID0gdW5kZWZpbmVkKTpzdHJpbmcgPT4ge1xuICAgICAgICBsZXQga2V5cGFpcjpBVk1LZXlQYWlyID0gbmV3IEFWTUtleVBhaXIoZW50cm9weSk7XG4gICAgICAgIHRoaXMuYWRkS2V5KGtleXBhaXIpO1xuICAgICAgICByZXR1cm4ga2V5cGFpci5nZXRBZGRyZXNzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBwcml2YXRlIGtleSwgbWFrZXMgYSBuZXcga2V5IHBhaXIsIHJldHVybnMgdGhlIGFkZHJlc3MuXG4gICAgICogXG4gICAgICogQHBhcmFtIHByaXZrIEEge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyfEJ1ZmZlcn0gb3IgQVZBIHNlcmlhbGl6ZWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcHJpdmF0ZSBrZXkgXG4gICAgICogXG4gICAgICogQHJldHVybnMgQWRkcmVzcyBvZiB0aGUgbmV3IGtleSBwYWlyXG4gICAgICovXG4gICAgaW1wb3J0S2V5ID0gKHByaXZrOkJ1ZmZlciB8IHN0cmluZyk6c3RyaW5nID0+IHtcbiAgICAgICAgbGV0IGtleXBhaXI6QVZNS2V5UGFpciA9IG5ldyBBVk1LZXlQYWlyKCk7XG4gICAgICAgIGxldCBwazpCdWZmZXI7XG4gICAgICAgIGlmKHR5cGVvZiBwcml2ayA9PT0gJ3N0cmluZycpe1xuICAgICAgICAgICAgcGsgPSBiaW50b29scy5hdmFEZXNlcmlhbGl6ZShwcml2ayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwayA9IGJpbnRvb2xzLmNvcHlGcm9tKHByaXZrKTtcbiAgICAgICAgfVxuICAgICAgICBrZXlwYWlyLmltcG9ydEtleShwayk7XG4gICAgICAgIGlmKCEoa2V5cGFpci5nZXRBZGRyZXNzKCkgaW4gdGhpcy5rZXlzKSl7XG4gICAgICAgICAgICB0aGlzLmFkZEtleShrZXlwYWlyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ga2V5cGFpci5nZXRBZGRyZXNzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2lnbnMgYSBbW1R4VW5zaWduZWRdXSBhbmQgcmV0dXJucyBzaWduZWQgW1tUeF1dXG4gICAgICogXG4gICAgICogQHBhcmFtIHV0eCBBIFtbVHhVbnNpZ25lZF1dIHRoYXQgbmVlZHMgdG8gYmUgc2lnbmVkXG4gICAgICogXG4gICAgICogQHJldHVybnMgQSBzaWduZWQgW1tUeF1dXG4gICAgICovXG4gICAgc2lnblR4ID0gKHV0eDpUeFVuc2lnbmVkKTpUeCA9PiB7XG4gICAgICAgIGxldCB0eGJ1ZmYgPSB1dHgudG9CdWZmZXIoKTtcbiAgICAgICAgbGV0IG1zZzpCdWZmZXIgPSBCdWZmZXIuZnJvbShjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUodHhidWZmKS5kaWdlc3QoKSk7IFxuICAgICAgICBsZXQgc2lnczpBcnJheTxBcnJheTxTaWduYXR1cmU+PiA9IFtdO1xuICAgICAgICBsZXQgaW5zOkFycmF5PElucHV0PiA9IHV0eC5nZXRJbnMoKTtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGlucy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICBsZXQgYXJyc2lnczpBcnJheTxTaWduYXR1cmU+ID0gW107XG4gICAgICAgICAgICBsZXQgc2lnaWR4czpBcnJheTxTaWdJZHg+ID0gKGluc1tpXSBhcyBTZWNwSW5wdXQpLmdldFNpZ0lkeHMoKTtcbiAgICAgICAgICAgIGZvcihsZXQgaiA9IDA7IGogPCBzaWdpZHhzLmxlbmd0aDsgaisrKXtcbiAgICAgICAgICAgICAgICBsZXQga2V5cGFpcjpBVk1LZXlQYWlyID0gdGhpcy5nZXRLZXkoc2lnaWR4c1tqXS5nZXRTb3VyY2UoKSk7XG4gICAgICAgICAgICAgICAgbGV0IHNpZ252YWw6QnVmZmVyID0ga2V5cGFpci5zaWduKG1zZylcbiAgICAgICAgICAgICAgICBsZXQgc2lnOlNpZ25hdHVyZSA9IG5ldyBTaWduYXR1cmUoKTtcbiAgICAgICAgICAgICAgICBzaWcuZnJvbUJ1ZmZlcihzaWdudmFsKTtcbiAgICAgICAgICAgICAgICBhcnJzaWdzLnB1c2goc2lnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNpZ3MucHVzaChhcnJzaWdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFR4KHV0eCwgc2lncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpbnN0YW5jZSBvZiBBVk1LZXlDaGFpbi5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcigpe1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn0iXX0=

@@ -8,5 +8,5 @@ /**

/**
* Output:
*
* Output Payment:
* OutputID | 04 bytes
* AssetID | 32 bytes
* Amount | 08 bytes

@@ -31,126 +31,17 @@ * Locktime | 08 bytes

export declare abstract class Output {
protected id: Buffer;
protected idnum: number;
protected amount: Buffer;
protected amountValue: BN;
abstract getOutputType: () => number;
abstract getAmount: () => BN;
protected outputid: Buffer;
protected outputidnum: number;
protected assetid: Buffer;
abstract getOutputID: () => number;
abstract getAssetID: () => Buffer;
abstract getAddresses: () => {
[address: string]: BN;
};
abstract getAddressIdx: (address: string) => [number, boolean];
abstract getAddress: (idx: number, tol: boolean) => string;
abstract fromBuffer: (utxobuff: Buffer) => number;
abstract toBuffer: () => Buffer;
abstract toString: () => string;
abstract getSpenders: (addresses: Array<string>, asOf: BN | boolean) => Array<string>;
abstract meetsThreshold: (addresses: Array<string>, asOf: BN | boolean) => boolean;
static comparitor: () => (a: Output, b: Output) => 0 | 1 | -1;
constructor(amount?: BN, assetID?: Buffer);
static comparator: () => (a: Output, b: Output) => 0 | 1 | -1;
constructor(outputidnum: number, assetID?: Buffer);
}
/**
* An [[Output]] class which creates an assetID.
*/
export declare class OutCreateAsset extends Output {
protected locktime: Buffer;
protected threshold: Buffer;
protected numaddrs: Buffer;
protected addresses: Array<Address>;
/**
* @ignore
*/
protected _CAGetAddresses: () => {
[address: string]: BN;
};
/**
* Returns the number for the output type of the output class.
*/
getOutputType: () => number;
/**
* Returns the amount as a {@link https://github.com/indutny/bn.js/|BN}.
*/
getAmount: () => BN;
/**
* Returns the threshold of signers required to spend this output.
*/
getThreshold: () => number;
/**
* Returns the a {@link https://github.com/indutny/bn.js/|BN} repersenting the UNIX Timestamp when the lock is made available.
*/
getLocktime: () => BN;
/**
* Returns the assetID as a {@link https://github.com/feross/buffer|Buffer}.
*/
getAssetID: () => Buffer;
/**
* Returns a map from all addresses as string keys to their locktime represented in {@link https://github.com/indutny/bn.js/|BN}.
*/
getAddresses: () => {
[address: string]: BN;
};
/**
* Returns an array of length 2 with the first index being the index of the provided address and the second being false (as fallback addresses are not available in this output type).
*
* @param address Address to look up to return its index.
*
* @returns An array of length 2, first index is the index the address resides in, second index is false.
*/
getAddressIdx: (address: string) => [number, boolean];
/**
* Returns the address from the index provided.
*
* @param idx The index of the address.
* @param tol Unused, there for compatibility.
*
* @returns Returns the string representing the address.
*/
getAddress: (idx: number, tol?: boolean) => string;
/**
* @ignore
*/
protected _OCAParseBuffer: (utxobuff: Buffer, offset: number) => number;
/**
* Popuates the instance from a {@link https://github.com/feross/buffer|Buffer} representing the [[OutCreateAsset]] and returns the size of the output.
*/
fromBuffer: (utxobuff: Buffer) => number;
/**
* @ignore
*/
protected _OCATxBuffer: () => Buffer;
/**
* Returns the buffer representing the [[OutCreateAsset]] instance.
*/
toBuffer: () => Buffer;
/**
* Returns a base-58 string representing the [[OutCreateAsset]].
*/
toString: () => string;
/**
* @ignore
*/
protected _OCAQualified: (addresses: string[], asOf?: boolean | BN) => string[];
/**
* Given an array of addresses and an optional timestamp, select an array of address strings of qualified spenders for the output.
*/
getSpenders: (addresses: string[], asOf?: boolean | BN) => string[];
/**
* Given an array of addresses and an optional timestamp, returns true if the addresses meet the threshold required to spend the output.
*/
meetsThreshold: (addresses: string[], asOf?: boolean | BN) => boolean;
/**
* An [[Output]] class which creates an assetID.
*
* @param amount A {@link https://github.com/indutny/bn.js/|BN} representing the amount in the output
* @param addresses An array of strings representing addresses
* @param locktime A {@link https://github.com/indutny/bn.js/|BN} representing the locktime
* @param threshold A number representing the the threshold number of signers required to sign the transaction
*/
constructor(amount?: BN, addresses?: Array<string>, locktime?: BN, threshold?: number);
}
/**
* An [[Output]] class which issues a payment on an assetID.
*/
export declare class OutPayment extends Output {
protected assetid: Buffer;
export declare class SecpOutput extends Output {
protected locktime: Buffer;

@@ -160,2 +51,4 @@ protected threshold: Buffer;

protected addresses: Array<Address>;
protected amount: Buffer;
protected amountValue: BN;
/**

@@ -170,3 +63,3 @@ * @ignore

*/
getOutputType: () => number;
getOutputID: () => number;
/**

@@ -201,3 +94,3 @@ * Returns the amount as a {@link https://github.com/indutny/bn.js/|BN}.

*/
getAddressIdx: (address: string) => [number, boolean];
getAddressIdx: (address: string) => number;
/**

@@ -207,7 +100,6 @@ * Returns the address from the index provided.

* @param idx The index of the address.
* @param tol Unused, there for compatibility.
*
* @returns Returns the string representing the address.
*/
getAddress: (idx: number, tol?: boolean) => string;
getAddress: (idx: number) => string;
/**

@@ -236,11 +128,11 @@ * @ignore

*/
protected _OPQualified: (addresses: string[], asOf?: boolean | BN) => string[];
protected _OPQualified: (addresses: string[], asOf?: BN) => string[];
/**
* Given an array of addresses and an optional timestamp, select an array of address strings of qualified spenders for the output.
*/
getSpenders: (addresses: string[], asOf?: boolean | BN) => string[];
getSpenders: (addresses: string[], asOf?: BN) => string[];
/**
* Given an array of addresses and an optional timestamp, returns true if the addresses meet the threshold required to spend the output.
*/
meetsThreshold: (addresses: string[], asOf?: boolean | BN) => boolean;
meetsThreshold: (addresses: string[], asOf?: BN) => boolean;
/**

@@ -257,93 +149,2 @@ * An [[Output]] class which issues a payment on an assetID.

}
/**
* An [[Output]] class which issues a payment on an assetID and has fallback addresses and locktimes.
*/
export declare class OutTakeOrLeave extends OutPayment {
protected fallLocktime: Buffer;
protected fallThreshold: Buffer;
protected numfalladdrs: Buffer;
protected fallAddresses: Array<Address>;
/**
* Returns the threshold of fallback signers required to spend this output.
*/
getFallThreshold: () => number;
/**
* Returns the a {@link https://github.com/indutny/bn.js/|BN} repersenting the UNIX Timestamp when the fallback lock is made available.
*/
getFallLocktime: () => BN;
/**
* @ignore
*/
protected _TOLGetAddresses: () => {
[address: string]: BN;
};
/**
* Returns a map from all addresses as string keys to their locktime represented in {@link https://github.com/indutny/bn.js/|BN}.
*/
getAddresses: () => {
[address: string]: BN;
};
/**
* Returns an array of length 2 with the first index being the index of the provided address and the second being false (as fallback addresses are not available in this output type).
*
* @param address Address to look up to return its index.
*
* @returns An array of length 2, first index is the index the address resides in, second index is false.
*/
getAddressIdx: (address: string) => [number, boolean];
/**
* Returns the address from the index provided.
*
* @param idx The index of the address.
* @param tol Indicates whether the address is a take it or leave it
*
* @returns Returns the string representing the address.
*/
getAddress: (idx: number, tol?: boolean) => string;
/**
* @ignore
*/
protected _TOLParseBuffer: (utxobuff: Buffer, offset: number) => number;
/**
* Popuates the instance from a {@link https://github.com/feross/buffer|Buffer} representing the [[OutTakeOrLeave]] and returns the size of the output.
*/
fromBuffer: (utxobuff: Buffer) => number;
/**
* @ignore
*/
protected _TOLBuffer: () => Buffer;
/**
* Returns the buffer representing the [[OutTakeOrLeave]] instance.
*/
toBuffer: () => Buffer;
/**
* Returns a base-58 string representing the [[OutTakeOrLeave]].
*/
toString: () => string;
/**
* @ignore
*/
protected _TOLQualified: (addresses: string[], asOf?: boolean | BN) => string[];
/**
* Given an array of addresses and an optional timestamp, select an array of address strings of qualified spenders for the output.
*/
getSpenders: (addresses: string[], asOf?: boolean | BN) => string[];
/**
* Given an array of addresses and an optional timestamp, returns true if the addresses meet the threshold required to spend the output.
*/
meetsThreshold: (addresses: string[], asOf?: boolean | BN) => boolean;
/**
* An [[Output]] class which issues a payment on an assetID and has fallback addresses and locktimes.
*
* @param assetid A {@link https://github.com/feross/buffer|Buffer} representing the AssetID
* @param amount A {@link https://github.com/indutny/bn.js/|BN} representing the amount in the output
* @param addresses An array of strings representing addresses
* @param falladdresses An array of strings representing fallback addresses
* @param locktime A {@link https://github.com/indutny/bn.js/|BN} representing the locktime
* @param falllocktime A {@link https://github.com/indutny/bn.js/|BN} representing the fallback locktime
* @param threshold A number representing the threshold number of signers required to sign the transaction
* @param fallthreshold A number representing the fallback threshold number of signers required to sign the transaction
*/
constructor(assetid: Buffer, amount?: BN, addresses?: Array<string>, falladdresses?: Array<string>, locktime?: BN, falllocktime?: BN, threshold?: number, fallthreshold?: number);
}
//# sourceMappingURL=outputs.d.ts.map

@@ -13,3 +13,3 @@ /**

* Unsigned Tx:
* Codec | 4 bytes
* TxID | 4 bytes
* NetworkID | 4 bytes

@@ -25,3 +25,3 @@ * BlockchainID | 32 bytes

export declare class TxUnsigned {
protected codec: Buffer;
protected txtype: Buffer;
protected networkid: Buffer;

@@ -34,5 +34,5 @@ protected blockchainid: Buffer;

/**
* Returns the number representation of the codec
* Returns the number representation of the txtype
*/
getCodec: () => number;
getTxType: () => number;
/**

@@ -83,5 +83,5 @@ * Returns the number representation of the NetworkID

* @param blockchainid Optional blockchainid, default Buffer.alloc(32, 16)
* @param codec Optional codec, default 2
* @param txtype Optional txtype, default 2
*/
constructor(ins?: Array<Input>, outs?: Array<Output>, networkid?: number, blockchainid?: Buffer, codec?: number);
constructor(ins?: Array<Input>, outs?: Array<Output>, networkid?: number, blockchainid?: Buffer, txtype?: number);
}

@@ -93,3 +93,3 @@ /**

protected tx: TxUnsigned;
protected signatures: Array<Signature>;
protected signatures: Array<Array<Signature>>;
/**

@@ -131,4 +131,4 @@ * Takes a {@link https://github.com/feross/buffer|Buffer} containing an [[Tx]], parses it, populates the class, and returns the length of the Tx in bytes.

*/
constructor(tx?: TxUnsigned, signatures?: Array<Signature>);
constructor(tx?: TxUnsigned, signatures?: Array<Array<Signature>>);
}
//# sourceMappingURL=tx.d.ts.map

@@ -23,3 +23,3 @@ "use strict";

* Unsigned Tx:
* Codec | 4 bytes
* TxID | 4 bytes
* NetworkID | 4 bytes

@@ -51,6 +51,6 @@ * BlockchainID | 32 bytes

* @param blockchainid Optional blockchainid, default Buffer.alloc(32, 16)
* @param codec Optional codec, default 2
* @param txtype Optional txtype, default 2
*/
constructor(ins, outs, networkid = 2, blockchainid = buffer_1.Buffer.alloc(32, 16), codec = 2) {
this.codec = buffer_1.Buffer.alloc(4);
constructor(ins, outs, networkid = 2, blockchainid = buffer_1.Buffer.alloc(32, 16), txtype = 0) {
this.txtype = buffer_1.Buffer.alloc(4);
this.networkid = buffer_1.Buffer.alloc(4);

@@ -61,6 +61,6 @@ this.blockchainid = buffer_1.Buffer.alloc(32);

/**
* Returns the number representation of the codec
* Returns the number representation of the txtype
*/
this.getCodec = () => {
return this.codec.readUInt32BE(0);
this.getTxType = () => {
return this.txtype.readUInt32BE(0);
};

@@ -102,3 +102,3 @@ /**

let offset = 0;
this.codec = bintools.copyFrom(bytes, offset, offset + 4);
this.txtype = bintools.copyFrom(bytes, offset, offset + 4);
offset += 4;

@@ -136,8 +136,8 @@ this.networkid = bintools.copyFrom(bytes, offset, offset + 4);

try {
this.outs.sort(outputs_1.Output.comparitor());
this.ins.sort(inputs_1.Input.comparitor());
this.outs.sort(outputs_1.Output.comparator());
this.ins.sort(inputs_1.Input.comparator());
this.numouts.writeUInt32BE(this.outs.length, 0);
this.numins.writeUInt32BE(this.ins.length, 0);
let bsize = this.codec.length + this.networkid.length + this.blockchainid.length + this.numouts.length;
let barr = [this.codec, this.networkid, this.blockchainid, this.numouts];
let bsize = this.txtype.length + this.networkid.length + this.blockchainid.length + this.numouts.length;
let barr = [this.txtype, this.networkid, this.blockchainid, this.numouts];
for (let i = 0; i < this.outs.length; i++) {

@@ -177,3 +177,3 @@ let b = this.outs[i].toBuffer();

};
this.codec.writeUInt32BE(codec, 0);
this.txtype.writeUInt32BE(txtype, 0);
this.networkid.writeUInt32BE(networkid, 0);

@@ -183,5 +183,5 @@ this.blockchainid = blockchainid;

this.numouts.writeUInt32BE(outs.length, 0);
this.outs = outs.sort(outputs_1.Output.comparitor());
this.outs = outs.sort(outputs_1.Output.comparator());
this.numins.writeUInt32BE(ins.length, 0);
this.ins = ins.sort(inputs_1.Input.comparitor());
this.ins = ins.sort(inputs_1.Input.comparator());
}

@@ -214,16 +214,21 @@ }

let offset = this.tx.fromBuffer(bytes);
if ((bytes.length - offset) % 65 == 0) {
let numsigs = (bytes.length - offset) / 65;
this.signatures = [];
for (let i = 0; i < numsigs; i++) {
let numcreds = bintools.copyFrom(bytes, offset, offset + 4).readUInt32BE(0);
offset += 4;
this.signatures = [];
for (let i = 0; i < numcreds; i++) {
let sigarray = [];
let credential = bintools.copyFrom(bytes, offset, offset + 4).readUInt32BE(0);
if (credential != types_1.Constants.SECPCREDENTIAL) {
throw new Error("Error - Tx.fromBuffer: Invalid credentialID " + credential);
}
let numsigs = bintools.copyFrom(bytes, offset, offset + 4).readUInt32BE(0);
offset += 4;
for (let j = 0; j < numsigs; j++) {
let sig = new types_1.Signature();
sig.fromBuffer(bintools.copyFrom(bytes, offset, offset + 65));
this.signatures.push(sig);
sigarray.push(sig);
offset += 65;
}
this.signatures.push(sigarray);
}
else {
/* istanbul ignore next */
throw new Error("Error - Tx.fromBuffer: the signature block's byte length isn't evenly divisible by 65 and it should be");
}
return offset;

@@ -250,8 +255,21 @@ };

let txbuff = this.tx.toBuffer();
let barr = [txbuff];
let bsize = txbuff.length;
let sigarrlen = buffer_1.Buffer.alloc(4);
sigarrlen.writeUInt32BE(this.signatures.length, 0);
let barr = [txbuff, sigarrlen];
bsize += sigarrlen.length;
for (let i = 0; i < this.signatures.length; i++) {
let b = this.signatures[i].toBuffer();
barr.push(b);
bsize += b.length;
let siglen = buffer_1.Buffer.alloc(4);
siglen.writeUInt32BE(this.signatures[i].length, 0);
let credentialID = buffer_1.Buffer.alloc(4);
credentialID.writeUInt32BE(types_1.Constants.SECPCREDENTIAL, 0);
barr.push(credentialID);
bsize += credentialID.length;
barr.push(siglen);
bsize += siglen.length;
for (let j = 0; j < this.signatures[i].length; j++) {
let b = this.signatures[i][j].toBuffer();
barr.push(b);
bsize += b.length;
}
}

@@ -286,2 +304,2 @@ let buff = buffer_1.Buffer.concat(barr, bsize);

exports.Tx = Tx;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpcy9hdm0vdHgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7R0FFRztBQUNILG9DQUErQjtBQUMvQixtQ0FBb0M7QUFDcEMsdUNBQXNEO0FBQ3RELHFDQUFpQztBQUNqQyxvRUFBNEM7QUFFNUM7O0dBRUc7QUFDSCxNQUFNLFFBQVEsR0FBRyxrQkFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBRXhDOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0g7Ozs7R0FJRztBQUNIOzs7R0FHRztBQUNILE1BQWEsVUFBVTtJQW1JbkI7Ozs7Ozs7O09BUUc7SUFDSCxZQUFZLEdBQWlCLEVBQUUsSUFBbUIsRUFBRSxZQUFtQixDQUFDLEVBQUUsZUFBc0IsZUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsUUFBZSxDQUFDO1FBM0k1SCxVQUFLLEdBQVUsZUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQixjQUFTLEdBQVUsZUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQyxpQkFBWSxHQUFVLGVBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkMsWUFBTyxHQUFVLGVBQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFakMsV0FBTSxHQUFVLGVBQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFHMUM7O1dBRUc7UUFDSCxhQUFRLEdBQUcsR0FBVSxFQUFFO1lBQ25CLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFBO1FBRUQ7O1dBRUc7UUFDSCxpQkFBWSxHQUFHLEdBQVUsRUFBRTtZQUN2QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFD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TUFBTSxDQUFBO2lCQUNwQjtnQkFDRCxJQUFJLElBQUksR0FBVSxlQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDN0MsT0FBTyxJQUFJLENBQUM7YUFDZjtZQUFDLE9BQU0sQ0FBQyxFQUFFO2dCQUNQLDBCQUEwQjtnQkFDMUIsSUFBSSxJQUFJLEdBQVUsNkJBQTZCLEdBQUcsQ0FBQyxDQUFDO2dCQUNwRCwwQkFBMEI7Z0JBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDekI7UUFDTCxDQUFDLENBQUE7UUFFRDs7Ozs7V0FLRztRQUNILGFBQVEsR0FBRyxHQUFVLEVBQUU7WUFDbkIsT0FBTyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELENBQUMsQ0FBQTtRQVNHLElBQUcsRUFBRSxFQUFDO1lBQ0YsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDYixJQUFHLFVBQVUsRUFBQztnQkFDVixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQTthQUMvQjtTQUNKO0lBQ0wsQ0FBQztDQUNKO0FBMUZELGdCQTBGQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG1vZHVsZSBBVk1BUElcbiAqL1xuaW1wb3J0IHtCdWZmZXJ9IGZyb20gXCJidWZmZXIvXCI7XG5pbXBvcnQgeyBTaWduYXR1cmUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IE91dHB1dCwgU2VsZWN0T3V0cHV0Q2xhc3MgfSBmcm9tICcuL291dHB1dHMnO1xuaW1wb3J0IHsgSW5wdXQgfSBmcm9tICcuL2lucHV0cyc7XG5pbXBvcnQgQmluVG9vbHMgZnJvbSAnLi4vLi4vdXRpbHMvYmludG9vbHMnO1xuXG4vKipcbiAqIEBpZ25vcmVcbiAqL1xuY29uc3QgYmludG9vbHMgPSBCaW5Ub29scy5nZXRJbnN0YW5jZSgpO1xuXG4vKiogXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgYW4gdW5zaWduZWQgdHJhbnNhY3Rpb24uXG4gKiBcbiAqIEByZW1hcmtzXG4gKiBVbnNpZ25lZCBUeDpcbiAqIENvZGVjICAgICAgfCA0IGJ5dGVzXG4gKiBOZXR3b3JrSUQgIHwgNCBieXRlc1xuICogQmxvY2tjaGFpbklEICAgfCAzMiBieXRlc1xuICogTnVtT3V0cyAgICB8IDQgYnl0ZXNcbiAqIFJlcGVhdGVkIChOdW1PdXRzKTpcbiAqICAgICBPdXQgICAgfCA/IGJ5dGVzXG4gKiBOdW1JbnMgICAgIHwgNCBieXRlc1xuICogUmVwZWF0ZWQgKE51bUlucyk6XG4gKiAgICAgSW4gICAgIHwgPyBieXRlc1xuICovXG4vKiBUeDpcbiAqIFVuc2lnbmVkIFR4IHwgPyBieXRlc1xuICogUmVwZWF0ZWQgKE51bUlucyk6XG4gKiAgICAgU2lnICAgICB8ID8gYnl0ZXNcbiAqL1xuLyogU2lnOlxuICogUmVwZWF0ZWQgKE51bVNpZ3MpOlxuICogICAgIFNpZyAgICB8IDY1IGJ5dGVzXG4gKi9cbmV4cG9ydCBjbGFzcyBUeFVuc2lnbmVkIHtcbiAgICBwcm90ZWN0ZWQgY29kZWM6QnVmZmVyID0gQnVmZmVyLmFsbG9jKDQpO1xuICAgIHByb3RlY3RlZCBuZXR3b3JraWQ6QnVmZmVyID0gQnVmZmVyLmFsbG9jKDQpO1xuICAgIHByb3RlY3RlZCBibG9ja2NoYWluaWQ6QnVmZmVyID0gQnVmZmVyLmFsbG9jKDMyKTtcbiAgICBwcm90ZWN0ZWQgbnVtb3V0czpCdWZmZXIgPSBCdWZmZXIuYWxsb2MoNCk7XG4gICAgcHJvdGVjdGVkIG91dHM6QXJyYXk8T3V0cHV0PjtcbiAgICBwcm90ZWN0ZWQgbnVtaW5zOkJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgICBwcm90ZWN0ZWQgaW5zOkFycmF5PElucHV0PjtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29kZWNcbiAgICAgKi9cbiAgICBnZXRDb2RlYyA9ICgpOm51bWJlciA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvZGVjLnJlYWRVSW50MzJCRSgwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgcmVwcmVzZW50YXRpb24gb2YgdGhlIE5ldHdvcmtJRFxuICAgICAqL1xuICAgIGdldE5ldHdvcmtJRCA9ICgpOm51bWJlciA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLm5ldHdvcmtpZC5yZWFkVUludDMyQkUoMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgQnVmZmVyIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBCbG9ja2NoYWluSURcbiAgICAgKi9cbiAgICBnZXRCbG9ja2NoYWluSUQgPSAoKTpCdWZmZXIgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ibG9ja2NoYWluaWQ7XG4gICAgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGFycmF5IG9mIFtbSW5wdXRdXXNcbiAgICAgKi9cbiAgICBnZXRJbnMgPSAoKTpBcnJheTxJbnB1dD4gPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYXJyYXkgb2YgW1tPdXRwdXRdXXNcbiAgICAgKi9cbiAgICBnZXRPdXRzID0gKCk6QXJyYXk8T3V0cHV0PiA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLm91dHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGFrZXMgYSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfSBjb250YWluaW5nIGFuIFtbVHhVbnNpZ25lZF1dLCBwYXJzZXMgaXQsIHBvcHVsYXRlcyB0aGUgY2xhc3MsIGFuZCByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIFR4VW5zaWduZWQgaW4gYnl0ZXMuXG4gICAgICogXG4gICAgICogQHBhcmFtIGJ5dGVzIEEge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyfEJ1ZmZlcn0gY29udGFpbmluZyBhIHJhdyBbW1R4VW5zaWduZWRdXVxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIFRoZSBsZW5ndGggb2YgdGhlIHJhdyBbW1R4VW5zaWduZWRdXVxuICAgICAqIFxuICAgICAqIEByZW1hcmtzIGFzc3VtZSBub3QtY2hlY2tzdW1tZWQgYW5kIGRlc2VyaWFsaXplZFxuICAgICAqL1xuICAgIGZyb21CdWZmZXIgPSAoYnl0ZXM6QnVmZmVyKTpudW1iZXIgPT4ge1xuICAgICAgICBsZXQgb2Zmc2V0Om51bWJlciA9IDA7XG4gICAgICAgIHRoaXMuY29kZWMgPSBiaW50b29scy5jb3B5RnJvbShieXRlcywgb2Zmc2V0LCBvZmZzZXQgKyA0KTtcbiAgICAgICAgb2Zmc2V0ICs9IDQ7XG4gICAgICAgIHRoaXMubmV0d29ya2lkID0gYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgNCk7XG4gICAgICAgIG9mZnNldCArPSA0O1xuICAgICAgICB0aGlzLmJsb2NrY2hhaW5pZCA9IGJpbnRvb2xzLmNvcHlGcm9tKGJ5dGVzLCBvZmZzZXQsIG9mZnNldCArIDMyKTtcbiAgICAgICAgb2Zmc2V0ICs9IDMyO1xuICAgICAgICB0aGlzLm51bW91dHMgPSBiaW50b29scy5jb3B5RnJvbShieXRlcywgb2Zmc2V0LCBvZmZzZXQgKyA0KTtcbiAgICAgICAgb2Zmc2V0ICs9IDQ7XG4gICAgICAgIGxldCBvdXRjb3VudDpudW1iZXIgPSB0aGlzLm51bW91dHMucmVhZFVJbnQzMkJFKDApO1xuICAgICAgICB0aGlzLm91dHMgPSBbXTtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IG91dGNvdW50OyBpKyspe1xuICAgICAgICAgICAgbGV0IG91dGJ1ZmY6QnVmZmVyID0gYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgYnl0ZXMubGVuZ3RoKTtcbiAgICAgICAgICAgIGxldCBvdXQ6T3V0cHV0ID0gU2VsZWN0T3V0cHV0Q2xhc3Mob3V0YnVmZik7XG4gICAgICAgICAgICBvZmZzZXQgKz0gb3V0LmZyb21CdWZmZXIob3V0YnVmZik7XG4gICAgICAgICAgICB0aGlzLm91dHMucHVzaChvdXQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubnVtaW5zID0gYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgNCk7XG4gICAgICAgIG9mZnNldCArPSA0O1xuICAgICAgICBsZXQgaW5jb3VudDpudW1iZXIgPSB0aGlzLm51bWlucy5yZWFkVUludDMyQkUoMCk7XG4gICAgICAgIHRoaXMuaW5zID0gW107XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBpbmNvdW50OyBpKyspe1xuICAgICAgICAgICAgbGV0IGluYnVmZjpCdWZmZXIgPSBiaW50b29scy5jb3B5RnJvbShieXRlcywgb2Zmc2V0LCBieXRlcy5sZW5ndGgpO1xuICAgICAgICAgICAgbGV0IGlucHV0OklucHV0ID0gbmV3IElucHV0KCk7XG4gICAgICAgICAgICBvZmZzZXQgKz0gaW5wdXQuZnJvbUJ1ZmZlcihpbmJ1ZmYpO1xuICAgICAgICAgICAgdGhpcy5pbnMucHVzaChpbnB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaWdub3JlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9iYXNpY1R4QnVmZmVyID0gKCk6QnVmZmVyID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMub3V0cy5zb3J0KE91dHB1dC5jb21wYXJpdG9yKCkpO1xuICAgICAgICAgICAgdGhpcy5pbnMuc29ydChJbnB1dC5jb21wYXJpdG9yKCkpO1xuICAgICAgICAgICAgdGhpcy5udW1vdXRzLndyaXRlVUludDMyQkUodGhpcy5vdXRzLmxlbmd0aCwgMCk7XG4gICAgICAgICAgICB0aGlzLm51bWlucy53cml0ZVVJbnQzMkJFKHRoaXMuaW5zLmxlbmd0aCwgMCk7XG4gICAgICAgICAgICBsZXQgYnNpemU6bnVtYmVyID0gdGhpcy5jb2RlYy5sZW5ndGggKyB0aGlzLm5ldHdvcmtpZC5sZW5ndGggKyB0aGlzLmJsb2NrY2hhaW5pZC5sZW5ndGggKyB0aGlzLm51bW91dHMubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IGJhcnI6QXJyYXk8QnVmZmVyPiA9IFt0aGlzLmNvZGVjLCB0aGlzLm5ldHdvcmtpZCwgdGhpcy5ibG9ja2NoYWluaWQsIHRoaXMubnVtb3V0c107XG4gICAgICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhpcy5vdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGI6QnVmZmVyID0gdGhpcy5vdXRzW2ldLnRvQnVmZmVyKCk7XG4gICAgICAgICAgICAgICAgYmFyci5wdXNoKGIpO1xuICAgICAgICAgICAgICAgIGJzaXplICs9IGIubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYmFyci5wdXNoKHRoaXMubnVtaW5zKTtcbiAgICAgICAgICAgIGJzaXplICs9IHRoaXMubnVtaW5zLmxlbmd0aDtcbiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCB0aGlzLmlucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBiOkJ1ZmZlciA9IHRoaXMuaW5zW2ldLnRvQnVmZmVyKCk7XG4gICAgICAgICAgICAgICAgYmFyci5wdXNoKGIpO1xuICAgICAgICAgICAgICAgIGJzaXplICs9IGIubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGJ1ZmY6QnVmZmVyID0gQnVmZmVyLmNvbmNhdChiYXJyLCBic2l6ZSk7XG4gICAgICAgICAgICByZXR1cm4gYnVmZjtcbiAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgICAgbGV0IGVtc2c6c3RyaW5nID0gXCJFcnJvciAtIFR4VW5zaWduZWQuX2Jhc2ljVHhCdWZmZXI6IFwiICsgZTtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZW1zZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyfEJ1ZmZlcn0gcmVwcmVzZW50YXRpb24gb2YgdGhlIFtbVHhVbnNpZ25lZF1dLlxuICAgICAqL1xuICAgIHRvQnVmZmVyID0gKCk6QnVmZmVyID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Jhc2ljVHhCdWZmZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgYmFzZS01OCByZXByZXNlbnRhdGlvbiBvZiB0aGUgW1tUeFVuc2lnbmVkXV0uXG4gICAgICovXG4gICAgdG9TdHJpbmcgPSAoKTpzdHJpbmcgPT4ge1xuICAgICAgICByZXR1cm4gYmludG9vbHMuYnVmZmVyVG9CNTgodGhpcy50b0J1ZmZlcigpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGFzcyByZXByZXNlbnRpbmcgYW4gdW5zaWduZWQgdHJhbnNhY3Rpb24uXG4gICAgICogXG4gICAgICogQHBhcmFtIGlucyBPcHRpb25hbCBhcnJheSBvZiB0aGUgW1tJbnB1dF1dc1xuICAgICAqIEBwYXJhbSBvdXRzIE9wdGlvbmFsIGFycmF5IG9mIHRoZSBbW091dHB1dF1dc1xuICAgICAqIEBwYXJhbSBuZXR3b3JraWQgT3B0aW9uYWwgbmV0d29ya2lkLCBkZWZhdWx0IDJcbiAgICAgKiBAcGFyYW0gYmxvY2tjaGFpbmlkIE9wdGlvbmFsIGJsb2NrY2hhaW5pZCwgZGVmYXVsdCBCdWZmZXIuYWxsb2MoMzIsIDE2KVxuICAgICAqIEBwYXJhbSBjb2RlYyBPcHRpb25hbCBjb2RlYywgZGVmYXVsdCAyXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoaW5zPzpBcnJheTxJbnB1dD4sIG91dHM/OkFycmF5PE91dHB1dD4sIG5ldHdvcmtpZDpudW1iZXIgPSAyLCBibG9ja2NoYWluaWQ6QnVmZmVyID0gQnVmZmVyLmFsbG9jKDMyLCAxNiksIGNvZGVjOm51bWJlciA9IDIpIHtcbiAgICAgICAgdGhpcy5jb2RlYy53cml0ZVVJbnQzMkJFKGNvZGVjLCAwKTtcbiAgICAgICAgdGhpcy5uZXR3b3JraWQud3JpdGVVSW50MzJCRShuZXR3b3JraWQsIDApO1xuICAgICAgICB0aGlzLmJsb2NrY2hhaW5pZCA9IGJsb2NrY2hhaW5pZDtcbiAgICAgICAgaWYoaW5zICYmIG91dHMpe1xuICAgICAgICAgICAgdGhpcy5udW1vdXRzLndyaXRlVUludDMyQkUob3V0cy5sZW5ndGgsIDApO1xuICAgICAgICAgICAgdGhpcy5vdXRzID0gb3V0cy5zb3J0KE91dHB1dC5jb21wYXJpdG9yKCkpO1xuICAgICAgICAgICAgdGhpcy5udW1pbnMud3JpdGVVSW50MzJCRShpbnMubGVuZ3RoLCAwKTtcbiAgICAgICAgICAgIHRoaXMuaW5zID0gaW5zLnNvcnQoSW5wdXQuY29tcGFyaXRvcigpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgYSBzaWduZWQgdHJhbnNhY3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBUeCB7XG4gICAgcHJvdGVjdGVkIHR4OlR4VW5zaWduZWQgPSBuZXcgVHhVbnNpZ25lZCgpO1xuICAgIHByb3RlY3RlZCBzaWduYXR1cmVzOkFycmF5PFNpZ25hdHVyZT4gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIFRha2VzIGEge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyfEJ1ZmZlcn0gY29udGFpbmluZyBhbiBbW1R4XV0sIHBhcnNlcyBpdCwgcG9wdWxhdGVzIHRoZSBjbGFzcywgYW5kIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgVHggaW4gYnl0ZXMuXG4gICAgICogXG4gICAgICogQHBhcmFtIGJ5dGVzIEEge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyfEJ1ZmZlcn0gY29udGFpbmluZyBhIHJhdyBbW1R4XV1cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBUaGUgbGVuZ3RoIG9mIHRoZSByYXcgW1tUeF1dXG4gICAgICovXG4gICAgZnJvbUJ1ZmZlciA9IChieXRlczpCdWZmZXIpOm51bWJlciA9PiB7XG4gICAgICAgIHRoaXMudHggPSBuZXcgVHhVbnNpZ25lZCgpO1xuICAgICAgICBsZXQgb2Zmc2V0Om51bWJlciA9IHRoaXMudHguZnJvbUJ1ZmZlcihieXRlcyk7XG4gICAgICAgIGlmKChieXRlcy5sZW5ndGggLSBvZmZzZXQpICUgNjUgPT0gMCl7XG4gICAgICAgICAgICBsZXQgbnVtc2lnczpudW1iZXIgPSAoYnl0ZXMubGVuZ3RoIC0gb2Zmc2V0KSAvIDY1O1xuICAgICAgICAgICAgdGhpcy5zaWduYXR1cmVzID0gW107XG4gICAgICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgbnVtc2lnczsgaSsrKXtcbiAgICAgICAgICAgICAgICBsZXQgc2lnOlNpZ25hdHVyZSA9IG5ldyBTaWduYXR1cmUoKTtcbiAgICAgICAgICAgICAgICBzaWcuZnJvbUJ1ZmZlcihiaW50b29scy5jb3B5RnJvbShieXRlcywgb2Zmc2V0LCBvZmZzZXQgKyA2NSkpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2lnbmF0dXJlcy5wdXNoKHNpZyk7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDY1O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycm9yIC0gVHguZnJvbUJ1ZmZlcjogdGhlIHNpZ25hdHVyZSBibG9jaydzIGJ5dGUgbGVuZ3RoIGlzbid0IGV2ZW5seSBkaXZpc2libGUgYnkgNjUgYW5kIGl0IHNob3VsZCBiZVwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUYWtlcyBhIGJhc2UtNTggc3RyaW5nIGNvbnRhaW5pbmcgYW4gW1tUeF1dLCBwYXJzZXMgaXQsIHBvcHVsYXRlcyB0aGUgY2xhc3MsIGFuZCByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIFR4IGluIGJ5dGVzLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBzZXJpYWxpemVkIEEgYmFzZS01OCBzdHJpbmcgY29udGFpbmluZyBhIHJhdyBbW1R4XV1cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBUaGUgbGVuZ3RoIG9mIHRoZSByYXcgW1tUeF1dXG4gICAgICogXG4gICAgICogQHJlbWFya3MgXG4gICAgICogdW5saWtlIG1vc3QgZnJvbVN0cmluZ3MsIGl0IGV4cGVjdHMgdGhlIHN0cmluZyB0byBiZSBzZXJpYWxpemVkIGluIEFWQSBmb3JtYXRcbiAgICAgKi9cbiAgICBmcm9tU3RyaW5nID0gKHNlcmlhbGl6ZWQ6c3RyaW5nKTpudW1iZXIgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5mcm9tQnVmZmVyKGJpbnRvb2xzLmF2YURlc2VyaWFsaXplKHNlcmlhbGl6ZWQpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyfEJ1ZmZlcn0gcmVwcmVzZW50YXRpb24gb2YgdGhlIFtbVHhdXS5cbiAgICAgKi9cbiAgICB0b0J1ZmZlciA9ICgpOkJ1ZmZlciA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgdHhidWZmOiBCdWZmZXIgPSB0aGlzLnR4LnRvQnVmZmVyKCk7XG4gICAgICAgICAgICBsZXQgYmFycjpBcnJheTxCdWZmZXI+ID0gW3R4YnVmZl07XG4gICAgICAgICAgICBsZXQgYnNpemU6bnVtYmVyID0gdHhidWZmLmxlbmd0aDtcbiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCB0aGlzLnNpZ25hdHVyZXMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgIGxldCBiOkJ1ZmZlciA9IHRoaXMuc2lnbmF0dXJlc1tpXS50b0J1ZmZlcigpO1xuICAgICAgICAgICAgICAgIGJhcnIucHVzaChiKTtcbiAgICAgICAgICAgICAgICBic2l6ZSArPSBiLmxlbmd0aFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGJ1ZmY6QnVmZmVyID0gQnVmZmVyLmNvbmNhdChiYXJyLCBic2l6ZSk7XG4gICAgICAgICAgICByZXR1cm4gYnVmZjtcbiAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgICAgbGV0IGVtc2c6c3RyaW5nID0gXCJFcnJvciAtIFR4U2lnbmVkLnRvQnVmZmVyOiBcIiArIGU7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVtc2cpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGJhc2UtNTggQVZBLXNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIFtbVHhdXS5cbiAgICAgKiBcbiAgICAgKiBAcmVtYXJrcyBcbiAgICAgKiB1bmxpa2UgbW9zdCB0b1N0cmluZ3MsIHRoaXMgcmV0dXJucyBpbiBBVkEgc2VyaWFsaXphdGlvbiBmb3JtYXRcbiAgICAgKi9cbiAgICB0b1N0cmluZyA9ICgpOnN0cmluZyA9PiB7XG4gICAgICAgIHJldHVybiBiaW50b29scy5hdmFTZXJpYWxpemUodGhpcy50b0J1ZmZlcigpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGFzcyByZXByZXNlbnRpbmcgYSBzaWduZWQgdHJhbnNhY3Rpb24uXG4gICAgICogXG4gICAgICogQHBhcmFtIHR4IE9wdGlvbmFsIFtbVHhdXVxuICAgICAqIEBwYXJhbSBzaWduYXR1cmVzIE9wdGlvbmFsIGFycmF5IG9mIFtbU2lnbmF0dXJlXV1zXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodHg/OlR4VW5zaWduZWQsIHNpZ25hdHVyZXM/OkFycmF5PFNpZ25hdHVyZT4pIHtcbiAgICAgICAgaWYodHgpe1xuICAgICAgICAgICAgdGhpcy50eCA9IHR4O1xuICAgICAgICAgICAgaWYoc2lnbmF0dXJlcyl7XG4gICAgICAgICAgICAgICAgdGhpcy5zaWduYXR1cmVzID0gc2lnbmF0dXJlc1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5cbiJdfQ==
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpcy9hdm0vdHgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7R0FFRztBQUNILG9DQUErQjtBQUMvQixtQ0FBK0M7QUFDL0MsdUNBQXNEO0FBQ3RELHFDQUFpQztBQUNqQyxvRUFBNEM7QUFFNUM7O0dBRUc7QUFDSCxNQUFNLFFBQVEsR0FBRyxrQkFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBRXhDOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0g7Ozs7R0FJRztBQUNIOzs7R0FHRztBQUNILE1BQWEsVUFBVTtJQW1JbkI7Ozs7Ozs7O09BUUc7SUFDSCxZQUFZLEdBQWlCLEVBQUUsSUFBbUIsRUFBRSxZQUFtQixDQUFDLEVBQUUsZUFBc0IsZUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsU0FBZ0IsQ0FBQztRQTNJN0gsV0FBTSxHQUFVLGVBQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEMsY0FBUyxHQUFVLGVBQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsaUJBQVksR0FBVSxlQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLFlBQU8sR0FBVSxlQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWpDLFdBQU0sR0FBVSxlQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRzFDOztXQUVHO1FBQ0gsY0FBUyxHQUFHLEdBQVUsRUFBRTtZQUNwQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsQ0FBQTtRQUVEOztXQUVHO1FBQ0gsaUJBQVksR0FBRyxHQUFVLEVBQUU7WUFDdkIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FB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QUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFDO3dCQUM5QyxJQUFJLENBQUMsR0FBVSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO3dCQUNoRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNiLEtBQUssSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDO3FCQUNyQjtpQkFDSjtnQkFDRCxJQUFJLElBQUksR0FBVSxlQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDN0MsT0FBTyxJQUFJLENBQUM7YUFDZjtZQUFDLE9BQU0sQ0FBQyxFQUFFO2dCQUNQLDBCQUEwQjtnQkFDMUIsSUFBSSxJQUFJLEdBQVUsNkJBQTZCLEdBQUcsQ0FBQyxDQUFDO2dCQUNwRCwwQkFBMEI7Z0JBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDekI7UUFDTCxDQUFDLENBQUE7UUFFRDs7Ozs7V0FLRztRQUNILGFBQVEsR0FBRyxHQUFVLEVBQUU7WUFDbkIsT0FBTyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELENBQUMsQ0FBQTtRQVNHLElBQUcsRUFBRSxFQUFDO1lBQ0YsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDYixJQUFHLFVBQVUsRUFBQztnQkFDVixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQTthQUMvQjtTQUNKO0lBQ0wsQ0FBQztDQUNKO0FBN0dELGdCQTZHQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG1vZHVsZSBBVk1BUElcbiAqL1xuaW1wb3J0IHtCdWZmZXJ9IGZyb20gXCJidWZmZXIvXCI7XG5pbXBvcnQgeyBTaWduYXR1cmUsIENvbnN0YW50cyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgT3V0cHV0LCBTZWxlY3RPdXRwdXRDbGFzcyB9IGZyb20gJy4vb3V0cHV0cyc7XG5pbXBvcnQgeyBJbnB1dCB9IGZyb20gJy4vaW5wdXRzJztcbmltcG9ydCBCaW5Ub29scyBmcm9tICcuLi8uLi91dGlscy9iaW50b29scyc7XG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5jb25zdCBiaW50b29scyA9IEJpblRvb2xzLmdldEluc3RhbmNlKCk7XG5cbi8qKiBcbiAqIENsYXNzIHJlcHJlc2VudGluZyBhbiB1bnNpZ25lZCB0cmFuc2FjdGlvbi5cbiAqIFxuICogQHJlbWFya3NcbiAqIFVuc2lnbmVkIFR4OlxuICogVHhJRCAgICAgIHwgNCBieXRlc1xuICogTmV0d29ya0lEICB8IDQgYnl0ZXNcbiAqIEJsb2NrY2hhaW5JRCAgIHwgMzIgYnl0ZXNcbiAqIE51bU91dHMgICAgfCA0IGJ5dGVzXG4gKiBSZXBlYXRlZCAoTnVtT3V0cyk6XG4gKiAgICAgT3V0ICAgIHwgPyBieXRlc1xuICogTnVtSW5zICAgICB8IDQgYnl0ZXNcbiAqIFJlcGVhdGVkIChOdW1JbnMpOlxuICogICAgIEluICAgICB8ID8gYnl0ZXNcbiAqL1xuLyogVHg6XG4gKiBVbnNpZ25lZCBUeCB8ID8gYnl0ZXNcbiAqIFJlcGVhdGVkIChOdW1JbnMpOlxuICogICAgIFNpZyAgICAgfCA/IGJ5dGVzXG4gKi9cbi8qIFNpZzpcbiAqIFJlcGVhdGVkIChOdW1TaWdzKTpcbiAqICAgICBTaWcgICAgfCA2NSBieXRlc1xuICovXG5leHBvcnQgY2xhc3MgVHhVbnNpZ25lZCB7XG4gICAgcHJvdGVjdGVkIHR4dHlwZTpCdWZmZXIgPSBCdWZmZXIuYWxsb2MoNCk7XG4gICAgcHJvdGVjdGVkIG5ldHdvcmtpZDpCdWZmZXIgPSBCdWZmZXIuYWxsb2MoNCk7XG4gICAgcHJvdGVjdGVkIGJsb2NrY2hhaW5pZDpCdWZmZXIgPSBCdWZmZXIuYWxsb2MoMzIpO1xuICAgIHByb3RlY3RlZCBudW1vdXRzOkJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgICBwcm90ZWN0ZWQgb3V0czpBcnJheTxPdXRwdXQ+O1xuICAgIHByb3RlY3RlZCBudW1pbnM6QnVmZmVyID0gQnVmZmVyLmFsbG9jKDQpO1xuICAgIHByb3RlY3RlZCBpbnM6QXJyYXk8SW5wdXQ+O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0eHR5cGVcbiAgICAgKi9cbiAgICBnZXRUeFR5cGUgPSAoKTpudW1iZXIgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy50eHR5cGUucmVhZFVJbnQzMkJFKDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciByZXByZXNlbnRhdGlvbiBvZiB0aGUgTmV0d29ya0lEXG4gICAgICovXG4gICAgZ2V0TmV0d29ya0lEID0gKCk6bnVtYmVyID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV0d29ya2lkLnJlYWRVSW50MzJCRSgwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBCdWZmZXIgcmVwcmVzZW50YXRpb24gb2YgdGhlIEJsb2NrY2hhaW5JRFxuICAgICAqL1xuICAgIGdldEJsb2NrY2hhaW5JRCA9ICgpOkJ1ZmZlciA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmJsb2NrY2hhaW5pZDtcbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYXJyYXkgb2YgW1tJbnB1dF1dc1xuICAgICAqL1xuICAgIGdldElucyA9ICgpOkFycmF5PElucHV0PiA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBbW091dHB1dF1dc1xuICAgICAqL1xuICAgIGdldE91dHMgPSAoKTpBcnJheTxPdXRwdXQ+ID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3V0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUYWtlcyBhIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlcnxCdWZmZXJ9IGNvbnRhaW5pbmcgYW4gW1tUeFVuc2lnbmVkXV0sIHBhcnNlcyBpdCwgcG9wdWxhdGVzIHRoZSBjbGFzcywgYW5kIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgVHhVbnNpZ25lZCBpbiBieXRlcy5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gYnl0ZXMgQSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfSBjb250YWluaW5nIGEgcmF3IFtbVHhVbnNpZ25lZF1dXG4gICAgICogXG4gICAgICogQHJldHVybnMgVGhlIGxlbmd0aCBvZiB0aGUgcmF3IFtbVHhVbnNpZ25lZF1dXG4gICAgICogXG4gICAgICogQHJlbWFya3MgYXNzdW1lIG5vdC1jaGVja3N1bW1lZCBhbmQgZGVzZXJpYWxpemVkXG4gICAgICovXG4gICAgZnJvbUJ1ZmZlciA9IChieXRlczpCdWZmZXIpOm51bWJlciA9PiB7XG4gICAgICAgIGxldCBvZmZzZXQ6bnVtYmVyID0gMDtcbiAgICAgICAgdGhpcy50eHR5cGUgPSBiaW50b29scy5jb3B5RnJvbShieXRlcywgb2Zmc2V0LCBvZmZzZXQgKyA0KTtcbiAgICAgICAgb2Zmc2V0ICs9IDQ7XG4gICAgICAgIHRoaXMubmV0d29ya2lkID0gYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgNCk7XG4gICAgICAgIG9mZnNldCArPSA0O1xuICAgICAgICB0aGlzLmJsb2NrY2hhaW5pZCA9IGJpbnRvb2xzLmNvcHlGcm9tKGJ5dGVzLCBvZmZzZXQsIG9mZnNldCArIDMyKTtcbiAgICAgICAgb2Zmc2V0ICs9IDMyO1xuICAgICAgICB0aGlzLm51bW91dHMgPSBiaW50b29scy5jb3B5RnJvbShieXRlcywgb2Zmc2V0LCBvZmZzZXQgKyA0KTtcbiAgICAgICAgb2Zmc2V0ICs9IDQ7XG4gICAgICAgIGxldCBvdXRjb3VudDpudW1iZXIgPSB0aGlzLm51bW91dHMucmVhZFVJbnQzMkJFKDApO1xuICAgICAgICB0aGlzLm91dHMgPSBbXTtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IG91dGNvdW50OyBpKyspe1xuICAgICAgICAgICAgbGV0IG91dGJ1ZmY6QnVmZmVyID0gYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgYnl0ZXMubGVuZ3RoKTtcbiAgICAgICAgICAgIGxldCBvdXQ6T3V0cHV0ID0gU2VsZWN0T3V0cHV0Q2xhc3Mob3V0YnVmZik7XG4gICAgICAgICAgICBvZmZzZXQgKz0gb3V0LmZyb21CdWZmZXIob3V0YnVmZik7XG4gICAgICAgICAgICB0aGlzLm91dHMucHVzaChvdXQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubnVtaW5zID0gYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgNCk7XG4gICAgICAgIG9mZnNldCArPSA0O1xuICAgICAgICBsZXQgaW5jb3VudDpudW1iZXIgPSB0aGlzLm51bWlucy5yZWFkVUludDMyQkUoMCk7XG4gICAgICAgIHRoaXMuaW5zID0gW107XG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBpbmNvdW50OyBpKyspe1xuICAgICAgICAgICAgbGV0IGluYnVmZjpCdWZmZXIgPSBiaW50b29scy5jb3B5RnJvbShieXRlcywgb2Zmc2V0LCBieXRlcy5sZW5ndGgpO1xuICAgICAgICAgICAgbGV0IGlucHV0OklucHV0ID0gbmV3IElucHV0KCk7XG4gICAgICAgICAgICBvZmZzZXQgKz0gaW5wdXQuZnJvbUJ1ZmZlcihpbmJ1ZmYpO1xuICAgICAgICAgICAgdGhpcy5pbnMucHVzaChpbnB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaWdub3JlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9iYXNpY1R4QnVmZmVyID0gKCk6QnVmZmVyID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMub3V0cy5zb3J0KE91dHB1dC5jb21wYXJhdG9yKCkpO1xuICAgICAgICAgICAgdGhpcy5pbnMuc29ydChJbnB1dC5jb21wYXJhdG9yKCkpO1xuICAgICAgICAgICAgdGhpcy5udW1vdXRzLndyaXRlVUludDMyQkUodGhpcy5vdXRzLmxlbmd0aCwgMCk7XG4gICAgICAgICAgICB0aGlzLm51bWlucy53cml0ZVVJbnQzMkJFKHRoaXMuaW5zLmxlbmd0aCwgMCk7XG4gICAgICAgICAgICBsZXQgYnNpemU6bnVtYmVyID0gdGhpcy50eHR5cGUubGVuZ3RoICsgdGhpcy5uZXR3b3JraWQubGVuZ3RoICsgdGhpcy5ibG9ja2NoYWluaWQubGVuZ3RoICsgdGhpcy5udW1vdXRzLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBiYXJyOkFycmF5PEJ1ZmZlcj4gPSBbdGhpcy50eHR5cGUsIHRoaXMubmV0d29ya2lkLCB0aGlzLmJsb2NrY2hhaW5pZCwgdGhpcy5udW1vdXRzXTtcbiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCB0aGlzLm91dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYjpCdWZmZXIgPSB0aGlzLm91dHNbaV0udG9CdWZmZXIoKTtcbiAgICAgICAgICAgICAgICBiYXJyLnB1c2goYik7XG4gICAgICAgICAgICAgICAgYnNpemUgKz0gYi5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiYXJyLnB1c2godGhpcy5udW1pbnMpO1xuICAgICAgICAgICAgYnNpemUgKz0gdGhpcy5udW1pbnMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHRoaXMuaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGI6QnVmZmVyID0gdGhpcy5pbnNbaV0udG9CdWZmZXIoKTtcbiAgICAgICAgICAgICAgICBiYXJyLnB1c2goYik7XG4gICAgICAgICAgICAgICAgYnNpemUgKz0gYi5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgYnVmZjpCdWZmZXIgPSBCdWZmZXIuY29uY2F0KGJhcnIsIGJzaXplKTtcbiAgICAgICAgICAgIHJldHVybiBidWZmO1xuICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgICBsZXQgZW1zZzpzdHJpbmcgPSBcIkVycm9yIC0gVHhVbnNpZ25lZC5fYmFzaWNUeEJ1ZmZlcjogXCIgKyBlO1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlbXNnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfSByZXByZXNlbnRhdGlvbiBvZiB0aGUgW1tUeFVuc2lnbmVkXV0uXG4gICAgICovXG4gICAgdG9CdWZmZXIgPSAoKTpCdWZmZXIgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmFzaWNUeEJ1ZmZlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBiYXNlLTU4IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBbW1R4VW5zaWduZWRdXS5cbiAgICAgKi9cbiAgICB0b1N0cmluZyA9ICgpOnN0cmluZyA9PiB7XG4gICAgICAgIHJldHVybiBiaW50b29scy5idWZmZXJUb0I1OCh0aGlzLnRvQnVmZmVyKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsYXNzIHJlcHJlc2VudGluZyBhbiB1bnNpZ25lZCB0cmFuc2FjdGlvbi5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gaW5zIE9wdGlvbmFsIGFycmF5IG9mIHRoZSBbW0lucHV0XV1zXG4gICAgICogQHBhcmFtIG91dHMgT3B0aW9uYWwgYXJyYXkgb2YgdGhlIFtbT3V0cHV0XV1zXG4gICAgICogQHBhcmFtIG5ldHdvcmtpZCBPcHRpb25hbCBuZXR3b3JraWQsIGRlZmF1bHQgMlxuICAgICAqIEBwYXJhbSBibG9ja2NoYWluaWQgT3B0aW9uYWwgYmxvY2tjaGFpbmlkLCBkZWZhdWx0IEJ1ZmZlci5hbGxvYygzMiwgMTYpXG4gICAgICogQHBhcmFtIHR4dHlwZSBPcHRpb25hbCB0eHR5cGUsIGRlZmF1bHQgMlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGlucz86QXJyYXk8SW5wdXQ+LCBvdXRzPzpBcnJheTxPdXRwdXQ+LCBuZXR3b3JraWQ6bnVtYmVyID0gMiwgYmxvY2tjaGFpbmlkOkJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygzMiwgMTYpLCB0eHR5cGU6bnVtYmVyID0gMCkge1xuICAgICAgICB0aGlzLnR4dHlwZS53cml0ZVVJbnQzMkJFKHR4dHlwZSwgMCk7XG4gICAgICAgIHRoaXMubmV0d29ya2lkLndyaXRlVUludDMyQkUobmV0d29ya2lkLCAwKTtcbiAgICAgICAgdGhpcy5ibG9ja2NoYWluaWQgPSBibG9ja2NoYWluaWQ7XG4gICAgICAgIGlmKGlucyAmJiBvdXRzKXtcbiAgICAgICAgICAgIHRoaXMubnVtb3V0cy53cml0ZVVJbnQzMkJFKG91dHMubGVuZ3RoLCAwKTtcbiAgICAgICAgICAgIHRoaXMub3V0cyA9IG91dHMuc29ydChPdXRwdXQuY29tcGFyYXRvcigpKTtcbiAgICAgICAgICAgIHRoaXMubnVtaW5zLndyaXRlVUludDMyQkUoaW5zLmxlbmd0aCwgMCk7XG4gICAgICAgICAgICB0aGlzLmlucyA9IGlucy5zb3J0KElucHV0LmNvbXBhcmF0b3IoKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgc2lnbmVkIHRyYW5zYWN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgVHgge1xuICAgIHByb3RlY3RlZCB0eDpUeFVuc2lnbmVkID0gbmV3IFR4VW5zaWduZWQoKTtcbiAgICBwcm90ZWN0ZWQgc2lnbmF0dXJlczpBcnJheTxBcnJheTxTaWduYXR1cmU+PiA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogVGFrZXMgYSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfSBjb250YWluaW5nIGFuIFtbVHhdXSwgcGFyc2VzIGl0LCBwb3B1bGF0ZXMgdGhlIGNsYXNzLCBhbmQgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBUeCBpbiBieXRlcy5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gYnl0ZXMgQSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfSBjb250YWluaW5nIGEgcmF3IFtbVHhdXVxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIFRoZSBsZW5ndGggb2YgdGhlIHJhdyBbW1R4XV1cbiAgICAgKi9cbiAgICBmcm9tQnVmZmVyID0gKGJ5dGVzOkJ1ZmZlcik6bnVtYmVyID0+IHtcbiAgICAgICAgdGhpcy50eCA9IG5ldyBUeFVuc2lnbmVkKCk7XG4gICAgICAgIGxldCBvZmZzZXQ6bnVtYmVyID0gdGhpcy50eC5mcm9tQnVmZmVyKGJ5dGVzKTtcbiAgICAgICAgICAgIGxldCBudW1jcmVkczpudW1iZXIgPSAgIGJpbnRvb2xzLmNvcHlGcm9tKGJ5dGVzLCBvZmZzZXQsIG9mZnNldCArIDQpLnJlYWRVSW50MzJCRSgwKTtcbiAgICAgICAgICAgIG9mZnNldCArPSA0O1xuICAgICAgICAgICAgdGhpcy5zaWduYXR1cmVzID0gW107XG4gICAgICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgbnVtY3JlZHM7IGkrKyl7XG4gICAgICAgICAgICAgICAgbGV0IHNpZ2FycmF5OkFycmF5PFNpZ25hdHVyZT4gPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgY3JlZGVudGlhbDpudW1iZXIgPSBiaW50b29scy5jb3B5RnJvbShieXRlcywgb2Zmc2V0LCBvZmZzZXQgKyA0KS5yZWFkVUludDMyQkUoMCk7XG4gICAgICAgICAgICAgICAgaWYoY3JlZGVudGlhbCAhPSBDb25zdGFudHMuU0VDUENSRURFTlRJQUwpe1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFcnJvciAtIFR4LmZyb21CdWZmZXI6IEludmFsaWQgY3JlZGVudGlhbElEIFwiICsgY3JlZGVudGlhbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBudW1zaWdzOm51bWJlciA9ICAgYmludG9vbHMuY29weUZyb20oYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgNCkucmVhZFVJbnQzMkJFKDApO1xuICAgICAgICAgICAgICAgIG9mZnNldCArPSA0O1xuICAgICAgICAgICAgICAgIGZvcihsZXQgaiA9IDA7IGogIDwgbnVtc2lnczsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzaWc6U2lnbmF0dXJlID0gbmV3IFNpZ25hdHVyZSgpO1xuICAgICAgICAgICAgICAgICAgICBzaWcuZnJvbUJ1ZmZlcihiaW50b29scy5jb3B5RnJvbShieXRlcywgb2Zmc2V0LCBvZmZzZXQgKyA2NSkpO1xuICAgICAgICAgICAgICAgICAgICBzaWdhcnJheS5wdXNoKHNpZyk7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSA2NTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zaWduYXR1cmVzLnB1c2goc2lnYXJyYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUYWtlcyBhIGJhc2UtNTggc3RyaW5nIGNvbnRhaW5pbmcgYW4gW1tUeF1dLCBwYXJzZXMgaXQsIHBvcHVsYXRlcyB0aGUgY2xhc3MsIGFuZCByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIFR4IGluIGJ5dGVzLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBzZXJpYWxpemVkIEEgYmFzZS01OCBzdHJpbmcgY29udGFpbmluZyBhIHJhdyBbW1R4XV1cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBUaGUgbGVuZ3RoIG9mIHRoZSByYXcgW1tUeF1dXG4gICAgICogXG4gICAgICogQHJlbWFya3MgXG4gICAgICogdW5saWtlIG1vc3QgZnJvbVN0cmluZ3MsIGl0IGV4cGVjdHMgdGhlIHN0cmluZyB0byBiZSBzZXJpYWxpemVkIGluIEFWQSBmb3JtYXRcbiAgICAgKi9cbiAgICBmcm9tU3RyaW5nID0gKHNlcmlhbGl6ZWQ6c3RyaW5nKTpudW1iZXIgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5mcm9tQnVmZmVyKGJpbnRvb2xzLmF2YURlc2VyaWFsaXplKHNlcmlhbGl6ZWQpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyfEJ1ZmZlcn0gcmVwcmVzZW50YXRpb24gb2YgdGhlIFtbVHhdXS5cbiAgICAgKi9cbiAgICB0b0J1ZmZlciA9ICgpOkJ1ZmZlciA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgdHhidWZmOiBCdWZmZXIgPSB0aGlzLnR4LnRvQnVmZmVyKCk7XG4gICAgICAgICAgICBsZXQgYnNpemU6bnVtYmVyID0gdHhidWZmLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBzaWdhcnJsZW46QnVmZmVyID0gQnVmZmVyLmFsbG9jKDQpO1xuICAgICAgICAgICAgc2lnYXJybGVuLndyaXRlVUludDMyQkUodGhpcy5zaWduYXR1cmVzLmxlbmd0aCwgMCk7XG4gICAgICAgICAgICBsZXQgYmFycjpBcnJheTxCdWZmZXI+ID0gW3R4YnVmZiwgc2lnYXJybGVuXTtcbiAgICAgICAgICAgIGJzaXplICs9IHNpZ2Fycmxlbi5sZW5ndGg7XG4gICAgICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhpcy5zaWduYXR1cmVzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgICAgICBsZXQgc2lnbGVuOkJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgICAgICAgICAgICAgICBzaWdsZW4ud3JpdGVVSW50MzJCRSh0aGlzLnNpZ25hdHVyZXNbaV0ubGVuZ3RoLCAwKTtcbiAgICAgICAgICAgICAgICBsZXQgY3JlZGVudGlhbElEID0gQnVmZmVyLmFsbG9jKDQpO1xuICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxJRC53cml0ZVVJbnQzMkJFKENvbnN0YW50cy5TRUNQQ1JFREVOVElBTCwgMCk7XG4gICAgICAgICAgICAgICAgYmFyci5wdXNoKGNyZWRlbnRpYWxJRCk7XG4gICAgICAgICAgICAgICAgYnNpemUgKz0gY3JlZGVudGlhbElELmxlbmd0aDtcbiAgICAgICAgICAgICAgICBiYXJyLnB1c2goc2lnbGVuKTtcbiAgICAgICAgICAgICAgICBic2l6ZSArPSBzaWdsZW4ubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGZvcihsZXQgaiA9IDA7IGogPCB0aGlzLnNpZ25hdHVyZXNbaV0ubGVuZ3RoOyBqKyspe1xuICAgICAgICAgICAgICAgICAgICBsZXQgYjpCdWZmZXIgPSB0aGlzLnNpZ25hdHVyZXNbaV1bal0udG9CdWZmZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgYmFyci5wdXNoKGIpO1xuICAgICAgICAgICAgICAgICAgICBic2l6ZSArPSBiLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgYnVmZjpCdWZmZXIgPSBCdWZmZXIuY29uY2F0KGJhcnIsIGJzaXplKTtcbiAgICAgICAgICAgIHJldHVybiBidWZmO1xuICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgICBsZXQgZW1zZzpzdHJpbmcgPSBcIkVycm9yIC0gVHhTaWduZWQudG9CdWZmZXI6IFwiICsgZTtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZW1zZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgYmFzZS01OCBBVkEtc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgW1tUeF1dLlxuICAgICAqIFxuICAgICAqIEByZW1hcmtzIFxuICAgICAqIHVubGlrZSBtb3N0IHRvU3RyaW5ncywgdGhpcyByZXR1cm5zIGluIEFWQSBzZXJpYWxpemF0aW9uIGZvcm1hdFxuICAgICAqL1xuICAgIHRvU3RyaW5nID0gKCk6c3RyaW5nID0+IHtcbiAgICAgICAgcmV0dXJuIGJpbnRvb2xzLmF2YVNlcmlhbGl6ZSh0aGlzLnRvQnVmZmVyKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsYXNzIHJlcHJlc2VudGluZyBhIHNpZ25lZCB0cmFuc2FjdGlvbi5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gdHggT3B0aW9uYWwgW1tUeF1dXG4gICAgICogQHBhcmFtIHNpZ25hdHVyZXMgT3B0aW9uYWwgYXJyYXkgb2YgW1tTaWduYXR1cmVdXXNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0eD86VHhVbnNpZ25lZCwgc2lnbmF0dXJlcz86QXJyYXk8QXJyYXk8U2lnbmF0dXJlPj4pIHtcbiAgICAgICAgaWYodHgpe1xuICAgICAgICAgICAgdGhpcy50eCA9IHR4O1xuICAgICAgICAgICAgaWYoc2lnbmF0dXJlcyl7XG4gICAgICAgICAgICAgICAgdGhpcy5zaWduYXR1cmVzID0gc2lnbmF0dXJlc1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5cbiJdfQ==

@@ -55,2 +55,8 @@ import { NBytes } from '../../utils/types';

}
export declare class Constants {
static SECPOUTPUTID: number;
static SECPINPUTID: number;
static BASETX: number;
static SECPCREDENTIAL: number;
}
/**

@@ -57,0 +63,0 @@ * Rules used when merging sets

@@ -112,2 +112,9 @@ "use strict";

};
class Constants {
}
exports.Constants = Constants;
Constants.SECPOUTPUTID = 4;
Constants.SECPINPUTID = 6;
Constants.BASETX = 0;
Constants.SECPCREDENTIAL = 7;
/**

@@ -121,2 +128,2 @@ * Function providing the current UNIX time using a {@link https://github.com/indutny/bn.js/|BN}

;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpcy9hdm0vdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7R0FFRztBQUNILG9DQUErQjtBQUMvQiw2Q0FBMkM7QUFDM0Msa0RBQXVCO0FBQ3ZCLG9FQUE0QztBQUU1Qzs7R0FFRztBQUNILElBQUksUUFBUSxHQUFZLGtCQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7QUFFL0M7O0dBRUc7QUFDSCxNQUFhLE1BQU8sU0FBUSxjQUFNO0lBaUI5Qjs7T0FFRztJQUNIO1FBQ0ksS0FBSyxFQUFFLENBQUM7UUFsQlo7O1dBRUc7UUFDSCxjQUFTLEdBQUcsQ0FBQyxPQUFjLEVBQUUsRUFBRTtZQUMzQixJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQztRQUMxQixDQUFDLENBQUE7UUFFRDs7V0FFRztRQUNILGNBQVMsR0FBRyxHQUFVLEVBQUU7WUFDcEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQTtRQU9HLElBQUksQ0FBQyxLQUFLLEdBQUcsZUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNuQixDQUFDO0NBQ0o7QUF6QkQsd0JBeUJDO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLFNBQVUsU0FBUSxjQUFNO0lBRWpDOztPQUVHO0lBQ0g7UUFDSSxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxLQUFLLEdBQUcsZUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNwQixDQUFDO0NBQ0o7QUFWRCw4QkFVQztBQUVEOztHQUVHO0FBQ0gsTUFBYSxPQUFRLFNBQVEsY0FBTTtJQXlDL0I7O09BRUc7SUFDSDtRQUNJLEtBQUssRUFBRSxDQUFDO1FBbkNaOztXQUVHO1FBQ0gsYUFBUSxHQUFHLEdBQVUsRUFBRTtZQUNuQixPQUFPLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFBO1FBQ0Q7Ozs7OztXQU1HO1FBQ0gsZUFBVSxHQUFHLENBQUMsSUFBVyxFQUFTLEVBQUU7WUFDaEMsSUFBSSxRQUFRLEdBQVUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqRCxJQUFHLFFBQVEsQ0FBQyxNQUFNLElBQUksRUFBRSxJQUFJLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDN0QsSUFBSSxPQUFPLEdBQVUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hFLElBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxFQUFFLEVBQUM7b0JBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDO2lCQUN4QjthQUNKO2lCQUFNLElBQUcsUUFBUSxDQUFDLE1BQU0sSUFBSSxFQUFFLEVBQUM7Z0JBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMseURBQXlELENBQUMsQ0FBQzthQUM5RTtpQkFBTSxJQUFHLFFBQVEsQ0FBQyxNQUFNLElBQUksRUFBRSxFQUFDO2dCQUM1QixJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQzthQUN6QjtpQkFBTTtnQkFDSCwwQkFBMEI7Z0JBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQzthQUNsRTtZQUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQTtRQU9HLElBQUksQ0FBQyxLQUFLLEdBQUcsZUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNwQixDQUFDOztBQWhETCwwQkFpREM7QUEvQ0c7O0dBRUc7QUFDSSxrQkFBVSxHQUFHLEdBQXNDLEVBQUU7SUFDeEQsT0FBTyxVQUFTLENBQVMsRUFBRSxDQUFTO1FBQ2hDLE9BQU8sZUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFhLENBQUM7SUFDbEUsQ0FBQyxDQUFBO0FBQ0wsQ0FBQyxDQUFBO0FBc0RMOztHQUVHO0FBQ0gsU0FBZ0IsT0FBTztJQUNuQixPQUFPLElBQUksZUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBRkQsMEJBRUM7QUFBQSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbW9kdWxlIEFWTUFQSVxuICovXG5pbXBvcnQge0J1ZmZlcn0gZnJvbSBcImJ1ZmZlci9cIjtcbmltcG9ydCB7IE5CeXRlcyB9IGZyb20gJy4uLy4uL3V0aWxzL3R5cGVzJztcbmltcG9ydCBCTiBmcm9tIFwiYm4uanNcIjtcbmltcG9ydCBCaW5Ub29scyBmcm9tICcuLi8uLi91dGlscy9iaW50b29scyc7XG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5sZXQgYmludG9vbHM6QmluVG9vbHMgPSBCaW5Ub29scy5nZXRJbnN0YW5jZSgpO1xuXG4vKipcbiAqIFR5cGUgcmVwcmVzZW50aW5nIGEgW1tTaWduYXR1cmVdXSBpbmRleCB1c2VkIGluIFtbSW5wdXRdXVxuICovXG5leHBvcnQgY2xhc3MgU2lnSWR4IGV4dGVuZHMgTkJ5dGVzIHtcbiAgICBzb3VyY2U6c3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc291cmNlIGFkZHJlc3MgZm9yIHRoZSBzaWduYXR1cmVcbiAgICAgKi9cbiAgICBzZXRTb3VyY2UgPSAoYWRkcmVzczpzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBhZGRyZXNzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyB0aGUgc291cmNlIGFkZHJlc3MgZm9yIHRoZSBzaWduYXR1cmVcbiAgICAgKi9cbiAgICBnZXRTb3VyY2UgPSAoKTpzdHJpbmcgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHlwZSByZXByZXNlbnRpbmcgYSBbW1NpZ25hdHVyZV1dIGluZGV4IHVzZWQgaW4gW1tJbnB1dF1dXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5ieXRlcyA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgICAgICAgdGhpcy5ic2l6ZSA9IDQ7XG4gICAgfVxufVxuXG4vKipcbiAqIFNpZ25hdHVyZSBmb3IgYSBbW1R4XV1cbiAqL1xuZXhwb3J0IGNsYXNzIFNpZ25hdHVyZSBleHRlbmRzIE5CeXRlcyB7XG5cbiAgICAvKipcbiAgICAgKiBTaWduYXR1cmUgZm9yIGEgW1tUeF1dXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5ieXRlcyA9IEJ1ZmZlci5hbGxvYyg2NSk7XG4gICAgICAgIHRoaXMuYnNpemUgPSA2NTtcbiAgICB9XG59XG5cbi8qKlxuICogQ2xhc3MgZm9yIHJlcHJlc2VudGluZyBhbiBhZGRyZXNzIHVzZWQgaW4gW1tPdXRwdXRdXSB0eXBlc1xuICovXG5leHBvcnQgY2xhc3MgQWRkcmVzcyBleHRlbmRzIE5CeXRlcyB7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgZnVuY3Rpb24gdXNlZCB0byBzb3J0IGFuIGFycmF5IG9mIFtbQWRkcmVzc11dZXNcbiAgICAgKi9cbiAgICBzdGF0aWMgY29tcGFyaXRvciA9ICgpOihhOkFkZHJlc3MsIGI6QWRkcmVzcykgPT4gKDF8LTF8MCkgPT4ge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24oYTpBZGRyZXNzLCBiOkFkZHJlc3MpOigxfC0xfDApIHsgXG4gICAgICAgICAgICByZXR1cm4gQnVmZmVyLmNvbXBhcmUoYS50b0J1ZmZlcigpLCBiLnRvQnVmZmVyKCkpIGFzICgxfC0xfDApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBiYXNlLTU4IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBbW0FkZHJlc3NdXS5cbiAgICAgKi9cbiAgICB0b1N0cmluZyA9ICgpOnN0cmluZyA9PiB7XG4gICAgICAgIHJldHVybiBiaW50b29scy5hdmFTZXJpYWxpemUodGhpcy50b0J1ZmZlcigpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGFrZXMgYSBiYXNlLTU4IHN0cmluZyBjb250YWluaW5nIGFuIFtbQWRkcmVzc11dLCBwYXJzZXMgaXQsIHBvcHVsYXRlcyB0aGUgY2xhc3MsIGFuZCByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIEFkZHJlc3MgaW4gYnl0ZXMuXG4gICAgICogXG4gICAgICogQHBhcmFtIGJ5dGVzIEEgYmFzZS01OCBzdHJpbmcgY29udGFpbmluZyBhIHJhdyBbW0FkZHJlc3NdXVxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIFRoZSBsZW5ndGggb2YgdGhlIHJhdyBbW0FkZHJlc3NdXVxuICAgICAqL1xuICAgIGZyb21TdHJpbmcgPSAoYWRkcjpzdHJpbmcpOm51bWJlciA9PiB7XG4gICAgICAgIGxldCBhZGRyYnVmZjpCdWZmZXIgPSBiaW50b29scy5iNThUb0J1ZmZlcihhZGRyKTtcbiAgICAgICAgaWYoYWRkcmJ1ZmYubGVuZ3RoID09IDI0ICYmIGJpbnRvb2xzLnZhbGlkYXRlQ2hlY2tzdW0oYWRkcmJ1ZmYpKSB7XG4gICAgICAgICAgICBsZXQgbmV3YnVmZjpCdWZmZXIgPSBiaW50b29scy5jb3B5RnJvbShhZGRyYnVmZiwgMCxhZGRyYnVmZi5sZW5ndGggLSA0KTtcbiAgICAgICAgICAgIGlmKG5ld2J1ZmYubGVuZ3RoID09IDIwKXtcbiAgICAgICAgICAgICAgICB0aGlzLmJ5dGVzID0gbmV3YnVmZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmKGFkZHJidWZmLmxlbmd0aCA9PSAyNCl7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFcnJvciAtIEFkZHJlc3MuZnJvbVN0cmluZzogaW52YWxpZCBjaGVja3N1bSBvbiBhZGRyZXNzXCIpO1xuICAgICAgICB9IGVsc2UgaWYoYWRkcmJ1ZmYubGVuZ3RoID09IDIwKXtcbiAgICAgICAgICAgIHRoaXMuYnl0ZXMgPSBhZGRyYnVmZjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFcnJvciAtIEFkZHJlc3MuZnJvbVN0cmluZzogaW52YWxpZCBhZGRyZXNzXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmdldFNpemUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGFzcyBmb3IgcmVwcmVzZW50aW5nIGFuIGFkZHJlc3MgdXNlZCBpbiBbW091dHB1dF1dIHR5cGVzXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5ieXRlcyA9IEJ1ZmZlci5hbGxvYygyMCk7XG4gICAgICAgIHRoaXMuYnNpemUgPSAyMDtcbiAgICB9XG59XG5cbi8qKlxuICogUnVsZXMgdXNlZCB3aGVuIG1lcmdpbmcgc2V0c1xuICovXG5leHBvcnQgdHlwZSBNZXJnZVJ1bGUgPSBcImludGVyc2VjdGlvblwiIC8vU2VsZiBJTlRFUlNFQ1QgTmV3IFxuICAgICAgICAgICAgICAgICAgICAgICAgfCBcImRpZmZlcmVuY2VTZWxmXCIgLy9TZWxmIE1JTlVTIE5ld1xuICAgICAgICAgICAgICAgICAgICAgICAgfCBcImRpZmZlcmVuY2VOZXdcIiAvL05ldyBNSU5VUyBTZWxmXG4gICAgICAgICAgICAgICAgICAgICAgICB8IFwic3ltRGlmZmVyZW5jZVwiIC8vZGlmZmVyZW5jZVNlbGYgVU5JT04gZGlmZmVyZW5jZU5ld1xuICAgICAgICAgICAgICAgICAgICAgICAgfCBcInVuaW9uXCIgLy9TZWxmIFVOSU9OIE5ld1xuICAgICAgICAgICAgICAgICAgICAgICAgfCBcInVuaW9uTWludXNOZXdcIiAvL3VuaW9uIE1JTlVTIGRpZmZlcmVuY2VOZXdcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgXCJ1bmlvbk1pbnVzU2VsZlwiIC8vdW5pb24gTUlOVVMgZGlmZmVyZW5jZVNlbGZcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgXCJFUlJPUlwiOyAvL2dlbmVyYXRlIGVycm9yIGZvciB0ZXN0aW5nXG5cbi8qKlxuICogRnVuY3Rpb24gcHJvdmlkaW5nIHRoZSBjdXJyZW50IFVOSVggdGltZSB1c2luZyBhIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vaW5kdXRueS9ibi5qcy98Qk59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBVbml4Tm93KCk6Qk4ge1xuICAgIHJldHVybiBuZXcgQk4oTWF0aC5yb3VuZCgobmV3IERhdGUoKSkuZ2V0VGltZSgpIC8gMTAwMCkpO1xufTsiXX0=
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpcy9hdm0vdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7R0FFRztBQUNILG9DQUErQjtBQUMvQiw2Q0FBMkM7QUFDM0Msa0RBQXVCO0FBQ3ZCLG9FQUE0QztBQUU1Qzs7R0FFRztBQUNILElBQUksUUFBUSxHQUFZLGtCQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7QUFFL0M7O0dBRUc7QUFDSCxNQUFhLE1BQU8sU0FBUSxjQUFNO0lBaUI5Qjs7T0FFRztJQUNIO1FBQ0ksS0FBSyxFQUFFLENBQUM7UUFsQlo7O1dBRUc7UUFDSCxjQUFTLEdBQUcsQ0FBQyxPQUFjLEVBQUUsRUFBRTtZQUMzQixJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQztRQUMxQixDQUFDLENBQUE7UUFFRDs7V0FFRztRQUNILGNBQVMsR0FBRyxHQUFVLEVBQUU7WUFDcEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQTtRQU9HLElBQUksQ0FBQyxLQUFLLEdBQUcsZUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNuQixDQUFDO0NBQ0o7QUF6QkQsd0JBeUJDO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLFNBQVUsU0FBUSxjQUFNO0lBRWpDOztPQUVHO0lBQ0g7UUFDSSxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxLQUFLLEdBQUcsZUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNwQixDQUFDO0NBQ0o7QUFWRCw4QkFVQztBQUVEOztHQUVHO0FBQ0gsTUFBYSxPQUFRLFNBQVEsY0FBTTtJQXlDL0I7O09BRUc7SUFDSDtRQUNJLEtBQUssRUFBRSxDQUFDO1FBbkNaOztXQUVHO1FBQ0gsYUFBUSxHQUFHLEdBQVUsRUFBRTtZQUNuQixPQUFPLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFBO1FBQ0Q7Ozs7OztXQU1HO1FBQ0gsZUFBVSxHQUFHLENBQUMsSUFBVyxFQUFTLEVBQUU7WUFDaEMsSUFBSSxRQUFRLEdBQVUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqRCxJQUFHLFFBQVEsQ0FBQyxNQUFNLElBQUksRUFBRSxJQUFJLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDN0QsSUFBSSxPQUFPLEdBQVUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hFLElBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxFQUFFLEVBQUM7b0JBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDO2lCQUN4QjthQUNKO2lCQUFNLElBQUcsUUFBUSxDQUFDLE1BQU0sSUFBSSxFQUFFLEVBQUM7Z0JBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMseURBQXlELENBQUMsQ0FBQzthQUM5RTtpQkFBTSxJQUFHLFFBQVEsQ0FBQyxNQUFNLElBQUksRUFBRSxFQUFDO2dCQUM1QixJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQzthQUN6QjtpQkFBTTtnQkFDSCwwQkFBMEI7Z0JBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQzthQUNsRTtZQUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQTtRQU9HLElBQUksQ0FBQyxLQUFLLEdBQUcsZUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNwQixDQUFDOztBQWhETCwwQkFpREM7QUEvQ0c7O0dBRUc7QUFDSSxrQkFBVSxHQUFHLEdBQXNDLEVBQUU7SUFDeEQsT0FBTyxVQUFTLENBQVMsRUFBRSxDQUFTO1FBQ2hDLE9BQU8sZUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFhLENBQUM7SUFDbEUsQ0FBQyxDQUFBO0FBQ0wsQ0FBQyxDQUFBO0FBMENMLE1BQWEsU0FBUzs7QUFBdEIsOEJBS0M7QUFKVSxzQkFBWSxHQUFVLENBQUMsQ0FBQztBQUN4QixxQkFBVyxHQUFVLENBQUMsQ0FBQztBQUN2QixnQkFBTSxHQUFVLENBQUMsQ0FBQztBQUNsQix3QkFBYyxHQUFTLENBQUMsQ0FBQztBQWVwQzs7R0FFRztBQUNILFNBQWdCLE9BQU87SUFDbkIsT0FBTyxJQUFJLGVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDN0QsQ0FBQztBQUZELDBCQUVDO0FBQUEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG1vZHVsZSBBVk1BUElcbiAqL1xuaW1wb3J0IHtCdWZmZXJ9IGZyb20gXCJidWZmZXIvXCI7XG5pbXBvcnQgeyBOQnl0ZXMgfSBmcm9tICcuLi8uLi91dGlscy90eXBlcyc7XG5pbXBvcnQgQk4gZnJvbSBcImJuLmpzXCI7XG5pbXBvcnQgQmluVG9vbHMgZnJvbSAnLi4vLi4vdXRpbHMvYmludG9vbHMnO1xuXG4vKipcbiAqIEBpZ25vcmVcbiAqL1xubGV0IGJpbnRvb2xzOkJpblRvb2xzID0gQmluVG9vbHMuZ2V0SW5zdGFuY2UoKTtcblxuLyoqXG4gKiBUeXBlIHJlcHJlc2VudGluZyBhIFtbU2lnbmF0dXJlXV0gaW5kZXggdXNlZCBpbiBbW0lucHV0XV1cbiAqL1xuZXhwb3J0IGNsYXNzIFNpZ0lkeCBleHRlbmRzIE5CeXRlcyB7XG4gICAgc291cmNlOnN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHNvdXJjZSBhZGRyZXNzIGZvciB0aGUgc2lnbmF0dXJlXG4gICAgICovXG4gICAgc2V0U291cmNlID0gKGFkZHJlc3M6c3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMuc291cmNlID0gYWRkcmVzcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIHNvdXJjZSBhZGRyZXNzIGZvciB0aGUgc2lnbmF0dXJlXG4gICAgICovXG4gICAgZ2V0U291cmNlID0gKCk6c3RyaW5nID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFR5cGUgcmVwcmVzZW50aW5nIGEgW1tTaWduYXR1cmVdXSBpbmRleCB1c2VkIGluIFtbSW5wdXRdXVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuYnl0ZXMgPSBCdWZmZXIuYWxsb2MoNCk7XG4gICAgICAgIHRoaXMuYnNpemUgPSA0O1xuICAgIH1cbn1cblxuLyoqXG4gKiBTaWduYXR1cmUgZm9yIGEgW1tUeF1dXG4gKi9cbmV4cG9ydCBjbGFzcyBTaWduYXR1cmUgZXh0ZW5kcyBOQnl0ZXMge1xuXG4gICAgLyoqXG4gICAgICogU2lnbmF0dXJlIGZvciBhIFtbVHhdXVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuYnl0ZXMgPSBCdWZmZXIuYWxsb2MoNjUpO1xuICAgICAgICB0aGlzLmJzaXplID0gNjU7XG4gICAgfVxufVxuXG4vKipcbiAqIENsYXNzIGZvciByZXByZXNlbnRpbmcgYW4gYWRkcmVzcyB1c2VkIGluIFtbT3V0cHV0XV0gdHlwZXNcbiAqL1xuZXhwb3J0IGNsYXNzIEFkZHJlc3MgZXh0ZW5kcyBOQnl0ZXMge1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGZ1bmN0aW9uIHVzZWQgdG8gc29ydCBhbiBhcnJheSBvZiBbW0FkZHJlc3NdXWVzXG4gICAgICovXG4gICAgc3RhdGljIGNvbXBhcml0b3IgPSAoKTooYTpBZGRyZXNzLCBiOkFkZHJlc3MpID0+ICgxfC0xfDApID0+IHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGE6QWRkcmVzcywgYjpBZGRyZXNzKTooMXwtMXwwKSB7IFxuICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKGEudG9CdWZmZXIoKSwgYi50b0J1ZmZlcigpKSBhcyAoMXwtMXwwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgYmFzZS01OCByZXByZXNlbnRhdGlvbiBvZiB0aGUgW1tBZGRyZXNzXV0uXG4gICAgICovXG4gICAgdG9TdHJpbmcgPSAoKTpzdHJpbmcgPT4ge1xuICAgICAgICByZXR1cm4gYmludG9vbHMuYXZhU2VyaWFsaXplKHRoaXMudG9CdWZmZXIoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRha2VzIGEgYmFzZS01OCBzdHJpbmcgY29udGFpbmluZyBhbiBbW0FkZHJlc3NdXSwgcGFyc2VzIGl0LCBwb3B1bGF0ZXMgdGhlIGNsYXNzLCBhbmQgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBBZGRyZXNzIGluIGJ5dGVzLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBieXRlcyBBIGJhc2UtNTggc3RyaW5nIGNvbnRhaW5pbmcgYSByYXcgW1tBZGRyZXNzXV1cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBUaGUgbGVuZ3RoIG9mIHRoZSByYXcgW1tBZGRyZXNzXV1cbiAgICAgKi9cbiAgICBmcm9tU3RyaW5nID0gKGFkZHI6c3RyaW5nKTpudW1iZXIgPT4ge1xuICAgICAgICBsZXQgYWRkcmJ1ZmY6QnVmZmVyID0gYmludG9vbHMuYjU4VG9CdWZmZXIoYWRkcik7XG4gICAgICAgIGlmKGFkZHJidWZmLmxlbmd0aCA9PSAyNCAmJiBiaW50b29scy52YWxpZGF0ZUNoZWNrc3VtKGFkZHJidWZmKSkge1xuICAgICAgICAgICAgbGV0IG5ld2J1ZmY6QnVmZmVyID0gYmludG9vbHMuY29weUZyb20oYWRkcmJ1ZmYsIDAsYWRkcmJ1ZmYubGVuZ3RoIC0gNCk7XG4gICAgICAgICAgICBpZihuZXdidWZmLmxlbmd0aCA9PSAyMCl7XG4gICAgICAgICAgICAgICAgdGhpcy5ieXRlcyA9IG5ld2J1ZmY7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZihhZGRyYnVmZi5sZW5ndGggPT0gMjQpe1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXJyb3IgLSBBZGRyZXNzLmZyb21TdHJpbmc6IGludmFsaWQgY2hlY2tzdW0gb24gYWRkcmVzc1wiKTtcbiAgICAgICAgfSBlbHNlIGlmKGFkZHJidWZmLmxlbmd0aCA9PSAyMCl7XG4gICAgICAgICAgICB0aGlzLmJ5dGVzID0gYWRkcmJ1ZmY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXJyb3IgLSBBZGRyZXNzLmZyb21TdHJpbmc6IGludmFsaWQgYWRkcmVzc1wiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5nZXRTaXplKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xhc3MgZm9yIHJlcHJlc2VudGluZyBhbiBhZGRyZXNzIHVzZWQgaW4gW1tPdXRwdXRdXSB0eXBlc1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuYnl0ZXMgPSBCdWZmZXIuYWxsb2MoMjApO1xuICAgICAgICB0aGlzLmJzaXplID0gMjA7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29uc3RhbnRzIHtcbiAgICBzdGF0aWMgU0VDUE9VVFBVVElEOm51bWJlciA9IDQ7XG4gICAgc3RhdGljIFNFQ1BJTlBVVElEOm51bWJlciA9IDY7XG4gICAgc3RhdGljIEJBU0VUWDpudW1iZXIgPSAwO1xuICAgIHN0YXRpYyBTRUNQQ1JFREVOVElBTDpudW1iZXIgPTc7XG59XG5cbi8qKlxuICogUnVsZXMgdXNlZCB3aGVuIG1lcmdpbmcgc2V0c1xuICovXG5leHBvcnQgdHlwZSBNZXJnZVJ1bGUgPSBcImludGVyc2VjdGlvblwiIC8vU2VsZiBJTlRFUlNFQ1QgTmV3IFxuICAgICAgICAgICAgICAgICAgICAgICAgfCBcImRpZmZlcmVuY2VTZWxmXCIgLy9TZWxmIE1JTlVTIE5ld1xuICAgICAgICAgICAgICAgICAgICAgICAgfCBcImRpZmZlcmVuY2VOZXdcIiAvL05ldyBNSU5VUyBTZWxmXG4gICAgICAgICAgICAgICAgICAgICAgICB8IFwic3ltRGlmZmVyZW5jZVwiIC8vZGlmZmVyZW5jZVNlbGYgVU5JT04gZGlmZmVyZW5jZU5ld1xuICAgICAgICAgICAgICAgICAgICAgICAgfCBcInVuaW9uXCIgLy9TZWxmIFVOSU9OIE5ld1xuICAgICAgICAgICAgICAgICAgICAgICAgfCBcInVuaW9uTWludXNOZXdcIiAvL3VuaW9uIE1JTlVTIGRpZmZlcmVuY2VOZXdcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgXCJ1bmlvbk1pbnVzU2VsZlwiIC8vdW5pb24gTUlOVVMgZGlmZmVyZW5jZVNlbGZcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgXCJFUlJPUlwiOyAvL2dlbmVyYXRlIGVycm9yIGZvciB0ZXN0aW5nXG5cbi8qKlxuICogRnVuY3Rpb24gcHJvdmlkaW5nIHRoZSBjdXJyZW50IFVOSVggdGltZSB1c2luZyBhIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vaW5kdXRueS9ibi5qcy98Qk59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBVbml4Tm93KCk6Qk4ge1xuICAgIHJldHVybiBuZXcgQk4oTWF0aC5yb3VuZCgobmV3IERhdGUoKSkuZ2V0VGltZSgpIC8gMTAwMCkpO1xufTsiXX0=

@@ -6,14 +6,75 @@ /**

import BN from "bn.js";
import { Output } from './outputs';
import { SecpOutput } from './outputs';
import { MergeRule } from './types';
import { TxUnsigned } from './tx';
/**
* Takes a buffer representing the output and returns the proper UTXO instance.
*
* @param utxobuffer A {@link https://github.com/feross/buffer|Buffer} containing the [[UTXO]] raw data.
*
* @returns An instance of an [[UTXO]]-extended class. ex. [[SecpUTXO]].
*/
export declare const SelectUTXOClass: (utxobuffer: Buffer, args?: any[]) => UTXO;
/**
* Class for representing a single UTXO.
*/
export declare class UTXO {
export declare abstract class UTXO {
protected txid: Buffer;
protected txidx: Buffer;
protected output: Output;
getOuputType: () => number;
abstract getOuputID: () => number;
/**
* Returns a {@link https://github.com/feross/buffer|Buffer} of the TxID.
*/
getTxID: () => Buffer;
/**
* Returns a {@link https://github.com/feross/buffer|Buffer} of the TxIdx.
*/
getTxIdx: () => Buffer;
/**
* Returns the UTXOID as a base-58 string (UTXOID is a string )
*/
getUTXOID: () => string;
_basicUTXOBuffer: (utxobuff: any) => void;
/**
* Takes a {@link https://github.com/feross/buffer|Buffer} containing an [[UTXO]], parses it, populates the class, and returns the length of the UTXO in bytes.
*
* @param bytes A {@link https://github.com/feross/buffer|Buffer} containing a raw [[UTXO]]
*/
fromBuffer: (utxobuff: Buffer) => void;
/**
* Takes a base-58 string containing an [[UTXO]], parses it, populates the class, and returns the length of the UTXO in bytes.
*
* @param serialized A base-58 string containing a raw [[UTXO]]
*
* @returns The length of the raw [[UTXO]]
*
* @remarks
* unlike most fromStrings, it expects the string to be serialized in AVA format
*/
fromString: (serialized: string) => void;
/**
* Returns a {@link https://github.com/feross/buffer|Buffer} representation of the [[UTXO]].
*/
toBuffer: () => Buffer;
/**
* Returns a base-58 representation of the [[UTXO]].
*
* @remarks
* unlike most toStrings, this returns in AVA serialization format
*/
toString: () => string;
/**
* Class for representing a single UTXO.
*
* @param serialized Optional parameter of the serialized string representing a UTXO
*/
constructor(txid?: Buffer, txidx?: number);
}
/**
* Class for representing a single UTXO.
*/
export declare class SecpUTXO extends UTXO {
protected output: SecpOutput;
getOuputID: () => number;
/**
* Gets the amount in the UTXO as a {@link https://github.com/indutny/bn.js/|BN}.

@@ -33,3 +94,3 @@ */

*/
getAddressIdx: (address: string) => [number, boolean];
getAddressIdx: (address: string) => number;
/**

@@ -39,7 +100,6 @@ * Gets the address at the index.

* @param idx The index of the address
* @param tol Boolean indicating if this should be looked up in the fallback addresses (TakeItOrLeaveIt)
*
* @returns A string representing the address.
*/
getAddress: (idx: number, tol: boolean) => string;
getAddress: (idx: number) => string;
/**

@@ -92,13 +152,14 @@ * Returns a {@link https://github.com/feross/buffer|Buffer} of the assetID.

*/
getSpenders: (addresses: string[], asOf?: boolean | BN) => string[];
getSpenders: (addresses: string[], asOf?: BN) => string[];
/**
* Given an array of addresses and an optional timestamp, returns true if the addresses meet the threshold required to spend the output.
*/
meetsThreshold: (addresses: string[], asOf?: boolean | BN) => boolean;
meetsThreshold: (addresses: string[], asOf?: BN) => boolean;
/**
* Class for representing a single UTXO.
*
* @param serialized Optional parameter of the serialized string representing a UTXO
* @param txid Optional {@link https://github.com/feross/buffer|Buffer} representing the transaction ID
* @param txidx Optional number for the transaction index
*/
constructor(serialized?: string);
constructor(txid: Buffer, txidx: number, secpoutput: SecpOutput);
}

@@ -110,3 +171,3 @@ /**

protected utxos: {
[utxoid: string]: UTXO;
[utxoid: string]: SecpUTXO;
};

@@ -174,3 +235,3 @@ protected addressUTXOs: {

*/
getAllUTXOs: (utxoids?: boolean | string[]) => UTXO[];
getAllUTXOs: (utxoids?: string[]) => SecpUTXO[];
/**

@@ -183,3 +244,3 @@ * Gets all the [[UTXO]]s as strings, optionally that match with UTXOIDs in an array.

*/
getAllUTXOStrings: (utxoids?: boolean | string[]) => string[];
getAllUTXOStrings: (utxoids?: string[]) => string[];
/**

@@ -211,3 +272,3 @@ * Returns an array of all the UTXOIDs in the [[UTXOSet]].

*/
getBalance: (addresses: string[], assetID: string | Buffer, asOf?: boolean | BN) => BN;
getBalance: (addresses: string[], assetID: string | Buffer, asOf?: BN) => BN;
/**

@@ -235,5 +296,2 @@ * Gets all the Asset IDs, optionally that match with Asset IDs in an array

* @param threshold The number of signatures required to spend the funds in the resultant UTXO
* @param fallAddresses The fallback addresses which can spend the funds in the resultant UTXO
* @param fallLocktime The fallback locktime timestamp which is greater than the locktime and used as an expiration date for the locktime as a {@link https://github.com/indutny/bn.js/|BN}
* @param fallThreshold The fallback threshold for the number of signatures required from the fallback addresses to spend the resultant UTXO
*

@@ -243,3 +301,3 @@ * @returns An unsigned transaction created from the passed in parameters.

*/
makeUnsignedTx: (networkid: number, blockchainid: Buffer, amount: BN, toAddresses: string[], fromAddresses: string[], changeAddresses: string[], assetID?: Buffer, asOf?: BN, locktime?: BN, threshold?: number, fallAddresses?: string[], fallLocktime?: BN, fallThreshold?: number) => TxUnsigned;
makeUnsignedTx: (networkid: number, blockchainid: Buffer, amount: BN, toAddresses: string[], fromAddresses: string[], changeAddresses: string[], assetID?: Buffer, asOf?: BN, locktime?: BN, threshold?: number) => TxUnsigned;
/**

@@ -253,3 +311,3 @@ * Returns a new set with copy of UTXOs in this and set parameter.

*/
merge: (utxoset: UTXOSet, hasUTXOIDs?: boolean | string[]) => UTXOSet;
merge: (utxoset: UTXOSet, hasUTXOIDs?: string[]) => UTXOSet;
/**

@@ -256,0 +314,0 @@ * Set intersetion between this set and a parameter.

@@ -48,3 +48,3 @@ /**

* @param core A reference to the Slopes class
* @param baseurl Defaults to the string "/ext/subnet/platform" as the path to subnets baseurl
* @param baseurl Defaults to the string "/ext/platform" as the path to subnets baseurl
*/

@@ -51,0 +51,0 @@ constructor(core: SlopesCore, baseurl?: string);

@@ -25,5 +25,5 @@ "use strict";

* @param core A reference to the Slopes class
* @param baseurl Defaults to the string "/ext/subnet/platform" as the path to subnets baseurl
* @param baseurl Defaults to the string "/ext/platform" as the path to subnets baseurl
*/
constructor(core, baseurl = "/ext/subnet/platform") {
constructor(core, baseurl = "/ext/platform") {
super(core, baseurl);

@@ -88,2 +88,2 @@ /**

exports.default = PlatformAPI;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwaXMvcGxhdGZvcm0vYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBSUEsNkNBQWlFO0FBRWpFOzs7Ozs7R0FNRztBQUNILE1BQU0sV0FBWSxTQUFRLGVBQU87SUE2RDdCOzs7OztPQUtHO0lBQ0gsWUFBWSxJQUFlLEVBQUUsVUFBaUIsc0JBQXNCO1FBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQWpFNUY7Ozs7OztXQU1HO1FBQ0gsY0FBUyxHQUFHLENBQU8sRUFBUyxFQUFtQixFQUFFO1lBQzdDLElBQUksTUFBTSxHQUFHO2dCQUNULElBQUksRUFBRSxFQUFFO2FBQ1gsQ0FBQztZQUNGLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUE0QixFQUFFLEVBQUU7Z0JBQ3ZGLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM5QyxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQSxDQUFBO1FBRUQ7Ozs7OztXQU1HO1FBQ0gsaUJBQVksR0FBRyxDQUFPLEVBQVMsRUFBbUIsRUFBRTtZQUNoRCxJQUFJLE1BQU0sR0FBRztnQkFDVCxJQUFJLEVBQUUsRUFBRTthQUNYLENBQUM7WUFDRixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBNEIsRUFBRSxFQUFFO2dCQUMxRixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDOUMsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUEsQ0FBQTtRQUVEOzs7O1dBSUc7UUFDSCxtQkFBYyxHQUFHLEdBQWdDLEVBQUU7WUFDL0MsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLHlCQUF5QixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBNEIsRUFBRSxFQUFFO2dCQUNwRixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDakQsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUEsQ0FBQTtRQUVEOzs7Ozs7V0FNRztRQUNILHFCQUFnQixHQUFHLENBQU8sVUFBaUIsRUFBeUIsRUFBRTtZQUNsRSxJQUFJLE1BQU0sR0FBRztnQkFDVCxNQUFNLEVBQUUsVUFBVTthQUNyQixDQUFDO1lBQ0YsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLDJCQUEyQixFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQTRCLEVBQUUsRUFBRTtnQkFDOUYsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2pELENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFBLENBQUE7SUFRNEYsQ0FBQztDQUNqRztBQUVELGtCQUFlLFdBQVcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG1vZHVsZSBQbGF0Zm9ybUFQSVxuICovXG5pbXBvcnQgU2xvcGVzQ29yZSBmcm9tICcuLi8uLi9zbG9wZXMnO1xuaW1wb3J0IHsgSlJQQ0FQSSwgUmVxdWVzdFJlc3BvbnNlRGF0YSB9IGZyb20gJy4uLy4uL3V0aWxzL3R5cGVzJztcblxuLyoqXG4gKiBDbGFzcyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBhIG5vZGUncyBQbGF0Zm9ybUFQSVxuICogXG4gKiBAY2F0ZWdvcnkgUlBDQVBJc1xuICogXG4gKiBAcmVtYXJrcyBUaGlzIGV4dGVuZHMgdGhlIFtbSlJQQ0FQSV1dIGNsYXNzLiBUaGlzIGNsYXNzIHNob3VsZCBub3QgYmUgZGlyZWN0bHkgY2FsbGVkLiBJbnN0ZWFkLCB1c2UgdGhlIFtbU2xvcGVzLmFkZEFQSV1dIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyIHRoaXMgaW50ZXJmYWNlIHdpdGggU2xvcGVzLlxuICovIFxuY2xhc3MgUGxhdGZvcm1BUEkgZXh0ZW5kcyBKUlBDQVBJe1xuXG4gICAgLyoqXG4gICAgICogQWRkIGEgc3Rha2VkIHZhbGlkYXRvciB0byB0aGUgdmFsaWRhdG9yIHNldC5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gdHggVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBBZGRTdGFrZXJUeFxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIFByb21pc2UgZm9yIGEgYm9vbGVhbiB2YWx1ZSwgdHJ1ZSBvbiBzdWNjZXNzLlxuICAgICAqL1xuICAgIGFkZFN0YWtlciA9IGFzeW5jICh0eDpzdHJpbmcpOlByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgICBsZXQgcGFyYW1zID0ge1xuICAgICAgICAgICAgXCJ0eFwiOiB0eFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxsTWV0aG9kKFwicGxhdGZvcm0uYWRkU3Rha2VyXCIsIHBhcmFtcykudGhlbigocmVzcG9uc2U6UmVxdWVzdFJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGFbXCJyZXN1bHRcIl1bXCJzdWNjZXNzXCJdO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHN1Ym5ldC5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gdHggVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGNyZWF0ZVN1Ym5ldFR4XG4gICAgICogXG4gICAgICogQHJldHVybnMgUHJvbWlzZSBmb3IgYSBib29sZWFuIHZhbHVlLCB0cnVlIG9uIHN1Y2Nlc3MuXG4gICAgICovXG4gICAgY3JlYXRlU3VibmV0ID0gYXN5bmMgKHR4OnN0cmluZyk6UHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgICAgIGxldCBwYXJhbXMgPSB7XG4gICAgICAgICAgICBcInR4XCI6IHR4XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxNZXRob2QoXCJwbGF0Zm9ybS5jcmVhdGVTdWJuZXRcIiwgcGFyYW1zKS50aGVuKChyZXNwb25zZTpSZXF1ZXN0UmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YVtcInJlc3VsdFwiXVtcInN1Y2Nlc3NcIl07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3RzIHRoZSBjdXJyZW50IHNldCBvZiB2YWxpZGF0b3JzLlxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIFByb21pc2UgZm9yIGFuIGFycmF5IG9mIHZhbGlkYXRvcidzIHN0YWtpbmdJRHMuXG4gICAgICovXG4gICAgbGlzdFZhbGlkYXRvcnMgPSBhc3luYyAoKTpQcm9taXNlPEFycmF5PHN0cmluZz4+ID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbE1ldGhvZChcInBsYXRmb3JtLmxpc3RWYWxpZGF0b3JzXCIpLnRoZW4oKHJlc3BvbnNlOlJlcXVlc3RSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhW1wicmVzdWx0XCJdW1widmFsaWRhdG9yc1wiXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2FtcGxlcyBgU2l6ZWAgdmFsaWRhdG9ycyBmcm9tIHRoZSBjdXJyZW50IHZhbGlkYXRvciBzZXQuXG4gICAgICogXG4gICAgICogQHBhcmFtIHNhbXBsZVNpemUgT2YgdGhlIHRvdGFsIHVuaXZlcnNlIG9mIHZhbGlkYXRvcnMsIHNlbGVjdCB0aGlzIG1hbnkgYXQgcmFuZG9tXG4gICAgICogXG4gICAgICogQHJldHVybnMgUHJvbWlzZSBmb3IgYW4gYXJyYXkgb2YgdmFsaWRhdG9yJ3Mgc3Rha2luZ0lEcy5cbiAgICAgKi9cbiAgICBzYW1wbGVWYWxpZGF0b3JzID0gYXN5bmMgKHNhbXBsZVNpemU6bnVtYmVyKTpQcm9taXNlPEFycmF5PHN0cmluZz4+ID0+IHtcbiAgICAgICAgbGV0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgIFwic2l6ZVwiOiBzYW1wbGVTaXplXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxNZXRob2QoXCJwbGF0Zm9ybS5zYW1wbGVWYWxpZGF0b3JzXCIsIHBhcmFtcykudGhlbigocmVzcG9uc2U6UmVxdWVzdFJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGFbXCJyZXN1bHRcIl1bXCJ2YWxpZGF0b3JzXCJdO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGNsYXNzIHNob3VsZCBub3QgYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5LiBJbnN0ZWFkIHVzZSB0aGUgW1tTbG9wZXMuYWRkQVBJXV0gbWV0aG9kLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBjb3JlIEEgcmVmZXJlbmNlIHRvIHRoZSBTbG9wZXMgY2xhc3NcbiAgICAgKiBAcGFyYW0gYmFzZXVybCBEZWZhdWx0cyB0byB0aGUgc3RyaW5nIFwiL2V4dC9zdWJuZXQvcGxhdGZvcm1cIiBhcyB0aGUgcGF0aCB0byBzdWJuZXRzIGJhc2V1cmxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjb3JlOlNsb3Blc0NvcmUsIGJhc2V1cmw6c3RyaW5nID0gXCIvZXh0L3N1Ym5ldC9wbGF0Zm9ybVwiKXsgc3VwZXIoY29yZSwgYmFzZXVybCk7IH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUGxhdGZvcm1BUEk7Il19
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwaXMvcGxhdGZvcm0vYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBSUEsNkNBQWlFO0FBRWpFOzs7Ozs7R0FNRztBQUNILE1BQU0sV0FBWSxTQUFRLGVBQU87SUE2RDdCOzs7OztPQUtHO0lBQ0gsWUFBWSxJQUFlLEVBQUUsVUFBaUIsZUFBZTtRQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFqRXJGOzs7Ozs7V0FNRztRQUNILGNBQVMsR0FBRyxDQUFPLEVBQVMsRUFBbUIsRUFBRTtZQUM3QyxJQUFJLE1BQU0sR0FBRztnQkFDVCxJQUFJLEVBQUUsRUFBRTthQUNYLENBQUM7WUFDRixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsb0JBQW9CLEVBQUUsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBNEIsRUFBRSxFQUFFO2dCQUN2RixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDOUMsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUEsQ0FBQTtRQUVEOzs7Ozs7V0FNRztRQUNILGlCQUFZLEdBQUcsQ0FBTyxFQUFTLEVBQW1CLEVBQUU7WUFDaEQsSUFBSSxNQUFNLEdBQUc7Z0JBQ1QsSUFBSSxFQUFFLEVBQUU7YUFDWCxDQUFDO1lBQ0YsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLHVCQUF1QixFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQTRCLEVBQUUsRUFBRTtnQkFDMUYsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzlDLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFBLENBQUE7UUFFRDs7OztXQUlHO1FBQ0gsbUJBQWMsR0FBRyxHQUFnQyxFQUFFO1lBQy9DLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQTRCLEVBQUUsRUFBRTtnQkFDcEYsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2pELENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFBLENBQUE7UUFFRDs7Ozs7O1dBTUc7UUFDSCxxQkFBZ0IsR0FBRyxDQUFPLFVBQWlCLEVBQXlCLEVBQUU7WUFDbEUsSUFBSSxNQUFNLEdBQUc7Z0JBQ1QsTUFBTSxFQUFFLFVBQVU7YUFDckIsQ0FBQztZQUNGLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQywyQkFBMkIsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUE0QixFQUFFLEVBQUU7Z0JBQzlGLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNqRCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQSxDQUFBO0lBUXFGLENBQUM7Q0FDMUY7QUFFRCxrQkFBZSxXQUFXLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgUGxhdGZvcm1BUElcbiAqL1xuaW1wb3J0IFNsb3Blc0NvcmUgZnJvbSAnLi4vLi4vc2xvcGVzJztcbmltcG9ydCB7IEpSUENBUEksIFJlcXVlc3RSZXNwb25zZURhdGEgfSBmcm9tICcuLi8uLi91dGlscy90eXBlcyc7XG5cbi8qKlxuICogQ2xhc3MgZm9yIGludGVyYWN0aW5nIHdpdGggYSBub2RlJ3MgUGxhdGZvcm1BUElcbiAqIFxuICogQGNhdGVnb3J5IFJQQ0FQSXNcbiAqIFxuICogQHJlbWFya3MgVGhpcyBleHRlbmRzIHRoZSBbW0pSUENBUEldXSBjbGFzcy4gVGhpcyBjbGFzcyBzaG91bGQgbm90IGJlIGRpcmVjdGx5IGNhbGxlZC4gSW5zdGVhZCwgdXNlIHRoZSBbW1Nsb3Blcy5hZGRBUEldXSBmdW5jdGlvbiB0byByZWdpc3RlciB0aGlzIGludGVyZmFjZSB3aXRoIFNsb3Blcy5cbiAqLyBcbmNsYXNzIFBsYXRmb3JtQVBJIGV4dGVuZHMgSlJQQ0FQSXtcblxuICAgIC8qKlxuICAgICAqIEFkZCBhIHN0YWtlZCB2YWxpZGF0b3IgdG8gdGhlIHZhbGlkYXRvciBzZXQuXG4gICAgICogXG4gICAgICogQHBhcmFtIHR4IFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gQWRkU3Rha2VyVHhcbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBQcm9taXNlIGZvciBhIGJvb2xlYW4gdmFsdWUsIHRydWUgb24gc3VjY2Vzcy5cbiAgICAgKi9cbiAgICBhZGRTdGFrZXIgPSBhc3luYyAodHg6c3RyaW5nKTpQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgICAgbGV0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgIFwidHhcIjogdHhcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbE1ldGhvZChcInBsYXRmb3JtLmFkZFN0YWtlclwiLCBwYXJhbXMpLnRoZW4oKHJlc3BvbnNlOlJlcXVlc3RSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhW1wicmVzdWx0XCJdW1wic3VjY2Vzc1wiXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBzdWJuZXQuXG4gICAgICogXG4gICAgICogQHBhcmFtIHR4IFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBjcmVhdGVTdWJuZXRUeFxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIFByb21pc2UgZm9yIGEgYm9vbGVhbiB2YWx1ZSwgdHJ1ZSBvbiBzdWNjZXNzLlxuICAgICAqL1xuICAgIGNyZWF0ZVN1Ym5ldCA9IGFzeW5jICh0eDpzdHJpbmcpOlByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgICBsZXQgcGFyYW1zID0ge1xuICAgICAgICAgICAgXCJ0eFwiOiB0eFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxsTWV0aG9kKFwicGxhdGZvcm0uY3JlYXRlU3VibmV0XCIsIHBhcmFtcykudGhlbigocmVzcG9uc2U6UmVxdWVzdFJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGFbXCJyZXN1bHRcIl1bXCJzdWNjZXNzXCJdO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0cyB0aGUgY3VycmVudCBzZXQgb2YgdmFsaWRhdG9ycy5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBQcm9taXNlIGZvciBhbiBhcnJheSBvZiB2YWxpZGF0b3IncyBzdGFraW5nSURzLlxuICAgICAqL1xuICAgIGxpc3RWYWxpZGF0b3JzID0gYXN5bmMgKCk6UHJvbWlzZTxBcnJheTxzdHJpbmc+PiA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxNZXRob2QoXCJwbGF0Zm9ybS5saXN0VmFsaWRhdG9yc1wiKS50aGVuKChyZXNwb25zZTpSZXF1ZXN0UmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YVtcInJlc3VsdFwiXVtcInZhbGlkYXRvcnNcIl07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhbXBsZXMgYFNpemVgIHZhbGlkYXRvcnMgZnJvbSB0aGUgY3VycmVudCB2YWxpZGF0b3Igc2V0LlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBzYW1wbGVTaXplIE9mIHRoZSB0b3RhbCB1bml2ZXJzZSBvZiB2YWxpZGF0b3JzLCBzZWxlY3QgdGhpcyBtYW55IGF0IHJhbmRvbVxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIFByb21pc2UgZm9yIGFuIGFycmF5IG9mIHZhbGlkYXRvcidzIHN0YWtpbmdJRHMuXG4gICAgICovXG4gICAgc2FtcGxlVmFsaWRhdG9ycyA9IGFzeW5jIChzYW1wbGVTaXplOm51bWJlcik6UHJvbWlzZTxBcnJheTxzdHJpbmc+PiA9PiB7XG4gICAgICAgIGxldCBwYXJhbXMgPSB7XG4gICAgICAgICAgICBcInNpemVcIjogc2FtcGxlU2l6ZVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxsTWV0aG9kKFwicGxhdGZvcm0uc2FtcGxlVmFsaWRhdG9yc1wiLCBwYXJhbXMpLnRoZW4oKHJlc3BvbnNlOlJlcXVlc3RSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhW1wicmVzdWx0XCJdW1widmFsaWRhdG9yc1wiXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBjbGFzcyBzaG91bGQgbm90IGJlIGluc3RhbnRpYXRlZCBkaXJlY3RseS4gSW5zdGVhZCB1c2UgdGhlIFtbU2xvcGVzLmFkZEFQSV1dIG1ldGhvZC5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gY29yZSBBIHJlZmVyZW5jZSB0byB0aGUgU2xvcGVzIGNsYXNzXG4gICAgICogQHBhcmFtIGJhc2V1cmwgRGVmYXVsdHMgdG8gdGhlIHN0cmluZyBcIi9leHQvcGxhdGZvcm1cIiBhcyB0aGUgcGF0aCB0byBzdWJuZXRzIGJhc2V1cmxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjb3JlOlNsb3Blc0NvcmUsIGJhc2V1cmw6c3RyaW5nID0gXCIvZXh0L3BsYXRmb3JtXCIpeyBzdXBlcihjb3JlLCBiYXNldXJsKTsgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBQbGF0Zm9ybUFQSTsiXX0=

@@ -63,6 +63,6 @@ /**

export { Tx, TxUnsigned } from './apis/avm/tx';
export { UTXO, UTXOSet } from './apis/avm/utxos';
export { UTXO, SecpUTXO, UTXOSet } from './apis/avm/utxos';
export { SigIdx, Signature, UnixNow, Address } from './apis/avm/types';
export { OutCreateAsset, OutPayment, OutTakeOrLeave, Output, SelectOutputClass } from './apis/avm/outputs';
export { Input } from './apis/avm/inputs';
export { SecpOutput, Output, SelectOutputClass } from './apis/avm/outputs';
export { SecpInput, Input } from './apis/avm/inputs';
export { AVMKeyPair, AVMKeyChain } from './apis/avm/keychain';

@@ -69,0 +69,0 @@ export { AVMAPI as AVM };

@@ -90,3 +90,3 @@ "use strict";

this.addAPI("admin", api_4.default);
this.addAPI("avm", api_3.default, "/ext/subnet/avm", chainid);
this.addAPI("avm", api_3.default, "/ext/bc/avm", chainid);
this.addAPI("platform", api_2.default);

@@ -111,2 +111,3 @@ this.addAPI("keystore", api_1.default);

exports.UTXO = utxos_1.UTXO;
exports.SecpUTXO = utxos_1.SecpUTXO;
exports.UTXOSet = utxos_1.UTXOSet;

@@ -119,8 +120,7 @@ var types_1 = require("./apis/avm/types");

var outputs_1 = require("./apis/avm/outputs");
exports.OutCreateAsset = outputs_1.OutCreateAsset;
exports.OutPayment = outputs_1.OutPayment;
exports.OutTakeOrLeave = outputs_1.OutTakeOrLeave;
exports.SecpOutput = outputs_1.SecpOutput;
exports.Output = outputs_1.Output;
exports.SelectOutputClass = outputs_1.SelectOutputClass;
var inputs_1 = require("./apis/avm/inputs");
exports.SecpInput = inputs_1.SecpInput;
exports.Input = inputs_1.Input;

@@ -130,2 +130,2 @@ var keychain_1 = require("./apis/avm/keychain");

exports.AVMKeyChain = keychain_1.AVMKeyChain;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0dBRUc7QUFDSCxzREFBa0M7QUErRTFCLHFCQS9FRCxnQkFBVSxDQStFQztBQTlFbEIsOERBQThDO0FBaUd2QixtQkFqR2hCLGFBQVcsQ0FpR2E7QUFoRy9CLDhEQUE4QztBQWlHdkIsbUJBakdoQixhQUFXLENBaUdhO0FBaEcvQix5REFBb0M7QUE4RmxCLGNBOUZYLGFBQU0sQ0E4RlE7QUE3RnJCLDJEQUF3QztBQWdHcEIsZ0JBaEdiLGFBQVEsQ0FnR1U7QUEvRnpCLHlEQUEyQztBQXlFbkMsOEJBQVM7QUF4RWpCLGdFQUF3QztBQXNFaEMsbUJBdEVELGtCQUFRLENBc0VDO0FBckVoQixvREFBNEI7QUFzRXBCLGFBdEVELFlBQUUsQ0FzRUM7QUFwRVY7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFhLE1BQU8sU0FBUSxnQkFBVTtJQThCbEM7Ozs7Ozs7OztPQVNHO0lBQ0gsWUFBWSxFQUFTLEVBQUUsSUFBVyxFQUFFLFdBQWtCLE1BQU0sRUFBRSxZQUFtQixDQUFDLEVBQUUsYUFBb0IsU0FBUyxFQUFFLFdBQW1CLEtBQUs7UUFDdkksS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUF2QzlCOztXQUVHO1FBQ0gsVUFBSyxHQUFHLEdBQUcsRUFBRTtZQUNULE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQWEsQ0FBQztRQUMxQyxDQUFDLENBQUE7UUFFRDs7V0FFRztRQUNILFFBQUcsR0FBRyxHQUFHLEVBQUU7WUFDUCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFXLENBQUM7UUFDdEMsQ0FBQyxDQUFBO1FBRUQ7O1dBRUc7UUFDSCxhQUFRLEdBQUcsR0FBRyxFQUFFO1lBQ1osT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBZ0IsQ0FBQztRQUNoRCxDQUFDLENBQUE7UUFFRDs7V0FFRztRQUNILGFBQVEsR0FBRyxHQUFHLEVBQUU7WUFDWixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFnQixDQUFDO1FBQ2hELENBQUMsQ0FBQTtRQWNHLElBQUksT0FBTyxHQUFHLFVBQVUsQ0FBQztRQUN6QixJQUFHLE9BQU8sVUFBVSxLQUFLLFdBQVcsSUFBSSxDQUFDLFVBQVUsRUFBQztZQUNoRCxPQUFPLEdBQUcsbURBQW1ELENBQUM7U0FDakU7UUFDRCxJQUFHLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxTQUFTLElBQUksQ0FBQyxFQUFDO1lBQy9DLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1NBQzlCO1FBQ0QsSUFBRyxDQUFDLFFBQVEsRUFBQztZQUNULElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLGFBQVEsQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLGFBQU0sRUFBRSxpQkFBaUIsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxhQUFXLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxhQUFXLENBQUMsQ0FBQztTQUN4QztJQUNMLENBQUM7Q0FDSjtBQXhERCx3QkF3REM7QUFPRCw4QkFBeUI7QUFDekIseUNBQW9DO0FBQ3BDLHlDQUFvQztBQUNwQyxvQ0FBK0I7QUFDL0Isc0NBQWlDO0FBQ2pDLG1DQUE4QjtBQUM5QixzQ0FBaUM7QUFDakMsZ0NBQTJCO0FBRTNCLG9DQUE2QztBQUFyQyxrQkFBQSxFQUFFLENBQUE7QUFBRSwwQkFBQSxVQUFVLENBQUE7QUFDdEIsMENBQStDO0FBQXZDLHVCQUFBLElBQUksQ0FBQTtBQUFFLDBCQUFBLE9BQU8sQ0FBQTtBQUNyQiwwQ0FBcUU7QUFBN0QseUJBQUEsTUFBTSxDQUFBO0FBQUUsNEJBQUEsU0FBUyxDQUFBO0FBQUUsMEJBQUEsT0FBTyxDQUFBO0FBQUUsMEJBQUEsT0FBTyxDQUFBO0FBQzNDLDhDQUF5RztBQUFqRyxtQ0FBQSxjQUFjLENBQUE7QUFBRSwrQkFBQSxVQUFVLENBQUE7QUFBRSxtQ0FBQSxjQUFjLENBQUE7QUFBRSwyQkFBQSxNQUFNLENBQUE7QUFBRSxzQ0FBQSxpQkFBaUIsQ0FBQTtBQUM3RSw0Q0FBd0M7QUFBaEMseUJBQUEsS0FBSyxDQUFBO0FBQ2IsZ0RBQTREO0FBQXBELGdDQUFBLFVBQVUsQ0FBQTtBQUFFLGlDQUFBLFdBQVcsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG1vZHVsZSBTbG9wZXNcbiAqL1xuaW1wb3J0IFNsb3Blc0NvcmUgZnJvbSAnLi9zbG9wZXMnO1xuaW1wb3J0IEtleXN0b3JlQVBJIGZyb20gJy4vYXBpcy9rZXlzdG9yZS9hcGknO1xuaW1wb3J0IFBsYXRmb3JtQVBJIGZyb20gJy4vYXBpcy9wbGF0Zm9ybS9hcGknO1xuaW1wb3J0IEFWTUFQSSBmcm9tICcuL2FwaXMvYXZtL2FwaSc7XG5pbXBvcnQgQWRtaW5BUEkgZnJvbSAnLi9hcGlzL2FkbWluL2FwaSc7XG5pbXBvcnQgKiBhcyBDb3JlVHlwZXMgZnJvbSAnLi91dGlscy90eXBlcyc7XG5pbXBvcnQgQmluVG9vbHMgZnJvbSAnLi91dGlscy9iaW50b29scyc7XG5pbXBvcnQgREIgZnJvbSAnLi91dGlscy9kYic7XG5cbi8qKlxuICogU2xvcGVzIGlzIG1pZGRsZXdhcmUgZm9yIGludGVyYWN0aW5nIHdpdGggQVZBIG5vZGUgUlBDIEFQSXMuIFxuICogXG4gKiBFeGFtcGxlIHVzYWdlOlxuICogYGBganNcbiAqIGxldCBzbG9wZXMgPSBuZXcgU2xvcGVzKFwiMTI3LjAuMC4xXCIsIDk2NTAsIFwiaHR0cHNcIik7XG4gKiBgYGBcbiAqIFxuICovXG5leHBvcnQgY2xhc3MgU2xvcGVzIGV4dGVuZHMgU2xvcGVzQ29yZSB7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBBZG1pbiBSUEMuXG4gICAgICovXG4gICAgQWRtaW4gPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwaXNbXCJhZG1pblwiXSBhcyBBZG1pbkFQSTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBBVk0gUlBDLlxuICAgICAqL1xuICAgIEFWTSA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBpc1tcImF2bVwiXSBhcyBBVk1BUEk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgUGxhdGZvcm0gUlBDLlxuICAgICAqL1xuICAgIFBsYXRmb3JtID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hcGlzW1wicGxhdGZvcm1cIl0gYXMgUGxhdGZvcm1BUEk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgS2V5c3RvcmUgUlBDIGZvciBhIG5vZGUuIFdlIGxhYmVsIGl0IFwiTm9kZUtleXNcIiB0byByZWR1Y2UgY29uZnVzaW9uIGFib3V0IHdoYXQgaXQncyBhY2Nlc3NpbmcuXG4gICAgICovXG4gICAgTm9kZUtleXMgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwaXNbXCJrZXlzdG9yZVwiXSBhcyBLZXlzdG9yZUFQSTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEFWQSBpbnN0YW5jZS4gU2V0cyB0aGUgYWRkcmVzcyBhbmQgcG9ydCBvZiB0aGUgbWFpbiBBVkEgQ2xpZW50LlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBpcCBUaGUgaG9zdG5hbWUgdG8gcmVzb2x2ZSB0byByZWFjaCB0aGUgQVZBIENsaWVudCBSUEMgQVBJc1xuICAgICAqIEBwYXJhbSBwb3J0IFRoZSBwb3J0IHRvIHJlb2x2ZSB0byByZWFjaCB0aGUgQVZBIENsaWVudCBSUEMgQVBJc1xuICAgICAqIEBwYXJhbSBwcm90b2NvbCBUaGUgcHJvdG9jb2wgc3RyaW5nIHRvIHVzZSBiZWZvcmUgYSBcIjovL1wiIGluIGEgcmVxdWVzdCwgZXg6IFwiaHR0cFwiLCBcImh0dHBzXCIsIFwiZ2l0XCIsIFwid3NcIiwgZXRjIC4uLlxuICAgICAqIEBwYXJhbSBuZXR3b3JraWQgU2V0cyB0aGUgTmV0d29ya0lEIG9mIHRoZSBjbGFzcy4gRGVmYXVsdCAyXG4gICAgICogQHBhcmFtIGF2bUNoYWluSUQgU2V0cyB0aGUgYmxvY2tjaGFpbklEIGZvciB0aGUgQVZNLiBEZWZhdWx0IFwiSEQ4SEV3TktUWFJCY1ZVcXZRVzJMUnU5aXpxZWo5MXh6R21YQVRGNEtNTVY2TExtN1wiXG4gICAgICogQHBhcmFtIHNraXBpbml0IFNraXBzIGNyZWF0aW5nIHRoZSBBUElzXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoaXA6c3RyaW5nLCBwb3J0Om51bWJlciwgcHJvdG9jb2w6c3RyaW5nID0gXCJodHRwXCIsIG5ldHdvcmtJRDpudW1iZXIgPSAyLCBhdm1DaGFpbklEOnN0cmluZyA9IHVuZGVmaW5lZCwgc2tpcGluaXQ6Ym9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHN1cGVyKGlwLCBwb3J0LCBwcm90b2NvbCk7XG4gICAgICAgIGxldCBjaGFpbmlkID0gYXZtQ2hhaW5JRDtcbiAgICAgICAgaWYodHlwZW9mIGF2bUNoYWluSUQgPT09ICd1bmRlZmluZWQnIHx8ICFhdm1DaGFpbklEKXtcbiAgICAgICAgICAgIGNoYWluaWQgPSBcIkhEOEhFd05LVFhSQmNWVXF2UVcyTFJ1OWl6cWVqOTF4ekdtWEFURjRLTU1WNkxMbTdcIjtcbiAgICAgICAgfVxuICAgICAgICBpZih0eXBlb2YgbmV0d29ya0lEID09PSAnbnVtYmVyJyAmJiBuZXR3b3JrSUQgPj0gMCl7XG4gICAgICAgICAgICB0aGlzLm5ldHdvcmtJRCA9IG5ldHdvcmtJRDtcbiAgICAgICAgfVxuICAgICAgICBpZighc2tpcGluaXQpe1xuICAgICAgICAgICAgdGhpcy5hZGRBUEkoXCJhZG1pblwiLCBBZG1pbkFQSSk7XG4gICAgICAgICAgICB0aGlzLmFkZEFQSShcImF2bVwiLCBBVk1BUEksIFwiL2V4dC9zdWJuZXQvYXZtXCIsIGNoYWluaWQpO1xuICAgICAgICAgICAgdGhpcy5hZGRBUEkoXCJwbGF0Zm9ybVwiLCBQbGF0Zm9ybUFQSSk7XG4gICAgICAgICAgICB0aGlzLmFkZEFQSShcImtleXN0b3JlXCIsIEtleXN0b3JlQVBJKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHtCaW5Ub29sc307XG5leHBvcnQge0RCfTtcbmV4cG9ydCB7Q29yZVR5cGVzfTtcbmV4cG9ydCB7U2xvcGVzQ29yZX07XG5cbmV4cG9ydCAqIGZyb20gJy4vc2xvcGVzJztcbmV4cG9ydCAqIGZyb20gJy4vYXBpcy9rZXlzdG9yZS9hcGknO1xuZXhwb3J0ICogZnJvbSAnLi9hcGlzL3BsYXRmb3JtL2FwaSc7XG5leHBvcnQgKiBmcm9tICcuL2FwaXMvYXZtL2FwaSc7XG5leHBvcnQgKiBmcm9tICcuL2FwaXMvYWRtaW4vYXBpJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9iaW50b29scyc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL2RiJztcblxuZXhwb3J0IHtUeCwgVHhVbnNpZ25lZH0gZnJvbSAnLi9hcGlzL2F2bS90eCc7XG5leHBvcnQge1VUWE8sIFVUWE9TZXR9IGZyb20gJy4vYXBpcy9hdm0vdXR4b3MnO1x0XG5leHBvcnQge1NpZ0lkeCwgU2lnbmF0dXJlLCBVbml4Tm93LCBBZGRyZXNzfSBmcm9tICcuL2FwaXMvYXZtL3R5cGVzJztcdFxuZXhwb3J0IHtPdXRDcmVhdGVBc3NldCwgT3V0UGF5bWVudCwgT3V0VGFrZU9yTGVhdmUsIE91dHB1dCwgU2VsZWN0T3V0cHV0Q2xhc3N9IGZyb20gJy4vYXBpcy9hdm0vb3V0cHV0cyc7XHRcbmV4cG9ydCB7SW5wdXR9IGZyb20gJy4vYXBpcy9hdm0vaW5wdXRzJztcdFxuZXhwb3J0IHtBVk1LZXlQYWlyLCBBVk1LZXlDaGFpbn0gZnJvbSAnLi9hcGlzL2F2bS9rZXljaGFpbic7XG5cbmV4cG9ydCB7QVZNQVBJIGFzIEFWTX07XG5leHBvcnQge0tleXN0b3JlQVBJIGFzIEtleXN0b3JlfTtcbmV4cG9ydCB7UGxhdGZvcm1BUEkgYXMgUGxhdGZvcm19O1xuZXhwb3J0IHtBZG1pbkFQSSBhcyBBZG1pbn07XG5cblxuIl19
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0dBRUc7QUFDSCxzREFBa0M7QUErRTFCLHFCQS9FRCxnQkFBVSxDQStFQztBQTlFbEIsOERBQThDO0FBaUd2QixtQkFqR2hCLGFBQVcsQ0FpR2E7QUFoRy9CLDhEQUE4QztBQWlHdkIsbUJBakdoQixhQUFXLENBaUdhO0FBaEcvQix5REFBb0M7QUE4RmxCLGNBOUZYLGFBQU0sQ0E4RlE7QUE3RnJCLDJEQUF3QztBQWdHcEIsZ0JBaEdiLGFBQVEsQ0FnR1U7QUEvRnpCLHlEQUEyQztBQXlFbkMsOEJBQVM7QUF4RWpCLGdFQUF3QztBQXNFaEMsbUJBdEVELGtCQUFRLENBc0VDO0FBckVoQixvREFBNEI7QUFzRXBCLGFBdEVELFlBQUUsQ0FzRUM7QUFwRVY7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFhLE1BQU8sU0FBUSxnQkFBVTtJQThCbEM7Ozs7Ozs7OztPQVNHO0lBQ0gsWUFBWSxFQUFTLEVBQUUsSUFBVyxFQUFFLFdBQWtCLE1BQU0sRUFBRSxZQUFtQixDQUFDLEVBQUUsYUFBb0IsU0FBUyxFQUFFLFdBQW1CLEtBQUs7UUFDdkksS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUF2QzlCOztXQUVHO1FBQ0gsVUFBSyxHQUFHLEdBQUcsRUFBRTtZQUNULE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQWEsQ0FBQztRQUMxQyxDQUFDLENBQUE7UUFFRDs7V0FFRztRQUNILFFBQUcsR0FBRyxHQUFHLEVBQUU7WUFDUCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFXLENBQUM7UUFDdEMsQ0FBQyxDQUFBO1FBRUQ7O1dBRUc7UUFDSCxhQUFRLEdBQUcsR0FBRyxFQUFFO1lBQ1osT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBZ0IsQ0FBQztRQUNoRCxDQUFDLENBQUE7UUFFRDs7V0FFRztRQUNILGFBQVEsR0FBRyxHQUFHLEVBQUU7WUFDWixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFnQixDQUFDO1FBQ2hELENBQUMsQ0FBQTtRQWNHLElBQUksT0FBTyxHQUFHLFVBQVUsQ0FBQztRQUN6QixJQUFHLE9BQU8sVUFBVSxLQUFLLFdBQVcsSUFBSSxDQUFDLFVBQVUsRUFBQztZQUNoRCxPQUFPLEdBQUcsbURBQW1ELENBQUM7U0FDakU7UUFDRCxJQUFHLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxTQUFTLElBQUksQ0FBQyxFQUFDO1lBQy9DLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1NBQzlCO1FBQ0QsSUFBRyxDQUFDLFFBQVEsRUFBQztZQUNULElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLGFBQVEsQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLGFBQU0sRUFBRSxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsYUFBVyxDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsYUFBVyxDQUFDLENBQUM7U0FDeEM7SUFDTCxDQUFDO0NBQ0o7QUF4REQsd0JBd0RDO0FBT0QsOEJBQXlCO0FBQ3pCLHlDQUFvQztBQUNwQyx5Q0FBb0M7QUFDcEMsb0NBQStCO0FBQy9CLHNDQUFpQztBQUNqQyxtQ0FBOEI7QUFDOUIsc0NBQWlDO0FBQ2pDLGdDQUEyQjtBQUUzQixvQ0FBNkM7QUFBckMsa0JBQUEsRUFBRSxDQUFBO0FBQUUsMEJBQUEsVUFBVSxDQUFBO0FBQ3RCLDBDQUF5RDtBQUFqRCx1QkFBQSxJQUFJLENBQUE7QUFBRSwyQkFBQSxRQUFRLENBQUE7QUFBRSwwQkFBQSxPQUFPLENBQUE7QUFDL0IsMENBQXFFO0FBQTdELHlCQUFBLE1BQU0sQ0FBQTtBQUFFLDRCQUFBLFNBQVMsQ0FBQTtBQUFFLDBCQUFBLE9BQU8sQ0FBQTtBQUFFLDBCQUFBLE9BQU8sQ0FBQTtBQUMzQyw4Q0FBeUU7QUFBakUsK0JBQUEsVUFBVSxDQUFBO0FBQUUsMkJBQUEsTUFBTSxDQUFBO0FBQUUsc0NBQUEsaUJBQWlCLENBQUE7QUFDN0MsNENBQW1EO0FBQTNDLDZCQUFBLFNBQVMsQ0FBQTtBQUFFLHlCQUFBLEtBQUssQ0FBQTtBQUN4QixnREFBNEQ7QUFBcEQsZ0NBQUEsVUFBVSxDQUFBO0FBQUUsaUNBQUEsV0FBVyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbW9kdWxlIFNsb3Blc1xuICovXG5pbXBvcnQgU2xvcGVzQ29yZSBmcm9tICcuL3Nsb3Blcyc7XG5pbXBvcnQgS2V5c3RvcmVBUEkgZnJvbSAnLi9hcGlzL2tleXN0b3JlL2FwaSc7XG5pbXBvcnQgUGxhdGZvcm1BUEkgZnJvbSAnLi9hcGlzL3BsYXRmb3JtL2FwaSc7XG5pbXBvcnQgQVZNQVBJIGZyb20gJy4vYXBpcy9hdm0vYXBpJztcbmltcG9ydCBBZG1pbkFQSSBmcm9tICcuL2FwaXMvYWRtaW4vYXBpJztcbmltcG9ydCAqIGFzIENvcmVUeXBlcyBmcm9tICcuL3V0aWxzL3R5cGVzJztcbmltcG9ydCBCaW5Ub29scyBmcm9tICcuL3V0aWxzL2JpbnRvb2xzJztcbmltcG9ydCBEQiBmcm9tICcuL3V0aWxzL2RiJztcblxuLyoqXG4gKiBTbG9wZXMgaXMgbWlkZGxld2FyZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBBVkEgbm9kZSBSUEMgQVBJcy4gXG4gKiBcbiAqIEV4YW1wbGUgdXNhZ2U6XG4gKiBgYGBqc1xuICogbGV0IHNsb3BlcyA9IG5ldyBTbG9wZXMoXCIxMjcuMC4wLjFcIiwgOTY1MCwgXCJodHRwc1wiKTtcbiAqIGBgYFxuICogXG4gKi9cbmV4cG9ydCBjbGFzcyBTbG9wZXMgZXh0ZW5kcyBTbG9wZXNDb3JlIHtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIEFkbWluIFJQQy5cbiAgICAgKi9cbiAgICBBZG1pbiA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBpc1tcImFkbWluXCJdIGFzIEFkbWluQVBJO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIEFWTSBSUEMuXG4gICAgICovXG4gICAgQVZNID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hcGlzW1wiYXZtXCJdIGFzIEFWTUFQSTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBQbGF0Zm9ybSBSUEMuXG4gICAgICovXG4gICAgUGxhdGZvcm0gPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwaXNbXCJwbGF0Zm9ybVwiXSBhcyBQbGF0Zm9ybUFQSTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBLZXlzdG9yZSBSUEMgZm9yIGEgbm9kZS4gV2UgbGFiZWwgaXQgXCJOb2RlS2V5c1wiIHRvIHJlZHVjZSBjb25mdXNpb24gYWJvdXQgd2hhdCBpdCdzIGFjY2Vzc2luZy5cbiAgICAgKi9cbiAgICBOb2RlS2V5cyA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBpc1tcImtleXN0b3JlXCJdIGFzIEtleXN0b3JlQVBJO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQVZBIGluc3RhbmNlLiBTZXRzIHRoZSBhZGRyZXNzIGFuZCBwb3J0IG9mIHRoZSBtYWluIEFWQSBDbGllbnQuXG4gICAgICogXG4gICAgICogQHBhcmFtIGlwIFRoZSBob3N0bmFtZSB0byByZXNvbHZlIHRvIHJlYWNoIHRoZSBBVkEgQ2xpZW50IFJQQyBBUElzXG4gICAgICogQHBhcmFtIHBvcnQgVGhlIHBvcnQgdG8gcmVvbHZlIHRvIHJlYWNoIHRoZSBBVkEgQ2xpZW50IFJQQyBBUElzXG4gICAgICogQHBhcmFtIHByb3RvY29sIFRoZSBwcm90b2NvbCBzdHJpbmcgdG8gdXNlIGJlZm9yZSBhIFwiOi8vXCIgaW4gYSByZXF1ZXN0LCBleDogXCJodHRwXCIsIFwiaHR0cHNcIiwgXCJnaXRcIiwgXCJ3c1wiLCBldGMgLi4uXG4gICAgICogQHBhcmFtIG5ldHdvcmtpZCBTZXRzIHRoZSBOZXR3b3JrSUQgb2YgdGhlIGNsYXNzLiBEZWZhdWx0IDJcbiAgICAgKiBAcGFyYW0gYXZtQ2hhaW5JRCBTZXRzIHRoZSBibG9ja2NoYWluSUQgZm9yIHRoZSBBVk0uIERlZmF1bHQgXCJIRDhIRXdOS1RYUkJjVlVxdlFXMkxSdTlpenFlajkxeHpHbVhBVEY0S01NVjZMTG03XCJcbiAgICAgKiBAcGFyYW0gc2tpcGluaXQgU2tpcHMgY3JlYXRpbmcgdGhlIEFQSXNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihpcDpzdHJpbmcsIHBvcnQ6bnVtYmVyLCBwcm90b2NvbDpzdHJpbmcgPSBcImh0dHBcIiwgbmV0d29ya0lEOm51bWJlciA9IDIsIGF2bUNoYWluSUQ6c3RyaW5nID0gdW5kZWZpbmVkLCBza2lwaW5pdDpib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgc3VwZXIoaXAsIHBvcnQsIHByb3RvY29sKTtcbiAgICAgICAgbGV0IGNoYWluaWQgPSBhdm1DaGFpbklEO1xuICAgICAgICBpZih0eXBlb2YgYXZtQ2hhaW5JRCA9PT0gJ3VuZGVmaW5lZCcgfHwgIWF2bUNoYWluSUQpe1xuICAgICAgICAgICAgY2hhaW5pZCA9IFwiSEQ4SEV3TktUWFJCY1ZVcXZRVzJMUnU5aXpxZWo5MXh6R21YQVRGNEtNTVY2TExtN1wiO1xuICAgICAgICB9XG4gICAgICAgIGlmKHR5cGVvZiBuZXR3b3JrSUQgPT09ICdudW1iZXInICYmIG5ldHdvcmtJRCA+PSAwKXtcbiAgICAgICAgICAgIHRoaXMubmV0d29ya0lEID0gbmV0d29ya0lEO1xuICAgICAgICB9XG4gICAgICAgIGlmKCFza2lwaW5pdCl7XG4gICAgICAgICAgICB0aGlzLmFkZEFQSShcImFkbWluXCIsIEFkbWluQVBJKTtcbiAgICAgICAgICAgIHRoaXMuYWRkQVBJKFwiYXZtXCIsIEFWTUFQSSwgXCIvZXh0L2JjL2F2bVwiLCBjaGFpbmlkKTtcbiAgICAgICAgICAgIHRoaXMuYWRkQVBJKFwicGxhdGZvcm1cIiwgUGxhdGZvcm1BUEkpO1xuICAgICAgICAgICAgdGhpcy5hZGRBUEkoXCJrZXlzdG9yZVwiLCBLZXlzdG9yZUFQSSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCB7QmluVG9vbHN9O1xuZXhwb3J0IHtEQn07XG5leHBvcnQge0NvcmVUeXBlc307XG5leHBvcnQge1Nsb3Blc0NvcmV9O1xuXG5leHBvcnQgKiBmcm9tICcuL3Nsb3Blcyc7XG5leHBvcnQgKiBmcm9tICcuL2FwaXMva2V5c3RvcmUvYXBpJztcbmV4cG9ydCAqIGZyb20gJy4vYXBpcy9wbGF0Zm9ybS9hcGknO1xuZXhwb3J0ICogZnJvbSAnLi9hcGlzL2F2bS9hcGknO1xuZXhwb3J0ICogZnJvbSAnLi9hcGlzL2FkbWluL2FwaSc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL3R5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvYmludG9vbHMnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9kYic7XG5cbmV4cG9ydCB7VHgsIFR4VW5zaWduZWR9IGZyb20gJy4vYXBpcy9hdm0vdHgnO1xuZXhwb3J0IHtVVFhPLCBTZWNwVVRYTywgVVRYT1NldH0gZnJvbSAnLi9hcGlzL2F2bS91dHhvcyc7XHRcbmV4cG9ydCB7U2lnSWR4LCBTaWduYXR1cmUsIFVuaXhOb3csIEFkZHJlc3N9IGZyb20gJy4vYXBpcy9hdm0vdHlwZXMnO1x0XG5leHBvcnQge1NlY3BPdXRwdXQsIE91dHB1dCwgU2VsZWN0T3V0cHV0Q2xhc3N9IGZyb20gJy4vYXBpcy9hdm0vb3V0cHV0cyc7XHRcbmV4cG9ydCB7U2VjcElucHV0LCBJbnB1dH0gZnJvbSAnLi9hcGlzL2F2bS9pbnB1dHMnO1x0XG5leHBvcnQge0FWTUtleVBhaXIsIEFWTUtleUNoYWlufSBmcm9tICcuL2FwaXMvYXZtL2tleWNoYWluJztcblxuZXhwb3J0IHtBVk1BUEkgYXMgQVZNfTtcbmV4cG9ydCB7S2V5c3RvcmVBUEkgYXMgS2V5c3RvcmV9O1xuZXhwb3J0IHtQbGF0Zm9ybUFQSSBhcyBQbGF0Zm9ybX07XG5leHBvcnQge0FkbWluQVBJIGFzIEFkbWlufTtcblxuXG4iXX0=

@@ -160,3 +160,3 @@ /// <reference types="node" />

*/
makeKey: (entropy: Buffer | boolean) => string;
makeKey: (entropy?: Buffer) => string;
/**

@@ -177,3 +177,3 @@ * Given a private key, makes a new key pair, returns the address.

/**
* Adds the key pair to the list of the keys manages in the keychain.
* Adds the key pair to the list of the keys managed in the keychain.
*

@@ -184,2 +184,10 @@ * @param newKey A key pair of the appropriate class to be added to the keychain

/**
* Removes the key pair from the list of they keys managed in the keychain.
*
* @param key A string for the address or KPClass to remove
*
* @returns The boolean true if a key was removed.
*/
removeKey: (key: string | KPClass) => boolean;
/**
* Checks if there is a key associated with the provided address.

@@ -186,0 +194,0 @@ *

@@ -174,3 +174,3 @@ "use strict";

/**
* Adds the key pair to the list of the keys manages in the keychain.
* Adds the key pair to the list of the keys managed in the keychain.
*

@@ -183,2 +183,28 @@ * @param newKey A key pair of the appropriate class to be added to the keychain

/**
* Removes the key pair from the list of they keys managed in the keychain.
*
* @param key A string for the address or KPClass to remove
*
* @returns The boolean true if a key was removed.
*/
this.removeKey = (key) => {
let kaddr;
if (typeof key !== "string") {
kaddr = key.getAddress();
}
else if (typeof key === 'string') {
kaddr = key;
}
else {
return false;
}
if (kaddr in this.keys) {
delete this.keys[kaddr];
return true;
}
else {
return false;
}
};
/**
* Checks if there is a key associated with the provided address.

@@ -281,2 +307,2 @@ *

exports.NBytes = NBytes;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFJQSxvQ0FBaUM7QUFDakMsOENBQXNCO0FBRXRCLDBEQUFtQztBQUluQzs7R0FFRztBQUNILE1BQU0sUUFBUSxHQUFHLGtCQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7QUFFeEM7O0dBRUc7QUFDSCxNQUFhLG1CQUFtQjtDQU0vQjtBQU5ELGtEQU1DO0FBRUQ7O0dBRUc7QUFDSCxNQUFzQixPQUFPO0lBcUN6Qjs7OztPQUlHO0lBQ0gsWUFBWSxJQUFlLEVBQUUsT0FBYztRQXJDM0M7Ozs7V0FJRztRQUNILGVBQVUsR0FBRyxDQUFDLE9BQWMsRUFBRSxFQUFFO1lBQzVCLElBQUcsSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLE9BQU8sRUFBQztnQkFDbkMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxFQUFFLEdBQUcsWUFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ2hDO2lCQUFNO2dCQUNILElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO2dCQUN2QixJQUFJLENBQUMsRUFBRSxHQUFHLFlBQUUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDdEM7UUFDTCxDQUFDLENBQUE7UUFFRDs7V0FFRztRQUNILGVBQVUsR0FBRyxHQUFZLEVBQUU7WUFDdkIsT0FBTyxJQUFJLENBQUMsT0FBTyxD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TSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN6QjtZQUNELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN0QixDQUFDLENBQUE7UUFFRDs7OztXQUlHO1FBQ0gsYUFBUSxHQUFHLEdBQVUsRUFBRTtZQUNuQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDdEIsQ0FBQyxDQUFBO1FBRUQ7Ozs7V0FJRztRQUNILGFBQVEsR0FBRyxHQUFVLEVBQUU7WUFDbkIsT0FBTyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELENBQUMsQ0FBQTtJQUljLENBQUM7Q0FDbkI7QUF4RUQsd0JBd0VDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbW9kdWxlIFV0aWxzXG4gKi9cbmltcG9ydCBTbG9wZXNDb3JlIGZyb20gJy4uL3Nsb3Blcyc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tIFwiYnVmZmVyL1wiO1xuaW1wb3J0IERCIGZyb20gXCIuL2RiXCI7XG5pbXBvcnQgeyBTdG9yZUFQSSB9IGZyb20gJ3N0b3JlMic7XG5pbXBvcnQgQmluVG9vbHMgIGZyb20gJy4vYmludG9vbHMnO1xuaW1wb3J0IHsgQ2xpZW50UmVxdWVzdCB9IGZyb20gXCJodHRwXCI7XG5pbXBvcnQgeyBBeGlvc1JlcXVlc3RDb25maWcgfSBmcm9tICdheGlvcyc7XG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5jb25zdCBiaW50b29scyA9IEJpblRvb2xzLmdldEluc3RhbmNlKCk7XG5cbi8qKlxuICogUmVzcG9uc2UgZGF0YSBmb3IgSFRUUCByZXF1ZXN0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlcXVlc3RSZXNwb25zZURhdGEge1xuICAgIGRhdGE6IHN0cmluZyB8IG9iamVjdCB8IEFycmF5PG9iamVjdD47XG4gICAgaGVhZGVyczpvYmplY3Q7XG4gICAgc3RhdHVzOiBudW1iZXI7XG4gICAgc3RhdHVzVGV4dDogc3RyaW5nO1xuICAgIHJlcXVlc3Q6Q2xpZW50UmVxdWVzdCB8IFhNTEh0dHBSZXF1ZXN0O1xufVxuXG4vKipcbiAqIEFic3RyYWN0IGNsYXNzIGRlZmluaW5nIGEgZ2VuZXJpYyBlbmRwb2ludCB0aGF0IGFsbCBlbmRwb2ludHMgbXVzdCBpbXBsZW1lbnQgKGV4dGVuZCkuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBUElCYXNlIHtcbiAgICBwcm90ZWN0ZWQgY29yZTpTbG9wZXNDb3JlO1xuICAgIHByb3RlY3RlZCBiYXNldXJsOnN0cmluZztcbiAgICBwcm90ZWN0ZWQgZGI6U3RvcmVBUEk7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBwYXRoIG9mIHRoZSBBUElzIGJhc2V1cmwuXG4gICAgICogXG4gICAgICogQHBhcmFtIGJhc2V1cmwgUGF0aCBvZiB0aGUgQVBJcyBiYXNldXJsIC0gZXg6IFwiL2V4dC9hdmFcIlxuICAgICAqL1xuICAgIHNldEJhc2VVUkwgPSAoYmFzZXVybDpzdHJpbmcpID0+IHtcbiAgICAgICAgaWYodGhpcy5kYiAmJiB0aGlzLmJhc2V1cmwgIT09IGJhc2V1cmwpe1xuICAgICAgICAgICAgbGV0IGJhY2t1cCA9IHRoaXMuZGIuZ2V0QWxsKCk7XG4gICAgICAgICAgICB0aGlzLmRiLmNsZWFyQWxsKCk7XG4gICAgICAgICAgICB0aGlzLmJhc2V1cmwgPSBiYXNldXJsO1xuICAgICAgICAgICAgdGhpcy5kYiA9IERCLmdldE5hbWVzcGFjZShiYXNldXJsKTtcbiAgICAgICAgICAgIHRoaXMuZGIuc2V0QWxsKGJhY2t1cCwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJhc2V1cmwgPSBiYXNldXJsO1xuICAgICAgICAgICAgdGhpcy5kYiA9IERCLmdldE5hbWVzcGFjZShiYXNldXJsKTtcbiAgICAgICAgfVxuICAgIH0gXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBiYXNldXJsJ3MgcGF0aC4gXG4gICAgICovXG4gICAgZ2V0QmFzZVVSTCA9ICgpIDogc3RyaW5nID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZXVybDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBiYXNldXJsJ3MgZGF0YWJhc2UuXG4gICAgICovXG4gICAgZ2V0REIgPSAoKTpTdG9yZUFQSSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRiO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBjb3JlIFJlZmVyZW5jZSB0byB0aGUgU2xvcGVzIGluc3RhbmNlIHVzaW5nIHRoaXMgYmFzZXVybFxuICAgICAqIEBwYXJhbSBiYXNldXJsIFBhdGggdG8gdGhlIGJhc2V1cmwgLSBleDogXCIvZXh0L3N1Ym5ldC9hdm1cIlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvcmU6U2xvcGVzQ29yZSwgYmFzZXVybDpzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5jb3JlID0gY29yZTtcbiAgICAgICAgdGhpcy5zZXRCYXNlVVJMKGJhc2V1cmwpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEpSUENBUEkgZXh0ZW5kcyBBUElCYXNlIHtcbiAgICBwcm90ZWN0ZWQganJwY1ZlcnNpb246c3RyaW5nID0gXCIyLjBcIjtcbiAgICBwcm90ZWN0ZWQgcnBjaWQgPSAxO1xuICAgIGNhbGxNZXRob2QgPSBhc3luYyAobWV0aG9kOnN0cmluZywgcGFyYW1zPzpBcnJheTxvYmplY3Q+IHwgb2JqZWN0LCBiYXNldXJsPzpzdHJpbmcpOlByb21pc2U8UmVxdWVzdFJlc3BvbnNlRGF0YT4gPT4ge1xuICAgICAgICBsZXQgZXAgPSBiYXNldXJsID8gYmFzZXVybCA6IHRoaXMuYmFzZXVybDtcbiAgICAgICAgbGV0IHJwYzpvYmplY3QgPSB7fTtcbiAgICAgICAgcnBjW1wiaWRcIl0gPSB0aGlzLnJwY2lkO1xuICAgICAgICBycGNbXCJtZXRob2RcIl0gPSBtZXRob2Q7XG5cbiAgICAgICAgLy8gU2V0IHBhcmFtZXRlcnMgaWYgZXhpc3RzXG4gICAgICAgIGlmKHBhcmFtcyl7XG4gICAgICAgICAgICBycGNbJ3BhcmFtcyddID0gcGFyYW1zO1xuICAgICAgICB9IGVsc2UgaWYodGhpcy5qcnBjVmVyc2lvbiA9PSBcIjEuMFwiKXtcbiAgICAgICAgICAgIHJwY1tcInBhcmFtc1wiXSA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYodGhpcy5qcnBjVmVyc2lvbiAhPSBcIjEuMFwiKSB7XG4gICAgICAgICAgICBycGNbXCJqc29ucnBjXCJdID0gdGhpcy5qcnBjVmVyc2lvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoZWFkZXJzOm9iamVjdCA9IHtcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOFwifTtcblxuICAgICAgICBsZXQgYXhDb25mOkF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgICAgICAgIGJhc2VVUkw6dGhpcy5jb3JlLmdldFByb3RvY29sKCkrXCI6Ly9cIit0aGlzLmNvcmUuZ2V0SVAoKStcIjpcIit0aGlzLmNvcmUuZ2V0UG9ydCgpLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbidcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gdGhpcy5jb3JlLnBvc3QoZXAsIHt9LCBKU09OLnN0cmluZ2lmeShycGMpLCBoZWFkZXJzLCBheENvbmYpLnRoZW4oIChyZXNwOlJlcXVlc3RSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgICAgIGlmKHJlc3Auc3RhdHVzID49IDIwMCAmJiByZXNwLnN0YXR1cyA8IDMwMCl7XG4gICAgICAgICAgICAgICAgdGhpcy5ycGNpZCArPSAxO1xuICAgICAgICAgICAgICAgIGlmKHR5cGVvZiByZXNwLmRhdGEgPT09IFwic3RyaW5nXCIpe1xuICAgICAgICAgICAgICAgICAgICByZXNwLmRhdGEgPSBKU09OLnBhcnNlKHJlc3AuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZih0eXBlb2YgcmVzcC5kYXRhID09PSAnb2JqZWN0JyAmJiAnZXJyb3InIGluIHJlc3AuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFcnJvciByZXR1cm5lZDogXCIgKyBKU09OLnN0cmluZ2lmeShyZXNwLmRhdGEpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3A7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gICBcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHJwY2lkLCBhIHN0cmljdGx5LWluY3JlYXNpbmcgbnVtYmVyLCBzdGFydGluZyBmcm9tIDEsIGluZGljYXRpbmcgdGhlIG5leHQgcmVxdWVzdCBJRCB0aGF0IHdpbGwgYmUgc2VudC5cbiAgICAgKi9cbiAgICBnZXRSUENJRCA9ICgpOm51bWJlciA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJwY2lkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBjb3JlIFJlZmVyZW5jZSB0byB0aGUgU2xvcGVzIGluc3RhbmNlIHVzaW5nIHRoaXMgZW5kcG9pbnRcbiAgICAgKiBAcGFyYW0gYmFzZXVybCBQYXRoIG9mIHRoZSBBUElzIGJhc2V1cmwgLSBleDogXCIvZXh0L3N1Ym5ldC9hdm1cIlxuICAgICAqIEBwYXJhbSBqcnBjVmVyc2lvbiBUaGUganJwYyB2ZXJzaW9uIHRvIHVzZSwgZGVmYXVsdCBcIjIuMFwiLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvcmU6U2xvcGVzQ29yZSwgYmFzZXVybDpzdHJpbmcsIGpycGNWZXJzaW9uOnN0cmluZyA9IFwiMi4wXCIpIHtcbiAgICAgICAgc3VwZXIoY29yZSwgYmFzZXVybCk7XG4gICAgICAgIHRoaXMuanJwY1ZlcnNpb24gPSBqcnBjVmVyc2lvbjtcbiAgICAgICAgdGhpcy5ycGNpZCA9IDE7XG4gICAgfVxufVxuXG4vKipcbiAqIENsYXNzIGZvciByZXByZXNlbnRpbmcgYSBwcml2YXRlIGFuZCBwdWJsaWMga2V5cGFpciBpbiBTbG9wZXMuIFxuICogQWxsIEFQSXMgdGhhdCBuZWVkIGtleSBwYWlycyBzaG91bGQgZXh0ZW5kIG9uIHRoaXMgY2xhc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBLZXlQYWlyIHtcbiAgICBwcm90ZWN0ZWQgcHViazpCdWZmZXI7XG4gICAgcHJvdGVjdGVkIHByaXZrOkJ1ZmZlcjtcblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIG5ldyBrZXlwYWlyLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBlbnRyb3B5IE9wdGlvbmFsIHBhcmFtZXRlciB0aGF0IG1heSBiZSBuZWNlc3NhcnkgdG8gcHJvZHVjZSBzZWN1cmUga2V5c1xuICAgICAqL1xuICAgIGdlbmVyYXRlS2V5OihlbnRyb3B5PzpCdWZmZXIpID0+IHZvaWQ7XG4gICAgLyoqXG4gICAgICogSW1wb3J0cyBhIHByaXZhdGUga2V5IGFuZCBnZW5lcmF0ZXMgdGhlIGFwcHJvcHJpYXRlIHB1YmxpYyBrZXkuXG4gICAgICogXG4gICAgICogQHBhcmFtIHByaXZrIEEge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyfEJ1ZmZlcn0gcmVwcmVzZW50aW5nIHRoZSBwcml2YXRlIGtleSBcbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmVcbiAgICAgKi9cbiAgICBpbXBvcnRLZXk6KHByaXZrOkJ1ZmZlcikgPT4gYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFRha2VzIGEgbWVzc2FnZSwgc2lnbnMgaXQsIGFuZCByZXR1cm5zIHRoZSBzaWduYXR1cmUuXG4gICAgICogXG4gICAgICogQHBhcmFtIG1zZyBUaGUgbWVzc2FnZSB0byBzaWduXG4gICAgICogXG4gICAgICogQHJldHVybnMgQSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfSBjb250YWluaW5nIHRoZSBzaWduYXR1cmVcbiAgICAgKi9cbiAgICBzaWduOihtc2c6QnVmZmVyKSA9PiBCdWZmZXI7XG5cbiAgICAvKipcbiAgICAgKiBSZWNvdmVycyB0aGUgcHVibGljIGtleSBvZiBhIG1lc3NhZ2Ugc2lnbmVyIGZyb20gYSBtZXNzYWdlIGFuZCBpdHMgYXNzb2NpYXRlZCBzaWduYXR1cmUuXG4gICAgICogXG4gICAgICogQHBhcmFtIG1zZyBUaGUgbWVzc2FnZSB0aGF0J3Mgc2lnbmVkXG4gICAgICogQHBhcmFtIHNpZyBUaGUgc2lnbmF0dXJlIHRoYXQncyBzaWduZWQgb24gdGhlIG1lc3NhZ2VcbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBBIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlcnxCdWZmZXJ9IGNvbnRhaW5pbmcgdGhlIHB1YmxpYyBrZXkgb2YgdGhlIHNpZ25lclxuICAgICAqL1xuICAgIHJlY292ZXI6KG1zZzpCdWZmZXIsIHNpZzpCdWZmZXIpID0+IEJ1ZmZlcjtcblxuICAgIC8qKlxuICAgICAqIFZlcmlmaWVzIHRoYXQgdGhlIHByaXZhdGUga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgcHVibGljIGtleSBwcm9kdWNlcyB0aGUgc2lnbmF0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gbXNnIFRoZSBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2lnbmF0dXJlXG4gICAgICogQHBhcmFtIHNpZyBUaGUgc2lnbmF0dXJlIG9mIHRoZSBzaWduZWQgbWVzc2FnZVxuICAgICAqIEBwYXJhbSBwdWJrIFRoZSBwdWJsaWMga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVzc2FnZSBzaWduYXR1cmVcbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBUcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmVcbiAgICAgKi9cbiAgICB2ZXJpZnk6KG1zZzpCdWZmZXIsIHNpZzpCdWZmZXIsIHB1Yms6QnVmZmVyKSA9PiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgcHJpdmF0ZSBrZXkuXG4gICAgICogXG4gICAgICogQHJldHVybnMgQSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfSBjb250YWluaW5nIHRoZSBwcml2YXRlIGtleVxuICAgICAqL1xuICAgIGdldFByaXZhdGVLZXkgPSAoKTpCdWZmZXIgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wcml2aztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBwdWJsaWMga2V5LlxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIEEge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyfEJ1ZmZlcn0gY29udGFpbmluZyB0aGUgcHVibGljIGtleVxuICAgICAqL1xuICAgIGdldFB1YmxpY0tleSA9ICgpOkJ1ZmZlciA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnB1Yms7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJpdmF0ZSBrZXkuXG4gICAgICogXG4gICAgICogQHJldHVybnMgQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHB1YmxpYyBrZXlcbiAgICAgKi9cbiAgICBnZXRQcml2YXRlS2V5U3RyaW5nOigpID0+IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHB1YmxpYyBrZXkuXG4gICAgICogXG4gICAgICogQHJldHVybnMgQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHB1YmxpYyBrZXlcbiAgICAgKi9cbiAgICBnZXRQdWJsaWNLZXlTdHJpbmc6KCkgPT4gc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYWRkcmVzcy5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWRkcmVzc1xuICAgICAqL1xuICAgIGdldEFkZHJlc3M6KCkgPT4gc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IoKSB7fVxufVxuXG4vKipcbiAqIENsYXNzIGZvciByZXByZXNlbnRpbmcgYSBrZXkgY2hhaW4gaW4gU2xvcGVzLiBcbiAqIEFsbCBlbmRwb2ludHMgdGhhdCBuZWVkIGtleSBjaGFpbnMgc2hvdWxkIGV4dGVuZCBvbiB0aGlzIGNsYXNzLlxuICogXG4gKiBAdHlwZXBhcmFtIEtQQ2xhc3MgQ2xhc3MgZXh0ZW5kaW5nIFtbS2V5UGFpcl1dIHdoaWNoIGlzIHVzZWQgYXMgdGhlIGtleSBpbiBbW0tleUNoYWluXV1cbiAqL1xuZXhwb3J0IGNsYXNzIEtleUNoYWluPEtQQ2xhc3MgZXh0ZW5kcyBLZXlQYWlyPiB7XG4gICAgcHJvdGVjdGVkIGtleXM6e1thZGRyZXNzOiBzdHJpbmddOiBLUENsYXNzfSA9IHt9O1xuXG4gICAgLyoqXG4gICAgICogTWFrZXMgYSBuZXcga2V5IHBhaXIsIHJldHVybnMgdGhlIGFkZHJlc3MuXG4gICAgICogXG4gICAgICogQHBhcmFtIGVudHJvcHkgT3B0aW9uYWwgcGFyYW1ldGVyIHRoYXQgbWF5IGJlIG5lY2Vzc2FyeSB0byBwcm9kdWNlIHNlY3VyZSBrZXlzXG4gICAgICogXG4gICAgICogQHJldHVybnMgQWRkcmVzcyBvZiB0aGUgbmV3IGtleSBwYWlyXG4gICAgICovXG4gICAgbWFrZUtleTooZW50cm9weTpCdWZmZXIgfCBib29sZWFuKSA9PiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIHByaXZhdGUga2V5LCBtYWtlcyBhIG5ldyBrZXkgcGFpciwgcmV0dXJucyB0aGUgYWRkcmVzcy5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gcHJpdmsgQSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfSByZXByZXNlbnRpbmcgdGhlIHByaXZhdGUga2V5IFxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIEFkZHJlc3Mgb2YgdGhlIG5ldyBrZXkgcGFpclxuICAgICAqL1xuICAgIGltcG9ydEtleToocHJpdms6QnVmZmVyKSA9PiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuIGFycmF5IG9mIGFkZHJlc3NlcyBzdG9yZWQgaW4gdGhlIGtleSBjaGFpbi5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBzdHJpbmcgcmVwcmVzZW50YXRpb25zIG9mIHRoZSBhZGRyZXNzZXNcbiAgICAgKi9cbiAgICBnZXRBZGRyZXNzZXMgPSAoKTpBcnJheTxzdHJpbmc+ID0+IHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMua2V5cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUga2V5IHBhaXIgdG8gdGhlIGxpc3Qgb2YgdGhlIGtleXMgbWFuYWdlcyBpbiB0aGUga2V5Y2hhaW4uXG4gICAgICogXG4gICAgICogQHBhcmFtIG5ld0tleSBBIGtleSBwYWlyIG9mIHRoZSBhcHByb3ByaWF0ZSBjbGFzcyB0byBiZSBhZGRlZCB0byB0aGUga2V5Y2hhaW5cbiAgICAgKi9cbiAgICBhZGRLZXkgPSAobmV3S2V5OktQQ2xhc3MpID0+IHtcbiAgICAgICAgdGhpcy5rZXlzW25ld0tleS5nZXRBZGRyZXNzKCldID0gbmV3S2V5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGVyZSBpcyBhIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3ZpZGVkIGFkZHJlc3MuXG4gICAgICogXG4gICAgICogQHBhcmFtIGFkZHJlc3MgVGhlIGFkZHJlc3MgdG8gY2hlY2sgZm9yIGV4aXN0ZW5jZSBpbiB0aGUga2V5cyBkYXRhYmFzZVxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIFRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgaGFzS2V5ID0gKGFkZHJlc3M6c3RyaW5nKTpib29sZWFuID0+IHtcbiAgICAgICAgcmV0dXJuIChhZGRyZXNzIGluIHRoaXMua2V5cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUga2V5IHBhaXIgbGlzdGVkIHVuZGVyIHRoZSBwcm92aWRlZCBhZGRyZXNzXG4gICAgICogXG4gICAgICogQHBhcmFtIGFkZHJlc3MgVGhlIGFkZHJlc3MgdG8gcmV0cmlldmUgZnJvbSB0aGUga2V5cyBkYXRhYmFzZVxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIEEgcmVmZXJlbmNlIHRvIHRoZSBrZXkgcGFpciBpbiB0aGUga2V5cyBkYXRhYmFzZVxuICAgICAqL1xuICAgIGdldEtleSA9IChhZGRyZXNzOnN0cmluZyk6IEtQQ2xhc3MgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5rZXlzW2FkZHJlc3NdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGluc3RhbmNlIG9mIEtleUNoYWluLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge31cbn1cblxuLyoqXG4gKiBBYnN0cmFjdCBjbGFzcyB0aGF0IGltcGxlbWVudHMgYmFzaWMgZnVuY3Rpb25hbGl0eSBmb3IgbWFuYWdpbmcgYSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfSBvZiBhbiBleGFjdCBsZW5ndGguXG4gKiBcbiAqIENyZWF0ZSBhIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGlzIG9uZSBhbmQgb3ZlcnJpZGUgYnNpemUgdG8gbWFrZSBpdCB2YWxpZGF0ZSBmb3IgZXhhY3RseSB0aGUgY29ycmVjdCBsZW5ndGguXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBOQnl0ZXMge1xuICAgIHByb3RlY3RlZCBieXRlczpCdWZmZXI7XG4gICAgcHJvdGVjdGVkIGJzaXplOm51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyfEJ1ZmZlcn0uXG4gICAgICogXG4gICAgICogQHJldHVybnMgVGhlIGV4YWN0IGxlbmd0aCByZXF1aXJlbWVudCBvZiB0aGlzIGNsYXNzXG4gICAgICovXG4gICAgZ2V0U2l6ZSA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGFrZXMgYSBiYXNlLTU4IGVuY29kZWQgc3RyaW5nLCB2ZXJpZmllcyBpdHMgbGVuZ3RoLCBhbmQgc3RvcmVzIGl0LlxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIFRoZSBzaXplIG9mIHRoZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfVxuICAgICAqL1xuICAgIGZyb21TdHJpbmcgPSAoYjU4c3RyOnN0cmluZyk6bnVtYmVyID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuZnJvbUJ1ZmZlcihiaW50b29scy5iNThUb0J1ZmZlcihiNThzdHIpKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgICBsZXQgZW1zZzpzdHJpbmcgPSBcIkVycm9yIC0gTkJ5dGVzLmZyb21TdHJpbmc6IFwiICsgZTtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZW1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYnNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGFrZXMgYSBbW0J1ZmZlcl1dLCB2ZXJpZmllcyBpdHMgbGVuZ3RoLCBhbmQgc3RvcmVzIGl0LiBcbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBUaGUgc2l6ZSBvZiB0aGUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyfEJ1ZmZlcn1cbiAgICAgKi9cbiAgICBmcm9tQnVmZmVyID0gKGJ1ZmY6QnVmZmVyKTpudW1iZXIgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYoYnVmZi5sZW5ndGggIT0gdGhpcy5ic2l6ZSl7XG4gICAgICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCdWZmZXIgbGVuZ3RoIG11c3QgYmUgZXhhY3RseSBcIiArIHRoaXMuYnNpemUgKyBcIiBieXRlcy5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmJ5dGVzID0gQnVmZmVyLmZyb20oYnVmZik7XG4gICAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICAgIGxldCBlbXNnOnN0cmluZyA9IFwiRXJyb3IgLSBOQnl0ZXMuZnJvbUJ1ZmZlcjogXCIgKyBlO1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlbXNnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5ic2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzdG9yZWQge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyfEJ1ZmZlcn0uXG4gICAgICogXG4gICAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhlIHN0b3JlZCB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfVxuICAgICAqL1xuICAgIHRvQnVmZmVyID0gKCk6QnVmZmVyID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnl0ZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGJhc2UtNTggc3RyaW5nIG9mIHRoZSBzdG9yZWQge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyfEJ1ZmZlcn0uXG4gICAgICogXG4gICAgICogQHJldHVybnMgQSBiYXNlLTU4IHN0cmluZyBvZiB0aGUgc3RvcmVkIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlcnxCdWZmZXJ9XG4gICAgICovXG4gICAgdG9TdHJpbmcgPSAoKTpzdHJpbmcgPT4ge1xuICAgICAgICByZXR1cm4gYmludG9vbHMuYnVmZmVyVG9CNTgodGhpcy50b0J1ZmZlcigpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpbnN0YW5jZSBvZiBbW05CeXRlc11dLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge31cbn1cbiJdfQ==
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFJQSxvQ0FBaUM7QUFDakMsOENBQXNCO0FBRXRCLDBEQUFtQztBQUluQzs7R0FFRztBQUNILE1BQU0sUUFBUSxHQUFHLGtCQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7QUFFeEM7O0dBRUc7QUFDSCxNQUFhLG1CQUFtQjtDQU0vQjtBQU5ELGtEQU1DO0FBRUQ7O0dBRUc7QUFDSCxNQUFzQixPQUFPO0lBcUN6Qjs7OztPQUlHO0lBQ0gsWUFBWSxJQUFlLEVBQUUsT0FBYztRQXJDM0M7Ozs7V0FJRztRQUNILGVBQVUsR0FBRyxDQUFDLE9BQWMsRUFBRSxFQUFFO1lBQzVCLElBQUcsSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLE9BQU8sRUFBQztnQkFDbkMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxFQUFFLEdBQUcsWUFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ2hDO2lCQUFNO2dCQUNILElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO2dCQUN2QixJQUFJLENBQUMsRUFBRSxHQUFHLFlBQUUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDdEM7UUFDTCxDQUFDLENBQUE7UUFFRDs7V0FFRztRQUNILGVBQVUsR0FBRyxHQUFZLEVBQUU7WUFDdkIsT0FBTyxJQUFJLENBQUMsT0FBTyxD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WUFDRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDdEIsQ0FBQyxDQUFBO1FBRUQ7Ozs7V0FJRztRQUNILGVBQVUsR0FBRyxDQUFDLElBQVcsRUFBUyxFQUFFO1lBQ2hDLElBQUk7Z0JBQ0EsSUFBRyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUM7b0JBQ3pCLDBCQUEwQjtvQkFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxDQUFDO2lCQUM5RTtnQkFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLGVBQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDbEM7WUFBQyxPQUFNLENBQUMsRUFBRTtnQkFDUCwwQkFBMEI7Z0JBQzFCLElBQUksSUFBSSxHQUFVLDZCQUE2QixHQUFHLENBQUMsQ0FBQztnQkFDcEQsMEJBQTBCO2dCQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3pCO1lBQ0QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3RCLENBQUMsQ0FBQTtRQUVEOzs7O1dBSUc7UUFDSCxhQUFRLEdBQUcsR0FBVSxFQUFFO1lBQ25CLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN0QixDQUFDLENBQUE7UUFFRDs7OztXQUlHO1FBQ0gsYUFBUSxHQUFHLEdBQVUsRUFBRTtZQUNuQixPQUFPLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDakQsQ0FBQyxDQUFBO0lBSWMsQ0FBQztDQUNuQjtBQXhFRCx3QkF3RUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgVXRpbHNcbiAqL1xuaW1wb3J0IFNsb3Blc0NvcmUgZnJvbSAnLi4vc2xvcGVzJztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gXCJidWZmZXIvXCI7XG5pbXBvcnQgREIgZnJvbSBcIi4vZGJcIjtcbmltcG9ydCB7IFN0b3JlQVBJIH0gZnJvbSAnc3RvcmUyJztcbmltcG9ydCBCaW5Ub29scyAgZnJvbSAnLi9iaW50b29scyc7XG5pbXBvcnQgeyBDbGllbnRSZXF1ZXN0IH0gZnJvbSBcImh0dHBcIjtcbmltcG9ydCB7IEF4aW9zUmVxdWVzdENvbmZpZyB9IGZyb20gJ2F4aW9zJztcblxuLyoqXG4gKiBAaWdub3JlXG4gKi9cbmNvbnN0IGJpbnRvb2xzID0gQmluVG9vbHMuZ2V0SW5zdGFuY2UoKTtcblxuLyoqXG4gKiBSZXNwb25zZSBkYXRhIGZvciBIVFRQIHJlcXVlc3RzLlxuICovXG5leHBvcnQgY2xhc3MgUmVxdWVzdFJlc3BvbnNlRGF0YSB7XG4gICAgZGF0YTogc3RyaW5nIHwgb2JqZWN0IHwgQXJyYXk8b2JqZWN0PjtcbiAgICBoZWFkZXJzOm9iamVjdDtcbiAgICBzdGF0dXM6IG51bWJlcjtcbiAgICBzdGF0dXNUZXh0OiBzdHJpbmc7XG4gICAgcmVxdWVzdDpDbGllbnRSZXF1ZXN0IHwgWE1MSHR0cFJlcXVlc3Q7XG59XG5cbi8qKlxuICogQWJzdHJhY3QgY2xhc3MgZGVmaW5pbmcgYSBnZW5lcmljIGVuZHBvaW50IHRoYXQgYWxsIGVuZHBvaW50cyBtdXN0IGltcGxlbWVudCAoZXh0ZW5kKS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFQSUJhc2Uge1xuICAgIHByb3RlY3RlZCBjb3JlOlNsb3Blc0NvcmU7XG4gICAgcHJvdGVjdGVkIGJhc2V1cmw6c3RyaW5nO1xuICAgIHByb3RlY3RlZCBkYjpTdG9yZUFQSTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHBhdGggb2YgdGhlIEFQSXMgYmFzZXVybC5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gYmFzZXVybCBQYXRoIG9mIHRoZSBBUElzIGJhc2V1cmwgLSBleDogXCIvZXh0L2F2YVwiXG4gICAgICovXG4gICAgc2V0QmFzZVVSTCA9IChiYXNldXJsOnN0cmluZykgPT4ge1xuICAgICAgICBpZih0aGlzLmRiICYmIHRoaXMuYmFzZXVybCAhPT0gYmFzZXVybCl7XG4gICAgICAgICAgICBsZXQgYmFja3VwID0gdGhpcy5kYi5nZXRBbGwoKTtcbiAgICAgICAgICAgIHRoaXMuZGIuY2xlYXJBbGwoKTtcbiAgICAgICAgICAgIHRoaXMuYmFzZXVybCA9IGJhc2V1cmw7XG4gICAgICAgICAgICB0aGlzLmRiID0gREIuZ2V0TmFtZXNwYWNlKGJhc2V1cmwpO1xuICAgICAgICAgICAgdGhpcy5kYi5zZXRBbGwoYmFja3VwLCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYmFzZXVybCA9IGJhc2V1cmw7XG4gICAgICAgICAgICB0aGlzLmRiID0gREIuZ2V0TmFtZXNwYWNlKGJhc2V1cmwpO1xuICAgICAgICB9XG4gICAgfSBcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGJhc2V1cmwncyBwYXRoLiBcbiAgICAgKi9cbiAgICBnZXRCYXNlVVJMID0gKCkgOiBzdHJpbmcgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNldXJsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGJhc2V1cmwncyBkYXRhYmFzZS5cbiAgICAgKi9cbiAgICBnZXREQiA9ICgpOlN0b3JlQVBJID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHBhcmFtIGNvcmUgUmVmZXJlbmNlIHRvIHRoZSBTbG9wZXMgaW5zdGFuY2UgdXNpbmcgdGhpcyBiYXNldXJsXG4gICAgICogQHBhcmFtIGJhc2V1cmwgUGF0aCB0byB0aGUgYmFzZXVybCAtIGV4OiBcIi9leHQvc3VibmV0L2F2bVwiXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY29yZTpTbG9wZXNDb3JlLCBiYXNldXJsOnN0cmluZykge1xuICAgICAgICB0aGlzLmNvcmUgPSBjb3JlO1xuICAgICAgICB0aGlzLnNldEJhc2VVUkwoYmFzZXVybCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSlJQQ0FQSSBleHRlbmRzIEFQSUJhc2Uge1xuICAgIHByb3RlY3RlZCBqcnBjVmVyc2lvbjpzdHJpbmcgPSBcIjIuMFwiO1xuICAgIHByb3RlY3RlZCBycGNpZCA9IDE7XG4gICAgY2FsbE1ldGhvZCA9IGFzeW5jIChtZXRob2Q6c3RyaW5nLCBwYXJhbXM/OkFycmF5PG9iamVjdD4gfCBvYmplY3QsIGJhc2V1cmw/OnN0cmluZyk6UHJvbWlzZTxSZXF1ZXN0UmVzcG9uc2VEYXRhPiA9PiB7XG4gICAgICAgIGxldCBlcCA9IGJhc2V1cmwgPyBiYXNldXJsIDogdGhpcy5iYXNldXJsO1xuICAgICAgICBsZXQgcnBjOm9iamVjdCA9IHt9O1xuICAgICAgICBycGNbXCJpZFwiXSA9IHRoaXMucnBjaWQ7XG4gICAgICAgIHJwY1tcIm1ldGhvZFwiXSA9IG1ldGhvZDtcblxuICAgICAgICAvLyBTZXQgcGFyYW1ldGVycyBpZiBleGlzdHNcbiAgICAgICAgaWYocGFyYW1zKXtcbiAgICAgICAgICAgIHJwY1sncGFyYW1zJ10gPSBwYXJhbXM7XG4gICAgICAgIH0gZWxzZSBpZih0aGlzLmpycGNWZXJzaW9uID09IFwiMS4wXCIpe1xuICAgICAgICAgICAgcnBjW1wicGFyYW1zXCJdID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBpZih0aGlzLmpycGNWZXJzaW9uICE9IFwiMS4wXCIpIHtcbiAgICAgICAgICAgIHJwY1tcImpzb25ycGNcIl0gPSB0aGlzLmpycGNWZXJzaW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGhlYWRlcnM6b2JqZWN0ID0ge1wiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04XCJ9O1xuXG4gICAgICAgIGxldCBheENvbmY6QXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgICAgICAgYmFzZVVSTDp0aGlzLmNvcmUuZ2V0UHJvdG9jb2woKStcIjovL1wiK3RoaXMuY29yZS5nZXRJUCgpK1wiOlwiK3RoaXMuY29yZS5nZXRQb3J0KCksXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6ICdqc29uJ1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB0aGlzLmNvcmUucG9zdChlcCwge30sIEpTT04uc3RyaW5naWZ5KHJwYyksIGhlYWRlcnMsIGF4Q29uZikudGhlbiggKHJlc3A6UmVxdWVzdFJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICAgICAgaWYocmVzcC5zdGF0dXMgPj0gMjAwICYmIHJlc3Auc3RhdHVzIDwgMzAwKXtcbiAgICAgICAgICAgICAgICB0aGlzLnJwY2lkICs9IDE7XG4gICAgICAgICAgICAgICAgaWYodHlwZW9mIHJlc3AuZGF0YSA9PT0gXCJzdHJpbmdcIil7XG4gICAgICAgICAgICAgICAgICAgIHJlc3AuZGF0YSA9IEpTT04ucGFyc2UocmVzcC5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKHR5cGVvZiByZXNwLmRhdGEgPT09ICdvYmplY3QnICYmICdlcnJvcicgaW4gcmVzcC5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycm9yIHJldHVybmVkOiBcIiArIEpTT04uc3RyaW5naWZ5KHJlc3AuZGF0YSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSAgIFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcnBjaWQsIGEgc3RyaWN0bHktaW5jcmVhc2luZyBudW1iZXIsIHN0YXJ0aW5nIGZyb20gMSwgaW5kaWNhdGluZyB0aGUgbmV4dCByZXF1ZXN0IElEIHRoYXQgd2lsbCBiZSBzZW50LlxuICAgICAqL1xuICAgIGdldFJQQ0lEID0gKCk6bnVtYmVyID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucnBjaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHBhcmFtIGNvcmUgUmVmZXJlbmNlIHRvIHRoZSBTbG9wZXMgaW5zdGFuY2UgdXNpbmcgdGhpcyBlbmRwb2ludFxuICAgICAqIEBwYXJhbSBiYXNldXJsIFBhdGggb2YgdGhlIEFQSXMgYmFzZXVybCAtIGV4OiBcIi9leHQvc3VibmV0L2F2bVwiXG4gICAgICogQHBhcmFtIGpycGNWZXJzaW9uIFRoZSBqcnBjIHZlcnNpb24gdG8gdXNlLCBkZWZhdWx0IFwiMi4wXCIuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY29yZTpTbG9wZXNDb3JlLCBiYXNldXJsOnN0cmluZywganJwY1ZlcnNpb246c3RyaW5nID0gXCIyLjBcIikge1xuICAgICAgICBzdXBlcihjb3JlLCBiYXNldXJsKTtcbiAgICAgICAgdGhpcy5qcnBjVmVyc2lvbiA9IGpycGNWZXJzaW9uO1xuICAgICAgICB0aGlzLnJwY2lkID0gMTtcbiAgICB9XG59XG5cbi8qKlxuICogQ2xhc3MgZm9yIHJlcHJlc2VudGluZyBhIHByaXZhdGUgYW5kIHB1YmxpYyBrZXlwYWlyIGluIFNsb3Blcy4gXG4gKiBBbGwgQVBJcyB0aGF0IG5lZWQga2V5IHBhaXJzIHNob3VsZCBleHRlbmQgb24gdGhpcyBjbGFzcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEtleVBhaXIge1xuICAgIHByb3RlY3RlZCBwdWJrOkJ1ZmZlcjtcbiAgICBwcm90ZWN0ZWQgcHJpdms6QnVmZmVyO1xuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIGEgbmV3IGtleXBhaXIuXG4gICAgICogXG4gICAgICogQHBhcmFtIGVudHJvcHkgT3B0aW9uYWwgcGFyYW1ldGVyIHRoYXQgbWF5IGJlIG5lY2Vzc2FyeSB0byBwcm9kdWNlIHNlY3VyZSBrZXlzXG4gICAgICovXG4gICAgZ2VuZXJhdGVLZXk6KGVudHJvcHk/OkJ1ZmZlcikgPT4gdm9pZDtcbiAgICAvKipcbiAgICAgKiBJbXBvcnRzIGEgcHJpdmF0ZSBrZXkgYW5kIGdlbmVyYXRlcyB0aGUgYXBwcm9wcmlhdGUgcHVibGljIGtleS5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gcHJpdmsgQSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfSByZXByZXNlbnRpbmcgdGhlIHByaXZhdGUga2V5IFxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZVxuICAgICAqL1xuICAgIGltcG9ydEtleToocHJpdms6QnVmZmVyKSA9PiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogVGFrZXMgYSBtZXNzYWdlLCBzaWducyBpdCwgYW5kIHJldHVybnMgdGhlIHNpZ25hdHVyZS5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gbXNnIFRoZSBtZXNzYWdlIHRvIHNpZ25cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBBIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlcnxCdWZmZXJ9IGNvbnRhaW5pbmcgdGhlIHNpZ25hdHVyZVxuICAgICAqL1xuICAgIHNpZ246KG1zZzpCdWZmZXIpID0+IEJ1ZmZlcjtcblxuICAgIC8qKlxuICAgICAqIFJlY292ZXJzIHRoZSBwdWJsaWMga2V5IG9mIGEgbWVzc2FnZSBzaWduZXIgZnJvbSBhIG1lc3NhZ2UgYW5kIGl0cyBhc3NvY2lhdGVkIHNpZ25hdHVyZS5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gbXNnIFRoZSBtZXNzYWdlIHRoYXQncyBzaWduZWRcbiAgICAgKiBAcGFyYW0gc2lnIFRoZSBzaWduYXR1cmUgdGhhdCdzIHNpZ25lZCBvbiB0aGUgbWVzc2FnZVxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIEEge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyfEJ1ZmZlcn0gY29udGFpbmluZyB0aGUgcHVibGljIGtleSBvZiB0aGUgc2lnbmVyXG4gICAgICovXG4gICAgcmVjb3ZlcjoobXNnOkJ1ZmZlciwgc2lnOkJ1ZmZlcikgPT4gQnVmZmVyO1xuXG4gICAgLyoqXG4gICAgICogVmVyaWZpZXMgdGhhdCB0aGUgcHJpdmF0ZSBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBwdWJsaWMga2V5IHByb2R1Y2VzIHRoZSBzaWduYXR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBtc2cgVGhlIG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBzaWduYXR1cmVcbiAgICAgKiBAcGFyYW0gc2lnIFRoZSBzaWduYXR1cmUgb2YgdGhlIHNpZ25lZCBtZXNzYWdlXG4gICAgICogQHBhcmFtIHB1YmsgVGhlIHB1YmxpYyBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXNzYWdlIHNpZ25hdHVyZVxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIFRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZVxuICAgICAqL1xuICAgIHZlcmlmeToobXNnOkJ1ZmZlciwgc2lnOkJ1ZmZlciwgcHViazpCdWZmZXIpID0+IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBwcml2YXRlIGtleS5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBBIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlcnxCdWZmZXJ9IGNvbnRhaW5pbmcgdGhlIHByaXZhdGUga2V5XG4gICAgICovXG4gICAgZ2V0UHJpdmF0ZUtleSA9ICgpOkJ1ZmZlciA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnByaXZrO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHB1YmxpYyBrZXkuXG4gICAgICogXG4gICAgICogQHJldHVybnMgQSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfSBjb250YWluaW5nIHRoZSBwdWJsaWMga2V5XG4gICAgICovXG4gICAgZ2V0UHVibGljS2V5ID0gKCk6QnVmZmVyID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHViaztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcml2YXRlIGtleS5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHVibGljIGtleVxuICAgICAqL1xuICAgIGdldFByaXZhdGVLZXlTdHJpbmc6KCkgPT4gc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcHVibGljIGtleS5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHVibGljIGtleVxuICAgICAqL1xuICAgIGdldFB1YmxpY0tleVN0cmluZzooKSA9PiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBhZGRyZXNzLlxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhZGRyZXNzXG4gICAgICovXG4gICAgZ2V0QWRkcmVzczooKSA9PiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHt9XG59XG5cbi8qKlxuICogQ2xhc3MgZm9yIHJlcHJlc2VudGluZyBhIGtleSBjaGFpbiBpbiBTbG9wZXMuIFxuICogQWxsIGVuZHBvaW50cyB0aGF0IG5lZWQga2V5IGNoYWlucyBzaG91bGQgZXh0ZW5kIG9uIHRoaXMgY2xhc3MuXG4gKiBcbiAqIEB0eXBlcGFyYW0gS1BDbGFzcyBDbGFzcyBleHRlbmRpbmcgW1tLZXlQYWlyXV0gd2hpY2ggaXMgdXNlZCBhcyB0aGUga2V5IGluIFtbS2V5Q2hhaW5dXVxuICovXG5leHBvcnQgY2xhc3MgS2V5Q2hhaW48S1BDbGFzcyBleHRlbmRzIEtleVBhaXI+IHtcbiAgICBwcm90ZWN0ZWQga2V5czp7W2FkZHJlc3M6IHN0cmluZ106IEtQQ2xhc3N9ID0ge307XG5cbiAgICAvKipcbiAgICAgKiBNYWtlcyBhIG5ldyBrZXkgcGFpciwgcmV0dXJucyB0aGUgYWRkcmVzcy5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gZW50cm9weSBPcHRpb25hbCBwYXJhbWV0ZXIgdGhhdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHByb2R1Y2Ugc2VjdXJlIGtleXNcbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBBZGRyZXNzIG9mIHRoZSBuZXcga2V5IHBhaXJcbiAgICAgKi9cbiAgICBtYWtlS2V5OihlbnRyb3B5PzpCdWZmZXIpID0+IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgcHJpdmF0ZSBrZXksIG1ha2VzIGEgbmV3IGtleSBwYWlyLCByZXR1cm5zIHRoZSBhZGRyZXNzLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBwcml2ayBBIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlcnxCdWZmZXJ9IHJlcHJlc2VudGluZyB0aGUgcHJpdmF0ZSBrZXkgXG4gICAgICogXG4gICAgICogQHJldHVybnMgQWRkcmVzcyBvZiB0aGUgbmV3IGtleSBwYWlyXG4gICAgICovXG4gICAgaW1wb3J0S2V5Oihwcml2azpCdWZmZXIpID0+IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEdldHMgYW4gYXJyYXkgb2YgYWRkcmVzc2VzIHN0b3JlZCBpbiB0aGUga2V5IGNoYWluLlxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHN0cmluZyByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGFkZHJlc3Nlc1xuICAgICAqL1xuICAgIGdldEFkZHJlc3NlcyA9ICgpOkFycmF5PHN0cmluZz4gPT4ge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5rZXlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBrZXkgcGFpciB0byB0aGUgbGlzdCBvZiB0aGUga2V5cyBtYW5hZ2VkIGluIHRoZSBrZXljaGFpbi5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gbmV3S2V5IEEga2V5IHBhaXIgb2YgdGhlIGFwcHJvcHJpYXRlIGNsYXNzIHRvIGJlIGFkZGVkIHRvIHRoZSBrZXljaGFpblxuICAgICAqL1xuICAgIGFkZEtleSA9IChuZXdLZXk6S1BDbGFzcykgPT4ge1xuICAgICAgICB0aGlzLmtleXNbbmV3S2V5LmdldEFkZHJlc3MoKV0gPSBuZXdLZXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUga2V5IHBhaXIgZnJvbSB0aGUgbGlzdCBvZiB0aGV5IGtleXMgbWFuYWdlZCBpbiB0aGUga2V5Y2hhaW4uXG4gICAgICogXG4gICAgICogQHBhcmFtIGtleSBBIHN0cmluZyBmb3IgdGhlIGFkZHJlc3Mgb3IgS1BDbGFzcyB0byByZW1vdmVcbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBUaGUgYm9vbGVhbiB0cnVlIGlmIGEga2V5IHdhcyByZW1vdmVkLlxuICAgICAqL1xuICAgIHJlbW92ZUtleSA9IChrZXk6S1BDbGFzcyB8IHN0cmluZykgPT4ge1xuICAgICAgICBsZXQga2FkZHI6c3RyaW5nO1xuICAgICAgICBpZih0eXBlb2Yga2V5ICE9PSBcInN0cmluZ1wiKXtcbiAgICAgICAgICAgIGthZGRyID0ga2V5LmdldEFkZHJlc3MoKTtcbiAgICAgICAgfSBlbHNlIGlmKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKXtcbiAgICAgICAgICAgIGthZGRyID0ga2V5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmKGthZGRyIGluIHRoaXMua2V5cyl7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5rZXlzW2thZGRyXTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZXJlIGlzIGEga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgYWRkcmVzcy5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gYWRkcmVzcyBUaGUgYWRkcmVzcyB0byBjaGVjayBmb3IgZXhpc3RlbmNlIGluIHRoZSBrZXlzIGRhdGFiYXNlXG4gICAgICogXG4gICAgICogQHJldHVybnMgVHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBoYXNLZXkgPSAoYWRkcmVzczpzdHJpbmcpOmJvb2xlYW4gPT4ge1xuICAgICAgICByZXR1cm4gKGFkZHJlc3MgaW4gdGhpcy5rZXlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBrZXkgcGFpciBsaXN0ZWQgdW5kZXIgdGhlIHByb3ZpZGVkIGFkZHJlc3NcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gYWRkcmVzcyBUaGUgYWRkcmVzcyB0byByZXRyaWV2ZSBmcm9tIHRoZSBrZXlzIGRhdGFiYXNlXG4gICAgICogXG4gICAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhlIGtleSBwYWlyIGluIHRoZSBrZXlzIGRhdGFiYXNlXG4gICAgICovXG4gICAgZ2V0S2V5ID0gKGFkZHJlc3M6c3RyaW5nKTogS1BDbGFzcyA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmtleXNbYWRkcmVzc107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaW5zdGFuY2Ugb2YgS2V5Q2hhaW4uXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7fVxufVxuXG4vKipcbiAqIEFic3RyYWN0IGNsYXNzIHRoYXQgaW1wbGVtZW50cyBiYXNpYyBmdW5jdGlvbmFsaXR5IGZvciBtYW5hZ2luZyBhIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlcnxCdWZmZXJ9IG9mIGFuIGV4YWN0IGxlbmd0aC5cbiAqIFxuICogQ3JlYXRlIGEgY2xhc3MgdGhhdCBleHRlbmRzIHRoaXMgb25lIGFuZCBvdmVycmlkZSBic2l6ZSB0byBtYWtlIGl0IHZhbGlkYXRlIGZvciBleGFjdGx5IHRoZSBjb3JyZWN0IGxlbmd0aC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE5CeXRlcyB7XG4gICAgcHJvdGVjdGVkIGJ5dGVzOkJ1ZmZlcjtcbiAgICBwcm90ZWN0ZWQgYnNpemU6bnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfS5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBUaGUgZXhhY3QgbGVuZ3RoIHJlcXVpcmVtZW50IG9mIHRoaXMgY2xhc3NcbiAgICAgKi9cbiAgICBnZXRTaXplID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ic2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUYWtlcyBhIGJhc2UtNTggZW5jb2RlZCBzdHJpbmcsIHZlcmlmaWVzIGl0cyBsZW5ndGgsIGFuZCBzdG9yZXMgaXQuXG4gICAgICogXG4gICAgICogQHJldHVybnMgVGhlIHNpemUgb2YgdGhlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlcnxCdWZmZXJ9XG4gICAgICovXG4gICAgZnJvbVN0cmluZyA9IChiNThzdHI6c3RyaW5nKTpudW1iZXIgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5mcm9tQnVmZmVyKGJpbnRvb2xzLmI1OFRvQnVmZmVyKGI1OHN0cikpO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICAgIGxldCBlbXNnOnN0cmluZyA9IFwiRXJyb3IgLSBOQnl0ZXMuZnJvbVN0cmluZzogXCIgKyBlO1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlbXNnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5ic2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUYWtlcyBhIFtbQnVmZmVyXV0sIHZlcmlmaWVzIGl0cyBsZW5ndGgsIGFuZCBzdG9yZXMgaXQuIFxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIFRoZSBzaXplIG9mIHRoZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfVxuICAgICAqL1xuICAgIGZyb21CdWZmZXIgPSAoYnVmZjpCdWZmZXIpOm51bWJlciA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZihidWZmLmxlbmd0aCAhPSB0aGlzLmJzaXplKXtcbiAgICAgICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJ1ZmZlciBsZW5ndGggbXVzdCBiZSBleGFjdGx5IFwiICsgdGhpcy5ic2l6ZSArIFwiIGJ5dGVzLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYnl0ZXMgPSBCdWZmZXIuZnJvbShidWZmKTtcbiAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgICAgbGV0IGVtc2c6c3RyaW5nID0gXCJFcnJvciAtIE5CeXRlcy5mcm9tQnVmZmVyOiBcIiArIGU7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVtc2cpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJzaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHN0b3JlZCB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfS5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBBIHJlZmVyZW5jZSB0byB0aGUgc3RvcmVkIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlcnxCdWZmZXJ9XG4gICAgICovXG4gICAgdG9CdWZmZXIgPSAoKTpCdWZmZXIgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ieXRlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgYmFzZS01OCBzdHJpbmcgb2YgdGhlIHN0b3JlZCB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJ8QnVmZmVyfS5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBBIGJhc2UtNTggc3RyaW5nIG9mIHRoZSBzdG9yZWQge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyfEJ1ZmZlcn1cbiAgICAgKi9cbiAgICB0b1N0cmluZyA9ICgpOnN0cmluZyA9PiB7XG4gICAgICAgIHJldHVybiBiaW50b29scy5idWZmZXJUb0I1OCh0aGlzLnRvQnVmZmVyKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGluc3RhbmNlIG9mIFtbTkJ5dGVzXV0uXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7fVxufVxuIl19

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc