PHP WebShell

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

Просмотр файла: transaction.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 sdk_core_1 = require("@bitgo/sdk-core");
const statics_1 = require("@bitgo/statics");
const encoding_1 = require("@cosmjs/encoding");
const should_1 = __importDefault(require("should"));
const abstract_cosmos_1 = require("@bitgo/abstract-cosmos");
const utils_1 = require("../../src/lib/utils");
const testData = __importStar(require("../resources/hash"));
describe('Hash Transaction', () => {
    let tx;
    const config = statics_1.coins.get('thash');
    const utils = new utils_1.HashUtils(config.network.type);
    beforeEach(() => {
        tx = new abstract_cosmos_1.CosmosTransaction(config, utils);
    });
    describe('Empty transaction', () => {
        it('should throw empty transaction', function () {
            should_1.default.throws(() => tx.toBroadcastFormat(), 'Empty transaction');
        });
    });
    describe('From raw transaction', () => {
        it('should build a transfer from raw signed base64', function () {
            tx.enrichTransactionDetailsFromRawTransaction(testData.TEST_SEND_TX.signedTxBase64);
            const json = tx.toJson();
            should_1.default.equal(json.sequence, testData.TEST_SEND_TX.sequence);
            should_1.default.deepEqual(json.gasBudget, testData.TEST_SEND_TX.gasBudget);
            should_1.default.equal(json.publicKey, (0, sdk_core_1.toHex)((0, encoding_1.fromBase64)(testData.TEST_SEND_TX.pubKey)));
            should_1.default.equal(json.sendMessages[0].value.toAddress, testData.TEST_SEND_TX.sendMessage.value.toAddress);
            should_1.default.deepEqual(json.sendMessages[0].value.amount, testData.TEST_SEND_TX.sendMessage.value.amount);
            should_1.default.equal(Buffer.from(json.signature).toString('base64'), testData.TEST_SEND_TX.signature);
            should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
            tx.loadInputsAndOutputs();
            should_1.default.deepEqual(tx.inputs, [
                {
                    address: testData.TEST_SEND_TX.sender,
                    value: testData.TEST_SEND_TX.sendMessage.value.amount[0].amount,
                    coin: 'thash',
                },
            ]);
            should_1.default.deepEqual(tx.outputs, [
                {
                    address: testData.TEST_SEND_TX.sendMessage.value.toAddress,
                    value: testData.TEST_SEND_TX.sendMessage.value.amount[0].amount,
                    coin: 'thash',
                },
            ]);
        });
        it('should build a transfer from raw signed hex', function () {
            tx.enrichTransactionDetailsFromRawTransaction((0, sdk_core_1.toHex)((0, encoding_1.fromBase64)(testData.TEST_SEND_TX.signedTxBase64)));
            const json = tx.toJson();
            should_1.default.equal(json.sequence, testData.TEST_SEND_TX.sequence);
            should_1.default.deepEqual(json.gasBudget, testData.TEST_SEND_TX.gasBudget);
            should_1.default.equal(json.publicKey, (0, sdk_core_1.toHex)((0, encoding_1.fromBase64)(testData.TEST_SEND_TX.pubKey)));
            should_1.default.equal(json.sendMessages[0].value.toAddress, testData.TEST_SEND_TX.sendMessage.value.toAddress);
            should_1.default.deepEqual(json.sendMessages[0].value.amount, testData.TEST_SEND_TX.sendMessage.value.amount);
            should_1.default.equal(Buffer.from(json.signature).toString('base64'), testData.TEST_SEND_TX.signature);
            should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
            tx.loadInputsAndOutputs();
            should_1.default.deepEqual(tx.inputs, [
                {
                    address: testData.TEST_SEND_TX.sender,
                    value: testData.TEST_SEND_TX.sendMessage.value.amount[0].amount,
                    coin: 'thash',
                },
            ]);
            should_1.default.deepEqual(tx.outputs, [
                {
                    address: testData.TEST_SEND_TX.sendMessage.value.toAddress,
                    value: testData.TEST_SEND_TX.sendMessage.value.amount[0].amount,
                    coin: 'thash',
                },
            ]);
        });
        it('should build a delegate txn from raw signed base64', function () {
            tx.enrichTransactionDetailsFromRawTransaction(testData.TEST_DELEGATE_TX.signedTxBase64);
            const json = tx.toJson();
            should_1.default.equal(json.sequence, testData.TEST_DELEGATE_TX.sequence);
            should_1.default.deepEqual(json.gasBudget, testData.TEST_DELEGATE_TX.gasBudget);
            should_1.default.equal(Buffer.from(json.publicKey, 'hex').toString('base64'), testData.TEST_DELEGATE_TX.pubKey);
            should_1.default.equal(json.sendMessages[0].value.validatorAddress, testData.TEST_DELEGATE_TX.sendMessage.value.validatorAddress);
            should_1.default.deepEqual(json.sendMessages[0].value.amount, testData.TEST_DELEGATE_TX.sendMessage.value.amount);
            should_1.default.equal(Buffer.from(json.signature).toString('base64'), testData.TEST_DELEGATE_TX.signature);
            should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingActivate);
            tx.loadInputsAndOutputs();
            should_1.default.deepEqual(tx.inputs, [
                {
                    address: testData.TEST_DELEGATE_TX.delegator,
                    value: testData.TEST_DELEGATE_TX.sendMessage.value.amount.amount,
                    coin: 'thash',
                },
            ]);
            should_1.default.deepEqual(tx.outputs, [
                {
                    address: testData.TEST_DELEGATE_TX.validator,
                    value: testData.TEST_DELEGATE_TX.sendMessage.value.amount.amount,
                    coin: 'thash',
                },
            ]);
        });
        it('should build a undelegate txn from raw signed base64', function () {
            tx.enrichTransactionDetailsFromRawTransaction(testData.TEST_UNDELEGATE_TX.signedTxBase64);
            const json = tx.toJson();
            should_1.default.equal(json.sequence, testData.TEST_UNDELEGATE_TX.sequence);
            should_1.default.deepEqual(json.gasBudget, testData.TEST_UNDELEGATE_TX.gasBudget);
            should_1.default.equal(Buffer.from(json.publicKey, 'hex').toString('base64'), testData.TEST_UNDELEGATE_TX.pubKey);
            should_1.default.equal(json.sendMessages[0].value.validatorAddress, testData.TEST_UNDELEGATE_TX.sendMessage.value.validatorAddress);
            should_1.default.deepEqual(json.sendMessages[0].value.amount, testData.TEST_UNDELEGATE_TX.sendMessage.value.amount);
            should_1.default.equal(Buffer.from(json.signature).toString('base64'), testData.TEST_UNDELEGATE_TX.signature);
            should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingDeactivate);
            tx.loadInputsAndOutputs();
            should_1.default.deepEqual(tx.inputs, [
                {
                    address: testData.TEST_UNDELEGATE_TX.delegator,
                    value: testData.TEST_UNDELEGATE_TX.sendMessage.value.amount.amount,
                    coin: 'thash',
                },
            ]);
            should_1.default.deepEqual(tx.outputs, [
                {
                    address: testData.TEST_UNDELEGATE_TX.validator,
                    value: testData.TEST_UNDELEGATE_TX.sendMessage.value.amount.amount,
                    coin: 'thash',
                },
            ]);
        });
        it('should build a withdraw rewards from raw signed base64', function () {
            tx.enrichTransactionDetailsFromRawTransaction(testData.TEST_WITHDRAW_REWARDS_TX.signedTxBase64);
            const json = tx.toJson();
            should_1.default.equal(json.sequence, testData.TEST_WITHDRAW_REWARDS_TX.sequence);
            should_1.default.deepEqual(json.gasBudget, testData.TEST_WITHDRAW_REWARDS_TX.gasBudget);
            should_1.default.equal(Buffer.from(json.publicKey, 'hex').toString('base64'), testData.TEST_WITHDRAW_REWARDS_TX.pubKey);
            should_1.default.equal(json.sendMessages[0].value.validatorAddress, testData.TEST_WITHDRAW_REWARDS_TX.sendMessage.value.validatorAddress);
            should_1.default.equal(Buffer.from(json.signature).toString('base64'), testData.TEST_WITHDRAW_REWARDS_TX.signature);
            should_1.default.equal(tx.type, sdk_core_1.TransactionType.StakingWithdraw);
            tx.loadInputsAndOutputs();
            should_1.default.deepEqual(tx.inputs, [
                {
                    address: testData.TEST_WITHDRAW_REWARDS_TX.delegator,
                    value: 'UNAVAILABLE',
                    coin: 'thash',
                },
            ]);
            should_1.default.deepEqual(tx.outputs, [
                {
                    address: testData.TEST_WITHDRAW_REWARDS_TX.validator,
                    value: 'UNAVAILABLE',
                    coin: 'thash',
                },
            ]);
        });
        it('should fail to build a transfer from incorrect raw hex', function () {
            should_1.default.throws(() => tx.enrichTransactionDetailsFromRawTransaction('random' + testData.TEST_SEND_TX.signedTxBase64), 'incorrect raw data');
        });
        it('should fail to explain transaction with invalid raw hex', function () {
            should_1.default.throws(() => tx.enrichTransactionDetailsFromRawTransaction('randomString'), 'Invalid transaction');
        });
    });
    describe('Explain transaction', () => {
        it('should explain a transfer pay transaction', function () {
            tx.enrichTransactionDetailsFromRawTransaction(testData.TEST_SEND_TX.signedTxBase64);
            const explainedTransaction = tx.explainTransaction();
            explainedTransaction.should.deepEqual({
                displayOrder: ['id', 'outputs', 'outputAmount', 'changeOutputs', 'changeAmount', 'fee', 'type'],
                id: testData.TEST_SEND_TX.hash,
                outputs: [
                    {
                        address: testData.TEST_SEND_TX.recipient,
                        amount: testData.TEST_SEND_TX.sendAmount,
                    },
                ],
                outputAmount: testData.TEST_SEND_TX.sendAmount,
                changeOutputs: [],
                changeAmount: '0',
                fee: { fee: testData.TEST_SEND_TX.feeAmount },
                type: 0,
            });
        });
        it('should fail to explain transaction with invalid raw base64 string', function () {
            should_1.default.throws(() => tx.enrichTransactionDetailsFromRawTransaction('randomString'), 'Invalid transaction');
        });
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw4Q0FBeUQ7QUFDekQsNENBQXVDO0FBQ3ZDLCtDQUE4QztBQUM5QyxvREFBNEI7QUFFNUIsNERBS2dDO0FBQ2hDLCtDQUFnRDtBQUNoRCw0REFBOEM7QUFFOUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsRUFBRTtJQUNoQyxJQUFJLEVBQXFCLENBQUM7SUFDMUIsTUFBTSxNQUFNLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxNQUFNLEtBQUssR0FBRyxJQUFJLGlCQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVqRCxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsRUFBRSxHQUFHLElBQUksbUNBQWlCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzVDLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtRQUNqQyxFQUFFLENBQUMsZ0NBQWdDLEVBQUU7WUFDbkMsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNuRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsRUFBRTtRQUNwQyxFQUFFLENBQUMsZ0RBQWdELEVBQUU7WUFDbkQsRUFBRSxDQUFDLDBDQUEwQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDcEYsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3pCLGdCQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM1RCxnQkFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbEUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFBLGdCQUFLLEVBQUMsSUFBQSxxQkFBVSxFQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlFLGdCQUFNLENBQUMsS0FBSyxDQUNULElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBcUIsQ0FBQyxTQUFTLEVBQ3JELFFBQVEsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQ2xELENBQUM7WUFDRixnQkFBTSxDQUFDLFNBQVMsQ0FDYixJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQXFCLENBQUMsTUFBTSxFQUNsRCxRQUFRLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUMvQyxDQUFDO1lBQ0YsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBZ0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3JHLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsMEJBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxFQUFFLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUMxQixnQkFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFO2dCQUMxQjtvQkFDRSxPQUFPLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNO29CQUNyQyxLQUFLLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNO29CQUMvRCxJQUFJLEVBQUUsT0FBTztpQkFDZDthQUNGLENBQUMsQ0FBQztZQUNILGdCQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUU7Z0JBQzNCO29CQUNFLE9BQU8sRUFBRSxRQUFRLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUztvQkFDMUQsS0FBSyxFQUFFLFFBQVEsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTtvQkFDL0QsSUFBSSxFQUFFLE9BQU87aUJBQ2Q7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRTtZQUNoRCxFQUFFLENBQUMsMENBQTBDLENBQUMsSUFBQSxnQkFBSyxFQUFDLElBQUEscUJBQVUsRUFBQyxRQUFRLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2RyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDekIsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzVELGdCQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNsRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUEsZ0JBQUssRUFBQyxJQUFBLHFCQUFVLEVBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUUsZ0JBQU0sQ0FBQyxLQUFLLENBQ1QsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFxQixDQUFDLFNBQVMsRUFDckQsUUFBUSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FDbEQsQ0FBQztZQUNGLGdCQUFNLENBQUMsU0FBUyxDQUNiLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBcUIsQ0FBQyxNQUFNLEVBQ2xELFFBQVEsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQy9DLENBQUM7WUFDRixnQkFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFnQixDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDckcsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSwwQkFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLEVBQUUsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzFCLGdCQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUU7Z0JBQzFCO29CQUNFLE9BQU8sRUFBRSxRQUFRLENBQUMsWUFBWSxDQUFDLE1BQU07b0JBQ3JDLEtBQUssRUFBRSxRQUFRLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU07b0JBQy9ELElBQUksRUFBRSxPQUFPO2lCQUNkO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRTtnQkFDM0I7b0JBQ0UsT0FBTyxFQUFFLFFBQVEsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxTQUFTO29CQUMxRCxLQUFLLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNO29CQUMvRCxJQUFJLEVBQUUsT0FBTztpQkFDZDthQUNGLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG9EQUFvRCxFQUFFO1lBQ3ZELEVBQUUsQ0FBQywwQ0FBMEMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDeEYsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3pCLGdCQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2hFLGdCQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3RFLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQWdCLEVBQUUsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3RyxnQkFBTSxDQUFDLEtBQUssQ0FDVCxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQXFDLENBQUMsZ0JBQWdCLEVBQzVFLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUM3RCxDQUFDO1lBQ0YsZ0JBQU0sQ0FBQyxTQUFTLENBQ2IsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFxQyxDQUFDLE1BQU0sRUFDbEUsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUNuRCxDQUFDO1lBQ0YsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBZ0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDekcsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSwwQkFBZSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3ZELEVBQUUsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzFCLGdCQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUU7Z0JBQzFCO29CQUNFLE9BQU8sRUFBRSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsU0FBUztvQkFDNUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNO29CQUNoRSxJQUFJLEVBQUUsT0FBTztpQkFDZDthQUNGLENBQUMsQ0FBQztZQUNILGdCQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUU7Z0JBQzNCO29CQUNFLE9BQU8sRUFBRSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsU0FBUztvQkFDNUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNO29CQUNoRSxJQUFJLEVBQUUsT0FBTztpQkFDZDthQUNGLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHNEQUFzRCxFQUFFO1lBQ3pELEVBQUUsQ0FBQywwQ0FBMEMsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDMUYsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3pCLGdCQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2xFLGdCQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3hFLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQWdCLEVBQUUsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMvRyxnQkFBTSxDQUFDLEtBQUssQ0FDVCxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQXFDLENBQUMsZ0JBQWdCLEVBQzVFLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUMvRCxDQUFDO1lBQ0YsZ0JBQU0sQ0FBQyxTQUFTLENBQ2IsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFxQyxDQUFDLE1BQU0sRUFDbEUsUUFBUSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUNyRCxDQUFDO1lBQ0YsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBZ0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDM0csZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSwwQkFBZSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDekQsRUFBRSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDMUIsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRTtnQkFDMUI7b0JBQ0UsT0FBTyxFQUFFLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTO29CQUM5QyxLQUFLLEVBQUUsUUFBUSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU07b0JBQ2xFLElBQUksRUFBRSxPQUFPO2lCQUNkO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRTtnQkFDM0I7b0JBQ0UsT0FBTyxFQUFFLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTO29CQUM5QyxLQUFLLEVBQUUsUUFBUSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU07b0JBQ2xFLElBQUksRUFBRSxPQUFPO2lCQUNkO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsd0RBQXdELEVBQUU7WUFDM0QsRUFBRSxDQUFDLDBDQUEwQyxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNoRyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDekIsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDeEUsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsd0JBQXdCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDOUUsZ0JBQU0sQ0FBQyxLQUFLLENBQ1YsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBZ0IsRUFBRSxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQzVELFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQ3pDLENBQUM7WUFDRixnQkFBTSxDQUFDLEtBQUssQ0FDVCxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQXlDLENBQUMsZ0JBQWdCLEVBQ2hGLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUNyRSxDQUFDO1lBQ0YsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBZ0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRLENBQUMsd0JBQXdCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDakgsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSwwQkFBZSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBRXZELEVBQUUsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzFCLGdCQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUU7Z0JBQzFCO29CQUNFLE9BQU8sRUFBRSxRQUFRLENBQUMsd0JBQXdCLENBQUMsU0FBUztvQkFDcEQsS0FBSyxFQUFFLGFBQWE7b0JBQ3BCLElBQUksRUFBRSxPQUFPO2lCQUNkO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRTtnQkFDM0I7b0JBQ0UsT0FBTyxFQUFFLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTO29CQUNwRCxLQUFLLEVBQUUsYUFBYTtvQkFDcEIsSUFBSSxFQUFFLE9BQU87aUJBQ2Q7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx3REFBd0QsRUFBRTtZQUMzRCxnQkFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsMENBQTBDLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLEVBQ3BHLG9CQUFvQixDQUNyQixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMseURBQXlELEVBQUU7WUFDNUQsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLDBDQUEwQyxDQUFDLGNBQWMsQ0FBQyxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFDNUcsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLEVBQUU7UUFDbkMsRUFBRSxDQUFDLDJDQUEyQyxFQUFFO1lBQzlDLEVBQUUsQ0FBQywwQ0FBMEMsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3BGLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDckQsb0JBQW9CLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztnQkFDcEMsWUFBWSxFQUFFLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDO2dCQUMvRixFQUFFLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJO2dCQUM5QixPQUFPLEVBQUU7b0JBQ1A7d0JBQ0UsT0FBTyxFQUFFLFFBQVEsQ0FBQyxZQUFZLENBQUMsU0FBUzt3QkFDeEMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxZQUFZLENBQUMsVUFBVTtxQkFDekM7aUJBQ0Y7Z0JBQ0QsWUFBWSxFQUFFLFFBQVEsQ0FBQyxZQUFZLENBQUMsVUFBVTtnQkFDOUMsYUFBYSxFQUFFLEVBQUU7Z0JBQ2pCLFlBQVksRUFBRSxHQUFHO2dCQUNqQixHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUU7Z0JBQzdDLElBQUksRUFBRSxDQUFDO2FBQ1IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsbUVBQW1FLEVBQUU7WUFDdEUsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLDBDQUEwQyxDQUFDLGNBQWMsQ0FBQyxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFDNUcsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdG9IZXgsIFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IGZyb21CYXNlNjQgfSBmcm9tICdAY29zbWpzL2VuY29kaW5nJztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcblxuaW1wb3J0IHtcbiAgQ29zbW9zVHJhbnNhY3Rpb24sXG4gIERlbGVnYXRlT3JVbmRlbGVnZXRlTWVzc2FnZSxcbiAgU2VuZE1lc3NhZ2UsXG4gIFdpdGhkcmF3RGVsZWdhdG9yUmV3YXJkc01lc3NhZ2UsXG59IGZyb20gJ0BiaXRnby9hYnN0cmFjdC1jb3Ntb3MnO1xuaW1wb3J0IHsgSGFzaFV0aWxzIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi91dGlscyc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi9yZXNvdXJjZXMvaGFzaCc7XG5cbmRlc2NyaWJlKCdIYXNoIFRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICBsZXQgdHg6IENvc21vc1RyYW5zYWN0aW9uO1xuICBjb25zdCBjb25maWcgPSBjb2lucy5nZXQoJ3RoYXNoJyk7XG4gIGNvbnN0IHV0aWxzID0gbmV3IEhhc2hVdGlscyhjb25maWcubmV0d29yay50eXBlKTtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICB0eCA9IG5ldyBDb3Ntb3NUcmFuc2FjdGlvbihjb25maWcsIHV0aWxzKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0VtcHR5IHRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgdGhyb3cgZW1wdHkgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQudGhyb3dzKCgpID0+IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksICdFbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRnJvbSByYXcgdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHRyYW5zZmVyIGZyb20gcmF3IHNpZ25lZCBiYXNlNjQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0eC5lbnJpY2hUcmFuc2FjdGlvbkRldGFpbHNGcm9tUmF3VHJhbnNhY3Rpb24odGVzdERhdGEuVEVTVF9TRU5EX1RYLnNpZ25lZFR4QmFzZTY0KTtcbiAgICAgIGNvbnN0IGpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5lcXVhbChqc29uLnNlcXVlbmNlLCB0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2VxdWVuY2UpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLmdhc0J1ZGdldCwgdGVzdERhdGEuVEVTVF9TRU5EX1RYLmdhc0J1ZGdldCk7XG4gICAgICBzaG91bGQuZXF1YWwoanNvbi5wdWJsaWNLZXksIHRvSGV4KGZyb21CYXNlNjQodGVzdERhdGEuVEVTVF9TRU5EX1RYLnB1YktleSkpKTtcbiAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgKGpzb24uc2VuZE1lc3NhZ2VzWzBdLnZhbHVlIGFzIFNlbmRNZXNzYWdlKS50b0FkZHJlc3MsXG4gICAgICAgIHRlc3REYXRhLlRFU1RfU0VORF9UWC5zZW5kTWVzc2FnZS52YWx1ZS50b0FkZHJlc3NcbiAgICAgICk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKFxuICAgICAgICAoanNvbi5zZW5kTWVzc2FnZXNbMF0udmFsdWUgYXMgU2VuZE1lc3NhZ2UpLmFtb3VudCxcbiAgICAgICAgdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudFxuICAgICAgKTtcbiAgICAgIHNob3VsZC5lcXVhbChCdWZmZXIuZnJvbShqc29uLnNpZ25hdHVyZSBhcyBhbnkpLnRvU3RyaW5nKCdiYXNlNjQnKSwgdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNpZ25hdHVyZSk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgdHgubG9hZElucHV0c0FuZE91dHB1dHMoKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguaW5wdXRzLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2VuZGVyLFxuICAgICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2VuZE1lc3NhZ2UudmFsdWUuYW1vdW50WzBdLmFtb3VudCxcbiAgICAgICAgICBjb2luOiAndGhhc2gnLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4Lm91dHB1dHMsIFtcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLlRFU1RfU0VORF9UWC5zZW5kTWVzc2FnZS52YWx1ZS50b0FkZHJlc3MsXG4gICAgICAgICAgdmFsdWU6IHRlc3REYXRhLlRFU1RfU0VORF9UWC5zZW5kTWVzc2FnZS52YWx1ZS5hbW91bnRbMF0uYW1vdW50LFxuICAgICAgICAgIGNvaW46ICd0aGFzaCcsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB0cmFuc2ZlciBmcm9tIHJhdyBzaWduZWQgaGV4JywgZnVuY3Rpb24gKCkge1xuICAgICAgdHguZW5yaWNoVHJhbnNhY3Rpb25EZXRhaWxzRnJvbVJhd1RyYW5zYWN0aW9uKHRvSGV4KGZyb21CYXNlNjQodGVzdERhdGEuVEVTVF9TRU5EX1RYLnNpZ25lZFR4QmFzZTY0KSkpO1xuICAgICAgY29uc3QganNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmVxdWFsKGpzb24uc2VxdWVuY2UsIHRlc3REYXRhLlRFU1RfU0VORF9UWC5zZXF1ZW5jZSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24uZ2FzQnVkZ2V0LCB0ZXN0RGF0YS5URVNUX1NFTkRfVFguZ2FzQnVkZ2V0KTtcbiAgICAgIHNob3VsZC5lcXVhbChqc29uLnB1YmxpY0tleSwgdG9IZXgoZnJvbUJhc2U2NCh0ZXN0RGF0YS5URVNUX1NFTkRfVFgucHViS2V5KSkpO1xuICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAoanNvbi5zZW5kTWVzc2FnZXNbMF0udmFsdWUgYXMgU2VuZE1lc3NhZ2UpLnRvQWRkcmVzcyxcbiAgICAgICAgdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNlbmRNZXNzYWdlLnZhbHVlLnRvQWRkcmVzc1xuICAgICAgKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwoXG4gICAgICAgIChqc29uLnNlbmRNZXNzYWdlc1swXS52YWx1ZSBhcyBTZW5kTWVzc2FnZSkuYW1vdW50LFxuICAgICAgICB0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2VuZE1lc3NhZ2UudmFsdWUuYW1vdW50XG4gICAgICApO1xuICAgICAgc2hvdWxkLmVxdWFsKEJ1ZmZlci5mcm9tKGpzb24uc2lnbmF0dXJlIGFzIGFueSkudG9TdHJpbmcoJ2Jhc2U2NCcpLCB0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2lnbmF0dXJlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICB0eC5sb2FkSW5wdXRzQW5kT3V0cHV0cygpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5pbnB1dHMsIFtcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLlRFU1RfU0VORF9UWC5zZW5kZXIsXG4gICAgICAgICAgdmFsdWU6IHRlc3REYXRhLlRFU1RfU0VORF9UWC5zZW5kTWVzc2FnZS52YWx1ZS5hbW91bnRbMF0uYW1vdW50LFxuICAgICAgICAgIGNvaW46ICd0aGFzaCcsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgub3V0cHV0cywgW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNlbmRNZXNzYWdlLnZhbHVlLnRvQWRkcmVzcyxcbiAgICAgICAgICB2YWx1ZTogdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudFswXS5hbW91bnQsXG4gICAgICAgICAgY29pbjogJ3RoYXNoJyxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIGRlbGVnYXRlIHR4biBmcm9tIHJhdyBzaWduZWQgYmFzZTY0JywgZnVuY3Rpb24gKCkge1xuICAgICAgdHguZW5yaWNoVHJhbnNhY3Rpb25EZXRhaWxzRnJvbVJhd1RyYW5zYWN0aW9uKHRlc3REYXRhLlRFU1RfREVMRUdBVEVfVFguc2lnbmVkVHhCYXNlNjQpO1xuICAgICAgY29uc3QganNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmVxdWFsKGpzb24uc2VxdWVuY2UsIHRlc3REYXRhLlRFU1RfREVMRUdBVEVfVFguc2VxdWVuY2UpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLmdhc0J1ZGdldCwgdGVzdERhdGEuVEVTVF9ERUxFR0FURV9UWC5nYXNCdWRnZXQpO1xuICAgICAgc2hvdWxkLmVxdWFsKEJ1ZmZlci5mcm9tKGpzb24ucHVibGljS2V5IGFzIGFueSwgJ2hleCcpLnRvU3RyaW5nKCdiYXNlNjQnKSwgdGVzdERhdGEuVEVTVF9ERUxFR0FURV9UWC5wdWJLZXkpO1xuICAgICAgc2hvdWxkLmVxdWFsKFxuICAgICAgICAoanNvbi5zZW5kTWVzc2FnZXNbMF0udmFsdWUgYXMgRGVsZWdhdGVPclVuZGVsZWdldGVNZXNzYWdlKS52YWxpZGF0b3JBZGRyZXNzLFxuICAgICAgICB0ZXN0RGF0YS5URVNUX0RFTEVHQVRFX1RYLnNlbmRNZXNzYWdlLnZhbHVlLnZhbGlkYXRvckFkZHJlc3NcbiAgICAgICk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKFxuICAgICAgICAoanNvbi5zZW5kTWVzc2FnZXNbMF0udmFsdWUgYXMgRGVsZWdhdGVPclVuZGVsZWdldGVNZXNzYWdlKS5hbW91bnQsXG4gICAgICAgIHRlc3REYXRhLlRFU1RfREVMRUdBVEVfVFguc2VuZE1lc3NhZ2UudmFsdWUuYW1vdW50XG4gICAgICApO1xuICAgICAgc2hvdWxkLmVxdWFsKEJ1ZmZlci5mcm9tKGpzb24uc2lnbmF0dXJlIGFzIGFueSkudG9TdHJpbmcoJ2Jhc2U2NCcpLCB0ZXN0RGF0YS5URVNUX0RFTEVHQVRFX1RYLnNpZ25hdHVyZSk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBY3RpdmF0ZSk7XG4gICAgICB0eC5sb2FkSW5wdXRzQW5kT3V0cHV0cygpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5pbnB1dHMsIFtcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLlRFU1RfREVMRUdBVEVfVFguZGVsZWdhdG9yLFxuICAgICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5URVNUX0RFTEVHQVRFX1RYLnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudC5hbW91bnQsXG4gICAgICAgICAgY29pbjogJ3RoYXNoJyxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5vdXRwdXRzLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5URVNUX0RFTEVHQVRFX1RYLnZhbGlkYXRvcixcbiAgICAgICAgICB2YWx1ZTogdGVzdERhdGEuVEVTVF9ERUxFR0FURV9UWC5zZW5kTWVzc2FnZS52YWx1ZS5hbW91bnQuYW1vdW50LFxuICAgICAgICAgIGNvaW46ICd0aGFzaCcsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB1bmRlbGVnYXRlIHR4biBmcm9tIHJhdyBzaWduZWQgYmFzZTY0JywgZnVuY3Rpb24gKCkge1xuICAgICAgdHguZW5yaWNoVHJhbnNhY3Rpb25EZXRhaWxzRnJvbVJhd1RyYW5zYWN0aW9uKHRlc3REYXRhLlRFU1RfVU5ERUxFR0FURV9UWC5zaWduZWRUeEJhc2U2NCk7XG4gICAgICBjb25zdCBqc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZXF1YWwoanNvbi5zZXF1ZW5jZSwgdGVzdERhdGEuVEVTVF9VTkRFTEVHQVRFX1RYLnNlcXVlbmNlKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwoanNvbi5nYXNCdWRnZXQsIHRlc3REYXRhLlRFU1RfVU5ERUxFR0FURV9UWC5nYXNCdWRnZXQpO1xuICAgICAgc2hvdWxkLmVxdWFsKEJ1ZmZlci5mcm9tKGpzb24ucHVibGljS2V5IGFzIGFueSwgJ2hleCcpLnRvU3RyaW5nKCdiYXNlNjQnKSwgdGVzdERhdGEuVEVTVF9VTkRFTEVHQVRFX1RYLnB1YktleSk7XG4gICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgIChqc29uLnNlbmRNZXNzYWdlc1swXS52YWx1ZSBhcyBEZWxlZ2F0ZU9yVW5kZWxlZ2V0ZU1lc3NhZ2UpLnZhbGlkYXRvckFkZHJlc3MsXG4gICAgICAgIHRlc3REYXRhLlRFU1RfVU5ERUxFR0FURV9UWC5zZW5kTWVzc2FnZS52YWx1ZS52YWxpZGF0b3JBZGRyZXNzXG4gICAgICApO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChcbiAgICAgICAgKGpzb24uc2VuZE1lc3NhZ2VzWzBdLnZhbHVlIGFzIERlbGVnYXRlT3JVbmRlbGVnZXRlTWVzc2FnZSkuYW1vdW50LFxuICAgICAgICB0ZXN0RGF0YS5URVNUX1VOREVMRUdBVEVfVFguc2VuZE1lc3NhZ2UudmFsdWUuYW1vdW50XG4gICAgICApO1xuICAgICAgc2hvdWxkLmVxdWFsKEJ1ZmZlci5mcm9tKGpzb24uc2lnbmF0dXJlIGFzIGFueSkudG9TdHJpbmcoJ2Jhc2U2NCcpLCB0ZXN0RGF0YS5URVNUX1VOREVMRUdBVEVfVFguc2lnbmF0dXJlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlYWN0aXZhdGUpO1xuICAgICAgdHgubG9hZElucHV0c0FuZE91dHB1dHMoKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguaW5wdXRzLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5URVNUX1VOREVMRUdBVEVfVFguZGVsZWdhdG9yLFxuICAgICAgICAgIHZhbHVlOiB0ZXN0RGF0YS5URVNUX1VOREVMRUdBVEVfVFguc2VuZE1lc3NhZ2UudmFsdWUuYW1vdW50LmFtb3VudCxcbiAgICAgICAgICBjb2luOiAndGhhc2gnLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKHR4Lm91dHB1dHMsIFtcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLlRFU1RfVU5ERUxFR0FURV9UWC52YWxpZGF0b3IsXG4gICAgICAgICAgdmFsdWU6IHRlc3REYXRhLlRFU1RfVU5ERUxFR0FURV9UWC5zZW5kTWVzc2FnZS52YWx1ZS5hbW91bnQuYW1vdW50LFxuICAgICAgICAgIGNvaW46ICd0aGFzaCcsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB3aXRoZHJhdyByZXdhcmRzIGZyb20gcmF3IHNpZ25lZCBiYXNlNjQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0eC5lbnJpY2hUcmFuc2FjdGlvbkRldGFpbHNGcm9tUmF3VHJhbnNhY3Rpb24odGVzdERhdGEuVEVTVF9XSVRIRFJBV19SRVdBUkRTX1RYLnNpZ25lZFR4QmFzZTY0KTtcbiAgICAgIGNvbnN0IGpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHNob3VsZC5lcXVhbChqc29uLnNlcXVlbmNlLCB0ZXN0RGF0YS5URVNUX1dJVEhEUkFXX1JFV0FSRFNfVFguc2VxdWVuY2UpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLmdhc0J1ZGdldCwgdGVzdERhdGEuVEVTVF9XSVRIRFJBV19SRVdBUkRTX1RYLmdhc0J1ZGdldCk7XG4gICAgICBzaG91bGQuZXF1YWwoXG4gICAgICAgIEJ1ZmZlci5mcm9tKGpzb24ucHVibGljS2V5IGFzIGFueSwgJ2hleCcpLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgICAgdGVzdERhdGEuVEVTVF9XSVRIRFJBV19SRVdBUkRTX1RYLnB1YktleVxuICAgICAgKTtcbiAgICAgIHNob3VsZC5lcXVhbChcbiAgICAgICAgKGpzb24uc2VuZE1lc3NhZ2VzWzBdLnZhbHVlIGFzIFdpdGhkcmF3RGVsZWdhdG9yUmV3YXJkc01lc3NhZ2UpLnZhbGlkYXRvckFkZHJlc3MsXG4gICAgICAgIHRlc3REYXRhLlRFU1RfV0lUSERSQVdfUkVXQVJEU19UWC5zZW5kTWVzc2FnZS52YWx1ZS52YWxpZGF0b3JBZGRyZXNzXG4gICAgICApO1xuICAgICAgc2hvdWxkLmVxdWFsKEJ1ZmZlci5mcm9tKGpzb24uc2lnbmF0dXJlIGFzIGFueSkudG9TdHJpbmcoJ2Jhc2U2NCcpLCB0ZXN0RGF0YS5URVNUX1dJVEhEUkFXX1JFV0FSRFNfVFguc2lnbmF0dXJlKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1dpdGhkcmF3KTtcblxuICAgICAgdHgubG9hZElucHV0c0FuZE91dHB1dHMoKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguaW5wdXRzLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5URVNUX1dJVEhEUkFXX1JFV0FSRFNfVFguZGVsZWdhdG9yLFxuICAgICAgICAgIHZhbHVlOiAnVU5BVkFJTEFCTEUnLFxuICAgICAgICAgIGNvaW46ICd0aGFzaCcsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgub3V0cHV0cywgW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogdGVzdERhdGEuVEVTVF9XSVRIRFJBV19SRVdBUkRTX1RYLnZhbGlkYXRvcixcbiAgICAgICAgICB2YWx1ZTogJ1VOQVZBSUxBQkxFJyxcbiAgICAgICAgICBjb2luOiAndGhhc2gnLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gYnVpbGQgYSB0cmFuc2ZlciBmcm9tIGluY29ycmVjdCByYXcgaGV4JywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLnRocm93cyhcbiAgICAgICAgKCkgPT4gdHguZW5yaWNoVHJhbnNhY3Rpb25EZXRhaWxzRnJvbVJhd1RyYW5zYWN0aW9uKCdyYW5kb20nICsgdGVzdERhdGEuVEVTVF9TRU5EX1RYLnNpZ25lZFR4QmFzZTY0KSxcbiAgICAgICAgJ2luY29ycmVjdCByYXcgZGF0YSdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gZXhwbGFpbiB0cmFuc2FjdGlvbiB3aXRoIGludmFsaWQgcmF3IGhleCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC50aHJvd3MoKCkgPT4gdHguZW5yaWNoVHJhbnNhY3Rpb25EZXRhaWxzRnJvbVJhd1RyYW5zYWN0aW9uKCdyYW5kb21TdHJpbmcnKSwgJ0ludmFsaWQgdHJhbnNhY3Rpb24nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0V4cGxhaW4gdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIGEgdHJhbnNmZXIgcGF5IHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgdHguZW5yaWNoVHJhbnNhY3Rpb25EZXRhaWxzRnJvbVJhd1RyYW5zYWN0aW9uKHRlc3REYXRhLlRFU1RfU0VORF9UWC5zaWduZWRUeEJhc2U2NCk7XG4gICAgICBjb25zdCBleHBsYWluZWRUcmFuc2FjdGlvbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGRpc3BsYXlPcmRlcjogWydpZCcsICdvdXRwdXRzJywgJ291dHB1dEFtb3VudCcsICdjaGFuZ2VPdXRwdXRzJywgJ2NoYW5nZUFtb3VudCcsICdmZWUnLCAndHlwZSddLFxuICAgICAgICBpZDogdGVzdERhdGEuVEVTVF9TRU5EX1RYLmhhc2gsXG4gICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5URVNUX1NFTkRfVFgucmVjaXBpZW50LFxuICAgICAgICAgICAgYW1vdW50OiB0ZXN0RGF0YS5URVNUX1NFTkRfVFguc2VuZEFtb3VudCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBvdXRwdXRBbW91bnQ6IHRlc3REYXRhLlRFU1RfU0VORF9UWC5zZW5kQW1vdW50LFxuICAgICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICAgIGZlZTogeyBmZWU6IHRlc3REYXRhLlRFU1RfU0VORF9UWC5mZWVBbW91bnQgfSxcbiAgICAgICAgdHlwZTogMCxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIGV4cGxhaW4gdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkIHJhdyBiYXNlNjQgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLnRocm93cygoKSA9PiB0eC5lbnJpY2hUcmFuc2FjdGlvbkRldGFpbHNGcm9tUmF3VHJhbnNhY3Rpb24oJ3JhbmRvbVN0cmluZycpLCAnSW52YWxpZCB0cmFuc2FjdGlvbicpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19

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


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