PHP WebShell

Текущая директория: /opt/BitGoJS/modules/express/dist/test/unit/clientRoutes

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

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const sinon = require("sinon");
require("should-http");
require("should-sinon");
require("../../lib/asserts");
const clientRoutes_1 = require("../../../src/clientRoutes");
const bitgo_1 = require("bitgo");
describe('Consolidate account', () => {
    it('should fail if coin does not allow consolidation', async () => {
        const coinStub = sinon.stub().returns({ allowsAccountConsolidations: () => false });
        const stubBitgo = sinon.createStubInstance(bitgo_1.BitGo, { coin: coinStub });
        const mockRequest = {
            bitgo: stubBitgo,
            params: {
                coin: 'tbtc',
                id: '23423423423423',
            },
            body: {
                consolidateAddresses: ['someAddr'],
            },
        };
        await (0, clientRoutes_1.handleV2ConsolidateAccount)(mockRequest).should.be.rejectedWith('invalid coin selected');
    });
    it('should pass if coin allows consolidation', async () => {
        const result = { failure: [] };
        const { bitgoStub, consolidationStub } = createConsolidateMocks(result, true);
        const mockRequest = {
            bitgo: bitgoStub,
            params: {
                coin: 'txtz',
                id: '23423423423423',
            },
            body: {
                consolidateAddresses: ['someAddr'],
            },
        };
        await (0, clientRoutes_1.handleV2ConsolidateAccount)(mockRequest).should.be.resolvedWith(result);
        consolidationStub.should.be.calledOnceWith(mockRequest.body);
    });
    it('should fail on invalid array in body addresses', async () => {
        const stubBitgo = sinon.createStubInstance(bitgo_1.BitGo);
        const mockRequest = {
            bitgo: stubBitgo,
            params: {
                coin: 'talgo',
                id: '23423423423423',
            },
            body: {
                consolidateAddresses: 'someAddr',
            },
        };
        await (0, clientRoutes_1.handleV2ConsolidateAccount)(mockRequest).should.be.rejectedWith('consolidate address must be an array of addresses');
    });
    function createConsolidateMocks(res, allowsAccountConsolidations = false, supportsTss = false) {
        const consolidationStub = sinon.stub().returns(res);
        const walletStub = { sendAccountConsolidations: consolidationStub };
        const coinStub = {
            supportsTss: () => supportsTss,
            allowsAccountConsolidations: () => allowsAccountConsolidations,
            wallets: () => ({ get: () => Promise.resolve(walletStub) }),
        };
        return {
            bitgoStub: sinon.createStubInstance(bitgo_1.BitGo, { coin: coinStub }),
            consolidationStub,
        };
    }
    it('should return 400 when all transactions fail', async () => {
        const result = { success: [], failure: [0] };
        const body = 'testbody';
        const { bitgoStub, consolidationStub } = createConsolidateMocks(result, true);
        const mockRequest = {
            bitgo: bitgoStub,
            params: {
                coin: 'talgo',
            },
            body,
        };
        await (0, clientRoutes_1.handleV2ConsolidateAccount)(mockRequest).should.be.rejectedWith({
            status: 400,
            result,
        });
        consolidationStub.should.be.calledOnceWith(body);
    });
    it('should pass the apiVersion param to bitgo api consolidate/build', async () => {
        const result = { success: [], failure: [] };
        const body = { apiVersion: 'full' };
        const { bitgoStub, consolidationStub } = createConsolidateMocks(result, true, true);
        const mockRequest = {
            bitgo: bitgoStub,
            params: {
                coin: 'tsol',
                id: '23423423423423',
            },
            body,
        };
        await (0, clientRoutes_1.handleV2ConsolidateAccount)(mockRequest).should.be.resolvedWith(result);
        consolidationStub.should.be.calledOnceWith(body);
    });
    it('should return 202 when some transactions fail', async () => {
        const result = { success: [0], failure: [0] };
        const body = 'testbody';
        const { bitgoStub, consolidationStub } = createConsolidateMocks(result, true);
        const mockRequest = {
            bitgo: bitgoStub,
            params: {
                coin: 'talgo',
            },
            body,
        };
        await (0, clientRoutes_1.handleV2ConsolidateAccount)(mockRequest).should.be.rejectedWith({
            status: 202,
            result,
        });
        consolidationStub.should.be.calledOnceWith(body);
    });
    it('should return 200 when all transactions succeed', async () => {
        const result = { failure: [] };
        const body = 'testbody';
        const { bitgoStub, consolidationStub } = createConsolidateMocks(result, true);
        const mockRequest = {
            bitgo: bitgoStub,
            params: {
                coin: 'talgo',
            },
            body,
        };
        await (0, clientRoutes_1.handleV2ConsolidateAccount)(mockRequest).should.be.resolvedWith(result);
        consolidationStub.should.be.calledOnceWith(body);
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc29saWRhdGVBY2NvdW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2NsaWVudFJvdXRlcy9jb25zb2xpZGF0ZUFjY291bnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwrQkFBK0I7QUFFL0IsdUJBQXFCO0FBQ3JCLHdCQUFzQjtBQUN0Qiw2QkFBMkI7QUFJM0IsNERBQXVFO0FBRXZFLGlDQUE4QjtBQUU5QixRQUFRLENBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFO0lBQ25DLEVBQUUsQ0FBQyxrREFBa0QsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNoRSxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsMkJBQTJCLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNwRixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsa0JBQWtCLENBQUMsYUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFFN0UsTUFBTSxXQUFXLEdBQUc7WUFDbEIsS0FBSyxFQUFFLFNBQVM7WUFDaEIsTUFBTSxFQUFFO2dCQUNOLElBQUksRUFBRSxNQUFNO2dCQUNaLEVBQUUsRUFBRSxnQkFBZ0I7YUFDckI7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osb0JBQW9CLEVBQUUsQ0FBQyxVQUFVLENBQUM7YUFDbkM7U0FDRixDQUFDO1FBRUYsTUFBTSxJQUFBLHlDQUEwQixFQUFDLFdBQW1ELENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FDMUcsdUJBQXVCLENBQ3hCLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywwQ0FBMEMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN4RCxNQUFNLE1BQU0sR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUMvQixNQUFNLEVB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LFNBQVM7WUFDaEIsTUFBTSxFQUFFO2dCQUNOLElBQUksRUFBRSxPQUFPO2FBQ2Q7WUFDRCxJQUFJO1NBQ0wsQ0FBQztRQUVGLE1BQU0sSUFBQSx5Q0FBMEIsRUFBQyxXQUFtRCxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUM7WUFDM0csTUFBTSxFQUFFLEdBQUc7WUFDWCxNQUFNO1NBQ1AsQ0FBQyxDQUFDO1FBQ0gsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsaURBQWlELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDL0QsTUFBTSxNQUFNLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDL0IsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDO1FBQ3hCLE1BQU0sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDOUUsTUFBTSxXQUFXLEdBQUc7WUFDbEIsS0FBSyxFQUFFLFNBQVM7WUFDaEIsTUFBTSxFQUFFO2dCQUNOLElBQUksRUFBRSxPQUFPO2FBQ2Q7WUFDRCxJQUFJO1NBQ0wsQ0FBQztRQUVGLE1BQU0sSUFBQSx5Q0FBMEIsRUFBQyxXQUFtRCxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQzFHLE1BQU0sQ0FDUCxDQUFDO1FBQ0YsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkQsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcblxuaW1wb3J0ICdzaG91bGQtaHR0cCc7XG5pbXBvcnQgJ3Nob3VsZC1zaW5vbic7XG5pbXBvcnQgJy4uLy4uL2xpYi9hc3NlcnRzJztcblxuaW1wb3J0ICogYXMgZXhwcmVzcyBmcm9tICdleHByZXNzJztcblxuaW1wb3J0IHsgaGFuZGxlVjJDb25zb2xpZGF0ZUFjY291bnQgfSBmcm9tICcuLi8uLi8uLi9zcmMvY2xpZW50Um91dGVzJztcblxuaW1wb3J0IHsgQml0R28gfSBmcm9tICdiaXRnbyc7XG5cbmRlc2NyaWJlKCdDb25zb2xpZGF0ZSBhY2NvdW50JywgKCkgPT4ge1xuICBpdCgnc2hvdWxkIGZhaWwgaWYgY29pbiBkb2VzIG5vdCBhbGxvdyBjb25zb2xpZGF0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNvaW5TdHViID0gc2lub24uc3R1YigpLnJldHVybnMoeyBhbGxvd3NBY2NvdW50Q29uc29saWRhdGlvbnM6ICgpID0+IGZhbHNlIH0pO1xuICAgIGNvbnN0IHN0dWJCaXRnbyA9IHNpbm9uLmNyZWF0ZVN0dWJJbnN0YW5jZShCaXRHbyBhcyBhbnksIHsgY29pbjogY29pblN0dWIgfSk7XG5cbiAgICBjb25zdCBtb2NrUmVxdWVzdCA9IHtcbiAgICAgIGJpdGdvOiBzdHViQml0Z28sXG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgY29pbjogJ3RidGMnLFxuICAgICAgICBpZDogJzIzNDIzNDIzNDIzNDIzJyxcbiAgICAgIH0sXG4gICAgICBib2R5OiB7XG4gICAgICAgIGNvbnNvbGlkYXRlQWRkcmVzc2VzOiBbJ3NvbWVBZGRyJ10sXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBhd2FpdCBoYW5kbGVWMkNvbnNvbGlkYXRlQWNjb3VudChtb2NrUmVxdWVzdCBhcyBleHByZXNzLlJlcXVlc3QgJiB0eXBlb2YgbW9ja1JlcXVlc3QpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAnaW52YWxpZCBjb2luIHNlbGVjdGVkJ1xuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcGFzcyBpZiBjb2luIGFsbG93cyBjb25zb2xpZGF0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHsgZmFpbHVyZTogW10gfTtcbiAgICBjb25zdCB7IGJpdGdvU3R1YiwgY29uc29saWRhdGlvblN0dWIgfSA9IGNyZWF0ZUNvbnNvbGlkYXRlTW9ja3MocmVzdWx0LCB0cnVlKTtcblxuICAgIGNvbnN0IG1vY2tSZXF1ZXN0ID0ge1xuICAgICAgYml0Z286IGJpdGdvU3R1YixcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBjb2luOiAndHh0eicsXG4gICAgICAgIGlkOiAnMjM0MjM0MjM0MjM0MjMnLFxuICAgICAgfSxcbiAgICAgIGJvZHk6IHtcbiAgICAgICAgY29uc29saWRhdGVBZGRyZXNzZXM6IFsnc29tZUFkZHInXSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGF3YWl0IGhhbmRsZVYyQ29uc29saWRhdGVBY2NvdW50KG1vY2tSZXF1ZXN0IGFzIGV4cHJlc3MuUmVxdWVzdCAmIHR5cGVvZiBtb2NrUmVxdWVzdCkuc2hvdWxkLmJlLnJlc29sdmVkV2l0aChcbiAgICAgIHJlc3VsdFxuICAgICk7XG4gICAgY29uc29saWRhdGlvblN0dWIuc2hvdWxkLmJlLmNhbGxlZE9uY2VXaXRoKG1vY2tSZXF1ZXN0LmJvZHkpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGZhaWwgb24gaW52YWxpZCBhcnJheSBpbiBib2R5IGFkZHJlc3NlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzdHViQml0Z28gPSBzaW5vbi5jcmVhdGVTdHViSW5zdGFuY2UoQml0R28pO1xuXG4gICAgY29uc3QgbW9ja1JlcXVlc3QgPSB7XG4gICAgICBiaXRnbzogc3R1YkJpdGdvLFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIGNvaW46ICd0YWxnbycsXG4gICAgICAgIGlkOiAnMjM0MjM0MjM0MjM0MjMnLFxuICAgICAgfSxcbiAgICAgIGJvZHk6IHtcbiAgICAgICAgY29uc29saWRhdGVBZGRyZXNzZXM6ICdzb21lQWRkcicsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBhd2FpdCBoYW5kbGVWMkNvbnNvbGlkYXRlQWNjb3VudChtb2NrUmVxdWVzdCBhcyBleHByZXNzLlJlcXVlc3QgJiB0eXBlb2YgbW9ja1JlcXVlc3QpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAnY29uc29saWRhdGUgYWRkcmVzcyBtdXN0IGJlIGFuIGFycmF5IG9mIGFkZHJlc3NlcydcbiAgICApO1xuICB9KTtcblxuICBmdW5jdGlvbiBjcmVhdGVDb25zb2xpZGF0ZU1vY2tzKHJlcywgYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zID0gZmFsc2UsIHN1cHBvcnRzVHNzID0gZmFsc2UpIHtcbiAgICBjb25zdCBjb25zb2xpZGF0aW9uU3R1YiA9IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHJlcyk7XG4gICAgY29uc3Qgd2FsbGV0U3R1YiA9IHsgc2VuZEFjY291bnRDb25zb2xpZGF0aW9uczogY29uc29saWRhdGlvblN0dWIgfTtcbiAgICBjb25zdCBjb2luU3R1YiA9IHtcbiAgICAgIHN1cHBvcnRzVHNzOiAoKSA9PiBzdXBwb3J0c1RzcyxcbiAgICAgIGFsbG93c0FjY291bnRDb25zb2xpZGF0aW9uczogKCkgPT4gYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zLFxuICAgICAgd2FsbGV0czogKCkgPT4gKHsgZ2V0OiAoKSA9PiBQcm9taXNlLnJlc29sdmUod2FsbGV0U3R1YikgfSksXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgYml0Z29TdHViOiBzaW5vbi5jcmVhdGVTdHViSW5zdGFuY2UoQml0R28gYXMgYW55LCB7IGNvaW46IGNvaW5TdHViIH0pLFxuICAgICAgY29uc29saWRhdGlvblN0dWIsXG4gICAgfTtcbiAgfVxuXG4gIGl0KCdzaG91bGQgcmV0dXJuIDQwMCB3aGVuIGFsbCB0cmFuc2FjdGlvbnMgZmFpbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSB7IHN1Y2Nlc3M6IFtdLCBmYWlsdXJlOiBbMF0gfTtcbiAgICBjb25zdCBib2R5ID0gJ3Rlc3Rib2R5JztcbiAgICBjb25zdCB7IGJpdGdvU3R1YiwgY29uc29saWRhdGlvblN0dWIgfSA9IGNyZWF0ZUNvbnNvbGlkYXRlTW9ja3MocmVzdWx0LCB0cnVlKTtcbiAgICBjb25zdCBtb2NrUmVxdWVzdCA9IHtcbiAgICAgIGJpdGdvOiBiaXRnb1N0dWIsXG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgY29pbjogJ3RhbGdvJyxcbiAgICAgIH0sXG4gICAgICBib2R5LFxuICAgIH07XG5cbiAgICBhd2FpdCBoYW5kbGVWMkNvbnNvbGlkYXRlQWNjb3VudChtb2NrUmVxdWVzdCBhcyBleHByZXNzLlJlcXVlc3QgJiB0eXBlb2YgbW9ja1JlcXVlc3QpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoe1xuICAgICAgc3RhdHVzOiA0MDAsXG4gICAgICByZXN1bHQsXG4gICAgfSk7XG4gICAgY29uc29saWRhdGlvblN0dWIuc2hvdWxkLmJlLmNhbGxlZE9uY2VXaXRoKGJvZHkpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHBhc3MgdGhlIGFwaVZlcnNpb24gcGFyYW0gdG8gYml0Z28gYXBpIGNvbnNvbGlkYXRlL2J1aWxkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHsgc3VjY2VzczogW10sIGZhaWx1cmU6IFtdIH07XG4gICAgY29uc3QgYm9keSA9IHsgYXBpVmVyc2lvbjogJ2Z1bGwnIH07XG4gICAgY29uc3QgeyBiaXRnb1N0dWIsIGNvbnNvbGlkYXRpb25TdHViIH0gPSBjcmVhdGVDb25zb2xpZGF0ZU1vY2tzKHJlc3VsdCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgY29uc3QgbW9ja1JlcXVlc3QgPSB7XG4gICAgICBiaXRnbzogYml0Z29TdHViLFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIGNvaW46ICd0c29sJyxcbiAgICAgICAgaWQ6ICcyMzQyMzQyMzQyMzQyMycsXG4gICAgICB9LFxuICAgICAgYm9keSxcbiAgICB9O1xuXG4gICAgYXdhaXQgaGFuZGxlVjJDb25zb2xpZGF0ZUFjY291bnQobW9ja1JlcXVlc3QgYXMgZXhwcmVzcy5SZXF1ZXN0ICYgdHlwZW9mIG1vY2tSZXF1ZXN0KS5zaG91bGQuYmUucmVzb2x2ZWRXaXRoKFxuICAgICAgcmVzdWx0XG4gICAgKTtcbiAgICBjb25zb2xpZGF0aW9uU3R1Yi5zaG91bGQuYmUuY2FsbGVkT25jZVdpdGgoYm9keSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIDIwMiB3aGVuIHNvbWUgdHJhbnNhY3Rpb25zIGZhaWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0geyBzdWNjZXNzOiBbMF0sIGZhaWx1cmU6IFswXSB9O1xuICAgIGNvbnN0IGJvZHkgPSAndGVzdGJvZHknO1xuICAgIGNvbnN0IHsgYml0Z29TdHViLCBjb25zb2xpZGF0aW9uU3R1YiB9ID0gY3JlYXRlQ29uc29saWRhdGVNb2NrcyhyZXN1bHQsIHRydWUpO1xuICAgIGNvbnN0IG1vY2tSZXF1ZXN0ID0ge1xuICAgICAgYml0Z286IGJpdGdvU3R1YixcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBjb2luOiAndGFsZ28nLFxuICAgICAgfSxcbiAgICAgIGJvZHksXG4gICAgfTtcblxuICAgIGF3YWl0IGhhbmRsZVYyQ29uc29saWRhdGVBY2NvdW50KG1vY2tSZXF1ZXN0IGFzIGV4cHJlc3MuUmVxdWVzdCAmIHR5cGVvZiBtb2NrUmVxdWVzdCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCh7XG4gICAgICBzdGF0dXM6IDIwMixcbiAgICAgIHJlc3VsdCxcbiAgICB9KTtcbiAgICBjb25zb2xpZGF0aW9uU3R1Yi5zaG91bGQuYmUuY2FsbGVkT25jZVdpdGgoYm9keSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIDIwMCB3aGVuIGFsbCB0cmFuc2FjdGlvbnMgc3VjY2VlZCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSB7IGZhaWx1cmU6IFtdIH07XG4gICAgY29uc3QgYm9keSA9ICd0ZXN0Ym9keSc7XG4gICAgY29uc3QgeyBiaXRnb1N0dWIsIGNvbnNvbGlkYXRpb25TdHViIH0gPSBjcmVhdGVDb25zb2xpZGF0ZU1vY2tzKHJlc3VsdCwgdHJ1ZSk7XG4gICAgY29uc3QgbW9ja1JlcXVlc3QgPSB7XG4gICAgICBiaXRnbzogYml0Z29TdHViLFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIGNvaW46ICd0YWxnbycsXG4gICAgICB9LFxuICAgICAgYm9keSxcbiAgICB9O1xuXG4gICAgYXdhaXQgaGFuZGxlVjJDb25zb2xpZGF0ZUFjY291bnQobW9ja1JlcXVlc3QgYXMgZXhwcmVzcy5SZXF1ZXN0ICYgdHlwZW9mIG1vY2tSZXF1ZXN0KS5zaG91bGQuYmUucmVzb2x2ZWRXaXRoKFxuICAgICAgcmVzdWx0XG4gICAgKTtcbiAgICBjb25zb2xpZGF0aW9uU3R1Yi5zaG91bGQuYmUuY2FsbGVkT25jZVdpdGgoYm9keSk7XG4gIH0pO1xufSk7XG4iXX0=

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


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