PHP WebShell
Текущая директория: /opt/BitGoJS/modules/utxo-lib/dist/test
Просмотр файла: transaction_builder.spec.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const assert = require("assert");
const mocha_1 = require("mocha");
const src_1 = require("../src");
console.warn = () => {
return;
}; // Silence the Deprecation Warning
const txb_fixtures = require("./fixtures/transaction_builder.json");
const txb_big_fixtures = require("./fixtures/transaction_builder_bigint.json");
function toAmount(v, t) {
if (v === undefined) {
return v;
}
if (t === 'number') {
return Number(v);
}
if (t === 'bigint') {
return BigInt(v);
}
throw new Error();
}
function constructSign(f, txb, params) {
const network = src_1.networks[f.network];
const stages = f.stages && f.stages.concat();
f.inputs.forEach((input, index) => {
if (!input.signs)
return;
input.signs.forEach((sign) => {
const keyPair = src_1.ECPair.fromWIF(sign.keyPair, network);
let redeemScript;
let witnessScript;
let witnessValue;
let controlBlock;
if (sign.redeemScript) {
redeemScript = src_1.script.fromASM(sign.redeemScript);
}
if (sign.value) {
witnessValue = toAmount(sign.value, params.amountType);
}
if (sign.witnessScript) {
witnessScript = src_1.script.fromASM(sign.witnessScript);
}
if (sign.controlBlock) {
controlBlock = Buffer.from(sign.controlBlock, 'hex');
}
if (params.useOldSignArgs) {
// DEPRECATED: v6 will remove this interface
txb.sign(index, keyPair, redeemScript, sign.hashType, toAmount(witnessValue, params.amountType), witnessScript, controlBlock);
}
else {
// prevOutScriptType is required, see /ts_src/transaction_builder.ts
// The PREVOUT_TYPES constant is a Set with all possible values.
txb.sign({
prevOutScriptType: sign.prevOutScriptType,
vin: index,
keyPair,
redeemScript,
hashType: sign.hashType,
witnessValue: toAmount(witnessValue, params.amountType),
witnessScript,
controlBlock,
});
}
if (sign.stage) {
const tx = txb.buildIncomplete();
assert.strictEqual(tx.toHex(), stages.shift());
txb = src_1.TransactionBuilder.fromTransaction(tx, network);
}
});
});
return txb;
}
function construct(f, params) {
const network = src_1.networks[f.network];
const txb = new src_1.TransactionBuilder(network);
if (Number.isFinite(f.version))
txb.setVersion(f.version);
if (f.locktime !== undefined)
txb.setLockTime(f.locktime);
f.inputs.forEach((input) => {
let prevTx;
if (input.txRaw) {
const constructed = construct(input.txRaw, {
amountType: params.amountType,
});
if (input.txRaw.incomplete)
prevTx = constructed.buildIncomplete();
else
prevTx = constructed.build();
}
else if (input.txHex) {
prevTx = src_1.Transaction.fromHex(input.txHex, params.amountType);
}
else {
prevTx = input.txId;
}
let prevTxScript;
if (input.prevTxScript) {
prevTxScript = src_1.script.fromASM(input.prevTxScript);
}
txb.addInput(prevTx, input.vout, input.sequence, prevTxScript, toAmount(input.value, params.amountType));
});
f.outputs.forEach((output) => {
if (output.address) {
txb.addOutput(output.address, toAmount(output.value, params.amountType));
}
else {
txb.addOutput(src_1.script.fromASM(output.script), toAmount(output.value, params.amountType));
}
});
if (params.dontSign)
return txb;
return constructSign(f, txb, params);
}
function runTest(fixtures, testName, params) {
// Search for "useOldSignArgs"
// to find the second part of this console.warn replace
let consoleWarn;
if (params.useOldSignArgs) {
consoleWarn = console.warn;
// Silence console.warn during these tests
console.warn = () => undefined;
}
(0, mocha_1.describe)(testName, () => {
// constants
const keyPair = src_1.ECPair.fromPrivateKey(Buffer.from('0000000000000000000000000000000000000000000000000000000000000001', 'hex'));
const scripts = ['1BgGZ9tcN4rm9KBzDn7KprQz87SZ26SAMH', '1cMh228HTCiwS8ZsaakH8A8wze1JR5ZsP'].map((x) => {
return src_1.address.toOutputScript(x, src_1.networks.bitcoin);
});
const txHash = Buffer.from('0e7cea811c0be9f73c0aca591034396e7264473fc25c1ca45195d7417b36cbe2', 'hex');
(0, mocha_1.describe)('fromTransaction', () => {
fixtures.valid.build.forEach((f) => {
(0, mocha_1.it)('returns TransactionBuilder, with ' + f.description, () => {
const network = src_1.networks[f.network || 'bitcoin'];
const tx = src_1.Transaction.fromHex(f.txHex, params.amountType);
const txb = src_1.TransactionBuilder.fromTransaction(tx, network);
const txAfter = f.incomplete ? txb.buildIncomplete() : txb.build();
assert.strictEqual(txAfter.toHex(), f.txHex);
assert.strictEqual(txb.network, network);
});
});
fixtures.valid.fromTransaction.forEach((f) => {
(0, mocha_1.it)('returns TransactionBuilder, with ' + f.description, () => {
const tx = new src_1.Transaction();
f.inputs.forEach((input) => {
const txHash2 = Buffer.from(input.txId, 'hex').reverse();
tx.addInput(txHash2, input.vout, undefined, src_1.script.fromASM(input.scriptSig));
});
f.outputs.forEach((output) => {
tx.addOutput(src_1.script.fromASM(output.script), toAmount(output.value, params.amountType));
});
const txb = src_1.TransactionBuilder.fromTransaction(tx);
const txAfter = f.incomplete ? txb.buildIncomplete() : txb.build();
txAfter.ins.forEach((input, i) => {
assert.strictEqual(src_1.script.toASM(input.script), f.inputs[i].scriptSigAfter);
});
txAfter.outs.forEach((output, i) => {
assert.strictEqual(src_1.script.toASM(output.script), f.outputs[i].script);
});
});
});
fixtures.valid.fromTransactionSequential.forEach((f) => {
(0, mocha_1.it)('with ' + f.description, () => {
const network = src_1.networks[f.network];
const tx = src_1.Transaction.fromHex(f.txHex, params.amountType);
const txb = src_1.TransactionBuilder.fromTransaction(tx, network);
tx.ins.forEach((input, i) => {
assert.strictEqual(src_1.script.toASM(input.script), f.inputs[i].scriptSig);
});
constructSign(f, txb, params);
const txAfter = f.incomplete ? txb.buildIncomplete() : txb.build();
txAfter.ins.forEach((input, i) => {
assert.strictEqual(src_1.script.toASM(input.script), f.inputs[i].scriptSigAfter);
});
assert.strictEqual(txAfter.toHex(), f.txHexAfter);
});
});
(0, mocha_1.it)('classifies transaction inputs', () => {
const tx = src_1.Transaction.fromHex(fixtures.valid.classification.hex, params.amountType);
const txb = src_1.TransactionBuilder.fromTransaction(tx);
txb.__INPUTS.forEach((i) => {
assert.strictEqual(i.prevOutType, 'scripthash');
assert.strictEqual(i.redeemScriptType, 'multisig');
});
});
fixtures.invalid.fromTransaction.forEach((f) => {
(0, mocha_1.it)('throws ' + f.exception, () => {
const tx = src_1.Transaction.fromHex(f.txHex, params.amountType);
assert.throws(() => {
src_1.TransactionBuilder.fromTransaction(tx);
}, new RegExp(f.exception));
});
});
});
(0, mocha_1.describe)('addInput', () => {
let txb;
(0, mocha_1.beforeEach)(() => {
txb = new src_1.TransactionBuilder();
});
(0, mocha_1.it)('accepts a txHash, index [and sequence number]', () => {
const vin = txb.addInput(txHash, 1, 54);
assert.strictEqual(vin, 0);
const txIn = txb.__TX.ins[0];
assert.strictEqual(txIn.hash, txHash);
assert.strictEqual(txIn.index, 1);
assert.strictEqual(txIn.sequence, 54);
assert.strictEqual(txb.__INPUTS[0].prevOutScript, undefined);
});
(0, mocha_1.it)('accepts a txHash, index [, sequence number and scriptPubKey]', () => {
const vin = txb.addInput(txHash, 1, 54, scripts[1]);
assert.strictEqual(vin, 0);
const txIn = txb.__TX.ins[0];
assert.strictEqual(txIn.hash, txHash);
assert.strictEqual(txIn.index, 1);
assert.strictEqual(txIn.sequence, 54);
assert.strictEqual(txb.__INPUTS[0].prevOutScript, scripts[1]);
});
(0, mocha_1.it)('accepts a prevTx, index [and sequence number]', () => {
const prevTx = new src_1.Transaction();
prevTx.addOutput(scripts[0], toAmount(0, params.amountType));
prevTx.addOutput(scripts[1], toAmount(1, params.amountType));
const vin = txb.addInput(prevTx, 1, 54);
assert.strictEqual(vin, 0);
const txIn = txb.__TX.ins[0];
assert.deepStrictEqual(txIn.hash, prevTx.getHash());
assert.strictEqual(txIn.index, 1);
assert.strictEqual(txIn.sequence, 54);
assert.strictEqual(txb.__INPUTS[0].prevOutScript, scripts[1]);
});
(0, mocha_1.it)('returns the input index', () => {
assert.strictEqual(txb.addInput(txHash, 0), 0);
assert.strictEqual(txb.addInput(txHash, 1), 1);
});
(0, mocha_1.it)('throws if SIGHASH_ALL has been used to sign any existing scriptSigs', () => {
txb.addInput(txHash, 0);
txb.addOutput(scripts[0], toAmount(1000, params.amountType));
txb.sign({
prevOutScriptType: 'p2pkh',
vin: 0,
keyPair,
});
assert.throws(() => {
txb.addInput(txHash, 0);
}, /No, this would invalidate signatures/);
});
});
(0, mocha_1.describe)('addOutput', () => {
let txb;
(0, mocha_1.beforeEach)(() => {
txb = new src_1.TransactionBuilder();
});
(0, mocha_1.it)('accepts an address string and value', () => {
const { address } = src_1.payments.p2pkh({ pubkey: keyPair.publicKey });
const vout = txb.addOutput(address, toAmount(1000, params.amountType));
assert.strictEqual(vout, 0);
const txout = txb.__TX.outs[0];
assert.deepStrictEqual(txout.script, scripts[0]);
assert.strictEqual(txout.value, toAmount(1000, params.amountType));
});
(0, mocha_1.it)('accepts a ScriptPubKey and value', () => {
const vout = txb.addOutput(scripts[0], toAmount(1000, params.amountType));
assert.strictEqual(vout, 0);
const txout = txb.__TX.outs[0];
assert.deepStrictEqual(txout.script, scripts[0]);
assert.strictEqual(txout.value, toAmount(1000, params.amountType));
});
(0, mocha_1.it)('throws if address is of the wrong network', () => {
assert.throws(() => {
txb.addOutput('2NGHjvjw83pcVFgMcA7QvSMh2c246rxLVz9', toAmount(1000, params.amountType));
}, /2NGHjvjw83pcVFgMcA7QvSMh2c246rxLVz9 has no matching Script/);
});
(0, mocha_1.it)('add second output after signed first input with SIGHASH_NONE', () => {
txb.addInput(txHash, 0);
txb.addOutput(scripts[0], toAmount(2000, params.amountType));
txb.sign({
prevOutScriptType: 'p2pkh',
vin: 0,
keyPair,
hashType: src_1.Transaction.SIGHASH_NONE,
});
assert.strictEqual(txb.addOutput(scripts[1], toAmount(9000, params.amountType)), 1);
});
(0, mocha_1.it)('add first output after signed first input with SIGHASH_NONE', () => {
txb.addInput(txHash, 0);
txb.sign({
prevOutScriptType: 'p2pkh',
vin: 0,
keyPair,
hashType: src_1.Transaction.SIGHASH_NONE,
});
assert.strictEqual(txb.addOutput(scripts[0], toAmount(2000, params.amountType)), 0);
});
(0, mocha_1.it)('add second output after signed first input with SIGHASH_SINGLE', () => {
txb.addInput(txHash, 0);
txb.addOutput(scripts[0], toAmount(2000, params.amountType));
txb.sign({
prevOutScriptType: 'p2pkh',
vin: 0,
keyPair,
hashType: src_1.Transaction.SIGHASH_SINGLE,
});
assert.strictEqual(txb.addOutput(scripts[1], toAmount(9000, params.amountType)), 1);
});
(0, mocha_1.it)('add first output after signed first input with SIGHASH_SINGLE', () => {
txb.addInput(txHash, 0);
txb.sign({
prevOutScriptType: 'p2pkh',
vin: 0,
keyPair,
hashType: src_1.Transaction.SIGHASH_SINGLE,
});
assert.throws(() => {
txb.addOutput(scripts[0], toAmount(2000, params.amountType));
}, /No, this would invalidate signatures/);
});
(0, mocha_1.it)('throws if SIGHASH_ALL has been used to sign any existing scriptSigs', () => {
txb.addInput(txHash, 0);
txb.addOutput(scripts[0], toAmount(2000, params.amountType));
txb.sign({
prevOutScriptType: 'p2pkh',
vin: 0,
keyPair,
});
assert.throws(() => {
txb.addOutput(scripts[1], toAmount(9000, params.amountType));
}, /No, this would invalidate signatures/);
});
});
(0, mocha_1.describe)('setLockTime', () => {
(0, mocha_1.it)('throws if if there exist any scriptSigs', () => {
const txb = new src_1.TransactionBuilder();
txb.addInput(txHash, 0);
txb.addOutput(scripts[0], toAmount(100, params.amountType));
txb.sign({
prevOutScriptType: 'p2pkh',
vin: 0,
keyPair,
});
assert.throws(() => {
txb.setLockTime(65535);
}, /No, this would invalidate signatures/);
});
});
(0, mocha_1.describe)('sign', () => {
(0, mocha_1.it)('supports the alternative abstract interface { publicKey, sign }', () => {
const innerKeyPair = {
publicKey: src_1.ECPair.makeRandom({
rng: () => {
return Buffer.alloc(32, 1);
},
}).publicKey,
sign: () => {
return Buffer.alloc(64, 0x5f);
},
signSchnorr: () => {
return Buffer.alloc(64, 0x4f);
},
};
const txb = new src_1.TransactionBuilder();
txb.setVersion(1);
txb.addInput('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', 1);
txb.addOutput('1111111111111111111114oLvT2', toAmount(100000, params.amountType));
txb.sign({
prevOutScriptType: 'p2pkh',
vin: 0,
keyPair: innerKeyPair,
});
assert.strictEqual(txb.build().toHex(), '0100000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffff' +
'ffffffff010000006a47304402205f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f' +
'5f5f5f5f5f5f5f5f5f5f5f5f5f02205f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f' +
'5f5f5f5f5f5f5f5f5f5f5f5f5f5f0121031b84c5567b126440995d3ed5aaba0565' +
'd71e1834604819ff9c17f5e9d5dd078fffffffff01a0860100000000001976a914' +
'000000000000000000000000000000000000000088ac00000000');
});
(0, mocha_1.it)('supports low R signature signing', () => {
let txb = new src_1.TransactionBuilder();
txb.setVersion(1);
txb.addInput('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', 1);
txb.addOutput('1111111111111111111114oLvT2', toAmount(100000, params.amountType));
txb.sign({
prevOutScriptType: 'p2pkh',
vin: 0,
keyPair,
});
// high R
assert.strictEqual(txb.build().toHex(), '0100000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffff' +
'ffffffff010000006b483045022100b872677f35c9c14ad9c41d83649fb049250f' +
'32574e0b2547d67e209ed14ff05d022059b36ad058be54e887a1a311d5c393cb49' +
'41f6b93a0b090845ec67094de8972b01210279be667ef9dcbbac55a06295ce870b' +
'07029bfcdb2dce28d959f2815b16f81798ffffffff01a0860100000000001976a9' +
'14000000000000000000000000000000000000000088ac00000000');
txb = new src_1.TransactionBuilder();
txb.setVersion(1);
txb.addInput('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', 1);
txb.addOutput('1111111111111111111114oLvT2', toAmount(100000, params.amountType));
txb.setLowR();
txb.sign({
prevOutScriptType: 'p2pkh',
vin: 0,
keyPair,
});
// low R
assert.strictEqual(txb.build().toHex(), '0100000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffff' +
'ffffffff010000006a473044022012a601efa8756ebe83e9ac7a7db061c3147e3b' +
'49d8be67685799fe51a4c8c62f02204d568d301d5ce14af390d566d4fd50e7b8ee' +
'48e71ec67786c029e721194dae3601210279be667ef9dcbbac55a06295ce870b07' +
'029bfcdb2dce28d959f2815b16f81798ffffffff01a0860100000000001976a914' +
'000000000000000000000000000000000000000088ac00000000');
});
(0, mocha_1.it)('fails when missing required arguments', () => {
const txb = new src_1.TransactionBuilder();
txb.setVersion(1);
txb.addInput('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', 1);
txb.addOutput('1111111111111111111114oLvT2', toAmount(100000, params.amountType));
assert.throws(() => {
txb.sign();
}, /TransactionBuilder sign first arg must be TxbSignArg or number/);
assert.throws(() => {
txb.sign({
prevOutScriptType: 'p2pkh',
vin: 1,
keyPair,
});
}, /No input at index: 1/);
assert.throws(() => {
txb.sign({
prevOutScriptType: 'p2pkh',
keyPair,
});
}, /sign must include vin parameter as Number \(input index\)/);
assert.throws(() => {
txb.sign({
prevOutScriptType: 'p2pkh',
vin: 0,
keyPair: {},
});
}, /sign must include keyPair parameter as Signer interface/);
assert.throws(() => {
txb.sign({
prevOutScriptType: 'p2pkh',
vin: 0,
keyPair,
hashType: 'string',
});
}, /sign hashType parameter must be a number/);
if (params.useOldSignArgs) {
assert.throws(() => {
txb.sign(0);
}, /sign requires keypair/);
}
});
fixtures.invalid.sign.forEach((f) => {
(0, mocha_1.it)('throws ' + f.exception + (f.description ? ' (' + f.description + ')' : ''), () => {
const txb = construct(f, {
dontSign: true,
amountType: params.amountType,
});
let threw = false;
f.inputs.forEach((input, index) => {
input.signs.forEach((sign) => {
const keyPairNetwork = src_1.networks[sign.network || f.network];
const keyPair2 = src_1.ECPair.fromWIF(sign.keyPair, keyPairNetwork);
let redeemScript;
let witnessScript;
let witnessValue;
if (sign.redeemScript) {
redeemScript = src_1.script.fromASM(sign.redeemScript);
}
if (sign.witnessScript) {
witnessScript = src_1.script.fromASM(sign.witnessScript);
}
if (sign.value) {
witnessValue = toAmount(sign.value, params.amountType);
}
if (sign.throws) {
assert.throws(() => {
txb.sign({
prevOutScriptType: sign.prevOutScriptType,
vin: index,
keyPair: keyPair2,
redeemScript,
hashType: sign.hashType,
witnessValue,
witnessScript,
});
}, new RegExp(f.exception));
threw = true;
}
else {
txb.sign({
prevOutScriptType: sign.prevOutScriptType,
vin: index,
keyPair: keyPair2,
redeemScript,
hashType: sign.hashType,
witnessValue,
witnessScript,
});
}
});
});
assert.strictEqual(threw, true);
});
});
});
(0, mocha_1.describe)('build', () => {
fixtures.valid.build.forEach((f) => {
(0, mocha_1.it)('builds "' + f.description + '"', () => {
const txb = construct(f, params);
const tx = f.incomplete ? txb.buildIncomplete() : txb.build();
assert.strictEqual(tx.toHex(), f.txHex);
});
});
// TODO: remove duplicate test code
fixtures.invalid.build.forEach((f) => {
(0, mocha_1.describe)('for ' + (f.description || f.exception), () => {
(0, mocha_1.it)('throws ' + f.exception, () => {
assert.throws(() => {
let txb;
if (f.txHex) {
txb = src_1.TransactionBuilder.fromTransaction(src_1.Transaction.fromHex(f.txHex, params.amountType));
}
else {
txb = construct(f, params);
}
txb.build();
}, new RegExp(f.exception));
});
// if throws on incomplete too, enforce that
if (f.incomplete) {
(0, mocha_1.it)('throws ' + f.exception, () => {
assert.throws(() => {
let txb;
if (f.txHex) {
txb = src_1.TransactionBuilder.fromTransaction(src_1.Transaction.fromHex(f.txHex, params.amountType));
}
else {
txb = construct(f, params);
}
txb.buildIncomplete();
}, new RegExp(f.exception));
});
}
else {
(0, mocha_1.it)('does not throw if buildIncomplete', () => {
let txb;
if (f.txHex) {
txb = src_1.TransactionBuilder.fromTransaction(src_1.Transaction.fromHex(f.txHex, params.amountType));
}
else {
txb = construct(f, params);
}
txb.buildIncomplete();
});
}
});
});
(0, mocha_1.it)('for incomplete with 0 signatures', () => {
const randomTxData = '010000000001010001000000000000000000000000000000000000000000000000' +
'0000000000000000000000ffffffff01e8030000000000001976a9144c9c3dfac4' +
'207d5d8cb89df5722cb3d712385e3f88ac02483045022100aa5d8aa40a90f23ce2' +
'c3d11bc845ca4a12acd99cbea37de6b9f6d86edebba8cb022022dedc2aa0a255f7' +
'4d04c0b76ece2d7c691f9dd11a64a8ac49f62a99c3a05f9d01232103596d345102' +
'5c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc71ac00000000';
const randomAddress = '1BgGZ9tcN4rm9KBzDn7KprQz87SZ26SAMH';
const randomTx = src_1.Transaction.fromHex(randomTxData, params.amountType);
const txb = new src_1.TransactionBuilder();
txb.addInput(randomTx, 0);
txb.addOutput(randomAddress, toAmount(1000, params.amountType));
const tx = txb.buildIncomplete();
assert(tx);
});
(0, mocha_1.it)('for incomplete P2SH with 0 signatures', () => {
const inp = Buffer.from('010000000173120703f67318aef51f7251272a6816d3f7523bb25e34b136d80be9' +
'59391c100000000000ffffffff0100c817a80400000017a91471a8ec07ff69c6c4' +
'fee489184c462a9b1b9237488700000000', 'hex'); // arbitrary P2SH input
const inpTx = src_1.Transaction.fromBuffer(inp, undefined, params.amountType);
const txb = new src_1.TransactionBuilder(src_1.networks.testnet);
txb.addInput(inpTx, 0);
txb.addOutput('2NAkqp5xffoomp5RLBcakuGpZ12GU4twdz4', toAmount(1e8, params.amountType)); // arbitrary output
txb.buildIncomplete();
});
(0, mocha_1.it)('for incomplete P2WPKH with 0 signatures', () => {
const inp = Buffer.from('010000000173120703f67318aef51f7251272a6816d3f7523bb25e34b136d80be9' +
'59391c100000000000ffffffff0100c817a8040000001600141a15805e1f4040c9' +
'f68ccc887fca2e63547d794b00000000', 'hex');
const inpTx = src_1.Transaction.fromBuffer(inp, undefined, params.amountType);
const txb = new src_1.TransactionBuilder(src_1.networks.testnet);
txb.addInput(inpTx, 0);
txb.addOutput('2NAkqp5xffoomp5RLBcakuGpZ12GU4twdz4', toAmount(1e8, params.amountType)); // arbitrary output
txb.buildIncomplete();
});
(0, mocha_1.it)('for incomplete P2WSH with 0 signatures', () => {
const inpTx = src_1.Transaction.fromBuffer(Buffer.from('010000000173120703f67318aef51f7251272a6816d3f7523bb25e34b136d80b' +
'e959391c100000000000ffffffff0100c817a80400000022002072df76fcc0b2' +
'31b94bdf7d8c25d7eef4716597818d211e19ade7813bff7a250200000000', 'hex'), undefined, params.amountType);
const txb = new src_1.TransactionBuilder(src_1.networks.testnet);
txb.addInput(inpTx, 0);
txb.addOutput('2NAkqp5xffoomp5RLBcakuGpZ12GU4twdz4', toAmount(1e8, params.amountType)); // arbitrary output
txb.buildIncomplete();
});
});
(0, mocha_1.describe)('multisig', () => {
fixtures.valid.multisig.forEach((f) => {
(0, mocha_1.it)(f.description, () => {
const network = src_1.networks[f.network];
let txb = construct(f, {
dontSign: true,
amountType: params.amountType,
});
let tx;
f.inputs.forEach((input, i) => {
const redeemScript = src_1.script.fromASM(input.redeemScript);
input.signs.forEach((sign) => {
// rebuild the transaction each-time after the first
if (tx) {
// manually override the scriptSig?
if (sign.scriptSigBefore) {
tx.ins[i].script = src_1.script.fromASM(sign.scriptSigBefore);
}
// rebuild
txb = src_1.TransactionBuilder.fromTransaction(tx, network);
}
const keyPair2 = src_1.ECPair.fromWIF(sign.keyPair, network);
txb.sign({
prevOutScriptType: sign.prevOutScriptType,
vin: i,
keyPair: keyPair2,
redeemScript,
hashType: sign.hashType,
});
// update the tx
tx = txb.buildIncomplete();
// now verify the serialized scriptSig is as expected
assert.strictEqual(src_1.script.toASM(tx.ins[i].script), sign.scriptSig);
});
});
tx = txb.build();
assert.strictEqual(tx.toHex(), f.txHex);
});
});
});
(0, mocha_1.describe)('various edge case', () => {
const network = src_1.networks.testnet;
(0, mocha_1.it)('should warn of high fee for segwit transaction based on VSize, not Size', () => {
const rawtx = '01000000000104fdaac89627208b4733484ca56bc291f4cf4fa8d7c5f29893c52b46788a0a' +
'1df90000000000fffffffffdaac89627208b4733484ca56bc291f4cf4fa8d7c5f29893c52b46788a0a1df9' +
'0100000000ffffffffa2ef7aaab316a3e5b5b0a78d1d35c774b95a079f9f0c762277a49caf1f26bca40000' +
'000000ffffffffa2ef7aaab316a3e5b5b0a78d1d35c774b95a079f9f0c762277a49caf1f26bca401000000' +
'00ffffffff0100040000000000001976a914cf307285359ab7ef6a2daa0522c7908ddf5fe7a988ac024730' +
'440220113324438816338406841775e079b04c50d04f241da652a4035b1017ea1ecf5502205802191eb49c' +
'54bf2a5667aea72e51c3ca92085efc60f12d1ebda3a64aff343201210283409659355b6d1cc3c32decd5d5' +
'61abaac86c37a353b52895a5e6c196d6f44802483045022100dc2892874e6d8708e3f5a058c5c9263cdf03' +
'969492270f89ee4933caf6daf8bb0220391dfe61a002709b63b9d64422d3db09b727839d1287e10a128a5d' +
'b52a82309301210283409659355b6d1cc3c32decd5d561abaac86c37a353b52895a5e6c196d6f448024830' +
'450221009e3ed3a6ae93a018f443257b43e47b55cf7f7f3547d8807178072234686b22160220576121cfe6' +
'77c7eddf5575ea0a7c926247df6eca723c4f85df306e8bc08ea2df01210283409659355b6d1cc3c32decd5' +
'd561abaac86c37a353b52895a5e6c196d6f44802473044022007be81ffd4297441ab10e740fc9bab9545a2' +
'194a565cd6aa4cc38b8eaffa343402201c5b4b61d73fa38e49c1ee68cc0e6dfd2f5dae453dd86eb142e87a' +
'0bafb1bc8401210283409659355b6d1cc3c32decd5d561abaac86c37a353b52895a5e6c196d6f44800000000';
const txb = src_1.TransactionBuilder.fromTransaction(src_1.Transaction.fromHex(rawtx, params.amountType));
txb.__INPUTS[0].value = toAmount(241530, params.amountType);
txb.__INPUTS[1].value = toAmount(241530, params.amountType);
txb.__INPUTS[2].value = toAmount(248920, params.amountType);
txb.__INPUTS[3].value = toAmount(248920, params.amountType);
assert.throws(() => {
txb.build();
}, new RegExp('Transaction has absurd fees'));
});
(0, mocha_1.it)('should classify witness inputs with witness = true during multisigning', () => {
const innerKeyPair = src_1.ECPair.fromWIF('cRAwuVuVSBZMPu7hdrYvMCZ8eevzmkExjFbaBLhqnDdrezxN3nTS', network);
const witnessScript = Buffer.from('522102bbbd6eb01efcbe4bd9664b886f26f69de5afcb2e479d72596c8bf21929e3' +
'52e22102d9c3f7180ef13ec5267723c9c2ffab56a4215241f837502ea8977c8532' +
'b9ea1952ae', 'hex');
const redeemScript = Buffer.from('002024376a0a9abab599d0e028248d48ebe817bc899efcffa1cd2984d67289daf5af', 'hex');
const scriptPubKey = Buffer.from('a914b64f1a3eacc1c8515592a6f10457e8ff90e4db6a87', 'hex');
const txb = new src_1.TransactionBuilder(network);
txb.setVersion(1);
txb.addInput('a4696c4b0cd27ec2e173ab1fa7d1cc639a98ee237cec95a77ca7ff4145791529', 1, 0xffffffff, scriptPubKey);
txb.addOutput(scriptPubKey, toAmount(99000, params.amountType));
txb.sign({
prevOutScriptType: 'p2sh-p2wsh-p2ms',
vin: 0,
keyPair: innerKeyPair,
redeemScript,
witnessValue: toAmount(100000, params.amountType),
witnessScript,
});
// 2-of-2 signed only once
const tx = txb.buildIncomplete();
// Only input is segwit, so txid should be accurate with the final tx
assert.strictEqual(tx.getId(), 'f15d0a65b21b4471405b21a099f8b18e1ae4d46d55efbd0f4766cf11ad6cb821');
const txHex = tx.toHex();
src_1.TransactionBuilder.fromTransaction(src_1.Transaction.fromHex(txHex, params.amountType));
});
(0, mocha_1.it)('should handle badly pre-filled OP_0s', () => {
// OP_0 is used where a signature is missing
const redeemScripSig = src_1.script.fromASM('OP_0 OP_0 3045022100daf0f4f3339d9fbab42b098045c1e4958ee3b308f4ae17' +
'be80b63808558d0adb02202f07e3d1f79dc8da285ae0d7f68083d769c11f5621eb' +
'd9691d6b48c0d4283d7d01 52410479be667ef9dcbbac55a06295ce870b07029bf' +
'cdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b44' +
'8a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07cd85c778' +
'e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceaeef7f6326' +
'53266d0e1236431a950cfe52a4104f9308a019258c31049344f85f89d5229b531c' +
'845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f3566500a99' +
'934c2231b6cb9fd7584b8e67253ae');
const redeemScript = src_1.script.fromASM('OP_2 0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f' +
'81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d' +
'4b8 04c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c70' +
'9ee51ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe5' +
'2a 04f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce03' +
'6f9388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e67' +
'2 OP_3 OP_CHECKMULTISIG');
const tx = new src_1.Transaction();
tx.addInput(Buffer.from('cff58855426469d0ef16442ee9c644c4fb13832467bcbc3173168a7916f07149', 'hex'), 0, undefined, redeemScripSig);
tx.addOutput(Buffer.from('76a914aa4d7985c57e011a8b3dd8e0e5a73aaef41629c588ac', 'hex'), toAmount(1000, params.amountType));
// now import the Transaction
const txb = src_1.TransactionBuilder.fromTransaction(tx, src_1.networks.testnet);
const keyPair2 = src_1.ECPair.fromWIF('91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgx3cTMqe', network);
txb.sign({
prevOutScriptType: 'p2sh-p2ms',
vin: 0,
keyPair: keyPair2,
redeemScript,
});
const tx2 = txb.build();
assert.strictEqual(tx2.getId(), 'eab59618a564e361adef6d918bd792903c3d41bcf1220137364fb847880467f9');
assert.strictEqual(src_1.script.toASM(tx2.ins[0].script), 'OP_0 3045022100daf0f4f3339d9fbab42b098045c1e4958ee3b308f4ae17be80b' +
'63808558d0adb02202f07e3d1f79dc8da285ae0d7f68083d769c11f5621ebd9691' +
'd6b48c0d4283d7d01 3045022100a346c61738304eac5e7702188764d19cdf68f4' +
'466196729db096d6c87ce18cdd022018c0e8ad03054b0e7e235cda6bedecf35881' +
'd7aa7d94ff425a8ace7220f38af001 52410479be667ef9dcbbac55a06295ce870' +
'b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a' +
'8fd17b448a68554199c47d08ffb10d4b84104c6047f9441ed7d6d3045406e95c07' +
'cd85c778e4b8cef3ca7abac09b95c709ee51ae168fea63dc339a3c58419466ceae' +
'ef7f632653266d0e1236431a950cfe52a4104f9308a019258c31049344f85f89d5' +
'229b531c845836f99b08601f113bce036f9388f7b0f632de8140fe337e62a37f35' +
'66500a99934c2231b6cb9fd7584b8e67253ae');
});
(0, mocha_1.it)('should not classify blank scripts as nonstandard', () => {
let txb = new src_1.TransactionBuilder();
txb.setVersion(1);
txb.addInput('aa94ab02c182214f090e99a0d57021caffd0f195a81c24602b1028b130b63e31', 0);
const incomplete = txb.buildIncomplete().toHex();
const innerKeyPair = src_1.ECPair.fromWIF('L1uyy5qTuGrVXrmrsvHWHgVzW9kKdrp27wBC7Vs6nZDTF2BRUVwy');
// sign, as expected
txb.addOutput('1Gokm82v6DmtwKEB8AiVhm82hyFSsEvBDK', toAmount(15000, params.amountType));
txb.sign({
prevOutScriptType: 'p2pkh',
vin: 0,
keyPair: innerKeyPair,
});
const txId = txb.build().getId();
assert.strictEqual(txId, '54f097315acbaedb92a95455da3368eb45981cdae5ffbc387a9afc872c0f29b3');
// and, repeat
txb = src_1.TransactionBuilder.fromTransaction(src_1.Transaction.fromHex(incomplete, params.amountType));
txb.addOutput('1Gokm82v6DmtwKEB8AiVhm82hyFSsEvBDK', toAmount(15000, params.amountType));
txb.sign({
prevOutScriptType: 'p2pkh',
vin: 0,
keyPair: innerKeyPair,
});
const txId2 = txb.build().getId();
assert.strictEqual(txId, txId2);
// TODO: Remove me in v6
if (params.useOldSignArgs) {
console.warn = consoleWarn;
}
});
});
});
}
// TODO: Remove loop in v6
for (const useOldSignArgs of [false, true]) {
runTest(txb_fixtures, `TransactionBuilder: useOldSignArgs === ${useOldSignArgs}, amountType === number, testFixture === transaction_builder.json`, { useOldSignArgs, amountType: 'number' });
runTest(txb_fixtures, `TransactionBuilder: useOldSignArgs === ${useOldSignArgs}, amountType === bigint, testFixture === transaction_builder.json`, { useOldSignArgs, amountType: 'bigint' });
runTest(txb_big_fixtures, `TransactionBuilder: useOldSignArgs === ${useOldSignArgs}, amountType === bigint, testFixture === transaction_builder_bigint.json`, { useOldSignArgs, amountType: 'bigint' });
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25fYnVpbGRlci5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGVzdC90cmFuc2FjdGlvbl9idWlsZGVyLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSxpQ0FBaUM7QUFDakMsaUNBQWlEO0FBQ2pELGdDQVFnQjtBQUVoQixPQUFPLENBQUMsSUFBSSxHQUFHLEdBQVMsRUFBRTtJQUN4QixPQUFPO0FBQ1QsQ0FBQyxDQUFDLENBQUMsa0NBQWtDO0FBRXJDLG9FQUFvRTtBQUNwRSwrRUFBK0U7QUFFL0UsU0FBUyxRQUFRLENBQUMsQ0FBa0IsRUFBRSxDQUFzQjtJQUMxRCxJQUFJLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNwQixPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFDRCxJQUFJLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNuQixPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsSUFBSSxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbkIsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkIsQ0FBQztJQUNELE1BQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQztBQUNwQixDQUFDO0FBRUQsU0FBUyxhQUFhLENBQ3BCLENBQU0sRUFDTixHQUFnQyxFQUNoQyxNQUdDO0lBRUQsTUFBTSxPQUFPLEdBQUksY0FBZ0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0MsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBRTdDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBVSxFQUFFLEtBQWEsRUFBRSxFQUFFO1FBQzdDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSztZQUFFLE9BQU87UUFDekIsS0FBSyxDQUFDLEtBQUss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Z0JBQ2hDLHdCQUF3QjtnQkFDeEIsSUFBSSxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQzFCLE9BQU8sQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDO2dCQUM3QixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELDBCQUEwQjtBQUMxQixLQUFLLE1BQU0sY0FBYyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDM0MsT0FBTyxDQUNMLFlBQVksRUFDWiwwQ0FBMEMsY0FBYyxtRUFBbUUsRUFDM0gsRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUN6QyxDQUFDO0lBQ0YsT0FBTyxDQUNMLFlBQVksRUFDWiwwQ0FBMEMsY0FBYyxtRUFBbUUsRUFDM0gsRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUN6QyxDQUFDO0lBQ0YsT0FBTyxDQUNMLGdCQUFnQixFQUNoQiwwQ0FBMEMsY0FBYywwRUFBMEUsRUFDbEksRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUN6QyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGJpdGNvaW5qcyBmcm9tICdiaXRjb2luanMtbGliJztcbmltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgYmVmb3JlRWFjaCwgZGVzY3JpYmUsIGl0IH0gZnJvbSAnbW9jaGEnO1xuaW1wb3J0IHtcbiAgYWRkcmVzcyBhcyBiYWRkcmVzcyxcbiAgbmV0d29ya3MgYXMgTkVUV09SS1MsXG4gIHBheW1lbnRzLFxuICBzY3JpcHQgYXMgYnNjcmlwdCxcbiAgVHJhbnNhY3Rpb24sXG4gIFRyYW5zYWN0aW9uQnVpbGRlcixcbiAgRUNQYWlyLFxufSBmcm9tICcuLi9zcmMnO1xuXG5jb25zb2xlLndhcm4gPSAoKTogdm9pZCA9PiB7XG4gIHJldHVybjtcbn07IC8vIFNpbGVuY2UgdGhlIERlcHJlY2F0aW9uIFdhcm5pbmdcblxuaW1wb3J0ICogYXMgdHhiX2ZpeHR1cmVzIGZyb20gJy4vZml4dHVyZXMvdHJhbnNhY3Rpb25fYnVpbGRlci5qc29uJztcbmltcG9ydCAqIGFzIHR4Yl9iaWdfZml4dHVyZXMgZnJvbSAnLi9maXh0dXJlcy90cmFuc2FjdGlvbl9idWlsZGVyX2JpZ2ludC5qc29uJztcblxuZnVuY3Rpb24gdG9BbW91bnQodjogYW55IHwgdW5kZWZpbmVkLCB0OiAnbnVtYmVyJyB8ICdiaWdpbnQnKTogbnVtYmVyIHwgYmlnaW50IHwgdW5kZWZpbmVkIHtcbiAgaWYgKHYgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB2O1xuICB9XG4gIGlmICh0ID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBOdW1iZXIodik7XG4gIH1cbiAgaWYgKHQgPT09ICdiaWdpbnQnKSB7XG4gICAgcmV0dXJuIEJpZ0ludCh2KTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoKTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0U2lnbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihcbiAgZjogYW55LFxuICB0eGI6IFRyYW5zYWN0aW9uQnVpbGRlcjxUTnVtYmVyPixcbiAgcGFyYW1zOiB7XG4gICAgdXNlT2xkU2lnbkFyZ3M/OiBib29sZWFuO1xuICAgIGFtb3VudFR5cGU6ICdudW1iZXInIHwgJ2JpZ2ludCc7XG4gIH1cbik6IFRyYW5zYWN0aW9uQnVpbGRlcjxUTnVtYmVyPiB7XG4gIGNvbnN0IG5ldHdvcmsgPSAoTkVUV09SS1MgYXMgYW55KVtmLm5ldHdvcmtdO1xuICBjb25zdCBzdGFnZXMgPSBmLnN0YWdlcyAmJiBmLnN0YWdlcy5jb25jYXQoKTtcblxuICBmLmlucHV0cy5mb3JFYWNoKChpbnB1dDogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgaWYgKCFpbnB1dC5zaWducykgcmV0dXJuO1xuICAgIGlucHV0LnNpZ25zLmZvckVhY2goKHNpZ246IGFueSkgPT4ge1xuICAgICAgY29uc3Qga2V5UGFpciA9IEVDUGFpci5mcm9tV0lGKHNpZ24ua2V5UGFpciwgbmV0d29yayk7XG4gICAgICBsZXQgcmVkZWVtU2NyaXB0O1xuICAgICAgbGV0IHdpdG5lc3NTY3JpcHQ7XG4gICAgICBsZXQgd2l0bmVzc1ZhbHVlO1xuICAgICAgbGV0IGNvbnRyb2xCbG9jaztcblxuICAgICAgaWYgKHNpZ24ucmVkZWVtU2NyaXB0KSB7XG4gICAgICAgIHJlZGVlbVNjcmlwdCA9IGJzY3JpcHQuZnJvbUFTTShzaWduLnJlZGVlbVNjcmlwdCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaWduLnZhbHVlKSB7XG4gICAgICAgIHdpdG5lc3NWYWx1ZSA9IHRvQW1vdW50KHNpZ24udmFsdWUsIHBhcmFtcy5hbW91bnRUeXBlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNpZ24ud2l0bmVzc1NjcmlwdCkge1xuICAgICAgICB3aXRuZXNzU2NyaXB0ID0gYnNjcmlwdC5mcm9tQVNNKHNpZ24ud2l0bmVzc1NjcmlwdCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaWduLmNvbnRyb2xCbG9jaykge1xuICAgICAgICBjb250cm9sQmxvY2sgPSBCdWZmZXIuZnJvbShzaWduLmNvbnRyb2xCbG9jaywgJ2hleCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLnVzZU9sZFNpZ25BcmdzKSB7XG4gICAgICAgIC8vIERFUFJFQ0FURUQ6IHY2IHdpbGwgcmVtb3ZlIHRoaXMgaW50ZXJmYWNlXG4gICAgICAgIHR4Yi5zaWduKFxuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIGtleVBhaXIsXG4gICAgICAgICAgcmVkZWVtU2NyaXB0LFxuICAgICAgICAgIHNpZ24uaGFzaFR5cGUsXG4gICAgICAgICAgdG9BbW91bnQod2l0bmVzc1ZhbHVlLCBwYXJhbXMuYW1vdW50VHlwZSkgYXMgVE51bWJlcixcbiAgICAgICAgICB3aXRuZXNzU2NyaXB0LFxuICAgICAgICAgIGNvbnRyb2xCbG9ja1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcHJldk91dFNjcmlwdFR5cGUgaXMgcmVxdWlyZWQsIHNlZSAvdHNfc3JjL3RyYW5zYWN0aW9uX2J1aWxkZXIudHNcbiAgICAgICAgLy8gVGhlIFBSRVZPVVRfVFlQRVMgY29uc3RhbnQgaXMgYSBTZXQgd2l0aCBhbGwgcG9zc2libGUgdmFsdWVzLlxuICAgICAgICB0eGIuc2lnbih7XG4gICAgICAgICAgcHJldk91dFNjcmlwdFR5cGU6IHNpZ24ucHJldk91dFNjcmlwdFR5cGUsXG4gICAgICAgICAgdmluOiBpbmRleCxcbiAgICAgICAgICBrZXlQYWlyLFxuICAgICAgICAgIHJlZGVlbVNjcmlwdCxcbiAgICAgICAgICBoYXNoVHlwZTogc2lnbi5oYXNoVHlwZSxcbiAgICAgICAgICB3aXRuZXNzVmFsdWU6IHRvQW1vdW50KHdpdG5lc3NWYWx1ZSwgcGFyYW1zLmFtb3VudFR5cGUpIGFzIFROdW1iZXIsXG4gICAgICAgICAgd2l0bmVzc1NjcmlwdCxcbiAgICAgICAgICBjb250cm9sQmxvY2ssXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2lnbi5zdGFnZSkge1xuICAgICAgICBjb25zdCB0eCA9IHR4Yi5idWlsZEluY29tcGxldGUoKTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR4LnRvSGV4KCksIHN0YWdlcy5zaGlmdCgpKTtcbiAgICAgICAgdHhiID0gVHJhbnNhY3Rpb25CdWlsZGVyLmZyb21UcmFuc2FjdGlvbih0eCwgbmV0d29yayk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiB0eGI7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihcbiAgZjogYW55LFxuICBwYXJhbXM6IHtcbiAgICBhbW91bnRUeXBlOiAnbnVtYmVyJyB8ICdiaWdpbnQnO1xuICAgIGRvbnRTaWduPzogYm9vbGVhbjtcbiAgICB1c2VPbGRTaWduQXJncz86IGJvb2xlYW47XG4gIH1cbik6IFRyYW5zYWN0aW9uQnVpbGRlcjxUTnVtYmVyPiB7XG4gIGNvbnN0IG5ldHdvcmsgPSAoTkVUV09SS1MgYXMgYW55KVtmLm5ldHdvcmtdO1xuICBjb25zdCB0eGIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyPFROdW1iZXI+KG5ldHdvcmspO1xuXG4gIGlmIChOdW1iZXIuaXNGaW5pdGUoZi52ZXJzaW9uKSkgdHhiLnNldFZlcnNpb24oZi52ZXJzaW9uKTtcbiAgaWYgKGYubG9ja3RpbWUgIT09IHVuZGVmaW5lZCkgdHhiLnNldExvY2tUaW1lKGYubG9ja3RpbWUpO1xuXG4gIGYuaW5wdXRzLmZvckVhY2goKGlucHV0OiBhbnkpID0+IHtcbiAgICBsZXQgcHJldlR4O1xuICAgIGlmIChpbnB1dC50eFJhdykge1xuICAgICAgY29uc3QgY29uc3RydWN0ZWQgPSBjb25zdHJ1Y3QoaW5wdXQudHhSYXcsIHtcbiAgICAgICAgYW1vdW50VHlwZTogcGFyYW1zLmFtb3VudFR5cGUsXG4gICAgICB9KTtcbiAgICAgIGlmIChpbnB1dC50eFJhdy5pbmNvbXBsZXRlKSBwcmV2VHggPSBjb25zdHJ1Y3RlZC5idWlsZEluY29tcGxldGUoKTtcbiAgICAgIGVsc2UgcHJldlR4ID0gY29uc3RydWN0ZWQuYnVpbGQoKTtcbiAgICB9IGVsc2UgaWYgKGlucHV0LnR4SGV4KSB7XG4gICAgICBwcmV2VHggPSBUcmFuc2FjdGlvbi5mcm9tSGV4PFROdW1iZXI+KGlucHV0LnR4SGV4LCBwYXJhbXMuYW1vdW50VHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZXZUeCA9IGlucHV0LnR4SWQ7XG4gICAgfVxuXG4gICAgbGV0IHByZXZUeFNjcmlwdDtcbiAgICBpZiAoaW5wdXQucHJldlR4U2NyaXB0KSB7XG4gICAgICBwcmV2VHhTY3JpcHQgPSBic2NyaXB0LmZyb21BU00oaW5wdXQucHJldlR4U2NyaXB0KTtcbiAgICB9XG5cbiAgICB0eGIuYWRkSW5wdXQocHJldlR4LCBpbnB1dC52b3V0LCBpbnB1dC5zZXF1ZW5jZSwgcHJldlR4U2NyaXB0LCB0b0Ftb3VudChpbnB1dC52YWx1ZSwgcGFyYW1zLmFtb3VudFR5cGUpIGFzIFROdW1iZXIpO1xuICB9KTtcblxuICBmLm91dHB1dHMuZm9yRWFjaCgob3V0cHV0OiBhbnkpID0+IHtcbiAgICBpZiAob3V0cHV0LmFkZHJlc3MpIHtcbiAgICAgIHR4Yi5hZGRPdXRwdXQob3V0cHV0LmFkZHJlc3MsIHRvQW1vdW50KG91dHB1dC52YWx1ZSwgcGFyYW1zLmFtb3VudFR5cGUpIGFzIFROdW1iZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eGIuYWRkT3V0cHV0KGJzY3JpcHQuZnJvbUFTTShvdXRwdXQuc2NyaXB0KSwgdG9BbW91bnQob3V0cHV0LnZhbHVlLCBwYXJhbXMuYW1vdW50VHlwZSkgYXMgVE51bWJlcik7XG4gICAgfVxuICB9KTtcblxuICBpZiAocGFyYW1zLmRvbnRTaWduKSByZXR1cm4gdHhiO1xuICByZXR1cm4gY29uc3RydWN0U2lnbihmLCB0eGIsIHBhcmFtcyk7XG59XG5cbmZ1bmN0aW9uIHJ1blRlc3Q8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4oXG4gIGZpeHR1cmVzOiBhbnksXG4gIHRlc3ROYW1lOiBzdHJpbmcsXG4gIHBhcmFtczoge1xuICAgIHVzZU9sZFNpZ25BcmdzOiBib29sZWFuO1xuICAgIGFtb3VudFR5cGU6ICdudW1iZXInIHwgJ2JpZ2ludCc7XG4gIH1cbik6IHZvaWQge1xuICAvLyBTZWFyY2ggZm9yIFwidXNlT2xkU2lnbkFyZ3NcIlxuICAvLyB0byBmaW5kIHRoZSBzZWNvbmQgcGFydCBvZiB0aGlzIGNvbnNvbGUud2FybiByZXBsYWNlXG4gIGxldCBjb25zb2xlV2FybjogYW55O1xuICBpZiAocGFyYW1zLnVzZU9sZFNpZ25BcmdzKSB7XG4gICAgY29uc29sZVdhcm4gPSBjb25zb2xlLndhcm47XG4gICAgLy8gU2lsZW5jZSBjb25zb2xlLndhcm4gZHVyaW5nIHRoZXNlIHRlc3RzXG4gICAgY29uc29sZS53YXJuID0gKCk6IHVuZGVmaW5lZCA9PiB1bmRlZmluZWQ7XG4gIH1cbiAgZGVzY3JpYmUodGVzdE5hbWUsICgpID0+IHtcbiAgICAvLyBjb25zdGFudHNcbiAgICBjb25zdCBrZXlQYWlyID0gRUNQYWlyLmZyb21Qcml2YXRlS2V5KFxuICAgICAgQnVmZmVyLmZyb20oJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEnLCAnaGV4JylcbiAgICApO1xuICAgIGNvbnN0IHNjcmlwdHMgPSBbJzFCZ0daOXRjTjRybTlLQnpEbjdLcHJRejg3U1oyNlNBTUgnLCAnMWNNaDIyOEhUQ2l3Uzhac2Fha0g4QTh3emUxSlI1WnNQJ10ubWFwKCh4KSA9PiB7XG4gICAgICByZXR1cm4gYmFkZHJlc3MudG9PdXRwdXRTY3JpcHQoeCwgTkVUV09SS1MuYml0Y29pbik7XG4gICAgfSk7XG4gICAgY29uc3QgdHhIYXNoID0gQnVmZmVyLmZyb20oJzBlN2NlYTgxMWMwYmU5ZjczYzBhY2E1OTEwMzQzOTZlNzI2NDQ3M2ZjMjVjMWNhNDUxOTVkNzQxN2IzNmNiZTInLCAnaGV4Jyk7XG5cbiAgICBkZXNjcmliZSgnZnJvbVRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgICAgZml4dHVyZXMudmFsaWQuYnVpbGQuZm9yRWFjaCgoZjogYW55KSA9PiB7XG4gICAgICAgIGl0KCdyZXR1cm5zIFRyYW5zYWN0aW9uQnVpbGRlciwgd2l0aCAnICsgZi5kZXNjcmlwdGlvbiwgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5ldHdvcmsgPSAoTkVUV09SS1MgYXMgYW55KVtmLm5ldHdvcmsgfHwgJ2JpdGNvaW4nXTtcblxuICAgICAgICAgIGNvbnN0IHR4ID0gVHJhbnNhY3Rpb24uZnJvbUhleDxUTnVtYmVyPihmLnR4SGV4LCBwYXJhbXMuYW1vdW50VHlwZSk7XG4gICAgICAgICAgY29uc3QgdHhiID0gVHJhbnNhY3Rpb25CdWlsZGVyLmZyb21UcmFuc2FjdGlvbjxUTnVtYmVyPih0eCwgbmV0d29yayk7XG4gICAgICAgICAgY29uc3QgdHhBZnRlciA9IGYuaW5jb21wbGV0ZSA/IHR4Yi5idWlsZEluY29tcGxldGUoKSA6IHR4Yi5idWlsZCgpO1xuXG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR4QWZ0ZXIudG9IZXgoKSwgZi50eEhleCk7XG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR4Yi5uZXR3b3JrLCBuZXR3b3JrKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZml4dHVyZXMudmFsaWQuZnJvbVRyYW5zYWN0aW9uLmZvckVhY2goKGY6IGFueSkgPT4ge1xuICAgICAgICBpdCgncmV0dXJucyBUcmFuc2FjdGlvbkJ1aWxkZXIsIHdpdGggJyArIGYuZGVzY3JpcHRpb24sICgpID0+IHtcbiAgICAgICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbjxUTnVtYmVyPigpO1xuXG4gICAgICAgICAgZi5pbnB1dHMuZm9yRWFjaCgoaW5wdXQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHhIYXNoMiA9IEJ1ZmZlci5mcm9tKGlucHV0LnR4SWQsICdoZXgnKS5yZXZlcnNlKCkgYXMgQnVmZmVyO1xuXG4gICAgICAgICAgICB0eC5hZGRJbnB1dCh0eEhhc2gyLCBpbnB1dC52b3V0LCB1bmRlZmluZWQsIGJzY3JpcHQuZnJvbUFTTShpbnB1dC5zY3JpcHRTaWcpKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGYub3V0cHV0cy5mb3JFYWNoKChvdXRwdXQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgdHguYWRkT3V0cHV0KGJzY3JpcHQuZnJvbUFTTShvdXRwdXQuc2NyaXB0KSwgdG9BbW91bnQob3V0cHV0LnZhbHVlLCBwYXJhbXMuYW1vdW50VHlwZSkgYXMgVE51bWJlcik7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCB0eGIgPSBUcmFuc2FjdGlvbkJ1aWxkZXIuZnJvbVRyYW5zYWN0aW9uPFROdW1iZXI+KHR4KTtcbiAgICAgICAgICBjb25zdCB0eEFmdGVyID0gZi5pbmNvbXBsZXRlID8gdHhiLmJ1aWxkSW5jb21wbGV0ZSgpIDogdHhiLmJ1aWxkKCk7XG5cbiAgICAgICAgICB0eEFmdGVyLmlucy5mb3JFYWNoKChpbnB1dCwgaSkgPT4ge1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJzY3JpcHQudG9BU00oaW5wdXQuc2NyaXB0KSwgZi5pbnB1dHNbaV0uc2NyaXB0U2lnQWZ0ZXIpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdHhBZnRlci5vdXRzLmZvckVhY2goKG91dHB1dCwgaSkgPT4ge1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJzY3JpcHQudG9BU00ob3V0cHV0LnNjcmlwdCksIGYub3V0cHV0c1tpXS5zY3JpcHQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBmaXh0dXJlcy52YWxpZC5mcm9tVHJhbnNhY3Rpb25TZXF1ZW50aWFsLmZvckVhY2goKGY6IGFueSkgPT4ge1xuICAgICAgICBpdCgnd2l0aCAnICsgZi5kZXNjcmlwdGlvbiwgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5ldHdvcmsgPSAoTkVUV09SS1MgYXMgYW55KVtmLm5ldHdvcmtdO1xuICAgICAgICAgIGNvbnN0IHR4ID0gVHJhbnNhY3Rpb24uZnJvbUhleDxUTnVtYmVyPihmLnR4SGV4LCBwYXJhbXMuYW1vdW50VHlwZSk7XG4gICAgICAgICAgY29uc3QgdHhiID0gVHJhbnNhY3Rpb25CdWlsZGVyLmZyb21UcmFuc2FjdGlvbjxUTnVtYmVyPih0eCwgbmV0d29yayk7XG5cbiAgICAgICAgICB0eC5pbnMuZm9yRWFjaCgoaW5wdXQsIGkpID0+IHtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChic2NyaXB0LnRvQVNNKGlucHV0LnNjcmlwdCksIGYuaW5wdXRzW2ldLnNjcmlwdFNpZyk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdHJ1Y3RTaWduKGYsIHR4YiwgcGFyYW1zKTtcbiAgICAgICAgICBjb25zdCB0eEFmdGVyID0gZi5pbmNvbXBsZXRlID8gdHhiLmJ1aWxkSW5jb21wbGV0ZSgpIDogdHhiLmJ1aWxkKCk7XG5cbiAgICAgICAgICB0eEFmdGVyLmlucy5mb3JFYWNoKChpbnB1dCwgaSkgPT4ge1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJzY3JpcHQudG9BU00oaW5wdXQuc2NyaXB0KSwgZi5pbnB1dHNbaV0uc2NyaXB0U2lnQWZ0ZXIpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR4QWZ0ZXIudG9IZXgoKSwgZi50eEhleEFmdGVyKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2NsYXNzaWZpZXMgdHJhbnNhY3Rpb24gaW5wdXRzJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eCA9IFRyYW5zYWN0aW9uLmZyb21IZXg8VE51bWJlcj4oZml4dHVyZXMudmFsaWQuY2xhc3NpZmljYXRpb24uaGV4LCBwYXJhbXMuYW1vdW50VHlwZSk7XG4gICAgICAgIGNvbnN0IHR4YiA9IFRyYW5zYWN0aW9uQnVpbGRlci5mcm9tVHJhbnNhY3Rpb248VE51bWJlcj4odHgpO1xuXG4gICAgICAgICh0eGIgYXMgYW55KS5fX0lOUFVUUy5mb3JFYWNoKChpOiBhbnkpID0+IHtcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaS5wcmV2T3V0VHlwZSwgJ3NjcmlwdGhhc2gnKTtcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaS5yZWRlZW1TY3JpcHRUeXBlLCAnbXVsdGlzaWcnKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZml4dHVyZXMuaW52YWxpZC5mcm9tVHJhbnNhY3Rpb24uZm9yRWFjaCgoZjogYW55KSA9PiB7XG4gICAgICAgIGl0KCd0aHJvd3MgJyArIGYuZXhjZXB0aW9uLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdHggPSBUcmFuc2FjdGlvbi5mcm9tSGV4PFROdW1iZXI+KGYudHhIZXgsIHBhcmFtcy5hbW91bnRUeXBlKTtcblxuICAgICAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICAgICAgVHJhbnNhY3Rpb25CdWlsZGVyLmZyb21UcmFuc2FjdGlvbjxUTnVtYmVyPih0eCk7XG4gICAgICAgICAgfSwgbmV3IFJlZ0V4cChmLmV4Y2VwdGlvbikpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2FkZElucHV0JywgKCkgPT4ge1xuICAgICAgbGV0IHR4YjogVHJhbnNhY3Rpb25CdWlsZGVyPFROdW1iZXI+O1xuICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIHR4YiA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXI8VE51bWJlcj4oKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYWNjZXB0cyBhIHR4SGFzaCwgaW5kZXggW2FuZCBzZXF1ZW5jZSBudW1iZXJdJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB2aW4gPSB0eGIuYWRkSW5wdXQodHhIYXNoLCAxLCA1NCk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh2aW4sIDApO1xuXG4gICAgICAgIGNvbnN0IHR4SW4gPSAodHhiIGFzIGFueSkuX19UWC5pbnNbMF07XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eEluLmhhc2gsIHR4SGFzaCk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eEluLmluZGV4LCAxKTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR4SW4uc2VxdWVuY2UsIDU0KTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKCh0eGIgYXMgYW55KS5fX0lOUFVUU1swXS5wcmV2T3V0U2NyaXB0LCB1bmRlZmluZWQpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhY2NlcHRzIGEgdHhIYXNoLCBpbmRleCBbLCBzZXF1ZW5jZSBudW1iZXIgYW5kIHNjcmlwdFB1YktleV0nLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZpbiA9IHR4Yi5hZGRJbnB1dCh0eEhhc2gsIDEsIDU0LCBzY3JpcHRzWzFdKTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHZpbiwgMCk7XG5cbiAgICAgICAgY29uc3QgdHhJbiA9ICh0eGIgYXMgYW55KS5fX1RYLmluc1swXTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR4SW4uaGFzaCwgdHhIYXNoKTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR4SW4uaW5kZXgsIDEpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHhJbi5zZXF1ZW5jZSwgNTQpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoKHR4YiBhcyBhbnkpLl9fSU5QVVRTWzBdLnByZXZPdXRTY3JpcHQsIHNjcmlwdHNbMV0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhY2NlcHRzIGEgcHJldlR4LCBpbmRleCBbYW5kIHNlcXVlbmNlIG51bWJlcl0nLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXZUeCA9IG5ldyBUcmFuc2FjdGlvbjxUTnVtYmVyPigpO1xuICAgICAgICBwcmV2VHguYWRkT3V0cHV0KHNjcmlwdHNbMF0sIHRvQW1vdW50KDAsIHBhcmFtcy5hbW91bnRUeXBlKSBhcyBUTnVtYmVyKTtcbiAgICAgICAgcHJldlR4LmFkZE91dHB1dChzY3JpcHRzWzFdLCB0b0Ftb3VudCgxLCBwYXJhbXMuYW1vdW50VHlwZSkgYXMgVE51bWJlcik7XG5cbiAgICAgICAgY29uc3QgdmluID0gdHhiLmFkZElucHV0KHByZXZUeCwgMSwgNTQpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodmluLCAwKTtcblxuICAgICAgICBjb25zdCB0eEluID0gKHR4YiBhcyBhbnkpLl9fVFguaW5zWzBdO1xuICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHR4SW4uaGFzaCwgcHJldlR4LmdldEhhc2goKSk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eEluLmluZGV4LCAxKTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR4SW4uc2VxdWVuY2UsIDU0KTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKCh0eGIgYXMgYW55KS5fX0lOUFVUU1swXS5wcmV2T3V0U2NyaXB0LCBzY3JpcHRzWzFdKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgncmV0dXJucyB0aGUgaW5wdXQgaW5kZXgnLCAoKSA9PiB7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eGIuYWRkSW5wdXQodHhIYXNoLCAwKSwgMCk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eGIuYWRkSW5wdXQodHhIYXNoLCAxKSwgMSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Rocm93cyBpZiBTSUdIQVNIX0FMTCBoYXMgYmVlbiB1c2VkIHRvIHNpZ24gYW55IGV4aXN0aW5nIHNjcmlwdFNpZ3MnLCAoKSA9PiB7XG4gICAgICAgIHR4Yi5hZGRJbnB1dCh0eEhhc2gsIDApO1xuICAgICAgICB0eGIuYWRkT3V0cHV0KHNjcmlwdHNbMF0sIHRvQW1vdW50KDEwMDAsIHBhcmFtcy5hbW91bnRUeXBlKSBhcyBUTnVtYmVyKTtcbiAgICAgICAgdHhiLnNpZ24oe1xuICAgICAgICAgIHByZXZPdXRTY3JpcHRUeXBlOiAncDJwa2gnLFxuICAgICAgICAgIHZpbjogMCxcbiAgICAgICAgICBrZXlQYWlyLFxuICAgICAgICB9KTtcblxuICAgICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgICB0eGIuYWRkSW5wdXQodHhIYXNoLCAwKTtcbiAgICAgICAgfSwgL05vLCB0aGlzIHdvdWxkIGludmFsaWRhdGUgc2lnbmF0dXJlcy8pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnYWRkT3V0cHV0JywgKCkgPT4ge1xuICAgICAgbGV0IHR4YjogVHJhbnNhY3Rpb25CdWlsZGVyPFROdW1iZXI+O1xuICAgICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIHR4YiA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXI8VE51bWJlcj4oKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYWNjZXB0cyBhbiBhZGRyZXNzIHN0cmluZyBhbmQgdmFsdWUnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgYWRkcmVzcyB9ID0gcGF5bWVudHMucDJwa2goeyBwdWJrZXk6IGtleVBhaXIucHVibGljS2V5IH0pO1xuICAgICAgICBjb25zdCB2b3V0ID0gdHhiLmFkZE91dHB1dChhZGRyZXNzISwgdG9BbW91bnQoMTAwMCwgcGFyYW1zLmFtb3VudFR5cGUpIGFzIFROdW1iZXIpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodm91dCwgMCk7XG5cbiAgICAgICAgY29uc3QgdHhvdXQgPSAodHhiIGFzIGFueSkuX19UWC5vdXRzWzBdO1xuICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHR4b3V0LnNjcmlwdCwgc2NyaXB0c1swXSk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eG91dC52YWx1ZSwgdG9BbW91bnQoMTAwMCwgcGFyYW1zLmFtb3VudFR5cGUpIGFzIFROdW1iZXIpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhY2NlcHRzIGEgU2NyaXB0UHViS2V5IGFuZCB2YWx1ZScsICgpID0+IHtcbiAgICAgICAgY29uc3Qgdm91dCA9IHR4Yi5hZGRPdXRwdXQoc2NyaXB0c1swXSwgdG9BbW91bnQoMTAwMCwgcGFyYW1zLmFtb3VudFR5cGUpIGFzIFROdW1iZXIpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodm91dCwgMCk7XG5cbiAgICAgICAgY29uc3QgdHhvdXQgPSAodHhiIGFzIGFueSkuX19UWC5vdXRzWzBdO1xuICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHR4b3V0LnNjcmlwdCwgc2NyaXB0c1swXSk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eG91dC52YWx1ZSwgdG9BbW91bnQoMTAwMCwgcGFyYW1zLmFtb3VudFR5cGUpIGFzIFROdW1iZXIpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCd0aHJvd3MgaWYgYWRkcmVzcyBpcyBvZiB0aGUgd3JvbmcgbmV0d29yaycsICgpID0+IHtcbiAgICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgICAgdHhiLmFkZE91dHB1dCgnMk5HSGp2anc4M3BjVkZnTWNBN1F2U01oMmMyNDZyeExWejknLCB0b0Ftb3VudCgxMDAwLCBwYXJhbXMuYW1vdW50VHlwZSkgYXMgVE51bWJlcik7XG4gICAgICAgIH0sIC8yTkdIanZqdzgzcGNWRmdNY0E3UXZTTWgyYzI0NnJ4TFZ6OSBoYXMgbm8gbWF0Y2hpbmcgU2NyaXB0Lyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2FkZCBzZWNvbmQgb3V0cHV0IGFmdGVyIHNpZ25lZCBmaXJzdCBpbnB1dCB3aXRoIFNJR0hBU0hfTk9ORScsICgpID0+IHtcbiAgICAgICAgdHhiLmFkZElucHV0KHR4SGFzaCwgMCk7XG4gICAgICAgIHR4Yi5hZGRPdXRwdXQoc2NyaXB0c1swXSwgdG9BbW91bnQoMjAwMCwgcGFyYW1zLmFtb3VudFR5cGUpIGFzIFROdW1iZXIpO1xuICAgICAgICB0eGIuc2lnbih7XG4gICAgICAgICAgcHJldk91dFNjcmlwdFR5cGU6ICdwMnBraCcsXG4gICAgICAgICAgdmluOiAwLFxuICAgICAgICAgIGtleVBhaXIsXG4gICAgICAgICAgaGFzaFR5cGU6IFRyYW5zYWN0aW9uLlNJR0hBU0hfTk9ORSxcbiAgICAgICAgfSk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eGIuYWRkT3V0cHV0KHNjcmlwdHNbMV0sIHRvQW1vdW50KDkwMDAsIHBhcmFtcy5hbW91bnRUeXBlKSBhcyBUTnVtYmVyKSwgMSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2FkZCBmaXJzdCBvdXRwdXQgYWZ0ZXIgc2lnbmVkIGZpcnN0IGlucHV0IHdpdGggU0lHSEFTSF9OT05FJywgKCkgPT4ge1xuICAgICAgICB0eGIuYWRkSW5wdXQodHhIYXNoLCAwKTtcbiAgICAgICAgdHhiLnNpZ24oe1xuICAgICAgICAgIHByZXZPdXRTY3JpcHRUeXBlOiAncDJwa2gnLFxuICAgICAgICAgIHZpbjogMCxcbiAgICAgICAgICBrZXlQYWlyLFxuICAgICAgICAgIGhhc2hUeXBlOiBUcmFuc2FjdGlvbi5TSUdIQVNIX05PTkUsXG4gICAgICAgIH0pO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHhiLmFkZE91dHB1dChzY3JpcHRzWzBdLCB0b0Ftb3VudCgyMDAwLCBwYXJhbXMuYW1vdW50VHlwZSkgYXMgVE51bWJlciksIDApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhZGQgc2Vjb25kIG91dHB1dCBhZnRlciBzaWduZWQgZmlyc3QgaW5wdXQgd2l0aCBTSUdIQVNIX1NJTkdMRScsICgpID0+IHtcbiAgICAgICAgdHhiLmFkZElucHV0KHR4SGFzaCwgMCk7XG4gICAgICAgIHR4Yi5hZGRPdXRwdXQoc2NyaXB0c1swXSwgdG9BbW91bnQoMjAwMCwgcGFyYW1zLmFtb3VudFR5cGUpIGFzIFROdW1iZXIpO1xuICAgICAgICB0eGIuc2lnbih7XG4gICAgICAgICAgcHJldk91dFNjcmlwdFR5cGU6ICdwMnBraCcsXG4gICAgICAgICAgdmluOiAwLFxuICAgICAgICAgIGtleVBhaXIsXG4gICAgICAgICAgaGFzaFR5cGU6IFRyYW5zYWN0aW9uLlNJR0hBU0hfU0lOR0xFLFxuICAgICAgICB9KTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHR4Yi5hZGRPdXRwdXQoc2NyaXB0c1sxXSwgdG9BbW91bnQoOTAwMCwgcGFyYW1zLmFtb3VudFR5cGUpIGFzIFROdW1iZXIpLCAxKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYWRkIGZpcnN0IG91dHB1dCBhZnRlciBzaWduZWQgZmlyc3QgaW5wdXQgd2l0aCBTSUdIQVNIX1NJTkdMRScsICgpID0+IHtcbiAgICAgICAgdHhiLmFkZElucHV0KHR4SGFzaCwgMCk7XG4gICAgICAgIHR4Yi5zaWduKHtcbiAgICAgICAgICBwcmV2T3V0U2NyaXB0VHlwZTogJ3AycGtoJyxcbiAgICAgICAgICB2aW46IDAsXG4gICAgICAgICAga2V5UGFpcixcbiAgICAgICAgICBoYXNoVHlwZTogVHJhbnNhY3Rpb24uU0lHSEFTSF9TSU5HTEUsXG4gICAgICAgIH0pO1xuICAgICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgICB0eGIuYWRkT3V0cHV0KHNjcmlwdHNbMF0sIHRvQW1vdW50KDIwMDAsIHBhcmFtcy5hbW91bnRUeXBlKSBhcyBUTnVtYmVyKTtcbiAgICAgICAgfSwgL05vLCB0aGlzIHdvdWxkIGludmFsaWRhdGUgc2lnbmF0dXJlcy8pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCd0aHJvd3MgaWYgU0lHSEFTSF9BTEwgaGFzIGJlZW4gdXNlZCB0byBzaWduIGFueSBleGlzdGluZyBzY3JpcHRTaWdzJywgKCkgPT4ge1xuICAgICAgICB0eGIuYWRkSW5wdXQodHhIYXNoLCAwKTtcbiAgICAgICAgdHhiLmFkZE91dHB1dChzY3JpcHRzWzBdLCB0b0Ftb3VudCgyMDAwLCBwYXJhbXMuYW1vdW50VHlwZSkgYXMgVE51bWJlcik7XG4gICAgICAgIHR4Yi5zaWduKHtcbiAgICAgICAgICBwcmV2T3V0U2NyaXB0VHlwZTogJ3AycGtoJyxcbiAgICAgICAgICB2aW46IDAsXG4gICAgICAgICAga2V5UGFpcixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgICAgdHhiLmFkZE91dHB1dChzY3JpcHRzWzFdLCB0b0Ftb3VudCg5MDAwLCBwYXJhbXMuYW1vdW50VHlwZSkgYXMgVE51bWJlcik7XG4gICAgICAgIH0sIC9ObywgdGhpcyB3b3VsZCBpbnZhbGlkYXRlIHNpZ25hdHVyZXMvKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3NldExvY2tUaW1lJywgKCkgPT4ge1xuICAgICAgaXQoJ3Rocm93cyBpZiBpZiB0aGVyZSBleGlzdCBhbnkgc2NyaXB0U2lncycsICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhiID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlcjxUTnVtYmVyPigpO1xuICAgICAgICB0eGIuYWRkSW5wdXQodHhIYXNoLCAwKTtcbiAgICAgICAgdHhiLmFkZE91dHB1dChzY3JpcHRzWzBdLCB0b0Ftb3VudCgxMDAsIHBhcmFtcy5hbW91bnRUeXBlKSBhcyBUTnVtYmVyKTtcbiAgICAgICAgdHhiLnNpZ24oe1xuICAgICAgICAgIHByZXZPdXRTY3JpcHRUeXBlOiAncDJwa2gnLFxuICAgICAgICAgIHZpbjogMCxcbiAgICAgICAgICBrZXlQYWlyLFxuICAgICAgICB9KTtcblxuICAgICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgICB0eGIuc2V0TG9ja1RpbWUoNjU1MzUpO1xuICAgICAgICB9LCAvTm8sIHRoaXMgd291bGQgaW52YWxpZGF0ZSBzaWduYXR1cmVzLyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzaWduJywgKCkgPT4ge1xuICAgICAgaXQoJ3N1cHBvcnRzIHRoZSBhbHRlcm5hdGl2ZSBhYnN0cmFjdCBpbnRlcmZhY2UgeyBwdWJsaWNLZXksIHNpZ24gfScsICgpID0+IHtcbiAgICAgICAgY29uc3QgaW5uZXJLZXlQYWlyID0ge1xuICAgICAgICAgIHB1YmxpY0tleTogRUNQYWlyLm1ha2VSYW5kb20oe1xuICAgICAgICAgICAgcm5nOiAoKTogQnVmZmVyID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygzMiwgMSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLnB1YmxpY0tleSxcbiAgICAgICAgICBzaWduOiAoKTogQnVmZmVyID0+IHtcbiAgICAgICAgICAgIHJldHVybiBCdWZmZXIuYWxsb2MoNjQsIDB4NWYpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc2lnblNjaG5vcnI6ICgpOiBCdWZmZXIgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5hbGxvYyg2NCwgMHg0Zik7XG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCB0eGIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyPFROdW1iZXI+KCk7XG4gICAgICAgIHR4Yi5zZXRWZXJzaW9uKDEpO1xuICAgICAgICB0eGIuYWRkSW5wdXQoJ2ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYnLCAxKTtcbiAgICAgICAgdHhiLmFkZE91dHB1dCgnMTExMTExMTExMTExMTExMTExMTExNG9MdlQyJywgdG9BbW91bnQoMTAwMDAwLCBwYXJhbXMuYW1vdW50VHlwZSkgYXMgVE51bWJlcik7XG4gICAgICAgIHR4Yi5zaWduKHtcbiAgICAgICAgICBwcmV2T3V0U2NyaXB0VHlwZTogJ3AycGtoJyxcbiAgICAgICAgICB2aW46IDAsXG4gICAgICAgICAga2V5UGFpcjogaW5uZXJLZXlQYWlyLFxuICAgICAgICB9KTtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKFxuICAgICAgICAgIHR4Yi5idWlsZCgpLnRvSGV4KCksXG4gICAgICAgICAgJzAxMDAwMDAwMDFmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZicgK1xuICAgICAgICAgICAgJ2ZmZmZmZmZmMDEwMDAwMDA2YTQ3MzA0NDAyMjA1ZjVmNWY1ZjVmNWY1ZjVmNWY1ZjVmNWY1ZjVmNWY1ZjVmNWY1ZicgK1xuICAgICAgICAgICAgJzVmNWY1ZjVmNWY1ZjVmNWY1ZjVmNWY1ZjVmMDIyMDVmNWY1ZjVmNWY1ZjVmNWY1ZjVmNWY1ZjVmNWY1ZjVmNWY1ZicgK1xuICAgICAgICAgICAgJzVmNWY1ZjVmNWY1ZjVmNWY1ZjVmNWY1ZjVmNWYwMTIxMDMxYjg0YzU1NjdiMTI2NDQwOTk1ZDNlZDVhYWJhMDU2NScgK1xuICAgICAgICAgICAgJ2Q3MWUxODM0NjA0ODE5ZmY5YzE3ZjVlOWQ1ZGQwNzhmZmZmZmZmZmYwMWEwODYwMTAwMDAwMDAwMDAxOTc2YTkxNCcgK1xuICAgICAgICAgICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4OGFjMDAwMDAwMDAnXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3N1cHBvcnRzIGxvdyBSIHNpZ25hdHVyZSBzaWduaW5nJywgKCkgPT4ge1xuICAgICAgICBsZXQgdHhiID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlcjxUTnVtYmVyPigpO1xuICAgICAgICB0eGIuc2V0VmVyc2lvbigxKTtcbiAgICAgICAgdHhiLmFkZElucHV0KCdmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmJywgMSk7XG4gICAgICAgIHR4Yi5hZGRPdXRwdXQoJzExMTExMTExMTExMTExMTExMTExMTRvTHZUMicsIHRvQW1vdW50KDEwMDAwMCwgcGFyYW1zLmFtb3VudFR5cGUpIGFzIFROdW1iZXIpO1xuICAgICAgICB0eGIuc2lnbih7XG4gICAgICAgICAgcHJldk91dFNjcmlwdFR5cGU6ICdwMnBraCcsXG4gICAgICAgICAgdmluOiAwLFxuICAgICAgICAgIGtleVBhaXIsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBoaWdoIFJcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKFxuICAgICAgICAgIHR4Yi5idWlsZCgpLnRvSGV4KCksXG4gICAgICAgICAgJzAxMDAwMDAwMDFmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZicgK1xuICAgICAgICAgICAgJ2ZmZmZmZmZmMDEwMDAwMDA2YjQ4MzA0NTAyMjEwMGI4NzI2NzdmMzVjOWMxNGFkOWM0MWQ4MzY0OWZiMDQ5MjUwZicgK1xuICAgICAgICAgICAgJzMyNTc0ZTBiMjU0N2Q2N2UyMDllZDE0ZmYwNWQwMjIwNTliMzZhZDA1OGJlNTRlODg3YTFhMzExZDVjMzkzY2I0OScgK1xuICAgICAgICAgICAgJzQxZjZiOTNhMGIwOTA4NDVlYzY3MDk0ZGU4OTcyYjAxMjEwMjc5YmU2NjdlZjlkY2JiYWM1NWEwNjI5NWNlODcwYicgK1xuICAgICAgICAgICAgJzA3MDI5YmZjZGIyZGNlMjhkOTU5ZjI4MTViMTZmODE3OThmZmZmZmZmZjAxYTA4NjAxMDAwMDAwMDAwMDE5NzZhOScgK1xuICAgICAgICAgICAgJzE0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDg4YWMwMDAwMDAwMCdcbiAgICAgICAgKTtcblxuICAgICAgICB0eGIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyPFROdW1iZXI+KCk7XG4gICAgICAgIHR4Yi5zZXRWZXJzaW9uKDEpO1xuICAgICAgICB0eGIuYWRkSW5wdXQoJ2ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYnLCAxKTtcbiAgICAgICAgdHhiLmFkZE91dHB1dCgnMTExMTExMTExMTExMTExMTExMTExNG9MdlQyJywgdG9BbW91bnQoMTAwMDAwLCBwYXJhbXMuYW1vdW50VHlwZSkgYXMgVE51bWJlcik7XG4gICAgICAgIHR4Yi5zZXRMb3dSKCk7XG4gICAgICAgIHR4Yi5zaWduKHtcbiAgICAgICAgICBwcmV2T3V0U2NyaXB0VHlwZTogJ3AycGtoJyxcbiAgICAgICAgICB2aW46IDAsXG4gICAgICAgICAga2V5UGFpcixcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGxvdyBSXG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgICAgICB0eGIuYnVpbGQoKS50b0hleCgpLFxuICAgICAgICAgICcwMTAwMDAwMDAxZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYnICtcbiAgICAgICAgICAgICdmZmZmZmZmZjAxMDAwMDAwNmE0NzMwNDQwMjIwMTJhNjAxZWZhODc1NmViZTgzZTlhYzdhN2RiMDYxYzMxNDdlM2InICtcbiAgICAgICAgICAgICc0OWQ4YmU2NzY4NTc5OWZlNTFhNGM4YzYyZjAyMjA0ZDU2OGQzMDFkNWNlMTRhZjM5MGQ1NjZkNGZkNTBlN2I4ZWUnICtcbiAgICAgICAgICAgICc0OGU3MWVjNjc3ODZjMDI5ZTcyMTE5NGRhZTM2MDEyMTAyNzliZTY2N2VmOWRjYmJhYzU1YTA2Mjk1Y2U4NzBiMDcnICtcbiAgICAgICAgICAgICcwMjliZmNkYjJkY2UyOGQ5NTlmMjgxNWIxNmY4MTc5OGZmZmZmZmZmMDFhMDg2MDEwMDAwMDAwMDAwMTk3NmE5MTQnICtcbiAgICAgICAgICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODhhYzAwMDAwMDAwJ1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdmYWlscyB3aGVuIG1pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnRzJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eGIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyPFROdW1iZXI+KCk7XG4gICAgICAgIHR4Yi5zZXRWZXJzaW9uKDEpO1xuICAgICAgICB0eGIuYWRkSW5wdXQoJ2ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYnLCAxKTtcbiAgICAgICAgdHhiLmFkZE91dHB1dCgnMTExMTExMTExMTExMTExMTExMTExNG9MdlQyJywgdG9BbW91bnQoMTAwMDAwLCBwYXJhbXMuYW1vdW50VHlwZSkgYXMgVE51bWJlcik7XG4gICAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICAgICh0eGIgYXMgYW55KS5zaWduKCk7XG4gICAgICAgIH0sIC9UcmFuc2FjdGlvbkJ1aWxkZXIgc2lnbiBmaXJzdCBhcmcgbXVzdCBiZSBUeGJTaWduQXJnIG9yIG51bWJlci8pO1xuICAgICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgICB0eGIuc2lnbih7XG4gICAgICAgICAgICBwcmV2T3V0U2NyaXB0VHlwZTogJ3AycGtoJyxcbiAgICAgICAgICAgIHZpbjogMSxcbiAgICAgICAgICAgIGtleVBhaXIsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIC9ObyBpbnB1dCBhdCBpbmRleDogMS8pO1xuICAgICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgICAodHhiIGFzIGFueSkuc2lnbih7XG4gICAgICAgICAgICBwcmV2T3V0U2NyaXB0VHlwZTogJ3AycGtoJyxcbiAgICAgICAgICAgIGtleVBhaXIsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIC9zaWduIG11c3QgaW5jbHVkZSB2aW4gcGFyYW1ldGVyIGFzIE51bWJlciBcXChpbnB1dCBpbmRleFxcKS8pO1xuICAgICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgICAodHhiIGFzIGFueSkuc2lnbih7XG4gICAgICAgICAgICBwcmV2T3V0U2NyaXB0VHlwZTogJ3AycGtoJyxcbiAgICAgICAgICAgIHZpbjogMCxcbiAgICAgICAgICAgIGtleVBhaXI6IHt9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LCAvc2lnbiBtdXN0IGluY2x1ZGUga2V5UGFpciBwYXJhbWV0ZXIgYXMgU2lnbmVyIGludGVyZmFjZS8pO1xuICAgICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgICAodHhiIGFzIGFueSkuc2lnbih7XG4gICAgICAgICAgICBwcmV2T3V0U2NyaXB0VHlwZTogJ3AycGtoJyxcbiAgICAgICAgICAgIHZpbjogMCxcbiAgICAgICAgICAgIGtleVBhaXIsXG4gICAgICAgICAgICBoYXNoVHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIC9zaWduIGhhc2hUeXBlIHBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyLyk7XG4gICAgICAgIGlmIChwYXJhbXMudXNlT2xkU2lnbkFyZ3MpIHtcbiAgICAgICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgICAgIHR4Yi5zaWduKDApO1xuICAgICAgICAgIH0sIC9zaWduIHJlcXVpcmVzIGtleXBhaXIvKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGZpeHR1cmVzLmludmFsaWQuc2lnbi5mb3JFYWNoKChmOiBhbnkpID0+IHtcbiAgICAgICAgaXQoJ3Rocm93cyAnICsgZi5leGNlcHRpb24gKyAoZi5kZXNjcmlwdGlvbiA/ICcgKCcgKyBmLmRlc2NyaXB0aW9uICsgJyknIDogJycpLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdHhiID0gY29uc3RydWN0KGYsIHtcbiAgICAgICAgICAgIGRvbnRTaWduOiB0cnVlLFxuICAgICAgICAgICAgYW1vdW50VHlwZTogcGFyYW1zLmFtb3VudFR5cGUsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBsZXQgdGhyZXcgPSBmYWxzZTtcbiAgICAgICAgICAoZi5pbnB1dHMgYXMgYW55KS5mb3JFYWNoKChpbnB1dDogYW55LCBpbmRleDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBpbnB1dC5zaWducy5mb3JFYWNoKChzaWduOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qga2V5UGFpck5ldHdvcmsgPSAoTkVUV09SS1MgYXMgYW55KVtzaWduLm5ldHdvcmsgfHwgZi5uZXR3b3JrXTtcbiAgICAgICAgICAgICAgY29uc3Qga2V5UGFpcjIgPSBFQ1BhaXIuZnJvbVdJRihzaWduLmtleVBhaXIsIGtleVBhaXJOZXR3b3JrKTtcbiAgICAgICAgICAgICAgbGV0IHJlZGVlbVNjcmlwdDogQnVmZmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICBsZXQgd2l0bmVzc1NjcmlwdDogQnVmZmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICBsZXQgd2l0bmVzc1ZhbHVlOiBUTnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgIGlmIChzaWduLnJlZGVlbVNjcmlwdCkge1xuICAgICAgICAgICAgICAgIHJlZGVlbVNjcmlwdCA9IGJzY3JpcHQuZnJvbUFTTShzaWduLnJlZGVlbVNjcmlwdCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoc2lnbi53aXRuZXNzU2NyaXB0KSB7XG4gICAgICAgICAgICAgICAgd2l0bmVzc1NjcmlwdCA9IGJzY3JpcHQuZnJvbUFTTShzaWduLndpdG5lc3NTY3JpcHQpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKHNpZ24udmFsdWUpIHtcbiAgICAgICAgICAgICAgICB3aXRuZXNzVmFsdWUgPSB0b0Ftb3VudChzaWduLnZhbHVlLCBwYXJhbXMuYW1vdW50VHlwZSkgYXMgVE51bWJlcjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChzaWduLnRocm93cykge1xuICAgICAgICAgICAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgdHhiLnNpZ24oe1xuICAgICAgICAgICAgICAgICAgICBwcmV2T3V0U2NyaXB0VHlwZTogc2lnbi5wcmV2T3V0U2NyaXB0VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgdmluOiBpbmRleCxcbiAgICAgICAgICAgICAgICAgICAga2V5UGFpcjoga2V5UGFpcjIsXG4gICAgICAgICAgICAgICAgICAgIHJlZGVlbVNjcmlwdCxcbiAgICAgICAgICAgICAgICAgICAgaGFzaFR5cGU6IHNpZ24uaGFzaFR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHdpdG5lc3NWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgd2l0bmVzc1NjcmlwdCxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sIG5ldyBSZWdFeHAoZi5leGNlcHRpb24pKTtcbiAgICAgICAgICAgICAgICB0aHJldyA9IHRydWU7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHhiLnNpZ24oe1xuICAgICAgICAgICAgICAgICAgcHJldk91dFNjcmlwdFR5cGU6IHNpZ24ucHJldk91dFNjcmlwdFR5cGUsXG4gICAgICAgICAgICAgICAgICB2aW46IGluZGV4LFxuICAgICAgICAgICAgICAgICAga2V5UGFpcjoga2V5UGFpcjIsXG4gICAgICAgICAgICAgICAgICByZWRlZW1TY3JpcHQsXG4gICAgICAgICAgICAgICAgICBoYXNoVHlwZTogc2lnbi5oYXNoVHlwZSxcbiAgICAgICAgICAgICAgICAgIHdpdG5lc3NWYWx1ZSxcbiAgICAgICAgICAgICAgICAgIHdpdG5lc3NTY3JpcHQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRocmV3LCB0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdidWlsZCcsICgpID0+IHtcbiAgICAgIGZpeHR1cmVzLnZhbGlkLmJ1aWxkLmZvckVhY2goKGY6IGFueSkgPT4ge1xuICAgICAgICBpdCgnYnVpbGRzIFwiJyArIGYuZGVzY3JpcHRpb24gKyAnXCInLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdHhiID0gY29uc3RydWN0KGYsIHBhcmFtcyk7XG4gICAgICAgICAgY29uc3QgdHggPSBmLmluY29tcGxldGUgPyB0eGIuYnVpbGRJbmNvbXBsZXRlKCkgOiB0eGIuYnVpbGQoKTtcblxuICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0eC50b0hleCgpLCBmLnR4SGV4KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gVE9ETzogcmVtb3ZlIGR1cGxpY2F0ZSB0ZXN0IGNvZGVcbiAgICAgIGZpeHR1cmVzLmludmFsaWQuYnVpbGQuZm9yRWFjaCgoZjogYW55KSA9PiB7XG4gICAgICAgIGRlc2NyaWJlKCdmb3IgJyArIChmLmRlc2NyaXB0aW9uIHx8IGYuZXhjZXB0aW9uKSwgKCkgPT4ge1xuICAgICAgICAgIGl0KCd0aHJvd3MgJyArIGYuZXhjZXB0aW9uLCAoKSA9PiB7XG4gICAgICAgICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgICAgICAgbGV0IHR4YjtcbiAgICAgICAgICAgICAgaWYgKGYudHhIZXgpIHtcbiAgICAgICAgICAgICAgICB0eGIgPSBUcmFuc2FjdGlvbkJ1aWxkZXIuZnJvbVRyYW5zYWN0aW9uPFROdW1iZXI+KFxuICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb24uZnJvbUhleDxUTnVtYmVyPihmLnR4SGV4LCBwYXJhbXMuYW1vdW50VHlwZSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHR4YiA9IGNvbnN0cnVjdChmLCBwYXJhbXMpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdHhiLmJ1aWxkKCk7XG4gICAgICAgICAgICB9LCBuZXcgUmVnRXhwKGYuZXhjZXB0aW9uKSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBpZiB0aHJvd3Mgb24gaW5jb21wbGV0ZSB0b28sIGVuZm9yY2UgdGhhdFxuICAgICAgICAgIGlmIChmLmluY29tcGxldGUpIHtcbiAgICAgICAgICAgIGl0KCd0aHJvd3MgJyArIGYuZXhjZXB0aW9uLCAoKSA9PiB7XG4gICAgICAgICAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0eGI7XG4gICAgICAgICAgICAgICAgaWYgKGYudHhIZXgpIHtcbiAgICAgICAgICAgICAgICAgIHR4YiA9IFRyYW5zYWN0aW9uQnVpbGRlci5mcm9tVHJhbnNhY3Rpb248VE51bWJlcj4oXG4gICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uLmZyb21IZXg8VE51bWJlcj4oZi50eEhleCwgcGFyYW1zLmFtb3VudFR5cGUpXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0eGIgPSBjb25zdHJ1Y3QoZiwgcGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0eGIuYnVpbGRJbmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgIH0sIG5ldyBSZWdFeHAoZi5leGNlcHRpb24pKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpdCgnZG9lcyBub3QgdGhyb3cgaWYgYnVpbGRJbmNvbXBsZXRlJywgKCkgPT4ge1xuICAgICAgICAgICAgICBsZXQgdHhiO1xuICAgICAgICAgICAgICBpZiAoZi50eEhleCkge1xuICAgICAgICAgICAgICAgIHR4YiA9IFRyYW5zYWN0aW9uQnVpbGRlci5mcm9tVHJhbnNhY3Rpb248VE51bWJlcj4oXG4gICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbi5mcm9tSGV4PFROdW1iZXI+KGYudHhIZXgsIHBhcmFtcy5hbW91bnRUeXBlKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHhiID0gY29uc3RydWN0KGYsIHBhcmFtcyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB0eGIuYnVpbGRJbmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdmb3IgaW5jb21wbGV0ZSB3aXRoIDAgc2lnbmF0dXJlcycsICgpID0+IHtcbiAgICAgICAgY29uc3QgcmFuZG9tVHhEYXRhID1cbiAgICAgICAgICAnMDEwMDAwMDAwMDAxMDEwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyArXG4gICAgICAgICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDBmZmZmZmZmZjAxZTgwMzAwMDAwMDAwMDAwMDE5NzZhOTE0NGM5YzNkZmFjNCcgK1xuICAgICAgICAgICcyMDdkNWQ4Y2I4OWRmNTcyMmNiM2Q3MTIzODVlM2Y4OGFjMDI0ODMwNDUwMjIxMDBhYTVkOGFhNDBhOTBmMjNjZTInICtcbiAgICAgICAgICAnYzNkMTFiYzg0NWNhNGExMmFjZDk5Y2JlYTM3ZGU2YjlmNmQ4NmVkZWJiYThjYjAyMjAyMmRlZGMyYWEwYTI1NWY3JyArXG4gICAgICAgICAgJzRkMDRjMGI3NmVjZTJkN2M2OTFmOWRkMTFhNjRhOGFjNDlmNjJhOTljM2EwNWY5ZDAxMjMyMTAzNTk2ZDM0NTEwMicgK1xuICAgICAgICAgICc1YzE5ZGJiZGViOTMyZDZiZjhiZmI0YWQ0OTliOTViNmY4OGRiODg5OWVmYWMxMDJlNWZjNzFhYzAwMDAwMDAwJztcbiAgICAgICAgY29uc3QgcmFuZG9tQWRkcmVzcyA9ICcxQmdHWjl0Y040cm05S0J6RG43S3ByUXo4N1NaMjZTQU1IJztcblxuICAgICAgICBjb25zdCByYW5kb21UeCA9IFRyYW5zYWN0aW9uLmZyb21IZXg8VE51bWJlcj4ocmFuZG9tVHhEYXRhLCBwYXJhbXMuYW1vdW50VHlwZSk7XG4gICAgICAgIGNvbnN0IHR4YiA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXI8VE51bWJlcj4oKTtcbiAgICAgICAgdHhiLmFkZElucHV0KHJhbmRvbVR4LCAwKTtcbiAgICAgICAgdHhiLmFkZE91dHB1dChyYW5kb21BZGRyZXNzLCB0b0Ftb3VudCgxMDAwLCBwYXJhbXMuYW1vdW50VHlwZSkgYXMgVE51bWJlcik7XG4gICAgICAgIGNvbnN0IHR4ID0gdHhiLmJ1aWxkSW5jb21wbGV0ZSgpO1xuICAgICAgICBhc3NlcnQodHgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdmb3IgaW5jb21wbGV0ZSBQMlNIIHdpdGggMCBzaWduYXR1cmVzJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBpbnAgPSBCdWZmZXIuZnJvbShcbiAgICAgICAgICAnMDEwMDAwMDAwMTczMTIwNzAzZjY3MzE4YWVmNTFmNzI1MTI3MmE2ODE2ZDNmNzUyM2JiMjVlMzRiMTM2ZDgwYmU5JyArXG4gICAgICAgICAgICAnNTkzOTFjMTAwMDAwMDAwMDAwZmZmZmZmZmYwMTAwYzgxN2E4MDQwMDAwMDAxN2E5MTQ3MWE4ZWMwN2ZmNjljNmM0JyArXG4gICAgICAgICAgICAnZmVlNDg5MTg0YzQ2MmE5YjFiOTIzNzQ4ODcwMDAwMDAwMCcsXG4gICAgICAgICAgJ2hleCdcbiAgICAgICAgKTsgLy8gYXJiaXRyYXJ5IFAyU0ggaW5wdXRcbiAgICAgICAgY29uc3QgaW5wVHggPSBUcmFuc2FjdGlvbi5mcm9tQnVmZmVyPFROdW1iZXI+KGlucCwgdW5kZWZpbmVkLCBwYXJhbXMuYW1vdW50VHlwZSk7XG5cbiAgICAgICAgY29uc3QgdHhiID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlcjxUTnVtYmVyPihORVRXT1JLUy50ZXN0bmV0KTtcbiAgICAgICAgdHhiLmFkZElucHV0KGlucFR4LCAwKTtcbiAgICAgICAgdHhiLmFkZE91dHB1dCgnMk5Ba3FwNXhmZm9vbXA1UkxCY2FrdUdwWjEyR1U0dHdkejQnLCB0b0Ftb3VudCgxZTgsIHBhcmFtcy5hbW91bnRUeXBlKSBhcyBUTnVtYmVyKTsgLy8gYXJiaXRyYXJ5IG91dHB1dFxuXG4gICAgICAgIHR4Yi5idWlsZEluY29tcGxldGUoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnZm9yIGluY29tcGxldGUgUDJXUEtIIHdpdGggMCBzaWduYXR1cmVzJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBpbnAgPSBCdWZmZXIuZnJvbShcbiAgICAgICAgICAnMDEwMDAwMDAwMTczMTIwNzAzZjY3MzE4YWVmNTFmNzI1MTI3MmE2ODE2ZDNmNzUyM2JiMjVlMzRiMTM2ZDgwYmU5JyArXG4gICAgICAgICAgICAnNTkzOTFjMTAwMDAwMDAwMDAwZmZmZmZmZmYwMTAwYzgxN2E4MDQwMDAwMDAxNjAwMTQxYTE1ODA1ZTFmNDA0MGM5JyArXG4gICAgICAgICAgICAnZjY4Y2NjODg3ZmNhMmU2MzU0N2Q3OTRiMDAwMDAwMDAnLFxuICAgICAgICAgICdoZXgnXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGlucFR4ID0gVHJhbnNhY3Rpb24uZnJvbUJ1ZmZlcjxUTnVtYmVyPihpbnAsIHVuZGVmaW5lZCwgcGFyYW1zLmFtb3VudFR5cGUpO1xuXG4gICAgICAgIGNvbnN0IHR4YiA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXI8VE51bWJlcj4oTkVUV09SS1MudGVzdG5ldCk7XG4gICAgICAgIHR4Yi5hZGRJbnB1dChpbnBUeCwgMCk7XG4gICAgICAgIHR4Yi5hZGRPdXRwdXQoJzJOQWtxcDV4ZmZvb21wNVJMQmNha3VHcFoxMkdVNHR3ZHo0JywgdG9BbW91bnQoMWU4LCBwYXJhbXMuYW1vdW50VHlwZSkgYXMgVE51bWJlcik7IC8vIGFyYml0cmFyeSBvdXRwdXRcblxuICAgICAgICB0eGIuYnVpbGRJbmNvbXBsZXRlKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2ZvciBpbmNvbXBsZXRlIFAyV1NIIHdpdGggMCBzaWduYXR1cmVzJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBpbnBUeCA9IFRyYW5zYWN0aW9uLmZyb21CdWZmZXI8VE51bWJlcj4oXG4gICAgICAgICAgQnVmZmVyLmZyb20oXG4gICAgICAgICAgICAnMDEwMDAwMDAwMTczMTIwNzAzZjY3MzE4YWVmNTFmNzI1MTI3MmE2ODE2ZDNmNzUyM2JiMjVlMzRiMTM2ZDgwYicgK1xuICAgICAgICAgICAgICAnZTk1OTM5MWMxMDAwMDAwMDAwMDBmZmZmZmZmZjAxMDBjODE3YTgwNDAwMDAwMDIyMDAyMDcyZGY3NmZjYzBiMicgK1xuICAgICAgICAgICAgICAnMzFiOTRiZGY3ZDhjMjVkN2VlZjQ3MTY1OTc4MThkMjExZTE5YWRlNzgxM2JmZjdhMjUwMjAwMDAwMDAwJyxcbiAgICAgICAgICAgICdoZXgnXG4gICAgICAgICAgKSxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgcGFyYW1zLmFtb3VudFR5cGVcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCB0eGIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyPFROdW1iZXI+KE5FVFdPUktTLnRlc3RuZXQpO1xuICAgICAgICB0eGIuYWRkSW5wdXQoaW5wVHgsIDApO1xuICAgICAgICB0eGIuYWRkT3V0cHV0KCcyTkFrcXA1eGZmb29tcDVSTEJjYWt1R3BaMTJHVTR0d2R6NCcsIHRvQW1vdW50KDFlOCwgcGFyYW1zLmFtb3VudFR5cGUpIGFzIFROdW1iZXIpOyAvLyBhcmJpdHJhcnkgb3V0cHV0XG5cbiAgICAgICAgdHhiLmJ1aWxkSW5jb21wbGV0ZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnbXVsdGlzaWcnLCAoKSA9PiB7XG4gICAgICBmaXh0dXJlcy52YWxpZC5tdWx0aXNpZy5mb3JFYWNoKChmOiBhbnkpID0+IHtcbiAgICAgICAgaXQoZi5kZXNjcmlwdGlvbiwgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5ldHdvcmsgPSAoTkVUV09SS1MgYXMgYW55KVtmLm5ldHdvcmtdO1xuICAgICAgICAgIGxldCB0eGIgPSBjb25zdHJ1Y3Q8VE51bWJlcj4oZiwge1xuICAgICAgICAgICAgZG9udFNpZ246IHRydWUsXG4gICAgICAgICAgICBhbW91bnRUeXBlOiBwYXJhbXMuYW1vdW50VHlwZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBsZXQgdHg6IFRyYW5zYWN0aW9uPFROdW1iZXI+O1xuXG4gICAgICAgICAgZi5pbnB1dHMuZm9yRWFjaCgoaW5wdXQ6IGFueSwgaTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWRlZW1TY3JpcHQgPSBic2NyaXB0LmZyb21BU00oaW5wdXQucmVkZWVtU2NyaXB0KTtcblxuICAgICAgICAgICAgaW5wdXQuc2lnbnMuZm9yRWFjaCgoc2lnbjogYW55KSA9PiB7XG4gICAgICAgICAgICAgIC8vIHJlYnVpbGQgdGhlIHRyYW5zYWN0aW9uIGVhY2gtdGltZSBhZnRlciB0aGUgZmlyc3RcbiAgICAgICAgICAgICAgaWYgKHR4KSB7XG4gICAgICAgICAgICAgICAgLy8gbWFudWFsbHkgb3ZlcnJpZGUgdGhlIHNjcmlwdFNpZz9cbiAgICAgICAgICAgICAgICBpZiAoc2lnbi5zY3JpcHRTaWdCZWZvcmUpIHtcbiAgICAgICAgICAgICAgICAgIHR4Lmluc1tpXS5zY3JpcHQgPSBic2NyaXB0LmZyb21BU00oc2lnbi5zY3JpcHRTaWdCZWZvcmUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIHJlYnVpbGRcbiAgICAgICAgICAgICAgICB0eGIgPSBUcmFuc2FjdGlvbkJ1aWxkZXIuZnJvbVRyYW5zYWN0aW9uPFROdW1iZXI+KHR4LCBuZXR3b3JrKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IGtleVBhaXIyID0gRUNQYWlyLmZyb21XSUYoc2lnbi5rZXlQYWlyLCBuZXR3b3JrKTtcbiAgICAgICAgICAgICAgdHhiLnNpZ24oe1xuICAgICAgICAgICAgICAgIHByZXZPdXRTY3JpcHRUeXBlOiBzaWduLnByZXZPdXRTY3JpcHRUeXBlLFxuICAgICAgICAgICAgICAgIHZpbjogaSxcbiAgICAgICAgICAgICAgICBrZXlQYWlyOiBrZXlQYWlyMixcbiAgICAgICAgICAgICAgICByZWRlZW1TY3JpcHQsXG4gICAgICAgICAgICAgICAgaGFzaFR5cGU6IChzaWduIGFzIGFueSkuaGFzaFR5cGUsXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgdHhcbiAgICAgICAgICAgICAgdHggPSB0eGIuYnVpbGRJbmNvbXBsZXRlKCk7XG5cbiAgICAgICAgICAgICAgLy8gbm93IHZlcmlmeSB0aGUgc2VyaWFsaXplZCBzY3JpcHRTaWcgaXMgYXMgZXhwZWN0ZWRcbiAgICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJzY3JpcHQudG9BU00odHguaW5zW2ldLnNjcmlwdCksIHNpZ24uc2NyaXB0U2lnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdHggPSB0eGIuYnVpbGQoKTtcbiAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHgudG9IZXgoKSwgZi50eEhleCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgndmFyaW91cyBlZGdlIGNhc2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBuZXR3b3JrID0gTkVUV09SS1MudGVzdG5ldDtcblxuICAgICAgaXQoJ3Nob3VsZCB3YXJuIG9mIGhpZ2ggZmVlIGZvciBzZWd3aXQgdHJhbnNhY3Rpb24gYmFzZWQgb24gVlNpemUsIG5vdCBTaXplJywgKCkgPT4ge1xuICAgICAgICBjb25zdCByYXd0eCA9XG4gICAgICAgICAgJzAxMDAwMDAwMDAwMTA0ZmRhYWM4OTYyNzIwOGI0NzMzNDg0Y2E1NmJjMjkxZjRjZjRmYThkN2M1ZjI5ODkzYzUyYjQ2Nzg4YTBhJyArXG4gICAgICAgICAgJzFkZjkwMDAwMDAwMDAwZmZmZmZmZmZmZGFhYzg5NjI3MjA4YjQ3MzM0ODRjYTU2YmMyOTFmNGNmNGZhOGQ3YzVmMjk4OTNjNTJiNDY3ODhhMGExZGY5JyArXG4gICAgICAgICAgJzAxMDAwMDAwMDBmZmZmZmZmZmEyZWY3YWFhYjMxNmEzZTViNWIwYTc4ZDFkMzVjNzc0Yjk1YTA3OWY5ZjBjNzYyMjc3YTQ5Y2FmMWYyNmJjYTQwMDAwJyArXG4gICAgICAgICAgJzAwMDAwMGZmZmZmZmZmYTJlZjdhYWFiMzE2YTNlNWI1YjBhNzhkMWQzNWM3NzRiOTVhMDc5ZjlmMGM3NjIyNzdhNDljYWYxZjI2YmNhNDAxMDAwMDAwJyArXG4gICAgICAgICAgJzAwZmZmZmZmZmYwMTAwMDQwMDAwMDAwMDAwMDAxOTc2YTkxNGNmMzA3Mjg1MzU5YWI3ZWY2YTJkYWEwNTIyYzc5MDhkZGY1ZmU3YTk4OGFjMDI0NzMwJyArXG4gICAgICAgICAgJzQ0MDIyMDExMzMyNDQzODgxNjMzODQwNjg0MTc3NWUwNzliMDRjNTBkMDRmMjQxZGE2NTJhNDAzNWIxMDE3ZWExZWNmNTUwMjIwNTgwMjE5MWViNDljJyArXG4gICAgICAgICAgJzU0YmYyYTU2NjdhZWE3MmU1MWMzY2E5MjA4NWVmYzYwZjEyZDFlYmRhM2E2NGFmZjM0MzIwMTIxMDI4MzQwOTY1OTM1NWI2ZDFjYzNjMzJkZWNkNWQ1JyArXG4gICAgICAgICAgJzYxYWJhYWM4NmMzN2EzNTNiNTI4OTVhNWU2YzE5NmQ2ZjQ0ODAyNDgzMDQ1MDIyMTAwZGMyODkyODc0ZTZkODcwOGUzZjVhMDU4YzVjOTI2M2NkZjAzJyArXG4gICAgICAgICAgJzk2OTQ5MjI3MGY4OWVlNDkzM2NhZjZkYWY4YmIwMjIwMzkxZGZlNjFhMDAyNzA5YjYzYjlkNjQ0MjJkM2RiMDliNzI3ODM5ZDEyODdlMTBhMTI4YTVkJyArXG4gICAgICAgICAgJ2I1MmE4MjMwOTMwMTIxMDI4MzQwOTY1OTM1NWI2ZDFjYzNjMzJkZWNkNWQ1NjFhYmFhYzg2YzM3YTM1M2I1Mjg5NWE1ZTZjMTk2ZDZmNDQ4MDI0ODMwJyArXG4gICAgICAgICAgJzQ1MDIyMTAwOWUzZWQzYTZhZTkzYTAxOGY0NDMyNTdiNDNlNDdiNTVjZjdmN2YzNTQ3ZDg4MDcxNzgwNzIyMzQ2ODZiMjIxNjAyMjA1NzYxMjFjZmU2JyArXG4gICAgICAgICAgJzc3YzdlZGRmNTU3NWVhMGE3YzkyNjI0N2RmNmVjYTcyM2M0Zjg1ZGYzMDZlOGJjMDhlYTJkZjAxMjEwMjgzNDA5NjU5MzU1YjZkMWNjM2MzMmRlY2Q1JyArXG4gICAgICAgICAgJ2Q1NjFhYmFhYzg2YzM3YTM1M2I1Mjg5NWE1ZTZjMTk2ZDZmNDQ4MDI0NzMwNDQwMjIwMDdiZTgxZmZkNDI5NzQ0MWFiMTBlNzQwZmM5YmFiOTU0NWEyJyArXG4gICAgICAgICAgJzE5NGE1NjVjZDZhYTRjYzM4YjhlYWZmYTM0MzQwMjIwMWM1YjRiNjFkNzNmYTM4ZTQ5YzFlZTY4Y2MwZTZkZmQyZjVkYWU0NTNkZDg2ZWIxNDJlODdhJyArXG4gICAgICAgICAgJzBiYWZiMWJjODQwMTIxMDI4MzQwOTY1OTM1NWI2ZDFjYzNjMzJkZWNkNWQ1NjFhYmFhYzg2YzM3YTM1M2I1Mjg5NWE1ZTZjMTk2ZDZmNDQ4MDAwMDAwMDAnO1xuICAgICAgICBjb25zdCB0eGIgPSBUcmFuc2FjdGlvbkJ1aWxkZXIuZnJvbVRyYW5zYWN0aW9uPFROdW1iZXI+KFRyYW5zYWN0aW9uLmZyb21IZXg8VE51bWJlcj4ocmF3dHgsIHBhcmFtcy5hbW91bnRUeXBlKSk7XG4gICAgICAgICh0eGIgYXMgYW55KS5fX0lOUFVUU1swXS52YWx1ZSA9IHRvQW1vdW50KDI0MTUzMCwgcGFyYW1zLmFtb3VudFR5cGUpIGFzIFROdW1iZXI7XG4gICAgICAgICh0eGIgYXMgYW55KS5fX0lOUFVUU1sxXS52YWx1ZSA9IHRvQW1vdW50KDI0MTUzMCwgcGFyYW1zLmFtb3VudFR5cGUpIGFzIFROdW1iZXI7XG4gICAgICAgICh0eGIgYXMgYW55KS5fX0lOUFVUU1syXS52YWx1ZSA9IHRvQW1vdW50KDI0ODkyMCwgcGFyYW1zLmFtb3VudFR5cGUpIGFzIFROdW1iZXI7XG4gICAgICAgICh0eGIgYXMgYW55KS5fX0lOUFVUU1szXS52YWx1ZSA9IHRvQW1vdW50KDI0ODkyMCwgcGFyYW1zLmFtb3VudFR5cGUpIGFzIFROdW1iZXI7XG5cbiAgICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgICAgdHhiLmJ1aWxkKCk7XG4gICAgICAgIH0sIG5ldyBSZWdFeHAoJ1RyYW5zYWN0aW9uIGhhcyBhYnN1cmQgZmVlcycpKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGNsYXNzaWZ5IHdpdG5lc3MgaW5wdXRzIHdpdGggd2l0bmVzcyA9IHRydWUgZHVyaW5nIG11bHRpc2lnbmluZycsICgpID0+IHtcbiAgICAgICAgY29uc3QgaW5uZXJLZXlQYWlyID0gRUNQYWlyLmZyb21XSUYoXG4gICAgICAgICAgJ2NSQXd1VnVWU0JaTVB1N2hkcll2TUNaOGVldnpta0V4akZiYUJMaHFuRGRyZXp4TjNuVFMnLFxuICAgICAgICAgIG5ldHdvcmsgYXMgYml0Y29pbmpzLk5ldHdvcmtcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgd2l0bmVzc1NjcmlwdCA9IEJ1ZmZlci5mcm9tKFxuICAgICAgICAgICc1MjIxMDJiYmJkNmViMDFlZmNiZTRiZDk2NjRiODg2ZjI2ZjY5ZGU1YWZjYjJlNDc5ZDcyNTk2YzhiZjIxOTI5ZTMnICtcbiAgICAgICAgICAgICc1MmUyMjEwMmQ5YzNmNzE4MGVmMTNlYzUyNjc3MjNjOWMyZmZhYjU2YTQyMTUyNDFmODM3NTAyZWE4OTc3Yzg1MzInICtcbiAgICAgICAgICAgICdiOWVhMTk1MmFlJyxcbiAgICAgICAgICAnaGV4J1xuICAgICAgICApO1xuICAgICAgICBjb25zdCByZWRlZW1TY3JpcHQgPSBCdWZmZXIuZnJvbSgnMDAyMDI0Mzc2YTBhOWFiYWI1OTlkMGUwMjgyNDhkNDhlYmU4MTdiYzg5OWVmY2ZmYTFjZDI5ODRkNjcyODlkYWY1YWYnLCAnaGV4Jyk7XG4gICAgICAgIGNvbnN0IHNjcmlwdFB1YktleSA9IEJ1ZmZlci5mcm9tKCdhOTE0YjY0ZjFhM2VhY2MxYzg1MTU1OTJhNmYxMDQ1N2U4ZmY5MGU0ZGI2YTg3JywgJ2hleCcpO1xuICAgICAgICBjb25zdCB0eGIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyPFROdW1iZXI+KG5ldHdvcmspO1xuICAgICAgICB0eGIuc2V0VmVyc2lvbigxKTtcbiAgICAgICAgdHhiLmFkZElucHV0KCdhNDY5NmM0YjBjZDI3ZWMyZTE3M2FiMWZhN2QxY2M2MzlhOThlZTIzN2NlYzk1YTc3Y2E3ZmY0MTQ1NzkxNTI5JywgMSwgMHhmZmZmZmZmZiwgc2NyaXB0UHViS2V5KTtcbiAgICAgICAgdHhiLmFkZE91dHB1dChzY3JpcHRQdWJLZXksIHRvQW1vdW50KDk5MDAwLCBwYXJhbXMuYW1vdW50VHlwZSkgYXMgVE51bWJlcik7XG4gICAgICAgIHR4Yi5zaWduKHtcbiAgICAgICAgICBwcmV2T3V0U2NyaXB0VHlwZTogJ3Ayc2gtcDJ3c2gtcDJtcycsXG4gICAgICAgICAgdmluOiAwLFxuICAgICAgICAgIGtleVBhaXI6IGlubmVyS2V5UGFpcixcbiAgICAgICAgICByZWRlZW1TY3JpcHQsXG4gICAgICAgICAgd2l0bmVzc1ZhbHVlOiB0b0Ftb3VudCgxMDAwMDAsIHBhcmFtcy5hbW91bnRUeXBlKSBhcyBUTnVtYmVyLFxuICAgICAgICAgIHdpdG5lc3NTY3JpcHQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIDItb2YtMiBzaWduZWQgb25seSBvbmNlXG4gICAgICAgIGNvbnN0IHR4ID0gdHhiLmJ1aWxkSW5jb21wbGV0ZSgpO1xuXG4gICAgICAgIC8vIE9ubHkgaW5wdXQgaXMgc2Vnd2l0LCBzbyB0eGlkIHNob3VsZCBiZSBhY2N1cmF0ZSB3aXRoIHRoZSBmaW5hbCB0eFxuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHguZ2V0SWQoKSwgJ2YxNWQwYTY1YjIxYjQ0NzE0MDViMjFhMDk5ZjhiMThlMWFlNGQ0NmQ1NWVmYmQwZjQ3NjZjZjExYWQ2Y2I4MjEnKTtcblxuICAgICAgICBjb25zdCB0eEhleCA9IHR4LnRvSGV4KCk7XG4gICAgICAgIFRyYW5zYWN0aW9uQnVpbGRlci5mcm9tVHJhbnNhY3Rpb248VE51bWJlcj4oVHJhbnNhY3Rpb24uZnJvbUhleDxUTnVtYmVyPih0eEhleCwgcGFyYW1zLmFtb3VudFR5cGUpKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGhhbmRsZSBiYWRseSBwcmUtZmlsbGVkIE9QXzBzJywgKCkgPT4ge1xuICAgICAgICAvLyBPUF8wIGlzIHVzZWQgd2hlcmUgYSBzaWduYXR1cmUgaXMgbWlzc2luZ1xuICAgICAgICBjb25zdCByZWRlZW1TY3JpcFNpZyA9IGJzY3JpcHQuZnJvbUFTTShcbiAgICAgICAgICAnT1BfMCBPUF8wIDMwNDUwMjIxMDBkYWYwZjRmMzMzOWQ5ZmJhYjQyYjA5ODA0NWMxZTQ5NThlZTNiMzA4ZjRhZTE3JyArXG4gICAgICAgICAgICAnYmU4MGI2MzgwODU1OGQwYWRiMDIyMDJmMDdlM2QxZjc5ZGM4ZGEyODVhZTBkN2Y2ODA4M2Q3NjljMTFmNTYyMWViJyArXG4gICAgICAgICAgICAnZDk2OTFkNmI0OGMwZDQyODNkN2QwMSA1MjQxMDQ3OWJlNjY3ZWY5ZGNiYmFjNTVhMDYyOTVjZTg3MGIwNzAyOWJmJyArXG4gICAgICAgICAgICAnY2RiMmRjZTI4ZDk1OWYyODE1YjE2ZjgxNzk4NDgzYWRhNzcyNmEzYzQ2NTVkYTRmYmZjMGUxMTA4YThmZDE3YjQ0JyArXG4gICAgICAgICAgICAnOGE2ODU1NDE5OWM0N2QwOGZmYjEwZDRiODQxMDRjNjA0N2Y5NDQxZWQ3ZDZkMzA0NTQwNmU5NWMwN2NkODVjNzc4JyArXG4gICAgICAgICAgICAnZTRiOGNlZjNjYTdhYmFjMDliOTVjNzA5ZWU1MWFlMTY4ZmVhNjNkYzMzOWEzYzU4NDE5NDY2Y2VhZWVmN2Y2MzI2JyArXG4gICAgICAgICAgICAnNTMyNjZkMGUxMjM2NDMxYTk1MGNmZTUyYTQxMDRmOTMwOGEwMTkyNThjMzEwNDkzNDRmODVmODlkNTIyOWI1MzFjJyArXG4gICAgICAgICAgICAnODQ1ODM2Zjk5YjA4NjAxZjExM2JjZTAzNmY5Mzg4ZjdiMGY2MzJkZTgxNDBmZTMzN2U2MmEzN2YzNTY2NTAwYTk5JyArXG4gICAgICAgICAgICAnOTM0YzIyMzFiNmNiOWZkNzU4NGI4ZTY3MjUzYWUnXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlZGVlbVNjcmlwdCA9IGJzY3JpcHQuZnJvbUFTTShcbiAgICAgICAgICAnT1BfMiAwNDc5YmU2NjdlZjlkY2JiYWM1NWEwNjI5NWNlODcwYjA3MDI5YmZjZGIyZGNlMjhkOTU5ZjI4MTViMTZmJyArXG4gICAgICAgICAgICAnODE3OTg0ODNhZGE3NzI2YTNjNDY1NWRhNGZiZmMwZTExMDhhOGZkMTdiNDQ4YTY4NTU0MTk5YzQ3ZDA4ZmZiMTBkJyArXG4gICAgICAgICAgICAnNGI4IDA0YzYwNDdmOTQ0MWVkN2Q2ZDMwNDU0MDZlOTVjMDdjZDg1Yzc3OGU0YjhjZWYzY2E3YWJhYzA5Yjk1YzcwJyArXG4gICAgICAgICAgICAnOWVlNTFhZTE2OGZlYTYzZGMzMzlhM2M1ODQxOTQ2NmNlYWVlZjdmNjMyNjUzMjY2ZDBlMTIzNjQzMWE5NTBjZmU1JyArXG4gICAgICAgICAgICAnMmEgMDRmOTMwOGEwMTkyNThjMzEwNDkzNDRmODVmODlkNTIyOWI1MzFjODQ1ODM2Zjk5YjA4NjAxZjExM2JjZTAzJyArXG4gICAgICAgICAgICAnNmY5Mzg4ZjdiMGY2MzJkZTgxNDBmZTMzN2U2MmEzN2YzNTY2NTAwYTk5OTM0YzIyMzFiNmNiOWZkNzU4NGI4ZTY3JyArXG4gICAgICAgICAgICAnMiBPUF8zIE9QX0NIRUNLTVVMVElTSUcnXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb248VE51bWJlcj4oKTtcbiAgICAgICAgdHguYWRkSW5wdXQoXG4gICAgICAgICAgQnVmZmVyLmZyb20oJ2NmZjU4ODU1NDI2NDY5ZDBlZjE2NDQyZWU5YzY0NGM0ZmIxMzgzMjQ2N2JjYmMzMTczMTY4YTc5MTZmMDcxNDknLCAnaGV4JyksXG4gICAgICAgICAgMCxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgcmVkZWVtU2NyaXBTaWdcbiAgICAgICAgKTtcbiAgICAgICAgdHguYWRkT3V0cHV0KFxuICAgICAgICAgIEJ1ZmZlci5mcm9tKCc3NmE5MTRhYTRkNzk4NWM1N2UwMTFhOGIzZGQ4ZTBlNWE3M2FhZWY0MTYyOWM1ODhhYycsICdoZXgnKSxcbiAgICAgICAgICB0b0Ftb3VudCgxMDAwLCBwYXJhbXMuYW1vdW50VHlwZSkgYXMgVE51bWJlclxuICAgICAgICApO1xuXG4gICAgICAgIC8vIG5vdyBpbXBvcnQgdGhlIFRyYW5zYWN0aW9uXG4gICAgICAgIGNvbnN0IHR4YiA9IFRyYW5zYWN0aW9uQnVpbGRlci5mcm9tVHJhbnNhY3Rpb248VE51bWJlcj4odHgsIE5FVFdPUktTLnRlc3RuZXQpO1xuXG4gICAgICAgIGNvbnN0IGtleVBhaXIyID0gRUNQYWlyLmZyb21XSUYoXG4gICAgICAgICAgJzkxYXZBUkdkZmdlOEU0dFpmWUxveGVKNXNHQmROSlFINGt2akpvUUZhY2JneDNjVE1xZScsXG4gICAgICAgICAgbmV0d29yayBhcyBiaXRjb2luanMuTmV0d29ya1xuICAgICAgICApO1xuICAgICAgICB0eGIuc2lnbih7XG4gICAgICAgICAgcHJldk91dFNjcmlwdFR5cGU6ICdwMnNoLXAybXMnLFxuICAgICAgICAgIHZpbjogMCxcbiAgICAgICAgICBrZXlQYWlyOiBrZXlQYWlyMixcbiAgICAgICAgICByZWRlZW1TY3JpcHQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHR4MiA9IHR4Yi5idWlsZCgpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHgyLmdldElkKCksICdlYWI1OTYxOGE1NjRlMzYxYWRlZjZkOTE4YmQ3OTI5MDNjM2Q0MWJjZjEyMjAxMzczNjRmYjg0Nzg4MDQ2N2Y5Jyk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgICAgICBic2NyaXB0LnRvQVNNKHR4Mi5pbnNbMF0uc2NyaXB0KSxcbiAgICAgICAgICAnT1BfMCAzMDQ1MDIyMTAwZGFmMGY0ZjMzMzlkOWZiYWI0MmIwOTgwNDVjMWU0OTU4ZWUzYjMwOGY0YWUxN2JlODBiJyArXG4gICAgICAgICAgICAnNjM4MDg1NThkMGFkYjAyMjAyZjA3ZTNkMWY3OWRjOGRhMjg1YWUwZDdmNjgwODNkNzY5YzExZjU2MjFlYmQ5NjkxJyArXG4gICAgICAgICAgICAnZDZiNDhjMGQ0MjgzZDdkMDEgMzA0NTAyMjEwMGEzNDZjNjE3MzgzMDRlYWM1ZTc3MDIxODg3NjRkMTljZGY2OGY0JyArXG4gICAgICAgICAgICAnNDY2MTk2NzI5ZGIwOTZkNmM4N2NlMThjZGQwMjIwMThjMGU4YWQwMzA1NGIwZTdlMjM1Y2RhNmJlZGVjZjM1ODgxJyArXG4gICAgICAgICAgICAnZDdhYTdkOTRmZjQyNWE4YWNlNzIyMGYzOGFmMDAxIDUyNDEwNDc5YmU2NjdlZjlkY2JiYWM1NWEwNjI5NWNlODcwJyArXG4gICAgICAgICAgICAnYjA3MDI5YmZjZGIyZGNlMjhkOTU5ZjI4MTViMTZmODE3OTg0ODNhZGE3NzI2YTNjNDY1NWRhNGZiZmMwZTExMDhhJyArXG4gICAgICAgICAgICAnOGZkMTdiNDQ4YTY4NTU0MTk5YzQ3ZDA4ZmZiMTBkNGI4NDEwNGM2MDQ3Zjk0NDFlZDdkNmQzMDQ1NDA2ZTk1YzA3JyArXG4gICAgICAgICAgICAnY2Q4NWM3NzhlNGI4Y2VmM2NhN2FiYWMwOWI5NWM3MDllZTUxYWUxNjhmZWE2M2RjMzM5YTNjNTg0MTk0NjZjZWFlJyArXG4gICAgICAgICAgICAnZWY3ZjYzMjY1MzI2NmQwZTEyMzY0MzFhOTUwY2ZlNTJhNDEwNGY5MzA4YTAxOTI1OGMzMTA0OTM0NGY4NWY4OWQ1JyArXG4gICAgICAgICAgICAnMjI5YjUzMWM4NDU4MzZmOTliMDg2MDFmMTEzYmNlMDM2ZjkzODhmN2IwZjYzMmRlODE0MGZlMzM3ZTYyYTM3ZjM1JyArXG4gICAgICAgICAgICAnNjY1MDBhOTk5MzRjMjIzMWI2Y2I5ZmQ3NTg0YjhlNjcyNTNhZSdcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIG5vdCBjbGFzc2lmeSBibGFuayBzY3JpcHRzIGFzIG5vbnN0YW5kYXJkJywgKCkgPT4ge1xuICAgICAgICBsZXQgdHhiID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlcjxUTnVtYmVyPigpO1xuICAgICAgICB0eGIuc2V0VmVyc2lvbigxKTtcbiAgICAgICAgdHhiLmFkZElucHV0KCdhYTk0YWIwMmMxODIyMTRmMDkwZTk5YTBkNTcwMjFjYWZmZDBmMTk1YTgxYzI0NjAyYjEwMjhiMTMwYjYzZTMxJywgMCk7XG5cbiAgICAgICAgY29uc3QgaW5jb21wbGV0ZSA9IHR4Yi5idWlsZEluY29tcGxldGUoKS50b0hleCgpO1xuICAgICAgICBjb25zdCBpbm5lcktleVBhaXIgPSBFQ1BhaXIuZnJvbVdJRignTDF1eXk1cVR1R3JWWHJtcnN2SFdIZ1Z6VzlrS2RycDI3d0JDN1ZzNm5aRFRGMkJSVVZ3eScpO1xuXG4gICAgICAgIC8vIHNpZ24sIGFzIGV4cGVjdGVkXG4gICAgICAgIHR4Yi5hZGRPdXRwdXQoJzFHb2ttODJ2NkRtdHdLRUI4QWlWaG04Mmh5RlNzRXZCREsnLCB0b0Ftb3VudCgxNTAwMCwgcGFyYW1zLmFtb3VudFR5cGUpIGFzIFROdW1iZXIpO1xuICAgICAgICB0eGIuc2lnbih7XG4gICAgICAgICAgcHJldk91dFNjcmlwdFR5cGU6ICdwMnBraCcsXG4gICAgICAgICAgdmluOiAwLFxuICAgICAgICAgIGtleVBhaXI6IGlubmVyS2V5UGFpcixcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHR4SWQgPSB0eGIuYnVpbGQoKS5nZXRJZCgpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHhJZCwgJzU0ZjA5NzMxNWFjYmFlZGI5MmE5NTQ1NWRhMzM2OGViNDU5ODFjZGFlNWZmYmMzODdhOWFmYzg3MmMwZjI5YjMnKTtcblxuICAgICAgICAvLyBhbmQsIHJlcGVhdFxuICAgICAgICB0eGIgPSBUcmFuc2FjdGlvbkJ1aWxkZXIuZnJvbVRyYW5zYWN0aW9uPFROdW1iZXI+KFRyYW5zYWN0aW9uLmZyb21IZXg8VE51bWJlcj4oaW5jb21wbGV0ZSwgcGFyYW1zLmFtb3VudFR5cGUpKTtcbiAgICAgICAgdHhiLmFkZE91dHB1dCgnMUdva204MnY2RG10d0tFQjhBaVZobTgyaHlGU3NFdkJESycsIHRvQW1vdW50KDE1MDAwLCBwYXJhbXMuYW1vdW50VHlwZSkgYXMgVE51bWJlcik7XG4gICAgICAgIHR4Yi5zaWduKHtcbiAgICAgICAgICBwcmV2T3V0U2NyaXB0VHlwZTogJ3AycGtoJyxcbiAgICAgICAgICB2aW46IDAsXG4gICAgICAgICAga2V5UGFpcjogaW5uZXJLZXlQYWlyLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgdHhJZDIgPSB0eGIuYnVpbGQoKS5nZXRJZCgpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodHhJZCwgdHhJZDIpO1xuICAgICAgICAvLyBUT0RPOiBSZW1vdmUgbWUgaW4gdjZcbiAgICAgICAgaWYgKHBhcmFtcy51c2VPbGRTaWduQXJncykge1xuICAgICAgICAgIGNvbnNvbGUud2FybiA9IGNvbnNvbGVXYXJuO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8vIFRPRE86IFJlbW92ZSBsb29wIGluIHY2XG5mb3IgKGNvbnN0IHVzZU9sZFNpZ25BcmdzIG9mIFtmYWxzZSwgdHJ1ZV0pIHtcbiAgcnVuVGVzdDxudW1iZXI+KFxuICAgIHR4Yl9maXh0dXJlcyxcbiAgICBgVHJhbnNhY3Rpb25CdWlsZGVyOiB1c2VPbGRTaWduQXJncyA9PT0gJHt1c2VPbGRTaWduQXJnc30sIGFtb3VudFR5cGUgPT09IG51bWJlciwgdGVzdEZpeHR1cmUgPT09IHRyYW5zYWN0aW9uX2J1aWxkZXIuanNvbmAsXG4gICAgeyB1c2VPbGRTaWduQXJncywgYW1vdW50VHlwZTogJ251bWJlcicgfVxuICApO1xuICBydW5UZXN0PGJpZ2ludD4oXG4gICAgdHhiX2ZpeHR1cmVzLFxuICAgIGBUcmFuc2FjdGlvbkJ1aWxkZXI6IHVzZU9sZFNpZ25BcmdzID09PSAke3VzZU9sZFNpZ25BcmdzfSwgYW1vdW50VHlwZSA9PT0gYmlnaW50LCB0ZXN0Rml4dHVyZSA9PT0gdHJhbnNhY3Rpb25fYnVpbGRlci5qc29uYCxcbiAgICB7IHVzZU9sZFNpZ25BcmdzLCBhbW91bnRUeXBlOiAnYmlnaW50JyB9XG4gICk7XG4gIHJ1blRlc3Q8YmlnaW50PihcbiAgICB0eGJfYmlnX2ZpeHR1cmVzLFxuICAgIGBUcmFuc2FjdGlvbkJ1aWxkZXI6IHVzZU9sZFNpZ25BcmdzID09PSAke3VzZU9sZFNpZ25BcmdzfSwgYW1vdW50VHlwZSA9PT0gYmlnaW50LCB0ZXN0Rml4dHVyZSA9PT0gdHJhbnNhY3Rpb25fYnVpbGRlcl9iaWdpbnQuanNvbmAsXG4gICAgeyB1c2VPbGRTaWduQXJncywgYW1vdW50VHlwZTogJ2JpZ2ludCcgfVxuICApO1xufVxuIl19Выполнить команду
Для локальной разработки. Не используйте в интернете!