// File: contracts/ScoutPass.sol



// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

import "./BasePass.sol";
import "./IRenderer.sol";
import "./OpenSeaMetadata.sol";
import "./Sprites.sol";

contract ScoutPass is BasePass {
    IRenderer public renderer;
    string private _symbol;

    constructor(IUtilityERC20 _token, IRenderer _renderer)
        BasePass(
            _token,
            200 ether,
            "Scout Pass"
        )
    {
        _symbol = "SCOUTPASS";
        renderer = _renderer;
    }

    function extensionKey() public override pure returns (string memory) {
        return "metaversePass";
    }
    
    function adminSetRenderer(IRenderer _renderer) external onlyAdmin {
        renderer = _renderer;
    }

    function adminSetSymbol(string memory sym) external onlyAdmin {
        _symbol = sym;
    }

    function metadata() public virtual view override returns (OpenSeaMetadata memory) {
        bytes[] memory passSprite = new bytes[](1);
        passSprite[0] = MiscSprites.passSprite();
        string memory sprite = renderer.render(passSprite);

        return OpenSeaMetadata({
            svg: sprite,
            name: "Scout Pass",
            description: "The Scout Pass is the key to unlock perks in the Chain Scouts ecosystem",
            backgroundColor: 0,
            attributes: new Attribute[](0)
        });
    }

    function symbol() public virtual view override returns (string memory) {
        return _symbol;
    }
}

// File: contracts/BasePass.sol



// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

import "./IUtilityERC20.sol";
import "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol";
import "./ChainScoutsExtension.sol";
import "./OpenSeaMetadata.sol";

/**
 * Base class for creating "passes" e.g. Scout Pass purchaseable with a Utility ERC20 token.
 */
abstract contract BasePass is ChainScoutsExtension, ERC1155Supply {
    IUtilityERC20 public token;
    uint256 public price;
    string public name;

    constructor(
        IUtilityERC20 _token,
        uint256 _price,
        string memory _name
    )
        ERC1155("")
    {
        token = _token;
        price = _price;
        name = _name;
    }

    /**
     * Sets the name of the pass. OpenSea uses this to determine the collection name.
     */
    function adminSetName(string memory _name) external onlyAdmin {
        name = _name;
    }

    /**
     * Sets the token used to purchase the pass.
     */
    function adminSetToken(IUtilityERC20 _token) external onlyAdmin {
        token = _token;
    }

    /**
     * Sets the amount of token() needed to purchase a pass. Remember that this is wei (10^-18 eth) for most tokens.
     */
    function adminSetPrice(uint256 _price) external onlyAdmin {
        price = _price;
    }

    /**
     * @dev Burns one or more passes. This is used by contracts that require passes in exchange for services.
     * You must be the owner of the pass(es) being burnt or an admin.
     */
    function burn(address owner, uint256 count) external virtual whenEnabled {
        require(
            chainScouts.isAdmin(msg.sender) || msg.sender == owner,
            "must be admin or owner"
        );
        _burn(msg.sender, 0, count);
    }

    /**
     * @dev Purchases one or more passes. Requires price() token() per pass.
     */
    function purchase(uint256 count) public virtual whenEnabled {
        require(count > 0, "Must mint at least one");
        token.burn(msg.sender, count * price);
        _mint(msg.sender, 0, count, hex"");
    }

    /**
     * @dev Returns the metadata of the pass. Used by OpenSea to render the image.
     */
    function metadata() public virtual view returns (OpenSeaMetadata memory);

    /**
     * @dev Returns the "symbol" of the pass. For example, Ethereum's symbol is "ETH".
     */
    function symbol() public virtual view returns (string memory);

    function uri(uint) public override view returns (string memory) {
        return OpenSeaMetadataLibrary.makeERC1155Metadata(metadata(), symbol());
    }
}

// File: contracts/IRenderer.sol



//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IRenderer {
    function render(bytes[] memory sprites) external view returns (string memory);
}

// File: contracts/OpenSeaMetadata.sol



//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./Base64.sol";
import "./Integer.sol";
import "@openzeppelin/contracts/utils/Strings.sol";

enum NumericAttributeType {
    NUMBER,
    BOOST_PERCENTAGE,
    BOOST_NUMBER,
    DATE
}

struct Attribute {
    string displayType;
    string key;
    string serializedValue;
    string maxValue;
}

struct OpenSeaMetadata {
    string svg;
    string description;
    string name;
    uint24 backgroundColor;
    Attribute[] attributes;
}

library OpenSeaMetadataLibrary {
    using Strings for uint;

    struct ObjectKeyValuePair {
        string key;
        string serializedValue;
    }

    function uintToColorString(uint value, uint nBytes) internal pure returns (string memory) {
        bytes memory symbols = "0123456789ABCDEF";
        bytes memory buf = new bytes(nBytes * 2);

        for (uint i = 0; i < nBytes * 2; ++i) {
            buf[nBytes * 2 - 1 - i] = symbols[Integer.bitsFrom(value, (i * 4) + 3, i * 4)];
        }

        return string(buf);
    }

    function quote(string memory str) internal pure returns (string memory output) {
        return bytes(str).length > 0 ? string(abi.encodePacked(
            '"',
            str,
            '"'
        )) : "";
    }

    function makeStringAttribute(string memory key, string memory value) internal pure returns (Attribute memory) {
        return Attribute("", key, quote(value), "");
    }

    function makeNumericAttribute(NumericAttributeType nat, string memory key, string memory value, string memory maxValue) private pure returns (Attribute memory) {
        string memory s = "number";
        if (nat == NumericAttributeType.BOOST_PERCENTAGE) {
            s = "boost_percentage";
        }
        else if (nat == NumericAttributeType.BOOST_NUMBER) {
            s = "boost_number";
        }
        else if (nat == NumericAttributeType.DATE) {
            s = "date";
        }

        return Attribute(s, key, value, maxValue);
    }

    function makeFixedPoint(uint value, uint decimals) internal pure returns (string memory) {
        bytes memory st = bytes(value.toString());

        while (st.length < decimals) {
            st = abi.encodePacked(
                "0",
                st
            );
        }

        bytes memory ret = new bytes(st.length + 1);

        if (decimals >= st.length) {
            return string(abi.encodePacked("0.", st));
        }

        uint dl = st.length - decimals;

        uint i = 0;
        uint j = 0;

        while (i < ret.length) {
            if (i == dl) {
                ret[i] = '.';
                i++;
                continue;
            }

            ret[i] = st[j];

            i++;
            j++;
        }

        return string(ret);
    }

    function makeFixedPointAttribute(NumericAttributeType nat, string memory key, uint value, uint maxValue, uint decimals) internal pure returns (Attribute memory) {
        return makeNumericAttribute(nat, key, makeFixedPoint(value, decimals), maxValue == 0 ? "" : makeFixedPoint(maxValue, decimals));
    }

    function makeUintAttribute(NumericAttributeType nat, string memory key, uint value, uint maxValue) internal pure returns (Attribute memory) {
        return makeNumericAttribute(nat, key, value.toString(), maxValue == 0 ? "" : maxValue.toString());
    }

    function makeBooleanAttribute(string memory key, bool value) internal pure returns (Attribute memory) {
        return Attribute("", key, value ? "true" : "false", "");
    }

    function makeAttributesArray(Attribute[] memory attributes) internal pure returns (string memory output) {
        output = "[";
        bool empty = true;

        for (uint i = 0; i < attributes.length; ++i) {
            if (bytes(attributes[i].serializedValue).length > 0) {
                ObjectKeyValuePair[] memory kvps = new ObjectKeyValuePair[](4);
                kvps[0] = ObjectKeyValuePair("trait_type", quote(attributes[i].key));
                kvps[1] = ObjectKeyValuePair("display_type", quote(attributes[i].displayType));
                kvps[2] = ObjectKeyValuePair("value", attributes[i].serializedValue);
                kvps[3] = ObjectKeyValuePair("max_value", attributes[i].maxValue);

                output = string(abi.encodePacked(
                    output,
                    empty ? "" : ",",
                    makeObject(kvps)
                ));
                empty = false;
            }
        }

        output = string(abi.encodePacked(output, "]"));
    }

    function notEmpty(string memory s) internal pure returns (bool) {
        return bytes(s).length > 0;
    }

    function makeObject(ObjectKeyValuePair[] memory kvps) internal pure returns (string memory output) {
        output = "{";
        bool empty = true;

        for (uint i = 0; i < kvps.length; ++i) {
            if (bytes(kvps[i].serializedValue).length > 0) {
                output = string(abi.encodePacked(
                    output,
                    empty ? "" : ",",
                    '"',
                    kvps[i].key,
                    '":',
                    kvps[i].serializedValue
                ));
                empty = false;
            }
        }

        output = string(abi.encodePacked(output, "}"));
    }

    function makeMetadataWithExtraKvps(OpenSeaMetadata memory metadata, ObjectKeyValuePair[] memory extra) internal pure returns (string memory output) {
        /*
        string memory svgUrl = string(abi.encodePacked(
            "data:image/svg+xml;base64,",
            string(Base64.encode(bytes(metadata.svg)))
        ));
        */

        string memory svgUrl = string(abi.encodePacked(
            "data:image/svg+xml;utf8,",
            metadata.svg
        ));

        ObjectKeyValuePair[] memory kvps = new ObjectKeyValuePair[](5 + extra.length);
        kvps[0] = ObjectKeyValuePair("name", quote(metadata.name));
        kvps[1] = ObjectKeyValuePair("description", quote(metadata.description));
        kvps[2] = ObjectKeyValuePair("image", quote(svgUrl));
        kvps[3] = ObjectKeyValuePair("background_color", quote(uintToColorString(metadata.backgroundColor, 3)));
        kvps[4] = ObjectKeyValuePair("attributes", makeAttributesArray(metadata.attributes));
        for (uint i = 0; i < extra.length; ++i) {
            kvps[i + 5] = extra[i];
        }

        return string(abi.encodePacked(
            "data:application/json;base64,",
            Base64.encode(bytes(makeObject(kvps)))
        ));
    }

    function makeMetadata(OpenSeaMetadata memory metadata) internal pure returns (string memory output) {
        return makeMetadataWithExtraKvps(metadata, new ObjectKeyValuePair[](0));
    }

    function makeERC1155Metadata(OpenSeaMetadata memory metadata, string memory symbol) internal pure returns (string memory output) {
        ObjectKeyValuePair[] memory kvps = new ObjectKeyValuePair[](1);
        kvps[0] = ObjectKeyValuePair("symbol", quote(symbol));
        return makeMetadataWithExtraKvps(metadata, kvps);
    }
}

// File: contracts/Sprites.sol



//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./Enums.sol";

library AccessorySprites {
    function getSprite(Accessory v) external pure returns (bytes memory) {
        if (v == Accessory.NONE) {
            return hex"";
        }

        if (v == Accessory.SCARS) {
            return
                hex"B12002CD2002B14002CD4002B56002C96002B58002C980025D16800A9A0009532A002509B000ACB000A8B8009532E002A70002B3000254BC800ACC800C";
        }

        if (v == Accessory.GOLDEN_CHAIN) {
            return
                hex"9F2004A32E66A72004DB2004DF2E66E320049F4004A34B09A74004DB4004DF4B09E340049F6004A37382A76004DB6004DF745FE36004A38004A7945F54BE0011A578004DB9382DF8004A7A004ABAE66AFB382593E80134EB99B5ED17F6E801152FC004B3CE66B7D45FBBD3825F0F399B1F2C2594FD382695F001164FE004";
        }

        if (v == Accessory.AMULET) {
            return
                hex"4E8C80137CA6738C80127D00128D4E0A9D00136D00137D328B8D00128D80129DD17D52F6004695D80136DCE0B7D80129E0012AE399ABE4E0964F8004D38E66D7945FDB800454BE8012CEB99ADED17EEE8012FEBF0B0E80131EAC2594FB382695E8011637C004BBCA2EBFCFC2C3CA2E633F0012DF8011743EC4FC7E0040";
        }

        if (v == Accessory.CUBAN_LINK_GOLD_CHAIN) {
            return
                hex"A3345FA72004DB2004DF345F9F4B14A3499CA75382AB4004D74004DB5382DF499CE34B149B60049F70F9A3699CA76004DB6004DF699CE370F9E760044C7E00128E2C529E3E6AAE517EBE00134E00135E517F6E3E6B7E2C51C6780049FA004A3B38252AE8012BECE0ACE8012DECE0AEED17D7C3A004C7B45FCBB382CFA004D3B3826B6E80137ECE0B8E80128F00129F399AAF43E6BF0012CF39996BBC004BFD382C3CE66632F00133F399B4F00135F43E76F399B7F00114B3E004B7F0F9BBEE665F0F80131FC3E72FB9999DBE0040";
        }

        if (v == Accessory.FANNY_PACK) {
            return
                hex"719C00137C80138CB3139C80136D00137D33138D4F8B9D00135D80136DB3137DCF8B8D80119538004D78CC4DB93E2DF8004C7A004CBAFC9CFA004D3B3E2D7AA6BDBA004C3C004C7CFC9CBD10CCFCCC4D3D3E2D7CCC4DBC004BFE004C3EFC9C7E004CBECD3CFECC4D3F3E2D7ECC4DBE0040";
        }

        if (v == Accessory.GOLD_EARRINGS) {
            return hex"9200048E20049232B49620049240048E60049272B4966004928004";
        }

        revert("invalid accessory");
    }
}

library BackAccessorySprites {
    function getSprite(BackAccessory v) external pure returns (bytes memory) {
        if (v == BackAccessory.SCOUT) {
            return
                hex"";
        }

        if (v == BackAccessory.MERCENARY) {
            return
                hex"82200482579D8640048278628660048280048698628A800482A00486B8628AB79D8EA004424B00126B00122B80123BE211216E0049AF8628F00049314C84A6C001108B20048F3862485C80126CB9553A32004834004422D5E751934004974B609B40049F4B1CA34004837862422D801129B60049F6C83A360048380049F8004A38EE352AE0011427A004ABB862AFA004A3C004A7D7A1ABC004AFD7A158DF00114AFE004B3EEE3B7EC835CFF80100";
        }

        if (v == BackAccessory.RONIN) {
            return
                hex"822004FE200440190011F7E4004826DF88677B38A6004F66004FA77B3FE6E1082881C422A21723A0013CA0011EFA885CFE881C86A85C8AADF88EB7C992A004EEA004F2B7B3F6AE10FAA85C444B21725B0013AB0011DF6C85C8EE85C92EDF896F7C99AE004E6E004EAF7B3EEEE10F2E85C485C21726C20727C2D3F8C2D3DCEF085C97281C9B2B4F9F2004E32004E72B4FEB285C934004974B4F9B4004E74004EB4B4FEF481C485D8013AD8013BDA170";
        }

        if (v == BackAccessory.ENCHANTER) {
            return
                hex"8174B14235D2C9E7D73038194B48594B58994B48D94B3E99304ED9305F193077BE64C23F64C1A06D2D9089B4B88DB4B7E9B306EDB309F1B30BF5B30DF9B30EFDB30C81D4B985D4BC89D4BB8DD4B9E9D30AF1D30FF5D311F9D312FDD31081F4BE4227D30637D2FFC7CC4FD7CC57E7CC5BF7CC5208530D08A14C78E14C3F21317F61319FA131AFE13188234C54228D32238D31BC8CC6DEFA331FFE331C8254C4422953223956EBC94C75EFA531FFE531E8274C08674C28A736A8E71BAF26D9BF66F1BFA705AFE719F8294BA8694BD8A8DC48E8B7CF2838AF68BC5FA8DE6FE8FC582B4B886AA478AA63F8EA6C892A6E2EEA216F2A270F6A308FAA9D9FEACB482C63E86C6D18AC75C8EC76492C76A96C7759AC76DE2C3FBE6C239EAC1B1EEC2F0F2C302F6C215FAC299FEC36982E75B86E7708AE776464B9FC25B9DE66B9DBF9B8933AB86C3BB8BEBCB8C0BDB8723EB87F7FB890E0C1E8E1C1DD22C1FAD19307F09707789B076EE303C4E7023AEB01C7EF019BF3019AF701A2FB01AFFF01B28327AB8727B28B27DC8F27EA9327D39727D49B27689F26C2E32373E721F2EB2193EF2195F32194F72192FB218DFF218F83479B8747898B47858F47879347929747739B47679F46ABE3437DE7424BEB418BEF4191F34190F7418EFB418FFF418C836781876787443D9E0A4D9E065D9E0E6D9DB27D9AE4";
        }

        if (v == BackAccessory.VANGUARD) {
            return
                hex"446A8011D76A00486C0048ACB2D464B3B2929ACB2D73AB2CB5DF2CECAF6CB2DFAC00486E0048AEECA466BA9A9CF2EA6AF6EECAFAE0048700048B0B2D8F0A6A486C3BEA7C2DA38C2DA1CEF0EFAF30A6AF70B2DFB00048720048B2B2D8F2A6A932EFA4A6CADA27C80138C8011CEB2B68EF2EFAF32A6AF72B2DFB20048740048B49A78F4A6A934EFA974B689B40049F4C2AA34004DF4004E34C2AE74004EB4B68EF4EFAF34A6AF749A7FB40048760048B69A78F6A6A936B689760049F6004A36C2AA76004DB6004DF6C2AE36004EB6004EF6B68F36A6AF769A7FB60048B80048F8B2D938004A38004A78C2AAB8004D78004DB8C2ADF8004EF8004F38B2DF780048BA0048FAB2D93A004A7A004ABAC2AAFA004D3A004D7AC2ADBA004EFA004F3AB2DF7A004443F0012AF0012BF30AACF00133F00134F30AB5F0011E77C0048BE004AFE004B3EC2AB7E004CFEC2AD3E004F7E0040";
        }

        if (v == BackAccessory.MINER) {
            return
                hex"485A8011D6EA0048EC00492D88496D7FD9AC004E6C004EAD7FDEED884F2C0048AE0048EED4E92E00496ED4E9AF84E9EE004E2E004E6F84EEAED4EEEE89BF2ED4EF6E0048700048B18848F000493184E4A6C00127C5FF68C00137C00138C5FF5CEB0004EF184EF30004F71884FB0004423C80124CB53A5CE13A6CB5393A320046F8C80139CB53BACE13BBCB53BCCA26DEFB20048740048B4B018F4A2C486D00127D30AA8D00137D00138D30A9CEF4004F34A2CF74B01FB40048760048B6B018F6C4D936E899760049F6004A36C2AA76004DB6004DF6C2AE36004EB6004EF6E89F36C4DF76B01FB60048780048B8B018F8C4D938E89978004A38004A78C2AAB8004D78004DB8C2ADF8004EB8004EF8E89F38C4DF78B01FB800487A0048BAB018FAC4D93A004A7A004ABAC2AAFA004D3A004D7AC2ADBA004EFA004F3AC4DF7AB01FBA0048BC0048FCC4D93C004ABC004AFCC2AB3C004CFC004D3CC2AD7C004EFC004F3CC4DF7C004443F8012BF8012CFB0AADF80132F80133FB0AB4F8011E77E004";
        }

        if (v == BackAccessory.PATHFINDER) {
            return
                hex"84160C88160F8C16129016144A605866705862805856905846A0583EB0583210D83E20D84E30A39A40A6DE50A7B660A83270A7B680A69290D866A0D84AB0D83EC0D83211584A2123BE3137D641468E5147F661325E7147FA8139D291276EA15866B1584AC15836D1583211A2AE21B6FE31C68E41C8EA51B0D661B17E71B0A681C8EE91B9D2A1A676B1D852C1D83ED1D83212236A22385E3248224230E6523EC66258C2723EC68230D69247FAA2278EB2585EC25842D2583212A3BE22AEF232B2BE42B1DA52D8C262DDAA72D8C282B1C292B25EA2A832B2D866C2D846D2D83213239A23385E334866433162533FAE6358C2733FAE833112934822A327B6B3585EC358456B8D60C84E8AB88EDE08CF1BD90F26494EC5F98ECAE9CEC5FA0F265A4EE8AA8E9B7ACF616B0F60FB4F60C8516128908EF8D0E0E9111CB95123C990CCF9D1223A10EA0A509EDA9161BAD1612B1160DB5160C85360F8936138D29019129DB952A1E992A4C9D2A1EA129D3A5361BA93613AD360FB1360C85560C89560F8D561391561795561B99561C9D561AA15617A55613A9560E56C5583225D83235D83A45D83E55D84531D7612A1760FA5760D54B5D831215960C99960D4E9658300";
        }

        if (v == BackAccessory.NETRUNNER) {
            return
                hex"8C0004900A1B940004E80004EC0A1BF000048C2004902A1B942004E82004EC2A1BF020048C4004904C0A944004E84004EC4C0AF040048C6004906B59946004E86004EC6B59F060048C80049083DF948004E88004EC83DFF080048CA00490A3DF94A004E8A004ECA3DFF0A00490C00494CC2F98C004E4C004E8CC2FECC00490E00494EC2F98E004E4E004E8EC2FECE004810004910004950F33990004E50004E90F33ED0004FD0004812A1B4224801254801264B0BD3A520046D84801394B0BFA48011EF92004FD2A1B81400442250C523500126500127530BE85286F75286F8530BF950013C50011EF94314FD40044225801235BCCE458012758013858013B58013C5BCCDEF960048D8004918C2F958004E98004ED8C2FF1800491A00495AA1B99A004E5A004E9AA1BEDA00481C00495C00499CA1BE5CA1BE9C004FDC00481EA1B85E004F9E004FDEA1B82000486031444480011DF60004FA0314FE00048620048A2F338E2A1BF22A1BF62F33FA200444390011E76400482C0049AC004E6C004FEC00482EA1B86E00496E0049AEA1BE6EA1BEAE004FAE004FEEA1B830004870C2F444C00125C2D666C00139C0013AC2D65DF70004FB0C2FFF00048720048B2314464CBCCE5C8013AC8011DF32F33F72314FB2004444D0011DF740040";
        }
        revert("invalid back accessory");
    }
}

library BackgroundSprites {
    function getSprite(Background v) external pure returns (bytes memory) {
        if (v == Background.STARRY_YELLOW) {
            return
                hex"80105784104C443040F921C103150A0408AB044D163C10226170405DC68100DEC1124F01190F411247DF0403600C3FE10C3CA20C1C919030644A70C15D424304CA8315DAC31A9B0314E5AF0C0F984C30316990C089D6C3017F031337BF0C05E0145A61147B62144C519051239451174C71442942450FFA850F2AC518FB050F15AF141C984450646531415F414199AD8504CDC503EE0503D73C140C5EFC502280727F8472808872438C719D90718E94718C9871789C716A5091C57152C714C58D1C506E1C4C6F1C4BF01C48F11C45F21C45731C429A5470FF6D71C3CB81C1CB91C1C3A1C191DF070577BE1C133F1C0FA024A5E124B1222497E32490A4248AD298921C9C91FF50924802A247AEB2475563491C3B891A7BC91A8611246772246319D0916AD4915CD8914CDC9141E09131E49123E8911777C2442BD243FFE243CBF241CA02CDDA12CD2622CCC632CBCA42CB0A52CB0D31CB2B4A0B2A952A2CA3AB2CA3EC2C9A2D2C9FAE2C97AF2C945844B2426532C83742C80352C7AF62C75772C70F82C6D1CE8B19DECB16AF0B169F4B15CF8B141FCB13180D42A84D40988D3F28CD3C948534EBE634EBA734E7A834E22934E26A34DA2B34D66C34D616B8D34ABCD331C0D2DD63234B0B334AD3434AA7534A3B6349A373497B83497F934907A348AFB34837C34803D34757E3470FF346D203E12213E11223D2BE33D245214F49098F4929CF4735093D10D52CF418B0F417B4F3F35CF3CF71844F3AFC8F3AECCF388D0F389D4F375D8F358DCF330E0F331E4F2F3E8F2DEECF2A9F0F297F4F27DF8F27EFCF22C81185D8518544434614E44616D29918524E94612EA4612AB46122C4611D6B91841BD14AF611452432451719D11443D514176D744FCF844F73944F27A44EBFB44E23C44DDBD44D63E44D27F44CC604E17E14E181111385E4A64E16674E16142D3857B13855B5385CB93854BD385BC13850C5384D6534E12F44E12B54E12364E11774E10784D2BF94D24BA4D1CFB4D16FC4D0ABD4D05FE4CF77F4CF2A0561A215619E25619A35619E45619929958619D586050A56186B56182C5617AD56182E5617D7C5585EC9585967456161AD9585DDD5855E15853E55850E9584BED584CF15848F55845F954AFFD54924015E1AA25E1AE35E1A921978699D74455095E1A55357868B97867BD7866C178676335E19B45E19755E181B5D785FE1785E73A5E167B5E18FC5E157D5E153E5E14FF5E14A065119091986C4AB661AEC661A96BD986B613661AB4661A5AD998686F86619DCE9986677C66183D6617FE6617BF661B9009B86E46C6E1B56C5B86C6576E1ADC65B86AE9B86977C6E1A3D6E19FE6E1C7F6E1CD025D86E552761B59D1D86CD5D86D6D7761B1C71D86B7BE761ABF761D607E1B50C1F86E6327E1B737E1B9A61F86D73A7E1B3B7E1B5E75F86C7DF7E1AD00A186D476861B9BFA186DFE186C82386B86386C4458E1B5372386EF634477DF8E1B60961A61961AA2961AE3961B127A586DFE586E8278668678728A78694649E1A929A786B4E99E1B152E786D58F9E1B184A786D6759E1B1B62786DE6786C75F9E1B60A61BE1A61DA2A61C23A61A121698694C8A61A94BA986B5F1A61B194E986B697A61B1C6A986B77FA61B20AE1521AE1B62AE17E3AE1824AE1865AE19A6AE19D3AAB868AEB869B2B8685B0AE1A71AE1A994EB869D2B86A6B6AE1A5BF6B86A7DFAE1AE0B612A1B614A2B61523B618E4B616529AD85E9ED85F509B618152ED86158EB619AFB619D84AD866CED867D2D8666B8B619DCF6D8687DFB61A60BD1D21BD2BE2BE1223BE12E4BE1425BE14D31EF854A2F863A6F858AAF864AEF85858EBE1657C2F85EC6F85FCAF85E675BE17F6BE179BE6F85F75BBE183CBE185EFAF866FEF8678313CA8714088B14438F14749314B09718419B18499F1848A3184AA7184BAB184FAF184DB31852B7184D5CFC616D8471853CB185BCF1853695C61536C6155BE31854E71855EB1857EF1863F31858F71859FB145DFF185F8333308733768B33AE8F33C99333F29734089B342A4E8CD16E9CD172ACD1CEBCD24563734B0BB38445F0CD2BD8CF3841D33847D73849DB3847DF3849719CE123ACE12BBCE137CCE14BDCE16FECE153FCE15E0D4A3E1D4AD22D4B763D4CC64D4D665D4DDA6D4E7E7D4EB942753AFAB53BB56DD4F7173F53F3C353F2C75408CB5417CF5418D354176B7D50AB8D510F9D5113AD5173BD5243CD5247DD6113ED6127FD612E0DC83E1DC8AE2DC9463DC9A24DCA625DCAA26DCB0E7DCB7A8DCBCE9DCC0AADCCC6BDCCC2CDCD26DDCD2973F7359611DCDA594F7368D37376D773756D7DCE278DCE7B9DCEBBADCEBFBDCF27CDCF77DDD023EDD10FFDD1D20E46361E46A22E470E3E47AE4E48025E48AE6E48AA7E49468E49414AB9269AF9268B3927D5AFE4A3D8479298CB9297675E4AA36E4AD37E4B0F8E4B0B9E4B7BAE4BCFBE4C0BCE4D67DE4DD7EE4EBBFE4F2A0EC48E1EC5062EC5723EC5AA4EC6325EC6766EC6A27EC6D28EC70E9EC70AAEC756BEC74ECEC7AEDEC7A9743B200632EC83F3EC835A57B21CDBB21BDFB22BE3B22AE7B241EBB250EFB27EF3B28FF7B2A8FBB2DDFFB34A83D0F387D0FF8BD10A8FD11793D12397D1314C7F45068F45314AFD15CB3D16AB7D178BBD1775F0F45E31F463194FD18E695F4635B5FD19DE3D1A8E7D1B4EBD1C3EFD1D5F3D200F7D21BFBD250FFD25283F04C87F0578BF064464FC1CA5FC3C66FC3C93A3F0FF52BFC429647F117653FC48F4FC4C75FC4BDB5FF131E3F141E7F14C75BFC573CFC5E3DFC677EFC70FFFC800";
        }

        if (v == Background.STARRY_PURPLE) {
            return
                hex"800CE6840CDD4430334121C0CC650A032EAB0386163C0CBA617032C1C680CA6EC0DF6F00EE6F40DF67DF0329A00B46A10B43E20B41D1902CF84A70B3994242CDDA82E36AC2EF3B02E355AF0B34184C2CC66990B2E9D6C2CB0F02E0F7BF0B2C2013592113A8E21352D1904D3B944D334C7134914244D1AA84D0FAC4E69B04CE75AF1341D8444CF86531339B41365DAD84CDDDC4CD0E04CBB73C13319EFC4CBA806F19846FB6886EDC8C6DB0906D96946D7D986D889C6D7C5091B5B952C6D6358D1B566E1B52EF1B4D301B4EF11B4CF21B46F31B491A546D1A6D71B43F81B41F91B37BA1B3E1DF06CE67BE1B377F1B342023A12123DD222397A3239164238CD2988E279C8DF450923832A237CEB237B16348DDFB88DA3BC8DBD611236C32235F59D08D7CD48D6ED88D63DC8D59E08D4BE48D3BE88D3377C23493D2346BE2343FF2341E02BC8A12BB9622BB9232BAEA42BA8A52BAB131CAEA1A0AE9852A2B9DAB2BA0EC2B97ED2B9D6E2B94AF2B945844AE456532B83742B83352B7CF62B7B372B77F82B73DCE8ADB0ECAD7CF0AD64F4AD6EF8AD59FCAD4B80CF8084CF8C88CF608CCF4548533D52633D12733C8E833C62933CC2A33C12B33C0EC33BC96B8CEF1BCCEE4C0CEAD63233A8B333A87433A635339DB63397F73394B83397B9338D3A338CFB33837C33833D337B3E3377FF3373E03C00213BFD223BF6A33BF45214EFC198EFD99CEFB45093BE5D52CEF96B0EF73B4EF7F5CF3BD55844EF54C8EF44CCEF18D0EF30D4EF0ED8EEF2DCEEDAE0EEE4E4EEC7E8EEB9ECEE98F0EE84F4EE68F8EE75FCEEDB81106D851047443440EA44411929910394E94405AA44032B44002C43FFD6B90FE2BD0FDA61143F07243F019D10F97D50F736D743DFF843D57943D17A43D53B43C63C43C8BD43BCBE43B97F43B9204C41A14C44D11130FB4A64C3B674C1B942D3062B13055B53054B93047BD3046C1302DC5301E6534C05B44C03354C00364BFD774BF8B84BF6B94BF67A4BED3B4BE9FC4BE03D4BDCFE4BDCBF4BDA205451E1544FE2544B63544FE4544B5299511E9D511350A5447AB5444EC543EED5444EE544197C550FBC950ED674541B9AD9506DDD5055E1503AE5502DE95016ED501DF15000F54FF5F94FDAFD4FD94015C59625C5CA35C59521971579D71495095C55D5357147B9713FBD712DC1713F6335C4B745C4B355C44DB5D7106E170FB73A5C3B7B5C3B3C5C157D5C11FE5C0EBF5C0E60645D109191864AB645CAC645956BD91726136459746455DAD991476F8644FF9644B7A644F9DF19113F59106F990FBFD91884026C6911B1B1985B16C61995DB1727196C597A6C55DDF1B147F5B13FF9B1CCFDB22640974691549D1986747461B574661B5DD18671C745C9EF9D165FDD1E581F1984307C6918C9F198CDF1A46987C661CE9F186EDF19879D7C619F7DF172402846611DA11A46FE84663F8461A08C5CA18C61911631984DC8C693D8C621F7E31988251578651658A51728E518649E94663F9469209C4B619C73629C55D19271654A69C5C93A6718654B9C66163E71866129C6619D671866D89C66399C619D7E719882919A8692258A91BF8E9147485A455D322916552EA45C97C69186653A45C9A5E918671AA45C9DFE918682B04786B1758AB1068EB11392B11E96B12D9AB13F4EAAC51EBAC55ECAC51D6C2B157C6B165653AC55F4AC595ADAB1576FDAC595F7EB17282D00C86D0398AD0478ED0EC92D0ED4A6B43EE7B4419426D11354BB447ACB44F96BAD12DBED13F612B44B73B44FF4B44B5AE2D13F73DB451DF7ED15782EFD086EFDA8AF0008EF01692F02D96F03A4C7BC11E8BC3B29BC1BAABC3EABBC1B963AF0ED5F0BC3EF1BC41B2BC3ED9D6F106DAF0FB6F9BC419D6EF113F2F11EF6F13EFAF12DFEF13F830F68870F698B0F978F0FD0930FE1970FE29B100B9F1000A3100CA71016AB102CAF101EB31039B7101E5CFC4119847103ACB1046CF103A695C411F6C4155BE31047E71055EB1062EF10ECF3106EF710EDFB1107FF1106832EDA872F228B2F448F2F45932F60972F699B2F804E8CBE9E9CBF02ACBED2BCBF456372FE1BB2FF45F0CBF698CF2FE2D32FFFD7300BDB2FFFDF300B719CC003ACC033BCC07BCCC0E7DCC11BECC11FFCC18A0D3A0E1D3A862D3AB63D3B924D3C0E5D3C8A6D3CE67D3D114274F54AB4F5F56DD3D5573F4F7FC34F60C74F69CB4F73CF4F96D34F736B7D3E038D3E5F9D3ECFAD3F03BD3F07CD3F47DD3FD3ED402FFD405A0DB8561DB8CE2DB9463DB97E4DBA2E5DBA326DBAB27DBAE68DBB1E9DBB22ADBB92BDBB6ACDBB96DDBBC573F6F03611DBC5D94F6F04D36F22D76F0E6D7DBCC38DBC8F9DBD13ADBD53BDBD17CDBDCBDDBDA7EDBE5FFDBF420E36261E36F62E377E3E37CE4E38325E38CE6E38A27E39468E39194AB8E67AF8E5FB38E685AFE3A0D8478E8BCB8E84675E3A336E3A877E3AB38E3A8B9E3AE7AE3B1FBE3B23CE3C0FDE3C3BEE3D13FE3DA20EB4EE1EB5662EB5BA3EB5F24EB5F65EB6C26EB6F67EB73E8EB77E9EB6FAAEB7B2BEB742CEB7CEDEB7B5743AE0C632EB8573EB835A57AE27DBAE16DFAE33E3AE28E7AE34EBAE46EFAE75F3AE83F7AE8CFBAEADFFAEF183CDB287CD1A8BCD248FCD3393CD3B97CD4B4C7F35668F358D4AFCD6EB3CD7CB7CD88BBCD6F5F0F36231F35F594FCD96695F3625B5FCDB0E3CDBDE7CDCFEBCDDFEFCDECF3CE0CF7CE16FBCE46FFCF0583ECDD87ECE68BECF8464FB41E5FB39E6FB43D3A3ED1A52BFB491647ED33653FB4EF4FB52F5FB4D1B5FED4BE3ED59E7ED6375BFB5BBCFB623DFB6C3EFB77FFFB8300";
        }

        if (v == Background.STARRY_GREEN) {
            return
                hex"80039584038844300DE921C036F50A00D96B02A5D63C036561700D65C680352EC0A96F00C16F40A967DF00D4A008EEE108ECE208EAD19023A04A708E554242388A82AC7AC2C37B02AA95AF08DE984C236F69908D95D6C2359F02A8E7BF08D66010FC6112CC6210F6519043CB9443CA4C710F0D42443BBA843B3AC4AE658F10EAD84443A065310E57412901AD84388DC437A71C10DBDEFC4365806B97846CBE886B738C641690640B4A61900A718FE942463F154B18F9963463DCB863D95F018F2F118F2994C63C369518EEDB5C63B3E063AB73A18E81DF063957BE18E23F18DEA0226EE122FBE2221FE3220A24211E5298846D4E92115AA2112EB2110563484385CF210A18448416C8840267420FEB520FC7620F9B720F73820F67920F2FA20F29DF083C3F483BBF883B3FC83AB80AA5684AA4988AA158CAA1490A9F394A9C94C72A6CE82A6694A8A9A3ACA8F8B0A900B4A8D8B8A8E4BCA8586112A0A194CA462D0A456D4A44BD8A441DCA438E0A43173A2905BB28FE9E74A3F1F8A3DCFCA3D980CB1084CAEA88CAE98CCACA48532A8A632A42732A86832A3E93299EA329C6B328D6C329556B8CA26BCCA15C0CA00632327CF3326CF43266B53268F6324037323938321FF93221FA311E7B3118BC3115BD31107E310E3F310C603AE2A13AD6223AD7233AD5D214EB4998EB359CEB345093AC6552CEAFAB0EAFEB4EAD65CF3AB55844EAA2C8EA90CCEA8FD0EA67D4EA81D8EA55DCEA34E0EA15E4E9EAE8E9DAECE99AF0E9BBF4E913F8E8D8FCEB55810BE4850BE344342F46442EE12990BA24E942E86A42E62B42E2AC42D756B90B6CBD0B5C61142D27242C699D10B19D50AFE6D742B5B842B57942B2BA42A8BB42A3FC4295BD42957E42927F4285604B09A14B0C91112C174A64B03E74B03142D2BFDB12BF3B52BC7B92BE3BD2BB8C12BC6C52BB76534AE8744AE6354AE2B64ADD774ADB384AD7394ACD7A4ACD3B4AC9FC4AC43D4ABFBE4AB2FF4AAE605315215312E25310235312E4531012994C389D4C3250A530E2B530CAC5305ED530CAE530997C54C17C94C0F67453031AD94BE4DD4BF3E14BD1E54BC6E94BA1ED4B8BF14B8AF54B75F94B5CFD4B354015B19E25B1CE35B19D2196C5D9D6D405095B1755356C54B96C4BBD6C40C16C4B6335B10345B09F55B0C9B5D6C26E16C1773A5B03FB5AFD3C5AFCFD5AF8FE5AF47F5AE8A06360D0918C7D4AB631CEC6319D6BD8C736136319F463175AD98C546F86312F963103A630CDDF18C32F58C26F98C17FD8D8E4026B2511B1AC8C5B16B1F595DAC737196B19FA6B175DF1AC54F5AC4BF9ADB7FDAECD40973251549CC8C674731F7573231B5DCC7D71C731CDEF9CC67FDCDD581EC8C4307B2518C9EC8CCDEC946987B231CE9EC7DEDEC8C79D7B1F5F7DEC73402832311DA0C946FE83233F831F608B1CE18B1F51162C8C4DC8B253D8B5D9F7E2C8C824C5D864C678A4C738E4C7D49E93233F9325209B10219B71A29B1751926C674A69B1CD3A66C7D54B9B23163E6C7D6129B2319D66C7D6D89B23399B1F5D7E6C8C828D8F868EC18A8DB68E8C54485A31753228C6752EA31CD7C68C7D653A31CDA5E8C7D71AA31CDDFE8C7D82ABE386AD758AAC268EAC3292AC3896AC409AAC4B4EAAB152BAB176CAB1516C2AC5DC6AC67653AB1774AB19DADAAC5D6FDAB19DF7EAC7382CB9886CBA28ACBE38ECBF492CC0F4A6B305E7B3099426CC3254BB30E2CB30CD6BACC40BECC4B612B31033B312F4B3101AE2CC4B73DB3151F7ECC5D82EB2886EB5C8AEB8A8EEBA192EBC696EBD14C7BAF8E8BAFD29BB032ABB012BBB03163AEC0F5F0BB05F1BB09B2BB05D9D6EC26DAEC176F9BB099D6EEC32F2EC38F6EC33FAEC40FEEC4B830AB9870AF98B0B198F0B28930B4A970B6C9B0B6D9F0B8AA30B98A70BA1AB0B99AF0BB7B30BA2B70BB75CFC2EE18470BD1CB0BB8CF0BD1695C2F8F6C2FCDBE30BE3E70BF3EB0BFDEF0BF4F30C0CF70C0FFB0D03FF0C26832A34872A568B2A908F2ACA932AE9972AF99B2B104E8CAC9E9CAC6AACACD2BCAD5D6372B4ABB2B585F0CAD718CF2B6CD32B5DD72B6DDB2B5DDF2B6D719CAE2BACAE63BCAEDFCCAE8BDCAEE3ECAF8FFCAFF60D23E21D26CE2D28023D28564D28D65D295A6D2A0A7D2A414274AA2AB4AA656DD2B5573F4AD6C34AE9C74AF9CB4AFECF4AFAD34AFE6B7D2C438D2C679D2C47AD2C6BBD2D27CD2D5FDD2D63ED2DB7FD2E860D918A1D91E62DA1623DA4024DA4525DA7226DA7267DA76A8DA7AA9DA896ADA856BDA8D2CDA926DDA89973F6A35611DA92994F6A71D36A56D76A816D7DA99F8DAA879DAA43ADAA8BBDAB2BCDAB2FDDABE7EDAC67FDACA20E102E1E10A22E10E23E112E4E115A5E11E66E218A7E21628E22E14AB88A6AF8900B389135AFE23E18478914CB89BB675E27236E26CF7E27278E27CF9E276BAE27ABBE2897CE28D7DE2A07EE2A43FE2AE60E8F2E1E8F722E8FC63E8FEA4E900A5E905A6E90A27E90C5427A43854BE9105637A44B5D0E91598CFA462695E91B76EA0CB7E91E78EA18B9EA21FAEA2E3BEA363CEA3E3DEA723EEA803FEA89A0F29921F0EEE2F0F0E3F0F2A4F0F2E5F0F6531FC3DCA3C3E652BF0FC6CF0FEADF100AEF0FE97C7C402655F102DB5FC416E3C428E7C431EBC438EFC441F3C456F7C832FBC8B8FFCB7D83E38887E3958BE3A0465F8EAE6F8ECD3A3E3BB52BF8F0D647E3CA653F8F2F4F8F675F8F2DB5FE3D9E3E3DCE7E3E675BF8FC7CF900BDF905BEF90E3FF91580";
        }

        if (v == Background.NEBULA) {
            return
                hex"40A023EEB02C0D64808FB67A02A57B03037C033EFD03035F7C0A3D4020AA551A428FBA82B03AC2C22B02B035AE0A3ED7D42A956DB0A8F7C0AF01EFC2A3D804B6E844CBC44312DB92284A95AC4C0D58E12A557CC4A3DD04B536BD128F5F7C4B0A806C0D846CFB886C0D4651AA5661A8F53A86B0AAC6A3D5991A175D7C6A3D808A3D848BC0888A3D46D22C2973C8A3D61522175B7C8A3D4142AC29AFCAA3D80CA3D42F32C29860CBB373A32DB9DF0CA957BF32DB9004E85D4463A8F53ACEB0A5913AECD978EC34FCECF7403423ED215085D990A3D4E842C2A942DB95710C347BF42DBA04A3ED0A52A9554B4ADB96612C3473F4ADB90354A955D052DB98D14C346BC52DB9EFD4A954065AA5675AE9D4496A956745A3EDAD96A956F85ADB9CFD6A95818C5A42E62DB97D18A956BC623EFD62A57E62DBBF632F102DAB6E5926AA559F5A8FBF9AB03FDACFB40672DB93B9CA955FE723EFF72C0D00DEB0A4887A8F54FDE85D41F8217501A285D4FC8829BD88445F7E20A640C928F56CA485D67E9029BF9217609A8F619AF011566A3DDA685D6FF9A8F60A2F021A33EE2A30351B68A955DEA28F7FA2C2A0AAA561AB03513AAA955F6AA8F5BFEAB0A404B23ED2B2CA955AFB2DB987ECB0A401B80ED122E8FB52EBAA557CAEB6E67FBAC2904708FB656C2A55BE30A3D73DC2C2BEC303BFC2C2905B2A956FACADB9DFF2B0A41DD2A55F7F4A3D41FDAA550178A954CCE23ED6E78A9575FE23ED07FA8FB83CAA343EF23EFFF2A8D07FE8FB";
        }

        if (v == Background.STARRY_RED) {
            return
                hex"800CAD840C954430325921C0C9150A03206B037C963C0C8161703209C680C68EC0DCEF00EC6F40DCE7DF031A200B35A10B30A20B30D1902CAC4A70B2B54242C95A82E09AC2F02B02E0A5AF0B25984C2C916990B205D6C2C82F02DF27BF0B20A0134BA113A0A2133C91904CF3944CE44C7133554244CD6A84CC2AC4E50B04CC25AF1330D8444CAC653132B74135B5AD84C95DC4C9671C13245EFC4C81806F0C846FA5886EC48C6D524851B51261B51671B4B94246D2054B1B42D6346D0C5CF1B3CB01B3CF11B39194C6CD56951B359B5C6CC2E06CC373A1B2B1DF06CAD7BE1B257F1B25A0238C2123D722238023237A242372D2988DB84E923676A2367AB236116348D85B88D5DBC8D5E6112354B2235119D08D2ED48D20D88D0BDC8D0CE08CF2E48CF3E88CE477C23357D2335BE2330BF2330E02BB0A12BA7222BA7632B9F242B98A52B98D31CAE5BA0AE4C52B2B882C2B7FED2B886E2B7FEF2B79D844ADE86532B6E342B67752B67B62B61372B61782B575CE8AD5277C2B4BBD2B483E2B433F2B3CA033D2E133CD2233C72333C49214CEF898CEF94E833B42933B46A33AC15B0CEA95AE33A72F33A75848CE62CCCE5BD0CE4CD4CE206D7337FF83380393379FA3372FB336E3C33677D33613E33617F3357603BEEA13BE8A23BE19198EF789CEF635093BD2D52CEF4CB0EF34B4EF285CF3BC49844EEF8C8EEF9CCEED0D0EED1D4EEC2D8EEA9DCEE9CE0EE9DE4EE7DE8EE62ECEE4CF0EE30F4EE20F8EE21FCEEB581101A8510114444400D2990FE84E943F4D52D0FBAB10FAE5AE43E86F43E198450F78C90F6367443D2F543CD1B5D0F2871943C4BA43BE3B43B43C43B0BD43AA7E43A73F43A7604C17214C1A1111304E4A64C0CA74C09542D3019B13010B53012B93011BD3003C12FF76334BF4DA552FBAD92FAEDD2FA1E12F86E52F7875B4BD8FC4BD2FD4BCD3E4BC73F4BC4A0544021543D22543963543D245439529950E69D506850A5439AB541A2C5413AD541A2E541717C5504EC9503267454095AD9501ADD5010E15003E54FF7E94FD3ED4FD4F14FBAF54FAEF94F86FD4F784015C49E25C4D635C49D219710D9D71515095C4355357100B970F4BD70E5C170F46335C39745C39F55C1A1B5D705CE1704E73A5C0CBB5C09BC5C043D5C047E5C00FF5BFA20645B509191434AB644D6C6449D6BD91356136449F464435AD991006F8643D3964397A64399DF19068F5905CF9904EFD91954026C5811B1B1505B16C50D95DB1357196C49FA6C435DF1B100F5B0F4F9B1C6FDB24740974581549D1506747450F574541B5DD14371C744D5EF9D127FDD20581F1504307C5818C9F150CDF1606987C541CE9F143EDF15079D7C50DF7DF135402845411DA11606FE84543F8450E08C4D618C50D11631504DC8C583D8C5FDF7E315082510D8651278A51358E514349E94543F9458209C39619C7DA29C43519271274A69C4D53A6714354B9C54163E71436129C5419D671436D89C54399C50DD7E71508291AE8692488A91B98E9100485A4435322912752EA44D57C69143653A44D5A5E914371AA44D5DFE914382B01186B1808AB05C8EB06892B0E696B0E59AB0F44EAAC402BAC436CAC4016C2B10DC6B127653AC4374AC49DADAB10D6FDAC49DF7EB13582CFBA86CFE88AD0118ED02692D0324A6B413A7B4171426D06854CB43996BAD0E5BED0F4612B43973B43D34B4395AE2D0F473DB4401F7ED10D82EF7986EF868AEFBA8EEFD392EFF796F0034C7BC0468BC09A9BC096ABC0CEBBC09563AF0325F0BC13B1BC1732BC1399D6F05CDAF04E6F9BC171D6EF06879DBC39BEBC397FBC3D20C3C4A1C3C9E2C3D2E3C3DE64C3E1A5C3E866C3EED3A30FBA52BC3F4ECC3FA2DC3F4D74F1003695C40476C4041BE31011E71010EB1019EF1026F31025F71032FB1102FF105C832E9C872EC28B2EF98F2F12932F1C972F279B2F4B4EACBD8EBCBDE16372F86BB2FA25F0CBE198CF2FA1D32FAED72FBBDB2FAEDF2FBB71ACBEEBBCBF4FCCBFA3DCC00FECC047FCC0660D38821D396E2D398A3D3A764D3AA65D3B0A6D3B427D3BE54274EF8AB4F1356DD3C4973F4F28C34F1CC74F27CB4F34CF4F4CD34F346B8D3D2F9D3D93AD3D8DDF34F78F74FA2FB4FBBFF4FD3836DB9876DCB8B6DE78F6DFF936E30976E4B9B6E639F6E62A36E7DA76E7CAB6E9D56DDBA7173F6EA9611DBAC594F6EB0695DBB09B5F6ED1E36ED0E76EF9EB6EF8EF6F12F36F1CF76F27FB6F4BFF6F79838D44878D5E8B8D858F8D9E938D9D4A6E372D3A38DE752BE37FD63F8E20612E38C19D78E4BDB8E5BDF8E63719E398BAE39F7BE39F3CE3AA7DE3B0BEE3BE7FE3C4A0EB3CE1EB4322EB4823EB4BA4EB5125EB54A6EB57A7EB5768EB6154AFAD84B3AD9E5B0EB6758CBADB9676EB6E1BE3ADCB73AEB79FBEB887CEB883DEB92FEEB98BFEBA720F36AE1F335A2F33563F33924F33CE5F33C931FCD0CA3CD0B52BF3482CF34BADF3516EF34B97C3CD45635F3511B5FCD52E3CD5EE7CD5DEBCD85EFCD84F3CD9DF7CDB8FBCDE7FFCED383EC9587ECAD8BECAC464FB30D29BECC24E8FB3594AFECD5591FB39194FECF3697FB3CB8FB4339FB42DD6FED20F3ED45F7ED52FBED85FFED9D0";
        }

        if (v == Background.STARRY_BLUE) {
            return
                hex"8002608402584430094921C024750A008F6B027F563C023D617008D9C68022DEC0A0AF00BACF40A0A7DF008B6008A22108A022089D5190226B4A7089814242258A82A3FAC2BC4B02A225AF0894984C2247699088F5D6C2236F02A117BF088DA010B4A112AE2210AB119042A29442974C710A454244288A84280AC4A54B0427F5AF109D5844426B653109834126C5AD84258DC4252E0425173C1091DEFC423D806B20846C52886AF08C62F69062EB9462EA9862E09C62D350918B2952C62C158D18AD6E18AB2F18AAF018A8B118A5F218A5B318A45A5462886D718A038189D79189D3A189ADDF062607BE18963F1894A020E6A122D6A220D8E320D36420D19298833B9C833250920CAEA20C92B20C656348313B88309BC82FE61120BDB220BA99D082D3D482CAD882C1DC82B5E082ACE482A2E8829777C20A47D20A23E20A03F209D602A66212A2DE22A31E32A0E2428EDA52A08531CA3A8A0A39B52A28E3EB28E0AC28DD6D28DDAE28DAEF28D59844A34D65328CEB428CAF528C93628C67728C4F828C29CE8A2F6ECA2D3F0A2D2F4A2CAF8A2B5FCA2AC80CA3384CA3288C9FF8CC9E04853277E6327467326AE8326669326CAA323DEB323FEC3235D6B8C8E3BCC8C7C0C81A63230EDB330EA3430E6F530E3F630DD7730DAF830D8F930D57A30D1BB30CEBC30CAFD30C67E30C4FF30C2A03AAFE13AAAA23AA6633AA1D214EA8098EA989CEA665093A90552CEA48B0EA24B4EA235CF3A7C9844E9DFC8E9D1CCE999D0E9B2D4E90BD8E8D7DCE886E0E8C7E4E86EE8E84DECE39BF0E39AF4E381F8E376FCEAE5810B32850B0F44342BF6442C152990AFC4E942B76A42B26B42AFEC42AF96B90A9FBD0A9961142A032429FD9D10A41D50A246D74288F8427CB942783A4277FB42667C42663D4235FE422DFF4231E04AD6E14AD911112B564A64ACFE74ACCD42D2B21B12B18B52B17B92B0FBD2B05C12AF8C52AE86534AB7744AB2754AAFF64AAAF74AA7F84AA6794AA63A4A99BB4A93FC4A8CFD4A893E4A84BF4A7FA052E82152E26252DFE352E26452DFD2994B749D4B6450A52DD2B52D92C52D5AD52D92E52D6D7C54B56C94B3F67452CCDAD94B32DD4B18E14AFDE54AF8E94ADDED4AE7F14ABFF54AABF94A99FD4A984015AED625AF4235AED52196BAD9D6CA95095AEB55356BA0B96B89BD6B7FC16B896335ADFF45ADFB55AD91B5D6B5BE16B5673A5ACFFB5ACFBC5AC63D5AC3FE5ABF7F5ABF20632FD0918BD64AB62F42C62ED56BD8BD061362ED7462EB5AD98BA06F862E27962DFFA62E21DF18B64F58B5BF98B56FD8CCD4026AFC11B1ABE25B16AF5995DABD07196AED7A6AEB5DF1ABA0F5AB89F9AD09FDAE3B40972FC1549CBE267472F5B572F89B5DCBD671C72F41EF9CBB5FDCD1E81EBE24307AFC18C9EBE2CDEBF06987AF89CE9EBD6EDEBE279D7AF59F7DEBD040282F891DA0BF06FE82F8BF82F5A08AF4218AF591162BE24DC8AFC3D8B335F7E2BE2824BAD864BB58A4BD08E4BD649E92F8BF92FC209ADFE19B44E29AEB51926BB54A69AF413A66BD654B9AF8963E6BD66129AF899D66BD66D89AF8B99AF59D7E6BE2828CE2868E2F8A8D028E8BA0485A2EB53228BB552EA2F417C68BD6653A2F41A5E8BD671AA2F41DFE8BD682AB0F86ACB58AAB5B8EAB6492AB7496AB7F9AAB894EAAAE82BAAEB6CAAE816C2ABADC6ABB5653AAEB74AAED5ADAABAD6FDAAED5F7EABD082CAC986CAFC8ACB0F8ECB3E92CB3F4A6B2D5A7B2D6D426CB6454BB2DD2CB2E216BACB7FBECB89612B2DFF3B2E274B2DFDAE2CB8973DB2E81F7ECBAD82EA8686EA998AEABF8EEADD92EAF896EAFD4C7BAC3E8BACFA9BACCEABAD22BBACCD63AEB3F5F0BAD5B1BAD6F2BAD599D6EB5BDAEB566F9BAD6DD6EEB64F2EB74F6EB88FAEB7FFEEB898309FE870A138B0A418F0A86930A9E970A9F9B0AC89F0ABFA30AC9A70ADDAB0AF7AF0AE8B30AFCB70AE85CFC2C158470AFDCB0B05CF0AFD695C2C3F6C2C61BE30B0FE70B18EB0B21EF0B3EF30B33F70B3FFB0C6CFF0B5B8328868729988B29D18F29E09329FF972A139B2A334E8CA93E9CA9FEACA99ABCAA1D6372A9EBB2AAA5F0CAA658CF2A9FD32ABED72AC8DB2ABEDF2AC8719CAAFFACAB27BCABA3CCABF3DCAC17ECAC3FFCAC860D0E0A1D0EA22D206A3D231E4D23FE5D26626D270A7D274542749DFAB49F156DD27C973F4A23C349FFC74A13CB4A24CF4A48D34A246B7D28CF8D29079D2997AD29FFBD2A03CD2A1FDD2AABED2B23FD2B760D8CCE1D8D1A2D8D5A3D8DD64D8E425D8E9E6DA0867DA1368DA1BA9DA19EADA31EBDA21ACDA2DEDDA38D73F68FF611DA44994F68F7D36998D7690B6D7DA6CB8DA6AF9DA747ADA77FBDA783CDA84BDDA84FEDA907FDAA1A0E0BD61E0BFA2E0C4E3E0C924E0CAE5E0D1A6E0D327E0D5A8E0D894AB836CAF8375B383815AFE0E098478390CB839A675E0E9F6E0EA37E20878E0EDB9E2137AE21BBBE219FCE23FFDE242FEE2747FE27FA0E8A8A1E8AD62E8B2A3E8B4E4E8BAA5E8BDA6E8BFA7E8C2A8E8C4E9E8C62AE8C66BE8C8ECE8C92DE8CA9743A32B632E8CCF3E8CE9A57A33BDBA345DFA346E3A34CE7A355EBA362EFA376F3A382F7A3A7FBA81AFFA8E383C9AA87C2888BC2918FC29793C2A297C2AC4C7F0AD68F0B054AFC2CAB3C2D3B7C2E0BBC2DF5F0F0B831F0BA994FC2EB695F0BD5B5FC2F6E3C2FEE7C30AEBC313EFC319F3C32BF7C345FBC362FFCAF683E25887E2608BE26B464F89D65F89FE6F8A013A3E28852BF8A45647E297653F8A8B4F8AB35F8AADB5FE2ACE3E2B5E7E2C175BF8B2BCF8B83DF8BDBEF8C4FFF8CAC0";
        }

        if (v == Background.SUNSET) {
            return
                hex"800DAD840D94880D7A8C0D6C900D61940D58980D579C0D4A509034E952C0D30B00D2FB40D225CF034858540D196D703461C640D0675C033D5EFC0CF4802E08842DDD882DCD8C2DAC902DA1942D87982D939C2D79A02D60A42D5FA82D54AC2D53B02D55B42D495CF0B5218442D306530B4BDA542D216D70AFFF80B461CE82BFFEC2D1879F0B45E0139CE11393E2138CA31389A41385251381A61376E7137AE8137329136F2A13682B1367EC136456B84D92BC4D86611135A994C4D6BD04D476B61351B7134E7812FFDCE84D2FEC4D21F04D2FF44D187DF1348601BC050886BFF8C6E974861AFFE71B9394246E43A86E2556C1B84ED1B81573C6DEAC06DDAC46DBB6531B6A1A546DA96D71B64781B619CE86D69EC6D6BF06D53F46D46F86D47FC6D39808F8B848F71888F538C8BFF908F16948F0D988EFF9C8ED8A08ED9A48ED7A88EB7AC8E9FB08E96B48E94B88E71BC8E72C08E65C48E64C88E4D6742388F523891B5C8E04E08DD9E48DDAE88DBB77C236A3D236ABE23647F2364A02C0AE12BFF622BFBA32BF2E42BECA52BE9262BE2A72BDFA82BDC292BD46A2BD42B2BD02C2BC82D2BD06E2BC7EF2BBF5844AEFEC8AED4CCAED5D0AEB6D4AE9ED8AE93DCAE88E0AE70E4AE6475B2AFFFC2B8C5EF8ABFFFCADF080D13D84D11D88D1058CD06C90D05394D04598D0389CD01BA0D015A4D009A8CFEDACCFDFB0CFD65AE33F2AF33EFF033DF18C8CF6FCCCF66D0CF5BD4CF3FD8CF2DDCCF1FE0CF15E4CEFCE8CEEFECCED6F0CBFFF4CE9FF8CE95FCCE8080F1FB84F1CA88F1978CF18390F17194F17098F1649CF13BA0F11CA4F11BA8F111ACF104B0F0F7B4F06B5CF3C14B03C0DF13C0A723C05333BFEB43BFEF53BFB363BF5B73BF2B83BEFF93BE57A3BDF7B3BD9FC3BD77D3BD0BE3BCDBF3BCBA044A2614498D10D124B9112399512389912169D11FAA111F9A511DFA911BBAD11AFB111A1B51182B91181BD116F611445532444AD9D11103D510F7D910EADD106BE11052E51051E9102AED1008F10FFCF50FE0F90FD7FD0FD88132D08532CD8932A08D329F91329E9532949932879D3272A13262A5325554B4C91AC4C8D2D4C8DEE4C8D6F4C85304C81B14C77B24C72734C721A5531AFD931A1DD3196E13164E53155E9313BED313AF1311BF53112F930EBFD306C8153408552FC8952FB8D52FA9152E79552CF9952BB9D52BAA152B0A552BAA952B8AD52AEB15291B5529CB95290BD5286611549CF2549D19D15256D5524AD95249DD5236E15237E55215E951FAED51E0F151BCF551B0F95197FD518481737E4225CDC235CD8A45CD0255CCFE65CCA275CCF685CC9A95CC9EA5CBE6B5CB9963572F8B972CC5F15CB2D94D72B9D172B1D572AFD9729EDD729DE1729373A5CA4BB5CA23C5C9D7D5C9DBE5C95FF5C932064ECA164E9A264E52364E42464E3A564DFA664DC6764DC2864D914A99363AD9351B193505AE64D86F64D3F064CF98C9933CCD933BD193256B664BE5BE192E8E592CEE992E977C64B3DEF992BCFD92B281B3D185B3D089B3C28DB3B691B3B54A66CECD3A1B3A752C6CE4AD6CE3AE6CDF57C5B37CC9B371CDB36FD1B3646B66CD8F76CD9386CD4F96CD8BA6CD4BB6CD03C6CD41EF9B341FDB34381D3EA85D3FF89D3E78DD3E691D3D54A674F4E774F45425D3D0A9D3B656C74ED6D74EA173DD3B4C1D3B3C5D3B4C9D3B167474E9B574E9F674E9B774E97874E47974E4FA74E47B74E4FC74E5BD74DFFE74E4FF74E0607D091089F4038DF41091F40295F4004C77CFA9425F3FFA9F3FDADF3E7B1F3E55AF7CF5707CF9317CF5B27CF5337CF55A61F3D273A7CF03B7CF13C7CF03D7CF07E7CF0FF7CF160850DE1850E628509D19214354A68509A78509688508D4AA141156E8500D7CE140FD21401D61400DA13EA6FB84FA7C84FAFD84FA3E84FAFF84FFA08D14E18D19228D195192345296343C9A343B9E3450A2344DA6344FAA343856E8D0D97C23428C63434CA3435CE34346958D0D5B5E3434E2342673A8D095DF234237BF8D09209520A1951622951A519654809A54679E5466A25457A65465AA5456AE5465B25456B65465BA54555F1951532951559D65452DA543CDE543AE2545273C950EBD9513BE95147F9514209D22D08A74888E749B92748596749C9A749A9E7483A27486A67484AA7487AE746CB27483B67484BA7481BE74806129D1AF39D20349D1AB59D19F69D1ADBE27468E67467EA7480EE746679D9D1A3E9D203F9D1A20A5F8A1A529A2A5F663A528E4A5F6A5A5F8E6A5F6E7A52928A5F5D4AA97DC56EA5286FA528B0A52831A527B2A52273A527F4A52775A52836A522B7A527B8A5269CEA949CEE948AF2949E7BEA5277FA522A0ADFC61ADFCA2ADFCE3ADFAE4ADFD25ADFD66ADF9A7ADFD9426B7EDAAB7E7AEB7EEB2B7E75AEAD29EFADFF30AD29F1ADFBF2ADFBB3AD2974ADFA5ADAB4A5DEB7D7E2B7E8E6B7D7EAB7E4EEB7DB79DADF7DF7EB7E082D46D86D8078AD8058ED80E92D80696D8189AD8119ED80AA2D80BA6D7FE54BB6006CB604D6BAD802BED803C2D7FFC6D7F9CAD7FFCED800D2D7FFD6D800DAD7ECDED800E2D7FA73DB5FEDF7ED80482F40486F43D8AF48C8EF4A892F81596F81D4C7BE0368BE0AA9BE05AABE05EBBE03D636F810BAF808BEF821C2F809C6F812CAF811CEF812695BE0676BE045BE6F812EAF822EEF81AF2F813F6F81BFAF80CFEF8148313848713B78B13EE8F141393143E97146E9B148E9F148DA314AA52AC608EBC60A6CC60BEDC6056EC60C2FC60D70C60931C60C72C60EF3C60934C607B5C607F6C60837C607F8C607B9C6097AC6083BC60AFCC609BDC609FEC60DFFC60CA0CCAFA1CCCAA2CCDCE3CCE6A4CCEE25CCF1A6CCF5E7CD01A8CD0169CD052ACD04ABCD0FECCD1C2DCD16AECD23D7C33459C7346FCB346ECF346FD334ADD734ACDB348FDF348EE334ABE734A9EB3823EF382FF33834F7383DFB3836FF383C83526687528B8B52A48F52F09353009753469B53579F5374A35385A75374AB539CAF53B9B353ABB753B9BB53C7BF53C8C353B9C753C6CB53D8CF53DBD353D9D753F0DB53DADF53EFE35406E75415EB5429EF5440F35441F75471FB54AEFF583A8371E787720C8B72298F724E93727B97728A4C7DCA9E8DCB029DCB6EADCBC2BDCBBECDCBFEDDCBC573F732FC3732DC77347CB732BCF732ED37348D77345DB7366DF7367E37374E77386EB739DEF73ADF373BAF773C7FB7407FF744283916887918B8B91B18F91D19391E94A6E486A7E48FE8E48F94AB925DAF924EB39266B7927A5CFE499F0E4A331E4A372E4A333E4A574E4A2F5E4A576E4A59BE392B3E792C1EB92DCEF92EFF3932FF79357FB9387FF93BA83B11687B1308BB14B8FB15B93B17697B19C9BB1A69FB1B2A3B1C1A7B1C0ABB1C1AFB1C0B3B1D1B7B1D25CFEC7530EC7A58CBB1FFCFB20AD3B20FD7B20BDBB20CDFB20EE3B21AE7B227EBB240EFB27CF3B28DF7B2A6FBB2DCFFB30183D06F87D0FE8BD1098FD11593D11497D12F9BD1409FD132A3D14AA7D15AABD14BAFD15AB3D169B7D176BBD167BFD176C3D177C7D176653F46334F462B5F4625B5FD19CE3D1A7E7D1B2EBD1B3EFD1C2F3D1EAF7D20CFBD24FFFD27D83F03F87F04D8BF0588FF06593F07097F0719BF0F14E8FC3F94AFF109B3F10B5AEFC456FFC42F0FC4558CFF121D3F140D7F120DBF12FDFF140719FC52BAFC537BFC56BCFC5DFDFC673EFC6CFFFC7FC0";
        }

        if (v == Background.MORNING) {
            return
                hex"8001F18401E08801CC8C01C59001BD9401B69801B59C01AE5090069952C01A0B0019FB401985CF0065D85401876D700619C64017B75C005E1EFC017780221C8422048821F88C21EA9021DF9421D69821D59C21CBA021BCA421BB54B086D2C086D6D086B573C21AC61308681A5421976D708437808619CE8210DEC218679F0861601095A1108F22108B231089E41086E51084A61080E71080A8107DE9107C2A1077AB10776C1074D6B841D4BC41CA611106E594C41BAD041AB6B6106AB710697810435CE841A0EC4197F041A0F441867DF1065E018AC9088610D8C626A486184367188ED4246234A8622656C1886AD1884573C6201C061F6C461EF6531879DA5461E86D71874F818729CE861B9EC61BAF061B4F461AAF861ABFC61A58083218483118882F48C810D9082C09482B19882A99C828F50920A42A20A1EB209CD6348269B8824FBC8250C08246C48245C8823367420893520895B5C8210E081F5E481F6E881EF77C2079FD207A7E2074FF20752028E5E128DA2228D82328D06428CC2528CA6628C5A728C42828C1E928B9EA28BA2B28B6AC28B22D28B72E28AFAF28A9D844A2A8C8A28DCCA28ED0A27ED4A272D8A267DCA25DE0A24EE4A24575B28437C288ADEF8A10DFCA20C80C3F384C3DE88C3D08CC3BE90C3AC94C3A498C3969CC37EA0C371A4C367A8C354ACC34AB0C3405AE30CE6F30CBF030C3D8C8C306CCC2FDD0C2F2D4C2DAD8C2C7DCC2BEE0C2BFE4C2A7E8C29FECC28FF0C10DF4C273F8C268FCC25580E46584E44E88E42A8CE4194853903A639016738FA9424E3DAA8E3CEACE3CDB0E3C5B4E3B55CF38E8F038E2F138DF3238DCB338D77438D7B538D4F638D03738CE7838CBF938C83A38C3FB38BF7C38BCFD38B6FE38B77F38B460413A614132910D04B191048E95048599047A9D0459A10458A5044DA90439AD0432B104295AE41036F4101184503F2C903DD67440F33540F17640EF7740ED7840E8F940E8BA40E33B40D9BC40D7FD40D2BE40D03F40D2E0494E21494D910D25039124F59524E89924D39D24C6A124B6A524B054B49232C4920AD49216E49212F491BF04919314913324911334910DA552432D92429DD2418E12405E523FDE923EAED23E9F123DAF523CFF923C6FD23BE8146048545718945638D456491454D9545379945279D4514A1451552A51452B51406C5139ED513CEE5139AF5134984544C5C944C7674512BDAD9448DDD4483E14485E5446EE94459ED445AF14445F5443AF9442AFD441A816645422598C235986D21566049965ED9D65ECA1656FA56570A9656256D59532E594D57C565266535944F45945B55940B6593D77593D1C6964E7ED64D4F164C8F564C9F964B7FD64B28186698586688986534646194A56191531D8630A1861D52A61872B61842C618456B98610BD8603C185EB632617AB3617A74615B9AD985626F86153B9614D7A6153DDF185377BE614A3F6145E069A02169A362699FE3699524699A9299A67D4E8699A14B1A666B5A652B9A6445F16990F2698C33698BF469875AD9A61CDDA61DE1A611E5A61BE9A612EDA604F1A6117BE69817F6981A0719BE171A0E2719BA371A0A471A05299C66C9DC68050971A36A719515B1C66AB5C6695CF719FB0719F71719FB2719F59D9C668DDC67CE1C667E5C653E9C66777C7194FD7191BE7194FF718C6079961089E6578DE67191E67095E6844C7799BD425E683A9E68FADE66EB1E68E5B079A058C9E66DCDE681698799B1CF5E66BF9E655FDE6478206498606328A0648464819CD29A06589E0672A2068752A81A195BA06575F081A43181A17281A43381A174819C3581A11B6E066F79E8195BF819BE08988108A264C4648992E5898CE68996E7899728899D698996EA899695BA26745F089967189A232899CF389A21A5626736D789A23889961CEA267277C89A1DEFE26588246088646078A4621465918DE6918DA7919368918D6991932A918D6B91932C918D6D9193174A46346759192F6918CF79192B89192DCF2464AF6465BFA464BFE465C826550422997BE39985249982259985269988D3A26622A66638AA6622AE6621B266225AE998E17CE6637D26621D66636DA66376F9998DBA998DFB99935E766636FA6637FE663682852A86853B8A85668E85739286099685F04C7A182542A861656EA18557C28624C68639CA8614CE8615D28623D68624DA8614DE8639E2862373BA1853CA18E5EFA8623FE861482A4D886A4F88AA52B8EA53C485A95466A959E7A95D5426A5F1AAA574AEA5F158EA95D2FA95D70A95D31A982F2A97C73A95CF4A97C1ADAA573DEA616E2A5F0E6A616EAA60AEEA60979DA9829F7EA61782C47C86C4928AC4D98EC4EC92C50696C51C9AC5069EC51BA2C52C52BB14F6CB14F96BAC552BEC568C2C552C6C551CAC552CEC568D2C552D6C568DAC575DEC568E2C551E6C5F2EAC57577DB17C9F7EC83382E42C86E4508AE4728EE49192E49396E4B34C7B936A8B932E9B93E6AB93B2BB941D636E51CBAE506BEE507C2E506C6E52D653B9419A56E51C6D7B9419C6EE52DF2E554F6E859FAE553FEE8348303E08704008B04228F042D93044797045C9B045D9F046BA3047D52AC11FABC1222CC1252DC124D73F0494C304BCC704BDCB0495CF04BCD304BBD704DBDB04EDDF04DBE304BBE704DBEB04DAEF04EDF304FAF70508FB0509FF052E8323858723B08B23D38F23E19323ED9723F69B24104E8C908E9C9092AC90D6BC90F6CC9126DC90FAEC91497C32448C72451CB245CCF2451D3245ED7246CDB2452DF245DE32474E72473EB247EEF247FF32489F72496FB24EEFF24DC83433C87434E8B436D8F43879343929743B29B43C19F43D4A343D5A743D4AB43D6AF43EDB343E2B743EDBB43F7BF43EEC343EDC743F6CB4407674D10075D1045B5F4408E34423E74413EB4425EF4436F3443EF7444AFB445FFF44758362EC8762F88B630C8F632693633D97634E4C7D8D5E8D8DDE9D8E1AAD8E1EBD8E46CD8E7ADD8E1D73F639FC363A9C763AACB63B1CF63A9D363AAD763B9DB63C2DF63BAE363D4E763C8EB63D6EF63E3F363E4F763F7FB6412FF642E83829A8782A38B82CC8F82D59382E14A6E0C2E7E0C728E0C954AB832CAF8326B3833CB7833D5CFE0CD30E0D1F1E0CFB2E0D1F3E0D3F4E0D39ADB834F6F8E0D939E0DBBAE0DE3BE0E47CE0E7FDE0F07EE0F27FE0F920E89661E89B62E8A0A3E8A264E8A6E5E8ABE6E8ADA7E8B128E8B369E8B52AE8B36BE8B51637A2D55D0E8B858CBA2EDCFA300D3A2EE6B6E8BE37E8C078E8C2F9E8C6FAE8C57BE8CD7CE8CFBDE8D5FEE8DE3FE8E4E0F08DE1F08FE2F09223F094E4F09665F098E6F09BA7F09928F0A0A9F0A0EAF0A0ABF0A0ECF0A2ADF0A6EEF0A6AFF0A6F0F0A4B1F0A6D94FC29CD3C2A3D7C2AE6D7F0ABF8F0ADF9F0B13AF0B17BF0B3BCF0B8BDF0BE3EF0C77FF0CDA0F88361F88522F887E3F88A24F88BE5F88DE6F88E13A3E23F52BF8922CF89256BBE253BFE249C3E253633F896B4F89BB5F898B6F898F7F89B9C67E277EBE278EFE283F3E292F7E2AFFBE2C5FFE2ED";
        }

        if (v == Background.INDIGO) {
            return
                hex"41F0235507C28D541F1235507C68D541F226BD07CA9AF41F326BD07CE9AF41F426BD07D2A0641F5281907D6A0641F6281907DAA0641F7281907DEA5F41F8297D07E2A5F41F9297D07E6A5F41FA2AD907EAAB641FB2AD907EEAB641FC2AD907F2AB641FD2BD507F6AF541FE2BD507FAAF541FF2BD507FEAF5";
        }

        if (v == Background.CITY__PURPLE) {
            return
                hex"8000068400078800088C000990000A4A60003270003942C000FB000105B10004594C0010D000116B70003DC64000E75B00031E74000BF80009FC000880200884200988200B8C200C90200D4A60803E7080428080454A82012AC201358D08052E080557C02014C4201565308051A542013D83192DC2012E0319273A08041DF0200FF4200EF8200BFC200A804022844808884B4C4641464A51202261004A7100528100569110D2A12D32B110D2C12D32D110D17404019C4401AC840196741006351005F61005B71464B810057910053A1004DDF04011F44010F8400FFC400D8060228462BB8868084641C64A51A02131C6018A0601AA461CEA86808AC61CEB06808B461CE5D21807B3180774180735180CB61AD3371C64B81AD3391808BA18063B1805FC18055EF86B4CFC60228080228482BB8891928C88089091929482BB98801B4E82007A92008AA2202AB2202EC22042D2008AE220417C4881BC88811674220435200C9B608B4CE48022E8801BEC801AF080187BE2464BF2008A02808A128AED10CB19290A80894A2BB98A80A4E928089538A0545F02A11312A13B22A11332A10DA54A1CED8A434DCA808E0A43473A2873BB2A027C2807BD2C64BE2AD33F2808A03008A132D31110D19294CB4C98C82B9CC022A0C808A4C022A8C054ACC220B0C054B4C808B8C054BCC8D9C0C8AAC4C8D1C8C8A9CCC892D0C1CED4C4346D8320239310D3A3073BB3206FC32043D3464BE32D33F3008A038089094E80898E8709CE022A0E808A4E022A8E054ACE22058E381517C8E005CCE98F6953873B6390D373A0238390D1CE8E1CEECE844F0E82B7BE3C64BF3808A04008A140AED1111192950B4C9908F94E94008AA401515B500225D440017540089B5D00327194008BA42367B4224BC421C1EF90B4CFD002281202242248AED19128089522BB9929E29D2022A12179A52022A9205457548015B6D2054F120227BE4C64BF4808A05008A150AED1115192954B4C994A739D4022A14179A54022A940545755001765008B752ABF85015395048FA50153B52023C5008BD5464BE52D33F5008A05808A15AD311117192956B4C996AF24E8580894D960056F85815395848FA58153B5A023C5808BD5AD33E5C64BF5808A0600890958808998B814E8600894D580056DB60153C60089EF99192FD802281A02285AB4C89B1928DA80891B19295AB4C99AC1F4E8680894DDA005E1A054E5A220E9A054EDA220F1A0227BE6AD33F6808A07008A172D3227464A37202247464A572D326732753A1C02253770017870153970883A70153B70883C70089EF9C808FDC02281E02285EB4C89F1928DE2BB91F19295E05499E0054E8780894D9E0056FB78153C78089EF9E808FDE022820022425801526800153A2002253680015BEE0054F20022F60F6EFA0DCAFE00228220228621CE8A28088E21CE4858815131E2005A2202253688015BEE2054F220227BE88153F8808A09008909640544C7900168900894DA40056FB90153C9008BD93DBBE9372BF9008A09808A19873A29A02119261CE9660544C7980168980894DA60056FB98153C98089EFA6054FE6022828022425A015131E8005A28022537A0015C6E8054F28022F68F6EFA8DCAFE802282A02286A1CE8AA8088EA1CE92A42196A0544C7A80168A80894DEA00571BA8153CA8089EFAA054FEA02282C022425B01526B3E427B00168B00894DEC005E2C054E6CDD8EAC054EEC220F2C022F6CF6EFACDCAFEC02282E02286E1CE8AE8088EE1CE92E42196E1CE9AEF6D9EE005A2E022537B80178B81539BB673AB8151DF2E0227BEB8153FB808901700229B0F584E8C00894DF0005719C0153AC0089DF700547DFC008A0C808A1CA0222C90D23CA0224C90D25CA0226CBC2D3A32022537C80178C81539C8883AC808BBC8153CCC64BDC8153EC808BFCAD320D008908F48089344349748084D7D0015C674054EB4022EF4054F35192F74054FB4022FF4B4C8360228768088B64348F68089364344B8D80179D8153AD8089DF760547DFD808901380224B8E0015CEF8054F38F6EF78054FB8022FF8B4C83A02287A1CE8BA808464E87392E7A00575BE8153CEBDBBDE8153EE808BFEAD320F0089093C0544B9F0015D77C0547DFF008A0F808A1F873A2FA0223F80164F81512E7E00575BF8153CF808BDF8153EF808BFFAD30";
        }

        if (v == Background.CONTROL_ROOM) {
            return
                hex"8008FE8408A48800A08C004F9008CC9409B09809CE9C0B95A00BDE52A02FEEB03022C02FAED02BBAE02716F0275700279B1026F7202D8B302E57402E17502D8F602D4B702C7B802887902277A02417B02257C02037D0265FE0241BF026EA00A1EE1088C220851630822A4084925084AA60AB1A70B66A80B7EA90B8B2A0B8E6B0B8B2C0B7EAD0B1EAE0AB16F0A38700A33F10AACF20B63330B70F40B6D350B60760B53F70B44780AE1390A6BBA083C7B083FFC081D3D0A247E08827F0A636010A2E110B8E21074231036E4102F251298A612DE671395A813AFA913C1EA13C42B13BDAC13A42D1349AE12E0EF12CEB012C93112EFB2139B3313AFB413A9F513A1B6139877137EB8131239128C3A126A7B1027BC102CFD10A2FE10AE3F1096E018B5A1195B22188BE3184224185BA51A3DA61AF8271BA1A81C6D691BCF6A1BD8AB1BC96C1C6D6D1B56EE1AF76F1AA9701AADF11B0B721BB2731C6D741BC6B51BC4361BBA371C6D781B32F91AAA3A184B3B18513C18383D18B5BE19587F18AC20209EA120B5E22074632037E420332522A76622F7E7239B6823B7E923C96A23CF2B23C1EC23A66D2349AE22E52F22CAF022D47122F77223A3F323BDB423C23523BDB623BA3723A3F823333922AD3A2273FB2028FC20303D20A7BE20B5BF209E602A15E12852A2284FE32A0AA42A1AE52A82262AED272B38282B4FA92B62EA2B5CEB2B4DEC2B3AAD2B24EE2AD86F2A88302A94712B05722B2A332B42342B49F52B44362B40372B28F82B0BB92AD1BA2AA93B2A71FC2840FD284FBE2854FF284C20336561334CA23321A3328FA43223253264E632E1A7343A283238A93443EA3226AB343DAC30576D3410AE32C96F3262303264B132CEF233AAF333B17433AE353374B6335CB7333FF8335339333EBA333A3B33363C33027D32F4FE32F07F3302603C1AA13CD7A23B77A33ABD243A2B653A2F263AB6A73842E83A3CE93A376A3A302B3A27AC3A1A6D383BAE3AAD6F3A43F03A62B13AAD72387B33387F34390735390EF63919B738BFF838C6B938BDFA38AE7B3911BC390CFD39083E38FFFF38FB20450B614506A243C7A342DBE44234A5421D2642A32743EB284205A943EE6A43EAD5B100D0B50026B90A60BD08E9C108E8C50A6FC901C0CD03F4D1041FD50468D90334DD0384E1039CE5039DE904F6ED04BAF10487F5044FF90420FD01DA8134798531AD892F598D2BC99128F0952868992A619D20C8A12020A52F91A9202156C4808ED48092E4A9497C128DCC52A53C92A45CD29F7D12433D5232DD9239DDD23B1E123B8E5251975B49417C49413D4935FE48B3FF4890A0547721546E2253CB2352FDE4524225521A265294A753E468500854B54024B94A525F05237315294F2528EF35275F45049B550767650EAB750EE7851469CF14519F543AAF94379FD42E48171F585747A896F4F8D6C07916908956868996A524E85830D4B560245D05A94B15A94F25A8EF35A76345846B55878F658EC9BED651A79D58EE7E58EABF58D620652561651E2263D3E3630024624365621A266294A763E468605B14B580245D0629498C98A53CD89FAD180F6D58180D98240DD8519E1851A73A614ABB60F4BC60F01EF983B9FD84F781B49685B47889AFAF8DAC1391A90D95A85F99AA524E8685B14B5A0245D16A94B26A94F36A8AB46A6835684B76686FF7694138694679694A9D71A3D2F5A3C1F9A51AFDA3A981D49485D1F489CFBC8DCC1291C90D95C86899CA524E8705B14B5C0245D27294B37294F47284357265F6704C37712EB871417970F49D71C3D3F5C52AF9C3C0FDC3A981F22285F1F489EFBC8DEC1391E99095E8FC99EA524ED7809174DEA52D1EA53D5EA10D9E8FEDDE469E1E350E5E3B975B78F4FC794ABD78F4BE78EE7F78E4A08488A1847D6283CAE3830024824225824293520A52D60A3ADA0A10DE08CDE202E4E6038775B814ABC80F4BD80F03E80EA7F8135E08C7D218D1EE28BBEE38AF2248A42258A4293562A52DA2A3ADE29FAE2280EE622EFEA24EB77C88EA7D88E7FE8935FF891C209506E1950BA293AAA392E6E49234E5924293564A52DA4A53DE4A3CE241EDE64433EA42BAEE42F9F2431EF64490FA446AFE4242826EB4866E818A6E0B8E6B1D92689C9668EA4D69A94B79A94F898707998FD7A9883FB9B11BC9AD53D9AD1FE9B0EFF9B2860A2E9A1A2D3A2A2B523A2A0E4A235A5A232E6A294D3E28A52E68A3BEA8A10EE89C1F28890F68114FA811EFE810082A99586A0DD8AA0DC8EA07C92A81F96A8969AAA3A4F8AA94B9AA94FAAA283BAA07BCA8233DA844FEA84D3FA84260B05521B062A2B06023B03064B02865B21AA6B21067B294D462CA52E6C84AEAC883EEC08BF2C0AFF6C189FAC1D0FEC18982E26F86E5258AE1D18EE0E792E14696E0F29AE8419EEC01517BA94B8BB0079BA12BAB8387BB8477CB82D3DB8A2FEB9497FB8A2E0C092A1C0A762C06263C031A4C02925C21AA6C21067C2FB145F0A52E30A5EE7084AEB0896EF007DF3009DF70241FB0265FF024183298D87220E8B21358F208693210A9720E19B283F4E8CB0054DF2A52E32C01E72849EB20CEEF20EAF32067F729DDFB28EEFF29DD83487A8748198B40878F40509348779748C59B48494F8D294B9D2127AD237BBD22D7CD0117DD2267ED219BFD22660DAEA61DAE1E2DA83E3DA09E4D833E5D83093676A52EB68DCEF60C7F36840F76BA8FB6BA9FF6BA8401E212A2E21323E212A4E21252EF884879EE212BFE21260EAB921EA7A22EAB4E3EA7A1273AAE3F7A9F0FBAAE3FFA9F083C9F087CAE38BC9F0466F2B8D3E3CA5273BF2B8FCF27C3DF2B8FEF27C3FF2B8E0FAB8E1FA7C1117EAE34D9FA94BAFA373BFA94BCFAB8FDFA7C3EFAB8FFFA7C0";
        }

        return BackgroundSprites2.getSprite(v);
    }
}

library BackgroundSprites2 {
    function getSprite(Background v) external pure returns (bytes memory) {
        if (v == Background.LAB) {
            return
                hex"800E7B422002B51A80E7BAC00AD58D039EEE02EAEF03E0F00298F1030F720298F3030F740298F5030F760298F703E0F802EAF9039EFA002B5DFC0E7B802E7B422085091942E7B4C90B91EA082B55B42E7BB82BABBC2F83C02A85C42BABC82A85CC2BABD02A85D42BABD82A85DC2F83E02BABE42E7BE820ADEC2E7BF022DEF427547DF0B9ED01040AD944E7B984E474E8148929102B6A1391D5B44E7BB84BABBC4F83C04C3DC44F83C84C3DCC4F83D04C3DD44F83D84C3DDC4F83E04BABE44E7BE840ADEC4E7BF040ADF442DE7DF139ED00C61429060AD946E7B986E474E8182B691D58EA1B91D5B46E7BB868E05F71AEAF81A38391B9EFA182B5DFC6E7B403202B642050929880AD4E924892A2391D5B88E7B5F722381C688E7BEC80AD79F239ED00CA75490A0AD94AE7B98AE474E92D58EA2B91EB2B9ED674AB3C7DF2B9EE030A921312F110CC2A490C75494CE7B98CE474E934892A3391EB339EEC32CF2D33CC6E3558D7F0CF31F4CB3CF8CE7BFCC0AD40338A92439D5253B9EE63B91D3A4F563A8EE47ACEE7BB0EB3C5B23B9ED9DCE691E0F56373B39A47C3BCC7D3ACF3E3B9EFF382B60412F108D02A4910754950E7B990E474E94558EA4391EB439EEC402B56C10E7B63241A459D10E7B6B641A4774558F841A4794558DD6D0691F10F31F50B3CF900ADFD0E7B40248A923492F2449D5254B9EE64B91D3A53563A92E475714B9ED9552691D935636F849A4794D58DD6D2691F13563F52B3C7DF4B9ED00D42A4914754954E7B994E474E854892953E0D5554E7B6D851A4795558FA51A47B5558FC53CC7D52CF3E539EFF502B6058A921592F110D62A4916754956E7B996E479D7563A17224A56F835555B9EDB656691E97563ED6691F16F31F56B3CF960ADFD6E7B40360A92461D525639EE66391D3A19224536639EDBF18F31F58B3C7DF639ED009A2A48DA4BC91A7544A66B9EE76BE0D461AE7BE5AAA075D6ACF1F7DAE7B81C4BC42370A92471D512FDCE7B40378A92479D512E9EE7B77E782B7F7B9ED00A02A48E04BC9207544BB839EFC81B2FD83697E802B7F839ED00E22A49227544BB8B9EFC89B2FD8B697E882B7F8B9EE090A921912F110E42A49247544BB939EDE7A40ADFE4E7B40398A92499D512EE6E7BF260AD7BF9B9EE0A12F108E82A49287544BAA39EDDFE8B26401A8A922A92F23A8A924A9D512E6AE7B75FA82B500EC75492C0AD4B8B39EF9B02B5D7ACE7BFEC0AD403B82B64B85092E2EE7BE6E0AD75BBB9EFCB82B5EFAEE7BFEE0AD403C050A4C02B52DF0B26719C02B5D6F0B26F300AD7BEC2C9BFC02B501320AD4B8CA6339C82B5D6F298CF320AD7BECA633FC82B60D2C9A1D02B512F4B26595D39EDB734B26F740AD7DFD2C9A0DAC9A1D82B51276B26AB6E7B56DDAC9975F6E7B71DDAC99F7F60AD83898C8780AD444E26312A78B2654BE26316638B2673FE26320E82B50ABAB26578EB9EDCFFAB26408F2C994E3CE7B73FF2C9901BEB264FAFB9EDDFFEB26";
        }

        if (v == Background.GREEN) {
            return
                hex"41F004C507C213141F104C507C613141F207D107CA1F441F307D107CE1F441F407D107D22F141F50BC507D62F141F60BC507DA2F141F70BC507DE3E841F80FA107E23E841F90FA107E63E841FA144907EA51241FB144907EE51241FC144907F251241FD1B3907F66CE41FE1B3907FA6CE41FF1B3907FE6CE";
        }

        if (v == Background.ORANGE) {
            return
                hex"41F030D907C2C3641F130D907C6C3641F236BD07CADAF41F336BD07CEDAF41F436BD07D2F4341F53D0D07D6F4341F63D0D07DAF4341F73D0D07DF13C41F844F107E313C41F944F107E713C41FA4B2507EB2C941FB4B2507EF2C941FC4B2507F32C941FD5A9907F76A641FE5A9907FB6A641FF5A9907FF6A6";
        }

        if (v == Background.PURPLE) {
            return
                hex"41F02CA507C2B2941F12CA507C6B2941F2301907CAC0641F3301907CEC0641F4301907D2C9F41F5327D07D6C9F41F6327D07DAC9F41F7327D07DED6241F8358907E2D6241F9358907E6D6241FA391107EAE4441FB391107EEE4441FC391107F2E4441FD3B8907F6EE241FE3B8907FAEE241FF3B8907FEEE2";
        }

        if (v == Background.CITY__GREEN) {
            return
                hex"80005284005988005C8C006090006A9400769800759C008550B0023EC002596C400A86530028B4002A1ADC008F71900217A001D7B001D9E74006FF80060FC005C80205C84206088206F8C207690207B4A60823E70828A8082A29082D6A082E2B082F563420C9B820D45F00832710835194C20C9695082F7609FC77082D7809FC5CE820A277C0823FD08217E081BFF081AA0106121161FA21200919047F194587E9840B59C40C9A040D4A44EAFA84802AC4EAFB04802B44EAF5D01043311047F2104319D040FCD440E5D840E3DC47F1E040D4E440C9E840BD77C102A3D1025BE1023FF101EE01861211A7AE21E1F919067F194787E9860EF9C60F8A06127A46BEEA8787EAC6BEEB0787EB46BEE5CF185B70185D18C8616DCC615ED06151D46305D86802DC67F1E06802E46184E860EFEC60E5F060D47BE1A00BF186120206121227AE221FC63261FA421FC65227AE62051E7205B68205D2920612A2070AB2076EC20796D20612E207957C48223C8820A67420797520C15B608802E48184E8814EEC8127F080F87BE21FC7F2061202861212A7AD10CA7F190B87E94A9EB98A1C24E928611538A4C45F028C13128CA3228C13328BF1A54ABEED8AEAFDCB87EE0AEAF73A2AFBBB28607C285B7D29FC7E2A00BF28612030612132009110C7F194C80298C2949CC184A0D87EA4C184A8C4C4ACCA16B0C4C4B4D87EB8C4C4BCC463C0C417C4C442C8C40CCCC3E7D0CBEED4CEAF6D8361FB933ABFA32FBBB3088FC30797D31FC7E3200BF30612038611094F87E98E37B9CE184A0F87EA4E184A8E4C4ACEA1658E393117C8E02DCCE6026953AFBB63BABF73E1FB83BABDCE8EBEEECE304F0E2947BE39FC7F386120406121427AD11107F19508029904E54E940612A413115B501845D4400B7540611B5D030571940613A4118FB40F9FC40DEDEF90802FD01848121844224A7AD191387E9529EB9926D89D2184A12A7EA52184A924C4575480B5B6D24C4F121847BE49FC7F486120506121527AD11147F19548029947FC9D4184A14A7EA54184A944C4575500B7650613751FF785131395277BA51313B561FBC50613D51FC7E5200BF5061205861215A00911167F19568029967FF4E8586114D9602D6F85931395A77BA59313B5E1FBC58613D5A00BE59FC7F58612060611095987E9988004E8606114D5802D6DB61313C60611EF987F1FD818481A18485A80289A7F18DB87E91A7F195A80299A7FD4E8686114DDA02DE1A4C4E5AA16E9A4C4EDAA16F1A1847BE6A00BF6861207061217200A271FC63761FA471FC657200A671FED3A1C184537700B787131397285BA71313B7285BC70611EF9D87EFDC18481E18485E80289E7F18DE9EB91E7F195E4C499E02D4E8786114D9E02D6FB79313C78611EF9F87EFDE184820184425813126800B53A20184536800B5BEE04C4F20184F607F5FA07F9FE0184822184862BEE8A387E8E2BEE4858931131E202DA22184536880B5BEE24C4F221847BE89313F8861209061109644C44C7900B68906114DA402D6FB91313C90613D91FD7E91FE7F9061209861219AFBA29E1F91926BEE9664C44C7980B68986114DA602D6FB99313C98611EFA64C4FE6184828184425A131131E802DA28184537A00B5C6E84C4F28184F687F5FA87F9FE818482A18486ABEE8AB87E8EABEE92AFD296A4C44C7A80B68A86114DEA02D71BA9313CA8611EFAA4C4FEA18482C184425B13126B1FCA7B00B68B06114DEC02DE2C4C4E6C7F7EAC4C4EECA16F2C184F6C7F5FAC7F9FEC18482E18486EBEE8AF87E8EEBEE92EFD296EBEE9AE7F29EE02DA2E184537B80B78B93139B9FE3AB9311DF2E1847BEB9313FB861101701849B07F34E8C06114DF002D719C1313AC0611DF704C47DFC06120C86121CE1FA2CBABE3CE1FA4CBABE5CE1FA6C9FD13A32184537C80B78C93139CA85BAC8613BC9313CC9FC7DC9313EC8613FCA00A0D061108F587E934EAF97587E4D7D00B5C6744C4EB4184EF44C4F347F1F744C4FB4184FF480283618487787E8B6EAF8F787E936EAF4B8D80B79D9313AD8611DF764C47DFD861101381844B8E00B5CEF84C4F387F5F784C4FB8184FF880283A18487ABEE8BB87E464EAFB92E7A02D75BE9313CE9FD7DE9313EE8613FEA00A0F0611093C4C44B9F00B5D77C4C47DFF06120F86121FAFBA2FE1FA3F80B64F93112E7E02D75BF9313CF8613DF9313EF8613FFA008";
        }

        if (v == Background.CITY__RED) {
            return
                hex"80098E8409AC8809B48C09CB9009EC4A60287670292D42C0A72B00A925B102B3194C0AADD00ACC6B7029C9C640A4B75B02875E740A01F809CBFC09B48029B48429CB882A018C2A1D902A364A60A9CA70AAB680AB3290AC1EA0AC4AB0AC896342B41B82B665F00AD0710AD9994C2B416950AC8B60D58F70AC1F80D58DCE82AAD77C0A9CBD0A92FE0A807F0A7B20134B6114E2E215565190556394538B984B079C4B41A04B66A457C2A85559AC57C2B05559B457C25D0130171130A32130159D04BE5D44B8CD84B80DC5563E04B66E44B41E84B2277C12B33D12A4BE129CBF128DA01B4B611DDFE21CE2D190756394738B986BBA9C6BD8A06C41A46F98A8738BAC6F98B0738BB46F985CF1B38F01B4118C86CE3CC6CB8D06C9CD46FA0D87559DC7563E07559E46D2DE86BBAEC6B8CF06B667BE1D567F1B4B60234B6125DFE22558E324E2E42558E525DFE6231D272338E8234129234B6A23642B23722C2375AD234B6E237597C48E4AC88E1F6742375B523E81B609559E48D2DE88C8EEC8C41F08BD87BE2558FF234B602B4B612DDFD10CB56390B38B94B77F98AD904E92B4B5538B2E05F02BE7712BF7322BE7732BE39A54AF98D8B7C2DCB38BE0B7C273A2BE63B2B4AFC2B38FD2D58FE2D567F2B4B60334B6135565110D56394D55998CF0A9CCD2DA0D38BA4CD2DA8D2E0ACD40EB0D2E0B4D38BB8D2E0BCD26BC0D1F0C4D22EC8D1D7CCD191D0CF98D4D7C26D834E2F935F0BA33E63B3392BC3375BD3558FE35567F334B603B4B5094F38B98F05B9CED2DA0F38BA4ED2DA8F2E0ACF40E58E3CB817C8E863CCF3F46953BE6363DF0B73CE2F83DF09CE8EF98ECEF9DF0EF0A7BE3D58FF3B4B60434B6145DFD11115639515599913334E9434B6A44B815B50D2D5D44218F5434B5B5D0FA0719434B7A449AFB44647C4416DEF91559FD0D2D812D2D4224DDFD191338B95377F9934E29D2D2DA13061A52D2DA932E05754A18DB6D32E0F12D2D7BE4D58FF4B4B60534B6155DFD11155639555599954E39D4D2DA15061A54D2DA952E05755218F6534B7755397854B83953703A54B83B54E2FC534B7D5558FE55567F534B605B4B615D56511175639575599974E64E85B4B54D968636F85CB8395B703A5CB83B5CE2FC5B4B7D5D567E5D58FF5B4B60634B5095938B9995584E8634B54D588636DB64B83C634B5EF99563FD8D2D81AD2D85B55989B5638DB38B91B56395B55999B55A4E86B4B54DDA863E1B2E0E5B40EE9B2E0EDB40EF1AD2D7BE6D567F6B4B60734B617556627558E374E2E47558E57556667556D3A1CD2D5377218F874B8397503BA74B83B7503BC734B5EF9D38BFDCD2D81ED2D85F55989F5638DF77F91F56395F2E099E8634E87B4B54D9E8636FB7CB83C7B4B5EF9F38BFDED2D820D2D42584B8268218D3A20D2D5368218DBEE12E0F20D2DF61563FA1561FE0D2D822D2D862F988A338B8E2F984858CB8131E2863A22D2D5368A18DBEE32E0F22D2D7BE8CB83F8B4B60934B509652E04C79218E8934B54DA48636FB94B83C934B7D9558FE95587F934B609B4B619BE6229CE2D1926F989672E04C79A18E89B4B54DA68636FB9CB83C9B4B5EFA72E0FE6D2D828D2D425A4B8131E8863A28D2D537A218DC6E92E0F28D2DF69563FA9561FE8D2D82AD2D86AF988AB38B8EAF9892B19E96B2E04C7AA18E8AB4B54DEA86371BACB83CAB4B5EFAB2E0FEAD2D82CD2D425B4B826B55827B218E8B34B54DEC863E2D2E0E6D55DEAD2E0EED40EF2CD2DF6D563FAD561FECD2D82ED2D86EF988AF38B8EEF9892F19E96EF989AF5609EE863A2ED2D537BA18F8BCB839BD573ABCB81DF2ED2D7BEBCB83FBB4B50170D2D9B155F4E8C34B54DF0863719C4B83AC34B5DF712E07DFC34B60CB4B61CCE2E2CDF0A3CCE2E4CDF0A5CCE2E6CD5793A32D2D537CA18F8CCB839CD03BACB4B7BCCB83CCD58FDCCB83ECB4B7FCD5660D34B508F538B9357C297538B4D7D218DC6752E0EB4D2DEF52E0F35563F752E0FB4D2DFF5559836D2D87738B8B77C28F738B9377C24B8DA18F9DCB83ADB4B5DF772E07DFDB4B50138D2D4B8E218DCEF92E0F39563F792E0FB8D2DFF955983AD2D87AF988BB38B464EBE612E7A86375BECB83CED58FDECB83EEB4B7FED5660F34B5093D2E04B9F218DD77D2E07DFF34B60FB4B61FBE622FCE2E3FA18E4FCB812E7E86375BFCB83CFB4B7DFCB83EFB4B7FFD5640";
        }

        if (v == Background.STATION) {
            return
                hex"41F026E507C29B9405103DD32049B9A4420854C11A96D1082174049B963A103DDDF049B9F442087DF11A9501069899460F74D01A6E71183DD9646989E860F777F1A6E500888078C89899088079480F74D0226E71203DD94C8989D08807D48989D88807DC8989E08807E48989E880F777F226E602A62612A01D10CA98990A80794A0F798A9B94EB2AA51640A9B9C4A0F7C8A989CCA807D0A989D4A807D8A9896F82A01F92A627A283DFB2A6E5E7CAA94404326265303DE6326E6732A528337BA9338A6A33AFEB32A51640C9B9C4C0F765932627A303DFB326E7C32A53D337BBE338A7F33AFD014E0F798E9B99CEA94A0EE29A4EEBFA8EE29ACEA945903A6E71383DF23A6259E8E0F7ECE9B9F0EA94F4EE29F8EEBFFCEE29406426E6742A5284268A9438A6A4268AB42A5166D09B9F10A94F509A2F90E29FD09A24054817A64A6E674AA5284B8A694A9C2A4B8A6B4AA5165529B9D9205E6FB4A6E7C4AA53D4B8A7E4A9C3F4B8A5015405E9949B99D4A94A14F24A54E29A94DAE57550295B5D49B9E148F5E54A8DE948F5ED49B9F14A94F54F24F94E29FD4DAE4055829665A6E53A96A945775A6E785AA3795A3D7A5AA37B5A6E5E7D6A948180A5423626E646029529989B99D8A94A189B952A62A515D980A5DD89B9E188F5E58A8DE988F5ED89B979F62A51029AB9D5786B129CFDAB9D41F72CB907DEA8D41F8218101628604D98B129D7E2860404921812E24C4A73F9218100E68604989B129CFE686041FA2A3502AAB2E576AAF51BFEAB2E40CB2E756D6CC4A6DFB2E7507EEB2E409C2E755470A8D65FC2E7502B2B2E573CAF51A7F2B2E40AD2E755C34C4A63FD2E7501F6B9D513DB129A7F6B9D40CE2CB96E38BD473FE2CB9027AB9D55BEB129E7FAB9D408F2E754E7CC4A75FF2E7500FEB9D486FB12A7FAE75463EC4A73FFAE74";
        }

        if (v == Background.BOUNTY) {
            return
                hex"8000D54220035A3021524001E25001693300078B4005A5CF001E30002C71000972056CD9D40025D815B3DC002571A056CFB00097C056CDEF80025FC15B38020D54220835A30A1CD23C205AC020B1C42025C835B3CC2025D035B3D42025D835B3DC202571A0D6CFB08095E7435B3F82025FC35B38040618440B088409C8C4854488101E291016953C4078C040B1632100973156CF4100975156CDB5C4025E055B3E44025E855B3EC4025F055B3F440257DF156CE01835508860D68C6854488181E291816953C6078C060B063E18097F1B7C602035508880D68C8873488201E292016953C8078C080B0C48F21C88F37CC8F89D095B3D4905FD88FDEDC8F5E71A256CFB23DEFC240DBD244DFE256CFF23EFA0281861282C222827232A151220A078A4A05A54F281E30282C312BC8722BD4B32BFE5A54B5B3D8B050DCAF7BE0AF37E4AF21E8AF38ECAFBEF0B11A7BE2D6CFF2C016030355088C0D68CC8544883016A9320C153CC05AC0C0CDC4CF21C8CF52CCCFD5D0D110D4D5B3D8D028DCC846E0C9C4E4C9BEE8C9BFECC871F0D0E9F4D5B3F8D11AFCCFD580E0D54223835A33A1CE4381E253816933CE078C0E0CDC4F12AC8F146CCF163D0F1C7D4F1F7D8EABCDCEAD0E0EA38E4EAD1E8EA37ECEAD0F0EACEF4F213F8F1F8FCF1638100618500B089009C8D085491007895005A4CF401E30403358C9112ACD15B3D1116ED50888D90B76DD140CE10BF6E50BF8E90BE8ED13F8F10AC3F5085EF91153FD15B38120D54224835A34A1524481E254816933D2078C120CD6324C4AB34C4E344C58B54AC2364D0CF74BE8DC653686E9368FED2F88F13420F52AB0F93152FD31398140D54225035A3521CE4501E255016933D4078C140CDC5536EC9536DCD4824D15217D54BA5D9541EDD4C56E14CF1E5563CE94D05ED4C57F1541FF54B2AF951FCFD481C8160618560B089609C8D685491605A9568304C75816943D6078C160CDC5681CC9736DCD6824D16D0ED56A9CD96BBBDD72C5E17746E57633E9773BED72C5F16BAEF56A27F96CC5FD68238180D54226035A36215123D8078C180CDC59862C9936DCD8824D18CF6D58A77D99432DD92C5E1974BE59635E9973FED92C5F19431F58A17F98CC5FD881C81A0D54226835A36A1CD23DA078C1A0CDC5A81CC9B7A5CDB69DD1A85AD5ABA3D9AAD9DDB66DE1AC20E5AC43E9AC42EDB668F1AAC2F5AB4DF9A83CFDB6A681C06185C0B089C09C8DC85448F701E3070337175AB194DC81CD1D846D5C872D9CD43DDCBF5E1CC1BE5D17CE9CC1BEDCBE7F1CD1FF5C85AF9D69DFDD6AC81E0D54227835A37A15123DE078C1E0CDC5F6AC6547A07357B24367A0F777AB6387ABFF97AC4FA7B373B7AB37C7A0DBD7B23FE7A073F7DAB208035508A00D68E087348F801E308033718618B282073383B3B48207358317B6831D77832038829A79829D9D6E0C80F20C75F60C5EFA0ECFFE0ECE8220618620B08A209C8E285448F881E308833718DAF728A07338BB3B48B291ADA281CDE2B9071A8A073B8AE93C8A073D8A96FE8B293F8BB3A09035508A40D68E485448F901E30903358CA56BDCE517BD24ECED64A5BDA481CDE501C71C92073D9296FE93B3BF945EE09835508A60D68E687348F981E187E60CD8280618680B08A809C8E885448FA01E187680CD7DFA02C20A835508AA0D68EA85449FA81E20B020508AC0828EC864499B016BAB20C1DFEC05A82E06186E0B08AE09C8EE854499B81E3AB8169DFEE0788300D5422C035A3C21512670078EB005A77FC01E20C835508B20D68F2873499C81E3AC8169DFF20788340618740B08B409C8F4854499D01E3AD0169DFF4078836081422D820A3DA151267605AEB683077FD816A0E035508B80D68F887349CE01E3DE0169F7F807883A06187A0B08BA09C8FA85449CE81E3DE8169F7FA07883C0D5422F035A3F2151273C078F7C05A7DFF01E20F835508BE0D68FE87349CF81E3DF8169F7FE078";
        }

        if (v == Background.BLUE_SKY) {
            return
                hex"40E022E6F0036187C08B94050A2E66083613D828B9DC20D871F0A2E507C48B941F1A2E60203610F888B9FC80D840B2A2E6C286856FCA8B941F322E5068E8B9ECE1A179F3A2E503108B95AE422E97FD08B94064A2E53A128BAA528B9A928BA56F4A2BB04A2ED8C928C9CD28BBD128C96B64A2BB74A2E9C7D28B9403522E64522EA55232531D48AE509522EEA522F6B522FAC522F6D522FAE522F6F522C185148BFD548C2D948B0DD48BEE148BD73A522EFB52327C522E9EFD48B98168B98562AD8968C98D68BB9168BD9568BB9968BD9D68BEA168C352A5A2C6B5A30EC5A2CAD5A2DAE5A25EF5A27D84968946745A2DB55A25365A2DB75A2D1C6568C4E968C3ED68BE79D5A2EFE5A2EBF58AB60622BA1622EE2622FA36230E46230A5622CE6622D93A18897A588A1A988A2AD888DB1888FB5887DB9886C5F0621F71621B32621E33621B746210B5621B76621E77621F7860C49CE98898ED889FF188B2F588C3F988B0FD88BB81A8BF85A8B289A8B38DA89491A8A295A88499A8789DA86DA1A856A5A861A9A829ADA820B1A817B5A0A9B9A0A7BDA0ACC1A0B2C5A0C5C9A0B6CDA0B9D1A0B6D5A0B2D9A0ACDDA817E1A820E5A831E9A842EDA86DF1A87DF5A8A2F9A89FFDA8B181C8C485C89489C88E8DC86C91C84295C81899C0AC9DC0B9A1C0C5A5C0D854B7039AC703EAD7040AE7041EF7044B07048B1704732704F33704E34704AF57047367046777044B8703B797034BA702FFB702A7C720C7D7215BE721F7F7223607A21617A19627A0C63782BA47832E5783B66784667784BE8784F2978572A78586B785CD635E17FB9E1A8BDE1B8C1E1BEC5E1CFC9E1E2CDE1CFD1E1D8D5E1C6D9E1B8DDE199E1E168E5E157E9E12FEDE0F5F1E0DEF5E0B6F9E820FDE8658208208600AE8A00DE8E011292013C9601659A01999E01D8A20207A6023EAA0261AE0281B20298B602C3BA02EBBE02F6C202EBC60309CA0312CE0313D202FED602EBDA02CBDE02ADE2026CE60213EA01E2EE017CF2014DF603C7FA00D7FE00AE8220ED86211C8A23FE8E21A89221FB9622619A22C29E2313A22344A62361AA2399AE2322B22331B62343BA2374BE237F61188E37288E97388E63488E3758907B688FAF788F47888E3B988D13A88BDBB889DBC887EFD885FFE8850FF8841E0905421906862908BA390A62490C8E590E02690F6E79107A890EB94E24CCEE64467EA43EBEE43A6F24312F64276FA41EBFE41658262078662988A63328E63BF92642B9664869A65294F79B33B899A4F99987BA994EBB991EFC9903FD98DABE98B2FF9887A0A0BFA1A0EBE2A10F23A135A4A15CA5A19766A1ACA7A1B128A1B3E9A1B515568CCEDA86E1DE86DCE286D4E686CCEA86B3EE865DF28529F6845BFA83C7FE830982A61F86A48F8AA5658EA68992A6C096A6D39AA6D99EA6E1A2A6E4A6A6E5555AB33B6A9D5F7A9D4F8A9B979A9B93AA9B73BA9B33CA9AB7DA95CBEA921BFA984E0B13AA1B187A2B1ACE3B1B4E4B1B7A5B1B966B1D4D3A2C757538B333B9B1D5FAB1B97BB1B87CB1B53DB1ACFEB184FFB123E0B99761B9B122B9B663B9B9526EECCEF2E6E5F6E6D7FAE6B3FEE5EE8306C68706DC443C333921F0F9E517C3339C6F0F9E79DC333BEC1B53FC1A9A0C9B721CB3391272F9E558CB339CF72F9EFB2CCEFF26C6834CCE427D3E794634CCE73ED3E7BFD333901B6F9E4FADB339DFF6F9E406E3E793EB8CCE77FE3E7901BAF9E4EFEB33B0E9A498EBACCE77FEBE7901BCF9E4EEF33397C7C69265BF3339E7FCF9E405FBE79337ECCE5D1F9A4996FECCE79FFBE78";
        }

        if (v == Background.RED_SKY) {
            return
                hex"40E036EAF0451587C0DBA4050B6EA60C5153D82DBADC314571F0B6E907C4DBA41F1B6EA0245150F88DBAFC914540B2B6EAC2CB196FCADBA41F336E9068EDBAECF2C679F3B6E90310DBA5AE438057FD0DBA4064B6E93A12E01A52DBAA92E0156F4B80B04B8898C92E03CD2E22D12E036B64B80B74B805C7D2DBA403536EA45380655380D31D4E025095388AA53972B539BAC53972D539BAE53972F539BD8514E7ED54E92D94E6FDD4E6EE14E5C73A5388BB5380FC53805EFD4DBA816DBA857419896E038D6E22916E5C956E22996E5C9D6E6E50B5BACAC5BB0ED5BC76E5BD36F5BCA58496F356745BC7755BCD765BC7775BC51C656EE1E96EB2ED6E6E79D5B88BE5B807F5D06606380A16388A2639BA363ACA463A4A563BBA663C753A18F4DA58F4EA98F65AD8F87B18F94B58FBDB98FE95F063EF7163FA7263F77363FAB46404DAD98FEADD8FBDE1947673A63DEBB63CA7C63B0FD63ACBE639BFF6388A06B9FA16BB0E26BBBA36BCD646BD9656BE4E66BF7676BFAA86C01296C09EA6C0D2B6C10EC6C112D6C176E6C17AF6C1A706C40716C46326C40736C439A55B101D9B069DDB044E1B043E5B035E9B013EDAFEAF1AFBDF5AF65F9AF29FDAEB281CEE185CF3589CF928DCFE991D01395D04F99D0699DD10EA1D118A5D14554B745B2C7464ED746B173DD1B7C1D1F3C5D1DB6537487B47480F57476F67476B7746DF8745F79744DBA74467B74177C740D7D74013E73EF7F73E1E07BEC217BFE227C0D637C3D647C4A257C5F667C76A77C84287C87A97C9B2A7C9BEB7CA65635F2ABB9F2E1BDF2F4C1F320C5F334C9F34B6747CCD357CC8767CBD377CADB87CA0797C9BBA7C843B7C653C7C587D7C407E7C10FF7BFE208410E1843D62845863846DE48487A5849B6684ADA784CD2884D6E984EC2A84EF2B84F7EC84FD6D8512AE85182F851DB0851831851D72851DB38524F4851DB585183685127785067884F33984DDFA84D2FB84AABC848BFD8579BE84513F843D608C5F618C76E28D78238CB8648CD7258CEF268D0AE78D24E88D79298D77AA8D77EB8D1DEC8D802D8D806E8D80AF8D7D98463602CA3603CE35F9D23602D635EDDA35E7DE35E6E235DFE635E4EA3476EE33DEF2335CF632ABFA321FFE31B78252448652C68A53A18E53F59255DD9655E59A55EC9E55EDA2560353892C0B9957A3A9579FB9577FC951DBD94F7BE94D2FF949B609CD6E19CFD629D78E39D79A49D7CE59D7D269D7E13DE6B02E27603E675F6EA75F8EE75EFF275EDF675DEFA7449FE73788294768695E68A95EE8E95F09296024A6A57EA7A57ED4269605555A2C0B6A57F1BE29605E69604EA9603EE95FAF295F8F695EEFA95E6FE947582B5F986B5F48AB6028EB60392B6044A6AD8167AD7F1426B606555AAC0B6AD82DBE6B606EAB605EEB604F2B5FAF6B602FAB5F4FEB5F982D5F586D5F68AD6038ED60592D60A4A6B58193A2D60B538B2C0B9B582FAB581BBB57F3CB5817DB580FEB57E7FB57D20BD7EA1BD7EE2BD8163BD81926EEB02F2F606F6F605FAF603FEF5F68315FB871605443C2C0921F013D517C2C09C6F013D79DC2C0BEC5817FC580E0CD8161CAC09127213D558CAC09CF7213DFB2B02FF35FB834B02427D04F54634B0273ED04F7FD2C0901B613D4FADAC09DFF613D406E04F53EB8B0277FE04F501BA13D4EFEAC0B0ED8758EBAB0277FE84F501BC13D4EEF2C097C7D61D65BF2C09E7FC13D405F84F5337EB025D1FD87596FEB0279FF84F4";
        }

        if (v == Background.GREEN_SKY) {
            return
                hex"40E003B2F0079987C00EC405083B26087993D820ECDC21E671F083B107C40EC41F183B20207990F880ECFC81E640B283B2C28C396FCA0EC41F303B1068E0ECECE30E79F383B103100EC5AE403D17FD00EC406483B13A120F4A520EC54F483D30483F58C920F9CD20FDD120F96B7483D1C7D20EC403503B24503D25503E531D40F4509503F6A50406B50412C50406D50412E50406F50411851410ED541156D750413850405CE940FDED40F9F140F47BF503B20583B2158F962583E63583F64584065583F665840675841285845D4A96116AD6117B1611BB56129B96132BD6128612584B99D16129D5612ED96129DD612571958487A5845FB58411E7560FDF960F4FD63E58180F48580FD8981048D81179181159581209981294E9604CAA604DEB604E6C60526D6053EE605557C1814FC58155C98152CD815AD18166D5815AD9815BDD814FE1842F73A604EBB604A3C6046FD6045FE60413F603F606843A16846E2684823684BA4684DE56852666854A76856A8685929685A6A685C2B685DAC685EAD6860AE6860EF6865B06869316870F2686A73686CF4686A756869366865B7685EB8685DB9685C7A6859BB6856BC6853FD684DFE684A3F6845A0704861704BA27050637055647059A5705F667065A7706CE87070E97079952DC1F3B1C218B5C22AB9C232BDC231C1C254C5C24DC9C27CCDC271D1C25CD5C24DD9C244DDC231E1C20BE5C1D2E9C1C4EDC182F1C171F5C164F9C14FFDC13981E14C85E15F89E1718DE19E91E1C995E20B99E2449DE266A1E27CA5E2A5A9E2BDADE2D958D78BEEE78C36F78C7F078C9F178CE3278CFF378CE3478CDF578CBB678C7F778C0F878B1B978A9BA7899BB78867C787BBD786A7E785DBF7857E0805DA18067A2807BA3808C64809F2580AF2680C0E780CDE880D6A980E86A80ED2B80F2AC80F62D80FE6E8102AF8105708102B18109B2810BF3810DF48109F58102B680FE3780F97880EF3980DC3A80CFFB80B97C80A33D813C7E80773F8067A08882E18893628952E388C36488D6E588ED2688FC27890DE889186989206A892D2B890C2C89102D89156E891E2F891DD846248BCA24AECE248AD2248BD625E7DA2534DE2500E224ACE62461EA2415EE23C3F2235BF622FBFA2285FE223282429386430E8A43898E43D892443F9644AD9A45119E45E7A244B553892973991903A914D3B9130FC910BFD90F0FE90D27F90AF2098D6A198F622991523993924998065999EE699AFD3DE6A5CE266E0E666D2EA66C3EE6665F2656DF66480FA63F8FE63708284278684D18A860F8E86A49286CA9686DA9A87519E875AA28761A68765555A29736A1DAF7A1DA78A1D979A1D83AA1D5BBA1B6BCA1AFFDA18BBEA13C7FA109A0A9B5A1A9A322A9B163A9B7E4A9D665A9D8A6A9D9A7A9DAE8A9DC69A9DC9556AA5CDAA77ADEA777E2A772E6A771EAA769EEA760F2A6E3F6A6CAFAA67BFEA6D282C6AC86C6D28AC7568EC76292C76B96C7729AC7774E8B1DE94E2CA5CE6C77AEAC772EEC76BF2C765F6C756FAC6D2FEC68C82E6DA86E75A8AE7668EE77249BBA973CB9DCBDB9D97EB9D5BFB9B260C1D761C1DA510F0A5C487C2A4D45F0A5C71BC2A4DE770A5CFB0765FF06E3832769872A5C449CAA4D5632A5C73DCAA4FECA973FC9D760D297109F4A93518D2971CFB4A93FF4A5C406DAA4D3EB6A5C77FDAA4D01B8A934FAE2971DFF8A93406EAA4D3BFAA5CC3A6DB63AEA971DFFAA93406F2A4D3BBCA5C5F1F1B6D96FCA5C79FF2A4D017EA934CDFA971747E6DB65BFA971E7FEA930";
        }

        if (v == Background.STARRY_PINK) {
            return
                hex"801211841204443047C921C11D850A04716B04A1563C11C5617046ADC6811A0EC1271F012CAF412717DF0468200C95210C91620C8C119032204A70C8454243204A832ADAC32F7B0329B5AF0C7C984C31D86990C715D6C31ABF032847BF0C6AE014B22114DEE214A6919052829452704C7149814245254A85245AC52E4B052315AF148C1844522065314847414849AD85204DC51F2E051D973C14761EFC51C580742184740D8873CF8C73369073229472F69872F59C72E25091CB1D52C72B758D1CAB2E1CA6AF1CA0F01CA0B11C9C321C98731C981A5472546D71C91781C8C391C887A1C881DF072117BE1C813F1C7CA0251F6125ABE225072324FDA424F8129893CD9C93A350924E8AA24E32B24DE5634936BB8934DBC934C61124CDB224BD99D092E2D492C7D892B7DC92ACE0929AE49282E8927077C24983D24953E24917F248C202D97A12D95622D94632D93E42D92252D91D31CB646A0B49752A2D18AB2D186C2D0C2D2D12EE2D076F2D029844B3F66532CEFB42CE8B52CE3362CDE772CDAF82CD75CE8B336ECB2E2F0B2C8F4B2C7F8B2ACFCB29A80D67F84D67C88D6758CD670485359B26359AA73599E83598E93598AA35972B35962C359656B8D654BCD651C0D64D6323592333591B43525F53518B6350C3735077835073934FDFA34F83B34EFBC34E8BD34DE7E34DAFF34D7603DA8213DA5E23DA5233DA45214F68E98F6909CF68A5093DA0152CF67EB0F67DB4F6785CF3D9CD844F66CC8F66ACCF663D0F662D4F65FD8F659DCF652E0F651E4F64EE8F64CECF497F0F47DF4F44CF8F44BFCF3BF8117398516C044345AEE445AE929916B44E945AAEA45A92B45A82C45A6D6B91698BD169461145A3B245A259D11680D5167D6D7459E38459CF9459C3A459B3B4598FC4597BD45967E45957F4594604DD3E14DD49111374A4A64DD0E74DD0542D373AB13735B536BFB936C0BD36BAC136B5C536B16534DAAF44DA9354DA8364DA7374DA6384DA5394DA43A4DA2BB4DA17C4D9FFD4D9F7E4D9D3F4D9CA055D96155D82255D6E355D82455D6D29957589D575250A55D62B55D4AC55D2AD55D4AE55D3D7C5574AC9574367455D05AD95739DD5735E156BBE556B5E956ABED56AAF156A0F5569CF95694FD56904015DDCA25DDD635DDC9219776C9D77825095DDB15357765B97760BD775BC177606335DD6F45DD5F55DD49B5D774FE1774A73A5DD0FB5DD03C5DCD7D5DB03E5DAEFF5DAD2065E2D09197794AB65DD6C65DC96BD977561365DCB465DB1AD997656F865D83965D6FA65D69DF19752F5974FF9974AFD977E4026DDF91B1B77A5B16DDE595DB7757196DDCBA6DDB1DF1B765F5B760F9B790FDB7A840975DF9549D77A67475DE7575DE9B5DD77971C75DD5EF9D772FDD79781F77A4307DDF98C9F77ACDF77E6987DDE9CE9F779EDF77A79D7DDE5F7DF77540285DE91DA177E6FE85DEBF85DE608DDD618DDE5116377A4DC8DDFBD8DE3DF7E377A82576C8657728A57758E577949E95DEBF95DFA09DD6E19DE5629DDB119277724A69DDD53A6777954B9DDE963E77796129DDE99D677796D89DDEB99DDE5D7E777A8297858697A78A978D8E9765485A5DB1322977252EA5DD57C69779653A5DD5A5E977971AA5DD5DFE977982B6C086B77B8AB74F8EB75292B75896B75B9AB7604EAADD96BADDB2CADD956C2B76CC6B772653ADDB34ADDC9ADAB76C6FDADDC9F7EB77582D6A486D6B48AD6C08ED74092D7434A6B5D2A7B5D3D426D75254BB5D62CB5D696BAD75BBED760612B5D6F3B5D834B5D6DAE2D76073DB5D95F7ED76C82F68D86F6948AF6A08EF6AB92F6B596F6BB4C7BDB028BDD029BDD06ABDD0ABBDD0563AF7435F0BDD2B1BDD3F2BDD299D6F74FDAF74A6F9BDD3DD6EF752F2F758F6F75AFAF75BFEF7608316728716798B16808F168D9316939716989B169F9F16A0A316A4A716ABAB16B0AF16B1B316B4B716B15CFC5AE984716BBCB16BACF16BB695C5B036C5CD5BE316C0E71735EB173AEF1740F31741F71743FB176FFF174F83365287365E8B366A8F36709336759736799B367F4E8CDA169CDA26ACDA2ABCDA456373693BB36975F0CDA518CF3698D3369BD7369FDB369BDF369F719CDA83ACDA93BCDAC7CCDAD3DCDAEBECDB03FCDCEA0D51861D591A2D59363D59464D59625D597A6D599A7D59A9427566CAB566F56DD59CD73F5678C35675C75679CB567DCF567ED3567D6B7D59FF8D5A039D5A13AD5A27BD5A3BCD5A47DD5A5FED5A7FFD5AAE0DCEF61DCF822DD02A3DD0C24DD1F25DD2626DD91E7DD9328DD93A9DD942ADD946BDD94ACDD956DDD95173F7658611DD96D94F765CD3765ED7765F6D7DD98B8DD99F9DD9ABADD9B3BDD9C3CDD9D3DDD9E7EDDA03FDDA360E4C8E1E4D322E4DAE3E4E324E4E8A5E4F826E4F867E502A8E502D4AB942FAF9430B3944C5AFE5185847947CCB947D675E52636E591B7E591F8E59239E5933AE593BBE5943CE5963DE597FEE59ABFE59CA0ECA0A1ECAB22ECB1E3ECB8A4ECBDA5ECCDA6ECD327ECD768ECDAE9ECDB2AECDE6BECDEACECE32DECE35743B3A2632ECEF73ECEF9A57B3CDDBB3CEDFB3E0E3B3E1E7B3F7EBB40BEFB44BF3B461F7B498FBB64DFFB65483D23387D2548BD2608FD27093D28297D29A4C7F4AB28F4ADD4AFD2C7B3D2E2B7D2F5BBD2E35F0F4BD71F4BD994FD322695F4C8DB5FD336E3D34CE7D35DEBD36BEFD379F3D3A2F7D3CEFBD40BFFD3E383F20487F2118BF220464FC8C25FC8C66FC9153A3F25452BFC981647F270653FCA0B4FCA6B5FCA0DB5FF29AE3F2ACE7F2B775BFCB1FCFCBD7DFCCDBEFCDAFFFCE880";
        }

        revert("invalid background");
    }
}

library ClothingSprites {
    function getSprite(Clothing v) external pure returns (bytes memory) {
        if (v == Clothing.NONE) {
            return hex"";
        }

        if (v == Clothing.AMETHYST_ARMOR) {
            return
                hex"811576A32004DF20049F4004A34A75A74004DB4004DF4A75E340049B60049F6A75509DB30552F6004695D8011B5F6CC1E36A75E760049780049B8A754E8E33069E001152F8CC1593E0011A578CC1DB80046F8E33079E29D7AE00124E801129BAA759FACC1A3A004A7ACC1ABB5B1AFB884B3B5B1B7ACC1BBA0045F0EA9D71E80132EA9D73ED6C74EE211ADBB5B1DFA004719EB307AEA9D7BE801121BC0049FD5B1A3D88452AF3306BF56C6CF6212DF342AEF23417C3CD0AC7C004CBCA9BCFCCEBD3D5B16B6F33077F62138F56C5CEFC0048FE004485FA9D531FECC1A3F5B1A7F884ABF5B1AFECC158DF8012EFB4297C3ECEBC7ED0A653F80134FA9D75FD6C76FE2137FD6C5C67ECC175BFA9D7CF8010";
        }

        if (v == Clothing.THUNDERDOME_ARMOR) {
            return
                hex"445B8011D76E0048F0004485C449531F0004719C0011D6F1125F30004932004972C024C7CC4968C80137C8011C673125EB2C02EF20049740044C7D300A8D33869D00136D00137D3385C674C02EB4004428D80129D8A86AD80135D80136D9075BFB60048B8004465E44966E00113A3841DA782A1AB80D1AF8004D38004D780D1DB82A16F8E10779E0011D739125F780048FA004485EB00A6E80127E90768E8A854ABA0D1AFA004D3A0046B6E83477E8A878E90779E8011D6FAC02F3A004485F00126F10767F0A85427C0D1555F0011B5FC0D1E3C2A1E7C41D75BF00123F801121BE2A14E8F83469F8012AF8346BF8012CF8346DF8012EF83457C3E004C7E0D1CBE004CFE0D1D3E004D7E0D1DBE0046F8F8345CEFE2A1F3E0040";
        }

        if (v == Clothing.FLEET_UNIFORM__BLUE) {
            return
                hex"4C7B8011C66E0049B00049F00CAA30004DF0004E300CAE700049B20049F2053A321E1A72004DB2004DF2206E32053E720049B40044E8D014E9D0D0952F4004695D00136D0D09BE34053E740049B60044E9D814EAD8D0ABD9D5D6376004653D80134D9D5F5D8D09B636053E76004467E001142F8053B38757B78342BB8004C78004CB8342CF8757697E014DC7380048BA0048FA757486E841A7E814E8E80114B3A053B7A757BBA004C7A004CBA757676E814F7E80138E814DCEFA106F3A757F7A00487C0048BC7578FC10693C1A74A8F014D4ABC00456CF014EDF1D5D747C004CBC757674F014DADBC0046FAF014FBF069FCF041BDF1D5FEF00121F80122F814E3F8D0A4F814E5F869D323E10652AF814D5B3E004B7E7575D1F80132F9D5D9D3E0046B6F814DBE7E106EBE1A7EFE053F3E342F7E053FBE004";
        }

        if (v == Clothing.BANANITE_SHIRT) {
            return
                hex"4E8C8011BE320049B40049F57FDA34B67A74004DB4004DF4B67E357FDE740049760049B6B674E8DDFF69DAD9D52F6004695D8011B676B67EB60049780049B8B674E8E5FF54AF8B67B38004CF8004695E2D9DB5F97FD719E2D9FAE00124E801129BAB674E8EDFF54B3AB67B7A004CBA004676EAD9DBE3B7FD73AEAD9FBE80124F00125F2D9D31FD7FD50AF2D9D5B3D7FDB7CB675D1F00132F5FF59DBCB676F8F5FF5CEBCB67EFC0048FE004488FAD9E9F801152FEB6758DFDFF5747EB67653FDFF5A57EB67DBE0046F8FDFF5CEBEB67EFF7FDF3E004";
        }

        if (v == Clothing.EXPLORER) {
            return
                hex"4E8C8011BE320049B40044E8D29369D00136D0011BE34A4DE740049B69024E9DAD0952F6004695D8011B636B42E768809780049B8B429F89F8509E3282AE0012BE2D8164F8004D38B60D780046D7E32838E27E39E2D0BAE00124E80125EA9366EAD0A7EB2828EA7E29EB282AE8012BEBD22CEB2CEDED05AEEB2CD7C3B884C7ACB3CBB416CFACB3D3AF48D7A004DBACA0DFA9F8E3ACA073AEAD0BBE80124F00125F2D0931FCCA0A3C9F8A7CCA0ABC004AFCF48B3D416B7CCB3BBD4165F0F32CF1F505B2F32CF3F505B4F3D235F00136F32837F27E1C67CCA0EBCB42EFC0048FE00493EA4D97EB424C7FB2828FA7E29F8012AFBD215B3F416B7EF48BBECB3BFF416611FB2CF2FBD219D3F416D7EF48DBE004DFE9F8719FB281D6FEB42F3E0040";
        }

        if (v == Clothing.COSMIC_GHILLIE_SUIT__BLUE) {
            return
                hex"4E8C8011BE320049B40049F4E11A34005A74004DB4004DF49FBE34E11E740049760049B6C249F6005A36004A762AA54BD8011A576004DB62AADF6004E36005E76C24EB60044A7E00128E2BBE9E02EEAE0012BE228D6538004D78AEF6D7E02EDC6B800493A00497AE119BA9FB9FA004A3A0BBA7A004ABAEF7AFA004B3AA84B7A8FDBBA004BFAEA8C3A004C7A9FBCBA004CFA9FBD3AEC0D7A004DBA0BB6F8E80139EA7EFAEB847BE80123F00124F27EE5F00166F00127F27EE8F00129F27A6AF01255B3C004B7CA84BBCC7CBFC9A1C3C004C7C0BBCBCAEFCFC004D3C0BBD7CC64DBC004DFCAEFE3C2AAE7C004EBC005EFC9FBF3C0048FE00493E00597E0049BEE489FE0BBA3E00452AF8126BF8012CFB792DFA686EF8012FFA685847E004CBED74CFE004D3E0BBD7EAEF6D7F80138FBA479F8017AF8013BF8017CF8010";
        }

        if (v == Clothing.COSMIC_GHILLIE_SUIT__GOLD) {
            return
                hex"4E8C8011BE320049B40049F547FA3401FA74004DB4004DF4C6AE3547FE740049760049B70FC9F601FA36004A7747E54BD8011A576004DB747EDF6004E3601FE770FCEB60044A7E00128E37069E33E6AE0012BE2FE56538004D78DC16D7E33E5C6B800493A00497B47F9BAC6A9FA004A3ACF9A7A004ABB3EDAFA004B3ACFDB7ACB1BBA004BFB2EDC3A004C7AC6ACBA004CFAC6AD3B383D7A004DBACF96F8E80139EB1ABAED1FFBE80123F00124F31AA5F007E6F00127F31AA8F00129F356AAF28115B3C004B7CCFDBBD04ABFCDD1C3C004C7CCF9CBCDC1CFC004D3CCF9D7D02FDBC004DFCDC1E3D47EE7C004EBC01FEFCC6AF3C0048FE00493E01F97E0049BF2789FECF9A3E00452AFA812BF8012CFC8F6DFB746EF8012FFB745847E004CBF1A5CFE004D3ECF9D7EDC16D7F80138FCAF79F807FAF8013BF807FCF8010";
        }

        if (v == Clothing.CYBER_JUMPSUIT) {
            return
                hex"4E8C8011BE320044A6D00113A34994A74004DB40046F8D2651CEB4004485D80126DA0953A3688BA76A0954BD8011A576004DB6A096F8DA22F9DA097ADA22FBD80124E001129B89944E8E20954AF8A09593E0011A5B8A096F8E2095CEB8994EF8004464E801129BA88B9FA994A3AA0952CEA22D6BBAA095F1E801194FAA09696EA22F7EA8278EA651CEFA88BF3A0048FC00493C9944A7F2095433CA095AEF222EFF106F0F00118CFC88B697F2825C6BC825EFC994F3C0048FE00448AFA22D5BBEA09BFED12C3E004C7E88B654FA825AEFE88BF3E004";
        }

        if (v == Clothing.ENCHANTER_ROBES) {
            return
                hex"9EE004E2E0049B00049F008DA30004DF0004E3008DE700049B20049F2057A32004DF2004E32057E720049740049B40579F4004A3408DA74004DB4004DF408DE34004E74057EB40049760049B60299F603DA36004A7608D54BD8011A576004DB608DDF6004E3603DE7683BEB60049780049B803D9F8E54A38062A78004AB808DAF8028593E00134E00A35E02376E00137E5FAB8E38AF9E00F7AE00124E80125E80A66E80F67EB8B5427A06254BE8012CE8236DE815D747A031CBA057CFA08D695E80136E82377EBA3B8E8189CEBA03DEFA00493C00497C03D9BC0579FC062A3CE6BA7CE2DABC08DAFC057B3C004B7CB2C5D1F00132F2CB33F00134F015DADBC08DDFC057E3C062E7C057EBC03DEFC0048FE00493E02997EE2B9BE0279FE062A3E041A7E06254BF815ECFBA9ADFDF96EFBA997C3E057C7EEA6CBF7E5CFEEA6695F815F6F82377F81078F818B9F809FAFB8AFBF80F7CF8010";
        }

        if (v == Clothing.HOODIE) {
            return
                hex"4E8C8011BE320049B40044E8D296A9D00136D0011BE34A5AE740049760049B60484E9DAD9552F6004695D8011B636B65E76036EB60049780049B8B659F8A0B509E32DEAE35E2BE2D9564F8004D38B65D78D786D7E32DF8E282F9E2D97AE00124E80125EA96A6EAD967EB2DE8EA82E9EB2DD52FAD78B3AAAEB7AD785D1EAABB2EB5E33EAAB9A5BAD78DFAA0BE3ACB773AEAD97BE80124F00125F2D9531FCCB7A3CA0BA7CCB754CF35E2DF2ABAEF35E17C3CC19C7CD78CBCAAE676F35E37F282DC67CCB7EBCB65EFC0048FE00493EA5A97EB654C7FB2DE8FA82E9F801153BED785F0FB0658DBED78DFEA0B719FB2DDD6FEB65F3E0040";
        }

        if (v == Clothing.SPACESUIT) {
            return
                hex"9B40049F4B45A34B1FDF4B1FE34B45E740044A6D80113A36FB8A76B1FDB6B1F6F8DBEE1CEB60049380044A6E41667E00114278FB854BE2C7DA578B1F6D7E3EE38E0011CEB9059EF80048FA004486EB2167EC1668E80114AFAFB8593EAC7DA5BAFB8DFA004E3B05973BEB217CE80123F001121BD0599FCC85A3C00452AF3EE15B3C8C65AEF3EE2FF2C7F0F378D8CBCFC4674F335F5F3F136F3EE37F00138F3215CEFD059F3C0048FE004486FB2167FC1668F80129FAD16AFA31ABFA8C6CFBEE2DFA31AEFBEE2FFAC7F0FB78F1FBF132FB35D9D3F422D7ECD7DBEB45DFE004E3F05973BFB217CF8010";
        }

        if (v == Clothing.MECHA_ARMOR) {
            return
                hex"4A8D0011BEB40049360394A8D8A554AB60396B6D80E5BEB6295EF60398F80399382954A8E2E594AB8295AF8039D380396B6E0A55BEB8B96EF8295F380398BA0398FA295485EAE5931FA6D0509EAE5AAEA33ABE8A56CE80BADE8202EE80117C3A8A5C7A004CBA080CFA02ED3A295D7A8CE6D7EAE59C67A6D075BEAE5BCE8A57DE80E62F00E63F0A564F2E5A5F14E531FCB96A3C53952AF2E5ABF233ACF07356BBC0045F0F1B418CBC004CFC1CDD3C8CE6B6F2E5B7F14E5C67CB96EBC539EFCB96F3C295F7C0398BE0398FE295486FAE5A7FA2968F94E69FAE5AAF8A56BFA33ACF87356BBE0045F0F9B418CBE004CFE1CDD3E8CE6B6FAE5B7F94E78FA295CEFEB96F3E295F7E0390";
        }

        if (v == Clothing.LAB_COAT) {
            return
                hex"4E8C8011BE320049B40044E8D3EA29D00136D0011BE34FA8E740049760049B6ECB4E8DC1CE9DBF8D52F6004695D8011B637073E76E3AEB60049780049B90739F8F75A391D6A78FE354BE494ECE00133E0011A5792536D7E475B8E3DD79E41CFAE00124E80125EBEA26EC1CE7EC75A8EBDD69EC75AAEBF8D5B3B253B7A004CBA004676EC94F7EBDD78EC759CEBB073EFA00493C00497D0734C7F475A8F3DD69F475AAF494EBF3F8D637D2535D1F001194FD253D3CFE36B6F494F7F3DD5C67D1D6EBD073EFC0048FE00493EFA897F0734C7FC75A8FBDD69F801152FF253B3EFE3B7F2535D1F80132FC94F3FBF8DA5BF253DFEF75719FC759D6FF073F3E0040";
        }

        if (v == Clothing.FLEET_UNIFORM__RED) {
            return
                hex"4C7B8011C66E0049B00049F0C60A30004DF0004E30C60E700049B20049F2A6CA32F2AA72004DB2004DF2F5AE32A6CE720049B40044E8D29B29D46A952F4004695D00136D46A9BE34A6CE740049B60044E9DA9B2ADC6AABDD7216376004653D80134DD7235DC6A9B636A6CE76004467E001142F8A6CB395C8B791AABB8004C78004CB91AACF95C8697E29B1C7380048BA0048FB5C8486EB4367EA9B28E80114B3AA6CB7B5C8BBA004C7A004CBB5C8676EA9B37E80138EA9B1CEFAD0DF3B5C8F7A00487C0048BD5C88FCD0D93CEB34A8F29B14ABC00456CF29B2DF5721747C004CBD5C8674F29B1ADBC0046FAF29B3BF3ACFCF3437DF5723EF00121F80122FA9B23FC6AA4FA9B25FBACD323ED0D52AFA9B15B3E004B7F5C85D1F80132FD7219D3E0046B6FA9B1BE7ED0DEBEEB3EFEA6CF3F1AAF7EA6CFBE004";
        }

        if (v == Clothing.GOLD_ARMOR) {
            return
                hex"4C8C8011BE72004485D001131F5448A352D9A74004DB4004DF52D9719D5121D6F40048F6004486DD1213A36C87A77448AB6004D76004DB74486F8DB21DCEF7448F360048B80048F9448485E4B666E321E7E512142B92D9AF8004D380046B7E4B678E51239E321DD6F92D9F39448F780048BA004464ECB665EB21E6ED1213A3B2D9A7AC87ABA004AFAB6A593EADDF4EADAB5E80136EB21DBE3B2D9E7B448EBAC8777CECB67DE80122F00111A3CC87A7C004ABCA4E56DF3D1EEF378AFF261F0F378B1F2DC5953CF47D7CA4EDBC0046FCF321FDF0011123E004A7EB6AABEC87AFF3A058DFD122EFBD1EFFA7370FCB7F1FB21D94FF448D3F3A0D7EC87DBEB6A6FDF80100";
        }

        if (v == Clothing.ENERGY_ARMOR__BLUE) {
            return
                hex"4C8C0011BE70004485C801131F2BCFA32004DF2004719CAF3DD6F20048F4004486D2F3E7D21FA8D2F3E9D00136D00137D2F3F8D21F9CEF4BCFF340048B60048F6BCF485DA7F26DA1FA7DC6D942769FCAB6004D760046D7DA7F38DC6DB9DA1F9D6F69FCF36BCFF760048B8004464E27F25E21FA6E15B13A389FCA7887EAB8004AF8855593E00134E21575E00136E21F9BE389FCE7856CEB887E77CE27F3DE00122E80111A3A87EA7A004ABA82656DEA65AEEA37EFE95B30EC6DB1EA155953A996D7A826DBA0046FCEA1FBDE8011123C004A7C855ABC87E56DF2F3EEF265AFF15B30F46DB1F21F9953CBCFD7C87EDBC8556FDF00123F80124FAF3E5FA65931FE9FCA3E996A7E87EABEBC3AFEBCFB3E9FCB7EBCFBBE996BFE56CC3F1B6C7E87ECBEBCFCFE9FCD3EBCFD7EB9EDBE87EDFE996719FA7F3AFA65BBFAF3FCF80100";
        }

        if (v == Clothing.MISSION_SUIT__BLACK) {
            return
                hex"4C8C0011BE700049720044C7CAB728C80137C8011C672ADCEB2004934004974ADC4C8D275A9D00136D0011BE749D6EB4ADCEF40048F6004487DA75A8DA2069DA16D52F6004695D80136DA16F7DA205C6F69D6F360048B80048F8ADC485E27593278881AB8004AF885B593E00134E216F5E0011B67888175BE275BCE2B73DE00122E8011193A9D64A6EA2053A3A81DA7A004ABA9D6AFA881593EA16F4EA2075EA75B6E8011BE3A81D73AEA205DF3A9D6F7A004448F00129F204EAF27595BBCADC5F1F275994FCADCD3C9D6D7CADCDBC8136FDF00123F80124FAB725FA16E6FA75A7FA2068FA0754DBE004DFE81DE3E881E7E9D6EBE85BEFEADCF3E004";
        }

        if (v == Clothing.COWBOY) {
            return
                hex"4E8C8011BE320049B40049F4BCB509D0011B5F4004E34BCBE740049760049B6C9B9F6BCBA36004A76C1154BD8011A576004DB6C11DF6004E36BCBE76C9BEB60049780049B8C9B9F900AA3800452AE280ABE304564F8004D38DE9D78C11DB8A02DF8004E3900AE78C9BEB800493A00497AC9B9BB35A9FB1CEA3ABCBA7A004ABAC1156CEA8096C7ADE9653EB045A57AA02DBA004DFABCBE3B1CEE7B35AEBAC9BEFA00493C00497CC9B9BD35A4E8F402A9F2F2EAF0012BF280ACF3046DF280974BCAE0CFCDE9D3CAE0D7C004DBCBCB6F8F402B9F4D6BAF326FBF00123F80124FB26D29BF35A9FF1CE509FC02AAFAF2D5B3E0045B2FB0459D3E004D7EBCB6D7FC02B8FC739CEBF35AEFEC9BF3E0040";
        }

        if (v == Clothing.GLITCH_ARMOR) {
            return
                hex"4E8C8011BE320049B40049F47FAA3417EA74004DB4004DF417EE347FAE740049760049B67FA4E8D85FA9D9FE952F6004695D80136D9FE9BE3617EE767FAEB60049780044C8E1FE94AB817EAF87FA593E00134E1FE9ADB817E6F9E1FEBAE00124E80125E9FE931FA056A3A06452AE9FE95D3A17E6B6E9FEB7E8191C67A02CEBA7FAEFA00493C00497C7FA9BC0BA9FC2E6A3C0BAA7C05DABC056AFC7FAB3C2E65AEF1FE97C3C2E6632F1FEB3F0B9B4F1FEB5F00B36F01777F02EB8F0B9B9F02EBAF1FEBBF00123F80124F9FEA5F815A6F82EA7F8B9A8F82EA9F8A1AAF82EABF9FEACF85D56BBE4035F0F85D58CBE403CFE175D3E7FAD7E0BADBE286DFE0BAE3E2E6E7E0BAEBE056EFE7FAF3E0040";
        }

        if (v == Clothing.SHIRT_AND_TIE) {
            return
                hex"4E8C8011BE320049B40049F40D1A3488BA74004DB4004DF488BE340D1E740049760049B688B9F6004A360D1A76A0954BD8011A576004DB6A09DF60D1E36004E7688BEB60049780044C7E222E8E00129E312552F8A09593E0011A578A09DB8C49DF8004719E222FAE00124E801129FA88BA3AA09A7A00454BEB126CE80116BBB8845F0EBBB18CBB884CFA004695EB1276E80137EA825C6BA88BEFA00493C0044A6F222D3A7CA09ABC00456CF3126DF0012EF3DD57C3CB40C7CF75CBC004674F31275F0011B63CA0973AF222FBF00123F801121BE88B4EAFA826BF8012CFB126DF8012EFE2117C3EEECC7F884CBE004CFEC49D3E0046B8FA825CEFE88BF3E004";
        }

        if (v == Clothing.MARTIAL_SUIT) {
            return
                hex"448C8011BF720048F400493406B9741F94C7D20168D03EE9D00136D00137D03EDC674805EB41F9EF406BF340049360049760359B606C4E8D83FA9D81AD52F6004695D80136D81AF7D83F9C67606CEB606BEF60049780049B806B9F80FE509E0E0D52F80FB593E0011A5780FBDB83836F8E03FB9E01AFAE001121BA0049FA06BA3A0FE52AE8E0D5B3A0FBB7A0045D1EAF6B2E80119D3A0FBD7A3836D7E83FB8E81ADCEFA00493C00497C9EE4C7F00128F00D69F01B152FC0FEB3C06BB7C0FB5D1F001194FC06BD3C0FE6B6F01B37F00D5C67C004EBC9EEEFC0048FE00493EBDA97E0049BEBDA4E8F80129F80D6AF81B2BF83FACF8E0D6BBE0FB5F0F80118CBE0FBCFE383D3E0FED7E06CDBE0356F8F80139FAF6BAF8013BFAF6BCF80100";
        }

        if (v == Clothing.ENERGY_ARMOR__RED) {
            return
                hex"4C9D0011B674004485D801131F6D4DA36004A76D4D54BD8011A576004DB6D4DDF6004719DB535D6F60048F8004486E35367E290E8E35369E001152F8D4D593E0011A578D4DDB8004DF8D4DE38A4373BE3537CE00122E80123EB535217AC779BAA439FB83E509EB1DD52FA004593EB535A57A0046D7EB1DF8EE0FB9EA90DD6FAC77F3AD4DF7A0048BC004464F31DE5F290E6F53853A3CC77A7CA43ABC004AFC9BC593F00134F26F35F00136F290DBE3CC77E7D4E1EBCA4377CF31DFDF00122F80111A3EA43A7E004ABE8AC56DFAD7AEFAB3EFFD3870FE0FB1FA6F1953EB5ED7E8ACDBE0046FCFA90FDF8010";
        }

        if (v == Clothing.MISSION_SUIT__PURPLE) {
            return
                hex"4C8C0011BE700049720044C7CBD2A8C80137C8011C672F4AEB2004934004974F4A4C8D34E29D00136D0011BE74D38EB4F4AEF40048F6004487DB4E28DAF669DAB7D52F6004695D80136DAB7F7DAF65C6F6D38F360048B80048F8F4A485E34E13278BD9AB8004AF8ADF593E00134E2B7F5E0011B678BD975BE34E3CE3D2BDE00122E8011193AD384A6EAF653A3A9E1A7A004ABAD38AFABD9593EAB7F4EAF675EB4E36E8011BE3A9E173AEAF65DF3AD38F7A004448F00129F2432AF34E15BBCF4A5F1F34E194FCF4AD3CD38D7CF4ADBC90C6FDF00123F80124FBD2A5FAB7E6FB4E27FAF668FA7854DBE004DFE9E1E3EBD9E7ED38EBEADFEFEF4AF3E004";
        }
        revert("invalid clothing");
    }
}

library EyesSprites {
    function getSprite(Eyes v) external pure returns (bytes memory) {
        if (v == Eyes.ADORABLE) {
            return
                hex"56E780118D1E004AA0004AE1884B2016FB61884BA016FC6016FCA1884CE016FD21884D60004AA2004AE3884B22004B63884BA2004C62004CA3884CE2004D23884D62004AE588458D90012E9621319621194E4004D25884AE7884B2616FB67884BA616FC6616FCA7884CE616FD27884";
        }

        if (v == Eyes.VETERAN) {
            return
                hex"D54004D16004CD8004C9A004A1C004C5C004A5E004C1E00454F800118D2000454F8801318E21194E24B9D23884D6200454F90013196213291B559D2588456E9801319E21194E66D5D27884AA8004A6A004A2C004";
        }

        if (v == Eyes.SUNGLASSES) {
            return
                hex"4F88001288801298AC36A88012B8AC36C880116BA2B0D5F0880118CE2B0D6958801368AC37788012990012A92C36B900116364B0D5D190013292C359D24004D64B0DDA4004AA600456C9AC356BA60046339801349AC375980115B68004654A0010";
        }

        if (v == Eyes.WHITE_SUNGLASSES) {
            return
                hex"4F88621288E2114BA2FAD5F08E2118DA2FADDE3884A2588452D947C6E9621319621195A51F1DE5884A6788454D9D6C6E9E21319E21195675B1DA788454DA621195698840";
        }

        if (v == Eyes.RED_EYES) {
            return
                hex"54B78011A55E00456C80012E800131800119D20004AA2004AE3884B234C85AE880118CA2004CE34C8D23884D62004AA400456C96212D95322E962131962132953219D25884D64004AE788458D9D322E9E21319E21194E74C8D278840";
        }

        if (v == Eyes.WINK) {
            return
                hex"6348001318E21194E20C4D23884D6200454E900131962132906759D25884C678846539867749E210";
        }

        if (v == Eyes.CASUAL) {
            return
                hex"56E800118D20004AA2004AE388458D88312E8E21318E21194E20C4D23884D62004AE5884B2419D5AE962131962132906759D25884AE788458D98676E9E21319E21194E619DD27884";
        }

        if (v == Eyes.CLOSED) {
            return hex"54E900118D640040";
        }

        if (v == Eyes.DOWNCAST) {
            return
                hex"B9E004C5E00454D80012E80003180001956000454E880018D62000AA400456D90002E900131900119524000D6400456D980119526004";
        }

        if (v == Eyes.HAPPY) {
            return hex"56D880119522004AA4004BA4004C64004D640040";
        }

        if (v == Eyes.BLUE_EYES) {
            return
                hex"54C800119D60004AE3884B227575AE880118CA2004CE2757D23884AE5884B2421D5AE962131962132908759D25884AE788458D98B62E9E21319E21194E62D8D27884";
        }

        if (v == Eyes.HUD_GLASSES) {
            return
                hex"A1F88052B7D179635F880B9F45EC5F45E6537E201A59F45EDDF880A2188052A85A655BA10075F0851798D210076B685A6778620288D17A98DA66A8C01EB8DE45636363DBA37915F08DA6718DE4594E363DD23791D63007DA3699DE345EA6545EAA5761AE57ACB256645AE95EB17C2545EC657ACCA566467495EB3595D8769517AA9D17AB9DEB16367664BA745EC6745E6539D99349DEB359D1795B6945E654A51780";
        }

        if (v == Eyes.DARK_SUNGLASSES) {
            return
                hex"517800114262004AA29B556C880116BA29B55F18801194E29B56958801368A6D77880128900129929A152E400458D929A17424004632929A19D24004D64A686D79001142A600456C9A9A16CE6004D26A686B7980114AA8004AE8A6858EA00118CA8004CE8A68696A0011536A004655A80100";
        }

        if (v == Eyes.NIGHT_VISION_GOGGLES) {
            return
                hex"5747801143600045D1801DD95E0004A22004A62077AA2004AE22D058D893C17462004653893C3488B435880136881DF7880114AA4004AE42D058D91D62E900117C24077C6400465391D63490B41ADA4004AA600456D98B41746600465498B435980115BA8004634A0010";
        }

        if (v == Eyes.BIONIC) {
            return
                hex"56E800118D20004AA200456E8B72718E21194E2394D23884D62004AE4DC9B25562B65884BA4DC9C65884CA4394674962115BA6DC9C6788465399FC349E2100";
        }

        if (v == Eyes.HIVE_GOGGLES) {
            return
                hex"5936801152DC004593701DDA55C00450978011531E0775B2780E99D5E0776D7780128800114AE003AB20D515AF800EB0835458CA003ACE0D51696800EB7800128880114DA203ADE2004A24004A6403AAA504156C900EAD955CD746403ACA5573674900EB5941076900EB7900128980114AA607756E980E97C26077634980E9ADA6077DE600452AA00115BA80775F0A00118D280776B6A00115BAA004634A8010";
        }

        if (v == Eyes.MATRIX_GLASSES) {
            return
                hex"517780128800129858FAA817A2B8058AC80D72D8401AE80D717C20004C61006CA035CCE0162D2035CD61006DA05E8DE0004A22004A6363EAA235CAE2476B2275EB6363EBA27FEBE23D7C225E8C6378CCA275ECE275FD227FED63006DA25E8DE2004A64004AA4641AE43D7B247F4B657AABA48015F090013195EAB291FD3390F5F4920075958FB690012A98012B98F5EC99FD2D9D996E98013198013299FD339A01B49A0075980115B68004654A0010";
        }

        if (v == Eyes.GREEN_GLOW) {
            return
                hex"B8C77DD0C77D54B39DF2C39DF56BCE77CC0E77DC4E77ECCE77CD0E77DD4E77C99077DA1077C52A41DF6B41DFAC41E02D41E06E41DFD7C5077EC9078067541DFB641DF7741DF3841DF53A1277DA5278054B49E0AC49E0ED49E117412785C52783C92782CD278169549E03649DF7749DF3849DFBA49DF2651DF6751DFE851E06951E12A51E1EB51E2EC51E296B9478DBD478FC1478DC5478BC9478ACD478769551E17651E07751E03851DFF951DF7A51DF2559DF6659E02759E0E859E22959E2EA59E42B59E56C59E66D59E6AE59E76F59E73059E6F159E5D94D6794D1678FD5678BD96786DD6784E16780E5677DE9677EED677CF1677D91877D9587809987849D8789A1878FA58797A9879EAD87A5B187A9B587AC5CF61EBB061EB7161EAF261E9F361E87461E73561E5B661E3F761E23861E17961E03A61DFFB61DF7C61DF110DA77D91A77E95A78299A7879DA790A1A799A5A7A2A9A7AEADA7B7B1A7BCB5A7C05CF69F0B069F07169EFF269EEF369EDB469EB7569E8F669E6B769E3F869E27969E0FA69E01DF1A77D8DC77D91C78095C78699C78E9DC797A1C7A4A5C7B0A9C7BDADC7C5B1C7CCB5C7D15D071F5B171F4F271F3F371F1F471EF7571ED3671E9B771E67871E3B971E1FA71E07B71DF9E75C77C8DE77D91E78295E78799E7929DE79EA1E7ACA5E7BAA9E7C9ADE7D4B1E7DBB5E7E0B9E7E1BDE7E2C1E7E3C5E7E1C9E7DFCDE7D9D1E7CED5E7C0D9E7B3DDE7A3E1E795E5E78AE9E785EDE780F1E77D8A077D8E078092078396078B9A07959E07A5A207B5A607C4AA07D2AE0163B2019CB601E4BA0217BE07E8C207E9C60229CA01FFCE01A3D20159D607CDDA07BCDE07AAE2079BE6078EEA0785EE0781F2077DF6077C86277C8A277D8E278092278496278D9A27989E27A8A227BAA627C8AA2140AE2F3E58D89D56E8B7F6F89FB7089FBB18B5DD94E2755D22F26D62136DA27C2DE27B1E2279FE62791EA2788EE2782F2277E7BE89DF2291DF6391E02491E12591E32691E66791EA6891EEA991F2AA91F5AB93C46C91D56D938FEE937F2F91FBB091FBF19369F291D5739387B493BAB591F5F691F13791EC7891E87991E47A91E23B91E07C91DFBD91DF2299DF6399E02499E12599E32699E5E799E9E899EE2999F1AA99F52B9BDDD6366755BA6E3EBE67ECC267EDC66DC765399D5749BC47599F4F699F07799EBB899E7B999E47A99E23B99E07C99DFE2A1DF63A1DFA4A1E0A5A1E266A1E4E7A1E868A1EC69A1EFEAA1F36BA1F62CA1F7ADA1F8EEA1F92FA1F970A1F9F1A1F9B2A1F933A1F874A1F6B5A1F2B6A1EEF7A1EAB8A1E6F9A1E37AA1E1BBA1E03CA1DF7EA1DF23A9DFA4A9E0A5A9E1E6A9E3A7A9E6A8A9EA69A9ED6AA9F06BA9F32CA9F56DA9F6AEA9F76FA9F7F0A9F831A9F7B2A9F733A9F5F4A9F2F5A9EFB6A9EC77A9E838A9E539A9E2FAA9E0FBA9E01E76A77C8AC77C8EC77D92C77E96C7839AC7899EC793A2C79EA6C7A9AAC7B3AEC7BCB2C7C3B6C7C8BAC7CDBEC7CFC2C7D0C6C7CDCAC7C7CEC7C2D2C7BCD6C7B1DAC7A4DEC79AE2C78DE6C787EAC78077CB1DF7DB1DF24B9DFA5B9E026B9E167B9E2E8B9E4E9B9E72AB9E92BB9EAECB9EC6DB9EDAEB9EE6FB9EE30B9EEB1B9EE32B9ED73B9EBF4B9EAB5B9E836B9E677B9E3B8B9E1F9B9E0FAB9DFDDF2E77C93077D97077E9B07829F0783A3078AA7078FAB0796AF079BB307A0B707A4BB07A3BF07A5C307A8C707A4CB07A1CF079FD3079AD70793DB078CDF0787E3078373AC1DFFBC1DF26C9DFA7C9E028C9E0E9C9E1AAC9E32BC9E3ACC9E42DC9E4AEC9E4EFC9E530C9E571C9E532C9E4F3C9E3F4C9E375C9E2B6C9E1B7C9E0B8C9E01CEB277D9B477D9F477EA3478052AD1E0EBD1E1ACD1E16DD1E22ED1E26FD1E2B0D1E271D1E232D1E273D1E1B4D1E0F5D1E0B6D1DFDBE3477D73AD1DF13A3677C52AD9DFEBD9DF963B67815F0D9E0B1D9E072D9E033D9E074D9E035D9DFF6D9DF9BE3677CE7677DA7877DAB877E56CE1DF2DE1DF6EE1DF2FE1DF70E1E031E1DF9953877D6B6E1DF2BE9DF2EE9DF6FE9DF31E9DF33E9DF74E9DF35E9DF40";
        }

        if (v == Eyes.ORANGE_GLOW) {
            return
                hex"B8D6C4D0D6C454B3DB0EC3DB116BCF6C3C0F6C4C4F6C5CCF6C3D0F6C4D4F6C39916C4A116C352A45B12B45B16C45B1ED45B22E45B197C516C5C916C767545B17645B13745B0F845B113A136C4A536C754B4DB26C4DB2AD4DB2D74136CCC536CAC936C9CD36C86954DB1F64DB1374DB0F84DB17A4DB0E655B12755B1A855B22955B2EA55B3AB55B4AC55B456B956D4BD56D6C156D4C556D2C956D1CD56CE69555B33655B23755B1F855B1B955B13A55B0E55DB1265DB1E75DB2A85DB3E95DB4AA5DB5EB5DB72C5DB82D5DB86E5DB92F5DB8F05DB8B15DB7994D76DBD176D6D576D2D976CDDD76CBE176C7E576C4E976C5ED76C3F176C49196C49596C79996CB9D96D0A196D6A596DEA996E5AD96ECB196F0B596F35CF65BD7065BD3165BCB265BBB365BA3465B8F565B77665B5B765B3F865B33965B1FA65B1BB65B13C65B0D10DB6C491B6C595B6C999B6CE9DB6D7A1B6E0A5B6E9A9B6F5ADB6FDB1B702B5B7065CF6DC2306DC1F16DC1726DC0736DBF346DBD356DBAB66DB8776DB5B86DB4396DB2BA6DB1DDF1B6C48DD6C491D6C795D6CD99D6D59DD6DEA1D6EBA5D6F7A9D703ADD70BB1D712B5D7175D075C73175C67275C57375C37475C0F575BEB675BB7775B83875B57975B3BA75B23B75B15E75D6C38DF6C491F6C995F6CE99F6D99DF6E5A1F6F3A5F700A9F70FADF71AB1F721B5F726B9F727BDF728C1F729C5F727C9F725CDF71FD1F714D5F706D9F6F9DDF6EAE1F6DCE5F6D1E9F6CCEDF6C7F1F6C48A16C48E16C79216CA9616D29A16DC9E16ECA216FBA6170AAA1718AE0CA5B20D23B60DA2BA0E07BE172EC2172FC60E32CA0DDCCE0D31D20C98D61713DA1702DE16F1E216E2E616D5EA16CCEE16C8F216C4F616C38636C38A36C48E36C79236CB9636D49A36DF9E36EFA23700A6370EAA2C59AE37CB58D8DB0AE8DED2F8DCC708DCCB18DEBD94E36C2D237C7D62C45DA3708DE36F8E236E6E636D8EA36CFEE36C9F236C57BE8DB0E295B12395B1E495B2E595B4E695B82795BC2895C02995C42A95C72B95F2AC95B0AD95EEEE95EC2F95CCB095CCF195EA7295B0B395EF3495F1B595C77695C2B795BE3895BA3995B63A95B3FB95B23C95B17D95B0E29DB1239DB1E49DB2E59DB4E69DB7A79DBBA89DBFA99DC32A9DC6AB9DF3563676C2BA77B9BE7730C27731C677AD6539DB0B49DF2B59DC6769DC1F79DBD789DB9799DB63A9DB3FB9DB23C9DB1A2A5B123A5B164A5B265A5B426A5B6A7A5BA28A5BE29A5C16AA5C4EBA5C7ACA5C92DA5CA6EA5CAAFA5CAF0A5CB71A5CB32A5CAB3A5C9F4A5C835A5C436A5C077A5BC78A5B8B9A5B53AA5B37BA5B1FCA5B13EA5B0E3ADB164ADB265ADB3A6ADB567ADB868ADBC29ADBEEAADC1EBADC4ACADC6EDADC82EADC8EFADC970ADC9B1ADC932ADC8B3ADC774ADC475ADC136ADBE37ADB9F8ADB6F9ADB4BAADB2BBADB1DE76B6C38AD6C38ED6C492D6C596D6CA9AD6D09ED6DAA2D6E5A6D6F0AAD6F9AED702B2D709B6D70EBAD713BED715C2D716C6D713CAD70DCED708D2D702D6D6F8DAD6EBDED6E1E2D6D4E6D6CEEAD6C777CB5B13DB5B0E4BDB165BDB1E6BDB327BDB4A8BDB6A9BDB8EABDBAEBBDBCACBDBE2DBDBF2EBDBFEFBDBFB0BDC031BDBFB2BDBEF3BDBDB4BDBC75BDB9F6BDB837BDB578BDB3B9BDB2BABDB19DF2F6C39316C49716C59B16C99F16CAA316D1A716D6AB16DDAF16E2B316E7B716EBBB16EABF16ECC316EFC716EBCB16E8CF16E6D316E1D716DADB16D3DF16CEE316CA73AC5B1BBC5B0E6CDB167CDB1E8CDB2A9CDB36ACDB4EBCDB56CCDB5EDCDB66ECDB6AFCDB6F0CDB731CDB6F2CDB6B3CDB5B4CDB535CDB476CDB377CDB278CDB1DCEB36C49B56C49F56C5A356C752AD5B2ABD5B36CD5B32DD5B3EED5B42FD5B470D5B431D5B3F2D5B433D5B374D5B2B5D5B276D5B19BE356C473AD5B0D3A376C352ADDB1ABDDB1563B76C85F0DDB271DDB232DDB1F3DDB234DDB1F5DDB1B6DDB15BE376C3E776C4A796C4AB96C556CE5B0EDE5B12EE5B0EFE5B130E5B1F1E5B1595396C46B6E5B0EBEDB0EEEDB12FEDB0F1EDB0F3EDB134EDB0F5EDB100";
        }

        if (v == Eyes.RED_GLOW) {
            return
                hex"B8D4E8D0D4E854B3D39EC3D3A16BCF4E7C0F4E8C4F4E9CCF4E7D0F4E8D4F4E79914E8A114E752A453A2B453A6C453AED453B2E453A97C514E9C914EB675453A76453A374539F8453A13A134E8A534EB54B4D3B6C4D3BAD4D3BD74134F0C534EEC934EDCD34EC6954D3AF64D3A374D39F84D3A7A4D39E6553A27553AA8553B29553BEA553CAB553DAC553D56B954F8BD54FAC154F8C554F6C954F5CD54F2695553C36553B37553AF8553AB9553A3A5539E55D3A265D3AE75D3BA85D3CE95D3DAA5D3EEB5D402C5D412D5D416E5D422F5D41F05D41B15D40994D74FFD174FAD574F6D974F1DD74EFE174EBE574E8E974E9ED74E7F174E89194E89594EB9994EF9D94F4A194FAA59502A99509AD9510B19514B595175CF6546706546316545B26544B36543346541F5654076653EB7653CF8653C39653AFA653ABB653A3C6539D10DB4E891B4E995B4ED99B4F29DB4FBA1B504A5B50DA9B519ADB521B1B526B5B52A5CF6D4B306D4AF16D4A726D49736D48346D46356D43B66D41776D3EB86D3D396D3BBA6D3ADDF1B4E88DD4E891D4EB95D4F199D4F99DD502A1D50FA5D51BA9D527ADD52FB1D536B5D53B5D0755031754F72754E73754C747549F57547B6754477754138753E79753CBA753B3B753A5E75D4E78DF4E891F4ED95F4F299F4FD9DF509A1F517A5F524A9F533ADF53EB1F545B5F54AB9F54BBDF54CC1F54DC5F54BC9F549CDF543D1F538D5F52AD9F51DDDF50EE1F500E5F4F5E9F4F0EDF4EBF1F4E88A14E88E14EB9214EE9614F69A15009E1510A2151FA6152EAA153CAE0CC0B20D42B60DD7BA0E40BE1552C21553C60E59CA0DFECE0D50D20CAAD61537DA1526DE1515E21506E614F9EA14F0EE14ECF214E8F614E78634E78A34E88E34EB9234EF9634F89A35039E3513A23524A63532AA2C6EAE377758D8D392E8DCDAF8D55708D55B18DADD94E34E4D23773D62C55DA352CDE351CE2350AE634FCEA34F3EE34EDF234E97BE8D39E2953A23953AE4953BE5953DE6954127954528954929954D2A95502B95DDAC95392D95D16E95B06F9555B09555F195A97295393395D13495DB75955076954BB7954738954339953F3A953CFB953B3C953A7D9539E29D3A239D3AE49D3BE59D3DE69D40A79D44A89D48A99D4C2A9D4FAB9DDF163674E4BA773EBE7554C27555C676BC6539D39349DDDB59D4F769D4AF79D46789D42799D3F3A9D3CFB9D3B3C9D3AA2A53A23A53A64A53B65A53D26A53FA7A54328A54729A54A6AA54DEBA550ACA5522DA5536EA553AFA553F0A55471A55432A553B3A552F4A55135A54D36A54977A54578A541B9A53E3AA53C7BA53AFCA53A3EA539E3AD3A64AD3B65AD3CA6AD3E67AD4168AD4529AD47EAAD4AEBAD4DACAD4FEDAD512EAD51EFAD5270AD52B1AD5232AD51B3AD5074AD4D75AD4A36AD4737AD42F8AD3FF9AD3DBAAD3BBBAD3ADE76B4E78AD4E78ED4E892D4E996D4EE9AD4F49ED4FEA2D509A6D514AAD51DAED526B2D52DB6D532BAD537BED539C2D53AC6D537CAD531CED52CD2D526D6D51CDAD50FDED505E2D4F8E6D4F2EAD4EB77CB53A3DB539E4BD3A65BD3AE6BD3C27BD3DA8BD3FA9BD41EABD43EBBD45ACBD472DBD482EBD48EFBD48B0BD4931BD48B2BD47F3BD46B4BD4575BD42F6BD4137BD3E78BD3CB9BD3BBABD3A9DF2F4E79314E89714E99B14ED9F14EEA314F5A714FAAB1501AF1506B3150BB7150FBB150EBF1510C31513C7150FCB150CCF150AD31505D714FEDB14F7DF14F2E314EE73AC53ABBC539E6CD3A67CD3AE8CD3BA9CD3C6ACD3DEBCD3E6CCD3EEDCD3F6ECD3FAFCD3FF0CD4031CD3FF2CD3FB3CD3EB4CD3E35CD3D76CD3C77CD3B78CD3ADCEB34E89B54E89F54E9A354EB52AD53BABD53C6CD53C2DD53CEED53D2FD53D70D53D31D53CF2D53D33D53C74D53BB5D53B76D53A9BE354E873AD539D3A374E752ADD3AABDD3A563B74EC5F0DD3B71DD3B32DD3AF3DD3B34DD3AF5DD3AB6DD3A5BE374E7E774E8A794E8AB94E956CE539EDE53A2EE539EFE53A30E53AF1E53A595394E86B6E539EBED39EEED3A2FED39F1ED39F3ED3A34ED39F5ED3A00";
        }

        if (v == Eyes.PURPLE_GLOW) {
            return
                hex"B8D075D0D07554B3C1D2C3C1D56BCF074C0F075C4F076CCF074D0F075D4F074991075A1107452A441D6B441DAC441E2D441E6E441DD7C51076C91078675441DB6441D77441D38441D53A13075A5307854B4C1EAC4C1EED4C1F1741307DC5307BC9307ACD30796954C1E364C1D774C1D384C1DBA4C1D26541D67541DE8541E69541F2A541FEB5420EC542096B95085BD5087C15085C55083C95082CD507F695541F76541E77541E38541DF9541D7A541D255C1D665C1E275C1EE85C20295C20EA5C222B5C236C5C246D5C24AE5C256F5C25305C24F15C23D94D708CD17087D57083D9707EDD707CE17078E57075E97076ED7074F1707591907595907899907C9D9081A19087A5908FA99096AD909DB190A1B590A45CF6429B06429716428F26427F36426746425356423B66421F7642038641F79641E3A641DFB641D7C641D110DB07591B07695B07A99B07F9DB088A1B091A5B09AA9B0A6ADB0AEB1B0B3B5B0B75CF6C2E706C2E316C2DB26C2CB36C2B746C29756C26F66C24B76C21F86C20796C1EFA6C1E1DF1B0758DD07591D07895D07E99D0869DD08FA1D09CA5D0A8A9D0B4ADD0BCB1D0C3B5D0C85D07433717432B27431B3742FB4742D35742AF67427B77424787421B9741FFA741E7B741D9E75D0748DF07591F07A95F07F99F08A9DF096A1F0A4A5F0B1A9F0C0ADF0CBB1F0D2B5F0D7B9F0D8BDF0D9C1F0DAC5F0D8C9F0D6CDF0D0D1F0C5D5F0B7D9F0AADDF09BE1F08DE5F082E9F07DEDF078F1F0758A10758E107892107B9610839A108D9E109DA210ACA610BBAA10C9AE0B4BB20B8EB60BE6BA0C10BE10DFC210E0C60C1ACA0BFECE0B8FD20B38D610C4DA10B3DE10A2E21093E61086EA107DEE1079F21075F610748630748A30758E307892307C9630859A30909E30A0A230B1A630BFAA2AFBAE339758D8C102E8CCE6F8C38B08C38F18CCDD94E3040D23380D62AF1DA30B9DE30A9E23097E63089EA3080EE307AF230767BE8C1D22941D63941E24941F25942126942467942868942C6994306A94336B94E56C94102D94D3AE94CE2F9438F094393194B97294103394D83494E3F59433B6942EF7942A7894267994227A94203B941E7C941DBD941D229C1D639C1E249C1F259C21269C23E79C27E89C2BE99C2F6A9C32EB9CE616367040BA733ABE70E1C270E2C673246539C10349CE5759C32B69C2E379C29B89C25B99C227A9C203B9C1E7C9C1DE2A41D63A41DA4A41EA5A42066A422E7A42668A42A69A42DAAA4312BA433ECA4356DA436AEA436EFA43730A437B1A43772A436F3A43634A43475A43076A42CB7A428B8A424F9A4217AA41FBBA41E3CA41D7EA41D23AC1DA4AC1EA5AC1FE6AC21A7AC24A8AC2869AC2B2AAC2E2BAC30ECAC332DAC346EAC352FAC35B0AC35F1AC3572AC34F3AC33B4AC30B5AC2D76AC2A77AC2638AC2339AC20FAAC1EFBAC1E1E76B0748AD0748ED07592D07696D07B9AD0819ED08BA2D096A6D0A1AAD0AAAED0B3B2D0BAB6D0BFBAD0C4BED0C6C2D0C7C6D0C4CAD0BECED0B9D2D0B3D6D0A9DAD09CDED092E2D085E6D07FEAD07877CB41D7DB41D24BC1DA5BC1E26BC1F67BC20E8BC22E9BC252ABC272BBC28ECBC2A6DBC2B6EBC2C2FBC2BF0BC2C71BC2BF2BC2B33BC29F4BC28B5BC2636BC2477BC21B8BC1FF9BC1EFABC1DDDF2F0749310759710769B107A9F107BA31082A71087AB108EAF1093B31098B7109CBB109BBF109DC310A0C7109CCB1099CF1097D31092D7108BDB1084DF107FE3107B73AC41DFBC41D26CC1DA7CC1E28CC1EE9CC1FAACC212BCC21ACCC222DCC22AECC22EFCC2330CC2371CC2332CC22F3CC21F4CC2175CC20B6CC1FB7CC1EB8CC1E1CEB30759B50759F5076A3507852AD41EEBD41FACD41F6DD4202ED4206FD420B0D42071D42032D42073D41FB4D41EF5D41EB6D41DDBE3507573AD41D13A3707452ADC1DEBDC1D963B70795F0DC1EB1DC1E72DC1E33DC1E74DC1E35DC1DF6DC1D9BE37074E77075A79075AB907656CE41D2DE41D6EE41D2FE41D70E41E31E41D995390756B6E41D2BEC1D2EEC1D6FEC1D31EC1D33EC1D74EC1D35EC1D40";
        }

        if (v == Eyes.BLUE_GLOW) {
            return
                hex"B8C916D0C91654B3A456C3A4596BCE915C0E916C4E917CCE915D0E916D4E915990916A1091552A4245AB4245EC42466D4246AE424617C50917C909196754245F64245B7424578424593A12916A5291954B4A46EC4A472D4A475741291EC5291CC9291BCD291A6954A46764A45B74A45784A45FA4A45665245A75246285246A952476A52482B52492C5248D6B94926BD4928C14926C54924C94923CD49206955247B65246B75246785246395245BA5245655A45A65A46675A47285A48695A492A5A4A6B5A4BAC5A4CAD5A4CEE5A4DAF5A4D705A4D315A4C194D692DD16928D56924D9691FDD691DE16919E56916E96917ED6915F1691691891695891999891D9D8922A18928A58930A98937AD893EB18942B589455CF6251F06251B1625132625033624EB4624D75624BF6624A376248786247B962467A62463B6245BC6245510DA91691A91795A91B99A9209DA929A1A932A5A93BA9A947ADA94FB1A954B5A9585CF6A56B06A56716A55F26A54F36A53B46A51B56A4F366A4CF76A4A386A48B96A473A6A465DF1A9168DC91691C91995C91F99C9279DC930A1C93DA5C949A9C955ADC95DB1C964B5C9695D0725BB1725AF27259F37257F4725575725336724FF7724CB87249F972483A7246BB7245DE75C9158DE91691E91B95E92099E92B9DE937A1E945A5E952A9E961ADE96CB1E973B5E978B9E979BDE97AC1E97BC5E979C9E977CDE971D1E966D5E958D9E94BDDE93CE1E92EE5E923E9E91EEDE919F1E9168A09168E091992091C9609249A092E9E093EA2094DA6095CAA096AAE0839B20845B6084FBA0851BE0980C20981C60852CA0850CE083AD20835D60965DA0954DE0943E20934E60927EA091EEE091AF20916F609158629158A29168E291992291D9629269A29319E2941A22952A62960AA282DAE2EBD58D8A6DAE8B662F8A60F08A61318B59594E29B6D22EA5D6282CDA295ADE294AE22938E6292AEA2921EE291BF229177BE8A45629245A3924664924765924966924CA79250A89254A99258AA925BAB93ABAC926DAD9370AE935FEF926130926171934772926DB39374F493A375925BF69257379252B8924EB9924ABA92487B9246BC9245FD9245629A45A39A46649A47659A49669A4C279A50289A54299A57AA9A5B2B9BB7963669B6BA6DA6BE6982C26983C66D666539A6DB49BABB59A5AF69A56779A51F89A4DF99A4ABA9A487B9A46BC9A4622A245A3A245E4A246E5A248A6A24B27A24EA8A252A9A255EAA2596BA25C2CA25DADA25EEEA25F2FA25F70A25FF1A25FB2A25F33A25E74A25CB5A258B6A254F7A250F8A24D39A249BAA247FBA2467CA245BEA24563AA45E4AA46E5AA4826AA49E7AA4CE8AA50A9AA536AAA566BAA592CAA5B6DAA5CAEAA5D6FAA5DF0AA5E31AA5DB2AA5D33AA5BF4AA58F5AA55B6AA52B7AA4E78AA4B79AA493AAA473BAA465E76A9158AC9158EC91692C91796C91C9AC9229EC92CA2C937A6C942AAC94BAEC954B2C95BB6C960BAC965BEC967C2C968C6C965CAC95FCEC95AD2C954D6C94ADAC93DDEC933E2C926E6C920EAC91977CB245BDB24564BA45E5BA4666BA47A7BA4928BA4B29BA4D6ABA4F6BBA512CBA52ADBA53AEBA546FBA5430BA54B1BA5432BA5373BA5234BA50F5BA4E76BA4CB7BA49F8BA4839BA473ABA461DF2E9159309169709179B091B9F091CA30923A70928AB092FAF0934B30939B7093DBB093CBF093EC30941C7093DCB093ACF0938D30933D7092CDB0925DF0920E3091C73AC2463BC24566CA45E7CA4668CA4729CA47EACA496BCA49ECCA4A6DCA4AEECA4B2FCA4B70CA4BB1CA4B72CA4B33CA4A34CA49B5CA48F6CA47F7CA46F8CA465CEB29169B49169F4917A3491952AD2472BD247ECD247ADD2486ED248AFD248F0D248B1D24872D248B3D247F4D24735D246F6D2461BE3491673AD24553A3691552ADA462BDA45D63B691A5F0DA46F1DA46B2DA4673DA46B4DA4675DA4636DA45DBE36915E76916A78916AB891756CE2456DE245AEE2456FE245B0E24671E245D95389166B6E2456BEA456EEA45AFEA4571EA4573EA45B4EA4575EA4580";
        }

        if (v == Eyes.SKY_GLOW) {
            return
                hex"B8C577D0C57754B395DAC395DD6BCE576C0E577C4E578CCE576D0E577D4E576990577A1057652A415DEB415E2C415EAD415EEE415E57C50578C9057A675415E36415DF7415DB8415DD3A12577A5257A54B495F2C495F6D495F9741257FC5257DC9257CCD257B695495EB6495DF7495DB8495E3A495DA6515DE7515E68515EE9515FAA51606B51616C516116B94587BD4589C14587C54585C94584CD4581695515FF6515EF7515EB8515E79515DFA515DA5595DE6595EA7595F685960A959616A5962AB5963EC5964ED59652E5965EF5965B05965715964594D658ED16589D56585D96580DD657EE1657AE56577E96578ED6576F1657791857795857A99857E9D8583A18589A58591A98598AD859FB185A3B585A65CF616A306169F16169726168736166F46165B56164366162776160B8615FF9615EBA615E7B615DFC615D910DA57791A57895A57C99A5819DA58AA1A593A5A59CA9A5A8ADA5B0B1A5B5B5A5B95CF696EF0696EB1696E32696D33696BF46969F56967766965376962786960F9695F7A695E9DF1A5778DC57791C57A95C58099C5889DC591A1C59EA5C5AAA9C5B6ADC5BEB1C5C5B5C5CA5D07173F1717332717233717034716DB5716B767168377164F871623971607A715EFB715E1E75C5768DE57791E57C95E58199E58C9DE598A1E5A6A5E5B3A9E5C2ADE5CDB1E5D4B5E5D9B9E5DABDE5DBC1E5DCC5E5DAC9E5D8CDE5D2D1E5C7D5E5B9D9E5ACDDE59DE1E58FE5E584E9E57FEDE57AF1E5778A05778E057A92057D9605859A058F9E059FA205AEA605BDAA05CBAE0110B20133B60156BA016BBE05E1C205E2C60172CA0160CE013BD20105D605C6DA05B5DE05A4E20595E60588EA057FEE057BF20577F605768625768A25778E257A92257E9625879A25929E25A2A225B3A625C1AA20F0AE2AD758D891C6E89B36F89793089797189B1D94E2471D22A91D620E8DA25BBDE25ABE22599E6258BEA2582EE257CF225787BE895DA2915DE3915EA4915FA59161A69164E79168E8916CE99170EA9173EB92AB2C911C6D91B56E91B36F9179709179B191B1F2911C7391B434928AF5917436916F77916AF89166F99162FA9160BB915EFC915E3D915DA2995DE3995EA4995FA59961A6996467996868996C69996FEA99736B9ACDD6366471BA66D0BE65E3C265E4C666CD653991C749AAB35997336996EB7996A389966399962FA9960BB995EFC995E62A15DE3A15E24A15F25A160E6A16367A166E8A16AE9A16E2AA171ABA1746CA175EDA1772EA1776FA177B0A17831A177F2A17773A176B4A174F5A170F6A16D37A16938A16579A161FAA1603BA15EBCA15DFEA15DA3A95E24A95F25A96066A96227A96528A968E9A96BAAA96EABA9716CA973ADA974EEA975AFA97630A97671A975F2A97573A97434A97135A96DF6A96AF7A966B8A963B9A9617AA95F7BA95E9E76A5768AC5768EC57792C57896C57D9AC5839EC58DA2C598A6C5A3AAC5ACAEC5B5B2C5BCB6C5C1BAC5C6BEC5C8C2C5C9C6C5C6CAC5C0CEC5BBD2C5B5D6C5ABDAC59EDEC594E2C587E6C581EAC57A77CB15DFDB15DA4B95E25B95EA6B95FE7B96168B96369B965AAB967ABB9696CB96AEDB96BEEB96CAFB96C70B96CF1B96C72B96BB3B96A74B96935B966B6B964F7B96238B96079B95F7AB95E5DF2E5769305779705789B057C9F057DA30584A70589AB0590AF0595B3059AB7059EBB059DBF059FC305A2C7059ECB059BCF0599D30594D7058DDB0586DF0581E3057D73AC15E7BC15DA6C95E27C95EA8C95F69C9602AC961ABC9622CC962ADC9632EC9636FC963B0C963F1C963B2C96373C96274C961F5C96136C96037C95F38C95E9CEB25779B45779F4578A3457A52AD15F6BD1602CD15FEDD160AED160EFD16130D160F1D160B2D160F3D16034D15F75D15F36D15E5BE3457773AD15D93A3657652AD95E6BD95E163B657B5F0D95F31D95EF2D95EB3D95EF4D95EB5D95E76D95E1BE36576E76577A78577AB857856CE15DADE15DEEE15DAFE15DF0E15EB1E15E195385776B6E15DABE95DAEE95DEFE95DB1E95DB3E95DF4E95DB5E95DC0";
        }

        if (v == Eyes.RED_LASER) {
            return
                hex"B8D4CED0D4CE54B3D336C3D3396BCF4CDC0F4CEC4F4CFCCF4CDD0F4CED4F4CD9914CEA114CD52A4533AB4533EC45346D4534AE453417C514CFC914D16754533F64533B7453378453393A134CEA534D154B4D34EC4D352D4D35574134D6C534D4C934D3CD34D26954D34764D33B74D33784D33FA4D33665533A75534285534A955356A55362B55372C5536ED555AEE55376F5537F0553771553732555C3355361A5554D6D954D2DD54D1E154D0E554CEE954CD9574CE9974D19D74D4A174D9A574DCA974E0AD7567B1756DB5756EB97564BD7566C17565C57568C97575CD7572D17569D574DCD974D7DD74D5E174D1E574CEE974CFED74CDF174CE9194CE9594D19994D59D94DAA194DFA595B5A995BBAD95C6B195D2B595C0B995C2BD95B6C195B7C595C7C995CCCD95DCD195D7D595CBD995BDDD94D9E194D6E594D1E994D0ED94CEF194CD4436D33A46D33E56D34E66D36276D5AA86D6E296D742A6D7FAB6D8A2C6D8AED6D892E6D8BEF6D7FF06D82716D8CB26D8BB36D8DF46D8DB56D88B66D78B76D73B86D5C796D353A6D345DF1B4CE8DD4CE91D4D195D4D799D4DE9DD5B5A1D5D3A5D62DA9D649ADD677B1D69AB5D692B9D6765F0759BB1759EB275A57375A8B475A3357597767590B77581F8756FF975363A7534BB7533DE75D4CD8DF4CE91F4D395F4D899F5B99DF5D1A1F62AA5F671A9F6B6ADF74CB1F769B5F766B9F75DBDF74DC1F74EC5F759C9F764CDF763D1F751D5F737D9F682DDF63FE1F5FDE5F5D6E9F4D6EDF4D1F1F4CE8A14CE8E14D19214D49614DC9A15C19E1608A21661A616B8AA1762AE1218B212EAB61354BA1344BE1783C21784C61342CA1365CE12FDD21207D6176BDA173CDE1681E21627E615D4EA14D6EE14D2F214CEF614CD8634CD8A34CE8E34D19234D59634DD9A35EB9E363AA2368BA63756AA31A2AE37BFB237A6B637B7BA37C3BE37A3C2379EC637C3CA37B5CE37A4D237BED631A2DA375CDE36AEE23653E63621EA34D9EE34D3F234CF7BE8D33629533A3953464953565955B2695786795912895ACE995DBAA95E6AB95F46C95F86D960A2E95F62F95EE3095EDB195F772960A3395F7B495F3F595E6B695DD3795CE389596B995887A955D3B9534BC9533FD9533629D33A39D34649D35659D5B269D7CA79D90289DAA699DDC6A9DE6EB9DE26C9E0B2D9DFC2E9DF52F9DECB09DEC719DF4F29DFDF39E0A349DE2759DE6F69DDE379DCD389D95F99D887A9D5D3B9D34BC9D3422A533A3A533E4A534E5A536A6A57567A592E8A5A5A9A5D7EAA5E4EBA5D56CA5F4ADA5E4AEA5EBAFA5E7F0A5E831A5EAF2A5E1F3A5F434A5D575A5E536A5D9F7A5AE78A59839A57C7AA535FBA5347CA533BEA53363AD33E4AD34E5AD3626AD7127AD88E8AD9EE9ADCF6AAD8C6BADE5ACADAB6DADE72EADE3AFADE070ADE031ADE2B2ADE633ADA9F4ADE5B5AD8C76ADD1F7ADA8F8AD8E79AD73FAAD353BAD345E76B4CD8AD4CD8ED4CE92D4CF96D4D49AD5BE9ED5E9A2D643A6D688AAD5CDAED7BAB2D629B6D768BAD754BED749C2D748C6D753CAD768CED626D2D7BAD6D5CDDAD69EDED656E2D61FE6D5C9EAD4D177CB533BDB53364BD33E5BD3466BD35A7BD5BE8BD8829BD32EABDDC2BBD6D2CBDACADBDA86EBDA0EFBD9AF0BD9A71BDA1F2BDAA33BDAFB4BD6D35BDDC36BD32F7BD8E38BD6CB9BD353ABD341DF2F4CD9314CE9714CF9B14D39F14D4A315BCA714CAAB17A2AF14CCB31645B7162CBB1641BF1625C3161EC7163BCB1634CF164AD314CCD717A2DB14CADF15C9E314D473AC5343BC53366CD33E7CD3468CD3269CDE66ACD32ABCD762CCD7AADCD76EECD72AFCD7170CD70F1CD7172CD7673CD7DF4CD76B5CD32B6CDE677CD3278CD345CEB34CE9B54CE9F54CFA354C9A75799AB54C9AF54D7B354D6B75574BB54DABF54DBC354DAC754D9CB5571CF54D7D354D4D754C9DB5799DF54C9E354CE73AD53367DD3268DDE669DD326ADD342BDD33D63B74D25F0DD34F1DD34B2DD3473DD34B4DD3475DD3436DD3277DDE678DD3279DD33A7E53268E5E669E5326AE533D5B394CDB794CEBB94CDBF94CEC394D1C794CF654E533B5E53376E53277E5E678E53266ED3267EDE668ED326BED336EED33AFED3371ED3373ED33B4ED3375ED33B7ED3278EDE679ED3266F53267F5E668F53277F53278F5E679F53265FD3266FDE667FD3278FD3279FDE67AFD324";
        }

        if (v == Eyes.BLUE_LASER) {
            return
                hex"B8C498D0C49854B3925EC392616BCE497C0E498C4E499CCE497D0E498D4E497990498A1049752A41262B41266C4126ED41272E412697C50499C9049B6754126764126374125F8412613A12498A5249B54B49276C4927AD4927D74124A0C5249EC9249DCD249C6954926F64926374925F849267A4925E65126275126A85127295127EA5128AB5129AC51296D51336E5129EF512A705129F15129B25137F351289A5544A0D9449CDD449BE1449AE54498E9449795649899649B9D649EA164A3A564A6A964AAAD64BE58D59342E5930AF593070593031592FF25938735938B45933B55929B65928775927F85926F959263A59267B5925FC5926246126256126E66127E7612928612A69613EEA613F6B6148EC61526D61492E61442F613FF0613FB1614CB2614C736151F46151756148B66143776128F86128396126FA6126BB61263C6125D10DA49891A49995A49D99A4A29DA4CFA1A4FCA5A548A9A55FADA5FEB1A5FFB5A600B9A60EBDA56BC1A560C5A61AC9A5FFCDA619D1A618D5A5FBD9A55DDDA51FE1A4DEE5A49EE9A49B77C6926237126247126E5712866712A27713EE8714C29717F6A718B6B719E2C71A66D71A2EE719917C5C679C9C69ACDC6A2D1C698D5C651D9C62CDDC55DE1C50CE5C4A2E9C49CEDC49979D7125E37926247927657928A67943A77951A8797F297998EA79A8EB79AE2C7AA2AD7AA6AE7A7D6F79AF3079AF717A72B27A96737A96347A1BF579AC76799DF7798AB87956B9794FFA79283B7926FC7926228126238126E48127A58129A68143E78157A881982981A8AA8295EB82CC2C8307AD830FAE82F56F82FC7082FCB182E7F28309738302F482CF7582AEB681AC37819DB8817DF98150BA81283B81273C81263D8125E18925E28926238926E48927E58929E68956E789836889A5E98A41EA8AC3AB8BA6AC8B5A2D8B8F2E8BB32F8B4A708B45318BB3328B92738B57348BA1F58AC3B68A7D3789A838899439897D3A8928FB89277C89265EFA24978A44988E449B92449F9644CC9A455C9E463DA246A9A64AC0AA4CDBAE4F6CB24FE5B65142BA4FA9BE4E1DC24E1CC64FC6CA5142CE4FC7D24F57D64CDBDA4B1BDE46B5E2465FE645F4EA44DDEE449CF24499F644978A64988E649B92649F9664CC9A656A9E662BA266A1A66AEBAA6CEFAE6C3FB2714FB67018BA6F85BE6E12C26DEFC66F84CA7024CE7142D26C3FD66CEFDA6B36DE66AFE2664FE665F4EA64DDEE649CF2649A8A84988E849992849D9684A49A85449E863CA2869DA68A1CAA8C5CAE899BB28F76B68C8ABA8DD4BE8D15C28D16C68DC5CA8C30CE8F6CD2899BD68C6DDA8A88DE86AEE2865EE68556EA84A1EE849BF28498FA84978EA49992A49D96A4A29AA51E9EA5F6A2A694A6A6B6AAA561AEAC8BB2A67AB6ACD4BAAC53BEABD7C2ABB6C6AC31CAACB6CEA67AD2AC8BD6A561DAA6BADEA69BE2A626E6A540EAA49EEEA49B79DA925E2B125E3B12624B12665B127A6B142A7B15668B18EA9B1A56AB138EBB38F6CB152ADB2A26EB229EFB1ADF0B1AEF1B23972B2A273B14CF4B38F75B138F6B1A737B193B8B17CF9B1477AB126DDF2C498F6C49792E49996E49B9AE4A09EE4E0A2E5F5A6E453AAEAECAEE4ABB2E6A8B6E69FBAE696BEE661C2E662C6E68ACAE69ECEE6A7D2E4ABD6EAECDAE453DEE625E2E4EFE6E49EEAE49A77CB925E4C12625C12666C12767C127A8C142E9C1052AC34FEBC1182CC189EDC17E6EC18A2FC17E30C17EB1C18A72C18333C18EF4C11835C34FF6C10537C14778C1279CEB049AEF04979B24999F249BA323EFA72CEEAB2409AF2541B32557B72558BB2520BF2521C3252FC72521CB2543CF2569D32555D72409DB2CEEDF23EFE3249B73AC92626D12627D12668D0FBE9D33BAAD0FBEBD1286CD1282DD1376ED1292FD12970D12931D128F2D137B3D12874D127B5D0FBF6D33BB7D0FBF8D1261CEB44979F63EFA36CEEA763EFAB649AAF649958ED92717C3649DC7649CCB649BCF649CD3649BD7649ADB63EFDF6CEEE363EFE764989F83EFA38CEEA783EFAB849956CE125EDE1262EE125EFE12630E126F1E12659538498D78497DB83EFDF8CEEE383EF9BA3EF9FACEEA3A3EFAFA497BBA498BFA497C7A497CFA498D3A497D7A498DFA3EFE3ACEEE7A3EF9BC3EF9FCCEEA3C3EFDFC3EFE3CCEEE7C3EF97E3EF9BECEE9FE3EFE3E3EFE7ECEEEBE3EF0";
        }

        if (v == Eyes.GOLDEN_SHADES) {
            return
                hex"4F88001288801298DF3AA8DF02B8CD5AC8C5CED8BAF2E8801318801328BAF338CCA748CFB358DF0368DF23788012890012995EF6A94BFAB943BAC93AF2D935FAE931A57C24004C64C69CA4F6ACE5001D25148D652ECDA5499DE4004A26004A672A1AA7049AE6E37B26C99B66B91BA6AD25F09801319AB4B29AF3339B5C349B9DF59C00769C9DF7980129A0012AA38E2BA3212CA2E0ADA2B4AEA00131A00132A2B4B3A2E734A324B5A38676A0011536A004655A8010";
        }

        if (v == Eyes.HIPSTER_GLASSES) {
            return
                hex"4CE680118E5A00495C00499D8389DD15650975F06A745595B1D8385AE745597C1C004C5D7C1C9D83867474559ADDD838E1D156E5D838E9C00499E0049DF8385097801152DE8A858D78012E7A2A17C1F7C16337A2A1A55E0046D77A2A387DF079780126800127860E28800114AA0A7456C82702D82B86E827017C2183863282B859D209C06B6829D37822A388455B98001268801278C55A88A2A298A9D2A8A702B8B636C8BA6ED8B4B2E8B6357C23838C62F326538B4B348BCCB58AB8768A9D378801388E0E398801269001279455A8922A14AA4001AE4F32B24E5AB64D8DBA4F325F09455B1936372939699D24F32D64A74DA4001DE4004E25838E640049A60049E77C1A26004A66001AA6A74AE6D8DB26E5AB66FAABA6F325F09C55B19B63594E6FAAD26F326B69800779A2A389DF079980127A00128A5F069A22A152E800458DA22A2EA5F057C28004C697C1653A22A1A568004DA88A8DE97C1E28004A2A004A6B83854BAC55ACAE0E2DADF072ADF073AE0E1A56B156DAB7C1DEA004";
        }

        if (v == Eyes.PINCENEZ) {
            return
                hex"56E800118D20004AA2004AE388458D88D46E8E21318E21194E2351D23884D6200453690012998012A9D312B9DD416366E42BA7750C677506539B90B49DD4359D31369801153A8004635A0010";
        }

        if (v == Eyes.BLUE_SHADES) {
            return
                hex"4F88001288801298827EA88252B88222C881CED88162E880131880132881633881FF48823B58825368826F78801289001299024AA90212B901BAC90162D9011EE900F97C24004C6403ECA405FCE4068D24072D6407EDA4091DE4004A26004A6607AAA6069AE6051B26040B66030BA602A5F0980131980AB2980D339811B4981575981A36981E77980129A0012AA013ABA010ACA00BEDA00AAEA00131A00132A00AB3A00CF4A00FF5A01376A0011536A004655A8010";
        }

        if (v == Eyes.BLIT_GLASSES) {
            return
                hex"4F8780127800114260CB9AA000456C84F2D6BA07F05F0800118CA13CB67481FC3580011B5E01FFE2000450A880115B233CB5AE89FC17C220046328CF2D9D227F06B788012A900115B247F05AE94F2D7C2400463291FC19D253CBD64004AA600456C99FC16BA73CB5F0980118CA67F06749CF2F5980115BA8004634A00100";
        }

        if (v == Eyes.NOUNS_GLASSES) {
            return
                hex"9DE00452E7BF9D8D9EFE7E1E0049A00049E0FE7A20004A60FE754B8621163A00045F083F9D8CA188467580013683F9F780013883F9F9800127880114262FE754B8E21163A20045F08BF9D8CA388467588011B5E2FE7E22004A64FE754B9621163A40045F093F9D8CA588467590013693F9E99BF9D52E788458E980117C26FE76329E2119D66004DA6FE7A68FE754BA621163A80045F0A3F9D8CA9884675A00136A3F9D4BAAFE7636ABF9C0";
        }

        if (v == Eyes.SPACE_VISOR) {
            return
                hex"5177E2028862014AA0F9F56E832797C20F9F63483279ADA0F9FDE1880A23880A62F9FAA2C9EAE31DD58D8B13AE8C7757C22F9FC631DD6538B13B48C77758B27B68BE7F78E2028962014AA51C4AE535FB24D1C5AE94D7D7C251C4C6535FCA4D1C67494D7DADA51C4DE5880A2788052A9C712B9CD7D6366D1CBA735F5F09C71319CD7D94E6D1CD2735F6B69C71379E2029A620153E95B0C295AF635A56C36A6201556B8800";
        }
        revert("invalid eyes");
    }
}

library FurSprites {
    function getSprite(Fur v) external pure returns (bytes memory) {
        if (v == Fur.BLUE) {
            return
                hex"5B2380115B100045B2402259D10004A9200456F482270483671482272483659D12089D52004A5400454B50226C503656BD4089C140D963250227350365A554089D94004A1600452A582255B160D95AE58226F5836584560896535836745822755836765822775801286001296022552D80D958D6478D74580D96536478F460365AD98089DD80049DA00450968226A68366B6CB55635B3FB5D06CB5716C78D94DB3FBD1B2D56B668367768227868012770012870226970366A7478D5B5CCC95D174FED951CCC9D5D1E3D9C0D9DDC089E1C0044A778012878226978366A7C78D5D1F3FBD5F1E3D9E0D9DDE08971A7801248001129A0FF29E0004A2008952A8478D5D213FB6B68478F780227880011CEA0FF2EE0004922004962FF29A2BB19E2FF2A22004A631E35558CFEF68C78F78801388BFCB98AEC7A8BFCBB88012490012593FC931E4BB1A24004A651E355594FEF69478F790011C664BB1EA4FF2EE4004926004966FF29A6BB19E6FF2A26004A660D9AA71E35749CFEF59C78F69836779801389BFCB99AEC7A9BFCBB980124A001129E8FF2A2800452AA0366BA4FED64E91E3D293FB6B6A03677A0011C6A8FF2EE80044A7A80128A82254AAA0D956CACB56DACFEEEABF397C2B25AC6AFCECAB3FB674ACB55ADAA0D9DEA08971AA80127B00128B02269B036552ED2D558DB4FEEEB00117C2D2D6C6C004654B4FEF5B4B576B03677B02278B00127B80128B82269B8366ABCB555D2F3FBD6F2D5DAE0D9DEE089E2E004A30004A700D9AB11E3AF12D5593C4FEF4C4B575C478F6C03677C00113A32004A72089AB20D9AF31E3593CCFEF4CC78F5C83676C8225BE320049B40044E8D02269D0012AD0226BD0366CD478D6CB53FBCF51E3D340D9D74089DB40046F8D02279D00125D8011327608954BD8012CD83656CB71E3CF60D9695D8011B676089EB60049780044C8E02269E036552F8089593E0011A578089DB80D96F9E0227AE00124E801129BA0899FA0D9A3A08952AE8366BEC78D64FAFCED3B1E36B6E83677E82278E8365CEBA089EFA00493C00497C0899BC0D94E8F02254ABC0D956CF4B556CBD3FB674F4B55ADBC0D96F8F02279F0367AF0227BF00123F8011217E0894CAF8366BFCB5564FF3FBD3F2D56B7F83678F82279F8365D6FE089F3E004";
        }

        if (v == Fur.GREEN) {
            return
                hex"5B2380115B100045B2403899D10004A9200456F4838B0485BF14838B2485BD9D120E2D52004A5400454B5038AC505BD6BD40E2C1416F6325038B3505BDA5540E2D94004A1600452A583895B1616F5AE5838AF585BD84560E2653585BF45838B5585BF65838B75801286001296038952D816F58D64489745816F6536448B4605BDAD980E2DD80049DA0045096838AA685BEB6C7BD635B2B55D06C7BF16C48994DB2B5D1B1EF6B6685BF76838B86801277001287038A9705BEA744895B5CC715D174AD5951CC71D5D122D9C16FDDC0E2E1C0044A77801287838A9785BEA7C4895D1F2B5D5F122D9E16FDDE0E271A7801248001129A0F499E0004A200E252A844895D212B56B68448B78038B880011CEA0F49EE0004922004962F499A2B6B9E2F49A22004A631225558CAD768C48B78801388BD2798ADAFA8BD27B88012490012593D2531E4B6BA24004A6512255594AD769448B790011C664B6BEA4F49EE4004926004966F499A6B6B9E6F49A26004A6616FAA71225749CAD759C48B6985BF79801389BD2799ADAFA9BD27B980124A001129E8F49A2800452AA05BEBA4AD564E9122D292B56B6A05BF7A0011C6A8F49EE80044A7A80128A83894AAA16F56CAC7BEDACAD6EABD597C2B179C6AF56CAB2B5674AC7BDADAA16FDEA0E271AA80127B00128B038A9B05BD52ED1EF58DB4AD6EB00117C2D1EEC6C004654B4AD75B47BF6B05BF7B038B8B00127B80128B838A9B85BEABC7BD5D2F2B5D6F1EFDAE16FDEE0E2E2E004A30004A7016FAB1122AF11EF593C4AD74C47BF5C448B6C05BF7C00113A32004A720E2AB216FAF3122593CCAD74CC48B5C85BF6C8389BE320049B40044E8D038A9D0012AD038ABD05BECD44896CB52B5CF5122D3416FD740E2DB40046F8D038B9D00125D801132760E254BD8012CD85BD6CB7122CF616F695D8011B6760E2EB60049780044C8E038A9E05BD52F80E2593E0011A5780E2DB816F6F9E038BAE00124E801129BA0E29FA16FA3A0E252AE85BEBEC48964FAF56D3B1226B6E85BF7E838B8E85BDCEBA0E2EFA00493C00497C0E29BC16F4E8F03894ABC16F56CF47BD6CBD2B5674F47BDADBC16F6F8F038B9F05BFAF038BBF00123F8011217E0E24CAF85BEBFC7BD64FF2B5D3F1EF6B7F85BF8F838B9F85BDD6FE0E2F3E004";
        }

        if (v == Fur.RED) {
            return
                hex"5B2380115B100045B2431F99D10004A9200456F4B1FB04BBB314B1FB24BBB19D12C7ED52004A5400454B531FAC53BB16BD4C7EC14EEC632531FB353BB1A554C7ED94004A1600452A5B1F95B16EEC5AE5B1FAF5BBB18456C7E6535BBB345B1FB55BBB365B1FB7580128600129631F952D8EEC58D644897458EEC6536448B463BB1AD98C7EDD80049DA0045096B1FAA6BBB2B6C7BD635B2B55D06C7BF16C48994DB2B5D1B1EF6B66BBB376B1FB8680127700128731FA973BB2A744895B5CC715D174AD5951CC71D5D122D9CEECDDCC7EE1C0044A77801287B1FA97BBB2A7C4895D1F2B5D5F122D9EEECDDEC7E71A7801248001129A0F499E0004A20C7E52A844895D212B56B68448B7831FB880011CEA0F49EE0004922004962F499A2B6B9E2F49A22004A631225558CAD768C48B78801388BD2798ADAFA8BD27B88012490012593D2531E4B6BA24004A6512255594AD769448B790011C664B6BEA4F49EE4004926004966F499A6B6B9E6F49A26004A66EECAA71225749CAD759C48B69BBB379801389BD2799ADAFA9BD27B980124A001129E8F49A2800452AA3BB2BA4AD564E9122D292B56B6A3BB37A0011C6A8F49EE80044A7A80128AB1F94AAAEEC56CAC7BEDACAD6EABD597C2B179C6AF56CAB2B5674AC7BDADAAEECDEAC7E71AA80127B00128B31FA9B3BB152ED1EF58DB4AD6EB00117C2D1EEC6C004654B4AD75B47BF6B3BB37B31FB8B00127B80128BB1FA9BBBB2ABC7BD5D2F2B5D6F1EFDAEEECDEEC7EE2E004A30004A70EECAB1122AF11EF593C4AD74C47BF5C448B6C3BB37C00113A32004A72C7EAB2EECAF3122593CCAD74CC48B5CBBB36CB1F9BE320049B40044E8D31FA9D0012AD31FABD3BB2CD44896CB52B5CF5122D34EECD74C7EDB40046F8D31FB9D00125D80113276C7E54BD8012CDBBB16CB7122CF6EEC695D8011B676C7EEB60049780044C8E31FA9E3BB152F8C7E593E0011A578C7EDB8EEC6F9E31FBAE00124E801129BAC7E9FAEECA3AC7E52AEBBB2BEC48964FAF56D3B1226B6EBBB37EB1FB8EBBB1CEBAC7EEFA00493C00497CC7E9BCEEC4E8F31F94ABCEEC56CF47BD6CBD2B5674F47BDADBCEEC6F8F31FB9F3BB3AF31FBBF00123F8011217EC7E4CAFBBB2BFC7BD64FF2B5D3F1EF6B7FBBB38FB1FB9FBBB1D6FEC7EF3E004";
        }

        if (v == Fur.BLACK) {
            return
                hex"5B2380115B100045B2423D19D10004A9200456F4A3D304A79F14A3D324A79D9D128F4D52004A5400454B523D2C5279D6BD48F4C149E7632523D335279DA5548F4D94004A1600452A5A3D15B169E75AE5A3D2F5A79D84568F46535A79F45A3D355A79F65A3D37580128600129623D152D89E758D6478574589E76536478746279DAD988F4DD80049DA0045096A3D2A6A79EB6CB45635B3F95D06CB4716C78594DB3F9D1B2D16B66A79F76A3D38680127700128723D297279EA747855B5CCC75D174FE5951CCC7D5D1E1D9C9E7DDC8F4E1C0044A77801287A3D297A79EA7C7855D1F3F9D5F1E1D9E9E7DDE8F471A7801248001129A0FF09E0004A208F452A847855D213F96B6847877823D3880011CEA0FF0EE0004922004962FF09A2BAF9E2FF0A22004A631E15558CFE768C78778801388BFC398AEBFA8BFC3B88012490012593FC131E4BAFA24004A651E155594FE7694787790011C664BAFEA4FF0EE4004926004966FF09A6BAF9E6FF0A26004A669E7AA71E15749CFE759C78769A79F79801389BFC399AEBFA9BFC3B980124A001129E8FF0A2800452AA279EBA4FE564E91E1D293F96B6A279F7A0011C6A8FF0EE80044A7A80128AA3D14AAA9E756CACB46DACFE6EABF317C2B258C6AFCCCAB3F9674ACB45ADAA9E7DEA8F471AA80127B00128B23D29B279D52ED2D158DB4FE6EB00117C2D2D2C6C004654B4FE75B4B476B279F7B23D38B00127B80128BA3D29BA79EABCB455D2F3F9D6F2D1DAE9E7DEE8F4E2E004A30004A709E7AB11E1AF12D1593C4FE74C4B475C47876C279F7C00113A32004A728F4AB29E7AF31E1593CCFE74CC7875CA79F6CA3D1BE320049B40044E8D23D29D0012AD23D2BD279ECD47856CB53F9CF51E1D349E7D748F4DB40046F8D23D39D00125D801132768F454BD8012CDA79D6CB71E1CF68F4695D8011B6768F4EB60049780044C8E23D29E279D52F88F4593E0011A5788F4DB89E76F9E23D3AE00124E801129BA8F49FA9E7A3A8F452AEA79EBEC78564FAFCCD3B1E16B6EA79F7EA3D38EA79DCEBA8F4EFA00493C00497C8F49BC9E74E8F23D14ABC9E756CF4B456CBD3F9674F4B45ADBC9E76F8F23D39F279FAF23D3BF00123F8011217E8F44CAFA79EBFCB4564FF3F9D3F2D16B7FA79F8FA3D39FA79DD6FE8F4F3E004";
        }

        if (v == Fur.BROWN) {
            return
                hex"5B2380115B100045B242DC19D10004A9200456F4ADC304B34714ADC324B3459D12B70D52004A5400454B52DC2C533456BD4B70C14CD163252DC3353345A554B70D94004A1600452A5ADC15B16CD15AE5ADC2F5B3458456B706535B34745ADC355B34765ADC3758012860012962DC152D8CD158D647857458CD165364787463345AD98B70DD80049DA0045096ADC2A6B346B6CB45635B3F95D06CB4716C78594DB3F9D1B2D16B66B34776ADC3868012770012872DC2973346A747855B5CCC75D174FE5951CCC7D5D1E1D9CCD1DDCB70E1C0044A77801287ADC297B346A7C7855D1F3F9D5F1E1D9ECD1DDEB7071A7801248001129A0FF09E0004A20B7052A847855D213F96B684787782DC3880011CEA0FF0EE0004922004962FF09A2BAF9E2FF0A22004A631E15558CFE768C78778801388BFC398AEBFA8BFC3B88012490012593FC131E4BAFA24004A651E155594FE7694787790011C664BAFEA4FF0EE4004926004966FF09A6BAF9E6FF0A26004A66CD1AA71E15749CFE759C78769B34779801389BFC399AEBFA9BFC3B980124A001129E8FF0A2800452AA3346BA4FE564E91E1D293F96B6A33477A0011C6A8FF0EE80044A7A80128AADC14AAACD156CACB46DACFE6EABF317C2B258C6AFCCCAB3F9674ACB45ADAACD1DEAB7071AA80127B00128B2DC29B334552ED2D158DB4FE6EB00117C2D2D2C6C004654B4FE75B4B476B33477B2DC38B00127B80128BADC29BB346ABCB455D2F3F9D6F2D1DAECD1DEEB70E2E004A30004A70CD1AB11E1AF12D1593C4FE74C4B475C47876C33477C00113A32004A72B70AB2CD1AF31E1593CCFE74CC7875CB3476CADC1BE320049B40044E8D2DC29D0012AD2DC2BD3346CD47856CB53F9CF51E1D34CD1D74B70DB40046F8D2DC39D00125D80113276B7054BD8012CDB3456CB71E1CF6CD1695D8011B676B70EB60049780044C8E2DC29E334552F8B70593E0011A578B70DB8CD16F9E2DC3AE00124E801129BAB709FACD1A3AB7052AEB346BEC78564FAFCCD3B1E16B6EB3477EADC38EB345CEBAB70EFA00493C00497CB709BCCD14E8F2DC14ABCCD156CF4B456CBD3F9674F4B45ADBCCD16F8F2DC39F3347AF2DC3BF00123F8011217EB704CAFB346BFCB4564FF3F9D3F2D16B7FB3478FADC39FB345D6FEB70F3E004";
        }

        if (v == Fur.SILVER) {
            return
                hex"5B2380115B100045B2445799D10004A9200456F4C57B04E21314C57B24E2119D1315ED52004A5400454B5457AC562116BD515EC158846325457B356211A55515ED94004A1600452A5C5795B178845AE5C57AF5E211845715E6535E21345C57B55E21365C57B75801286001296457952D988458D6479974598846536479B466211AD9915EDD80049DA0045096C57AA6E212B6CA8D635B3995D06CA8F16C79994DB399D1B2A36B66E21376C57B86801277001287457A976212A747995B5CCC75D174E65951CCC7D5D1E6D9D884DDD15EE1C0044A77801287C57A97E212A7C7995D1F399D5F1E6D9F884DDF15E71A7801248001129A10209E0004A2115E52A847995D213996B68479B78457B880011CEA1020EE00049220049630209A2C899E3020A22004A631E65558CE6768C79B78801388C08398B227A8C083B8801249001259408131E4C89A24004A651E655594E6769479B790011C664C89EA5020EE40049260049670209A6C899E7020A26004A67884AA71E65749CE6759C79B69E21379801389C08399B227A9C083B980124A001129E9020A2800452AA6212BA4E6564E91E6D293996B6A62137A0011C6A9020EE80044A7A80128AC5794AAB88456CACA8EDACE66EAC0B97C2B24DC6B02ECAB399674ACA8DADAB884DEB15E71AA80127B00128B457A9B621152ED2A358DB4E66EB00117C2D2A2C6C004654B4E675B4A8F6B62137B457B8B00127B80128BC57A9BE212ABCA8D5D2F399D6F2A3DAF884DEF15EE2E004A30004A71884AB11E6AF12A3593C4E674C4A8F5C479B6C62137C00113A32004A7315EAB3884AF31E6593CCE674CC79B5CE2136CC579BE320049B40044E8D457A9D0012AD457ABD6212CD47996CB5399CF51E6D35884D7515EDB40046F8D457B9D00125D8011327715E54BD8012CDE2116CB71E6CF7884695D8011B67715EEB60049780044C8E457A9E621152F915E593E0011A57915EDB98846F9E457BAE00124E801129BB15E9FB884A3B15E52AEE212BEC79964FB02ED3B1E66B6EE2137EC57B8EE211CEBB15EEFA00493C00497D15E9BD8844E8F45794ABD88456CF4A8D6CBD399674F4A8DADBD8846F8F457B9F6213AF457BBF00123F8011217F15E4CAFE212BFCA8D64FF399D3F2A36B7FE2138FC57B9FE211D6FF15EF3E004";
        }

        if (v == Fur.PURPLE) {
            return
                hex"5B2380115B100045B242AED9D10004A9200456F4AAEF04AF6B14AAEF24AF699D12ABBD52004A5400454B52AEEC52F696BD4ABBC14BDA63252AEF352F69A554ABBD94004A1600452A5AAED5B16BDA5AE5AAEEF5AF698456ABB6535AF6B45AAEF55AF6B65AAEF758012860012962AED52D8BDA58D644897458BDA6536448B462F69AD98ABBDD80049DA0045096AAEEA6AF6AB6C7BD635B2B55D06C7BF16C48994DB2B5D1B1EF6B66AF6B76AAEF868012770012872AEE972F6AA744895B5CC715D174AD5951CC71D5D122D9CBDADDCABBE1C0044A77801287AAEE97AF6AA7C4895D1F2B5D5F122D9EBDADDEABB71A7801248001129A0F499E0004A20ABB52A844895D212B56B68448B782AEF880011CEA0F49EE0004922004962F499A2B6B9E2F49A22004A631225558CAD768C48B78801388BD2798ADAFA8BD27B88012490012593D2531E4B6BA24004A6512255594AD769448B790011C664B6BEA4F49EE4004926004966F499A6B6B9E6F49A26004A66BDAAA71225749CAD759C48B69AF6B79801389BD2799ADAFA9BD27B980124A001129E8F49A2800452AA2F6ABA4AD564E9122D292B56B6A2F6B7A0011C6A8F49EE80044A7A80128AAAED4AAABDA56CAC7BEDACAD6EABD597C2B179C6AF56CAB2B5674AC7BDADAABDADEAABB71AA80127B00128B2AEE9B2F6952ED1EF58DB4AD6EB00117C2D1EEC6C004654B4AD75B47BF6B2F6B7B2AEF8B00127B80128BAAEE9BAF6AABC7BD5D2F2B5D6F1EFDAEBDADEEABBE2E004A30004A70BDAAB1122AF11EF593C4AD74C47BF5C448B6C2F6B7C00113A32004A72ABBAB2BDAAF3122593CCAD74CC48B5CAF6B6CAAEDBE320049B40044E8D2AEE9D0012AD2AEEBD2F6ACD44896CB52B5CF5122D34BDAD74ABBDB40046F8D2AEF9D00125D80113276ABB54BD8012CDAF696CB7122CF6BDA695D8011B676ABBEB60049780044C8E2AEE9E2F6952F8ABB593E0011A578ABBDB8BDA6F9E2AEFAE00124E801129BAABB9FABDAA3AABB52AEAF6ABEC48964FAF56D3B1226B6EAF6B7EAAEF8EAF69CEBAABBEFA00493C00497CABB9BCBDA4E8F2AED4ABCBDA56CF47BD6CBD2B5674F47BDADBCBDA6F8F2AEF9F2F6BAF2AEFBF00123F8011217EABB4CAFAF6ABFC7BD64FF2B5D3F1EF6B7FAF6B8FAAEF9FAF69D6FEABBF3E004";
        }

        if (v == Fur.PINK) {
            return
                hex"5B2380115B100045B243E3D9D10004A9200456F4BE3F04C80B14BE3F24C8099D12F8FD52004A5400454B53E3EC548096BD4F8FC1520263253E3F354809A554F8FD94004A1600452A5BE3D5B172025AE5BE3EF5C8098456F8F6535C80B45BE3F55C80B65BE3F758012860012963E3D52D920258D64BAD745920265364BAF464809AD98F8FDD80049DA0045096BE3EA6C80AB6CEA5635B4635D06CEA716CBAD94DB463D1B3A96B66C80B76BE3F868012770012873E3E97480AA74BAD5B5CEF45D17518D951CEF4D5D2EBD9D202DDCF8FE1C0044A77801287BE3E97C80AA7CBAD5D1F463D5F2EBD9F202DDEF8F71A7801248001129A11999E0004A20F8F52A84BAD5D214636B684BAF783E3F880011CEA1199EE00049220049631999A2DE19E3199A22004A632EB5558D18F68CBAF78801388C66798B787A8C667B8801249001259466531E4DE1A24004A652EB5559518F694BAF790011C664DE1EA5199EE40049260049671999A6DE19E7199A26004A67202AA72EB5749D18F59CBAF69C80B79801389C66799B787A9C667B980124A001129E9199A2800452AA480ABA518D64E92EBD294636B6A480B7A0011C6A9199EE80044A7A80128ABE3D4AAB20256CACEA6DAD18EEAC6157C2B355C6B185CAB463674ACEA5ADAB202DEAF8F71AA80127B00128B3E3E9B480952ED3A958DB518EEB00117C2D3AAC6C004654B518F5B4EA76B480B7B3E3F8B00127B80128BBE3E9BC80AABCEA55D2F463D6F3A9DAF202DEEF8FE2E004A30004A71202AB12EBAF13A9593C518F4C4EA75C4BAF6C480B7C00113A32004A72F8FAB3202AF32EB593CD18F4CCBAF5CC80B6CBE3DBE320049B40044E8D3E3E9D0012AD3E3EBD480ACD4BAD6CB5463CF52EBD35202D74F8FDB40046F8D3E3F9D00125D80113276F8F54BD8012CDC8096CB72EBCF7202695D8011B676F8FEB60049780044C8E3E3E9E480952F8F8F593E0011A578F8FDB92026F9E3E3FAE00124E801129BAF8F9FB202A3AF8F52AEC80ABECBAD64FB185D3B2EB6B6EC80B7EBE3F8EC809CEBAF8FEFA00493C00497CF8F9BD2024E8F3E3D4ABD20256CF4EA56CBD463674F4EA5ADBD2026F8F3E3F9F480BAF3E3FBF00123F8011217EF8F4CAFC80ABFCEA564FF463D3F3A96B7FC80B8FBE3F9FC809D6FEF8FF3E004";
        }

        if (v == Fur.SEANCE) {
            return
                hex"5B2380115B100045B242AED9D10004A9200456F4AAEF04AF6B14AAEF24AF699D12ABBD52004A5400454B52AEEC52F696BD4ABBC14BDA63252AEF352F69A554ABBD94004A1600452A5AAED5B16BDA5AE5AAEEF5AF698456ABB6535AF6B45AAEF55AF6B65AAEF758012860012962AED52D8BDA58D63D197458BDA65363D1B462F69AD98ABBDD80049DA0045096AAEEA6AF6AB6C121635B1BE5D06C12316BD1994DB1BED1B0486B66AF6B76AAEF868012770012872AEE972F6AA73D195B5CC3A5D1746F9951CC3AD5CF46D9CBDADDCABBE1C0044A77801287AAEE97AF6AA7BD195D1F1BED5EF46D9EBDADDEABB71A7801248001129A0EBB9E0004A20ABB52A83D195D211BE6B683D1B782AEF880011CEA0EBBEE0004922004962EBB9A2B239E2EBBA22004A62F465558C6FB68BD1B78801388BAEF98AC8FA8BAEFB88012490012593AED31E4B23A24004A64F46555946FB693D1B790011C664B23EA4EBBEE4004926004966EBB9A6B239E6EBBA26004A66BDAAA6F465749C6FB59BD1B69AF6B79801389BAEF99AC8FA9BAEFB980124A001129E8EBBA2800452AA2F6ABA46F964E8F46D291BE6B6A2F6B7A0011C6A8EBBEE80044A7A80128AAAED4AAABDA56CAC122DAC6FAEAB4957C2AFB5C6AD25CAB1BE674AC121ADAABDADEAABB71AA80127B00128B2AEE9B2F6952ED04858DB46FAEB00117C2D03BC6C004654B46FB5B41236B2F6B7B2AEF8B00127B80128BAAEE9BAF6AABC1215D2F1BED6F048DAEBDADEEABBE2E004A30004A70BDAAB0F46AF1048593C46FB4C41235C3D1B6C2F6B7C00113A32004A72ABBAB2BDAAF2F46593CC6FB4CBD1B5CAF6B6CAAEDBE320049B40044E8D2AEE9D0012AD2AEEBD2F6ACD3D196CB51BECF4F46D34BDAD74ABBDB40046F8D2AEF9D00125D80113276ABB54BD8012CDAF696CB6F46CF6BDA695D8011B676ABBEB60049780044C8E2AEE9E2F6952F8ABB593E0011A578ABBDB8BDA6F9E2AEFAE00124E801129BAABB9FABDAA3AABB52AEAF6ABEBD1964FAD25D3AF466B6EAF6B7EAAEF8EAF69CEBAABBEFA00493C00497CABB9BCBDA4E8F2AED4ABCBDA56CF41216CBD1BE674F4121ADBCBDA6F8F2AEF9F2F6BAF2AEFBF00123F8011217EABB4CAFAF6ABFC12164FF1BED3F0486B7FAF6B8FAAEF9FAF69D6FEABBF3E004";
        }

        if (v == Fur.TURQUOISE) {
            return
                hex"5B2380115B100045B2404619D10004A9200456F484630488171484632488159D12118D52004A5400454B50462C508156BD4118C1420563250463350815A554118D94004A1600452A584615B162055AE58462F5881584561186535881745846355881765846375801286001296046152D820558D64791745820565364793460815AD98118DD80049DA00450968462A68816B6CB5D635B3FC5D06CB5F16C79194DB3FCD1B2D76B668817768463868012770012870462970816A747915B5CCCA5D174FF1951CCCAD5D1E4D9C205DDC118E1C0044A778012878462978816A7C7915D1F3FCD5F1E4D9E205DDE11871A7801248001129A0FF39E0004A2011852A847915D213FC6B684793780463880011CEA0FF3EE0004922004962FF39A2BB29E2FF3A22004A631E45558CFF368C79378801388BFCF98AECBA8BFCFB88012490012593FCD31E4BB2A24004A651E455594FF3694793790011C664BB2EA4FF3EE4004926004966FF39A6BB29E6FF3A26004A66205AA71E45749CFF359C79369881779801389BFCF99AECBA9BFCFB980124A001129E8FF3A2800452AA0816BA4FF164E91E4D293FC6B6A08177A0011C6A8FF3EE80044A7A80128A84614AAA20556CACB5EDACFF2EABF3D7C2B25BC6AFCFCAB3FC674ACB5DADAA205DEA11871AA80127B00128B04629B081552ED2D758DB4FF2EB00117C2D2D8C6C004654B4FF35B4B5F6B08177B04638B00127B80128B84629B8816ABCB5D5D2F3FCD6F2D7DAE205DEE118E2E004A30004A70205AB11E4AF12D7593C4FF34C4B5F5C47936C08177C00113A32004A72118AB2205AF31E4593CCFF34CC7935C88176C8461BE320049B40044E8D04629D0012AD0462BD0816CD47916CB53FCCF51E4D34205D74118DB40046F8D04639D00125D8011327611854BD8012CD88156CB71E4CF6205695D8011B676118EB60049780044C8E04629E081552F8118593E0011A578118DB82056F9E0463AE00124E801129BA1189FA205A3A11852AE8816BEC79164FAFCFD3B1E46B6E88177E84638E8815CEBA118EFA00493C00497C1189BC2054E8F04614ABC20556CF4B5D6CBD3FC674F4B5DADBC2056F8F04639F0817AF0463BF00123F8011217E1184CAF8816BFCB5D64FF3FCD3F2D76B7F88178F84639F8815D6FE118F3E004";
        }

        if (v == Fur.CRIMSON) {
            return
                hex"5B2380115B100045B242C019D10004A9200456F4AC0304B13314AC0324B1319D12B00D52004A5400454B52C02C531316BD4B00C14C4C63252C03353131A554B00D94004A1600452A5AC015B16C4C5AE5AC02F5B1318456B006535B13345AC0355B13365AC03758012860012962C0152D8C4C58D6300D7458C4C6536300F463131AD98B00DD80049DA0045096AC02A6B132B6B199635ACED5D06B19B16B00D94DACEDD1AC666B66B13376AC03868012770012872C02973132A7300D5B5CA7D5D1733B5951CA7DD5CC03D9CC4CDDCB00E1C0044A77801287AC0297B132A7B00D5D1ECEDD5EC03D9EC4CDDEB0071A7801248001129A0BAA9E0004A20B0052A8300D5D20CED6B68300F782C03880011CEA0BAAEE0004922004962BAA9A29D09E2BAAA22004A62C035558B3B768B00F78801388AEAB98A743A8AEABB88012490012592EA931E49D0A24004A64C03555933B769300F790011C6649D0EA4BAAEE4004926004966BAA9A69D09E6BAAA26004A66C4CAA6C035749B3B759B00F69B13379801389AEAB99A743A9AEABB980124A001129E8BAAA2800452AA3132BA33B564E8C03D28CED6B6A31337A0011C6A8BAAEE80044A7A80128AAC014AAAC4C56CAB19ADAB3B6EAAC117C2AC3CC6AB04CAACED674AB199ADAAC4CDEAB0071AA80127B00128B2C029B313152ECC6658DB33B6EB00117C2CC65C6C004654B33B75B319B6B31337B2C038B00127B80128BAC029BB132ABB1995D2ECEDD6EC66DAEC4CDEEB00E2E004A30004A70C4CAB0C03AF0C66593C33B74C319B5C300F6C31337C00113A32004A72B00AB2C4CAF2C03593CB3B74CB00F5CB1336CAC01BE320049B40044E8D2C029D0012AD2C02BD3132CD300D6CB4CEDCF4C03D34C4CD74B00DB40046F8D2C039D00125D80113276B0054BD8012CDB1316CB6C03CF6C4C695D8011B676B00EB60049780044C8E2C029E313152F8B00593E0011A578B00DB8C4C6F9E2C03AE00124E801129BAB009FAC4CA3AB0052AEB132BEB00D64FAB04D3AC036B6EB1337EAC038EB131CEBAB00EFA00493C00497CB009BCC4C4E8F2C014ABCC4C56CF31996CBCCED674F3199ADBCC4C6F8F2C039F3133AF2C03BF00123F8011217EB004CAFB132BFB19964FECEDD3EC666B7FB1338FAC039FB131D6FEB00F3E004";
        }

        if (v == Fur.GREENYELLOW) {
            return
                hex"5B2380115B100045B24052D9D10004A9200456F4852F0489EF14852F2489ED9D1214BD52004A5400454B5052EC509ED6BD414BC1427B6325052F3509EDA55414BD94004A1600452A5852D5B1627B5AE5852EF589ED845614B653589EF45852F5589EF65852F75801286001296052D52D827B58D6610D745827B6536610F4609EDAD9814BDD80049DA0045096852EA689EEB6E1E1635B87D5D06E1E316E10D94DB87DD1B8786B6689EF76852F86801277001287052E9709EEA7610D5B5CFE45D1761F5951CFE4D5D843D9C27BDDC14BE1C0044A77801287852E9789EEA7E10D5D1F87DD5F843D9E27BDDE14B71A7801248001129A187C9E0004A2014B52A8610D5D2187D6B68610F78052F880011CEA187CEE000492200496387C9A2DB39E387CA22004A638435558E1F768E10F78801388E1F398B6CFA8E1F3B880124900125961F131E4DB3A24004A65843555961F769610F790011C664DB3EA587CEE400492600496787C9A6DB39E787CA26004A6627BAA78435749E1F759E10F6989EF79801389E1F399B6CFA9E1F3B980124A001129E987CA2800452AA09EEBA61F564E9843D2987D6B6A09EF7A0011C6A987CEE80044A7A80128A852D4AAA27B56CAE1E2DAE1F6EADF157C2B856C6B7C5CAB87D674AE1E1ADAA27BDEA14B71AA80127B00128B052E9B09ED52ED87858DB61F6EB00117C2D874C6C004654B61F75B61E36B09EF7B052F8B00127B80128B852E9B89EEABE1E15D2F87DD6F878DAE27BDEE14BE2E004A30004A7027BAB1843AF1878593C61F74C61E35C610F6C09EF7C00113A32004A7214BAB227BAF3843593CE1F74CE10F5C89EF6C852DBE320049B40044E8D052E9D0012AD052EBD09EECD610D6CB587DCF5843D3427BD7414BDB40046F8D052F9D00125D8011327614B54BD8012CD89ED6CB7843CF627B695D8011B67614BEB60049780044C8E052E9E09ED52F814B593E0011A57814BDB827B6F9E052FAE00124E801129BA14B9FA27BA3A14B52AE89EEBEE10D64FB7C5D3B8436B6E89EF7E852F8E89EDCEBA14BEFA00493C00497C14B9BC27B4E8F052D4ABC27B56CF61E16CBD87D674F61E1ADBC27B6F8F052F9F09EFAF052FBF00123F8011217E14B4CAF89EEBFE1E164FF87DD3F8786B7F89EF8F852F9F89EDD6FE14BF3E004";
        }

        if (v == Fur.GOLD) {
            return
                hex"5B2380115B10004B518515D1461EB2461459D10004A92004AD387AB13851B53129B93788BD38516124C4A734E14744E1EB548012950012A561E95B15129B55788B958515F1544A594D5788D15851D5587AD94004A16004A5785154B5C4A6C5DE22D5E14574171296325DE219D17851D57788D97851DD6004A18004A59851A99129AD978858D65F5973D912961165E2194D97D669565E2366614776001276801286E14696C4A6A6DE22B6E0CD635B851B9B833BDB87AC1B833C5B7D6C9B8516746E1E9AD9B129DDB851E1A0049DC004A1D851A5D788A9D7D6ADD129B1D788B5D129B9D87A5F1761472744A7375E234744A7575F5B6744A777614787001129DE004A1F851A5F129A9F7D656D78011741F851C5F87A6547801357DF5B67DE2377E145C69E0049200044A6861EA7800128861454AA17D6AE1851B2187A5AF8614584A187A67486145ADA17D6DE1851E2000473A861EBB8001248801258E1EA68B08678E1EA88801298DF5AA8E146B8E1E963A38515F18E1E99523851D6387ADA37D6DE2004E2387AE62C21EA387AEE200492400496582D4C793086890012995F5AA961E95B658515D0961E98CE5851D2587AD65851DA57D6DE400471993087A960B7B9001249801259E0B669B08679E0B689801299DE22A9DF595B278515AF9E1E984A7851CE787AD27851D677D6DA7788DE6004E2782DE66C21EA782DEE6004928004968D3C9A982D9E8D3CA28004A69129AA9788AE9851593A5F5B4A61475A5E236A44A77A00138A34F39A60B7AA34F3BA001129EA004509AC4A6AADE22BAE0CD636B87ABAB7885F0ADFE31ADE232AE1459D2B833D6B7886D7AC4A5C6AA0049EC004A2D129A6D788AAD83356CB61EADB6146EB00117C2D82EC6C004653B61474B61EB5B60CF6B5E237B44A78B00127B80128BC4A69BDE2152EF87A58EBE146FBE1E984AF851674BE1EB5BE0CF6BDE237BC4A78B80128C00129C5E22AC5F5ABC60CD6371851BB187A5F1C614594F187AD31833D717D6DB1788DF00044E8C80129CC4A6ACDE22BCDF5ACCE146DCE1E97433851632CE1EB3CE1474CDF5B5CDE236CC4A5BE320049B40044E8D61EA9D0012AD44A6BD5E22CD5F596BF5851611D61EB2D61473D5F5B4D5E235D44A76D0011BE3587AE740049760049B787A4E8DDE229DC4A552F6004B377885B2DDF5B3DDE21A576004DB71296F8DDE239DE1EBAD80125E00126E61467E5E214279129AB9851AF9788593E00134E5E235E44A5B5F9788719E6147AE00124E80125EE1466EDE213A3B129A7B851ABB129AFAFEFB3B788B7B851BBB1295F0EDE231EC4A72EE1473EDE234EBFBF5EC4A76EDE21BE3B851E7B129EBB851EFA00493C00497D8514C7F44A68F61454ABD788574F44A75F5E21B5FD851719F44A7AF6147BF00123F80124FE14529BF1299FF851509FDE22AFC4A6BFE0CECFE1456BBF87A5F0FE1458CFF87AD3F833D7F129DBF8516F8FC4A79FDE23AFC4A7BFE147CF8010";
        }

        if (v == Fur.DIAMOND) {
            return
                hex"5B2380115B10004B50EEB5D146213243BAD9D10004A92004AD3884B12EEBB52257B92406BD2EEB6124895F34BBAF44E213548012950012A562115B14257B54406B94EEB5F15095D94D4406D14EEBD55884D94004A16004A56EEB54B5895EC5901AD5BBAD7416257632590199D16EEBD56406D96EEBDD6004A18004A58EEBA98257AD840658D61DED73D82576116101994D877B6956101B663BAF76001276801286BBAE96895EA6901AB6B4A9635AEEBB9AD2ABDB884C1AD2AC5A77BC9AEEB6746E211AD9A257DDAEEBE1A0049DC004A1CEEBA5C406A9C77BADC257B1C406B5C257B9D8845F173BAF27095F37101B47095F571DEF67095F773BAF87001129DE004A1EEEBA5E257A9E77B56D78011741EEEBC5F88465478013579DEF67901B77BBADC69E0049200044A686212780012883BAD4AA077BAE0EEBB218845AF83BAD84A188467483BADADA077BDE0EEBE2000473A86213B8001248801258E21268826278E212888012989DEEA8BBAEB8E21163A2EEB5F18E2119522EEBD63884DA277BDE2004E23884E62098EA3884EE20049240049644D54C790262890012991DEEA962115B64EEB5D0962118CE4EEBD25884D64EEBDA477BDE400471990263A91357B9001249801259935669826279935689801299901AA99DED5B26EEB5AF9E21184A6EEBCE7884D26EEBD6677BDA6406DE6004E264D5E66098EA64D5EE600492800496810F9A84D59E810FA28004A68257AA8406AE8EEB593A1DEF4A3BAF5A101B6A095F7A00138A043F9A1357AA043FBA001129EA004509A895EAA901ABAB4A9636B884BAA4065F0A9D4B1A901B2ABBAD9D2AD2AD6A4066D7A895DC6AA0049EC004A2C257A6C406AACD2A56CB6212DB3BAEEB00117C2CD2AC6C004653B3BAF4B62135B34AB6B101B7B095F8B00127B80128B895E9B901952EF88458EBBBAEFBE21184AEEEB674BE2135BB4AB6B901B7B895F8B80128C00129C101AAC1DEEBC34A96370EEBBB18845F1C3BAD94F1884D30D2AD7077BDB0406DF00044E8C80129C895EAC901ABC9DEECCBBAEDCE2117432EEB632CE2133CBBAF4C9DEF5C901B6C895DBE320049B40044E8D62129D0012AD095EBD101ACD1DED6BF4EEB611D62132D3BAF3D1DEF4D101B5D095F6D0011BE35884E740049760049B78844E8D901A9D895D52F6004B364065B2D9DEF3D9019A576004DB62576F8D901B9DE213AD80125E00126E3BAE7E10194278257AB8EEBAF8406593E00134E101B5E095DB5F8406719E3BAFAE00124E80125EBBAE6E90193A3A257A7AEEBABA257AFA188B3A406B7AEEBBBA2575F0E901B1E895F2EBBAF3E901B4E86235E895F6E9019BE3AEEBE7A257EBAEEBEFA00493C00497CEEB4C7F095E8F3BAD4ABC406574F095F5F1019B5FCEEB719F095FAF3BAFBF00123F80124FBBAD29BE2579FEEEB509F901AAF895EBFB4AACFBBAD6BBF8845F0FBBAD8CFF884D3ED2AD7E257DBEEEB6F8F895F9F901BAF895FBFBBAFCF8010";
        }

        if (v == Fur.METALLIC) {
            return
                hex"5B2380115B10004B509EFB90B7A5F04360B142DEB24281D9D10004A92004AD2B7AB129EFB528AFB92A19BD2C51C12BE16324A2BF34A7BF44ADEB548012950012A52DEAB5269AC522BED52866E527BD7C548AF653528674527BF552DEB65001285801295A7BD52D68AFB16A19B569EF5D05A2BD8C96A196745A7BF55A86765A7BF7580128600129627BEA622BEB628656358E7A5CF622BD8458A19653639E9A558A19D989EFDD80049DA004A1A9EFA5A8AFA9AA19ADB17A58D6C8B6E6C5EAF6E21306C5EB16B9EB26C8B59D1B8846B66A2BF76A7BF8680127700128727BE972866A739EAB722BEC72866D722BEE762117C5D22DC9C8AFCDCA19D1C8AFD5CE7AD9C8AFDDC9EFE1C0044A77801287A7BE97A2BEA7B9E95B5EEE95D07C8B717E211951EEE9D5EE7AD9EA19DDE9EF71A7801248001129A100E9E0004A209EF52A839EAB848B6C862116BE122D612862119D2122D6B6839EB7827BF880011CEA100EEE0004922004962CD29A28C19E2CD2A22004A62E7AAA322DAE388458E8C8B57C638846548C8B758E21368B9EB78801388B34B98A307A8B34BB88012490012592D1131E48C1A24004A64E7AAA588456D948B57425884633948B74962135948B76939EB790011C6648C1EA4B44EE4004926004966B449A68C19E6B44A26004A66A19AA6E7A56C9C8B56BE78846129C8B739E21349C8B759B9EB69A86779801389AD1399A307A9AD13B980124A00125A262E6A2D127A262E8A00129A22BEAA2866BA48B564E8E7AD2922DD68A19DA88AFDE8004E2898BE68B44EA898BEE80044A7A8011426A8AFAAAA19AEAF0F58DAE212EAA8657C2ABEAC6AA19CAB22DCEB17AD2AF0FD6AA196D7AA2BDC6AA0049EC004A2C8AFA6CA19AAD17A56CB6212DB48B6EB00117C2D17AC6C004653B48B74B62135B45EB6B28677B22BF8B00127B80128BA2BE9BA86552EF88458EBC8B6FBE21184AF22D674BE2135BC5EB6BA8677BA2BF8B80128C00129C2866AC39EABC45E9637122DBB18845F1C48B594F1884D3117AD70E7ADB0A19DF00044E8C80129CA2BEACA866BCB9EACCC8B6DCE211743322D632CE2133CC8B74CB9EB5CA8676CA2BDBE320049B40044E8D403A9D204AAD22BEBD2866CD39E96BF522D611D62132D48B73D39EB4D28675D22BF6D0011BE3500EE740049760044C8DC03A9DB34952F6004B36A195B2DB9EB3DA865A576004DB6CD26F9DC03BAD80125E00126E40393A78CD2AB88AFAF8A19593E00134E28675E22BDB638CD2E7900EEB800493A00497B00E4C8EB3494ABA8AFAFA875B3AA19B7A9EFBBA8AF5F0EA8671EA2BF2EA7BF3EA8674EA1D5ADBA8AF6F9EB34BAEC03BBE80124F00125F27BD323C8AF52AF28655D3C8AFD7CA19DBC9EF6F9F22BFAF27BFBF00123F801121FEBBFA3E8AFA7EA19ABE8AFAFEC7BB3EA7A5AEFB3497C3EA7AC7ECD2CBEBCECFECD2D3EE57D7E8AFDBE9EFDFE8AF71BFAEFFCF8010";
        }

        if (v == Fur.MAGENTA) {
            return
                hex"5B2380115B100045B2431FD9D10004A9200456F4B1FF04BBB714B1FF24BBB59D12C7FD52004A5400454B531FEC53BB56BD4C7FC14EED632531FF353BB5A554C7FD94004A1600452A5B1FD5B16EED5AE5B1FEF5BBB58456C7F6535BBB745B1FF55BBB765B1FF7580128600129631FD52D8EED58D647897458EED6536478B463BB5AD98C7FDD80049DA0045096B1FEA6BBB6B6CB4D635B3FA5D06CB4F16C78994DB3FAD1B2D36B66BBB776B1FF8680127700128731FE973BB6A747895B5CCC85D174FE9951CCC8D5D1E2D9CEEDDDCC7FE1C0044A77801287B1FE97BBB6A7C7895D1F3FAD5F1E2D9EEEDDDEC7F71A7801248001129A0FF19E0004A20C7F52A847895D213FA6B68478B7831FF880011CEA0FF1EE0004922004962FF19A2BB09E2FF1A22004A631E25558CFEB68C78B78801388BFC798AEC3A8BFC7B88012490012593FC531E4BB0A24004A651E255594FEB69478B790011C664BB0EA4FF1EE4004926004966FF19A6BB09E6FF1A26004A66EEDAA71E25749CFEB59C78B69BBB779801389BFC799AEC3A9BFC7B980124A001129E8FF1A2800452AA3BB6BA4FE964E91E2D293FA6B6A3BB77A0011C6A8FF1EE80044A7A80128AB1FD4AAAEED56CACB4EDACFEAEABF357C2B259C6AFCDCAB3FA674ACB4DADAAEEDDEAC7F71AA80127B00128B31FE9B3BB552ED2D358DB4FEAEB00117C2D2D4C6C004654B4FEB5B4B4F6B3BB77B31FF8B00127B80128BB1FE9BBBB6ABCB4D5D2F3FAD6F2D3DAEEEDDEEC7FE2E004A30004A70EEDAB11E2AF12D3593C4FEB4C4B4F5C478B6C3BB77C00113A32004A72C7FAB2EEDAF31E2593CCFEB4CC78B5CBBB76CB1FDBE320049B40044E8D31FE9D0012AD31FEBD3BB6CD47896CB53FACF51E2D34EEDD74C7FDB40046F8D31FF9D00125D80113276C7F54BD8012CDBBB56CB71E2CF6E5D695D8011B676C7FEB60049780044C8E31FE9E3BB552F8C7F593E0011A578C7FDB8EED6F9E31FFAE00124E801129BAC7F9FAEEDA3AC7F52AEBBB6BEC78964FAFCDD3B1E26B6EBBB77EB1FF8EBBB5CEBAC7FEFA00493C00497CC7F9BCEED4E8F31FD4ABCEED56CF4B4D6CBD3FA674F4B4DADBCEED6F8F31FF9F3BB7AF31FFBF00123F8011217EC7F4CAFBBB6BFCB4D64FF3FAD3F2D36B7FBBB78FB1FF9FBBB5D6FEC7FF3E004";
        }
        revert("invalid fur");
    }
}

library HeadSprites {
    function getSprite(Head v) external pure returns (bytes memory) {
        if (v == Head.NONE) {
            return hex"";
        }

        if (v == Head.ENERGY_FIELD) {
            return
                hex"8C357690357794357998357A4E80D5EE90D5EAA0D5E6B0D5DF30D5DB40D5DF50D5EF60D5F5BE0357EE4357CE83579EC3578F035768C557890557B94557E9855824E81560E915606A155F6B155EAC155DF2155DF3155E74155F351560761561B71562381561F915613A15607B155EBC155E211D5DA21D5E231D5EE41D5FE51D61E61D63271D64681D64291D62EA1D616B1D5FEC1D5E6D1D5DB21D5E731D5F341D60F51D62F61D655BE07599E47592E87589EC7582F0757BF47578F875768495768895788C957E9095869495919895B14E82568692566AA2563AB25612C255F16C895B1CC9581D0958BD4959AD895A5DC95A9E095A8E495B1E89596EC9588F09580F49579F8957684B57788B57B8CB58190B58C94B59B4C72D6C682D6AE92D69AA2D6655B0B5B1B4B579B8B577C0B576C4B5776742D6C752D69762D6B772D6B9C64B5B1E8B59FECB58DF0B582F4B57BF8B57684D57788D57B8CD58490D59094D5A198D5B19CD884A0D5B1A4D5AAA8D59FACD58DB0D581B4D57AB8D577C0D576C4D577C8D57DCCD588D0D598D4D5A8D8D5AEDCD5B1E0D884E4D5B1E8D5A5ECD593F0D585F4D57CF8D57684F57788F57B8CF58390F58F94F5A098F5AC9CF5B1A0F884A4F5B1A8F59DACF58DB0F580B4F57AB8F577C4F577C8F57CCCF587D0F596D4F5A7D8F5B1DCF884E0F5B1E4F5ADE8F5A3ECF591F0F583F4F57CF8F57885157789157A8D158191158B95159A9915A64E9456C6A4565EB45626C455FED455E6E455DB0455DB1455DF2455EF345617445643545685B6115B1E515A8E9159CED158BF11581F5157AF915768535768935788D357D91358595358E9935999D359FA1359DA53597A9358CAD3583B1357CB53577B93576C53576C9357ACD357FD13588D53594D9359EDD35A4E135A2E5359BE9358FED3586F1357EF535798955778D557991557E9555B199558A4E855632955626A55612B555F6C555E2D555DB1555DB2555DF3555EB45560755561F65563375564385564795562FA556C7B555FBC555E7D555DA25D5DA35D5E245D6C655D5F665D60275D60A85D60695D5FEA5D5EEB5D5E6C5D5DF25D5DB35D5DF45D5EF55D5FF65D60B75D60F85D60B95D603A5D5FBB5D6C7C5D5E3D5D5DA3655DA4656C65655E5325957AA99578AD9576674655DB5655E5B5D957B719655E7A655E3B656C7C655DA56D5D9325B57754B6D5DB56D5DDB65B576EDB576";
        }

        if (v == Head.BLUE_TOP_HAT) {
            return
                hex"555220BD554A82F536320BD4D8E82F536420BD4D9282F536520BD4D9682F489620BEA60FF2B62012C60FF2D62012E60FF2F62013060FF3162013260FF3362013460FF3562011B6D882F48A6A0BEB6A11D66DA82F4BA720BD4D9E82F0";
        }

        if (v == Head.RED_TOP_HAT) {
            return
                hex"555220BD554A82F536320BD4D8E82F536420BD4D9282F536520BD4D9682F489620BD5558EEC6DB620BD26DA82F4BA720BD4D9E82F0";
        }

        if (v == Head.ENERGY_CRYSTAL) {
            return
                hex"56C300117C0C00467430012B38012C3C4956B8E0045F03E2118C8E004CCF125D0E004B10004B5041DB90803BD18846114200F241077340012B48012C483456B9241D5F04A00D8C9241DCD20D1D12004B14004B540D15D151077250347350012D58012E583457C1641DC560D1C96004B980045F0603471600117C1A0040";
        }

        if (v == Head.CROWN) {
            return
                hex"A4A004B0A0045F0280133280136280114ACC004B0CBCA5AE30012F340F30361E58C8C004CCCBCA69630012938012A3C9AAB38012C3AF2AD3801173CF03CC0F879C4F26AC8E004CCEBCAD0E004D4F26AD8E004A50004A90B9AAD1879B100045AE440F2F42E6B0402DD8C9126ACD0004D11879D50B9AD9000452A480115B138795AE4C0F2F482DF04AE698C9326ACD303CD138796B648012950012A549A95B158795AE540F17C14004632549AB3540F34561E75549AB650012958012A5B18D5B178795AF5C0F305E1E58C9726ACD703CD17879D56C63D96004A9800456C634056BD8BDCC18D016326318F362F734634075600115D1A004";
        }

        if (v == Head.BANDANA) {
            return
                hex"574500114A96004AD6ED25935CCD745BB49AD96004A18004A58C6F54B63B4964D933569563B4B6631BDBE180049DA0045096B1BD531AED25B26CCD59D5AED26D76B1BF868012770011425CC6FA9CED257470013573B49B5DCC6FE1C0049DE004A1EC6F52A78011AD9E004DDEC6FE1E0044E880011BE200049AA004A2A0049AC0049ECC6FA2C0049AE0049EEC6FA2E0049B00049F0C6FA300049B20049F2ED2A320049F4004A34ED2A740049F6004A37335A760049B80049F9335A38004A78ED2AB80049BA0049FB335A3A004A7B335ABA0049BC0049FD33550AF001131FE0040";
        }

        if (v == Head.BUCKET_HAT) {
            return
                hex"574320BEA3A0BD5B4E04C5D138195950E04CD4E82FA5082F54C401316B900655F04024D8C90065675401336420BE94A0BD52D204C58D48196E4824EF48ACF049D5F14824D94D20656954813364A0BE8520BD4AD404C58D50196E5024EF51D5F050ACF15024D94D4065696501337520BE85A0BE958131555682FD9604CDD682F4E9620BD555804C6D8620BD31DA82FA1A04C52A681955D1A0936B668197768131C65A82F95C82F4C7701328701954A9C093574720BDAD9C093DDC06571970133A720BD2A9E82F6BA7A0BC";
        }

        if (v == Head.HOMBURG_HAT) {
            return
                hex"574220BEA2A0BD5B0A87C5B42A3AF52A0BE9320BD554C87CD8C82FA4E82F5553A1F363A0BE9420BD52D087C593423ADA55087CD9082FA5282F54B4A1F164D28EB6954A1F364A0BE9520BD52D487C593523ADA55487CD9482FA568CAA9684B5735A20B45AB6F55A12F65A329225882FA988CAAD89C659262B6F36075F461D5F562B6DB6D882F4436A0BD225A8EB5536A0BF46AB6F56A0BDB6DA8EB79D6A0BD121C82F536723ADBF5C82F5367A0BC0";
        }

        if (v == Head.PROPELLER_HAT) {
            return
                hex"B06004B4606DB860AABC604BC06004C4604BC860AACC606DD060045B3200130280116C8C00456C38012D381C6E382A97C0F4C8C4F7D5C8EF9967438012A40012B400E2C401C6D402A974514C8C917D5CD0F99D10B92D50004A52004A92038AD207158D482A974534C86534DF5744BE6754AE4B64801295001152D4071B140AA5B255323355F55A554F99D94004A16004A5603854C581C56C9715F6755BE6765AE4B7580128600114B180385B2630619D98B92DD8004517680100";
        }

        if (v == Head.HEADBAND) {
            return
                hex"5B2480115B140045AF55D7B055F318C9575E67450012A58012B5B5ED63570F8B9775EBD70F86135B5EF45C3E3558012960012A635EEB643E2C65F316C9975ECD97CCD190F8D58BDBD98004A1A004A5AD7B54B6C3E1641AD7B6326C3E336B5EF46AF6F56C3E366AAC77680127700128735EE973E0552DCD7BB1D0F85AE75D7AF75F31849D75E674743E35735EF6743BF772F6F870012778011425EBDBA9F0F85747801357C3E1B5DED7BE1E0049E0004A20D7B52A80011ADA0004DE0D7BE200044E888011BE220040";
        }

        if (v == Head.DORAG) {
            return
                hex"5B2380116C9027D56C489F56C924F2674489F552D427D593513C9A55427DA56148555589F76585229602F952D8148593613C9A558148D980BEA1A0BEA5A14854B689F564DA4F2695689F76685237682FA770011425C148555709F5B5DC148E1C0049DE00450978522A789F55D1E004D5E27D6D7785238780127800128805214AA00046B6800137805238800113A220046F8880126A80128A80126B00127B05228B00126B80127B85228B80126C00127C05228C00126C80127C89F68C80127D00128D09F67D80128D93CA9D80126E00127E13CA8E00129E09F6AE00126E80127E93CA8E80129E93CAAE80126F00127F13C942BC0044C7F80100";
        }

        if (v == Head.PURPLE_COWBOY_HAT) {
            return
                hex"58E180118CC6004AC8004B08B0C5AE231417C0800463223143322C33420012A280115B0AB0C5AE2B1417C0AB0C6322B1419D0AB0CD4A004A8C00456C32C316B8CC505F0330AD8C8CC5067432C3353001293801152CEB0C5933B141A54EB0CD8E004A50004A90B0C57443143542C3364001110D2004A520045554B143648011E7520048940048D4C50914004A1400452A528BEB53142C52CE6D53142E52CE6F53143052CE7153143253B9F353143453B9DAD94A2FDD4004ED4004F14C50F540048960044645B1412A560045515A8BF25C87735BB9F45C87755A8BDB69600477C5B143D58012260012362C312218C50A58B3955560013662CE5BED8C50F18B0CF580048DA00491AB0C4AA6B142B6ACE6C6B142D6ACE6E6B142F6ACE706B14316ACE726B14336ACE746B14356ACE5B69AC50EDAB0CF1A00491C0044A872C314D9CC506FA72C33B700112A1E0045367AC31BE9E00453680010";
        }

        if (v == Head.SPACESUIT_HELMET) {
            return
                hex"5933801152D000458D44CCAE421D97C10282C5087665344CC9A550004A5200454B4C806C4BEE2D4B3B2E4A1D97C126B4C52876C92CECCD2FB86954C80764801285001295480552D4CEC58D53EE2E521D97C14518C5487665353EE1A554CECD95201DD40049D6004A1720152A5BEE15B56CECB968765F058A8315A1D99516CEC6B65BEE375C8078580126600127633B14298FB856D60012E621D97C18158C58876654600135633B1B5D8FB8E18CECE5800499A0049DACECA1AFB8A5ACECA9A004B9A0045F06A1DB16801356801366B3B376BEE386B3B39680125700126733B2774806873EE29733B2A700117C1C004D5C004D9CCECDDCFB8E1D201E5CCECE9C00495E00499EA7C9DEFB8A1ECECA5E004D9E004DDECECE1EFB8E5EA7CE9E0049200049602829A08ED4E882DEE980013680011BE20B7BE608EDEA0282EE00049220049626B49A28ED9E3201A22CECA62004DA2004DE2CECE23201E628EDEA26B4EE20049240049645189A48769E5201A24CECA64004DA4004DE4CECE25201E64876EA4518EE40049260049662A09A68ED9E6B7BA26A7CA66004DA6004DE6A7CE26B7BE668EDEA62A0EE60049280049681589A88ED9E8FB8A28CECA68004DA8004DE8CECE28FB8E688EDEA8158EE800496A0049AACEC9EAFB8A2ACECA6A004DAA004DEACECE2AFB8E6ACECEAA00496C0049ACCEC9ECFB8A2CCECA6C004DAC004DECCECE2CFB8E6CCECEAC0049AE0049EECECA2EFB8A6E004DAE004DEEFB8E2ECECE6E0049B00044E8C33B29C3EE2AC00135C00136C3EE1BE30CECE700049F2004A32CEC52ACADEEBC80134C8011ADB2B7BDF2CECE32004A34004A74CEC54BD3EE2CD00133D0011A574FB8DB4CECDF4004A76004AB6CEC56CDBEE2DD80132D80119D36FB8D76CECDB600454BE00116378CEC5D1E001194F8CEC695E0012CEA412DE8011747ACECCBA004CFA9045D1F24100";
        }

        if (v == Head.PARTY_HAT) {
            return
                hex"C00004BC2004C03563C42004BC4004C044B8C44004B86004BC6063C06348C4625EC86004B88004BC825EC08095C48063C88004B4A004B8A063BCA095611292E322897B328012D30012E3097AF307F9844C095C8C063CCC004B0E004B4E063B8E0955F1392E323825733818F438012C40012D4097AE40256F407F98450095C904B8CD025ED10004B12004B520635D0492E31487FB24825734818F4480115B140045B35558F450012A580116556004A58004D98004";
        }

        if (v == Head.CAP) {
            return
                hex"5F0320B95D0E82EA9082EAD088AB1082EB50E78B9101F5F04222B14407F243CEB3420BB44222B5420BA94A0B952D288AB1282EB52F065D04A22B14BC1B24A22B34A0B9A55288AD9282EA1482E52A5222AB520BAC5236ED5329D745488AC94F06CD48DBD1482E6B65222B7520BA85A0B94A9688AAD682EB168DBB56CBDB96CA75F05A2298C96CA7CD68DBD1682E6B65A22B75A0B945D882EA1A82E5366A22B76A0BA9720BAA7267D5B1C9E45AE728B57C1CA78632728B59D1C9E4D5C99FD9C82EA5E82EA9E8DB5747A67F57A36F67A0B9556082E0";
        }

        if (v == Head.LEATHER_COWBOY_HAT) {
            return
                hex"58E180118CC6004AC8004B08D355AE240297C080046322402B3234D7420012A280115B0AD355AE2C0297C0AD356322C0299D0AD35D4A004A8C00456C334D56B8D00A5F033E998C8D00A674334D753001293801152CED355933C029A54ED35D8E004A50004A90D355744402B5434D764001110D2004A520045554C02B648011E7520048940048D500A914004A1400452A52F2EB5402AC536C6D5402AE536C6F5402B0536C715402B25473B35402B454739AD94BCBDD4004ED4004F1500AF540048960044645C0292A560045515AF2F25CD6B35C73B45CD6B55AF2DB69600477C5C02BD580122600123634D5221900AA58DB1555600136636C5BED900AF18D35F580048DA00491AD354AA6C02AB6B6C6C6C02AD6B6C6E6C02AF6B6C706C02B16B6C726C02B36B6C746C02B56B6C5B69B00AEDAD35F1A00491C0044A8734D54D9D00A6FA734D7B700112A1E0045367B4D5BE9E00453680010";
        }

        if (v == Head.CYBER_HELMET__BLUE) {
            return
                hex"57438012A400115B10A1AB50004B90A1A5F0423B314286B2400119D10A1AD50004A52004A92A1A56C4A3B2D48012E4A8697C128ECC52A1AC920046744A3B354A86B6480114254004A94A1A56C523B2D50012E528697C148ECC54A1AC94004674523B3552869B5D400450958012A5A8695B168ECB56004B96A1A5F05A3B315A86B2580119D168ECD56A1A6D75801276001286286A960012A628695B188ECB58004B98A1A5F0623B316286B2600119D188ECD58A1AD98004DD8A1AE180049DA004A1AA1AA5A004A9AA1A56D6A3B2E680117C1A77BC5A0046546A3B356A86B66801376A86B86801277001287286A970012A728695B5C8ECB9C0045F0707EB170011951C8ECD5CA1AD9C004DDCA1AE1C0044A77801287A8694A9E00456C7A86AD7A3B2E780117C1E1FAC5E004C9E8EC6747A869AD9E004DDEA1A71A7801248001129A0A1A9E0004A208ECA60004AA077B56C800116BA0A1A5F0800118CA0A1A67480013581DEF6800137823B3880011CEA0A1AEE00044878801288A3B298A86AA88012B887EAC89DED6CA2004CE277BD221FAD62004DA2A1ADE28EC71B88012490012591DEE6907EA7900128923B29928695324004B641FA5D191DEF2907E99D64004DA4A1ADE48ECE24004E641FAEA477BEE40044879801289A3B299A86AA980115B268EC5B2980119D268ECD66004DA6A1ADE68EC71B980124A001129A88EC9E8004A288ECA68A1AAA8004AE81FAB2877B5B2A23B33A1DEF4A07EB5A00136A286B7A23B38A0011CEA88ECEE80044A7A8011426A8ECAAAA1A56CA80116BAA1FA5F0A9DED8CAA1FA674A80135AA869B5EA8EC71AA80113A6C004AACA1AAEC004B2C8EC5B2B00133B23B34B00135B2869B62C0049EE004509BA3B152EE004B2EA1A5B2BA3B33BA869A56E0046D7BA3B38B80128C00129C23B2AC28695D30004D70A1ADB08ECDF0004A32004A728ECAB2A1AAF2004B32A1A5B2CA3B33CA86B4C80135CA86B6CA3B37C80129D0012AD28695D34004D74A1ADB400454BD8012CDA8696CB68ECCF6A1A695D801164F80040";
        }

        if (v == Head.CYBER_HELMET__RED) {
            return
                hex"57438012A400115B10A1AB50004B90A1A5F0423B314286B2400119D10A1AD50004A52004A92A1A56C4A3B2D48012E4A8697C128ECC52A1AC920046744A3B354A86B6480114254004A94A1A56C523B2D50012E528697C148ECC54A1AC94004674523B3552869B5D400450958012A5A8695B168ECB56004B96A1A5F05A3B315A86B2580119D168ECD56A1A6D75801276001286286A960012A628695B188ECB58004B98A1A5F0623B316286B2600119D188ECD58A1AD98004DD8A1AE180049DA004A1AA1AA5A004A9AA1A56D6A3B2E680117C1B4C8C5A0046546A3B356A86B66801376A86B86801277001287286A970012A728695B5C8ECB9C0045F0737A7170011951C8ECD5CA1AD9C004DDCA1AE1C0044A77801287A8694A9E00456C7A86AD7A3B2E780117C1EDE9C5E004C9E8EC6747A869AD9E004DDEA1A71A7801248001129A0A1A9E0004A208ECA60004AA14C856C800116BA0A1A5F0800118CA0A1A674800135853236800137823B3880011CEA0A1AEE00044878801288A3B298A86AA88012B8B7A6C8D3216CA2004CE34C8D22DE9D62004DA2A1ADE28EC71B880124900125953226937A67900128923B29928695324004B64DE95D1953232937A59D64004DA4A1ADE48ECE24004E64DE9EA54C8EE40044879801289A3B299A86AA980115B268EC5B2980119D268ECD66004DA6A1ADE68EC71B980124A001129A88EC9E8004A288ECA68A1AAA8004AE8DE9B294C85B2A23B33A53234A37A75A00136A286B7A23B38A0011CEA88ECEE80044A7A8011426A8ECAAAA1A56CA80116BAADE95F0AD3218CAADE9674A80135AA869B5EA8EC71AA80113A6C004AACA1AAEC004B2C8EC5B2B00133B23B34B00135B2869B62C0049EE004509BA3B152EE004B2EA1A5B2BA3B33BA869A56E0046D7BA3B38B80128C00129C23B2AC28695D30004D70A1ADB08ECDF0004A32004A728ECAB2A1AAF2004B32A1A5B2CA3B33CA86B4C80135CA86B6CA3B37C80129D0012AD28695D34004D74A1ADB400454BD8012CDA8696CB68ECCF6A1A695D801164F80040";
        }

        if (v == Head.SAMURAI_HAT) {
            return
                hex"5F018012E20012F20C0B0203A71200117C0A0045AE30012F30C0B0303A58C8C00456C38012D380DEE381C17C0E004C4E070C8E04A674380114A90004AD0083B1004AB50070B900ABBD0070611402AF2401C334012B44020DAD900044E84801294812952D2070B1204AB52070B920ABBD2070611482AF2481C3348129A552070D920376F84801129940049D405BA1404A52A501C2B5012AC501C16B940ABBD4070612502AF3501C3450129AD94070DD4037E1405B73A50011191600495605B99604A9D603750A581C2B5812AC581C16B960ABBD6070612582AF3581C3458129ADD6070E16037E5604AE9605B77C5801108980048D803C4856012A6600DD3A1804AA58070A9804AAD807058E602AEF601C184D80ABD18070D5804AD980706F86012B9600DDD6D804AF1803C7BE60012068011091A06695A3024C8682654A9A04A56E681C2F68129851A0706B668129BE5A099E9A30277E6819BF68011021C004A5C302A9C09956E703A6F70C09851C0E9D5C099D9C3026FF700114D9E004";
        }

        if (v == Head.HALO) {
            return
                hex"9006E79406EA9806ED9C06F3A006FEA40709A80717AC0722B0072CB40732B807355F001CDB101CD3201CC7301CAB401C8B501C67601C3F701C17801BF3901BD7A01BBFB01BAFC01BA1EF806E644309B9A409BA2509BAE609BC2709BE6809C16909C52A09C8AB09CC2C09CEED09CFAE09D057C02742C42740C8273CCC2737D0272FD42726D8271ADC270FE02702E426FAE826F2EC26ECF026E9F426E78846E68C46E79046E99446ED9846F39C46FDA0470BA4471DA8472DAC473BB04746B44749B8474B5F111D2B211D1F311CFF411CE7511CBB611C8B711C63811C2B911BFFA11BD7B11BBFC11BA9EF846E7FC46E68C66E79066E99466ED9866F59C6700A06710A46722A8673357419D43519CD3619CA3719C6F819C37919C0BA19BDFB19BC3C19BAFD19BA3E19B9A221B9A321B9E421BA6521BB6621BD6721C0A821C4A921C92A21D42B21D16C21D316B8874F5F121D3B221D37321D23421CFB521D43621CAF721C7B821C43921C0BA21BDFB21BBFC21BB3D21BA1F7C86E68CA6E790A6E894A6ED98A6F59CA701A0A70FA4A722A8A73457429D43529CD3629CA7729C73829C37929C0BA29BE3B29BC3C29BB3D29BA3E29B9A331B9A431BA6531BB2631BCA731BF6831C2E931C7AA31CB6B31CEEC31D12D31D25740C74BC4C749C8C747CCC741D0C739D4C72FD8C724DCC718E0C70AE4C700E8C6F6ECC6EFF0C6EAF4C6E7F8C6E690E6E894E6EA98E6F19CE6F9A0E706A4E714A8E722ACE730B0E73AB4E73DB8E742BCE744C0E743C4E741C8E73DCCE738D0E730D4E727D8E71BDCE710E0E706E4E6FBE8E6F3ECE6EDF0E6E9F4E6E77DF39B9A341B9A441B9E541BA6641BBA741BCE841BF6941C26A41C5AB41C82C41CAED41CCAE41CD97C10737C50736C90732CD072CD10723D5071BD90711DD0706E106FCE506F6E906EFED06EAF106E87BE41B9A449B9A549BA2649BAA749BBE849BD6949BFEA49C22B49C4AC49C6AD49C7EE49C92F49C9B049C9F149C97249C87349C73449C5B549C37649C13749BF3849BDB949BC7A49BAFB49BA7C49B9FD49B9921546E69946E89D46EBA146F0A546F5A946FBAD4703B14708B5470EB94712BD4715C14716C54713C9470FCD470CD14707D54700D946FADD46F4E146F0E546ECE946EAED46E7F146E64A659B9A759BAA859BAE959BBEA59BC6B59BDEC59BF2D59BFAE59C0AF59C0F059C13159C0F259BFF359BF3459BE3559BD3659BC3759BBB859BAF959BA7A59B9DDF966E69986E64E861B9E961BAEA61BB6B61BBEC61BC6D61BD2E61BD6F61BDB061BD7161BDB261BCF361BCB461BC3561BBF661BAF761BA7861BA3961B9DD6D86E650969B9952DA6E9B1A6EAB5A6EBB9A6EC5F069BB58CDA6ECD1A6EB6B669BA7769BA1C69A6E652A71B995B1C6E75AE71BA6F71BA1845C6E965371B9F471BA3571B9DB61C6E656E79B9AF79B9F079B9B179B9F279B9B479B9F579B9B779B9B181B9B481B98";
        }
        revert("invalid head");
    }
}

library MouthSprites {
    function getSprite(Mouth v) external pure returns (bytes memory) {
        if (v == Mouth.SURPRISED) {
            return hex"5F0C0012EC80117C333A4C720045F0D00100";
        }

        if (v == Mouth.SMILE) {
            return hex"B30004CF00045B2C8010";
        }

        if (v == Mouth.PIPE) {
            return
                hex"F63884F69884F6B88475BBE212CC00133C0011D6F18845B2C80133CB9FF4C80133D00134D39FF5D0011BEF4004D36004D76E7F6D7D8011C6B7187EF6004D78004DB8E7FDF800471AE39FFBE00136E8011BEBAE7FEFA0046FAF0010";
        }

        if (v == Mouth.OPEN_SMILE) {
            return hex"593C0012DC80117473884CB20045D1D00100";
        }

        if (v == Mouth.NEUTRAL) {
            return hex"5B2C8010";
        }

        if (v == Mouth.MASK) {
            return
                hex"A66004DA600454BA0011A568004AAA004AEAC72593A80134AB1CB5A80128B0012AB00115D2D38AD6C004DEC00452AB8012BBB36964EEC72D2ECDA6B6B8012AC0012BC400964F138AD31002D70004AB2004AF2D28B330025B2CB1CB3CC00B4CB4A35C8012BD0012CD2CBD6BB50025F0D4E298CB5002CF4B2F695D001163760045D1DA91994F60045D1E0010";
        }

        if (v == Mouth.TONGUE_OUT) {
            return
                hex"B30004CF0004B72004BB2CE55F0CBCBF1CB3972C8012ED00117C35372C74004BB60045F0DBCBF1D80100";
        }

        if (v == Mouth.GOLD_GRILL) {
            return
                hex"B30004B71877BB17C4BF1884C31839C71884CB17C4CF0004B72004BB3877BF3056C33884C73056CB20045D1D0010";
        }

        if (v == Mouth.DIAMOND_GRILL) {
            return
                hex"B30004B70FE6BB0757BF1884C30757C71884CB0757CF0004B72004BB3884BF2342C33884C72342CB20045D1D0010";
        }

        if (v == Mouth.NAVY_RESPIRATOR) {
            return
                hex"A26004DE60049E8004A28814A68004DA8004DE8814E280049EA004A2A814A6A9A8AAA0045D1A80135A80136AA6A37AA0538A80127B00128B20529B214EAB26A15B6C0045D1B224D952C004D6C9A8DAC853DEC814E2C004A2E00452ABA14EBBA6A163AE8145F0BA6A18CEE814D2E9A86B6BA14F7B80126C00113A309A8A70004AB085356DC20517470004654C20535C214F6C0011BE309A8E700049B20049F2814A32853A729A8AB200456CCA052DC8012ECA052FCA14F0CA0531CA14F2C80119D32814D72004DB29A8DF2853E32814E720049B40049F4853A34814A74853AB49A8AF4004B34853B74004BB4814BF4853C34814C74853CB4004CF4853D34004D749A8DB4853DF4814E34853E740049F6004A36853A76814AB6853AF6004B36853B76004BB6814BF6853C36814C76853CB6004CF6853D36004D76853DB6814DF6853E36004A38004A78853AB8814AF8004BB8814BF8853C38814C78853D38004D78814DB8853DF800452BE8011747A004696E80100";
        }

        if (v == Mouth.RED_RESPIRATOR) {
            return
                hex"A26004DE60049E8004A289D2A68004DA8004DE89D2E280049EA004A2A9D2A6AF9CAAA0045D1A80135A80136ABE737AA74B8A80127B00128B274A9B2EE6AB3E715B6C0045D1B33C1952C004D6CF9CDACBB9DEC9D2E2C004A2E00452ABAEE6BBBE7163AE9D25F0BBE718CEE9D2D2EF9C6B6BAEE77B80126C00113A30F9CA70004AB0BB956DC27497470004654C274B5C2EE76C0011BE30F9CE700049B20049F29D2A32BB9A72F9CAB200456CCA74ADC8012ECA74AFCAEE70CA74B1CAEE72C80119D329D2D72004DB2F9CDF2BB9E329D2E720049B40049F4BB9A349D2A74BB9AB4F9CAF4004B34BB9B74004BB49D2BF4BB9C349D2C74BB9CB4004CF4BB9D34004D74F9CDB4BB9DF49D2E34BB9E740049F6004A36BB9A769D2AB6BB9AF6004B36BB9B76004BB69D2BF6BB9C369D2C76BB9CB6004CF6BB9D36004D76BB9DB69D2DF6BB9E36004A38004A78BB9AB89D2AF8004BB89D2BF8BB9C389D2C78BB9D38004D789D2DB8BB9DF800452BE8011747A004696E80100";
        }

        if (v == Mouth.MAGENTA_RESPIRATOR) {
            return
                hex"A26004DE60049E8004A289CCA68004DA8004DE89CCE280049EA004A2A9CCA6AEE0AAA0045D1A80135A80136ABB837AA7338A80127B00128B27329B2E36AB3B815B6C0045D1B32AD952C004D6CEE0DACB8DDEC9CCE2C004A2E00452ABAE36BBBB8163AE9CC5F0BBB818CEE9CCD2EEE06B6BAE377B80126C00113A30EE0A70004AB0B8D56DC27317470004654C27335C2E376C0011BE30EE0E700049B20049F29CCA32B8DA72EE0AB200456CCA732DC8012ECA732FCAE370CA7331CAE372C80119D329CCD72004DB2EE0DF2B8DE329CCE720049B40049F4B8DA349CCA74B8DAB4EE0AF4004B34B8DB74004BB49CCBF4B8DC349CCC74B8DCB4004CF4B8DD34004D74EE0DB4B8DDF49CCE34B8DE740049F6004A36B8DA769CCAB6B8DAF6004B36B8DB76004BB69CCBF6B8DC369CCC76B8DCB6004CF6B8DD36004D76B8DDB69CCDF6B8DE36004A38004A78B8DAB89CCAF8004BB89CCBF8B8DC389CCC78B8DD38004D789CCDB8B8DDF800452BE8011747A004696E80100";
        }

        if (v == Mouth.GREEN_RESPIRATOR) {
            return
                hex"A26004DE60049E8004A28043A68004DA8004DE8043E280049EA004A2A043A6A167AAA0045D1A80135A80136A859F7A810F8A80127B00128B010E9B025EAB059D5B6C0045D1B0369952C004D6C167DAC097DEC043E2C004A2E00452AB825EBB859D63AE0435F0B859D8CEE043D2E1676B6B825F7B80126C00113A30167A70004AB009756DC010D7470004654C010F5C025F6C0011BE30167E700049B20049F2043A32097A72167AB200456CC810EDC8012EC810EFC825F0C810F1C825F2C80119D32043D72004DB2167DF2097E32043E720049B40049F4097A34043A74097AB4167AF4004B34097B74004BB4043BF4097C34043C74097CB4004CF4097D34004D74167DB4097DF4043E34097E740049F6004A36097A76043AB6097AF6004B36097B76004BB6043BF6097C36043C76097CB6004CF6097D36004D76097DB6043DF6097E36004A38004A78097AB8043AF8004BB8043BF8097C38043C78097D38004D78043DB8097DF800452BE8011747A004696E80100";
        }

        if (v == Mouth.MEMPO) {
            return
                hex"A26004DE6004509A001174680046D7A00128A80129AAD01536A0045D1AB235956A004DAAB40DEA004A2C004A6CB4054DB3235746C004655B32376B2D037B00128B80114AAEC8DAEE00458DBC7B2EB80117C2F1ECC6E004653BC7B34B8011ADAEC8DDEE004A30004A70B4054CC0012DC47B17470004CB11EC675C00136C2D037C00129C8012ACAD02BCC7B164F2004D331ECD72B40DB2004AB4004AF4B40B351ECB740045D1D47B32D00133D47B34D2D035D0012BD801164F6C8DD36004593E0010";
        }

        if (v == Mouth.VAPE) {
            return
                hex"8E58828E788279DA6209192B88279DAE20A3B620A4B620E5B61FE4BE20E5BE1FDCEEF8824E8C620ACC00133C0011CF318824E9CE20ADC8012ECC08EFC80130CAFF31C80132CC08DD6F38824EED620AFD00130D27DB1D001194F58826D8D6209217787F4EDDE2097476004CB716B678DE209DF3787F485E61FD4339882BB8BFCBF9067C38BEDC79067CB8CFE678E6209DF3987F97B87F52BEE20AEEAFF2FEC19F0EB7EF1EC19F2EB3F9ADFB882EFB87F5D2F290AEFA90AFFB1870FDDF71FB1872FA9080";
        }

        if (v == Mouth.PILOT_OXYGEN_MASK) {
            return
                hex"5F0A00116BAA0045F0AB5058CAA00454CB00116BACD41BEC6DDC2C642632B35059D6C004A6E00454CBB5056BAE642BEE6DDC2E642632B8EB59D6ED41DAE004A30004A70D41AB0457AF07F658EC190AFC1D8F0C19098CF03ADD307F6D70200DB0D41DF0004A32004A72642AB2004AF220058EC990AFC9D8F0C99098CF23ADD32200D72004DB23ADDF2004A7400454ED190AFD1B770D19098D743ADDB4004AB6004AF6642B363AD5AED99097C36A7B632D8EB73D9FDB4D8EB75D8012BE00116378642BB8A7BBF900FC38CD9C78A7B653E0EB74E0011637A004BBAA7BBFADB5C3ABC2C7AA7B653E8012EF0012FF403F0F33671F0012EF8012FFB6D70FAF0B1F8010";
        }

        if (v == Mouth.CIGAR) {
            return
                hex"F5B88179D76207C96207B9E1EFC9E205DF2987B75BB6205CEEF881B30004CF000473BC62056CB2004CF2DF7D3200473BCE2072D00119D35166D74004EB5881CF6004695DB7DF6D80134E00135E37DF6E38BB7E00138E62075E80136EB08F7E8011B5FC0040";
        }

        if (v == Mouth.BANANA) {
            return
                hex"AF0004655C00116472004653CE16B4C80131D001194F585AD34004C76004653DE16B4D80131E001194F985AD38DA4D78004C3A004C7B81CCBADA4CFB85AD3ADA4D7B81CDBA004BFC004C3D81CC7D158CBD81CCFCDA4D3D1586B6F60737F0012FF80130FE0731FB6932FE0733FB6934FE0735FB6936FE0737F80100";
        }

        if (v == Mouth.CHROME_RESPIRATOR) {
            return
                hex"A26004DE60049E8004A2885CA68004DA8004DE885CE280049EA004A2B17EA6AEF0AAA0045D1A80135A80136AA03F7A911B8A80127B00128B21729B269EAB30715B6C004BACA29BED42CC2C446C6CA29654B00135B24436B269F7B21738B00113A2E00452ABA69EBBABCECBB55ADBC5F973EEF00611B88D72B8CEF3B85AB4BA445ADAE9A76F8B80126C00113A31478A70004AB09A7574C21735C269F6C0011BE3044FE700049B20049F285CA329A7A73232AB2004AF2AF3B3285CB72E41BB285CBF342CC32446C7285CCB21B7CF285CD32911D72004DB23B7DF29A7E3285CE720049B40049F5232A3485CA749A7AB4FFEAF49A7B3485CB74E41BB485CBF4F00C34235C7485CCB41B7CF485CD349A7D743B7DB49A7DF485CE343B7E740049F6004A369A7A7685CAB69A7AF6CFCB3685CB769A7BB685CBF6F00C36235C7685CCB69A7CF685CD3625FD769A7DB685CDF69A7E36004A38004A79232AB885CAF8CFCB3885CB789A7BB885CBF8F00C38235C7885CCB89A7CF885CD3825FD7885CDB83B7DF800452AE8012BEA0DD747A004696E80100";
        }

        if (v == Mouth.STOIC) {
            return hex"5F0C8010";
        }

        if (v == Mouth.SMIRK) {
            return hex"CF00045D2C8010";
        }
        revert("invalid mouth");
    }
}

library MiscSprites {
    function passSprite() external pure returns (bytes memory) {
        return
            hex"41F022E501C28B9A020905370826B808241CFC28B98040D8426122E67102428101114DC4221E04044E4409075F122E501868B99C609AA066AAA46044A866AAAC6ADE58D1BF6EE19B057C46FDBC866BECC6FDBD06FC8D46ADED866BEDC6044E066AAE4609A75E1A2E7F1836101888B99C809AA09126A48044A880EB576203CF720113823F6F920269D7C88B94062A2E672826A829AAA9283CEA2AC195D8AADEDCA0F3E0A6AAE4A09A75F2A2E500CC8B990C0D84A6322E673026A8308869303CD538CADE5F0300118D8CADEDCC0F3E0C221E4C09A75F322E5018E8B99CE09AA0F126A4E0F3A8EAC156D3AB7AE38012F3B86B0380118D8EADEDCE0F3E0F126E4E09AE8E8B9ECE1A179F3A2E501908B99D009AA10221A500F354C42B7AD40012E45E1AF400118590ADEDD00F3E10221E5009A75F422E501928B99D209AA126CDA520F354B4AB7AC48012D4DE1AE4C182F480118592ADEDD20F3E126AAE5209A75F4A2E500D48B99148BA4A6522E675026A850A129503CEA52B7AB50012C55E1AD560FEE54182F55E1B0500118CD4ADE69550013652B7B7503CF85088B95026BA522EFB52327C522E9EFD48B98168B98562AD8968C94665A2E675826A85834E958112A5AB7AB58012C5DE1AD5E0FEE5C182F5DE1B05C1818CD6004D1783FD56004D96ADEDD6044E160E4E5609A75C5A2E7D5A2EFE5A2EBF58AB60622BA1622ED11988B99D809AA180D3A58044A98ADEAD8004B19786B5983FB99060BD9786C197CE63464183560013662B7B76011386034F960269D7D88B981A8BF4266A2E676826A869AFA968112A6AB7AB68012C6DE1AD6DF3AE6E0FEF6C18306DE1B16DF3B26DE199D1B83FD5A02BD9AADEDDA044E1A6BEE5A09AE9A8D4EDA8B9F1A8C87BF6A2E5011C8B995C8D499C8E79DC09AA1CFDBA5C04454B72B7AC70012D75E1AE75F3AF760FD851D060D5C004D9CADEDDC044E1CFDBE5C044E9C8E777C72321EFDC8B94037A2E647A35257A3CA67A40E77811287BF6E978111531EADEB5E0045D07DE198CDF83FD1E0046B67AB7B77811387BF6F978113A7A645DF1E8F2F5E8E77DF7A32100608B98A08D48E08E79209039602C99A099E9E009AA20FDBA6004454D82B7974E000469682B7B780113883F6F98026BA826E3B82647C82427D80AD3E82353F8232208A35218A39E28A43A38A42648A69658A77268A7E678826A889AFA98811155A2ADEDE2044E226BEE6209AEA2A0EEE29D4F229B8F62909FA28F2FE28E78248F18648F28A49868E499E9249D4964A0E9A4A289E409AA246BEA6404455696213790113891AFB99026BA92A9FB92943C9287FD92797E926E3F9264609A40E19A64629A6B639A79649A87E59A9E669AB8A79826A899AFA99811155A6ADEDE6044E266BEE6609AEA6B15EE6AE2F26A6EF66A28FA6A05FE69AD82899E8689C38A89E58E8A39928AA7968B169A8B789E809AA29126A68044AA8ADE56CA0886DA2B797468221CA8ADE675A08876A2B7B7A01138A449B9A026BAA2EF7BA2DA7CA2BB7DA2A2FEA2977FA27E60A8BA61AA83A2AA9423AAAF64AAC565AAF4A6AB16E7A826A8AC49A9A8112AAAB7ABA8886CAAB796BAA221BEAADEC2A221C6AADE653A88874AAB7B5A88876AAB7B7A81138AC49B9A826BAAB2CBBAB0B3CAADCBDAAC2FEAAACBFA8C5E0B28361B29B62B2B123B2D7E4B2F365B31E66B34F67B026A8B449A9B011155ACADEDEC044E2D126E6C09AEACDF9EECCDFF2CC47F6CBD2FACB50FECABD82EA5086EAED8AEB698EEC1492EC9A96ED719AEE859EE09AA2E221A6E0F3AAEADE56EB8886FBAB79846E221CAEADECEE221D2EADED6E221DAEADEDEE044E2E221E6E09AEAEF09EEEE60F2ED36F6EC88FAEBE9FEEB43830AC4870B508B0C1D8F0CB2930D8A970E589B0F8D9F009AA306BEA700F354BC2B7ACC0886DC2B7973F0221C30ADE632C08873C2B79A570221DB0ADEDF0044E306BEE7009AEB104BEF0F61F30E79F70D67FB0C79FF0BE9832B16872BFA8B2C888F2D80932EA4972FB79B31089F209AA326BEA720F3556CAB7B7C83CF8C9AFB9C826BACC743BCC18FCCBE0BDCB9ABECB4F7FCB18A0D2E4E1D31AE2D34F63D3A164D3E0A5D447E6D48A27D026A8D449A9D03CD55B5884DF40F3E34FDBE7409AEB52DAEF51E8F35063F74F6BFB4E53FF4CDF836C14876CDF8B6E2A8F6F6B9370FD9772099B732C9F609AA37126A76044AB60EB576D83CF7D81138DBF6F9D826BADCFC7BDCAFFCDC743DDC12FEDBCEFFDB7E60E31E61E36662E3BD63E40864E473E5E4BBA6E4FC67E026A8E1AAA9E0112AE1AAABE2B796378FDBBB86C15F1E3F6F2E1AFB3E3F6F4E3F235E2B7B6E1AFB7E01138E1AAB9E026BAE51CBBE4EB3CE4A97DE466FEE3F0FFE3B760EB3A61EB7962EBE6E3EC56521BA0049FA090A3A044537E88878E81139E8241D73A004F7B25CFBB11FFFAF8283CD9987CEF58BD0308FC004487F60FE8F61014AFD846B3D8425B6F6119BE3D84273CF60FFDF0013EF4743FF3FDA0FB86E1FBD862FC4BA3FC9E64F801129FF786509FC181533F786B7F0605D2FDE1B3FC181A5BF7866F8FC181CEFF786F3E004F7F39BFBF25CFFF0F0";
    }
}

// File: contracts/IUtilityERC20.sol



//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

interface IUtilityERC20 is IERC20 {
    function adminMint(address owner, uint amountWei) external;

    function adminSetTokenTimestamp(uint tokenId, uint timestamp) external;

    function burn(address owner, uint amountWei) external;

    function claimRewards() external;

    function stake(uint[] calldata tokenId) external;
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol



// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;

import "../ERC1155.sol";

/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] -= amounts[i];
            }
        }
    }
}

// File: contracts/ChainScoutsExtension.sol



//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./IChainScouts.sol";

abstract contract ChainScoutsExtension {
    IChainScouts internal chainScouts;
    bool public enabled = true;

    modifier canAccessToken(uint tokenId) {
        require(chainScouts.canAccessToken(msg.sender, tokenId), "ChainScoutsExtension: you don't own the token");
        _;
    }

    modifier onlyAdmin() {
        require(chainScouts.isAdmin(msg.sender), "ChainScoutsExtension: admins only");
        _;
    }

    modifier whenEnabled() {
        require(enabled, "ChainScoutsExtension: currently disabled");
        _;
    }

    function adminSetEnabled(bool e) external onlyAdmin {
        enabled = e;
    }

    function extensionKey() public virtual view returns (string memory);

    function setChainScouts(IChainScouts _contract) external {
        require(address(0) == address(chainScouts) || chainScouts.isAdmin(msg.sender), "ChainScoutsExtension: The Chain Scouts contract must not be set or you must be an admin");
        chainScouts = _contract;
        chainScouts.adminSetExtension(extensionKey(), this);
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol



// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol



// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;

import "./IERC1155.sol";
import "./IERC1155Receiver.sol";
import "./extensions/IERC1155MetadataURI.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/introspection/ERC165.sol";

/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

    // Mapping from account to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC1155).interfaceId ||
            interfaceId == type(IERC1155MetadataURI).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC1155-isApprovedForAll}.
     */
    function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[account][operator];
    }

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol



// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol



// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol



// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;

import "../IERC1155.sol";

/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

// File: @openzeppelin/contracts/utils/Address.sol



// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/utils/Context.sol



// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol



// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol



// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: contracts/IChainScouts.sol



//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./IExtensibleERC721Enumerable.sol";
import "./ChainScoutsExtension.sol";
import "./ChainScoutMetadata.sol";

interface IChainScouts is IExtensibleERC721Enumerable {
    function adminCreateChainScout(
        ChainScoutMetadata calldata tbd,
        address owner
    ) external;

    function adminRemoveExtension(string calldata key) external;

    function adminSetExtension(
        string calldata key,
        ChainScoutsExtension extension
    ) external;

    function adminSetChainScoutMetadata(
        uint256 tokenId,
        ChainScoutMetadata calldata tbd
    ) external;

    function getChainScoutMetadata(uint256 tokenId)
        external
        view
        returns (ChainScoutMetadata memory);
}

// File: contracts/IExtensibleERC721Enumerable.sol



//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";

interface IExtensibleERC721Enumerable is IERC721Enumerable {
    function isAdmin(address addr) external view returns (bool);

    function addAdmin(address addr) external;

    function removeAdmin(address addr) external;

    function canAccessToken(address addr, uint tokenId) external view returns (bool);

    function adminBurn(uint tokenId) external;

    function adminTransfer(address from, address to, uint tokenId) external;
}
// File: contracts/ChainScoutMetadata.sol



//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./Enums.sol";

struct KeyValuePair {
    string key;
    string value;
}

struct ChainScoutMetadata {
    Accessory accessory;
    BackAccessory backaccessory;
    Background background;
    Clothing clothing;
    Eyes eyes;
    Fur fur;
    Head head;
    Mouth mouth;
    uint24 attack;
    uint24 defense;
    uint24 luck;
    uint24 speed;
    uint24 strength;
    uint24 intelligence;
    uint16 level;
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol



// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol



// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: contracts/Enums.sol



//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

enum Accessory {
    GOLD_EARRINGS,
    SCARS,
    GOLDEN_CHAIN,
    AMULET,
    CUBAN_LINK_GOLD_CHAIN,
    FANNY_PACK,
    NONE
}

enum BackAccessory {
    NETRUNNER,
    MERCENARY,
    RONIN,
    ENCHANTER,
    VANGUARD,
    MINER,
    PATHFINDER,
    SCOUT
}

enum Background {
    STARRY_PINK,
    STARRY_YELLOW,
    STARRY_PURPLE,
    STARRY_GREEN,
    NEBULA,
    STARRY_RED,
    STARRY_BLUE,
    SUNSET,
    MORNING,
    INDIGO,
    CITY__PURPLE,
    CONTROL_ROOM,
    LAB,
    GREEN,
    ORANGE,
    PURPLE,
    CITY__GREEN,
    CITY__RED,
    STATION,
    BOUNTY,
    BLUE_SKY,
    RED_SKY,
    GREEN_SKY
}

enum Clothing {
    MARTIAL_SUIT,
    AMETHYST_ARMOR,
    SHIRT_AND_TIE,
    THUNDERDOME_ARMOR,
    FLEET_UNIFORM__BLUE,
    BANANITE_SHIRT,
    EXPLORER,
    COSMIC_GHILLIE_SUIT__BLUE,
    COSMIC_GHILLIE_SUIT__GOLD,
    CYBER_JUMPSUIT,
    ENCHANTER_ROBES,
    HOODIE,
    SPACESUIT,
    MECHA_ARMOR,
    LAB_COAT,
    FLEET_UNIFORM__RED,
    GOLD_ARMOR,
    ENERGY_ARMOR__BLUE,
    ENERGY_ARMOR__RED,
    MISSION_SUIT__BLACK,
    MISSION_SUIT__PURPLE,
    COWBOY,
    GLITCH_ARMOR,
    NONE
}

enum Eyes {
    SPACE_VISOR,
    ADORABLE,
    VETERAN,
    SUNGLASSES,
    WHITE_SUNGLASSES,
    RED_EYES,
    WINK,
    CASUAL,
    CLOSED,
    DOWNCAST,
    HAPPY,
    BLUE_EYES,
    HUD_GLASSES,
    DARK_SUNGLASSES,
    NIGHT_VISION_GOGGLES,
    BIONIC,
    HIVE_GOGGLES,
    MATRIX_GLASSES,
    GREEN_GLOW,
    ORANGE_GLOW,
    RED_GLOW,
    PURPLE_GLOW,
    BLUE_GLOW,
    SKY_GLOW,
    RED_LASER,
    BLUE_LASER,
    GOLDEN_SHADES,
    HIPSTER_GLASSES,
    PINCENEZ,
    BLUE_SHADES,
    BLIT_GLASSES,
    NOUNS_GLASSES
}

enum Fur {
    MAGENTA,
    BLUE,
    GREEN,
    RED,
    BLACK,
    BROWN,
    SILVER,
    PURPLE,
    PINK,
    SEANCE,
    TURQUOISE,
    CRIMSON,
    GREENYELLOW,
    GOLD,
    DIAMOND,
    METALLIC
}

enum Head {
    HALO,
    ENERGY_FIELD,
    BLUE_TOP_HAT,
    RED_TOP_HAT,
    ENERGY_CRYSTAL,
    CROWN,
    BANDANA,
    BUCKET_HAT,
    HOMBURG_HAT,
    PROPELLER_HAT,
    HEADBAND,
    DORAG,
    PURPLE_COWBOY_HAT,
    SPACESUIT_HELMET,
    PARTY_HAT,
    CAP,
    LEATHER_COWBOY_HAT,
    CYBER_HELMET__BLUE,
    CYBER_HELMET__RED,
    SAMURAI_HAT,
    NONE
}

enum Mouth {
    SMIRK,
    SURPRISED,
    SMILE,
    PIPE,
    OPEN_SMILE,
    NEUTRAL,
    MASK,
    TONGUE_OUT,
    GOLD_GRILL,
    DIAMOND_GRILL,
    NAVY_RESPIRATOR,
    RED_RESPIRATOR,
    MAGENTA_RESPIRATOR,
    GREEN_RESPIRATOR,
    MEMPO,
    VAPE,
    PILOT_OXYGEN_MASK,
    CIGAR,
    BANANA,
    CHROME_RESPIRATOR,
    STOIC
}

library Enums {
    function toString(Accessory v) external pure returns (string memory) {
        if (v == Accessory.GOLD_EARRINGS) {
            return "Gold Earrings";
        }

        if (v == Accessory.SCARS) {
            return "Scars";
        }

        if (v == Accessory.GOLDEN_CHAIN) {
            return "Golden Chain";
        }

        if (v == Accessory.AMULET) {
            return "Amulet";
        }

        if (v == Accessory.CUBAN_LINK_GOLD_CHAIN) {
            return "Cuban Link Gold Chain";
        }

        if (v == Accessory.FANNY_PACK) {
            return "Fanny Pack";
        }

        if (v == Accessory.NONE) {
            return "None";
        }
        revert("invalid accessory");
    }

    function toString(BackAccessory v) external pure returns (string memory) {
        if (v == BackAccessory.NETRUNNER) {
            return "Netrunner";
        }

        if (v == BackAccessory.MERCENARY) {
            return "Mercenary";
        }

        if (v == BackAccessory.RONIN) {
            return "Ronin";
        }

        if (v == BackAccessory.ENCHANTER) {
            return "Enchanter";
        }

        if (v == BackAccessory.VANGUARD) {
            return "Vanguard";
        }

        if (v == BackAccessory.MINER) {
            return "Miner";
        }

        if (v == BackAccessory.PATHFINDER) {
            return "Pathfinder";
        }

        if (v == BackAccessory.SCOUT) {
            return "Scout";
        }
        revert("invalid back accessory");
    }

    function toString(Background v) external pure returns (string memory) {
        if (v == Background.STARRY_PINK) {
            return "Starry Pink";
        }

        if (v == Background.STARRY_YELLOW) {
            return "Starry Yellow";
        }

        if (v == Background.STARRY_PURPLE) {
            return "Starry Purple";
        }

        if (v == Background.STARRY_GREEN) {
            return "Starry Green";
        }

        if (v == Background.NEBULA) {
            return "Nebula";
        }

        if (v == Background.STARRY_RED) {
            return "Starry Red";
        }

        if (v == Background.STARRY_BLUE) {
            return "Starry Blue";
        }

        if (v == Background.SUNSET) {
            return "Sunset";
        }

        if (v == Background.MORNING) {
            return "Morning";
        }

        if (v == Background.INDIGO) {
            return "Indigo";
        }

        if (v == Background.CITY__PURPLE) {
            return "City - Purple";
        }

        if (v == Background.CONTROL_ROOM) {
            return "Control Room";
        }

        if (v == Background.LAB) {
            return "Lab";
        }

        if (v == Background.GREEN) {
            return "Green";
        }

        if (v == Background.ORANGE) {
            return "Orange";
        }

        if (v == Background.PURPLE) {
            return "Purple";
        }

        if (v == Background.CITY__GREEN) {
            return "City - Green";
        }

        if (v == Background.CITY__RED) {
            return "City - Red";
        }

        if (v == Background.STATION) {
            return "Station";
        }

        if (v == Background.BOUNTY) {
            return "Bounty";
        }

        if (v == Background.BLUE_SKY) {
            return "Blue Sky";
        }

        if (v == Background.RED_SKY) {
            return "Red Sky";
        }

        if (v == Background.GREEN_SKY) {
            return "Green Sky";
        }
        revert("invalid background");
    }

    function toString(Clothing v) external pure returns (string memory) {
        if (v == Clothing.MARTIAL_SUIT) {
            return "Martial Suit";
        }

        if (v == Clothing.AMETHYST_ARMOR) {
            return "Amethyst Armor";
        }

        if (v == Clothing.SHIRT_AND_TIE) {
            return "Shirt and Tie";
        }

        if (v == Clothing.THUNDERDOME_ARMOR) {
            return "Thunderdome Armor";
        }

        if (v == Clothing.FLEET_UNIFORM__BLUE) {
            return "Fleet Uniform - Blue";
        }

        if (v == Clothing.BANANITE_SHIRT) {
            return "Bananite Shirt";
        }

        if (v == Clothing.EXPLORER) {
            return "Explorer";
        }

        if (v == Clothing.COSMIC_GHILLIE_SUIT__BLUE) {
            return "Cosmic Ghillie Suit - Blue";
        }

        if (v == Clothing.COSMIC_GHILLIE_SUIT__GOLD) {
            return "Cosmic Ghillie Suit - Gold";
        }

        if (v == Clothing.CYBER_JUMPSUIT) {
            return "Cyber Jumpsuit";
        }

        if (v == Clothing.ENCHANTER_ROBES) {
            return "Enchanter Robes";
        }

        if (v == Clothing.HOODIE) {
            return "Hoodie";
        }

        if (v == Clothing.SPACESUIT) {
            return "Spacesuit";
        }

        if (v == Clothing.MECHA_ARMOR) {
            return "Mecha Armor";
        }

        if (v == Clothing.LAB_COAT) {
            return "Lab Coat";
        }

        if (v == Clothing.FLEET_UNIFORM__RED) {
            return "Fleet Uniform - Red";
        }

        if (v == Clothing.GOLD_ARMOR) {
            return "Gold Armor";
        }

        if (v == Clothing.ENERGY_ARMOR__BLUE) {
            return "Energy Armor - Blue";
        }

        if (v == Clothing.ENERGY_ARMOR__RED) {
            return "Energy Armor - Red";
        }

        if (v == Clothing.MISSION_SUIT__BLACK) {
            return "Mission Suit - Black";
        }

        if (v == Clothing.MISSION_SUIT__PURPLE) {
            return "Mission Suit - Purple";
        }

        if (v == Clothing.COWBOY) {
            return "Cowboy";
        }

        if (v == Clothing.GLITCH_ARMOR) {
            return "Glitch Armor";
        }

        if (v == Clothing.NONE) {
            return "None";
        }
        revert("invalid clothing");
    }

    function toString(Eyes v) external pure returns (string memory) {
        if (v == Eyes.SPACE_VISOR) {
            return "Space Visor";
        }

        if (v == Eyes.ADORABLE) {
            return "Adorable";
        }

        if (v == Eyes.VETERAN) {
            return "Veteran";
        }

        if (v == Eyes.SUNGLASSES) {
            return "Sunglasses";
        }

        if (v == Eyes.WHITE_SUNGLASSES) {
            return "White Sunglasses";
        }

        if (v == Eyes.RED_EYES) {
            return "Red Eyes";
        }

        if (v == Eyes.WINK) {
            return "Wink";
        }

        if (v == Eyes.CASUAL) {
            return "Casual";
        }

        if (v == Eyes.CLOSED) {
            return "Closed";
        }

        if (v == Eyes.DOWNCAST) {
            return "Downcast";
        }

        if (v == Eyes.HAPPY) {
            return "Happy";
        }

        if (v == Eyes.BLUE_EYES) {
            return "Blue Eyes";
        }

        if (v == Eyes.HUD_GLASSES) {
            return "HUD Glasses";
        }

        if (v == Eyes.DARK_SUNGLASSES) {
            return "Dark Sunglasses";
        }

        if (v == Eyes.NIGHT_VISION_GOGGLES) {
            return "Night Vision Goggles";
        }

        if (v == Eyes.BIONIC) {
            return "Bionic";
        }

        if (v == Eyes.HIVE_GOGGLES) {
            return "Hive Goggles";
        }

        if (v == Eyes.MATRIX_GLASSES) {
            return "Matrix Glasses";
        }

        if (v == Eyes.GREEN_GLOW) {
            return "Green Glow";
        }

        if (v == Eyes.ORANGE_GLOW) {
            return "Orange Glow";
        }

        if (v == Eyes.RED_GLOW) {
            return "Red Glow";
        }

        if (v == Eyes.PURPLE_GLOW) {
            return "Purple Glow";
        }

        if (v == Eyes.BLUE_GLOW) {
            return "Blue Glow";
        }

        if (v == Eyes.SKY_GLOW) {
            return "Sky Glow";
        }

        if (v == Eyes.RED_LASER) {
            return "Red Laser";
        }

        if (v == Eyes.BLUE_LASER) {
            return "Blue Laser";
        }

        if (v == Eyes.GOLDEN_SHADES) {
            return "Golden Shades";
        }

        if (v == Eyes.HIPSTER_GLASSES) {
            return "Hipster Glasses";
        }

        if (v == Eyes.PINCENEZ) {
            return "Pince-nez";
        }

        if (v == Eyes.BLUE_SHADES) {
            return "Blue Shades";
        }

        if (v == Eyes.BLIT_GLASSES) {
            return "Blit GLasses";
        }

        if (v == Eyes.NOUNS_GLASSES) {
            return "Nouns Glasses";
        }
        revert("invalid eyes");
    }

    function toString(Fur v) external pure returns (string memory) {
        if (v == Fur.MAGENTA) {
            return "Magenta";
        }

        if (v == Fur.BLUE) {
            return "Blue";
        }

        if (v == Fur.GREEN) {
            return "Green";
        }

        if (v == Fur.RED) {
            return "Red";
        }

        if (v == Fur.BLACK) {
            return "Black";
        }

        if (v == Fur.BROWN) {
            return "Brown";
        }

        if (v == Fur.SILVER) {
            return "Silver";
        }

        if (v == Fur.PURPLE) {
            return "Purple";
        }

        if (v == Fur.PINK) {
            return "Pink";
        }

        if (v == Fur.SEANCE) {
            return "Seance";
        }

        if (v == Fur.TURQUOISE) {
            return "Turquoise";
        }

        if (v == Fur.CRIMSON) {
            return "Crimson";
        }

        if (v == Fur.GREENYELLOW) {
            return "Green-Yellow";
        }

        if (v == Fur.GOLD) {
            return "Gold";
        }

        if (v == Fur.DIAMOND) {
            return "Diamond";
        }

        if (v == Fur.METALLIC) {
            return "Metallic";
        }
        revert("invalid fur");
    }

    function toString(Head v) external pure returns (string memory) {
        if (v == Head.HALO) {
            return "Halo";
        }

        if (v == Head.ENERGY_FIELD) {
            return "Energy Field";
        }

        if (v == Head.BLUE_TOP_HAT) {
            return "Blue Top Hat";
        }

        if (v == Head.RED_TOP_HAT) {
            return "Red Top Hat";
        }

        if (v == Head.ENERGY_CRYSTAL) {
            return "Energy Crystal";
        }

        if (v == Head.CROWN) {
            return "Crown";
        }

        if (v == Head.BANDANA) {
            return "Bandana";
        }

        if (v == Head.BUCKET_HAT) {
            return "Bucket Hat";
        }

        if (v == Head.HOMBURG_HAT) {
            return "Homburg Hat";
        }

        if (v == Head.PROPELLER_HAT) {
            return "Propeller Hat";
        }

        if (v == Head.HEADBAND) {
            return "Headband";
        }

        if (v == Head.DORAG) {
            return "Do-rag";
        }

        if (v == Head.PURPLE_COWBOY_HAT) {
            return "Purple Cowboy Hat";
        }

        if (v == Head.SPACESUIT_HELMET) {
            return "Spacesuit Helmet";
        }

        if (v == Head.PARTY_HAT) {
            return "Party Hat";
        }

        if (v == Head.CAP) {
            return "Cap";
        }

        if (v == Head.LEATHER_COWBOY_HAT) {
            return "Leather Cowboy Hat";
        }

        if (v == Head.CYBER_HELMET__BLUE) {
            return "Cyber Helmet - Blue";
        }

        if (v == Head.CYBER_HELMET__RED) {
            return "Cyber Helmet - Red";
        }

        if (v == Head.SAMURAI_HAT) {
            return "Samurai Hat";
        }

        if (v == Head.NONE) {
            return "None";
        }
        revert("invalid head");
    }

    function toString(Mouth v) external pure returns (string memory) {
        if (v == Mouth.SMIRK) {
            return "Smirk";
        }

        if (v == Mouth.SURPRISED) {
            return "Surprised";
        }

        if (v == Mouth.SMILE) {
            return "Smile";
        }

        if (v == Mouth.PIPE) {
            return "Pipe";
        }

        if (v == Mouth.OPEN_SMILE) {
            return "Open Smile";
        }

        if (v == Mouth.NEUTRAL) {
            return "Neutral";
        }

        if (v == Mouth.MASK) {
            return "Mask";
        }

        if (v == Mouth.TONGUE_OUT) {
            return "Tongue Out";
        }

        if (v == Mouth.GOLD_GRILL) {
            return "Gold Grill";
        }

        if (v == Mouth.DIAMOND_GRILL) {
            return "Diamond Grill";
        }

        if (v == Mouth.NAVY_RESPIRATOR) {
            return "Navy Respirator";
        }

        if (v == Mouth.RED_RESPIRATOR) {
            return "Red Respirator";
        }

        if (v == Mouth.MAGENTA_RESPIRATOR) {
            return "Magenta Respirator";
        }

        if (v == Mouth.GREEN_RESPIRATOR) {
            return "Green Respirator";
        }

        if (v == Mouth.MEMPO) {
            return "Mempo";
        }

        if (v == Mouth.VAPE) {
            return "Vape";
        }

        if (v == Mouth.PILOT_OXYGEN_MASK) {
            return "Pilot Oxygen Mask";
        }

        if (v == Mouth.CIGAR) {
            return "Cigar";
        }

        if (v == Mouth.BANANA) {
            return "Banana";
        }

        if (v == Mouth.CHROME_RESPIRATOR) {
            return "Chrome Respirator";
        }

        if (v == Mouth.STOIC) {
            return "Stoic";
        }
        revert("invalid mouth");
    }
}

// File: contracts/Base64.sol



//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// shamelessly stolen from the anonymice contract
library Base64 {
    string internal constant TABLE =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /**
     * @dev Converts the input data into a base64 string.
     */
    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return "";

        // load the table into memory
        string memory table = TABLE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {

            } lt(dataPtr, endPtr) {

            } {
                dataPtr := add(dataPtr, 3)

                // read 3 bytes
                let input := mload(dataPtr)

                // write 4 characters
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(input, 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }
        }

        return result;
    }
}

// File: contracts/Integer.sol



//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

library Integer {
    /**
     * @dev Gets the bit at the given position in the given integer.
     *      255 is the leftmost bit, 0 is the rightmost bit.
     *
     *      For example: bitAt(2, 0) == 0, because the rightmost bit of 10 is 0
     *                   bitAt(2, 1) == 1, because the second to last bit of 10 is 1
     */
    function bitAt(uint integer, uint pos) internal pure returns (uint) {
        require(pos <= 255, "pos > 255");

        return (integer & (1 << pos)) >> pos;
    }

    function setBitAt(uint integer, uint pos) internal pure returns (uint) {
        return integer | (1 << pos);
    }

    /**
     * @dev Gets the value of the bits between left and right, both inclusive, in the given integer.
     *      255 is the leftmost bit, 0 is the rightmost bit.
     *      
     *      For example: bitsFrom(10, 3, 1) == 7 (101 in binary), because 10 is *101*0 in binary
     *                   bitsFrom(10, 2, 0) == 2 (010 in binary), because 10 is 1*010* in binary
     */
    function bitsFrom(uint integer, uint left, uint right) internal pure returns (uint) {
        require(left >= right, "left > right");
        require(left <= 255, "left > 255");

        uint delta = left - right + 1;

        return (integer & (((1 << delta) - 1) << right)) >> right;
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol



// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}