PHP WebShell

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

Просмотр файла: stakingBuilder.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 assert_1 = __importDefault(require("assert"));
const should_1 = __importDefault(require("should"));
const statics_1 = require("@bitgo/statics");
const stakingBuilder_1 = require("../../src/lib/stakingBuilder");
const sdk_core_1 = require("@bitgo/sdk-core");
const testData = __importStar(require("../resources/celo"));
describe('Celo staking operations builder', function () {
    const coin = statics_1.coins.get('tcelo');
    let builder;
    beforeEach(() => {
        builder = new stakingBuilder_1.StakingBuilder(coin);
        builder.type(sdk_core_1.StakingOperationTypes.LOCK);
        builder.amount('1000');
    });
    const lockOperation = (0, sdk_core_1.getOperationConfig)(sdk_core_1.StakingOperationTypes.LOCK, coin.network.type);
    const unlockOperation = (0, sdk_core_1.getOperationConfig)(sdk_core_1.StakingOperationTypes.UNLOCK, coin.network.type);
    const withdrawOperation = (0, sdk_core_1.getOperationConfig)(sdk_core_1.StakingOperationTypes.WITHDRAW, coin.network.type);
    const voteOperation = (0, sdk_core_1.getOperationConfig)(sdk_core_1.StakingOperationTypes.VOTE, coin.network.type);
    const unvoteOperation = (0, sdk_core_1.getOperationConfig)(sdk_core_1.StakingOperationTypes.UNVOTE, coin.network.type);
    const activateOperation = (0, sdk_core_1.getOperationConfig)(sdk_core_1.StakingOperationTypes.ACTIVATE, coin.network.type);
    it('should build a staking lock operation', () => {
        const staking = builder.build();
        should_1.default.equal(staking.address, lockOperation.contractAddress);
        should_1.default.equal(staking.serialize(), lockOperation.methodId);
    });
    it('should build a staking unlock operation', () => {
        builder.type(sdk_core_1.StakingOperationTypes.UNLOCK);
        builder.amount('100');
        const staking = builder.build();
        should_1.default.equal(staking.address, unlockOperation.contractAddress);
        staking.serialize().should.startWith(unlockOperation.methodId);
        should_1.default.equal(staking.serialize(), testData.UNLOCK_DATA);
    });
    it('should build a staking withdraw operation', () => {
        builder.type(sdk_core_1.StakingOperationTypes.WITHDRAW);
        builder.index(0);
        const staking = builder.build();
        should_1.default.equal(staking.address, withdrawOperation.contractAddress);
        staking.serialize().should.startWith(withdrawOperation.methodId);
        should_1.default.equal(staking.serialize(), testData.WITHDRAW_DATA);
    });
    it('should fail if the index is invalid', () => {
        builder.type(sdk_core_1.StakingOperationTypes.WITHDRAW);
        assert_1.default.throws(() => {
            builder.index(-1);
        }, (e) => e.message === testData.INVALID_INDEX_ERROR);
    });
    it('should build a staking vote operation', () => {
        builder.type(sdk_core_1.StakingOperationTypes.VOTE);
        builder.group(testData.GROUP_ADDRESS);
        builder.lesser(testData.LESSER_ADDRESS);
        builder.greater(testData.GREATER_ADDRESS);
        const staking = builder.build();
        should_1.default.equal(staking.address, voteOperation.contractAddress);
        should_1.default.equal(staking.serialize(), testData.VOTE_SERIALIZED_DATA);
    });
    it('should build only setting the lesser', () => {
        builder.type(sdk_core_1.StakingOperationTypes.VOTE);
        builder.group(testData.GROUP_ADDRESS);
        builder.lesser(testData.LESSER_ADDRESS);
        const staking = builder.build();
        should_1.default.equal(staking.address, voteOperation.contractAddress);
        should_1.default.equal(staking.serialize(), testData.VOTE_LESSER_SERIALIZED_DATA);
    });
    it('should build only setting the greater', () => {
        builder.type(sdk_core_1.StakingOperationTypes.VOTE);
        builder.group(testData.GROUP_ADDRESS);
        builder.greater(testData.GREATER_ADDRESS);
        const staking = builder.build();
        should_1.default.equal(staking.address, voteOperation.contractAddress);
        should_1.default.equal(staking.serialize(), testData.VOTE_GREATER_SERIALIZED_DATA);
    });
    it('should build a staking unvote operation', () => {
        builder.type(sdk_core_1.StakingOperationTypes.UNVOTE);
        builder.group(testData.GROUP_ADDRESS);
        builder.lesser(testData.LESSER_ADDRESS);
        builder.greater(testData.GREATER_ADDRESS);
        builder.amount('1');
        builder.index(0);
        const staking = builder.build();
        should_1.default.equal(staking.address, unvoteOperation.contractAddress);
        should_1.default.equal(staking.serialize(), testData.UNVOTE_SERIALIZED_DATA);
    });
    it('should fail if the unvote index is invalid', () => {
        builder.type(sdk_core_1.StakingOperationTypes.UNVOTE);
        assert_1.default.throws(() => {
            builder.index(-1);
        }, (e) => e.message === testData.INVALID_INDEX_ERROR);
    });
    it(`should throw error when trying to build unvote operation with missing 'index' `, () => {
        builder.type(sdk_core_1.StakingOperationTypes.UNVOTE);
        builder.group(testData.GROUP_ADDRESS);
        builder.lesser(testData.LESSER_ADDRESS);
        builder.greater(testData.GREATER_ADDRESS);
        builder.amount('1');
        assert_1.default.throws(() => {
            builder.build();
        }, (e) => e.message === testData.MISSING_INDEX_ERROR);
    });
    it(`should throw error when trying to build unvote operation with missing 'group' `, () => {
        builder.type(sdk_core_1.StakingOperationTypes.UNVOTE);
        builder.lesser(testData.LESSER_ADDRESS);
        builder.greater(testData.GREATER_ADDRESS);
        builder.amount('1');
        builder.index(1);
        assert_1.default.throws(() => {
            builder.build();
        }, (e) => e.message === testData.MISSING_GROUP_ERROR);
    });
    it(`should throw error when trying to build unvote operation with missing 'amount' `, () => {
        builder = new stakingBuilder_1.StakingBuilder(coin);
        builder.type(sdk_core_1.StakingOperationTypes.UNVOTE);
        builder.lesser(testData.LESSER_ADDRESS);
        builder.group(testData.GROUP_ADDRESS);
        builder.greater(testData.GREATER_ADDRESS);
        builder.index(1);
        assert_1.default.throws(() => {
            builder.build();
        }, (e) => e.message === testData.MISSING_AMOUNT_ERROR);
    });
    it('should fail if the address to unvote for is not set', () => {
        builder.type(sdk_core_1.StakingOperationTypes.UNVOTE);
        assert_1.default.throws(() => {
            builder.build();
        }, (e) => e.message === testData.MISSING_GROUP_ERROR);
    });
    it('should fail if the lesser or greater unvote are not set', () => {
        builder.type(sdk_core_1.StakingOperationTypes.UNVOTE);
        builder.group(testData.GROUP_ADDRESS);
        assert_1.default.throws(() => {
            builder.build();
        }, (e) => e.message === testData.GREATER_LESSER_ERROR);
    });
    it('should fail if the group to unvote address is invalid', () => {
        builder.type(sdk_core_1.StakingOperationTypes.UNVOTE);
        assert_1.default.throws(() => {
            builder.group('invalidaddress');
        }, (e) => e.message === testData.INVALID_GROUP_ERROR);
    });
    it('should fail if the lesser unvote address is invalid', () => {
        builder.type(sdk_core_1.StakingOperationTypes.UNVOTE);
        assert_1.default.throws(() => {
            builder.lesser('invalidaddress');
        }, (e) => e.message === testData.INVALID_LESSER_ERROR);
    });
    it('should fail if the greater unvote address is invalid', () => {
        builder.type(sdk_core_1.StakingOperationTypes.UNVOTE);
        assert_1.default.throws(() => {
            builder.greater('invalidaddress');
        }, (e) => e.message === testData.INVALID_GREATER_ERROR);
    });
    it('should build a staking activate operation', () => {
        builder.type(sdk_core_1.StakingOperationTypes.ACTIVATE);
        builder.group(testData.GROUP_ADDRESS);
        const staking = builder.build();
        should_1.default.equal(staking.address, activateOperation.contractAddress);
        should_1.default.equal(staking.serialize(), testData.ACTIVATE_SERIALIZED_DATA);
    });
    it('should fail if the activate address is not set', () => {
        builder.type(sdk_core_1.StakingOperationTypes.ACTIVATE);
        assert_1.default.throws(() => {
            builder.build();
        }, (e) => e.message === testData.MISSING_GROUP_ERROR);
    });
    it('should fail if the address to vote for is not set', () => {
        builder.type(sdk_core_1.StakingOperationTypes.VOTE);
        assert_1.default.throws(() => {
            builder.build();
        }, (e) => e.message === testData.MISSING_GROUP_ERROR);
    });
    it('should fail if the lesser or greater are not set', () => {
        builder.type(sdk_core_1.StakingOperationTypes.VOTE);
        builder.group(testData.GROUP_ADDRESS);
        assert_1.default.throws(() => {
            builder.build();
        }, (e) => e.message === testData.GREATER_LESSER_ERROR);
    });
    it('should fail if the group to vote address is invalid', () => {
        builder.type(sdk_core_1.StakingOperationTypes.VOTE);
        assert_1.default.throws(() => {
            builder.group('invalidaddress');
        }, (e) => e.message === testData.INVALID_GROUP_ERROR);
    });
    it('should fail if the lesser address is invalid', () => {
        builder.type(sdk_core_1.StakingOperationTypes.VOTE);
        assert_1.default.throws(() => {
            builder.lesser('invalidaddress');
        }, (e) => e.message === testData.INVALID_LESSER_ERROR);
    });
    it('should fail if the greater address is invalid', () => {
        builder.type(sdk_core_1.StakingOperationTypes.VOTE);
        assert_1.default.throws(() => {
            builder.greater('invalidaddress');
        }, (e) => e.message === testData.INVALID_GREATER_ERROR);
    });
    it('should fail if amount is invalid number', () => {
        assert_1.default.throws(() => {
            builder.amount('asd');
        }, (e) => e.message === testData.INVALID_VALUE_ERROR);
    });
    it('should fail to build if type is not supported', function () {
        const NOT_SUPPORTED = 100;
        builder.type(NOT_SUPPORTED);
        assert_1.default.throws(() => {
            builder.build();
        }, (e) => e.message === testData.INVALID_OPERATION_100);
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Rha2luZ0J1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvc3Rha2luZ0J1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsb0RBQTRCO0FBQzVCLDRDQUF1QztBQUN2QyxpRUFBOEQ7QUFDOUQsOENBQTRFO0FBQzVFLDREQUE4QztBQUU5QyxRQUFRLENBQUMsaUNBQWlDLEVBQUU7SUFDMUMsTUFBTSxJQUFJLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoQyxJQUFJLE9BQXVCLENBQUM7SUFDNUIsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLE9BQU8sR0FBRyxJQUFJLCtCQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQ0FBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pCLENBQUMsQ0FBQyxDQUFDO0lBRUgsTUFBTSxhQUFhLEdBQUcsSUFBQSw2QkFBa0IsRUFBQyxnQ0FBcUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4RixNQUFNLGVBQWUsR0FBRyxJQUFBLDZCQUFrQixFQUFDLGdDQUFxQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVGLE1BQU0saUJBQWlCLEdBQUcsSUFBQSw2QkFBa0IsRUFBQyxnQ0FBcUIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoRyxNQUFNLGFBQWEsR0FBRyxJQUFBLDZCQUFrQixFQUFDLGdDQUFxQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxD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RUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssUUFBUSxDQUFDLHFCQUFxQixDQUN6RCxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgU3Rha2luZ0J1aWxkZXIgfSBmcm9tICcuLi8uLi9zcmMvbGliL3N0YWtpbmdCdWlsZGVyJztcbmltcG9ydCB7IGdldE9wZXJhdGlvbkNvbmZpZywgU3Rha2luZ09wZXJhdGlvblR5cGVzIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uL3Jlc291cmNlcy9jZWxvJztcblxuZGVzY3JpYmUoJ0NlbG8gc3Rha2luZyBvcGVyYXRpb25zIGJ1aWxkZXInLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGNvaW4gPSBjb2lucy5nZXQoJ3RjZWxvJyk7XG4gIGxldCBidWlsZGVyOiBTdGFraW5nQnVpbGRlcjtcbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgYnVpbGRlciA9IG5ldyBTdGFraW5nQnVpbGRlcihjb2luKTtcbiAgICBidWlsZGVyLnR5cGUoU3Rha2luZ09wZXJhdGlvblR5cGVzLkxPQ0spO1xuICAgIGJ1aWxkZXIuYW1vdW50KCcxMDAwJyk7XG4gIH0pO1xuXG4gIGNvbnN0IGxvY2tPcGVyYXRpb24gPSBnZXRPcGVyYXRpb25Db25maWcoU3Rha2luZ09wZXJhdGlvblR5cGVzLkxPQ0ssIGNvaW4ubmV0d29yay50eXBlKTtcbiAgY29uc3QgdW5sb2NrT3BlcmF0aW9uID0gZ2V0T3BlcmF0aW9uQ29uZmlnKFN0YWtpbmdPcGVyYXRpb25UeXBlcy5VTkxPQ0ssIGNvaW4ubmV0d29yay50eXBlKTtcbiAgY29uc3Qgd2l0aGRyYXdPcGVyYXRpb24gPSBnZXRPcGVyYXRpb25Db25maWcoU3Rha2luZ09wZXJhdGlvblR5cGVzLldJVEhEUkFXLCBjb2luLm5ldHdvcmsudHlwZSk7XG4gIGNvbnN0IHZvdGVPcGVyYXRpb24gPSBnZXRPcGVyYXRpb25Db25maWcoU3Rha2luZ09wZXJhdGlvblR5cGVzLlZPVEUsIGNvaW4ubmV0d29yay50eXBlKTtcbiAgY29uc3QgdW52b3RlT3BlcmF0aW9uID0gZ2V0T3BlcmF0aW9uQ29uZmlnKFN0YWtpbmdPcGVyYXRpb25UeXBlcy5VTlZPVEUsIGNvaW4ubmV0d29yay50eXBlKTtcbiAgY29uc3QgYWN0aXZhdGVPcGVyYXRpb24gPSBnZXRPcGVyYXRpb25Db25maWcoU3Rha2luZ09wZXJhdGlvblR5cGVzLkFDVElWQVRFLCBjb2luLm5ldHdvcmsudHlwZSk7XG5cbiAgaXQoJ3Nob3VsZCBidWlsZCBhIHN0YWtpbmcgbG9jayBvcGVyYXRpb24nLCAoKSA9PiB7XG4gICAgY29uc3Qgc3Rha2luZyA9IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICBzaG91bGQuZXF1YWwoc3Rha2luZy5hZGRyZXNzLCBsb2NrT3BlcmF0aW9uLmNvbnRyYWN0QWRkcmVzcyk7XG4gICAgc2hvdWxkLmVxdWFsKHN0YWtpbmcuc2VyaWFsaXplKCksIGxvY2tPcGVyYXRpb24ubWV0aG9kSWQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGJ1aWxkIGEgc3Rha2luZyB1bmxvY2sgb3BlcmF0aW9uJywgKCkgPT4ge1xuICAgIGJ1aWxkZXIudHlwZShTdGFraW5nT3BlcmF0aW9uVHlwZXMuVU5MT0NLKTtcbiAgICBidWlsZGVyLmFtb3VudCgnMTAwJyk7XG4gICAgY29uc3Qgc3Rha2luZyA9IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICBzaG91bGQuZXF1YWwoc3Rha2luZy5hZGRyZXNzLCB1bmxvY2tPcGVyYXRpb24uY29udHJhY3RBZGRyZXNzKTtcbiAgICBzdGFraW5nLnNlcmlhbGl6ZSgpLnNob3VsZC5zdGFydFdpdGgodW5sb2NrT3BlcmF0aW9uLm1ldGhvZElkKTtcbiAgICBzaG91bGQuZXF1YWwoc3Rha2luZy5zZXJpYWxpemUoKSwgdGVzdERhdGEuVU5MT0NLX0RBVEEpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGJ1aWxkIGEgc3Rha2luZyB3aXRoZHJhdyBvcGVyYXRpb24nLCAoKSA9PiB7XG4gICAgYnVpbGRlci50eXBlKFN0YWtpbmdPcGVyYXRpb25UeXBlcy5XSVRIRFJBVyk7XG4gICAgYnVpbGRlci5pbmRleCgwKTtcbiAgICBjb25zdCBzdGFraW5nID0gYnVpbGRlci5idWlsZCgpO1xuICAgIHNob3VsZC5lcXVhbChzdGFraW5nLmFkZHJlc3MsIHdpdGhkcmF3T3BlcmF0aW9uLmNvbnRyYWN0QWRkcmVzcyk7XG4gICAgc3Rha2luZy5zZXJpYWxpemUoKS5zaG91bGQuc3RhcnRXaXRoKHdpdGhkcmF3T3BlcmF0aW9uLm1ldGhvZElkKTtcbiAgICBzaG91bGQuZXF1YWwoc3Rha2luZy5zZXJpYWxpemUoKSwgdGVzdERhdGEuV0lUSERSQVdfREFUQSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZmFpbCBpZiB0aGUgaW5kZXggaXMgaW52YWxpZCcsICgpID0+IHtcbiAgICBidWlsZGVyLnR5cGUoU3Rha2luZ09wZXJhdGlvblR5cGVzLldJVEhEUkFXKTtcbiAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmluZGV4KC0xKTtcbiAgICAgIH0sXG4gICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09IHRlc3REYXRhLklOVkFMSURfSU5ERVhfRVJST1JcbiAgICApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGJ1aWxkIGEgc3Rha2luZyB2b3RlIG9wZXJhdGlvbicsICgpID0+IHtcbiAgICBidWlsZGVyLnR5cGUoU3Rha2luZ09wZXJhdGlvblR5cGVzLlZPVEUpO1xuICAgIGJ1aWxkZXIuZ3JvdXAodGVzdERhdGEuR1JPVVBfQUREUkVTUyk7XG4gICAgYnVpbGRlci5sZXNzZXIodGVzdERhdGEuTEVTU0VSX0FERFJFU1MpO1xuICAgIGJ1aWxkZXIuZ3JlYXRlcih0ZXN0RGF0YS5HUkVBVEVSX0FERFJFU1MpO1xuICAgIGNvbnN0IHN0YWtpbmcgPSBidWlsZGVyLmJ1aWxkKCk7XG4gICAgc2hvdWxkLmVxdWFsKHN0YWtpbmcuYWRkcmVzcywgdm90ZU9wZXJhdGlvbi5jb250cmFjdEFkZHJlc3MpO1xuICAgIHNob3VsZC5lcXVhbChzdGFraW5nLnNlcmlhbGl6ZSgpLCB0ZXN0RGF0YS5WT1RFX1NFUklBTElaRURfREFUQSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYnVpbGQgb25seSBzZXR0aW5nIHRoZSBsZXNzZXInLCAoKSA9PiB7XG4gICAgYnVpbGRlci50eXBlKFN0YWtpbmdPcGVyYXRpb25UeXBlcy5WT1RFKTtcbiAgICBidWlsZGVyLmdyb3VwKHRlc3REYXRhLkdST1VQX0FERFJFU1MpO1xuICAgIGJ1aWxkZXIubGVzc2VyKHRlc3REYXRhLkxFU1NFUl9BRERSRVNTKTtcbiAgICBjb25zdCBzdGFraW5nID0gYnVpbGRlci5idWlsZCgpO1xuICAgIHNob3VsZC5lcXVhbChzdGFraW5nLmFkZHJlc3MsIHZvdGVPcGVyYXRpb24uY29udHJhY3RBZGRyZXNzKTtcbiAgICBzaG91bGQuZXF1YWwoc3Rha2luZy5zZXJpYWxpemUoKSwgdGVzdERhdGEuVk9URV9MRVNTRVJfU0VSSUFMSVpFRF9EQVRBKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBidWlsZCBvbmx5IHNldHRpbmcgdGhlIGdyZWF0ZXInLCAoKSA9PiB7XG4gICAgYnVpbGRlci50eXBlKFN0YWtpbmdPcGVyYXRpb25UeXBlcy5WT1RFKTtcbiAgICBidWlsZGVyLmdyb3VwKHRlc3REYXRhLkdST1VQX0FERFJFU1MpO1xuICAgIGJ1aWxkZXIuZ3JlYXRlcih0ZXN0RGF0YS5HUkVBVEVSX0FERFJFU1MpO1xuICAgIGNvbnN0IHN0YWtpbmcgPSBidWlsZGVyLmJ1aWxkKCk7XG4gICAgc2hvdWxkLmVxdWFsKHN0YWtpbmcuYWRkcmVzcywgdm90ZU9wZXJhdGlvbi5jb250cmFjdEFkZHJlc3MpO1xuICAgIHNob3VsZC5lcXVhbChzdGFraW5nLnNlcmlhbGl6ZSgpLCB0ZXN0RGF0YS5WT1RFX0dSRUFURVJfU0VSSUFMSVpFRF9EQVRBKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBidWlsZCBhIHN0YWtpbmcgdW52b3RlIG9wZXJhdGlvbicsICgpID0+IHtcbiAgICBidWlsZGVyLnR5cGUoU3Rha2luZ09wZXJhdGlvblR5cGVzLlVOVk9URSk7XG4gICAgYnVpbGRlci5ncm91cCh0ZXN0RGF0YS5HUk9VUF9BRERSRVNTKTtcbiAgICBidWlsZGVyLmxlc3Nlcih0ZXN0RGF0YS5MRVNTRVJfQUREUkVTUyk7XG4gICAgYnVpbGRlci5ncmVhdGVyKHRlc3REYXRhLkdSRUFURVJfQUREUkVTUyk7XG4gICAgYnVpbGRlci5hbW91bnQoJzEnKTtcbiAgICBidWlsZGVyLmluZGV4KDApO1xuICAgIGNvbnN0IHN0YWtpbmcgPSBidWlsZGVyLmJ1aWxkKCk7XG4gICAgc2hvdWxkLmVxdWFsKHN0YWtpbmcuYWRkcmVzcywgdW52b3RlT3BlcmF0aW9uLmNvbnRyYWN0QWRkcmVzcyk7XG4gICAgc2hvdWxkLmVxdWFsKHN0YWtpbmcuc2VyaWFsaXplKCksIHRlc3REYXRhLlVOVk9URV9TRVJJQUxJWkVEX0RBVEEpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGZhaWwgaWYgdGhlIHVudm90ZSBpbmRleCBpcyBpbnZhbGlkJywgKCkgPT4ge1xuICAgIGJ1aWxkZXIudHlwZShTdGFraW5nT3BlcmF0aW9uVHlwZXMuVU5WT1RFKTtcbiAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmluZGV4KC0xKTtcbiAgICAgIH0sXG4gICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09IHRlc3REYXRhLklOVkFMSURfSU5ERVhfRVJST1JcbiAgICApO1xuICB9KTtcblxuICBpdChgc2hvdWxkIHRocm93IGVycm9yIHdoZW4gdHJ5aW5nIHRvIGJ1aWxkIHVudm90ZSBvcGVyYXRpb24gd2l0aCBtaXNzaW5nICdpbmRleCcgYCwgKCkgPT4ge1xuICAgIGJ1aWxkZXIudHlwZShTdGFraW5nT3BlcmF0aW9uVHlwZXMuVU5WT1RFKTtcbiAgICBidWlsZGVyLmdyb3VwKHRlc3REYXRhLkdST1VQX0FERFJFU1MpO1xuICAgIGJ1aWxkZXIubGVzc2VyKHRlc3REYXRhLkxFU1NFUl9BRERSRVNTKTtcbiAgICBidWlsZGVyLmdyZWF0ZXIodGVzdERhdGEuR1JFQVRFUl9BRERSRVNTKTtcbiAgICBidWlsZGVyLmFtb3VudCgnMScpO1xuICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIH0sXG4gICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09IHRlc3REYXRhLk1JU1NJTkdfSU5ERVhfRVJST1JcbiAgICApO1xuICB9KTtcblxuICBpdChgc2hvdWxkIHRocm93IGVycm9yIHdoZW4gdHJ5aW5nIHRvIGJ1aWxkIHVudm90ZSBvcGVyYXRpb24gd2l0aCBtaXNzaW5nICdncm91cCcgYCwgKCkgPT4ge1xuICAgIGJ1aWxkZXIudHlwZShTdGFraW5nT3BlcmF0aW9uVHlwZXMuVU5WT1RFKTtcbiAgICBidWlsZGVyLmxlc3Nlcih0ZXN0RGF0YS5MRVNTRVJfQUREUkVTUyk7XG4gICAgYnVpbGRlci5ncmVhdGVyKHRlc3REYXRhLkdSRUFURVJfQUREUkVTUyk7XG4gICAgYnVpbGRlci5hbW91bnQoJzEnKTtcbiAgICBidWlsZGVyLmluZGV4KDEpO1xuICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIH0sXG4gICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09IHRlc3REYXRhLk1JU1NJTkdfR1JPVVBfRVJST1JcbiAgICApO1xuICB9KTtcblxuICBpdChgc2hvdWxkIHRocm93IGVycm9yIHdoZW4gdHJ5aW5nIHRvIGJ1aWxkIHVudm90ZSBvcGVyYXRpb24gd2l0aCBtaXNzaW5nICdhbW91bnQnIGAsICgpID0+IHtcbiAgICBidWlsZGVyID0gbmV3IFN0YWtpbmdCdWlsZGVyKGNvaW4pO1xuICAgIGJ1aWxkZXIudHlwZShTdGFraW5nT3BlcmF0aW9uVHlwZXMuVU5WT1RFKTtcbiAgICBidWlsZGVyLmxlc3Nlcih0ZXN0RGF0YS5MRVNTRVJfQUREUkVTUyk7XG4gICAgYnVpbGRlci5ncm91cCh0ZXN0RGF0YS5HUk9VUF9BRERSRVNTKTtcbiAgICBidWlsZGVyLmdyZWF0ZXIodGVzdERhdGEuR1JFQVRFUl9BRERSRVNTKTtcbiAgICBidWlsZGVyLmluZGV4KDEpO1xuICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIH0sXG4gICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09IHRlc3REYXRhLk1JU1NJTkdfQU1PVU5UX0VSUk9SXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBmYWlsIGlmIHRoZSBhZGRyZXNzIHRvIHVudm90ZSBmb3IgaXMgbm90IHNldCcsICgpID0+IHtcbiAgICBidWlsZGVyLnR5cGUoU3Rha2luZ09wZXJhdGlvblR5cGVzLlVOVk9URSk7XG4gICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICgpID0+IHtcbiAgICAgICAgYnVpbGRlci5idWlsZCgpO1xuICAgICAgfSxcbiAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gdGVzdERhdGEuTUlTU0lOR19HUk9VUF9FUlJPUlxuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZmFpbCBpZiB0aGUgbGVzc2VyIG9yIGdyZWF0ZXIgdW52b3RlIGFyZSBub3Qgc2V0JywgKCkgPT4ge1xuICAgIGJ1aWxkZXIudHlwZShTdGFraW5nT3BlcmF0aW9uVHlwZXMuVU5WT1RFKTtcbiAgICBidWlsZGVyLmdyb3VwKHRlc3REYXRhLkdST1VQX0FERFJFU1MpO1xuICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIH0sXG4gICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09IHRlc3REYXRhLkdSRUFURVJfTEVTU0VSX0VSUk9SXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBmYWlsIGlmIHRoZSBncm91cCB0byB1bnZvdGUgYWRkcmVzcyBpcyBpbnZhbGlkJywgKCkgPT4ge1xuICAgIGJ1aWxkZXIudHlwZShTdGFraW5nT3BlcmF0aW9uVHlwZXMuVU5WT1RFKTtcbiAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmdyb3VwKCdpbnZhbGlkYWRkcmVzcycpO1xuICAgICAgfSxcbiAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gdGVzdERhdGEuSU5WQUxJRF9HUk9VUF9FUlJPUlxuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZmFpbCBpZiB0aGUgbGVzc2VyIHVudm90ZSBhZGRyZXNzIGlzIGludmFsaWQnLCAoKSA9PiB7XG4gICAgYnVpbGRlci50eXBlKFN0YWtpbmdPcGVyYXRpb25UeXBlcy5VTlZPVEUpO1xuICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIubGVzc2VyKCdpbnZhbGlkYWRkcmVzcycpO1xuICAgICAgfSxcbiAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gdGVzdERhdGEuSU5WQUxJRF9MRVNTRVJfRVJST1JcbiAgICApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGZhaWwgaWYgdGhlIGdyZWF0ZXIgdW52b3RlIGFkZHJlc3MgaXMgaW52YWxpZCcsICgpID0+IHtcbiAgICBidWlsZGVyLnR5cGUoU3Rha2luZ09wZXJhdGlvblR5cGVzLlVOVk9URSk7XG4gICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICgpID0+IHtcbiAgICAgICAgYnVpbGRlci5ncmVhdGVyKCdpbnZhbGlkYWRkcmVzcycpO1xuICAgICAgfSxcbiAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gdGVzdERhdGEuSU5WQUxJRF9HUkVBVEVSX0VSUk9SXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBidWlsZCBhIHN0YWtpbmcgYWN0aXZhdGUgb3BlcmF0aW9uJywgKCkgPT4ge1xuICAgIGJ1aWxkZXIudHlwZShTdGFraW5nT3BlcmF0aW9uVHlwZXMuQUNUSVZBVEUpO1xuICAgIGJ1aWxkZXIuZ3JvdXAodGVzdERhdGEuR1JPVVBfQUREUkVTUyk7XG4gICAgY29uc3Qgc3Rha2luZyA9IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICBzaG91bGQuZXF1YWwoc3Rha2luZy5hZGRyZXNzLCBhY3RpdmF0ZU9wZXJhdGlvbi5jb250cmFjdEFkZHJlc3MpO1xuICAgIHNob3VsZC5lcXVhbChzdGFraW5nLnNlcmlhbGl6ZSgpLCB0ZXN0RGF0YS5BQ1RJVkFURV9TRVJJQUxJWkVEX0RBVEEpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGZhaWwgaWYgdGhlIGFjdGl2YXRlIGFkZHJlc3MgaXMgbm90IHNldCcsICgpID0+IHtcbiAgICBidWlsZGVyLnR5cGUoU3Rha2luZ09wZXJhdGlvblR5cGVzLkFDVElWQVRFKTtcbiAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICB9LFxuICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSB0ZXN0RGF0YS5NSVNTSU5HX0dST1VQX0VSUk9SXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBmYWlsIGlmIHRoZSBhZGRyZXNzIHRvIHZvdGUgZm9yIGlzIG5vdCBzZXQnLCAoKSA9PiB7XG4gICAgYnVpbGRlci50eXBlKFN0YWtpbmdPcGVyYXRpb25UeXBlcy5WT1RFKTtcbiAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICB9LFxuICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSB0ZXN0RGF0YS5NSVNTSU5HX0dST1VQX0VSUk9SXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBmYWlsIGlmIHRoZSBsZXNzZXIgb3IgZ3JlYXRlciBhcmUgbm90IHNldCcsICgpID0+IHtcbiAgICBidWlsZGVyLnR5cGUoU3Rha2luZ09wZXJhdGlvblR5cGVzLlZPVEUpO1xuICAgIGJ1aWxkZXIuZ3JvdXAodGVzdERhdGEuR1JPVVBfQUREUkVTUyk7XG4gICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICgpID0+IHtcbiAgICAgICAgYnVpbGRlci5idWlsZCgpO1xuICAgICAgfSxcbiAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gdGVzdERhdGEuR1JFQVRFUl9MRVNTRVJfRVJST1JcbiAgICApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGZhaWwgaWYgdGhlIGdyb3VwIHRvIHZvdGUgYWRkcmVzcyBpcyBpbnZhbGlkJywgKCkgPT4ge1xuICAgIGJ1aWxkZXIudHlwZShTdGFraW5nT3BlcmF0aW9uVHlwZXMuVk9URSk7XG4gICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICgpID0+IHtcbiAgICAgICAgYnVpbGRlci5ncm91cCgnaW52YWxpZGFkZHJlc3MnKTtcbiAgICAgIH0sXG4gICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09IHRlc3REYXRhLklOVkFMSURfR1JPVVBfRVJST1JcbiAgICApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGZhaWwgaWYgdGhlIGxlc3NlciBhZGRyZXNzIGlzIGludmFsaWQnLCAoKSA9PiB7XG4gICAgYnVpbGRlci50eXBlKFN0YWtpbmdPcGVyYXRpb25UeXBlcy5WT1RFKTtcbiAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmxlc3NlcignaW52YWxpZGFkZHJlc3MnKTtcbiAgICAgIH0sXG4gICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09IHRlc3REYXRhLklOVkFMSURfTEVTU0VSX0VSUk9SXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBmYWlsIGlmIHRoZSBncmVhdGVyIGFkZHJlc3MgaXMgaW52YWxpZCcsICgpID0+IHtcbiAgICBidWlsZGVyLnR5cGUoU3Rha2luZ09wZXJhdGlvblR5cGVzLlZPVEUpO1xuICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuZ3JlYXRlcignaW52YWxpZGFkZHJlc3MnKTtcbiAgICAgIH0sXG4gICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09IHRlc3REYXRhLklOVkFMSURfR1JFQVRFUl9FUlJPUlxuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZmFpbCBpZiBhbW91bnQgaXMgaW52YWxpZCBudW1iZXInLCAoKSA9PiB7XG4gICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICgpID0+IHtcbiAgICAgICAgYnVpbGRlci5hbW91bnQoJ2FzZCcpO1xuICAgICAgfSxcbiAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gdGVzdERhdGEuSU5WQUxJRF9WQUxVRV9FUlJPUlxuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZmFpbCB0byBidWlsZCBpZiB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgTk9UX1NVUFBPUlRFRCA9IDEwMDtcbiAgICBidWlsZGVyLnR5cGUoTk9UX1NVUFBPUlRFRCBhcyBTdGFraW5nT3BlcmF0aW9uVHlwZXMpO1xuICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIH0sXG4gICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09IHRlc3REYXRhLklOVkFMSURfT1BFUkFUSU9OXzEwMFxuICAgICk7XG4gIH0pO1xufSk7XG4iXX0=

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


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