ETH Price: $3,116.33 (+0.63%)

Token

███ (███)
 

Overview

Max Total Supply

2,999 ███

Holders

1,236

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 ███
0xb6cFdEDbEA256B7d784A29ED35bf5F1c43d3F3D3
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
GenArtNFT

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 9999 runs

Other Settings:
default evmVersion
File 1 of 6 : GenArtNFT.sol
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity ^0.8.10;

import "@rari-capital/solmate/src/tokens/ERC721.sol";
import "./NFTDescriptor.sol";

contract GenArtNFT is ERC721 {
    uint256 internal constant MAX_SUPPLY = 3000;

    bool public mintable;
    uint16 public dimensionLimits;
    uint24 public totalSupply;
    address public tokenDescriptor;
    address public owner;
    uint128[MAX_SUPPLY] public tokenData;

    constructor() ERC721(unicode"███", unicode"███") {
        owner = msg.sender;
        dimensionLimits = 0x6166;
    }

    function mint(uint128 data) external {
        require(mintable, "Minting disabled");
        uint256 ncol = (data >> 0) & 0x7;
        uint256 nrow = (data >> 3) & 0x7;
        uint256 dim = dimensionLimits;
        //prettier-ignore
        require(
            ncol >= ((dim >> 0)  & 0xF) &&
            ncol <= ((dim >> 4)  & 0xF) &&
            nrow >= ((dim >> 8)  & 0xF) &&
            nrow <= ((dim >> 12) & 0xF),
            "Invalid Data"
        );
        uint256 tokenId = ++totalSupply;
        require(tokenId <= MAX_SUPPLY, "Exceed max supply");
        uint256 rand = uint256(keccak256(abi.encodePacked(msg.sender, block.timestamp, block.number, tokenId))) % 8;
        tokenData[tokenId] = (uint128(rand) << 120) | uint120(data);
        _mint(msg.sender, tokenId);
    }

    function _getData(uint256 tokenId)
        internal
        view
        returns (
            uint256 ncol,
            uint256 nrow,
            uint256 result,
            uint256 salt
        )
    {
        uint256 data = tokenData[tokenId];
        require(data != 0, "Token not exists");
        ncol = (data >> 0) & 0x7;
        nrow = (data >> 3) & 0x7;
        result = uint120(data) >> 6;
        salt = data;
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        if (tokenDescriptor != address(0)) {
            return IERC721Descriptor(tokenDescriptor).tokenURI(tokenId);
        }
        (uint256 ncol, uint256 nrow, uint256 result, uint256 salt) = _getData(tokenId);
        return NFTDescriptor.constructTokenURI(tokenId, result, ncol, nrow, salt, name);
    }

    function imageURI(uint256 tokenId) external view returns (string memory) {
        (uint256 ncol, uint256 nrow, uint256 result, uint256 salt) = _getData(tokenId);
        return NFTDescriptor.makeImageURI(result, ncol, nrow, salt);
    }

    function squares(uint256 tokenId) external view returns (string memory) {
        (uint256 ncol, uint256 nrow, uint256 result, ) = _getData(tokenId);
        return NFTDescriptor.makeSquares(result, ncol, nrow);
    }

    // ----------

    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

    function setOwner(address newOwner) external onlyOwner {
        owner = newOwner;
    }

    function setInfo(string calldata _name, string calldata _symbol) external onlyOwner {
        name = _name;
        symbol = _symbol;
    }

    function setMintable(bool _mintable) external onlyOwner {
        mintable = _mintable;
    }

    function setDimensionLimit(uint16 _dimensionLimits) external onlyOwner {
        dimensionLimits = _dimensionLimits;
    }

    // only in case we need to patch the art logic
    function setTokenDescriptor(address _descriptor) external onlyOwner {
        tokenDescriptor = _descriptor;
    }
}

interface IERC721Descriptor {
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 2 of 6 : ERC721.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern, minimalist, and gas efficient ERC-721 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)
/// @dev Note that balanceOf does not revert if passed the zero address, in defiance of the ERC.
abstract contract ERC721 {
    /*///////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 indexed id);

    event Approval(address indexed owner, address indexed spender, uint256 indexed id);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /*///////////////////////////////////////////////////////////////
                          METADATA STORAGE/LOGIC
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    function tokenURI(uint256 id) public view virtual returns (string memory);

    /*///////////////////////////////////////////////////////////////
                            ERC721 STORAGE                        
    //////////////////////////////////////////////////////////////*/

    mapping(address => uint256) public balanceOf;

    mapping(uint256 => address) public ownerOf;

    mapping(uint256 => address) public getApproved;

    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /*///////////////////////////////////////////////////////////////
                              CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(string memory _name, string memory _symbol) {
        name = _name;
        symbol = _symbol;
    }

    /*///////////////////////////////////////////////////////////////
                              ERC721 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 id) public virtual {
        address owner = ownerOf[id];

        require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED");

        getApproved[id] = spender;

        emit Approval(owner, spender, id);
    }

    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function transferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        require(from == ownerOf[id], "WRONG_FROM");

        require(to != address(0), "INVALID_RECIPIENT");

        require(
            msg.sender == from || msg.sender == getApproved[id] || isApprovedForAll[from][msg.sender],
            "NOT_AUTHORIZED"
        );

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            balanceOf[from]--;

            balanceOf[to]++;
        }

        ownerOf[id] = to;

        delete getApproved[id];

        emit Transfer(from, to, id);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes memory data
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    /*///////////////////////////////////////////////////////////////
                              ERC165 LOGIC
    //////////////////////////////////////////////////////////////*/

    function supportsInterface(bytes4 interfaceId) public pure virtual returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
            interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
    }

    /*///////////////////////////////////////////////////////////////
                       INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 id) internal virtual {
        require(to != address(0), "INVALID_RECIPIENT");

        require(ownerOf[id] == address(0), "ALREADY_MINTED");

        // Counter overflow is incredibly unrealistic.
        unchecked {
            balanceOf[to]++;
        }

        ownerOf[id] = to;

        emit Transfer(address(0), to, id);
    }

    function _burn(uint256 id) internal virtual {
        address owner = ownerOf[id];

        require(ownerOf[id] != address(0), "NOT_MINTED");

        // Ownership check above ensures no underflow.
        unchecked {
            balanceOf[owner]--;
        }

        delete ownerOf[id];

        delete getApproved[id];

        emit Transfer(owner, address(0), id);
    }

    /*///////////////////////////////////////////////////////////////
                       INTERNAL SAFE MINT LOGIC
    //////////////////////////////////////////////////////////////*/

    function _safeMint(address to, uint256 id) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function _safeMint(
        address to,
        uint256 id,
        bytes memory data
    ) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }
}

/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)
interface ERC721TokenReceiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 id,
        bytes calldata data
    ) external returns (bytes4);
}

File 3 of 6 : NFTDescriptor.sol
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity ^0.8.10;

import "./NFTArt.sol";
import "base64-sol/base64.sol";

library NFTDescriptor {
    function constructTokenURI(
        uint256 tokenId,
        uint256 result,
        uint256 ncol,
        uint256 nrow,
        uint256 salt,
        string memory collectionName
    ) internal pure returns (string memory) {
        string memory image = Base64.encode(NFTArt.drawSVG(result, ncol, nrow, salt));
        bytes memory metadata = abi.encodePacked(
            '{"name":"',
            collectionName,
            " #",
            uintToString(tokenId),
            '", "description":"',
            "Completely on-chain generative art collection. Art is uniquely generated based on the minter's result in our rebranding game. Limited edition. \\n\\nThe minter's result:\\n",
            makeSquares(result, ncol, nrow),
            '", "image": "',
            "data:image/svg+xml;base64,",
            image,
            '"}'
        );
        return string(abi.encodePacked("data:application/json;base64,", Base64.encode(metadata)));
    }

    function makeSquares(
        uint256 result,
        uint256 ncol,
        uint256 nrow
    ) internal pure returns (string memory) {
        unchecked {
            bytes[8] memory rows;
            for (uint256 q = 0; q < nrow; ++q) {
                string[8] memory strs;
                for (uint256 p = ncol - 1; p != type(uint256).max; --p) {
                    uint256 res = result % 3;
                    strs[p] = res == 0 ? hex"e2ac9cefb88f" : res == 1 ? hex"f09f9fa8" : hex"f09f9fa9";
                    result /= 3;
                }
                rows[q] = abi.encodePacked(strs[0], strs[1], strs[2], strs[3], strs[4], strs[5], strs[6], strs[7], "\\n");
            }
            return string(abi.encodePacked(rows[0], rows[1], rows[2], rows[3], rows[4], rows[5], rows[6], rows[7]));
        }
    }

    function makeImageURI(
        uint256 result,
        uint256 ncol,
        uint256 nrow,
        uint256 salt
    ) internal pure returns (string memory) {
        string memory image = Base64.encode(NFTArt.drawSVG(result, ncol, nrow, salt));
        return string(abi.encodePacked("data:image/svg+xml;base64,", image));
    }

    function uintToString(uint256 value) internal pure returns (string memory) {
        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);
    }
}

File 4 of 6 : NFTArt.sol
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity ^0.8.10;

import "./RNG.sol";

library NFTArt {
    using RNG for RNG.Data;

    uint256 internal constant W_BASE = 30;
    uint256 internal constant W_RAND = 30;
    uint256 internal constant L_BASE = 30;
    uint256 internal constant L_RAND = 30;
    uint256 internal constant H_BASE = 20;
    uint256 internal constant H_RAND = 40;
    uint256 internal constant LAST_ROW_MIN_L = 55;
    uint256 internal constant FIRST_COL_MIN_W = 25;

    bytes6 internal constant FRAME_COLOR = "332E22";
    bytes6 internal constant COLOR1 = "E8E4DC";
    bytes internal constant COLOR2 = "6688EE6688EEFCBC18FDBD2EFE514EF2532DE7AC52EC6B2558C9EDEC6B25457DB6FCD265999999C3B89FF4AB13208793";
    bytes internal constant COLOR3 = "EE6666EE666628A7914561CC6CC2820B9594639AA0639AA0EF8FA3623A53DC5357DC505355555550978E9FBBC1C92B28";
    bytes internal constant BG_COLOR = "FBF5E9FBF5E9FBECE9F7F2E6ECEBE8EAEAEAF5EEE6";

    int256 internal constant LOGO_LENGTH = 112 * 35; // logo scale: 35
    int256 internal constant SCALE = 100;
    int256 internal constant OFFSET_X = ((600 / 2) + 0) * SCALE;
    int256 internal constant OFFSET_Y = ((600 / 2) + 20) * SCALE;
    int256 internal constant COS_30 = 86602540;
    int256 internal constant SIN_30 = 50000000;

    /**
     * w:       block width
     * l:       block length
     * h:       block height
     * (p, q):  block position in virtual plane
     * (x, y):  block position in projected plane
     */

    function isometric(int256 p, int256 q) internal pure returns (int256 x, int256 y) {
        unchecked {
            x = ((p + q) * COS_30) / 1e8 + OFFSET_X;
            y = ((q - p) * SIN_30) / 1e8 + OFFSET_Y;
        }
    }

    function intToString(int256 value) internal pure returns (bytes5 buffer) {
        assert(value >= 0 && value <= 99999);
        unchecked {
            // prettier-ignore
            buffer = bytes5(0x3030303030 + uint40(
                ((((uint256(value) / 1e0) % 10)) << 0) |
                ((((uint256(value) / 1e1) % 10)) << 8) |
                ((((uint256(value) / 1e2) % 10)) << 16) |
                ((((uint256(value) / 1e3) % 10)) << 24) |
                ((((uint256(value) / 1e4) % 10)) << 32)
            ));
        }
    }

    function pickColor(bytes memory choices, uint256 rand) internal pure returns (bytes6 picked) {
        unchecked {
            uint256 i = (rand % (choices.length / 6)) * 6;
            assembly {
                picked := mload(add(add(choices, 32), i))
            }
        }
    }

    struct Plane {
        int256 ax;
        int256 ay;
        int256 bx;
        int256 by;
        int256 cx;
        int256 cy;
        int256 dx;
        int256 dy;
    }

    function makeBlock(
        int256 p,
        int256 q,
        int256 w,
        int256 l,
        int256 h,
        bytes6 color,
        bool addLogo
    ) internal pure returns (bytes memory blk) {
        unchecked {
            Plane memory ground;
            (ground.ax, ground.ay) = isometric(p, q);
            (ground.bx, ground.by) = isometric(p + w, q);
            (ground.cx, ground.cy) = isometric(p + w, q + l);
            (ground.dx, ground.dy) = isometric(p, q + l);

            Plane memory cover = Plane({
                ax: ground.ax,
                ay: ground.ay - h,
                bx: ground.bx,
                by: ground.by - h,
                cx: ground.cx,
                cy: ground.cy - h,
                dx: ground.dx,
                dy: ground.dy - h
            });

            // prettier-ignore
            bytes memory coverCode = abi.encodePacked(
                '<path d="M', intToString(cover.ax), ",", intToString(cover.ay),
                "L", intToString(cover.bx), ",", intToString(cover.by),
                "L", intToString(cover.cx), ",", intToString(cover.cy),
                "L", intToString(cover.dx), ",", intToString(cover.dy), 'Z" fill="#', color, '"/>'
            );
            // prettier-ignore
            bytes memory sides = abi.encodePacked(
                '<path d="M', intToString(cover.ax), ",", intToString(cover.ay),
                "L", intToString(cover.dx), ",", intToString(cover.dy),
                "L", intToString(cover.cx), ",", intToString(cover.cy),
                "V", intToString(ground.cy),
                "L", intToString(ground.dx), ",", intToString(ground.dy),
                "L", intToString(ground.ax), ",", intToString(ground.ay), 'Z"/>'
            );
            blk = abi.encodePacked(sides, coverCode);

            if (addLogo) {
                (int256 x, int256 y) = isometric(p + w / 2, q + (l - LOGO_LENGTH) / 2);
                blk = abi.encodePacked(blk, '<use href="#logo" x="', intToString(x), '" y="', intToString(y - h), '"/>');
            }
        }
    }

    function makeBlocks(Config memory cfg) internal pure returns (bytes[8] memory rows) {
        unchecked {
            int256 qMemo = 0;
            for (uint256 q = 0; q < cfg.nrow; q++) {
                bytes[8] memory bs;
                int256 l = int256(cfg.ls[q]);

                uint256 i = 0;
                for (uint256 p = cfg.ncol - 1; p != type(uint256).max; --p) {
                    bytes6 color = cfg.colors[cfg.result % 3];
                    int256 w = int256(cfg.ws[p]);
                    int256 h = int256(cfg.hs[q][p]);
                    int256 pAdjusted = cfg.offsetP + int256(p == 0 ? 0 : cfg.wsCumSum[p - 1]);
                    int256 qAdjusted = cfg.offsetQ + qMemo;
                    bool addLogo = q == cfg.nrow - 1 && p == 0;

                    bs[i++] = makeBlock(pAdjusted, qAdjusted, w, l, h, color, addLogo);
                    cfg.result /= 3;
                }
                rows[q] = abi.encodePacked(bs[0], bs[1], bs[2], bs[3], bs[4], bs[5], bs[6], bs[7]);
                qMemo += l;
            }
        }
    }

    function makeSvg(Config memory cfg) internal pure returns (bytes memory svg) {
        bytes[8] memory rows = makeBlocks(cfg);
        svg = abi.encodePacked(
            '<svg viewBox="0 0 60000 60000" xmlns="http://www.w3.org/2000/svg">'
            '<def><g id="logo" fill="#332E22" stroke-width="0" transform="scale(35)">'
            '<path d="M18 20c2 1 2.3 2.3.6 3.2S14 24 12 23c-2-1-2.2-2.4-.6-3.2s4.6-1 6.6.1zm5.3 12.6c1.7-1 1.4-2.3-.6-3.2s-5-1-6.5-.2-1.3 2.3.6 3.2c2 1 4.8 1 6.5.2z"/>'
            '<path fill-rule="evenodd" d="M80 19.5C84.6 1 29.2-3.6 11 8-8.7 17.8 1 48 35.7 44.4c.2.2.5.3.8.4l23 9.8c1.8.8 4.3.7 6-.2L99.8 35c1.6-1 1.6-2.2.1-3.2l-19-12c-.3-.2-.6-.3-1-.4zM48.6 34C16.5 51-6.8 22.3 16 10.5 10 22 78 15.4 48.6 34zm45.2-.6l-13 7.4c-3-1-9.8-6.7-13.5-4.3-4.4 2 6.6 5.5 8.6 7L71 46.3c-3-1-11-6.5-14-4-3.8 2 7.4 5.2 9.5 6.6l-4 2.3L42.8 43l35-19.7 16 10.2z"/>'
            "</g></def>"
            '<rect width="60000" height="60000" fill="#',
            cfg.frameColor,
            '"/>'
            '<rect x="2500" y="2500" width="55000" height="55000" stroke="#332E22" stroke-width="200" fill="#',
            cfg.bgColor,
            '"/>'
            '<g fill="#332E22" stroke="#332E22" stroke-width="100">'
        );
        svg = abi.encodePacked(svg, rows[0], rows[1], rows[2], rows[3], rows[4], rows[5], rows[6], rows[7], "</g></svg>");
    }

    // ------- config -------

    struct Config {
        uint256 result;
        uint256 ncol;
        uint256 nrow;
        int256 offsetP;
        int256 offsetQ;
        uint256[8] ws;
        uint256[8] ls;
        uint256[8][8] hs;
        uint256[8] wsCumSum;
        bytes6[3] colors;
        bytes6 bgColor;
        bytes6 frameColor;
    }

    function generateConfig(
        uint256 result,
        uint256 ncol,
        uint256 nrow,
        uint256 salt
    ) internal pure returns (Config memory cfg) {
        RNG.Data memory rng = RNG.Data(salt, 0);

        cfg.result = result;
        cfg.ncol = ncol;
        cfg.nrow = nrow;

        cfg.colors[0] = COLOR1;
        cfg.colors[1] = pickColor(COLOR2, rng.rand());
        cfg.colors[2] = pickColor(COLOR3, rng.rand());
        cfg.bgColor = pickColor(BG_COLOR, rng.rand());
        cfg.frameColor = FRAME_COLOR;

        while (true) {
            // generate widths
            unchecked {
                uint256[8] memory ws = cfg.ws;
                uint256[8] memory wsCumSum = cfg.wsCumSum;
                uint256 rand = rng.rand();
                uint256 memo = 0;
                for (uint256 p = 0; p < ncol; ++p) {
                    uint256 w = (W_BASE + ((rand >> (8 * p)) % W_RAND)) * uint256(SCALE);
                    if (p == 0 && w < FIRST_COL_MIN_W) w = FIRST_COL_MIN_W;
                    wsCumSum[p] = (memo += (ws[p] = w));
                }
                cfg.offsetP = -int256(memo) / 2;
            }

            // generate lengths
            unchecked {
                uint256[8] memory ls = cfg.ls;
                uint256 rand = rng.rand();
                uint256 memo = 0;
                for (uint256 q = 0; q < nrow; ++q) {
                    uint256 l = (L_BASE + ((rand >> (8 * q)) % L_RAND)) * uint256(SCALE);
                    if (q == nrow - 1 && l < LAST_ROW_MIN_L) l = LAST_ROW_MIN_L;
                    memo += (ls[q] = l);
                }
                cfg.offsetQ = -int256(memo) / 2;
            }

            // ensure no "out of canvas"
            (int256 x0, ) = isometric(cfg.offsetP, cfg.offsetQ);
            if (x0 >= 3000) break;
        }

        // generate heights
        unchecked {
            uint256[8][8] memory hs = cfg.hs;
            for (uint256 q = 0; q < nrow; ++q) {
                uint256 rand = rng.rand();
                for (uint256 p = 0; p < ncol; ++p) {
                    hs[q][p] = (H_BASE + ((rand >> (8 * p)) % H_RAND)) * uint256(SCALE);
                }
            }
        }
    }

    // ------- entry point -------

    function drawSVG(
        uint256 result,
        uint256 ncol,
        uint256 nrow,
        uint256 salt
    ) internal pure returns (bytes memory svg) {
        return makeSvg(generateConfig(result, ncol, nrow, salt));
    }
}

File 5 of 6 : base64.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0;

/// @title Base64
/// @author Brecht Devos - <[email protected]>
/// @notice Provides functions for encoding/decoding base64
library Base64 {
    string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    bytes  internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000"
                                            hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000"
                                            hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000"
                                            hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000";

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';

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

        // 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) {}
            {
                // read 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // write 4 characters
                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F))))
                resultPtr := add(resultPtr, 1)
                mstore8(resultPtr, 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;
    }

    function decode(string memory _data) internal pure returns (bytes memory) {
        bytes memory data = bytes(_data);

        if (data.length == 0) return new bytes(0);
        require(data.length % 4 == 0, "invalid base64 decoder input");

        // load the table into memory
        bytes memory table = TABLE_DECODE;

        // every 4 characters represent 3 bytes
        uint256 decodedLen = (data.length / 4) * 3;

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

        assembly {
            // padding with '='
            let lastBytes := mload(add(data, mload(data)))
            if eq(and(lastBytes, 0xFF), 0x3d) {
                decodedLen := sub(decodedLen, 1)
                if eq(and(lastBytes, 0xFFFF), 0x3d3d) {
                    decodedLen := sub(decodedLen, 1)
                }
            }

            // set the actual output length
            mstore(result, decodedLen)

            // 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, 4 characters at a time
            for {} lt(dataPtr, endPtr) {}
            {
               // read 4 characters
               dataPtr := add(dataPtr, 4)
               let input := mload(dataPtr)

               // write 3 bytes
               let output := add(
                   add(
                       shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)),
                       shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))),
                   add(
                       shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)),
                               and(mload(add(tablePtr, and(        input , 0xFF))), 0xFF)
                    )
                )
                mstore(resultPtr, shl(232, output))
                resultPtr := add(resultPtr, 3)
            }
        }

        return result;
    }
}

File 6 of 6 : RNG.sol
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity ^0.8.10;

library RNG {
    struct Data {
        uint256 seed;
        uint256 i;
    }

    function rand(Data memory rng) internal pure returns (uint256) {
        unchecked {
            return uint256(keccak256(abi.encode(rng.seed, rng.i++)));
        }
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 9999
  },
  "metadata": {
    "bytecodeHash": "none"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dimensionLimits","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"imageURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"data","type":"uint128"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dimensionLimits","type":"uint16"}],"name":"setDimensionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"setInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_mintable","type":"bool"}],"name":"setMintable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_descriptor","type":"address"}],"name":"setTokenDescriptor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"squares","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenData","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenDescriptor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040805180820182526009808252681c52d11c52d11c52d160bb1b60208084018281528551808701909652928552840152815191929162000056916000916200009a565b5080516200006c9060019060208401906200009a565b5050600780546001600160a01b0319163317905550600680546261660062ffff00199091161790556200017d565b828054620000a89062000140565b90600052602060002090601f016020900481019282620000cc576000855562000117565b82601f10620000e757805160ff191683800117855562000117565b8280016001018555821562000117579182015b8281111562000117578251825591602001919060010190620000fa565b506200012592915062000129565b5090565b5b808211156200012557600081556001016200012a565b600181811c908216806200015557607f821691505b602082108114156200017757634e487b7160e01b600052602260045260246000fd5b50919050565b614049806200018d6000396000f3fe608060405234801561001057600080fd5b50600436106101b95760003560e01c806369d3e20e116100f9578063a923fc4011610097578063b88d4fde11610071578063b88d4fde1461045d578063c87b56dd14610470578063d66732b814610483578063e985e9c5146104a957600080fd5b8063a923fc4014610403578063b4b5b48f14610416578063b6dc7ea31461044a57600080fd5b80638da5cb5b116100d35780638da5cb5b146103b55780638f742d16146103d557806395d89b41146103e8578063a22cb465146103f057600080fd5b806369d3e20e146103615780636c73ca101461037457806370a082311461038757600080fd5b80631d1d15d41161016657806342842e0e1161014057806342842e0e146102e15780634bf365df146102f45780635a9d7a68146103015780636352211e1461032b57600080fd5b80631d1d15d4146102a857806323b872dd146102bb578063285d70d4146102ce57600080fd5b8063095ea7b311610197578063095ea7b31461025657806313af40351461026b57806318160ddd1461027e57600080fd5b806301ffc9a7146101be57806306fdde03146101e6578063081812fc146101fb575b600080fd5b6101d16101cc3660046127e0565b6104d7565b60405190151581526020015b60405180910390f35b6101ee6105bc565b6040516101dd919061285c565b61023161020936600461286f565b60046020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101dd565b6102696102643660046128b1565b61064a565b005b6102696102793660046128db565b61077f565b600654610294906301000000900462ffffff1681565b60405162ffffff90911681526020016101dd565b6101ee6102b636600461286f565b6107ea565b6102696102c93660046128f6565b610815565b6102696102dc366004612942565b610a70565b6102696102ef3660046128f6565b610ac5565b6006546101d19060ff1681565b600654610231906601000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61023161033936600461286f565b60036020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b61026961036f36600461295d565b610c15565b61026961038236600461298f565b610ea2565b6103a76103953660046128db565b60026020526000908152604090205481565b6040519081526020016101dd565b6007546102319073ffffffffffffffffffffffffffffffffffffffff1681565b6101ee6103e336600461286f565b610f00565b6101ee610f2f565b6102696103fe3660046129b3565b610f3c565b610269610411366004612a2f565b610fd3565b61042961042436600461286f565b611017565b6040516fffffffffffffffffffffffffffffffff90911681526020016101dd565b6102696104583660046128db565b611054565b61026961046b366004612b23565b6110c9565b6101ee61047e36600461286f565b611206565b60065461049690610100900461ffff1681565b60405161ffff90911681526020016101dd565b6101d16104b7366004612bce565b600560209081526000928352604080842090915290825290205460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061056a57507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b806105b657507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b600080546105c990612bf8565b80601f01602080910402602001604051908101604052809291908181526020018280546105f590612bf8565b80156106425780601f1061061757610100808354040283529160200191610642565b820191906000526020600020905b81548152906001019060200180831161062557829003601f168201915b505050505081565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff16338114806106ad575073ffffffffffffffffffffffffffffffffffffffff8116600090815260056020908152604080832033845290915290205460ff165b6106fe5760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064015b60405180910390fd5b60008281526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60075473ffffffffffffffffffffffffffffffffffffffff1633146107a357600080fd5b600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b606060008060006107fa85611380565b5092509250925061080c818484611444565b95945050505050565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff84811691161461088b5760405162461bcd60e51b815260206004820152600a60248201527f57524f4e475f46524f4d0000000000000000000000000000000000000000000060448201526064016106f5565b73ffffffffffffffffffffffffffffffffffffffff82166108ee5760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e5400000000000000000000000000000060448201526064016106f5565b3373ffffffffffffffffffffffffffffffffffffffff84161480610935575060008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1633145b80610970575073ffffffffffffffffffffffffffffffffffffffff8316600090815260056020908152604080832033845290915290205460ff165b6109bc5760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016106f5565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526002602090815260408083208054600019019055938616808352848320805460010190558583526003825284832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610a9457600080fd5b600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b610ad0838383610815565b73ffffffffffffffffffffffffffffffffffffffff82163b1580610bc457506040517f150b7a020000000000000000000000000000000000000000000000000000000080825233600483015273ffffffffffffffffffffffffffffffffffffffff858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610b7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba09190612c4c565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b610c105760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e540000000000000000000000000000000060448201526064016106f5565b505050565b60065460ff16610c675760405162461bcd60e51b815260206004820152601060248201527f4d696e74696e672064697361626c65640000000000000000000000000000000060448201526064016106f5565b600654600782811691600384901c90911690610100900461ffff811690600f168310801590610c9d5750600481901c600f168311155b8015610cb05750600881901c600f168210155b8015610cc35750600c81901c600f168211155b610d0f5760405162461bcd60e51b815260206004820152600c60248201527f496e76616c69642044617461000000000000000000000000000000000000000060448201526064016106f5565b60006006600381819054906101000a900462ffffff16610d2e90612c98565b91906101000a81548162ffffff021916908362ffffff160217905562ffffff169050610bb8811115610da25760405162461bcd60e51b815260206004820152601160248201527f457863656564206d617820737570706c7900000000000000000000000000000060448201526064016106f5565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152426034820152436054820152607481018290526000906008906094016040516020818303038152906040528051906020012060001c610e0f9190612cea565b9050856effffffffffffffffffffffffffffff166078826fffffffffffffffffffffffffffffffff16901b17600883610bb88110610e4f57610e4f612cfe565b600291828204019190066010026101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550610e9a338361161e565b505050505050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610ec657600080fd5b6006805461ffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff909216919091179055565b6060600080600080610f1186611380565b9350935093509350610f2582858584611783565b9695505050505050565b600180546105c990612bf8565b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610ff757600080fd5b611003600085856125e6565b50611010600183836125e6565b5050505050565b600881610bb8811061102857600080fd5b60029182820401919006601002915054906101000a90046fffffffffffffffffffffffffffffffff1681565b60075473ffffffffffffffffffffffffffffffffffffffff16331461107857600080fd5b6006805473ffffffffffffffffffffffffffffffffffffffff9092166601000000000000027fffffffffffff0000000000000000000000000000000000000000ffffffffffff909216919091179055565b6110d4848484610815565b73ffffffffffffffffffffffffffffffffffffffff83163b15806111b457506040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff85169063150b7a029061114d903390899088908890600401612d2d565b6020604051808303816000875af115801561116c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111909190612c4c565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b6112005760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e540000000000000000000000000000000060448201526064016106f5565b50505050565b6006546060906601000000000000900473ffffffffffffffffffffffffffffffffffffffff16156112d1576006546040517fc87b56dd00000000000000000000000000000000000000000000000000000000815260048101849052660100000000000090910473ffffffffffffffffffffffffffffffffffffffff169063c87b56dd90602401600060405180830381865afa1580156112a9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105b69190810190612d6c565b6000806000806112e086611380565b9350935093509350610f258683868685600080546112fd90612bf8565b80601f016020809104026020016040519081016040528092919081815260200182805461132990612bf8565b80156113765780601f1061134b57610100808354040283529160200191611376565b820191906000526020600020905b81548152906001019060200180831161135957829003601f168201915b50505050506117c8565b6000806000806000600886610bb8811061139c5761139c612cfe565b60028104919091015460019091166010026101000a90046fffffffffffffffffffffffffffffffff169050806114145760405162461bcd60e51b815260206004820152601060248201527f546f6b656e206e6f74206578697374730000000000000000000000000000000060448201526064016106f5565b600780821697600383901c90911696506e03ffffffffffffffffffffffffffff600683901c169550909350915050565b606061144e612688565b60005b838110156115c557611461612688565b60001986015b6000198114611556576003880680156114f857806001146114bd576040518060400160405280600481526020017ff09f9fa90000000000000000000000000000000000000000000000000000000081525061152f565b6040518060400160405280600481526020017ff09f9fa80000000000000000000000000000000000000000000000000000000081525061152f565b6040518060400160405280600681526020017fe2ac9cefb88f00000000000000000000000000000000000000000000000000008152505b83836008811061154157611541612cfe565b60200201526003890498505060001901611467565b5080516020808301516040808501516060860151608087015160a088015160c089015160e08a015195516115969998959694959394929391929101612df6565b6040516020818303038152906040528383600881106115b7576115b7612cfe565b602002015250600101611451565b5080516020808301516040808501516060860151608087015160a088015160c089015160e08a015195516116059998959694959394929391929101612ec0565b6040516020818303038152906040529150509392505050565b73ffffffffffffffffffffffffffffffffffffffff82166116815760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e5400000000000000000000000000000060448201526064016106f5565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff16156116f35760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f4d494e54454400000000000000000000000000000000000060448201526064016106f5565b73ffffffffffffffffffffffffffffffffffffffff8216600081815260026020908152604080832080546001019055848352600390915280822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060600061179b6117968787878761184f565b611865565b9050806040516020016117ae9190612f65565b604051602081830303815290604052915050949350505050565b606060006117db6117968888888861184f565b90506000836117e98a611a20565b6117f48a8a8a611444565b846040516020016118089493929190612faa565b604051602081830303815290604052905061182281611865565b60405160200161183291906131d3565b604051602081830303815290604052925050509695505050505050565b606061080c61186086868686611b5a565b611ec3565b606081516000141561188557505060408051602081019091526000815290565b6000604051806060016040528060408152602001613fd360409139905060006003845160026118b49190613218565b6118be9190613230565b6118c9906004613244565b905060006118d8826020613218565b67ffffffffffffffff8111156118f0576118f0612a9b565b6040519080825280601f01601f19166020018201604052801561191a576020820181803683370190505b509050818152600183018586518101602084015b81831015611986576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f811685015182535060010161192e565b6003895106600181146119a057600281146119ea57611a12565b7f3d3d0000000000000000000000000000000000000000000000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe830152611a12565b7f3d000000000000000000000000000000000000000000000000000000000000006000198301525b509398975050505050505050565b606081611a6057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611a8a5780611a7481613263565b9150611a839050600a83613230565b9150611a64565b60008167ffffffffffffffff811115611aa557611aa5612a9b565b6040519080825280601f01601f191660200182016040528015611acf576020820181803683370190505b5090505b8415611b5257611ae460018361327e565b9150611af1600a86612cea565b611afc906030613218565b60f81b818381518110611b1157611b11612cfe565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611b4b600a86613230565b9450611ad3565b949350505050565b611b626126b0565b60408051808201825283815260006020808301919091528784528381018790528383018690526101208401517f4538453444430000000000000000000000000000000000000000000000000000905282516080810190935260608084529192611bdc929091613f7390830139611bd783611f55565b611f9f565b6101208301517fffffffffffff00000000000000000000000000000000000000000000000000009190911660209182015260408051608081019091526060808252611c3192613f1390830139611bd783611f55565b6101208301517fffffffffffff000000000000000000000000000000000000000000000000000091909116604091820152805160608101909152602a808252611c8691906140136020830139611bd783611f55565b7fffffffffffff0000000000000000000000000000000000000000000000000000166101408301527f33333245323200000000000000000000000000000000000000000000000000006101608301525b60a08201516101008301516000611cec84611f55565b90506000805b89811015611d6157601e6008820284901c8190060160640281158015611d185750601981105b15611d21575060195b80868360088110611d3457611d34612cfe565b60200201818152508301925082858360088110611d5357611d53612cfe565b602002015250600101611cf2565b5060028160000381611d7557611d75612cbb565b05606087015250505060c083015190506000611d9083611f55565b90506000805b87811015611df257601e6008820284901c81900601606402600019890182148015611dc15750603781105b15611dca575060375b80858360088110611ddd57611ddd612cfe565b60200201819052929092019150600101611d96565b5060028160000381611e0657611e06612cbb565b056080860181905260608601516175306305f5e10091909201630529732c020501925050610bb882129050611e3b5750611e41565b50611cd6565b60e082015160005b85811015611eb8576000611e5c84611f55565b905060005b88811015611eae57606460286008830284901c0660140102848460088110611e8b57611e8b612cfe565b60200201518260088110611ea157611ea1612cfe565b6020020152600101611e61565b5050600101611e49565b505050949350505050565b60606000611ed083611fd7565b610160840151610140850151604051929350611eee92602001613295565b60408051808303601f190181528282528351602080860151938601516060870151608088015160a089015160c08a015160e08b0151979b50611f3e998c9997989596949593949293919201613751565b604051602081830303815290604052915050919050565b80516020808301805160018101909152604051600093611f819390929101918252602082015260400190565b60408051601f19818403018152919052805160209091012092915050565b6000806006845181611fb357611fb3612cbb565b048381611fc257611fc2612cbb565b60069190060293909301602001519392505050565b611fdf612688565b6000805b83604001518110156121ca57611ff7612688565b60008560c00151836008811061200f5761200f612cfe565b60200201519050600080600188602001510390505b600019811461215557600088610120015160038a600001518161204957612049612cbb565b066003811061205a5761205a612cfe565b6020020151905060008960a00151836008811061207957612079612cfe565b6020020151905060008a60e00151886008811061209857612098612cfe565b602002015184600881106120ae576120ae612cfe565b60200201519050600084156120e1578b610100015160018603600881106120d7576120d7612cfe565b60200201516120e4565b60005b8c6060015101905060008a8d60800151019050600060018e60400151038b14801561210d575086155b905061211e8383878c888b876121d1565b60018901988b906008811061213557612135612cfe565b602002015250508b51600390048c52505050600019919091019050612024565b5082516020808501516040808701516060880151608089015160a08a015160c08b015160e08c015195516121959998959694959394929391929101612ec0565b6040516020818303038152906040528685600881106121b6576121b6612cfe565b602002015250929092019150600101611fe3565b5050919050565b606061221b60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6305f5e100630529732c8a8a010281900561753001906302faf0808b8b030205617d0001602083015281526175306305f5e100888b018a8101630529732c028290059290920191617d00908b036302faf080029190910501606083015260408201526305f5e100630529732c8a89018a89018181019290920283900561753001926302faf080919092030205617d000160a083015260808201526175306305f5e100878a01808c01630529732c028290059290920191617d00908c90036302faf0800291909105018260c0018360e001828152508281525050506000604051806101000160405280836000015181526020018784602001510381526020018360400151815260200187846060015103815260200183608001518152602001878460a001510381526020018360c001518152602001878460e00151038152509050600061236a8260000151612583565b6123778360200151612583565b6123848460400151612583565b6123918560600151612583565b61239e8660800151612583565b6123ab8760a00151612583565b6123b88860c00151612583565b6123c58960e00151612583565b8d6040516020016123de9998979695949392919061383a565b604051602081830303815290604052905060006123fe8360000151612583565b61240b8460200151612583565b6124188560c00151612583565b6124258660e00151612583565b6124328760800151612583565b61243f8860a00151612583565b61244c8a60a00151612583565b6124598b60c00151612583565b6124668c60e00151612583565b8c5161247190612583565b61247e8e60200151612583565b6040516020016124989b9a99989796959493929190613a39565b604051602081830303815290604052905080826040516020016124bc929190613df7565b604051602081830303815290604052945085156125745760008061253560028d058f0160027ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0b08e01058f016305f5e100630529732c8284010281900561753001936302faf080939092039290920291909105617d000190565b915091508661254383612583565b61254e8c8403612583565b60405160200161256093929190613e26565b604051602081830303815290604052965050505b50505050979650505050505050565b600080821215801561259857506201869f8213155b6125a4576125a4613ee3565b50643030303030600a80830681840482900660081b176064840482900660101b176103e8840482900660181b176127109093040660201b919091170160d81b90565b8280546125f290612bf8565b90600052602060002090601f0160209004810192826126145760008555612678565b82601f1061264b578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555612678565b82800160010185558215612678579182015b8281111561267857823582559160200191906001019061265d565b5061268492915061272f565b5090565b6040518061010001604052806008905b60608152602001906001900390816126985790505090565b60405180610180016040528060008152602001600081526020016000815260200160008152602001600081526020016126e7612744565b81526020016126f4612744565b8152602001612701612763565b815260200161270e612744565b815260200161271b612791565b815260006020820181905260409091015290565b5b808211156126845760008155600101612730565b6040518061010001604052806008906020820280368337509192915050565b6040518061010001604052806008905b61277b612744565b8152602001906001900390816127735790505090565b60405180606001604052806003906020820280368337509192915050565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146127dd57600080fd5b50565b6000602082840312156127f257600080fd5b81356127fd816127af565b9392505050565b60005b8381101561281f578181015183820152602001612807565b838111156112005750506000910152565b60008151808452612848816020860160208601612804565b601f01601f19169290920160200192915050565b6020815260006127fd6020830184612830565b60006020828403121561288157600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146128ac57600080fd5b919050565b600080604083850312156128c457600080fd5b6128cd83612888565b946020939093013593505050565b6000602082840312156128ed57600080fd5b6127fd82612888565b60008060006060848603121561290b57600080fd5b61291484612888565b925061292260208501612888565b9150604084013590509250925092565b803580151581146128ac57600080fd5b60006020828403121561295457600080fd5b6127fd82612932565b60006020828403121561296f57600080fd5b81356fffffffffffffffffffffffffffffffff811681146127fd57600080fd5b6000602082840312156129a157600080fd5b813561ffff811681146127fd57600080fd5b600080604083850312156129c657600080fd5b6129cf83612888565b91506129dd60208401612932565b90509250929050565b60008083601f8401126129f857600080fd5b50813567ffffffffffffffff811115612a1057600080fd5b602083019150836020828501011115612a2857600080fd5b9250929050565b60008060008060408587031215612a4557600080fd5b843567ffffffffffffffff80821115612a5d57600080fd5b612a69888389016129e6565b90965094506020870135915080821115612a8257600080fd5b50612a8f878288016129e6565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612af357612af3612a9b565b604052919050565b600067ffffffffffffffff821115612b1557612b15612a9b565b50601f01601f191660200190565b60008060008060808587031215612b3957600080fd5b612b4285612888565b9350612b5060208601612888565b925060408501359150606085013567ffffffffffffffff811115612b7357600080fd5b8501601f81018713612b8457600080fd5b8035612b97612b9282612afb565b612aca565b818152886020838501011115612bac57600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b60008060408385031215612be157600080fd5b612bea83612888565b91506129dd60208401612888565b600181811c90821680612c0c57607f821691505b60208210811415612c46577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215612c5e57600080fd5b81516127fd816127af565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062ffffff80831681811415612cb157612cb1612c69565b6001019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612cf957612cf9612cbb565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152610f256080830184612830565b600060208284031215612d7e57600080fd5b815167ffffffffffffffff811115612d9557600080fd5b8201601f81018413612da657600080fd5b8051612db4612b9282612afb565b818152856020838501011115612dc957600080fd5b61080c826020830160208601612804565b60008151612dec818560208601612804565b9290920192915050565b600089516020612e098285838f01612804565b8a5191840191612e1c8184848f01612804565b8a51920191612e2e8184848e01612804565b8951920191612e408184848d01612804565b8851920191612e528184848c01612804565b8751920191612e648184848b01612804565b8651920191612e768184848a01612804565b8551920191612e888184848901612804565b7f5c6e0000000000000000000000000000000000000000000000000000000000009201918252506002019a9950505050505050505050565b600089516020612ed38285838f01612804565b8a5191840191612ee68184848f01612804565b8a51920191612ef88184848e01612804565b8951920191612f0a8184848d01612804565b8851920191612f1c8184848c01612804565b8751920191612f2e8184848b01612804565b8651920191612f408184848a01612804565b8551920191612f528184848901612804565b919091019b9a5050505050505050505050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000815260008251612f9d81601a850160208701612804565b91909101601a0192915050565b7f7b226e616d65223a220000000000000000000000000000000000000000000000815260008551612fe2816009850160208a01612804565b7f2023000000000000000000000000000000000000000000000000000000000000600991840191820152855161301f81600b840160208a01612804565b7f222c20226465736372697074696f6e223a220000000000000000000000000000600b92909101918201527f436f6d706c6574656c79206f6e2d636861696e2067656e657261746976652061601d8201527f727420636f6c6c656374696f6e2e2041727420697320756e697175656c792067603d8201527f656e657261746564206261736564206f6e20746865206d696e74657227732072605d8201527f6573756c7420696e206f75722072656272616e64696e672067616d652e204c69607d8201527f6d697465642065646974696f6e2e205c6e5c6e546865206d696e746572277320609d8201527f726573756c743a5c6e000000000000000000000000000000000000000000000060bd8201526131c861319f61319961317061314760c686018a612dda565b7f222c2022696d616765223a2022000000000000000000000000000000000000008152600d0190565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c0000000000008152601a0190565b86612dda565b7f227d000000000000000000000000000000000000000000000000000000000000815260020190565b979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161320b81601d850160208701612804565b91909101601d0192915050565b6000821982111561322b5761322b612c69565b500190565b60008261323f5761323f612cbb565b500490565b600081600019048311821515161561325e5761325e612c69565b500290565b600060001982141561327757613277612c69565b5060010190565b60008282101561329057613290612c69565b500390565b7f3c7376672076696577426f783d2230203020363030303020363030303022207881527f6d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766760208201527f223e3c6465663e3c672069643d226c6f676f222066696c6c3d2223333332453260408201527f3222207374726f6b652d77696474683d223022207472616e73666f726d3d227360608201527f63616c6528333529223e3c7061746820643d224d31382032306332203120322e60808201527f3320322e332e3620332e32533134203234203132203233632d322d312d322e3260a08201527f2d322e342d2e362d332e3273342e362d3120362e362e317a6d352e332031322e60c08201527f3663312e372d3120312e342d322e332d2e362d332e32732d352d312d362e352d60e08201527f2e322d312e3320322e332e3620332e326332203120342e38203120362e352e326101008201527f7a222f3e3c706174682066696c6c2d72756c653d226576656e6f64642220643d6101208201527f224d38302031392e354338342e3620312032392e322d332e3620313120382d386101408201527f2e372031372e3820312034382033352e372034342e34632e322e322e352e332e6101608201527f382e346c323320392e3863312e382e3820342e332e3720362d2e324c39392e386101808201527f20333563312e362d3120312e362d322e322e312d332e326c2d31392d3132632d6101a08201527f2e332d2e322d2e362d2e332d312d2e347a4d34382e362033344331362e3520356101c08201527f312d362e382032322e332031362031302e352031302032322037382031352e346101e08201527f2034382e362033347a6d34352e322d2e366c2d313320372e34632d332d312d396102008201527f2e382d362e372d31332e352d342e332d342e34203220362e3620352e3520382e6102208201527f3620374c37312034362e33632d332d312d31312d362e352d31342d342d332e386102408201527f203220372e3420352e3220392e3520362e366c2d3420322e334c34322e3820346102608201527f336c33352d31392e372031362031302e327a222f3e3c2f673e3c2f6465663e3c6102808201527f726563742077696474683d22363030303022206865696768743d2236303030306102a08201527f222066696c6c3d222300000000000000000000000000000000000000000000006102c08201527fffffffffffff000000000000000000000000000000000000000000000000000083166102c98201527f222f3e3c7265637420783d22323530302220793d2232353030222077696474686102cf8201527f3d22353530303022206865696768743d22353530303022207374726f6b653d226102ef8201527f2333333245323222207374726f6b652d77696474683d22323030222066696c6c61030f8201527f3d2223000000000000000000000000000000000000000000000000000000000061032f820152600061033282017fffffffffffff0000000000000000000000000000000000000000000000000000841681527f222f3e3c672066696c6c3d222333333245323222207374726f6b653d2223333360068201527f3245323222207374726f6b652d77696474683d22313030223e000000000000006026820152603f810161080c565b60008a51613763818460208f01612804565b8a516137758183860160208f01612804565b8a51918401019061378a818360208e01612804565b895161379c8183850160208e01612804565b89519290910101906137b2818360208c01612804565b87516137c48183850160208c01612804565b87519290910101906137da818360208a01612804565b85516137ec8183850160208a01612804565b8551929091010190613802818360208801612804565b7f3c2f673e3c2f7376673e000000000000000000000000000000000000000000009101908152600a019b9a5050505050505050505050565b7f3c7061746820643d224d0000000000000000000000000000000000000000000081527fffffffffff0000000000000000000000000000000000000000000000000000008a8116600a8301527f2c00000000000000000000000000000000000000000000000000000000000000600f83015289811660108301527f4c000000000000000000000000000000000000000000000000000000000000006015830152881660168201526000613913601b83017f2c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff00000000000000000000000000000000000000000000000000000098891681527f4c000000000000000000000000000000000000000000000000000000000000006005820181905297891660068201527f2c00000000000000000000000000000000000000000000000000000000000000600b8201819052968916600c8201526011810197909752505091851660128501526017840192909252921660188201527f5a222066696c6c3d222300000000000000000000000000000000000000000000601d8201527fffffffffffff000000000000000000000000000000000000000000000000000090911660278201527f222f3e0000000000000000000000000000000000000000000000000000000000602d8201526030019392505050565b7f3c7061746820643d224d0000000000000000000000000000000000000000000081527fffffffffff0000000000000000000000000000000000000000000000000000008c8116600a8301527f2c00000000000000000000000000000000000000000000000000000000000000600f8301528b1660108201527f4c0000000000000000000000000000000000000000000000000000000000000060158201526000601682017fffffffffff0000000000000000000000000000000000000000000000000000008c1681526005613b348183017f2c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff0000000000000000000000000000000000000000000000000000008d1681529150613b8a8183017f4c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff0000000000000000000000000000000000000000000000000000008c1681529150613be08183017f2c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff0000000000000000000000000000000000000000000000000000008b1681529150613c368183017f5600000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff0000000000000000000000000000000000000000000000000000008a1681529150613c8c8183017f4c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff000000000000000000000000000000000000000000000000000000891681529150613ce28183017f2c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff000000000000000000000000000000000000000000000000000000881681529150613d388183017f4c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff000000000000000000000000000000000000000000000000000000871681529150613d8e8183017f2c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff000000000000000000000000000000000000000000000000000000861681529150613de48183017f5a222f3e00000000000000000000000000000000000000000000000000000000815260040190565b9f9e505050505050505050505050505050565b60008351613e09818460208801612804565b835190830190613e1d818360208801612804565b01949350505050565b60008451613e38818460208901612804565b7f3c75736520687265663d22236c6f676f2220783d2200000000000000000000009201918252507fffffffffff00000000000000000000000000000000000000000000000000000092831660158201527f2220793d22000000000000000000000000000000000000000000000000000000601a8201529116601f8201527f222f3e00000000000000000000000000000000000000000000000000000000006024820152602701919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfe4545363636364545363636363238413739313435363143433643433238323042393539343633394141303633394141304546384641333632334135334443353335374443353035333535353535353530393738453946424243314339324232383636383845453636383845454643424331384644424432454645353134454632353332444537414335324543364232353538433945444543364232353435374442364643443236353939393939394333423839464634414231333230383739334142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f464246354539464246354539464245434539463746324536454345424538454145414541463545454536a164736f6c634300080a000a

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101b95760003560e01c806369d3e20e116100f9578063a923fc4011610097578063b88d4fde11610071578063b88d4fde1461045d578063c87b56dd14610470578063d66732b814610483578063e985e9c5146104a957600080fd5b8063a923fc4014610403578063b4b5b48f14610416578063b6dc7ea31461044a57600080fd5b80638da5cb5b116100d35780638da5cb5b146103b55780638f742d16146103d557806395d89b41146103e8578063a22cb465146103f057600080fd5b806369d3e20e146103615780636c73ca101461037457806370a082311461038757600080fd5b80631d1d15d41161016657806342842e0e1161014057806342842e0e146102e15780634bf365df146102f45780635a9d7a68146103015780636352211e1461032b57600080fd5b80631d1d15d4146102a857806323b872dd146102bb578063285d70d4146102ce57600080fd5b8063095ea7b311610197578063095ea7b31461025657806313af40351461026b57806318160ddd1461027e57600080fd5b806301ffc9a7146101be57806306fdde03146101e6578063081812fc146101fb575b600080fd5b6101d16101cc3660046127e0565b6104d7565b60405190151581526020015b60405180910390f35b6101ee6105bc565b6040516101dd919061285c565b61023161020936600461286f565b60046020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101dd565b6102696102643660046128b1565b61064a565b005b6102696102793660046128db565b61077f565b600654610294906301000000900462ffffff1681565b60405162ffffff90911681526020016101dd565b6101ee6102b636600461286f565b6107ea565b6102696102c93660046128f6565b610815565b6102696102dc366004612942565b610a70565b6102696102ef3660046128f6565b610ac5565b6006546101d19060ff1681565b600654610231906601000000000000900473ffffffffffffffffffffffffffffffffffffffff1681565b61023161033936600461286f565b60036020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b61026961036f36600461295d565b610c15565b61026961038236600461298f565b610ea2565b6103a76103953660046128db565b60026020526000908152604090205481565b6040519081526020016101dd565b6007546102319073ffffffffffffffffffffffffffffffffffffffff1681565b6101ee6103e336600461286f565b610f00565b6101ee610f2f565b6102696103fe3660046129b3565b610f3c565b610269610411366004612a2f565b610fd3565b61042961042436600461286f565b611017565b6040516fffffffffffffffffffffffffffffffff90911681526020016101dd565b6102696104583660046128db565b611054565b61026961046b366004612b23565b6110c9565b6101ee61047e36600461286f565b611206565b60065461049690610100900461ffff1681565b60405161ffff90911681526020016101dd565b6101d16104b7366004612bce565b600560209081526000928352604080842090915290825290205460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061056a57507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b806105b657507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b600080546105c990612bf8565b80601f01602080910402602001604051908101604052809291908181526020018280546105f590612bf8565b80156106425780601f1061061757610100808354040283529160200191610642565b820191906000526020600020905b81548152906001019060200180831161062557829003601f168201915b505050505081565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff16338114806106ad575073ffffffffffffffffffffffffffffffffffffffff8116600090815260056020908152604080832033845290915290205460ff165b6106fe5760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064015b60405180910390fd5b60008281526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60075473ffffffffffffffffffffffffffffffffffffffff1633146107a357600080fd5b600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b606060008060006107fa85611380565b5092509250925061080c818484611444565b95945050505050565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff84811691161461088b5760405162461bcd60e51b815260206004820152600a60248201527f57524f4e475f46524f4d0000000000000000000000000000000000000000000060448201526064016106f5565b73ffffffffffffffffffffffffffffffffffffffff82166108ee5760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e5400000000000000000000000000000060448201526064016106f5565b3373ffffffffffffffffffffffffffffffffffffffff84161480610935575060008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1633145b80610970575073ffffffffffffffffffffffffffffffffffffffff8316600090815260056020908152604080832033845290915290205460ff165b6109bc5760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016106f5565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526002602090815260408083208054600019019055938616808352848320805460010190558583526003825284832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610a9457600080fd5b600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b610ad0838383610815565b73ffffffffffffffffffffffffffffffffffffffff82163b1580610bc457506040517f150b7a020000000000000000000000000000000000000000000000000000000080825233600483015273ffffffffffffffffffffffffffffffffffffffff858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610b7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba09190612c4c565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b610c105760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e540000000000000000000000000000000060448201526064016106f5565b505050565b60065460ff16610c675760405162461bcd60e51b815260206004820152601060248201527f4d696e74696e672064697361626c65640000000000000000000000000000000060448201526064016106f5565b600654600782811691600384901c90911690610100900461ffff811690600f168310801590610c9d5750600481901c600f168311155b8015610cb05750600881901c600f168210155b8015610cc35750600c81901c600f168211155b610d0f5760405162461bcd60e51b815260206004820152600c60248201527f496e76616c69642044617461000000000000000000000000000000000000000060448201526064016106f5565b60006006600381819054906101000a900462ffffff16610d2e90612c98565b91906101000a81548162ffffff021916908362ffffff160217905562ffffff169050610bb8811115610da25760405162461bcd60e51b815260206004820152601160248201527f457863656564206d617820737570706c7900000000000000000000000000000060448201526064016106f5565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152426034820152436054820152607481018290526000906008906094016040516020818303038152906040528051906020012060001c610e0f9190612cea565b9050856effffffffffffffffffffffffffffff166078826fffffffffffffffffffffffffffffffff16901b17600883610bb88110610e4f57610e4f612cfe565b600291828204019190066010026101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550610e9a338361161e565b505050505050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610ec657600080fd5b6006805461ffff909216610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff909216919091179055565b6060600080600080610f1186611380565b9350935093509350610f2582858584611783565b9695505050505050565b600180546105c990612bf8565b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610ff757600080fd5b611003600085856125e6565b50611010600183836125e6565b5050505050565b600881610bb8811061102857600080fd5b60029182820401919006601002915054906101000a90046fffffffffffffffffffffffffffffffff1681565b60075473ffffffffffffffffffffffffffffffffffffffff16331461107857600080fd5b6006805473ffffffffffffffffffffffffffffffffffffffff9092166601000000000000027fffffffffffff0000000000000000000000000000000000000000ffffffffffff909216919091179055565b6110d4848484610815565b73ffffffffffffffffffffffffffffffffffffffff83163b15806111b457506040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff85169063150b7a029061114d903390899088908890600401612d2d565b6020604051808303816000875af115801561116c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111909190612c4c565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b6112005760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e540000000000000000000000000000000060448201526064016106f5565b50505050565b6006546060906601000000000000900473ffffffffffffffffffffffffffffffffffffffff16156112d1576006546040517fc87b56dd00000000000000000000000000000000000000000000000000000000815260048101849052660100000000000090910473ffffffffffffffffffffffffffffffffffffffff169063c87b56dd90602401600060405180830381865afa1580156112a9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105b69190810190612d6c565b6000806000806112e086611380565b9350935093509350610f258683868685600080546112fd90612bf8565b80601f016020809104026020016040519081016040528092919081815260200182805461132990612bf8565b80156113765780601f1061134b57610100808354040283529160200191611376565b820191906000526020600020905b81548152906001019060200180831161135957829003601f168201915b50505050506117c8565b6000806000806000600886610bb8811061139c5761139c612cfe565b60028104919091015460019091166010026101000a90046fffffffffffffffffffffffffffffffff169050806114145760405162461bcd60e51b815260206004820152601060248201527f546f6b656e206e6f74206578697374730000000000000000000000000000000060448201526064016106f5565b600780821697600383901c90911696506e03ffffffffffffffffffffffffffff600683901c169550909350915050565b606061144e612688565b60005b838110156115c557611461612688565b60001986015b6000198114611556576003880680156114f857806001146114bd576040518060400160405280600481526020017ff09f9fa90000000000000000000000000000000000000000000000000000000081525061152f565b6040518060400160405280600481526020017ff09f9fa80000000000000000000000000000000000000000000000000000000081525061152f565b6040518060400160405280600681526020017fe2ac9cefb88f00000000000000000000000000000000000000000000000000008152505b83836008811061154157611541612cfe565b60200201526003890498505060001901611467565b5080516020808301516040808501516060860151608087015160a088015160c089015160e08a015195516115969998959694959394929391929101612df6565b6040516020818303038152906040528383600881106115b7576115b7612cfe565b602002015250600101611451565b5080516020808301516040808501516060860151608087015160a088015160c089015160e08a015195516116059998959694959394929391929101612ec0565b6040516020818303038152906040529150509392505050565b73ffffffffffffffffffffffffffffffffffffffff82166116815760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e5400000000000000000000000000000060448201526064016106f5565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff16156116f35760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f4d494e54454400000000000000000000000000000000000060448201526064016106f5565b73ffffffffffffffffffffffffffffffffffffffff8216600081815260026020908152604080832080546001019055848352600390915280822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060600061179b6117968787878761184f565b611865565b9050806040516020016117ae9190612f65565b604051602081830303815290604052915050949350505050565b606060006117db6117968888888861184f565b90506000836117e98a611a20565b6117f48a8a8a611444565b846040516020016118089493929190612faa565b604051602081830303815290604052905061182281611865565b60405160200161183291906131d3565b604051602081830303815290604052925050509695505050505050565b606061080c61186086868686611b5a565b611ec3565b606081516000141561188557505060408051602081019091526000815290565b6000604051806060016040528060408152602001613fd360409139905060006003845160026118b49190613218565b6118be9190613230565b6118c9906004613244565b905060006118d8826020613218565b67ffffffffffffffff8111156118f0576118f0612a9b565b6040519080825280601f01601f19166020018201604052801561191a576020820181803683370190505b509050818152600183018586518101602084015b81831015611986576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f811685015182535060010161192e565b6003895106600181146119a057600281146119ea57611a12565b7f3d3d0000000000000000000000000000000000000000000000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe830152611a12565b7f3d000000000000000000000000000000000000000000000000000000000000006000198301525b509398975050505050505050565b606081611a6057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611a8a5780611a7481613263565b9150611a839050600a83613230565b9150611a64565b60008167ffffffffffffffff811115611aa557611aa5612a9b565b6040519080825280601f01601f191660200182016040528015611acf576020820181803683370190505b5090505b8415611b5257611ae460018361327e565b9150611af1600a86612cea565b611afc906030613218565b60f81b818381518110611b1157611b11612cfe565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611b4b600a86613230565b9450611ad3565b949350505050565b611b626126b0565b60408051808201825283815260006020808301919091528784528381018790528383018690526101208401517f4538453444430000000000000000000000000000000000000000000000000000905282516080810190935260608084529192611bdc929091613f7390830139611bd783611f55565b611f9f565b6101208301517fffffffffffff00000000000000000000000000000000000000000000000000009190911660209182015260408051608081019091526060808252611c3192613f1390830139611bd783611f55565b6101208301517fffffffffffff000000000000000000000000000000000000000000000000000091909116604091820152805160608101909152602a808252611c8691906140136020830139611bd783611f55565b7fffffffffffff0000000000000000000000000000000000000000000000000000166101408301527f33333245323200000000000000000000000000000000000000000000000000006101608301525b60a08201516101008301516000611cec84611f55565b90506000805b89811015611d6157601e6008820284901c8190060160640281158015611d185750601981105b15611d21575060195b80868360088110611d3457611d34612cfe565b60200201818152508301925082858360088110611d5357611d53612cfe565b602002015250600101611cf2565b5060028160000381611d7557611d75612cbb565b05606087015250505060c083015190506000611d9083611f55565b90506000805b87811015611df257601e6008820284901c81900601606402600019890182148015611dc15750603781105b15611dca575060375b80858360088110611ddd57611ddd612cfe565b60200201819052929092019150600101611d96565b5060028160000381611e0657611e06612cbb565b056080860181905260608601516175306305f5e10091909201630529732c020501925050610bb882129050611e3b5750611e41565b50611cd6565b60e082015160005b85811015611eb8576000611e5c84611f55565b905060005b88811015611eae57606460286008830284901c0660140102848460088110611e8b57611e8b612cfe565b60200201518260088110611ea157611ea1612cfe565b6020020152600101611e61565b5050600101611e49565b505050949350505050565b60606000611ed083611fd7565b610160840151610140850151604051929350611eee92602001613295565b60408051808303601f190181528282528351602080860151938601516060870151608088015160a089015160c08a015160e08b0151979b50611f3e998c9997989596949593949293919201613751565b604051602081830303815290604052915050919050565b80516020808301805160018101909152604051600093611f819390929101918252602082015260400190565b60408051601f19818403018152919052805160209091012092915050565b6000806006845181611fb357611fb3612cbb565b048381611fc257611fc2612cbb565b60069190060293909301602001519392505050565b611fdf612688565b6000805b83604001518110156121ca57611ff7612688565b60008560c00151836008811061200f5761200f612cfe565b60200201519050600080600188602001510390505b600019811461215557600088610120015160038a600001518161204957612049612cbb565b066003811061205a5761205a612cfe565b6020020151905060008960a00151836008811061207957612079612cfe565b6020020151905060008a60e00151886008811061209857612098612cfe565b602002015184600881106120ae576120ae612cfe565b60200201519050600084156120e1578b610100015160018603600881106120d7576120d7612cfe565b60200201516120e4565b60005b8c6060015101905060008a8d60800151019050600060018e60400151038b14801561210d575086155b905061211e8383878c888b876121d1565b60018901988b906008811061213557612135612cfe565b602002015250508b51600390048c52505050600019919091019050612024565b5082516020808501516040808701516060880151608089015160a08a015160c08b015160e08c015195516121959998959694959394929391929101612ec0565b6040516020818303038152906040528685600881106121b6576121b6612cfe565b602002015250929092019150600101611fe3565b5050919050565b606061221b60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6305f5e100630529732c8a8a010281900561753001906302faf0808b8b030205617d0001602083015281526175306305f5e100888b018a8101630529732c028290059290920191617d00908b036302faf080029190910501606083015260408201526305f5e100630529732c8a89018a89018181019290920283900561753001926302faf080919092030205617d000160a083015260808201526175306305f5e100878a01808c01630529732c028290059290920191617d00908c90036302faf0800291909105018260c0018360e001828152508281525050506000604051806101000160405280836000015181526020018784602001510381526020018360400151815260200187846060015103815260200183608001518152602001878460a001510381526020018360c001518152602001878460e00151038152509050600061236a8260000151612583565b6123778360200151612583565b6123848460400151612583565b6123918560600151612583565b61239e8660800151612583565b6123ab8760a00151612583565b6123b88860c00151612583565b6123c58960e00151612583565b8d6040516020016123de9998979695949392919061383a565b604051602081830303815290604052905060006123fe8360000151612583565b61240b8460200151612583565b6124188560c00151612583565b6124258660e00151612583565b6124328760800151612583565b61243f8860a00151612583565b61244c8a60a00151612583565b6124598b60c00151612583565b6124668c60e00151612583565b8c5161247190612583565b61247e8e60200151612583565b6040516020016124989b9a99989796959493929190613a39565b604051602081830303815290604052905080826040516020016124bc929190613df7565b604051602081830303815290604052945085156125745760008061253560028d058f0160027ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0b08e01058f016305f5e100630529732c8284010281900561753001936302faf080939092039290920291909105617d000190565b915091508661254383612583565b61254e8c8403612583565b60405160200161256093929190613e26565b604051602081830303815290604052965050505b50505050979650505050505050565b600080821215801561259857506201869f8213155b6125a4576125a4613ee3565b50643030303030600a80830681840482900660081b176064840482900660101b176103e8840482900660181b176127109093040660201b919091170160d81b90565b8280546125f290612bf8565b90600052602060002090601f0160209004810192826126145760008555612678565b82601f1061264b578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555612678565b82800160010185558215612678579182015b8281111561267857823582559160200191906001019061265d565b5061268492915061272f565b5090565b6040518061010001604052806008905b60608152602001906001900390816126985790505090565b60405180610180016040528060008152602001600081526020016000815260200160008152602001600081526020016126e7612744565b81526020016126f4612744565b8152602001612701612763565b815260200161270e612744565b815260200161271b612791565b815260006020820181905260409091015290565b5b808211156126845760008155600101612730565b6040518061010001604052806008906020820280368337509192915050565b6040518061010001604052806008905b61277b612744565b8152602001906001900390816127735790505090565b60405180606001604052806003906020820280368337509192915050565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146127dd57600080fd5b50565b6000602082840312156127f257600080fd5b81356127fd816127af565b9392505050565b60005b8381101561281f578181015183820152602001612807565b838111156112005750506000910152565b60008151808452612848816020860160208601612804565b601f01601f19169290920160200192915050565b6020815260006127fd6020830184612830565b60006020828403121561288157600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146128ac57600080fd5b919050565b600080604083850312156128c457600080fd5b6128cd83612888565b946020939093013593505050565b6000602082840312156128ed57600080fd5b6127fd82612888565b60008060006060848603121561290b57600080fd5b61291484612888565b925061292260208501612888565b9150604084013590509250925092565b803580151581146128ac57600080fd5b60006020828403121561295457600080fd5b6127fd82612932565b60006020828403121561296f57600080fd5b81356fffffffffffffffffffffffffffffffff811681146127fd57600080fd5b6000602082840312156129a157600080fd5b813561ffff811681146127fd57600080fd5b600080604083850312156129c657600080fd5b6129cf83612888565b91506129dd60208401612932565b90509250929050565b60008083601f8401126129f857600080fd5b50813567ffffffffffffffff811115612a1057600080fd5b602083019150836020828501011115612a2857600080fd5b9250929050565b60008060008060408587031215612a4557600080fd5b843567ffffffffffffffff80821115612a5d57600080fd5b612a69888389016129e6565b90965094506020870135915080821115612a8257600080fd5b50612a8f878288016129e6565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612af357612af3612a9b565b604052919050565b600067ffffffffffffffff821115612b1557612b15612a9b565b50601f01601f191660200190565b60008060008060808587031215612b3957600080fd5b612b4285612888565b9350612b5060208601612888565b925060408501359150606085013567ffffffffffffffff811115612b7357600080fd5b8501601f81018713612b8457600080fd5b8035612b97612b9282612afb565b612aca565b818152886020838501011115612bac57600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b60008060408385031215612be157600080fd5b612bea83612888565b91506129dd60208401612888565b600181811c90821680612c0c57607f821691505b60208210811415612c46577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215612c5e57600080fd5b81516127fd816127af565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062ffffff80831681811415612cb157612cb1612c69565b6001019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612cf957612cf9612cbb565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152610f256080830184612830565b600060208284031215612d7e57600080fd5b815167ffffffffffffffff811115612d9557600080fd5b8201601f81018413612da657600080fd5b8051612db4612b9282612afb565b818152856020838501011115612dc957600080fd5b61080c826020830160208601612804565b60008151612dec818560208601612804565b9290920192915050565b600089516020612e098285838f01612804565b8a5191840191612e1c8184848f01612804565b8a51920191612e2e8184848e01612804565b8951920191612e408184848d01612804565b8851920191612e528184848c01612804565b8751920191612e648184848b01612804565b8651920191612e768184848a01612804565b8551920191612e888184848901612804565b7f5c6e0000000000000000000000000000000000000000000000000000000000009201918252506002019a9950505050505050505050565b600089516020612ed38285838f01612804565b8a5191840191612ee68184848f01612804565b8a51920191612ef88184848e01612804565b8951920191612f0a8184848d01612804565b8851920191612f1c8184848c01612804565b8751920191612f2e8184848b01612804565b8651920191612f408184848a01612804565b8551920191612f528184848901612804565b919091019b9a5050505050505050505050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000815260008251612f9d81601a850160208701612804565b91909101601a0192915050565b7f7b226e616d65223a220000000000000000000000000000000000000000000000815260008551612fe2816009850160208a01612804565b7f2023000000000000000000000000000000000000000000000000000000000000600991840191820152855161301f81600b840160208a01612804565b7f222c20226465736372697074696f6e223a220000000000000000000000000000600b92909101918201527f436f6d706c6574656c79206f6e2d636861696e2067656e657261746976652061601d8201527f727420636f6c6c656374696f6e2e2041727420697320756e697175656c792067603d8201527f656e657261746564206261736564206f6e20746865206d696e74657227732072605d8201527f6573756c7420696e206f75722072656272616e64696e672067616d652e204c69607d8201527f6d697465642065646974696f6e2e205c6e5c6e546865206d696e746572277320609d8201527f726573756c743a5c6e000000000000000000000000000000000000000000000060bd8201526131c861319f61319961317061314760c686018a612dda565b7f222c2022696d616765223a2022000000000000000000000000000000000000008152600d0190565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c0000000000008152601a0190565b86612dda565b7f227d000000000000000000000000000000000000000000000000000000000000815260020190565b979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161320b81601d850160208701612804565b91909101601d0192915050565b6000821982111561322b5761322b612c69565b500190565b60008261323f5761323f612cbb565b500490565b600081600019048311821515161561325e5761325e612c69565b500290565b600060001982141561327757613277612c69565b5060010190565b60008282101561329057613290612c69565b500390565b7f3c7376672076696577426f783d2230203020363030303020363030303022207881527f6d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766760208201527f223e3c6465663e3c672069643d226c6f676f222066696c6c3d2223333332453260408201527f3222207374726f6b652d77696474683d223022207472616e73666f726d3d227360608201527f63616c6528333529223e3c7061746820643d224d31382032306332203120322e60808201527f3320322e332e3620332e32533134203234203132203233632d322d312d322e3260a08201527f2d322e342d2e362d332e3273342e362d3120362e362e317a6d352e332031322e60c08201527f3663312e372d3120312e342d322e332d2e362d332e32732d352d312d362e352d60e08201527f2e322d312e3320322e332e3620332e326332203120342e38203120362e352e326101008201527f7a222f3e3c706174682066696c6c2d72756c653d226576656e6f64642220643d6101208201527f224d38302031392e354338342e3620312032392e322d332e3620313120382d386101408201527f2e372031372e3820312034382033352e372034342e34632e322e322e352e332e6101608201527f382e346c323320392e3863312e382e3820342e332e3720362d2e324c39392e386101808201527f20333563312e362d3120312e362d322e322e312d332e326c2d31392d3132632d6101a08201527f2e332d2e322d2e362d2e332d312d2e347a4d34382e362033344331362e3520356101c08201527f312d362e382032322e332031362031302e352031302032322037382031352e346101e08201527f2034382e362033347a6d34352e322d2e366c2d313320372e34632d332d312d396102008201527f2e382d362e372d31332e352d342e332d342e34203220362e3620352e3520382e6102208201527f3620374c37312034362e33632d332d312d31312d362e352d31342d342d332e386102408201527f203220372e3420352e3220392e3520362e366c2d3420322e334c34322e3820346102608201527f336c33352d31392e372031362031302e327a222f3e3c2f673e3c2f6465663e3c6102808201527f726563742077696474683d22363030303022206865696768743d2236303030306102a08201527f222066696c6c3d222300000000000000000000000000000000000000000000006102c08201527fffffffffffff000000000000000000000000000000000000000000000000000083166102c98201527f222f3e3c7265637420783d22323530302220793d2232353030222077696474686102cf8201527f3d22353530303022206865696768743d22353530303022207374726f6b653d226102ef8201527f2333333245323222207374726f6b652d77696474683d22323030222066696c6c61030f8201527f3d2223000000000000000000000000000000000000000000000000000000000061032f820152600061033282017fffffffffffff0000000000000000000000000000000000000000000000000000841681527f222f3e3c672066696c6c3d222333333245323222207374726f6b653d2223333360068201527f3245323222207374726f6b652d77696474683d22313030223e000000000000006026820152603f810161080c565b60008a51613763818460208f01612804565b8a516137758183860160208f01612804565b8a51918401019061378a818360208e01612804565b895161379c8183850160208e01612804565b89519290910101906137b2818360208c01612804565b87516137c48183850160208c01612804565b87519290910101906137da818360208a01612804565b85516137ec8183850160208a01612804565b8551929091010190613802818360208801612804565b7f3c2f673e3c2f7376673e000000000000000000000000000000000000000000009101908152600a019b9a5050505050505050505050565b7f3c7061746820643d224d0000000000000000000000000000000000000000000081527fffffffffff0000000000000000000000000000000000000000000000000000008a8116600a8301527f2c00000000000000000000000000000000000000000000000000000000000000600f83015289811660108301527f4c000000000000000000000000000000000000000000000000000000000000006015830152881660168201526000613913601b83017f2c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff00000000000000000000000000000000000000000000000000000098891681527f4c000000000000000000000000000000000000000000000000000000000000006005820181905297891660068201527f2c00000000000000000000000000000000000000000000000000000000000000600b8201819052968916600c8201526011810197909752505091851660128501526017840192909252921660188201527f5a222066696c6c3d222300000000000000000000000000000000000000000000601d8201527fffffffffffff000000000000000000000000000000000000000000000000000090911660278201527f222f3e0000000000000000000000000000000000000000000000000000000000602d8201526030019392505050565b7f3c7061746820643d224d0000000000000000000000000000000000000000000081527fffffffffff0000000000000000000000000000000000000000000000000000008c8116600a8301527f2c00000000000000000000000000000000000000000000000000000000000000600f8301528b1660108201527f4c0000000000000000000000000000000000000000000000000000000000000060158201526000601682017fffffffffff0000000000000000000000000000000000000000000000000000008c1681526005613b348183017f2c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff0000000000000000000000000000000000000000000000000000008d1681529150613b8a8183017f4c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff0000000000000000000000000000000000000000000000000000008c1681529150613be08183017f2c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff0000000000000000000000000000000000000000000000000000008b1681529150613c368183017f5600000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff0000000000000000000000000000000000000000000000000000008a1681529150613c8c8183017f4c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff000000000000000000000000000000000000000000000000000000891681529150613ce28183017f2c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff000000000000000000000000000000000000000000000000000000881681529150613d388183017f4c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff000000000000000000000000000000000000000000000000000000871681529150613d8e8183017f2c00000000000000000000000000000000000000000000000000000000000000815260010190565b7fffffffffff000000000000000000000000000000000000000000000000000000861681529150613de48183017f5a222f3e00000000000000000000000000000000000000000000000000000000815260040190565b9f9e505050505050505050505050505050565b60008351613e09818460208801612804565b835190830190613e1d818360208801612804565b01949350505050565b60008451613e38818460208901612804565b7f3c75736520687265663d22236c6f676f2220783d2200000000000000000000009201918252507fffffffffff00000000000000000000000000000000000000000000000000000092831660158201527f2220793d22000000000000000000000000000000000000000000000000000000601a8201529116601f8201527f222f3e00000000000000000000000000000000000000000000000000000000006024820152602701919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfe4545363636364545363636363238413739313435363143433643433238323042393539343633394141303633394141304546384641333632334135334443353335374443353035333535353535353530393738453946424243314339324232383636383845453636383845454643424331384644424432454645353134454632353332444537414335324543364232353538433945444543364232353435374442364643443236353939393939394333423839464634414231333230383739334142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f464246354539464246354539464245434539463746324536454345424538454145414541463545454536a164736f6c634300080a000a

Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.