ETH Price: $3,357.58 (+2.52%)
Gas: 5 Gwei

Token

1337 Critters (1337CRITTER)
 

Overview

Max Total Supply

420 1337CRITTER

Holders

299

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
mchexley.eth
Balance
1 1337CRITTER
0xebfd774c1c2008e56ce40e0a4504ebecc81b1921
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

1337 Critters are an NFTs best fren. Love em @ https://1337skulls.xyz

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
LeetCritter

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 12 : SSTORE2.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./utils/Bytecode.sol";

/**
  @title A key-value storage with auto-generated keys for storing chunks of data with a lower write & read cost.
  @author Agustin Aguilar <[email protected]>

  Readme: https://github.com/0xsequence/sstore2#readme
*/
library SSTORE2 {
  error WriteError();

  /**
    @notice Stores `_data` and returns `pointer` as key for later retrieval
    @dev The pointer is a contract address with `_data` as code
    @param _data to be written
    @return pointer Pointer to the written `_data`
  */
  function write(bytes memory _data) internal returns (address pointer) {
    // Append 00 to _data so contract can't be called
    // Build init code
    bytes memory code = Bytecode.creationCodeFor(
      abi.encodePacked(
        hex'00',
        _data
      )
    );

    // Deploy contract using create
    assembly { pointer := create(0, add(code, 32), mload(code)) }

    // Address MUST be non-zero
    if (pointer == address(0)) revert WriteError();
  }

  /**
    @notice Reads the contents of the `_pointer` code as data, skips the first byte 
    @dev The function is intended for reading pointers generated by `write`
    @param _pointer to be read
    @return data read from `_pointer` contract
  */
  function read(address _pointer) internal view returns (bytes memory) {
    return Bytecode.codeAt(_pointer, 1, type(uint256).max);
  }

  /**
    @notice Reads the contents of the `_pointer` code as data, skips the first byte 
    @dev The function is intended for reading pointers generated by `write`
    @param _pointer to be read
    @param _start number of bytes to skip
    @return data read from `_pointer` contract
  */
  function read(address _pointer, uint256 _start) internal view returns (bytes memory) {
    return Bytecode.codeAt(_pointer, _start + 1, type(uint256).max);
  }

  /**
    @notice Reads the contents of the `_pointer` code as data, skips the first byte 
    @dev The function is intended for reading pointers generated by `write`
    @param _pointer to be read
    @param _start number of bytes to skip
    @param _end index before which to end extraction
    @return data read from `_pointer` contract
  */
  function read(address _pointer, uint256 _start, uint256 _end) internal view returns (bytes memory) {
    return Bytecode.codeAt(_pointer, _start + 1, _end + 1);
  }
}

File 2 of 12 : Bytecode.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;


library Bytecode {
  error InvalidCodeAtRange(uint256 _size, uint256 _start, uint256 _end);

  /**
    @notice Generate a creation code that results on a contract with `_code` as bytecode
    @param _code The returning value of the resulting `creationCode`
    @return creationCode (constructor) for new contract
  */
  function creationCodeFor(bytes memory _code) internal pure returns (bytes memory) {
    /*
      0x00    0x63         0x63XXXXXX  PUSH4 _code.length  size
      0x01    0x80         0x80        DUP1                size size
      0x02    0x60         0x600e      PUSH1 14            14 size size
      0x03    0x60         0x6000      PUSH1 00            0 14 size size
      0x04    0x39         0x39        CODECOPY            size
      0x05    0x60         0x6000      PUSH1 00            0 size
      0x06    0xf3         0xf3        RETURN
      <CODE>
    */

    return abi.encodePacked(
      hex"63",
      uint32(_code.length),
      hex"80_60_0E_60_00_39_60_00_F3",
      _code
    );
  }

  /**
    @notice Returns the size of the code on a given address
    @param _addr Address that may or may not contain code
    @return size of the code on the given `_addr`
  */
  function codeSize(address _addr) internal view returns (uint256 size) {
    assembly { size := extcodesize(_addr) }
  }

  /**
    @notice Returns the code of a given address
    @dev It will fail if `_end < _start`
    @param _addr Address that may or may not contain code
    @param _start number of bytes of code to skip on read
    @param _end index before which to end extraction
    @return oCode read from `_addr` deployed bytecode

    Forked from: https://gist.github.com/KardanovIR/fe98661df9338c842b4a30306d507fbd
  */
  function codeAt(address _addr, uint256 _start, uint256 _end) internal view returns (bytes memory oCode) {
    uint256 csize = codeSize(_addr);
    if (csize == 0) return bytes("");

    if (_start > csize) return bytes("");
    if (_end < _start) revert InvalidCodeAtRange(csize, _start, _end); 

    unchecked {
      uint256 reqSize = _end - _start;
      uint256 maxSize = csize - _start;

      uint256 size = maxSize < reqSize ? maxSize : reqSize;

      assembly {
        // allocate output byte array - this could also be done without assembly
        // by using o_code = new bytes(size)
        oCode := mload(0x40)
        // new "memory end" including padding
        mstore(0x40, add(oCode, and(add(add(size, 0x20), 0x1f), not(0x1f))))
        // store length in memory
        mstore(oCode, size)
        // actually retrieve the code, this needs assembly
        extcodecopy(_addr, add(oCode, 0x20), _start, size)
      }
    }
  }
}

File 3 of 12 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

pragma solidity ^0.8.0;

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

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

File 5 of 12 : MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates merkle trees that are safe
 * against this attack out of the box.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            unchecked {
                return hashes[totalHashes - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            unchecked {
                return hashes[totalHashes - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

File 6 of 12 : LeetCritter.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

import "@0xsequence/sstore2/contracts/SSTORE2.sol";
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
import "solady/src/utils/LibString.sol";
import "solady/src/utils/Base64.sol";

import {ERC721A, IERC721A} from "erc721a/contracts/ERC721A.sol";
import {ERC721AQueryable} from "erc721a/contracts/extensions/ERC721AQueryable.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";

/**
 * @title 1337 critters are pure 1/1 handcrafted animals living onchain
 * @author hoanh.eth & snjolfur.eth
 */

struct Critter {
    string variety;
    uint16 ctype;
    uint16 background;
    address image;
}

contract LeetCritter is ERC721A, ERC721AQueryable, Ownable {
    uint256 public immutable supply;

    bool public isOpen = false;
    bytes32 private merkleRoot = 0;

    mapping(address => bool) minted;

    string[] public backgroundsOptions;
    string[] public typesOptions;

    Critter[] private critters;

    uint16[] private remapIDs;
    uint16[] private shuffleIDs;
    uint256 private shuffleIndex;

    error MintClosed();
    error NotEqualLength();
    error NotEnoughLeft();
    error NotOnWhitelist();
    error MaxMint();
    error TokenDoesntExist();
    error ZeroBalance();
    error InvalidTraits();

    constructor(
        string memory name,
        string memory symbol,
        uint256 _supply,
        string[] memory _backgroundsOptions,
        string[] memory _typesOptions
    ) ERC721A(name, symbol) {
        supply = _supply;
        shuffleIDs = new uint16[](_supply);
        remapIDs = new uint16[](_supply);
        shuffleIndex = _supply;

        backgroundsOptions = _backgroundsOptions;
        typesOptions = _typesOptions;
    }

    /**
     * @notice Set minting status
     */
    function setMintStatus(bool state) external onlyOwner {
        isOpen = state;
    }

    /**
     * @notice Check if an address is on whitelist
     */
    function checkWhitelist(address addr, bytes32[] calldata merkleProof) public view returns (bool) {
        return MerkleProof.verify(merkleProof, merkleRoot, keccak256(abi.encodePacked(addr)));
    }

    /**
     * @notice Set whitelist using merkle proof
     */
    function setWhitelist(bytes32 newMerkleRoot) external onlyOwner {
        merkleRoot = newMerkleRoot;
    }

    /**
     * @notice Whilelist mint
     */
    function whitelistMint(bytes32[] calldata merkleProof) public {
        if (!checkWhitelist(msg.sender, merkleProof)) revert NotOnWhitelist();
        if (minted[msg.sender]) revert MaxMint();

        helperMint(1);
    }

    /**
     * @notice Owner mint
     */
    function ownerMint(uint256 amount) public onlyOwner {
        helperMint(amount);
    }

    /**
     * @notice Add critters traits
     */
    function addCritters(
        string[] calldata _varieties,
        uint16[] calldata _types,
        uint16[] calldata _backgrounds,
        string[] calldata _traits
    ) public onlyOwner {
        if (_varieties.length != _types.length) revert NotEqualLength();
        if (_varieties.length != _backgrounds.length) revert NotEqualLength();
        if (_varieties.length != _traits.length) revert NotEqualLength();

        uint256 i = 0;
        Critter memory critter;
        do {
            critter.variety = _varieties[i];
            critter.ctype = _types[i];
            critter.background = _backgrounds[i];
            critter.image = SSTORE2.write(bytes(_traits[i]));

            critters.push(critter);
            unchecked {
                ++i;
            }
        } while (i < _varieties.length);
    }

    /**
     * @notice Build trait image
     */
    function buildImage(Critter memory critter) internal view returns (string memory image) {
        return Base64.encode(
            abi.encodePacked(
                '<svg id="critter" width="100%" height="100%" viewBox="0 0 20000 20000" xmlns="http://www.w3.org/2000/svg">',
                "<style>#critter{background-color:",
                backgroundsOptions[critter.background],
                ";background-image:url(data:image/png;base64,",
                string(SSTORE2.read(critter.image)),
                ");background-repeat:no-repeat;background-size:contain;background-position:center;image-rendering:-webkit-optimize-contrast;-ms-interpolation-mode:nearest-neighbor;image-rendering:-moz-crisp-edges;image-rendering:pixelated;}</style></svg>"
            )
        );
    }

    /**
     * @notice Build trait metadata
     */
    function buildMetadata(string memory key, string memory value) internal pure returns (string memory trait) {
        return string.concat('{"trait_type":"', key, '","value": "', value, '"}');
    }

    /**
     * @notice Build trait name
     */
    function buildName(string memory _type, string memory _variety) internal pure returns (string memory name) {
        if (keccak256(abi.encodePacked(_type)) == keccak256(abi.encodePacked("Unique"))) {
            return _variety;
        }
        return string.concat(_type, " ", _variety);
    }

    /**
     * @notice Build metadata and assemble the corresponding token info
     */
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override(ERC721A, IERC721A)
        returns (string memory metadata)
    {
        if (!_exists(tokenId)) revert TokenDoesntExist();

        Critter memory critter = critters[remapIDs[tokenId]];
        string memory critterType = typesOptions[critter.ctype];

        bytes memory json = abi.encodePacked(
            '{"name": "',
            buildName(critterType, critter.variety),
            '", "description":"',
            "1337 critters are pure 1/1 handcrafted animals living onchain",
            '","image":"data:image/svg+xml;base64,',
            buildImage(critter),
            '",',
            '"attributes": [',
            buildMetadata("variety", critter.variety),
            ",",
            buildMetadata("type", critterType),
            ",",
            buildMetadata("background", backgroundsOptions[critter.background]),
            "]}"
        );

        return string(abi.encodePacked("data:application/json,", json));
    }

    /**
     * @notice Helper mint function
     */
    function helperMint(uint256 amount) internal {
        if (!isOpen) revert MintClosed();

        uint256 current = _totalMinted();
        unchecked {
            if ((current + amount) > supply) revert NotEnoughLeft();
        }

        uint256 random = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender)));
        for (uint8 i = 0; i < amount; i++) {
            remapIDs[current] = shuffle(random);
            ++current;
        }

        if (msg.sender != owner()) {
            minted[msg.sender] = true;
        }
        _safeMint(msg.sender, amount, "");
    }

    /**
     * @notice Shuffle random IDs from fixed population
     * Based on 0xDoubleSharp's algorithm
     * https://www.justinsilver.com/technology/programming/nft-mint-random-token-id/
     */
    function shuffle(uint256 random) internal returns (uint16 id) {
        if (shuffleIndex == 0) revert NotEnoughLeft();
        unchecked {
            uint256 lastIndex = --shuffleIndex;
            uint256 randomIndex = random % (lastIndex + 1);
            id = shuffleIDs[randomIndex] != 0 ? uint16(shuffleIDs[randomIndex]) : uint16(randomIndex);
            shuffleIDs[randomIndex] = shuffleIDs[lastIndex] == 0 ? uint16(lastIndex) : shuffleIDs[lastIndex];
            shuffleIDs[lastIndex] = 0;
        }
    }
}

File 7 of 12 : ERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721A.sol';

/**
 * @dev Interface of ERC721 token receiver.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant _BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant _BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

    // Mapping from token ID to approved address.
    mapping(uint256 => TokenApprovalRef) private _tokenApprovals;

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view virtual returns (uint256) {
        // Counter underflow is impossible as `_currentIndex` does not decrement,
        // and it is initialized to `_startTokenId()`.
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around over time.
     */
    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

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

        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();
            }

        _tokenApprovals[tokenId].value = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token IDs
     * are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token IDs
     * have been transferred. This includes minting.
     * And also called after one token has been burned.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns whether the call correctly returned the expected magic value.
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            // The duplicated `log4` removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                // The `iszero(eq(,))` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the `iszero` away for performance.
                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

            // Cache the end of the memory to calculate the length later.
            let end := str

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }
}

File 8 of 12 : ERC721AQueryable.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721AQueryable.sol';
import '../ERC721A.sol';

/**
 * @title ERC721AQueryable.
 *
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *
     * - `addr = address(0)`
     * - `startTimestamp = 0`
     * - `burned = false`
     * - `extraData = 0`
     *
     * If the `tokenId` is burned:
     *
     * - `addr = <Address of owner before token was burned>`
     * - `startTimestamp = <Timestamp when token was burned>`
     * - `burned = true`
     * - `extraData = <Extra data when token was burned>`
     *
     * Otherwise:
     *
     * - `addr = <Address of owner>`
     * - `startTimestamp = <Timestamp of start of ownership>`
     * - `burned = false`
     * - `extraData = <Extra data at start of ownership>`
     */
    function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) {
        TokenOwnership memory ownership;
        if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) {
            return ownership;
        }
        ownership = _ownershipAt(tokenId);
        if (ownership.burned) {
            return ownership;
        }
        return _ownershipOf(tokenId);
    }

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] calldata tokenIds)
        external
        view
        virtual
        override
        returns (TokenOwnership[] memory)
    {
        unchecked {
            uint256 tokenIdsLength = tokenIds.length;
            TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
            for (uint256 i; i != tokenIdsLength; ++i) {
                ownerships[i] = explicitOwnershipOf(tokenIds[i]);
            }
            return ownerships;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start < stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view virtual override returns (uint256[] memory) {
        unchecked {
            if (start >= stop) revert InvalidQueryRange();
            uint256 tokenIdsIdx;
            uint256 stopLimit = _nextTokenId();
            // Set `start = max(start, _startTokenId())`.
            if (start < _startTokenId()) {
                start = _startTokenId();
            }
            // Set `stop = min(stop, stopLimit)`.
            if (stop > stopLimit) {
                stop = stopLimit;
            }
            uint256 tokenIdsMaxLength = balanceOf(owner);
            // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
            // to cater for cases where `balanceOf(owner)` is too big.
            if (start < stop) {
                uint256 rangeLength = stop - start;
                if (rangeLength < tokenIdsMaxLength) {
                    tokenIdsMaxLength = rangeLength;
                }
            } else {
                tokenIdsMaxLength = 0;
            }
            uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
            if (tokenIdsMaxLength == 0) {
                return tokenIds;
            }
            // We need to call `explicitOwnershipOf(start)`,
            // because the slot at `start` may not be initialized.
            TokenOwnership memory ownership = explicitOwnershipOf(start);
            address currOwnershipAddr;
            // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
            // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
            if (!ownership.burned) {
                currOwnershipAddr = ownership.addr;
            }
            for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            // Downsize the array to fit.
            assembly {
                mstore(tokenIds, tokenIdsIdx)
            }
            return tokenIds;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(`totalSupply`) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K collections should be fine).
     */
    function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) {
        unchecked {
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            uint256 tokenIdsLength = balanceOf(owner);
            uint256[] memory tokenIds = new uint256[](tokenIdsLength);
            TokenOwnership memory ownership;
            for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            return tokenIds;
        }
    }
}

File 9 of 12 : IERC721AQueryable.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import '../IERC721A.sol';

/**
 * @dev Interface of ERC721AQueryable.
 */
interface IERC721AQueryable is IERC721A {
    /**
     * Invalid query range (`start` >= `stop`).
     */
    error InvalidQueryRange();

    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *
     * - `addr = address(0)`
     * - `startTimestamp = 0`
     * - `burned = false`
     * - `extraData = 0`
     *
     * If the `tokenId` is burned:
     *
     * - `addr = <Address of owner before token was burned>`
     * - `startTimestamp = <Timestamp when token was burned>`
     * - `burned = true`
     * - `extraData = <Extra data when token was burned>`
     *
     * Otherwise:
     *
     * - `addr = <Address of owner>`
     * - `startTimestamp = <Timestamp of start of ownership>`
     * - `burned = false`
     * - `extraData = <Extra data at start of ownership>`
     */
    function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start < stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(`totalSupply`) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
}

File 10 of 12 : IERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of ERC721A.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the
     * ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // =============================================================
    //                            IERC721
    // =============================================================

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

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

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

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

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

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

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

File 11 of 12 : Base64.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @notice Library to encode strings in Base64.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/Base64.sol)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/Base64.sol)
/// @author Modified from (https://github.com/Brechtpd/base64/blob/main/base64.sol) by Brecht Devos - <[email protected]>.
library Base64 {
    /// @dev Encodes `data` using the base64 encoding described in RFC 4648.
    /// See: https://datatracker.ietf.org/doc/html/rfc4648
    /// @param fileSafe  Whether to replace '+' with '-' and '/' with '_'.
    /// @param noPadding Whether to strip away the padding.
    function encode(bytes memory data, bool fileSafe, bool noPadding)
        internal
        pure
        returns (string memory result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let dataLength := mload(data)

            if dataLength {
                // Multiply by 4/3 rounded up.
                // The `shl(2, ...)` is equivalent to multiplying by 4.
                let encodedLength := shl(2, div(add(dataLength, 2), 3))

                // Set `result` to point to the start of the free memory.
                result := mload(0x40)

                // Store the table into the scratch space.
                // Offsetted by -1 byte so that the `mload` will load the character.
                // We will rewrite the free memory pointer at `0x40` later with
                // the allocated size.
                // The magic constant 0x0230 will translate "-_" + "+/".
                mstore(0x1f, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef")
                mstore(0x3f, sub("ghijklmnopqrstuvwxyz0123456789-_", mul(iszero(fileSafe), 0x0230)))

                // Skip the first slot, which stores the length.
                let ptr := add(result, 0x20)
                let end := add(ptr, encodedLength)

                // Run over the input, 3 bytes at a time.
                for {} 1 {} {
                    data := add(data, 3) // Advance 3 bytes.
                    let input := mload(data)

                    // Write 4 bytes. Optimized for fewer stack operations.
                    mstore8(0, mload(and(shr(18, input), 0x3F)))
                    mstore8(1, mload(and(shr(12, input), 0x3F)))
                    mstore8(2, mload(and(shr(6, input), 0x3F)))
                    mstore8(3, mload(and(input, 0x3F)))
                    mstore(ptr, mload(0x00))

                    ptr := add(ptr, 4) // Advance 4 bytes.
                    if iszero(lt(ptr, end)) { break }
                }
                mstore(0x40, add(end, 0x20)) // Allocate the memory.
                // Equivalent to `o = [0, 2, 1][dataLength % 3]`.
                let o := div(2, mod(dataLength, 3))
                // Offset `ptr` and pad with '='. We can simply write over the end.
                mstore(sub(ptr, o), shl(240, 0x3d3d))
                // Set `o` to zero if there is padding.
                o := mul(iszero(iszero(noPadding)), o)
                mstore(sub(ptr, o), 0) // Zeroize the slot after the string.
                mstore(result, sub(encodedLength, o)) // Store the length.
            }
        }
    }

    /// @dev Encodes `data` using the base64 encoding described in RFC 4648.
    /// Equivalent to `encode(data, false, false)`.
    function encode(bytes memory data) internal pure returns (string memory result) {
        result = encode(data, false, false);
    }

    /// @dev Encodes `data` using the base64 encoding described in RFC 4648.
    /// Equivalent to `encode(data, fileSafe, false)`.
    function encode(bytes memory data, bool fileSafe)
        internal
        pure
        returns (string memory result)
    {
        result = encode(data, fileSafe, false);
    }

    /// @dev Decodes base64 encoded `data`.
    ///
    /// Supports:
    /// - RFC 4648 (both standard and file-safe mode).
    /// - RFC 3501 (63: ',').
    ///
    /// Does not support:
    /// - Line breaks.
    ///
    /// Note: For performance reasons,
    /// this function will NOT revert on invalid `data` inputs.
    /// Outputs for invalid inputs will simply be undefined behaviour.
    /// It is the user's responsibility to ensure that the `data`
    /// is a valid base64 encoded string.
    function decode(string memory data) internal pure returns (bytes memory result) {
        /// @solidity memory-safe-assembly
        assembly {
            let dataLength := mload(data)

            if dataLength {
                let decodedLength := mul(shr(2, dataLength), 3)

                for {} 1 {} {
                    // If padded.
                    if iszero(and(dataLength, 3)) {
                        let t := xor(mload(add(data, dataLength)), 0x3d3d)
                        // forgefmt: disable-next-item
                        decodedLength := sub(
                            decodedLength,
                            add(iszero(byte(30, t)), iszero(byte(31, t)))
                        )
                        break
                    }
                    // If non-padded.
                    decodedLength := add(decodedLength, sub(and(dataLength, 3), 1))
                    break
                }
                result := mload(0x40)

                // Write the length of the bytes.
                mstore(result, decodedLength)

                // Skip the first slot, which stores the length.
                let ptr := add(result, 0x20)
                let end := add(ptr, decodedLength)

                // Load the table into the scratch space.
                // Constants are optimized for smaller bytecode with zero gas overhead.
                // `m` also doubles as the mask of the upper 6 bits.
                let m := 0xfc000000fc00686c7074787c8084888c9094989ca0a4a8acb0b4b8bcc0c4c8cc
                mstore(0x5b, m)
                mstore(0x3b, 0x04080c1014181c2024282c3034383c4044484c5054585c6064)
                mstore(0x1a, 0xf8fcf800fcd0d4d8dce0e4e8ecf0f4)

                for {} 1 {} {
                    // Read 4 bytes.
                    data := add(data, 4)
                    let input := mload(data)

                    // Write 3 bytes.
                    // forgefmt: disable-next-item
                    mstore(ptr, or(
                        and(m, mload(byte(28, input))),
                        shr(6, or(
                            and(m, mload(byte(29, input))),
                            shr(6, or(
                                and(m, mload(byte(30, input))),
                                shr(6, mload(byte(31, input)))
                            ))
                        ))
                    ))
                    ptr := add(ptr, 3)
                    if iszero(lt(ptr, end)) { break }
                }
                mstore(0x40, add(end, 0x20)) // Allocate the memory.
                mstore(end, 0) // Zeroize the slot after the bytes.
                mstore(0x60, 0) // Restore the zero slot.
            }
        }
    }
}

File 12 of 12 : LibString.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @notice Library for converting numbers into strings and other string operations.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibString.sol)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/LibString.sol)
library LibString {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                        CUSTOM ERRORS                       */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The `length` of the output is too small to contain all the hex digits.
    error HexLengthInsufficient();

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                         CONSTANTS                          */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The constant returned when the `search` is not found in the string.
    uint256 internal constant NOT_FOUND = type(uint256).max;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                     DECIMAL OPERATIONS                     */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns the base 10 decimal representation of `value`.
    function toString(uint256 value) internal pure returns (string memory str) {
        /// @solidity memory-safe-assembly
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits.
            str := add(mload(0x40), 0x80)
            // Update the free memory pointer to allocate.
            mstore(0x40, add(str, 0x20))
            // Zeroize the slot after the string.
            mstore(str, 0)

            // Cache the end of the memory to calculate the length later.
            let end := str

            let w := not(0) // Tsk.
            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            for { let temp := value } 1 {} {
                str := add(str, w) // `sub(str, 1)`.
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }

    /// @dev Returns the base 10 decimal representation of `value`.
    function toString(int256 value) internal pure returns (string memory str) {
        if (value >= 0) {
            return toString(uint256(value));
        }
        unchecked {
            str = toString(uint256(-value));
        }
        /// @solidity memory-safe-assembly
        assembly {
            // We still have some spare memory space on the left,
            // as we have allocated 3 words (96 bytes) for up to 78 digits.
            let length := mload(str) // Load the string length.
            mstore(str, 0x2d) // Store the '-' character.
            str := sub(str, 1) // Move back the string pointer by a byte.
            mstore(str, add(length, 1)) // Update the string length.
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                   HEXADECIMAL OPERATIONS                   */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns the hexadecimal representation of `value`,
    /// left-padded to an input length of `length` bytes.
    /// The output is prefixed with "0x" encoded using 2 hexadecimal digits per byte,
    /// giving a total length of `length * 2 + 2` bytes.
    /// Reverts if `length` is too small for the output to contain all the digits.
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory str) {
        str = toHexStringNoPrefix(value, length);
        /// @solidity memory-safe-assembly
        assembly {
            let strLength := add(mload(str), 2) // Compute the length.
            mstore(str, 0x3078) // Write the "0x" prefix.
            str := sub(str, 2) // Move the pointer.
            mstore(str, strLength) // Write the length.
        }
    }

    /// @dev Returns the hexadecimal representation of `value`,
    /// left-padded to an input length of `length` bytes.
    /// The output is prefixed with "0x" encoded using 2 hexadecimal digits per byte,
    /// giving a total length of `length * 2` bytes.
    /// Reverts if `length` is too small for the output to contain all the digits.
    function toHexStringNoPrefix(uint256 value, uint256 length)
        internal
        pure
        returns (string memory str)
    {
        /// @solidity memory-safe-assembly
        assembly {
            // We need 0x20 bytes for the trailing zeros padding, `length * 2` bytes
            // for the digits, 0x02 bytes for the prefix, and 0x20 bytes for the length.
            // We add 0x20 to the total and round down to a multiple of 0x20.
            // (0x20 + 0x20 + 0x02 + 0x20) = 0x62.
            str := add(mload(0x40), and(add(shl(1, length), 0x42), not(0x1f)))
            // Allocate the memory.
            mstore(0x40, add(str, 0x20))
            // Zeroize the slot after the string.
            mstore(str, 0)

            // Cache the end to calculate the length later.
            let end := str
            // Store "0123456789abcdef" in scratch space.
            mstore(0x0f, 0x30313233343536373839616263646566)

            let start := sub(str, add(length, length))
            let w := not(1) // Tsk.
            let temp := value
            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            for {} 1 {} {
                str := add(str, w) // `sub(str, 2)`.
                mstore8(add(str, 1), mload(and(temp, 15)))
                mstore8(str, mload(and(shr(4, temp), 15)))
                temp := shr(8, temp)
                if iszero(xor(str, start)) { break }
            }

            if temp {
                // Store the function selector of `HexLengthInsufficient()`.
                mstore(0x00, 0x2194895a)
                // Revert with (offset, size).
                revert(0x1c, 0x04)
            }

            // Compute the string's length.
            let strLength := sub(end, str)
            // Move the pointer and write the length.
            str := sub(str, 0x20)
            mstore(str, strLength)
        }
    }

    /// @dev Returns the hexadecimal representation of `value`.
    /// The output is prefixed with "0x" and encoded using 2 hexadecimal digits per byte.
    /// As address are 20 bytes long, the output will left-padded to have
    /// a length of `20 * 2 + 2` bytes.
    function toHexString(uint256 value) internal pure returns (string memory str) {
        str = toHexStringNoPrefix(value);
        /// @solidity memory-safe-assembly
        assembly {
            let strLength := add(mload(str), 2) // Compute the length.
            mstore(str, 0x3078) // Write the "0x" prefix.
            str := sub(str, 2) // Move the pointer.
            mstore(str, strLength) // Write the length.
        }
    }

    /// @dev Returns the hexadecimal representation of `value`.
    /// The output is encoded using 2 hexadecimal digits per byte.
    /// As address are 20 bytes long, the output will left-padded to have
    /// a length of `20 * 2` bytes.
    function toHexStringNoPrefix(uint256 value) internal pure returns (string memory str) {
        /// @solidity memory-safe-assembly
        assembly {
            // We need 0x20 bytes for the trailing zeros padding, 0x20 bytes for the length,
            // 0x02 bytes for the prefix, and 0x40 bytes for the digits.
            // The next multiple of 0x20 above (0x20 + 0x20 + 0x02 + 0x40) is 0xa0.
            str := add(mload(0x40), 0x80)
            // Allocate the memory.
            mstore(0x40, add(str, 0x20))
            // Zeroize the slot after the string.
            mstore(str, 0)

            // Cache the end to calculate the length later.
            let end := str
            // Store "0123456789abcdef" in scratch space.
            mstore(0x0f, 0x30313233343536373839616263646566)

            let w := not(1) // Tsk.
            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            for { let temp := value } 1 {} {
                str := add(str, w) // `sub(str, 2)`.
                mstore8(add(str, 1), mload(and(temp, 15)))
                mstore8(str, mload(and(shr(4, temp), 15)))
                temp := shr(8, temp)
                if iszero(temp) { break }
            }

            // Compute the string's length.
            let strLength := sub(end, str)
            // Move the pointer and write the length.
            str := sub(str, 0x20)
            mstore(str, strLength)
        }
    }

    /// @dev Returns the hexadecimal representation of `value`.
    /// The output is prefixed with "0x", encoded using 2 hexadecimal digits per byte,
    /// and the alphabets are capitalized conditionally according to
    /// https://eips.ethereum.org/EIPS/eip-55
    function toHexStringChecksummed(address value) internal pure returns (string memory str) {
        str = toHexString(value);
        /// @solidity memory-safe-assembly
        assembly {
            let mask := shl(6, div(not(0), 255)) // `0b010000000100000000 ...`
            let o := add(str, 0x22)
            let hashed := and(keccak256(o, 40), mul(34, mask)) // `0b10001000 ... `
            let t := shl(240, 136) // `0b10001000 << 240`
            for { let i := 0 } 1 {} {
                mstore(add(i, i), mul(t, byte(i, hashed)))
                i := add(i, 1)
                if eq(i, 20) { break }
            }
            mstore(o, xor(mload(o), shr(1, and(mload(0x00), and(mload(o), mask)))))
            o := add(o, 0x20)
            mstore(o, xor(mload(o), shr(1, and(mload(0x20), and(mload(o), mask)))))
        }
    }

    /// @dev Returns the hexadecimal representation of `value`.
    /// The output is prefixed with "0x" and encoded using 2 hexadecimal digits per byte.
    function toHexString(address value) internal pure returns (string memory str) {
        str = toHexStringNoPrefix(value);
        /// @solidity memory-safe-assembly
        assembly {
            let strLength := add(mload(str), 2) // Compute the length.
            mstore(str, 0x3078) // Write the "0x" prefix.
            str := sub(str, 2) // Move the pointer.
            mstore(str, strLength) // Write the length.
        }
    }

    /// @dev Returns the hexadecimal representation of `value`.
    /// The output is encoded using 2 hexadecimal digits per byte.
    function toHexStringNoPrefix(address value) internal pure returns (string memory str) {
        /// @solidity memory-safe-assembly
        assembly {
            str := mload(0x40)

            // Allocate the memory.
            // We need 0x20 bytes for the trailing zeros padding, 0x20 bytes for the length,
            // 0x02 bytes for the prefix, and 0x28 bytes for the digits.
            // The next multiple of 0x20 above (0x20 + 0x20 + 0x02 + 0x28) is 0x80.
            mstore(0x40, add(str, 0x80))

            // Store "0123456789abcdef" in scratch space.
            mstore(0x0f, 0x30313233343536373839616263646566)

            str := add(str, 2)
            mstore(str, 40)

            let o := add(str, 0x20)
            mstore(add(o, 40), 0)

            value := shl(96, value)

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            for { let i := 0 } 1 {} {
                let p := add(o, add(i, i))
                let temp := byte(i, value)
                mstore8(add(p, 1), mload(and(temp, 15)))
                mstore8(p, mload(shr(4, temp)))
                i := add(i, 1)
                if eq(i, 20) { break }
            }
        }
    }

    /// @dev Returns the hex encoded string from the raw bytes.
    /// The output is encoded using 2 hexadecimal digits per byte.
    function toHexString(bytes memory raw) internal pure returns (string memory str) {
        str = toHexStringNoPrefix(raw);
        /// @solidity memory-safe-assembly
        assembly {
            let strLength := add(mload(str), 2) // Compute the length.
            mstore(str, 0x3078) // Write the "0x" prefix.
            str := sub(str, 2) // Move the pointer.
            mstore(str, strLength) // Write the length.
        }
    }

    /// @dev Returns the hex encoded string from the raw bytes.
    /// The output is encoded using 2 hexadecimal digits per byte.
    function toHexStringNoPrefix(bytes memory raw) internal pure returns (string memory str) {
        /// @solidity memory-safe-assembly
        assembly {
            let length := mload(raw)
            str := add(mload(0x40), 2) // Skip 2 bytes for the optional prefix.
            mstore(str, add(length, length)) // Store the length of the output.

            // Store "0123456789abcdef" in scratch space.
            mstore(0x0f, 0x30313233343536373839616263646566)

            let o := add(str, 0x20)
            let end := add(raw, length)

            for {} iszero(eq(raw, end)) {} {
                raw := add(raw, 1)
                mstore8(add(o, 1), mload(and(mload(raw), 15)))
                mstore8(o, mload(and(shr(4, mload(raw)), 15)))
                o := add(o, 2)
            }
            mstore(o, 0) // Zeroize the slot after the string.
            mstore(0x40, add(o, 0x20)) // Allocate the memory.
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                   RUNE STRING OPERATIONS                   */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns the number of UTF characters in the string.
    function runeCount(string memory s) internal pure returns (uint256 result) {
        /// @solidity memory-safe-assembly
        assembly {
            if mload(s) {
                mstore(0x00, div(not(0), 255))
                mstore(0x20, 0x0202020202020202020202020202020202020202020202020303030304040506)
                let o := add(s, 0x20)
                let end := add(o, mload(s))
                for { result := 1 } 1 { result := add(result, 1) } {
                    o := add(o, byte(0, mload(shr(250, mload(o)))))
                    if iszero(lt(o, end)) { break }
                }
            }
        }
    }

    /// @dev Returns if this string is a 7-bit ASCII string.
    /// (i.e. all characters codes are in [0..127])
    function is7BitASCII(string memory s) internal pure returns (bool result) {
        /// @solidity memory-safe-assembly
        assembly {
            let mask := shl(7, div(not(0), 255))
            result := 1
            let n := mload(s)
            if n {
                let o := add(s, 0x20)
                let end := add(o, n)
                let last := mload(end)
                mstore(end, 0)
                for {} 1 {} {
                    if and(mask, mload(o)) {
                        result := 0
                        break
                    }
                    o := add(o, 0x20)
                    if iszero(lt(o, end)) { break }
                }
                mstore(end, last)
            }
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                   BYTE STRING OPERATIONS                   */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    // For performance and bytecode compactness, all indices of the following operations
    // are byte (ASCII) offsets, not UTF character offsets.

    /// @dev Returns `subject` all occurrences of `search` replaced with `replacement`.
    function replace(string memory subject, string memory search, string memory replacement)
        internal
        pure
        returns (string memory result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let subjectLength := mload(subject)
            let searchLength := mload(search)
            let replacementLength := mload(replacement)

            subject := add(subject, 0x20)
            search := add(search, 0x20)
            replacement := add(replacement, 0x20)
            result := add(mload(0x40), 0x20)

            let subjectEnd := add(subject, subjectLength)
            if iszero(gt(searchLength, subjectLength)) {
                let subjectSearchEnd := add(sub(subjectEnd, searchLength), 1)
                let h := 0
                if iszero(lt(searchLength, 0x20)) { h := keccak256(search, searchLength) }
                let m := shl(3, sub(0x20, and(searchLength, 0x1f)))
                let s := mload(search)
                for {} 1 {} {
                    let t := mload(subject)
                    // Whether the first `searchLength % 32` bytes of
                    // `subject` and `search` matches.
                    if iszero(shr(m, xor(t, s))) {
                        if h {
                            if iszero(eq(keccak256(subject, searchLength), h)) {
                                mstore(result, t)
                                result := add(result, 1)
                                subject := add(subject, 1)
                                if iszero(lt(subject, subjectSearchEnd)) { break }
                                continue
                            }
                        }
                        // Copy the `replacement` one word at a time.
                        for { let o := 0 } 1 {} {
                            mstore(add(result, o), mload(add(replacement, o)))
                            o := add(o, 0x20)
                            if iszero(lt(o, replacementLength)) { break }
                        }
                        result := add(result, replacementLength)
                        subject := add(subject, searchLength)
                        if searchLength {
                            if iszero(lt(subject, subjectSearchEnd)) { break }
                            continue
                        }
                    }
                    mstore(result, t)
                    result := add(result, 1)
                    subject := add(subject, 1)
                    if iszero(lt(subject, subjectSearchEnd)) { break }
                }
            }

            let resultRemainder := result
            result := add(mload(0x40), 0x20)
            let k := add(sub(resultRemainder, result), sub(subjectEnd, subject))
            // Copy the rest of the string one word at a time.
            for {} lt(subject, subjectEnd) {} {
                mstore(resultRemainder, mload(subject))
                resultRemainder := add(resultRemainder, 0x20)
                subject := add(subject, 0x20)
            }
            result := sub(result, 0x20)
            let last := add(add(result, 0x20), k) // Zeroize the slot after the string.
            mstore(last, 0)
            mstore(0x40, add(last, 0x20)) // Allocate the memory.
            mstore(result, k) // Store the length.
        }
    }

    /// @dev Returns the byte index of the first location of `search` in `subject`,
    /// searching from left to right, starting from `from`.
    /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `search` is not found.
    function indexOf(string memory subject, string memory search, uint256 from)
        internal
        pure
        returns (uint256 result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            for { let subjectLength := mload(subject) } 1 {} {
                if iszero(mload(search)) {
                    if iszero(gt(from, subjectLength)) {
                        result := from
                        break
                    }
                    result := subjectLength
                    break
                }
                let searchLength := mload(search)
                let subjectStart := add(subject, 0x20)

                result := not(0) // Initialize to `NOT_FOUND`.

                subject := add(subjectStart, from)
                let end := add(sub(add(subjectStart, subjectLength), searchLength), 1)

                let m := shl(3, sub(0x20, and(searchLength, 0x1f)))
                let s := mload(add(search, 0x20))

                if iszero(and(lt(subject, end), lt(from, subjectLength))) { break }

                if iszero(lt(searchLength, 0x20)) {
                    for { let h := keccak256(add(search, 0x20), searchLength) } 1 {} {
                        if iszero(shr(m, xor(mload(subject), s))) {
                            if eq(keccak256(subject, searchLength), h) {
                                result := sub(subject, subjectStart)
                                break
                            }
                        }
                        subject := add(subject, 1)
                        if iszero(lt(subject, end)) { break }
                    }
                    break
                }
                for {} 1 {} {
                    if iszero(shr(m, xor(mload(subject), s))) {
                        result := sub(subject, subjectStart)
                        break
                    }
                    subject := add(subject, 1)
                    if iszero(lt(subject, end)) { break }
                }
                break
            }
        }
    }

    /// @dev Returns the byte index of the first location of `search` in `subject`,
    /// searching from left to right.
    /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `search` is not found.
    function indexOf(string memory subject, string memory search)
        internal
        pure
        returns (uint256 result)
    {
        result = indexOf(subject, search, 0);
    }

    /// @dev Returns the byte index of the first location of `search` in `subject`,
    /// searching from right to left, starting from `from`.
    /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `search` is not found.
    function lastIndexOf(string memory subject, string memory search, uint256 from)
        internal
        pure
        returns (uint256 result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            for {} 1 {} {
                result := not(0) // Initialize to `NOT_FOUND`.
                let searchLength := mload(search)
                if gt(searchLength, mload(subject)) { break }
                let w := result

                let fromMax := sub(mload(subject), searchLength)
                if iszero(gt(fromMax, from)) { from := fromMax }

                let end := add(add(subject, 0x20), w)
                subject := add(add(subject, 0x20), from)
                if iszero(gt(subject, end)) { break }
                // As this function is not too often used,
                // we shall simply use keccak256 for smaller bytecode size.
                for { let h := keccak256(add(search, 0x20), searchLength) } 1 {} {
                    if eq(keccak256(subject, searchLength), h) {
                        result := sub(subject, add(end, 1))
                        break
                    }
                    subject := add(subject, w) // `sub(subject, 1)`.
                    if iszero(gt(subject, end)) { break }
                }
                break
            }
        }
    }

    /// @dev Returns the byte index of the first location of `search` in `subject`,
    /// searching from right to left.
    /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `search` is not found.
    function lastIndexOf(string memory subject, string memory search)
        internal
        pure
        returns (uint256 result)
    {
        result = lastIndexOf(subject, search, uint256(int256(-1)));
    }

    /// @dev Returns whether `subject` starts with `search`.
    function startsWith(string memory subject, string memory search)
        internal
        pure
        returns (bool result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let searchLength := mload(search)
            // Just using keccak256 directly is actually cheaper.
            // forgefmt: disable-next-item
            result := and(
                iszero(gt(searchLength, mload(subject))),
                eq(
                    keccak256(add(subject, 0x20), searchLength),
                    keccak256(add(search, 0x20), searchLength)
                )
            )
        }
    }

    /// @dev Returns whether `subject` ends with `search`.
    function endsWith(string memory subject, string memory search)
        internal
        pure
        returns (bool result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let searchLength := mload(search)
            let subjectLength := mload(subject)
            // Whether `search` is not longer than `subject`.
            let withinRange := iszero(gt(searchLength, subjectLength))
            // Just using keccak256 directly is actually cheaper.
            // forgefmt: disable-next-item
            result := and(
                withinRange,
                eq(
                    keccak256(
                        // `subject + 0x20 + max(subjectLength - searchLength, 0)`.
                        add(add(subject, 0x20), mul(withinRange, sub(subjectLength, searchLength))),
                        searchLength
                    ),
                    keccak256(add(search, 0x20), searchLength)
                )
            )
        }
    }

    /// @dev Returns `subject` repeated `times`.
    function repeat(string memory subject, uint256 times)
        internal
        pure
        returns (string memory result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let subjectLength := mload(subject)
            if iszero(or(iszero(times), iszero(subjectLength))) {
                subject := add(subject, 0x20)
                result := mload(0x40)
                let output := add(result, 0x20)
                for {} 1 {} {
                    // Copy the `subject` one word at a time.
                    for { let o := 0 } 1 {} {
                        mstore(add(output, o), mload(add(subject, o)))
                        o := add(o, 0x20)
                        if iszero(lt(o, subjectLength)) { break }
                    }
                    output := add(output, subjectLength)
                    times := sub(times, 1)
                    if iszero(times) { break }
                }
                mstore(output, 0) // Zeroize the slot after the string.
                let resultLength := sub(output, add(result, 0x20))
                mstore(result, resultLength) // Store the length.
                // Allocate the memory.
                mstore(0x40, add(result, add(resultLength, 0x20)))
            }
        }
    }

    /// @dev Returns a copy of `subject` sliced from `start` to `end` (exclusive).
    /// `start` and `end` are byte offsets.
    function slice(string memory subject, uint256 start, uint256 end)
        internal
        pure
        returns (string memory result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let subjectLength := mload(subject)
            if iszero(gt(subjectLength, end)) { end := subjectLength }
            if iszero(gt(subjectLength, start)) { start := subjectLength }
            if lt(start, end) {
                result := mload(0x40)
                let resultLength := sub(end, start)
                mstore(result, resultLength)
                subject := add(subject, start)
                let w := not(0x1f)
                // Copy the `subject` one word at a time, backwards.
                for { let o := and(add(resultLength, 0x1f), w) } 1 {} {
                    mstore(add(result, o), mload(add(subject, o)))
                    o := add(o, w) // `sub(o, 0x20)`.
                    if iszero(o) { break }
                }
                // Zeroize the slot after the string.
                mstore(add(add(result, 0x20), resultLength), 0)
                // Allocate memory for the length and the bytes,
                // rounded up to a multiple of 32.
                mstore(0x40, add(result, and(add(resultLength, 0x3f), w)))
            }
        }
    }

    /// @dev Returns a copy of `subject` sliced from `start` to the end of the string.
    /// `start` is a byte offset.
    function slice(string memory subject, uint256 start)
        internal
        pure
        returns (string memory result)
    {
        result = slice(subject, start, uint256(int256(-1)));
    }

    /// @dev Returns all the indices of `search` in `subject`.
    /// The indices are byte offsets.
    function indicesOf(string memory subject, string memory search)
        internal
        pure
        returns (uint256[] memory result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let subjectLength := mload(subject)
            let searchLength := mload(search)

            if iszero(gt(searchLength, subjectLength)) {
                subject := add(subject, 0x20)
                search := add(search, 0x20)
                result := add(mload(0x40), 0x20)

                let subjectStart := subject
                let subjectSearchEnd := add(sub(add(subject, subjectLength), searchLength), 1)
                let h := 0
                if iszero(lt(searchLength, 0x20)) { h := keccak256(search, searchLength) }
                let m := shl(3, sub(0x20, and(searchLength, 0x1f)))
                let s := mload(search)
                for {} 1 {} {
                    let t := mload(subject)
                    // Whether the first `searchLength % 32` bytes of
                    // `subject` and `search` matches.
                    if iszero(shr(m, xor(t, s))) {
                        if h {
                            if iszero(eq(keccak256(subject, searchLength), h)) {
                                subject := add(subject, 1)
                                if iszero(lt(subject, subjectSearchEnd)) { break }
                                continue
                            }
                        }
                        // Append to `result`.
                        mstore(result, sub(subject, subjectStart))
                        result := add(result, 0x20)
                        // Advance `subject` by `searchLength`.
                        subject := add(subject, searchLength)
                        if searchLength {
                            if iszero(lt(subject, subjectSearchEnd)) { break }
                            continue
                        }
                    }
                    subject := add(subject, 1)
                    if iszero(lt(subject, subjectSearchEnd)) { break }
                }
                let resultEnd := result
                // Assign `result` to the free memory pointer.
                result := mload(0x40)
                // Store the length of `result`.
                mstore(result, shr(5, sub(resultEnd, add(result, 0x20))))
                // Allocate memory for result.
                // We allocate one more word, so this array can be recycled for {split}.
                mstore(0x40, add(resultEnd, 0x20))
            }
        }
    }

    /// @dev Returns a arrays of strings based on the `delimiter` inside of the `subject` string.
    function split(string memory subject, string memory delimiter)
        internal
        pure
        returns (string[] memory result)
    {
        uint256[] memory indices = indicesOf(subject, delimiter);
        /// @solidity memory-safe-assembly
        assembly {
            let w := not(0x1f)
            let indexPtr := add(indices, 0x20)
            let indicesEnd := add(indexPtr, shl(5, add(mload(indices), 1)))
            mstore(add(indicesEnd, w), mload(subject))
            mstore(indices, add(mload(indices), 1))
            let prevIndex := 0
            for {} 1 {} {
                let index := mload(indexPtr)
                mstore(indexPtr, 0x60)
                if iszero(eq(index, prevIndex)) {
                    let element := mload(0x40)
                    let elementLength := sub(index, prevIndex)
                    mstore(element, elementLength)
                    // Copy the `subject` one word at a time, backwards.
                    for { let o := and(add(elementLength, 0x1f), w) } 1 {} {
                        mstore(add(element, o), mload(add(add(subject, prevIndex), o)))
                        o := add(o, w) // `sub(o, 0x20)`.
                        if iszero(o) { break }
                    }
                    // Zeroize the slot after the string.
                    mstore(add(add(element, 0x20), elementLength), 0)
                    // Allocate memory for the length and the bytes,
                    // rounded up to a multiple of 32.
                    mstore(0x40, add(element, and(add(elementLength, 0x3f), w)))
                    // Store the `element` into the array.
                    mstore(indexPtr, element)
                }
                prevIndex := add(index, mload(delimiter))
                indexPtr := add(indexPtr, 0x20)
                if iszero(lt(indexPtr, indicesEnd)) { break }
            }
            result := indices
            if iszero(mload(delimiter)) {
                result := add(indices, 0x20)
                mstore(result, sub(mload(indices), 2))
            }
        }
    }

    /// @dev Returns a concatenated string of `a` and `b`.
    /// Cheaper than `string.concat()` and does not de-align the free memory pointer.
    function concat(string memory a, string memory b)
        internal
        pure
        returns (string memory result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let w := not(0x1f)
            result := mload(0x40)
            let aLength := mload(a)
            // Copy `a` one word at a time, backwards.
            for { let o := and(add(mload(a), 0x20), w) } 1 {} {
                mstore(add(result, o), mload(add(a, o)))
                o := add(o, w) // `sub(o, 0x20)`.
                if iszero(o) { break }
            }
            let bLength := mload(b)
            let output := add(result, mload(a))
            // Copy `b` one word at a time, backwards.
            for { let o := and(add(bLength, 0x20), w) } 1 {} {
                mstore(add(output, o), mload(add(b, o)))
                o := add(o, w) // `sub(o, 0x20)`.
                if iszero(o) { break }
            }
            let totalLength := add(aLength, bLength)
            let last := add(add(result, 0x20), totalLength)
            // Zeroize the slot after the string.
            mstore(last, 0)
            // Stores the length.
            mstore(result, totalLength)
            // Allocate memory for the length and the bytes,
            // rounded up to a multiple of 32.
            mstore(0x40, and(add(last, 0x1f), w))
        }
    }

    /// @dev Returns a copy of the string in either lowercase or UPPERCASE.
    /// WARNING! This function is only compatible with 7-bit ASCII strings.
    function toCase(string memory subject, bool toUpper)
        internal
        pure
        returns (string memory result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            let length := mload(subject)
            if length {
                result := add(mload(0x40), 0x20)
                subject := add(subject, 1)
                let flags := shl(add(70, shl(5, toUpper)), 0x3ffffff)
                let w := not(0)
                for { let o := length } 1 {} {
                    o := add(o, w)
                    let b := and(0xff, mload(add(subject, o)))
                    mstore8(add(result, o), xor(b, and(shr(b, flags), 0x20)))
                    if iszero(o) { break }
                }
                result := mload(0x40)
                mstore(result, length) // Store the length.
                let last := add(add(result, 0x20), length)
                mstore(last, 0) // Zeroize the slot after the string.
                mstore(0x40, add(last, 0x20)) // Allocate the memory.
            }
        }
    }

    /// @dev Returns a lowercased copy of the string.
    /// WARNING! This function is only compatible with 7-bit ASCII strings.
    function lower(string memory subject) internal pure returns (string memory result) {
        result = toCase(subject, false);
    }

    /// @dev Returns an UPPERCASED copy of the string.
    /// WARNING! This function is only compatible with 7-bit ASCII strings.
    function upper(string memory subject) internal pure returns (string memory result) {
        result = toCase(subject, true);
    }

    /// @dev Escapes the string to be used within HTML tags.
    function escapeHTML(string memory s) internal pure returns (string memory result) {
        /// @solidity memory-safe-assembly
        assembly {
            for {
                let end := add(s, mload(s))
                result := add(mload(0x40), 0x20)
                // Store the bytes of the packed offsets and strides into the scratch space.
                // `packed = (stride << 5) | offset`. Max offset is 20. Max stride is 6.
                mstore(0x1f, 0x900094)
                mstore(0x08, 0xc0000000a6ab)
                // Store "&quot;&amp;&#39;&lt;&gt;" into the scratch space.
                mstore(0x00, shl(64, 0x2671756f743b26616d703b262333393b266c743b2667743b))
            } iszero(eq(s, end)) {} {
                s := add(s, 1)
                let c := and(mload(s), 0xff)
                // Not in `["\"","'","&","<",">"]`.
                if iszero(and(shl(c, 1), 0x500000c400000000)) {
                    mstore8(result, c)
                    result := add(result, 1)
                    continue
                }
                let t := shr(248, mload(c))
                mstore(result, mload(and(t, 0x1f)))
                result := add(result, shr(5, t))
            }
            let last := result
            mstore(last, 0) // Zeroize the slot after the string.
            result := mload(0x40)
            mstore(result, sub(last, add(result, 0x20))) // Store the length.
            mstore(0x40, add(last, 0x20)) // Allocate the memory.
        }
    }

    /// @dev Escapes the string to be used within double-quotes in a JSON.
    function escapeJSON(string memory s) internal pure returns (string memory result) {
        /// @solidity memory-safe-assembly
        assembly {
            for {
                let end := add(s, mload(s))
                result := add(mload(0x40), 0x20)
                // Store "\\u0000" in scratch space.
                // Store "0123456789abcdef" in scratch space.
                // Also, store `{0x08:"b", 0x09:"t", 0x0a:"n", 0x0c:"f", 0x0d:"r"}`.
                // into the scratch space.
                mstore(0x15, 0x5c75303030303031323334353637383961626364656662746e006672)
                // Bitmask for detecting `["\"","\\"]`.
                let e := or(shl(0x22, 1), shl(0x5c, 1))
            } iszero(eq(s, end)) {} {
                s := add(s, 1)
                let c := and(mload(s), 0xff)
                if iszero(lt(c, 0x20)) {
                    if iszero(and(shl(c, 1), e)) {
                        // Not in `["\"","\\"]`.
                        mstore8(result, c)
                        result := add(result, 1)
                        continue
                    }
                    mstore8(result, 0x5c) // "\\".
                    mstore8(add(result, 1), c)
                    result := add(result, 2)
                    continue
                }
                if iszero(and(shl(c, 1), 0x3700)) {
                    // Not in `["\b","\t","\n","\f","\d"]`.
                    mstore8(0x1d, mload(shr(4, c))) // Hex value.
                    mstore8(0x1e, mload(and(c, 15))) // Hex value.
                    mstore(result, mload(0x19)) // "\\u00XX".
                    result := add(result, 6)
                    continue
                }
                mstore8(result, 0x5c) // "\\".
                mstore8(add(result, 1), mload(add(c, 8)))
                result := add(result, 2)
            }
            let last := result
            mstore(last, 0) // Zeroize the slot after the string.
            result := mload(0x40)
            mstore(result, sub(last, add(result, 0x20))) // Store the length.
            mstore(0x40, add(last, 0x20)) // Allocate the memory.
        }
    }

    /// @dev Returns whether `a` equals `b`.
    function eq(string memory a, string memory b) internal pure returns (bool result) {
        assembly {
            result := eq(keccak256(add(a, 0x20), mload(a)), keccak256(add(b, 0x20), mload(b)))
        }
    }

    /// @dev Packs a single string with its length into a single word.
    /// Returns `bytes32(0)` if the length is zero or greater than 31.
    function packOne(string memory a) internal pure returns (bytes32 result) {
        /// @solidity memory-safe-assembly
        assembly {
            // We don't need to zero right pad the string,
            // since this is our own custom non-standard packing scheme.
            result :=
                mul(
                    // Load the length and the bytes.
                    mload(add(a, 0x1f)),
                    // `length != 0 && length < 32`. Abuses underflow.
                    // Assumes that the length is valid and within the block gas limit.
                    lt(sub(mload(a), 1), 0x1f)
                )
        }
    }

    /// @dev Unpacks a string packed using {packOne}.
    /// Returns the empty string if `packed` is `bytes32(0)`.
    /// If `packed` is not an output of {packOne}, the output behaviour is undefined.
    function unpackOne(bytes32 packed) internal pure returns (string memory result) {
        /// @solidity memory-safe-assembly
        assembly {
            // Grab the free memory pointer.
            result := mload(0x40)
            // Allocate 2 words (1 for the length, 1 for the bytes).
            mstore(0x40, add(result, 0x40))
            // Zeroize the length slot.
            mstore(result, 0)
            // Store the length and bytes.
            mstore(add(result, 0x1f), packed)
            // Right pad with zeroes.
            mstore(add(add(result, 0x20), mload(result)), 0)
        }
    }

    /// @dev Packs two strings with their lengths into a single word.
    /// Returns `bytes32(0)` if combined length is zero or greater than 30.
    function packTwo(string memory a, string memory b) internal pure returns (bytes32 result) {
        /// @solidity memory-safe-assembly
        assembly {
            let aLength := mload(a)
            // We don't need to zero right pad the strings,
            // since this is our own custom non-standard packing scheme.
            result :=
                mul(
                    // Load the length and the bytes of `a` and `b`.
                    or(
                        shl(shl(3, sub(0x1f, aLength)), mload(add(a, aLength))),
                        mload(sub(add(b, 0x1e), aLength))
                    ),
                    // `totalLength != 0 && totalLength < 31`. Abuses underflow.
                    // Assumes that the lengths are valid and within the block gas limit.
                    lt(sub(add(aLength, mload(b)), 1), 0x1e)
                )
        }
    }

    /// @dev Unpacks strings packed using {packTwo}.
    /// Returns the empty strings if `packed` is `bytes32(0)`.
    /// If `packed` is not an output of {packTwo}, the output behaviour is undefined.
    function unpackTwo(bytes32 packed)
        internal
        pure
        returns (string memory resultA, string memory resultB)
    {
        /// @solidity memory-safe-assembly
        assembly {
            // Grab the free memory pointer.
            resultA := mload(0x40)
            resultB := add(resultA, 0x40)
            // Allocate 2 words for each string (1 for the length, 1 for the byte). Total 4 words.
            mstore(0x40, add(resultB, 0x40))
            // Zeroize the length slots.
            mstore(resultA, 0)
            mstore(resultB, 0)
            // Store the lengths and bytes.
            mstore(add(resultA, 0x1f), packed)
            mstore(add(resultB, 0x1f), mload(add(add(resultA, 0x20), mload(resultA))))
            // Right pad with zeroes.
            mstore(add(add(resultA, 0x20), mload(resultA)), 0)
            mstore(add(add(resultB, 0x20), mload(resultB)), 0)
        }
    }

    /// @dev Directly returns `a` without copying.
    function directReturn(string memory a) internal pure {
        assembly {
            // Assumes that the string does not start from the scratch space.
            let retStart := sub(a, 0x20)
            let retSize := add(mload(a), 0x40)
            // Right pad with zeroes. Just in case the string is produced
            // by a method that doesn't zero right pad.
            mstore(add(retStart, retSize), 0)
            // Store the return offset.
            mstore(retStart, 0x20)
            // End the transaction, returning the string.
            return(retStart, retSize)
        }
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"string[]","name":"_backgroundsOptions","type":"string[]"},{"internalType":"string[]","name":"_typesOptions","type":"string[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[{"internalType":"uint256","name":"_size","type":"uint256"},{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"_end","type":"uint256"}],"name":"InvalidCodeAtRange","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"InvalidTraits","type":"error"},{"inputs":[],"name":"MaxMint","type":"error"},{"inputs":[],"name":"MintClosed","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"NotEnoughLeft","type":"error"},{"inputs":[],"name":"NotEqualLength","type":"error"},{"inputs":[],"name":"NotOnWhitelist","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TokenDoesntExist","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"WriteError","type":"error"},{"inputs":[],"name":"ZeroBalance","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"string[]","name":"_varieties","type":"string[]"},{"internalType":"uint16[]","name":"_types","type":"uint16[]"},{"internalType":"uint16[]","name":"_backgrounds","type":"uint16[]"},{"internalType":"string[]","name":"_traits","type":"string[]"}],"name":"addCritters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"backgroundsOptions","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"checkWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOpen","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":"amount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"setMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newMerkleRoot","type":"bytes32"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"metadata","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"typesOptions","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040526008805460ff60a01b1916905560006009553480156200002357600080fd5b50604051620036fb380380620036fb8339810160408190526200004691620004c7565b8484600262000056838262000619565b50600362000065828262000619565b50506000805550620000773362000172565b6080839052826001600160401b0381111562000097576200009762000347565b604051908082528060200260200182016040528015620000c1578160200160208202803683370190505b508051620000d891600f91602090910190620001c4565b50826001600160401b03811115620000f457620000f462000347565b6040519080825280602002602001820160405280156200011e578160200160208202803683370190505b5080516200013591600e91602090910190620001c4565b50601083905581516200015090600b90602085019062000274565b5080516200016690600c90602084019062000274565b505050505050620006e5565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805482825590600052602060002090600f01601090048101928215620002625791602002820160005b838211156200023057835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302620001ee565b8015620002605782816101000a81549061ffff021916905560020160208160010104928301926001030262000230565b505b5062000270929150620002cd565b5090565b828054828255906000526020600020908101928215620002bf579160200282015b82811115620002bf5782518290620002ae908262000619565b509160200191906001019062000295565b5062000270929150620002e4565b5b80821115620002705760008155600101620002ce565b8082111562000270576000620002fb828262000305565b50600101620002e4565b50805462000313906200058a565b6000825580601f1062000324575050565b601f016020900490600052602060002090810190620003449190620002cd565b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562000388576200038862000347565b604052919050565b600082601f830112620003a257600080fd5b81516001600160401b03811115620003be57620003be62000347565b6020620003d4601f8301601f191682016200035d565b8281528582848701011115620003e957600080fd5b60005b8381101562000409578581018301518282018401528201620003ec565b506000928101909101919091529392505050565b600082601f8301126200042f57600080fd5b815160206001600160401b03808311156200044e576200044e62000347565b8260051b6200045f8382016200035d565b93845285810183019383810190888611156200047a57600080fd5b84880192505b85831015620004bb578251848111156200049a5760008081fd5b620004aa8a87838c010162000390565b835250918401919084019062000480565b98975050505050505050565b600080600080600060a08688031215620004e057600080fd5b85516001600160401b0380821115620004f857600080fd5b6200050689838a0162000390565b965060208801519150808211156200051d57600080fd5b6200052b89838a0162000390565b95506040880151945060608801519150808211156200054957600080fd5b6200055789838a016200041d565b935060808801519150808211156200056e57600080fd5b506200057d888289016200041d565b9150509295509295909350565b600181811c908216806200059f57607f821691505b602082108103620005c057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200061457600081815260208120601f850160051c81016020861015620005ef5750805b601f850160051c820191505b818110156200061057828155600101620005fb565b5050505b505050565b81516001600160401b0381111562000635576200063562000347565b6200064d816200064684546200058a565b84620005c6565b602080601f8311600181146200068557600084156200066c5750858301515b600019600386901b1c1916600185901b17855562000610565b600085815260208120601f198616915b82811015620006b65788860151825594840194600190910190840162000695565b5085821015620006d55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b608051612ff3620007086000396000818161022401526118320152612ff36000f3fe6080604052600436106101d85760003560e01c80636352211e1161010257806399a2557a11610095578063c87b56dd11610064578063c87b56dd14610565578063e985e9c514610585578063f19e75d4146105ce578063f2fde38b146105ee57600080fd5b806399a2557a146104e5578063a22cb46514610505578063b88d4fde14610525578063c23dc68f1461053857600080fd5b8063715018a6116100d1578063715018a6146104705780638462151c146104855780638da5cb5b146104b257806395d89b41146104d057600080fd5b80636352211e146103f0578063690944d61461041057806369a030341461043057806370a082311461045057600080fd5b80631f85e3ca1161017a578063440bc7f311610149578063440bc7f31461036257806347535d7b146103825780635bbb2177146103a35780635d67aedb146103d057600080fd5b80631f85e3ca146102fc57806323b872dd1461031c578063372f657c1461032f57806342842e0e1461034f57600080fd5b8063081812fc116101b6578063081812fc14610276578063095ea7b3146102ae5780631649a8a9146102c357806318160ddd146102e357600080fd5b806301ffc9a7146101dd578063047fc9aa1461021257806306fdde0314610254575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004612278565b61060e565b60405190151581526020015b60405180910390f35b34801561021e57600080fd5b506102467f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610209565b34801561026057600080fd5b50610269610660565b60405161020991906122e5565b34801561028257600080fd5b506102966102913660046122f8565b6106f2565b6040516001600160a01b039091168152602001610209565b6102c16102bc36600461232d565b610736565b005b3480156102cf57600080fd5b506101fd6102de3660046123a2565b6107d6565b3480156102ef57600080fd5b5060015460005403610246565b34801561030857600080fd5b506102c1610317366004612404565b610858565b6102c161032a36600461241f565b61087e565b34801561033b57600080fd5b506102c161034a36600461245b565b610a17565b6102c161035d36600461241f565b610a7e565b34801561036e57600080fd5b506102c161037d3660046122f8565b610a9e565b34801561038e57600080fd5b506008546101fd90600160a01b900460ff1681565b3480156103af57600080fd5b506103c36103be36600461245b565b610aab565b60405161020991906124d8565b3480156103dc57600080fd5b506102c16103eb36600461251a565b610b76565b3480156103fc57600080fd5b5061029661040b3660046122f8565b610de7565b34801561041c57600080fd5b5061026961042b3660046122f8565b610df2565b34801561043c57600080fd5b5061026961044b3660046122f8565b610e9e565b34801561045c57600080fd5b5061024661046b3660046125dd565b610eae565b34801561047c57600080fd5b506102c1610efc565b34801561049157600080fd5b506104a56104a03660046125dd565b610f10565b60405161020991906125f8565b3480156104be57600080fd5b506008546001600160a01b0316610296565b3480156104dc57600080fd5b50610269611018565b3480156104f157600080fd5b506104a5610500366004612630565b611027565b34801561051157600080fd5b506102c1610520366004612663565b61119e565b6102c16105333660046126ac565b61120a565b34801561054457600080fd5b506105586105533660046122f8565b611254565b6040516102099190612787565b34801561057157600080fd5b506102696105803660046122f8565b6112cc565b34801561059157600080fd5b506101fd6105a0366004612795565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156105da57600080fd5b506102c16105e93660046122f8565b611676565b3480156105fa57600080fd5b506102c16106093660046125dd565b61168a565b60006301ffc9a760e01b6001600160e01b03198316148061063f57506380ac58cd60e01b6001600160e01b03198316145b8061065a5750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606002805461066f906127bf565b80601f016020809104026020016040519081016040528092919081815260200182805461069b906127bf565b80156106e85780601f106106bd576101008083540402835291602001916106e8565b820191906000526020600020905b8154815290600101906020018083116106cb57829003601f168201915b5050505050905090565b60006106fd82611705565b61071a576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061074182610de7565b9050336001600160a01b0382161461077a5761075d81336105a0565b61077a576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061084e838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506009546040516bffffffffffffffffffffffff1960608b901b16602082015290925060340190506040516020818303038152906040528051906020012061172c565b90505b9392505050565b610860611742565b60088054911515600160a01b0260ff60a01b19909216919091179055565b60006108898261179c565b9050836001600160a01b0316816001600160a01b0316146108bc5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610909576108ec86336105a0565b61090957604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661093057604051633a954ecd60e21b815260040160405180910390fd5b801561093b57600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b841690036109cd576001840160008181526004602052604081205490036109cb5760005481146109cb5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b610a223383836107d6565b610a3f5760405163522fc3bd60e01b815260040160405180910390fd5b336000908152600a602052604090205460ff1615610a7057604051634a7ba1cb60e11b815260040160405180910390fd5b610a7a6001611803565b5050565b610a998383836040518060200160405280600081525061120a565b505050565b610aa6611742565b600955565b6060816000816001600160401b03811115610ac857610ac8612696565b604051908082528060200260200182016040528015610b1a57816020015b604080516080810182526000808252602080830182905292820181905260608201528252600019909201910181610ae65790505b50905060005b828114610b6d57610b48868683818110610b3c57610b3c6127f3565b90506020020135611254565b828281518110610b5a57610b5a6127f3565b6020908102919091010152600101610b20565b50949350505050565b610b7e611742565b868514610b9e57604051630cf0bdb360e21b815260040160405180910390fd5b868314610bbe57604051630cf0bdb360e21b815260040160405180910390fd5b868114610bde57604051630cf0bdb360e21b815260040160405180910390fd5b60408051608081018252606080825260006020830181905292820183905281018290525b898983818110610c1457610c146127f3565b9050602002810190610c269190612809565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250878783818110610c6f57610c6f6127f3565b9050602002016020810190610c84919061284f565b61ffff166020820152858583818110610c9f57610c9f6127f3565b9050602002016020810190610cb4919061284f565b61ffff166040820152610d1e848484818110610cd257610cd26127f3565b9050602002810190610ce49190612809565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061197d92505050565b6001600160a01b03166060820152600d8054600181018255600091909152815182916002027fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb501908190610d7290826128b9565b5060208201516001918201805460408501516060909501516001600160a01b031664010000000002640100000000600160c01b031961ffff968716620100000263ffffffff1990931696909416959095171791909116929092179091559190910190888210610c025750505050505050505050565b600061065a8261179c565b600b8181548110610e0257600080fd5b906000526020600020016000915090508054610e1d906127bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610e49906127bf565b8015610e965780601f10610e6b57610100808354040283529160200191610e96565b820191906000526020600020905b815481529060010190602001808311610e7957829003601f168201915b505050505081565b600c8181548110610e0257600080fd5b60006001600160a01b038216610ed7576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b610f04611742565b610f0e60006119e2565b565b60606000806000610f2085610eae565b90506000816001600160401b03811115610f3c57610f3c612696565b604051908082528060200260200182016040528015610f65578160200160208202803683370190505b509050610f9260408051608081018252600080825260208201819052918101829052606081019190915290565b60005b83861461100c57610fa581611a34565b915081604001516110045781516001600160a01b031615610fc557815194505b876001600160a01b0316856001600160a01b0316036110045780838780600101985081518110610ff757610ff76127f3565b6020026020010181815250505b600101610f95565b50909695505050505050565b60606003805461066f906127bf565b606081831061104957604051631960ccad60e11b815260040160405180910390fd5b60008061105560005490565b905080841115611063578093505b600061106e87610eae565b90508486101561108d5785850381811015611087578091505b50611091565b5060005b6000816001600160401b038111156110ab576110ab612696565b6040519080825280602002602001820160405280156110d4578160200160208202803683370190505b509050816000036110ea57935061085192505050565b60006110f588611254565b905060008160400151611106575080515b885b8881141580156111185750848714155b1561118d5761112681611a34565b925082604001516111855782516001600160a01b03161561114657825191505b8a6001600160a01b0316826001600160a01b0316036111855780848880600101995081518110611178576111786127f3565b6020026020010181815250505b600101611108565b505050928352509095945050505050565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61121584848461087e565b6001600160a01b0383163b1561124e5761123184848484611a70565b61124e576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60408051608080820183526000808352602080840182905283850182905260608085018390528551938401865282845290830182905293820181905292810183905290915060005483106112a85792915050565b6112b183611a34565b90508060400151156112c35792915050565b61085183611b5b565b60606112d782611705565b6112f457604051631d6fa32560e31b815260040160405180910390fd5b6000600d600e848154811061130b5761130b6127f3565b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff1681548110611343576113436127f3565b906000526020600020906002020160405180608001604052908160008201805461136c906127bf565b80601f0160208091040260200160405190810160405280929190818152602001828054611398906127bf565b80156113e55780601f106113ba576101008083540402835291602001916113e5565b820191906000526020600020905b8154815290600101906020018083116113c857829003601f168201915b50505091835250506001919091015461ffff808216602080850191909152620100008304821660408501526401000000009092046001600160a01b0316606090930192909252820151600c805493945060009390929190911690811061144d5761144d6127f3565b906000526020600020018054611462906127bf565b80601f016020809104026020016040519081016040528092919081815260200182805461148e906127bf565b80156114db5780601f106114b0576101008083540402835291602001916114db565b820191906000526020600020905b8154815290600101906020018083116114be57829003601f168201915b5050505050905060006114f2828460000151611b90565b6114fb84611c1b565b611528604051806040016040528060078152602001667661726965747960c81b8152508660000151611c77565b61154e604051806040016040528060048152602001637479706560e01b81525086611c77565b6116276040518060400160405280600a815260200169189858dad9dc9bdd5b9960b21b815250600b896040015161ffff168154811061158f5761158f6127f3565b9060005260206000200180546115a4906127bf565b80601f01602080910402602001604051908101604052809291908181526020018280546115d0906127bf565b801561161d5780601f106115f25761010080835404028352916020019161161d565b820191906000526020600020905b81548152906001019060200180831161160057829003601f168201915b5050505050611c77565b60405160200161163b959493929190612994565b60405160208183030381529060405290508060405160200161165d9190612ae1565b6040516020818303038152906040529350505050919050565b61167e611742565b61168781611803565b50565b611692611742565b6001600160a01b0381166116fc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b611687816119e2565b600080548210801561065a575050600090815260046020526040902054600160e01b161590565b6000826117398584611c8c565b14949350505050565b6008546001600160a01b03163314610f0e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016116f3565b6000816000548110156117ea5760008181526004602052604081205490600160e01b821690036117e8575b806000036108515750600019016000818152600460205260409020546117c7565b505b604051636f96cda160e11b815260040160405180910390fd5b600854600160a01b900460ff1661182d5760405163589ed34b60e01b815260040160405180910390fd5b6000547f0000000000000000000000000000000000000000000000000000000000000000828201111561187357604051631a11574b60e01b815260040160405180910390fd5b600042336040516020016118a392919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b6040516020818303038152906040528051906020012060001c905060005b838160ff161015611935576118d582611cd9565b600e84815481106118e8576118e86127f3565b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff1602179055508261192190612b35565b92508061192d81612b4e565b9150506118c1565b506008546001600160a01b0316331461196357336000908152600a60205260409020805460ff191660011790555b610a99338460405180602001604052806000815250611e9e565b6000806119a8836040516020016119949190612b6d565b604051602081830303815290604052611f0b565b90508051602082016000f091506001600160a01b0382166119dc5760405163046a55db60e11b815260040160405180910390fd5b50919050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60408051608081018252600080825260208201819052918101829052606081019190915260008281526004602052604090205461065a90611f37565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611aa5903390899088908890600401612b93565b6020604051808303816000875af1925050508015611ae0575060408051601f3d908101601f19168201909252611add91810190612bd0565b60015b611b3e573d808015611b0e576040519150601f19603f3d011682016040523d82523d6000602084013e611b13565b606091505b508051600003611b36576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b60408051608081018252600080825260208201819052918101829052606081019190915261065a611b8b8361179c565b611f37565b60405165556e6971756560d01b60208201526060906026016040516020818303038152906040528051906020012083604051602001611bcf9190612bed565b6040516020818303038152906040528051906020012003611bf157508061065a565b8282604051602001611c04929190612c09565b604051602081830303815290604052905092915050565b606061065a600b836040015161ffff1681548110611c3b57611c3b6127f3565b90600052602060002001611c528460600151611f7e565b604051602001611c63929190612c45565b604051602081830303815290604052611f8e565b60608282604051602001611c04929190612ee4565b600081815b8451811015611cd157611cbd82868381518110611cb057611cb06127f3565b6020026020010151611f9c565b915080611cc981612b35565b915050611c91565b509392505050565b6000601054600003611cfe57604051631a11574b60e01b815260040160405180910390fd5b601080546000198101918290556000908481611d1c57611d1c612f56565b069050600f8181548110611d3257611d326127f3565b600091825260208220601082040154600f9091166002026101000a900461ffff169003611d5f5780611d97565b600f8181548110611d7257611d726127f3565b90600052602060002090601091828204019190066002029054906101000a900461ffff165b9250600f8281548110611dac57611dac6127f3565b60009182526020909120601082040154600f9091166002026101000a900461ffff1615611e0f57600f8281548110611de657611de66127f3565b90600052602060002090601091828204019190066002029054906101000a900461ffff16611e11565b815b600f8281548110611e2457611e246127f3565b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff1602179055506000600f8381548110611e6857611e686127f3565b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff1602179055505050919050565b611ea88383611fc8565b6001600160a01b0383163b15610a99576000548281035b611ed26000868380600101945086611a70565b611eef576040516368d2bf6b60e11b815260040160405180910390fd5b818110611ebf578160005414611f0457600080fd5b5050505050565b6060815182604051602001611f21929190612f6c565b6040516020818303038152906040529050919050565b604080516080810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b831615159181019190915260e89190911c606082015290565b606061065a8260016000196120c6565b606061065a8260008061217b565b6000818310611fb8576000828152602084905260409020610851565b5060009182526020526040902090565b6000805490829003611fed5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461209c57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101612064565b50816000036120bd57604051622e076360e81b815260040160405180910390fd5b60005550505050565b6060833b60008190036120e9575050604080516020810190915260008152610851565b80841115612107575050604080516020810190915260008152610851565b838310156121395760405163162544fd60e11b81526004810182905260248101859052604481018490526064016116f3565b838303848203600082821061214e5782612150565b815b60408051603f8301601f19168101909152818152955090508087602087018a3c505050509392505050565b606083518015611cd1576003600282010460021b60405192507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f526102308515027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f03603f52602083018181015b6003880197508751603f8160121c1651600053603f81600c1c1651600153603f8160061c1651600253603f8116516003535060005182526004820191508082106121eb57602001604052613d3d60f01b60038406600204808303919091526000861515909102918290035290038252509392505050565b6001600160e01b03198116811461168757600080fd5b60006020828403121561228a57600080fd5b813561085181612262565b60005b838110156122b0578181015183820152602001612298565b50506000910152565b600081518084526122d1816020860160208601612295565b601f01601f19169290920160200192915050565b60208152600061085160208301846122b9565b60006020828403121561230a57600080fd5b5035919050565b80356001600160a01b038116811461232857600080fd5b919050565b6000806040838503121561234057600080fd5b61234983612311565b946020939093013593505050565b60008083601f84011261236957600080fd5b5081356001600160401b0381111561238057600080fd5b6020830191508360208260051b850101111561239b57600080fd5b9250929050565b6000806000604084860312156123b757600080fd5b6123c084612311565b925060208401356001600160401b038111156123db57600080fd5b6123e786828701612357565b9497909650939450505050565b8035801515811461232857600080fd5b60006020828403121561241657600080fd5b610851826123f4565b60008060006060848603121561243457600080fd5b61243d84612311565b925061244b60208501612311565b9150604084013590509250925092565b6000806020838503121561246e57600080fd5b82356001600160401b0381111561248457600080fd5b61249085828601612357565b90969095509350505050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b6020808252825182820181905260009190848201906040850190845b8181101561100c5761250783855161249c565b92840192608092909201916001016124f4565b6000806000806000806000806080898b03121561253657600080fd5b88356001600160401b038082111561254d57600080fd5b6125598c838d01612357565b909a50985060208b013591508082111561257257600080fd5b61257e8c838d01612357565b909850965060408b013591508082111561259757600080fd5b6125a38c838d01612357565b909650945060608b01359150808211156125bc57600080fd5b506125c98b828c01612357565b999c989b5096995094979396929594505050565b6000602082840312156125ef57600080fd5b61085182612311565b6020808252825182820181905260009190848201906040850190845b8181101561100c57835183529284019291840191600101612614565b60008060006060848603121561264557600080fd5b61264e84612311565b95602085013595506040909401359392505050565b6000806040838503121561267657600080fd5b61267f83612311565b915061268d602084016123f4565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156126c257600080fd5b6126cb85612311565b93506126d960208601612311565b92506040850135915060608501356001600160401b03808211156126fc57600080fd5b818701915087601f83011261271057600080fd5b81358181111561272257612722612696565b604051601f8201601f19908116603f0116810190838211818310171561274a5761274a612696565b816040528281528a602084870101111561276357600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6080810161065a828461249c565b600080604083850312156127a857600080fd5b6127b183612311565b915061268d60208401612311565b600181811c908216806127d357607f821691505b6020821081036119dc57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261282057600080fd5b8301803591506001600160401b0382111561283a57600080fd5b60200191503681900382131561239b57600080fd5b60006020828403121561286157600080fd5b813561ffff8116811461085157600080fd5b601f821115610a9957600081815260208120601f850160051c8101602086101561289a5750805b601f850160051c820191505b81811015610a0f578281556001016128a6565b81516001600160401b038111156128d2576128d2612696565b6128e6816128e084546127bf565b84612873565b602080601f83116001811461291b57600084156129035750858301515b600019600386901b1c1916600185901b178555610a0f565b600085815260208120601f198616915b8281101561294a5788860151825594840194600190910190840161292b565b50858210156129685787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000815161298a818560208601612295565b9290920192915050565b693d913730b6b2911d101160b11b815285516000906129ba81600a850160208b01612295565b71111610113232b9b1b934b83a34b7b7111d1160711b600a918401918201527f3133333720637269747465727320617265207075726520312f312068616e6463601c8201527f72616674656420616e696d616c73206c6976696e67206f6e636861696e000000603c8201527f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b62616059820152641cd94d8d0b60da1b60798201528651612a6c81607e840160208b01612295565b61088b60f21b9101607e8101919091526e2261747472696275746573223a205b60881b6080820152612ad5612ac7612ac1612aae612abb81608f87018c612978565b600b60fa1b815260010190565b89612978565b86612978565b615d7d60f01b815260020190565b98975050505050505050565b7519185d184e985c1c1b1a58d85d1a5bdb8bda9cdbdb8b60521b815260008251612b12816016850160208701612295565b9190910160160192915050565b634e487b7160e01b600052601160045260246000fd5b600060018201612b4757612b47612b1f565b5060010190565b600060ff821660ff8103612b6457612b64612b1f565b60010192915050565b6000815260008251612b86816001850160208701612295565b9190910160010192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612bc6908301846122b9565b9695505050505050565b600060208284031215612be257600080fd5b815161085181612262565b60008251612bff818460208701612295565b9190910192915050565b60008351612c1b818460208801612295565b600160fd1b9083019081528351612c39816001840160208801612295565b01600101949350505050565b7f3c7376672069643d2263726974746572222077696474683d22313030252220688152600060207f65696768743d2231303025222076696577426f783d2230203020323030303020818401527f32303030302220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f6040840152691918181817b9bb33911f60b11b60608401527f3c7374796c653e23637269747465727b6261636b67726f756e642d636f6c6f72606a840152601d60f91b608a840152608b60008654612d09816127bf565b60018281168015612d215760018114612d3a57612d6a565b60ff198416898701528215158302890186019450612d6a565b8a6000528660002060005b84811015612d605781548b8201890152908301908801612d45565b505085838a010194505b50507f3b6261636b67726f756e642d696d6167653a75726c28646174613a696d616765835250506b0bdc1b99ced8985cd94d8d0b60a21b6020820152612ed9612db6602c830188612978565b7f293b6261636b67726f756e642d7265706561743a6e6f2d7265706561743b626181527f636b67726f756e642d73697a653a636f6e7461696e3b6261636b67726f756e6460208201527f2d706f736974696f6e3a63656e7465723b696d6167652d72656e646572696e6760408201527f3a2d7765626b69742d6f7074696d697a652d636f6e74726173743b2d6d732d6960608201527f6e746572706f6c6174696f6e2d6d6f64653a6e6561726573742d6e656967686260808201527f6f723b696d6167652d72656e646572696e673a2d6d6f7a2d63726973702d656460a08201527f6765733b696d6167652d72656e646572696e673a706978656c617465643b7d3c60c08201526c17b9ba3cb6329f1e17b9bb339f60991b60e082015260ed0190565b979650505050505050565b6e3d913a3930b4ba2fba3cb832911d1160891b81528251600090612f0f81600f850160208801612295565b6b1116113b30b63ab2911d101160a11b600f918401918201528351612f3b81601b840160208801612295565b61227d60f01b601b9290910191820152601d01949350505050565b634e487b7160e01b600052601260045260246000fd5b606360f81b815260e083901b6001600160e01b03191660018201526880600e6000396000f360b81b60058201528151600090612faf81600e850160208701612295565b91909101600e01939250505056fea2646970667358221220346e1c9ab24d93e4308de2858d95f74d29eff28fbc9501fbe821ed0047d1114364736f6c6343000812003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001a400000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000007280000000000000000000000000000000000000000000000000000000000000000d3133333720437269747465727300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b3133333743524954544552000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012e00000000000000000000000000000000000000000000000000000000000025c000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002640000000000000000000000000000000000000000000000000000000000000268000000000000000000000000000000000000000000000000000000000000026c000000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000002740000000000000000000000000000000000000000000000000000000000000278000000000000000000000000000000000000000000000000000000000000027c000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002840000000000000000000000000000000000000000000000000000000000000288000000000000000000000000000000000000000000000000000000000000028c000000000000000000000000000000000000000000000000000000000000029000000000000000000000000000000000000000000000000000000000000002940000000000000000000000000000000000000000000000000000000000000298000000000000000000000000000000000000000000000000000000000000029c00000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002a400000000000000000000000000000000000000000000000000000000000002a800000000000000000000000000000000000000000000000000000000000002ac00000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002b400000000000000000000000000000000000000000000000000000000000002b800000000000000000000000000000000000000000000000000000000000002bc00000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000002c400000000000000000000000000000000000000000000000000000000000002c800000000000000000000000000000000000000000000000000000000000002cc00000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000002d400000000000000000000000000000000000000000000000000000000000002d800000000000000000000000000000000000000000000000000000000000002dc00000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000002e400000000000000000000000000000000000000000000000000000000000002e800000000000000000000000000000000000000000000000000000000000002ec00000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f400000000000000000000000000000000000000000000000000000000000002f800000000000000000000000000000000000000000000000000000000000002fc000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003040000000000000000000000000000000000000000000000000000000000000308000000000000000000000000000000000000000000000000000000000000030c000000000000000000000000000000000000000000000000000000000000031000000000000000000000000000000000000000000000000000000000000003140000000000000000000000000000000000000000000000000000000000000318000000000000000000000000000000000000000000000000000000000000031c000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000003240000000000000000000000000000000000000000000000000000000000000328000000000000000000000000000000000000000000000000000000000000032c000000000000000000000000000000000000000000000000000000000000033000000000000000000000000000000000000000000000000000000000000003340000000000000000000000000000000000000000000000000000000000000338000000000000000000000000000000000000000000000000000000000000033c000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000003440000000000000000000000000000000000000000000000000000000000000348000000000000000000000000000000000000000000000000000000000000034c000000000000000000000000000000000000000000000000000000000000035000000000000000000000000000000000000000000000000000000000000003540000000000000000000000000000000000000000000000000000000000000358000000000000000000000000000000000000000000000000000000000000035c000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003640000000000000000000000000000000000000000000000000000000000000368000000000000000000000000000000000000000000000000000000000000036c000000000000000000000000000000000000000000000000000000000000037000000000000000000000000000000000000000000000000000000000000003740000000000000000000000000000000000000000000000000000000000000378000000000000000000000000000000000000000000000000000000000000037c000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000003840000000000000000000000000000000000000000000000000000000000000388000000000000000000000000000000000000000000000000000000000000038c000000000000000000000000000000000000000000000000000000000000039000000000000000000000000000000000000000000000000000000000000003940000000000000000000000000000000000000000000000000000000000000398000000000000000000000000000000000000000000000000000000000000039c00000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003a400000000000000000000000000000000000000000000000000000000000003a800000000000000000000000000000000000000000000000000000000000003ac00000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000003b400000000000000000000000000000000000000000000000000000000000003b800000000000000000000000000000000000000000000000000000000000003bc00000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000003c400000000000000000000000000000000000000000000000000000000000003c800000000000000000000000000000000000000000000000000000000000003cc00000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000003d400000000000000000000000000000000000000000000000000000000000003d800000000000000000000000000000000000000000000000000000000000003dc00000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000003e400000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000003ec00000000000000000000000000000000000000000000000000000000000003f000000000000000000000000000000000000000000000000000000000000003f400000000000000000000000000000000000000000000000000000000000003f800000000000000000000000000000000000000000000000000000000000003fc000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004040000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000040c000000000000000000000000000000000000000000000000000000000000041000000000000000000000000000000000000000000000000000000000000004140000000000000000000000000000000000000000000000000000000000000418000000000000000000000000000000000000000000000000000000000000041c000000000000000000000000000000000000000000000000000000000000042000000000000000000000000000000000000000000000000000000000000004240000000000000000000000000000000000000000000000000000000000000428000000000000000000000000000000000000000000000000000000000000042c000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000004340000000000000000000000000000000000000000000000000000000000000438000000000000000000000000000000000000000000000000000000000000043c000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000004440000000000000000000000000000000000000000000000000000000000000448000000000000000000000000000000000000000000000000000000000000044c000000000000000000000000000000000000000000000000000000000000045000000000000000000000000000000000000000000000000000000000000004540000000000000000000000000000000000000000000000000000000000000458000000000000000000000000000000000000000000000000000000000000045c000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000004640000000000000000000000000000000000000000000000000000000000000468000000000000000000000000000000000000000000000000000000000000046c000000000000000000000000000000000000000000000000000000000000047000000000000000000000000000000000000000000000000000000000000004740000000000000000000000000000000000000000000000000000000000000478000000000000000000000000000000000000000000000000000000000000047c000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000004840000000000000000000000000000000000000000000000000000000000000488000000000000000000000000000000000000000000000000000000000000048c000000000000000000000000000000000000000000000000000000000000049000000000000000000000000000000000000000000000000000000000000004940000000000000000000000000000000000000000000000000000000000000498000000000000000000000000000000000000000000000000000000000000049c00000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000004a400000000000000000000000000000000000000000000000000000000000004a800000000000000000000000000000000000000000000000000000000000004ac00000000000000000000000000000000000000000000000000000000000004b000000000000000000000000000000000000000000000000000000000000004b400000000000000000000000000000000000000000000000000000000000004b800000000000000000000000000000000000000000000000000000000000004bc00000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000004c400000000000000000000000000000000000000000000000000000000000004c800000000000000000000000000000000000000000000000000000000000004cc00000000000000000000000000000000000000000000000000000000000004d000000000000000000000000000000000000000000000000000000000000004d400000000000000000000000000000000000000000000000000000000000004d800000000000000000000000000000000000000000000000000000000000004dc00000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000004e400000000000000000000000000000000000000000000000000000000000004e800000000000000000000000000000000000000000000000000000000000004ec00000000000000000000000000000000000000000000000000000000000004f000000000000000000000000000000000000000000000000000000000000004f400000000000000000000000000000000000000000000000000000000000004f800000000000000000000000000000000000000000000000000000000000004fc000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000005040000000000000000000000000000000000000000000000000000000000000508000000000000000000000000000000000000000000000000000000000000050c000000000000000000000000000000000000000000000000000000000000051000000000000000000000000000000000000000000000000000000000000005140000000000000000000000000000000000000000000000000000000000000518000000000000000000000000000000000000000000000000000000000000051c000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000005240000000000000000000000000000000000000000000000000000000000000528000000000000000000000000000000000000000000000000000000000000052c000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000005340000000000000000000000000000000000000000000000000000000000000538000000000000000000000000000000000000000000000000000000000000053c000000000000000000000000000000000000000000000000000000000000054000000000000000000000000000000000000000000000000000000000000005440000000000000000000000000000000000000000000000000000000000000548000000000000000000000000000000000000000000000000000000000000054c000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000005540000000000000000000000000000000000000000000000000000000000000558000000000000000000000000000000000000000000000000000000000000055c000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000005640000000000000000000000000000000000000000000000000000000000000568000000000000000000000000000000000000000000000000000000000000056c000000000000000000000000000000000000000000000000000000000000057000000000000000000000000000000000000000000000000000000000000005740000000000000000000000000000000000000000000000000000000000000578000000000000000000000000000000000000000000000000000000000000057c000000000000000000000000000000000000000000000000000000000000058000000000000000000000000000000000000000000000000000000000000005840000000000000000000000000000000000000000000000000000000000000588000000000000000000000000000000000000000000000000000000000000058c000000000000000000000000000000000000000000000000000000000000059000000000000000000000000000000000000000000000000000000000000005940000000000000000000000000000000000000000000000000000000000000598000000000000000000000000000000000000000000000000000000000000059c00000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000005a400000000000000000000000000000000000000000000000000000000000005a800000000000000000000000000000000000000000000000000000000000005ac00000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000000000000000000000000000000000005b400000000000000000000000000000000000000000000000000000000000005b800000000000000000000000000000000000000000000000000000000000005bc00000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000005c400000000000000000000000000000000000000000000000000000000000005c800000000000000000000000000000000000000000000000000000000000005cc00000000000000000000000000000000000000000000000000000000000005d000000000000000000000000000000000000000000000000000000000000005d400000000000000000000000000000000000000000000000000000000000005d800000000000000000000000000000000000000000000000000000000000005dc00000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000005e400000000000000000000000000000000000000000000000000000000000005e800000000000000000000000000000000000000000000000000000000000005ec00000000000000000000000000000000000000000000000000000000000005f000000000000000000000000000000000000000000000000000000000000005f400000000000000000000000000000000000000000000000000000000000005f800000000000000000000000000000000000000000000000000000000000005fc000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000006040000000000000000000000000000000000000000000000000000000000000608000000000000000000000000000000000000000000000000000000000000060c000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000006140000000000000000000000000000000000000000000000000000000000000618000000000000000000000000000000000000000000000000000000000000061c000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000006240000000000000000000000000000000000000000000000000000000000000628000000000000000000000000000000000000000000000000000000000000062c000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000006340000000000000000000000000000000000000000000000000000000000000638000000000000000000000000000000000000000000000000000000000000063c000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000006440000000000000000000000000000000000000000000000000000000000000648000000000000000000000000000000000000000000000000000000000000064c000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000006540000000000000000000000000000000000000000000000000000000000000658000000000000000000000000000000000000000000000000000000000000065c000000000000000000000000000000000000000000000000000000000000066000000000000000000000000000000000000000000000000000000000000006640000000000000000000000000000000000000000000000000000000000000668000000000000000000000000000000000000000000000000000000000000066c000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000006740000000000000000000000000000000000000000000000000000000000000678000000000000000000000000000000000000000000000000000000000000067c000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000006840000000000000000000000000000000000000000000000000000000000000688000000000000000000000000000000000000000000000000000000000000068c000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000006940000000000000000000000000000000000000000000000000000000000000698000000000000000000000000000000000000000000000000000000000000069c00000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000006a400000000000000000000000000000000000000000000000000000000000006a800000000000000000000000000000000000000000000000000000000000006ac00000000000000000000000000000000000000000000000000000000000006b000000000000000000000000000000000000000000000000000000000000006b400000000000000000000000000000000000000000000000000000000000006b800000000000000000000000000000000000000000000000000000000000006bc00000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000006c400000000000000000000000000000000000000000000000000000000000006c800000000000000000000000000000000000000000000000000000000000006cc00000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000006d400000000000000000000000000000000000000000000000000000000000006d800000000000000000000000000000000000000000000000000000000000006dc00000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000006e400000000000000000000000000000000000000000000000000000000000006e800000000000000000000000000000000000000000000000000000000000006ec00000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006f400000000000000000000000000000000000000000000000000000000000006f800000000000000000000000000000000000000000000000000000000000006fc000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000007040000000000000000000000000000000000000000000000000000000000000708000000000000000000000000000000000000000000000000000000000000070c000000000000000000000000000000000000000000000000000000000000071000000000000000000000000000000000000000000000000000000000000000007233030393330360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330306165643200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723323232323633000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233239323435610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333663366373400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723343563313866000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233436373163310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335333730393100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723353361346131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233535356534620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335663632326200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723363033383330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233633396266660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072336363264393100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723376364646464000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233836323638310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072338393330366400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723386639373461000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233930366334660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072339363234326500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723396336373963000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236230376135360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072364373663666200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723646363656233000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236537303034660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072365386431303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723656563333961000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236632303030300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366663637303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723666639353366000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236666396138650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330303030303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723303066666138000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233031363530310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330393030666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723306233613635000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233232323033340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333333439356400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333933393339000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233438333965360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072334383936613600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723356236656531000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233564326266350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335643738376100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723363237373861000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233635376236660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072336383030663900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723366261356534000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233666333139610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072337653565616100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723386635363362000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233939653535300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072363626462666300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723643138663765000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236435313531350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072364373762626100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723666266323336000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236666613430300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330303030666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723316232663061000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233330633333310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333333633623800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723343134313431000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233539326432360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335393536353200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723363330633030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233636333933310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072336393661366100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723373262653036000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233939396139390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072361303965396500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723623237333031000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236232636264620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072362333030303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723646637313236000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236534646366660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366393734363900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723663962663830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236666303030300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366663030666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723303036623034000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233030666630300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330313837306600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723316130393536000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233162316233620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072332343166623100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333032373633000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233336333235390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335323462323400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723356535646665000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233731356139660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072337373932373200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723383939396131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236165643466300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072362363636363600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723626330306530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236530636538310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366666666303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723303032366666000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233035303066350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072332353539613200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723356333373565000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233631346164300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072336623639353000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723383038303830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236239303030300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072364633335333500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723666163663135000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236666333730340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330303333303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723306130306666000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233165313436390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072332343132323700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723326134346131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233332336333390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333333333333300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333734363664000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233361306530650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333623366356400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723343934303732000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233538363034610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335643364666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723356438353836000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233565366535610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335663838613500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723363331363632000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233634386535370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072337313764623500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723376237643066000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233864633666660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072339626164623700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723616261336666000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236332613133330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072363356335633500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723643537656231000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236439613036360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072365623165616100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723656431633234000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236564383537320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366353030666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723666662376134000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236666653130330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366666666666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723313030303030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233130323430310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333313430396100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333932633030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233833653966660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072339356137636400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723323135383030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233335353830300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333373732373500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333832666331000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233434303134650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072334663536343100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723363435626634000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233638383637610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072362373962623500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723303036653639000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233030626266650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330323339613100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723303737383866000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233061353734620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330633034303500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723306431313135000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233064363630300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330653835373400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723313130623131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233131356233340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072331353164326300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723313630623062000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233139323966340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072331393333366500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723316131613161000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233162316231620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072331633738363200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723316562643433000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233166316631660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072331663432303700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723323233666133000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233233326261620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072332353962323400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723323632333466000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233236333532360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072332366461666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723323836633430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233239323833350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072332393961633500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723326133366231000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233330333533300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333303630383200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333131393535000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233331333061640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333336134616400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333430306666000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233334333932660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333346137653500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333664376535000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233363313531380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333643365396200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723336662646163000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233431353833620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072334323334316400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723343262643431000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233433363239360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072334366666663300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723343730313632000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233437346235380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072334383034323700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723343838343438000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233439666666660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072334623232323200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723346236393266000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233463616465390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072334663462333200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723353232643131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233534336530620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335363738396600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723353639616262000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233537363833320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335376364666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723356663646534000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233630336531340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072336306533306400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723363166616135000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233633643736310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072336363230333800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723363735643662000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233639383238330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072336616265333000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723366536643530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233733616564650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072337343731636200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723373634323861000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233738346337360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072337383937613300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723373937343939000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233739393263350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072337633330303700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723383032323061000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233835386562340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072338396430623700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723386239376336000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233862623361630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072338636332653000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723386438386234000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233864633638660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072338653236626100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723393338666264000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233936343163660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072339366365356500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723393862376433000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233939643965610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072339623763356600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723396562396434000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236162333032370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072361633332333200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723616665393363000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236231646238380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072362333131616600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723623866663132000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236239633964660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072362636265656600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723626431656263000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236331666637610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072364306132373000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723643364336433000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236435616361340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072364396666303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723653138643264000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236533313364330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072365386333386400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723653961386138000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236561656331360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072365663663303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723663166656336000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236637616266320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366393738363900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723663966346632000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236662663235300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366643631333600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723666437633030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236666303031300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366663038643600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723666637633030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236666623830390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366666536303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723303034626430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233030373664620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330383531613400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723313364366666000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233134636365350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333353766316600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723336134363661000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233432386436370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335663437363800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723366237343030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233735393237350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072361383839623300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723353936623735000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233766376637660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366636539636200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003e0000000000000000000000000000000000000000000000000000000000000000442697262000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006447275646973000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084865646765686f67000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000850656e6775696e730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007536179576861740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075468652047757900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000854696e7944696e6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005546f61647a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006556e697175650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000757617463686572000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004576f726d00000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101d85760003560e01c80636352211e1161010257806399a2557a11610095578063c87b56dd11610064578063c87b56dd14610565578063e985e9c514610585578063f19e75d4146105ce578063f2fde38b146105ee57600080fd5b806399a2557a146104e5578063a22cb46514610505578063b88d4fde14610525578063c23dc68f1461053857600080fd5b8063715018a6116100d1578063715018a6146104705780638462151c146104855780638da5cb5b146104b257806395d89b41146104d057600080fd5b80636352211e146103f0578063690944d61461041057806369a030341461043057806370a082311461045057600080fd5b80631f85e3ca1161017a578063440bc7f311610149578063440bc7f31461036257806347535d7b146103825780635bbb2177146103a35780635d67aedb146103d057600080fd5b80631f85e3ca146102fc57806323b872dd1461031c578063372f657c1461032f57806342842e0e1461034f57600080fd5b8063081812fc116101b6578063081812fc14610276578063095ea7b3146102ae5780631649a8a9146102c357806318160ddd146102e357600080fd5b806301ffc9a7146101dd578063047fc9aa1461021257806306fdde0314610254575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004612278565b61060e565b60405190151581526020015b60405180910390f35b34801561021e57600080fd5b506102467f00000000000000000000000000000000000000000000000000000000000001a481565b604051908152602001610209565b34801561026057600080fd5b50610269610660565b60405161020991906122e5565b34801561028257600080fd5b506102966102913660046122f8565b6106f2565b6040516001600160a01b039091168152602001610209565b6102c16102bc36600461232d565b610736565b005b3480156102cf57600080fd5b506101fd6102de3660046123a2565b6107d6565b3480156102ef57600080fd5b5060015460005403610246565b34801561030857600080fd5b506102c1610317366004612404565b610858565b6102c161032a36600461241f565b61087e565b34801561033b57600080fd5b506102c161034a36600461245b565b610a17565b6102c161035d36600461241f565b610a7e565b34801561036e57600080fd5b506102c161037d3660046122f8565b610a9e565b34801561038e57600080fd5b506008546101fd90600160a01b900460ff1681565b3480156103af57600080fd5b506103c36103be36600461245b565b610aab565b60405161020991906124d8565b3480156103dc57600080fd5b506102c16103eb36600461251a565b610b76565b3480156103fc57600080fd5b5061029661040b3660046122f8565b610de7565b34801561041c57600080fd5b5061026961042b3660046122f8565b610df2565b34801561043c57600080fd5b5061026961044b3660046122f8565b610e9e565b34801561045c57600080fd5b5061024661046b3660046125dd565b610eae565b34801561047c57600080fd5b506102c1610efc565b34801561049157600080fd5b506104a56104a03660046125dd565b610f10565b60405161020991906125f8565b3480156104be57600080fd5b506008546001600160a01b0316610296565b3480156104dc57600080fd5b50610269611018565b3480156104f157600080fd5b506104a5610500366004612630565b611027565b34801561051157600080fd5b506102c1610520366004612663565b61119e565b6102c16105333660046126ac565b61120a565b34801561054457600080fd5b506105586105533660046122f8565b611254565b6040516102099190612787565b34801561057157600080fd5b506102696105803660046122f8565b6112cc565b34801561059157600080fd5b506101fd6105a0366004612795565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156105da57600080fd5b506102c16105e93660046122f8565b611676565b3480156105fa57600080fd5b506102c16106093660046125dd565b61168a565b60006301ffc9a760e01b6001600160e01b03198316148061063f57506380ac58cd60e01b6001600160e01b03198316145b8061065a5750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606002805461066f906127bf565b80601f016020809104026020016040519081016040528092919081815260200182805461069b906127bf565b80156106e85780601f106106bd576101008083540402835291602001916106e8565b820191906000526020600020905b8154815290600101906020018083116106cb57829003601f168201915b5050505050905090565b60006106fd82611705565b61071a576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061074182610de7565b9050336001600160a01b0382161461077a5761075d81336105a0565b61077a576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061084e838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506009546040516bffffffffffffffffffffffff1960608b901b16602082015290925060340190506040516020818303038152906040528051906020012061172c565b90505b9392505050565b610860611742565b60088054911515600160a01b0260ff60a01b19909216919091179055565b60006108898261179c565b9050836001600160a01b0316816001600160a01b0316146108bc5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610909576108ec86336105a0565b61090957604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661093057604051633a954ecd60e21b815260040160405180910390fd5b801561093b57600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b841690036109cd576001840160008181526004602052604081205490036109cb5760005481146109cb5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b610a223383836107d6565b610a3f5760405163522fc3bd60e01b815260040160405180910390fd5b336000908152600a602052604090205460ff1615610a7057604051634a7ba1cb60e11b815260040160405180910390fd5b610a7a6001611803565b5050565b610a998383836040518060200160405280600081525061120a565b505050565b610aa6611742565b600955565b6060816000816001600160401b03811115610ac857610ac8612696565b604051908082528060200260200182016040528015610b1a57816020015b604080516080810182526000808252602080830182905292820181905260608201528252600019909201910181610ae65790505b50905060005b828114610b6d57610b48868683818110610b3c57610b3c6127f3565b90506020020135611254565b828281518110610b5a57610b5a6127f3565b6020908102919091010152600101610b20565b50949350505050565b610b7e611742565b868514610b9e57604051630cf0bdb360e21b815260040160405180910390fd5b868314610bbe57604051630cf0bdb360e21b815260040160405180910390fd5b868114610bde57604051630cf0bdb360e21b815260040160405180910390fd5b60408051608081018252606080825260006020830181905292820183905281018290525b898983818110610c1457610c146127f3565b9050602002810190610c269190612809565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250878783818110610c6f57610c6f6127f3565b9050602002016020810190610c84919061284f565b61ffff166020820152858583818110610c9f57610c9f6127f3565b9050602002016020810190610cb4919061284f565b61ffff166040820152610d1e848484818110610cd257610cd26127f3565b9050602002810190610ce49190612809565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061197d92505050565b6001600160a01b03166060820152600d8054600181018255600091909152815182916002027fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb501908190610d7290826128b9565b5060208201516001918201805460408501516060909501516001600160a01b031664010000000002640100000000600160c01b031961ffff968716620100000263ffffffff1990931696909416959095171791909116929092179091559190910190888210610c025750505050505050505050565b600061065a8261179c565b600b8181548110610e0257600080fd5b906000526020600020016000915090508054610e1d906127bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610e49906127bf565b8015610e965780601f10610e6b57610100808354040283529160200191610e96565b820191906000526020600020905b815481529060010190602001808311610e7957829003601f168201915b505050505081565b600c8181548110610e0257600080fd5b60006001600160a01b038216610ed7576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b610f04611742565b610f0e60006119e2565b565b60606000806000610f2085610eae565b90506000816001600160401b03811115610f3c57610f3c612696565b604051908082528060200260200182016040528015610f65578160200160208202803683370190505b509050610f9260408051608081018252600080825260208201819052918101829052606081019190915290565b60005b83861461100c57610fa581611a34565b915081604001516110045781516001600160a01b031615610fc557815194505b876001600160a01b0316856001600160a01b0316036110045780838780600101985081518110610ff757610ff76127f3565b6020026020010181815250505b600101610f95565b50909695505050505050565b60606003805461066f906127bf565b606081831061104957604051631960ccad60e11b815260040160405180910390fd5b60008061105560005490565b905080841115611063578093505b600061106e87610eae565b90508486101561108d5785850381811015611087578091505b50611091565b5060005b6000816001600160401b038111156110ab576110ab612696565b6040519080825280602002602001820160405280156110d4578160200160208202803683370190505b509050816000036110ea57935061085192505050565b60006110f588611254565b905060008160400151611106575080515b885b8881141580156111185750848714155b1561118d5761112681611a34565b925082604001516111855782516001600160a01b03161561114657825191505b8a6001600160a01b0316826001600160a01b0316036111855780848880600101995081518110611178576111786127f3565b6020026020010181815250505b600101611108565b505050928352509095945050505050565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61121584848461087e565b6001600160a01b0383163b1561124e5761123184848484611a70565b61124e576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60408051608080820183526000808352602080840182905283850182905260608085018390528551938401865282845290830182905293820181905292810183905290915060005483106112a85792915050565b6112b183611a34565b90508060400151156112c35792915050565b61085183611b5b565b60606112d782611705565b6112f457604051631d6fa32560e31b815260040160405180910390fd5b6000600d600e848154811061130b5761130b6127f3565b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff1681548110611343576113436127f3565b906000526020600020906002020160405180608001604052908160008201805461136c906127bf565b80601f0160208091040260200160405190810160405280929190818152602001828054611398906127bf565b80156113e55780601f106113ba576101008083540402835291602001916113e5565b820191906000526020600020905b8154815290600101906020018083116113c857829003601f168201915b50505091835250506001919091015461ffff808216602080850191909152620100008304821660408501526401000000009092046001600160a01b0316606090930192909252820151600c805493945060009390929190911690811061144d5761144d6127f3565b906000526020600020018054611462906127bf565b80601f016020809104026020016040519081016040528092919081815260200182805461148e906127bf565b80156114db5780601f106114b0576101008083540402835291602001916114db565b820191906000526020600020905b8154815290600101906020018083116114be57829003601f168201915b5050505050905060006114f2828460000151611b90565b6114fb84611c1b565b611528604051806040016040528060078152602001667661726965747960c81b8152508660000151611c77565b61154e604051806040016040528060048152602001637479706560e01b81525086611c77565b6116276040518060400160405280600a815260200169189858dad9dc9bdd5b9960b21b815250600b896040015161ffff168154811061158f5761158f6127f3565b9060005260206000200180546115a4906127bf565b80601f01602080910402602001604051908101604052809291908181526020018280546115d0906127bf565b801561161d5780601f106115f25761010080835404028352916020019161161d565b820191906000526020600020905b81548152906001019060200180831161160057829003601f168201915b5050505050611c77565b60405160200161163b959493929190612994565b60405160208183030381529060405290508060405160200161165d9190612ae1565b6040516020818303038152906040529350505050919050565b61167e611742565b61168781611803565b50565b611692611742565b6001600160a01b0381166116fc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b611687816119e2565b600080548210801561065a575050600090815260046020526040902054600160e01b161590565b6000826117398584611c8c565b14949350505050565b6008546001600160a01b03163314610f0e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016116f3565b6000816000548110156117ea5760008181526004602052604081205490600160e01b821690036117e8575b806000036108515750600019016000818152600460205260409020546117c7565b505b604051636f96cda160e11b815260040160405180910390fd5b600854600160a01b900460ff1661182d5760405163589ed34b60e01b815260040160405180910390fd5b6000547f00000000000000000000000000000000000000000000000000000000000001a4828201111561187357604051631a11574b60e01b815260040160405180910390fd5b600042336040516020016118a392919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b6040516020818303038152906040528051906020012060001c905060005b838160ff161015611935576118d582611cd9565b600e84815481106118e8576118e86127f3565b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff1602179055508261192190612b35565b92508061192d81612b4e565b9150506118c1565b506008546001600160a01b0316331461196357336000908152600a60205260409020805460ff191660011790555b610a99338460405180602001604052806000815250611e9e565b6000806119a8836040516020016119949190612b6d565b604051602081830303815290604052611f0b565b90508051602082016000f091506001600160a01b0382166119dc5760405163046a55db60e11b815260040160405180910390fd5b50919050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60408051608081018252600080825260208201819052918101829052606081019190915260008281526004602052604090205461065a90611f37565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611aa5903390899088908890600401612b93565b6020604051808303816000875af1925050508015611ae0575060408051601f3d908101601f19168201909252611add91810190612bd0565b60015b611b3e573d808015611b0e576040519150601f19603f3d011682016040523d82523d6000602084013e611b13565b606091505b508051600003611b36576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b60408051608081018252600080825260208201819052918101829052606081019190915261065a611b8b8361179c565b611f37565b60405165556e6971756560d01b60208201526060906026016040516020818303038152906040528051906020012083604051602001611bcf9190612bed565b6040516020818303038152906040528051906020012003611bf157508061065a565b8282604051602001611c04929190612c09565b604051602081830303815290604052905092915050565b606061065a600b836040015161ffff1681548110611c3b57611c3b6127f3565b90600052602060002001611c528460600151611f7e565b604051602001611c63929190612c45565b604051602081830303815290604052611f8e565b60608282604051602001611c04929190612ee4565b600081815b8451811015611cd157611cbd82868381518110611cb057611cb06127f3565b6020026020010151611f9c565b915080611cc981612b35565b915050611c91565b509392505050565b6000601054600003611cfe57604051631a11574b60e01b815260040160405180910390fd5b601080546000198101918290556000908481611d1c57611d1c612f56565b069050600f8181548110611d3257611d326127f3565b600091825260208220601082040154600f9091166002026101000a900461ffff169003611d5f5780611d97565b600f8181548110611d7257611d726127f3565b90600052602060002090601091828204019190066002029054906101000a900461ffff165b9250600f8281548110611dac57611dac6127f3565b60009182526020909120601082040154600f9091166002026101000a900461ffff1615611e0f57600f8281548110611de657611de66127f3565b90600052602060002090601091828204019190066002029054906101000a900461ffff16611e11565b815b600f8281548110611e2457611e246127f3565b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff1602179055506000600f8381548110611e6857611e686127f3565b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff1602179055505050919050565b611ea88383611fc8565b6001600160a01b0383163b15610a99576000548281035b611ed26000868380600101945086611a70565b611eef576040516368d2bf6b60e11b815260040160405180910390fd5b818110611ebf578160005414611f0457600080fd5b5050505050565b6060815182604051602001611f21929190612f6c565b6040516020818303038152906040529050919050565b604080516080810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b831615159181019190915260e89190911c606082015290565b606061065a8260016000196120c6565b606061065a8260008061217b565b6000818310611fb8576000828152602084905260409020610851565b5060009182526020526040902090565b6000805490829003611fed5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461209c57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101612064565b50816000036120bd57604051622e076360e81b815260040160405180910390fd5b60005550505050565b6060833b60008190036120e9575050604080516020810190915260008152610851565b80841115612107575050604080516020810190915260008152610851565b838310156121395760405163162544fd60e11b81526004810182905260248101859052604481018490526064016116f3565b838303848203600082821061214e5782612150565b815b60408051603f8301601f19168101909152818152955090508087602087018a3c505050509392505050565b606083518015611cd1576003600282010460021b60405192507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f526102308515027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f03603f52602083018181015b6003880197508751603f8160121c1651600053603f81600c1c1651600153603f8160061c1651600253603f8116516003535060005182526004820191508082106121eb57602001604052613d3d60f01b60038406600204808303919091526000861515909102918290035290038252509392505050565b6001600160e01b03198116811461168757600080fd5b60006020828403121561228a57600080fd5b813561085181612262565b60005b838110156122b0578181015183820152602001612298565b50506000910152565b600081518084526122d1816020860160208601612295565b601f01601f19169290920160200192915050565b60208152600061085160208301846122b9565b60006020828403121561230a57600080fd5b5035919050565b80356001600160a01b038116811461232857600080fd5b919050565b6000806040838503121561234057600080fd5b61234983612311565b946020939093013593505050565b60008083601f84011261236957600080fd5b5081356001600160401b0381111561238057600080fd5b6020830191508360208260051b850101111561239b57600080fd5b9250929050565b6000806000604084860312156123b757600080fd5b6123c084612311565b925060208401356001600160401b038111156123db57600080fd5b6123e786828701612357565b9497909650939450505050565b8035801515811461232857600080fd5b60006020828403121561241657600080fd5b610851826123f4565b60008060006060848603121561243457600080fd5b61243d84612311565b925061244b60208501612311565b9150604084013590509250925092565b6000806020838503121561246e57600080fd5b82356001600160401b0381111561248457600080fd5b61249085828601612357565b90969095509350505050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b6020808252825182820181905260009190848201906040850190845b8181101561100c5761250783855161249c565b92840192608092909201916001016124f4565b6000806000806000806000806080898b03121561253657600080fd5b88356001600160401b038082111561254d57600080fd5b6125598c838d01612357565b909a50985060208b013591508082111561257257600080fd5b61257e8c838d01612357565b909850965060408b013591508082111561259757600080fd5b6125a38c838d01612357565b909650945060608b01359150808211156125bc57600080fd5b506125c98b828c01612357565b999c989b5096995094979396929594505050565b6000602082840312156125ef57600080fd5b61085182612311565b6020808252825182820181905260009190848201906040850190845b8181101561100c57835183529284019291840191600101612614565b60008060006060848603121561264557600080fd5b61264e84612311565b95602085013595506040909401359392505050565b6000806040838503121561267657600080fd5b61267f83612311565b915061268d602084016123f4565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156126c257600080fd5b6126cb85612311565b93506126d960208601612311565b92506040850135915060608501356001600160401b03808211156126fc57600080fd5b818701915087601f83011261271057600080fd5b81358181111561272257612722612696565b604051601f8201601f19908116603f0116810190838211818310171561274a5761274a612696565b816040528281528a602084870101111561276357600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6080810161065a828461249c565b600080604083850312156127a857600080fd5b6127b183612311565b915061268d60208401612311565b600181811c908216806127d357607f821691505b6020821081036119dc57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261282057600080fd5b8301803591506001600160401b0382111561283a57600080fd5b60200191503681900382131561239b57600080fd5b60006020828403121561286157600080fd5b813561ffff8116811461085157600080fd5b601f821115610a9957600081815260208120601f850160051c8101602086101561289a5750805b601f850160051c820191505b81811015610a0f578281556001016128a6565b81516001600160401b038111156128d2576128d2612696565b6128e6816128e084546127bf565b84612873565b602080601f83116001811461291b57600084156129035750858301515b600019600386901b1c1916600185901b178555610a0f565b600085815260208120601f198616915b8281101561294a5788860151825594840194600190910190840161292b565b50858210156129685787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000815161298a818560208601612295565b9290920192915050565b693d913730b6b2911d101160b11b815285516000906129ba81600a850160208b01612295565b71111610113232b9b1b934b83a34b7b7111d1160711b600a918401918201527f3133333720637269747465727320617265207075726520312f312068616e6463601c8201527f72616674656420616e696d616c73206c6976696e67206f6e636861696e000000603c8201527f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b62616059820152641cd94d8d0b60da1b60798201528651612a6c81607e840160208b01612295565b61088b60f21b9101607e8101919091526e2261747472696275746573223a205b60881b6080820152612ad5612ac7612ac1612aae612abb81608f87018c612978565b600b60fa1b815260010190565b89612978565b86612978565b615d7d60f01b815260020190565b98975050505050505050565b7519185d184e985c1c1b1a58d85d1a5bdb8bda9cdbdb8b60521b815260008251612b12816016850160208701612295565b9190910160160192915050565b634e487b7160e01b600052601160045260246000fd5b600060018201612b4757612b47612b1f565b5060010190565b600060ff821660ff8103612b6457612b64612b1f565b60010192915050565b6000815260008251612b86816001850160208701612295565b9190910160010192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612bc6908301846122b9565b9695505050505050565b600060208284031215612be257600080fd5b815161085181612262565b60008251612bff818460208701612295565b9190910192915050565b60008351612c1b818460208801612295565b600160fd1b9083019081528351612c39816001840160208801612295565b01600101949350505050565b7f3c7376672069643d2263726974746572222077696474683d22313030252220688152600060207f65696768743d2231303025222076696577426f783d2230203020323030303020818401527f32303030302220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f6040840152691918181817b9bb33911f60b11b60608401527f3c7374796c653e23637269747465727b6261636b67726f756e642d636f6c6f72606a840152601d60f91b608a840152608b60008654612d09816127bf565b60018281168015612d215760018114612d3a57612d6a565b60ff198416898701528215158302890186019450612d6a565b8a6000528660002060005b84811015612d605781548b8201890152908301908801612d45565b505085838a010194505b50507f3b6261636b67726f756e642d696d6167653a75726c28646174613a696d616765835250506b0bdc1b99ced8985cd94d8d0b60a21b6020820152612ed9612db6602c830188612978565b7f293b6261636b67726f756e642d7265706561743a6e6f2d7265706561743b626181527f636b67726f756e642d73697a653a636f6e7461696e3b6261636b67726f756e6460208201527f2d706f736974696f6e3a63656e7465723b696d6167652d72656e646572696e6760408201527f3a2d7765626b69742d6f7074696d697a652d636f6e74726173743b2d6d732d6960608201527f6e746572706f6c6174696f6e2d6d6f64653a6e6561726573742d6e656967686260808201527f6f723b696d6167652d72656e646572696e673a2d6d6f7a2d63726973702d656460a08201527f6765733b696d6167652d72656e646572696e673a706978656c617465643b7d3c60c08201526c17b9ba3cb6329f1e17b9bb339f60991b60e082015260ed0190565b979650505050505050565b6e3d913a3930b4ba2fba3cb832911d1160891b81528251600090612f0f81600f850160208801612295565b6b1116113b30b63ab2911d101160a11b600f918401918201528351612f3b81601b840160208801612295565b61227d60f01b601b9290910191820152601d01949350505050565b634e487b7160e01b600052601260045260246000fd5b606360f81b815260e083901b6001600160e01b03191660018201526880600e6000396000f360b81b60058201528151600090612faf81600e850160208701612295565b91909101600e01939250505056fea2646970667358221220346e1c9ab24d93e4308de2858d95f74d29eff28fbc9501fbe821ed0047d1114364736f6c63430008120033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001a400000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000007280000000000000000000000000000000000000000000000000000000000000000d3133333720437269747465727300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b3133333743524954544552000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012e00000000000000000000000000000000000000000000000000000000000025c000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002640000000000000000000000000000000000000000000000000000000000000268000000000000000000000000000000000000000000000000000000000000026c000000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000002740000000000000000000000000000000000000000000000000000000000000278000000000000000000000000000000000000000000000000000000000000027c000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002840000000000000000000000000000000000000000000000000000000000000288000000000000000000000000000000000000000000000000000000000000028c000000000000000000000000000000000000000000000000000000000000029000000000000000000000000000000000000000000000000000000000000002940000000000000000000000000000000000000000000000000000000000000298000000000000000000000000000000000000000000000000000000000000029c00000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002a400000000000000000000000000000000000000000000000000000000000002a800000000000000000000000000000000000000000000000000000000000002ac00000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002b400000000000000000000000000000000000000000000000000000000000002b800000000000000000000000000000000000000000000000000000000000002bc00000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000002c400000000000000000000000000000000000000000000000000000000000002c800000000000000000000000000000000000000000000000000000000000002cc00000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000002d400000000000000000000000000000000000000000000000000000000000002d800000000000000000000000000000000000000000000000000000000000002dc00000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000002e400000000000000000000000000000000000000000000000000000000000002e800000000000000000000000000000000000000000000000000000000000002ec00000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f400000000000000000000000000000000000000000000000000000000000002f800000000000000000000000000000000000000000000000000000000000002fc000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003040000000000000000000000000000000000000000000000000000000000000308000000000000000000000000000000000000000000000000000000000000030c000000000000000000000000000000000000000000000000000000000000031000000000000000000000000000000000000000000000000000000000000003140000000000000000000000000000000000000000000000000000000000000318000000000000000000000000000000000000000000000000000000000000031c000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000003240000000000000000000000000000000000000000000000000000000000000328000000000000000000000000000000000000000000000000000000000000032c000000000000000000000000000000000000000000000000000000000000033000000000000000000000000000000000000000000000000000000000000003340000000000000000000000000000000000000000000000000000000000000338000000000000000000000000000000000000000000000000000000000000033c000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000003440000000000000000000000000000000000000000000000000000000000000348000000000000000000000000000000000000000000000000000000000000034c000000000000000000000000000000000000000000000000000000000000035000000000000000000000000000000000000000000000000000000000000003540000000000000000000000000000000000000000000000000000000000000358000000000000000000000000000000000000000000000000000000000000035c000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003640000000000000000000000000000000000000000000000000000000000000368000000000000000000000000000000000000000000000000000000000000036c000000000000000000000000000000000000000000000000000000000000037000000000000000000000000000000000000000000000000000000000000003740000000000000000000000000000000000000000000000000000000000000378000000000000000000000000000000000000000000000000000000000000037c000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000003840000000000000000000000000000000000000000000000000000000000000388000000000000000000000000000000000000000000000000000000000000038c000000000000000000000000000000000000000000000000000000000000039000000000000000000000000000000000000000000000000000000000000003940000000000000000000000000000000000000000000000000000000000000398000000000000000000000000000000000000000000000000000000000000039c00000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003a400000000000000000000000000000000000000000000000000000000000003a800000000000000000000000000000000000000000000000000000000000003ac00000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000003b400000000000000000000000000000000000000000000000000000000000003b800000000000000000000000000000000000000000000000000000000000003bc00000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000003c400000000000000000000000000000000000000000000000000000000000003c800000000000000000000000000000000000000000000000000000000000003cc00000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000003d400000000000000000000000000000000000000000000000000000000000003d800000000000000000000000000000000000000000000000000000000000003dc00000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000003e400000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000003ec00000000000000000000000000000000000000000000000000000000000003f000000000000000000000000000000000000000000000000000000000000003f400000000000000000000000000000000000000000000000000000000000003f800000000000000000000000000000000000000000000000000000000000003fc000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004040000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000040c000000000000000000000000000000000000000000000000000000000000041000000000000000000000000000000000000000000000000000000000000004140000000000000000000000000000000000000000000000000000000000000418000000000000000000000000000000000000000000000000000000000000041c000000000000000000000000000000000000000000000000000000000000042000000000000000000000000000000000000000000000000000000000000004240000000000000000000000000000000000000000000000000000000000000428000000000000000000000000000000000000000000000000000000000000042c000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000004340000000000000000000000000000000000000000000000000000000000000438000000000000000000000000000000000000000000000000000000000000043c000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000004440000000000000000000000000000000000000000000000000000000000000448000000000000000000000000000000000000000000000000000000000000044c000000000000000000000000000000000000000000000000000000000000045000000000000000000000000000000000000000000000000000000000000004540000000000000000000000000000000000000000000000000000000000000458000000000000000000000000000000000000000000000000000000000000045c000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000004640000000000000000000000000000000000000000000000000000000000000468000000000000000000000000000000000000000000000000000000000000046c000000000000000000000000000000000000000000000000000000000000047000000000000000000000000000000000000000000000000000000000000004740000000000000000000000000000000000000000000000000000000000000478000000000000000000000000000000000000000000000000000000000000047c000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000004840000000000000000000000000000000000000000000000000000000000000488000000000000000000000000000000000000000000000000000000000000048c000000000000000000000000000000000000000000000000000000000000049000000000000000000000000000000000000000000000000000000000000004940000000000000000000000000000000000000000000000000000000000000498000000000000000000000000000000000000000000000000000000000000049c00000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000004a400000000000000000000000000000000000000000000000000000000000004a800000000000000000000000000000000000000000000000000000000000004ac00000000000000000000000000000000000000000000000000000000000004b000000000000000000000000000000000000000000000000000000000000004b400000000000000000000000000000000000000000000000000000000000004b800000000000000000000000000000000000000000000000000000000000004bc00000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000004c400000000000000000000000000000000000000000000000000000000000004c800000000000000000000000000000000000000000000000000000000000004cc00000000000000000000000000000000000000000000000000000000000004d000000000000000000000000000000000000000000000000000000000000004d400000000000000000000000000000000000000000000000000000000000004d800000000000000000000000000000000000000000000000000000000000004dc00000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000004e400000000000000000000000000000000000000000000000000000000000004e800000000000000000000000000000000000000000000000000000000000004ec00000000000000000000000000000000000000000000000000000000000004f000000000000000000000000000000000000000000000000000000000000004f400000000000000000000000000000000000000000000000000000000000004f800000000000000000000000000000000000000000000000000000000000004fc000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000005040000000000000000000000000000000000000000000000000000000000000508000000000000000000000000000000000000000000000000000000000000050c000000000000000000000000000000000000000000000000000000000000051000000000000000000000000000000000000000000000000000000000000005140000000000000000000000000000000000000000000000000000000000000518000000000000000000000000000000000000000000000000000000000000051c000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000005240000000000000000000000000000000000000000000000000000000000000528000000000000000000000000000000000000000000000000000000000000052c000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000005340000000000000000000000000000000000000000000000000000000000000538000000000000000000000000000000000000000000000000000000000000053c000000000000000000000000000000000000000000000000000000000000054000000000000000000000000000000000000000000000000000000000000005440000000000000000000000000000000000000000000000000000000000000548000000000000000000000000000000000000000000000000000000000000054c000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000005540000000000000000000000000000000000000000000000000000000000000558000000000000000000000000000000000000000000000000000000000000055c000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000005640000000000000000000000000000000000000000000000000000000000000568000000000000000000000000000000000000000000000000000000000000056c000000000000000000000000000000000000000000000000000000000000057000000000000000000000000000000000000000000000000000000000000005740000000000000000000000000000000000000000000000000000000000000578000000000000000000000000000000000000000000000000000000000000057c000000000000000000000000000000000000000000000000000000000000058000000000000000000000000000000000000000000000000000000000000005840000000000000000000000000000000000000000000000000000000000000588000000000000000000000000000000000000000000000000000000000000058c000000000000000000000000000000000000000000000000000000000000059000000000000000000000000000000000000000000000000000000000000005940000000000000000000000000000000000000000000000000000000000000598000000000000000000000000000000000000000000000000000000000000059c00000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000005a400000000000000000000000000000000000000000000000000000000000005a800000000000000000000000000000000000000000000000000000000000005ac00000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000000000000000000000000000000000005b400000000000000000000000000000000000000000000000000000000000005b800000000000000000000000000000000000000000000000000000000000005bc00000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000005c400000000000000000000000000000000000000000000000000000000000005c800000000000000000000000000000000000000000000000000000000000005cc00000000000000000000000000000000000000000000000000000000000005d000000000000000000000000000000000000000000000000000000000000005d400000000000000000000000000000000000000000000000000000000000005d800000000000000000000000000000000000000000000000000000000000005dc00000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000005e400000000000000000000000000000000000000000000000000000000000005e800000000000000000000000000000000000000000000000000000000000005ec00000000000000000000000000000000000000000000000000000000000005f000000000000000000000000000000000000000000000000000000000000005f400000000000000000000000000000000000000000000000000000000000005f800000000000000000000000000000000000000000000000000000000000005fc000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000006040000000000000000000000000000000000000000000000000000000000000608000000000000000000000000000000000000000000000000000000000000060c000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000006140000000000000000000000000000000000000000000000000000000000000618000000000000000000000000000000000000000000000000000000000000061c000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000006240000000000000000000000000000000000000000000000000000000000000628000000000000000000000000000000000000000000000000000000000000062c000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000006340000000000000000000000000000000000000000000000000000000000000638000000000000000000000000000000000000000000000000000000000000063c000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000006440000000000000000000000000000000000000000000000000000000000000648000000000000000000000000000000000000000000000000000000000000064c000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000006540000000000000000000000000000000000000000000000000000000000000658000000000000000000000000000000000000000000000000000000000000065c000000000000000000000000000000000000000000000000000000000000066000000000000000000000000000000000000000000000000000000000000006640000000000000000000000000000000000000000000000000000000000000668000000000000000000000000000000000000000000000000000000000000066c000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000006740000000000000000000000000000000000000000000000000000000000000678000000000000000000000000000000000000000000000000000000000000067c000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000006840000000000000000000000000000000000000000000000000000000000000688000000000000000000000000000000000000000000000000000000000000068c000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000006940000000000000000000000000000000000000000000000000000000000000698000000000000000000000000000000000000000000000000000000000000069c00000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000006a400000000000000000000000000000000000000000000000000000000000006a800000000000000000000000000000000000000000000000000000000000006ac00000000000000000000000000000000000000000000000000000000000006b000000000000000000000000000000000000000000000000000000000000006b400000000000000000000000000000000000000000000000000000000000006b800000000000000000000000000000000000000000000000000000000000006bc00000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000006c400000000000000000000000000000000000000000000000000000000000006c800000000000000000000000000000000000000000000000000000000000006cc00000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000006d400000000000000000000000000000000000000000000000000000000000006d800000000000000000000000000000000000000000000000000000000000006dc00000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000006e400000000000000000000000000000000000000000000000000000000000006e800000000000000000000000000000000000000000000000000000000000006ec00000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006f400000000000000000000000000000000000000000000000000000000000006f800000000000000000000000000000000000000000000000000000000000006fc000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000007040000000000000000000000000000000000000000000000000000000000000708000000000000000000000000000000000000000000000000000000000000070c000000000000000000000000000000000000000000000000000000000000071000000000000000000000000000000000000000000000000000000000000000007233030393330360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330306165643200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723323232323633000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233239323435610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333663366373400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723343563313866000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233436373163310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335333730393100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723353361346131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233535356534620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335663632326200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723363033383330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233633396266660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072336363264393100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723376364646464000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233836323638310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072338393330366400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723386639373461000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233930366334660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072339363234326500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723396336373963000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236230376135360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072364373663666200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723646363656233000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236537303034660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072365386431303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723656563333961000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236632303030300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366663637303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723666639353366000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236666396138650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330303030303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723303066666138000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233031363530310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330393030666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723306233613635000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233232323033340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333333439356400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333933393339000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233438333965360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072334383936613600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723356236656531000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233564326266350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335643738376100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723363237373861000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233635376236660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072336383030663900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723366261356534000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233666333139610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072337653565616100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723386635363362000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233939653535300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072363626462666300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723643138663765000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236435313531350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072364373762626100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723666266323336000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236666613430300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330303030666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723316232663061000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233330633333310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333333633623800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723343134313431000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233539326432360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335393536353200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723363330633030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233636333933310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072336393661366100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723373262653036000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233939396139390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072361303965396500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723623237333031000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236232636264620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072362333030303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723646637313236000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236534646366660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366393734363900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723663962663830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236666303030300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366663030666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723303036623034000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233030666630300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330313837306600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723316130393536000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233162316233620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072332343166623100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333032373633000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233336333235390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335323462323400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723356535646665000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233731356139660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072337373932373200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723383939396131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236165643466300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072362363636363600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723626330306530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236530636538310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366666666303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723303032366666000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233035303066350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072332353539613200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723356333373565000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233631346164300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072336623639353000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723383038303830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236239303030300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072364633335333500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723666163663135000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236666333730340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330303333303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723306130306666000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233165313436390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072332343132323700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723326134346131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233332336333390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333333333333300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333734363664000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233361306530650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333623366356400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723343934303732000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233538363034610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335643364666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723356438353836000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233565366535610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335663838613500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723363331363632000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233634386535370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072337313764623500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723376237643066000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233864633666660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072339626164623700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723616261336666000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236332613133330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072363356335633500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723643537656231000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236439613036360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072365623165616100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723656431633234000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236564383537320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366353030666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723666662376134000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236666653130330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366666666666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723313030303030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233130323430310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333313430396100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333932633030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233833653966660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072339356137636400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723323135383030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233335353830300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333373732373500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333832666331000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233434303134650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072334663536343100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723363435626634000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233638383637610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072362373962623500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723303036653639000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233030626266650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330323339613100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723303737383866000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233061353734620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330633034303500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723306431313135000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233064363630300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330653835373400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723313130623131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233131356233340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072331353164326300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723313630623062000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233139323966340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072331393333366500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723316131613161000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233162316231620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072331633738363200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723316562643433000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233166316631660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072331663432303700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723323233666133000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233233326261620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072332353962323400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723323632333466000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233236333532360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072332366461666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723323836633430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233239323833350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072332393961633500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723326133366231000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233330333533300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333303630383200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333131393535000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233331333061640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333336134616400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333430306666000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233334333932660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333346137653500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723333664376535000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233363313531380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333643365396200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723336662646163000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233431353833620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072334323334316400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723343262643431000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233433363239360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072334366666663300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723343730313632000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233437346235380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072334383034323700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723343838343438000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233439666666660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072334623232323200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723346236393266000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233463616465390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072334663462333200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723353232643131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233534336530620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335363738396600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723353639616262000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233537363833320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335376364666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723356663646534000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233630336531340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072336306533306400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723363166616135000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233633643736310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072336363230333800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723363735643662000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233639383238330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072336616265333000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723366536643530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233733616564650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072337343731636200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723373634323861000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233738346337360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072337383937613300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723373937343939000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233739393263350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072337633330303700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723383032323061000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233835386562340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072338396430623700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723386239376336000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233862623361630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072338636332653000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723386438386234000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233864633638660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072338653236626100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723393338666264000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233936343163660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072339366365356500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723393862376433000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233939643965610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072339623763356600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723396562396434000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236162333032370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072361633332333200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723616665393363000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236231646238380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072362333131616600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723623866663132000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236239633964660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072362636265656600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723626431656263000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236331666637610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072364306132373000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723643364336433000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236435616361340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072364396666303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723653138643264000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236533313364330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072365386333386400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723653961386138000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236561656331360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072365663663303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723663166656336000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236637616266320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366393738363900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723663966346632000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236662663235300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366643631333600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723666437633030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236666303031300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366663038643600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723666637633030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007236666623830390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366666536303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723303034626430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233030373664620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072330383531613400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723313364366666000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233134636365350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072333353766316600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723336134363661000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233432386436370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072335663437363800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723366237343030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233735393237350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072361383839623300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000723353936623735000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007233766376637660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000072366636539636200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003e0000000000000000000000000000000000000000000000000000000000000000442697262000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006447275646973000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084865646765686f67000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000850656e6775696e730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007536179576861740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075468652047757900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000854696e7944696e6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005546f61647a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006556e697175650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000757617463686572000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004576f726d00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): 1337 Critters
Arg [1] : symbol (string): 1337CRITTER
Arg [2] : _supply (uint256): 420
Arg [3] : _backgroundsOptions (string[]): #009306,#00aed2,#222263,#29245a,#3f3f74,#45c18f,#4671c1,#537091,#53a4a1,#555e4b,#5f622b,#603830,#639bff,#662d91,#7cdddd,#862681,#89306d,#8f974a,#906c4f,#96242e,#9c679c,#b07a56,#d76cfb,#dcceb3,#e7004f,#e8d100,#eec39a,#f20000,#ff6700,#ff953f,#ff9a8e,#000000,#00ffa8,#016501,#0900ff,#0b3a65,#222034,#33495d,#393939,#4839e6,#4896a6,#5b6ee1,#5d2bf5,#5d787a,#62778a,#657b6f,#6800f9,#6ba5e4,#6f319a,#7e5eaa,#8f563b,#99e550,#cbdbfc,#d18f7e,#d51515,#d77bba,#fbf236,#ffa400,#0000ff,#1b2f0a,#30c331,#3363b8,#414141,#592d26,#595652,#630c00,#663931,#696a6a,#72be06,#999a99,#a09e9e,#b27301,#b2cbdb,#b30000,#df7126,#e4dcff,#f97469,#f9bf80,#ff0000,#ff00ff,#006b04,#00ff00,#01870f,#1a0956,#1b1b3b,#241fb1,#302763,#363259,#524b24,#5e5dfe,#715a9f,#779272,#8999a1,#aed4f0,#b66666,#bc00e0,#e0ce81,#ffff00,#0026ff,#0500f5,#2559a2,#5c375e,#614ad0,#6b6950,#808080,#b90000,#dc3535,#facf15,#ff3704,#003300,#0a00ff,#1e1469,#241227,#2a44a1,#323c39,#333333,#37466d,#3a0e0e,#3b3f5d,#494072,#58604a,#5d3dff,#5d8586,#5e6e5a,#5f88a5,#631662,#648e57,#717db5,#7b7d0f,#8dc6ff,#9badb7,#aba3ff,#c2a133,#c5c5c5,#d57eb1,#d9a066,#eb1eaa,#ed1c24,#ed8572,#f500ff,#ffb7a4,#ffe103,#ffffff,#100000,#102401,#31409a,#392c00,#83e9ff,#95a7cd,#215800,#355800,#377275,#382fc1,#44014e,#4f5641,#645bf4,#68867a,#b79bb5,#006e69,#00bbfe,#0239a1,#07788f,#0a574b,#0c0405,#0d1115,#0d6600,#0e8574,#110b11,#115b34,#151d2c,#160b0b,#1929f4,#19336e,#1a1a1a,#1b1b1b,#1c7862,#1ebd43,#1f1f1f,#1f4207,#223fa3,#232bab,#259b24,#26234f,#263526,#26daff,#286c40,#292835,#299ac5,#2a36b1,#303530,#306082,#311955,#3130ad,#33a4ad,#3400ff,#34392f,#34a7e5,#36d7e5,#3c1518,#3d3e9b,#3fbdac,#41583b,#42341d,#42bd41,#436296,#46fff3,#470162,#474b58,#480427,#488448,#49ffff,#4b2222,#4b692f,#4cade9,#4f4b32,#522d11,#543e0b,#56789f,#569abb,#576832,#57cdff,#5fcde4,#603e14,#60e30d,#61faa5,#63d761,#662038,#675d6b,#698283,#6abe30,#6e6d50,#73aede,#7471cb,#76428a,#784c76,#7897a3,#797499,#7992c5,#7c3007,#80220a,#858eb4,#89d0b7,#8b97c6,#8bb3ac,#8cc2e0,#8d88b4,#8dc68f,#8e26ba,#938fbd,#9641cf,#96ce5e,#98b7d3,#99d9ea,#9b7c5f,#9eb9d4,#ab3027,#ac3232,#afe93c,#b1db88,#b311af,#b8ff12,#b9c9df,#bcbeef,#bd1ebc,#c1ff7a,#d0a270,#d3d3d3,#d5aca4,#d9ff00,#e18d2d,#e313d3,#e8c38d,#e9a8a8,#eaec16,#ef6c00,#f1fec6,#f7abf2,#f97869,#f9f4f2,#fbf250,#fd6136,#fd7c00,#ff0010,#ff08d6,#ff7c00,#ffb809,#ffe600,#004bd0,#0076db,#0851a4,#13d6ff,#14cce5,#357f1f,#3a466a,#428d67,#5f4768,#6b7400,#759275,#a889b3,#596b75,#7f7f7f,#fce9cb
Arg [4] : _typesOptions (string[]): Birb,Drudis,Hedgehog,Penguins,SayWhat,The Guy,TinyDino,Toadz,Unique,Watcher,Worm

-----Encoded View---------------
950 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001a4
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [4] : 0000000000000000000000000000000000000000000000000000000000007280
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [6] : 3133333720437269747465727300000000000000000000000000000000000000
Arg [7] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [8] : 3133333743524954544552000000000000000000000000000000000000000000
Arg [9] : 000000000000000000000000000000000000000000000000000000000000012e
Arg [10] : 00000000000000000000000000000000000000000000000000000000000025c0
Arg [11] : 0000000000000000000000000000000000000000000000000000000000002600
Arg [12] : 0000000000000000000000000000000000000000000000000000000000002640
Arg [13] : 0000000000000000000000000000000000000000000000000000000000002680
Arg [14] : 00000000000000000000000000000000000000000000000000000000000026c0
Arg [15] : 0000000000000000000000000000000000000000000000000000000000002700
Arg [16] : 0000000000000000000000000000000000000000000000000000000000002740
Arg [17] : 0000000000000000000000000000000000000000000000000000000000002780
Arg [18] : 00000000000000000000000000000000000000000000000000000000000027c0
Arg [19] : 0000000000000000000000000000000000000000000000000000000000002800
Arg [20] : 0000000000000000000000000000000000000000000000000000000000002840
Arg [21] : 0000000000000000000000000000000000000000000000000000000000002880
Arg [22] : 00000000000000000000000000000000000000000000000000000000000028c0
Arg [23] : 0000000000000000000000000000000000000000000000000000000000002900
Arg [24] : 0000000000000000000000000000000000000000000000000000000000002940
Arg [25] : 0000000000000000000000000000000000000000000000000000000000002980
Arg [26] : 00000000000000000000000000000000000000000000000000000000000029c0
Arg [27] : 0000000000000000000000000000000000000000000000000000000000002a00
Arg [28] : 0000000000000000000000000000000000000000000000000000000000002a40
Arg [29] : 0000000000000000000000000000000000000000000000000000000000002a80
Arg [30] : 0000000000000000000000000000000000000000000000000000000000002ac0
Arg [31] : 0000000000000000000000000000000000000000000000000000000000002b00
Arg [32] : 0000000000000000000000000000000000000000000000000000000000002b40
Arg [33] : 0000000000000000000000000000000000000000000000000000000000002b80
Arg [34] : 0000000000000000000000000000000000000000000000000000000000002bc0
Arg [35] : 0000000000000000000000000000000000000000000000000000000000002c00
Arg [36] : 0000000000000000000000000000000000000000000000000000000000002c40
Arg [37] : 0000000000000000000000000000000000000000000000000000000000002c80
Arg [38] : 0000000000000000000000000000000000000000000000000000000000002cc0
Arg [39] : 0000000000000000000000000000000000000000000000000000000000002d00
Arg [40] : 0000000000000000000000000000000000000000000000000000000000002d40
Arg [41] : 0000000000000000000000000000000000000000000000000000000000002d80
Arg [42] : 0000000000000000000000000000000000000000000000000000000000002dc0
Arg [43] : 0000000000000000000000000000000000000000000000000000000000002e00
Arg [44] : 0000000000000000000000000000000000000000000000000000000000002e40
Arg [45] : 0000000000000000000000000000000000000000000000000000000000002e80
Arg [46] : 0000000000000000000000000000000000000000000000000000000000002ec0
Arg [47] : 0000000000000000000000000000000000000000000000000000000000002f00
Arg [48] : 0000000000000000000000000000000000000000000000000000000000002f40
Arg [49] : 0000000000000000000000000000000000000000000000000000000000002f80
Arg [50] : 0000000000000000000000000000000000000000000000000000000000002fc0
Arg [51] : 0000000000000000000000000000000000000000000000000000000000003000
Arg [52] : 0000000000000000000000000000000000000000000000000000000000003040
Arg [53] : 0000000000000000000000000000000000000000000000000000000000003080
Arg [54] : 00000000000000000000000000000000000000000000000000000000000030c0
Arg [55] : 0000000000000000000000000000000000000000000000000000000000003100
Arg [56] : 0000000000000000000000000000000000000000000000000000000000003140
Arg [57] : 0000000000000000000000000000000000000000000000000000000000003180
Arg [58] : 00000000000000000000000000000000000000000000000000000000000031c0
Arg [59] : 0000000000000000000000000000000000000000000000000000000000003200
Arg [60] : 0000000000000000000000000000000000000000000000000000000000003240
Arg [61] : 0000000000000000000000000000000000000000000000000000000000003280
Arg [62] : 00000000000000000000000000000000000000000000000000000000000032c0
Arg [63] : 0000000000000000000000000000000000000000000000000000000000003300
Arg [64] : 0000000000000000000000000000000000000000000000000000000000003340
Arg [65] : 0000000000000000000000000000000000000000000000000000000000003380
Arg [66] : 00000000000000000000000000000000000000000000000000000000000033c0
Arg [67] : 0000000000000000000000000000000000000000000000000000000000003400
Arg [68] : 0000000000000000000000000000000000000000000000000000000000003440
Arg [69] : 0000000000000000000000000000000000000000000000000000000000003480
Arg [70] : 00000000000000000000000000000000000000000000000000000000000034c0
Arg [71] : 0000000000000000000000000000000000000000000000000000000000003500
Arg [72] : 0000000000000000000000000000000000000000000000000000000000003540
Arg [73] : 0000000000000000000000000000000000000000000000000000000000003580
Arg [74] : 00000000000000000000000000000000000000000000000000000000000035c0
Arg [75] : 0000000000000000000000000000000000000000000000000000000000003600
Arg [76] : 0000000000000000000000000000000000000000000000000000000000003640
Arg [77] : 0000000000000000000000000000000000000000000000000000000000003680
Arg [78] : 00000000000000000000000000000000000000000000000000000000000036c0
Arg [79] : 0000000000000000000000000000000000000000000000000000000000003700
Arg [80] : 0000000000000000000000000000000000000000000000000000000000003740
Arg [81] : 0000000000000000000000000000000000000000000000000000000000003780
Arg [82] : 00000000000000000000000000000000000000000000000000000000000037c0
Arg [83] : 0000000000000000000000000000000000000000000000000000000000003800
Arg [84] : 0000000000000000000000000000000000000000000000000000000000003840
Arg [85] : 0000000000000000000000000000000000000000000000000000000000003880
Arg [86] : 00000000000000000000000000000000000000000000000000000000000038c0
Arg [87] : 0000000000000000000000000000000000000000000000000000000000003900
Arg [88] : 0000000000000000000000000000000000000000000000000000000000003940
Arg [89] : 0000000000000000000000000000000000000000000000000000000000003980
Arg [90] : 00000000000000000000000000000000000000000000000000000000000039c0
Arg [91] : 0000000000000000000000000000000000000000000000000000000000003a00
Arg [92] : 0000000000000000000000000000000000000000000000000000000000003a40
Arg [93] : 0000000000000000000000000000000000000000000000000000000000003a80
Arg [94] : 0000000000000000000000000000000000000000000000000000000000003ac0
Arg [95] : 0000000000000000000000000000000000000000000000000000000000003b00
Arg [96] : 0000000000000000000000000000000000000000000000000000000000003b40
Arg [97] : 0000000000000000000000000000000000000000000000000000000000003b80
Arg [98] : 0000000000000000000000000000000000000000000000000000000000003bc0
Arg [99] : 0000000000000000000000000000000000000000000000000000000000003c00
Arg [100] : 0000000000000000000000000000000000000000000000000000000000003c40
Arg [101] : 0000000000000000000000000000000000000000000000000000000000003c80
Arg [102] : 0000000000000000000000000000000000000000000000000000000000003cc0
Arg [103] : 0000000000000000000000000000000000000000000000000000000000003d00
Arg [104] : 0000000000000000000000000000000000000000000000000000000000003d40
Arg [105] : 0000000000000000000000000000000000000000000000000000000000003d80
Arg [106] : 0000000000000000000000000000000000000000000000000000000000003dc0
Arg [107] : 0000000000000000000000000000000000000000000000000000000000003e00
Arg [108] : 0000000000000000000000000000000000000000000000000000000000003e40
Arg [109] : 0000000000000000000000000000000000000000000000000000000000003e80
Arg [110] : 0000000000000000000000000000000000000000000000000000000000003ec0
Arg [111] : 0000000000000000000000000000000000000000000000000000000000003f00
Arg [112] : 0000000000000000000000000000000000000000000000000000000000003f40
Arg [113] : 0000000000000000000000000000000000000000000000000000000000003f80
Arg [114] : 0000000000000000000000000000000000000000000000000000000000003fc0
Arg [115] : 0000000000000000000000000000000000000000000000000000000000004000
Arg [116] : 0000000000000000000000000000000000000000000000000000000000004040
Arg [117] : 0000000000000000000000000000000000000000000000000000000000004080
Arg [118] : 00000000000000000000000000000000000000000000000000000000000040c0
Arg [119] : 0000000000000000000000000000000000000000000000000000000000004100
Arg [120] : 0000000000000000000000000000000000000000000000000000000000004140
Arg [121] : 0000000000000000000000000000000000000000000000000000000000004180
Arg [122] : 00000000000000000000000000000000000000000000000000000000000041c0
Arg [123] : 0000000000000000000000000000000000000000000000000000000000004200
Arg [124] : 0000000000000000000000000000000000000000000000000000000000004240
Arg [125] : 0000000000000000000000000000000000000000000000000000000000004280
Arg [126] : 00000000000000000000000000000000000000000000000000000000000042c0
Arg [127] : 0000000000000000000000000000000000000000000000000000000000004300
Arg [128] : 0000000000000000000000000000000000000000000000000000000000004340
Arg [129] : 0000000000000000000000000000000000000000000000000000000000004380
Arg [130] : 00000000000000000000000000000000000000000000000000000000000043c0
Arg [131] : 0000000000000000000000000000000000000000000000000000000000004400
Arg [132] : 0000000000000000000000000000000000000000000000000000000000004440
Arg [133] : 0000000000000000000000000000000000000000000000000000000000004480
Arg [134] : 00000000000000000000000000000000000000000000000000000000000044c0
Arg [135] : 0000000000000000000000000000000000000000000000000000000000004500
Arg [136] : 0000000000000000000000000000000000000000000000000000000000004540
Arg [137] : 0000000000000000000000000000000000000000000000000000000000004580
Arg [138] : 00000000000000000000000000000000000000000000000000000000000045c0
Arg [139] : 0000000000000000000000000000000000000000000000000000000000004600
Arg [140] : 0000000000000000000000000000000000000000000000000000000000004640
Arg [141] : 0000000000000000000000000000000000000000000000000000000000004680
Arg [142] : 00000000000000000000000000000000000000000000000000000000000046c0
Arg [143] : 0000000000000000000000000000000000000000000000000000000000004700
Arg [144] : 0000000000000000000000000000000000000000000000000000000000004740
Arg [145] : 0000000000000000000000000000000000000000000000000000000000004780
Arg [146] : 00000000000000000000000000000000000000000000000000000000000047c0
Arg [147] : 0000000000000000000000000000000000000000000000000000000000004800
Arg [148] : 0000000000000000000000000000000000000000000000000000000000004840
Arg [149] : 0000000000000000000000000000000000000000000000000000000000004880
Arg [150] : 00000000000000000000000000000000000000000000000000000000000048c0
Arg [151] : 0000000000000000000000000000000000000000000000000000000000004900
Arg [152] : 0000000000000000000000000000000000000000000000000000000000004940
Arg [153] : 0000000000000000000000000000000000000000000000000000000000004980
Arg [154] : 00000000000000000000000000000000000000000000000000000000000049c0
Arg [155] : 0000000000000000000000000000000000000000000000000000000000004a00
Arg [156] : 0000000000000000000000000000000000000000000000000000000000004a40
Arg [157] : 0000000000000000000000000000000000000000000000000000000000004a80
Arg [158] : 0000000000000000000000000000000000000000000000000000000000004ac0
Arg [159] : 0000000000000000000000000000000000000000000000000000000000004b00
Arg [160] : 0000000000000000000000000000000000000000000000000000000000004b40
Arg [161] : 0000000000000000000000000000000000000000000000000000000000004b80
Arg [162] : 0000000000000000000000000000000000000000000000000000000000004bc0
Arg [163] : 0000000000000000000000000000000000000000000000000000000000004c00
Arg [164] : 0000000000000000000000000000000000000000000000000000000000004c40
Arg [165] : 0000000000000000000000000000000000000000000000000000000000004c80
Arg [166] : 0000000000000000000000000000000000000000000000000000000000004cc0
Arg [167] : 0000000000000000000000000000000000000000000000000000000000004d00
Arg [168] : 0000000000000000000000000000000000000000000000000000000000004d40
Arg [169] : 0000000000000000000000000000000000000000000000000000000000004d80
Arg [170] : 0000000000000000000000000000000000000000000000000000000000004dc0
Arg [171] : 0000000000000000000000000000000000000000000000000000000000004e00
Arg [172] : 0000000000000000000000000000000000000000000000000000000000004e40
Arg [173] : 0000000000000000000000000000000000000000000000000000000000004e80
Arg [174] : 0000000000000000000000000000000000000000000000000000000000004ec0
Arg [175] : 0000000000000000000000000000000000000000000000000000000000004f00
Arg [176] : 0000000000000000000000000000000000000000000000000000000000004f40
Arg [177] : 0000000000000000000000000000000000000000000000000000000000004f80
Arg [178] : 0000000000000000000000000000000000000000000000000000000000004fc0
Arg [179] : 0000000000000000000000000000000000000000000000000000000000005000
Arg [180] : 0000000000000000000000000000000000000000000000000000000000005040
Arg [181] : 0000000000000000000000000000000000000000000000000000000000005080
Arg [182] : 00000000000000000000000000000000000000000000000000000000000050c0
Arg [183] : 0000000000000000000000000000000000000000000000000000000000005100
Arg [184] : 0000000000000000000000000000000000000000000000000000000000005140
Arg [185] : 0000000000000000000000000000000000000000000000000000000000005180
Arg [186] : 00000000000000000000000000000000000000000000000000000000000051c0
Arg [187] : 0000000000000000000000000000000000000000000000000000000000005200
Arg [188] : 0000000000000000000000000000000000000000000000000000000000005240
Arg [189] : 0000000000000000000000000000000000000000000000000000000000005280
Arg [190] : 00000000000000000000000000000000000000000000000000000000000052c0
Arg [191] : 0000000000000000000000000000000000000000000000000000000000005300
Arg [192] : 0000000000000000000000000000000000000000000000000000000000005340
Arg [193] : 0000000000000000000000000000000000000000000000000000000000005380
Arg [194] : 00000000000000000000000000000000000000000000000000000000000053c0
Arg [195] : 0000000000000000000000000000000000000000000000000000000000005400
Arg [196] : 0000000000000000000000000000000000000000000000000000000000005440
Arg [197] : 0000000000000000000000000000000000000000000000000000000000005480
Arg [198] : 00000000000000000000000000000000000000000000000000000000000054c0
Arg [199] : 0000000000000000000000000000000000000000000000000000000000005500
Arg [200] : 0000000000000000000000000000000000000000000000000000000000005540
Arg [201] : 0000000000000000000000000000000000000000000000000000000000005580
Arg [202] : 00000000000000000000000000000000000000000000000000000000000055c0
Arg [203] : 0000000000000000000000000000000000000000000000000000000000005600
Arg [204] : 0000000000000000000000000000000000000000000000000000000000005640
Arg [205] : 0000000000000000000000000000000000000000000000000000000000005680
Arg [206] : 00000000000000000000000000000000000000000000000000000000000056c0
Arg [207] : 0000000000000000000000000000000000000000000000000000000000005700
Arg [208] : 0000000000000000000000000000000000000000000000000000000000005740
Arg [209] : 0000000000000000000000000000000000000000000000000000000000005780
Arg [210] : 00000000000000000000000000000000000000000000000000000000000057c0
Arg [211] : 0000000000000000000000000000000000000000000000000000000000005800
Arg [212] : 0000000000000000000000000000000000000000000000000000000000005840
Arg [213] : 0000000000000000000000000000000000000000000000000000000000005880
Arg [214] : 00000000000000000000000000000000000000000000000000000000000058c0
Arg [215] : 0000000000000000000000000000000000000000000000000000000000005900
Arg [216] : 0000000000000000000000000000000000000000000000000000000000005940
Arg [217] : 0000000000000000000000000000000000000000000000000000000000005980
Arg [218] : 00000000000000000000000000000000000000000000000000000000000059c0
Arg [219] : 0000000000000000000000000000000000000000000000000000000000005a00
Arg [220] : 0000000000000000000000000000000000000000000000000000000000005a40
Arg [221] : 0000000000000000000000000000000000000000000000000000000000005a80
Arg [222] : 0000000000000000000000000000000000000000000000000000000000005ac0
Arg [223] : 0000000000000000000000000000000000000000000000000000000000005b00
Arg [224] : 0000000000000000000000000000000000000000000000000000000000005b40
Arg [225] : 0000000000000000000000000000000000000000000000000000000000005b80
Arg [226] : 0000000000000000000000000000000000000000000000000000000000005bc0
Arg [227] : 0000000000000000000000000000000000000000000000000000000000005c00
Arg [228] : 0000000000000000000000000000000000000000000000000000000000005c40
Arg [229] : 0000000000000000000000000000000000000000000000000000000000005c80
Arg [230] : 0000000000000000000000000000000000000000000000000000000000005cc0
Arg [231] : 0000000000000000000000000000000000000000000000000000000000005d00
Arg [232] : 0000000000000000000000000000000000000000000000000000000000005d40
Arg [233] : 0000000000000000000000000000000000000000000000000000000000005d80
Arg [234] : 0000000000000000000000000000000000000000000000000000000000005dc0
Arg [235] : 0000000000000000000000000000000000000000000000000000000000005e00
Arg [236] : 0000000000000000000000000000000000000000000000000000000000005e40
Arg [237] : 0000000000000000000000000000000000000000000000000000000000005e80
Arg [238] : 0000000000000000000000000000000000000000000000000000000000005ec0
Arg [239] : 0000000000000000000000000000000000000000000000000000000000005f00
Arg [240] : 0000000000000000000000000000000000000000000000000000000000005f40
Arg [241] : 0000000000000000000000000000000000000000000000000000000000005f80
Arg [242] : 0000000000000000000000000000000000000000000000000000000000005fc0
Arg [243] : 0000000000000000000000000000000000000000000000000000000000006000
Arg [244] : 0000000000000000000000000000000000000000000000000000000000006040
Arg [245] : 0000000000000000000000000000000000000000000000000000000000006080
Arg [246] : 00000000000000000000000000000000000000000000000000000000000060c0
Arg [247] : 0000000000000000000000000000000000000000000000000000000000006100
Arg [248] : 0000000000000000000000000000000000000000000000000000000000006140
Arg [249] : 0000000000000000000000000000000000000000000000000000000000006180
Arg [250] : 00000000000000000000000000000000000000000000000000000000000061c0
Arg [251] : 0000000000000000000000000000000000000000000000000000000000006200
Arg [252] : 0000000000000000000000000000000000000000000000000000000000006240
Arg [253] : 0000000000000000000000000000000000000000000000000000000000006280
Arg [254] : 00000000000000000000000000000000000000000000000000000000000062c0
Arg [255] : 0000000000000000000000000000000000000000000000000000000000006300
Arg [256] : 0000000000000000000000000000000000000000000000000000000000006340
Arg [257] : 0000000000000000000000000000000000000000000000000000000000006380
Arg [258] : 00000000000000000000000000000000000000000000000000000000000063c0
Arg [259] : 0000000000000000000000000000000000000000000000000000000000006400
Arg [260] : 0000000000000000000000000000000000000000000000000000000000006440
Arg [261] : 0000000000000000000000000000000000000000000000000000000000006480
Arg [262] : 00000000000000000000000000000000000000000000000000000000000064c0
Arg [263] : 0000000000000000000000000000000000000000000000000000000000006500
Arg [264] : 0000000000000000000000000000000000000000000000000000000000006540
Arg [265] : 0000000000000000000000000000000000000000000000000000000000006580
Arg [266] : 00000000000000000000000000000000000000000000000000000000000065c0
Arg [267] : 0000000000000000000000000000000000000000000000000000000000006600
Arg [268] : 0000000000000000000000000000000000000000000000000000000000006640
Arg [269] : 0000000000000000000000000000000000000000000000000000000000006680
Arg [270] : 00000000000000000000000000000000000000000000000000000000000066c0
Arg [271] : 0000000000000000000000000000000000000000000000000000000000006700
Arg [272] : 0000000000000000000000000000000000000000000000000000000000006740
Arg [273] : 0000000000000000000000000000000000000000000000000000000000006780
Arg [274] : 00000000000000000000000000000000000000000000000000000000000067c0
Arg [275] : 0000000000000000000000000000000000000000000000000000000000006800
Arg [276] : 0000000000000000000000000000000000000000000000000000000000006840
Arg [277] : 0000000000000000000000000000000000000000000000000000000000006880
Arg [278] : 00000000000000000000000000000000000000000000000000000000000068c0
Arg [279] : 0000000000000000000000000000000000000000000000000000000000006900
Arg [280] : 0000000000000000000000000000000000000000000000000000000000006940
Arg [281] : 0000000000000000000000000000000000000000000000000000000000006980
Arg [282] : 00000000000000000000000000000000000000000000000000000000000069c0
Arg [283] : 0000000000000000000000000000000000000000000000000000000000006a00
Arg [284] : 0000000000000000000000000000000000000000000000000000000000006a40
Arg [285] : 0000000000000000000000000000000000000000000000000000000000006a80
Arg [286] : 0000000000000000000000000000000000000000000000000000000000006ac0
Arg [287] : 0000000000000000000000000000000000000000000000000000000000006b00
Arg [288] : 0000000000000000000000000000000000000000000000000000000000006b40
Arg [289] : 0000000000000000000000000000000000000000000000000000000000006b80
Arg [290] : 0000000000000000000000000000000000000000000000000000000000006bc0
Arg [291] : 0000000000000000000000000000000000000000000000000000000000006c00
Arg [292] : 0000000000000000000000000000000000000000000000000000000000006c40
Arg [293] : 0000000000000000000000000000000000000000000000000000000000006c80
Arg [294] : 0000000000000000000000000000000000000000000000000000000000006cc0
Arg [295] : 0000000000000000000000000000000000000000000000000000000000006d00
Arg [296] : 0000000000000000000000000000000000000000000000000000000000006d40
Arg [297] : 0000000000000000000000000000000000000000000000000000000000006d80
Arg [298] : 0000000000000000000000000000000000000000000000000000000000006dc0
Arg [299] : 0000000000000000000000000000000000000000000000000000000000006e00
Arg [300] : 0000000000000000000000000000000000000000000000000000000000006e40
Arg [301] : 0000000000000000000000000000000000000000000000000000000000006e80
Arg [302] : 0000000000000000000000000000000000000000000000000000000000006ec0
Arg [303] : 0000000000000000000000000000000000000000000000000000000000006f00
Arg [304] : 0000000000000000000000000000000000000000000000000000000000006f40
Arg [305] : 0000000000000000000000000000000000000000000000000000000000006f80
Arg [306] : 0000000000000000000000000000000000000000000000000000000000006fc0
Arg [307] : 0000000000000000000000000000000000000000000000000000000000007000
Arg [308] : 0000000000000000000000000000000000000000000000000000000000007040
Arg [309] : 0000000000000000000000000000000000000000000000000000000000007080
Arg [310] : 00000000000000000000000000000000000000000000000000000000000070c0
Arg [311] : 0000000000000000000000000000000000000000000000000000000000007100
Arg [312] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [313] : 2330303933303600000000000000000000000000000000000000000000000000
Arg [314] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [315] : 2330306165643200000000000000000000000000000000000000000000000000
Arg [316] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [317] : 2332323232363300000000000000000000000000000000000000000000000000
Arg [318] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [319] : 2332393234356100000000000000000000000000000000000000000000000000
Arg [320] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [321] : 2333663366373400000000000000000000000000000000000000000000000000
Arg [322] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [323] : 2334356331386600000000000000000000000000000000000000000000000000
Arg [324] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [325] : 2334363731633100000000000000000000000000000000000000000000000000
Arg [326] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [327] : 2335333730393100000000000000000000000000000000000000000000000000
Arg [328] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [329] : 2335336134613100000000000000000000000000000000000000000000000000
Arg [330] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [331] : 2335353565346200000000000000000000000000000000000000000000000000
Arg [332] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [333] : 2335663632326200000000000000000000000000000000000000000000000000
Arg [334] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [335] : 2336303338333000000000000000000000000000000000000000000000000000
Arg [336] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [337] : 2336333962666600000000000000000000000000000000000000000000000000
Arg [338] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [339] : 2336363264393100000000000000000000000000000000000000000000000000
Arg [340] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [341] : 2337636464646400000000000000000000000000000000000000000000000000
Arg [342] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [343] : 2338363236383100000000000000000000000000000000000000000000000000
Arg [344] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [345] : 2338393330366400000000000000000000000000000000000000000000000000
Arg [346] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [347] : 2338663937346100000000000000000000000000000000000000000000000000
Arg [348] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [349] : 2339303663346600000000000000000000000000000000000000000000000000
Arg [350] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [351] : 2339363234326500000000000000000000000000000000000000000000000000
Arg [352] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [353] : 2339633637396300000000000000000000000000000000000000000000000000
Arg [354] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [355] : 2362303761353600000000000000000000000000000000000000000000000000
Arg [356] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [357] : 2364373663666200000000000000000000000000000000000000000000000000
Arg [358] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [359] : 2364636365623300000000000000000000000000000000000000000000000000
Arg [360] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [361] : 2365373030346600000000000000000000000000000000000000000000000000
Arg [362] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [363] : 2365386431303000000000000000000000000000000000000000000000000000
Arg [364] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [365] : 2365656333396100000000000000000000000000000000000000000000000000
Arg [366] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [367] : 2366323030303000000000000000000000000000000000000000000000000000
Arg [368] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [369] : 2366663637303000000000000000000000000000000000000000000000000000
Arg [370] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [371] : 2366663935336600000000000000000000000000000000000000000000000000
Arg [372] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [373] : 2366663961386500000000000000000000000000000000000000000000000000
Arg [374] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [375] : 2330303030303000000000000000000000000000000000000000000000000000
Arg [376] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [377] : 2330306666613800000000000000000000000000000000000000000000000000
Arg [378] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [379] : 2330313635303100000000000000000000000000000000000000000000000000
Arg [380] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [381] : 2330393030666600000000000000000000000000000000000000000000000000
Arg [382] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [383] : 2330623361363500000000000000000000000000000000000000000000000000
Arg [384] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [385] : 2332323230333400000000000000000000000000000000000000000000000000
Arg [386] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [387] : 2333333439356400000000000000000000000000000000000000000000000000
Arg [388] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [389] : 2333393339333900000000000000000000000000000000000000000000000000
Arg [390] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [391] : 2334383339653600000000000000000000000000000000000000000000000000
Arg [392] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [393] : 2334383936613600000000000000000000000000000000000000000000000000
Arg [394] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [395] : 2335623665653100000000000000000000000000000000000000000000000000
Arg [396] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [397] : 2335643262663500000000000000000000000000000000000000000000000000
Arg [398] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [399] : 2335643738376100000000000000000000000000000000000000000000000000
Arg [400] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [401] : 2336323737386100000000000000000000000000000000000000000000000000
Arg [402] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [403] : 2336353762366600000000000000000000000000000000000000000000000000
Arg [404] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [405] : 2336383030663900000000000000000000000000000000000000000000000000
Arg [406] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [407] : 2336626135653400000000000000000000000000000000000000000000000000
Arg [408] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [409] : 2336663331396100000000000000000000000000000000000000000000000000
Arg [410] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [411] : 2337653565616100000000000000000000000000000000000000000000000000
Arg [412] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [413] : 2338663536336200000000000000000000000000000000000000000000000000
Arg [414] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [415] : 2339396535353000000000000000000000000000000000000000000000000000
Arg [416] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [417] : 2363626462666300000000000000000000000000000000000000000000000000
Arg [418] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [419] : 2364313866376500000000000000000000000000000000000000000000000000
Arg [420] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [421] : 2364353135313500000000000000000000000000000000000000000000000000
Arg [422] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [423] : 2364373762626100000000000000000000000000000000000000000000000000
Arg [424] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [425] : 2366626632333600000000000000000000000000000000000000000000000000
Arg [426] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [427] : 2366666134303000000000000000000000000000000000000000000000000000
Arg [428] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [429] : 2330303030666600000000000000000000000000000000000000000000000000
Arg [430] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [431] : 2331623266306100000000000000000000000000000000000000000000000000
Arg [432] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [433] : 2333306333333100000000000000000000000000000000000000000000000000
Arg [434] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [435] : 2333333633623800000000000000000000000000000000000000000000000000
Arg [436] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [437] : 2334313431343100000000000000000000000000000000000000000000000000
Arg [438] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [439] : 2335393264323600000000000000000000000000000000000000000000000000
Arg [440] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [441] : 2335393536353200000000000000000000000000000000000000000000000000
Arg [442] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [443] : 2336333063303000000000000000000000000000000000000000000000000000
Arg [444] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [445] : 2336363339333100000000000000000000000000000000000000000000000000
Arg [446] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [447] : 2336393661366100000000000000000000000000000000000000000000000000
Arg [448] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [449] : 2337326265303600000000000000000000000000000000000000000000000000
Arg [450] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [451] : 2339393961393900000000000000000000000000000000000000000000000000
Arg [452] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [453] : 2361303965396500000000000000000000000000000000000000000000000000
Arg [454] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [455] : 2362323733303100000000000000000000000000000000000000000000000000
Arg [456] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [457] : 2362326362646200000000000000000000000000000000000000000000000000
Arg [458] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [459] : 2362333030303000000000000000000000000000000000000000000000000000
Arg [460] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [461] : 2364663731323600000000000000000000000000000000000000000000000000
Arg [462] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [463] : 2365346463666600000000000000000000000000000000000000000000000000
Arg [464] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [465] : 2366393734363900000000000000000000000000000000000000000000000000
Arg [466] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [467] : 2366396266383000000000000000000000000000000000000000000000000000
Arg [468] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [469] : 2366663030303000000000000000000000000000000000000000000000000000
Arg [470] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [471] : 2366663030666600000000000000000000000000000000000000000000000000
Arg [472] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [473] : 2330303662303400000000000000000000000000000000000000000000000000
Arg [474] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [475] : 2330306666303000000000000000000000000000000000000000000000000000
Arg [476] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [477] : 2330313837306600000000000000000000000000000000000000000000000000
Arg [478] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [479] : 2331613039353600000000000000000000000000000000000000000000000000
Arg [480] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [481] : 2331623162336200000000000000000000000000000000000000000000000000
Arg [482] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [483] : 2332343166623100000000000000000000000000000000000000000000000000
Arg [484] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [485] : 2333303237363300000000000000000000000000000000000000000000000000
Arg [486] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [487] : 2333363332353900000000000000000000000000000000000000000000000000
Arg [488] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [489] : 2335323462323400000000000000000000000000000000000000000000000000
Arg [490] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [491] : 2335653564666500000000000000000000000000000000000000000000000000
Arg [492] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [493] : 2337313561396600000000000000000000000000000000000000000000000000
Arg [494] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [495] : 2337373932373200000000000000000000000000000000000000000000000000
Arg [496] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [497] : 2338393939613100000000000000000000000000000000000000000000000000
Arg [498] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [499] : 2361656434663000000000000000000000000000000000000000000000000000
Arg [500] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [501] : 2362363636363600000000000000000000000000000000000000000000000000
Arg [502] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [503] : 2362633030653000000000000000000000000000000000000000000000000000
Arg [504] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [505] : 2365306365383100000000000000000000000000000000000000000000000000
Arg [506] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [507] : 2366666666303000000000000000000000000000000000000000000000000000
Arg [508] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [509] : 2330303236666600000000000000000000000000000000000000000000000000
Arg [510] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [511] : 2330353030663500000000000000000000000000000000000000000000000000
Arg [512] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [513] : 2332353539613200000000000000000000000000000000000000000000000000
Arg [514] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [515] : 2335633337356500000000000000000000000000000000000000000000000000
Arg [516] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [517] : 2336313461643000000000000000000000000000000000000000000000000000
Arg [518] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [519] : 2336623639353000000000000000000000000000000000000000000000000000
Arg [520] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [521] : 2338303830383000000000000000000000000000000000000000000000000000
Arg [522] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [523] : 2362393030303000000000000000000000000000000000000000000000000000
Arg [524] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [525] : 2364633335333500000000000000000000000000000000000000000000000000
Arg [526] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [527] : 2366616366313500000000000000000000000000000000000000000000000000
Arg [528] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [529] : 2366663337303400000000000000000000000000000000000000000000000000
Arg [530] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [531] : 2330303333303000000000000000000000000000000000000000000000000000
Arg [532] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [533] : 2330613030666600000000000000000000000000000000000000000000000000
Arg [534] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [535] : 2331653134363900000000000000000000000000000000000000000000000000
Arg [536] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [537] : 2332343132323700000000000000000000000000000000000000000000000000
Arg [538] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [539] : 2332613434613100000000000000000000000000000000000000000000000000
Arg [540] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [541] : 2333323363333900000000000000000000000000000000000000000000000000
Arg [542] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [543] : 2333333333333300000000000000000000000000000000000000000000000000
Arg [544] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [545] : 2333373436366400000000000000000000000000000000000000000000000000
Arg [546] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [547] : 2333613065306500000000000000000000000000000000000000000000000000
Arg [548] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [549] : 2333623366356400000000000000000000000000000000000000000000000000
Arg [550] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [551] : 2334393430373200000000000000000000000000000000000000000000000000
Arg [552] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [553] : 2335383630346100000000000000000000000000000000000000000000000000
Arg [554] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [555] : 2335643364666600000000000000000000000000000000000000000000000000
Arg [556] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [557] : 2335643835383600000000000000000000000000000000000000000000000000
Arg [558] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [559] : 2335653665356100000000000000000000000000000000000000000000000000
Arg [560] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [561] : 2335663838613500000000000000000000000000000000000000000000000000
Arg [562] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [563] : 2336333136363200000000000000000000000000000000000000000000000000
Arg [564] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [565] : 2336343865353700000000000000000000000000000000000000000000000000
Arg [566] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [567] : 2337313764623500000000000000000000000000000000000000000000000000
Arg [568] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [569] : 2337623764306600000000000000000000000000000000000000000000000000
Arg [570] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [571] : 2338646336666600000000000000000000000000000000000000000000000000
Arg [572] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [573] : 2339626164623700000000000000000000000000000000000000000000000000
Arg [574] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [575] : 2361626133666600000000000000000000000000000000000000000000000000
Arg [576] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [577] : 2363326131333300000000000000000000000000000000000000000000000000
Arg [578] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [579] : 2363356335633500000000000000000000000000000000000000000000000000
Arg [580] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [581] : 2364353765623100000000000000000000000000000000000000000000000000
Arg [582] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [583] : 2364396130363600000000000000000000000000000000000000000000000000
Arg [584] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [585] : 2365623165616100000000000000000000000000000000000000000000000000
Arg [586] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [587] : 2365643163323400000000000000000000000000000000000000000000000000
Arg [588] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [589] : 2365643835373200000000000000000000000000000000000000000000000000
Arg [590] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [591] : 2366353030666600000000000000000000000000000000000000000000000000
Arg [592] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [593] : 2366666237613400000000000000000000000000000000000000000000000000
Arg [594] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [595] : 2366666531303300000000000000000000000000000000000000000000000000
Arg [596] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [597] : 2366666666666600000000000000000000000000000000000000000000000000
Arg [598] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [599] : 2331303030303000000000000000000000000000000000000000000000000000
Arg [600] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [601] : 2331303234303100000000000000000000000000000000000000000000000000
Arg [602] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [603] : 2333313430396100000000000000000000000000000000000000000000000000
Arg [604] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [605] : 2333393263303000000000000000000000000000000000000000000000000000
Arg [606] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [607] : 2338336539666600000000000000000000000000000000000000000000000000
Arg [608] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [609] : 2339356137636400000000000000000000000000000000000000000000000000
Arg [610] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [611] : 2332313538303000000000000000000000000000000000000000000000000000
Arg [612] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [613] : 2333353538303000000000000000000000000000000000000000000000000000
Arg [614] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [615] : 2333373732373500000000000000000000000000000000000000000000000000
Arg [616] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [617] : 2333383266633100000000000000000000000000000000000000000000000000
Arg [618] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [619] : 2334343031346500000000000000000000000000000000000000000000000000
Arg [620] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [621] : 2334663536343100000000000000000000000000000000000000000000000000
Arg [622] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [623] : 2336343562663400000000000000000000000000000000000000000000000000
Arg [624] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [625] : 2336383836376100000000000000000000000000000000000000000000000000
Arg [626] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [627] : 2362373962623500000000000000000000000000000000000000000000000000
Arg [628] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [629] : 2330303665363900000000000000000000000000000000000000000000000000
Arg [630] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [631] : 2330306262666500000000000000000000000000000000000000000000000000
Arg [632] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [633] : 2330323339613100000000000000000000000000000000000000000000000000
Arg [634] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [635] : 2330373738386600000000000000000000000000000000000000000000000000
Arg [636] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [637] : 2330613537346200000000000000000000000000000000000000000000000000
Arg [638] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [639] : 2330633034303500000000000000000000000000000000000000000000000000
Arg [640] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [641] : 2330643131313500000000000000000000000000000000000000000000000000
Arg [642] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [643] : 2330643636303000000000000000000000000000000000000000000000000000
Arg [644] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [645] : 2330653835373400000000000000000000000000000000000000000000000000
Arg [646] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [647] : 2331313062313100000000000000000000000000000000000000000000000000
Arg [648] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [649] : 2331313562333400000000000000000000000000000000000000000000000000
Arg [650] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [651] : 2331353164326300000000000000000000000000000000000000000000000000
Arg [652] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [653] : 2331363062306200000000000000000000000000000000000000000000000000
Arg [654] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [655] : 2331393239663400000000000000000000000000000000000000000000000000
Arg [656] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [657] : 2331393333366500000000000000000000000000000000000000000000000000
Arg [658] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [659] : 2331613161316100000000000000000000000000000000000000000000000000
Arg [660] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [661] : 2331623162316200000000000000000000000000000000000000000000000000
Arg [662] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [663] : 2331633738363200000000000000000000000000000000000000000000000000
Arg [664] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [665] : 2331656264343300000000000000000000000000000000000000000000000000
Arg [666] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [667] : 2331663166316600000000000000000000000000000000000000000000000000
Arg [668] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [669] : 2331663432303700000000000000000000000000000000000000000000000000
Arg [670] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [671] : 2332323366613300000000000000000000000000000000000000000000000000
Arg [672] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [673] : 2332333262616200000000000000000000000000000000000000000000000000
Arg [674] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [675] : 2332353962323400000000000000000000000000000000000000000000000000
Arg [676] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [677] : 2332363233346600000000000000000000000000000000000000000000000000
Arg [678] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [679] : 2332363335323600000000000000000000000000000000000000000000000000
Arg [680] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [681] : 2332366461666600000000000000000000000000000000000000000000000000
Arg [682] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [683] : 2332383663343000000000000000000000000000000000000000000000000000
Arg [684] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [685] : 2332393238333500000000000000000000000000000000000000000000000000
Arg [686] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [687] : 2332393961633500000000000000000000000000000000000000000000000000
Arg [688] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [689] : 2332613336623100000000000000000000000000000000000000000000000000
Arg [690] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [691] : 2333303335333000000000000000000000000000000000000000000000000000
Arg [692] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [693] : 2333303630383200000000000000000000000000000000000000000000000000
Arg [694] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [695] : 2333313139353500000000000000000000000000000000000000000000000000
Arg [696] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [697] : 2333313330616400000000000000000000000000000000000000000000000000
Arg [698] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [699] : 2333336134616400000000000000000000000000000000000000000000000000
Arg [700] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [701] : 2333343030666600000000000000000000000000000000000000000000000000
Arg [702] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [703] : 2333343339326600000000000000000000000000000000000000000000000000
Arg [704] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [705] : 2333346137653500000000000000000000000000000000000000000000000000
Arg [706] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [707] : 2333366437653500000000000000000000000000000000000000000000000000
Arg [708] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [709] : 2333633135313800000000000000000000000000000000000000000000000000
Arg [710] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [711] : 2333643365396200000000000000000000000000000000000000000000000000
Arg [712] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [713] : 2333666264616300000000000000000000000000000000000000000000000000
Arg [714] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [715] : 2334313538336200000000000000000000000000000000000000000000000000
Arg [716] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [717] : 2334323334316400000000000000000000000000000000000000000000000000
Arg [718] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [719] : 2334326264343100000000000000000000000000000000000000000000000000
Arg [720] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [721] : 2334333632393600000000000000000000000000000000000000000000000000
Arg [722] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [723] : 2334366666663300000000000000000000000000000000000000000000000000
Arg [724] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [725] : 2334373031363200000000000000000000000000000000000000000000000000
Arg [726] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [727] : 2334373462353800000000000000000000000000000000000000000000000000
Arg [728] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [729] : 2334383034323700000000000000000000000000000000000000000000000000
Arg [730] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [731] : 2334383834343800000000000000000000000000000000000000000000000000
Arg [732] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [733] : 2334396666666600000000000000000000000000000000000000000000000000
Arg [734] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [735] : 2334623232323200000000000000000000000000000000000000000000000000
Arg [736] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [737] : 2334623639326600000000000000000000000000000000000000000000000000
Arg [738] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [739] : 2334636164653900000000000000000000000000000000000000000000000000
Arg [740] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [741] : 2334663462333200000000000000000000000000000000000000000000000000
Arg [742] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [743] : 2335323264313100000000000000000000000000000000000000000000000000
Arg [744] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [745] : 2335343365306200000000000000000000000000000000000000000000000000
Arg [746] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [747] : 2335363738396600000000000000000000000000000000000000000000000000
Arg [748] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [749] : 2335363961626200000000000000000000000000000000000000000000000000
Arg [750] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [751] : 2335373638333200000000000000000000000000000000000000000000000000
Arg [752] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [753] : 2335376364666600000000000000000000000000000000000000000000000000
Arg [754] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [755] : 2335666364653400000000000000000000000000000000000000000000000000
Arg [756] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [757] : 2336303365313400000000000000000000000000000000000000000000000000
Arg [758] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [759] : 2336306533306400000000000000000000000000000000000000000000000000
Arg [760] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [761] : 2336316661613500000000000000000000000000000000000000000000000000
Arg [762] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [763] : 2336336437363100000000000000000000000000000000000000000000000000
Arg [764] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [765] : 2336363230333800000000000000000000000000000000000000000000000000
Arg [766] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [767] : 2336373564366200000000000000000000000000000000000000000000000000
Arg [768] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [769] : 2336393832383300000000000000000000000000000000000000000000000000
Arg [770] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [771] : 2336616265333000000000000000000000000000000000000000000000000000
Arg [772] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [773] : 2336653664353000000000000000000000000000000000000000000000000000
Arg [774] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [775] : 2337336165646500000000000000000000000000000000000000000000000000
Arg [776] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [777] : 2337343731636200000000000000000000000000000000000000000000000000
Arg [778] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [779] : 2337363432386100000000000000000000000000000000000000000000000000
Arg [780] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [781] : 2337383463373600000000000000000000000000000000000000000000000000
Arg [782] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [783] : 2337383937613300000000000000000000000000000000000000000000000000
Arg [784] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [785] : 2337393734393900000000000000000000000000000000000000000000000000
Arg [786] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [787] : 2337393932633500000000000000000000000000000000000000000000000000
Arg [788] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [789] : 2337633330303700000000000000000000000000000000000000000000000000
Arg [790] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [791] : 2338303232306100000000000000000000000000000000000000000000000000
Arg [792] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [793] : 2338353865623400000000000000000000000000000000000000000000000000
Arg [794] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [795] : 2338396430623700000000000000000000000000000000000000000000000000
Arg [796] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [797] : 2338623937633600000000000000000000000000000000000000000000000000
Arg [798] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [799] : 2338626233616300000000000000000000000000000000000000000000000000
Arg [800] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [801] : 2338636332653000000000000000000000000000000000000000000000000000
Arg [802] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [803] : 2338643838623400000000000000000000000000000000000000000000000000
Arg [804] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [805] : 2338646336386600000000000000000000000000000000000000000000000000
Arg [806] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [807] : 2338653236626100000000000000000000000000000000000000000000000000
Arg [808] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [809] : 2339333866626400000000000000000000000000000000000000000000000000
Arg [810] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [811] : 2339363431636600000000000000000000000000000000000000000000000000
Arg [812] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [813] : 2339366365356500000000000000000000000000000000000000000000000000
Arg [814] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [815] : 2339386237643300000000000000000000000000000000000000000000000000
Arg [816] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [817] : 2339396439656100000000000000000000000000000000000000000000000000
Arg [818] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [819] : 2339623763356600000000000000000000000000000000000000000000000000
Arg [820] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [821] : 2339656239643400000000000000000000000000000000000000000000000000
Arg [822] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [823] : 2361623330323700000000000000000000000000000000000000000000000000
Arg [824] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [825] : 2361633332333200000000000000000000000000000000000000000000000000
Arg [826] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [827] : 2361666539336300000000000000000000000000000000000000000000000000
Arg [828] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [829] : 2362316462383800000000000000000000000000000000000000000000000000
Arg [830] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [831] : 2362333131616600000000000000000000000000000000000000000000000000
Arg [832] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [833] : 2362386666313200000000000000000000000000000000000000000000000000
Arg [834] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [835] : 2362396339646600000000000000000000000000000000000000000000000000
Arg [836] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [837] : 2362636265656600000000000000000000000000000000000000000000000000
Arg [838] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [839] : 2362643165626300000000000000000000000000000000000000000000000000
Arg [840] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [841] : 2363316666376100000000000000000000000000000000000000000000000000
Arg [842] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [843] : 2364306132373000000000000000000000000000000000000000000000000000
Arg [844] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [845] : 2364336433643300000000000000000000000000000000000000000000000000
Arg [846] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [847] : 2364356163613400000000000000000000000000000000000000000000000000
Arg [848] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [849] : 2364396666303000000000000000000000000000000000000000000000000000
Arg [850] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [851] : 2365313864326400000000000000000000000000000000000000000000000000
Arg [852] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [853] : 2365333133643300000000000000000000000000000000000000000000000000
Arg [854] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [855] : 2365386333386400000000000000000000000000000000000000000000000000
Arg [856] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [857] : 2365396138613800000000000000000000000000000000000000000000000000
Arg [858] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [859] : 2365616563313600000000000000000000000000000000000000000000000000
Arg [860] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [861] : 2365663663303000000000000000000000000000000000000000000000000000
Arg [862] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [863] : 2366316665633600000000000000000000000000000000000000000000000000
Arg [864] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [865] : 2366376162663200000000000000000000000000000000000000000000000000
Arg [866] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [867] : 2366393738363900000000000000000000000000000000000000000000000000
Arg [868] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [869] : 2366396634663200000000000000000000000000000000000000000000000000
Arg [870] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [871] : 2366626632353000000000000000000000000000000000000000000000000000
Arg [872] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [873] : 2366643631333600000000000000000000000000000000000000000000000000
Arg [874] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [875] : 2366643763303000000000000000000000000000000000000000000000000000
Arg [876] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [877] : 2366663030313000000000000000000000000000000000000000000000000000
Arg [878] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [879] : 2366663038643600000000000000000000000000000000000000000000000000
Arg [880] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [881] : 2366663763303000000000000000000000000000000000000000000000000000
Arg [882] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [883] : 2366666238303900000000000000000000000000000000000000000000000000
Arg [884] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [885] : 2366666536303000000000000000000000000000000000000000000000000000
Arg [886] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [887] : 2330303462643000000000000000000000000000000000000000000000000000
Arg [888] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [889] : 2330303736646200000000000000000000000000000000000000000000000000
Arg [890] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [891] : 2330383531613400000000000000000000000000000000000000000000000000
Arg [892] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [893] : 2331336436666600000000000000000000000000000000000000000000000000
Arg [894] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [895] : 2331346363653500000000000000000000000000000000000000000000000000
Arg [896] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [897] : 2333353766316600000000000000000000000000000000000000000000000000
Arg [898] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [899] : 2333613436366100000000000000000000000000000000000000000000000000
Arg [900] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [901] : 2334323864363700000000000000000000000000000000000000000000000000
Arg [902] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [903] : 2335663437363800000000000000000000000000000000000000000000000000
Arg [904] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [905] : 2336623734303000000000000000000000000000000000000000000000000000
Arg [906] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [907] : 2337353932373500000000000000000000000000000000000000000000000000
Arg [908] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [909] : 2361383839623300000000000000000000000000000000000000000000000000
Arg [910] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [911] : 2335393662373500000000000000000000000000000000000000000000000000
Arg [912] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [913] : 2337663766376600000000000000000000000000000000000000000000000000
Arg [914] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [915] : 2366636539636200000000000000000000000000000000000000000000000000
Arg [916] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [917] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [918] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [919] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [920] : 0000000000000000000000000000000000000000000000000000000000000220
Arg [921] : 0000000000000000000000000000000000000000000000000000000000000260
Arg [922] : 00000000000000000000000000000000000000000000000000000000000002a0
Arg [923] : 00000000000000000000000000000000000000000000000000000000000002e0
Arg [924] : 0000000000000000000000000000000000000000000000000000000000000320
Arg [925] : 0000000000000000000000000000000000000000000000000000000000000360
Arg [926] : 00000000000000000000000000000000000000000000000000000000000003a0
Arg [927] : 00000000000000000000000000000000000000000000000000000000000003e0
Arg [928] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [929] : 4269726200000000000000000000000000000000000000000000000000000000
Arg [930] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [931] : 4472756469730000000000000000000000000000000000000000000000000000
Arg [932] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [933] : 4865646765686f67000000000000000000000000000000000000000000000000
Arg [934] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [935] : 50656e6775696e73000000000000000000000000000000000000000000000000
Arg [936] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [937] : 5361795768617400000000000000000000000000000000000000000000000000
Arg [938] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [939] : 5468652047757900000000000000000000000000000000000000000000000000
Arg [940] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [941] : 54696e7944696e6f000000000000000000000000000000000000000000000000
Arg [942] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [943] : 546f61647a000000000000000000000000000000000000000000000000000000
Arg [944] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [945] : 556e697175650000000000000000000000000000000000000000000000000000
Arg [946] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [947] : 5761746368657200000000000000000000000000000000000000000000000000
Arg [948] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [949] : 576f726d00000000000000000000000000000000000000000000000000000000


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.