PHP WebShell

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

Просмотр файла: instructionParamsFactory.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 testData = __importStar(require("../resources/sol"));
const instructionParamsFactory_1 = require("../../src/lib/instructionParamsFactory");
const sdk_core_1 = require("@bitgo/sdk-core");
const constants_1 = require("../../src/lib/constants");
const web3_js_1 = require("@solana/web3.js");
const bignumber_js_1 = __importDefault(require("bignumber.js"));
const spl_token_1 = require("@solana/spl-token");
describe('Instruction Parser Tests: ', function () {
    describe('Succeed ', function () {
        it('Wallet init tx instructions', () => {
            const fromAddress = testData.authAccount.pub;
            const nonceAddress = testData.nonceAccount.pub;
            const authAddress = testData.authAccount.pub;
            const amount = '100000';
            const instructions = web3_js_1.SystemProgram.createNonceAccount({
                fromPubkey: new web3_js_1.PublicKey(fromAddress),
                noncePubkey: new web3_js_1.PublicKey(nonceAddress),
                authorizedPubkey: new web3_js_1.PublicKey(authAddress),
                lamports: new bignumber_js_1.default(amount).toNumber(),
            }).instructions;
            const createNonceAccount = {
                type: constants_1.InstructionBuilderTypes.CreateNonceAccount,
                params: { fromAddress, nonceAddress, authAddress, amount },
            };
            const result = (0, instructionParamsFactory_1.instructionParamsFactory)(sdk_core_1.TransactionType.WalletInitialization, instructions);
            should_1.default.deepEqual(result, [createNonceAccount]);
        });
        it('Send tx instructions', () => {
            const authAccount = testData.authAccount.pub;
            const nonceAccount = testData.nonceAccount.pub;
            const amount = '100000';
            const memo = 'test memo';
            // nonce
            const nonceAdvanceParams = {
                type: constants_1.InstructionBuilderTypes.NonceAdvance,
                params: { walletNonceAddress: nonceAccount, authWalletAddress: authAccount },
            };
            const nonceAdvanceInstruction = web3_js_1.SystemProgram.nonceAdvance({
                noncePubkey: new web3_js_1.PublicKey(nonceAccount),
                authorizedPubkey: new web3_js_1.PublicKey(authAccount),
            });
            // transfer
            const transferParams = {
                type: constants_1.InstructionBuilderTypes.Transfer,
                params: { fromAddress: authAccount, toAddress: nonceAccount, amount },
            };
            const transferInstruction = web3_js_1.SystemProgram.transfer({
                fromPubkey: new web3_js_1.PublicKey(authAccount),
                toPubkey: new web3_js_1.PublicKey(nonceAccount),
                lamports: new bignumber_js_1.default(amount).toNumber(),
            });
            // memo
            const memoParams = {
                type: constants_1.InstructionBuilderTypes.Memo,
                params: { memo },
            };
            const memoInstruction = new web3_js_1.TransactionInstruction({
                keys: [],
                programId: new web3_js_1.PublicKey(constants_1.MEMO_PROGRAM_PK),
                data: Buffer.from(memo),
            });
            const instructions = [nonceAdvanceInstruction, transferInstruction, memoInstruction];
            const instructionsData = [nonceAdvanceParams, transferParams, memoParams];
            const result = (0, instructionParamsFactory_1.instructionParamsFactory)(sdk_core_1.TransactionType.Send, instructions);
            should_1.default.deepEqual(result, instructionsData);
        });
        it('Send token tx instructions', () => {
            const authAccount = testData.authAccount.pub;
            const nonceAccount = testData.nonceAccount.pub;
            const amount = testData.tokenTransfers.amount;
            const memo = testData.tokenTransfers.memo;
            const decimals = testData.tokenTransfers.decimals;
            const nameUSDC = testData.tokenTransfers.nameUSDC;
            const mintUSDC = testData.tokenTransfers.mintUSDC;
            const owner = testData.tokenTransfers.owner;
            const sourceUSDC = testData.tokenTransfers.sourceUSDC;
            // nonce
            const nonceAdvanceParams = {
                type: constants_1.InstructionBuilderTypes.NonceAdvance,
                params: { walletNonceAddress: nonceAccount, authWalletAddress: authAccount },
            };
            const nonceAdvanceInstruction = web3_js_1.SystemProgram.nonceAdvance({
                noncePubkey: new web3_js_1.PublicKey(nonceAccount),
                authorizedPubkey: new web3_js_1.PublicKey(authAccount),
            });
            // token transfer
            const transferParams = {
                type: constants_1.InstructionBuilderTypes.TokenTransfer,
                params: {
                    fromAddress: owner,
                    toAddress: nonceAccount,
                    amount: amount.toString(),
                    tokenName: nameUSDC,
                    sourceAddress: sourceUSDC,
                },
            };
            const transferInstruction = (0, spl_token_1.createTransferCheckedInstruction)(new web3_js_1.PublicKey(sourceUSDC), new web3_js_1.PublicKey(mintUSDC), new web3_js_1.PublicKey(nonceAccount), new web3_js_1.PublicKey(owner), amount, decimals);
            // memo
            const memoParams = {
                type: constants_1.InstructionBuilderTypes.Memo,
                params: { memo },
            };
            const memoInstruction = new web3_js_1.TransactionInstruction({
                keys: [],
                programId: new web3_js_1.PublicKey(constants_1.MEMO_PROGRAM_PK),
                data: Buffer.from(memo),
            });
            const instructions = [nonceAdvanceInstruction, transferInstruction, memoInstruction];
            const instructionsData = [nonceAdvanceParams, transferParams, memoParams];
            const result = (0, instructionParamsFactory_1.instructionParamsFactory)(sdk_core_1.TransactionType.Send, instructions);
            should_1.default.deepEqual(result, instructionsData);
        });
        it('multi ATA init tx instructions', () => {
            const ataParams = [
                {
                    mintAddress: testData.associatedTokenAccounts.mintId,
                    ownerAddress: testData.associatedTokenAccounts.accounts[0].pub,
                    payerAddress: testData.associatedTokenAccounts.accounts[0].pub,
                    ataAddress: testData.associatedTokenAccounts.accounts[0].ata,
                },
                {
                    mintAddress: testData.associatedTokenAccounts.mintId,
                    ownerAddress: testData.associatedTokenAccounts.accounts[1].pub,
                    payerAddress: testData.associatedTokenAccounts.accounts[0].pub,
                    ataAddress: testData.associatedTokenAccounts.accounts[1].ata,
                },
            ];
            const ataInstructions = [];
            const createATAParams = [];
            ataParams.forEach((param) => {
                ataInstructions.push((0, spl_token_1.createAssociatedTokenAccountInstruction)(new web3_js_1.PublicKey(param.payerAddress), new web3_js_1.PublicKey(param.ataAddress), new web3_js_1.PublicKey(param.ownerAddress), new web3_js_1.PublicKey(param.mintAddress)));
                createATAParams.push({
                    type: constants_1.InstructionBuilderTypes.CreateAssociatedTokenAccount,
                    params: { ...param, tokenName: 'sol:usdc' },
                });
            });
            const result = (0, instructionParamsFactory_1.instructionParamsFactory)(sdk_core_1.TransactionType.AssociatedTokenAccountInitialization, ataInstructions);
            should_1.default.deepEqual(result, createATAParams);
        });
    });
    describe('Fail ', function () {
        it('Invalid type', () => {
            (0, should_1.default)(() => (0, instructionParamsFactory_1.instructionParamsFactory)(sdk_core_1.TransactionType.ContractCall, [])).throwError('Invalid transaction, transaction type not supported: ' + sdk_core_1.TransactionType.ContractCall);
        });
        it('Invalid Instruction for Send Type', () => {
            const fromAddress = testData.authAccount.pub;
            const nonceAddress = testData.nonceAccount.pub;
            const authAddress = testData.authAccount.pub;
            const amount = '100000';
            const instructions = web3_js_1.SystemProgram.createNonceAccount({
                fromPubkey: new web3_js_1.PublicKey(fromAddress),
                noncePubkey: new web3_js_1.PublicKey(nonceAddress),
                authorizedPubkey: new web3_js_1.PublicKey(authAddress),
                lamports: new bignumber_js_1.default(amount).toNumber(),
            }).instructions;
            (0, should_1.default)(() => (0, instructionParamsFactory_1.instructionParamsFactory)(sdk_core_1.TransactionType.Send, instructions)).throwError('Invalid transaction, instruction type not supported: Create');
        });
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1Y3Rpb25QYXJhbXNGYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L2luc3RydWN0aW9uUGFyYW1zRmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QiwyREFBNkM7QUFDN0MscUZBQWtGO0FBQ2xGLDhDQUFrRDtBQUVsRCx1REFBbUY7QUFDbkYsNkNBQW1GO0FBQ25GLGdFQUFxQztBQUNyQyxpREFBOEc7QUFFOUcsUUFBUSxDQUFDLDRCQUE0QixFQUFFO0lBQ3JDLFFBQVEsQ0FBQyxVQUFVLEVBQUU7UUFDbkIsRUFBRSxDQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRTtZQUNyQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQztZQUM3QyxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQztZQUMvQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQztZQUM3QyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUM7WUFDeEIsTUFBTSxZQUFZLEdBQUcsdUJBQWEsQ0FBQyxrQkFBa0IsQ0FBQztnQkFDcEQsVUFBVSxFQUFFLElBQUksbUJBQVMsQ0FBQyxXQUFXLENBQUM7Z0JBQ3RDLFdBQVcsRUFBRSxJQUFJLG1CQUFTLENBQUMsWUFBWSxDQUFDO2dCQUN4QyxnQkFBZ0IsRUFBRSxJQUFJLG1CQUFTLENBQUMsV0FBVyxDQUFDO2dCQUM1QyxRQUFRLEVBQUUsSUFBSSxzQkFBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRTthQUMzQyxDQUFDLENBQUMsWUFBWSxDQUFDO1lBRWhCLE1BQU0sa0JBQWtCLEdBQXNCO2dCQUM1QyxJQUFJLEVBQUUsbUNBQXVCLENBQUMsa0JBQWtCO2dCQUNoRCxNQUFNLEVB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QUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUNuRiw2REFBNkQsQ0FDOUQsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uL3Jlc291cmNlcy9zb2wnO1xuaW1wb3J0IHsgaW5zdHJ1Y3Rpb25QYXJhbXNGYWN0b3J5IH0gZnJvbSAnLi4vLi4vc3JjL2xpYi9pbnN0cnVjdGlvblBhcmFtc0ZhY3RvcnknO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IEluc3RydWN0aW9uUGFyYW1zIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi9pZmFjZSc7XG5pbXBvcnQgeyBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcywgTUVNT19QUk9HUkFNX1BLIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi9jb25zdGFudHMnO1xuaW1wb3J0IHsgUHVibGljS2V5LCBTeXN0ZW1Qcm9ncmFtLCBUcmFuc2FjdGlvbkluc3RydWN0aW9uIH0gZnJvbSAnQHNvbGFuYS93ZWIzLmpzJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCB7IGNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnRJbnN0cnVjdGlvbiwgY3JlYXRlVHJhbnNmZXJDaGVja2VkSW5zdHJ1Y3Rpb24gfSBmcm9tICdAc29sYW5hL3NwbC10b2tlbic7XG5cbmRlc2NyaWJlKCdJbnN0cnVjdGlvbiBQYXJzZXIgVGVzdHM6ICcsIGZ1bmN0aW9uICgpIHtcbiAgZGVzY3JpYmUoJ1N1Y2NlZWQgJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdXYWxsZXQgaW5pdCB0eCBpbnN0cnVjdGlvbnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBmcm9tQWRkcmVzcyA9IHRlc3REYXRhLmF1dGhBY2NvdW50LnB1YjtcbiAgICAgIGNvbnN0IG5vbmNlQWRkcmVzcyA9IHRlc3REYXRhLm5vbmNlQWNjb3VudC5wdWI7XG4gICAgICBjb25zdCBhdXRoQWRkcmVzcyA9IHRlc3REYXRhLmF1dGhBY2NvdW50LnB1YjtcbiAgICAgIGNvbnN0IGFtb3VudCA9ICcxMDAwMDAnO1xuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gU3lzdGVtUHJvZ3JhbS5jcmVhdGVOb25jZUFjY291bnQoe1xuICAgICAgICBmcm9tUHVia2V5OiBuZXcgUHVibGljS2V5KGZyb21BZGRyZXNzKSxcbiAgICAgICAgbm9uY2VQdWJrZXk6IG5ldyBQdWJsaWNLZXkobm9uY2VBZGRyZXNzKSxcbiAgICAgICAgYXV0aG9yaXplZFB1YmtleTogbmV3IFB1YmxpY0tleShhdXRoQWRkcmVzcyksXG4gICAgICAgIGxhbXBvcnRzOiBuZXcgQmlnTnVtYmVyKGFtb3VudCkudG9OdW1iZXIoKSxcbiAgICAgIH0pLmluc3RydWN0aW9ucztcblxuICAgICAgY29uc3QgY3JlYXRlTm9uY2VBY2NvdW50OiBJbnN0cnVjdGlvblBhcmFtcyA9IHtcbiAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlTm9uY2VBY2NvdW50LFxuICAgICAgICBwYXJhbXM6IHsgZnJvbUFkZHJlc3MsIG5vbmNlQWRkcmVzcywgYXV0aEFkZHJlc3MsIGFtb3VudCB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gaW5zdHJ1Y3Rpb25QYXJhbXNGYWN0b3J5KFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbiwgaW5zdHJ1Y3Rpb25zKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwocmVzdWx0LCBbY3JlYXRlTm9uY2VBY2NvdW50XSk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2VuZCB0eCBpbnN0cnVjdGlvbnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBhdXRoQWNjb3VudCA9IHRlc3REYXRhLmF1dGhBY2NvdW50LnB1YjtcbiAgICAgIGNvbnN0IG5vbmNlQWNjb3VudCA9IHRlc3REYXRhLm5vbmNlQWNjb3VudC5wdWI7XG4gICAgICBjb25zdCBhbW91bnQgPSAnMTAwMDAwJztcbiAgICAgIGNvbnN0IG1lbW8gPSAndGVzdCBtZW1vJztcblxuICAgICAgLy8gbm9uY2VcbiAgICAgIGNvbnN0IG5vbmNlQWR2YW5jZVBhcmFtczogSW5zdHJ1Y3Rpb25QYXJhbXMgPSB7XG4gICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgcGFyYW1zOiB7IHdhbGxldE5vbmNlQWRkcmVzczogbm9uY2VBY2NvdW50LCBhdXRoV2FsbGV0QWRkcmVzczogYXV0aEFjY291bnQgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCBub25jZUFkdmFuY2VJbnN0cnVjdGlvbiA9IFN5c3RlbVByb2dyYW0ubm9uY2VBZHZhbmNlKHtcbiAgICAgICAgbm9uY2VQdWJrZXk6IG5ldyBQdWJsaWNLZXkobm9uY2VBY2NvdW50KSxcbiAgICAgICAgYXV0aG9yaXplZFB1YmtleTogbmV3IFB1YmxpY0tleShhdXRoQWNjb3VudCksXG4gICAgICB9KTtcblxuICAgICAgLy8gdHJhbnNmZXJcbiAgICAgIGNvbnN0IHRyYW5zZmVyUGFyYW1zOiBJbnN0cnVjdGlvblBhcmFtcyA9IHtcbiAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVHJhbnNmZXIsXG4gICAgICAgIHBhcmFtczogeyBmcm9tQWRkcmVzczogYXV0aEFjY291bnQsIHRvQWRkcmVzczogbm9uY2VBY2NvdW50LCBhbW91bnQgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCB0cmFuc2Zlckluc3RydWN0aW9uID0gU3lzdGVtUHJvZ3JhbS50cmFuc2Zlcih7XG4gICAgICAgIGZyb21QdWJrZXk6IG5ldyBQdWJsaWNLZXkoYXV0aEFjY291bnQpLFxuICAgICAgICB0b1B1YmtleTogbmV3IFB1YmxpY0tleShub25jZUFjY291bnQpLFxuICAgICAgICBsYW1wb3J0czogbmV3IEJpZ051bWJlcihhbW91bnQpLnRvTnVtYmVyKCksXG4gICAgICB9KTtcblxuICAgICAgLy8gbWVtb1xuICAgICAgY29uc3QgbWVtb1BhcmFtczogSW5zdHJ1Y3Rpb25QYXJhbXMgPSB7XG4gICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sXG4gICAgICAgIHBhcmFtczogeyBtZW1vIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBtZW1vSW5zdHJ1Y3Rpb24gPSBuZXcgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbih7XG4gICAgICAgIGtleXM6IFtdLFxuICAgICAgICBwcm9ncmFtSWQ6IG5ldyBQdWJsaWNLZXkoTUVNT19QUk9HUkFNX1BLKSxcbiAgICAgICAgZGF0YTogQnVmZmVyLmZyb20obWVtbyksXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gW25vbmNlQWR2YW5jZUluc3RydWN0aW9uLCB0cmFuc2Zlckluc3RydWN0aW9uLCBtZW1vSW5zdHJ1Y3Rpb25dO1xuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zRGF0YSA9IFtub25jZUFkdmFuY2VQYXJhbXMsIHRyYW5zZmVyUGFyYW1zLCBtZW1vUGFyYW1zXTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGluc3RydWN0aW9uUGFyYW1zRmFjdG9yeShUcmFuc2FjdGlvblR5cGUuU2VuZCwgaW5zdHJ1Y3Rpb25zKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwocmVzdWx0LCBpbnN0cnVjdGlvbnNEYXRhKTtcbiAgICB9KTtcblxuICAgIGl0KCdTZW5kIHRva2VuIHR4IGluc3RydWN0aW9ucycsICgpID0+IHtcbiAgICAgIGNvbnN0IGF1dGhBY2NvdW50ID0gdGVzdERhdGEuYXV0aEFjY291bnQucHViO1xuICAgICAgY29uc3Qgbm9uY2VBY2NvdW50ID0gdGVzdERhdGEubm9uY2VBY2NvdW50LnB1YjtcbiAgICAgIGNvbnN0IGFtb3VudCA9IHRlc3REYXRhLnRva2VuVHJhbnNmZXJzLmFtb3VudDtcbiAgICAgIGNvbnN0IG1lbW8gPSB0ZXN0RGF0YS50b2tlblRyYW5zZmVycy5tZW1vO1xuICAgICAgY29uc3QgZGVjaW1hbHMgPSB0ZXN0RGF0YS50b2tlblRyYW5zZmVycy5kZWNpbWFscztcbiAgICAgIGNvbnN0IG5hbWVVU0RDID0gdGVzdERhdGEudG9rZW5UcmFuc2ZlcnMubmFtZVVTREM7XG4gICAgICBjb25zdCBtaW50VVNEQyA9IHRlc3REYXRhLnRva2VuVHJhbnNmZXJzLm1pbnRVU0RDO1xuICAgICAgY29uc3Qgb3duZXIgPSB0ZXN0RGF0YS50b2tlblRyYW5zZmVycy5vd25lcjtcbiAgICAgIGNvbnN0IHNvdXJjZVVTREMgPSB0ZXN0RGF0YS50b2tlblRyYW5zZmVycy5zb3VyY2VVU0RDO1xuXG4gICAgICAvLyBub25jZVxuICAgICAgY29uc3Qgbm9uY2VBZHZhbmNlUGFyYW1zOiBJbnN0cnVjdGlvblBhcmFtcyA9IHtcbiAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICBwYXJhbXM6IHsgd2FsbGV0Tm9uY2VBZGRyZXNzOiBub25jZUFjY291bnQsIGF1dGhXYWxsZXRBZGRyZXNzOiBhdXRoQWNjb3VudCB9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IG5vbmNlQWR2YW5jZUluc3RydWN0aW9uID0gU3lzdGVtUHJvZ3JhbS5ub25jZUFkdmFuY2Uoe1xuICAgICAgICBub25jZVB1YmtleTogbmV3IFB1YmxpY0tleShub25jZUFjY291bnQpLFxuICAgICAgICBhdXRob3JpemVkUHVia2V5OiBuZXcgUHVibGljS2V5KGF1dGhBY2NvdW50KSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyB0b2tlbiB0cmFuc2ZlclxuICAgICAgY29uc3QgdHJhbnNmZXJQYXJhbXMgPSB7XG4gICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlRva2VuVHJhbnNmZXIsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIGZyb21BZGRyZXNzOiBvd25lcixcbiAgICAgICAgICB0b0FkZHJlc3M6IG5vbmNlQWNjb3VudCxcbiAgICAgICAgICBhbW91bnQ6IGFtb3VudC50b1N0cmluZygpLFxuICAgICAgICAgIHRva2VuTmFtZTogbmFtZVVTREMsXG4gICAgICAgICAgc291cmNlQWRkcmVzczogc291cmNlVVNEQyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCB0cmFuc2Zlckluc3RydWN0aW9uID0gY3JlYXRlVHJhbnNmZXJDaGVja2VkSW5zdHJ1Y3Rpb24oXG4gICAgICAgIG5ldyBQdWJsaWNLZXkoc291cmNlVVNEQyksXG4gICAgICAgIG5ldyBQdWJsaWNLZXkobWludFVTREMpLFxuICAgICAgICBuZXcgUHVibGljS2V5KG5vbmNlQWNjb3VudCksXG4gICAgICAgIG5ldyBQdWJsaWNLZXkob3duZXIpLFxuICAgICAgICBhbW91bnQsXG4gICAgICAgIGRlY2ltYWxzXG4gICAgICApO1xuXG4gICAgICAvLyBtZW1vXG4gICAgICBjb25zdCBtZW1vUGFyYW1zOiBJbnN0cnVjdGlvblBhcmFtcyA9IHtcbiAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTWVtbyxcbiAgICAgICAgcGFyYW1zOiB7IG1lbW8gfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG1lbW9JbnN0cnVjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbkluc3RydWN0aW9uKHtcbiAgICAgICAga2V5czogW10sXG4gICAgICAgIHByb2dyYW1JZDogbmV3IFB1YmxpY0tleShNRU1PX1BST0dSQU1fUEspLFxuICAgICAgICBkYXRhOiBCdWZmZXIuZnJvbShtZW1vKSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSBbbm9uY2VBZHZhbmNlSW5zdHJ1Y3Rpb24sIHRyYW5zZmVySW5zdHJ1Y3Rpb24sIG1lbW9JbnN0cnVjdGlvbl07XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnNEYXRhID0gW25vbmNlQWR2YW5jZVBhcmFtcywgdHJhbnNmZXJQYXJhbXMsIG1lbW9QYXJhbXNdO1xuICAgICAgY29uc3QgcmVzdWx0ID0gaW5zdHJ1Y3Rpb25QYXJhbXNGYWN0b3J5KFRyYW5zYWN0aW9uVHlwZS5TZW5kLCBpbnN0cnVjdGlvbnMpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChyZXN1bHQsIGluc3RydWN0aW9uc0RhdGEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ211bHRpIEFUQSBpbml0IHR4IGluc3RydWN0aW9ucycsICgpID0+IHtcbiAgICAgIGNvbnN0IGF0YVBhcmFtcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIG1pbnRBZGRyZXNzOiB0ZXN0RGF0YS5hc3NvY2lhdGVkVG9rZW5BY2NvdW50cy5taW50SWQsXG4gICAgICAgICAgb3duZXJBZGRyZXNzOiB0ZXN0RGF0YS5hc3NvY2lhdGVkVG9rZW5BY2NvdW50cy5hY2NvdW50c1swXS5wdWIsXG4gICAgICAgICAgcGF5ZXJBZGRyZXNzOiB0ZXN0RGF0YS5hc3NvY2lhdGVkVG9rZW5BY2NvdW50cy5hY2NvdW50c1swXS5wdWIsXG4gICAgICAgICAgYXRhQWRkcmVzczogdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHMuYWNjb3VudHNbMF0uYXRhLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbWludEFkZHJlc3M6IHRlc3REYXRhLmFzc29jaWF0ZWRUb2tlbkFjY291bnRzLm1pbnRJZCxcbiAgICAgICAgICBvd25lckFkZHJlc3M6IHRlc3REYXRhLmFzc29jaWF0ZWRUb2tlbkFjY291bnRzLmFjY291bnRzWzFdLnB1YixcbiAgICAgICAgICBwYXllckFkZHJlc3M6IHRlc3REYXRhLmFzc29jaWF0ZWRUb2tlbkFjY291bnRzLmFjY291bnRzWzBdLnB1YixcbiAgICAgICAgICBhdGFBZGRyZXNzOiB0ZXN0RGF0YS5hc3NvY2lhdGVkVG9rZW5BY2NvdW50cy5hY2NvdW50c1sxXS5hdGEsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBhdGFJbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSA9IFtdO1xuICAgICAgY29uc3QgY3JlYXRlQVRBUGFyYW1zOiBJbnN0cnVjdGlvblBhcmFtc1tdID0gW107XG5cbiAgICAgIGF0YVBhcmFtcy5mb3JFYWNoKChwYXJhbSkgPT4ge1xuICAgICAgICBhdGFJbnN0cnVjdGlvbnMucHVzaChcbiAgICAgICAgICBjcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50SW5zdHJ1Y3Rpb24oXG4gICAgICAgICAgICBuZXcgUHVibGljS2V5KHBhcmFtLnBheWVyQWRkcmVzcyksXG4gICAgICAgICAgICBuZXcgUHVibGljS2V5KHBhcmFtLmF0YUFkZHJlc3MpLFxuICAgICAgICAgICAgbmV3IFB1YmxpY0tleShwYXJhbS5vd25lckFkZHJlc3MpLFxuICAgICAgICAgICAgbmV3IFB1YmxpY0tleShwYXJhbS5taW50QWRkcmVzcylcbiAgICAgICAgICApXG4gICAgICAgICk7XG5cbiAgICAgICAgY3JlYXRlQVRBUGFyYW1zLnB1c2goe1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQsXG4gICAgICAgICAgcGFyYW1zOiB7IC4uLnBhcmFtLCB0b2tlbk5hbWU6ICdzb2w6dXNkYycgfSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGluc3RydWN0aW9uUGFyYW1zRmFjdG9yeShUcmFuc2FjdGlvblR5cGUuQXNzb2NpYXRlZFRva2VuQWNjb3VudEluaXRpYWxpemF0aW9uLCBhdGFJbnN0cnVjdGlvbnMpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChyZXN1bHQsIGNyZWF0ZUFUQVBhcmFtcyk7XG4gICAgfSk7XG4gIH0pO1xuICBkZXNjcmliZSgnRmFpbCAnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ0ludmFsaWQgdHlwZScsICgpID0+IHtcbiAgICAgIHNob3VsZCgoKSA9PiBpbnN0cnVjdGlvblBhcmFtc0ZhY3RvcnkoVHJhbnNhY3Rpb25UeXBlLkNvbnRyYWN0Q2FsbCwgW10pKS50aHJvd0Vycm9yKFxuICAgICAgICAnSW52YWxpZCB0cmFuc2FjdGlvbiwgdHJhbnNhY3Rpb24gdHlwZSBub3Qgc3VwcG9ydGVkOiAnICsgVHJhbnNhY3Rpb25UeXBlLkNvbnRyYWN0Q2FsbFxuICAgICAgKTtcbiAgICB9KTtcbiAgICBpdCgnSW52YWxpZCBJbnN0cnVjdGlvbiBmb3IgU2VuZCBUeXBlJywgKCkgPT4ge1xuICAgICAgY29uc3QgZnJvbUFkZHJlc3MgPSB0ZXN0RGF0YS5hdXRoQWNjb3VudC5wdWI7XG4gICAgICBjb25zdCBub25jZUFkZHJlc3MgPSB0ZXN0RGF0YS5ub25jZUFjY291bnQucHViO1xuICAgICAgY29uc3QgYXV0aEFkZHJlc3MgPSB0ZXN0RGF0YS5hdXRoQWNjb3VudC5wdWI7XG4gICAgICBjb25zdCBhbW91bnQgPSAnMTAwMDAwJztcbiAgICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IFN5c3RlbVByb2dyYW0uY3JlYXRlTm9uY2VBY2NvdW50KHtcbiAgICAgICAgZnJvbVB1YmtleTogbmV3IFB1YmxpY0tleShmcm9tQWRkcmVzcyksXG4gICAgICAgIG5vbmNlUHVia2V5OiBuZXcgUHVibGljS2V5KG5vbmNlQWRkcmVzcyksXG4gICAgICAgIGF1dGhvcml6ZWRQdWJrZXk6IG5ldyBQdWJsaWNLZXkoYXV0aEFkZHJlc3MpLFxuICAgICAgICBsYW1wb3J0czogbmV3IEJpZ051bWJlcihhbW91bnQpLnRvTnVtYmVyKCksXG4gICAgICB9KS5pbnN0cnVjdGlvbnM7XG5cbiAgICAgIHNob3VsZCgoKSA9PiBpbnN0cnVjdGlvblBhcmFtc0ZhY3RvcnkoVHJhbnNhY3Rpb25UeXBlLlNlbmQsIGluc3RydWN0aW9ucykpLnRocm93RXJyb3IoXG4gICAgICAgICdJbnZhbGlkIHRyYW5zYWN0aW9uLCBpbnN0cnVjdGlvbiB0eXBlIG5vdCBzdXBwb3J0ZWQ6IENyZWF0ZSdcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=

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


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