PHP WebShell

Текущая директория: /opt/BitGoJS/modules/utxo-staking/dist/test/unit/coreDao

Просмотр файла: descriptor.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;
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
const assert = __importStar(require("assert"));
const utxolib = __importStar(require("@bitgo/utxo-lib"));
const wasm_miniscript_1 = require("@bitgo/wasm-miniscript");
const testutil_1 = require("@bitgo/utxo-core/testutil");
const coreDao_1 = require("../../../src/coreDao");
const utils_1 = require("./utils");
describe('descriptor', function () {
    const baseFixturePath = 'test/fixtures/coreDao/descriptor/';
    const rootWalletKeys = utxolib.testutil.getDefaultWalletKeys();
    const key1 = rootWalletKeys.triple[0];
    const key2 = rootWalletKeys.triple[1];
    const key3 = rootWalletKeys.triple[2];
    const validLocktime = 2048;
    it('should fail if m is longer than the number of keys or not at least 1', function () {
        assert.throws(() => {
            (0, coreDao_1.createMultiSigDescriptor)('sh', validLocktime, 3, [key1, key2], false);
        });
        assert.throws(() => {
            (0, coreDao_1.createMultiSigDescriptor)('sh', validLocktime, 0, [key1, key2], false);
        });
    });
    it('should fail if locktime is invalid', function () {
        assert.throws(() => {
            (0, coreDao_1.createMultiSigDescriptor)('sh', 0, 2, [key1, key2], false);
        });
    });
    async function runTestForParams(scriptType, m, keys) {
        const fixturePath = baseFixturePath + `${scriptType}-${m}of${keys.length}`;
        describe(`should create a ${m} of ${keys.length} multi-sig ${scriptType} descriptor`, function () {
            it('has expected descriptor string', async function () {
                const descriptorString = (0, coreDao_1.createMultiSigDescriptor)(scriptType, validLocktime, m, keys, false);
                assert.strictEqual(descriptorString, await (0, testutil_1.getFixture)(fixturePath + `-string.txt`, descriptorString), descriptorString);
            });
            it('has expected AST', async function () {
                const descriptor = wasm_miniscript_1.Descriptor.fromString((0, coreDao_1.createMultiSigDescriptor)(scriptType, validLocktime, m, keys, false), 'derivable');
                assert.deepStrictEqual(descriptor.node(), await (0, testutil_1.getFixture)(fixturePath + '-ast.json', descriptor.node()));
            });
            it('has expected asm', async function () {
                const descriptor = wasm_miniscript_1.Descriptor.fromString((0, coreDao_1.createMultiSigDescriptor)(scriptType, validLocktime, m, keys, false), 'derivable');
                const asmString = descriptor.atDerivationIndex(0).toAsmString();
                assert.strictEqual(asmString, await (0, testutil_1.getFixture)(fixturePath + '-asm.txt', asmString), asmString);
            });
            it('can be signed', async function () {
                // Derive the script from the descriptor
                const descriptor = wasm_miniscript_1.Descriptor.fromString((0, coreDao_1.createMultiSigDescriptor)(scriptType, validLocktime, m, keys, false), 'derivable');
                const descriptorAt0 = descriptor.atDerivationIndex(0);
                const script = Buffer.from(descriptorAt0.scriptPubkey());
                // Make the prevTx
                const prevPsbt = utxolib.testutil.constructPsbt([{ scriptType: 'p2wsh', value: BigInt(1.1e8) }], [{ script: script.toString('hex'), value: BigInt(1e8) }], utxolib.networks.bitcoin, rootWalletKeys, 'fullsigned');
                const prevTx = prevPsbt.finalizeAllInputs().extractTransaction();
                // Create the PSBT and sign
                const psbt = Object.assign(new utxolib.Psbt({ network: utxolib.networks.bitcoin }), {
                    locktime: validLocktime,
                });
                psbt.addInput({
                    hash: prevTx.getId(),
                    index: 0,
                    sequence: 0xfffffffe,
                });
                if (scriptType === 'sh-wsh') {
                    psbt.updateInput(0, { witnessUtxo: { script, value: BigInt(1e8) } });
                }
                else {
                    psbt.updateInput(0, { nonWitnessUtxo: prevTx.toBuffer() });
                }
                psbt.addOutput({ script, value: BigInt(0.9e8) });
                (0, utils_1.updateInputWithDescriptor)(psbt, 0, descriptorAt0);
                keys.forEach((signer, i) => {
                    if (i >= m) {
                        return;
                    }
                    psbt.signAllInputsHD(signer);
                });
                // Get the fully signed transaction and check
                const signedTx = (0, utils_1.finalizePsbt)(psbt).extractTransaction().toBuffer();
                assert.strictEqual(signedTx.toString('hex'), await (0, testutil_1.getFixture)(fixturePath + '-tx.txt', signedTx.toString('hex')));
            });
        });
    }
    runTestForParams('sh', 2, [key1, key2]);
    runTestForParams('sh-wsh', 2, [key1, key2]);
    runTestForParams('sh', 3, [key1, key2, key3]);
    runTestForParams('wsh', 3, [key1, key2, key3]);
    it('should recreate the script used in testnet staking transaction', function () {
        // Source: https://mempool.space/testnet/address/2MxTi2EhHKgdJFKRTBttVGGxir9ZzjmKCXw
        // 2 of 2 multisig
        const timelock = 'fce4cb66';
        const pubkey1 = '03ecb6d4b7f5d56962e547fc52dd588359f5729c0ba856d6978b84723895a16691';
        const pubkey2 = '024aaea25d82b1db2be030a05b641d6302e48ed652b1ca9cb08a67267fcbb56747';
        const redeemScriptASM = [
            'OP_PUSHBYTES_4',
            timelock,
            'OP_CLTV',
            'OP_DROP',
            'OP_PUSHNUM_2',
            'OP_PUSHBYTES_33',
            pubkey1,
            'OP_PUSHBYTES_33',
            pubkey2,
            'OP_PUSHNUM_2',
            'OP_CHECKMULTISIG',
        ].join(' ');
        const decodedTimelock = (0, coreDao_1.decodeTimelock)(Buffer.from(timelock, 'hex'));
        const descriptor = (0, coreDao_1.createMultiSigDescriptor)('sh', decodedTimelock, 2, [Buffer.from(pubkey1, 'hex'), Buffer.from(pubkey2, 'hex')], false);
        const descriptorASM = wasm_miniscript_1.Descriptor.fromString(descriptor, 'definite').toAsmString();
        assert.deepStrictEqual(redeemScriptASM, descriptorASM);
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9jb3JlRGFvL2Rlc2NyaXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUM7QUFFakMseURBQTJDO0FBQzNDLDREQUFvRDtBQUNwRCx3REFBdUQ7QUFFdkQsa0RBQWdGO0FBRWhGLG1DQUFrRTtBQUVsRSxRQUFRLENBQUMsWUFBWSxFQUFFO0lBQ3JCLE1BQU0sZUFBZSxHQUFHLG1DQUFtQyxDQUFDO0lBQzVELE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUMvRCxNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEMsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0QyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUM7SUFFM0IsRUFBRSxDQUFDLHNFQUFzRSxFQUFFO1FBQ3pFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ2pCLElBQUEsa0NBQXdCLEVBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEUsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNqQixJQUFBLGtDQUF3QixFQUFDLElBQUksRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hFLENBQUMsQ0FBQyxDQUFDO0lB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Q2xCLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQztRQUM1QixNQUFNLE9BQU8sR0FBRyxvRUFBb0UsQ0FBQztRQUNyRixNQUFNLE9BQU8sR0FBRyxvRUFBb0UsQ0FBQztRQUNyRixNQUFNLGVBQWUsR0FBRztZQUN0QixnQkFBZ0I7WUFDaEIsUUFBUTtZQUNSLFNBQVM7WUFDVCxTQUFTO1lBQ1QsY0FBYztZQUNkLGlCQUFpQjtZQUNqQixPQUFPO1lBQ1AsaUJBQWlCO1lBQ2pCLE9BQU87WUFDUCxjQUFjO1lBQ2Qsa0JBQWtCO1NBQ25CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRVosTUFBTSxlQUFlLEdBQUcsSUFBQSx3QkFBYyxFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDckUsTUFBTSxVQUFVLEdBQUcsSUFBQSxrQ0FBd0IsRUFDekMsSUFBSSxFQUNKLGVBQWUsRUFDZixDQUFDLEVBQ0QsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUMxRCxLQUFLLENBQ04sQ0FBQztRQUNGLE1BQU0sYUFBYSxHQUFHLDRCQUFVLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNsRixNQUFNLENBQUMsZUFBZSxDQUFDLGVBQWUsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUN6RCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IERlc2NyaXB0b3IgfSBmcm9tICdAYml0Z28vd2FzbS1taW5pc2NyaXB0JztcbmltcG9ydCB7IGdldEZpeHR1cmUgfSBmcm9tICdAYml0Z28vdXR4by1jb3JlL3Rlc3R1dGlsJztcblxuaW1wb3J0IHsgY3JlYXRlTXVsdGlTaWdEZXNjcmlwdG9yLCBkZWNvZGVUaW1lbG9jayB9IGZyb20gJy4uLy4uLy4uL3NyYy9jb3JlRGFvJztcblxuaW1wb3J0IHsgZmluYWxpemVQc2J0LCB1cGRhdGVJbnB1dFdpdGhEZXNjcmlwdG9yIH0gZnJvbSAnLi91dGlscyc7XG5cbmRlc2NyaWJlKCdkZXNjcmlwdG9yJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBiYXNlRml4dHVyZVBhdGggPSAndGVzdC9maXh0dXJlcy9jb3JlRGFvL2Rlc2NyaXB0b3IvJztcbiAgY29uc3Qgcm9vdFdhbGxldEtleXMgPSB1dHhvbGliLnRlc3R1dGlsLmdldERlZmF1bHRXYWxsZXRLZXlzKCk7XG4gIGNvbnN0IGtleTEgPSByb290V2FsbGV0S2V5cy50cmlwbGVbMF07XG4gIGNvbnN0IGtleTIgPSByb290V2FsbGV0S2V5cy50cmlwbGVbMV07XG4gIGNvbnN0IGtleTMgPSByb290V2FsbGV0S2V5cy50cmlwbGVbMl07XG4gIGNvbnN0IHZhbGlkTG9ja3RpbWUgPSAyMDQ4O1xuXG4gIGl0KCdzaG91bGQgZmFpbCBpZiBtIGlzIGxvbmdlciB0aGFuIHRoZSBudW1iZXIgb2Yga2V5cyBvciBub3QgYXQgbGVhc3QgMScsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgIGNyZWF0ZU11bHRpU2lnRGVzY3JpcHRvcignc2gnLCB2YWxpZExvY2t0aW1lLCAzLCBba2V5MSwga2V5Ml0sIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgY3JlYXRlTXVsdGlTaWdEZXNjcmlwdG9yKCdzaCcsIHZhbGlkTG9ja3RpbWUsIDAsIFtrZXkxLCBrZXkyXSwgZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGZhaWwgaWYgbG9ja3RpbWUgaXMgaW52YWxpZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgIGNyZWF0ZU11bHRpU2lnRGVzY3JpcHRvcignc2gnLCAwLCAyLCBba2V5MSwga2V5Ml0sIGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gcnVuVGVzdEZvclBhcmFtcyhzY3JpcHRUeXBlOiAnc2gnIHwgJ3NoLXdzaCcgfCAnd3NoJywgbTogbnVtYmVyLCBrZXlzOiB1dHhvbGliLkJJUDMySW50ZXJmYWNlW10pIHtcbiAgICBjb25zdCBmaXh0dXJlUGF0aCA9IGJhc2VGaXh0dXJlUGF0aCArIGAke3NjcmlwdFR5cGV9LSR7bX1vZiR7a2V5cy5sZW5ndGh9YDtcbiAgICBkZXNjcmliZShgc2hvdWxkIGNyZWF0ZSBhICR7bX0gb2YgJHtrZXlzLmxlbmd0aH0gbXVsdGktc2lnICR7c2NyaXB0VHlwZX0gZGVzY3JpcHRvcmAsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdoYXMgZXhwZWN0ZWQgZGVzY3JpcHRvciBzdHJpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3JTdHJpbmcgPSBjcmVhdGVNdWx0aVNpZ0Rlc2NyaXB0b3Ioc2NyaXB0VHlwZSwgdmFsaWRMb2NrdGltZSwgbSwga2V5cywgZmFsc2UpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoXG4gICAgICAgICAgZGVzY3JpcHRvclN0cmluZyxcbiAgICAgICAgICBhd2FpdCBnZXRGaXh0dXJlKGZpeHR1cmVQYXRoICsgYC1zdHJpbmcudHh0YCwgZGVzY3JpcHRvclN0cmluZyksXG4gICAgICAgICAgZGVzY3JpcHRvclN0cmluZ1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdoYXMgZXhwZWN0ZWQgQVNUJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gRGVzY3JpcHRvci5mcm9tU3RyaW5nKFxuICAgICAgICAgIGNyZWF0ZU11bHRpU2lnRGVzY3JpcHRvcihzY3JpcHRUeXBlLCB2YWxpZExvY2t0aW1lLCBtLCBrZXlzLCBmYWxzZSksXG4gICAgICAgICAgJ2Rlcml2YWJsZSdcbiAgICAgICAgKTtcblxuICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGRlc2NyaXB0b3Iubm9kZSgpLCBhd2FpdCBnZXRGaXh0dXJlKGZpeHR1cmVQYXRoICsgJy1hc3QuanNvbicsIGRlc2NyaXB0b3Iubm9kZSgpKSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2hhcyBleHBlY3RlZCBhc20nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLmZyb21TdHJpbmcoXG4gICAgICAgICAgY3JlYXRlTXVsdGlTaWdEZXNjcmlwdG9yKHNjcmlwdFR5cGUsIHZhbGlkTG9ja3RpbWUsIG0sIGtleXMsIGZhbHNlKSxcbiAgICAgICAgICAnZGVyaXZhYmxlJ1xuICAgICAgICApO1xuICAgICAgICBjb25zdCBhc21TdHJpbmcgPSBkZXNjcmlwdG9yLmF0RGVyaXZhdGlvbkluZGV4KDApLnRvQXNtU3RyaW5nKCk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChhc21TdHJpbmcsIGF3YWl0IGdldEZpeHR1cmUoZml4dHVyZVBhdGggKyAnLWFzbS50eHQnLCBhc21TdHJpbmcpLCBhc21TdHJpbmcpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdjYW4gYmUgc2lnbmVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBEZXJpdmUgdGhlIHNjcmlwdCBmcm9tIHRoZSBkZXNjcmlwdG9yXG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLmZyb21TdHJpbmcoXG4gICAgICAgICAgY3JlYXRlTXVsdGlTaWdEZXNjcmlwdG9yKHNjcmlwdFR5cGUsIHZhbGlkTG9ja3RpbWUsIG0sIGtleXMsIGZhbHNlKSxcbiAgICAgICAgICAnZGVyaXZhYmxlJ1xuICAgICAgICApO1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yQXQwID0gZGVzY3JpcHRvci5hdERlcml2YXRpb25JbmRleCgwKTtcbiAgICAgICAgY29uc3Qgc2NyaXB0ID0gQnVmZmVyLmZyb20oZGVzY3JpcHRvckF0MC5zY3JpcHRQdWJrZXkoKSk7XG5cbiAgICAgICAgLy8gTWFrZSB0aGUgcHJldlR4XG4gICAgICAgIGNvbnN0IHByZXZQc2J0ID0gdXR4b2xpYi50ZXN0dXRpbC5jb25zdHJ1Y3RQc2J0KFxuICAgICAgICAgIFt7IHNjcmlwdFR5cGU6ICdwMndzaCcsIHZhbHVlOiBCaWdJbnQoMS4xZTgpIH1dLFxuICAgICAgICAgIFt7IHNjcmlwdDogc2NyaXB0LnRvU3RyaW5nKCdoZXgnKSwgdmFsdWU6IEJpZ0ludCgxZTgpIH1dLFxuICAgICAgICAgIHV0eG9saWIubmV0d29ya3MuYml0Y29pbixcbiAgICAgICAgICByb290V2FsbGV0S2V5cyxcbiAgICAgICAgICAnZnVsbHNpZ25lZCdcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcHJldlR4ID0gcHJldlBzYnQuZmluYWxpemVBbGxJbnB1dHMoKS5leHRyYWN0VHJhbnNhY3Rpb24oKTtcblxuICAgICAgICAvLyBDcmVhdGUgdGhlIFBTQlQgYW5kIHNpZ25cbiAgICAgICAgY29uc3QgcHNidCA9IE9iamVjdC5hc3NpZ24obmV3IHV0eG9saWIuUHNidCh7IG5ldHdvcms6IHV0eG9saWIubmV0d29ya3MuYml0Y29pbiB9KSwge1xuICAgICAgICAgIGxvY2t0aW1lOiB2YWxpZExvY2t0aW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgcHNidC5hZGRJbnB1dCh7XG4gICAgICAgICAgaGFzaDogcHJldlR4LmdldElkKCksXG4gICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgICAgc2VxdWVuY2U6IDB4ZmZmZmZmZmUsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoc2NyaXB0VHlwZSA9PT0gJ3NoLXdzaCcpIHtcbiAgICAgICAgICBwc2J0LnVwZGF0ZUlucHV0KDAsIHsgd2l0bmVzc1V0eG86IHsgc2NyaXB0LCB2YWx1ZTogQmlnSW50KDFlOCkgfSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwc2J0LnVwZGF0ZUlucHV0KDAsIHsgbm9uV2l0bmVzc1V0eG86IHByZXZUeC50b0J1ZmZlcigpIH0pO1xuICAgICAgICB9XG4gICAgICAgIHBzYnQuYWRkT3V0cHV0KHsgc2NyaXB0LCB2YWx1ZTogQmlnSW50KDAuOWU4KSB9KTtcbiAgICAgICAgdXBkYXRlSW5wdXRXaXRoRGVzY3JpcHRvcihwc2J0LCAwLCBkZXNjcmlwdG9yQXQwKTtcbiAgICAgICAga2V5cy5mb3JFYWNoKChzaWduZXIsIGkpID0+IHtcbiAgICAgICAgICBpZiAoaSA+PSBtKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHBzYnQuc2lnbkFsbElucHV0c0hEKHNpZ25lcik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEdldCB0aGUgZnVsbHkgc2lnbmVkIHRyYW5zYWN0aW9uIGFuZCBjaGVja1xuICAgICAgICBjb25zdCBzaWduZWRUeCA9IGZpbmFsaXplUHNidChwc2J0KS5leHRyYWN0VHJhbnNhY3Rpb24oKS50b0J1ZmZlcigpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoXG4gICAgICAgICAgc2lnbmVkVHgudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIGF3YWl0IGdldEZpeHR1cmUoZml4dHVyZVBhdGggKyAnLXR4LnR4dCcsIHNpZ25lZFR4LnRvU3RyaW5nKCdoZXgnKSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcnVuVGVzdEZvclBhcmFtcygnc2gnLCAyLCBba2V5MSwga2V5Ml0pO1xuICBydW5UZXN0Rm9yUGFyYW1zKCdzaC13c2gnLCAyLCBba2V5MSwga2V5Ml0pO1xuICBydW5UZXN0Rm9yUGFyYW1zKCdzaCcsIDMsIFtrZXkxLCBrZXkyLCBrZXkzXSk7XG4gIHJ1blRlc3RGb3JQYXJhbXMoJ3dzaCcsIDMsIFtrZXkxLCBrZXkyLCBrZXkzXSk7XG5cbiAgaXQoJ3Nob3VsZCByZWNyZWF0ZSB0aGUgc2NyaXB0IHVzZWQgaW4gdGVzdG5ldCBzdGFraW5nIHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIC8vIFNvdXJjZTogaHR0cHM6Ly9tZW1wb29sLnNwYWNlL3Rlc3RuZXQvYWRkcmVzcy8yTXhUaTJFaEhLZ2RKRktSVEJ0dFZHR3hpcjlaemptS0NYd1xuICAgIC8vIDIgb2YgMiBtdWx0aXNpZ1xuICAgIGNvbnN0IHRpbWVsb2NrID0gJ2ZjZTRjYjY2JztcbiAgICBjb25zdCBwdWJrZXkxID0gJzAzZWNiNmQ0YjdmNWQ1Njk2MmU1NDdmYzUyZGQ1ODgzNTlmNTcyOWMwYmE4NTZkNjk3OGI4NDcyMzg5NWExNjY5MSc7XG4gICAgY29uc3QgcHVia2V5MiA9ICcwMjRhYWVhMjVkODJiMWRiMmJlMDMwYTA1YjY0MWQ2MzAyZTQ4ZWQ2NTJiMWNhOWNiMDhhNjcyNjdmY2JiNTY3NDcnO1xuICAgIGNvbnN0IHJlZGVlbVNjcmlwdEFTTSA9IFtcbiAgICAgICdPUF9QVVNIQllURVNfNCcsXG4gICAgICB0aW1lbG9jayxcbiAgICAgICdPUF9DTFRWJyxcbiAgICAgICdPUF9EUk9QJyxcbiAgICAgICdPUF9QVVNITlVNXzInLFxuICAgICAgJ09QX1BVU0hCWVRFU18zMycsXG4gICAgICBwdWJrZXkxLFxuICAgICAgJ09QX1BVU0hCWVRFU18zMycsXG4gICAgICBwdWJrZXkyLFxuICAgICAgJ09QX1BVU0hOVU1fMicsXG4gICAgICAnT1BfQ0hFQ0tNVUxUSVNJRycsXG4gICAgXS5qb2luKCcgJyk7XG5cbiAgICBjb25zdCBkZWNvZGVkVGltZWxvY2sgPSBkZWNvZGVUaW1lbG9jayhCdWZmZXIuZnJvbSh0aW1lbG9jaywgJ2hleCcpKTtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gY3JlYXRlTXVsdGlTaWdEZXNjcmlwdG9yKFxuICAgICAgJ3NoJyxcbiAgICAgIGRlY29kZWRUaW1lbG9jayxcbiAgICAgIDIsXG4gICAgICBbQnVmZmVyLmZyb20ocHVia2V5MSwgJ2hleCcpLCBCdWZmZXIuZnJvbShwdWJrZXkyLCAnaGV4JyldLFxuICAgICAgZmFsc2VcbiAgICApO1xuICAgIGNvbnN0IGRlc2NyaXB0b3JBU00gPSBEZXNjcmlwdG9yLmZyb21TdHJpbmcoZGVzY3JpcHRvciwgJ2RlZmluaXRlJykudG9Bc21TdHJpbmcoKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJlZGVlbVNjcmlwdEFTTSwgZGVzY3JpcHRvckFTTSk7XG4gIH0pO1xufSk7XG4iXX0=

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


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