PHP WebShell

Текущая директория: /usr/lib/node_modules/bitgo/node_modules/avalanche/typings/tests/utils

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

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const bintools_1 = __importDefault(require("src/utils/bintools"));
const bn_js_1 = __importDefault(require("bn.js"));
const buffer_1 = require("buffer/");
const bintools = bintools_1.default.getInstance();
describe("BinTools", () => {
    const hexstr = "00112233445566778899aabbccddeeff";
    const hexstr2 = "0001020304050607080909080706050403020100";
    const hexstr3 = "0001020304050607080909080706050403020101";
    const hexbuffstr1 = "000461736466"; // = asdf
    const hexbuffstr2 = "000761626364656667"; // = abcdefg
    const hexbuffstr3 = "00076f6b0066696e65"; // = ok<null>fineokfine
    const b58str = "1UoWww8DGaVGLtea7zU7p";
    const b58str2 = "1Bhh3pU9gLXZiJv73kmqZwHJ4F";
    const b58str3 = "1Bhh3pU9gLXZiJv73kmqZwHJ4G";
    const buff = buffer_1.Buffer.from(hexstr, "hex");
    const buff2 = buffer_1.Buffer.from(hexstr2, "hex");
    const buff3 = buffer_1.Buffer.from(hexstr3, "hex");
    const checksum = "323e6811";
    const serializedChecksum = "148vjpuxYXixb8DcbaWyeDE2fEG"; // serialized hexstr + checksum
    const longSerializedChecksum = "111Bit5JNASbJyTLrd2kWkYRoc96swEWoWdmEhuGAFK3rCAyTnTzomuFwgx1SCUdUE71KbtXPnqj93KGr3CeftpPN37kVyqBaAQ5xaDjr7wVBTUYi9iV7kYJnHF61yovViJF74mJJy7WWQKeRMDRTiPuii5gsd11gtNahCCsKbm9seJtk2h1wAPZn9M1eL84CGVPnLUiLP"; // serialized hexstr + checksum
    const checksummedHexStr = "0x00000009de31b4d8b22991d51aa6aa1fc733f23a851a8c9400000000000186a0000000005f041280000000005f9ca900000030390000000000000001fceda8f90fcb5d30614b99d79fc4baa29307762668f16eb0259a57c2d3b78c875c86ec2045792d4df2d926c40f829196e0bb97ee697af71f5b0a966dabff749634c8b729855e937715b0e44303fd1014daedc752006011b730";
    test("copyFrom conducts a true copy", () => {
        const buff = buffer_1.Buffer.from(hexstr, "hex");
        const newbuff = bintools.copyFrom(buff, 0, 10);
        expect(newbuff.length).toBe(10);
        expect(newbuff.readUInt8(0)).toBe(0);
        expect(newbuff.readUInt8(9)).toBe(153);
        // verify that the original buffer isn't touched by writes
        newbuff.writeUInt8(153, 4);
        expect(newbuff.readUInt8(4)).toBe(153);
        expect(buff.readUInt8(4)).toBe(68);
        // test with no end specified
        const newbuff2 = bintools.copyFrom(buff, 2);
        expect(newbuff2.length).toBe(14);
        expect(newbuff2.readUInt8(0)).toBe(34);
        expect(newbuff2.readUInt8(7)).toBe(153);
    });
    test("bufferToString", () => {
        const bres = bintools.bufferToString(buffer_1.Buffer.from(hexbuffstr1, "hex"));
        expect(bres).toBe(buffer_1.Buffer.from(hexbuffstr1.slice(4), "hex").toString("utf8"));
        // testing null character edge case
        const bres2 = bintools.bufferToString(buffer_1.Buffer.from(hexbuffstr2, "hex"));
        expect(bres2).toBe(buffer_1.Buffer.from(hexbuffstr2.slice(4), "hex").toString("utf8"));
        // testing null character edge case
        const bres3 = bintools.bufferToString(buffer_1.Buffer.from(hexbuffstr3, "hex"));
        expect(bres3).toBe(buffer_1.Buffer.from(hexbuffstr3.slice(4), "hex").toString("utf8"));
    });
    test("stringToBuffer", () => {
        const bres = bintools.stringToBuffer("asdf");
        expect(bres.slice(2).toString()).toBe(buffer_1.Buffer.from(hexbuffstr1.slice(4), "hex").toString("utf8"));
        // testing null character edge case
        const bres2 = bintools.stringToBuffer("abcdefg");
        expect(bres2.slice(2).toString()).toBe(buffer_1.Buffer.from(hexbuffstr2.slice(4), "hex").toString("utf8"));
        // testing null character edge case
        const bres3 = bintools.stringToBuffer(buffer_1.Buffer.from(hexbuffstr3.slice(4), "hex").toString("utf8"));
        expect(bres3.slice(2).toString()).toBe(buffer_1.Buffer.from(hexbuffstr3.slice(4), "hex").toString("utf8"));
    });
    test("bufferToB58", () => {
        const b58res = bintools.bufferToB58(buff);
        expect(b58res).toBe(b58str);
        // testing null character edge case
        const b58res2 = bintools.bufferToB58(buff2);
        expect(b58res2).toBe(b58str2);
        // testing null character edge case
        const b58res3 = bintools.bufferToB58(buff3);
        expect(b58res3).toBe(b58str3);
    });
    test("b58ToBuffer", () => {
        expect(() => {
            bintools.b58ToBuffer("0OO0O not a valid b58 string 0OO0O");
        }).toThrow("Error - Base58.decode: not a valid base58 string");
        const buffres = bintools.b58ToBuffer(b58str);
        expect(buffres.toString()).toBe(buff.toString());
        // testing zeros character edge case
        const buffres2 = bintools.b58ToBuffer(b58str2);
        expect(buffres2.toString()).toBe(buff2.toString());
        // testing zeros character edge case
        const buffres3 = bintools.b58ToBuffer(b58str3);
        expect(buffres3.toString()).toBe(buff3.toString());
    });
    test("fromBufferToArrayBuffer", () => {
        const arrbuff = bintools.fromBufferToArrayBuffer(buff);
        expect(arrbuff.byteLength).toBe(buff.length);
        for (let i = 0; i < buff.length; i++) {
            expect(arrbuff[i]).toBe(buff[i]);
        }
        // verify that the original buffer isn't touched by writes
        arrbuff[2] = 55;
        expect(buff[2]).not.toBe(55);
    });
    test("fromArrayBufferToBuffer", () => {
        const arrbuff = new ArrayBuffer(10);
        for (let i = 0; i < 10; i++) {
            arrbuff[i] = i;
        }
        const newbuff = bintools.fromArrayBufferToBuffer(arrbuff);
        expect(newbuff.length).toBe(arrbuff.byteLength);
        for (let i = 0; i < newbuff.length; i++) {
            expect(newbuff[i]).toBe(arrbuff[i]);
        }
        // verify that the original buffer isnt touched by writes
        newbuff[3] = 55;
        expect(arrbuff[3]).not.toBe(newbuff[3]);
    });
    test("fromBufferToBN", () => {
        const bign = bintools.fromBufferToBN(buff);
        expect(bign.toString("hex", hexstr.length)).toBe(hexstr);
    });
    test("fromBNToBuffer", () => {
        const bn1 = new bn_js_1.default(hexstr, "hex", "be");
        const bn2 = new bn_js_1.default(hexstr, "hex", "be");
        const b1 = bintools.fromBNToBuffer(bn1);
        const b2 = bintools.fromBNToBuffer(bn2, buff.length);
        expect(b1.length).toBe(buff.length - 1);
        expect(b1.toString("hex")).toBe(hexstr.slice(2));
        expect(b2.length).toBe(buff.length);
        expect(b2.toString("hex")).toBe(hexstr);
    });
    test("addChecksum", () => {
        const buffchecked = bintools.addChecksum(buff);
        expect(buffchecked.length).toBe(buff.length + 4);
        expect(buffchecked.slice(16).toString("hex")).toBe(checksum);
    });
    test("validteChecksum", () => {
        const checksummed = hexstr + checksum;
        const badsummed = `${hexstr}324e7822`;
        expect(bintools.validateChecksum(buffer_1.Buffer.from(checksummed, "hex"))).toBe(true);
        expect(bintools.validateChecksum(buff)).toBe(false);
        expect(bintools.validateChecksum(buffer_1.Buffer.from(badsummed, "hex"))).toBe(false);
    });
    test("cb58Encode", () => {
        const fromBuff = bintools.cb58Encode(buff);
        expect(fromBuff).toBe(serializedChecksum);
    });
    test("cb58Decode", () => {
        const serbuff = bintools.b58ToBuffer(serializedChecksum);
        const dsr1 = bintools.cb58Decode(serializedChecksum);
        const dsr2 = bintools.cb58Decode(serbuff);
        const serbufffaulty = bintools.copyFrom(serbuff);
        serbufffaulty[serbufffaulty.length - 1] =
            serbufffaulty[serbufffaulty.length - 1] - 1;
        expect(dsr1.toString("hex")).toBe(hexstr);
        expect(dsr2.toString("hex")).toBe(hexstr);
        expect(() => {
            bintools.cb58Decode(serbufffaulty);
        }).toThrow("Error - BinTools.cb58Decode: invalid checksum");
    });
    test("cb58DecodeWithChecksum", () => {
        const serbuff = bintools.b58ToBuffer(longSerializedChecksum);
        const dsr1 = bintools.cb58DecodeWithChecksum(longSerializedChecksum);
        const dsr2 = bintools.cb58DecodeWithChecksum(serbuff);
        const serbufffaulty = bintools.copyFrom(serbuff);
        serbufffaulty[serbufffaulty.length - 1] =
            serbufffaulty[serbufffaulty.length - 1] - 1;
        expect(dsr1).toBe(checksummedHexStr);
        expect(dsr2).toBe(checksummedHexStr);
        expect(() => {
            bintools.cb58Decode(serbufffaulty);
        }).toThrow("Error - BinTools.cb58Decode: invalid checksum");
    });
    test("isCB58", () => {
        const validCB581 = "isGvtnDqETNmmFw7guSJ7mmWhCqboExrpmC8VsWxckHcH9oXb";
        const validCB582 = "2PwX8qwMHbwVAm28howu3Ef7Lk4ib2XG7AaY9aK8dTTGNXQkCz";
        const invalidCB581 = "ddd.tnDqETNmmFw7guSJ7mmWhCqboExrpmC8VsWxckHcHzzzz";
        const invalidCB582 = "";
        expect(bintools.isCB58(validCB581)).toBe(true);
        expect(bintools.isCB58(validCB582)).toBe(true);
        expect(bintools.isCB58(invalidCB581)).toBe(false);
        expect(bintools.isCB58(invalidCB582)).toBe(false);
    });
    test("isBase58", () => {
        const validBase581 = "isGvtnDqETNmmFw7guSJ7mmWhCqboExrpmC8VsWxckHcH9oXb";
        const validBase582 = "2PwX8qwMHbwVAm28howu3Ef7Lk4ib2XG7AaY9aK8dTTGNXQkCz";
        const invalidBase581 = "ddd.tnDqETNmmFw7guSJ7mmWhCqboExrpmC8VsWxckHcHzzzz";
        const invalidBase582 = "";
        expect(bintools.isBase58(validBase581)).toBe(true);
        expect(bintools.isBase58(validBase582)).toBe(true);
        expect(bintools.isBase58(invalidBase581)).toBe(false);
        expect(bintools.isBase58(invalidBase582)).toBe(false);
    });
    test("isHex", () => {
        const validHex1 = "0x95eaac2b7a6ee7ad7e597c2f5349b03e461c36c2e1e50fc98a84d01612940bd5";
        const validHex2 = "95eaac2b7a6ee7ad7e597c2f5349b03e461c36c2e1e50fc98a84d01612940bd5";
        const invalidHex1 = "rrrrr.c2b7a6ee7ad7e597c2f5349b03e461c36c2e1e5.fc98a84d016129zzzzz";
        const invalidHex2 = "";
        expect(bintools.isHex(validHex1)).toBe(true);
        expect(bintools.isHex(validHex2)).toBe(true);
        expect(bintools.isHex(invalidHex1)).toBe(false);
        expect(bintools.isHex(invalidHex2)).toBe(false);
    });
    test("stringToAddress", () => {
        // Missing prefix
        let addr = "-avax13a4ye34zdfa33zeg3udnz533d6msfuqkds9hq7";
        expect(() => {
            bintools.stringToAddress(addr);
        }).toThrow("Error - Valid address must have prefix before -");
        // Missing -
        addr = "Xavax13a4ye34zdfa33zeg3udnz533d6msfuqkds9hq7";
        expect(() => {
            bintools.stringToAddress(addr);
        }).toThrow("Error - Valid address should include -");
        // Missing seperator (1)
        addr = "X-avax3a4ye34zdfa33zeg3udnz533d6msfuqkds9hq7";
        expect(() => {
            bintools.stringToAddress(addr);
        }).toThrow("Error - Valid address must include separator (1)");
        // Missing HRP
        addr = "X-13a4ye34zdfa33zeg3udnz533d6msfuqkds9hq7";
        expect(() => {
            bintools.stringToAddress(addr);
        }).toThrow("Error - HRP should be at least 1 character");
        // Invalid HRP
        addr = "X-avax11ycxp65vz60m87mkm2hsw3m5fadjlpldzntvr33";
        expect(() => {
            bintools.stringToAddress(addr);
        }).toThrow("Error - Invalid HRP");
        // Extra character in data bytes
        addr = "X-local1dcfyuug87xqayl4fpp02z9dvknwhafdswtvnucd";
        expect(() => {
            bintools.stringToAddress(addr);
        }).toThrow("Invalid checksum for local1dcfyuug87xqayl4fpp02z9dvknwhafdswtvnucd");
        // Change character in data bytes
        addr = "X-local1dcfyuug8fxqayl4fpp02z9dvknwhafdstvnucd";
        expect(() => {
            bintools.stringToAddress(addr);
        }).toThrow("Invalid checksum for local1dcfyuug8fxqayl4fpp02z9dvknwhafdstvnucd");
        // Invalid character in data bytes
        addr = "X-local1dcfyuug87xqbyl4fpp02z9dvknwhafdstvnucd";
        expect(() => {
            bintools.stringToAddress(addr);
        }).toThrow("Unknown character b");
        // Change character in checksum
        addr = "X-local1dcfyuug87xqayl4fpp02z9dvknwhafdstvnuce";
        expect(() => {
            bintools.stringToAddress(addr);
        }).toThrow("Invalid checksum for local1dcfyuug87xqayl4fpp02z9dvknwhafdstvnuce");
        // Invalid ETH-style address
        addr = "0x.db97C7cEcE249c2b98bDC0226Cc4C2A57BF52FC";
        expect(() => {
            bintools.stringToAddress(addr);
        }).toThrow("Error - Invalid address");
        let addrs = [
            "X-local1dcfyuug87xqayl4fpp02z9dvknwhafdstvnucd",
            "X-local1ltghj033re64920k786uprcp82p9e36j7hzc5x",
            "X-local1dq4q9seql2spxrkd7rl82uck5ej3nvlhrluh4u"
        ];
        addrs.forEach((address) => {
            bintools.stringToAddress(address);
        });
        addrs = [
            "X-fuji1dcfyuug87xqayl4fpp02z9dvknwhafds7d29h6",
            "X-fuji1ltghj033re64920k786uprcp82p9e36jtkmpm3",
            "X-fuji1dq4q9seql2spxrkd7rl82uck5ej3nvlhk79w6t"
        ];
        addrs.forEach((address) => {
            bintools.stringToAddress(address);
        });
        addrs = [
            "X-avax1dcfyuug87xqayl4fpp02z9dvknwhafdsjlw6m9",
            "X-avax1ltghj033re64920k786uprcp82p9e36j8yl7hw",
            "X-avax1dq4q9seql2spxrkd7rl82uck5ej3nvlh6vp3k5"
        ];
        addrs.forEach((address) => {
            bintools.stringToAddress(address);
        });
        addrs = [
            "P-local1dcfyuug87xqayl4fpp02z9dvknwhafdstvnucd",
            "P-local1ltghj033re64920k786uprcp82p9e36j7hzc5x",
            "P-local1dq4q9seql2spxrkd7rl82uck5ej3nvlhrluh4u"
        ];
        addrs.forEach((address) => {
            bintools.stringToAddress(address);
        });
        addrs = [
            "P-fuji1dcfyuug87xqayl4fpp02z9dvknwhafds7d29h6",
            "P-fuji1ltghj033re64920k786uprcp82p9e36jtkmpm3",
            "P-fuji1dq4q9seql2spxrkd7rl82uck5ej3nvlhk79w6t"
        ];
        addrs.forEach((address) => {
            bintools.stringToAddress(address);
        });
        addrs = [
            "P-avax1dcfyuug87xqayl4fpp02z9dvknwhafdsjlw6m9",
            "P-avax1ltghj033re64920k786uprcp82p9e36j8yl7hw",
            "P-avax1dq4q9seql2spxrkd7rl82uck5ej3nvlh6vp3k5"
        ];
        addrs.forEach((address) => {
            bintools.stringToAddress(address);
        });
        addrs = [
            "C-local1dcfyuug87xqayl4fpp02z9dvknwhafdstvnucd",
            "C-local1ltghj033re64920k786uprcp82p9e36j7hzc5x",
            "C-local1dq4q9seql2spxrkd7rl82uck5ej3nvlhrluh4u"
        ];
        addrs.forEach((address) => {
            bintools.stringToAddress(address);
        });
        addrs = [
            "C-fuji1dcfyuug87xqayl4fpp02z9dvknwhafds7d29h6",
            "C-fuji1ltghj033re64920k786uprcp82p9e36jtkmpm3",
            "C-fuji1dq4q9seql2spxrkd7rl82uck5ej3nvlhk79w6t"
        ];
        addrs.forEach((address) => {
            bintools.stringToAddress(address);
        });
        addrs = [
            "C-avax1dcfyuug87xqayl4fpp02z9dvknwhafdsjlw6m9",
            "C-avax1ltghj033re64920k786uprcp82p9e36j8yl7hw",
            "C-avax1dq4q9seql2spxrkd7rl82uck5ej3nvlh6vp3k5"
        ];
        addrs.forEach((address) => {
            bintools.stringToAddress(address);
        });
        addrs = [
            "X-foo1dcfyuug87xqayl4fpp02z9dvknwhafds4k3km3",
            "X-foo1ltghj033re64920k786uprcp82p9e36jqdqjh6",
            "X-foo1dq4q9seql2spxrkd7rl82uck5ej3nvlha97akq"
        ];
        addrs.forEach((address) => {
            bintools.stringToAddress(address, "foo");
        });
        addrs = [
            "0x8db97C7cEcE249c2b98bDC0226Cc4C2A57BF52FC",
            "0xC1ad78FDd4aEd027EbD5e9eee878f44dc1E29358",
            "0x5B44bC2622dc5DD66a94cd5f2aDc3a49abb864dE"
        ];
        addrs.forEach((address) => {
            bintools.stringToAddress(address);
        });
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmludG9vbHMudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3RzL3V0aWxzL2JpbnRvb2xzLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrRUFBeUM7QUFDekMsa0RBQXNCO0FBQ3RCLG9DQUFnQztBQUVoQyxNQUFNLFFBQVEsR0FBYSxrQkFBUSxDQUFDLFdBQVcsRUFBRSxDQUFBO0FBRWpELFFBQVEsQ0FBQyxVQUFVLEVBQUUsR0FBUyxFQUFFO0lBQzlCLE1BQU0sTUFBTSxHQUFXLGtDQUFrQyxDQUFBO0lBQ3pELE1BQU0sT0FBTyxHQUFXLDBDQUEwQyxDQUFBO0lBQ2xFLE1BQU0sT0FBTyxHQUFXLDBDQUEwQyxDQUFBO0lBQ2xFLE1BQU0sV0FBVyxHQUFXLGNBQWMsQ0FBQSxDQUFDLFNBQVM7SUFDcEQsTUFBTSxXQUFXLEdBQVcsb0JBQW9CLENBQUEsQ0FBQyxZQUFZO0lBQzdELE1BQU0sV0FBVyxHQUFXLG9CQUFvQixDQUFBLENBQUMsdUJBQXVCO0lBQ3hFLE1BQU0sTUFBTSxHQUFXLHVCQUF1QixDQUFBO0lBQzlDLE1BQU0sT0FBTyxHQUFXLDRCQUE0QixDQUFBO0lBQ3BELE1BQU0sT0FBTyxHQUFXLDRCQUE0QixDQUFBO0lBQ3BELE1BQU0sSUFBSSxHQUFXLGVBQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQy9DLE1BQU0sS0FBSyxHQUFXLGVBQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ2pELE1BQU0sS0FBSyxHQUFXLGVBQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ2pELE1BQU0sUUFBUSxHQUFXLFVBQVUsQ0FBQTtJQUNuQyxNQUFNLGtCQUFrQixHQUFXLDZCQUE2QixDQUFBLENBQUMsK0JBQStCO0lBQ2hHLE1BQU0sc0JBQXNCLEdBQzFCLDRNQUE0TSxDQUFBLENBQUMs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RCxnREFBZ0Q7WUFDaEQsZ0RBQWdEO1NBQ2pELENBQUE7UUFDRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBZSxFQUFRLEVBQUU7WUFDdEMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNuQyxDQUFDLENBQUMsQ0FBQTtRQUNGLEtBQUssR0FBRztZQUNOLCtDQUErQztZQUMvQywrQ0FBK0M7WUFDL0MsK0NBQStDO1NBQ2hELENBQUE7UUFDRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBZSxFQUFRLEVBQUU7WUFDdEMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNuQyxDQUFDLENBQUMsQ0FBQTtRQUNGLEtBQUssR0FBRztZQUNOLCtDQUErQztZQUMvQywrQ0FBK0M7WUFDL0MsK0NBQStDO1NBQ2hELENBQUE7UUFDRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBZSxFQUFRLEVBQUU7WUFDdEMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNuQyxDQUFDLENBQUMsQ0FBQTtRQUVGLEtBQUssR0FBRztZQUNOLGdEQUFnRDtZQUNoRCxnREFBZ0Q7WUFDaEQsZ0RBQWdEO1NBQ2pELENBQUE7UUFDRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBZSxFQUFRLEVBQUU7WUFDdEMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNuQyxDQUFDLENBQUMsQ0FBQTtRQUVGLEtBQUssR0FBRztZQUNOLCtDQUErQztZQUMvQywrQ0FBK0M7WUFDL0MsK0NBQStDO1NBQ2hELENBQUE7UUFDRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBZSxFQUFRLEVBQUU7WUFDdEMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNuQyxDQUFDLENBQUMsQ0FBQTtRQUVGLEtBQUssR0FBRztZQUNOLCtDQUErQztZQUMvQywrQ0FBK0M7WUFDL0MsK0NBQStDO1NBQ2hELENBQUE7UUFDRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBZSxFQUFRLEVBQUU7WUFDdEMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNuQyxDQUFDLENBQUMsQ0FBQTtRQUVGLEtBQUssR0FBRztZQUNOLDhDQUE4QztZQUM5Qyw4Q0FBOEM7WUFDOUMsOENBQThDO1NBQy9DLENBQUE7UUFDRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBZSxFQUFRLEVBQUU7WUFDdEMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDMUMsQ0FBQyxDQUFDLENBQUE7UUFFRixLQUFLLEdBQUc7WUFDTiw0Q0FBNEM7WUFDNUMsNENBQTRDO1lBQzVDLDRDQUE0QztTQUM3QyxDQUFBO1FBQ0QsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQWUsRUFBUSxFQUFFO1lBQ3RDLFFBQVEsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDbkMsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJpblRvb2xzIGZyb20gXCJzcmMvdXRpbHMvYmludG9vbHNcIlxuaW1wb3J0IEJOIGZyb20gXCJibi5qc1wiXG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tIFwiYnVmZmVyL1wiXG5cbmNvbnN0IGJpbnRvb2xzOiBCaW5Ub29scyA9IEJpblRvb2xzLmdldEluc3RhbmNlKClcblxuZGVzY3JpYmUoXCJCaW5Ub29sc1wiLCAoKTogdm9pZCA9PiB7XG4gIGNvbnN0IGhleHN0cjogc3RyaW5nID0gXCIwMDExMjIzMzQ0NTU2Njc3ODg5OWFhYmJjY2RkZWVmZlwiXG4gIGNvbnN0IGhleHN0cjI6IHN0cmluZyA9IFwiMDAwMTAyMDMwNDA1MDYwNzA4MDkwOTA4MDcwNjA1MDQwMzAyMDEwMFwiXG4gIGNvbnN0IGhleHN0cjM6IHN0cmluZyA9IFwiMDAwMTAyMDMwNDA1MDYwNzA4MDkwOTA4MDcwNjA1MDQwMzAyMDEwMVwiXG4gIGNvbnN0IGhleGJ1ZmZzdHIxOiBzdHJpbmcgPSBcIjAwMDQ2MTczNjQ2NlwiIC8vID0gYXNkZlxuICBjb25zdCBoZXhidWZmc3RyMjogc3RyaW5nID0gXCIwMDA3NjE2MjYzNjQ2NTY2NjdcIiAvLyA9IGFiY2RlZmdcbiAgY29uc3QgaGV4YnVmZnN0cjM6IHN0cmluZyA9IFwiMDAwNzZmNmIwMDY2Njk2ZTY1XCIgLy8gPSBvazxudWxsPmZpbmVva2ZpbmVcbiAgY29uc3QgYjU4c3RyOiBzdHJpbmcgPSBcIjFVb1d3dzhER2FWR0x0ZWE3elU3cFwiXG4gIGNvbnN0IGI1OHN0cjI6IHN0cmluZyA9IFwiMUJoaDNwVTlnTFhaaUp2NzNrbXFad0hKNEZcIlxuICBjb25zdCBiNThzdHIzOiBzdHJpbmcgPSBcIjFCaGgzcFU5Z0xYWmlKdjcza21xWndISjRHXCJcbiAgY29uc3QgYnVmZjogQnVmZmVyID0gQnVmZmVyLmZyb20oaGV4c3RyLCBcImhleFwiKVxuICBjb25zdCBidWZmMjogQnVmZmVyID0gQnVmZmVyLmZyb20oaGV4c3RyMiwgXCJoZXhcIilcbiAgY29uc3QgYnVmZjM6IEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGhleHN0cjMsIFwiaGV4XCIpXG4gIGNvbnN0IGNoZWNrc3VtOiBzdHJpbmcgPSBcIjMyM2U2ODExXCJcbiAgY29uc3Qgc2VyaWFsaXplZENoZWNrc3VtOiBzdHJpbmcgPSBcIjE0OHZqcHV4WVhpeGI4RGNiYVd5ZURFMmZFR1wiIC8vIHNlcmlhbGl6ZWQgaGV4c3RyICsgY2hlY2tzdW1cbiAgY29uc3QgbG9uZ1NlcmlhbGl6ZWRDaGVja3N1bTogc3RyaW5nID1cbiAgICBcIjExMUJpdDVKTkFTYkp5VExyZDJrV2tZUm9jOTZzd0VXb1dkbUVodUdBRkszckNBeVRuVHpvbXVGd2d4MVNDVWRVRTcxS2J0WFBucWo5M0tHcjNDZWZ0cFBOMzdrVnlxQmFBUTV4YURqcjd3VkJUVVlpOWlWN2tZSm5IRjYxeW92VmlKRjc0bUpKeTdXV1FLZVJNRFJUaVB1aWk1Z3NkMTFndE5haENDc0tibTlzZUp0azJoMXdBUFpuOU0xZUw4NENHVlBuTFVpTFBcIiAvLyBzZXJpYWxpemVkIGhleHN0ciArIGNoZWNrc3VtXG4gIGNvbnN0IGNoZWNrc3VtbWVkSGV4U3RyID1cbiAgICBcIjB4MDAwMDAwMDlkZTMxYjRkOGIyMjk5MWQ1MWFhNmFhMWZjNzMzZjIzYTg1MWE4Yzk0MDAwMDAwMDAwMDAxODZhMDAwMDAwMDAwNWYwNDEyODAwMDAwMDAwMDVmOWNhOTAwMDAwMDMwMzkwMDAwMDAwMDAwMDAwMDAxZmNlZGE4ZjkwZmNiNWQzMDYxNGI5OWQ3OWZjNGJhYTI5MzA3NzYyNjY4ZjE2ZWIwMjU5YTU3YzJkM2I3OGM4NzVjODZlYzIwNDU3OTJkNGRmMmQ5MjZjNDBmODI5MTk2ZTBiYjk3ZWU2OTdhZjcxZjViMGE5NjZkYWJmZjc0OTYzNGM4YjcyOTg1NWU5Mzc3MTViMGU0NDMwM2ZkMTAxNGRhZWRjNzUyMDA2MDExYjczMFwiXG4gIHRlc3QoXCJjb3B5RnJvbSBjb25kdWN0cyBhIHRydWUgY29weVwiLCAoKTogdm9pZCA9PiB7XG4gICAgY29uc3QgYnVmZjogQnVmZmVyID0gQnVmZmVyLmZyb20oaGV4c3RyLCBcImhleFwiKVxuICAgIGNvbnN0IG5ld2J1ZmY6IEJ1ZmZlciA9IGJpbnRvb2xzLmNvcHlGcm9tKGJ1ZmYsIDAsIDEwKVxuICAgIGV4cGVjdChuZXdidWZmLmxlbmd0aCkudG9CZSgxMClcbiAgICBleHBlY3QobmV3YnVmZi5yZWFkVUludDgoMCkpLnRvQmUoMClcbiAgICBleHBlY3QobmV3YnVmZi5yZWFkVUludDgoOSkpLnRvQmUoMTUzKVxuICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBvcmlnaW5hbCBidWZmZXIgaXNuJ3QgdG91Y2hlZCBieSB3cml0ZXNcbiAgICBuZXdidWZmLndyaXRlVUludDgoMTUzLCA0KVxuICAgIGV4cGVjdChuZXdidWZmLnJlYWRVSW50OCg0KSkudG9CZSgxNTMpXG4gICAgZXhwZWN0KGJ1ZmYucmVhZFVJbnQ4KDQpKS50b0JlKDY4KVxuICAgIC8vIHRlc3Qgd2l0aCBubyBlbmQgc3BlY2lmaWVkXG4gICAgY29uc3QgbmV3YnVmZjI6IEJ1ZmZlciA9IGJpbnRvb2xzLmNvcHlGcm9tKGJ1ZmYsIDIpXG4gICAgZXhwZWN0KG5ld2J1ZmYyLmxlbmd0aCkudG9CZSgxNClcbiAgICBleHBlY3QobmV3YnVmZjIucmVhZFVJbnQ4KDApKS50b0JlKDM0KVxuICAgIGV4cGVjdChuZXdidWZmMi5yZWFkVUludDgoNykpLnRvQmUoMTUzKVxuICB9KVxuXG4gIHRlc3QoXCJidWZmZXJUb1N0cmluZ1wiLCAoKTogdm9pZCA9PiB7XG4gICAgY29uc3QgYnJlczogc3RyaW5nID0gYmludG9vbHMuYnVmZmVyVG9TdHJpbmcoXG4gICAgICBCdWZmZXIuZnJvbShoZXhidWZmc3RyMSwgXCJoZXhcIilcbiAgICApXG4gICAgZXhwZWN0KGJyZXMpLnRvQmUoQnVmZmVyLmZyb20oaGV4YnVmZnN0cjEuc2xpY2UoNCksIFwiaGV4XCIpLnRvU3RyaW5nKFwidXRmOFwiKSlcbiAgICAvLyB0ZXN0aW5nIG51bGwgY2hhcmFjdGVyIGVkZ2UgY2FzZVxuICAgIGNvbnN0IGJyZXMyOiBzdHJpbmcgPSBiaW50b29scy5idWZmZXJUb1N0cmluZyhcbiAgICAgIEJ1ZmZlci5mcm9tKGhleGJ1ZmZzdHIyLCBcImhleFwiKVxuICAgIClcbiAgICBleHBlY3QoYnJlczIpLnRvQmUoXG4gICAgICBCdWZmZXIuZnJvbShoZXhidWZmc3RyMi5zbGljZSg0KSwgXCJoZXhcIikudG9TdHJpbmcoXCJ1dGY4XCIpXG4gICAgKVxuICAgIC8vIHRlc3RpbmcgbnVsbCBjaGFyYWN0ZXIgZWRnZSBjYXNlXG4gICAgY29uc3QgYnJlczM6IHN0cmluZyA9IGJpbnRvb2xzLmJ1ZmZlclRvU3RyaW5nKFxuICAgICAgQnVmZmVyLmZyb20oaGV4YnVmZnN0cjMsIFwiaGV4XCIpXG4gICAgKVxuICAgIGV4cGVjdChicmVzMykudG9CZShcbiAgICAgIEJ1ZmZlci5mcm9tKGhleGJ1ZmZzdHIzLnNsaWNlKDQpLCBcImhleFwiKS50b1N0cmluZyhcInV0ZjhcIilcbiAgICApXG4gIH0pXG5cbiAgdGVzdChcInN0cmluZ1RvQnVmZmVyXCIsICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCBicmVzOiBCdWZmZXIgPSBiaW50b29scy5zdHJpbmdUb0J1ZmZlcihcImFzZGZcIilcbiAgICBleHBlY3QoYnJlcy5zbGljZSgyKS50b1N0cmluZygpKS50b0JlKFxuICAgICAgQnVmZmVyLmZyb20oaGV4YnVmZnN0cjEuc2xpY2UoNCksIFwiaGV4XCIpLnRvU3RyaW5nKFwidXRmOFwiKVxuICAgIClcbiAgICAvLyB0ZXN0aW5nIG51bGwgY2hhcmFjdGVyIGVkZ2UgY2FzZVxuICAgIGNvbnN0IGJyZXMyOiBCdWZmZXIgPSBiaW50b29scy5zdHJpbmdUb0J1ZmZlcihcImFiY2RlZmdcIilcbiAgICBleHBlY3QoYnJlczIuc2xpY2UoMikudG9TdHJpbmcoKSkudG9CZShcbiAgICAgIEJ1ZmZlci5mcm9tKGhleGJ1ZmZzdHIyLnNsaWNlKDQpLCBcImhleFwiKS50b1N0cmluZyhcInV0ZjhcIilcbiAgICApXG4gICAgLy8gdGVzdGluZyBudWxsIGNoYXJhY3RlciBlZGdlIGNhc2VcbiAgICBjb25zdCBicmVzMzogQnVmZmVyID0gYmludG9vbHMuc3RyaW5nVG9CdWZmZXIoXG4gICAgICBCdWZmZXIuZnJvbShoZXhidWZmc3RyMy5zbGljZSg0KSwgXCJoZXhcIikudG9TdHJpbmcoXCJ1dGY4XCIpXG4gICAgKVxuICAgIGV4cGVjdChicmVzMy5zbGljZSgyKS50b1N0cmluZygpKS50b0JlKFxuICAgICAgQnVmZmVyLmZyb20oaGV4YnVmZnN0cjMuc2xpY2UoNCksIFwiaGV4XCIpLnRvU3RyaW5nKFwidXRmOFwiKVxuICAgIClcbiAgfSlcblxuICB0ZXN0KFwiYnVmZmVyVG9CNThcIiwgKCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGI1OHJlczogc3RyaW5nID0gYmludG9vbHMuYnVmZmVyVG9CNTgoYnVmZilcbiAgICBleHBlY3QoYjU4cmVzKS50b0JlKGI1OHN0cilcbiAgICAvLyB0ZXN0aW5nIG51bGwgY2hhcmFjdGVyIGVkZ2UgY2FzZVxuICAgIGNvbnN0IGI1OHJlczI6IHN0cmluZyA9IGJpbnRvb2xzLmJ1ZmZlclRvQjU4KGJ1ZmYyKVxuICAgIGV4cGVjdChiNThyZXMyKS50b0JlKGI1OHN0cjIpXG4gICAgLy8gdGVzdGluZyBudWxsIGNoYXJhY3RlciBlZGdlIGNhc2VcbiAgICBjb25zdCBiNThyZXMzOiBzdHJpbmcgPSBiaW50b29scy5idWZmZXJUb0I1OChidWZmMylcbiAgICBleHBlY3QoYjU4cmVzMykudG9CZShiNThzdHIzKVxuICB9KVxuXG4gIHRlc3QoXCJiNThUb0J1ZmZlclwiLCAoKTogdm9pZCA9PiB7XG4gICAgZXhwZWN0KCgpOiB2b2lkID0+IHtcbiAgICAgIGJpbnRvb2xzLmI1OFRvQnVmZmVyKFwiME9PME8gbm90IGEgdmFsaWQgYjU4IHN0cmluZyAwT08wT1wiKVxuICAgIH0pLnRvVGhyb3coXCJFcnJvciAtIEJhc2U1OC5kZWNvZGU6IG5vdCBhIHZhbGlkIGJhc2U1OCBzdHJpbmdcIilcblxuICAgIGNvbnN0IGJ1ZmZyZXM6IEJ1ZmZlciA9IGJpbnRvb2xzLmI1OFRvQnVmZmVyKGI1OHN0cilcbiAgICBleHBlY3QoYnVmZnJlcy50b1N0cmluZygpKS50b0JlKGJ1ZmYudG9TdHJpbmcoKSlcbiAgICAvLyB0ZXN0aW5nIHplcm9zIGNoYXJhY3RlciBlZGdlIGNhc2VcbiAgICBjb25zdCBidWZmcmVzMjogQnVmZmVyID0gYmludG9vbHMuYjU4VG9CdWZmZXIoYjU4c3RyMilcbiAgICBleHBlY3QoYnVmZnJlczIudG9TdHJpbmcoKSkudG9CZShidWZmMi50b1N0cmluZygpKVxuICAgIC8vIHRlc3RpbmcgemVyb3MgY2hhcmFjdGVyIGVkZ2UgY2FzZVxuICAgIGNvbnN0IGJ1ZmZyZXMzOiBCdWZmZXIgPSBiaW50b29scy5iNThUb0J1ZmZlcihiNThzdHIzKVxuICAgIGV4cGVjdChidWZmcmVzMy50b1N0cmluZygpKS50b0JlKGJ1ZmYzLnRvU3RyaW5nKCkpXG4gIH0pXG5cbiAgdGVzdChcImZyb21CdWZmZXJUb0FycmF5QnVmZmVyXCIsICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCBhcnJidWZmOiBBcnJheUJ1ZmZlciA9IGJpbnRvb2xzLmZyb21CdWZmZXJUb0FycmF5QnVmZmVyKGJ1ZmYpXG4gICAgZXhwZWN0KGFycmJ1ZmYuYnl0ZUxlbmd0aCkudG9CZShidWZmLmxlbmd0aClcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgYnVmZi5sZW5ndGg7IGkrKykge1xuICAgICAgZXhwZWN0KGFycmJ1ZmZbaV0pLnRvQmUoYnVmZltpXSlcbiAgICB9XG4gICAgLy8gdmVyaWZ5IHRoYXQgdGhlIG9yaWdpbmFsIGJ1ZmZlciBpc24ndCB0b3VjaGVkIGJ5IHdyaXRlc1xuICAgIGFycmJ1ZmZbMl0gPSA1NVxuICAgIGV4cGVjdChidWZmWzJdKS5ub3QudG9CZSg1NSlcbiAgfSlcblxuICB0ZXN0KFwiZnJvbUFycmF5QnVmZmVyVG9CdWZmZXJcIiwgKCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGFycmJ1ZmY6IEFycmF5QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDEwKVxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCAxMDsgaSsrKSB7XG4gICAgICBhcnJidWZmW2ldID0gaVxuICAgIH1cbiAgICBjb25zdCBuZXdidWZmOiBCdWZmZXIgPSBiaW50b29scy5mcm9tQXJyYXlCdWZmZXJUb0J1ZmZlcihhcnJidWZmKVxuICAgIGV4cGVjdChuZXdidWZmLmxlbmd0aCkudG9CZShhcnJidWZmLmJ5dGVMZW5ndGgpXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IG5ld2J1ZmYubGVuZ3RoOyBpKyspIHtcbiAgICAgIGV4cGVjdChuZXdidWZmW2ldKS50b0JlKGFycmJ1ZmZbaV0pXG4gICAgfVxuICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBvcmlnaW5hbCBidWZmZXIgaXNudCB0b3VjaGVkIGJ5IHdyaXRlc1xuICAgIG5ld2J1ZmZbM10gPSA1NVxuICAgIGV4cGVjdChhcnJidWZmWzNdKS5ub3QudG9CZShuZXdidWZmWzNdKVxuICB9KVxuXG4gIHRlc3QoXCJmcm9tQnVmZmVyVG9CTlwiLCAoKTogdm9pZCA9PiB7XG4gICAgY29uc3QgYmlnbjogQk4gPSBiaW50b29scy5mcm9tQnVmZmVyVG9CTihidWZmKVxuICAgIGV4cGVjdChiaWduLnRvU3RyaW5nKFwiaGV4XCIsIGhleHN0ci5sZW5ndGgpKS50b0JlKGhleHN0cilcbiAgfSlcblxuICB0ZXN0KFwiZnJvbUJOVG9CdWZmZXJcIiwgKCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGJuMTogQk4gPSBuZXcgQk4oaGV4c3RyLCBcImhleFwiLCBcImJlXCIpXG4gICAgY29uc3QgYm4yOiBCTiA9IG5ldyBCTihoZXhzdHIsIFwiaGV4XCIsIFwiYmVcIilcbiAgICBjb25zdCBiMTogQnVmZmVyID0gYmludG9vbHMuZnJvbUJOVG9CdWZmZXIoYm4xKVxuICAgIGNvbnN0IGIyOiBCdWZmZXIgPSBiaW50b29scy5mcm9tQk5Ub0J1ZmZlcihibjIsIGJ1ZmYubGVuZ3RoKVxuXG4gICAgZXhwZWN0KGIxLmxlbmd0aCkudG9CZShidWZmLmxlbmd0aCAtIDEpXG4gICAgZXhwZWN0KGIxLnRvU3RyaW5nKFwiaGV4XCIpKS50b0JlKGhleHN0ci5zbGljZSgyKSlcblxuICAgIGV4cGVjdChiMi5sZW5ndGgpLnRvQmUoYnVmZi5sZW5ndGgpXG4gICAgZXhwZWN0KGIyLnRvU3RyaW5nKFwiaGV4XCIpKS50b0JlKGhleHN0cilcbiAgfSlcblxuICB0ZXN0KFwiYWRkQ2hlY2tzdW1cIiwgKCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGJ1ZmZjaGVja2VkOiBCdWZmZXIgPSBiaW50b29scy5hZGRDaGVja3N1bShidWZmKVxuICAgIGV4cGVjdChidWZmY2hlY2tlZC5sZW5ndGgpLnRvQmUoYnVmZi5sZW5ndGggKyA0KVxuICAgIGV4cGVjdChidWZmY2hlY2tlZC5zbGljZSgxNikudG9TdHJpbmcoXCJoZXhcIikpLnRvQmUoY2hlY2tzdW0pXG4gIH0pXG5cbiAgdGVzdChcInZhbGlkdGVDaGVja3N1bVwiLCAoKTogdm9pZCA9PiB7XG4gICAgY29uc3QgY2hlY2tzdW1tZWQ6IHN0cmluZyA9IGhleHN0ciArIGNoZWNrc3VtXG4gICAgY29uc3QgYmFkc3VtbWVkOiBzdHJpbmcgPSBgJHtoZXhzdHJ9MzI0ZTc4MjJgXG4gICAgZXhwZWN0KGJpbnRvb2xzLnZhbGlkYXRlQ2hlY2tzdW0oQnVmZmVyLmZyb20oY2hlY2tzdW1tZWQsIFwiaGV4XCIpKSkudG9CZShcbiAgICAgIHRydWVcbiAgICApXG4gICAgZXhwZWN0KGJpbnRvb2xzLnZhbGlkYXRlQ2hlY2tzdW0oYnVmZikpLnRvQmUoZmFsc2UpXG4gICAgZXhwZWN0KGJpbnRvb2xzLnZhbGlkYXRlQ2hlY2tzdW0oQnVmZmVyLmZyb20oYmFkc3VtbWVkLCBcImhleFwiKSkpLnRvQmUoZmFsc2UpXG4gIH0pXG5cbiAgdGVzdChcImNiNThFbmNvZGVcIiwgKCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGZyb21CdWZmOiBzdHJpbmcgPSBiaW50b29scy5jYjU4RW5jb2RlKGJ1ZmYpXG4gICAgZXhwZWN0KGZyb21CdWZmKS50b0JlKHNlcmlhbGl6ZWRDaGVja3N1bSlcbiAgfSlcblxuICB0ZXN0KFwiY2I1OERlY29kZVwiLCAoKTogdm9pZCA9PiB7XG4gICAgY29uc3Qgc2VyYnVmZjogQnVmZmVyID0gYmludG9vbHMuYjU4VG9CdWZmZXIoc2VyaWFsaXplZENoZWNrc3VtKVxuICAgIGNvbnN0IGRzcjE6IEJ1ZmZlciA9IGJpbnRvb2xzLmNiNThEZWNvZGUoc2VyaWFsaXplZENoZWNrc3VtKVxuICAgIGNvbnN0IGRzcjI6IEJ1ZmZlciA9IGJpbnRvb2xzLmNiNThEZWNvZGUoc2VyYnVmZilcbiAgICBjb25zdCBzZXJidWZmZmF1bHR5OiBCdWZmZXIgPSBiaW50b29scy5jb3B5RnJvbShzZXJidWZmKVxuICAgIHNlcmJ1ZmZmYXVsdHlbc2VyYnVmZmZhdWx0eS5sZW5ndGggLSAxXSA9XG4gICAgICBzZXJidWZmZmF1bHR5W3NlcmJ1ZmZmYXVsdHkubGVuZ3RoIC0gMV0gLSAxXG4gICAgZXhwZWN0KGRzcjEudG9TdHJpbmcoXCJoZXhcIikpLnRvQmUoaGV4c3RyKVxuICAgIGV4cGVjdChkc3IyLnRvU3RyaW5nKFwiaGV4XCIpKS50b0JlKGhleHN0cilcbiAgICBleHBlY3QoKCk6IHZvaWQgPT4ge1xuICAgICAgYmludG9vbHMuY2I1OERlY29kZShzZXJidWZmZmF1bHR5KVxuICAgIH0pLnRvVGhyb3coXCJFcnJvciAtIEJpblRvb2xzLmNiNThEZWNvZGU6IGludmFsaWQgY2hlY2tzdW1cIilcbiAgfSlcblxuICB0ZXN0KFwiY2I1OERlY29kZVdpdGhDaGVja3N1bVwiLCAoKTogdm9pZCA9PiB7XG4gICAgY29uc3Qgc2VyYnVmZjogQnVmZmVyID0gYmludG9vbHMuYjU4VG9CdWZmZXIobG9uZ1NlcmlhbGl6ZWRDaGVja3N1bSlcbiAgICBjb25zdCBkc3IxOiBzdHJpbmcgPSBiaW50b29scy5jYjU4RGVjb2RlV2l0aENoZWNrc3VtKGxvbmdTZXJpYWxpemVkQ2hlY2tzdW0pXG4gICAgY29uc3QgZHNyMjogc3RyaW5nID0gYmludG9vbHMuY2I1OERlY29kZVdpdGhDaGVja3N1bShzZXJidWZmKVxuICAgIGNvbnN0IHNlcmJ1ZmZmYXVsdHk6IEJ1ZmZlciA9IGJpbnRvb2xzLmNvcHlGcm9tKHNlcmJ1ZmYpXG4gICAgc2VyYnVmZmZhdWx0eVtzZXJidWZmZmF1bHR5Lmxlbmd0aCAtIDFdID1cbiAgICAgIHNlcmJ1ZmZmYXVsdHlbc2VyYnVmZmZhdWx0eS5sZW5ndGggLSAxXSAtIDFcbiAgICBleHBlY3QoZHNyMSkudG9CZShjaGVja3N1bW1lZEhleFN0cilcbiAgICBleHBlY3QoZHNyMikudG9CZShjaGVja3N1bW1lZEhleFN0cilcbiAgICBleHBlY3QoKCk6IHZvaWQgPT4ge1xuICAgICAgYmludG9vbHMuY2I1OERlY29kZShzZXJidWZmZmF1bHR5KVxuICAgIH0pLnRvVGhyb3coXCJFcnJvciAtIEJpblRvb2xzLmNiNThEZWNvZGU6IGludmFsaWQgY2hlY2tzdW1cIilcbiAgfSlcblxuICB0ZXN0KFwiaXNDQjU4XCIsICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCB2YWxpZENCNTgxOiBzdHJpbmcgPVxuICAgICAgXCJpc0d2dG5EcUVUTm1tRnc3Z3VTSjdtbVdoQ3Fib0V4cnBtQzhWc1d4Y2tIY0g5b1hiXCJcbiAgICBjb25zdCB2YWxpZENCNTgyOiBzdHJpbmcgPVxuICAgICAgXCIyUHdYOHF3TUhid1ZBbTI4aG93dTNFZjdMazRpYjJYRzdBYVk5YUs4ZFRUR05YUWtDelwiXG4gICAgY29uc3QgaW52YWxpZENCNTgxOiBzdHJpbmcgPVxuICAgICAgXCJkZGQudG5EcUVUTm1tRnc3Z3VTSjdtbVdoQ3Fib0V4cnBtQzhWc1d4Y2tIY0h6enp6XCJcbiAgICBjb25zdCBpbnZhbGlkQ0I1ODI6IHN0cmluZyA9IFwiXCJcbiAgICBleHBlY3QoYmludG9vbHMuaXNDQjU4KHZhbGlkQ0I1ODEpKS50b0JlKHRydWUpXG4gICAgZXhwZWN0KGJpbnRvb2xzLmlzQ0I1OCh2YWxpZENCNTgyKSkudG9CZSh0cnVlKVxuICAgIGV4cGVjdChiaW50b29scy5pc0NCNTgoaW52YWxpZENCNTgxKSkudG9CZShmYWxzZSlcbiAgICBleHBlY3QoYmludG9vbHMuaXNDQjU4KGludmFsaWRDQjU4MikpLnRvQmUoZmFsc2UpXG4gIH0pXG5cbiAgdGVzdChcImlzQmFzZTU4XCIsICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCB2YWxpZEJhc2U1ODE6IHN0cmluZyA9XG4gICAgICBcImlzR3Z0bkRxRVRObW1GdzdndVNKN21tV2hDcWJvRXhycG1DOFZzV3hja0hjSDlvWGJcIlxuICAgIGNvbnN0IHZhbGlkQmFzZTU4Mjogc3RyaW5nID1cbiAgICAgIFwiMlB3WDhxd01IYndWQW0yOGhvd3UzRWY3TGs0aWIyWEc3QWFZOWFLOGRUVEdOWFFrQ3pcIlxuICAgIGNvbnN0IGludmFsaWRCYXNlNTgxOiBzdHJpbmcgPVxuICAgICAgXCJkZGQudG5EcUVUTm1tRnc3Z3VTSjdtbVdoQ3Fib0V4cnBtQzhWc1d4Y2tIY0h6enp6XCJcbiAgICBjb25zdCBpbnZhbGlkQmFzZTU4Mjogc3RyaW5nID0gXCJcIlxuICAgIGV4cGVjdChiaW50b29scy5pc0Jhc2U1OCh2YWxpZEJhc2U1ODEpKS50b0JlKHRydWUpXG4gICAgZXhwZWN0KGJpbnRvb2xzLmlzQmFzZTU4KHZhbGlkQmFzZTU4MikpLnRvQmUodHJ1ZSlcbiAgICBleHBlY3QoYmludG9vbHMuaXNCYXNlNTgoaW52YWxpZEJhc2U1ODEpKS50b0JlKGZhbHNlKVxuICAgIGV4cGVjdChiaW50b29scy5pc0Jhc2U1OChpbnZhbGlkQmFzZTU4MikpLnRvQmUoZmFsc2UpXG4gIH0pXG5cbiAgdGVzdChcImlzSGV4XCIsICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCB2YWxpZEhleDE6IHN0cmluZyA9XG4gICAgICBcIjB4OTVlYWFjMmI3YTZlZTdhZDdlNTk3YzJmNTM0OWIwM2U0NjFjMzZjMmUxZTUwZmM5OGE4NGQwMTYxMjk0MGJkNVwiXG4gICAgY29uc3QgdmFsaWRIZXgyOiBzdHJpbmcgPVxuICAgICAgXCI5NWVhYWMyYjdhNmVlN2FkN2U1OTdjMmY1MzQ5YjAzZTQ2MWMzNmMyZTFlNTBmYzk4YTg0ZDAxNjEyOTQwYmQ1XCJcbiAgICBjb25zdCBpbnZhbGlkSGV4MTogc3RyaW5nID1cbiAgICAgIFwicnJycnIuYzJiN2E2ZWU3YWQ3ZTU5N2MyZjUzNDliMDNlNDYxYzM2YzJlMWU1LmZjOThhODRkMDE2MTI5enp6enpcIlxuICAgIGNvbnN0IGludmFsaWRIZXgyOiBzdHJpbmcgPSBcIlwiXG4gICAgZXhwZWN0KGJpbnRvb2xzLmlzSGV4KHZhbGlkSGV4MSkpLnRvQmUodHJ1ZSlcbiAgICBleHBlY3QoYmludG9vbHMuaXNIZXgodmFsaWRIZXgyKSkudG9CZSh0cnVlKVxuICAgIGV4cGVjdChiaW50b29scy5pc0hleChpbnZhbGlkSGV4MSkpLnRvQmUoZmFsc2UpXG4gICAgZXhwZWN0KGJpbnRvb2xzLmlzSGV4KGludmFsaWRIZXgyKSkudG9CZShmYWxzZSlcbiAgfSlcblxuICB0ZXN0KFwic3RyaW5nVG9BZGRyZXNzXCIsICgpOiB2b2lkID0+IHtcbiAgICAvLyBNaXNzaW5nIHByZWZpeFxuICAgIGxldCBhZGRyOiBzdHJpbmcgPSBcIi1hdmF4MTNhNHllMzR6ZGZhMzN6ZWczdWRuejUzM2Q2bXNmdXFrZHM5aHE3XCJcbiAgICBleHBlY3QoKCk6IHZvaWQgPT4ge1xuICAgICAgYmludG9vbHMuc3RyaW5nVG9BZGRyZXNzKGFkZHIpXG4gICAgfSkudG9UaHJvdyhcIkVycm9yIC0gVmFsaWQgYWRkcmVzcyBtdXN0IGhhdmUgcHJlZml4IGJlZm9yZSAtXCIpXG5cbiAgICAvLyBNaXNzaW5nIC1cbiAgICBhZGRyID0gXCJYYXZheDEzYTR5ZTM0emRmYTMzemVnM3Vkbno1MzNkNm1zZnVxa2RzOWhxN1wiXG4gICAgZXhwZWN0KCgpOiB2b2lkID0+IHtcbiAgICAgIGJpbnRvb2xzLnN0cmluZ1RvQWRkcmVzcyhhZGRyKVxuICAgIH0pLnRvVGhyb3coXCJFcnJvciAtIFZhbGlkIGFkZHJlc3Mgc2hvdWxkIGluY2x1ZGUgLVwiKVxuXG4gICAgLy8gTWlzc2luZyBzZXBlcmF0b3IgKDEpXG4gICAgYWRkciA9IFwiWC1hdmF4M2E0eWUzNHpkZmEzM3plZzN1ZG56NTMzZDZtc2Z1cWtkczlocTdcIlxuICAgIGV4cGVjdCgoKTogdm9pZCA9PiB7XG4gICAgICBiaW50b29scy5zdHJpbmdUb0FkZHJlc3MoYWRkcilcbiAgICB9KS50b1Rocm93KFwiRXJyb3IgLSBWYWxpZCBhZGRyZXNzIG11c3QgaW5jbHVkZSBzZXBhcmF0b3IgKDEpXCIpXG5cbiAgICAvLyBNaXNzaW5nIEhSUFxuICAgIGFkZHIgPSBcIlgtMTNhNHllMzR6ZGZhMzN6ZWczdWRuejUzM2Q2bXNmdXFrZHM5aHE3XCJcbiAgICBleHBlY3QoKCk6IHZvaWQgPT4ge1xuICAgICAgYmludG9vbHMuc3RyaW5nVG9BZGRyZXNzKGFkZHIpXG4gICAgfSkudG9UaHJvdyhcIkVycm9yIC0gSFJQIHNob3VsZCBiZSBhdCBsZWFzdCAxIGNoYXJhY3RlclwiKVxuXG4gICAgLy8gSW52YWxpZCBIUlBcbiAgICBhZGRyID0gXCJYLWF2YXgxMXljeHA2NXZ6NjBtODdta20yaHN3M201ZmFkamxwbGR6bnR2cjMzXCJcbiAgICBleHBlY3QoKCk6IHZvaWQgPT4ge1xuICAgICAgYmludG9vbHMuc3RyaW5nVG9BZGRyZXNzKGFkZHIpXG4gICAgfSkudG9UaHJvdyhcIkVycm9yIC0gSW52YWxpZCBIUlBcIilcblxuICAgIC8vIEV4dHJhIGNoYXJhY3RlciBpbiBkYXRhIGJ5dGVzXG4gICAgYWRkciA9IFwiWC1sb2NhbDFkY2Z5dXVnODd4cWF5bDRmcHAwMno5ZHZrbndoYWZkc3d0dm51Y2RcIlxuICAgIGV4cGVjdCgoKTogdm9pZCA9PiB7XG4gICAgICBiaW50b29scy5zdHJpbmdUb0FkZHJlc3MoYWRkcilcbiAgICB9KS50b1Rocm93KFxuICAgICAgXCJJbnZhbGlkIGNoZWNrc3VtIGZvciBsb2NhbDFkY2Z5dXVnODd4cWF5bDRmcHAwMno5ZHZrbndoYWZkc3d0dm51Y2RcIlxuICAgIClcblxuICAgIC8vIENoYW5nZSBjaGFyYWN0ZXIgaW4gZGF0YSBieXRlc1xuICAgIGFkZHIgPSBcIlgtbG9jYWwxZGNmeXV1ZzhmeHFheWw0ZnBwMDJ6OWR2a253aGFmZHN0dm51Y2RcIlxuICAgIGV4cGVjdCgoKTogdm9pZCA9PiB7XG4gICAgICBiaW50b29scy5zdHJpbmdUb0FkZHJlc3MoYWRkcilcbiAgICB9KS50b1Rocm93KFxuICAgICAgXCJJbnZhbGlkIGNoZWNrc3VtIGZvciBsb2NhbDFkY2Z5dXVnOGZ4cWF5bDRmcHAwMno5ZHZrbndoYWZkc3R2bnVjZFwiXG4gICAgKVxuXG4gICAgLy8gSW52YWxpZCBjaGFyYWN0ZXIgaW4gZGF0YSBieXRlc1xuICAgIGFkZHIgPSBcIlgtbG9jYWwxZGNmeXV1Zzg3eHFieWw0ZnBwMDJ6OWR2a253aGFmZHN0dm51Y2RcIlxuICAgIGV4cGVjdCgoKTogdm9pZCA9PiB7XG4gICAgICBiaW50b29scy5zdHJpbmdUb0FkZHJlc3MoYWRkcilcbiAgICB9KS50b1Rocm93KFwiVW5rbm93biBjaGFyYWN0ZXIgYlwiKVxuXG4gICAgLy8gQ2hhbmdlIGNoYXJhY3RlciBpbiBjaGVja3N1bVxuICAgIGFkZHIgPSBcIlgtbG9jYWwxZGNmeXV1Zzg3eHFheWw0ZnBwMDJ6OWR2a253aGFmZHN0dm51Y2VcIlxuICAgIGV4cGVjdCgoKTogdm9pZCA9PiB7XG4gICAgICBiaW50b29scy5zdHJpbmdUb0FkZHJlc3MoYWRkcilcbiAgICB9KS50b1Rocm93KFxuICAgICAgXCJJbnZhbGlkIGNoZWNrc3VtIGZvciBsb2NhbDFkY2Z5dXVnODd4cWF5bDRmcHAwMno5ZHZrbndoYWZkc3R2bnVjZVwiXG4gICAgKVxuXG4gICAgLy8gSW52YWxpZCBFVEgtc3R5bGUgYWRkcmVzc1xuICAgIGFkZHIgPSBcIjB4LmRiOTdDN2NFY0UyNDljMmI5OGJEQzAyMjZDYzRDMkE1N0JGNTJGQ1wiXG4gICAgZXhwZWN0KCgpOiB2b2lkID0+IHtcbiAgICAgIGJpbnRvb2xzLnN0cmluZ1RvQWRkcmVzcyhhZGRyKVxuICAgIH0pLnRvVGhyb3coXCJFcnJvciAtIEludmFsaWQgYWRkcmVzc1wiKVxuXG4gICAgbGV0IGFkZHJzOiBzdHJpbmdbXSA9IFtcbiAgICAgIFwiWC1sb2NhbDFkY2Z5dXVnODd4cWF5bDRmcHAwMno5ZHZrbndoYWZkc3R2bnVjZFwiLFxuICAgICAgXCJYLWxvY2FsMWx0Z2hqMDMzcmU2NDkyMGs3ODZ1cHJjcDgycDllMzZqN2h6YzV4XCIsXG4gICAgICBcIlgtbG9jYWwxZHE0cTlzZXFsMnNweHJrZDdybDgydWNrNWVqM252bGhybHVoNHVcIlxuICAgIF1cbiAgICBhZGRycy5mb3JFYWNoKChhZGRyZXNzOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgIGJpbnRvb2xzLnN0cmluZ1RvQWRkcmVzcyhhZGRyZXNzKVxuICAgIH0pXG4gICAgYWRkcnMgPSBbXG4gICAgICBcIlgtZnVqaTFkY2Z5dXVnODd4cWF5bDRmcHAwMno5ZHZrbndoYWZkczdkMjloNlwiLFxuICAgICAgXCJYLWZ1amkxbHRnaGowMzNyZTY0OTIwazc4NnVwcmNwODJwOWUzNmp0a21wbTNcIixcbiAgICAgIFwiWC1mdWppMWRxNHE5c2VxbDJzcHhya2Q3cmw4MnVjazVlajNudmxoazc5dzZ0XCJcbiAgICBdXG4gICAgYWRkcnMuZm9yRWFjaCgoYWRkcmVzczogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICBiaW50b29scy5zdHJpbmdUb0FkZHJlc3MoYWRkcmVzcylcbiAgICB9KVxuICAgIGFkZHJzID0gW1xuICAgICAgXCJYLWF2YXgxZGNmeXV1Zzg3eHFheWw0ZnBwMDJ6OWR2a253aGFmZHNqbHc2bTlcIixcbiAgICAgIFwiWC1hdmF4MWx0Z2hqMDMzcmU2NDkyMGs3ODZ1cHJjcDgycDllMzZqOHlsN2h3XCIsXG4gICAgICBcIlgtYXZheDFkcTRxOXNlcWwyc3B4cmtkN3JsODJ1Y2s1ZWozbnZsaDZ2cDNrNVwiXG4gICAgXVxuICAgIGFkZHJzLmZvckVhY2goKGFkZHJlc3M6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgYmludG9vbHMuc3RyaW5nVG9BZGRyZXNzKGFkZHJlc3MpXG4gICAgfSlcbiAgICBhZGRycyA9IFtcbiAgICAgIFwiUC1sb2NhbDFkY2Z5dXVnODd4cWF5bDRmcHAwMno5ZHZrbndoYWZkc3R2bnVjZFwiLFxuICAgICAgXCJQLWxvY2FsMWx0Z2hqMDMzcmU2NDkyMGs3ODZ1cHJjcDgycDllMzZqN2h6YzV4XCIsXG4gICAgICBcIlAtbG9jYWwxZHE0cTlzZXFsMnNweHJrZDdybDgydWNrNWVqM252bGhybHVoNHVcIlxuICAgIF1cbiAgICBhZGRycy5mb3JFYWNoKChhZGRyZXNzOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgIGJpbnRvb2xzLnN0cmluZ1RvQWRkcmVzcyhhZGRyZXNzKVxuICAgIH0pXG4gICAgYWRkcnMgPSBbXG4gICAgICBcIlAtZnVqaTFkY2Z5dXVnODd4cWF5bDRmcHAwMno5ZHZrbndoYWZkczdkMjloNlwiLFxuICAgICAgXCJQLWZ1amkxbHRnaGowMzNyZTY0OTIwazc4NnVwcmNwODJwOWUzNmp0a21wbTNcIixcbiAgICAgIFwiUC1mdWppMWRxNHE5c2VxbDJzcHhya2Q3cmw4MnVjazVlajNudmxoazc5dzZ0XCJcbiAgICBdXG4gICAgYWRkcnMuZm9yRWFjaCgoYWRkcmVzczogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICBiaW50b29scy5zdHJpbmdUb0FkZHJlc3MoYWRkcmVzcylcbiAgICB9KVxuICAgIGFkZHJzID0gW1xuICAgICAgXCJQLWF2YXgxZGNmeXV1Zzg3eHFheWw0ZnBwMDJ6OWR2a253aGFmZHNqbHc2bTlcIixcbiAgICAgIFwiUC1hdmF4MWx0Z2hqMDMzcmU2NDkyMGs3ODZ1cHJjcDgycDllMzZqOHlsN2h3XCIsXG4gICAgICBcIlAtYXZheDFkcTRxOXNlcWwyc3B4cmtkN3JsODJ1Y2s1ZWozbnZsaDZ2cDNrNVwiXG4gICAgXVxuICAgIGFkZHJzLmZvckVhY2goKGFkZHJlc3M6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgYmludG9vbHMuc3RyaW5nVG9BZGRyZXNzKGFkZHJlc3MpXG4gICAgfSlcblxuICAgIGFkZHJzID0gW1xuICAgICAgXCJDLWxvY2FsMWRjZnl1dWc4N3hxYXlsNGZwcDAyejlkdmtud2hhZmRzdHZudWNkXCIsXG4gICAgICBcIkMtbG9jYWwxbHRnaGowMzNyZTY0OTIwazc4NnVwcmNwODJwOWUzNmo3aHpjNXhcIixcbiAgICAgIFwiQy1sb2NhbDFkcTRxOXNlcWwyc3B4cmtkN3JsODJ1Y2s1ZWozbnZsaHJsdWg0dVwiXG4gICAgXVxuICAgIGFkZHJzLmZvckVhY2goKGFkZHJlc3M6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgYmludG9vbHMuc3RyaW5nVG9BZGRyZXNzKGFkZHJlc3MpXG4gICAgfSlcblxuICAgIGFkZHJzID0gW1xuICAgICAgXCJDLWZ1amkxZGNmeXV1Zzg3eHFheWw0ZnBwMDJ6OWR2a253aGFmZHM3ZDI5aDZcIixcbiAgICAgIFwiQy1mdWppMWx0Z2hqMDMzcmU2NDkyMGs3ODZ1cHJjcDgycDllMzZqdGttcG0zXCIsXG4gICAgICBcIkMtZnVqaTFkcTRxOXNlcWwyc3B4cmtkN3JsODJ1Y2s1ZWozbnZsaGs3OXc2dFwiXG4gICAgXVxuICAgIGFkZHJzLmZvckVhY2goKGFkZHJlc3M6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgYmludG9vbHMuc3RyaW5nVG9BZGRyZXNzKGFkZHJlc3MpXG4gICAgfSlcblxuICAgIGFkZHJzID0gW1xuICAgICAgXCJDLWF2YXgxZGNmeXV1Zzg3eHFheWw0ZnBwMDJ6OWR2a253aGFmZHNqbHc2bTlcIixcbiAgICAgIFwiQy1hdmF4MWx0Z2hqMDMzcmU2NDkyMGs3ODZ1cHJjcDgycDllMzZqOHlsN2h3XCIsXG4gICAgICBcIkMtYXZheDFkcTRxOXNlcWwyc3B4cmtkN3JsODJ1Y2s1ZWozbnZsaDZ2cDNrNVwiXG4gICAgXVxuICAgIGFkZHJzLmZvckVhY2goKGFkZHJlc3M6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgYmludG9vbHMuc3RyaW5nVG9BZGRyZXNzKGFkZHJlc3MpXG4gICAgfSlcblxuICAgIGFkZHJzID0gW1xuICAgICAgXCJYLWZvbzFkY2Z5dXVnODd4cWF5bDRmcHAwMno5ZHZrbndoYWZkczRrM2ttM1wiLFxuICAgICAgXCJYLWZvbzFsdGdoajAzM3JlNjQ5MjBrNzg2dXByY3A4MnA5ZTM2anFkcWpoNlwiLFxuICAgICAgXCJYLWZvbzFkcTRxOXNlcWwyc3B4cmtkN3JsODJ1Y2s1ZWozbnZsaGE5N2FrcVwiXG4gICAgXVxuICAgIGFkZHJzLmZvckVhY2goKGFkZHJlc3M6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgYmludG9vbHMuc3RyaW5nVG9BZGRyZXNzKGFkZHJlc3MsIFwiZm9vXCIpXG4gICAgfSlcblxuICAgIGFkZHJzID0gW1xuICAgICAgXCIweDhkYjk3QzdjRWNFMjQ5YzJiOThiREMwMjI2Q2M0QzJBNTdCRjUyRkNcIixcbiAgICAgIFwiMHhDMWFkNzhGRGQ0YUVkMDI3RWJENWU5ZWVlODc4ZjQ0ZGMxRTI5MzU4XCIsXG4gICAgICBcIjB4NUI0NGJDMjYyMmRjNURENjZhOTRjZDVmMmFEYzNhNDlhYmI4NjRkRVwiXG4gICAgXVxuICAgIGFkZHJzLmZvckVhY2goKGFkZHJlc3M6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgYmludG9vbHMuc3RyaW5nVG9BZGRyZXNzKGFkZHJlc3MpXG4gICAgfSlcbiAgfSlcbn0pXG4iXX0=

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


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