PHP WebShell

Текущая директория: /opt/BitGoJS/modules/sdk-coin-ada/dist/test/unit

Просмотр файла: StakingActivateBuilder.js

"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    var desc = Object.getOwnPropertyDescriptor(m, k);
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
      desc = { enumerable: true, get: function() { return m[k]; } };
    }
    Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
    o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
    var ownKeys = function(o) {
        ownKeys = Object.getOwnPropertyNames || function (o) {
            var ar = [];
            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
            return ar;
        };
        return ownKeys(o);
    };
    return function (mod) {
        if (mod && mod.__esModule) return mod;
        var result = {};
        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
        __setModuleDefault(result, mod);
        return result;
    };
})();
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 testData = __importStar(require("../resources"));
const src_1 = require("../../src");
const statics_1 = require("@bitgo/statics");
const transaction_1 = require("../../src/lib/transaction");
const Utils = __importStar(require("../../src/lib/utils"));
describe('ADA Staking Activate Transaction Builder', async () => {
    const factory = new src_1.TransactionBuilderFactory(statics_1.coins.get('tada'));
    it('start and build an unsigned staking activate tx', async () => {
        const keyPairStake = new src_1.KeyPair({ prv: testData.privateKeys.prvKey2 });
        const txBuilder = factory.getStakingActivateBuilder();
        txBuilder.input({
            transaction_id: '3677e75c7ba699bfdc6cd57d42f246f86f63aefd76025006ac78313fad2bba21',
            transaction_index: 1,
        });
        const totalInput = '4000000';
        txBuilder.changeAddress('addr1q8rm9z7w4yx5gz652kn2q238efvms6t0qelur9nlglun8eu4tr5knj4fu4adelzqhxg8adu5xca4jra0gtllfrpcawyq9psz23', totalInput);
        txBuilder.stakingCredential(keyPairStake.getKeys().pub, '7a623c48348501c2380e60ac2307fcd1b67df4218f819930821a15b3', 'always-abstain');
        txBuilder.ttl(800000000);
        const tx = (await txBuilder.build());
        should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingActivate);
        const txData = tx.toJson();
        const fee = tx.getFee;
        txData.certs.length.should.equal(3);
        txData.certs[0].type.should.equal(0);
        txData.certs[1].type.should.equal(1);
        txData.certs[2].type.should.equal(transaction_1.CertType.VoteDelegation);
        txData.outputs.length.should.equal(1);
        txData.outputs[0].amount.should.equal((Number(totalInput) - 2000000 - Number(fee)).toString());
        fee.should.equal('171529');
        tx.toBroadcastFormat().should.equal(testData.rawTx.unsignedStakingActiveTx);
        should_1.default.equal(tx.id, testData.rawTx.unsignedStakingActiveTxHash);
    });
    it('should explain a tx', async () => {
        const keyPairStake = new src_1.KeyPair({ prv: testData.privateKeys.prvKey2 });
        const txBuilder = factory.getStakingActivateBuilder();
        txBuilder.input({
            transaction_id: '3677e75c7ba699bfdc6cd57d42f246f86f63aefd76025006ac78313fad2bba21',
            transaction_index: 1,
        });
        const totalInput = '4000000';
        txBuilder.changeAddress('addr1q8rm9z7w4yx5gz652kn2q238efvms6t0qelur9nlglun8eu4tr5knj4fu4adelzqhxg8adu5xca4jra0gtllfrpcawyq9psz23', totalInput);
        txBuilder.stakingCredential(keyPairStake.getKeys().pub, '7a623c48348501c2380e60ac2307fcd1b67df4218f819930821a15b3', 'always-abstain');
        txBuilder.ttl(800000000);
        const tx = (await txBuilder.build());
        should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingActivate);
        tx.explainTransaction();
    });
    // it('build a stakingActivate from rawTx', async () => {
    //   const txBuilder = factory.from(testData.rawTx.unsignedStakingActiveTx);
    //   const builtTx = (await txBuilder.build()) as Transaction;
    //   should.equal(builtTx.type, TransactionType.StakingActivate);
    //   should.equal(builtTx.id, testData.rawTx.unsignedStakingActiveTxHash);
    //   const txData = builtTx.toJson();
    //   const fee = builtTx.getFee;
    //   txData.certs.length.should.equal(2);
    //   txData.certs[0].type.should.equal(0);
    //   txData.certs[1].type.should.equal(1);
    //
    //   txData.outputs.length.should.equal(1);
    //   const totalInput = '4000000';
    //   txData.outputs[0].amount.should.equal((Number(totalInput) - 2000000 - Number(fee)).toString());
    //   fee.should.equal('174389');
    // });
    // it('should submit a staking activate transaction', async () => {
    //   const keyPair = new KeyPair({ prv: testData.privateKeys.prvKey9 });
    //   const keyPairStaking = new KeyPair({ prv: testData.privateKeys.prvKey10 });
    //   const senderAddress = Utils.default.createBaseAddressWithStakeAndPaymentKey(
    //     keyPairStaking,
    //     keyPair,
    //     AddressFormat.testnet
    //   );
    //   const axiosConfig = {
    //     headers: {
    //       'Content-Type': 'application/cbor',
    //     },
    //     timeout: 10000,
    //   };
    //
    //   const txBuilder = factory.getStakingActivateBuilder();
    //   const utxoData = await axios.get('https://testnet.koios.rest/api/v0/address_info?_address=' + senderAddress);
    //   const senderBalance = utxoData.data[0].balance;
    //   txBuilder.changeAddress(senderAddress, senderBalance);
    //   const utxoSet = utxoData.data[0].utxo_set;
    //   for (const utxo of utxoSet) {
    //     txBuilder.input({ transaction_id: utxo.tx_hash, transaction_index: utxo.tx_index });
    //   }
    //
    //   txBuilder.ttl(800000000);
    //   txBuilder.stakingCredential(
    //     keyPairStaking.getKeys().pub,
    //     '7a623c48348501c2380e60ac2307fcd1b67df4218f819930821a15b3'
    //   );
    //   txBuilder.sign({ key: keyPair.getKeys().prv });
    //   txBuilder.sign({ key: keyPairStaking.getKeys().prv });
    //
    //   const tx = await txBuilder.build();
    //   const serializedTx = tx.toBroadcastFormat();
    //   const bytes = Uint8Array.from(Buffer.from(serializedTx, 'hex'));
    //
    //   try {
    //     const res = await axios.post('https://testnet.koios.rest/api/v0/submittx', bytes, axiosConfig);
    //     console.log(res);
    //   } catch (err) {
    //     console.log(err);
    //   }
    // });
    it('should submit a staking transaction using signature interface', async () => {
        const keyPairPayment = new src_1.KeyPair({ prv: testData.privateKeys.prvKey9 });
        const keyPairStake = new src_1.KeyPair({ prv: testData.privateKeys.prvKey10 });
        const senderAddress = Utils.default.createBaseAddressWithStakeAndPaymentKey(keyPairStake, keyPairPayment, sdk_core_1.AddressFormat.testnet);
        const txBuilder = factory.getStakingActivateBuilder();
        const senderBalance = '22122071';
        txBuilder.changeAddress(senderAddress, senderBalance);
        txBuilder.stakingCredential(keyPairStake.getKeys().pub, '7a623c48348501c2380e60ac2307fcd1b67df4218f819930821a15b3', 'always-no-confidence');
        txBuilder.input({
            transaction_id: '0a4f80d83ba9ce1f83306a79252909241308d7eff317d04c9ea018966d687fe3',
            transaction_index: 0,
        });
        txBuilder.ttl(900000000);
        const unsignedTx = await txBuilder.build();
        const signableHex = unsignedTx.signablePayload.toString('hex');
        const serializedTx = unsignedTx.toBroadcastFormat();
        txBuilder.sign({ key: keyPairPayment.getKeys().prv });
        txBuilder.sign({ key: keyPairStake.getKeys().prv });
        const signedTransaction = await txBuilder.build();
        const serializedTransaction = signedTransaction.toBroadcastFormat();
        const txBuilder2 = factory.from(serializedTx);
        const tx = await txBuilder2.build();
        tx.type.should.equal(sdk_core_1.TransactionType.StakingActivate);
        const signableHex2 = tx.signablePayload.toString('hex');
        signableHex.should.equal(signableHex2);
        const signaturePayment = keyPairPayment.signMessage(signableHex2);
        const signatureStake = keyPairStake.signMessage(signableHex2);
        txBuilder2.addSignature({ pub: keyPairPayment.getKeys().pub }, Buffer.from(signaturePayment));
        txBuilder2.addSignature({ pub: keyPairStake.getKeys().pub }, Buffer.from(signatureStake));
        const signedTransaction2 = await txBuilder2.build();
        signedTransaction.id.should.equal(tx.id);
        const serializedTransaction2 = signedTransaction2.toBroadcastFormat();
        serializedTransaction2.should.equal(serializedTransaction);
    });
    it('should submit a staking transaction using one signature', async () => {
        const keyPairPayment = new src_1.KeyPair({ prv: testData.privateKeys.prvKey9 });
        const keyPairStake = keyPairPayment;
        const senderAddress = Utils.default.createBaseAddressWithStakeAndPaymentKey(keyPairStake, keyPairPayment, sdk_core_1.AddressFormat.testnet);
        const txBuilder = factory.getStakingActivateBuilder();
        const senderBalance = '22122071';
        txBuilder.changeAddress(senderAddress, senderBalance);
        txBuilder.stakingCredential(keyPairStake.getKeys().pub, '7a623c48348501c2380e60ac2307fcd1b67df4218f819930821a15b3', 'always-no-confidence');
        txBuilder.input({
            transaction_id: '0a4f80d83ba9ce1f83306a79252909241308d7eff317d04c9ea018966d687fe3',
            transaction_index: 0,
        });
        txBuilder.ttl(900000000);
        const unsignedTx = await txBuilder.build();
        const signableHex = unsignedTx.signablePayload.toString('hex');
        const serializedTx = unsignedTx.toBroadcastFormat();
        txBuilder.sign({ key: keyPairPayment.getKeys().prv });
        const signedTransaction = await txBuilder.build();
        const serializedTransaction = signedTransaction.toBroadcastFormat();
        const txBuilder2 = factory.from(serializedTx);
        const tx = await txBuilder2.build();
        tx.type.should.equal(sdk_core_1.TransactionType.StakingActivate);
        const signableHex2 = tx.signablePayload.toString('hex');
        signableHex.should.equal(signableHex2);
        const signaturePayment = keyPairPayment.signMessage(signableHex2);
        txBuilder2.addSignature({ pub: keyPairPayment.getKeys().pub }, Buffer.from(signaturePayment));
        const signedTransaction2 = await txBuilder2.build();
        signedTransaction.id.should.equal(tx.id);
        const serializedTransaction2 = signedTransaction2.toBroadcastFormat();
        serializedTransaction2.should.equal(serializedTransaction);
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3Rha2luZ0FjdGl2YXRlQnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC9TdGFraW5nQWN0aXZhdGVCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLDhDQUFpRTtBQUNqRSx1REFBeUM7QUFDekMsbUNBQStEO0FBQy9ELDRDQUF1QztBQUN2QywyREFBa0U7QUFDbEUsMkRBQTZDO0FBRTdDLFFBQVEsQ0FBQywwQ0FBMEMsRUFBRSxLQUFLLElBQUksRUFBRTtJQUM5RCxNQUFNLE9BQU8sR0FBRyxJQUFJLCtCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUVqRSxFQUFFLENBQUMsaURBQWlELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDL0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ3RELFNBQVMsQ0FBQyxLQUFLLENBQUM7WUFDZCxjQUFjLEVBQUUsa0VBQWtFO1lBQ2xGLGlCQUFpQixFQUFFLENBQUM7U0FDckIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDO1FBQzdCLFNBQVMsQ0FBQyxhQUFhLENBQ3JCLHlHQUF5RyxFQUN6RyxVQUFVLENBQ1gsQ0FBQztRQUNGLFNBQVMsQ0FBQyxpQkFBaUIsQ0FDekIsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFDMUIsMERBQTBELEVBQzFELGdCQUFnQixDQUNqQixDQUFDO1FBQ0YsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6QixNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFnQixDQUFDO1FBQ3BELGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsMEJBQWUsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN2RCxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDM0IsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUN0QixNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHNCQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFM0QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQy9GLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNCLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzVFLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO0lBQ2xFLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHFCQUFxQixFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ25DLE1BQU0sWUFBWSxHQUFHLElBQUksYUFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN4RSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUN0RCxTQUFTLENBQUMsS0FBSyxDQUFDO1lBQ2QsY0FBYyxFQUFFLGtFQUFrRTtZQUNsRixpQkFBaUIsRUFBRSxDQUFDO1NBQ3JCLENBQUMsQ0FBQztRQUNILE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUM3QixTQUFTLENBQUMsYUFBYSxDQUNyQix5R0FBeUcsRUFDekcsVUFBVSxDQUNYLENBQUM7UUFDRixTQUFTLENBQUMsaUJBQWlCLENBQ3pCLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQzFCLDBEQUEwRCxFQUMxRCxnQkFBZ0IsQ0FDakIsQ0FBQztRQUNGLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDekIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBZ0IsQ0FBQztRQUNwRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLDBCQUFlLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDdkQsRUFBRSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDMUIsQ0FBQyxDQUFDLENBQUM7SUFFSCx5REFBeUQ7SUFDekQsNEVBQTRFO0lBQzVFLDhEQUE4RDtJQUM5RCxpRUFBaUU7SUFDakUsMEVBQTBFO0lBQzFFLHFDQUFxQztJQUNyQyxnQ0FBZ0M7SUFDaEMseUNBQXlDO0lBQ3pDLDBDQUEwQztJQUMxQywwQ0FBMEM7SUFDMUMsRUFBRTtJQUNGLDJDQUEyQztJQUMzQyxrQ0FBa0M7SUFDbEMsb0dBQW9HO0lBQ3BHLGdDQUFnQztJQUNoQyxNQUFNO0lBRU4sbUVBQW1FO0lBQ25FLHdFQUF3RTtJQUN4RSxnRkFBZ0Y7SUFDaEYsaUZBQWlGO0lBQ2pGLHNCQUFzQjtJQUN0QixlQUFlO0lBQ2YsNEJBQTRCO0lBQzVCLE9BQU87SUFDUCwwQkFBMEI7SUFDMUIsaUJBQWlCO0lBQ2pCLDRDQUE0QztJQUM1QyxTQUFTO0lBQ1Qsc0JBQXNCO0lBQ3RCLE9BQU87SUFDUCxFQUFFO0lBQ0YsMkRBQTJEO0lBQzNELGtIQUFrSDtJQUNsSCxvREFBb0Q7SUFDcEQsMkRBQTJEO0lBQzNELCtDQUErQztJQUMvQyxrQ0FBa0M7SUFDbEMsMkZBQTJGO0lBQzNGLE1BQU07SUFDTixFQUFFO0lBQ0YsOEJBQThCO0lBQzlCLGlDQUFpQztJQUNqQyxvQ0FBb0M7SUFDcEMsaUVBQWlFO0lBQ2pFLE9BQU87SUFDUCxvREFBb0Q7SUFDcEQsMkRBQTJEO0lBQzNELEVBQUU7SUFDRix3Q0FBd0M7SUFDeEMsaURBQWlEO0lBQ2pELHFFQUFxRTtJQUNyRSxFQUFFO0lBQ0YsVUFBVTtJQUNWLHNHQUFzRztJQUN0Ryx3QkFBd0I7SUFDeEIsb0JBQW9CO0lBQ3BCLHdCQUF3QjtJQUN4QixNQUFNO0lBQ04sTUFBTTtJQUVOLEVBQUUsQ0FBQywrREFBK0QsRUFBRSxLQUFLLElBQUksRUFBRTtRQUM3RSxNQUFNLGNBQWMsR0FBRyxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDMUUsTUFBTSxZQUFZLEdBQUcsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsdUNBQXVDLENBQ3pFLFlBQVksRUFDWixjQUFjLEVBQ2Qsd0JBQWEsQ0FBQyxPQUFPLENBQ3RCLENBQUM7UUFDRixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUN0RCxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUM7UUFDakMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDdEQsU0FBUyxDQUFDLGlCQUFpQixDQUN6QixZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUMxQiwwREFBMEQsRUFDMUQsc0JBQXNCLENBQ3ZCLENBQUM7UUFFRixTQUFTLENBQUMsS0FBSyxDQUFDO1lBQ2QsY0FBYyxFQUFFLGtFQUFrRTtZQUNsRixpQkFBaUIsRUFBRSxDQUFDO1NBQ3JCLENBQUMsQ0FBQztRQUVILFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFekIsTUFBTSxVQUFVLEdBQUcsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDM0MsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0QsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDcEQsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0RCxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELE1BQU0saUJBQWlCLEdBQUcsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbEQsTUFBTSxxQkFBcUIsR0FBRyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRXBFLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDOUMsTUFBTSxFQUFFLEdBQUcsTUFBTSxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDBCQUFlLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDdEQsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEQsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdkMsTUFBTSxnQkFBZ0IsR0FBRyxjQUFjLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDOUQsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFLEdBQUcsRUFBRSxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7UUFDOUYsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFLEdBQUcsRUFBRSxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBQzFGLE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEQsaUJBQWlCLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sc0JBQXNCLEdBQUcsa0JBQWtCLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN0RSxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDN0QsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMseURBQXlELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDdkUsTUFBTSxjQUFjLEdBQUcsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzFFLE1BQU0sWUFBWSxHQUFHLGNBQWMsQ0FBQztRQUNwQyxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLHVDQUF1QyxDQUN6RSxZQUFZLEVBQ1osY0FBYyxFQUNkLHdCQUFhLENBQUMsT0FBTyxDQUN0QixDQUFDO1FBQ0YsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDdEQsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDO1FBQ2pDLFNBQVMsQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3RELFNBQVMsQ0FBQyxpQkFBaUIsQ0FDekIsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFDMUIsMERBQTBELEVBQzFELHNCQUFzQixDQUN2QixDQUFDO1FBRUYsU0FBUyxDQUFDLEtBQUssQ0FBQztZQUNkLGNBQWMsRUFBRSxrRUFBa0U7WUFDbEYsaUJBQWlCLEVBQUUsQ0FBQztTQUNyQixDQUFDLENBQUM7UUFFSCxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXpCLE1BQU0sVUFBVSxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzNDLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9ELE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3BELFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdEQsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsRCxNQUFNLHFCQUFxQixHQUFHLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFcEUsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM5QyxNQUFNLEVBQUUsR0FBRyxNQUFNLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsMEJBQWUsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN0RCxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4RCxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN2QyxNQUFNLGdCQUFnQixHQUFHLGNBQWMsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbEUsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFLEdBQUcsRUFBRSxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7UUFDOUYsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwRCxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekMsTUFBTSxzQkFBc0IsR0FBRyxrQkFBa0IsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3RFLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUM3RCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlLCBBZGRyZXNzRm9ybWF0IH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBLZXlQYWlyLCBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi4vLi4vc3JjJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgQ2VydFR5cGUsIFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbic7XG5pbXBvcnQgKiBhcyBVdGlscyBmcm9tICcuLi8uLi9zcmMvbGliL3V0aWxzJztcblxuZGVzY3JpYmUoJ0FEQSBTdGFraW5nIEFjdGl2YXRlIFRyYW5zYWN0aW9uIEJ1aWxkZXInLCBhc3luYyAoKSA9PiB7XG4gIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhZGEnKSk7XG5cbiAgaXQoJ3N0YXJ0IGFuZCBidWlsZCBhbiB1bnNpZ25lZCBzdGFraW5nIGFjdGl2YXRlIHR4JywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGtleVBhaXJTdGFrZSA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5wcml2YXRlS2V5cy5wcnZLZXkyIH0pO1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0U3Rha2luZ0FjdGl2YXRlQnVpbGRlcigpO1xuICAgIHR4QnVpbGRlci5pbnB1dCh7XG4gICAgICB0cmFuc2FjdGlvbl9pZDogJzM2NzdlNzVjN2JhNjk5YmZkYzZjZDU3ZDQyZjI0NmY4NmY2M2FlZmQ3NjAyNTAwNmFjNzgzMTNmYWQyYmJhMjEnLFxuICAgICAgdHJhbnNhY3Rpb25faW5kZXg6IDEsXG4gICAgfSk7XG4gICAgY29uc3QgdG90YWxJbnB1dCA9ICc0MDAwMDAwJztcbiAgICB0eEJ1aWxkZXIuY2hhbmdlQWRkcmVzcyhcbiAgICAgICdhZGRyMXE4cm05ejd3NHl4NWd6NjUya24ycTIzOGVmdm1zNnQwcWVsdXI5bmxnbHVuOGV1NHRyNWtuajRmdTRhZGVsenFoeGc4YWR1NXhjYTRqcmEwZ3RsbGZycGNhd3lxOXBzejIzJyxcbiAgICAgIHRvdGFsSW5wdXRcbiAgICApO1xuICAgIHR4QnVpbGRlci5zdGFraW5nQ3JlZGVudGlhbChcbiAgICAgIGtleVBhaXJTdGFrZS5nZXRLZXlzKCkucHViLFxuICAgICAgJzdhNjIzYzQ4MzQ4NTAxYzIzODBlNjBhYzIzMDdmY2QxYjY3ZGY0MjE4ZjgxOTkzMDgyMWExNWIzJyxcbiAgICAgICdhbHdheXMtYWJzdGFpbidcbiAgICApO1xuICAgIHR4QnVpbGRlci50dGwoODAwMDAwMDAwKTtcbiAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGUpO1xuICAgIGNvbnN0IHR4RGF0YSA9IHR4LnRvSnNvbigpO1xuICAgIGNvbnN0IGZlZSA9IHR4LmdldEZlZTtcbiAgICB0eERhdGEuY2VydHMubGVuZ3RoLnNob3VsZC5lcXVhbCgzKTtcbiAgICB0eERhdGEuY2VydHNbMF0udHlwZS5zaG91bGQuZXF1YWwoMCk7XG4gICAgdHhEYXRhLmNlcnRzWzFdLnR5cGUuc2hvdWxkLmVxdWFsKDEpO1xuICAgIHR4RGF0YS5jZXJ0c1syXS50eXBlLnNob3VsZC5lcXVhbChDZXJ0VHlwZS5Wb3RlRGVsZWdhdGlvbik7XG5cbiAgICB0eERhdGEub3V0cHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgIHR4RGF0YS5vdXRwdXRzWzBdLmFtb3VudC5zaG91bGQuZXF1YWwoKE51bWJlcih0b3RhbElucHV0KSAtIDIwMDAwMDAgLSBOdW1iZXIoZmVlKSkudG9TdHJpbmcoKSk7XG4gICAgZmVlLnNob3VsZC5lcXVhbCgnMTcxNTI5Jyk7XG4gICAgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwodGVzdERhdGEucmF3VHgudW5zaWduZWRTdGFraW5nQWN0aXZlVHgpO1xuICAgIHNob3VsZC5lcXVhbCh0eC5pZCwgdGVzdERhdGEucmF3VHgudW5zaWduZWRTdGFraW5nQWN0aXZlVHhIYXNoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBleHBsYWluIGEgdHgnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qga2V5UGFpclN0YWtlID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLnByaXZhdGVLZXlzLnBydktleTIgfSk7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRTdGFraW5nQWN0aXZhdGVCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLmlucHV0KHtcbiAgICAgIHRyYW5zYWN0aW9uX2lkOiAnMzY3N2U3NWM3YmE2OTliZmRjNmNkNTdkNDJmMjQ2Zjg2ZjYzYWVmZDc2MDI1MDA2YWM3ODMxM2ZhZDJiYmEyMScsXG4gICAgICB0cmFuc2FjdGlvbl9pbmRleDogMSxcbiAgICB9KTtcbiAgICBjb25zdCB0b3RhbElucHV0ID0gJzQwMDAwMDAnO1xuICAgIHR4QnVpbGRlci5jaGFuZ2VBZGRyZXNzKFxuICAgICAgJ2FkZHIxcThybTl6N3c0eXg1Z3o2NTJrbjJxMjM4ZWZ2bXM2dDBxZWx1cjlubGdsdW44ZXU0dHI1a25qNGZ1NGFkZWx6cWh4ZzhhZHU1eGNhNGpyYTBndGxsZnJwY2F3eXE5cHN6MjMnLFxuICAgICAgdG90YWxJbnB1dFxuICAgICk7XG4gICAgdHhCdWlsZGVyLnN0YWtpbmdDcmVkZW50aWFsKFxuICAgICAga2V5UGFpclN0YWtlLmdldEtleXMoKS5wdWIsXG4gICAgICAnN2E2MjNjNDgzNDg1MDFjMjM4MGU2MGFjMjMwN2ZjZDFiNjdkZjQyMThmODE5OTMwODIxYTE1YjMnLFxuICAgICAgJ2Fsd2F5cy1hYnN0YWluJ1xuICAgICk7XG4gICAgdHhCdWlsZGVyLnR0bCg4MDAwMDAwMDApO1xuICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2FjdGlvbjtcbiAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBY3RpdmF0ZSk7XG4gICAgdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gIH0pO1xuXG4gIC8vIGl0KCdidWlsZCBhIHN0YWtpbmdBY3RpdmF0ZSBmcm9tIHJhd1R4JywgYXN5bmMgKCkgPT4ge1xuICAvLyAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5yYXdUeC51bnNpZ25lZFN0YWtpbmdBY3RpdmVUeCk7XG4gIC8vICAgY29uc3QgYnVpbHRUeCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gIC8vICAgc2hvdWxkLmVxdWFsKGJ1aWx0VHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBY3RpdmF0ZSk7XG4gIC8vICAgc2hvdWxkLmVxdWFsKGJ1aWx0VHguaWQsIHRlc3REYXRhLnJhd1R4LnVuc2lnbmVkU3Rha2luZ0FjdGl2ZVR4SGFzaCk7XG4gIC8vICAgY29uc3QgdHhEYXRhID0gYnVpbHRUeC50b0pzb24oKTtcbiAgLy8gICBjb25zdCBmZWUgPSBidWlsdFR4LmdldEZlZTtcbiAgLy8gICB0eERhdGEuY2VydHMubGVuZ3RoLnNob3VsZC5lcXVhbCgyKTtcbiAgLy8gICB0eERhdGEuY2VydHNbMF0udHlwZS5zaG91bGQuZXF1YWwoMCk7XG4gIC8vICAgdHhEYXRhLmNlcnRzWzFdLnR5cGUuc2hvdWxkLmVxdWFsKDEpO1xuICAvL1xuICAvLyAgIHR4RGF0YS5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gIC8vICAgY29uc3QgdG90YWxJbnB1dCA9ICc0MDAwMDAwJztcbiAgLy8gICB0eERhdGEub3V0cHV0c1swXS5hbW91bnQuc2hvdWxkLmVxdWFsKChOdW1iZXIodG90YWxJbnB1dCkgLSAyMDAwMDAwIC0gTnVtYmVyKGZlZSkpLnRvU3RyaW5nKCkpO1xuICAvLyAgIGZlZS5zaG91bGQuZXF1YWwoJzE3NDM4OScpO1xuICAvLyB9KTtcblxuICAvLyBpdCgnc2hvdWxkIHN1Ym1pdCBhIHN0YWtpbmcgYWN0aXZhdGUgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gIC8vICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5wcml2YXRlS2V5cy5wcnZLZXk5IH0pO1xuICAvLyAgIGNvbnN0IGtleVBhaXJTdGFraW5nID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLnByaXZhdGVLZXlzLnBydktleTEwIH0pO1xuICAvLyAgIGNvbnN0IHNlbmRlckFkZHJlc3MgPSBVdGlscy5kZWZhdWx0LmNyZWF0ZUJhc2VBZGRyZXNzV2l0aFN0YWtlQW5kUGF5bWVudEtleShcbiAgLy8gICAgIGtleVBhaXJTdGFraW5nLFxuICAvLyAgICAga2V5UGFpcixcbiAgLy8gICAgIEFkZHJlc3NGb3JtYXQudGVzdG5ldFxuICAvLyAgICk7XG4gIC8vICAgY29uc3QgYXhpb3NDb25maWcgPSB7XG4gIC8vICAgICBoZWFkZXJzOiB7XG4gIC8vICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vY2JvcicsXG4gIC8vICAgICB9LFxuICAvLyAgICAgdGltZW91dDogMTAwMDAsXG4gIC8vICAgfTtcbiAgLy9cbiAgLy8gICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFN0YWtpbmdBY3RpdmF0ZUJ1aWxkZXIoKTtcbiAgLy8gICBjb25zdCB1dHhvRGF0YSA9IGF3YWl0IGF4aW9zLmdldCgnaHR0cHM6Ly90ZXN0bmV0LmtvaW9zLnJlc3QvYXBpL3YwL2FkZHJlc3NfaW5mbz9fYWRkcmVzcz0nICsgc2VuZGVyQWRkcmVzcyk7XG4gIC8vICAgY29uc3Qgc2VuZGVyQmFsYW5jZSA9IHV0eG9EYXRhLmRhdGFbMF0uYmFsYW5jZTtcbiAgLy8gICB0eEJ1aWxkZXIuY2hhbmdlQWRkcmVzcyhzZW5kZXJBZGRyZXNzLCBzZW5kZXJCYWxhbmNlKTtcbiAgLy8gICBjb25zdCB1dHhvU2V0ID0gdXR4b0RhdGEuZGF0YVswXS51dHhvX3NldDtcbiAgLy8gICBmb3IgKGNvbnN0IHV0eG8gb2YgdXR4b1NldCkge1xuICAvLyAgICAgdHhCdWlsZGVyLmlucHV0KHsgdHJhbnNhY3Rpb25faWQ6IHV0eG8udHhfaGFzaCwgdHJhbnNhY3Rpb25faW5kZXg6IHV0eG8udHhfaW5kZXggfSk7XG4gIC8vICAgfVxuICAvL1xuICAvLyAgIHR4QnVpbGRlci50dGwoODAwMDAwMDAwKTtcbiAgLy8gICB0eEJ1aWxkZXIuc3Rha2luZ0NyZWRlbnRpYWwoXG4gIC8vICAgICBrZXlQYWlyU3Rha2luZy5nZXRLZXlzKCkucHViLFxuICAvLyAgICAgJzdhNjIzYzQ4MzQ4NTAxYzIzODBlNjBhYzIzMDdmY2QxYjY3ZGY0MjE4ZjgxOTkzMDgyMWExNWIzJ1xuICAvLyAgICk7XG4gIC8vICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGtleVBhaXIuZ2V0S2V5cygpLnBydiB9KTtcbiAgLy8gICB0eEJ1aWxkZXIuc2lnbih7IGtleToga2V5UGFpclN0YWtpbmcuZ2V0S2V5cygpLnBydiB9KTtcbiAgLy9cbiAgLy8gICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAvLyAgIGNvbnN0IHNlcmlhbGl6ZWRUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gIC8vICAgY29uc3QgYnl0ZXMgPSBVaW50OEFycmF5LmZyb20oQnVmZmVyLmZyb20oc2VyaWFsaXplZFR4LCAnaGV4JykpO1xuICAvL1xuICAvLyAgIHRyeSB7XG4gIC8vICAgICBjb25zdCByZXMgPSBhd2FpdCBheGlvcy5wb3N0KCdodHRwczovL3Rlc3RuZXQua29pb3MucmVzdC9hcGkvdjAvc3VibWl0dHgnLCBieXRlcywgYXhpb3NDb25maWcpO1xuICAvLyAgICAgY29uc29sZS5sb2cocmVzKTtcbiAgLy8gICB9IGNhdGNoIChlcnIpIHtcbiAgLy8gICAgIGNvbnNvbGUubG9nKGVycik7XG4gIC8vICAgfVxuICAvLyB9KTtcblxuICBpdCgnc2hvdWxkIHN1Ym1pdCBhIHN0YWtpbmcgdHJhbnNhY3Rpb24gdXNpbmcgc2lnbmF0dXJlIGludGVyZmFjZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBrZXlQYWlyUGF5bWVudCA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5wcml2YXRlS2V5cy5wcnZLZXk5IH0pO1xuICAgIGNvbnN0IGtleVBhaXJTdGFrZSA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5wcml2YXRlS2V5cy5wcnZLZXkxMCB9KTtcbiAgICBjb25zdCBzZW5kZXJBZGRyZXNzID0gVXRpbHMuZGVmYXVsdC5jcmVhdGVCYXNlQWRkcmVzc1dpdGhTdGFrZUFuZFBheW1lbnRLZXkoXG4gICAgICBrZXlQYWlyU3Rha2UsXG4gICAgICBrZXlQYWlyUGF5bWVudCxcbiAgICAgIEFkZHJlc3NGb3JtYXQudGVzdG5ldFxuICAgICk7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRTdGFraW5nQWN0aXZhdGVCdWlsZGVyKCk7XG4gICAgY29uc3Qgc2VuZGVyQmFsYW5jZSA9ICcyMjEyMjA3MSc7XG4gICAgdHhCdWlsZGVyLmNoYW5nZUFkZHJlc3Moc2VuZGVyQWRkcmVzcywgc2VuZGVyQmFsYW5jZSk7XG4gICAgdHhCdWlsZGVyLnN0YWtpbmdDcmVkZW50aWFsKFxuICAgICAga2V5UGFpclN0YWtlLmdldEtleXMoKS5wdWIsXG4gICAgICAnN2E2MjNjNDgzNDg1MDFjMjM4MGU2MGFjMjMwN2ZjZDFiNjdkZjQyMThmODE5OTMwODIxYTE1YjMnLFxuICAgICAgJ2Fsd2F5cy1uby1jb25maWRlbmNlJ1xuICAgICk7XG5cbiAgICB0eEJ1aWxkZXIuaW5wdXQoe1xuICAgICAgdHJhbnNhY3Rpb25faWQ6ICcwYTRmODBkODNiYTljZTFmODMzMDZhNzkyNTI5MDkyNDEzMDhkN2VmZjMxN2QwNGM5ZWEwMTg5NjZkNjg3ZmUzJyxcbiAgICAgIHRyYW5zYWN0aW9uX2luZGV4OiAwLFxuICAgIH0pO1xuXG4gICAgdHhCdWlsZGVyLnR0bCg5MDAwMDAwMDApO1xuXG4gICAgY29uc3QgdW5zaWduZWRUeCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHNpZ25hYmxlSGV4ID0gdW5zaWduZWRUeC5zaWduYWJsZVBheWxvYWQudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRUeCA9IHVuc2lnbmVkVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICB0eEJ1aWxkZXIuc2lnbih7IGtleToga2V5UGFpclBheW1lbnQuZ2V0S2V5cygpLnBydiB9KTtcbiAgICB0eEJ1aWxkZXIuc2lnbih7IGtleToga2V5UGFpclN0YWtlLmdldEtleXMoKS5wcnYgfSk7XG4gICAgY29uc3Qgc2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCBzZXJpYWxpemVkVHJhbnNhY3Rpb24gPSBzaWduZWRUcmFuc2FjdGlvbi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgY29uc3QgdHhCdWlsZGVyMiA9IGZhY3RvcnkuZnJvbShzZXJpYWxpemVkVHgpO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpO1xuICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGUpO1xuICAgIGNvbnN0IHNpZ25hYmxlSGV4MiA9IHR4LnNpZ25hYmxlUGF5bG9hZC50b1N0cmluZygnaGV4Jyk7XG4gICAgc2lnbmFibGVIZXguc2hvdWxkLmVxdWFsKHNpZ25hYmxlSGV4Mik7XG4gICAgY29uc3Qgc2lnbmF0dXJlUGF5bWVudCA9IGtleVBhaXJQYXltZW50LnNpZ25NZXNzYWdlKHNpZ25hYmxlSGV4Mik7XG4gICAgY29uc3Qgc2lnbmF0dXJlU3Rha2UgPSBrZXlQYWlyU3Rha2Uuc2lnbk1lc3NhZ2Uoc2lnbmFibGVIZXgyKTtcbiAgICB0eEJ1aWxkZXIyLmFkZFNpZ25hdHVyZSh7IHB1Yjoga2V5UGFpclBheW1lbnQuZ2V0S2V5cygpLnB1YiB9LCBCdWZmZXIuZnJvbShzaWduYXR1cmVQYXltZW50KSk7XG4gICAgdHhCdWlsZGVyMi5hZGRTaWduYXR1cmUoeyBwdWI6IGtleVBhaXJTdGFrZS5nZXRLZXlzKCkucHViIH0sIEJ1ZmZlci5mcm9tKHNpZ25hdHVyZVN0YWtlKSk7XG4gICAgY29uc3Qgc2lnbmVkVHJhbnNhY3Rpb24yID0gYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpO1xuICAgIHNpZ25lZFRyYW5zYWN0aW9uLmlkLnNob3VsZC5lcXVhbCh0eC5pZCk7XG4gICAgY29uc3Qgc2VyaWFsaXplZFRyYW5zYWN0aW9uMiA9IHNpZ25lZFRyYW5zYWN0aW9uMi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgIHNlcmlhbGl6ZWRUcmFuc2FjdGlvbjIuc2hvdWxkLmVxdWFsKHNlcmlhbGl6ZWRUcmFuc2FjdGlvbik7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgc3VibWl0IGEgc3Rha2luZyB0cmFuc2FjdGlvbiB1c2luZyBvbmUgc2lnbmF0dXJlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGtleVBhaXJQYXltZW50ID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLnByaXZhdGVLZXlzLnBydktleTkgfSk7XG4gICAgY29uc3Qga2V5UGFpclN0YWtlID0ga2V5UGFpclBheW1lbnQ7XG4gICAgY29uc3Qgc2VuZGVyQWRkcmVzcyA9IFV0aWxzLmRlZmF1bHQuY3JlYXRlQmFzZUFkZHJlc3NXaXRoU3Rha2VBbmRQYXltZW50S2V5KFxuICAgICAga2V5UGFpclN0YWtlLFxuICAgICAga2V5UGFpclBheW1lbnQsXG4gICAgICBBZGRyZXNzRm9ybWF0LnRlc3RuZXRcbiAgICApO1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0U3Rha2luZ0FjdGl2YXRlQnVpbGRlcigpO1xuICAgIGNvbnN0IHNlbmRlckJhbGFuY2UgPSAnMjIxMjIwNzEnO1xuICAgIHR4QnVpbGRlci5jaGFuZ2VBZGRyZXNzKHNlbmRlckFkZHJlc3MsIHNlbmRlckJhbGFuY2UpO1xuICAgIHR4QnVpbGRlci5zdGFraW5nQ3JlZGVudGlhbChcbiAgICAgIGtleVBhaXJTdGFrZS5nZXRLZXlzKCkucHViLFxuICAgICAgJzdhNjIzYzQ4MzQ4NTAxYzIzODBlNjBhYzIzMDdmY2QxYjY3ZGY0MjE4ZjgxOTkzMDgyMWExNWIzJyxcbiAgICAgICdhbHdheXMtbm8tY29uZmlkZW5jZSdcbiAgICApO1xuXG4gICAgdHhCdWlsZGVyLmlucHV0KHtcbiAgICAgIHRyYW5zYWN0aW9uX2lkOiAnMGE0ZjgwZDgzYmE5Y2UxZjgzMzA2YTc5MjUyOTA5MjQxMzA4ZDdlZmYzMTdkMDRjOWVhMDE4OTY2ZDY4N2ZlMycsXG4gICAgICB0cmFuc2FjdGlvbl9pbmRleDogMCxcbiAgICB9KTtcblxuICAgIHR4QnVpbGRlci50dGwoOTAwMDAwMDAwKTtcblxuICAgIGNvbnN0IHVuc2lnbmVkVHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCBzaWduYWJsZUhleCA9IHVuc2lnbmVkVHguc2lnbmFibGVQYXlsb2FkLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBzZXJpYWxpemVkVHggPSB1bnNpZ25lZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGtleVBhaXJQYXltZW50LmdldEtleXMoKS5wcnYgfSk7XG4gICAgY29uc3Qgc2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCBzZXJpYWxpemVkVHJhbnNhY3Rpb24gPSBzaWduZWRUcmFuc2FjdGlvbi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgY29uc3QgdHhCdWlsZGVyMiA9IGZhY3RvcnkuZnJvbShzZXJpYWxpemVkVHgpO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpO1xuICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGUpO1xuICAgIGNvbnN0IHNpZ25hYmxlSGV4MiA9IHR4LnNpZ25hYmxlUGF5bG9hZC50b1N0cmluZygnaGV4Jyk7XG4gICAgc2lnbmFibGVIZXguc2hvdWxkLmVxdWFsKHNpZ25hYmxlSGV4Mik7XG4gICAgY29uc3Qgc2lnbmF0dXJlUGF5bWVudCA9IGtleVBhaXJQYXltZW50LnNpZ25NZXNzYWdlKHNpZ25hYmxlSGV4Mik7XG4gICAgdHhCdWlsZGVyMi5hZGRTaWduYXR1cmUoeyBwdWI6IGtleVBhaXJQYXltZW50LmdldEtleXMoKS5wdWIgfSwgQnVmZmVyLmZyb20oc2lnbmF0dXJlUGF5bWVudCkpO1xuICAgIGNvbnN0IHNpZ25lZFRyYW5zYWN0aW9uMiA9IGF3YWl0IHR4QnVpbGRlcjIuYnVpbGQoKTtcbiAgICBzaWduZWRUcmFuc2FjdGlvbi5pZC5zaG91bGQuZXF1YWwodHguaWQpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRUcmFuc2FjdGlvbjIgPSBzaWduZWRUcmFuc2FjdGlvbjIudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICBzZXJpYWxpemVkVHJhbnNhY3Rpb24yLnNob3VsZC5lcXVhbChzZXJpYWxpemVkVHJhbnNhY3Rpb24pO1xuICB9KTtcbn0pO1xuIl19

Выполнить команду


Для локальной разработки. Не используйте в интернете!