PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-trx/dist/test/unit
Просмотр файла: transactionBuilder.js
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const node_test_1 = require("node:test");
const assert_1 = __importDefault(require("assert"));
const sdk_core_1 = require("@bitgo/sdk-core");
const resources_1 = require("../resources");
const builder_1 = require("../../src/lib/builder");
(0, node_test_1.describe)('Tron TransactionBuilder', function () {
let txBuilder;
(0, node_test_1.beforeEach)(() => {
txBuilder = (0, builder_1.getBuilder)('ttrx');
});
(0, node_test_1.describe)('Transaction builder from method', () => {
(0, node_test_1.describe)('should succeed to parse', () => {
(0, node_test_1.it)('a transfer contract for an unsigned tx', () => {
const txJson = JSON.stringify(resources_1.UnsignedBuildTransaction);
txBuilder.from(txJson);
});
(0, node_test_1.it)('a transfer contract for a half-signed tx', () => {
const txJson = JSON.stringify(resources_1.FirstSigOnBuildTransaction);
txBuilder.from(txJson);
});
(0, node_test_1.it)('a transfer contract for a fully signed tx', () => {
const txJson = JSON.stringify(resources_1.SecondSigOnBuildTransaction);
txBuilder.from(txJson);
});
});
});
(0, node_test_1.describe)('Transaction builder sign method', () => {
(0, node_test_1.describe)('should succeed to sign', () => {
(0, node_test_1.it)('an unsigned transaction', () => {
const txJson = JSON.stringify(resources_1.UnsignedBuildTransaction);
txBuilder.from(txJson);
txBuilder.sign({ key: resources_1.FirstPrivateKey });
});
(0, node_test_1.it)('a transaction signed with a different key', () => {
const txJson = JSON.stringify(resources_1.FirstSigOnBuildTransaction);
txBuilder.from(txJson);
txBuilder.sign({ key: resources_1.SecondPrivateKey });
});
(0, node_test_1.it)('a signed transaction with an xprv', async () => {
txBuilder.from(resources_1.FirstSigOnBuildTransaction);
const SecondPrivateKeyXprv = (0, sdk_core_1.rawPrvToExtendedKeys)(resources_1.SecondPrivateKey);
txBuilder.sign({ key: SecondPrivateKeyXprv.xprv });
const tx = await txBuilder.build();
assert_1.default.equal(tx.toJson().signature[0], 'bd08e6cd876bb573dd00a32870b58b70ea8b7908f5131686502589941bfa4fdda76b8c81bbbcfc549be6d4988657cea122df7da46c72041def2683d6ecb04a7401');
assert_1.default.equal(tx.toJson().signature[1], 'f3cabe2f4aed13e2342c78c7bf4626ea36cd6509a44418c24866814d3426703686be9ef21bd993324c520565beee820201f2a50a9ac971732410d3eb69cdb2a600');
assert_1.default.equal(tx.id, '80b8b9eaed51c8bba3b49f7f0e7cc5f21ac99a6f3e2893c663b544bf2c695b1d');
assert_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
assert_1.default.equal(tx.inputs.length, 1);
assert_1.default.equal(tx.inputs[0].address, 'TTsGwnTLQ4eryFJpDvJSfuGQxPXRCjXvZz');
assert_1.default.equal(tx.inputs[0].value, '1718');
assert_1.default.equal(tx.outputs.length, 1);
assert_1.default.equal(tx.outputs[0].address, 'TNYssiPgaf9XYz3urBUqr861Tfqxvko47B');
assert_1.default.equal(tx.outputs[0].value, '1718');
assert_1.default.equal(tx.validFrom, 1571811410819);
assert_1.default.equal(tx.validTo, 1571811468000);
});
});
(0, node_test_1.describe)('should fail to sign', () => {
(0, node_test_1.it)('a transaction with the same key', () => {
const txJson = JSON.stringify(resources_1.FirstSigOnBuildTransaction);
txBuilder.from(txJson);
assert_1.default.throws(() => txBuilder.sign({ key: resources_1.FirstPrivateKey }));
});
});
});
(0, node_test_1.describe)('Transaction builder', () => {
(0, node_test_1.it)('should build an update account tx', async () => {
const txJson = JSON.stringify(resources_1.UnsignedAccountPermissionUpdateContractTx);
txBuilder.from(txJson);
txBuilder.sign({ key: resources_1.AccountPermissionUpdateContractPriv });
const tx = await txBuilder.build();
const signedTxJson = tx.toJson();
assert_1.default.equal(signedTxJson.txID, resources_1.UnsignedAccountPermissionUpdateContractTx.txID);
assert_1.default.equal(signedTxJson.raw_data_hex, resources_1.UnsignedAccountPermissionUpdateContractTx.raw_data_hex);
assert_1.default.equal(JSON.stringify(signedTxJson.raw_data), JSON.stringify(resources_1.UnsignedAccountPermissionUpdateContractTx.raw_data));
assert_1.default.equal(signedTxJson.signature.length, 1);
assert_1.default.equal(signedTxJson.signature[0], '2bc5030727d42ed642c2806a3c1a5a0393408b159541f2163df4ba692c5c1240e2dde5a2aae4ecad465414e60b5aeca8522d0a2b6606f88a326658809161334f00');
});
(0, node_test_1.it)('should build an half signed tx', async () => {
const txJson = JSON.stringify(resources_1.UnsignedBuildTransaction);
txBuilder.from(txJson);
txBuilder.sign({ key: resources_1.FirstPrivateKey });
const tx = await txBuilder.build();
assert_1.default.equal(tx.id, '80b8b9eaed51c8bba3b49f7f0e7cc5f21ac99a6f3e2893c663b544bf2c695b1d');
assert_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
assert_1.default.equal(tx.inputs.length, 1);
assert_1.default.equal(tx.inputs[0].address, 'TTsGwnTLQ4eryFJpDvJSfuGQxPXRCjXvZz');
assert_1.default.equal(tx.inputs[0].value, '1718');
assert_1.default.equal(tx.outputs.length, 1);
assert_1.default.equal(tx.outputs[0].address, 'TNYssiPgaf9XYz3urBUqr861Tfqxvko47B');
assert_1.default.equal(tx.outputs[0].value, '1718');
});
(0, node_test_1.it)('should build the right JSON after is half signed tx', async () => {
const txJson = JSON.stringify(resources_1.UnsignedBuildTransaction);
txBuilder.from(txJson);
txBuilder.sign({ key: resources_1.FirstPrivateKey });
const tx = await txBuilder.build();
const signedTxJson = tx.toJson();
assert_1.default.equal(signedTxJson.txID, resources_1.UnsignedBuildTransaction.txID);
assert_1.default.equal(signedTxJson.raw_data_hex, resources_1.UnsignedBuildTransaction.raw_data_hex);
assert_1.default.equal(JSON.stringify(signedTxJson.raw_data), JSON.stringify(resources_1.UnsignedBuildTransaction.raw_data));
assert_1.default.equal(signedTxJson.signature.length, 1);
assert_1.default.equal(signedTxJson.signature[0], 'bd08e6cd876bb573dd00a32870b58b70ea8b7908f5131686502589941bfa4fdda76b8c81bbbcfc549be6d4988657cea122df7da46c72041def2683d6ecb04a7401');
});
(0, node_test_1.it)('should not extend a half signed tx', () => {
const txJson = JSON.stringify(resources_1.UnsignedBuildTransaction);
txBuilder.from(txJson);
txBuilder.sign({ key: resources_1.FirstPrivateKey });
assert_1.default.throws(() => txBuilder.extendValidTo(10000));
});
(0, node_test_1.it)('should extend an unsigned tx', async () => {
const extendMs = 10000;
txBuilder.from(JSON.parse(JSON.stringify(resources_1.UnsignedBuildTransaction)));
txBuilder.extendValidTo(extendMs);
const tx = await txBuilder.build();
assert_1.default.notEqual(tx.id, resources_1.UnsignedBuildTransaction.txID);
assert_1.default.equal(tx.id, '764aa8a72c2c720a6556def77d6092f729b6e14209d8130f1692d5aff13f2503');
const oldExpiration = resources_1.UnsignedBuildTransaction.raw_data.expiration;
assert_1.default.equal(tx.validTo, oldExpiration + extendMs);
assert_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
assert_1.default.equal(tx.inputs.length, 1);
assert_1.default.equal(tx.inputs[0].address, 'TTsGwnTLQ4eryFJpDvJSfuGQxPXRCjXvZz');
assert_1.default.equal(tx.inputs[0].value, '1718');
assert_1.default.equal(tx.outputs.length, 1);
assert_1.default.equal(tx.outputs[0].address, 'TNYssiPgaf9XYz3urBUqr861Tfqxvko47B');
assert_1.default.equal(tx.outputs[0].value, '1718');
assert_1.default.equal(tx.validFrom, 1571811410819);
});
(0, node_test_1.it)('should catch an invalid id', async () => {
const txJson = JSON.stringify(resources_1.InvalidIDTransaction);
assert_1.default.throws(() => txBuilder.from(txJson));
});
(0, node_test_1.it)('should throw exception of wrong id', () => {
const txJson = JSON.stringify(resources_1.UnsignedBuildInvalidIDTransaction);
assert_1.default.throws(() => txBuilder.from(txJson));
});
(0, node_test_1.it)('should throw exception of empty id', () => {
const txJson = JSON.stringify(resources_1.UnsignedBuildEmptyIDTransaction);
assert_1.default.throws(() => txBuilder.from(txJson));
});
(0, node_test_1.it)('should throw exception of invalid time stamp', () => {
const txJson = JSON.stringify(resources_1.UnsignedInvalidTimeStampBuildTransaction);
assert_1.default.throws(() => txBuilder.from(txJson));
});
(0, node_test_1.it)('should throw exception of invalid expiration time', () => {
const txJson = JSON.stringify(resources_1.UnsignedInvalidExpirationBuildTransaction);
assert_1.default.throws(() => txBuilder.from(txJson));
});
(0, node_test_1.it)('should throw exception of non-existence of contract', () => {
const txJson = JSON.stringify(resources_1.UnsignedInvalidContractBuildTransaction);
assert_1.default.throws(() => txBuilder.from(txJson));
});
(0, node_test_1.it)('should validate JSON transaction', () => {
const txJson = resources_1.UnsignedAccountPermissionUpdateContractTx;
assert_1.default.doesNotThrow(() => txBuilder.from(txJson));
});
(0, node_test_1.it)('should validate stringified JSON transaction', () => {
const txJsonString = JSON.stringify(resources_1.UnsignedBuildTransaction);
assert_1.default.doesNotThrow(() => txBuilder.from(txJsonString));
});
});
(0, node_test_1.describe)('#validateKey', () => {
(0, node_test_1.it)('should not throw an error when the key is valid', () => {
const key = '2DBEAC1C22849F47514445A56AEF2EF164528A502DE4BD289E23EA1E2D4C4B06';
assert_1.default.doesNotThrow(() => txBuilder.validateKey({ key }));
});
(0, node_test_1.it)('should throw an error when the key is invalid', () => {
const key = 'jiraiya';
assert_1.default.throws(() => txBuilder.validateKey({ key }), /The provided key is not valid/);
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHlDQUFxRDtBQUNyRCxvREFBNEI7QUFDNUIsOENBQXdFO0FBQ3hFLDRDQWNzQjtBQUN0QixtREFBbUQ7QUFFbkQsSUFBQSxvQkFBUSxFQUFDLHlCQUF5QixFQUFFO0lBQ2xDLElBQUksU0FBUyxDQUFDO0lBRWQsSUFBQSxzQkFBVSxFQUFDLEdBQUcsRUFBRTtRQUNkLFNBQVMsR0FBRyxJQUFBLG9CQUFVLEVBQUMsTUFBTSxDQUFDLENBQUM7SUFDakMsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFBLG9CQUFRLEVBQUMsaUNBQWlDLEVBQUUsR0FBRyxFQUFFO1FBQy9DLElBQUEsb0JBQVEsRUFBQyx5QkFBeUIsRUFBRSxHQUFHLEVBQUU7WUFDdkMsSUFBQSxjQUFFLEVBQUMsd0NBQXdDLEVBQUUsR0FBRyxFQUFFO2dCQUNoRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLG9DQUF3QixDQUFDLENBQUM7Z0JBQ3hELFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDekIsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFBLGNBQUUsRUFBQywwQ0FBMEMsRUFBRSxHQUFHLEVBQUU7Z0JBQ2xELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsc0NBQTBCLENBQUMsQ0FBQztnQkFDMUQsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN6QixDQUFDLENBQUMsQ0FBQztZQUVILElBQUEsY0FBRSxFQUFDLDJDQUEyQyxFQUFFLEdBQUcsRUFBRTtnQkFDbkQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyx1Q0FBMkIsQ0FBQyxDQUFDO2dCQUMzRCxTQUFTLENBQUMsSUFBSSxD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R0FBRyxHQUFHLFNBQVMsQ0FBQztZQUN0QixnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO1FBQ3ZGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJlZm9yZUVhY2gsIGRlc2NyaWJlLCBpdCB9IGZyb20gJ25vZGU6dGVzdCc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyByYXdQcnZUb0V4dGVuZGVkS2V5cywgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7XG4gIFVuc2lnbmVkQnVpbGRUcmFuc2FjdGlvbixcbiAgRmlyc3RTaWdPbkJ1aWxkVHJhbnNhY3Rpb24sXG4gIEZpcnN0UHJpdmF0ZUtleSxcbiAgU2Vjb25kU2lnT25CdWlsZFRyYW5zYWN0aW9uLFxuICBTZWNvbmRQcml2YXRlS2V5LFxuICBVbnNpZ25lZEFjY291bnRQZXJtaXNzaW9uVXBkYXRlQ29udHJhY3RUeCxcbiAgQWNjb3VudFBlcm1pc3Npb25VcGRhdGVDb250cmFjdFByaXYsXG4gIEludmFsaWRJRFRyYW5zYWN0aW9uLFxuICBVbnNpZ25lZEJ1aWxkSW52YWxpZElEVHJhbnNhY3Rpb24sXG4gIFVuc2lnbmVkSW52YWxpZEV4cGlyYXRpb25CdWlsZFRyYW5zYWN0aW9uLFxuICBVbnNpZ25lZEludmFsaWRDb250cmFjdEJ1aWxkVHJhbnNhY3Rpb24sXG4gIFVuc2lnbmVkQnVpbGRFbXB0eUlEVHJhbnNhY3Rpb24sXG4gIFVuc2lnbmVkSW52YWxpZFRpbWVTdGFtcEJ1aWxkVHJhbnNhY3Rpb24sXG59IGZyb20gJy4uL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBnZXRCdWlsZGVyIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi9idWlsZGVyJztcblxuZGVzY3JpYmUoJ1Ryb24gVHJhbnNhY3Rpb25CdWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICBsZXQgdHhCdWlsZGVyO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIHR4QnVpbGRlciA9IGdldEJ1aWxkZXIoJ3R0cngnKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIGJ1aWxkZXIgZnJvbSBtZXRob2QnLCAoKSA9PiB7XG4gICAgZGVzY3JpYmUoJ3Nob3VsZCBzdWNjZWVkIHRvIHBhcnNlJywgKCkgPT4ge1xuICAgICAgaXQoJ2EgdHJhbnNmZXIgY29udHJhY3QgZm9yIGFuIHVuc2lnbmVkIHR4JywgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEpzb24gPSBKU09OLnN0cmluZ2lmeShVbnNpZ25lZEJ1aWxkVHJhbnNhY3Rpb24pO1xuICAgICAgICB0eEJ1aWxkZXIuZnJvbSh0eEpzb24pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhIHRyYW5zZmVyIGNvbnRyYWN0IGZvciBhIGhhbGYtc2lnbmVkIHR4JywgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEpzb24gPSBKU09OLnN0cmluZ2lmeShGaXJzdFNpZ09uQnVpbGRUcmFuc2FjdGlvbik7XG4gICAgICAgIHR4QnVpbGRlci5mcm9tKHR4SnNvbik7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2EgdHJhbnNmZXIgY29udHJhY3QgZm9yIGEgZnVsbHkgc2lnbmVkIHR4JywgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEpzb24gPSBKU09OLnN0cmluZ2lmeShTZWNvbmRTaWdPbkJ1aWxkVHJhbnNhY3Rpb24pO1xuICAgICAgICB0eEJ1aWxkZXIuZnJvbSh0eEpzb24pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUcmFuc2FjdGlvbiBidWlsZGVyIHNpZ24gbWV0aG9kJywgKCkgPT4ge1xuICAgIGRlc2NyaWJlKCdzaG91bGQgc3VjY2VlZCB0byBzaWduJywgKCkgPT4ge1xuICAgICAgaXQoJ2FuIHVuc2lnbmVkIHRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEpzb24gPSBKU09OLnN0cmluZ2lmeShVbnNpZ25lZEJ1aWxkVHJhbnNhY3Rpb24pO1xuICAgICAgICB0eEJ1aWxkZXIuZnJvbSh0eEpzb24pO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogRmlyc3RQcml2YXRlS2V5IH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdhIHRyYW5zYWN0aW9uIHNpZ25lZCB3aXRoIGEgZGlmZmVyZW50IGtleScsICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhKc29uID0gSlNPTi5zdHJpbmdpZnkoRmlyc3RTaWdPbkJ1aWxkVHJhbnNhY3Rpb24pO1xuICAgICAgICB0eEJ1aWxkZXIuZnJvbSh0eEpzb24pO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogU2Vjb25kUHJpdmF0ZUtleSB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYSBzaWduZWQgdHJhbnNhY3Rpb24gd2l0aCBhbiB4cHJ2JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICB0eEJ1aWxkZXIuZnJvbShGaXJzdFNpZ09uQnVpbGRUcmFuc2FjdGlvbik7XG4gICAgICAgIGNvbnN0IFNlY29uZFByaXZhdGVLZXlYcHJ2ID0gcmF3UHJ2VG9FeHRlbmRlZEtleXMoU2Vjb25kUHJpdmF0ZUtleSk7XG4gICAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBTZWNvbmRQcml2YXRlS2V5WHBydi54cHJ2IH0pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgICB0eC50b0pzb24oKS5zaWduYXR1cmVbMF0sXG4gICAgICAgICAgJ2JkMDhlNmNkODc2YmI1NzNkZDAwYTMyODcwYjU4YjcwZWE4Yjc5MDhmNTEzMTY4NjUwMjU4OTk0MWJmYTRmZGRhNzZiOGM4MWJiYmNmYzU0OWJlNmQ0OTg4NjU3Y2VhMTIyZGY3ZGE0NmM3MjA0MWRlZjI2ODNkNmVjYjA0YTc0MDEnXG4gICAgICAgICk7XG4gICAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgICB0eC50b0pzb24oKS5zaWduYXR1cmVbMV0sXG4gICAgICAgICAgJ2YzY2FiZTJmNGFlZDEzZTIzNDJjNzhjN2JmNDYyNmVhMzZjZDY1MDlhNDQ0MThjMjQ4NjY4MTRkMzQyNjcwMzY4NmJlOWVmMjFiZDk5MzMyNGM1MjA1NjViZWVlODIwMjAxZjJhNTBhOWFjOTcxNzMyNDEwZDNlYjY5Y2RiMmE2MDAnXG4gICAgICAgICk7XG5cbiAgICAgICAgYXNzZXJ0LmVxdWFsKHR4LmlkLCAnODBiOGI5ZWFlZDUxYzhiYmEzYjQ5ZjdmMGU3Y2M1ZjIxYWM5OWE2ZjNlMjg5M2M2NjNiNTQ0YmYyYzY5NWIxZCcpO1xuICAgICAgICBhc3NlcnQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgICBhc3NlcnQuZXF1YWwodHguaW5wdXRzLmxlbmd0aCwgMSk7XG4gICAgICAgIGFzc2VydC5lcXVhbCh0eC5pbnB1dHNbMF0uYWRkcmVzcywgJ1RUc0d3blRMUTRlcnlGSnBEdkpTZnVHUXhQWFJDalh2WnonKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHR4LmlucHV0c1swXS52YWx1ZSwgJzE3MTgnKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHR4Lm91dHB1dHMubGVuZ3RoLCAxKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHR4Lm91dHB1dHNbMF0uYWRkcmVzcywgJ1ROWXNzaVBnYWY5WFl6M3VyQlVxcjg2MVRmcXh2a280N0InKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHR4Lm91dHB1dHNbMF0udmFsdWUsICcxNzE4Jyk7XG4gICAgICAgIGFzc2VydC5lcXVhbCh0eC52YWxpZEZyb20sIDE1NzE4MTE0MTA4MTkpO1xuICAgICAgICBhc3NlcnQuZXF1YWwodHgudmFsaWRUbywgMTU3MTgxMTQ2ODAwMCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzaG91bGQgZmFpbCB0byBzaWduJywgKCkgPT4ge1xuICAgICAgaXQoJ2EgdHJhbnNhY3Rpb24gd2l0aCB0aGUgc2FtZSBrZXknLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IEpTT04uc3RyaW5naWZ5KEZpcnN0U2lnT25CdWlsZFRyYW5zYWN0aW9uKTtcbiAgICAgICAgdHhCdWlsZGVyLmZyb20odHhKc29uKTtcbiAgICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIuc2lnbih7IGtleTogRmlyc3RQcml2YXRlS2V5IH0pKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVHJhbnNhY3Rpb24gYnVpbGRlcicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGFuIHVwZGF0ZSBhY2NvdW50IHR4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhKc29uID0gSlNPTi5zdHJpbmdpZnkoVW5zaWduZWRBY2NvdW50UGVybWlzc2lvblVwZGF0ZUNvbnRyYWN0VHgpO1xuICAgICAgdHhCdWlsZGVyLmZyb20odHhKc29uKTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBBY2NvdW50UGVybWlzc2lvblVwZGF0ZUNvbnRyYWN0UHJpdiB9KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBzaWduZWRUeEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKHNpZ25lZFR4SnNvbi50eElELCBVbnNpZ25lZEFjY291bnRQZXJtaXNzaW9uVXBkYXRlQ29udHJhY3RUeC50eElEKTtcbiAgICAgIGFzc2VydC5lcXVhbChzaWduZWRUeEpzb24ucmF3X2RhdGFfaGV4LCBVbnNpZ25lZEFjY291bnRQZXJtaXNzaW9uVXBkYXRlQ29udHJhY3RUeC5yYXdfZGF0YV9oZXgpO1xuICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICBKU09OLnN0cmluZ2lmeShzaWduZWRUeEpzb24ucmF3X2RhdGEpLFxuICAgICAgICBKU09OLnN0cmluZ2lmeShVbnNpZ25lZEFjY291bnRQZXJtaXNzaW9uVXBkYXRlQ29udHJhY3RUeC5yYXdfZGF0YSlcbiAgICAgICk7XG4gICAgICBhc3NlcnQuZXF1YWwoc2lnbmVkVHhKc29uLnNpZ25hdHVyZS5sZW5ndGgsIDEpO1xuICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICBzaWduZWRUeEpzb24uc2lnbmF0dXJlWzBdLFxuICAgICAgICAnMmJjNTAzMDcyN2Q0MmVkNjQyYzI4MDZhM2MxYTVhMDM5MzQwOGIxNTk1NDFmMjE2M2RmNGJhNjkyYzVjMTI0MGUyZGRlNWEyYWFlNGVjYWQ0NjU0MTRlNjBiNWFlY2E4NTIyZDBhMmI2NjA2Zjg4YTMyNjY1ODgwOTE2MTMzNGYwMCdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGFuIGhhbGYgc2lnbmVkIHR4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhKc29uID0gSlNPTi5zdHJpbmdpZnkoVW5zaWduZWRCdWlsZFRyYW5zYWN0aW9uKTtcbiAgICAgIHR4QnVpbGRlci5mcm9tKHR4SnNvbik7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogRmlyc3RQcml2YXRlS2V5IH0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKHR4LmlkLCAnODBiOGI5ZWFlZDUxYzhiYmEzYjQ5ZjdmMGU3Y2M1ZjIxYWM5OWE2ZjNlMjg5M2M2NjNiNTQ0YmYyYzY5NWIxZCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC5pbnB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC5pbnB1dHNbMF0uYWRkcmVzcywgJ1RUc0d3blRMUTRlcnlGSnBEdkpTZnVHUXhQWFJDalh2WnonKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC5pbnB1dHNbMF0udmFsdWUsICcxNzE4Jyk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgub3V0cHV0cy5sZW5ndGgsIDEpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4Lm91dHB1dHNbMF0uYWRkcmVzcywgJ1ROWXNzaVBnYWY5WFl6M3VyQlVxcjg2MVRmcXh2a280N0InKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC5vdXRwdXRzWzBdLnZhbHVlLCAnMTcxOCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCB0aGUgcmlnaHQgSlNPTiBhZnRlciBpcyBoYWxmIHNpZ25lZCB0eCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IEpTT04uc3RyaW5naWZ5KFVuc2lnbmVkQnVpbGRUcmFuc2FjdGlvbik7XG4gICAgICB0eEJ1aWxkZXIuZnJvbSh0eEpzb24pO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IEZpcnN0UHJpdmF0ZUtleSB9KTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBzaWduZWRUeEpzb24gPSB0eC50b0pzb24oKTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKHNpZ25lZFR4SnNvbi50eElELCBVbnNpZ25lZEJ1aWxkVHJhbnNhY3Rpb24udHhJRCk7XG4gICAgICBhc3NlcnQuZXF1YWwoc2lnbmVkVHhKc29uLnJhd19kYXRhX2hleCwgVW5zaWduZWRCdWlsZFRyYW5zYWN0aW9uLnJhd19kYXRhX2hleCk7XG4gICAgICBhc3NlcnQuZXF1YWwoSlNPTi5zdHJpbmdpZnkoc2lnbmVkVHhKc29uLnJhd19kYXRhKSwgSlNPTi5zdHJpbmdpZnkoVW5zaWduZWRCdWlsZFRyYW5zYWN0aW9uLnJhd19kYXRhKSk7XG4gICAgICBhc3NlcnQuZXF1YWwoc2lnbmVkVHhKc29uLnNpZ25hdHVyZS5sZW5ndGgsIDEpO1xuICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICBzaWduZWRUeEpzb24uc2lnbmF0dXJlWzBdLFxuICAgICAgICAnYmQwOGU2Y2Q4NzZiYjU3M2RkMDBhMzI4NzBiNThiNzBlYThiNzkwOGY1MTMxNjg2NTAyNTg5OTQxYmZhNGZkZGE3NmI4YzgxYmJiY2ZjNTQ5YmU2ZDQ5ODg2NTdjZWExMjJkZjdkYTQ2YzcyMDQxZGVmMjY4M2Q2ZWNiMDRhNzQwMSdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCBleHRlbmQgYSBoYWxmIHNpZ25lZCB0eCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IEpTT04uc3RyaW5naWZ5KFVuc2lnbmVkQnVpbGRUcmFuc2FjdGlvbik7XG4gICAgICB0eEJ1aWxkZXIuZnJvbSh0eEpzb24pO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IEZpcnN0UHJpdmF0ZUtleSB9KTtcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIuZXh0ZW5kVmFsaWRUbygxMDAwMCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHRlbmQgYW4gdW5zaWduZWQgdHgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBleHRlbmRNcyA9IDEwMDAwO1xuICAgICAgdHhCdWlsZGVyLmZyb20oSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShVbnNpZ25lZEJ1aWxkVHJhbnNhY3Rpb24pKSk7XG4gICAgICB0eEJ1aWxkZXIuZXh0ZW5kVmFsaWRUbyhleHRlbmRNcyk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICBhc3NlcnQubm90RXF1YWwodHguaWQsIFVuc2lnbmVkQnVpbGRUcmFuc2FjdGlvbi50eElEKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC5pZCwgJzc2NGFhOGE3MmMyYzcyMGE2NTU2ZGVmNzdkNjA5MmY3MjliNmUxNDIwOWQ4MTMwZjE2OTJkNWFmZjEzZjI1MDMnKTtcbiAgICAgIGNvbnN0IG9sZEV4cGlyYXRpb24gPSBVbnNpZ25lZEJ1aWxkVHJhbnNhY3Rpb24ucmF3X2RhdGEuZXhwaXJhdGlvbjtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC52YWxpZFRvLCBvbGRFeHBpcmF0aW9uICsgZXh0ZW5kTXMpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC5pbnB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC5pbnB1dHNbMF0uYWRkcmVzcywgJ1RUc0d3blRMUTRlcnlGSnBEdkpTZnVHUXhQWFJDalh2WnonKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC5pbnB1dHNbMF0udmFsdWUsICcxNzE4Jyk7XG4gICAgICBhc3NlcnQuZXF1YWwodHgub3V0cHV0cy5sZW5ndGgsIDEpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4Lm91dHB1dHNbMF0uYWRkcmVzcywgJ1ROWXNzaVBnYWY5WFl6M3VyQlVxcjg2MVRmcXh2a280N0InKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0eC5vdXRwdXRzWzBdLnZhbHVlLCAnMTcxOCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4LnZhbGlkRnJvbSwgMTU3MTgxMTQxMDgxOSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNhdGNoIGFuIGludmFsaWQgaWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEpzb24gPSBKU09OLnN0cmluZ2lmeShJbnZhbGlkSURUcmFuc2FjdGlvbik7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci5mcm9tKHR4SnNvbikpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBleGNlcHRpb24gb2Ygd3JvbmcgaWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEpzb24gPSBKU09OLnN0cmluZ2lmeShVbnNpZ25lZEJ1aWxkSW52YWxpZElEVHJhbnNhY3Rpb24pO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIuZnJvbSh0eEpzb24pKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXhjZXB0aW9uIG9mIGVtcHR5IGlkJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhKc29uID0gSlNPTi5zdHJpbmdpZnkoVW5zaWduZWRCdWlsZEVtcHR5SURUcmFuc2FjdGlvbik7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci5mcm9tKHR4SnNvbikpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBleGNlcHRpb24gb2YgaW52YWxpZCB0aW1lIHN0YW1wJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhKc29uID0gSlNPTi5zdHJpbmdpZnkoVW5zaWduZWRJbnZhbGlkVGltZVN0YW1wQnVpbGRUcmFuc2FjdGlvbik7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci5mcm9tKHR4SnNvbikpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBleGNlcHRpb24gb2YgaW52YWxpZCBleHBpcmF0aW9uIHRpbWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEpzb24gPSBKU09OLnN0cmluZ2lmeShVbnNpZ25lZEludmFsaWRFeHBpcmF0aW9uQnVpbGRUcmFuc2FjdGlvbik7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci5mcm9tKHR4SnNvbikpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBleGNlcHRpb24gb2Ygbm9uLWV4aXN0ZW5jZSBvZiBjb250cmFjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IEpTT04uc3RyaW5naWZ5KFVuc2lnbmVkSW52YWxpZENvbnRyYWN0QnVpbGRUcmFuc2FjdGlvbik7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci5mcm9tKHR4SnNvbikpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBKU09OIHRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhKc29uID0gVW5zaWduZWRBY2NvdW50UGVybWlzc2lvblVwZGF0ZUNvbnRyYWN0VHg7XG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHR4QnVpbGRlci5mcm9tKHR4SnNvbikpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBzdHJpbmdpZmllZCBKU09OIHRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhKc29uU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoVW5zaWduZWRCdWlsZFRyYW5zYWN0aW9uKTtcbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4gdHhCdWlsZGVyLmZyb20odHhKc29uU3RyaW5nKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcjdmFsaWRhdGVLZXknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBub3QgdGhyb3cgYW4gZXJyb3Igd2hlbiB0aGUga2V5IGlzIHZhbGlkJywgKCkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gJzJEQkVBQzFDMjI4NDlGNDc1MTQ0NDVBNTZBRUYyRUYxNjQ1MjhBNTAyREU0QkQyODlFMjNFQTFFMkQ0QzRCMDYnO1xuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB0eEJ1aWxkZXIudmFsaWRhdGVLZXkoeyBrZXkgfSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBhbiBlcnJvciB3aGVuIHRoZSBrZXkgaXMgaW52YWxpZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9ICdqaXJhaXlhJztcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnZhbGlkYXRlS2V5KHsga2V5IH0pLCAvVGhlIHByb3ZpZGVkIGtleSBpcyBub3QgdmFsaWQvKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!