PHP WebShell

Текущая директория: /opt/BitGoJS/modules/bitgo/dist/test/v2/unit/tss

Просмотр файла: ecdsa.js

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const sdk_core_1 = require("@bitgo/sdk-core");
const sdk_lib_mpc_1 = require("@bitgo/sdk-lib-mpc");
const openpgp = require("openpgp");
const should = require("should");
const sdk_test_1 = require("@bitgo/sdk-test");
const src_1 = require("../../../../src");
const helpers_1 = require("./helpers");
const ecdsaFixtures_1 = require("../../fixtures/tss/ecdsaFixtures");
const nock = require("nock");
const encryptNShare = sdk_core_1.ECDSAMethods.encryptNShare;
const createCombinedKey = sdk_core_1.ECDSAMethods.createCombinedKey;
describe('Ecdsa tss helper functions tests', function () {
    let mpc;
    let userKeyShare;
    let backupKeyShare;
    let bitgoKeyShare;
    let userKey;
    let backupKey;
    let bitgoKey;
    let userGpgKeypair;
    let backupGpgKeypair;
    let bitgoGpgKeypair;
    let commonKeychain;
    before(async function () {
        mpc = new sdk_core_1.Ecdsa();
        userKeyShare = ecdsaFixtures_1.keyShares.userKeyShare;
        backupKeyShare = ecdsaFixtures_1.keyShares.backupKeyShare;
        bitgoKeyShare = ecdsaFixtures_1.keyShares.bitgoKeyShare;
        userKey = mpc.keyCombine(userKeyShare.pShare, [backupKeyShare.nShares[1], bitgoKeyShare.nShares[1]]);
        backupKey = mpc.keyCombine(backupKeyShare.pShare, [userKeyShare.nShares[2], bitgoKeyShare.nShares[2]]);
        bitgoKey = mpc.keyCombine(bitgoKeyShare.pShare, [backupKeyShare.nShares[3], userKeyShare.nShares[3]]);
        (userKey.xShare.y + userKey.xShare.chaincode).should.equal(backupKey.xShare.y + backupKey.xShare.chaincode);
        (userKey.xShare.y + userKey.xShare.chaincode).should.equal(bitgoKey.xShare.y + bitgoKey.xShare.chaincode);
        commonKeychain = userKey.xShare.y + userKey.xShare.chaincode;
        const gpgKeypairPromises = [
            { name: 'user', email: 'user@bitgo.com' },
            { name: 'backup', email: 'backup@bitgo.com' },
            { name: 'bitgo', email: 'bitgo@bitgo.com' },
        ].map(async (user) => {
            return openpgp.generateKey({
                userIDs: [
                    {
                        name: user.name,
                        email: user.email,
                    },
                ],
                curve: 'secp256k1',
            });
        });
        const gpgKeypairs = await Promise.all(gpgKeypairPromises);
        userGpgKeypair = gpgKeypairs[0];
        backupGpgKeypair = gpgKeypairs[1];
        bitgoGpgKeypair = gpgKeypairs[2];
    });
    after(function () {
        nock.cleanAll();
    });
    describe('encryptNShare and decryptNShare', function () {
        after(function () {
            nock.cleanAll();
        });
        it('should encrypt n shares foreach user', async function () {
            for (let i = 2; i <= 3; i++) {
                const encryptedNShare = await sdk_core_1.ECDSAMethods.encryptNShare(userKeyShare, i, bitgoGpgKeypair.publicKey, userGpgKeypair);
                const decryptedNShare = await sdk_core_1.ECDSAMethods.decryptNShare({
                    nShare: encryptedNShare,
                    senderPublicArmor: userGpgKeypair.publicKey,
                    recipientPrivateArmor: bitgoGpgKeypair.privateKey,
                });
                decryptedNShare.u.should.equal(userKeyShare.nShares[i].u);
                const publicKey = userKeyShare.pShare.y + userKeyShare.pShare.chaincode;
                encryptedNShare.i.should.equal(i);
                encryptedNShare.vssProof.should.equal(userKeyShare.nShares[3].v);
                encryptedNShare.j.should.equal(1);
                encryptedNShare.publicShare.should.equal(publicKey);
            }
        });
        it('should error for invalid recipient', async function () {
            await encryptNShare(userKeyShare, 1, userGpgKeypair.privateKey, userGpgKeypair).should.be.rejectedWith('Invalid recipient');
            await encryptNShare(backupKeyShare, 2, userGpgKeypair.privateKey, userGpgKeypair).should.be.rejectedWith('Invalid recipient');
            await encryptNShare(bitgoKeyShare, 3, userGpgKeypair.privateKey, userGpgKeypair).should.be.rejectedWith('Invalid recipient');
        });
        it('should decrypt n share', async function () {
            const encryptedNShare = await sdk_core_1.ECDSAMethods.encryptNShare(userKeyShare, 3, bitgoGpgKeypair.publicKey, userGpgKeypair);
            const decryptedNShare = await sdk_core_1.ECDSAMethods.decryptNShare({
                nShare: encryptedNShare,
                recipientPrivateArmor: bitgoGpgKeypair.privateKey,
                senderPublicArmor: userGpgKeypair.publicKey,
            });
            decryptedNShare.i.should.equal(userKeyShare.nShares[3].i);
            decryptedNShare.j.should.equal(userKeyShare.nShares[3].j);
            decryptedNShare.n.should.equal(userKeyShare.nShares[3].n);
            decryptedNShare.u.should.equal(userKeyShare.nShares[3].u);
            decryptedNShare.y.should.equal(userKeyShare.nShares[3].y);
        });
    });
    describe('createCombinedKey', function () {
        after(function () {
            nock.cleanAll();
        });
        it('should create combined user key', async function () {
            const bitgoToUserShare = await sdk_core_1.ECDSAMethods.encryptNShare(bitgoKeyShare, 1, userGpgKeypair.publicKey, userGpgKeypair, false);
            const backupToUserShare = await sdk_core_1.ECDSAMethods.encryptNShare(backupKeyShare, 1, userGpgKeypair.publicKey, userGpgKeypair, false);
            const combinedUserKey = await createCombinedKey(userKeyShare, [
                {
                    nShare: bitgoToUserShare,
                    recipientPrivateArmor: userGpgKeypair.privateKey,
                    senderPublicArmor: bitgoGpgKeypair.publicKey,
                    isbs58Encoded: false,
                },
                {
                    nShare: backupToUserShare,
                    recipientPrivateArmor: userGpgKeypair.privateKey,
                    senderPublicArmor: backupGpgKeypair.publicKey,
                    isbs58Encoded: false,
                },
            ], commonKeychain);
            combinedUserKey.commonKeychain.should.equal(commonKeychain);
            combinedUserKey.signingMaterial.pShare.should.deepEqual(userKeyShare.pShare);
            should.exist(combinedUserKey.signingMaterial.backupNShare);
            combinedUserKey.signingMaterial.backupNShare?.should.deepEqual(backupKeyShare.nShares[1]);
            combinedUserKey.signingMaterial.bitgoNShare.should.deepEqual(bitgoKeyShare.nShares[1]);
            should.not.exist(combinedUserKey.signingMaterial.userNShare);
        });
        it('should create combined backup key', async function () {
            const bitgoToBackupShare = await encryptNShare(bitgoKeyShare, 2, backupGpgKeypair.publicKey, userGpgKeypair);
            const userToBackupShare = await encryptNShare(userKeyShare, 2, backupGpgKeypair.publicKey, userGpgKeypair);
            const combinedBackupKey = await createCombinedKey(backupKeyShare, [
                {
                    nShare: bitgoToBackupShare,
                    recipientPrivateArmor: backupGpgKeypair.privateKey,
                    senderPublicArmor: bitgoGpgKeypair.publicKey,
                },
                {
                    nShare: userToBackupShare,
                    recipientPrivateArmor: backupGpgKeypair.privateKey,
                    senderPublicArmor: userGpgKeypair.publicKey,
                },
            ], commonKeychain);
            combinedBackupKey.commonKeychain.should.equal(commonKeychain);
            combinedBackupKey.signingMaterial.pShare.should.deepEqual(backupKeyShare.pShare);
            should.exist(combinedBackupKey.signingMaterial.userNShare);
            combinedBackupKey.signingMaterial.userNShare?.should.deepEqual(userKeyShare.nShares[2]);
            combinedBackupKey.signingMaterial.bitgoNShare.should.deepEqual(bitgoKeyShare.nShares[2]);
            should.not.exist(combinedBackupKey.signingMaterial.backupNShare);
        });
        it('should fail if common keychains do not match', async function () {
            const bitgoToUserShare = await encryptNShare(bitgoKeyShare, 1, userGpgKeypair.publicKey, userGpgKeypair);
            const backupToUserShare = await encryptNShare(backupKeyShare, 1, userGpgKeypair.publicKey, userGpgKeypair);
            // this should fail to combine the keys because we pass in invalid common key chain
            await createCombinedKey(userKeyShare, [
                {
                    nShare: bitgoToUserShare,
                    recipientPrivateArmor: userGpgKeypair.privateKey,
                    senderPublicArmor: bitgoGpgKeypair.publicKey,
                },
                {
                    nShare: backupToUserShare,
                    recipientPrivateArmor: userGpgKeypair.privateKey,
                    senderPublicArmor: backupGpgKeypair.publicKey,
                },
            ], 'nottherightkeychain').should.be.rejectedWith('Common keychains do not match');
        });
        it('should fail if gpg keys are mismatched', async function () {
            const bitgoToUserShare = await encryptNShare(bitgoKeyShare, 1, userGpgKeypair.publicKey, userGpgKeypair);
            const backupToUserShare = await encryptNShare(backupKeyShare, 1, userGpgKeypair.publicKey, userGpgKeypair);
            await createCombinedKey(userKeyShare, [
                {
                    nShare: bitgoToUserShare,
                    recipientPrivateArmor: backupGpgKeypair.privateKey,
                    senderPublicArmor: bitgoGpgKeypair.publicKey,
                },
                {
                    nShare: backupToUserShare,
                    recipientPrivateArmor: userGpgKeypair.privateKey,
                    senderPublicArmor: backupGpgKeypair.publicKey,
                },
            ], 'nottherightkeychain').should.be.rejectedWith('Error decrypting message: Session key decryption failed.');
        });
    });
    describe('tss signing helper function', async function () {
        const bitgo = sdk_test_1.TestBitGo.decorate(src_1.BitGo, { env: 'mock' });
        bitgo.initializeTestVars();
        let wallet;
        const txRequest = {
            txRequestId: 'randomId',
            unsignedTxs: [{ signableHex: 'TOO MANY SECRETS', serializedTxHex: 'randomhex2' }],
            signatureShares: [
                {
                    from: 'bitgo',
                    to: 'user',
                    share: '',
                },
            ],
        };
        const signablePayload = Buffer.from(txRequest.unsignedTxs[0].signableHex, 'hex');
        before('initializes', async function () {
            const baseCoin = bitgo.coin('hteth');
            const walletData = {
                id: '5b34252f1bf349930e34020a00000000',
                coin: 'hteth',
                keys: [
                    '5b3424f91bf349930e34017500000000',
                    '5b3424f91bf349930e34017600000000',
                    '5b3424f91bf349930e34017700000000',
                ],
                coinSpecific: {},
            };
            wallet = new sdk_core_1.Wallet(bitgo, baseCoin, walletData);
        });
        describe('createUserSignShare:', async function () {
            let userToBitGoPaillierChallenge;
            let bitgoToUserPaillierChallenge;
            before(async function () {
                userToBitGoPaillierChallenge = sdk_lib_mpc_1.EcdsaTypes.serializePaillierChallenge({
                    p: await sdk_lib_mpc_1.EcdsaPaillierProof.generateP((0, sdk_core_1.hexToBigInt)(userKey.yShares[3].n)),
                });
                bitgoToUserPaillierChallenge = sdk_lib_mpc_1.EcdsaTypes.serializePaillierChallenge({
                    p: await sdk_lib_mpc_1.EcdsaPaillierProof.generateP((0, sdk_core_1.hexToBigInt)(userKey.xShare.n)),
                });
            });
            it('should succeed to create User SignShare', async function () {
                const xShare = mpc.appendChallenge(userKey.xShare, sdk_test_1.mockSerializedChallengeWithProofs, userToBitGoPaillierChallenge);
                const yShare = mpc.appendChallenge(userKey.yShares[3], { ntilde: xShare.ntilde, h1: xShare.h1, h2: xShare.h2 }, bitgoToUserPaillierChallenge);
                const userSignShare = await sdk_core_1.ECDSAMethods.createUserSignShare(xShare, yShare);
                userSignShare.should.have.properties(['wShare', 'kShare']);
                const { wShare, kShare } = userSignShare;
                wShare.should.have.property('gamma').and.be.a.String();
                wShare.should.have.property('w').and.be.a.String();
                wShare.should.have.property('k').and.be.a.String();
                wShare.should.have.property('ck').and.be.a.String();
                wShare.should.have.property('h2').and.be.a.String();
                wShare.should.have.property('h1').and.be.a.String();
                wShare.should.have.property('ntilde').and.be.a.String();
                wShare.should.have.property('y').and.be.a.String();
                wShare.should.have.property('n').and.be.a.String();
                wShare.should.have.property('m').and.be.a.String();
                wShare.should.have.property('l').and.be.a.String();
                wShare.should.have.property('i').and.be.a.Number();
                kShare['i'].should.equal(3);
                kShare['j'].should.equal(1);
                kShare.should.have.property('n').and.be.a.String();
                kShare.should.have.property('k').and.be.a.String();
                kShare.should.have.property('ntilde').and.be.a.String();
                kShare.should.have.property('h1').and.be.a.String();
                kShare.should.have.property('h2').and.be.a.String();
            });
            it('should fail if the Xshare doesnt belong to the User', async function () {
                let xShare = mpc.appendChallenge(userKey.xShare, sdk_test_1.mockSerializedChallengeWithProofs, userToBitGoPaillierChallenge);
                xShare = { ...xShare, i: 3 };
                const yShare = mpc.appendChallenge(userKey.yShares[3], {
                    ntilde: xShare.ntilde,
                    h1: xShare.h1,
                    h2: xShare.h2,
                }, bitgoToUserPaillierChallenge);
                await sdk_core_1.ECDSAMethods.createUserSignShare(xShare, yShare).should.be.rejectedWith(`Invalid XShare, XShare doesn't belong to the User`);
            });
        });
        describe('createUserGammaAndMuShare:', async function () {
            it('should succeed to create User Gamma Share and MuShare', async function () {
                const userShare = await sdk_core_1.ECDSAMethods.createUserGammaAndMuShare(ecdsaFixtures_1.gammaAndMuShareCreationParams.wShare, ecdsaFixtures_1.gammaAndMuShareCreationParams.aShare);
                userShare.should.have.properties(['muShare', 'gShare']);
                const { muShare, gShare } = userShare;
                muShare?.i?.should.equal(3);
                muShare?.j?.should.equal(1);
                muShare?.should.have.property('alpha').and.be.a.String();
                muShare?.should.have.property('mu').and.be.a.String();
                gShare?.should.have.property('beta').and.be.a.String();
                gShare?.should.have.property('nu').and.be.a.String();
            });
            it('should fail if the Wshare / AShare doesnt belong to the User', async function () {
                const invalidWShare = { ...ecdsaFixtures_1.gammaAndMuShareCreationParams.wShare, i: 3 };
                const invalidAShare = { ...ecdsaFixtures_1.gammaAndMuShareCreationParams.aShare, i: 3 };
                await sdk_core_1.ECDSAMethods.createUserGammaAndMuShare(invalidWShare, ecdsaFixtures_1.gammaAndMuShareCreationParams.aShare).should.be.rejectedWith(`Invalid WShare, doesn't belong to the User`);
                await sdk_core_1.ECDSAMethods.createUserGammaAndMuShare(ecdsaFixtures_1.gammaAndMuShareCreationParams.wShare, invalidAShare).should.be.rejectedWith(`Invalid AShare, is not from Bitgo to User`);
            });
        });
        describe('createUserOmicronAndDeltaShare:', async function () {
            it('should succeed to create User Omicron and Mu Shares', async function () {
                const userShare = await sdk_core_1.ECDSAMethods.createUserOmicronAndDeltaShare(ecdsaFixtures_1.omicronAndDeltaShareCreationParams.gShare);
                userShare.should.have.properties(['dShare', 'oShare']);
                const { dShare, oShare } = userShare;
                dShare?.i?.should.equal(3);
                dShare?.j?.should.equal(1);
                dShare?.should.have.property('delta').and.be.a.String();
                dShare?.should.have.property('Gamma').and.be.a.String();
                oShare?.should.have.property('omicron').and.be.a.String();
                oShare?.should.have.property('delta').and.be.a.String();
            });
            it(`should fail if the gShare doesn't belong to the User`, async function () {
                const invalidGShare = { ...ecdsaFixtures_1.omicronAndDeltaShareCreationParams.gShare, i: 3 };
                await sdk_core_1.ECDSAMethods.createUserOmicronAndDeltaShare(invalidGShare).should.be.rejectedWith(`Invalid GShare, doesn't belong to the User`);
            });
        });
        describe('createUserSignatureShare:', async function () {
            afterEach(function () {
                nock.cleanAll();
            });
            it('should succeed to create User Signature Share', async function () {
                const userSignatureShare = await sdk_core_1.ECDSAMethods.createUserSignatureShare(ecdsaFixtures_1.createUserSignatureParams.oShare, ecdsaFixtures_1.createUserSignatureParams.dShare, signablePayload);
                const { R, s, y, i } = userSignatureShare;
                i.should.be.Number();
                R.should.be.a.String();
                s.should.be.a.String();
                y.should.be.a.String();
            });
            it(`should fail if the OShare / dShare doesn't belong to the User`, async function () {
                const invalidOShare = { ...ecdsaFixtures_1.createUserSignatureParams.oShare, i: 3 };
                await sdk_core_1.ECDSAMethods.createUserSignatureShare(invalidOShare, ecdsaFixtures_1.createUserSignatureParams.dShare, signablePayload).should.be.rejectedWith(`Invalid OShare, doesn't belong to the User`);
                const invalidDShare = { ...ecdsaFixtures_1.createUserSignatureParams.dShare, i: 3 };
                await sdk_core_1.ECDSAMethods.createUserSignatureShare(ecdsaFixtures_1.createUserSignatureParams.oShare, invalidDShare, signablePayload).should.be.rejectedWith(`Invalid DShare, doesn't seem to be from BitGo`);
            });
        });
        describe('sendSignatureShare Tests', async function () {
            afterEach(function () {
                nock.cleanAll();
            });
            const mockAShareString = sdk_core_1.ECDSAMethods.convertAShare(ecdsaFixtures_1.mockAShare).share;
            const mockDShareString = sdk_core_1.ECDSAMethods.convertDShare(ecdsaFixtures_1.mockDShare).share;
            const config = [
                {
                    shareToSend: 'KShare',
                    mockShareToSend: ecdsaFixtures_1.mockSignRT.kShare,
                    mockShareToSendString: sdk_core_1.ECDSAMethods.convertKShare(ecdsaFixtures_1.mockSignRT.kShare).share,
                    sendType: sdk_core_1.ECDSAMethodTypes.SendShareType.KShare,
                    mockShareAsResponse: ecdsaFixtures_1.mockAShare,
                    mockShareAsResponseString: mockAShareString,
                    shareReceived: 'AShare',
                    incorrectReceivedShareString: ecdsaFixtures_1.mockAShare.k,
                    signerShare: 'a valid signer share',
                },
                {
                    shareToSend: 'MUShare',
                    mockShareToSend: { muShare: ecdsaFixtures_1.mockMuShare, dShare: ecdsaFixtures_1.mockDShareToBitgo, i: ecdsaFixtures_1.mockMuShare.i },
                    mockShareToSendString: `${sdk_core_1.ECDSAMethods.convertMuShare(ecdsaFixtures_1.mockMuShare).share}${sdk_core_1.ECDSAMethods.secondaryDelimeter}${sdk_core_1.ECDSAMethods.convertDShare(ecdsaFixtures_1.mockDShareToBitgo).share}`,
                    sendType: sdk_core_1.ECDSAMethodTypes.SendShareType.MUShare,
                    mockShareAsResponse: ecdsaFixtures_1.mockDShare,
                    mockShareAsResponseString: mockDShareString,
                    shareReceived: 'DShare',
                    incorrectReceivedShareString: ecdsaFixtures_1.mockDShare.Gamma,
                },
            ];
            for (let index = 0; index < config.length; index++) {
                describe(`sendSignatureShare: ${config[index].shareToSend}`, async function () {
                    it(`should succeed to send ${config[index].shareToSend}`, async function () {
                        const mockSendReq = {
                            from: 'user',
                            to: 'bitgo',
                            share: config[index].mockShareToSendString,
                        };
                        const shareRecord = {
                            from: 'bitgo',
                            to: 'user',
                            share: config[index].mockShareAsResponseString,
                        };
                        await (0, helpers_1.nockSendSignatureShare)({
                            walletId: wallet.id(),
                            txRequestId: txRequest.txRequestId,
                            signatureShare: mockSendReq,
                            response: shareRecord,
                            tssType: 'ecdsa',
                            signerShare: config[index].signerShare,
                        });
                        txRequest.signatureShares = [shareRecord];
                        const response = { txRequests: [{ transactions: [{ ...txRequest }] }] };
                        await (0, helpers_1.nockGetTxRequest)({ walletId: wallet.id(), txRequestId: txRequest.txRequestId, response: response });
                        const responseAShare = await sdk_core_1.ECDSAMethods.sendShareToBitgo(bitgo, wallet.id(), txRequest.txRequestId, sdk_core_1.RequestType.tx, config[index].sendType, config[index].mockShareToSend, config[index].signerShare);
                        responseAShare.should.deepEqual(config[index].mockShareAsResponse);
                    });
                    it(`should fail if we get an invalid ${config[index].shareReceived} as response`, async function () {
                        const mockSendReq = {
                            from: 'user',
                            to: 'bitgo',
                            share: config[index].mockShareToSendString,
                        };
                        const invalidSignatureShare = {
                            from: 'bitgo',
                            to: 'user',
                            share: JSON.stringify(config[index].incorrectReceivedShareString),
                        };
                        const nock = await (0, helpers_1.nockSendSignatureShare)({
                            walletId: wallet.id(),
                            txRequestId: txRequest.txRequestId,
                            signatureShare: mockSendReq,
                            response: invalidSignatureShare,
                            tssType: 'ecdsa',
                            signerShare: config[index].signerShare,
                        }, 200);
                        txRequest.signatureShares = [invalidSignatureShare];
                        const response = { txRequests: [{ transactions: [{ ...txRequest }] }] };
                        await (0, helpers_1.nockGetTxRequest)({ walletId: wallet.id(), txRequestId: txRequest.txRequestId, response: response });
                        await sdk_core_1.ECDSAMethods.sendShareToBitgo(bitgo, wallet.id(), txRequest.txRequestId, sdk_core_1.RequestType.tx, config[index].sendType, config[index].mockShareToSend, config[index].signerShare).should.be.rejectedWith(/Invalid .* share/g); // `Invalid ${shareName} share`
                        nock.isDone().should.equal(true);
                    });
                });
            }
        });
        describe('getTxRequest:', async function () {
            afterEach(function () {
                nock.cleanAll();
            });
            it('should succeed to get txRequest by id', async function () {
                const response = { txRequests: [txRequest] };
                const nock = await (0, helpers_1.nockGetTxRequest)({ walletId: wallet.id(), txRequestId: txRequest.txRequestId, response });
                const txReq = await (0, sdk_core_1.getTxRequest)(bitgo, wallet.id(), txRequest.txRequestId);
                txReq.should.deepEqual(txRequest);
                nock.isDone().should.equal(true);
            });
            it('should fail if there are no txRequests', async function () {
                const response = { txRequests: [] };
                const nock = await (0, helpers_1.nockGetTxRequest)({ walletId: wallet.id(), txRequestId: txRequest.txRequestId, response });
                await (0, sdk_core_1.getTxRequest)(bitgo, wallet.id(), txRequest.txRequestId).should.be.rejectedWith('Unable to find TxRequest with id randomId');
                nock.isDone().should.equal(true);
            });
        });
        describe('signing share parsers and converters', function () {
            afterEach(function () {
                nock.cleanAll();
            });
            it('should successfully parse K share', function () {
                const bitgoKShare = ecdsaFixtures_1.mockSignWithPaillierChallengeRT.kShare;
                const share = {
                    to: sdk_core_1.SignatureShareType.BITGO,
                    from: sdk_core_1.SignatureShareType.USER,
                    share: sdk_core_1.ECDSAMethods.convertKShare(ecdsaFixtures_1.mockSignWithPaillierChallengeRT.kShare).share,
                };
                const kShare = sdk_core_1.ECDSAMethods.parseKShare(share);
                kShare.should.deepEqual(bitgoKShare);
            });
            it('should successfully convert K share to signature share record', function () {
                const bitgoKShare = ecdsaFixtures_1.mockSignWithPaillierChallengeRT.kShare;
                const share = {
                    to: sdk_core_1.SignatureShareType.BITGO,
                    from: sdk_core_1.SignatureShareType.USER,
                    share: `${ecdsaFixtures_1.mockSignRT.kShare.k}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSignRT.kShare.n}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSignRT.kShare.ntilde}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSignRT.kShare.h1}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSignRT.kShare.h2}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSignRT.kShare.proof?.z || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSignRT.kShare.proof?.u || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSignRT.kShare.proof?.w || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSignRT.kShare.proof?.s || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSignRT.kShare.proof?.s1 || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSignRT.kShare.proof?.s2 || ''}${sdk_core_1.ECDSAMethods.delimeter}${bitgoKShare.p.join(sdk_core_1.ECDSAMethods.delimeter)}${sdk_core_1.ECDSAMethods.delimeter}${bitgoKShare.sigma.join(sdk_core_1.ECDSAMethods.delimeter)}`,
                };
                const kshare = sdk_core_1.ECDSAMethods.convertKShare(bitgoKShare);
                kshare.from.should.equal(share.from);
                kshare.to.should.equal(share.to);
                kshare.share.should.equal(share.share);
            });
            it('should successfully parse A share without paillier challenge', function () {
                const share = {
                    to: sdk_core_1.SignatureShareType.USER,
                    from: sdk_core_1.SignatureShareType.BITGO,
                    share: sdk_core_1.ECDSAMethods.convertAShare(ecdsaFixtures_1.mockAShare).share,
                };
                const aShare = sdk_core_1.ECDSAMethods.parseAShare(share);
                should.exist(aShare);
                aShare.should.deepEqual(ecdsaFixtures_1.mockAShare);
            });
            it('should successfully parse A share', function () {
                const share = {
                    to: sdk_core_1.SignatureShareType.USER,
                    from: sdk_core_1.SignatureShareType.BITGO,
                    share: sdk_core_1.ECDSAMethods.convertAShare(ecdsaFixtures_1.mockAShare).share,
                };
                const aShare = sdk_core_1.ECDSAMethods.parseAShare(share);
                should.exist(aShare);
                aShare.should.deepEqual(ecdsaFixtures_1.mockAShare);
            });
            it('should successfully convert A share to signature share record', function () {
                const mockShare = ecdsaFixtures_1.mockAShare;
                const share = {
                    to: sdk_core_1.SignatureShareType.USER,
                    from: sdk_core_1.SignatureShareType.BITGO,
                    share: `${mockShare.k}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.alpha}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.mu}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.n}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.ntilde}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.h1}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.h2}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.proof?.z || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.proof?.u || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.proof?.w || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.proof?.s || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.proof?.s1 || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.proof?.s2 || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.gammaProof?.z || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.gammaProof?.zprm || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.gammaProof?.t || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.gammaProof?.v || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.gammaProof?.w || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.gammaProof?.s || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.gammaProof?.s1 || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.gammaProof?.s2 || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.gammaProof?.t1 || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.gammaProof?.t2 || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.gammaProof?.u || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.gammaProof?.x || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.wProof?.z || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.wProof?.zprm || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.wProof?.t || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.wProof?.v || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.wProof?.w || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.wProof?.s || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.wProof?.s1 || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.wProof?.s2 || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.wProof?.t1 || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.wProof?.t2 || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.wProof?.u || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.wProof?.x || ''}${sdk_core_1.ECDSAMethods.delimeter}${mockShare.sigma.join(sdk_core_1.ECDSAMethods.delimeter)}`,
                };
                const aShare = sdk_core_1.ECDSAMethods.convertAShare(mockShare);
                aShare.from.should.equal(share.from);
                aShare.to.should.equal(share.to);
                aShare.share.should.equal(share.share);
            });
            it('should successfully parse Mu share', function () {
                const share = {
                    to: sdk_core_1.SignatureShareType.BITGO,
                    from: sdk_core_1.SignatureShareType.USER,
                    share: sdk_core_1.ECDSAMethods.convertMuShare(ecdsaFixtures_1.mockMuShare).share,
                };
                const muShare = sdk_core_1.ECDSAMethods.parseMuShare(share);
                muShare.i.should.equal(ecdsaFixtures_1.mockMuShare.i);
                muShare.j.should.equal(ecdsaFixtures_1.mockMuShare.j);
                muShare.alpha.should.equal(ecdsaFixtures_1.mockMuShare.alpha);
                muShare.mu.should.equal(ecdsaFixtures_1.mockMuShare.mu);
            });
            it('should successfully convert Mu share to signature share record', function () {
                const share = {
                    to: sdk_core_1.SignatureShareType.BITGO,
                    from: sdk_core_1.SignatureShareType.USER,
                    share: `${ecdsaFixtures_1.mockMuShare.alpha}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.mu}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.gammaProof?.z || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.gammaProof?.zprm || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.gammaProof?.t || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.gammaProof?.v || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.gammaProof?.w || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.gammaProof?.s || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.gammaProof?.s1 || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.gammaProof?.s2 || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.gammaProof?.t1 || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.gammaProof?.t2 || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.gammaProof?.u || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.gammaProof?.x || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.wProof?.z || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.wProof?.zprm || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.wProof?.t || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.wProof?.v || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.wProof?.w || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.wProof?.s || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.wProof?.s1 || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.wProof?.s2 || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.wProof?.t1 || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.wProof?.t2 || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.wProof?.u || ''}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockMuShare.wProof?.x || ''}`,
                };
                const muShare = sdk_core_1.ECDSAMethods.convertMuShare(ecdsaFixtures_1.mockMuShare);
                muShare.from.should.equal(share.from);
                muShare.to.should.equal(share.to);
                muShare.share.should.equal(share.share);
            });
            it('should successfully parse D share', function () {
                const share = {
                    to: sdk_core_1.SignatureShareType.BITGO,
                    from: sdk_core_1.SignatureShareType.USER,
                    share: sdk_core_1.ECDSAMethods.convertDShare(ecdsaFixtures_1.mockDShareToBitgo).share,
                };
                const dShare = sdk_core_1.ECDSAMethods.parseDShare(share);
                dShare.i.should.equal(ecdsaFixtures_1.mockDShareToBitgo.i);
                dShare.j.should.equal(ecdsaFixtures_1.mockDShareToBitgo.j);
                dShare.delta.should.equal(ecdsaFixtures_1.mockDShareToBitgo.delta);
                dShare.Gamma.should.equal(ecdsaFixtures_1.mockDShareToBitgo.Gamma);
            });
            it('should successfully convert D share to signature share record', function () {
                const share = {
                    to: sdk_core_1.SignatureShareType.BITGO,
                    from: sdk_core_1.SignatureShareType.USER,
                    share: `${ecdsaFixtures_1.mockDShareToBitgo.delta}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockDShareToBitgo.Gamma}`,
                };
                const dShare = sdk_core_1.ECDSAMethods.convertDShare(ecdsaFixtures_1.mockDShareToBitgo);
                dShare.from.should.equal(share.from);
                dShare.to.should.equal(share.to);
                dShare.share.should.equal(share.share);
            });
            it('should successfully parse S and D share', function () {
                const share = {
                    to: sdk_core_1.SignatureShareType.BITGO,
                    from: sdk_core_1.SignatureShareType.USER,
                    share: `${ecdsaFixtures_1.mockSShareFromUser.R}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSShareFromUser.s}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSShareFromUser.y}${sdk_core_1.ECDSAMethods.secondaryDelimeter}${ecdsaFixtures_1.mockDShareToBitgo.delta}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockDShareToBitgo.Gamma}`,
                };
                const { sShare, dShare } = sdk_core_1.ECDSAMethods.parseSDShare(share);
                sShare.i.should.equal(3);
                sShare.R.should.equal(ecdsaFixtures_1.mockSShareFromUser.R);
                sShare.s.should.equal(ecdsaFixtures_1.mockSShareFromUser.s);
                sShare.y.should.equal(ecdsaFixtures_1.mockSShareFromUser.y);
                dShare.i.should.equal(ecdsaFixtures_1.mockDShareToBitgo.i);
                dShare.j.should.equal(ecdsaFixtures_1.mockDShareToBitgo.j);
                dShare.delta.should.equal(ecdsaFixtures_1.mockDShareToBitgo.delta);
                dShare.Gamma.should.equal(ecdsaFixtures_1.mockDShareToBitgo.Gamma);
            });
            it('should successfully convert S and D share to signature share record', function () {
                const share = {
                    to: sdk_core_1.SignatureShareType.BITGO,
                    from: sdk_core_1.SignatureShareType.USER,
                    share: `${ecdsaFixtures_1.mockSShareFromUser.R}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSShareFromUser.s}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSShareFromUser.y}${sdk_core_1.ECDSAMethods.secondaryDelimeter}${ecdsaFixtures_1.mockDShareToBitgo.delta}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockDShareToBitgo.Gamma}`,
                };
                const sdShare = sdk_core_1.ECDSAMethods.convertSDShare({ sShare: ecdsaFixtures_1.mockSShareFromUser, dShare: ecdsaFixtures_1.mockDShareToBitgo });
                sdShare.from.should.equal(share.from);
                sdShare.to.should.equal(share.to);
                sdShare.share.should.equal(share.share);
            });
            it('should successfully parse signature share', function () {
                const share = {
                    to: sdk_core_1.SignatureShareType.USER,
                    from: sdk_core_1.SignatureShareType.BITGO,
                    share: `${ecdsaFixtures_1.mockSShareFromUser.R}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSShareFromUser.s}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSShareFromUser.y}`,
                };
                const signature = sdk_core_1.ECDSAMethods.parseSignatureShare(share);
                signature.i.should.equal(1);
                signature.R.should.equal(ecdsaFixtures_1.mockSShareFromUser.R);
                signature.s.should.equal(ecdsaFixtures_1.mockSShareFromUser.s);
                signature.y.should.equal(ecdsaFixtures_1.mockSShareFromUser.y);
            });
            it('should succuesfully parse combined signature', function () {
                const mockCombinedSignature = mpc.constructSignature([ecdsaFixtures_1.mockSShareFromUser, ecdsaFixtures_1.mockSShare]);
                const share = {
                    to: sdk_core_1.SignatureShareType.USER,
                    from: sdk_core_1.SignatureShareType.BITGO,
                    share: `${mockCombinedSignature.recid}${sdk_core_1.ECDSAMethods.delimeter}${mockCombinedSignature.r}${sdk_core_1.ECDSAMethods.delimeter}${mockCombinedSignature.s}${sdk_core_1.ECDSAMethods.delimeter}${mockCombinedSignature.y}`,
                };
                const signature = sdk_core_1.ECDSAMethods.parseCombinedSignature(share);
                signature.recid.should.equal(mockCombinedSignature.recid);
                signature.r.should.equal(mockCombinedSignature.r);
                signature.s.should.equal(mockCombinedSignature.s);
                signature.y.should.equal(mockCombinedSignature.y);
            });
            it('should successfully convert signature share to signature share record', function () {
                const share = {
                    to: sdk_core_1.SignatureShareType.BITGO,
                    from: sdk_core_1.SignatureShareType.USER,
                    share: `${ecdsaFixtures_1.mockSShareFromUser.R}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSShareFromUser.s}${sdk_core_1.ECDSAMethods.delimeter}${ecdsaFixtures_1.mockSShareFromUser.y}`,
                };
                const signatureShare = sdk_core_1.ECDSAMethods.convertSignatureShare(ecdsaFixtures_1.mockSShareFromUser, sdk_core_1.ECDSAMethods.getParticipantIndex('user'), sdk_core_1.ECDSAMethods.getParticipantIndex('bitgo'));
                signatureShare.from.should.equal(share.from);
                signatureShare.to.should.equal(share.to);
                signatureShare.share.should.equal(share.share);
            });
            it('should successfully convert B share to signature share record', function () {
                const bShare = ecdsaFixtures_1.mockedBitgoBShare.bShare;
                const share = {
                    to: sdk_core_1.SignatureShareType.BITGO,
                    from: sdk_core_1.SignatureShareType.BITGO,
                    share: `${bShare.beta}${sdk_core_1.ECDSAMethods.delimeter}${bShare.gamma}${sdk_core_1.ECDSAMethods.delimeter}${bShare.k}${sdk_core_1.ECDSAMethods.delimeter}${bShare.nu}${sdk_core_1.ECDSAMethods.delimeter}${bShare.w}${sdk_core_1.ECDSAMethods.delimeter}${bShare.y}${sdk_core_1.ECDSAMethods.delimeter}${bShare.l}${sdk_core_1.ECDSAMethods.delimeter}${bShare.m}${sdk_core_1.ECDSAMethods.delimeter}${bShare.n}${sdk_core_1.ECDSAMethods.delimeter}${bShare.ntilde}${sdk_core_1.ECDSAMethods.delimeter}${bShare.h1}${sdk_core_1.ECDSAMethods.delimeter}${bShare.h2}${sdk_core_1.ECDSAMethods.delimeter}${bShare.ck}${sdk_core_1.ECDSAMethods.delimeter}${bShare.p.join(sdk_core_1.ECDSAMethods.delimeter)}`,
                };
                const signatureShare = sdk_core_1.ECDSAMethods.convertBShare(bShare);
                signatureShare.from.should.equal(share.from);
                signatureShare.to.should.equal(share.to);
                signatureShare.share.should.equal(share.share);
            });
            it('should successfully parse B share', function () {
                const bShare = ecdsaFixtures_1.mockedBitgoBShare.bShare;
                const share = {
                    to: sdk_core_1.SignatureShareType.BITGO,
                    from: sdk_core_1.SignatureShareType.BITGO,
                    share: sdk_core_1.ECDSAMethods.convertBShare(ecdsaFixtures_1.mockedBitgoBShare.bShare).share,
                };
                const parsedBShare = sdk_core_1.ECDSAMethods.parseBShare(share);
                parsedBShare.should.deepEqual(bShare);
            });
            it('should successfully convert O share to signature share record', function () {
                const oShare = ecdsaFixtures_1.mockedBitgoOAndDShare.oShare;
                const delimeter = sdk_core_1.ECDSAMethods.delimeter;
                const share = {
                    to: sdk_core_1.SignatureShareType.BITGO,
                    from: sdk_core_1.SignatureShareType.BITGO,
                    share: `${oShare.Gamma}${delimeter}${oShare.delta}${delimeter}${oShare.k}${delimeter}${oShare.omicron}${delimeter}${oShare.y}`,
                };
                const oShareSigRecord = sdk_core_1.ECDSAMethods.convertOShare(oShare);
                oShareSigRecord.from.should.equal(share.from);
                oShareSigRecord.to.should.equal(share.to);
                oShareSigRecord.share.should.equal(share.share);
            });
            it('should successfully parse O share', function () {
                const oShare = ecdsaFixtures_1.mockedBitgoOAndDShare.oShare;
                const delimeter = sdk_core_1.ECDSAMethods.delimeter;
                const share = {
                    to: sdk_core_1.SignatureShareType.BITGO,
                    from: sdk_core_1.SignatureShareType.BITGO,
                    share: `${oShare.Gamma}${delimeter}${oShare.delta}${delimeter}${oShare.k}${delimeter}${oShare.omicron}${delimeter}${oShare.y}`,
                };
                const parsedOShare = sdk_core_1.ECDSAMethods.parseOShare(share);
                parsedOShare.i.should.equal(oShare.i);
                parsedOShare.y.should.equal(oShare.y);
                parsedOShare.k.should.equal(oShare.k);
                parsedOShare.omicron.should.equal(oShare.omicron);
                parsedOShare.delta.should.equal(oShare.delta);
                parsedOShare.Gamma.should.equal(oShare.Gamma);
            });
        });
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2EuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZXN0L3YyL3VuaXQvdHNzL2VjZHNhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsOENBV3lCO0FBQ3pCLG9EQUFvRTtBQUNwRSxtQ0FBbUM7QUFDbkMsaUNBQWlDO0FBQ2pDLDhDQUErRTtBQUMvRSx5Q0FBd0M7QUFDeEMsdUNBQXFFO0FBQ3JFLG9FQWUwQztBQUUxQyw2QkFBOEI7QUFHOUIsTUFBTSxhQUFhLEdBQUcsdUJBQVksQ0FBQyxhQUFhLENBQUM7QUFDakQsTUFBTSxpQkFBaUIsR0FBRyx1QkFBWSxDQUFDLGlCQUFpQixDQUFDO0FBTXpELFFBQVEsQ0FBQyxrQ0FBa0MsRUFBRTtJQUMzQyxJQUFJLEdBQVUsQ0FBQztJQUVmLElBQUksWUFBc0IsQ0FBQztJQUMzQixJQUFJLGNBQXdCLENBQUM7SUFDN0IsSUFBSSxhQUF1QixDQUFDO0lBRTVCLElBQUksT0FBMEIsQ0FBQztJQUMvQixJQUFJLFNBQTRCLENBQUM7SUFDakMsSUFBSSxRQUEyQixDQUFDO0lBRWhDLElBQUksY0FBMEIsQ0FBQztJQUMvQixJQUFJLGdCQUE0QixDQUFDO0lBQ2pDLElBQUksZUFBMkIsQ0FBQztJQUNoQyxJQUFJLGNBQXNCLENBQUM7SUFFM0IsTUFBTSxDQUFDLEtBQUs7UUFDVixHQUFHLEdBQUcsSUFBSSxnQkFBSyxFQUFFLENBQUM7UUFDbEIsWUFBWSxHQUFHLHlCQUFTLENBQUMsWUFBWSxDQUFDO1FBQ3RDLGNBQWMsR0FBRyx5QkFBUyxDQUFDLGNBQWMsQ0FBQztRQUMxQyxhQUFhLEdBQUcseUJBQVMsQ0FBQyxhQUFhLENBQUM7UUFFeEMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxD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TUFBTSxFQUFFLENBQUM7Z0JBQ25ELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDcEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNwRCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3BELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDeEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNuRCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ25ELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbkQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNuRCxNQUFNLENBQUMsTUFBTSxDQUFDLElB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dUJBQVksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLHVCQUFZLENBQUMsU0FBUyxHQUNoRixTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUN6QixHQUFHLHVCQUFZLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxJQUFJLEVBQUUsR0FBRyx1QkFBWSxDQUFDLFNBQVMsR0FDL0UsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFDekIsR0FBRyx1QkFBWSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsdUJBQVksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxHQUN4Ryx1QkFBWSxDQUFDLFNBQ2YsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsdUJBQVksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLHVCQUFZLENBQUMsU0FBUyxHQUN6RyxTQUFTLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUMxQixHQUFHLHVCQUFZLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyx1QkFBWSxDQUFDLFNBQVMsR0FDN0UsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFDMUIsR0FBRyx1QkFBWSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsdUJBQVksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxHQUN4Ryx1QkFBWSxDQUFDLFNBQ2YsR0FBRyxTQUFTLENBQUMsS0FBTSxDQUFDLElBQUksQ0FBQyx1QkFBWSxDQUFDLFNBQVMsQ0FBQyxFQUFFO2lCQUMzQixDQUFDO2dCQUUxQixN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Ryx1QkFBWSxDQUFDLFNBQVMsR0FDbEYsMkJBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQzNCLEdBQUcsdUJBQVksQ0FBQyxTQUFTLEdBQUcsMkJBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxJQUFJLEVBQUUsR0FBRyx1QkFBWSxDQUFDLFNBQVMsR0FDakYsMkJBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQzNCLEdBQUcsdUJBQVksQ0FBQyxTQUFTLEdBQUcsMkJBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyx1QkFBWSxDQUFDLFNBQVMsR0FDOUUsMkJBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQzNCLEdBQUcsdUJBQVksQ0FBQyxTQUFTLEdBQUcsMkJBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyx1QkFBWSxDQUFDLFNBQVMsR0FDOUUsMkJBQVcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQzVCLEdBQUcsdUJBQVksQ0FBQyxTQUFTLEdBQUcsMkJBQVcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyx1QkFBWSxDQUFDLFNBQVMsR0FDL0UsMkJBQVcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQzVCLEdBQUcsdUJBQVksQ0FBQyxTQUFTLEdBQUcsMkJBQVcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyx1QkFBWSxDQUFDLFNBQVMsR0FDL0UsMkJBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQzNCLEdBQUcsdUJBQVksQ0FBQyxTQUFTLEdBQUcsMkJBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtpQkFDbEMsQ0FBQztnQkFDMUIsTUFBTSxPQUFPLEdBQUcsdUJBQVksQ0FBQyxjQUFjLENBQUMsMkJBQVcsQ0FBQyxDQUFDO2dCQUN6RCxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFD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Q0RTQU1ldGhvZFR5cGVzLFxuICBXYWxsZXQsXG4gIFNpZ25hdHVyZVNoYXJlUmVjb3JkLFxuICBnZXRUeFJlcXVlc3QsXG4gIEVDRFNBTWV0aG9kcyxcbiAgUmVxdWVzdFR5cGUsXG4gIFNpZ25hdHVyZVNoYXJlVHlwZSxcbiAgaGV4VG9CaWdJbnQsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBFY2RzYVR5cGVzLCBFY2RzYVBhaWxsaWVyUHJvb2YgfSBmcm9tICdAYml0Z28vc2RrLWxpYi1tcGMnO1xuaW1wb3J0ICogYXMgb3BlbnBncCBmcm9tICdvcGVucGdwJztcbmltcG9ydCAqIGFzIHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgbW9ja1NlcmlhbGl6ZWRDaGFsbGVuZ2VXaXRoUHJvb2ZzLCBUZXN0Qml0R28gfSBmcm9tICdAYml0Z28vc2RrLXRlc3QnO1xuaW1wb3J0IHsgQml0R28gfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMnO1xuaW1wb3J0IHsgbm9ja0dldFR4UmVxdWVzdCwgbm9ja1NlbmRTaWduYXR1cmVTaGFyZSB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge1xuICBnYW1tYUFuZE11U2hhcmVDcmVhdGlvblBhcmFtcyxcbiAgb21pY3JvbkFuZERlbHRhU2hhcmVDcmVhdGlvblBhcmFtcyxcbiAga2V5U2hhcmVzLFxuICBjcmVhdGVVc2VyU2lnbmF0dXJlUGFyYW1zLFxuICBtb2NrU2lnblJULFxuICBtb2NrQVNoYXJlLFxuICBtb2NrTXVTaGFyZSxcbiAgbW9ja0RTaGFyZSxcbiAgbW9ja1NTaGFyZUZyb21Vc2VyLFxuICBtb2NrRFNoYXJlVG9CaXRnbyxcbiAgbW9ja2VkQml0Z29CU2hhcmUsXG4gIG1vY2tlZEJpdGdvT0FuZERTaGFyZSxcbiAgbW9ja1NTaGFyZSxcbiAgbW9ja1NpZ25XaXRoUGFpbGxpZXJDaGFsbGVuZ2VSVCxcbn0gZnJvbSAnLi4vLi4vZml4dHVyZXMvdHNzL2VjZHNhRml4dHVyZXMnO1xuXG5pbXBvcnQgbm9jayA9IHJlcXVpcmUoJ25vY2snKTtcblxudHlwZSBLZXlTaGFyZSA9IEVDRFNBLktleVNoYXJlO1xuY29uc3QgZW5jcnlwdE5TaGFyZSA9IEVDRFNBTWV0aG9kcy5lbmNyeXB0TlNoYXJlO1xuY29uc3QgY3JlYXRlQ29tYmluZWRLZXkgPSBFQ0RTQU1ldGhvZHMuY3JlYXRlQ29tYmluZWRLZXk7XG50eXBlIEdwZ0tleXBhaXIgPSB7XG4gIHB1YmxpY0tleTogc3RyaW5nO1xuICBwcml2YXRlS2V5OiBzdHJpbmc7XG59O1xuXG5kZXNjcmliZSgnRWNkc2EgdHNzIGhlbHBlciBmdW5jdGlvbnMgdGVzdHMnLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBtcGM6IEVjZHNhO1xuXG4gIGxldCB1c2VyS2V5U2hhcmU6IEtleVNoYXJlO1xuICBsZXQgYmFja3VwS2V5U2hhcmU6IEtleVNoYXJlO1xuICBsZXQgYml0Z29LZXlTaGFyZTogS2V5U2hhcmU7XG5cbiAgbGV0IHVzZXJLZXk6IEVDRFNBLktleUNvbWJpbmVkO1xuICBsZXQgYmFja3VwS2V5OiBFQ0RTQS5LZXlDb21iaW5lZDtcbiAgbGV0IGJpdGdvS2V5OiBFQ0RTQS5LZXlDb21iaW5lZDtcblxuICBsZXQgdXNlckdwZ0tleXBhaXI6IEdwZ0tleXBhaXI7XG4gIGxldCBiYWNrdXBHcGdLZXlwYWlyOiBHcGdLZXlwYWlyO1xuICBsZXQgYml0Z29HcGdLZXlwYWlyOiBHcGdLZXlwYWlyO1xuICBsZXQgY29tbW9uS2V5Y2hhaW46IHN0cmluZztcblxuICBiZWZvcmUoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIG1wYyA9IG5ldyBFY2RzYSgpO1xuICAgIHVzZXJLZXlTaGFyZSA9IGtleVNoYXJlcy51c2VyS2V5U2hhcmU7XG4gICAgYmFja3VwS2V5U2hhcmUgPSBrZXlTaGFyZXMuYmFja3VwS2V5U2hhcmU7XG4gICAgYml0Z29LZXlTaGFyZSA9IGtleVNoYXJlcy5iaXRnb0tleVNoYXJlO1xuXG4gICAgdXNlcktleSA9IG1wYy5rZXlDb21iaW5lKHVzZXJLZXlTaGFyZS5wU2hhcmUsIFtiYWNrdXBLZXlTaGFyZS5uU2hhcmVzWzFdLCBiaXRnb0tleVNoYXJlLm5TaGFyZXNbMV1dKTtcbiAgICBiYWNrdXBLZXkgPSBtcGMua2V5Q29tYmluZShiYWNrdXBLZXlTaGFyZS5wU2hhcmUsIFt1c2VyS2V5U2hhcmUublNoYXJlc1syXSwgYml0Z29LZXlTaGFyZS5uU2hhcmVzWzJdXSk7XG4gICAgYml0Z29LZXkgPSBtcGMua2V5Q29tYmluZShiaXRnb0tleVNoYXJlLnBTaGFyZSwgW2JhY2t1cEtleVNoYXJlLm5TaGFyZXNbM10sIHVzZXJLZXlTaGFyZS5uU2hhcmVzWzNdXSk7XG5cbiAgICAodXNlcktleS54U2hhcmUueSArIHVzZXJLZXkueFNoYXJlLmNoYWluY29kZSkuc2hvdWxkLmVxdWFsKGJhY2t1cEtleS54U2hhcmUueSArIGJhY2t1cEtleS54U2hhcmUuY2hhaW5jb2RlKTtcbiAgICAodXNlcktleS54U2hhcmUueSArIHVzZXJLZXkueFNoYXJlLmNoYWluY29kZSkuc2hvdWxkLmVxdWFsKGJpdGdvS2V5LnhTaGFyZS55ICsgYml0Z29LZXkueFNoYXJlLmNoYWluY29kZSk7XG4gICAgY29tbW9uS2V5Y2hhaW4gPSB1c2VyS2V5LnhTaGFyZS55ICsgdXNlcktleS54U2hhcmUuY2hhaW5jb2RlO1xuICAgIGNvbnN0IGdwZ0tleXBhaXJQcm9taXNlcyA9IFtcbiAgICAgIHsgbmFtZTogJ3VzZXInLCBlbWFpbDogJ3VzZXJAYml0Z28uY29tJyB9LFxuICAgICAgeyBuYW1lOiAnYmFja3VwJywgZW1haWw6ICdiYWNrdXBAYml0Z28uY29tJyB9LFxuICAgICAgeyBuYW1lOiAnYml0Z28nLCBlbWFpbDogJ2JpdGdvQGJpdGdvLmNvbScgfSxcbiAgICBdLm1hcChhc3luYyAodXNlcikgPT4ge1xuICAgICAgcmV0dXJuIG9wZW5wZ3AuZ2VuZXJhdGVLZXkoe1xuICAgICAgICB1c2VySURzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogdXNlci5uYW1lLFxuICAgICAgICAgICAgZW1haWw6IHVzZXIuZW1haWwsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgY3VydmU6ICdzZWNwMjU2azEnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBncGdLZXlwYWlycyA9IGF3YWl0IFByb21pc2UuYWxsKGdwZ0tleXBhaXJQcm9taXNlcyk7XG4gICAgdXNlckdwZ0tleXBhaXIgPSBncGdLZXlwYWlyc1swXTtcbiAgICBiYWNrdXBHcGdLZXlwYWlyID0gZ3BnS2V5cGFpcnNbMV07XG4gICAgYml0Z29HcGdLZXlwYWlyID0gZ3BnS2V5cGFpcnNbMl07XG4gIH0pO1xuXG4gIGFmdGVyKGZ1bmN0aW9uICgpIHtcbiAgICBub2NrLmNsZWFuQWxsKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdlbmNyeXB0TlNoYXJlIGFuZCBkZWNyeXB0TlNoYXJlJywgZnVuY3Rpb24gKCkge1xuICAgIGFmdGVyKGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vY2suY2xlYW5BbGwoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZW5jcnlwdCBuIHNoYXJlcyBmb3JlYWNoIHVzZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKGxldCBpID0gMjsgaSA8PSAzOyBpKyspIHtcbiAgICAgICAgY29uc3QgZW5jcnlwdGVkTlNoYXJlID0gYXdhaXQgRUNEU0FNZXRob2RzLmVuY3J5cHROU2hhcmUoXG4gICAgICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgICAgIGksXG4gICAgICAgICAgYml0Z29HcGdLZXlwYWlyLnB1YmxpY0tleSxcbiAgICAgICAgICB1c2VyR3BnS2V5cGFpclxuICAgICAgICApO1xuICAgICAgICBjb25zdCBkZWNyeXB0ZWROU2hhcmUgPSBhd2FpdCBFQ0RTQU1ldGhvZHMuZGVjcnlwdE5TaGFyZSh7XG4gICAgICAgICAgblNoYXJlOiBlbmNyeXB0ZWROU2hhcmUsXG4gICAgICAgICAgc2VuZGVyUHVibGljQXJtb3I6IHVzZXJHcGdLZXlwYWlyLnB1YmxpY0tleSxcbiAgICAgICAgICByZWNpcGllbnRQcml2YXRlQXJtb3I6IGJpdGdvR3BnS2V5cGFpci5wcml2YXRlS2V5LFxuICAgICAgICB9KTtcbiAgICAgICAgZGVjcnlwdGVkTlNoYXJlLnUuc2hvdWxkLmVxdWFsKHVzZXJLZXlTaGFyZS5uU2hhcmVzW2ldLnUpO1xuICAgICAgICBjb25zdCBwdWJsaWNLZXkgPSB1c2VyS2V5U2hhcmUucFNoYXJlLnkgKyB1c2VyS2V5U2hhcmUucFNoYXJlLmNoYWluY29kZTtcbiAgICAgICAgZW5jcnlwdGVkTlNoYXJlLmkuc2hvdWxkLmVxdWFsKGkpO1xuICAgICAgICBlbmNyeXB0ZWROU2hhcmUudnNzUHJvb2YhLnNob3VsZC5lcXVhbCh1c2VyS2V5U2hhcmUublNoYXJlc1szXS52ISk7XG4gICAgICAgIGVuY3J5cHRlZE5TaGFyZS5qLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgICAgZW5jcnlwdGVkTlNoYXJlLnB1YmxpY1NoYXJlLnNob3VsZC5lcXVhbChwdWJsaWNLZXkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBlcnJvciBmb3IgaW52YWxpZCByZWNpcGllbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBlbmNyeXB0TlNoYXJlKHVzZXJLZXlTaGFyZSwgMSwgdXNlckdwZ0tleXBhaXIucHJpdmF0ZUtleSwgdXNlckdwZ0tleXBhaXIpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICdJbnZhbGlkIHJlY2lwaWVudCdcbiAgICAgICk7XG4gICAgICBhd2FpdCBlbmNyeXB0TlNoYXJlKGJhY2t1cEtleVNoYXJlLCAyLCB1c2VyR3BnS2V5cGFpci5wcml2YXRlS2V5LCB1c2VyR3BnS2V5cGFpcikuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgJ0ludmFsaWQgcmVjaXBpZW50J1xuICAgICAgKTtcbiAgICAgIGF3YWl0IGVuY3J5cHROU2hhcmUoYml0Z29LZXlTaGFyZSwgMywgdXNlckdwZ0tleXBhaXIucHJpdmF0ZUtleSwgdXNlckdwZ0tleXBhaXIpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICdJbnZhbGlkIHJlY2lwaWVudCdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGRlY3J5cHQgbiBzaGFyZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGVuY3J5cHRlZE5TaGFyZSA9IGF3YWl0IEVDRFNBTWV0aG9kcy5lbmNyeXB0TlNoYXJlKFxuICAgICAgICB1c2VyS2V5U2hhcmUsXG4gICAgICAgIDMsXG4gICAgICAgIGJpdGdvR3BnS2V5cGFpci5wdWJsaWNLZXksXG4gICAgICAgIHVzZXJHcGdLZXlwYWlyXG4gICAgICApO1xuICAgICAgY29uc3QgZGVjcnlwdGVkTlNoYXJlID0gYXdhaXQgRUNEU0FNZXRob2RzLmRlY3J5cHROU2hhcmUoe1xuICAgICAgICBuU2hhcmU6IGVuY3J5cHRlZE5TaGFyZSxcbiAgICAgICAgcmVjaXBpZW50UHJpdmF0ZUFybW9yOiBiaXRnb0dwZ0tleXBhaXIucHJpdmF0ZUtleSxcbiAgICAgICAgc2VuZGVyUHVibGljQXJtb3I6IHVzZXJHcGdLZXlwYWlyLnB1YmxpY0tleSxcbiAgICAgIH0pO1xuICAgICAgZGVjcnlwdGVkTlNoYXJlLmkuc2hvdWxkLmVxdWFsKHVzZXJLZXlTaGFyZS5uU2hhcmVzWzNdLmkpO1xuICAgICAgZGVjcnlwdGVkTlNoYXJlLmouc2hvdWxkLmVxdWFsKHVzZXJLZXlTaGFyZS5uU2hhcmVzWzNdLmopO1xuICAgICAgZGVjcnlwdGVkTlNoYXJlLm4uc2hvdWxkLmVxdWFsKHVzZXJLZXlTaGFyZS5uU2hhcmVzWzNdLm4pO1xuICAgICAgZGVjcnlwdGVkTlNoYXJlLnUuc2hvdWxkLmVxdWFsKHVzZXJLZXlTaGFyZS5uU2hhcmVzWzNdLnUpO1xuICAgICAgZGVjcnlwdGVkTlNoYXJlLnkuc2hvdWxkLmVxdWFsKHVzZXJLZXlTaGFyZS5uU2hhcmVzWzNdLnkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY3JlYXRlQ29tYmluZWRLZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgYWZ0ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgbm9jay5jbGVhbkFsbCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjcmVhdGUgY29tYmluZWQgdXNlciBrZXknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBiaXRnb1RvVXNlclNoYXJlID0gYXdhaXQgRUNEU0FNZXRob2RzLmVuY3J5cHROU2hhcmUoXG4gICAgICAgIGJpdGdvS2V5U2hhcmUsXG4gICAgICAgIDEsXG4gICAgICAgIHVzZXJHcGdLZXlwYWlyLnB1YmxpY0tleSxcbiAgICAgICAgdXNlckdwZ0tleXBhaXIsXG4gICAgICAgIGZhbHNlXG4gICAgICApO1xuICAgICAgY29uc3QgYmFja3VwVG9Vc2VyU2hhcmUgPSBhd2FpdCBFQ0RTQU1ldGhvZHMuZW5jcnlwdE5TaGFyZShcbiAgICAgICAgYmFja3VwS2V5U2hhcmUsXG4gICAgICAgIDEsXG4gICAgICAgIHVzZXJHcGdLZXlwYWlyLnB1YmxpY0tleSxcbiAgICAgICAgdXNlckdwZ0tleXBhaXIsXG4gICAgICAgIGZhbHNlXG4gICAgICApO1xuICAgICAgY29uc3QgY29tYmluZWRVc2VyS2V5ID0gYXdhaXQgY3JlYXRlQ29tYmluZWRLZXkoXG4gICAgICAgIHVzZXJLZXlTaGFyZSxcbiAgICAgICAgW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5TaGFyZTogYml0Z29Ub1VzZXJTaGFyZSxcbiAgICAgICAgICAgIHJlY2lwaWVudFByaXZhdGVBcm1vcjogdXNlckdwZ0tleXBhaXIucHJpdmF0ZUtleSxcbiAgICAgICAgICAgIHNlbmRlclB1YmxpY0FybW9yOiBiaXRnb0dwZ0tleXBhaXIucHVibGljS2V5LFxuICAgICAgICAgICAgaXNiczU4RW5jb2RlZDogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuU2hhcmU6IGJhY2t1cFRvVXNlclNoYXJlLFxuICAgICAgICAgICAgcmVjaXBpZW50UHJpdmF0ZUFybW9yOiB1c2VyR3BnS2V5cGFpci5wcml2YXRlS2V5LFxuICAgICAgICAgICAgc2VuZGVyUHVibGljQXJtb3I6IGJhY2t1cEdwZ0tleXBhaXIucHVibGljS2V5LFxuICAgICAgICAgICAgaXNiczU4RW5jb2RlZDogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgY29tbW9uS2V5Y2hhaW5cbiAgICAgICk7XG5cbiAgICAgIGNvbWJpbmVkVXNlcktleS5jb21tb25LZXljaGFpbi5zaG91bGQuZXF1YWwoY29tbW9uS2V5Y2hhaW4pO1xuICAgICAgY29tYmluZWRVc2VyS2V5LnNpZ25pbmdNYXRlcmlhbC5wU2hhcmUuc2hvdWxkLmRlZXBFcXVhbCh1c2VyS2V5U2hhcmUucFNoYXJlKTtcbiAgICAgIHNob3VsZC5leGlzdChjb21iaW5lZFVzZXJLZXkuc2lnbmluZ01hdGVyaWFsLmJhY2t1cE5TaGFyZSk7XG4gICAgICBjb21iaW5lZFVzZXJLZXkuc2lnbmluZ01hdGVyaWFsLmJhY2t1cE5TaGFyZT8uc2hvdWxkLmRlZXBFcXVhbChiYWNrdXBLZXlTaGFyZS5uU2hhcmVzWzFdKTtcbiAgICAgIGNvbWJpbmVkVXNlcktleS5zaWduaW5nTWF0ZXJpYWwuYml0Z29OU2hhcmUuc2hvdWxkLmRlZXBFcXVhbChiaXRnb0tleVNoYXJlLm5TaGFyZXNbMV0pO1xuICAgICAgc2hvdWxkLm5vdC5leGlzdChjb21iaW5lZFVzZXJLZXkuc2lnbmluZ01hdGVyaWFsLnVzZXJOU2hhcmUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjcmVhdGUgY29tYmluZWQgYmFja3VwIGtleScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJpdGdvVG9CYWNrdXBTaGFyZSA9IGF3YWl0IGVuY3J5cHROU2hhcmUoYml0Z29LZXlTaGFyZSwgMiwgYmFja3VwR3BnS2V5cGFpci5wdWJsaWNLZXksIHVzZXJHcGdLZXlwYWlyKTtcblxuICAgICAgY29uc3QgdXNlclRvQmFja3VwU2hhcmUgPSBhd2FpdCBlbmNyeXB0TlNoYXJlKHVzZXJLZXlTaGFyZSwgMiwgYmFja3VwR3BnS2V5cGFpci5wdWJsaWNLZXksIHVzZXJHcGdLZXlwYWlyKTtcblxuICAgICAgY29uc3QgY29tYmluZWRCYWNrdXBLZXkgPSBhd2FpdCBjcmVhdGVDb21iaW5lZEtleShcbiAgICAgICAgYmFja3VwS2V5U2hhcmUsXG4gICAgICAgIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuU2hhcmU6IGJpdGdvVG9CYWNrdXBTaGFyZSxcbiAgICAgICAgICAgIHJlY2lwaWVudFByaXZhdGVBcm1vcjogYmFja3VwR3BnS2V5cGFpci5wcml2YXRlS2V5LFxuICAgICAgICAgICAgc2VuZGVyUHVibGljQXJtb3I6IGJpdGdvR3BnS2V5cGFpci5wdWJsaWNLZXksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuU2hhcmU6IHVzZXJUb0JhY2t1cFNoYXJlLFxuICAgICAgICAgICAgcmVjaXBpZW50UHJpdmF0ZUFybW9yOiBiYWNrdXBHcGdLZXlwYWlyLnByaXZhdGVLZXksXG4gICAgICAgICAgICBzZW5kZXJQdWJsaWNBcm1vcjogdXNlckdwZ0tleXBhaXIucHVibGljS2V5LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGNvbW1vbktleWNoYWluXG4gICAgICApO1xuXG4gICAgICBjb21iaW5lZEJhY2t1cEtleS5jb21tb25LZXljaGFpbi5zaG91bGQuZXF1YWwoY29tbW9uS2V5Y2hhaW4pO1xuICAgICAgY29tYmluZWRCYWNrdXBLZXkuc2lnbmluZ01hdGVyaWFsLnBTaGFyZS5zaG91bGQuZGVlcEVxdWFsKGJhY2t1cEtleVNoYXJlLnBTaGFyZSk7XG4gICAgICBzaG91bGQuZXhpc3QoY29tYmluZWRCYWNrdXBLZXkuc2lnbmluZ01hdGVyaWFsLnVzZXJOU2hhcmUpO1xuICAgICAgY29tYmluZWRCYWNrdXBLZXkuc2lnbmluZ01hdGVyaWFsLnVzZXJOU2hhcmU/LnNob3VsZC5kZWVwRXF1YWwodXNlcktleVNoYXJlLm5TaGFyZXNbMl0pO1xuICAgICAgY29tYmluZWRCYWNrdXBLZXkuc2lnbmluZ01hdGVyaWFsLmJpdGdvTlNoYXJlLnNob3VsZC5kZWVwRXF1YWwoYml0Z29LZXlTaGFyZS5uU2hhcmVzWzJdKTtcbiAgICAgIHNob3VsZC5ub3QuZXhpc3QoY29tYmluZWRCYWNrdXBLZXkuc2lnbmluZ01hdGVyaWFsLmJhY2t1cE5TaGFyZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgaWYgY29tbW9uIGtleWNoYWlucyBkbyBub3QgbWF0Y2gnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBiaXRnb1RvVXNlclNoYXJlID0gYXdhaXQgZW5jcnlwdE5TaGFyZShiaXRnb0tleVNoYXJlLCAxLCB1c2VyR3BnS2V5cGFpci5wdWJsaWNLZXksIHVzZXJHcGdLZXlwYWlyKTtcbiAgICAgIGNvbnN0IGJhY2t1cFRvVXNlclNoYXJlID0gYXdhaXQgZW5jcnlwdE5TaGFyZShiYWNrdXBLZXlTaGFyZSwgMSwgdXNlckdwZ0tleXBhaXIucHVibGljS2V5LCB1c2VyR3BnS2V5cGFpcik7XG5cbiAgICAgIC8vIHRoaXMgc2hvdWxkIGZhaWwgdG8gY29tYmluZSB0aGUga2V5cyBiZWNhdXNlIHdlIHBhc3MgaW4gaW52YWxpZCBjb21tb24ga2V5IGNoYWluXG4gICAgICBhd2FpdCBjcmVhdGVDb21iaW5lZEtleShcbiAgICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgICBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgblNoYXJlOiBiaXRnb1RvVXNlclNoYXJlLFxuICAgICAgICAgICAgcmVjaXBpZW50UHJpdmF0ZUFybW9yOiB1c2VyR3BnS2V5cGFpci5wcml2YXRlS2V5LFxuICAgICAgICAgICAgc2VuZGVyUHVibGljQXJtb3I6IGJpdGdvR3BnS2V5cGFpci5wdWJsaWNLZXksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuU2hhcmU6IGJhY2t1cFRvVXNlclNoYXJlLFxuICAgICAgICAgICAgcmVjaXBpZW50UHJpdmF0ZUFybW9yOiB1c2VyR3BnS2V5cGFpci5wcml2YXRlS2V5LFxuICAgICAgICAgICAgc2VuZGVyUHVibGljQXJtb3I6IGJhY2t1cEdwZ0tleXBhaXIucHVibGljS2V5LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgICdub3R0aGVyaWdodGtleWNoYWluJ1xuICAgICAgKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdDb21tb24ga2V5Y2hhaW5zIGRvIG5vdCBtYXRjaCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGlmIGdwZyBrZXlzIGFyZSBtaXNtYXRjaGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYml0Z29Ub1VzZXJTaGFyZSA9IGF3YWl0IGVuY3J5cHROU2hhcmUoYml0Z29LZXlTaGFyZSwgMSwgdXNlckdwZ0tleXBhaXIucHVibGljS2V5LCB1c2VyR3BnS2V5cGFpcik7XG4gICAgICBjb25zdCBiYWNrdXBUb1VzZXJTaGFyZSA9IGF3YWl0IGVuY3J5cHROU2hhcmUoYmFja3VwS2V5U2hhcmUsIDEsIHVzZXJHcGdLZXlwYWlyLnB1YmxpY0tleSwgdXNlckdwZ0tleXBhaXIpO1xuXG4gICAgICBhd2FpdCBjcmVhdGVDb21iaW5lZEtleShcbiAgICAgICAgdXNlcktleVNoYXJlLFxuICAgICAgICBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgblNoYXJlOiBiaXRnb1RvVXNlclNoYXJlLFxuICAgICAgICAgICAgcmVjaXBpZW50UHJpdmF0ZUFybW9yOiBiYWNrdXBHcGdLZXlwYWlyLnByaXZhdGVLZXksXG4gICAgICAgICAgICBzZW5kZXJQdWJsaWNBcm1vcjogYml0Z29HcGdLZXlwYWlyLnB1YmxpY0tleSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5TaGFyZTogYmFja3VwVG9Vc2VyU2hhcmUsXG4gICAgICAgICAgICByZWNpcGllbnRQcml2YXRlQXJtb3I6IHVzZXJHcGdLZXlwYWlyLnByaXZhdGVLZXksXG4gICAgICAgICAgICBzZW5kZXJQdWJsaWNBcm1vcjogYmFja3VwR3BnS2V5cGFpci5wdWJsaWNLZXksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgJ25vdHRoZXJpZ2h0a2V5Y2hhaW4nXG4gICAgICApLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0Vycm9yIGRlY3J5cHRpbmcgbWVzc2FnZTogU2Vzc2lvbiBrZXkgZGVjcnlwdGlvbiBmYWlsZWQuJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd0c3Mgc2lnbmluZyBoZWxwZXIgZnVuY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R28sIHsgZW52OiAnbW9jaycgfSk7XG4gICAgYml0Z28uaW5pdGlhbGl6ZVRlc3RWYXJzKCk7XG5cbiAgICBsZXQgd2FsbGV0OiBXYWxsZXQ7XG4gICAgY29uc3QgdHhSZXF1ZXN0ID0ge1xuICAgICAgdHhSZXF1ZXN0SWQ6ICdyYW5kb21JZCcsXG4gICAgICB1bnNpZ25lZFR4czogW3sgc2lnbmFibGVIZXg6ICdUT08gTUFOWSBTRUNSRVRTJywgc2VyaWFsaXplZFR4SGV4OiAncmFuZG9taGV4MicgfV0sXG4gICAgICBzaWduYXR1cmVTaGFyZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGZyb206ICdiaXRnbycsXG4gICAgICAgICAgdG86ICd1c2VyJyxcbiAgICAgICAgICBzaGFyZTogJycsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gICAgY29uc3Qgc2lnbmFibGVQYXlsb2FkID0gQnVmZmVyLmZyb20odHhSZXF1ZXN0LnVuc2lnbmVkVHhzWzBdLnNpZ25hYmxlSGV4LCAnaGV4Jyk7XG5cbiAgICBiZWZvcmUoJ2luaXRpYWxpemVzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYmFzZUNvaW4gPSBiaXRnby5jb2luKCdodGV0aCcpO1xuICAgICAgY29uc3Qgd2FsbGV0RGF0YSA9IHtcbiAgICAgICAgaWQ6ICc1YjM0MjUyZjFiZjM0OTkzMGUzNDAyMGEwMDAwMDAwMCcsXG4gICAgICAgIGNvaW46ICdodGV0aCcsXG4gICAgICAgIGtleXM6IFtcbiAgICAgICAgICAnNWIzNDI0ZjkxYmYzNDk5MzBlMzQwMTc1MDAwMDAwMDAnLFxuICAgICAgICAgICc1YjM0MjRmOTFiZjM0OTkzMGUzNDAxNzYwMDAwMDAwMCcsXG4gICAgICAgICAgJzViMzQyNGY5MWJmMzQ5OTMwZTM0MDE3NzAwMDAwMDAwJyxcbiAgICAgICAgXSxcbiAgICAgICAgY29pblNwZWNpZmljOiB7fSxcbiAgICAgIH07XG4gICAgICB3YWxsZXQgPSBuZXcgV2FsbGV0KGJpdGdvLCBiYXNlQ29pbiwgd2FsbGV0RGF0YSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnY3JlYXRlVXNlclNpZ25TaGFyZTonLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgdXNlclRvQml0R29QYWlsbGllckNoYWxsZW5nZTogRWNkc2FUeXBlcy5TZXJpYWxpemVkUGFpbGxpZXJDaGFsbGVuZ2U7XG4gICAgICBsZXQgYml0Z29Ub1VzZXJQYWlsbGllckNoYWxsZW5nZTogRWNkc2FUeXBlcy5TZXJpYWxpemVkUGFpbGxpZXJDaGFsbGVuZ2U7XG5cbiAgICAgIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHVzZXJUb0JpdEdvUGFpbGxpZXJDaGFsbGVuZ2UgPSBFY2RzYVR5cGVzLnNlcmlhbGl6ZVBhaWxsaWVyQ2hhbGxlbmdlKHtcbiAgICAgICAgICBwOiBhd2FpdCBFY2RzYVBhaWxsaWVyUHJvb2YuZ2VuZXJhdGVQKGhleFRvQmlnSW50KHVzZXJLZXkueVNoYXJlc1szXS5uKSksXG4gICAgICAgIH0pO1xuICAgICAgICBiaXRnb1RvVXNlclBhaWxsaWVyQ2hhbGxlbmdlID0gRWNkc2FUeXBlcy5zZXJpYWxpemVQYWlsbGllckNoYWxsZW5nZSh7XG4gICAgICAgICAgcDogYXdhaXQgRWNkc2FQYWlsbGllclByb29mLmdlbmVyYXRlUChoZXhUb0JpZ0ludCh1c2VyS2V5LnhTaGFyZS5uKSksXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgc3VjY2VlZCB0byBjcmVhdGUgVXNlciBTaWduU2hhcmUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHhTaGFyZSA9IG1wYy5hcHBlbmRDaGFsbGVuZ2UoXG4gICAgICAgICAgdXNlcktleS54U2hhcmUsXG4gICAgICAgICAgbW9ja1NlcmlhbGl6ZWRDaGFsbGVuZ2VXaXRoUHJvb2ZzLFxuICAgICAgICAgIHVzZXJUb0JpdEdvUGFpbGxpZXJDaGFsbGVuZ2VcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgeVNoYXJlID0gbXBjLmFwcGVuZENoYWxsZW5nZShcbiAgICAgICAgICB1c2VyS2V5LnlTaGFyZXNbM10sXG4gICAgICAgICAgeyBudGlsZGU6IHhTaGFyZS5udGlsZGUsIGgxOiB4U2hhcmUuaDEsIGgyOiB4U2hhcmUuaDIgfSxcbiAgICAgICAgICBiaXRnb1RvVXNlclBhaWxsaWVyQ2hhbGxlbmdlXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHVzZXJTaWduU2hhcmUgPSBhd2FpdCBFQ0RTQU1ldGhvZHMuY3JlYXRlVXNlclNpZ25TaGFyZSh4U2hhcmUsIHlTaGFyZSk7XG4gICAgICAgIHVzZXJTaWduU2hhcmUuc2hvdWxkLmhhdmUucHJvcGVydGllcyhbJ3dTaGFyZScsICdrU2hhcmUnXSk7XG4gICAgICAgIGNvbnN0IHsgd1NoYXJlLCBrU2hhcmUgfSA9IHVzZXJTaWduU2hhcmU7XG4gICAgICAgIHdTaGFyZS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnZ2FtbWEnKS5hbmQuYmUuYS5TdHJpbmcoKTtcbiAgICAgICAgd1NoYXJlLnNob3VsZC5oYXZlLnByb3BlcnR5KCd3JykuYW5kLmJlLmEuU3RyaW5nKCk7XG4gICAgICAgIHdTaGFyZS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnaycpLmFuZC5iZS5hLlN0cmluZygpO1xuICAgICAgICB3U2hhcmUuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2NrJykuYW5kLmJlLmEuU3RyaW5nKCk7XG4gICAgICAgIHdTaGFyZS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnaDInKS5hbmQuYmUuYS5TdHJpbmcoKTtcbiAgICAgICAgd1NoYXJlLnNob3VsZC5oYXZlLnByb3BlcnR5KCdoMScpLmFuZC5iZS5hLlN0cmluZygpO1xuICAgICAgICB3U2hhcmUuc2hvdWxkLmhhdmUucHJvcGVydHkoJ250aWxkZScpLmFuZC5iZS5hLlN0cmluZygpO1xuICAgICAgICB3U2hhcmUuc2hvdWxkLmhhdmUucHJvcGVydHkoJ3knKS5hbmQuYmUuYS5TdHJpbmcoKTtcbiAgICAgICAgd1NoYXJlLnNob3VsZC5oYXZlLnByb3BlcnR5KCduJykuYW5kLmJlLmEuU3RyaW5nKCk7XG4gICAgICAgIHdTaGFyZS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnbScpLmFuZC5iZS5hLlN0cmluZygpO1xuICAgICAgICB3U2hhcmUuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2wnKS5hbmQuYmUuYS5TdHJpbmcoKTtcbiAgICAgICAgd1NoYXJlLnNob3VsZC5oYXZlLnByb3BlcnR5KCdpJykuYW5kLmJlLmEuTnVtYmVyKCk7XG4gICAgICAgIGtTaGFyZVsnaSddLnNob3VsZC5lcXVhbCgzKTtcbiAgICAgICAga1NoYXJlWydqJ10uc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgICBrU2hhcmUuc2hvdWxkLmhhdmUucHJvcGVydHkoJ24nKS5hbmQuYmUuYS5TdHJpbmcoKTtcbiAgICAgICAga1NoYXJlLnNob3VsZC5oYXZlLnByb3BlcnR5KCdrJykuYW5kLmJlLmEuU3RyaW5nKCk7XG4gICAgICAgIGtTaGFyZS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnbnRpbGRlJykuYW5kLmJlLmEuU3RyaW5nKCk7XG4gICAgICAgIGtTaGFyZS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnaDEnKS5hbmQuYmUuYS5TdHJpbmcoKTtcbiAgICAgICAga1NoYXJlLnNob3VsZC5oYXZlLnByb3BlcnR5KCdoMicpLmFuZC5iZS5hLlN0cmluZygpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZmFpbCBpZiB0aGUgWHNoYXJlIGRvZXNudCBiZWxvbmcgdG8gdGhlIFVzZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCB4U2hhcmUgPSBtcGMuYXBwZW5kQ2hhbGxlbmdlKFxuICAgICAgICAgIHVzZXJLZXkueFNoYXJlLFxuICAgICAgICAgIG1vY2tTZXJpYWxpemVkQ2hhbGxlbmdlV2l0aFByb29mcyxcbiAgICAgICAgICB1c2VyVG9CaXRHb1BhaWxsaWVyQ2hhbGxlbmdlXG4gICAgICAgICk7XG4gICAgICAgIHhTaGFyZSA9IHsgLi4ueFNoYXJlLCBpOiAzIH07XG4gICAgICAgIGNvbnN0IHlTaGFyZSA9IG1wYy5hcHBlbmRDaGFsbGVuZ2UoXG4gICAgICAgICAgdXNlcktleS55U2hhcmVzWzNdLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG50aWxkZTogeFNoYXJlLm50aWxkZSxcbiAgICAgICAgICAgIGgxOiB4U2hhcmUuaDEsXG4gICAgICAgICAgICBoMjogeFNoYXJlLmgyLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYml0Z29Ub1VzZXJQYWlsbGllckNoYWxsZW5nZVxuICAgICAgICApO1xuICAgICAgICBhd2FpdCBFQ0RTQU1ldGhvZHMuY3JlYXRlVXNlclNpZ25TaGFyZSh4U2hhcmUsIHlTaGFyZSkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgICBgSW52YWxpZCBYU2hhcmUsIFhTaGFyZSBkb2Vzbid0IGJlbG9uZyB0byB0aGUgVXNlcmBcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2NyZWF0ZVVzZXJHYW1tYUFuZE11U2hhcmU6JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIGNyZWF0ZSBVc2VyIEdhbW1hIFNoYXJlIGFuZCBNdVNoYXJlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB1c2VyU2hhcmUgPSBhd2FpdCBFQ0RTQU1ldGhvZHMuY3JlYXRlVXNlckdhbW1hQW5kTXVTaGFyZShcbiAgICAgICAgICBnYW1tYUFuZE11U2hhcmVDcmVhdGlvblBhcmFtcy53U2hhcmUsXG4gICAgICAgICAgZ2FtbWFBbmRNdVNoYXJlQ3JlYXRpb25QYXJhbXMuYVNoYXJlXG4gICAgICAgICk7XG4gICAgICAgIHVzZXJTaGFyZS5zaG91bGQuaGF2ZS5wcm9wZXJ0aWVzKFsnbXVTaGFyZScsICdnU2hhcmUnXSk7XG4gICAgICAgIGNvbnN0IHsgbXVTaGFyZSwgZ1NoYXJlIH0gPSB1c2VyU2hhcmU7XG4gICAgICAgIG11U2hhcmU/Lmk/LnNob3VsZC5lcXVhbCgzKTtcbiAgICAgICAgbXVTaGFyZT8uaj8uc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgICBtdVNoYXJlPy5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnYWxwaGEnKS5hbmQuYmUuYS5TdHJpbmcoKTtcbiAgICAgICAgbXVTaGFyZT8uc2hvdWxkLmhhdmUucHJvcGVydHkoJ211JykuYW5kLmJlLmEuU3RyaW5nKCk7XG4gICAgICAgIGdTaGFyZT8uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2JldGEnKS5hbmQuYmUuYS5TdHJpbmcoKTtcbiAgICAgICAgZ1NoYXJlPy5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnbnUnKS5hbmQuYmUuYS5TdHJpbmcoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZhaWwgaWYgdGhlIFdzaGFyZSAvIEFTaGFyZSBkb2VzbnQgYmVsb25nIHRvIHRoZSBVc2VyJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBpbnZhbGlkV1NoYXJlID0geyAuLi5nYW1tYUFuZE11U2hhcmVDcmVhdGlvblBhcmFtcy53U2hhcmUsIGk6IDMgfTtcbiAgICAgICAgY29uc3QgaW52YWxpZEFTaGFyZSA9IHsgLi4uZ2FtbWFBbmRNdVNoYXJlQ3JlYXRpb25QYXJhbXMuYVNoYXJlLCBpOiAzIH07XG4gICAgICAgIGF3YWl0IEVDRFNBTWV0aG9kcy5jcmVhdGVVc2VyR2FtbWFBbmRNdVNoYXJlKFxuICAgICAgICAgIGludmFsaWRXU2hhcmUsXG4gICAgICAgICAgZ2FtbWFBbmRNdVNoYXJlQ3JlYXRpb25QYXJhbXMuYVNoYXJlXG4gICAgICAgICkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChgSW52YWxpZCBXU2hhcmUsIGRvZXNuJ3QgYmVsb25nIHRvIHRoZSBVc2VyYCk7XG4gICAgICAgIGF3YWl0IEVDRFNBTWV0aG9kcy5jcmVhdGVVc2VyR2FtbWFBbmRNdVNoYXJlKFxuICAgICAgICAgIGdhbW1hQW5kTXVTaGFyZUNyZWF0aW9uUGFyYW1zLndTaGFyZSxcbiAgICAgICAgICBpbnZhbGlkQVNoYXJlXG4gICAgICAgICkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChgSW52YWxpZCBBU2hhcmUsIGlzIG5vdCBmcm9tIEJpdGdvIHRvIFVzZXJgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2NyZWF0ZVVzZXJPbWljcm9uQW5kRGVsdGFTaGFyZTonLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgdG8gY3JlYXRlIFVzZXIgT21pY3JvbiBhbmQgTXUgU2hhcmVzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB1c2VyU2hhcmUgPSBhd2FpdCBFQ0RTQU1ldGhvZHMuY3JlYXRlVXNlck9taWNyb25BbmREZWx0YVNoYXJlKG9taWNyb25BbmREZWx0YVNoYXJlQ3JlYXRpb25QYXJhbXMuZ1NoYXJlKTtcbiAgICAgICAgdXNlclNoYXJlLnNob3VsZC5oYXZlLnByb3BlcnRpZXMoWydkU2hhcmUnLCAnb1NoYXJlJ10pO1xuICAgICAgICBjb25zdCB7IGRTaGFyZSwgb1NoYXJlIH0gPSB1c2VyU2hhcmU7XG4gICAgICAgIGRTaGFyZT8uaT8uc2hvdWxkLmVxdWFsKDMpO1xuICAgICAgICBkU2hhcmU/Lmo/LnNob3VsZC5lcXVhbCgxKTtcbiAgICAgICAgZFNoYXJlPy5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnZGVsdGEnKS5hbmQuYmUuYS5TdHJpbmcoKTtcbiAgICAgICAgZFNoYXJlPy5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnR2FtbWEnKS5hbmQuYmUuYS5TdHJpbmcoKTtcbiAgICAgICAgb1NoYXJlPy5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnb21pY3JvbicpLmFuZC5iZS5hLlN0cmluZygpO1xuICAgICAgICBvU2hhcmU/LnNob3VsZC5oYXZlLnByb3BlcnR5KCdkZWx0YScpLmFuZC5iZS5hLlN0cmluZygpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KGBzaG91bGQgZmFpbCBpZiB0aGUgZ1NoYXJlIGRvZXNuJ3QgYmVsb25nIHRvIHRoZSBVc2VyYCwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBpbnZhbGlkR1NoYXJlID0geyAuLi5vbWljcm9uQW5kRGVsdGFTaGFyZUNyZWF0aW9uUGFyYW1zLmdTaGFyZSwgaTogMyB9O1xuICAgICAgICBhd2FpdCBFQ0RTQU1ldGhvZHMuY3JlYXRlVXNlck9taWNyb25BbmREZWx0YVNoYXJlKGludmFsaWRHU2hhcmUpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICAgYEludmFsaWQgR1NoYXJlLCBkb2Vzbid0IGJlbG9uZyB0byB0aGUgVXNlcmBcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2NyZWF0ZVVzZXJTaWduYXR1cmVTaGFyZTonLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICBub2NrLmNsZWFuQWxsKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIGNyZWF0ZSBVc2VyIFNpZ25hdHVyZSBTaGFyZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdXNlclNpZ25hdHVyZVNoYXJlID0gYXdhaXQgRUNEU0FNZXRob2RzLmNyZWF0ZVVzZXJTaWduYXR1cmVTaGFyZShcbiAgICAgICAgICBjcmVhdGVVc2VyU2lnbmF0dXJlUGFyYW1zLm9TaGFyZSxcbiAgICAgICAgICBjcmVhdGVVc2VyU2lnbmF0dXJlUGFyYW1zLmRTaGFyZSxcbiAgICAgICAgICBzaWduYWJsZVBheWxvYWRcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgeyBSLCBzLCB5LCBpIH0gPSB1c2VyU2lnbmF0dXJlU2hhcmU7XG4gICAgICAgIGkuc2hvdWxkLmJlLk51bWJlcigpO1xuICAgICAgICBSLnNob3VsZC5iZS5hLlN0cmluZygpO1xuICAgICAgICBzLnNob3VsZC5iZS5hLlN0cmluZygpO1xuICAgICAgICB5LnNob3VsZC5iZS5hLlN0cmluZygpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KGBzaG91bGQgZmFpbCBpZiB0aGUgT1NoYXJlIC8gZFNoYXJlIGRvZXNuJ3QgYmVsb25nIHRvIHRoZSBVc2VyYCwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBpbnZhbGlkT1NoYXJlID0geyAuLi5jcmVhdGVVc2VyU2lnbmF0dXJlUGFyYW1zLm9TaGFyZSwgaTogMyB9O1xuICAgICAgICBhd2FpdCBFQ0RTQU1ldGhvZHMuY3JlYXRlVXNlclNpZ25hdHVyZVNoYXJlKFxuICAgICAgICAgIGludmFsaWRPU2hhcmUsXG4gICAgICAgICAgY3JlYXRlVXNlclNpZ25hdHVyZVBhcmFtcy5kU2hhcmUsXG4gICAgICAgICAgc2lnbmFibGVQYXlsb2FkXG4gICAgICAgICkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChgSW52YWxpZCBPU2hhcmUsIGRvZXNuJ3QgYmVsb25nIHRvIHRoZSBVc2VyYCk7XG4gICAgICAgIGNvbnN0IGludmFsaWREU2hhcmUgPSB7IC4uLmNyZWF0ZVVzZXJTaWduYXR1cmVQYXJhbXMuZFNoYXJlLCBpOiAzIH07XG4gICAgICAgIGF3YWl0IEVDRFNBTWV0aG9kcy5jcmVhdGVVc2VyU2lnbmF0dXJlU2hhcmUoXG4gICAgICAgICAgY3JlYXRlVXNlclNpZ25hdHVyZVBhcmFtcy5vU2hhcmUsXG4gICAgICAgICAgaW52YWxpZERTaGFyZSxcbiAgICAgICAgICBzaWduYWJsZVBheWxvYWRcbiAgICAgICAgKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKGBJbnZhbGlkIERTaGFyZSwgZG9lc24ndCBzZWVtIHRvIGJlIGZyb20gQml0R29gKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3NlbmRTaWduYXR1cmVTaGFyZSBUZXN0cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIG5vY2suY2xlYW5BbGwoKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBtb2NrQVNoYXJlU3RyaW5nID0gRUNEU0FNZXRob2RzLmNvbnZlcnRBU2hhcmUobW9ja0FTaGFyZSkuc2hhcmU7XG4gICAgICBjb25zdCBtb2NrRFNoYXJlU3RyaW5nID0gRUNEU0FNZXRob2RzLmNvbnZlcnREU2hhcmUobW9ja0RTaGFyZSkuc2hhcmU7XG4gICAgICBjb25zdCBjb25maWcgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBzaGFyZVRvU2VuZDogJ0tTaGFyZScsXG4gICAgICAgICAgbW9ja1NoYXJlVG9TZW5kOiBtb2NrU2lnblJULmtTaGFyZSxcbiAgICAgICAgICBtb2NrU2hhcmVUb1NlbmRTdHJpbmc6IEVDRFNBTWV0aG9kcy5jb252ZXJ0S1NoYXJlKG1vY2tTaWduUlQua1NoYXJlKS5zaGFyZSxcbiAgICAgICAgICBzZW5kVHlwZTogRUNEU0FNZXRob2RUeXBlcy5TZW5kU2hhcmVUeXBlLktTaGFyZSxcbiAgICAgICAgICBtb2NrU2hhcmVBc1Jlc3BvbnNlOiBtb2NrQVNoYXJlLFxuICAgICAgICAgIG1vY2tTaGFyZUFzUmVzcG9uc2VTdHJpbmc6IG1vY2tBU2hhcmVTdHJpbmcsXG4gICAgICAgICAgc2hhcmVSZWNlaXZlZDogJ0FTaGFyZScsXG4gICAgICAgICAgaW5jb3JyZWN0UmVjZWl2ZWRTaGFyZVN0cmluZzogbW9ja0FTaGFyZS5rLFxuICAgICAgICAgIHNpZ25lclNoYXJlOiAnYSB2YWxpZCBzaWduZXIgc2hhcmUnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc2hhcmVUb1NlbmQ6ICdNVVNoYXJlJyxcbiAgICAgICAgICBtb2NrU2hhcmVUb1NlbmQ6IHsgbXVTaGFyZTogbW9ja011U2hhcmUsIGRTaGFyZTogbW9ja0RTaGFyZVRvQml0Z28sIGk6IG1vY2tNdVNoYXJlLmkgfSxcbiAgICAgICAgICBtb2NrU2hhcmVUb1NlbmRTdHJpbmc6IGAke0VDRFNBTWV0aG9kcy5jb252ZXJ0TXVTaGFyZShtb2NrTXVTaGFyZSkuc2hhcmV9JHtFQ0RTQU1ldGhvZHMuc2Vjb25kYXJ5RGVsaW1ldGVyfSR7XG4gICAgICAgICAgICBFQ0RTQU1ldGhvZHMuY29udmVydERTaGFyZShtb2NrRFNoYXJlVG9CaXRnbykuc2hhcmVcbiAgICAgICAgICB9YCxcbiAgICAgICAgICBzZW5kVHlwZTogRUNEU0FNZXRob2RUeXBlcy5TZW5kU2hhcmVUeXBlLk1VU2hhcmUsXG4gICAgICAgICAgbW9ja1NoYXJlQXNSZXNwb25zZTogbW9ja0RTaGFyZSxcbiAgICAgICAgICBtb2NrU2hhcmVBc1Jlc3BvbnNlU3RyaW5nOiBtb2NrRFNoYXJlU3RyaW5nLFxuICAgICAgICAgIHNoYXJlUmVjZWl2ZWQ6ICdEU2hhcmUnLFxuICAgICAgICAgIGluY29ycmVjdFJlY2VpdmVkU2hhcmVTdHJpbmc6IG1vY2tEU2hhcmUuR2FtbWEsXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY29uZmlnLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBkZXNjcmliZShgc2VuZFNpZ25hdHVyZVNoYXJlOiAke2NvbmZpZ1tpbmRleF0uc2hhcmVUb1NlbmR9YCwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGl0KGBzaG91bGQgc3VjY2VlZCB0byBzZW5kICR7Y29uZmlnW2luZGV4XS5zaGFyZVRvU2VuZH1gLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCBtb2NrU2VuZFJlcSA9IHtcbiAgICAgICAgICAgICAgZnJvbTogJ3VzZXInLFxuICAgICAgICAgICAgICB0bzogJ2JpdGdvJyxcbiAgICAgICAgICAgICAgc2hhcmU6IGNvbmZpZ1tpbmRleF0ubW9ja1NoYXJlVG9TZW5kU3RyaW5nLFxuICAgICAgICAgICAgfSBhcyBTaWduYXR1cmVTaGFyZVJlY29yZDtcbiAgICAgICAgICAgIGNvbnN0IHNoYXJlUmVjb3JkID0ge1xuICAgICAgICAgICAgICBmcm9tOiAnYml0Z28nLFxuICAgICAgICAgICAgICB0bzogJ3VzZXInLFxuICAgICAgICAgICAgICBzaGFyZTogY29uZmlnW2luZGV4XS5tb2NrU2hhcmVBc1Jlc3BvbnNlU3RyaW5nLFxuICAgICAgICAgICAgfSBhcyBTaWduYXR1cmVTaGFyZVJlY29yZDtcbiAgICAgICAgICAgIGF3YWl0IG5vY2tTZW5kU2lnbmF0dXJlU2hhcmUoe1xuICAgICAgICAgICAgICB3YWxsZXRJZDogd2FsbGV0LmlkKCksXG4gICAgICAgICAgICAgIHR4UmVxdWVzdElkOiB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICAgICAgICAgIHNpZ25hdHVyZVNoYXJlOiBtb2NrU2VuZFJlcSxcbiAgICAgICAgICAgICAgcmVzcG9uc2U6IHNoYXJlUmVjb3JkLFxuICAgICAgICAgICAgICB0c3NUeXBlOiAnZWNkc2EnLFxuICAgICAgICAgICAgICBzaWduZXJTaGFyZTogY29uZmlnW2luZGV4XS5zaWduZXJTaGFyZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdHhSZXF1ZXN0LnNpZ25hdHVyZVNoYXJlcyA9IFtzaGFyZVJlY29yZF07XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHsgdHhSZXF1ZXN0czogW3sgdHJhbnNhY3Rpb25zOiBbeyAuLi50eFJlcXVlc3QgfV0gfV0gfTtcbiAgICAgICAgICAgIGF3YWl0IG5vY2tHZXRUeFJlcXVlc3QoeyB3YWxsZXRJZDogd2FsbGV0LmlkKCksIHR4UmVxdWVzdElkOiB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsIHJlc3BvbnNlOiByZXNwb25zZSB9KTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlQVNoYXJlID0gYXdhaXQgRUNEU0FNZXRob2RzLnNlbmRTaGFyZVRvQml0Z28oXG4gICAgICAgICAgICAgIGJpdGdvLFxuICAgICAgICAgICAgICB3YWxsZXQuaWQoKSxcbiAgICAgICAgICAgICAgdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgICAgICAgICBSZXF1ZXN0VHlwZS50eCxcbiAgICAgICAgICAgICAgY29uZmlnW2luZGV4XS5zZW5kVHlwZSxcbiAgICAgICAgICAgICAgY29uZmlnW2luZGV4XS5tb2NrU2hhcmVUb1NlbmQsXG4gICAgICAgICAgICAgIGNvbmZpZ1tpbmRleF0uc2lnbmVyU2hhcmVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXNwb25zZUFTaGFyZS5zaG91bGQuZGVlcEVxdWFsKGNvbmZpZ1tpbmRleF0ubW9ja1NoYXJlQXNSZXNwb25zZSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpdChgc2hvdWxkIGZhaWwgaWYgd2UgZ2V0IGFuIGludmFsaWQgJHtjb25maWdbaW5kZXhdLnNoYXJlUmVjZWl2ZWR9IGFzIHJlc3BvbnNlYCwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgbW9ja1NlbmRSZXEgPSB7XG4gICAgICAgICAgICAgIGZyb206ICd1c2VyJyxcbiAgICAgICAgICAgICAgdG86ICdiaXRnbycsXG4gICAgICAgICAgICAgIHNoYXJlOiBjb25maWdbaW5kZXhdLm1vY2tTaGFyZVRvU2VuZFN0cmluZyxcbiAgICAgICAgICAgIH0gYXMgU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gICAgICAgICAgICBjb25zdCBpbnZhbGlkU2lnbmF0dXJlU2hhcmUgPSB7XG4gICAgICAgICAgICAgIGZyb206ICdiaXRnbycsXG4gICAgICAgICAgICAgIHRvOiAndXNlcicsXG4gICAgICAgICAgICAgIHNoYXJlOiBKU09OLnN0cmluZ2lmeShjb25maWdbaW5kZXhdLmluY29ycmVjdFJlY2VpdmVkU2hhcmVTdHJpbmcpLFxuICAgICAgICAgICAgfSBhcyBTaWduYXR1cmVTaGFyZVJlY29yZDtcbiAgICAgICAgICAgIGNvbnN0IG5vY2sgPSBhd2FpdCBub2NrU2VuZFNpZ25hdHVyZVNoYXJlKFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd2FsbGV0SWQ6IHdhbGxldC5pZCgpLFxuICAgICAgICAgICAgICAgIHR4UmVxdWVzdElkOiB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlU2hhcmU6IG1vY2tTZW5kUmVxLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlOiBpbnZhbGlkU2lnbmF0dXJlU2hhcmUsXG4gICAgICAgICAgICAgICAgdHNzVHlwZTogJ2VjZHNhJyxcbiAgICAgICAgICAgICAgICBzaWduZXJTaGFyZTogY29uZmlnW2luZGV4XS5zaWduZXJTaGFyZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgMjAwXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdHhSZXF1ZXN0LnNpZ25hdHVyZVNoYXJlcyA9IFtpbnZhbGlkU2lnbmF0dXJlU2hhcmVdO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB7IHR4UmVxdWVzdHM6IFt7IHRyYW5zYWN0aW9uczogW3sgLi4udHhSZXF1ZXN0IH1dIH1dIH07XG4gICAgICAgICAgICBhd2FpdCBub2NrR2V0VHhSZXF1ZXN0KHsgd2FsbGV0SWQ6IHdhbGxldC5pZCgpLCB0eFJlcXVlc3RJZDogdHhSZXF1ZXN0LnR4UmVxdWVzdElkLCByZXNwb25zZTogcmVzcG9uc2UgfSk7XG4gICAgICAgICAgICBhd2FpdCBFQ0RTQU1ldGhvZHMuc2VuZFNoYXJlVG9CaXRnbyhcbiAgICAgICAgICAgICAgYml0Z28sXG4gICAgICAgICAgICAgIHdhbGxldC5pZCgpLFxuICAgICAgICAgICAgICB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICAgICAgICAgIFJlcXVlc3RUeXBlLnR4LFxuICAgICAgICAgICAgICBjb25maWdbaW5kZXhdLnNlbmRUeXBlLFxuICAgICAgICAgICAgICBjb25maWdbaW5kZXhdLm1vY2tTaGFyZVRvU2VuZCxcbiAgICAgICAgICAgICAgY29uZmlnW2luZGV4XS5zaWduZXJTaGFyZVxuICAgICAgICAgICAgKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9JbnZhbGlkIC4qIHNoYXJlL2cpOyAvLyBgSW52YWxpZCAke3NoYXJlTmFtZX0gc2hhcmVgXG4gICAgICAgICAgICBub2NrLmlzRG9uZSgpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZ2V0VHhSZXF1ZXN0OicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIG5vY2suY2xlYW5BbGwoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgdG8gZ2V0IHR4UmVxdWVzdCBieSBpZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB7IHR4UmVxdWVzdHM6IFt0eFJlcXVlc3RdIH07XG4gICAgICAgIGNvbnN0IG5vY2sgPSBhd2FpdCBub2NrR2V0VHhSZXF1ZXN0KHsgd2FsbGV0SWQ6IHdhbGxldC5pZCgpLCB0eFJlcXVlc3RJZDogdHhSZXF1ZXN0LnR4UmVxdWVzdElkLCByZXNwb25zZSB9KTtcbiAgICAgICAgY29uc3QgdHhSZXEgPSBhd2FpdCBnZXRUeFJlcXVlc3QoYml0Z28sIHdhbGxldC5pZCgpLCB0eFJlcXVlc3QudHhSZXF1ZXN0SWQpO1xuICAgICAgICB0eFJlcS5zaG91bGQuZGVlcEVxdWFsKHR4UmVxdWVzdCk7XG4gICAgICAgIG5vY2suaXNEb25lKCkuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZmFpbCBpZiB0aGVyZSBhcmUgbm8gdHhSZXF1ZXN0cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB7IHR4UmVxdWVzdHM6IFtdIH07XG4gICAgICAgIGNvbnN0IG5vY2sgPSBhd2FpdCBub2NrR2V0VHhSZXF1ZXN0KHsgd2FsbGV0SWQ6IHdhbGxldC5pZCgpLCB0eFJlcXVlc3RJZDogdHhSZXF1ZXN0LnR4UmVxdWVzdElkLCByZXNwb25zZSB9KTtcbiAgICAgICAgYXdhaXQgZ2V0VHhSZXF1ZXN0KGJpdGdvLCB3YWxsZXQuaWQoKSwgdHhSZXF1ZXN0LnR4UmVxdWVzdElkKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAgICdVbmFibGUgdG8gZmluZCBUeFJlcXVlc3Qgd2l0aCBpZCByYW5kb21JZCdcbiAgICAgICAgKTtcbiAgICAgICAgbm9jay5pc0RvbmUoKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzaWduaW5nIHNoYXJlIHBhcnNlcnMgYW5kIGNvbnZlcnRlcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICBub2NrLmNsZWFuQWxsKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzdWNjZXNzZnVsbHkgcGFyc2UgSyBzaGFyZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYml0Z29LU2hhcmUgPSBtb2NrU2lnbldpdGhQYWlsbGllckNoYWxsZW5nZVJULmtTaGFyZTtcbiAgICAgICAgY29uc3Qgc2hhcmUgPSB7XG4gICAgICAgICAgdG86IFNpZ25hdHVyZVNoYXJlVHlwZS5CSVRHTyxcbiAgICAgICAgICBmcm9tOiBTaWduYXR1cmVTaGFyZVR5cGUuVVNFUixcbiAgICAgICAgICBzaGFyZTogRUNEU0FNZXRob2RzLmNvbnZlcnRLU2hhcmUobW9ja1NpZ25XaXRoUGFpbGxpZXJDaGFsbGVuZ2VSVC5rU2hhcmUpLnNoYXJlLFxuICAgICAgICB9IGFzIFNpZ25hdHVyZVNoYXJlUmVjb3JkO1xuICAgICAgICBjb25zdCBrU2hhcmUgPSBFQ0RTQU1ldGhvZHMucGFyc2VLU2hhcmUoc2hhcmUpO1xuICAgICAgICBrU2hhcmUuc2hvdWxkLmRlZXBFcXVhbChiaXRnb0tTaGFyZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzdWNjZXNzZnVsbHkgY29udmVydCBLIHNoYXJlIHRvIHNpZ25hdHVyZSBzaGFyZSByZWNvcmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGJpdGdvS1NoYXJlID0gbW9ja1NpZ25XaXRoUGFpbGxpZXJDaGFsbGVuZ2VSVC5rU2hhcmU7XG4gICAgICAgIGNvbnN0IHNoYXJlID0ge1xuICAgICAgICAgIHRvOiBTaWduYXR1cmVTaGFyZVR5cGUuQklUR08sXG4gICAgICAgICAgZnJvbTogU2lnbmF0dXJlU2hhcmVUeXBlLlVTRVIsXG4gICAgICAgICAgc2hhcmU6IGAke21vY2tTaWduUlQua1NoYXJlLmt9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja1NpZ25SVC5rU2hhcmUubn0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHtcbiAgICAgICAgICAgIG1vY2tTaWduUlQua1NoYXJlLm50aWxkZVxuICAgICAgICAgIH0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrU2lnblJULmtTaGFyZS5oMX0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrU2lnblJULmtTaGFyZS5oMn0ke1xuICAgICAgICAgICAgRUNEU0FNZXRob2RzLmRlbGltZXRlclxuICAgICAgICAgIH0ke21vY2tTaWduUlQua1NoYXJlLnByb29mPy56IHx8ICcnfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tTaWduUlQua1NoYXJlLnByb29mPy51IHx8ICcnfSR7XG4gICAgICAgICAgICBFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyXG4gICAgICAgICAgfSR7bW9ja1NpZ25SVC5rU2hhcmUucHJvb2Y/LncgfHwgJyd9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja1NpZ25SVC5rU2hhcmUucHJvb2Y/LnMgfHwgJyd9JHtcbiAgICAgICAgICAgIEVDRFNBTWV0aG9kcy5kZWxpbWV0ZXJcbiAgICAgICAgICB9JHttb2NrU2lnblJULmtTaGFyZS5wcm9vZj8uczEgfHwgJyd9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja1NpZ25SVC5rU2hhcmUucHJvb2Y/LnMyIHx8ICcnfSR7XG4gICAgICAgICAgICBFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyXG4gICAgICAgICAgfSR7Yml0Z29LU2hhcmUucC5qb2luKEVDRFNBTWV0aG9kcy5kZWxpbWV0ZXIpfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke2JpdGdvS1NoYXJlLnNpZ21hLmpvaW4oXG4gICAgICAgICAgICBFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyXG4gICAgICAgICAgKX1gLFxuICAgICAgICB9IGFzIFNpZ25hdHVyZVNoYXJlUmVjb3JkO1xuXG4gICAgICAgIGNvbnN0IGtzaGFyZSA9IEVDRFNBTWV0aG9kcy5jb252ZXJ0S1NoYXJlKGJpdGdvS1NoYXJlKTtcbiAgICAgICAga3NoYXJlLmZyb20uc2hvdWxkLmVxdWFsKHNoYXJlLmZyb20pO1xuICAgICAgICBrc2hhcmUudG8uc2hvdWxkLmVxdWFsKHNoYXJlLnRvKTtcbiAgICAgICAga3NoYXJlLnNoYXJlLnNob3VsZC5lcXVhbChzaGFyZS5zaGFyZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzdWNjZXNzZnVsbHkgcGFyc2UgQSBzaGFyZSB3aXRob3V0IHBhaWxsaWVyIGNoYWxsZW5nZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc2hhcmUgPSB7XG4gICAgICAgICAgdG86IFNpZ25hdHVyZVNoYXJlVHlwZS5VU0VSLFxuICAgICAgICAgIGZyb206IFNpZ25hdHVyZVNoYXJlVHlwZS5CSVRHTyxcbiAgICAgICAgICBzaGFyZTogRUNEU0FNZXRob2RzLmNvbnZlcnRBU2hhcmUobW9ja0FTaGFyZSkuc2hhcmUsXG4gICAgICAgIH0gYXMgU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gICAgICAgIGNvbnN0IGFTaGFyZSA9IEVDRFNBTWV0aG9kcy5wYXJzZUFTaGFyZShzaGFyZSk7XG4gICAgICAgIHNob3VsZC5leGlzdChhU2hhcmUpO1xuICAgICAgICBhU2hhcmUuc2hvdWxkLmRlZXBFcXVhbChtb2NrQVNoYXJlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHN1Y2Nlc3NmdWxseSBwYXJzZSBBIHNoYXJlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzaGFyZSA9IHtcbiAgICAgICAgICB0bzogU2lnbmF0dXJlU2hhcmVUeXBlLlVTRVIsXG4gICAgICAgICAgZnJvbTogU2lnbmF0dXJlU2hhcmVUeXBlLkJJVEdPLFxuICAgICAgICAgIHNoYXJlOiBFQ0RTQU1ldGhvZHMuY29udmVydEFTaGFyZShtb2NrQVNoYXJlKS5zaGFyZSxcbiAgICAgICAgfSBhcyBTaWduYXR1cmVTaGFyZVJlY29yZDtcbiAgICAgICAgY29uc3QgYVNoYXJlID0gRUNEU0FNZXRob2RzLnBhcnNlQVNoYXJlKHNoYXJlKTtcbiAgICAgICAgc2hvdWxkLmV4aXN0KGFTaGFyZSk7XG4gICAgICAgIGFTaGFyZS5zaG91bGQuZGVlcEVxdWFsKG1vY2tBU2hhcmUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgc3VjY2Vzc2Z1bGx5IGNvbnZlcnQgQSBzaGFyZSB0byBzaWduYXR1cmUgc2hhcmUgcmVjb3JkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBtb2NrU2hhcmUgPSBtb2NrQVNoYXJlO1xuICAgICAgICBjb25zdCBzaGFyZSA9IHtcbiAgICAgICAgICB0bzogU2lnbmF0dXJlU2hhcmVUeXBlLlVTRVIsXG4gICAgICAgICAgZnJvbTogU2lnbmF0dXJlU2hhcmVUeXBlLkJJVEdPLFxuICAgICAgICAgIHNoYXJlOiBgJHttb2NrU2hhcmUua30ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrU2hhcmUuYWxwaGF9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja1NoYXJlLm11fSR7XG4gICAgICAgICAgICBFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyXG4gICAgICAgICAgfSR7bW9ja1NoYXJlLm59JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja1NoYXJlLm50aWxkZX0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrU2hhcmUuaDF9JHtcbiAgICAgICAgICAgIEVDRFNBTWV0aG9kcy5kZWxpbWV0ZXJcbiAgICAgICAgICB9JHttb2NrU2hhcmUuaDJ9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja1NoYXJlLnByb29mPy56IHx8ICcnfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke1xuICAgICAgICAgICAgbW9ja1NoYXJlLnByb29mPy51IHx8ICcnXG4gICAgICAgICAgfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tTaGFyZS5wcm9vZj8udyB8fCAnJ30ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrU2hhcmUucHJvb2Y/LnMgfHwgJyd9JHtcbiAgICAgICAgICAgIEVDRFNBTWV0aG9kcy5kZWxpbWV0ZXJcbiAgICAgICAgICB9JHttb2NrU2hhcmUucHJvb2Y/LnMxIHx8ICcnfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tTaGFyZS5wcm9vZj8uczIgfHwgJyd9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7XG4gICAgICAgICAgICBtb2NrU2hhcmUuZ2FtbWFQcm9vZj8ueiB8fCAnJ1xuICAgICAgICAgIH0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrU2hhcmUuZ2FtbWFQcm9vZj8uenBybSB8fCAnJ30ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHtcbiAgICAgICAgICAgIG1vY2tTaGFyZS5nYW1tYVByb29mPy50IHx8ICcnXG4gICAgICAgICAgfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tTaGFyZS5nYW1tYVByb29mPy52IHx8ICcnfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke1xuICAgICAgICAgICAgbW9ja1NoYXJlLmdhbW1hUHJvb2Y/LncgfHwgJydcbiAgICAgICAgICB9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja1NoYXJlLmdhbW1hUHJvb2Y/LnMgfHwgJyd9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7XG4gICAgICAgICAgICBtb2NrU2hhcmUuZ2FtbWFQcm9vZj8uczEgfHwgJydcbiAgICAgICAgICB9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja1NoYXJlLmdhbW1hUHJvb2Y/LnMyIHx8ICcnfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke1xuICAgICAgICAgICAgbW9ja1NoYXJlLmdhbW1hUHJvb2Y/LnQxIHx8ICcnXG4gICAgICAgICAgfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tTaGFyZS5nYW1tYVByb29mPy50MiB8fCAnJ30ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHtcbiAgICAgICAgICAgIG1vY2tTaGFyZS5nYW1tYVByb29mPy51IHx8ICcnXG4gICAgICAgICAgfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tTaGFyZS5nYW1tYVByb29mPy54IHx8ICcnfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke1xuICAgICAgICAgICAgbW9ja1NoYXJlLndQcm9vZj8ueiB8fCAnJ1xuICAgICAgICAgIH0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrU2hhcmUud1Byb29mPy56cHJtIHx8ICcnfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke1xuICAgICAgICAgICAgbW9ja1NoYXJlLndQcm9vZj8udCB8fCAnJ1xuICAgICAgICAgIH0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrU2hhcmUud1Byb29mPy52IHx8ICcnfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tTaGFyZS53UHJvb2Y/LncgfHwgJyd9JHtcbiAgICAgICAgICAgIEVDRFNBTWV0aG9kcy5kZWxpbWV0ZXJcbiAgICAgICAgICB9JHttb2NrU2hhcmUud1Byb29mPy5zIHx8ICcnfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tTaGFyZS53UHJvb2Y/LnMxIHx8ICcnfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke1xuICAgICAgICAgICAgbW9ja1NoYXJlLndQcm9vZj8uczIgfHwgJydcbiAgICAgICAgICB9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja1NoYXJlLndQcm9vZj8udDEgfHwgJyd9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7XG4gICAgICAgICAgICBtb2NrU2hhcmUud1Byb29mPy50MiB8fCAnJ1xuICAgICAgICAgIH0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrU2hhcmUud1Byb29mPy51IHx8ICcnfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tTaGFyZS53UHJvb2Y/LnggfHwgJyd9JHtcbiAgICAgICAgICAgIEVDRFNBTWV0aG9kcy5kZWxpbWV0ZXJcbiAgICAgICAgICB9JHttb2NrU2hhcmUuc2lnbWEhLmpvaW4oRUNEU0FNZXRob2RzLmRlbGltZXRlcil9YCxcbiAgICAgICAgfSBhcyBTaWduYXR1cmVTaGFyZVJlY29yZDtcblxuICAgICAgICBjb25zdCBhU2hhcmUgPSBFQ0RTQU1ldGhvZHMuY29udmVydEFTaGFyZShtb2NrU2hhcmUpO1xuICAgICAgICBhU2hhcmUuZnJvbS5zaG91bGQuZXF1YWwoc2hhcmUuZnJvbSk7XG4gICAgICAgIGFTaGFyZS50by5zaG91bGQuZXF1YWwoc2hhcmUudG8pO1xuICAgICAgICBhU2hhcmUuc2hhcmUuc2hvdWxkLmVxdWFsKHNoYXJlLnNoYXJlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHN1Y2Nlc3NmdWxseSBwYXJzZSBNdSBzaGFyZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc2hhcmUgPSB7XG4gICAgICAgICAgdG86IFNpZ25hdHVyZVNoYXJlVHlwZS5CSVRHTyxcbiAgICAgICAgICBmcm9tOiBTaWduYXR1cmVTaGFyZVR5cGUuVVNFUixcbiAgICAgICAgICBzaGFyZTogRUNEU0FNZXRob2RzLmNvbnZlcnRNdVNoYXJlKG1vY2tNdVNoYXJlKS5zaGFyZSxcbiAgICAgICAgfSBhcyBTaWduYXR1cmVTaGFyZVJlY29yZDtcbiAgICAgICAgY29uc3QgbXVTaGFyZSA9IEVDRFNBTWV0aG9kcy5wYXJzZU11U2hhcmUoc2hhcmUpO1xuICAgICAgICBtdVNoYXJlLmkuc2hvdWxkLmVxdWFsKG1vY2tNdVNoYXJlLmkpO1xuICAgICAgICBtdVNoYXJlLmouc2hvdWxkLmVxdWFsKG1vY2tNdVNoYXJlLmopO1xuICAgICAgICBtdVNoYXJlLmFscGhhLnNob3VsZC5lcXVhbChtb2NrTXVTaGFyZS5hbHBoYSk7XG4gICAgICAgIG11U2hhcmUubXUuc2hvdWxkLmVxdWFsKG1vY2tNdVNoYXJlLm11KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHN1Y2Nlc3NmdWxseSBjb252ZXJ0IE11IHNoYXJlIHRvIHNpZ25hdHVyZSBzaGFyZSByZWNvcmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHNoYXJlID0ge1xuICAgICAgICAgIHRvOiBTaWduYXR1cmVTaGFyZVR5cGUuQklUR08sXG4gICAgICAgICAgZnJvbTogU2lnbmF0dXJlU2hhcmVUeXBlLlVTRVIsXG4gICAgICAgICAgc2hhcmU6IGAke21vY2tNdVNoYXJlLmFscGhhfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tNdVNoYXJlLm11fSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke1xuICAgICAgICAgICAgbW9ja011U2hhcmUuZ2FtbWFQcm9vZj8ueiB8fCAnJ1xuICAgICAgICAgIH0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrTXVTaGFyZS5nYW1tYVByb29mPy56cHJtIHx8ICcnfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke1xuICAgICAgICAgICAgbW9ja011U2hhcmUuZ2FtbWFQcm9vZj8udCB8fCAnJ1xuICAgICAgICAgIH0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrTXVTaGFyZS5nYW1tYVByb29mPy52IHx8ICcnfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke1xuICAgICAgICAgICAgbW9ja011U2hhcmUuZ2FtbWFQcm9vZj8udyB8fCAnJ1xuICAgICAgICAgIH0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrTXVTaGFyZS5nYW1tYVByb29mPy5zIHx8ICcnfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke1xuICAgICAgICAgICAgbW9ja011U2hhcmUuZ2FtbWFQcm9vZj8uczEgfHwgJydcbiAgICAgICAgICB9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja011U2hhcmUuZ2FtbWFQcm9vZj8uczIgfHwgJyd9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7XG4gICAgICAgICAgICBtb2NrTXVTaGFyZS5nYW1tYVByb29mPy50MSB8fCAnJ1xuICAgICAgICAgIH0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrTXVTaGFyZS5nYW1tYVByb29mPy50MiB8fCAnJ30ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHtcbiAgICAgICAgICAgIG1vY2tNdVNoYXJlLmdhbW1hUHJvb2Y/LnUgfHwgJydcbiAgICAgICAgICB9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja011U2hhcmUuZ2FtbWFQcm9vZj8ueCB8fCAnJ30ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHtcbiAgICAgICAgICAgIG1vY2tNdVNoYXJlLndQcm9vZj8ueiB8fCAnJ1xuICAgICAgICAgIH0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrTXVTaGFyZS53UHJvb2Y/Lnpwcm0gfHwgJyd9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7XG4gICAgICAgICAgICBtb2NrTXVTaGFyZS53UHJvb2Y/LnQgfHwgJydcbiAgICAgICAgICB9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja011U2hhcmUud1Byb29mPy52IHx8ICcnfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke1xuICAgICAgICAgICAgbW9ja011U2hhcmUud1Byb29mPy53IHx8ICcnXG4gICAgICAgICAgfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tNdVNoYXJlLndQcm9vZj8ucyB8fCAnJ30ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHtcbiAgICAgICAgICAgIG1vY2tNdVNoYXJlLndQcm9vZj8uczEgfHwgJydcbiAgICAgICAgICB9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja011U2hhcmUud1Byb29mPy5zMiB8fCAnJ30ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHtcbiAgICAgICAgICAgIG1vY2tNdVNoYXJlLndQcm9vZj8udDEgfHwgJydcbiAgICAgICAgICB9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja011U2hhcmUud1Byb29mPy50MiB8fCAnJ30ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHtcbiAgICAgICAgICAgIG1vY2tNdVNoYXJlLndQcm9vZj8udSB8fCAnJ1xuICAgICAgICAgIH0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrTXVTaGFyZS53UHJvb2Y/LnggfHwgJyd9YCxcbiAgICAgICAgfSBhcyBTaWduYXR1cmVTaGFyZVJlY29yZDtcbiAgICAgICAgY29uc3QgbXVTaGFyZSA9IEVDRFNBTWV0aG9kcy5jb252ZXJ0TXVTaGFyZShtb2NrTXVTaGFyZSk7XG4gICAgICAgIG11U2hhcmUuZnJvbS5zaG91bGQuZXF1YWwoc2hhcmUuZnJvbSk7XG4gICAgICAgIG11U2hhcmUudG8uc2hvdWxkLmVxdWFsKHNoYXJlLnRvKTtcbiAgICAgICAgbXVTaGFyZS5zaGFyZS5zaG91bGQuZXF1YWwoc2hhcmUuc2hhcmUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgc3VjY2Vzc2Z1bGx5IHBhcnNlIEQgc2hhcmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHNoYXJlID0ge1xuICAgICAgICAgIHRvOiBTaWduYXR1cmVTaGFyZVR5cGUuQklUR08sXG4gICAgICAgICAgZnJvbTogU2lnbmF0dXJlU2hhcmVUeXBlLlVTRVIsXG4gICAgICAgICAgc2hhcmU6IEVDRFNBTWV0aG9kcy5jb252ZXJ0RFNoYXJlKG1vY2tEU2hhcmVUb0JpdGdvKS5zaGFyZSxcbiAgICAgICAgfSBhcyBTaWduYXR1cmVTaGFyZVJlY29yZDtcbiAgICAgICAgY29uc3QgZFNoYXJlID0gRUNEU0FNZXRob2RzLnBhcnNlRFNoYXJlKHNoYXJlKTtcbiAgICAgICAgZFNoYXJlLmkuc2hvdWxkLmVxdWFsKG1vY2tEU2hhcmVUb0JpdGdvLmkpO1xuICAgICAgICBkU2hhcmUuai5zaG91bGQuZXF1YWwobW9ja0RTaGFyZVRvQml0Z28uaik7XG4gICAgICAgIGRTaGFyZS5kZWx0YS5zaG91bGQuZXF1YWwobW9ja0RTaGFyZVRvQml0Z28uZGVsdGEpO1xuICAgICAgICBkU2hhcmUuR2FtbWEuc2hvdWxkLmVxdWFsKG1vY2tEU2hhcmVUb0JpdGdvLkdhbW1hKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHN1Y2Nlc3NmdWxseSBjb252ZXJ0IEQgc2hhcmUgdG8gc2lnbmF0dXJlIHNoYXJlIHJlY29yZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc2hhcmUgPSB7XG4gICAgICAgICAgdG86IFNpZ25hdHVyZVNoYXJlVHlwZS5CSVRHTyxcbiAgICAgICAgICBmcm9tOiBTaWduYXR1cmVTaGFyZVR5cGUuVVNFUixcbiAgICAgICAgICBzaGFyZTogYCR7bW9ja0RTaGFyZVRvQml0Z28uZGVsdGF9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja0RTaGFyZVRvQml0Z28uR2FtbWF9YCxcbiAgICAgICAgfSBhcyBTaWduYXR1cmVTaGFyZVJlY29yZDtcbiAgICAgICAgY29uc3QgZFNoYXJlID0gRUNEU0FNZXRob2RzLmNvbnZlcnREU2hhcmUobW9ja0RTaGFyZVRvQml0Z28pO1xuICAgICAgICBkU2hhcmUuZnJvbS5zaG91bGQuZXF1YWwoc2hhcmUuZnJvbSk7XG4gICAgICAgIGRTaGFyZS50by5zaG91bGQuZXF1YWwoc2hhcmUudG8pO1xuICAgICAgICBkU2hhcmUuc2hhcmUuc2hvdWxkLmVxdWFsKHNoYXJlLnNoYXJlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHN1Y2Nlc3NmdWxseSBwYXJzZSBTIGFuZCBEIHNoYXJlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzaGFyZSA9IHtcbiAgICAgICAgICB0bzogU2lnbmF0dXJlU2hhcmVUeXBlLkJJVEdPLFxuICAgICAgICAgIGZyb206IFNpZ25hdHVyZVNoYXJlVHlwZS5VU0VSLFxuICAgICAgICAgIHNoYXJlOiBgJHttb2NrU1NoYXJlRnJvbVVzZXIuUn0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrU1NoYXJlRnJvbVVzZXIuc30ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrU1NoYXJlRnJvbVVzZXIueX0ke0VDRFNBTWV0aG9kcy5zZWNvbmRhcnlEZWxpbWV0ZXJ9JHttb2NrRFNoYXJlVG9CaXRnby5kZWx0YX0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrRFNoYXJlVG9CaXRnby5HYW1tYX1gLFxuICAgICAgICB9IGFzIFNpZ25hdHVyZVNoYXJlUmVjb3JkO1xuICAgICAgICBjb25zdCB7IHNTaGFyZSwgZFNoYXJlIH0gPSBFQ0RTQU1ldGhvZHMucGFyc2VTRFNoYXJlKHNoYXJlKTtcbiAgICAgICAgc1NoYXJlLmkuc2hvdWxkLmVxdWFsKDMpO1xuICAgICAgICBzU2hhcmUuUi5zaG91bGQuZXF1YWwobW9ja1NTaGFyZUZyb21Vc2VyLlIpO1xuICAgICAgICBzU2hhcmUucy5zaG91bGQuZXF1YWwobW9ja1NTaGFyZUZyb21Vc2VyLnMpO1xuICAgICAgICBzU2hhcmUueS5zaG91bGQuZXF1YWwobW9ja1NTaGFyZUZyb21Vc2VyLnkpO1xuICAgICAgICBkU2hhcmUuaS5zaG91bGQuZXF1YWwobW9ja0RTaGFyZVRvQml0Z28uaSk7XG4gICAgICAgIGRTaGFyZS5qLnNob3VsZC5lcXVhbChtb2NrRFNoYXJlVG9CaXRnby5qKTtcbiAgICAgICAgZFNoYXJlLmRlbHRhLnNob3VsZC5lcXVhbChtb2NrRFNoYXJlVG9CaXRnby5kZWx0YSk7XG4gICAgICAgIGRTaGFyZS5HYW1tYS5zaG91bGQuZXF1YWwobW9ja0RTaGFyZVRvQml0Z28uR2FtbWEpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgc3VjY2Vzc2Z1bGx5IGNvbnZlcnQgUyBhbmQgRCBzaGFyZSB0byBzaWduYXR1cmUgc2hhcmUgcmVjb3JkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzaGFyZSA9IHtcbiAgICAgICAgICB0bzogU2lnbmF0dXJlU2hhcmVUeXBlLkJJVEdPLFxuICAgICAgICAgIGZyb206IFNpZ25hdHVyZVNoYXJlVHlwZS5VU0VSLFxuICAgICAgICAgIHNoYXJlOiBgJHttb2NrU1NoYXJlRnJvbVVzZXIuUn0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrU1NoYXJlRnJvbVVzZXIuc30ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrU1NoYXJlRnJvbVVzZXIueX0ke0VDRFNBTWV0aG9kcy5zZWNvbmRhcnlEZWxpbWV0ZXJ9JHttb2NrRFNoYXJlVG9CaXRnby5kZWx0YX0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHttb2NrRFNoYXJlVG9CaXRnby5HYW1tYX1gLFxuICAgICAgICB9IGFzIFNpZ25hdHVyZVNoYXJlUmVjb3JkO1xuICAgICAgICBjb25zdCBzZFNoYXJlID0gRUNEU0FNZXRob2RzLmNvbnZlcnRTRFNoYXJlKHsgc1NoYXJlOiBtb2NrU1NoYXJlRnJvbVVzZXIsIGRTaGFyZTogbW9ja0RTaGFyZVRvQml0Z28gfSk7XG4gICAgICAgIHNkU2hhcmUuZnJvbS5zaG91bGQuZXF1YWwoc2hhcmUuZnJvbSk7XG4gICAgICAgIHNkU2hhcmUudG8uc2hvdWxkLmVxdWFsKHNoYXJlLnRvKTtcbiAgICAgICAgc2RTaGFyZS5zaGFyZS5zaG91bGQuZXF1YWwoc2hhcmUuc2hhcmUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgc3VjY2Vzc2Z1bGx5IHBhcnNlIHNpZ25hdHVyZSBzaGFyZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc2hhcmUgPSB7XG4gICAgICAgICAgdG86IFNpZ25hdHVyZVNoYXJlVHlwZS5VU0VSLFxuICAgICAgICAgIGZyb206IFNpZ25hdHVyZVNoYXJlVHlwZS5CSVRHTyxcbiAgICAgICAgICBzaGFyZTogYCR7bW9ja1NTaGFyZUZyb21Vc2VyLlJ9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja1NTaGFyZUZyb21Vc2VyLnN9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7bW9ja1NTaGFyZUZyb21Vc2VyLnl9YCxcbiAgICAgICAgfSBhcyBTaWduYXR1cmVTaGFyZVJlY29yZDtcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gRUNEU0FNZXRob2RzLnBhcnNlU2lnbmF0dXJlU2hhcmUoc2hhcmUpO1xuICAgICAgICBzaWduYXR1cmUuaS5zaG91bGQuZXF1YWwoMSk7XG4gICAgICAgIHNpZ25hdHVyZS5SLnNob3VsZC5lcXVhbChtb2NrU1NoYXJlRnJvbVVzZXIuUik7XG4gICAgICAgIHNpZ25hdHVyZS5zLnNob3VsZC5lcXVhbChtb2NrU1NoYXJlRnJvbVVzZXIucyk7XG4gICAgICAgIHNpZ25hdHVyZS55LnNob3VsZC5lcXVhbChtb2NrU1NoYXJlRnJvbVVzZXIueSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBzdWNjdWVzZnVsbHkgcGFyc2UgY29tYmluZWQgc2lnbmF0dXJlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBtb2NrQ29tYmluZWRTaWduYXR1cmUgPSBtcGMuY29uc3RydWN0U2lnbmF0dXJlKFttb2NrU1NoYXJlRnJvbVVzZXIsIG1vY2tTU2hhcmVdKTtcbiAgICAgICAgY29uc3Qgc2hhcmUgPSB7XG4gICAgICAgICAgdG86IFNpZ25hdHVyZVNoYXJlVHlwZS5VU0VSLFxuICAgICAgICAgIGZyb206IFNpZ25hdHVyZVNoYXJlVHlwZS5CSVRHTyxcbiAgICAgICAgICBzaGFyZTogYCR7bW9ja0NvbWJpbmVkU2lnbmF0dXJlLnJlY2lkfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tDb21iaW5lZFNpZ25hdHVyZS5yfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tDb21iaW5lZFNpZ25hdHVyZS5zfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tDb21iaW5lZFNpZ25hdHVyZS55fWAsXG4gICAgICAgIH0gYXMgU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IEVDRFNBTWV0aG9kcy5wYXJzZUNvbWJpbmVkU2lnbmF0dXJlKHNoYXJlKTtcbiAgICAgICAgc2lnbmF0dXJlLnJlY2lkLnNob3VsZC5lcXVhbChtb2NrQ29tYmluZWRTaWduYXR1cmUucmVjaWQpO1xuICAgICAgICBzaWduYXR1cmUuci5zaG91bGQuZXF1YWwobW9ja0NvbWJpbmVkU2lnbmF0dXJlLnIpO1xuICAgICAgICBzaWduYXR1cmUucy5zaG91bGQuZXF1YWwobW9ja0NvbWJpbmVkU2lnbmF0dXJlLnMpO1xuICAgICAgICBzaWduYXR1cmUueS5zaG91bGQuZXF1YWwobW9ja0NvbWJpbmVkU2lnbmF0dXJlLnkpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgc3VjY2Vzc2Z1bGx5IGNvbnZlcnQgc2lnbmF0dXJlIHNoYXJlIHRvIHNpZ25hdHVyZSBzaGFyZSByZWNvcmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHNoYXJlID0ge1xuICAgICAgICAgIHRvOiBTaWduYXR1cmVTaGFyZVR5cGUuQklUR08sXG4gICAgICAgICAgZnJvbTogU2lnbmF0dXJlU2hhcmVUeXBlLlVTRVIsXG4gICAgICAgICAgc2hhcmU6IGAke21vY2tTU2hhcmVGcm9tVXNlci5SfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tTU2hhcmVGcm9tVXNlci5zfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke21vY2tTU2hhcmVGcm9tVXNlci55fWAsXG4gICAgICAgIH0gYXMgU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlID0gRUNEU0FNZXRob2RzLmNvbnZlcnRTaWduYXR1cmVTaGFyZShcbiAgICAgICAgICBtb2NrU1NoYXJlRnJvbVVzZXIsXG4gICAgICAgICAgRUNEU0FNZXRob2RzLmdldFBhcnRpY2lwYW50SW5kZXgoJ3VzZXInKSxcbiAgICAgICAgICBFQ0RTQU1ldGhvZHMuZ2V0UGFydGljaXBhbnRJbmRleCgnYml0Z28nKVxuICAgICAgICApO1xuICAgICAgICBzaWduYXR1cmVTaGFyZS5mcm9tLnNob3VsZC5lcXVhbChzaGFyZS5mcm9tKTtcbiAgICAgICAgc2lnbmF0dXJlU2hhcmUudG8uc2hvdWxkLmVxdWFsKHNoYXJlLnRvKTtcbiAgICAgICAgc2lnbmF0dXJlU2hhcmUuc2hhcmUuc2hvdWxkLmVxdWFsKHNoYXJlLnNoYXJlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHN1Y2Nlc3NmdWxseSBjb252ZXJ0IEIgc2hhcmUgdG8gc2lnbmF0dXJlIHNoYXJlIHJlY29yZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYlNoYXJlID0gbW9ja2VkQml0Z29CU2hhcmUuYlNoYXJlO1xuICAgICAgICBjb25zdCBzaGFyZSA9IHtcbiAgICAgICAgICB0bzogU2lnbmF0dXJlU2hhcmVUeXBlLkJJVEdPLFxuICAgICAgICAgIGZyb206IFNpZ25hdHVyZVNoYXJlVHlwZS5CSVRHTyxcbiAgICAgICAgICBzaGFyZTogYCR7YlNoYXJlLmJldGF9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7YlNoYXJlLmdhbW1hfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke2JTaGFyZS5rfSR7XG4gICAgICAgICAgICBFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyXG4gICAgICAgICAgfSR7YlNoYXJlLm51fSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke2JTaGFyZS53fSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke2JTaGFyZS55fSR7XG4gICAgICAgICAgICBFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyXG4gICAgICAgICAgfSR7YlNoYXJlLmx9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7YlNoYXJlLm19JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7YlNoYXJlLm59JHtcbiAgICAgICAgICAgIEVDRFNBTWV0aG9kcy5kZWxpbWV0ZXJcbiAgICAgICAgICB9JHtiU2hhcmUubnRpbGRlfSR7RUNEU0FNZXRob2RzLmRlbGltZXRlcn0ke2JTaGFyZS5oMX0ke0VDRFNBTWV0aG9kcy5kZWxpbWV0ZXJ9JHtiU2hhcmUuaDJ9JHtcbiAgICAgICAgICAgIEVDRFNBTWV0aG9kcy5kZWxpbWV0ZXJcbiAgICAgICAgICB9JHtiU2hhcmUuY2t9JHtFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyfSR7YlNoYXJlLnAhLmpvaW4oRUNEU0FNZXRob2RzLmRlbGltZXRlcil9YCxcbiAgICAgICAgfSBhcyBTaWduYXR1cmVTaGFyZVJlY29yZDtcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlU2hhcmUgPSBFQ0RTQU1ldGhvZHMuY29udmVydEJTaGFyZShiU2hhcmUpO1xuICAgICAgICBzaWduYXR1cmVTaGFyZS5mcm9tLnNob3VsZC5lcXVhbChzaGFyZS5mcm9tKTtcbiAgICAgICAgc2lnbmF0dXJlU2hhcmUudG8uc2hvdWxkLmVxdWFsKHNoYXJlLnRvKTtcbiAgICAgICAgc2lnbmF0dXJlU2hhcmUuc2hhcmUuc2hvdWxkLmVxdWFsKHNoYXJlLnNoYXJlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHN1Y2Nlc3NmdWxseSBwYXJzZSBCIHNoYXJlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBiU2hhcmUgPSBtb2NrZWRCaXRnb0JTaGFyZS5iU2hhcmU7XG4gICAgICAgIGNvbnN0IHNoYXJlID0ge1xuICAgICAgICAgIHRvOiBTaWduYXR1cmVTaGFyZVR5cGUuQklUR08sXG4gICAgICAgICAgZnJvbTogU2lnbmF0dXJlU2hhcmVUeXBlLkJJVEdPLFxuICAgICAgICAgIHNoYXJlOiBFQ0RTQU1ldGhvZHMuY29udmVydEJTaGFyZShtb2NrZWRCaXRnb0JTaGFyZS5iU2hhcmUpLnNoYXJlLFxuICAgICAgICB9IGFzIFNpZ25hdHVyZVNoYXJlUmVjb3JkO1xuICAgICAgICBjb25zdCBwYXJzZWRCU2hhcmUgPSBFQ0RTQU1ldGhvZHMucGFyc2VCU2hhcmUoc2hhcmUpO1xuICAgICAgICBwYXJzZWRCU2hhcmUuc2hvdWxkLmRlZXBFcXVhbChiU2hhcmUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgc3VjY2Vzc2Z1bGx5IGNvbnZlcnQgTyBzaGFyZSB0byBzaWduYXR1cmUgc2hhcmUgcmVjb3JkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBvU2hhcmUgPSBtb2NrZWRCaXRnb09BbmREU2hhcmUub1NoYXJlO1xuICAgICAgICBjb25zdCBkZWxpbWV0ZXIgPSBFQ0RTQU1ldGhvZHMuZGVsaW1ldGVyO1xuICAgICAgICBjb25zdCBzaGFyZSA9IHtcbiAgICAgICAgICB0bzogU2lnbmF0dXJlU2hhcmVUeXBlLkJJVEdPLFxuICAgICAgICAgIGZyb206IFNpZ25hdHVyZVNoYXJlVHlwZS5CSVRHTyxcbiAgICAgICAgICBzaGFyZTogYCR7b1NoYXJlLkdhbW1hfSR7ZGVsaW1ldGVyfSR7b1NoYXJlLmRlbHRhfSR7ZGVsaW1ldGVyfSR7b1NoYXJlLmt9JHtkZWxpbWV0ZXJ9JHtvU2hhcmUub21pY3Jvbn0ke2RlbGltZXRlcn0ke29TaGFyZS55fWAsXG4gICAgICAgIH0gYXMgU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gICAgICAgIGNvbnN0IG9TaGFyZVNpZ1JlY29yZCA9IEVDRFNBTWV0aG9kcy5jb252ZXJ0T1NoYXJlKG9TaGFyZSk7XG4gICAgICAgIG9TaGFyZVNpZ1JlY29yZC5mcm9tLnNob3VsZC5lcXVhbChzaGFyZS5mcm9tKTtcbiAgICAgICAgb1NoYXJlU2lnUmVjb3JkLnRvLnNob3VsZC5lcXVhbChzaGFyZS50byk7XG4gICAgICAgIG9TaGFyZVNpZ1JlY29yZC5zaGFyZS5zaG91bGQuZXF1YWwoc2hhcmUuc2hhcmUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgc3VjY2Vzc2Z1bGx5IHBhcnNlIE8gc2hhcmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IG9TaGFyZSA9IG1vY2tlZEJpdGdvT0FuZERTaGFyZS5vU2hhcmU7XG4gICAgICAgIGNvbnN0IGRlbGltZXRlciA9IEVDRFNBTWV0aG9kcy5kZWxpbWV0ZXI7XG4gICAgICAgIGNvbnN0IHNoYXJlID0ge1xuICAgICAgICAgIHRvOiBTaWduYXR1cmVTaGFyZVR5cGUuQklUR08sXG4gICAgICAgICAgZnJvbTogU2lnbmF0dXJlU2hhcmVUeXBlLkJJVEdPLFxuICAgICAgICAgIHNoYXJlOiBgJHtvU2hhcmUuR2FtbWF9JHtkZWxpbWV0ZXJ9JHtvU2hhcmUuZGVsdGF9JHtkZWxpbWV0ZXJ9JHtvU2hhcmUua30ke2RlbGltZXRlcn0ke29TaGFyZS5vbWljcm9ufSR7ZGVsaW1ldGVyfSR7b1NoYXJlLnl9YCxcbiAgICAgICAgfSBhcyBTaWduYXR1cmVTaGFyZVJlY29yZDtcbiAgICAgICAgY29uc3QgcGFyc2VkT1NoYXJlID0gRUNEU0FNZXRob2RzLnBhcnNlT1NoYXJlKHNoYXJlKTtcbiAgICAgICAgcGFyc2VkT1NoYXJlLmkuc2hvdWxkLmVxdWFsKG9TaGFyZS5pKTtcbiAgICAgICAgcGFyc2VkT1NoYXJlLnkuc2hvdWxkLmVxdWFsKG9TaGFyZS55KTtcbiAgICAgICAgcGFyc2VkT1NoYXJlLmsuc2hvdWxkLmVxdWFsKG9TaGFyZS5rKTtcbiAgICAgICAgcGFyc2VkT1NoYXJlLm9taWNyb24uc2hvdWxkLmVxdWFsKG9TaGFyZS5vbWljcm9uKTtcbiAgICAgICAgcGFyc2VkT1NoYXJlLmRlbHRhLnNob3VsZC5lcXVhbChvU2hhcmUuZGVsdGEpO1xuICAgICAgICBwYXJzZWRPU2hhcmUuR2FtbWEuc2hvdWxkLmVxdWFsKG9TaGFyZS5HYW1tYSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==

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


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