PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-xtz/dist/test/unit
Просмотр файла: offlineTransactionBuilder.js
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const should_1 = __importDefault(require("should"));
const sdk_core_1 = require("@bitgo/sdk-core");
const statics_1 = require("@bitgo/statics");
const src_1 = require("../../src");
describe('Offline Tezos Transaction builder', function () {
const defaultKeyPair = new src_1.XtzLib.KeyPair({
prv: 'xprv9s21ZrQH143K3D8TXfvAJgHVfTEeQNW5Ys9wZtnUZkqPzFzSjbEJrWC1vZ4GnXCvR7rQL2UFX3RSuYeU9MrERm1XBvACow7c36vnz5iYyj2',
});
describe('should build and sign', () => {
it('an init transaction', async () => {
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
txBuilder.type(sdk_core_1.TransactionType.WalletInitialization);
txBuilder.fee({
fee: '4764',
gasLimit: '33971',
storageLimit: '1292',
});
txBuilder.source(defaultKeyPair.getAddress());
txBuilder.initialBalance('1000000');
txBuilder.counter('0');
txBuilder.owner('sppk7ZWB8diU2TWehxdkWCV2DTFvn1hPz4qLjiD3nJQozKnoSEnSC8b');
txBuilder.owner('sppk7Zq9KPtwkzkgAsha4jU29C43McgP2skK56tjd7KJjhcmH6AZC1F');
txBuilder.owner('sppk7d2ztzbrLdBaTB7yzaWRkPfcWGsrNQNJdkBE9bCTSSzekLNzpvf');
txBuilder.branch('BM8QdZ92VyaH1s5nwAF9rUXjiPZ3g3Nsn6oYbdKqj2RgHxvWXVS');
const tx = await txBuilder.build();
tx.id.should.equal('');
tx.type.should.equal(sdk_core_1.TransactionType.WalletInitialization);
tx.source.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
should_1.default.equal(tx.inputs.length, 1);
should_1.default.equal(tx.outputs.length, 1);
tx.inputs[0].address.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
tx.inputs[0].value.should.equal('1004764');
tx.outputs[0].address.should.equal('');
tx.outputs[0].value.should.equal('1000000');
tx.signature.length.should.equal(0);
const offlineTxBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
offlineTxBuilder.from(tx.toBroadcastFormat());
offlineTxBuilder.source(defaultKeyPair.getAddress());
offlineTxBuilder.sign({ key: defaultKeyPair.getKeys().prv });
const signedTx = await offlineTxBuilder.build();
signedTx.id.should.equal('opNfjjEfWk7HsnY8fQrUoPFuXZfABweubA6D4bVScmqoVzcZVFA');
signedTx.type.should.equal(sdk_core_1.TransactionType.WalletInitialization);
should_1.default.equal(signedTx.inputs.length, 1);
should_1.default.equal(signedTx.outputs.length, 1);
signedTx.inputs[0].address.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
signedTx.inputs[0].value.should.equal('1004764');
signedTx.outputs[0].address.should.equal('KT1J9LfhDV6FQxR7aMaK7R6Rw8mBpfhP5MA3');
signedTx.outputs[0].value.should.equal('1000000');
signedTx.signature.length.should.equal(1);
signedTx.signature[0].should.equal('sigVD57haAMCobHrCwH9ABfbFvdmyR9ZspZC3Zihb9tEPfhtzCKS1F8fLoVpodvor3PUoo7ry4j46xYETEzELmtnrNTaTPX4');
});
it('a reveal transaction', async () => {
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
txBuilder.type(sdk_core_1.TransactionType.AccountUpdate);
txBuilder.source(defaultKeyPair.getAddress());
txBuilder.counter('0');
txBuilder.branch('BM8QdZ92VyaH1s5nwAF9rUXjiPZ3g3Nsn6oYbdKqj2RgHxvWXVS');
txBuilder.publicKeyToReveal(defaultKeyPair.getKeys().pub);
const tx = await txBuilder.build();
tx.id.should.equal('');
tx.type.should.equal(sdk_core_1.TransactionType.AccountUpdate);
tx.source.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
should_1.default.equal(tx.inputs.length, 1);
should_1.default.equal(tx.outputs.length, 0);
tx.inputs[0].address.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
tx.inputs[0].value.should.equal('1420');
const offlineTxBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
offlineTxBuilder.from(tx.toBroadcastFormat());
offlineTxBuilder.source(defaultKeyPair.getAddress());
offlineTxBuilder.sign({ key: defaultKeyPair.getKeys().prv });
const signedTx = await offlineTxBuilder.build();
signedTx.id.should.equal('oomXs6PuWtmGwMKoXTNsu9XJHnGXtuRujcHMeYS9y37Xj6sXPHb');
signedTx.type.should.equal(sdk_core_1.TransactionType.AccountUpdate);
signedTx.source.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
should_1.default.equal(signedTx.inputs.length, 1);
should_1.default.equal(signedTx.outputs.length, 0);
signedTx.inputs[0].address.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
signedTx.inputs[0].value.should.equal('1420');
signedTx.signature.length.should.equal(1);
signedTx.signature[0].should.equal('sigQyYsfhtrJBKZuJSEizDdxoejNVvJWRZPDMWdpXVvdTVix37HzURwXfXsi9METnRzskvjgsBSgiF4pr7RVxzWLuixxJL8U');
});
it('a send transaction to single destinations', async () => {
const testDataToSign = '0507070a000000160196369c90625575ba44594b23794832a9337f7a2d0007070000050502000000320320053d036d0743035d0a00000015006b5ddaef3fb5d7c151cfb36fbe43a7a066777394031e0743036a0001034f034d031b';
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
txBuilder.type(sdk_core_1.TransactionType.Send);
txBuilder.branch('BM8QdZ92VyaH1s5nwAF9rUXjiPZ3g3Nsn6oYbdKqj2RgHxvWXVS');
txBuilder.counter('0');
txBuilder.source(defaultKeyPair.getAddress());
txBuilder
.transfer('100')
.from('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL')
.to('KT1HUrt6kfvYyDEYCJ2GSjvTPZ6KmRfxLBU8')
.fee('4764')
.counter('1');
const tx = await txBuilder.build();
tx.toBroadcastFormat().should.equal('ba7a04fab1a3f77eda96b551947dd343e165d1b91b6f9f806648b63e57c88cc86c01aaca87bdbcdc4e6117b667e29f9b504362c831bb9c2500e8528102000196369c90625575ba44594b23794832a9337f7a2d00ffff046d61696e000000760707070700010505020000005e0320053d036d0743036e01000000244b543148557274366b66765979444559434a3247536a7654505a364b6d5266784c4255380555036c0200000015072f02000000090200000004034f032702000000000743036a00a401034f034d031b0200000006030603060306');
// Offline signing from location 1 with a transfer key
const offlineTxBuilder1 = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
offlineTxBuilder1.from(tx.toBroadcastFormat());
offlineTxBuilder1.source(defaultKeyPair.getAddress());
// Since dataToSign cannot me calculated, it has to be passed to the new builder so we can
// generate the signatures
offlineTxBuilder1.overrideDataToSign({ dataToSign: testDataToSign });
offlineTxBuilder1.sign({
key: new src_1.XtzLib.KeyPair({ prv: 'spsk2cbiVsAvpGKmau9XcMscL3NRwjkyT575N5AyAofcoj41x6g6TL' }).getKeys().prv,
});
const signedTx1 = await offlineTxBuilder1.build();
// Offline signing from location 2 with another transfer key
const offlineTxBuilder2 = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
offlineTxBuilder2.from(signedTx1.toBroadcastFormat());
offlineTxBuilder2.source(defaultKeyPair.getAddress());
offlineTxBuilder2.overrideDataToSign({ dataToSign: testDataToSign });
offlineTxBuilder2.sign({ key: new src_1.XtzLib.KeyPair({ seed: Buffer.alloc(16) }).getKeys().prv });
const signedTx2 = await offlineTxBuilder2.build();
// Offline signing from location 3 with the fee key
const offlineTxBuilder3 = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
offlineTxBuilder3.from(signedTx2.toBroadcastFormat());
offlineTxBuilder3.source(defaultKeyPair.getAddress());
offlineTxBuilder3.sign({ key: defaultKeyPair.getKeys().prv });
const signedTx = await offlineTxBuilder3.build();
signedTx.id.should.equal('onkHwfuYJMrtxNdyL6eHeNEHuE1n5HPH75CXUNh91agjbQAxwzT');
signedTx.type.should.equal(sdk_core_1.TransactionType.Send);
should_1.default.equal(signedTx.inputs.length, 2);
should_1.default.equal(signedTx.outputs.length, 1);
signedTx.inputs[0].address.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
signedTx.inputs[0].value.should.equal('4764');
signedTx.inputs[1].address.should.equal('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL');
signedTx.inputs[1].value.should.equal('100');
signedTx.outputs[0].address.should.equal('KT1HUrt6kfvYyDEYCJ2GSjvTPZ6KmRfxLBU8');
signedTx.outputs[0].value.should.equal('100');
signedTx.signature.length.should.equal(1);
signedTx.signature[0].should.equal('sigd8B36JUVyDqpCvV1GtbLpP398gpmwfxvGQM6eQ45JG5z4LgDRX55YPAPTMW2pAciwaA3jv8wgyxR9cnEjsCFs1QRPfQ9G');
signedTx
.toBroadcastFormat()
.should.equal('ba7a04fab1a3f77eda96b551947dd343e165d1b91b6f9f806648b63e57c88cc86c01aaca87bdbcdc4e6117b667e29f9b504362c831bb9c2500e8528102000196369c90625575ba44594b23794832a9337f7a2d00ffff046d61696e000001400707070700010505020000005e0320053d036d0743036e01000000244b543148557274366b66765979444559434a3247536a7654505a364b6d5266784c4255380555036c0200000015072f02000000090200000004034f032702000000000743036a00a401034f034d031b02000000d0050901000000607369674e6a4436344e75566e554b376f56423263325350333256596a376454796b626e527879446f5339424776676167766e4d6354346859636361626246476f397464565154344d3436657a594a644c32707a594453776b665236797270705905090100000060736967596656594a5561694b4b5a58347a737a575a3752463239326e56325036584d346e4b656b325967575138424c533172323275346139534376474d63623839426a546674546e327667557a435451475332634a4e766259747547516a4750030673b1393fbda4f24e07958136dc7951e0d020748e54bd29b847323ef2bc85c399657f4359fc10a13e5afe7b7068b584ea2e578736250881481e212e9793bfbf88');
});
it('a send transaction to multiple destinations', async () => {
const testDataToSign = '0507070a000000160196369c90625575ba44594b23794832a9337f7a2d0007070000050502000000320320053d036d0743035d0a00000015006b5ddaef3fb5d7c151cfb36fbe43a7a066777394031e0743036a0001034f034d031b';
const txBuilder = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
txBuilder.type(sdk_core_1.TransactionType.Send);
txBuilder.branch('BM8QdZ92VyaH1s5nwAF9rUXjiPZ3g3Nsn6oYbdKqj2RgHxvWXVS');
txBuilder.counter('0');
txBuilder.source(defaultKeyPair.getAddress());
txBuilder
.transfer('100')
.from('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL')
.to('KT1HUrt6kfvYyDEYCJ2GSjvTPZ6KmRfxLBU8')
.fee('4764')
.counter('1');
txBuilder
.transfer('100')
.from('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL')
.to('tz1VRjRpVKnv16AVprFH1tkDn4TDfVqA893A')
.fee('4764')
.counter('2');
const tx = await txBuilder.build();
tx.toBroadcastFormat().should.equal('ba7a04fab1a3f77eda96b551947dd343e165d1b91b6f9f806648b63e57c88cc86c01aaca87bdbcdc4e6117b667e29f9b504362c831bb9c2500e8528102000196369c90625575ba44594b23794832a9337f7a2d00ffff046d61696e000000760707070700010505020000005e0320053d036d0743036e01000000244b543148557274366b66765979444559434a3247536a7654505a364b6d5266784c4255380555036c0200000015072f02000000090200000004034f032702000000000743036a00a401034f034d031b02000000060306030603066c01aaca87bdbcdc4e6117b667e29f9b504362c831bb9c2501e8528102000196369c90625575ba44594b23794832a9337f7a2d00ffff046d61696e0000005a070707070002050502000000420320053d036d0743035d0100000024747a3156526a5270564b6e76313641567072464831746b446e3454446656714138393341031e0743036a00a401034f034d031b0200000006030603060306');
// Offline signing from location 1 with a transfer key
const offlineTxBuilder1 = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
offlineTxBuilder1.from(tx.toBroadcastFormat());
offlineTxBuilder1.source(defaultKeyPair.getAddress());
// Since dataToSign cannot me calculated, it has to be passed to the new builder so we can
// generate the signatures
offlineTxBuilder1.overrideDataToSign({ dataToSign: testDataToSign, index: 0 });
offlineTxBuilder1.overrideDataToSign({ dataToSign: testDataToSign, index: 1 });
offlineTxBuilder1.sign({
key: new src_1.XtzLib.KeyPair({ prv: 'spsk2cbiVsAvpGKmau9XcMscL3NRwjkyT575N5AyAofcoj41x6g6TL' }).getKeys().prv,
});
const signedTx1 = await offlineTxBuilder1.build();
// Offline signing from location 2 with another transfer key
const offlineTxBuilder2 = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
offlineTxBuilder2.from(signedTx1.toBroadcastFormat());
offlineTxBuilder2.source(defaultKeyPair.getAddress());
offlineTxBuilder2.overrideDataToSign({ dataToSign: testDataToSign, index: 0 });
offlineTxBuilder2.overrideDataToSign({ dataToSign: testDataToSign, index: 1 });
offlineTxBuilder2.sign({ key: new src_1.XtzLib.KeyPair({ seed: Buffer.alloc(16) }).getKeys().prv, index: 1 });
const signedTx2 = await offlineTxBuilder2.build();
// Offline signing from location 3 with the fee key
const offlineTxBuilder3 = new src_1.XtzLib.TransactionBuilder(statics_1.coins.get('xtz'));
offlineTxBuilder3.from(signedTx2.toBroadcastFormat());
offlineTxBuilder3.source(defaultKeyPair.getAddress());
offlineTxBuilder3.sign({ key: defaultKeyPair.getKeys().prv });
const signedTx = await offlineTxBuilder3.build();
signedTx.id.should.equal('onyGaWs6z4bVVcfn3h9KbBrktEhuDyJLYEVB4aJRM6YNngjDxE4');
signedTx.type.should.equal(sdk_core_1.TransactionType.Send);
signedTx.source.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
should_1.default.equal(signedTx.inputs.length, 4);
should_1.default.equal(signedTx.outputs.length, 2);
signedTx.inputs[0].address.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
signedTx.inputs[0].value.should.equal('4764');
signedTx.inputs[1].address.should.equal('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL');
signedTx.inputs[1].value.should.equal('100');
signedTx.inputs[2].address.should.equal('tz2PtJ9zgEgFVTRqy6GXsst54tH3ksEnYvvS');
signedTx.inputs[2].value.should.equal('4764');
signedTx.inputs[3].address.should.equal('KT1NH2M23xovhw7uwWVuoGTYxykeCcVfSqhL');
signedTx.inputs[3].value.should.equal('100');
signedTx.outputs[0].address.should.equal('KT1HUrt6kfvYyDEYCJ2GSjvTPZ6KmRfxLBU8');
signedTx.outputs[0].value.should.equal('100');
signedTx.outputs[1].address.should.equal('tz1VRjRpVKnv16AVprFH1tkDn4TDfVqA893A');
signedTx.outputs[1].value.should.equal('100');
signedTx.signature.length.should.equal(1);
signedTx.signature[0].should.equal('sigdUpzCxmi9NWhdbFGfvqVyH8Xfr2UiPc2fkqNrQ4CHvrk19ZDksDksEc4DJsTbphenV8jCNZFqzL4sCVRzM93HnSSqgJz7');
const firstTransferSignatures = signedTx.getTransferSignatures();
firstTransferSignatures.length.should.equal(2);
firstTransferSignatures[0].signature.should.equal('sigNjD64NuVnUK7oVB2c2SP32VYj7dTykbnRxyDoS9BGvgagvnMcT4hYccabbFGo9tdVQT4M46ezYJdL2pzYDSwkfR6yrppY');
firstTransferSignatures[0].index.should.equal(0);
firstTransferSignatures[1].signature.should.equal('sigYfVYJUaiKKZX4zszWZ7RF292nV2P6XM4nKek2YgWQ8BLS1r22u4a9SCvGMcb89BjTftTn2vgUzCTQGS2cJNvbYtuGQjGP');
firstTransferSignatures[1].index.should.equal(1);
// Note: Signatures are the same here because the data to sign used in the test is the same
const secondTransferSignatures = signedTx.getTransferSignatures(1);
secondTransferSignatures.length.should.equal(2);
secondTransferSignatures[0].signature.should.equal('sigNjD64NuVnUK7oVB2c2SP32VYj7dTykbnRxyDoS9BGvgagvnMcT4hYccabbFGo9tdVQT4M46ezYJdL2pzYDSwkfR6yrppY');
secondTransferSignatures[0].index.should.equal(0);
secondTransferSignatures[1].signature.should.equal('sigYfVYJUaiKKZX4zszWZ7RF292nV2P6XM4nKek2YgWQ8BLS1r22u4a9SCvGMcb89BjTftTn2vgUzCTQGS2cJNvbYtuGQjGP');
secondTransferSignatures[1].index.should.equal(1);
signedTx
.toBroadcastFormat()
.should.equal('ba7a04fab1a3f77eda96b551947dd343e165d1b91b6f9f806648b63e57c88cc86c01aaca87bdbcdc4e6117b667e29f9b504362c831bb9c2500e8528102000196369c90625575ba44594b23794832a9337f7a2d00ffff046d61696e000001400707070700010505020000005e0320053d036d0743036e01000000244b543148557274366b66765979444559434a3247536a7654505a364b6d5266784c4255380555036c0200000015072f02000000090200000004034f032702000000000743036a00a401034f034d031b02000000d0050901000000607369674e6a4436344e75566e554b376f56423263325350333256596a376454796b626e527879446f5339424776676167766e4d6354346859636361626246476f397464565154344d3436657a594a644c32707a594453776b665236797270705905090100000060736967596656594a5561694b4b5a58347a737a575a3752463239326e56325036584d346e4b656b325967575138424c533172323275346139534376474d63623839426a546674546e327667557a435451475332634a4e766259747547516a475003066c01aaca87bdbcdc4e6117b667e29f9b504362c831bb9c2501e8528102000196369c90625575ba44594b23794832a9337f7a2d00ffff046d61696e00000124070707070002050502000000420320053d036d0743035d0100000024747a3156526a5270564b6e76313641567072464831746b446e3454446656714138393341031e0743036a00a401034f034d031b02000000d0050901000000607369674e6a4436344e75566e554b376f56423263325350333256596a376454796b626e527879446f5339424776676167766e4d6354346859636361626246476f397464565154344d3436657a594a644c32707a594453776b665236797270705905090100000060736967596656594a5561694b4b5a58347a737a575a3752463239326e56325036584d346e4b656b325967575138424c533172323275346139534376474d63623839426a546674546e327667557a435451475332634a4e766259747547516a47500306766a0b1f6cb035bf537887ba9004c489bb458d8c8e72b5033b6cee8ad52f84ec27b719f5d0b98cdf2d0744b255301263688692645eafc9cdf1b48b5053c51dca');
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZmbGluZVRyYW5zYWN0aW9uQnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC9vZmZsaW5lVHJhbnNhY3Rpb25CdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBRTVCLDhDQUFrRDtBQUNsRCw0Q0FBdUM7QUFDdkMsbUNBQW1DO0FBRW5DLFFBQVEsQ0FBQyxtQ0FBbUMsRUFBRTtJQUM1QyxNQUFNLGNBQWMsR0FBRyxJQUFJLFlBQU0sQ0FBQyxPQUFPLENBQUM7UUFDeEMsR0FBRyxFQUFFLGlIQUFpSDtLQUN2SCxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxFQUFFO1FBQ3JDLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNuQyxNQUFNLFNBQVMsR0FBUSxJQUFJLFlBQU0sQ0FBQyxrQkFBa0IsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDdkUsU0FBUyxDQUFDLElBQUksQ0FBQywwQkFBZSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDckQsU0FBUyxDQUFDLEdBQUcsQ0FBQztnQkFDWixHQUFHLEVBQUUsTUFBTTtnQkFDWCxRQUFRLEVBQUUsT0FBTztnQkFDakIsWUFBWSxFQUFFLE1BQU07YUFDckIsQ0FBQyxDQUFDO1lBQ0gsU0FBUyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUM5QyxTQUFTLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3BDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkIsU0FBUyxDQUFDLEtBQUssQ0FBQyx5REFBeUQsQ0FBQyxDQUFDO1lBQzNFLFNBQVMsQ0FBQyxLQUFLLENBQUMseURBQXlELENBQUMsQ0FBQztZQUMzRSxTQUFTLENBQUMsS0FBSyxDQUFDLHlE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QUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5QyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDaEYsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDaEYsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5QyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDaEYsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDakYsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDakYsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDaEMsa0dBQWtHLENBQ25HLENBQUM7WUFDRixNQUFNLHVCQUF1QixHQUFHLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ2pFLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9DLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUMvQyxrR0FBa0csQ0FDbkcsQ0FBQztZQUNGLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pELHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUMvQyxrR0FBa0csQ0FDbkcsQ0FBQztZQUNGLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pELDJGQUEyRjtZQUMzRixNQUFNLHdCQUF3QixHQUFHLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuRSx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoRCx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDaEQsa0dBQWtHLENBQ25HLENBQUM7WUFDRix3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsRCx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDaEQsa0dBQWtHLENBQ25HLENBQUM7WUFDRix3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsRCxRQUFRO2lCQUNMLGlCQUFpQixFQUFFO2lCQUNuQixNQUFNLENBQUMsS0FBSyxDQUNYLHNvREFBc29ELENBQ3ZvRCxDQUFDO1FBQ04sQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuXG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgeyBYdHpMaWIgfSBmcm9tICcuLi8uLi9zcmMnO1xuXG5kZXNjcmliZSgnT2ZmbGluZSBUZXpvcyBUcmFuc2FjdGlvbiBidWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBkZWZhdWx0S2V5UGFpciA9IG5ldyBYdHpMaWIuS2V5UGFpcih7XG4gICAgcHJ2OiAneHBydjlzMjFaclFIMTQzSzNEOFRYZnZBSmdIVmZURWVRTlc1WXM5d1p0blVaa3FQekZ6U2piRUpyV0Mxdlo0R25YQ3ZSN3JRTDJVRlgzUlN1WWVVOU1yRVJtMVhCdkFDb3c3YzM2dm56NWlZeWoyJyxcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Nob3VsZCBidWlsZCBhbmQgc2lnbicsICgpID0+IHtcbiAgICBpdCgnYW4gaW5pdCB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjogYW55ID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KCd4dHonKSk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICAgICAgdHhCdWlsZGVyLmZlZSh7XG4gICAgICAgIGZlZTogJzQ3NjQnLFxuICAgICAgICBnYXNMaW1pdDogJzMzOTcxJyxcbiAgICAgICAgc3RvcmFnZUxpbWl0OiAnMTI5MicsXG4gICAgICB9KTtcbiAgICAgIHR4QnVpbGRlci5zb3VyY2UoZGVmYXVsdEtleVBhaXIuZ2V0QWRkcmVzcygpKTtcbiAgICAgIHR4QnVpbGRlci5pbml0aWFsQmFsYW5jZSgnMTAwMDAwMCcpO1xuICAgICAgdHhCdWlsZGVyLmNvdW50ZXIoJzAnKTtcbiAgICAgIHR4QnVpbGRlci5vd25lcignc3BwazdaV0I4ZGlVMlRXZWh4ZGtXQ1YyRFRGdm4xaFB6NHFMamlEM25KUW96S25vU0VuU0M4YicpO1xuICAgICAgdHhCdWlsZGVyLm93bmVyKCdzcHBrN1pxOUtQdHdremtnQXNoYTRqVTI5QzQzTWNnUDJza0s1NnRqZDdLSmpoY21INkFaQzFGJyk7XG4gICAgICB0eEJ1aWxkZXIub3duZXIoJ3NwcGs3ZDJ6dHpickxkQmFUQjd5emFXUmtQZmNXR3NyTlFOSmRrQkU5YkNUU1N6ZWtMTnpwdmYnKTtcbiAgICAgIHR4QnVpbGRlci5icmFuY2goJ0JNOFFkWjkyVnlhSDFzNW53QUY5clVYamlQWjNnM05zbjZvWWJkS3FqMlJnSHh2V1hWUycpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgdHguaWQuc2hvdWxkLmVxdWFsKCcnKTtcbiAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbik7XG4gICAgICB0eC5zb3VyY2Uuc2hvdWxkLmVxdWFsKCd0ejJQdEo5emdFZ0ZWVFJxeTZHWHNzdDU0dEgza3NFbll2dlMnKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5pbnB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC5vdXRwdXRzLmxlbmd0aCwgMSk7XG4gICAgICB0eC5pbnB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ3R6MlB0Sjl6Z0VnRlZUUnF5NkdYc3N0NTR0SDNrc0VuWXZ2UycpO1xuICAgICAgdHguaW5wdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwNDc2NCcpO1xuICAgICAgdHgub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgnJyk7XG4gICAgICB0eC5vdXRwdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwMDAwMCcpO1xuICAgICAgdHguc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG5cbiAgICAgIGNvbnN0IG9mZmxpbmVUeEJ1aWxkZXI6IGFueSA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5zLmdldCgneHR6JykpO1xuICAgICAgb2ZmbGluZVR4QnVpbGRlci5mcm9tKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgICAgb2ZmbGluZVR4QnVpbGRlci5zb3VyY2UoZGVmYXVsdEtleVBhaXIuZ2V0QWRkcmVzcygpKTtcbiAgICAgIG9mZmxpbmVUeEJ1aWxkZXIuc2lnbih7IGtleTogZGVmYXVsdEtleVBhaXIuZ2V0S2V5cygpLnBydiB9KTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgb2ZmbGluZVR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICBzaWduZWRUeC5pZC5zaG91bGQuZXF1YWwoJ29wTmZqakVmV2s3SHNuWThmUXJVb1BGdVhaZkFCd2V1YkE2RDRiVlNjbXFvVnpjWlZGQScpO1xuICAgICAgc2lnbmVkVHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uKTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWduZWRUeC5pbnB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWduZWRUeC5vdXRwdXRzLmxlbmd0aCwgMSk7XG4gICAgICBzaWduZWRUeC5pbnB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ3R6MlB0Sjl6Z0VnRlZUUnF5NkdYc3N0NTR0SDNrc0VuWXZ2UycpO1xuICAgICAgc2lnbmVkVHguaW5wdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwNDc2NCcpO1xuICAgICAgc2lnbmVkVHgub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgnS1QxSjlMZmhEVjZGUXhSN2FNYUs3UjZSdzhtQnBmaFA1TUEzJyk7XG4gICAgICBzaWduZWRUeC5vdXRwdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwMDAwMCcpO1xuICAgICAgc2lnbmVkVHguc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICBzaWduZWRUeC5zaWduYXR1cmVbMF0uc2hvdWxkLmVxdWFsKFxuICAgICAgICAnc2lnVkQ1N2hhQU1Db2JIckN3SDlBQmZiRnZkbXlSOVpzcFpDM1ppaGI5dEVQZmh0ekNLUzFGOGZMb1Zwb2R2b3IzUFVvbzdyeTRqNDZ4WUVURXpFTG10bnJOVGFUUFg0J1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHJldmVhbCB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjogYW55ID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KCd4dHonKSk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuQWNjb3VudFVwZGF0ZSk7XG4gICAgICB0eEJ1aWxkZXIuc291cmNlKGRlZmF1bHRLZXlQYWlyLmdldEFkZHJlc3MoKSk7XG4gICAgICB0eEJ1aWxkZXIuY291bnRlcignMCcpO1xuICAgICAgdHhCdWlsZGVyLmJyYW5jaCgnQk04UWRaOTJWeWFIMXM1bndBRjlyVVhqaVBaM2czTnNuNm9ZYmRLcWoyUmdIeHZXWFZTJyk7XG4gICAgICB0eEJ1aWxkZXIucHVibGljS2V5VG9SZXZlYWwoZGVmYXVsdEtleVBhaXIuZ2V0S2V5cygpLnB1Yik7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICB0eC5pZC5zaG91bGQuZXF1YWwoJycpO1xuICAgICAgdHgudHlwZS5zaG91bGQuZXF1YWwoVHJhbnNhY3Rpb25UeXBlLkFjY291bnRVcGRhdGUpO1xuICAgICAgdHguc291cmNlLnNob3VsZC5lcXVhbCgndHoyUHRKOXpnRWdGVlRScXk2R1hzc3Q1NHRIM2tzRW5ZdnZTJyk7XG4gICAgICBzaG91bGQuZXF1YWwodHguaW5wdXRzLmxlbmd0aCwgMSk7XG4gICAgICBzaG91bGQuZXF1YWwodHgub3V0cHV0cy5sZW5ndGgsIDApO1xuICAgICAgdHguaW5wdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCd0ejJQdEo5emdFZ0ZWVFJxeTZHWHNzdDU0dEgza3NFbll2dlMnKTtcbiAgICAgIHR4LmlucHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzE0MjAnKTtcblxuICAgICAgY29uc3Qgb2ZmbGluZVR4QnVpbGRlcjogYW55ID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KCd4dHonKSk7XG4gICAgICBvZmZsaW5lVHhCdWlsZGVyLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICBvZmZsaW5lVHhCdWlsZGVyLnNvdXJjZShkZWZhdWx0S2V5UGFpci5nZXRBZGRyZXNzKCkpO1xuICAgICAgb2ZmbGluZVR4QnVpbGRlci5zaWduKHsga2V5OiBkZWZhdWx0S2V5UGFpci5nZXRLZXlzKCkucHJ2IH0pO1xuICAgICAgY29uc3Qgc2lnbmVkVHggPSBhd2FpdCBvZmZsaW5lVHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIHNpZ25lZFR4LmlkLnNob3VsZC5lcXVhbCgnb29tWHM2UHVXdG1Hd01Lb1hUTnN1OVhKSG5HWHR1UnVqY0hNZVlTOXkzN1hqNnNYUEhiJyk7XG4gICAgICBzaWduZWRUeC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuQWNjb3VudFVwZGF0ZSk7XG4gICAgICBzaWduZWRUeC5zb3VyY2Uuc2hvdWxkLmVxdWFsKCd0ejJQdEo5emdFZ0ZWVFJxeTZHWHNzdDU0dEgza3NFbll2dlMnKTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWduZWRUeC5pbnB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWduZWRUeC5vdXRwdXRzLmxlbmd0aCwgMCk7XG4gICAgICBzaWduZWRUeC5pbnB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ3R6MlB0Sjl6Z0VnRlZUUnF5NkdYc3N0NTR0SDNrc0VuWXZ2UycpO1xuICAgICAgc2lnbmVkVHguaW5wdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTQyMCcpO1xuICAgICAgc2lnbmVkVHguc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICBzaWduZWRUeC5zaWduYXR1cmVbMF0uc2hvdWxkLmVxdWFsKFxuICAgICAgICAnc2lnUXlZc2ZodHJKQktadUpTRWl6RGR4b2VqTlZ2SldSWlBETVdkcFhWdmRUVml4MzdIelVSd1hmWHNpOU1FVG5SenNrdmpnc0JTZ2lGNHByN1JWeHpXTHVpeHhKTDhVJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHNlbmQgdHJhbnNhY3Rpb24gdG8gc2luZ2xlIGRlc3RpbmF0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRlc3REYXRhVG9TaWduID1cbiAgICAgICAgJzA1MDcwNzBhMDAwMDAwMTYwMTk2MzY5YzkwNjI1NTc1YmE0NDU5NGIyMzc5NDgzMmE5MzM3ZjdhMmQwMDA3MDcwMDAwMDUwNTAyMDAwMDAwMzIwMzIwMDUzZDAzNmQwNzQzMDM1ZDBhMDAwMDAwMTUwMDZiNWRkYWVmM2ZiNWQ3YzE1MWNmYjM2ZmJlNDNhN2EwNjY3NzczOTQwMzFlMDc0MzAzNmEwMDAxMDM0ZjAzNGQwMzFiJztcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjogYW55ID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KCd4dHonKSk7XG4gICAgICB0eEJ1aWxkZXIudHlwZShUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICB0eEJ1aWxkZXIuYnJhbmNoKCdCTThRZFo5MlZ5YUgxczVud0FGOXJVWGppUFozZzNOc242b1liZEtxajJSZ0h4dldYVlMnKTtcbiAgICAgIHR4QnVpbGRlci5jb3VudGVyKCcwJyk7XG4gICAgICB0eEJ1aWxkZXIuc291cmNlKGRlZmF1bHRLZXlQYWlyLmdldEFkZHJlc3MoKSk7XG4gICAgICB0eEJ1aWxkZXJcbiAgICAgICAgLnRyYW5zZmVyKCcxMDAnKVxuICAgICAgICAuZnJvbSgnS1QxTkgyTTIzeG92aHc3dXdXVnVvR1RZeHlrZUNjVmZTcWhMJylcbiAgICAgICAgLnRvKCdLVDFIVXJ0Nmtmdll5REVZQ0oyR1NqdlRQWjZLbVJmeExCVTgnKVxuICAgICAgICAuZmVlKCc0NzY0JylcbiAgICAgICAgLmNvdW50ZXIoJzEnKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ2JhN2EwNGZhYjFhM2Y3N2VkYTk2YjU1MTk0N2RkMzQzZTE2NWQxYjkxYjZmOWY4MDY2NDhiNjNlNTdjODhjYzg2YzAxYWFjYTg3YmRiY2RjNGU2MTE3YjY2N2UyOWY5YjUwNDM2MmM4MzFiYjljMjUwMGU4NTI4MTAyMDAwMTk2MzY5YzkwNjI1NTc1YmE0NDU5NGIyMzc5NDgzMmE5MzM3ZjdhMmQwMGZmZmYwNDZkNjE2OTZlMDAwMDAwNzYwNzA3MDcwNzAwMDEwNTA1MDIwMDAwMDA1ZTAzMjAwNTNkMDM2ZDA3NDMwMzZlMDEwMDAwMDAyNDRiNTQzMTQ4NTU3Mjc0MzY2YjY2NzY1OTc5NDQ0NTU5NDM0YTMyNDc1MzZhNzY1NDUwNWEzNjRiNmQ1MjY2Nzg0YzQyNTUzODA1NTUwMzZjMDIwMDAwMDAxNTA3MmYwMjAwMDAwMDA5MDIwMDAwMDAwNDAzNGYwMzI3MDIwMDAwMDAwMDA3NDMwMzZhMDBhNDAxMDM0ZjAzNGQwMzFiMDIwMDAwMDAwNjAzMDYwMzA2MDMwNidcbiAgICAgICk7XG5cbiAgICAgIC8vIE9mZmxpbmUgc2lnbmluZyBmcm9tIGxvY2F0aW9uIDEgd2l0aCBhIHRyYW5zZmVyIGtleVxuICAgICAgY29uc3Qgb2ZmbGluZVR4QnVpbGRlcjE6IGFueSA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5zLmdldCgneHR6JykpO1xuICAgICAgb2ZmbGluZVR4QnVpbGRlcjEuZnJvbSh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIG9mZmxpbmVUeEJ1aWxkZXIxLnNvdXJjZShkZWZhdWx0S2V5UGFpci5nZXRBZGRyZXNzKCkpO1xuICAgICAgLy8gU2luY2UgZGF0YVRvU2lnbiBjYW5ub3QgbWUgY2FsY3VsYXRlZCwgaXQgaGFzIHRvIGJlIHBhc3NlZCB0byB0aGUgbmV3IGJ1aWxkZXIgc28gd2UgY2FuXG4gICAgICAvLyBnZW5lcmF0ZSB0aGUgc2lnbmF0dXJlc1xuICAgICAgb2ZmbGluZVR4QnVpbGRlcjEub3ZlcnJpZGVEYXRhVG9TaWduKHsgZGF0YVRvU2lnbjogdGVzdERhdGFUb1NpZ24gfSk7XG4gICAgICBvZmZsaW5lVHhCdWlsZGVyMS5zaWduKHtcbiAgICAgICAga2V5OiBuZXcgWHR6TGliLktleVBhaXIoeyBwcnY6ICdzcHNrMmNiaVZzQXZwR0ttYXU5WGNNc2NMM05Sd2preVQ1NzVONUF5QW9mY29qNDF4Nmc2VEwnIH0pLmdldEtleXMoKS5wcnYsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4MSA9IGF3YWl0IG9mZmxpbmVUeEJ1aWxkZXIxLmJ1aWxkKCk7XG5cbiAgICAgIC8vIE9mZmxpbmUgc2lnbmluZyBmcm9tIGxvY2F0aW9uIDIgd2l0aCBhbm90aGVyIHRyYW5zZmVyIGtleVxuICAgICAgY29uc3Qgb2ZmbGluZVR4QnVpbGRlcjI6IGFueSA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5zLmdldCgneHR6JykpO1xuICAgICAgb2ZmbGluZVR4QnVpbGRlcjIuZnJvbShzaWduZWRUeDEudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICBvZmZsaW5lVHhCdWlsZGVyMi5zb3VyY2UoZGVmYXVsdEtleVBhaXIuZ2V0QWRkcmVzcygpKTtcbiAgICAgIG9mZmxpbmVUeEJ1aWxkZXIyLm92ZXJyaWRlRGF0YVRvU2lnbih7IGRhdGFUb1NpZ246IHRlc3REYXRhVG9TaWduIH0pO1xuICAgICAgb2ZmbGluZVR4QnVpbGRlcjIuc2lnbih7IGtleTogbmV3IFh0ekxpYi5LZXlQYWlyKHsgc2VlZDogQnVmZmVyLmFsbG9jKDE2KSB9KS5nZXRLZXlzKCkucHJ2IH0pO1xuICAgICAgY29uc3Qgc2lnbmVkVHgyID0gYXdhaXQgb2ZmbGluZVR4QnVpbGRlcjIuYnVpbGQoKTtcblxuICAgICAgLy8gT2ZmbGluZSBzaWduaW5nIGZyb20gbG9jYXRpb24gMyB3aXRoIHRoZSBmZWUga2V5XG4gICAgICBjb25zdCBvZmZsaW5lVHhCdWlsZGVyMzogYW55ID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KCd4dHonKSk7XG4gICAgICBvZmZsaW5lVHhCdWlsZGVyMy5mcm9tKHNpZ25lZFR4Mi50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIG9mZmxpbmVUeEJ1aWxkZXIzLnNvdXJjZShkZWZhdWx0S2V5UGFpci5nZXRBZGRyZXNzKCkpO1xuICAgICAgb2ZmbGluZVR4QnVpbGRlcjMuc2lnbih7IGtleTogZGVmYXVsdEtleVBhaXIuZ2V0S2V5cygpLnBydiB9KTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4ID0gYXdhaXQgb2ZmbGluZVR4QnVpbGRlcjMuYnVpbGQoKTtcblxuICAgICAgc2lnbmVkVHguaWQuc2hvdWxkLmVxdWFsKCdvbmtId2Z1WUpNcnR4TmR5TDZlSGVORUh1RTFuNUhQSDc1Q1hVTmg5MWFnamJRQXh3elQnKTtcbiAgICAgIHNpZ25lZFR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWduZWRUeC5pbnB1dHMubGVuZ3RoLCAyKTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWduZWRUeC5vdXRwdXRzLmxlbmd0aCwgMSk7XG4gICAgICBzaWduZWRUeC5pbnB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ3R6MlB0Sjl6Z0VnRlZUUnF5NkdYc3N0NTR0SDNrc0VuWXZ2UycpO1xuICAgICAgc2lnbmVkVHguaW5wdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnNDc2NCcpO1xuICAgICAgc2lnbmVkVHguaW5wdXRzWzFdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCdLVDFOSDJNMjN4b3Zodzd1d1dWdW9HVFl4eWtlQ2NWZlNxaEwnKTtcbiAgICAgIHNpZ25lZFR4LmlucHV0c1sxXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMCcpO1xuICAgICAgc2lnbmVkVHgub3V0cHV0c1swXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgnS1QxSFVydDZrZnZZeURFWUNKMkdTanZUUFo2S21SZnhMQlU4Jyk7XG4gICAgICBzaWduZWRUeC5vdXRwdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwJyk7XG4gICAgICBzaWduZWRUeC5zaWduYXR1cmUubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHNpZ25lZFR4LnNpZ25hdHVyZVswXS5zaG91bGQuZXF1YWwoXG4gICAgICAgICdzaWdkOEIzNkpVVnlEcXBDdlYxR3RiTHBQMzk4Z3Btd2Z4dkdRTTZlUTQ1Skc1ejRMZ0RSWDU1WVBBUFRNVzJwQWNpd2FBM2p2OHdneXhSOWNuRWpzQ0ZzMVFSUGZROUcnXG4gICAgICApO1xuICAgICAgc2lnbmVkVHhcbiAgICAgICAgLnRvQnJvYWRjYXN0Rm9ybWF0KClcbiAgICAgICAgLnNob3VsZC5lcXVhbChcbiAgICAgICAgICAnYmE3YTA0ZmFiMWEzZjc3ZWRhOTZiNTUxOTQ3ZGQzNDNlMTY1ZDFiOTFiNmY5ZjgwNjY0OGI2M2U1N2M4OGNjODZjMDFhYWNhODdiZGJjZGM0ZTYxMTdiNjY3ZTI5ZjliNTA0MzYyYzgzMWJiOWMyNTAwZTg1MjgxMDIwMDAxOTYzNjljOTA2MjU1NzViYTQ0NTk0YjIzNzk0ODMyYTkzMzdmN2EyZDAwZmZmZjA0NmQ2MTY5NmUwMDAwMDE0MDA3MDcwNzA3MDAwMTA1MDUwMjAwMDAwMDVlMDMyMDA1M2QwMzZkMDc0MzAzNmUwMTAwMDAwMDI0NGI1NDMxNDg1NTcyNzQzNjZiNjY3NjU5Nzk0NDQ1NTk0MzRhMzI0NzUzNmE3NjU0NTA1YTM2NGI2ZDUyNjY3ODRjNDI1NTM4MDU1NTAzNmMwMjAwMDAwMDE1MDcyZjAyMDAwMDAwMDkwMjAwMDAwMDA0MDM0ZjAzMjcwMjAwMDAwMDAwMDc0MzAzNmEwMGE0MDEwMzRmMDM0ZDAzMWIwMjAwMDAwMGQwMDUwOTAxMDAwMDAwNjA3MzY5Njc0ZTZhNDQzNjM0NGU3NTU2NmU1NTRiMzc2ZjU2NDIzMjYzMzI1MzUwMzMzMjU2NTk2YTM3NjQ1NDc5NmI2MjZlNTI3ODc5NDQ2ZjUzMzk0MjQ3NzY2NzYxNjc3NjZlNGQ2MzU0MzQ2ODU5NjM2MzYxNjI2MjQ2NDc2ZjM5NzQ2NDU2NTE1NDM0NGQzNDM2NjU3YTU5NGE2NDRjMzI3MDdhNTk0NDUzNzc2YjY2NTIzNjc5NzI3MDcwNTkwNTA5MDEwMDAwMDA2MDczNjk2NzU5NjY1NjU5NGE1NTYxNjk0YjRiNWE1ODM0N2E3MzdhNTc1YTM3NTI0NjMyMzkzMjZlNTYzMjUwMzY1ODRkMzQ2ZTRiNjU2YjMyNTk2NzU3NTEzODQyNGM1MzMxNzIzMjMyNzUzNDYxMzk1MzQzNzY0NzRkNjM2MjM4Mzk0MjZhNTQ2Njc0NTQ2ZTMyNzY2NzU1N2E0MzU0NTE0NzUzMzI2MzRhNGU3NjYyNTk3NDc1NDc1MTZhNDc1MDAzMDY3M2IxMzkzZmJkYTRmMjRlMDc5NTgxMzZkYzc5NTFlMGQwMjA3NDhlNTRiZDI5Yjg0NzMyM2VmMmJjODVjMzk5NjU3ZjQzNTlmYzEwYTEzZTVhZmU3YjcwNjhiNTg0ZWEyZTU3ODczNjI1MDg4MTQ4MWUyMTJlOTc5M2JmYmY4OCdcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdhIHNlbmQgdHJhbnNhY3Rpb24gdG8gbXVsdGlwbGUgZGVzdGluYXRpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGVzdERhdGFUb1NpZ24gPVxuICAgICAgICAnMDUwNzA3MGEwMDAwMDAxNjAxOTYzNjljOTA2MjU1NzViYTQ0NTk0YjIzNzk0ODMyYTkzMzdmN2EyZDAwMDcwNzAwMDAwNTA1MDIwMDAwMDAzMjAzMjAwNTNkMDM2ZDA3NDMwMzVkMGEwMDAwMDAxNTAwNmI1ZGRhZWYzZmI1ZDdjMTUxY2ZiMzZmYmU0M2E3YTA2Njc3NzM5NDAzMWUwNzQzMDM2YTAwMDEwMzRmMDM0ZDAzMWInO1xuICAgICAgY29uc3QgdHhCdWlsZGVyOiBhbnkgPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uQnVpbGRlcihjb2lucy5nZXQoJ3h0eicpKTtcbiAgICAgIHR4QnVpbGRlci50eXBlKFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIHR4QnVpbGRlci5icmFuY2goJ0JNOFFkWjkyVnlhSDFzNW53QUY5clVYamlQWjNnM05zbjZvWWJkS3FqMlJnSHh2V1hWUycpO1xuICAgICAgdHhCdWlsZGVyLmNvdW50ZXIoJzAnKTtcbiAgICAgIHR4QnVpbGRlci5zb3VyY2UoZGVmYXVsdEtleVBhaXIuZ2V0QWRkcmVzcygpKTtcbiAgICAgIHR4QnVpbGRlclxuICAgICAgICAudHJhbnNmZXIoJzEwMCcpXG4gICAgICAgIC5mcm9tKCdLVDFOSDJNMjN4b3Zodzd1d1dWdW9HVFl4eWtlQ2NWZlNxaEwnKVxuICAgICAgICAudG8oJ0tUMUhVcnQ2a2Z2WXlERVlDSjJHU2p2VFBaNkttUmZ4TEJVOCcpXG4gICAgICAgIC5mZWUoJzQ3NjQnKVxuICAgICAgICAuY291bnRlcignMScpO1xuICAgICAgdHhCdWlsZGVyXG4gICAgICAgIC50cmFuc2ZlcignMTAwJylcbiAgICAgICAgLmZyb20oJ0tUMU5IMk0yM3hvdmh3N3V3V1Z1b0dUWXh5a2VDY1ZmU3FoTCcpXG4gICAgICAgIC50bygndHoxVlJqUnBWS252MTZBVnByRkgxdGtEbjRURGZWcUE4OTNBJylcbiAgICAgICAgLmZlZSgnNDc2NCcpXG4gICAgICAgIC5jb3VudGVyKCcyJyk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwoXG4gICAgICAgICdiYTdhMDRmYWIxYTNmNzdlZGE5NmI1NTE5NDdkZDM0M2UxNjVkMWI5MWI2ZjlmODA2NjQ4YjYzZTU3Yzg4Y2M4NmMwMWFhY2E4N2JkYmNkYzRlNjExN2I2NjdlMjlmOWI1MDQzNjJjODMxYmI5YzI1MDBlODUyODEwMjAwMDE5NjM2OWM5MDYyNTU3NWJhNDQ1OTRiMjM3OTQ4MzJhOTMzN2Y3YTJkMDBmZmZmMDQ2ZDYxNjk2ZTAwMDAwMDc2MDcwNzA3MDcwMDAxMDUwNTAyMDAwMDAwNWUwMzIwMDUzZDAzNmQwNzQzMDM2ZTAxMDAwMDAwMjQ0YjU0MzE0ODU1NzI3NDM2NmI2Njc2NTk3OTQ0NDU1OTQzNGEzMjQ3NTM2YTc2NTQ1MDVhMzY0YjZkNTI2Njc4NGM0MjU1MzgwNTU1MDM2YzAyMDAwMDAwMTUwNzJmMDIwMDAwMDAwOTAyMDAwMDAwMDQwMzRmMDMyNzAyMDAwMDAwMDAwNzQzMDM2YTAwYTQwMTAzNGYwMzRkMDMxYjAyMDAwMDAwMDYwMzA2MDMwNjAzMDY2YzAxYWFjYTg3YmRiY2RjNGU2MTE3YjY2N2UyOWY5YjUwNDM2MmM4MzFiYjljMjUwMWU4NTI4MTAyMDAwMTk2MzY5YzkwNjI1NTc1YmE0NDU5NGIyMzc5NDgzMmE5MzM3ZjdhMmQwMGZmZmYwNDZkNjE2OTZlMDAwMDAwNWEwNzA3MDcwNzAwMDIwNTA1MDIwMDAwMDA0MjAzMjAwNTNkMDM2ZDA3NDMwMzVkMDEwMDAwMDAyNDc0N2EzMTU2NTI2YTUyNzA1NjRiNmU3NjMxMzY0MTU2NzA3MjQ2NDgzMTc0NmI0NDZlMzQ1NDQ0NjY1NjcxNDEzODM5MzM0MTAzMWUwNzQzMDM2YTAwYTQwMTAzNGYwMzRkMDMxYjAyMDAwMDAwMDYwMzA2MDMwNjAzMDYnXG4gICAgICApO1xuXG4gICAgICAvLyBPZmZsaW5lIHNpZ25pbmcgZnJvbSBsb2NhdGlvbiAxIHdpdGggYSB0cmFuc2ZlciBrZXlcbiAgICAgIGNvbnN0IG9mZmxpbmVUeEJ1aWxkZXIxOiBhbnkgPSBuZXcgWHR6TGliLlRyYW5zYWN0aW9uQnVpbGRlcihjb2lucy5nZXQoJ3h0eicpKTtcbiAgICAgIG9mZmxpbmVUeEJ1aWxkZXIxLmZyb20odHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICBvZmZsaW5lVHhCdWlsZGVyMS5zb3VyY2UoZGVmYXVsdEtleVBhaXIuZ2V0QWRkcmVzcygpKTtcbiAgICAgIC8vIFNpbmNlIGRhdGFUb1NpZ24gY2Fubm90IG1lIGNhbGN1bGF0ZWQsIGl0IGhhcyB0byBiZSBwYXNzZWQgdG8gdGhlIG5ldyBidWlsZGVyIHNvIHdlIGNhblxuICAgICAgLy8gZ2VuZXJhdGUgdGhlIHNpZ25hdHVyZXNcbiAgICAgIG9mZmxpbmVUeEJ1aWxkZXIxLm92ZXJyaWRlRGF0YVRvU2lnbih7IGRhdGFUb1NpZ246IHRlc3REYXRhVG9TaWduLCBpbmRleDogMCB9KTtcbiAgICAgIG9mZmxpbmVUeEJ1aWxkZXIxLm92ZXJyaWRlRGF0YVRvU2lnbih7IGRhdGFUb1NpZ246IHRlc3REYXRhVG9TaWduLCBpbmRleDogMSB9KTtcbiAgICAgIG9mZmxpbmVUeEJ1aWxkZXIxLnNpZ24oe1xuICAgICAgICBrZXk6IG5ldyBYdHpMaWIuS2V5UGFpcih7IHBydjogJ3Nwc2syY2JpVnNBdnBHS21hdTlYY01zY0wzTlJ3amt5VDU3NU41QXlBb2Zjb2o0MXg2ZzZUTCcgfSkuZ2V0S2V5cygpLnBydixcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc2lnbmVkVHgxID0gYXdhaXQgb2ZmbGluZVR4QnVpbGRlcjEuYnVpbGQoKTtcblxuICAgICAgLy8gT2ZmbGluZSBzaWduaW5nIGZyb20gbG9jYXRpb24gMiB3aXRoIGFub3RoZXIgdHJhbnNmZXIga2V5XG4gICAgICBjb25zdCBvZmZsaW5lVHhCdWlsZGVyMjogYW55ID0gbmV3IFh0ekxpYi5UcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KCd4dHonKSk7XG4gICAgICBvZmZsaW5lVHhCdWlsZGVyMi5mcm9tKHNpZ25lZFR4MS50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICAgIG9mZmxpbmVUeEJ1aWxkZXIyLnNvdXJjZShkZWZhdWx0S2V5UGFpci5nZXRBZGRyZXNzKCkpO1xuICAgICAgb2ZmbGluZVR4QnVpbGRlcjIub3ZlcnJpZGVEYXRhVG9TaWduKHsgZGF0YVRvU2lnbjogdGVzdERhdGFUb1NpZ24sIGluZGV4OiAwIH0pO1xuICAgICAgb2ZmbGluZVR4QnVpbGRlcjIub3ZlcnJpZGVEYXRhVG9TaWduKHsgZGF0YVRvU2lnbjogdGVzdERhdGFUb1NpZ24sIGluZGV4OiAxIH0pO1xuICAgICAgb2ZmbGluZVR4QnVpbGRlcjIuc2lnbih7IGtleTogbmV3IFh0ekxpYi5LZXlQYWlyKHsgc2VlZDogQnVmZmVyLmFsbG9jKDE2KSB9KS5nZXRLZXlzKCkucHJ2LCBpbmRleDogMSB9KTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4MiA9IGF3YWl0IG9mZmxpbmVUeEJ1aWxkZXIyLmJ1aWxkKCk7XG5cbiAgICAgIC8vIE9mZmxpbmUgc2lnbmluZyBmcm9tIGxvY2F0aW9uIDMgd2l0aCB0aGUgZmVlIGtleVxuICAgICAgY29uc3Qgb2ZmbGluZVR4QnVpbGRlcjM6IGFueSA9IG5ldyBYdHpMaWIuVHJhbnNhY3Rpb25CdWlsZGVyKGNvaW5zLmdldCgneHR6JykpO1xuICAgICAgb2ZmbGluZVR4QnVpbGRlcjMuZnJvbShzaWduZWRUeDIudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICBvZmZsaW5lVHhCdWlsZGVyMy5zb3VyY2UoZGVmYXVsdEtleVBhaXIuZ2V0QWRkcmVzcygpKTtcbiAgICAgIG9mZmxpbmVUeEJ1aWxkZXIzLnNpZ24oeyBrZXk6IGRlZmF1bHRLZXlQYWlyLmdldEtleXMoKS5wcnYgfSk7XG4gICAgICBjb25zdCBzaWduZWRUeCA9IGF3YWl0IG9mZmxpbmVUeEJ1aWxkZXIzLmJ1aWxkKCk7XG5cbiAgICAgIHNpZ25lZFR4LmlkLnNob3VsZC5lcXVhbCgnb255R2FXczZ6NGJWVmNmbjNoOUtiQnJrdEVodUR5SkxZRVZCNGFKUk02WU5uZ2pEeEU0Jyk7XG4gICAgICBzaWduZWRUeC50eXBlLnNob3VsZC5lcXVhbChUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICBzaWduZWRUeC5zb3VyY2Uuc2hvdWxkLmVxdWFsKCd0ejJQdEo5emdFZ0ZWVFJxeTZHWHNzdDU0dEgza3NFbll2dlMnKTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWduZWRUeC5pbnB1dHMubGVuZ3RoLCA0KTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWduZWRUeC5vdXRwdXRzLmxlbmd0aCwgMik7XG4gICAgICBzaWduZWRUeC5pbnB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ3R6MlB0Sjl6Z0VnRlZUUnF5NkdYc3N0NTR0SDNrc0VuWXZ2UycpO1xuICAgICAgc2lnbmVkVHguaW5wdXRzWzBdLnZhbHVlLnNob3VsZC5lcXVhbCgnNDc2NCcpO1xuICAgICAgc2lnbmVkVHguaW5wdXRzWzFdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCdLVDFOSDJNMjN4b3Zodzd1d1dWdW9HVFl4eWtlQ2NWZlNxaEwnKTtcbiAgICAgIHNpZ25lZFR4LmlucHV0c1sxXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMCcpO1xuICAgICAgc2lnbmVkVHguaW5wdXRzWzJdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKCd0ejJQdEo5emdFZ0ZWVFJxeTZHWHNzdDU0dEgza3NFbll2dlMnKTtcbiAgICAgIHNpZ25lZFR4LmlucHV0c1syXS52YWx1ZS5zaG91bGQuZXF1YWwoJzQ3NjQnKTtcbiAgICAgIHNpZ25lZFR4LmlucHV0c1szXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgnS1QxTkgyTTIzeG92aHc3dXdXVnVvR1RZeHlrZUNjVmZTcWhMJyk7XG4gICAgICBzaWduZWRUeC5pbnB1dHNbM10udmFsdWUuc2hvdWxkLmVxdWFsKCcxMDAnKTtcbiAgICAgIHNpZ25lZFR4Lm91dHB1dHNbMF0uYWRkcmVzcy5zaG91bGQuZXF1YWwoJ0tUMUhVcnQ2a2Z2WXlERVlDSjJHU2p2VFBaNkttUmZ4TEJVOCcpO1xuICAgICAgc2lnbmVkVHgub3V0cHV0c1swXS52YWx1ZS5zaG91bGQuZXF1YWwoJzEwMCcpO1xuICAgICAgc2lnbmVkVHgub3V0cHV0c1sxXS5hZGRyZXNzLnNob3VsZC5lcXVhbCgndHoxVlJqUnBWS252MTZBVnByRkgxdGtEbjRURGZWcUE4OTNBJyk7XG4gICAgICBzaWduZWRUeC5vdXRwdXRzWzFdLnZhbHVlLnNob3VsZC5lcXVhbCgnMTAwJyk7XG4gICAgICBzaWduZWRUeC5zaWduYXR1cmUubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHNpZ25lZFR4LnNpZ25hdHVyZVswXS5zaG91bGQuZXF1YWwoXG4gICAgICAgICdzaWdkVXB6Q3htaTlOV2hkYkZHZnZxVnlIOFhmcjJVaVBjMmZrcU5yUTRDSHZyazE5WkRrc0Rrc0VjNERKc1RicGhlblY4akNOWkZxekw0c0NWUnpNOTNIblNTcWdKejcnXG4gICAgICApO1xuICAgICAgY29uc3QgZmlyc3RUcmFuc2ZlclNpZ25hdHVyZXMgPSBzaWduZWRUeC5nZXRUcmFuc2ZlclNpZ25hdHVyZXMoKTtcbiAgICAgIGZpcnN0VHJhbnNmZXJTaWduYXR1cmVzLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gICAgICBmaXJzdFRyYW5zZmVyU2lnbmF0dXJlc1swXS5zaWduYXR1cmUuc2hvdWxkLmVxdWFsKFxuICAgICAgICAnc2lnTmpENjROdVZuVUs3b1ZCMmMyU1AzMlZZajdkVHlrYm5SeHlEb1M5Qkd2Z2Fndm5NY1Q0aFljY2FiYkZHbzl0ZFZRVDRNNDZlellKZEwycHpZRFN3a2ZSNnlycHBZJ1xuICAgICAgKTtcbiAgICAgIGZpcnN0VHJhbnNmZXJTaWduYXR1cmVzWzBdLmluZGV4LnNob3VsZC5lcXVhbCgwKTtcbiAgICAgIGZpcnN0VHJhbnNmZXJTaWduYXR1cmVzWzFdLnNpZ25hdHVyZS5zaG91bGQuZXF1YWwoXG4gICAgICAgICdzaWdZZlZZSlVhaUtLWlg0enN6V1o3UkYyOTJuVjJQNlhNNG5LZWsyWWdXUThCTFMxcjIydTRhOVNDdkdNY2I4OUJqVGZ0VG4ydmdVekNUUUdTMmNKTnZiWXR1R1FqR1AnXG4gICAgICApO1xuICAgICAgZmlyc3RUcmFuc2ZlclNpZ25hdHVyZXNbMV0uaW5kZXguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgLy8gTm90ZTogU2lnbmF0dXJlcyBhcmUgdGhlIHNhbWUgaGVyZSBiZWNhdXNlIHRoZSBkYXRhIHRvIHNpZ24gdXNlZCBpbiB0aGUgdGVzdCBpcyB0aGUgc2FtZVxuICAgICAgY29uc3Qgc2Vjb25kVHJhbnNmZXJTaWduYXR1cmVzID0gc2lnbmVkVHguZ2V0VHJhbnNmZXJTaWduYXR1cmVzKDEpO1xuICAgICAgc2Vjb25kVHJhbnNmZXJTaWduYXR1cmVzLmxlbmd0aC5zaG91bGQuZXF1YWwoMik7XG4gICAgICBzZWNvbmRUcmFuc2ZlclNpZ25hdHVyZXNbMF0uc2lnbmF0dXJlLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ3NpZ05qRDY0TnVWblVLN29WQjJjMlNQMzJWWWo3ZFR5a2JuUnh5RG9TOUJHdmdhZ3ZuTWNUNGhZY2NhYmJGR285dGRWUVQ0TTQ2ZXpZSmRMMnB6WURTd2tmUjZ5cnBwWSdcbiAgICAgICk7XG4gICAgICBzZWNvbmRUcmFuc2ZlclNpZ25hdHVyZXNbMF0uaW5kZXguc2hvdWxkLmVxdWFsKDApO1xuICAgICAgc2Vjb25kVHJhbnNmZXJTaWduYXR1cmVzWzFdLnNpZ25hdHVyZS5zaG91bGQuZXF1YWwoXG4gICAgICAgICdzaWdZZlZZSlVhaUtLWlg0enN6V1o3UkYyOTJuVjJQNlhNNG5LZWsyWWdXUThCTFMxcjIydTRhOVNDdkdNY2I4OUJqVGZ0VG4ydmdVekNUUUdTMmNKTnZiWXR1R1FqR1AnXG4gICAgICApO1xuICAgICAgc2Vjb25kVHJhbnNmZXJTaWduYXR1cmVzWzFdLmluZGV4LnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHNpZ25lZFR4XG4gICAgICAgIC50b0Jyb2FkY2FzdEZvcm1hdCgpXG4gICAgICAgIC5zaG91bGQuZXF1YWwoXG4gICAgICAgICAgJ2JhN2EwNGZhYjFhM2Y3N2VkYTk2YjU1MTk0N2RkMzQzZTE2NWQxYjkxYjZmOWY4MDY2NDhiNjNlNTdjODhjYzg2YzAxYWFjYTg3YmRiY2RjNGU2MTE3YjY2N2UyOWY5YjUwNDM2MmM4MzFiYjljMjUwMGU4NTI4MTAyMDAwMTk2MzY5YzkwNjI1NTc1YmE0NDU5NGIyMzc5NDgzMmE5MzM3ZjdhMmQwMGZmZmYwNDZkNjE2OTZlMDAwMDAxNDAwNzA3MDcwNzAwMDEwNTA1MDIwMDAwMDA1ZTAzMjAwNTNkMDM2ZDA3NDMwMzZlMDEwMDAwMDAyNDRiNTQzMTQ4NTU3Mjc0MzY2YjY2NzY1OTc5NDQ0NTU5NDM0YTMyNDc1MzZhNzY1NDUwNWEzNjRiNmQ1MjY2Nzg0YzQyNTUzODA1NTUwMzZjMDIwMDAwMDAxNTA3MmYwMjAwMDAwMDA5MDIwMDAwMDAwNDAzNGYwMzI3MDIwMDAwMDAwMDA3NDMwMzZhMDBhNDAxMDM0ZjAzNGQwMzFiMDIwMDAwMDBkMDA1MDkwMTAwMDAwMDYwNzM2OTY3NGU2YTQ0MzYzNDRlNzU1NjZlNTU0YjM3NmY1NjQyMzI2MzMyNTM1MDMzMzI1NjU5NmEzNzY0NTQ3OTZiNjI2ZTUyNzg3OTQ0NmY1MzM5NDI0Nzc2Njc2MTY3NzY2ZTRkNjM1NDM0Njg1OTYzNjM2MTYyNjI0NjQ3NmYzOTc0NjQ1NjUxNTQzNDRkMzQzNjY1N2E1OTRhNjQ0YzMyNzA3YTU5NDQ1Mzc3NmI2NjUyMzY3OTcyNzA3MDU5MDUwOTAxMDAwMDAwNjA3MzY5Njc1OTY2NTY1OTRhNTU2MTY5NGI0YjVhNTgzNDdhNzM3YTU3NWEzNzUyNDYzMjM5MzI2ZTU2MzI1MDM2NTg0ZDM0NmU0YjY1NmIzMjU5Njc1NzUxMzg0MjRjNTMzMTcyMzIzMjc1MzQ2MTM5NTM0Mzc2NDc0ZDYzNjIzODM5NDI2YTU0NjY3NDU0NmUzMjc2Njc1NTdhNDM1NDUxNDc1MzMyNjM0YTRlNzY2MjU5NzQ3NTQ3NTE2YTQ3NTAwMzA2NmMwMWFhY2E4N2JkYmNkYzRlNjExN2I2NjdlMjlmOWI1MDQzNjJjODMxYmI5YzI1MDFlODUyODEwMjAwMDE5NjM2OWM5MDYyNTU3NWJhNDQ1OTRiMjM3OTQ4MzJhOTMzN2Y3YTJkMDBmZmZmMDQ2ZDYxNjk2ZTAwMDAwMTI0MDcwNzA3MDcwMDAyMDUwNTAyMDAwMDAwNDIwMzIwMDUzZDAzNmQwNzQzMDM1ZDAxMDAwMDAwMjQ3NDdhMzE1NjUyNmE1MjcwNTY0YjZlNzYzMTM2NDE1NjcwNzI0NjQ4MzE3NDZiNDQ2ZTM0NTQ0NDY2NTY3MTQxMzgzOTMzNDEwMzFlMDc0MzAzNmEwMGE0MDEwMzRmMDM0ZDAzMWIwMjAwMDAwMGQwMDUwOTAxMDAwMDAwNjA3MzY5Njc0ZTZhNDQzNjM0NGU3NTU2NmU1NTRiMzc2ZjU2NDIzMjYzMzI1MzUwMzMzMjU2NTk2YTM3NjQ1NDc5NmI2MjZlNTI3ODc5NDQ2ZjUzMzk0MjQ3NzY2NzYxNjc3NjZlNGQ2MzU0MzQ2ODU5NjM2MzYxNjI2MjQ2NDc2ZjM5NzQ2NDU2NTE1NDM0NGQzNDM2NjU3YTU5NGE2NDRjMzI3MDdhNTk0NDUzNzc2YjY2NTIzNjc5NzI3MDcwNTkwNTA5MDEwMDAwMDA2MDczNjk2NzU5NjY1NjU5NGE1NTYxNjk0YjRiNWE1ODM0N2E3MzdhNTc1YTM3NTI0NjMyMzkzMjZlNTYzMjUwMzY1ODRkMzQ2ZTRiNjU2YjMyNTk2NzU3NTEzODQyNGM1MzMxNzIzMjMyNzUzNDYxMzk1MzQzNzY0NzRkNjM2MjM4Mzk0MjZhNTQ2Njc0NTQ2ZTMyNzY2NzU1N2E0MzU0NTE0NzUzMzI2MzRhNGU3NjYyNTk3NDc1NDc1MTZhNDc1MDAzMDY3NjZhMGIxZjZjYjAzNWJmNTM3ODg3YmE5MDA0YzQ4OWJiNDU4ZDhjOGU3MmI1MDMzYjZjZWU4YWQ1MmY4NGVjMjdiNzE5ZjVkMGI5OGNkZjJkMDc0NGIyNTUzMDEyNjM2ODg2OTI2NDVlYWZjOWNkZjFiNDhiNTA1M2M1MWRjYSdcbiAgICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!