PHP WebShell
Текущая директория: /opt/BitGoJS/modules/bitgo/dist/test/v2/unit/coins
Просмотр файла: ofcToken.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
require("should");
const sdk_test_1 = require("@bitgo/sdk-test");
const bitgo_1 = require("../../../../src/bitgo");
const PRECISION_2 = '100';
const PRECISION_6 = '1000000';
const PRECISION_7 = '10000000';
const PRECISION_8 = '100000000';
const PRECISION_9 = '1000000000';
const PRECISION_15 = '1000000000000000';
const PRECISION_18 = '1000000000000000000';
describe('OFC:', function () {
let bitgo;
let otestusdCoin;
before(function () {
bitgo = sdk_test_1.TestBitGo.decorate(bitgo_1.BitGo, { env: 'test' });
bitgo.initializeTestVars();
otestusdCoin = bitgo.coin('ofctusd');
});
it('test fiat constants for OFCTUSD', function () {
otestusdCoin.getChain().should.equal('ofctusd');
otestusdCoin.getFullName().should.equal('Test USD');
otestusdCoin.getBaseFactor().should.equal(PRECISION_2);
});
it('test fiat constants for OFCTEUR', function () {
const teur = bitgo.coin('ofcteur');
teur.getChain().should.equal('ofcteur');
teur.getFullName().should.equal('Test Euro');
teur.getBaseFactor().should.equal(PRECISION_2);
});
it('test fiat constants for OFCTGBP', function () {
const tgbp = bitgo.coin('ofctgbp');
tgbp.getChain().should.equal('ofctgbp');
tgbp.getFullName().should.equal('Test British Pound Sterling');
tgbp.getBaseFactor().should.equal(PRECISION_2);
});
it('test crypto coins for ofctbtc', function () {
const tbtc = bitgo.coin('ofctbtc');
tbtc.getChain().should.equal('ofctbtc');
tbtc.getFullName().should.equal('Test Bitcoin');
tbtc.getBaseFactor().should.equal(PRECISION_8);
tbtc.isValidAddress('2NBSpUjBQUg4BmWUft8m2VePGDEZ2QBFM7X').should.be.true;
tbtc.isValidAddress('3NBSpUjBQUg4BmWUft8m2VePGDEZ2QBFM7X').should.be.false;
tbtc.isValidAddress('bg-5b2b80eafbdf94d5030bb23f9b56ad64').should.be.true;
tbtc.isValidAddress('bg-5b2b80eafbdf94d5030bb23f9b56ad64nnn').should.be.false;
});
it('test crypto coins for ofcteth', function () {
const teth = bitgo.coin('ofcteth');
teth.getChain().should.equal('ofcteth');
teth.getFullName().should.equal('Test Ether');
teth.getBaseFactor().should.equal(PRECISION_18);
teth.isValidAddress('0x801b2954117cf3439479df391bed2f472e4bd4b8').should.be.true;
teth.isValidAddress('2NBSpUjBQUg4BmWUft8m2VePGDEZ2QBFM7X').should.be.false;
teth.isValidAddress('3NBSpUjBQUg4BmWUft8m2VePGDEZ2QBFM7X').should.be.false;
teth.isValidAddress('bg-5b2b80eafbdf94d5030bb23f9b56ad64').should.be.true;
teth.isValidAddress('bg-5b2b80eafbdf94d5030bb23f9b56ad64nnn').should.be.false;
});
it('test crypto coins for ofcgteth', function () {
const gteth = bitgo.coin('ofcgteth');
gteth.getChain().should.equal('ofcgteth');
gteth.getFullName().should.equal('Test Goerli Ether');
gteth.getBaseFactor().should.equal(PRECISION_18);
gteth.isValidAddress('0x801b2954117cf3439479df391bed2f472e4bd4b8').should.be.true;
gteth.isValidAddress('2NBSpUjBQUg4BmWUft8m2VePGDEZ2QBFM7X').should.be.false;
gteth.isValidAddress('3NBSpUjBQUg4BmWUft8m2VePGDEZ2QBFM7X').should.be.false;
gteth.isValidAddress('bg-5b2b80eafbdf94d5030bb23f9b56ad64').should.be.true;
gteth.isValidAddress('bg-5b2b80eafbdf94d5030bb23f9b56ad64nnn').should.be.false;
});
it('test crypto coins for ofcavaxc', function () {
const validAddress = '0x1374a2046661f914d1687d85dbbceb9ac7910a29';
const notValidAddress01 = 'x1374a2046661f914d1687d85dbbceb9ac7910a29';
const notValidAddress02 = '0x1374a2046661f914d1687d85dbbceb9ac7910a291234';
const ofcavaxc = bitgo.coin('ofcavaxc');
ofcavaxc.getChain().should.equal('ofcavaxc');
ofcavaxc.getFullName().should.equal('Avalanche C-Chain');
ofcavaxc.getBaseFactor().should.equal(PRECISION_18);
ofcavaxc.isValidAddress(validAddress).should.be.true;
ofcavaxc.isValidAddress(notValidAddress01).should.be.false;
ofcavaxc.isValidAddress(notValidAddress02).should.be.false;
});
it('test crypto coins for ofctavaxc', function () {
const validAddress = '0x1374a2046661f914d1687d85dbbceb9ac7910a29';
const notValidAddress01 = 'x1374a2046661f914d1687d85dbbceb9ac7910a29';
const notValidAddress02 = '0x1374a2046661f914d1687d85dbbceb9ac7910a291234';
const ofctavaxc = bitgo.coin('ofctavaxc');
ofctavaxc.getChain().should.equal('ofctavaxc');
ofctavaxc.getFullName().should.equal('Test Avalanche C-Chain');
ofctavaxc.getBaseFactor().should.equal(PRECISION_18);
ofctavaxc.isValidAddress(validAddress).should.be.true;
ofctavaxc.isValidAddress(notValidAddress01).should.be.false;
ofctavaxc.isValidAddress(notValidAddress02).should.be.false;
});
it('test crypto coins for ofcterc', function () {
const validAddress = '0x1A88Ee4Bc80BE080fC91AC472Af2F59260695060';
const notValidAddress01 = '0x1A88Ee4Bc80BE080fC91AC472Af2F592606950601';
const notValidAddress02 = 'x1374a2046661f914d1687d85dbbceb9ac7910a29';
const notValidAddress03 = '0x1374a2046661f914d1687d85dbbceb9ac7910a291234';
const ofcterc = bitgo.coin('ofcterc');
ofcterc.getChain().should.equal('ofcterc');
ofcterc.getFullName().should.equal('Test ERC Token');
ofcterc.getBaseFactor().should.equal(PRECISION_18);
ofcterc.isValidAddress(validAddress).should.be.true;
ofcterc.isValidAddress(notValidAddress01).should.be.false;
ofcterc.isValidAddress(notValidAddress02).should.be.false;
ofcterc.isValidAddress(notValidAddress03).should.be.false;
});
it('test crypto coins for ofcsol', function () {
const sol = bitgo.coin('ofcsol');
sol.getChain().should.equal('ofcsol');
sol.getFullName().should.equal('Solana');
sol.getBaseFactor().should.equal(PRECISION_9);
sol.isValidAddress('5f8WmC2uW9SAk7LMX2r4G1Bx8MMwx8sdgpotyHGodiZo').should.be.true;
sol.isValidAddress('2NBSpUjBQUg4BmWUft8m2VePGDEZ2QBFM7X').should.be.false;
});
describe('check ofc tokens for Casper network', function () {
describe('for main network', function () {
const coin = 'ofccspr';
it(`should have the correct values for ${coin}`, function () {
const ofcCoin = bitgo.coin(coin);
ofcCoin.getChain().should.equal(coin);
ofcCoin.getFullName().should.equal('Casper');
ofcCoin.getBaseFactor().should.equal(PRECISION_9);
});
});
describe('for test network', function () {
const coin = 'ofctcspr';
it(`should have the correct values for ${coin}`, function () {
const ofcCoin = bitgo.coin(coin);
ofcCoin.getChain().should.equal(coin);
ofcCoin.getFullName().should.equal('Test Casper');
ofcCoin.getBaseFactor().should.equal(PRECISION_9);
});
});
describe('- validate addresses - ', () => {
const validAddressRootAccount = 'd632e4ed12fd838e361bcd1982da9a43b903631be38b3ed698559603c2e9faf6';
const validAddressAccount1 = 'b256507dd71d76c69c0f889190dc4a4b7513c273eb80e4b8bf08ee79f8358149';
const validAddressAccount2 = '5950aa8f6f73122be17770a1b7c6f10f047c892ab980ed55c9c7eda8d928633d';
const validAddressAccount3 = '1dffe6461886c677428855b80e47ae8fa6c9efce8f6a74529eb3ded680cdd9ec';
const validAddressAccount4 = '468f5e33c352efaaa0329a1972a632e1c3e430d4e4a8ab73c2d67c4bacb3fb65';
const notValidAddress01 = 'b256507dd71d76c69c0f889190dc4a4b7513c273eb80e4b8bf08ee79f8358149111';
for (const coin of ['ofccspr', 'ofctcspr']) {
it(`should ${coin} be configured with right addresses`, function () {
const ofcCoin = bitgo.coin(coin);
ofcCoin.isValidAddress(validAddressRootAccount).should.be.true;
ofcCoin.isValidAddress(validAddressAccount1).should.be.true;
ofcCoin.isValidAddress(validAddressAccount2).should.be.true;
ofcCoin.isValidAddress(validAddressAccount3).should.be.true;
ofcCoin.isValidAddress(validAddressAccount4).should.be.true;
ofcCoin.isValidAddress(notValidAddress01).should.be.false;
});
}
});
});
describe('check ofc tokens for Near network', function () {
describe('for main network', function () {
const coin = 'ofcnear';
it(`should have the correct values for ${coin}`, function () {
const ofcCoin = bitgo.coin(coin);
ofcCoin.getChain().should.equal(coin);
ofcCoin.getFullName().should.equal('Near');
ofcCoin.getBaseFactor().should.equal('1e+24');
});
});
describe('for test network', function () {
const coin = 'ofctnear';
it(`should have the correct values for ${coin}`, function () {
const ofcCoin = bitgo.coin(coin);
ofcCoin.getChain().should.equal(coin);
ofcCoin.getFullName().should.equal('Test Near');
ofcCoin.getBaseFactor().should.equal('1e+24');
});
});
});
describe('check ofc tokens for Stacks network', function () {
const coinMain = 'ofcstx';
const coinTest = 'ofctstx';
describe('for main network', function () {
it(`should have the correct values for ${coinMain}`, function () {
const ofcCoin = bitgo.coin(coinMain);
ofcCoin.getChain().should.equal(coinMain);
ofcCoin.getFullName().should.equal('Stacks');
ofcCoin.getBaseFactor().should.equal(PRECISION_6);
});
});
describe('for test network', function () {
it(`should have the correct values for ${coinTest}`, function () {
const ofcCoin = bitgo.coin(coinTest);
ofcCoin.getChain().should.equal(coinTest);
ofcCoin.getFullName().should.equal('Test Stacks');
ofcCoin.getBaseFactor().should.equal(PRECISION_6);
});
});
describe('- validate addresses - ', () => {
const validAddressAccount1 = 'SP10FDHQQ4F2F0KHMN6Z24RMAMGX5933SQJCWKAAR';
const validAddressAccount2 = 'SPS4HSXAD1WSD3943WZ52MPSY9WPK56SDG54HTAR';
const notValidAddress01 = 'SPS4HSXAD1WSD3943WZ52MPSY9WPK56SDG54HTARXXX';
const notValidAddress02 = 'SPS4HSXAD1WSD3943WZ52MPSY9WPK56SDG54H';
for (const coin of [coinMain, coinTest]) {
it(`should ${coin} be configured with right addresses`, function () {
const ofcCoin = bitgo.coin(coin);
ofcCoin.isValidAddress(validAddressAccount1).should.be.true;
ofcCoin.isValidAddress(validAddressAccount2).should.be.true;
ofcCoin.isValidAddress(notValidAddress01).should.be.false;
ofcCoin.isValidAddress(notValidAddress02).should.be.false;
});
}
});
});
describe('check ofc tokens for Algorand USDC', function () {
const tokenMain = 'ofcalgo:usdc';
const tokenTest = 'ofctalgo:usdc';
describe('for main network', function () {
it(`should have the correct values for ${tokenMain}`, function () {
const ofcCoin = bitgo.coin(tokenMain);
ofcCoin.getChain().should.equal(tokenMain);
ofcCoin.getFullName().should.equal('Algorand USDC');
ofcCoin.getBaseFactor().should.equal(PRECISION_6);
});
});
describe('for test network', function () {
it(`should have the correct values for ${tokenTest}`, function () {
const ofcCoin = bitgo.coin(tokenTest);
ofcCoin.getChain().should.equal(tokenTest);
ofcCoin.getFullName().should.equal('Test Algorand USDC');
ofcCoin.getBaseFactor().should.equal(PRECISION_6);
});
});
});
describe('check ofc tokens for Hedera USDC', function () {
const tokenMain = 'ofchbar:usdc';
const tokenTest = 'ofcthbar:usdc';
describe('for main network', function () {
it(`should have the correct values for ${tokenMain}`, function () {
const ofcCoin = bitgo.coin(tokenMain);
ofcCoin.getChain().should.equal(tokenMain);
ofcCoin.getFullName().should.equal('Mainnet Hedera USD Coin');
ofcCoin.getBaseFactor().should.equal(PRECISION_6);
});
});
describe('for test network', function () {
it(`should have the correct values for ${tokenTest}`, function () {
const ofcCoin = bitgo.coin(tokenTest);
ofcCoin.getChain().should.equal(tokenTest);
ofcCoin.getFullName().should.equal('Testnet Hedera USD Coin');
ofcCoin.getBaseFactor().should.equal(PRECISION_6);
});
});
});
describe('check ofc tokens for Stellar USDC', function () {
const tokenMain = 'ofcxlm:usdc';
const tokenTest = 'ofctxlm:tst';
describe('for main network', function () {
it(`should have the correct values for ${tokenMain}`, function () {
const ofcCoin = bitgo.coin(tokenMain);
ofcCoin.getChain().should.equal(tokenMain);
ofcCoin.getFullName().should.equal('Stellar USDC');
ofcCoin.getBaseFactor().should.equal(PRECISION_7);
});
});
describe('for test network', function () {
it(`should have the correct values for ${tokenTest}`, function () {
const ofcCoin = bitgo.coin(tokenTest);
ofcCoin.getChain().should.equal(tokenTest);
ofcCoin.getFullName().should.equal('Test Stellar BitGo Test Token');
ofcCoin.getBaseFactor().should.equal(PRECISION_7);
});
});
});
describe('check ofc tokens for arbethErc20', function () {
const tokenMain = 'ofcarbeth:link';
const tokenTest = 'ofctarbeth:link';
describe('for main network', function () {
it(`should have the correct values for ${tokenMain}`, function () {
const ofcCoin = bitgo.coin(tokenMain);
ofcCoin.getChain().should.equal(tokenMain);
ofcCoin.getFullName().should.equal('Chainlink Token');
ofcCoin.getBaseFactor().should.equal(PRECISION_18);
});
});
describe('for test network', function () {
it(`should have the correct values for ${tokenTest}`, function () {
const ofcCoin = bitgo.coin(tokenTest);
ofcCoin.getChain().should.equal(tokenTest);
ofcCoin.getFullName().should.equal('Arbitrum Test LINK');
ofcCoin.getBaseFactor().should.equal(PRECISION_18);
});
});
});
describe('check ofc tokens for avaxErc20', function () {
const tokenMain = 'ofcavaxc:link';
const tokenTest = 'ofctavaxc:link';
describe('for main network', function () {
it(`should have the correct values for ${tokenMain}`, function () {
const ofcCoin = bitgo.coin(tokenMain);
ofcCoin.getChain().should.equal(tokenMain);
ofcCoin.getFullName().should.equal('Chainlink');
ofcCoin.getBaseFactor().should.equal(PRECISION_18);
});
});
describe('for test network', function () {
it(`should have the correct values for ${tokenTest}`, function () {
const ofcCoin = bitgo.coin(tokenTest);
ofcCoin.getChain().should.equal(tokenTest);
ofcCoin.getFullName().should.equal('Test Chainlink');
ofcCoin.getBaseFactor().should.equal(PRECISION_18);
});
});
});
describe('check ofc tokens for solana', function () {
const tokenMain = 'ofcsol:hnt';
const tokenTest = 'ofctsol:hnt';
describe('for main network', function () {
it(`should have the correct values for ${tokenMain}`, function () {
const ofcCoin = bitgo.coin(tokenMain);
ofcCoin.getChain().should.equal(tokenMain);
ofcCoin.getFullName().should.equal('Helium Network Token');
ofcCoin.getBaseFactor().should.equal(PRECISION_8);
});
});
describe('for test network', function () {
it(`should have the correct values for ${tokenTest}`, function () {
const ofcCoin = bitgo.coin(tokenTest);
ofcCoin.getChain().should.equal(tokenTest);
ofcCoin.getFullName().should.equal('testnet Helium Network Token');
ofcCoin.getBaseFactor().should.equal(PRECISION_8);
});
});
});
describe('check ofc tokens for solana', function () {
const tokenMain = 'ofcsol:gari';
const tokenTest = 'ofctsol:gari';
describe('for main network', function () {
it(`should have the correct values for ${tokenMain}`, function () {
const ofcCoin = bitgo.coin(tokenMain);
ofcCoin.getChain().should.equal(tokenMain);
ofcCoin.getFullName().should.equal('GARI');
ofcCoin.getBaseFactor().should.equal(PRECISION_9);
});
});
describe('for test network', function () {
it(`should have the correct values for ${tokenTest}`, function () {
const ofcCoin = bitgo.coin(tokenTest);
ofcCoin.getChain().should.equal(tokenTest);
ofcCoin.getFullName().should.equal('testnet Gari Token');
ofcCoin.getBaseFactor().should.equal(PRECISION_9);
});
});
});
it('can sign payloads', async function () {
const inputParams = {
txPrebuild: {
payload: '{"token":"otestusd"}',
},
prv: 'xprv9s21ZrQH143K3WG4of3nSYUC55XNFCgZTyghae9cMSFDkcKU7YJgTahJMpdTY9CjCcjgSo2TJ635uUVx176BufUMBFpieKYVJD9J3VvrGRm',
};
const expectedResult = {
halfSigned: {
payload: '{"token":"otestusd"}',
signature: '2049b94a22c69650ad9529767da993a23c078347fdf7d887409793dce8d07190e108a846869edf387d294cd75c6c770a12847615b2553b22a61de29be5d91770dd',
},
};
const signedResult = await otestusdCoin.signTransaction(inputParams);
signedResult.should.deepEqual(expectedResult);
});
describe('check ofc tokens for polygonErc20', function () {
const tokenMain = 'ofcpolygon:link';
const tokenTest = 'ofctpolygon:link';
describe('for main network', function () {
it(`should have the correct values for ${tokenMain}`, function () {
const ofcCoin = bitgo.coin(tokenMain);
ofcCoin.getChain().should.equal(tokenMain);
ofcCoin.getFullName().should.equal('ChainLink Token');
ofcCoin.getBaseFactor().should.equal(PRECISION_18);
});
});
describe('for test network', function () {
it(`should have the correct values for ${tokenTest}`, function () {
const ofcCoin = bitgo.coin(tokenTest);
ofcCoin.getChain().should.equal(tokenTest);
ofcCoin.getFullName().should.equal('Polygon Test LINK');
ofcCoin.getBaseFactor().should.equal(PRECISION_18);
});
});
});
describe('check ofc tokens for bsc tokens', function () {
const tokenMain = 'ofcbsc:cfx';
describe('for main network', function () {
it(`should have the correct values for ${tokenMain}`, function () {
const ofcCoin = bitgo.coin(tokenMain);
ofcCoin.getChain().should.equal(tokenMain);
ofcCoin.getFullName().should.equal('BSC Conflux');
ofcCoin.getBaseFactor().should.equal(PRECISION_18);
});
});
});
describe('check ofc tokens for ripple', function () {
const tokenMain = 'ofcxrp:rlusd';
const tokenTest = 'ofctxrp:rlusd';
describe('for main network', function () {
it(`should have the correct values for ${tokenMain}`, function () {
const ofcCoin = bitgo.coin(tokenMain);
ofcCoin.getChain().should.equal(tokenMain);
ofcCoin.getFullName().should.equal('Ripple USD');
ofcCoin.getBaseFactor().should.equal(PRECISION_15);
});
});
describe('for test network', function () {
it(`should have the correct values for ${tokenTest}`, function () {
const ofcCoin = bitgo.coin(tokenTest);
ofcCoin.getChain().should.equal(tokenTest);
ofcCoin.getFullName().should.equal('RLUSD');
ofcCoin.getBaseFactor().should.equal(PRECISION_15);
});
});
});
describe('check ofc tokens for opethErc20', function () {
const tokenMain = 'ofcopeth:op';
describe('for main network', function () {
it(`should have the correct values for ${tokenMain}`, function () {
const ofcCoin = bitgo.coin(tokenMain);
ofcCoin.getChain().should.equal(tokenMain);
ofcCoin.getFullName().should.equal('Optimism');
ofcCoin.getBaseFactor().should.equal(PRECISION_18);
});
});
});
describe('check ofc tokens for trx tokens', function () {
const tokenMain = 'ofctrx:usdt';
const tokenTest = 'ofcttrx:usdt';
describe('for main network', function () {
it(`should have the correct values for ${tokenMain}`, function () {
const ofcCoin = bitgo.coin(tokenMain);
ofcCoin.getChain().should.equal(tokenMain);
ofcCoin.getFullName().should.equal('Tether USD');
ofcCoin.getBaseFactor().should.equal(PRECISION_6);
});
});
describe('for test network', function () {
it(`should have the correct values for ${tokenTest}`, function () {
const ofcCoin = bitgo.coin(tokenTest);
ofcCoin.getChain().should.equal(tokenTest);
ofcCoin.getFullName().should.equal('Tether USD');
ofcCoin.getBaseFactor().should.equal(PRECISION_6);
});
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZjVG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3YyL3VuaXQvY29pbnMvb2ZjVG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxrQkFBZ0I7QUFDaEIsOENBQTRDO0FBQzVDLGlEQUE4QztBQUU5QyxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUM7QUFDMUIsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDO0FBQzlCLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQztBQUMvQixNQUFNLFdBQVcsR0FBRyxXQUFXLENBQUM7QUFDaEMsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDO0FBQ2pDLE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDO0FBQ3hDLE1BQU0sWUFBWSxHQUFHLHFCQUFxQixDQUFDO0FBRTNDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7SUFDZixJQUFJLEtBQUssQ0FBQztJQUNWLElBQUksWUFBWSxDQUFDO0lBRWpCLE1BQU0sQ0FBQztRQUNMLEtBQUssR0FBRyxvQkFBUyxDQUFDLFFBQVEsQ0FBQyxhQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNuRCxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMzQixZQUFZLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN2QyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRTtRQUNwQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNoRCxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwRCxZQUFZLENBQUMsYUFBYSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN6RCxDQUFDLENB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QWtCLEVBQUU7WUFDM0IsRUFBRSxDQUFDLHNDQUFzQyxTQUFTLEVBQUUsRUFBRTtnQkFDcEQsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDdEMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzNDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUNqRCxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNwRCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsUUFBUSxDQUFDLGtCQUFrQixFQUFFO1lBQzNCLEVBQUUsQ0FBQyxzQ0FBc0MsU0FBUyxFQUFFLEVBQUU7Z0JBQ3BELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3RDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMzQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDakQsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDcEQsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgeyBUZXN0Qml0R28gfSBmcm9tICdAYml0Z28vc2RrLXRlc3QnO1xuaW1wb3J0IHsgQml0R28gfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvYml0Z28nO1xuXG5jb25zdCBQUkVDSVNJT05fMiA9ICcxMDAnO1xuY29uc3QgUFJFQ0lTSU9OXzYgPSAnMTAwMDAwMCc7XG5jb25zdCBQUkVDSVNJT05fNyA9ICcxMDAwMDAwMCc7XG5jb25zdCBQUkVDSVNJT05fOCA9ICcxMDAwMDAwMDAnO1xuY29uc3QgUFJFQ0lTSU9OXzkgPSAnMTAwMDAwMDAwMCc7XG5jb25zdCBQUkVDSVNJT05fMTUgPSAnMTAwMDAwMDAwMDAwMDAwMCc7XG5jb25zdCBQUkVDSVNJT05fMTggPSAnMTAwMDAwMDAwMDAwMDAwMDAwMCc7XG5cbmRlc2NyaWJlKCdPRkM6JywgZnVuY3Rpb24gKCkge1xuICBsZXQgYml0Z287XG4gIGxldCBvdGVzdHVzZENvaW47XG5cbiAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHbywgeyBlbnY6ICd0ZXN0JyB9KTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICBvdGVzdHVzZENvaW4gPSBiaXRnby5jb2luKCdvZmN0dXNkJyk7XG4gIH0pO1xuXG4gIGl0KCd0ZXN0IGZpYXQgY29uc3RhbnRzIGZvciBPRkNUVVNEJywgZnVuY3Rpb24gKCkge1xuICAgIG90ZXN0dXNkQ29pbi5nZXRDaGFpbigpLnNob3VsZC5lcXVhbCgnb2ZjdHVzZCcpO1xuICAgIG90ZXN0dXNkQ29pbi5nZXRGdWxsTmFtZSgpLnNob3VsZC5lcXVhbCgnVGVzdCBVU0QnKTtcbiAgICBvdGVzdHVzZENvaW4uZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbChQUkVDSVNJT05fMik7XG4gIH0pO1xuXG4gIGl0KCd0ZXN0IGZpYXQgY29uc3RhbnRzIGZvciBPRkNURVVSJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHRldXIgPSBiaXRnby5jb2luKCdvZmN0ZXVyJyk7XG4gICAgdGV1ci5nZXRDaGFpbigpLnNob3VsZC5lcXVhbCgnb2ZjdGV1cicpO1xuICAgIHRldXIuZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ1Rlc3QgRXVybycpO1xuICAgIHRldXIuZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbChQUkVDSVNJT05fMik7XG4gIH0pO1xuXG4gIGl0KCd0ZXN0IGZpYXQgY29uc3RhbnRzIGZvciBPRkNUR0JQJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHRnYnAgPSBiaXRnby5jb2luKCdvZmN0Z2JwJyk7XG4gICAgdGdicC5nZXRDaGFpbigpLnNob3VsZC5lcXVhbCgnb2ZjdGdicCcpO1xuICAgIHRnYnAuZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ1Rlc3QgQnJpdGlzaCBQb3VuZCBTdGVybGluZycpO1xuICAgIHRnYnAuZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbChQUkVDSVNJT05fMik7XG4gIH0pO1xuXG4gIGl0KCd0ZXN0IGNyeXB0byBjb2lucyBmb3Igb2ZjdGJ0YycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0YnRjID0gYml0Z28uY29pbignb2ZjdGJ0YycpO1xuICAgIHRidGMuZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwoJ29mY3RidGMnKTtcbiAgICB0YnRjLmdldEZ1bGxOYW1lKCkuc2hvdWxkLmVxdWFsKCdUZXN0IEJpdGNvaW4nKTtcbiAgICB0YnRjLmdldEJhc2VGYWN0b3IoKS5zaG91bGQuZXF1YWwoUFJFQ0lTSU9OXzgpO1xuICAgIHRidGMuaXNWYWxpZEFkZHJlc3MoJzJOQlNwVWpCUVVnNEJtV1VmdDhtMlZlUEdERVoyUUJGTTdYJykuc2hvdWxkLmJlLnRydWU7XG4gICAgdGJ0Yy5pc1ZhbGlkQWRkcmVzcygnM05CU3BVakJRVWc0Qm1XVWZ0OG0yVmVQR0RFWjJRQkZNN1gnKS5zaG91bGQuYmUuZmFsc2U7XG4gICAgdGJ0Yy5pc1ZhbGlkQWRkcmVzcygnYmctNWIyYjgwZWFmYmRmOTRkNTAzMGJiMjNmOWI1NmFkNjQnKS5zaG91bGQuYmUudHJ1ZTtcbiAgICB0YnRjLmlzVmFsaWRBZGRyZXNzKCdiZy01YjJiODBlYWZiZGY5NGQ1MDMwYmIyM2Y5YjU2YWQ2NG5ubicpLnNob3VsZC5iZS5mYWxzZTtcbiAgfSk7XG5cbiAgaXQoJ3Rlc3QgY3J5cHRvIGNvaW5zIGZvciBvZmN0ZXRoJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHRldGggPSBiaXRnby5jb2luKCdvZmN0ZXRoJyk7XG4gICAgdGV0aC5nZXRDaGFpbigpLnNob3VsZC5lcXVhbCgnb2ZjdGV0aCcpO1xuICAgIHRldGguZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ1Rlc3QgRXRoZXInKTtcbiAgICB0ZXRoLmdldEJhc2VGYWN0b3IoKS5zaG91bGQuZXF1YWwoUFJFQ0lTSU9OXzE4KTtcbiAgICB0ZXRoLmlzVmFsaWRBZGRyZXNzKCcweDgwMWIyOTU0MTE3Y2YzNDM5NDc5ZGYzOTFiZWQyZjQ3MmU0YmQ0YjgnKS5zaG91bGQuYmUudHJ1ZTtcbiAgICB0ZXRoLmlzVmFsaWRBZGRyZXNzKCcyTkJTcFVqQlFVZzRCbVdVZnQ4bTJWZVBHREVaMlFCRk03WCcpLnNob3VsZC5iZS5mYWxzZTtcbiAgICB0ZXRoLmlzVmFsaWRBZGRyZXNzKCczTkJTcFVqQlFVZzRCbVdVZnQ4bTJWZVBHREVaMlFCRk03WCcpLnNob3VsZC5iZS5mYWxzZTtcbiAgICB0ZXRoLmlzVmFsaWRBZGRyZXNzKCdiZy01YjJiODBlYWZiZGY5NGQ1MDMwYmIyM2Y5YjU2YWQ2NCcpLnNob3VsZC5iZS50cnVlO1xuICAgIHRldGguaXNWYWxpZEFkZHJlc3MoJ2JnLTViMmI4MGVhZmJkZjk0ZDUwMzBiYjIzZjliNTZhZDY0bm5uJykuc2hvdWxkLmJlLmZhbHNlO1xuICB9KTtcblxuICBpdCgndGVzdCBjcnlwdG8gY29pbnMgZm9yIG9mY2d0ZXRoJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGd0ZXRoID0gYml0Z28uY29pbignb2ZjZ3RldGgnKTtcbiAgICBndGV0aC5nZXRDaGFpbigpLnNob3VsZC5lcXVhbCgnb2ZjZ3RldGgnKTtcbiAgICBndGV0aC5nZXRGdWxsTmFtZSgpLnNob3VsZC5lcXVhbCgnVGVzdCBHb2VybGkgRXRoZXInKTtcbiAgICBndGV0aC5nZXRCYXNlRmFjdG9yKCkuc2hvdWxkLmVxdWFsKFBSRUNJU0lPTl8xOCk7XG4gICAgZ3RldGguaXNWYWxpZEFkZHJlc3MoJzB4ODAxYjI5NTQxMTdjZjM0Mzk0NzlkZjM5MWJlZDJmNDcyZTRiZDRiOCcpLnNob3VsZC5iZS50cnVlO1xuICAgIGd0ZXRoLmlzVmFsaWRBZGRyZXNzKCcyTkJTcFVqQlFVZzRCbVdVZnQ4bTJWZVBHREVaMlFCRk03WCcpLnNob3VsZC5iZS5mYWxzZTtcbiAgICBndGV0aC5pc1ZhbGlkQWRkcmVzcygnM05CU3BVakJRVWc0Qm1XVWZ0OG0yVmVQR0RFWjJRQkZNN1gnKS5zaG91bGQuYmUuZmFsc2U7XG4gICAgZ3RldGguaXNWYWxpZEFkZHJlc3MoJ2JnLTViMmI4MGVhZmJkZjk0ZDUwMzBiYjIzZjliNTZhZDY0Jykuc2hvdWxkLmJlLnRydWU7XG4gICAgZ3RldGguaXNWYWxpZEFkZHJlc3MoJ2JnLTViMmI4MGVhZmJkZjk0ZDUwMzBiYjIzZjliNTZhZDY0bm5uJykuc2hvdWxkLmJlLmZhbHNlO1xuICB9KTtcblxuICBpdCgndGVzdCBjcnlwdG8gY29pbnMgZm9yIG9mY2F2YXhjJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHZhbGlkQWRkcmVzcyA9ICcweDEzNzRhMjA0NjY2MWY5MTRkMTY4N2Q4NWRiYmNlYjlhYzc5MTBhMjknO1xuICAgIGNvbnN0IG5vdFZhbGlkQWRkcmVzczAxID0gJ3gxMzc0YTIwNDY2NjFmOTE0ZDE2ODdkODVkYmJjZWI5YWM3OTEwYTI5JztcbiAgICBjb25zdCBub3RWYWxpZEFkZHJlc3MwMiA9ICcweDEzNzRhMjA0NjY2MWY5MTRkMTY4N2Q4NWRiYmNlYjlhYzc5MTBhMjkxMjM0JztcbiAgICBjb25zdCBvZmNhdmF4YyA9IGJpdGdvLmNvaW4oJ29mY2F2YXhjJyk7XG4gICAgb2ZjYXZheGMuZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwoJ29mY2F2YXhjJyk7XG4gICAgb2ZjYXZheGMuZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ0F2YWxhbmNoZSBDLUNoYWluJyk7XG4gICAgb2ZjYXZheGMuZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbChQUkVDSVNJT05fMTgpO1xuICAgIG9mY2F2YXhjLmlzVmFsaWRBZGRyZXNzKHZhbGlkQWRkcmVzcykuc2hvdWxkLmJlLnRydWU7XG4gICAgb2ZjYXZheGMuaXNWYWxpZEFkZHJlc3Mobm90VmFsaWRBZGRyZXNzMDEpLnNob3VsZC5iZS5mYWxzZTtcbiAgICBvZmNhdmF4Yy5pc1ZhbGlkQWRkcmVzcyhub3RWYWxpZEFkZHJlc3MwMikuc2hvdWxkLmJlLmZhbHNlO1xuICB9KTtcblxuICBpdCgndGVzdCBjcnlwdG8gY29pbnMgZm9yIG9mY3RhdmF4YycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB2YWxpZEFkZHJlc3MgPSAnMHgxMzc0YTIwNDY2NjFmOTE0ZDE2ODdkODVkYmJjZWI5YWM3OTEwYTI5JztcbiAgICBjb25zdCBub3RWYWxpZEFkZHJlc3MwMSA9ICd4MTM3NGEyMDQ2NjYxZjkxNGQxNjg3ZDg1ZGJiY2ViOWFjNzkxMGEyOSc7XG4gICAgY29uc3Qgbm90VmFsaWRBZGRyZXNzMDIgPSAnMHgxMzc0YTIwNDY2NjFmOTE0ZDE2ODdkODVkYmJjZWI5YWM3OTEwYTI5MTIzNCc7XG4gICAgY29uc3Qgb2ZjdGF2YXhjID0gYml0Z28uY29pbignb2ZjdGF2YXhjJyk7XG4gICAgb2ZjdGF2YXhjLmdldENoYWluKCkuc2hvdWxkLmVxdWFsKCdvZmN0YXZheGMnKTtcbiAgICBvZmN0YXZheGMuZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ1Rlc3QgQXZhbGFuY2hlIEMtQ2hhaW4nKTtcbiAgICBvZmN0YXZheGMuZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbChQUkVDSVNJT05fMTgpO1xuICAgIG9mY3RhdmF4Yy5pc1ZhbGlkQWRkcmVzcyh2YWxpZEFkZHJlc3MpLnNob3VsZC5iZS50cnVlO1xuICAgIG9mY3RhdmF4Yy5pc1ZhbGlkQWRkcmVzcyhub3RWYWxpZEFkZHJlc3MwMSkuc2hvdWxkLmJlLmZhbHNlO1xuICAgIG9mY3RhdmF4Yy5pc1ZhbGlkQWRkcmVzcyhub3RWYWxpZEFkZHJlc3MwMikuc2hvdWxkLmJlLmZhbHNlO1xuICB9KTtcblxuICBpdCgndGVzdCBjcnlwdG8gY29pbnMgZm9yIG9mY3RlcmMnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdmFsaWRBZGRyZXNzID0gJzB4MUE4OEVlNEJjODBCRTA4MGZDOTFBQzQ3MkFmMkY1OTI2MDY5NTA2MCc7XG4gICAgY29uc3Qgbm90VmFsaWRBZGRyZXNzMDEgPSAnMHgxQTg4RWU0QmM4MEJFMDgwZkM5MUFDNDcyQWYyRjU5MjYwNjk1MDYwMSc7XG4gICAgY29uc3Qgbm90VmFsaWRBZGRyZXNzMDIgPSAneDEzNzRhMjA0NjY2MWY5MTRkMTY4N2Q4NWRiYmNlYjlhYzc5MTBhMjknO1xuICAgIGNvbnN0IG5vdFZhbGlkQWRkcmVzczAzID0gJzB4MTM3NGEyMDQ2NjYxZjkxNGQxNjg3ZDg1ZGJiY2ViOWFjNzkxMGEyOTEyMzQnO1xuICAgIGNvbnN0IG9mY3RlcmMgPSBiaXRnby5jb2luKCdvZmN0ZXJjJyk7XG4gICAgb2ZjdGVyYy5nZXRDaGFpbigpLnNob3VsZC5lcXVhbCgnb2ZjdGVyYycpO1xuICAgIG9mY3RlcmMuZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ1Rlc3QgRVJDIFRva2VuJyk7XG4gICAgb2ZjdGVyYy5nZXRCYXNlRmFjdG9yKCkuc2hvdWxkLmVxdWFsKFBSRUNJU0lPTl8xOCk7XG4gICAgb2ZjdGVyYy5pc1ZhbGlkQWRkcmVzcyh2YWxpZEFkZHJlc3MpLnNob3VsZC5iZS50cnVlO1xuICAgIG9mY3RlcmMuaXNWYWxpZEFkZHJlc3Mobm90VmFsaWRBZGRyZXNzMDEpLnNob3VsZC5iZS5mYWxzZTtcbiAgICBvZmN0ZXJjLmlzVmFsaWRBZGRyZXNzKG5vdFZhbGlkQWRkcmVzczAyKS5zaG91bGQuYmUuZmFsc2U7XG4gICAgb2ZjdGVyYy5pc1ZhbGlkQWRkcmVzcyhub3RWYWxpZEFkZHJlc3MwMykuc2hvdWxkLmJlLmZhbHNlO1xuICB9KTtcblxuICBpdCgndGVzdCBjcnlwdG8gY29pbnMgZm9yIG9mY3NvbCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBzb2wgPSBiaXRnby5jb2luKCdvZmNzb2wnKTtcbiAgICBzb2wuZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwoJ29mY3NvbCcpO1xuICAgIHNvbC5nZXRGdWxsTmFtZSgpLnNob3VsZC5lcXVhbCgnU29sYW5hJyk7XG4gICAgc29sLmdldEJhc2VGYWN0b3IoKS5zaG91bGQuZXF1YWwoUFJFQ0lTSU9OXzkpO1xuICAgIHNvbC5pc1ZhbGlkQWRkcmVzcygnNWY4V21DMnVXOVNBazdMTVgycjRHMUJ4OE1Nd3g4c2RncG90eUhHb2RpWm8nKS5zaG91bGQuYmUudHJ1ZTtcbiAgICBzb2wuaXNWYWxpZEFkZHJlc3MoJzJOQlNwVWpCUVVnNEJtV1VmdDhtMlZlUEdERVoyUUJGTTdYJykuc2hvdWxkLmJlLmZhbHNlO1xuICB9KTtcblxuICBkZXNjcmliZSgnY2hlY2sgb2ZjIHRva2VucyBmb3IgQ2FzcGVyIG5ldHdvcmsnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVzY3JpYmUoJ2ZvciBtYWluIG5ldHdvcmsnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjb2luID0gJ29mY2NzcHInO1xuICAgICAgaXQoYHNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlcyBmb3IgJHtjb2lufWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgb2ZjQ29pbiA9IGJpdGdvLmNvaW4oY29pbik7XG4gICAgICAgIG9mY0NvaW4uZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwoY29pbik7XG4gICAgICAgIG9mY0NvaW4uZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ0Nhc3BlcicpO1xuICAgICAgICBvZmNDb2luLmdldEJhc2VGYWN0b3IoKS5zaG91bGQuZXF1YWwoUFJFQ0lTSU9OXzkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgZGVzY3JpYmUoJ2ZvciB0ZXN0IG5ldHdvcmsnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjb2luID0gJ29mY3Rjc3ByJztcbiAgICAgIGl0KGBzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZXMgZm9yICR7Y29pbn1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IG9mY0NvaW4gPSBiaXRnby5jb2luKGNvaW4pO1xuICAgICAgICBvZmNDb2luLmdldENoYWluKCkuc2hvdWxkLmVxdWFsKGNvaW4pO1xuICAgICAgICBvZmNDb2luLmdldEZ1bGxOYW1lKCkuc2hvdWxkLmVxdWFsKCdUZXN0IENhc3BlcicpO1xuICAgICAgICBvZmNDb2luLmdldEJhc2VGYWN0b3IoKS5zaG91bGQuZXF1YWwoUFJFQ0lTSU9OXzkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgZGVzY3JpYmUoJy0gdmFsaWRhdGUgYWRkcmVzc2VzIC0gJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsaWRBZGRyZXNzUm9vdEFjY291bnQgPSAnZDYzMmU0ZWQxMmZkODM4ZTM2MWJjZDE5ODJkYTlhNDNiOTAzNjMxYmUzOGIzZWQ2OTg1NTk2MDNjMmU5ZmFmNic7XG4gICAgICBjb25zdCB2YWxpZEFkZHJlc3NBY2NvdW50MSA9ICdiMjU2NTA3ZGQ3MWQ3NmM2OWMwZjg4OTE5MGRjNGE0Yjc1MTNjMjczZWI4MGU0YjhiZjA4ZWU3OWY4MzU4MTQ5JztcbiAgICAgIGNvbnN0IHZhbGlkQWRkcmVzc0FjY291bnQyID0gJzU5NTBhYThmNmY3MzEyMmJlMTc3NzBhMWI3YzZmMTBmMDQ3Yzg5MmFiOTgwZWQ1NWM5YzdlZGE4ZDkyODYzM2QnO1xuICAgICAgY29uc3QgdmFsaWRBZGRyZXNzQWNjb3VudDMgPSAnMWRmZmU2NDYxODg2YzY3NzQyODg1NWI4MGU0N2FlOGZhNmM5ZWZjZThmNmE3NDUyOWViM2RlZDY4MGNkZDllYyc7XG4gICAgICBjb25zdCB2YWxpZEFkZHJlc3NBY2NvdW50NCA9ICc0NjhmNWUzM2MzNTJlZmFhYTAzMjlhMTk3MmE2MzJlMWMzZTQzMGQ0ZTRhOGFiNzNjMmQ2N2M0YmFjYjNmYjY1JztcbiAgICAgIGNvbnN0IG5vdFZhbGlkQWRkcmVzczAxID0gJ2IyNTY1MDdkZDcxZDc2YzY5YzBmODg5MTkwZGM0YTRiNzUxM2MyNzNlYjgwZTRiOGJmMDhlZTc5ZjgzNTgxNDkxMTEnO1xuICAgICAgZm9yIChjb25zdCBjb2luIG9mIFsnb2ZjY3NwcicsICdvZmN0Y3NwciddKSB7XG4gICAgICAgIGl0KGBzaG91bGQgJHtjb2lufSBiZSBjb25maWd1cmVkIHdpdGggcmlnaHQgYWRkcmVzc2VzYCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IG9mY0NvaW4gPSBiaXRnby5jb2luKGNvaW4pO1xuICAgICAgICAgIG9mY0NvaW4uaXNWYWxpZEFkZHJlc3ModmFsaWRBZGRyZXNzUm9vdEFjY291bnQpLnNob3VsZC5iZS50cnVlO1xuICAgICAgICAgIG9mY0NvaW4uaXNWYWxpZEFkZHJlc3ModmFsaWRBZGRyZXNzQWNjb3VudDEpLnNob3VsZC5iZS50cnVlO1xuICAgICAgICAgIG9mY0NvaW4uaXNWYWxpZEFkZHJlc3ModmFsaWRBZGRyZXNzQWNjb3VudDIpLnNob3VsZC5iZS50cnVlO1xuICAgICAgICAgIG9mY0NvaW4uaXNWYWxpZEFkZHJlc3ModmFsaWRBZGRyZXNzQWNjb3VudDMpLnNob3VsZC5iZS50cnVlO1xuICAgICAgICAgIG9mY0NvaW4uaXNWYWxpZEFkZHJlc3ModmFsaWRBZGRyZXNzQWNjb3VudDQpLnNob3VsZC5iZS50cnVlO1xuICAgICAgICAgIG9mY0NvaW4uaXNWYWxpZEFkZHJlc3Mobm90VmFsaWRBZGRyZXNzMDEpLnNob3VsZC5iZS5mYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjaGVjayBvZmMgdG9rZW5zIGZvciBOZWFyIG5ldHdvcmsnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVzY3JpYmUoJ2ZvciBtYWluIG5ldHdvcmsnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjb2luID0gJ29mY25lYXInO1xuICAgICAgaXQoYHNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlcyBmb3IgJHtjb2lufWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgb2ZjQ29pbiA9IGJpdGdvLmNvaW4oY29pbik7XG4gICAgICAgIG9mY0NvaW4uZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwoY29pbik7XG4gICAgICAgIG9mY0NvaW4uZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ05lYXInKTtcbiAgICAgICAgb2ZjQ29pbi5nZXRCYXNlRmFjdG9yKCkuc2hvdWxkLmVxdWFsKCcxZSsyNCcpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgZGVzY3JpYmUoJ2ZvciB0ZXN0IG5ldHdvcmsnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjb2luID0gJ29mY3RuZWFyJztcbiAgICAgIGl0KGBzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZXMgZm9yICR7Y29pbn1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IG9mY0NvaW4gPSBiaXRnby5jb2luKGNvaW4pO1xuICAgICAgICBvZmNDb2luLmdldENoYWluKCkuc2hvdWxkLmVxdWFsKGNvaW4pO1xuICAgICAgICBvZmNDb2luLmdldEZ1bGxOYW1lKCkuc2hvdWxkLmVxdWFsKCdUZXN0IE5lYXInKTtcbiAgICAgICAgb2ZjQ29pbi5nZXRCYXNlRmFjdG9yKCkuc2hvdWxkLmVxdWFsKCcxZSsyNCcpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjaGVjayBvZmMgdG9rZW5zIGZvciBTdGFja3MgbmV0d29yaycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBjb2luTWFpbiA9ICdvZmNzdHgnO1xuICAgIGNvbnN0IGNvaW5UZXN0ID0gJ29mY3RzdHgnO1xuICAgIGRlc2NyaWJlKCdmb3IgbWFpbiBuZXR3b3JrJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoYHNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlcyBmb3IgJHtjb2luTWFpbn1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IG9mY0NvaW4gPSBiaXRnby5jb2luKGNvaW5NYWluKTtcbiAgICAgICAgb2ZjQ29pbi5nZXRDaGFpbigpLnNob3VsZC5lcXVhbChjb2luTWFpbik7XG4gICAgICAgIG9mY0NvaW4uZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ1N0YWNrcycpO1xuICAgICAgICBvZmNDb2luLmdldEJhc2VGYWN0b3IoKS5zaG91bGQuZXF1YWwoUFJFQ0lTSU9OXzYpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgZGVzY3JpYmUoJ2ZvciB0ZXN0IG5ldHdvcmsnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdChgc2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgdmFsdWVzIGZvciAke2NvaW5UZXN0fWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgb2ZjQ29pbiA9IGJpdGdvLmNvaW4oY29pblRlc3QpO1xuICAgICAgICBvZmNDb2luLmdldENoYWluKCkuc2hvdWxkLmVxdWFsKGNvaW5UZXN0KTtcbiAgICAgICAgb2ZjQ29pbi5nZXRGdWxsTmFtZSgpLnNob3VsZC5lcXVhbCgnVGVzdCBTdGFja3MnKTtcbiAgICAgICAgb2ZjQ29pbi5nZXRCYXNlRmFjdG9yKCkuc2hvdWxkLmVxdWFsKFBSRUNJU0lPTl82KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGRlc2NyaWJlKCctIHZhbGlkYXRlIGFkZHJlc3NlcyAtICcsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbGlkQWRkcmVzc0FjY291bnQxID0gJ1NQMTBGREhRUTRGMkYwS0hNTjZaMjRSTUFNR1g1OTMzU1FKQ1dLQUFSJztcbiAgICAgIGNvbnN0IHZhbGlkQWRkcmVzc0FjY291bnQyID0gJ1NQUzRIU1hBRDFXU0QzOTQzV1o1Mk1QU1k5V1BLNTZTREc1NEhUQVInO1xuICAgICAgY29uc3Qgbm90VmFsaWRBZGRyZXNzMDEgPSAnU1BTNEhTWEFEMVdTRDM5NDNXWjUyTVBTWTlXUEs1NlNERzU0SFRBUlhYWCc7XG4gICAgICBjb25zdCBub3RWYWxpZEFkZHJlc3MwMiA9ICdTUFM0SFNYQUQxV1NEMzk0M1daNTJNUFNZOVdQSzU2U0RHNTRIJztcbiAgICAgIGZvciAoY29uc3QgY29pbiBvZiBbY29pbk1haW4sIGNvaW5UZXN0XSkge1xuICAgICAgICBpdChgc2hvdWxkICR7Y29pbn0gYmUgY29uZmlndXJlZCB3aXRoIHJpZ2h0IGFkZHJlc3Nlc2AsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zdCBvZmNDb2luID0gYml0Z28uY29pbihjb2luKTtcbiAgICAgICAgICBvZmNDb2luLmlzVmFsaWRBZGRyZXNzKHZhbGlkQWRkcmVzc0FjY291bnQxKS5zaG91bGQuYmUudHJ1ZTtcbiAgICAgICAgICBvZmNDb2luLmlzVmFsaWRBZGRyZXNzKHZhbGlkQWRkcmVzc0FjY291bnQyKS5zaG91bGQuYmUudHJ1ZTtcbiAgICAgICAgICBvZmNDb2luLmlzVmFsaWRBZGRyZXNzKG5vdFZhbGlkQWRkcmVzczAxKS5zaG91bGQuYmUuZmFsc2U7XG4gICAgICAgICAgb2ZjQ29pbi5pc1ZhbGlkQWRkcmVzcyhub3RWYWxpZEFkZHJlc3MwMikuc2hvdWxkLmJlLmZhbHNlO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NoZWNrIG9mYyB0b2tlbnMgZm9yIEFsZ29yYW5kIFVTREMnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdG9rZW5NYWluID0gJ29mY2FsZ286dXNkYyc7XG4gICAgY29uc3QgdG9rZW5UZXN0ID0gJ29mY3RhbGdvOnVzZGMnO1xuICAgIGRlc2NyaWJlKCdmb3IgbWFpbiBuZXR3b3JrJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoYHNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlcyBmb3IgJHt0b2tlbk1haW59YCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBvZmNDb2luID0gYml0Z28uY29pbih0b2tlbk1haW4pO1xuICAgICAgICBvZmNDb2luLmdldENoYWluKCkuc2hvdWxkLmVxdWFsKHRva2VuTWFpbik7XG4gICAgICAgIG9mY0NvaW4uZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ0FsZ29yYW5kIFVTREMnKTtcbiAgICAgICAgb2ZjQ29pbi5nZXRCYXNlRmFjdG9yKCkuc2hvdWxkLmVxdWFsKFBSRUNJU0lPTl82KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGRlc2NyaWJlKCdmb3IgdGVzdCBuZXR3b3JrJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoYHNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlcyBmb3IgJHt0b2tlblRlc3R9YCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBvZmNDb2luID0gYml0Z28uY29pbih0b2tlblRlc3QpO1xuICAgICAgICBvZmNDb2luLmdldENoYWluKCkuc2hvdWxkLmVxdWFsKHRva2VuVGVzdCk7XG4gICAgICAgIG9mY0NvaW4uZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ1Rlc3QgQWxnb3JhbmQgVVNEQycpO1xuICAgICAgICBvZmNDb2luLmdldEJhc2VGYWN0b3IoKS5zaG91bGQuZXF1YWwoUFJFQ0lTSU9OXzYpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjaGVjayBvZmMgdG9rZW5zIGZvciBIZWRlcmEgVVNEQycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0b2tlbk1haW4gPSAnb2ZjaGJhcjp1c2RjJztcbiAgICBjb25zdCB0b2tlblRlc3QgPSAnb2ZjdGhiYXI6dXNkYyc7XG4gICAgZGVzY3JpYmUoJ2ZvciBtYWluIG5ldHdvcmsnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdChgc2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgdmFsdWVzIGZvciAke3Rva2VuTWFpbn1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IG9mY0NvaW4gPSBiaXRnby5jb2luKHRva2VuTWFpbik7XG4gICAgICAgIG9mY0NvaW4uZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwodG9rZW5NYWluKTtcbiAgICAgICAgb2ZjQ29pbi5nZXRGdWxsTmFtZSgpLnNob3VsZC5lcXVhbCgnTWFpbm5ldCBIZWRlcmEgVVNEIENvaW4nKTtcbiAgICAgICAgb2ZjQ29pbi5nZXRCYXNlRmFjdG9yKCkuc2hvdWxkLmVxdWFsKFBSRUNJU0lPTl82KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGRlc2NyaWJlKCdmb3IgdGVzdCBuZXR3b3JrJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoYHNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlcyBmb3IgJHt0b2tlblRlc3R9YCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBvZmNDb2luID0gYml0Z28uY29pbih0b2tlblRlc3QpO1xuICAgICAgICBvZmNDb2luLmdldENoYWluKCkuc2hvdWxkLmVxdWFsKHRva2VuVGVzdCk7XG4gICAgICAgIG9mY0NvaW4uZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ1Rlc3RuZXQgSGVkZXJhIFVTRCBDb2luJyk7XG4gICAgICAgIG9mY0NvaW4uZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbChQUkVDSVNJT05fNik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NoZWNrIG9mYyB0b2tlbnMgZm9yIFN0ZWxsYXIgVVNEQycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0b2tlbk1haW4gPSAnb2ZjeGxtOnVzZGMnO1xuICAgIGNvbnN0IHRva2VuVGVzdCA9ICdvZmN0eGxtOnRzdCc7XG4gICAgZGVzY3JpYmUoJ2ZvciBtYWluIG5ldHdvcmsnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdChgc2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgdmFsdWVzIGZvciAke3Rva2VuTWFpbn1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IG9mY0NvaW4gPSBiaXRnby5jb2luKHRva2VuTWFpbik7XG4gICAgICAgIG9mY0NvaW4uZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwodG9rZW5NYWluKTtcbiAgICAgICAgb2ZjQ29pbi5nZXRGdWxsTmFtZSgpLnNob3VsZC5lcXVhbCgnU3RlbGxhciBVU0RDJyk7XG4gICAgICAgIG9mY0NvaW4uZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbChQUkVDSVNJT05fNyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBkZXNjcmliZSgnZm9yIHRlc3QgbmV0d29yaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KGBzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZXMgZm9yICR7dG9rZW5UZXN0fWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgb2ZjQ29pbiA9IGJpdGdvLmNvaW4odG9rZW5UZXN0KTtcbiAgICAgICAgb2ZjQ29pbi5nZXRDaGFpbigpLnNob3VsZC5lcXVhbCh0b2tlblRlc3QpO1xuICAgICAgICBvZmNDb2luLmdldEZ1bGxOYW1lKCkuc2hvdWxkLmVxdWFsKCdUZXN0IFN0ZWxsYXIgQml0R28gVGVzdCBUb2tlbicpO1xuICAgICAgICBvZmNDb2luLmdldEJhc2VGYWN0b3IoKS5zaG91bGQuZXF1YWwoUFJFQ0lTSU9OXzcpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjaGVjayBvZmMgdG9rZW5zIGZvciBhcmJldGhFcmMyMCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0b2tlbk1haW4gPSAnb2ZjYXJiZXRoOmxpbmsnO1xuICAgIGNvbnN0IHRva2VuVGVzdCA9ICdvZmN0YXJiZXRoOmxpbmsnO1xuICAgIGRlc2NyaWJlKCdmb3IgbWFpbiBuZXR3b3JrJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoYHNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlcyBmb3IgJHt0b2tlbk1haW59YCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBvZmNDb2luID0gYml0Z28uY29pbih0b2tlbk1haW4pO1xuICAgICAgICBvZmNDb2luLmdldENoYWluKCkuc2hvdWxkLmVxdWFsKHRva2VuTWFpbik7XG4gICAgICAgIG9mY0NvaW4uZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ0NoYWlubGluayBUb2tlbicpO1xuICAgICAgICBvZmNDb2luLmdldEJhc2VGYWN0b3IoKS5zaG91bGQuZXF1YWwoUFJFQ0lTSU9OXzE4KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGRlc2NyaWJlKCdmb3IgdGVzdCBuZXR3b3JrJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoYHNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlcyBmb3IgJHt0b2tlblRlc3R9YCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBvZmNDb2luID0gYml0Z28uY29pbih0b2tlblRlc3QpO1xuICAgICAgICBvZmNDb2luLmdldENoYWluKCkuc2hvdWxkLmVxdWFsKHRva2VuVGVzdCk7XG4gICAgICAgIG9mY0NvaW4uZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ0FyYml0cnVtIFRlc3QgTElOSycpO1xuICAgICAgICBvZmNDb2luLmdldEJhc2VGYWN0b3IoKS5zaG91bGQuZXF1YWwoUFJFQ0lTSU9OXzE4KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY2hlY2sgb2ZjIHRva2VucyBmb3IgYXZheEVyYzIwJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHRva2VuTWFpbiA9ICdvZmNhdmF4YzpsaW5rJztcbiAgICBjb25zdCB0b2tlblRlc3QgPSAnb2ZjdGF2YXhjOmxpbmsnO1xuICAgIGRlc2NyaWJlKCdmb3IgbWFpbiBuZXR3b3JrJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoYHNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlcyBmb3IgJHt0b2tlbk1haW59YCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBvZmNDb2luID0gYml0Z28uY29pbih0b2tlbk1haW4pO1xuICAgICAgICBvZmNDb2luLmdldENoYWluKCkuc2hvdWxkLmVxdWFsKHRva2VuTWFpbik7XG4gICAgICAgIG9mY0NvaW4uZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ0NoYWlubGluaycpO1xuICAgICAgICBvZmNDb2luLmdldEJhc2VGYWN0b3IoKS5zaG91bGQuZXF1YWwoUFJFQ0lTSU9OXzE4KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGRlc2NyaWJlKCdmb3IgdGVzdCBuZXR3b3JrJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoYHNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlcyBmb3IgJHt0b2tlblRlc3R9YCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBvZmNDb2luID0gYml0Z28uY29pbih0b2tlblRlc3QpO1xuICAgICAgICBvZmNDb2luLmdldENoYWluKCkuc2hvdWxkLmVxdWFsKHRva2VuVGVzdCk7XG4gICAgICAgIG9mY0NvaW4uZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ1Rlc3QgQ2hhaW5saW5rJyk7XG4gICAgICAgIG9mY0NvaW4uZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbChQUkVDSVNJT05fMTgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjaGVjayBvZmMgdG9rZW5zIGZvciBzb2xhbmEnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdG9rZW5NYWluID0gJ29mY3NvbDpobnQnO1xuICAgIGNvbnN0IHRva2VuVGVzdCA9ICdvZmN0c29sOmhudCc7XG4gICAgZGVzY3JpYmUoJ2ZvciBtYWluIG5ldHdvcmsnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdChgc2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgdmFsdWVzIGZvciAke3Rva2VuTWFpbn1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IG9mY0NvaW4gPSBiaXRnby5jb2luKHRva2VuTWFpbik7XG4gICAgICAgIG9mY0NvaW4uZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwodG9rZW5NYWluKTtcbiAgICAgICAgb2ZjQ29pbi5nZXRGdWxsTmFtZSgpLnNob3VsZC5lcXVhbCgnSGVsaXVtIE5ldHdvcmsgVG9rZW4nKTtcbiAgICAgICAgb2ZjQ29pbi5nZXRCYXNlRmFjdG9yKCkuc2hvdWxkLmVxdWFsKFBSRUNJU0lPTl84KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGRlc2NyaWJlKCdmb3IgdGVzdCBuZXR3b3JrJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoYHNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlcyBmb3IgJHt0b2tlblRlc3R9YCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBvZmNDb2luID0gYml0Z28uY29pbih0b2tlblRlc3QpO1xuICAgICAgICBvZmNDb2luLmdldENoYWluKCkuc2hvdWxkLmVxdWFsKHRva2VuVGVzdCk7XG4gICAgICAgIG9mY0NvaW4uZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ3Rlc3RuZXQgSGVsaXVtIE5ldHdvcmsgVG9rZW4nKTtcbiAgICAgICAgb2ZjQ29pbi5nZXRCYXNlRmFjdG9yKCkuc2hvdWxkLmVxdWFsKFBSRUNJU0lPTl84KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY2hlY2sgb2ZjIHRva2VucyBmb3Igc29sYW5hJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHRva2VuTWFpbiA9ICdvZmNzb2w6Z2FyaSc7XG4gICAgY29uc3QgdG9rZW5UZXN0ID0gJ29mY3Rzb2w6Z2FyaSc7XG4gICAgZGVzY3JpYmUoJ2ZvciBtYWluIG5ldHdvcmsnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdChgc2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgdmFsdWVzIGZvciAke3Rva2VuTWFpbn1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IG9mY0NvaW4gPSBiaXRnby5jb2luKHRva2VuTWFpbik7XG4gICAgICAgIG9mY0NvaW4uZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwodG9rZW5NYWluKTtcbiAgICAgICAgb2ZjQ29pbi5nZXRGdWxsTmFtZSgpLnNob3VsZC5lcXVhbCgnR0FSSScpO1xuICAgICAgICBvZmNDb2luLmdldEJhc2VGYWN0b3IoKS5zaG91bGQuZXF1YWwoUFJFQ0lTSU9OXzkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgZGVzY3JpYmUoJ2ZvciB0ZXN0IG5ldHdvcmsnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdChgc2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgdmFsdWVzIGZvciAke3Rva2VuVGVzdH1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IG9mY0NvaW4gPSBiaXRnby5jb2luKHRva2VuVGVzdCk7XG4gICAgICAgIG9mY0NvaW4uZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwodG9rZW5UZXN0KTtcbiAgICAgICAgb2ZjQ29pbi5nZXRGdWxsTmFtZSgpLnNob3VsZC5lcXVhbCgndGVzdG5ldCBHYXJpIFRva2VuJyk7XG4gICAgICAgIG9mY0NvaW4uZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbChQUkVDSVNJT05fOSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ2NhbiBzaWduIHBheWxvYWRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGlucHV0UGFyYW1zID0ge1xuICAgICAgdHhQcmVidWlsZDoge1xuICAgICAgICBwYXlsb2FkOiAne1widG9rZW5cIjpcIm90ZXN0dXNkXCJ9JyxcbiAgICAgIH0sXG4gICAgICBwcnY6ICd4cHJ2OXMyMVpyUUgxNDNLM1dHNG9mM25TWVVDNTVYTkZDZ1pUeWdoYWU5Y01TRkRrY0tVN1lKZ1RhaEpNcGRUWTlDakNjamdTbzJUSjYzNXVVVngxNzZCdWZVTUJGcGllS1lWSkQ5SjNWdnJHUm0nLFxuICAgIH07XG4gICAgY29uc3QgZXhwZWN0ZWRSZXN1bHQgPSB7XG4gICAgICBoYWxmU2lnbmVkOiB7XG4gICAgICAgIHBheWxvYWQ6ICd7XCJ0b2tlblwiOlwib3Rlc3R1c2RcIn0nLFxuICAgICAgICBzaWduYXR1cmU6XG4gICAgICAgICAgJzIwNDliOTRhMjJjNjk2NTBhZDk1Mjk3NjdkYTk5M2EyM2MwNzgzNDdmZGY3ZDg4NzQwOTc5M2RjZThkMDcxOTBlMTA4YTg0Njg2OWVkZjM4N2QyOTRjZDc1YzZjNzcwYTEyODQ3NjE1YjI1NTNiMjJhNjFkZTI5YmU1ZDkxNzcwZGQnLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3Qgc2lnbmVkUmVzdWx0ID0gYXdhaXQgb3Rlc3R1c2RDb2luLnNpZ25UcmFuc2FjdGlvbihpbnB1dFBhcmFtcyk7XG4gICAgc2lnbmVkUmVzdWx0LnNob3VsZC5kZWVwRXF1YWwoZXhwZWN0ZWRSZXN1bHQpO1xuICB9KTtcblxuICBkZXNjcmliZSgnY2hlY2sgb2ZjIHRva2VucyBmb3IgcG9seWdvbkVyYzIwJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHRva2VuTWFpbiA9ICdvZmNwb2x5Z29uOmxpbmsnO1xuICAgIGNvbnN0IHRva2VuVGVzdCA9ICdvZmN0cG9seWdvbjpsaW5rJztcbiAgICBkZXNjcmliZSgnZm9yIG1haW4gbmV0d29yaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KGBzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZXMgZm9yICR7dG9rZW5NYWlufWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgb2ZjQ29pbiA9IGJpdGdvLmNvaW4odG9rZW5NYWluKTtcbiAgICAgICAgb2ZjQ29pbi5nZXRDaGFpbigpLnNob3VsZC5lcXVhbCh0b2tlbk1haW4pO1xuICAgICAgICBvZmNDb2luLmdldEZ1bGxOYW1lKCkuc2hvdWxkLmVxdWFsKCdDaGFpbkxpbmsgVG9rZW4nKTtcbiAgICAgICAgb2ZjQ29pbi5nZXRCYXNlRmFjdG9yKCkuc2hvdWxkLmVxdWFsKFBSRUNJU0lPTl8xOCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBkZXNjcmliZSgnZm9yIHRlc3QgbmV0d29yaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KGBzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZXMgZm9yICR7dG9rZW5UZXN0fWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgb2ZjQ29pbiA9IGJpdGdvLmNvaW4odG9rZW5UZXN0KTtcbiAgICAgICAgb2ZjQ29pbi5nZXRDaGFpbigpLnNob3VsZC5lcXVhbCh0b2tlblRlc3QpO1xuICAgICAgICBvZmNDb2luLmdldEZ1bGxOYW1lKCkuc2hvdWxkLmVxdWFsKCdQb2x5Z29uIFRlc3QgTElOSycpO1xuICAgICAgICBvZmNDb2luLmdldEJhc2VGYWN0b3IoKS5zaG91bGQuZXF1YWwoUFJFQ0lTSU9OXzE4KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY2hlY2sgb2ZjIHRva2VucyBmb3IgYnNjIHRva2VucycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0b2tlbk1haW4gPSAnb2ZjYnNjOmNmeCc7XG4gICAgZGVzY3JpYmUoJ2ZvciBtYWluIG5ldHdvcmsnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdChgc2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgdmFsdWVzIGZvciAke3Rva2VuTWFpbn1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IG9mY0NvaW4gPSBiaXRnby5jb2luKHRva2VuTWFpbik7XG4gICAgICAgIG9mY0NvaW4uZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwodG9rZW5NYWluKTtcbiAgICAgICAgb2ZjQ29pbi5nZXRGdWxsTmFtZSgpLnNob3VsZC5lcXVhbCgnQlNDIENvbmZsdXgnKTtcbiAgICAgICAgb2ZjQ29pbi5nZXRCYXNlRmFjdG9yKCkuc2hvdWxkLmVxdWFsKFBSRUNJU0lPTl8xOCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NoZWNrIG9mYyB0b2tlbnMgZm9yIHJpcHBsZScsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0b2tlbk1haW4gPSAnb2ZjeHJwOnJsdXNkJztcbiAgICBjb25zdCB0b2tlblRlc3QgPSAnb2ZjdHhycDpybHVzZCc7XG4gICAgZGVzY3JpYmUoJ2ZvciBtYWluIG5ldHdvcmsnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdChgc2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgdmFsdWVzIGZvciAke3Rva2VuTWFpbn1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IG9mY0NvaW4gPSBiaXRnby5jb2luKHRva2VuTWFpbik7XG4gICAgICAgIG9mY0NvaW4uZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwodG9rZW5NYWluKTtcbiAgICAgICAgb2ZjQ29pbi5nZXRGdWxsTmFtZSgpLnNob3VsZC5lcXVhbCgnUmlwcGxlIFVTRCcpO1xuICAgICAgICBvZmNDb2luLmdldEJhc2VGYWN0b3IoKS5zaG91bGQuZXF1YWwoUFJFQ0lTSU9OXzE1KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGRlc2NyaWJlKCdmb3IgdGVzdCBuZXR3b3JrJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoYHNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlcyBmb3IgJHt0b2tlblRlc3R9YCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBvZmNDb2luID0gYml0Z28uY29pbih0b2tlblRlc3QpO1xuICAgICAgICBvZmNDb2luLmdldENoYWluKCkuc2hvdWxkLmVxdWFsKHRva2VuVGVzdCk7XG4gICAgICAgIG9mY0NvaW4uZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ1JMVVNEJyk7XG4gICAgICAgIG9mY0NvaW4uZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbChQUkVDSVNJT05fMTUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjaGVjayBvZmMgdG9rZW5zIGZvciBvcGV0aEVyYzIwJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHRva2VuTWFpbiA9ICdvZmNvcGV0aDpvcCc7XG4gICAgZGVzY3JpYmUoJ2ZvciBtYWluIG5ldHdvcmsnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdChgc2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgdmFsdWVzIGZvciAke3Rva2VuTWFpbn1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IG9mY0NvaW4gPSBiaXRnby5jb2luKHRva2VuTWFpbik7XG4gICAgICAgIG9mY0NvaW4uZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwodG9rZW5NYWluKTtcbiAgICAgICAgb2ZjQ29pbi5nZXRGdWxsTmFtZSgpLnNob3VsZC5lcXVhbCgnT3B0aW1pc20nKTtcbiAgICAgICAgb2ZjQ29pbi5nZXRCYXNlRmFjdG9yKCkuc2hvdWxkLmVxdWFsKFBSRUNJU0lPTl8xOCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NoZWNrIG9mYyB0b2tlbnMgZm9yIHRyeCB0b2tlbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdG9rZW5NYWluID0gJ29mY3RyeDp1c2R0JztcbiAgICBjb25zdCB0b2tlblRlc3QgPSAnb2ZjdHRyeDp1c2R0JztcbiAgICBkZXNjcmliZSgnZm9yIG1haW4gbmV0d29yaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KGBzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZXMgZm9yICR7dG9rZW5NYWlufWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgb2ZjQ29pbiA9IGJpdGdvLmNvaW4odG9rZW5NYWluKTtcbiAgICAgICAgb2ZjQ29pbi5nZXRDaGFpbigpLnNob3VsZC5lcXVhbCh0b2tlbk1haW4pO1xuICAgICAgICBvZmNDb2luLmdldEZ1bGxOYW1lKCkuc2hvdWxkLmVxdWFsKCdUZXRoZXIgVVNEJyk7XG4gICAgICAgIG9mY0NvaW4uZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbChQUkVDSVNJT05fNik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBkZXNjcmliZSgnZm9yIHRlc3QgbmV0d29yaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KGBzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZXMgZm9yICR7dG9rZW5UZXN0fWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgb2ZjQ29pbiA9IGJpdGdvLmNvaW4odG9rZW5UZXN0KTtcbiAgICAgICAgb2ZjQ29pbi5nZXRDaGFpbigpLnNob3VsZC5lcXVhbCh0b2tlblRlc3QpO1xuICAgICAgICBvZmNDb2luLmdldEZ1bGxOYW1lKCkuc2hvdWxkLmVxdWFsKCdUZXRoZXIgVVNEJyk7XG4gICAgICAgIG9mY0NvaW4uZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbChQUkVDSVNJT05fNik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!