PHP WebShell
Текущая директория: /opt/BitGoJS/modules/bitgo/dist/test/v2/unit/staking
Просмотр файла: goStakingWalletCommon.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const nock = require("nock");
const should = require("should");
const goStakingWallet_1 = require("../../fixtures/staking/goStakingWallet");
const sdk_core_1 = require("@bitgo/sdk-core");
const sdk_test_1 = require("@bitgo/sdk-test");
const src_1 = require("../../../../src");
const sinon = require("sinon");
const coins_1 = require("../../../../src/v2/coins");
const statics_1 = require("@bitgo/statics");
describe('Go Staking Wallet Common', function () {
const microservicesUri = sdk_core_1.Environments['mock'].uri;
let bitgo;
let baseCoin;
let enterprise;
let stakingWallet;
const coin = 'tsol';
const ofcCoin = `ofc${coin}`;
before(async function () {
bitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock', microservicesUri });
bitgo.initializeTestVars();
baseCoin = bitgo.coin(ofcCoin);
baseCoin.keychains();
const ofcToken = statics_1.tokens.testnet.ofc.tokens.filter((token) => token.type === `ofc${coin}`)[0];
const tokenConstructor = coins_1.OfcToken.createTokenConstructor(ofcToken);
bitgo.register(ofcToken.type, tokenConstructor);
enterprise = new sdk_core_1.Enterprise(bitgo, baseCoin, { id: '5cf940949449412d00f53b3d92dbcaa3', name: 'Test Enterprise' });
const walletData = {
id: 'walletId',
coin: ofcCoin,
enterprise: enterprise.id,
keys: ['5b3424f91bf349930e340175', '5b3424f91bf349930e340174', '5b3424f91bf349930e340173'],
};
const wallet = new sdk_core_1.Wallet(bitgo, baseCoin, walletData);
stakingWallet = wallet.toGoStakingWallet();
nock(microservicesUri)
.get(`/api/v2/${ofcCoin}/key/${stakingWallet.wallet.keyIds()[0]}`)
.reply(200, {
id: stakingWallet.wallet.keyIds()[0],
pub: 'xpub661MyMwAqRbcFq65dvGMeEVb81KKDRRkWkawSVesWcyevGc5gr8V27LjNfkktaMuKtM362jhgKy2eu35RdArcmmEAoULzAvgKkJpWQPvLXM',
source: 'user',
encryptedPrv: bitgo.encrypt({
input: 'xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76',
password: 'passphrase',
}),
coinSpecific: {},
});
nock(microservicesUri)
.get(`/api/v2/${ofcCoin}/key/${stakingWallet.wallet.keyIds()[1]}`)
.reply(200, {
id: stakingWallet.wallet.keyIds()[1],
pub: 'xpub661MyMwAqRbcFq65dvGMeEVb81KKDRRkWkawSVesWcyevGc5gr8V27LjNfkktaMuKtM362jhgKy2eu35RdArcmmEAoULzAvgKkJpWQPvLXM',
source: 'user',
encryptedPrv: bitgo.encrypt({
input: 'xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76',
password: 'passphrase',
}),
coinSpecific: {},
});
nock(microservicesUri)
.get(`/api/v2/${ofcCoin}/key/${stakingWallet.wallet.keyIds()[2]}`)
.reply(200, {
id: stakingWallet.wallet.keyIds()[2],
pub: 'xpub661MyMwAqRbcFq65dvGMeEVb81KKDRRkWkawSVesWcyevGc5gr8V27LjNfkktaMuKtM362jhgKy2eu35RdArcmmEAoULzAvgKkJpWQPvLXM',
source: 'user',
encryptedPrv: bitgo.encrypt({
input: 'xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76',
password: 'passphrase',
}),
coinSpecific: {},
});
});
const sandbox = sinon.createSandbox();
afterEach(function () {
sandbox.verifyAndRestore();
});
describe('stake', function () {
it('should call go-staking-service to stake', async function () {
const preview = goStakingWallet_1.default.previewGoStakingRequest(coin);
const msScope1 = nock(microservicesUri)
.post(`/api/go-staking/v1/${ofcCoin}/accounts/${stakingWallet.accountId}/requests/preview`, {
amount: '1',
clientId: 'clientId',
type: 'STAKE',
})
.reply(201, preview);
const expected = goStakingWallet_1.default.finalizeGoStakingRequest(coin, 'STAKE');
const msScope2 = nock(microservicesUri)
.post(`/api/go-staking/v1/${ofcCoin}/accounts/${stakingWallet.accountId}/requests/finalize`, {
amount: '1',
clientId: 'clientId',
frontTransferSendRequest: {
halfSigned: {
payload: preview.payload,
},
},
type: 'STAKE',
})
.reply(201, expected);
const stakingRequest = await stakingWallet.stake({
amount: '1',
clientId: 'clientId',
walletPassphrase: 'passphrase',
});
should.exist(stakingRequest);
stakingRequest.should.deepEqual(expected);
msScope1.isDone().should.be.True();
msScope2.isDone().should.be.True();
});
});
describe('unstake', function () {
it('should call go-staking-service to unstake', async function () {
const expected = goStakingWallet_1.default.finalizeGoStakingRequest(coin, 'UNSTAKE');
const msScope = nock(microservicesUri)
.post(`/api/go-staking/v1/${ofcCoin}/accounts/${stakingWallet.accountId}/requests/finalize`, {
amount: '1',
clientId: 'clientId',
type: 'UNSTAKE',
})
.reply(201, expected);
const stakingRequest = await stakingWallet.unstake({
amount: '1',
clientId: 'clientId',
});
should.exist(stakingRequest);
stakingRequest.should.deepEqual(expected);
msScope.isDone().should.be.True();
});
});
describe('getGoStakingRequest', function () {
it('should call gostaking-service to get go staking request', async function () {
const stakingRequestId = '8638284a-dab2-46b9-b07f-21109a6e7220';
const expected = goStakingWallet_1.default.finalizeGoStakingRequest(coin, 'STAKE');
const msScope = nock(microservicesUri)
.get(`/api/go-staking/v1/${ofcCoin}/accounts/${stakingWallet.accountId}/requests/${stakingRequestId}`)
.reply(200, expected);
const stakingRequest = await stakingWallet.getGoStakingRequest(stakingRequestId);
should.exist(stakingRequest);
stakingRequest.should.deepEqual(expected);
msScope.isDone().should.be.True();
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29TdGFraW5nV2FsbGV0Q29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC92Mi91bml0L3N0YWtpbmcvZ29TdGFraW5nV2FsbGV0Q29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkJBQTZCO0FBQzdCLGlDQUFpQztBQUNqQyw0RUFBOEQ7QUFFOUQsOENBQW9GO0FBQ3BGLDhDQUE0QztBQUM1Qyx5Q0FBd0M7QUFDeEMsK0JBQStCO0FBQy9CLG9EQUFvRDtBQUNwRCw0Q0FBd0M7QUFFeEMsUUFBUSxDQUFDLDBCQUEwQixFQUFFO0lBQ25DLE1BQU0sZ0JBQWdCLEdBQUcsdUJBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDbEQsSUFBSSxLQUFLLENBQUM7SUFDVixJQUFJLFFBQVEsQ0FBQztJQUNiLElBQUksVUFBVSxDQUFDO0lBQ2YsSUFBSSxhQUE4QixDQUFDO0lBQ25DLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQztJQUNwQixNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBRTdCLE1BQU0sQ0FBQyxLQUFLO1FBQ1YsS0FBSyxHQUFHLG9CQUFTLENBQUMsUUFBUSxDQUFDLFdBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQVMsQ0FBQyxDQUFDO1FBQzVFLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzNCLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9CLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNyQixNQUFNLFFBQVEsR0FBRyxnQkFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFD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QyxDQUFDO1lBQ2hFLE1BQU0sUUFBUSxHQUFHLHlCQUFRLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2xFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDbkMsR0FBRyxDQUFDLHNCQUFzQixPQUFPLGFBQWEsYUFBYSxDQUFDLFNBQVMsYUFBYSxnQkFBZ0IsRUFBRSxDQUFDO2lCQUNyRyxLQUFLLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBRXhCLE1BQU0sY0FBYyxHQUFHLE1BQU0sYUFBYSxDQUFDLG1CQUFtQixDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFFakYsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUU3QixjQUFjLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMxQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBub2NrIGZyb20gJ25vY2snO1xuaW1wb3J0ICogYXMgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgZml4dHVyZXMgZnJvbSAnLi4vLi4vZml4dHVyZXMvc3Rha2luZy9nb1N0YWtpbmdXYWxsZXQnO1xuXG5pbXBvcnQgeyBFbnRlcnByaXNlLCBFbnZpcm9ubWVudHMsIEdvU3Rha2luZ1dhbGxldCwgV2FsbGV0IH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IFRlc3RCaXRHbyB9IGZyb20gJ0BiaXRnby9zZGstdGVzdCc7XG5pbXBvcnQgeyBCaXRHbyB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgKiBhcyBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgeyBPZmNUb2tlbiB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy92Mi9jb2lucyc7XG5pbXBvcnQgeyB0b2tlbnMgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5cbmRlc2NyaWJlKCdHbyBTdGFraW5nIFdhbGxldCBDb21tb24nLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IG1pY3Jvc2VydmljZXNVcmkgPSBFbnZpcm9ubWVudHNbJ21vY2snXS51cmk7XG4gIGxldCBiaXRnbztcbiAgbGV0IGJhc2VDb2luO1xuICBsZXQgZW50ZXJwcmlzZTtcbiAgbGV0IHN0YWtpbmdXYWxsZXQ6IEdvU3Rha2luZ1dhbGxldDtcbiAgY29uc3QgY29pbiA9ICd0c29sJztcbiAgY29uc3Qgb2ZjQ29pbiA9IGBvZmMke2NvaW59YDtcblxuICBiZWZvcmUoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvLCB7IGVudjogJ21vY2snLCBtaWNyb3NlcnZpY2VzVXJpIH0gYXMgYW55KTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICBiYXNlQ29pbiA9IGJpdGdvLmNvaW4ob2ZjQ29pbik7XG4gICAgYmFzZUNvaW4ua2V5Y2hhaW5zKCk7XG4gICAgY29uc3Qgb2ZjVG9rZW4gPSB0b2tlbnMudGVzdG5ldC5vZmMudG9rZW5zLmZpbHRlcigodG9rZW4pID0+IHRva2VuLnR5cGUgPT09IGBvZmMke2NvaW59YClbMF07XG4gICAgY29uc3QgdG9rZW5Db25zdHJ1Y3RvciA9IE9mY1Rva2VuLmNyZWF0ZVRva2VuQ29uc3RydWN0b3Iob2ZjVG9rZW4pO1xuICAgIGJpdGdvLnJlZ2lzdGVyKG9mY1Rva2VuLnR5cGUsIHRva2VuQ29uc3RydWN0b3IpO1xuXG4gICAgZW50ZXJwcmlzZSA9IG5ldyBFbnRlcnByaXNlKGJpdGdvLCBiYXNlQ29pbiwgeyBpZDogJzVjZjk0MDk0OTQ0OTQxMmQwMGY1M2IzZDkyZGJjYWEzJywgbmFtZTogJ1Rlc3QgRW50ZXJwcmlzZScgfSk7XG4gICAgY29uc3Qgd2FsbGV0RGF0YSA9IHtcbiAgICAgIGlkOiAnd2FsbGV0SWQnLFxuICAgICAgY29pbjogb2ZjQ29pbixcbiAgICAgIGVudGVycHJpc2U6IGVudGVycHJpc2UuaWQsXG4gICAgICBrZXlzOiBbJzViMzQyNGY5MWJmMzQ5OTMwZTM0MDE3NScsICc1YjM0MjRmOTFiZjM0OTkzMGUzNDAxNzQnLCAnNWIzNDI0ZjkxYmYzNDk5MzBlMzQwMTczJ10sXG4gICAgfTtcbiAgICBjb25zdCB3YWxsZXQgPSBuZXcgV2FsbGV0KGJpdGdvLCBiYXNlQ29pbiwgd2FsbGV0RGF0YSk7XG4gICAgc3Rha2luZ1dhbGxldCA9IHdhbGxldC50b0dvU3Rha2luZ1dhbGxldCgpO1xuICAgIG5vY2sobWljcm9zZXJ2aWNlc1VyaSlcbiAgICAgIC5nZXQoYC9hcGkvdjIvJHtvZmNDb2lufS9rZXkvJHtzdGFraW5nV2FsbGV0LndhbGxldC5rZXlJZHMoKVswXX1gKVxuICAgICAgLnJlcGx5KDIwMCwge1xuICAgICAgICBpZDogc3Rha2luZ1dhbGxldC53YWxsZXQua2V5SWRzKClbMF0sXG4gICAgICAgIHB1YjogJ3hwdWI2NjFNeU13QXFSYmNGcTY1ZHZHTWVFVmI4MUtLRFJSa1drYXdTVmVzV2N5ZXZHYzVncjhWMjdMak5ma2t0YU11S3RNMzYyamhnS3kyZXUzNVJkQXJjbW1FQW9VTHpBdmdLa0pwV1FQdkxYTScsXG4gICAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAgICBlbmNyeXB0ZWRQcnY6IGJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgIGlucHV0OlxuICAgICAgICAgICAgJ3hwcnZBNDF6N3pvZ1ZWd3hWU2dkS1VIRHkxU0ttZGI1MzNQakR6N0o2TjZtVjZ1UzN6ZTFhaThGSGE4a21IU2NHcFdtajRXZ2dMeVFqZ1BpZTFyRlNydW9VaWhVWlJFUFNMMzlVTmRFM0JCRHU3NicsXG4gICAgICAgICAgcGFzc3dvcmQ6ICdwYXNzcGhyYXNlJyxcbiAgICAgICAgfSksXG4gICAgICAgIGNvaW5TcGVjaWZpYzoge30sXG4gICAgICB9KTtcblxuICAgIG5vY2sobWljcm9zZXJ2aWNlc1VyaSlcbiAgICAgIC5nZXQoYC9hcGkvdjIvJHtvZmNDb2lufS9rZXkvJHtzdGFraW5nV2FsbGV0LndhbGxldC5rZXlJZHMoKVsxXX1gKVxuICAgICAgLnJlcGx5KDIwMCwge1xuICAgICAgICBpZDogc3Rha2luZ1dhbGxldC53YWxsZXQua2V5SWRzKClbMV0sXG4gICAgICAgIHB1YjogJ3hwdWI2NjFNeU13QXFSYmNGcTY1ZHZHTWVFVmI4MUtLRFJSa1drYXdTVmVzV2N5ZXZHYzVncjhWMjdMak5ma2t0YU11S3RNMzYyamhnS3kyZXUzNVJkQXJjbW1FQW9VTHpBdmdLa0pwV1FQdkxYTScsXG4gICAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAgICBlbmNyeXB0ZWRQcnY6IGJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgIGlucHV0OlxuICAgICAgICAgICAgJ3hwcnZBNDF6N3pvZ1ZWd3hWU2dkS1VIRHkxU0ttZGI1MzNQakR6N0o2TjZtVjZ1UzN6ZTFhaThGSGE4a21IU2NHcFdtajRXZ2dMeVFqZ1BpZTFyRlNydW9VaWhVWlJFUFNMMzlVTmRFM0JCRHU3NicsXG4gICAgICAgICAgcGFzc3dvcmQ6ICdwYXNzcGhyYXNlJyxcbiAgICAgICAgfSksXG4gICAgICAgIGNvaW5TcGVjaWZpYzoge30sXG4gICAgICB9KTtcblxuICAgIG5vY2sobWljcm9zZXJ2aWNlc1VyaSlcbiAgICAgIC5nZXQoYC9hcGkvdjIvJHtvZmNDb2lufS9rZXkvJHtzdGFraW5nV2FsbGV0LndhbGxldC5rZXlJZHMoKVsyXX1gKVxuICAgICAgLnJlcGx5KDIwMCwge1xuICAgICAgICBpZDogc3Rha2luZ1dhbGxldC53YWxsZXQua2V5SWRzKClbMl0sXG4gICAgICAgIHB1YjogJ3hwdWI2NjFNeU13QXFSYmNGcTY1ZHZHTWVFVmI4MUtLRFJSa1drYXdTVmVzV2N5ZXZHYzVncjhWMjdMak5ma2t0YU11S3RNMzYyamhnS3kyZXUzNVJkQXJjbW1FQW9VTHpBdmdLa0pwV1FQdkxYTScsXG4gICAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAgICBlbmNyeXB0ZWRQcnY6IGJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgIGlucHV0OlxuICAgICAgICAgICAgJ3hwcnZBNDF6N3pvZ1ZWd3hWU2dkS1VIRHkxU0ttZGI1MzNQakR6N0o2TjZtVjZ1UzN6ZTFhaThGSGE4a21IU2NHcFdtajRXZ2dMeVFqZ1BpZTFyRlNydW9VaWhVWlJFUFNMMzlVTmRFM0JCRHU3NicsXG4gICAgICAgICAgcGFzc3dvcmQ6ICdwYXNzcGhyYXNlJyxcbiAgICAgICAgfSksXG4gICAgICAgIGNvaW5TcGVjaWZpYzoge30sXG4gICAgICB9KTtcbiAgfSk7XG5cbiAgY29uc3Qgc2FuZGJveCA9IHNpbm9uLmNyZWF0ZVNhbmRib3goKTtcblxuICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNhbmRib3gudmVyaWZ5QW5kUmVzdG9yZSgpO1xuICB9KTtcblxuICBkZXNjcmliZSgnc3Rha2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjYWxsIGdvLXN0YWtpbmctc2VydmljZSB0byBzdGFrZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHByZXZpZXcgPSBmaXh0dXJlcy5wcmV2aWV3R29TdGFraW5nUmVxdWVzdChjb2luKTtcbiAgICAgIGNvbnN0IG1zU2NvcGUxID0gbm9jayhtaWNyb3NlcnZpY2VzVXJpKVxuICAgICAgICAucG9zdChgL2FwaS9nby1zdGFraW5nL3YxLyR7b2ZjQ29pbn0vYWNjb3VudHMvJHtzdGFraW5nV2FsbGV0LmFjY291bnRJZH0vcmVxdWVzdHMvcHJldmlld2AsIHtcbiAgICAgICAgICBhbW91bnQ6ICcxJyxcbiAgICAgICAgICBjbGllbnRJZDogJ2NsaWVudElkJyxcbiAgICAgICAgICB0eXBlOiAnU1RBS0UnLFxuICAgICAgICB9KVxuICAgICAgICAucmVwbHkoMjAxLCBwcmV2aWV3KTtcblxuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBmaXh0dXJlcy5maW5hbGl6ZUdvU3Rha2luZ1JlcXVlc3QoY29pbiwgJ1NUQUtFJyk7XG4gICAgICBjb25zdCBtc1Njb3BlMiA9IG5vY2sobWljcm9zZXJ2aWNlc1VyaSlcbiAgICAgICAgLnBvc3QoYC9hcGkvZ28tc3Rha2luZy92MS8ke29mY0NvaW59L2FjY291bnRzLyR7c3Rha2luZ1dhbGxldC5hY2NvdW50SWR9L3JlcXVlc3RzL2ZpbmFsaXplYCwge1xuICAgICAgICAgIGFtb3VudDogJzEnLFxuICAgICAgICAgIGNsaWVudElkOiAnY2xpZW50SWQnLFxuICAgICAgICAgIGZyb250VHJhbnNmZXJTZW5kUmVxdWVzdDoge1xuICAgICAgICAgICAgaGFsZlNpZ25lZDoge1xuICAgICAgICAgICAgICBwYXlsb2FkOiBwcmV2aWV3LnBheWxvYWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHlwZTogJ1NUQUtFJyxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlcGx5KDIwMSwgZXhwZWN0ZWQpO1xuXG4gICAgICBjb25zdCBzdGFraW5nUmVxdWVzdCA9IGF3YWl0IHN0YWtpbmdXYWxsZXQuc3Rha2Uoe1xuICAgICAgICBhbW91bnQ6ICcxJyxcbiAgICAgICAgY2xpZW50SWQ6ICdjbGllbnRJZCcsXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6ICdwYXNzcGhyYXNlJyxcbiAgICAgIH0pO1xuXG4gICAgICBzaG91bGQuZXhpc3Qoc3Rha2luZ1JlcXVlc3QpO1xuXG4gICAgICBzdGFraW5nUmVxdWVzdC5zaG91bGQuZGVlcEVxdWFsKGV4cGVjdGVkKTtcbiAgICAgIG1zU2NvcGUxLmlzRG9uZSgpLnNob3VsZC5iZS5UcnVlKCk7XG4gICAgICBtc1Njb3BlMi5pc0RvbmUoKS5zaG91bGQuYmUuVHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndW5zdGFrZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGNhbGwgZ28tc3Rha2luZy1zZXJ2aWNlIHRvIHVuc3Rha2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBleHBlY3RlZCA9IGZpeHR1cmVzLmZpbmFsaXplR29TdGFraW5nUmVxdWVzdChjb2luLCAnVU5TVEFLRScpO1xuICAgICAgY29uc3QgbXNTY29wZSA9IG5vY2sobWljcm9zZXJ2aWNlc1VyaSlcbiAgICAgICAgLnBvc3QoYC9hcGkvZ28tc3Rha2luZy92MS8ke29mY0NvaW59L2FjY291bnRzLyR7c3Rha2luZ1dhbGxldC5hY2NvdW50SWR9L3JlcXVlc3RzL2ZpbmFsaXplYCwge1xuICAgICAgICAgIGFtb3VudDogJzEnLFxuICAgICAgICAgIGNsaWVudElkOiAnY2xpZW50SWQnLFxuICAgICAgICAgIHR5cGU6ICdVTlNUQUtFJyxcbiAgICAgICAgfSlcbiAgICAgICAgLnJlcGx5KDIwMSwgZXhwZWN0ZWQpO1xuXG4gICAgICBjb25zdCBzdGFraW5nUmVxdWVzdCA9IGF3YWl0IHN0YWtpbmdXYWxsZXQudW5zdGFrZSh7XG4gICAgICAgIGFtb3VudDogJzEnLFxuICAgICAgICBjbGllbnRJZDogJ2NsaWVudElkJyxcbiAgICAgIH0pO1xuXG4gICAgICBzaG91bGQuZXhpc3Qoc3Rha2luZ1JlcXVlc3QpO1xuXG4gICAgICBzdGFraW5nUmVxdWVzdC5zaG91bGQuZGVlcEVxdWFsKGV4cGVjdGVkKTtcbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldEdvU3Rha2luZ1JlcXVlc3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjYWxsIGdvc3Rha2luZy1zZXJ2aWNlIHRvIGdldCBnbyBzdGFraW5nIHJlcXVlc3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzdGFraW5nUmVxdWVzdElkID0gJzg2MzgyODRhLWRhYjItNDZiOS1iMDdmLTIxMTA5YTZlNzIyMCc7XG4gICAgICBjb25zdCBleHBlY3RlZCA9IGZpeHR1cmVzLmZpbmFsaXplR29TdGFraW5nUmVxdWVzdChjb2luLCAnU1RBS0UnKTtcbiAgICAgIGNvbnN0IG1zU2NvcGUgPSBub2NrKG1pY3Jvc2VydmljZXNVcmkpXG4gICAgICAgIC5nZXQoYC9hcGkvZ28tc3Rha2luZy92MS8ke29mY0NvaW59L2FjY291bnRzLyR7c3Rha2luZ1dhbGxldC5hY2NvdW50SWR9L3JlcXVlc3RzLyR7c3Rha2luZ1JlcXVlc3RJZH1gKVxuICAgICAgICAucmVwbHkoMjAwLCBleHBlY3RlZCk7XG5cbiAgICAgIGNvbnN0IHN0YWtpbmdSZXF1ZXN0ID0gYXdhaXQgc3Rha2luZ1dhbGxldC5nZXRHb1N0YWtpbmdSZXF1ZXN0KHN0YWtpbmdSZXF1ZXN0SWQpO1xuXG4gICAgICBzaG91bGQuZXhpc3Qoc3Rha2luZ1JlcXVlc3QpO1xuXG4gICAgICBzdGFraW5nUmVxdWVzdC5zaG91bGQuZGVlcEVxdWFsKGV4cGVjdGVkKTtcbiAgICAgIG1zU2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLlRydWUoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!