PHP WebShell
Текущая директория: /opt/BitGoJS/modules/bitgo/dist/test/unit
Просмотр файла: hdnode.js
"use strict";
//
// Tests for Wallets
//
// Copyright 2014, BitGo, Inc. All Rights Reserved.
//
Object.defineProperty(exports, "__esModule", { value: true });
require("should");
const sdk_core_1 = require("@bitgo/sdk-core");
const { HDNode, hdPath } = sdk_core_1.bitcoin;
describe('HDNode', function () {
describe('derive', function () {
it('should derive these standard test vectors', function () {
let hdnode = HDNode.fromSeedBuffer(Buffer.from('000102030405060708090a0b0c0d0e0f', 'hex'));
let path = hdPath(hdnode);
path
.derive('m/0/0')
.toBase58()
.should.equal('xprv9ww7sMFLzJMzur2oEQDB642fbsMS4q6JRraMVTrM9bTWBq7NDS8ZpmsKVB4YF3mZecqax1fjnsPF19xnsJNfRp4RSyexacULXMKowSACTRc');
path
.derive("m/0'/1")
.toBase58()
.should.equal('xprv9wTYmMFdV23N2TdNG573QoEsfRrWKQgWeibmLntzniatZvR9BmLnvSxqu53Kw1UmYPxLgboyZQaXwTCg8MSY3H2EU4pWcQDnRnrVA1xe8fs');
path
.derive("m/0'/1/2'/2/1000000000")
.toBase58()
.should.equal('xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76');
path
.derive("m/0'/1/2'/2/1000000000")
.neutered()
.toBase58()
.should.equal('xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy');
hdnode = path.derive("m/0'/1/2'").neutered();
path = hdPath(hdnode);
path
.derive('m/2/1000000000')
.toBase58()
.should.equal('xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy');
// make sure caching does not overcache
let hdnode2 = HDNode.fromSeedBuffer(Buffer.from('000102030405060708090a0b0c0d0e0e', 'hex'));
let path2 = hdPath(hdnode2);
path2
.derive('m/0/0')
.toBase58()
.should.equal('xprv9wTW8JGaw3LLpqYG35f4WdWA7yF5UFNsp5QptdwhU2uy7XarRUrZx2AbPft7VocxAdVmYxviYvhJbV1EeY2yiDKu8gSipwUE6TZoQsjLALL');
hdnode2 = path2.derive("m/0'/1/2'").neutered();
path2 = hdPath(hdnode2);
path2
.derive('m/2/1000000000')
.toBase58()
.should.equal('xpub6FiKNEcQ25UZV3FU9qXu46i5nvoAA6zWRxa93zWAdZTT2JYa5fRDR6BJzyvbZNgNNVTesr3iEFnRrKcqkUNewig4aARKBH4AUxft5YXTG9X');
});
it('uses caching for previously derived keys (hardened)', function () {
const hdnode = HDNode.fromSeedBuffer(Buffer.from('000103030405060708090a0b0c0d0e0f', 'hex'));
const path = hdPath(hdnode);
path
.derive("m/1/2'/3/4")
.toBase58()
.should.equal('xprvA1PudVPRZQFcfftzuHtMGwhs3siwHTKz2YjoJcVchrz7eugyW8riiaxYRyg1oXdzGxgFQ1Nz4Smokj7pi8NsWYTQwNqWXiRde2Jv37XwnDX');
for (let i = 0; i < 1000; i++) {
path
.derive("m/1/2'/3/4")
.toBase58()
.should.equal('xprvA1PudVPRZQFcfftzuHtMGwhs3siwHTKz2YjoJcVchrz7eugyW8riiaxYRyg1oXdzGxgFQ1Nz4Smokj7pi8NsWYTQwNqWXiRde2Jv37XwnDX');
}
});
it('uses caching for previously derived keys (public)', function () {
const hdnode = HDNode.fromSeedBuffer(Buffer.from('000103030405060708090a0b0c0d0e0f', 'hex')).neutered();
const path = hdPath(hdnode);
path
.derive('m/0/1/2/3')
.toBase58()
.should.equal('xpub6F46ySPYeyfcJzEZVS2zWVnx4ai5eSRbFXkdm3DCezF8jT1zE35L4SJbsMPyCSbyWppi9tuSH6PzAMxe5vWHPR8Bpstt3tyw5GBqeSXQLB5');
for (let i = 0; i < 1000; i++) {
path
.derive('m/0/1/2/3')
.toBase58()
.should.equal('xpub6F46ySPYeyfcJzEZVS2zWVnx4ai5eSRbFXkdm3DCezF8jT1zE35L4SJbsMPyCSbyWppi9tuSH6PzAMxe5vWHPR8Bpstt3tyw5GBqeSXQLB5');
}
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGRub2RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L2hkbm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsRUFBRTtBQUNGLG9CQUFvQjtBQUNwQixFQUFFO0FBQ0Ysb0RBQW9EO0FBQ3BELEVBQUU7O0FBRUYsa0JBQWdCO0FBQ2hCLDhDQUEwQztBQUMxQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLGtCQUFPLENBQUM7QUFFbkMsUUFBUSxDQUFDLFFBQVEsRUFBRTtJQUNqQixRQUFRLENBQUMsUUFBUSxFQUFFO1FBQ2pCLEVBQUUsQ0FBQywyQ0FBMkMsRUFBRTtZQUM5QyxJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0NBQWtDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMzRixJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDMUIsSUFBSTtpQkFDRCxNQUFNLENBQUMsT0FBTyxDQUFDO2lCQUNmLFFBQVEsRUFBRTtpQkFDVixNQUFNLENBQUMsS0FBSyxDQUNYLGlIQUFpSCxDQUNsSCxDQUFDO1lBQ0osSUFBSTtpQkFDRCxNQUFNLENBQUMsUUFBUSxDQUFDO2lCQUNoQixRQUFRLEVBQUU7aUJBQ1YsTUFBTSxDQUFDLEtBQUssQ0FDWCxpSEFBaUgsQ0FDbEgsQ0FBQztZQUNKLElBQUk7aUJBQ0QsTUFBTSxDQUFDLHdCQUF3QixDQUFDO2lCQUNoQyxRQUFRLEVBQUU7aUJBQ1YsTUFBTSxDQUFDLEtBQUssQ0FDWCxpSEFBaUgsQ0FDbEgsQ0FBQztZQUNKLElBQUk7aUJBQ0QsTUFBTSxDQUFDLHdCQUF3QixDQUFDO2lCQUNoQyxRQUFRLEVBQUU7aUJBQ1YsUUFBUSxFQUFFO2lCQUNWLE1BQU0sQ0FBQyxLQUFLLENBQ1gsaUhBQWlILENBQ2xILENBQUM7WUFDSixNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM3QyxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3RCLElBQUk7aUJBQ0QsTUFBTSxDQUFDLGdCQUFnQixDQUFDO2lCQUN4QixRQUFRLEVBQUU7aUJBQ1YsTUFBTSxDQUFDLEtBQUssQ0FDWCxpSEFBaUgsQ0FDbEgsQ0FBQztZQUVKLHVDQUF1QztZQUN2QyxJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0NBQWtDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUM1RixJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDNUIsS0FBSztpQkFDRixNQUFNLENBQUMsT0FBTyxDQUFDO2lCQUNmLFFBQVEsRUFBRTtpQkFDVixNQUFNLENBQUMsS0FBSyxDQUNYLGlIQUFpSCxDQUNsSCxDQUFDO1lBQ0osT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDL0MsS0FBSyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN4QixLQUFLO2lCQUNGLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDeEIsUUFBUSxFQUFFO2lCQUNWLE1BQU0sQ0FBQyxLQUFLLENBQ1gsaUhBQWlILENBQ2xILENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxxREFBcUQsRUFBRTtZQUN4RCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0NBQWtDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUM3RixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDNUIsSUFBSTtpQkFDRCxNQUFNLENBQUMsWUFBWSxDQUFDO2lCQUNwQixRQUFRLEVBQUU7aUJBQ1YsTUFBTSxDQUFDLEtBQUssQ0FDWCxpSEFBaUgsQ0FDbEgsQ0FBQztZQUNKLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDOUIsSUFBSTtxQkFDRCxNQUFNLENBQUMsWUFBWSxDQUFDO3FCQUNwQixRQUFRLEVBQUU7cUJBQ1YsTUFBTSxDQUFDLEtBQUssQ0FDWCxpSEFBaUgsQ0FDbEgsQ0FBQztZQUNOLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxtREFBbUQsRUFBRTtZQUN0RCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0NBQWtDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN4RyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDNUIsSUFBSTtpQkFDRCxNQUFNLENBQUMsV0FBVyxDQUFDO2lCQUNuQixRQUFRLEVBQUU7aUJBQ1YsTUFBTSxDQUFDLEtBQUssQ0FDWCxpSEFBaUgsQ0FDbEgsQ0FBQztZQUNKLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDOUIsSUFBSTtxQkFDRCxNQUFNLENBQUMsV0FBVyxDQUFDO3FCQUNuQixRQUFRLEVBQUU7cUJBQ1YsTUFBTSxDQUFDLEtBQUssQ0FDWCxpSEFBaUgsQ0FDbEgsQ0FBQztZQUNOLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvL1xuLy8gVGVzdHMgZm9yIFdhbGxldHNcbi8vXG4vLyBDb3B5cmlnaHQgMjAxNCwgQml0R28sIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vL1xuXG5pbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgeyBiaXRjb2luIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmNvbnN0IHsgSEROb2RlLCBoZFBhdGggfSA9IGJpdGNvaW47XG5cbmRlc2NyaWJlKCdIRE5vZGUnLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdkZXJpdmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBkZXJpdmUgdGhlc2Ugc3RhbmRhcmQgdGVzdCB2ZWN0b3JzJywgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGhkbm9kZSA9IEhETm9kZS5mcm9tU2VlZEJ1ZmZlcihCdWZmZXIuZnJvbSgnMDAwMTAyMDMwNDA1MDYwNzA4MDkwYTBiMGMwZDBlMGYnLCAnaGV4JykpO1xuICAgICAgbGV0IHBhdGggPSBoZFBhdGgoaGRub2RlKTtcbiAgICAgIHBhdGhcbiAgICAgICAgLmRlcml2ZSgnbS8wLzAnKVxuICAgICAgICAudG9CYXNlNTgoKVxuICAgICAgICAuc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICd4cHJ2OXd3N3NNRkx6Sk16dXIyb0VRREI2NDJmYnNNUzRxNkpScmFNVlRyTTliVFdCcTdORFM4WnBtc0tWQjRZRjNtWmVjcWF4MWZqbnNQRjE5eG5zSk5mUnA0UlN5ZXhhY1VMWE1Lb3dTQUNUUmMnXG4gICAgICAgICk7XG4gICAgICBwYXRoXG4gICAgICAgIC5kZXJpdmUoXCJtLzAnLzFcIilcbiAgICAgICAgLnRvQmFzZTU4KClcbiAgICAgICAgLnNob3VsZC5lcXVhbChcbiAgICAgICAgICAneHBydjl3VFltTUZkVjIzTjJUZE5HNTczUW9Fc2ZScldLUWdXZWlibUxudHpuaWF0WnZSOUJtTG52U3hxdTUzS3cxVW1ZUHhMZ2JveVpRYVh3VENnOE1TWTNIMkVVNHBXY1FEblJuclZBMXhlOGZzJ1xuICAgICAgICApO1xuICAgICAgcGF0aFxuICAgICAgICAuZGVyaXZlKFwibS8wJy8xLzInLzIvMTAwMDAwMDAwMFwiKVxuICAgICAgICAudG9CYXNlNTgoKVxuICAgICAgICAuc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICd4cHJ2QTQxejd6b2dWVnd4VlNnZEtVSER5MVNLbWRiNTMzUGpEejdKNk42bVY2dVMzemUxYWk4RkhhOGttSFNjR3BXbWo0V2dnTHlRamdQaWUxckZTcnVvVWloVVpSRVBTTDM5VU5kRTNCQkR1NzYnXG4gICAgICAgICk7XG4gICAgICBwYXRoXG4gICAgICAgIC5kZXJpdmUoXCJtLzAnLzEvMicvMi8xMDAwMDAwMDAwXCIpXG4gICAgICAgIC5uZXV0ZXJlZCgpXG4gICAgICAgIC50b0Jhc2U1OCgpXG4gICAgICAgIC5zaG91bGQuZXF1YWwoXG4gICAgICAgICAgJ3hwdWI2SDFMWFdMYUtzV0Zodm02UlZwRUw5UDRLZlJaU1c3YWJEMnR0a1dQM1NTUXZueUE4RlNWcU5URWNZRmdKUzJVYUZjeHVwSGlZa3JvNDlTOHlHYXNUdlhFWUJWUGFtaEdXNmNGSm9kclRIeSdcbiAgICAgICAgKTtcbiAgICAgIGhkbm9kZSA9IHBhdGguZGVyaXZlKFwibS8wJy8xLzInXCIpLm5ldXRlcmVkKCk7XG4gICAgICBwYXRoID0gaGRQYXRoKGhkbm9kZSk7XG4gICAgICBwYXRoXG4gICAgICAgIC5kZXJpdmUoJ20vMi8xMDAwMDAwMDAwJylcbiAgICAgICAgLnRvQmFzZTU4KClcbiAgICAgICAgLnNob3VsZC5lcXVhbChcbiAgICAgICAgICAneHB1YjZIMUxYV0xhS3NXRmh2bTZSVnBFTDlQNEtmUlpTVzdhYkQydHRrV1AzU1NRdm55QThGU1ZxTlRFY1lGZ0pTMlVhRmN4dXBIaVlrcm80OVM4eUdhc1R2WEVZQlZQYW1oR1c2Y0ZKb2RyVEh5J1xuICAgICAgICApO1xuXG4gICAgICAvLyBtYWtlIHN1cmUgY2FjaGluZyBkb2VzIG5vdCBvdmVyY2FjaGVcbiAgICAgIGxldCBoZG5vZGUyID0gSEROb2RlLmZyb21TZWVkQnVmZmVyKEJ1ZmZlci5mcm9tKCcwMDAxMDIwMzA0MDUwNjA3MDgwOTBhMGIwYzBkMGUwZScsICdoZXgnKSk7XG4gICAgICBsZXQgcGF0aDIgPSBoZFBhdGgoaGRub2RlMik7XG4gICAgICBwYXRoMlxuICAgICAgICAuZGVyaXZlKCdtLzAvMCcpXG4gICAgICAgIC50b0Jhc2U1OCgpXG4gICAgICAgIC5zaG91bGQuZXF1YWwoXG4gICAgICAgICAgJ3hwcnY5d1RXOEpHYXczTExwcVlHMzVmNFdkV0E3eUY1VUZOc3A1UXB0ZHdoVTJ1eTdYYXJSVXJaeDJBYlBmdDdWb2N4QWRWbVl4dmlZdmhKYlYxRWVZMnlpREt1OGdTaXB3VUU2VFpvUXNqTEFMTCdcbiAgICAgICAgKTtcbiAgICAgIGhkbm9kZTIgPSBwYXRoMi5kZXJpdmUoXCJtLzAnLzEvMidcIikubmV1dGVyZWQoKTtcbiAgICAgIHBhdGgyID0gaGRQYXRoKGhkbm9kZTIpO1xuICAgICAgcGF0aDJcbiAgICAgICAgLmRlcml2ZSgnbS8yLzEwMDAwMDAwMDAnKVxuICAgICAgICAudG9CYXNlNTgoKVxuICAgICAgICAuc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICd4cHViNkZpS05FY1EyNVVaVjNGVTlxWHU0Nmk1bnZvQUE2eldSeGE5M3pXQWRaVFQySllhNWZSRFI2Qkp6eXZiWk5nTk5WVGVzcjNpRUZuUnJLY3FrVU5ld2lnNGFBUktCSDRBVXhmdDVZWFRHOVgnXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgndXNlcyBjYWNoaW5nIGZvciBwcmV2aW91c2x5IGRlcml2ZWQga2V5cyAoaGFyZGVuZWQpJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaGRub2RlID0gSEROb2RlLmZyb21TZWVkQnVmZmVyKEJ1ZmZlci5mcm9tKCcwMDAxMDMwMzA0MDUwNjA3MDgwOTBhMGIwYzBkMGUwZicsICdoZXgnKSk7XG4gICAgICBjb25zdCBwYXRoID0gaGRQYXRoKGhkbm9kZSk7XG4gICAgICBwYXRoXG4gICAgICAgIC5kZXJpdmUoXCJtLzEvMicvMy80XCIpXG4gICAgICAgIC50b0Jhc2U1OCgpXG4gICAgICAgIC5zaG91bGQuZXF1YWwoXG4gICAgICAgICAgJ3hwcnZBMVB1ZFZQUlpRRmNmZnR6dUh0TUd3aHMzc2l3SFRLejJZam9KY1ZjaHJ6N2V1Z3lXOHJpaWF4WVJ5ZzFvWGR6R3hnRlExTno0U21va2o3cGk4TnNXWVRRd05xV1hpUmRlMkp2MzdYd25EWCdcbiAgICAgICAgKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7XG4gICAgICAgIHBhdGhcbiAgICAgICAgICAuZGVyaXZlKFwibS8xLzInLzMvNFwiKVxuICAgICAgICAgIC50b0Jhc2U1OCgpXG4gICAgICAgICAgLnNob3VsZC5lcXVhbChcbiAgICAgICAgICAgICd4cHJ2QTFQdWRWUFJaUUZjZmZ0enVIdE1Hd2hzM3Npd0hUS3oyWWpvSmNWY2hyejdldWd5VzhyaWlheFlSeWcxb1hkekd4Z0ZRMU56NFNtb2tqN3BpOE5zV1lUUXdOcVdYaVJkZTJKdjM3WHduRFgnXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCd1c2VzIGNhY2hpbmcgZm9yIHByZXZpb3VzbHkgZGVyaXZlZCBrZXlzIChwdWJsaWMpJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaGRub2RlID0gSEROb2RlLmZyb21TZWVkQnVmZmVyKEJ1ZmZlci5mcm9tKCcwMDAxMDMwMzA0MDUwNjA3MDgwOTBhMGIwYzBkMGUwZicsICdoZXgnKSkubmV1dGVyZWQoKTtcbiAgICAgIGNvbnN0IHBhdGggPSBoZFBhdGgoaGRub2RlKTtcbiAgICAgIHBhdGhcbiAgICAgICAgLmRlcml2ZSgnbS8wLzEvMi8zJylcbiAgICAgICAgLnRvQmFzZTU4KClcbiAgICAgICAgLnNob3VsZC5lcXVhbChcbiAgICAgICAgICAneHB1YjZGNDZ5U1BZZXlmY0p6RVpWUzJ6V1ZueDRhaTVlU1JiRlhrZG0zRENlekY4alQxekUzNUw0U0pic01QeUNTYnlXcHBpOXR1U0g2UHpBTXhlNXZXSFBSOEJwc3R0M3R5dzVHQnFlU1hRTEI1J1xuICAgICAgICApO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHtcbiAgICAgICAgcGF0aFxuICAgICAgICAgIC5kZXJpdmUoJ20vMC8xLzIvMycpXG4gICAgICAgICAgLnRvQmFzZTU4KClcbiAgICAgICAgICAuc2hvdWxkLmVxdWFsKFxuICAgICAgICAgICAgJ3hwdWI2RjQ2eVNQWWV5ZmNKekVaVlMyeldWbng0YWk1ZVNSYkZYa2RtM0RDZXpGOGpUMXpFMzVMNFNKYnNNUHlDU2J5V3BwaTl0dVNINlB6QU14ZTV2V0hQUjhCcHN0dDN0eXc1R0JxZVNYUUxCNSdcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19Выполнить команду
Для локальной разработки. Не используйте в интернете!