ETH Price: $3,281.82 (+0.51%)
Gas: 13 Gwei

Token

tiny donkeys (td)
 

Overview

Max Total Supply

169 td

Holders

106

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 td
0x86b6973fBd70cc0ccd544863e10E35a20Bd2c2e8
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
tinydonkeys

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-12
*/

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/access/[email protected]


// OpenZeppelin Contracts v4.4.1 (access/Ownable.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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing 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 @openzeppelin/contracts/utils/[email protected]


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)



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

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

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

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

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





// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)



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





// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)



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

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

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

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

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

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

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

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

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

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

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

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





// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)



/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}




// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)



/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @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);
}





// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)



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

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

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





// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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




// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)



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


// File contracts/ERC721A.sol


// Creator: Chiru Labs


/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Does not support burning tokens to address(0).
 *
 * Assumes that an owner cannot have more than the 2**128 (max value of uint128) of supply
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex = 0;

    // 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 ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

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

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

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return currentIndex;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721A: global index out of bounds');
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721A: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx = 0;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; i < numMintedSoFar; i++) {
            TokenOwnership memory ownership = _ownerships[i];
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                if (tokenIdsIdx == index) {
                    return i;
                }
                tokenIdsIdx++;
            }
        }
        revert('ERC721A: unable to get token of owner by index');
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        require(owner != address(0), 'ERC721A: balance query for the zero address');
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721A: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

        for (uint256 curr = tokenId; ; curr--) {
            TokenOwnership memory ownership = _ownerships[curr];
            if (ownership.addr != address(0)) {
                return ownership;
            }
        }

        revert('ERC721A: unable to determine the owner of token');
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), 'ERC721Metadata: URI query for nonexistent token');

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

    /**
     * @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, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        require(to != owner, 'ERC721A: approval to current owner');

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            'ERC721A: approve caller is not owner nor approved for all'
        );

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        require(_exists(tokenId), 'ERC721A: approved query for nonexistent token');

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), 'ERC721A: approve to caller');

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: transfer to non ERC721Receiver implementer'
        );
    }

    /**
     * @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 (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` cannot be larger than the max batch size.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721A: mint to the zero address');
        // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
        require(!_exists(startTokenId), 'ERC721A: token already minted');
        require(quantity > 0, 'ERC721A: quantity must be greater 0');

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

        AddressData memory addressData = _addressData[to];
        _addressData[to] = AddressData(
            addressData.balance + uint128(quantity),
            addressData.numberMinted + uint128(quantity)
        );
        _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

        uint256 updatedIndex = startTokenId;

        for (uint256 i = 0; i < quantity; i++) {
            emit Transfer(address(0), to, updatedIndex);
            require(
                _checkOnERC721Received(address(0), to, updatedIndex, _data),
                'ERC721A: transfer to non ERC721Receiver implementer'
            );
            updatedIndex++;
        }

      currentIndex = updatedIndex;
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner');
        require(to != address(0), 'ERC721A: transfer to the zero address');

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, prevOwnership.addr);

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

        _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

        // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId] = TokenOwnership(prevOwnership.addr, prevOwnership.startTimestamp);
            }
        }

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

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert('ERC721A: transfer to non ERC721Receiver implementer');
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * 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`.
     */
    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.
     *
     * 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` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

contract tinydonkeys is ERC721A, Ownable {

    string public baseURI = "ipfs://QmZuUvzV4TB92Z9WmQPi2MkL89NpSswNhUSgxDhf8wkGHu/?";
    string public contractURI = "ipfs://QmZuUvzV4TB92Z9WmQPi2MkL89NpSswNhUSgxDhf8wkGHu";
    string public constant baseExtension = ".json";
    address public constant proxyRegistryAddress = 0xa5409ec958C83C3f309868babACA7c86DCB077c1;

    uint256 public constant MAX_PER_TX_FREE = 1;
    uint256 public constant MAX_PER_TX = 2;
    uint256 public constant FREE_MAX_SUPPLY = 1;
    uint256 public MAX_SUPPLY = 2222;
    uint256 public price = 0.001 ether;

    bool public paused = false;

    constructor() ERC721A("tiny donkeys", "td") {}

    function mint(uint256 _amount) external payable {
        address _caller = _msgSender();
        require(!paused, "Paused");
        require(MAX_SUPPLY >= totalSupply() + _amount, "Exceeds max supply");
        require(_amount > 0, "No 0 mints");
        require(tx.origin == _caller, "No contracts");

        if(FREE_MAX_SUPPLY >= totalSupply()){
            require(MAX_PER_TX_FREE >= _amount , "Excess max per free tx");
        }else{
            require(MAX_PER_TX >= _amount , "Excess max per paid tx");
            require(_amount * price == msg.value, "Invalid funds provided");
        }

        _safeMint(_caller, _amount);
    }



    function withdraw() external onlyOwner {
        uint256 balance = address(this).balance;
        (bool success, ) = _msgSender().call{value: balance}("");
        require(success, "Failed to send");
    }

    function pause(bool _state) external onlyOwner {
        paused = _state;
    }

    function setBaseURI(string memory baseURI_) external onlyOwner {
        baseURI = baseURI_;
    }

    function setContractURI(string memory _contractURI) external onlyOwner {
        contractURI = _contractURI;
    }

function setPrice(uint256 newPrice) public onlyOwner {
        price = newPrice;
}

function setMAX_SUPPLY(uint256 newSupply) public onlyOwner {
        MAX_SUPPLY = newSupply;
}


    function tokenURI(uint256 _tokenId) public view override returns (string memory) {
        require(_exists(_tokenId), "Token does not exist.");
        return bytes(baseURI).length > 0 ? string(
            abi.encodePacked(
              baseURI,
              Strings.toString(_tokenId),
              baseExtension
            )
        ) : "";
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"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":"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":[],"name":"FREE_MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_TX_FREE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistryAddress","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":"nonpayable","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSupply","type":"uint256"}],"name":"setMAX_SUPPLY","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6000805560e06040526037608081815290620028cc60a03980516200002d9160089160209091019062000165565b50604051806060016040528060358152602001620029036035913980516200005e9160099160209091019062000165565b506108ae600a5566038d7ea4c68000600b55600c805460ff191690553480156200008757600080fd5b50604080518082018252600c81526b74696e7920646f6e6b65797360a01b6020808301918252835180850190945260028452611d1960f21b908401528151919291620000d69160019162000165565b508051620000ec90600290602084019062000165565b50505062000109620001036200010f60201b60201c565b62000113565b62000248565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000173906200020b565b90600052602060002090601f016020900481019282620001975760008555620001e2565b82601f10620001b257805160ff1916838001178555620001e2565b82800160010185558215620001e2579182015b82811115620001e2578251825591602001919060010190620001c5565b50620001f0929150620001f4565b5090565b5b80821115620001f05760008155600101620001f5565b6002810460018216806200022057607f821691505b602082108114156200024257634e487b7160e01b600052602260045260246000fd5b50919050565b61267480620002586000396000f3fe60806040526004361061020f5760003560e01c8063715018a611610118578063b88d4fde116100a0578063e8a3d4851161006f578063e8a3d48514610577578063e985e9c51461058c578063ec9496ba146105ac578063f2fde38b146105cc578063f43a22dc146105ec5761020f565b8063b88d4fde1461050d578063c66828621461052d578063c87b56dd14610542578063cd7c0326146105625761020f565b8063938e3d7b116100e7578063938e3d7b1461049057806395d89b41146104b0578063a035b1fe146104c5578063a0712d68146104da578063a22cb465146104ed5761020f565b8063715018a6146104465780638069876d146103875780638da5cb5b1461045b57806391b7f5ed146104705761020f565b80633ccfd60b1161019b57806355f804b31161016a57806355f804b3146103bc5780635c975abb146103dc5780636352211e146103f15780636c0360eb1461041157806370a08231146104265761020f565b80633ccfd60b1461035257806342842e0e14610367578063463fff79146103875780634f6ccce71461039c5761020f565b8063095ea7b3116101e2578063095ea7b3146102bb57806318160ddd146102db57806323b872dd146102fd5780632f745c591461031d57806332cb6b0c1461033d5761020f565b806301ffc9a71461021457806302329a291461024a57806306fdde031461026c578063081812fc1461028e575b600080fd5b34801561022057600080fd5b5061023461022f366004611c33565b610601565b6040516102419190611e0b565b60405180910390f35b34801561025657600080fd5b5061026a610265366004611c19565b610664565b005b34801561027857600080fd5b506102816106bf565b6040516102419190611e16565b34801561029a57600080fd5b506102ae6102a9366004611cb1565b610751565b6040516102419190611dc4565b3480156102c757600080fd5b5061026a6102d6366004611bf0565b610794565b3480156102e757600080fd5b506102f061082d565b6040516102419190612497565b34801561030957600080fd5b5061026a610318366004611b13565b610833565b34801561032957600080fd5b506102f0610338366004611bf0565b61083e565b34801561034957600080fd5b506102f061093a565b34801561035e57600080fd5b5061026a610940565b34801561037357600080fd5b5061026a610382366004611b13565b610a07565b34801561039357600080fd5b506102f0610a22565b3480156103a857600080fd5b506102f06103b7366004611cb1565b610a27565b3480156103c857600080fd5b5061026a6103d7366004611c6b565b610a53565b3480156103e857600080fd5b50610234610aa5565b3480156103fd57600080fd5b506102ae61040c366004611cb1565b610aae565b34801561041d57600080fd5b50610281610ac0565b34801561043257600080fd5b506102f0610441366004611ac0565b610b4e565b34801561045257600080fd5b5061026a610b9b565b34801561046757600080fd5b506102ae610be6565b34801561047c57600080fd5b5061026a61048b366004611cb1565b610bf5565b34801561049c57600080fd5b5061026a6104ab366004611c6b565b610c39565b3480156104bc57600080fd5b50610281610c8b565b3480156104d157600080fd5b506102f0610c9a565b61026a6104e8366004611cb1565b610ca0565b3480156104f957600080fd5b5061026a610508366004611bc7565b610dd8565b34801561051957600080fd5b5061026a610528366004611b4e565b610ea6565b34801561053957600080fd5b50610281610edf565b34801561054e57600080fd5b5061028161055d366004611cb1565b610f00565b34801561056e57600080fd5b506102ae610fa3565b34801561058357600080fd5b50610281610fbb565b34801561059857600080fd5b506102346105a7366004611ae1565b610fc8565b3480156105b857600080fd5b5061026a6105c7366004611cb1565b610ff6565b3480156105d857600080fd5b5061026a6105e7366004611ac0565b61103a565b3480156105f857600080fd5b506102f06110ab565b60006001600160e01b031982166380ac58cd60e01b148061063257506001600160e01b03198216635b5e139f60e01b145b8061064d57506001600160e01b0319821663780e9d6360e01b145b8061065c575061065c826110b0565b90505b919050565b61066c6110c9565b6001600160a01b031661067d610be6565b6001600160a01b0316146106ac5760405162461bcd60e51b81526004016106a390612170565b60405180910390fd5b600c805460ff1916911515919091179055565b6060600180546106ce9061257c565b80601f01602080910402602001604051908101604052809291908181526020018280546106fa9061257c565b80156107475780601f1061071c57610100808354040283529160200191610747565b820191906000526020600020905b81548152906001019060200180831161072a57829003601f168201915b5050505050905090565b600061075c826110cd565b6107785760405162461bcd60e51b81526004016106a390612424565b506000908152600560205260409020546001600160a01b031690565b600061079f82610aae565b9050806001600160a01b0316836001600160a01b031614156107d35760405162461bcd60e51b81526004016106a39061225e565b806001600160a01b03166107e56110c9565b6001600160a01b031614806108015750610801816105a76110c9565b61081d5760405162461bcd60e51b81526004016106a390612027565b6108288383836110d4565b505050565b60005490565b610828838383611130565b600061084983610b4e565b82106108675760405162461bcd60e51b81526004016106a390611e29565b600061087161082d565b905060008060005b8381101561091b576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff1691830191909152156108cc57805192505b876001600160a01b0316836001600160a01b0316141561090857868414156108fa5750935061093492505050565b83610904816125b7565b9450505b5080610913816125b7565b915050610879565b5060405162461bcd60e51b81526004016106a3906123d6565b92915050565b600a5481565b6109486110c9565b6001600160a01b0316610959610be6565b6001600160a01b03161461097f5760405162461bcd60e51b81526004016106a390612170565b47600061098a6110c9565b6001600160a01b0316826040516109a090611dc1565b60006040518083038185875af1925050503d80600081146109dd576040519150601f19603f3d011682016040523d82523d6000602084013e6109e2565b606091505b5050905080610a035760405162461bcd60e51b81526004016106a3906123ae565b5050565b61082883838360405180602001604052806000815250610ea6565b600181565b6000610a3161082d565b8210610a4f5760405162461bcd60e51b81526004016106a390611f6f565b5090565b610a5b6110c9565b6001600160a01b0316610a6c610be6565b6001600160a01b031614610a925760405162461bcd60e51b81526004016106a390612170565b8051610a0390600890602084019061197d565b600c5460ff1681565b6000610ab9826113f9565b5192915050565b60088054610acd9061257c565b80601f0160208091040260200160405190810160405280929190818152602001828054610af99061257c565b8015610b465780601f10610b1b57610100808354040283529160200191610b46565b820191906000526020600020905b815481529060010190602001808311610b2957829003601f168201915b505050505081565b60006001600160a01b038216610b765760405162461bcd60e51b81526004016106a3906120b0565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b610ba36110c9565b6001600160a01b0316610bb4610be6565b6001600160a01b031614610bda5760405162461bcd60e51b81526004016106a390612170565b610be4600061148a565b565b6007546001600160a01b031690565b610bfd6110c9565b6001600160a01b0316610c0e610be6565b6001600160a01b031614610c345760405162461bcd60e51b81526004016106a390612170565b600b55565b610c416110c9565b6001600160a01b0316610c52610be6565b6001600160a01b031614610c785760405162461bcd60e51b81526004016106a390612170565b8051610a0390600990602084019061197d565b6060600280546106ce9061257c565b600b5481565b6000610caa6110c9565b600c5490915060ff1615610cd05760405162461bcd60e51b81526004016106a390611e6b565b81610cd961082d565b610ce391906124d7565b600a541015610d045760405162461bcd60e51b81526004016106a390612084565b60008211610d245760405162461bcd60e51b81526004016106a390611f1b565b326001600160a01b03821614610d4c5760405162461bcd60e51b81526004016106a390612471565b610d5461082d565b600110610d81578160011015610d7c5760405162461bcd60e51b81526004016106a390611ff7565b610dce565b8160021015610da25760405162461bcd60e51b81526004016106a390611f3f565b34600b5483610db19190612503565b14610dce5760405162461bcd60e51b81526004016106a39061222e565b610a0381836114dc565b610de06110c9565b6001600160a01b0316826001600160a01b03161415610e115760405162461bcd60e51b81526004016106a3906121a5565b8060066000610e1e6110c9565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610e626110c9565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e9a9190611e0b565b60405180910390a35050565b610eb1848484611130565b610ebd848484846114f6565b610ed95760405162461bcd60e51b81526004016106a3906122e3565b50505050565b60405180604001604052806005815260200164173539b7b760d91b81525081565b6060610f0b826110cd565b610f275760405162461bcd60e51b81526004016106a3906120fb565b600060088054610f369061257c565b905011610f52576040518060200160405280600081525061065c565b6008610f5d83611612565b60405180604001604052806005815260200164173539b7b760d91b815250604051602001610f8d93929190611d11565b6040516020818303038152906040529050919050565b73a5409ec958c83c3f309868babaca7c86dcb077c181565b60098054610acd9061257c565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b610ffe6110c9565b6001600160a01b031661100f610be6565b6001600160a01b0316146110355760405162461bcd60e51b81526004016106a390612170565b600a55565b6110426110c9565b6001600160a01b0316611053610be6565b6001600160a01b0316146110795760405162461bcd60e51b81526004016106a390612170565b6001600160a01b03811661109f5760405162461bcd60e51b81526004016106a390611e8b565b6110a88161148a565b50565b600281565b6001600160e01b031981166301ffc9a760e01b14919050565b3390565b6000541190565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061113b826113f9565b9050600081600001516001600160a01b03166111556110c9565b6001600160a01b0316148061118a575061116d6110c9565b6001600160a01b031661117f84610751565b6001600160a01b0316145b8061119e5750815161119e906105a76110c9565b9050806111bd5760405162461bcd60e51b81526004016106a3906121dc565b846001600160a01b031682600001516001600160a01b0316146111f25760405162461bcd60e51b81526004016106a39061212a565b6001600160a01b0384166112185760405162461bcd60e51b81526004016106a390611fb2565b6112258585856001610ed9565b61123560008484600001516110d4565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255825180840184529182524267ffffffffffffffff9081168386019081528a875260039095529285209151825494516001600160a01b031990951696169590951767ffffffffffffffff60a01b1916600160a01b9390921692909202179055906112fe9085906124d7565b6000818152600360205260409020549091506001600160a01b03166113a357611326816110cd565b156113a35760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff90811682850190815260008781526003909352949091209251835494516001600160a01b031990951692169190911767ffffffffffffffff60a01b1916600160a01b93909116929092029190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46113f18686866001610ed9565b505050505050565b6114016119fd565b61140a826110cd565b6114265760405162461bcd60e51b81526004016106a390611ed1565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561147757915061065f9050565b508061148281612565565b915050611428565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610a0382826040518060200160405280600081525061172d565b600061150a846001600160a01b0316611977565b1561160657836001600160a01b031663150b7a026115266110c9565b8786866040518563ffffffff1660e01b81526004016115489493929190611dd8565b602060405180830381600087803b15801561156257600080fd5b505af1925050508015611592575060408051601f3d908101601f1916820190925261158f91810190611c4f565b60015b6115ec573d8080156115c0576040519150601f19603f3d011682016040523d82523d6000602084013e6115c5565b606091505b5080516115e45760405162461bcd60e51b81526004016106a3906122e3565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061160a565b5060015b949350505050565b60608161163757506040805180820190915260018152600360fc1b602082015261065f565b8160005b8115611661578061164b816125b7565b915061165a9050600a836124ef565b915061163b565b60008167ffffffffffffffff81111561168a57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156116b4576020820181803683370190505b5090505b841561160a576116c9600183612522565b91506116d6600a866125d2565b6116e19060306124d7565b60f81b81838151811061170457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611726600a866124ef565b94506116b8565b6000546001600160a01b0384166117565760405162461bcd60e51b81526004016106a39061236d565b61175f816110cd565b1561177c5760405162461bcd60e51b81526004016106a390612336565b6000831161179c5760405162461bcd60e51b81526004016106a3906122a0565b6117a96000858386610ed9565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906118059087906124ac565b6001600160801b0316815260200185836020015161182391906124ac565b6001600160801b039081169091526001600160a01b03808816600081815260046020908152604080832087518154988401518816600160801b029088166001600160801b031990991698909817909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b0267ffffffffffffffff60a01b19959093166001600160a01b031990941693909317939093161790915582905b858110156119655760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461192960008884886114f6565b6119455760405162461bcd60e51b81526004016106a3906122e3565b8161194f816125b7565b925050808061195d906125b7565b9150506118dc565b5060008181556113f190878588610ed9565b3b151590565b8280546119899061257c565b90600052602060002090601f0160209004810192826119ab57600085556119f1565b82601f106119c457805160ff19168380011785556119f1565b828001600101855582156119f1579182015b828111156119f15782518255916020019190600101906119d6565b50610a4f929150611a14565b604080518082019091526000808252602082015290565b5b80821115610a4f5760008155600101611a15565b600067ffffffffffffffff80841115611a4457611a44612612565b604051601f8501601f191681016020018281118282101715611a6857611a68612612565b604052848152915081838501861015611a8057600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b038116811461065f57600080fd5b8035801515811461065f57600080fd5b600060208284031215611ad1578081fd5b611ada82611a99565b9392505050565b60008060408385031215611af3578081fd5b611afc83611a99565b9150611b0a60208401611a99565b90509250929050565b600080600060608486031215611b27578081fd5b611b3084611a99565b9250611b3e60208501611a99565b9150604084013590509250925092565b60008060008060808587031215611b63578081fd5b611b6c85611a99565b9350611b7a60208601611a99565b925060408501359150606085013567ffffffffffffffff811115611b9c578182fd5b8501601f81018713611bac578182fd5b611bbb87823560208401611a29565b91505092959194509250565b60008060408385031215611bd9578182fd5b611be283611a99565b9150611b0a60208401611ab0565b60008060408385031215611c02578182fd5b611c0b83611a99565b946020939093013593505050565b600060208284031215611c2a578081fd5b611ada82611ab0565b600060208284031215611c44578081fd5b8135611ada81612628565b600060208284031215611c60578081fd5b8151611ada81612628565b600060208284031215611c7c578081fd5b813567ffffffffffffffff811115611c92578182fd5b8201601f81018413611ca2578182fd5b61160a84823560208401611a29565b600060208284031215611cc2578081fd5b5035919050565b60008151808452611ce1816020860160208601612539565b601f01601f19169290920160200192915050565b60008151611d07818560208601612539565b9290920192915050565b8354600090819060028104600180831680611d2d57607f831692505b6020808410821415611d4d57634e487b7160e01b87526022600452602487fd5b818015611d615760018114611d7257611d9e565b60ff19861689528489019650611d9e565b611d7b8c6124a0565b885b86811015611d965781548b820152908501908301611d7d565b505084890196505b505050505050611db7611db18287611cf5565b85611cf5565b9695505050505050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611db790830184611cc9565b901515815260200190565b600060208252611ada6020830184611cc9565b60208082526022908201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526006908201526514185d5cd95960d21b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252602a908201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736040820152693a32b73a103a37b5b2b760b11b606082015260800190565b6020808252600a90820152694e6f2030206d696e747360b01b604082015260600190565b60208082526016908201527508af0c6cae6e640dac2f040e0cae440e0c2d2c840e8f60531b604082015260600190565b60208082526023908201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756040820152626e647360e81b606082015260800190565b60208082526025908201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526016908201527508af0c6cae6e640dac2f040e0cae440cce4caca40e8f60531b604082015260600190565b60208082526039908201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60408201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606082015260800190565b60208082526012908201527145786365656473206d617820737570706c7960701b604082015260600190565b6020808252602b908201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b6020808252601590820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b604082015260600190565b60208082526026908201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746040820152651037bbb732b960d11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601a908201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604082015260600190565b60208082526032908201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b602080825260169082015275125b9d985b1a5908199d5b991cc81c1c9bdd9a59195960521b604082015260600190565b60208082526022908201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60408201526132b960f11b606082015260800190565b60208082526023908201527f455243373231413a207175616e74697479206d7573742062652067726561746560408201526207220360ec1b606082015260800190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6020808252601d908201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604082015260600190565b60208082526021908201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6020808252600e908201526d11985a5b1959081d1bc81cd95b9960921b604082015260600190565b6020808252602e908201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060408201526d0deeedccae440c4f240d2dcc8caf60931b606082015260800190565b6020808252602d908201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560408201526c3c34b9ba32b73a103a37b5b2b760991b606082015260800190565b6020808252600c908201526b4e6f20636f6e74726163747360a01b604082015260600190565b90815260200190565b60009081526020902090565b60006001600160801b038083168185168083038211156124ce576124ce6125e6565b01949350505050565b600082198211156124ea576124ea6125e6565b500190565b6000826124fe576124fe6125fc565b500490565b600081600019048311821515161561251d5761251d6125e6565b500290565b600082821015612534576125346125e6565b500390565b60005b8381101561255457818101518382015260200161253c565b83811115610ed95750506000910152565b600081612574576125746125e6565b506000190190565b60028104600182168061259057607f821691505b602082108114156125b157634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156125cb576125cb6125e6565b5060010190565b6000826125e1576125e16125fc565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146110a857600080fdfea26469706673582212207fdcc84fe0e207a4ece0edf25afa95dbbbdb9fa9d440fc5252d1b05f768740cf64736f6c63430008000033697066733a2f2f516d5a7555767a5634544239325a39576d515069324d6b4c38394e705373774e685553677844686638776b4748752f3f697066733a2f2f516d5a7555767a5634544239325a39576d515069324d6b4c38394e705373774e685553677844686638776b474875

Deployed Bytecode

0x60806040526004361061020f5760003560e01c8063715018a611610118578063b88d4fde116100a0578063e8a3d4851161006f578063e8a3d48514610577578063e985e9c51461058c578063ec9496ba146105ac578063f2fde38b146105cc578063f43a22dc146105ec5761020f565b8063b88d4fde1461050d578063c66828621461052d578063c87b56dd14610542578063cd7c0326146105625761020f565b8063938e3d7b116100e7578063938e3d7b1461049057806395d89b41146104b0578063a035b1fe146104c5578063a0712d68146104da578063a22cb465146104ed5761020f565b8063715018a6146104465780638069876d146103875780638da5cb5b1461045b57806391b7f5ed146104705761020f565b80633ccfd60b1161019b57806355f804b31161016a57806355f804b3146103bc5780635c975abb146103dc5780636352211e146103f15780636c0360eb1461041157806370a08231146104265761020f565b80633ccfd60b1461035257806342842e0e14610367578063463fff79146103875780634f6ccce71461039c5761020f565b8063095ea7b3116101e2578063095ea7b3146102bb57806318160ddd146102db57806323b872dd146102fd5780632f745c591461031d57806332cb6b0c1461033d5761020f565b806301ffc9a71461021457806302329a291461024a57806306fdde031461026c578063081812fc1461028e575b600080fd5b34801561022057600080fd5b5061023461022f366004611c33565b610601565b6040516102419190611e0b565b60405180910390f35b34801561025657600080fd5b5061026a610265366004611c19565b610664565b005b34801561027857600080fd5b506102816106bf565b6040516102419190611e16565b34801561029a57600080fd5b506102ae6102a9366004611cb1565b610751565b6040516102419190611dc4565b3480156102c757600080fd5b5061026a6102d6366004611bf0565b610794565b3480156102e757600080fd5b506102f061082d565b6040516102419190612497565b34801561030957600080fd5b5061026a610318366004611b13565b610833565b34801561032957600080fd5b506102f0610338366004611bf0565b61083e565b34801561034957600080fd5b506102f061093a565b34801561035e57600080fd5b5061026a610940565b34801561037357600080fd5b5061026a610382366004611b13565b610a07565b34801561039357600080fd5b506102f0610a22565b3480156103a857600080fd5b506102f06103b7366004611cb1565b610a27565b3480156103c857600080fd5b5061026a6103d7366004611c6b565b610a53565b3480156103e857600080fd5b50610234610aa5565b3480156103fd57600080fd5b506102ae61040c366004611cb1565b610aae565b34801561041d57600080fd5b50610281610ac0565b34801561043257600080fd5b506102f0610441366004611ac0565b610b4e565b34801561045257600080fd5b5061026a610b9b565b34801561046757600080fd5b506102ae610be6565b34801561047c57600080fd5b5061026a61048b366004611cb1565b610bf5565b34801561049c57600080fd5b5061026a6104ab366004611c6b565b610c39565b3480156104bc57600080fd5b50610281610c8b565b3480156104d157600080fd5b506102f0610c9a565b61026a6104e8366004611cb1565b610ca0565b3480156104f957600080fd5b5061026a610508366004611bc7565b610dd8565b34801561051957600080fd5b5061026a610528366004611b4e565b610ea6565b34801561053957600080fd5b50610281610edf565b34801561054e57600080fd5b5061028161055d366004611cb1565b610f00565b34801561056e57600080fd5b506102ae610fa3565b34801561058357600080fd5b50610281610fbb565b34801561059857600080fd5b506102346105a7366004611ae1565b610fc8565b3480156105b857600080fd5b5061026a6105c7366004611cb1565b610ff6565b3480156105d857600080fd5b5061026a6105e7366004611ac0565b61103a565b3480156105f857600080fd5b506102f06110ab565b60006001600160e01b031982166380ac58cd60e01b148061063257506001600160e01b03198216635b5e139f60e01b145b8061064d57506001600160e01b0319821663780e9d6360e01b145b8061065c575061065c826110b0565b90505b919050565b61066c6110c9565b6001600160a01b031661067d610be6565b6001600160a01b0316146106ac5760405162461bcd60e51b81526004016106a390612170565b60405180910390fd5b600c805460ff1916911515919091179055565b6060600180546106ce9061257c565b80601f01602080910402602001604051908101604052809291908181526020018280546106fa9061257c565b80156107475780601f1061071c57610100808354040283529160200191610747565b820191906000526020600020905b81548152906001019060200180831161072a57829003601f168201915b5050505050905090565b600061075c826110cd565b6107785760405162461bcd60e51b81526004016106a390612424565b506000908152600560205260409020546001600160a01b031690565b600061079f82610aae565b9050806001600160a01b0316836001600160a01b031614156107d35760405162461bcd60e51b81526004016106a39061225e565b806001600160a01b03166107e56110c9565b6001600160a01b031614806108015750610801816105a76110c9565b61081d5760405162461bcd60e51b81526004016106a390612027565b6108288383836110d4565b505050565b60005490565b610828838383611130565b600061084983610b4e565b82106108675760405162461bcd60e51b81526004016106a390611e29565b600061087161082d565b905060008060005b8381101561091b576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff1691830191909152156108cc57805192505b876001600160a01b0316836001600160a01b0316141561090857868414156108fa5750935061093492505050565b83610904816125b7565b9450505b5080610913816125b7565b915050610879565b5060405162461bcd60e51b81526004016106a3906123d6565b92915050565b600a5481565b6109486110c9565b6001600160a01b0316610959610be6565b6001600160a01b03161461097f5760405162461bcd60e51b81526004016106a390612170565b47600061098a6110c9565b6001600160a01b0316826040516109a090611dc1565b60006040518083038185875af1925050503d80600081146109dd576040519150601f19603f3d011682016040523d82523d6000602084013e6109e2565b606091505b5050905080610a035760405162461bcd60e51b81526004016106a3906123ae565b5050565b61082883838360405180602001604052806000815250610ea6565b600181565b6000610a3161082d565b8210610a4f5760405162461bcd60e51b81526004016106a390611f6f565b5090565b610a5b6110c9565b6001600160a01b0316610a6c610be6565b6001600160a01b031614610a925760405162461bcd60e51b81526004016106a390612170565b8051610a0390600890602084019061197d565b600c5460ff1681565b6000610ab9826113f9565b5192915050565b60088054610acd9061257c565b80601f0160208091040260200160405190810160405280929190818152602001828054610af99061257c565b8015610b465780601f10610b1b57610100808354040283529160200191610b46565b820191906000526020600020905b815481529060010190602001808311610b2957829003601f168201915b505050505081565b60006001600160a01b038216610b765760405162461bcd60e51b81526004016106a3906120b0565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b610ba36110c9565b6001600160a01b0316610bb4610be6565b6001600160a01b031614610bda5760405162461bcd60e51b81526004016106a390612170565b610be4600061148a565b565b6007546001600160a01b031690565b610bfd6110c9565b6001600160a01b0316610c0e610be6565b6001600160a01b031614610c345760405162461bcd60e51b81526004016106a390612170565b600b55565b610c416110c9565b6001600160a01b0316610c52610be6565b6001600160a01b031614610c785760405162461bcd60e51b81526004016106a390612170565b8051610a0390600990602084019061197d565b6060600280546106ce9061257c565b600b5481565b6000610caa6110c9565b600c5490915060ff1615610cd05760405162461bcd60e51b81526004016106a390611e6b565b81610cd961082d565b610ce391906124d7565b600a541015610d045760405162461bcd60e51b81526004016106a390612084565b60008211610d245760405162461bcd60e51b81526004016106a390611f1b565b326001600160a01b03821614610d4c5760405162461bcd60e51b81526004016106a390612471565b610d5461082d565b600110610d81578160011015610d7c5760405162461bcd60e51b81526004016106a390611ff7565b610dce565b8160021015610da25760405162461bcd60e51b81526004016106a390611f3f565b34600b5483610db19190612503565b14610dce5760405162461bcd60e51b81526004016106a39061222e565b610a0381836114dc565b610de06110c9565b6001600160a01b0316826001600160a01b03161415610e115760405162461bcd60e51b81526004016106a3906121a5565b8060066000610e1e6110c9565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610e626110c9565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e9a9190611e0b565b60405180910390a35050565b610eb1848484611130565b610ebd848484846114f6565b610ed95760405162461bcd60e51b81526004016106a3906122e3565b50505050565b60405180604001604052806005815260200164173539b7b760d91b81525081565b6060610f0b826110cd565b610f275760405162461bcd60e51b81526004016106a3906120fb565b600060088054610f369061257c565b905011610f52576040518060200160405280600081525061065c565b6008610f5d83611612565b60405180604001604052806005815260200164173539b7b760d91b815250604051602001610f8d93929190611d11565b6040516020818303038152906040529050919050565b73a5409ec958c83c3f309868babaca7c86dcb077c181565b60098054610acd9061257c565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b610ffe6110c9565b6001600160a01b031661100f610be6565b6001600160a01b0316146110355760405162461bcd60e51b81526004016106a390612170565b600a55565b6110426110c9565b6001600160a01b0316611053610be6565b6001600160a01b0316146110795760405162461bcd60e51b81526004016106a390612170565b6001600160a01b03811661109f5760405162461bcd60e51b81526004016106a390611e8b565b6110a88161148a565b50565b600281565b6001600160e01b031981166301ffc9a760e01b14919050565b3390565b6000541190565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061113b826113f9565b9050600081600001516001600160a01b03166111556110c9565b6001600160a01b0316148061118a575061116d6110c9565b6001600160a01b031661117f84610751565b6001600160a01b0316145b8061119e5750815161119e906105a76110c9565b9050806111bd5760405162461bcd60e51b81526004016106a3906121dc565b846001600160a01b031682600001516001600160a01b0316146111f25760405162461bcd60e51b81526004016106a39061212a565b6001600160a01b0384166112185760405162461bcd60e51b81526004016106a390611fb2565b6112258585856001610ed9565b61123560008484600001516110d4565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255825180840184529182524267ffffffffffffffff9081168386019081528a875260039095529285209151825494516001600160a01b031990951696169590951767ffffffffffffffff60a01b1916600160a01b9390921692909202179055906112fe9085906124d7565b6000818152600360205260409020549091506001600160a01b03166113a357611326816110cd565b156113a35760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff90811682850190815260008781526003909352949091209251835494516001600160a01b031990951692169190911767ffffffffffffffff60a01b1916600160a01b93909116929092029190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46113f18686866001610ed9565b505050505050565b6114016119fd565b61140a826110cd565b6114265760405162461bcd60e51b81526004016106a390611ed1565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561147757915061065f9050565b508061148281612565565b915050611428565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610a0382826040518060200160405280600081525061172d565b600061150a846001600160a01b0316611977565b1561160657836001600160a01b031663150b7a026115266110c9565b8786866040518563ffffffff1660e01b81526004016115489493929190611dd8565b602060405180830381600087803b15801561156257600080fd5b505af1925050508015611592575060408051601f3d908101601f1916820190925261158f91810190611c4f565b60015b6115ec573d8080156115c0576040519150601f19603f3d011682016040523d82523d6000602084013e6115c5565b606091505b5080516115e45760405162461bcd60e51b81526004016106a3906122e3565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061160a565b5060015b949350505050565b60608161163757506040805180820190915260018152600360fc1b602082015261065f565b8160005b8115611661578061164b816125b7565b915061165a9050600a836124ef565b915061163b565b60008167ffffffffffffffff81111561168a57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156116b4576020820181803683370190505b5090505b841561160a576116c9600183612522565b91506116d6600a866125d2565b6116e19060306124d7565b60f81b81838151811061170457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611726600a866124ef565b94506116b8565b6000546001600160a01b0384166117565760405162461bcd60e51b81526004016106a39061236d565b61175f816110cd565b1561177c5760405162461bcd60e51b81526004016106a390612336565b6000831161179c5760405162461bcd60e51b81526004016106a3906122a0565b6117a96000858386610ed9565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906118059087906124ac565b6001600160801b0316815260200185836020015161182391906124ac565b6001600160801b039081169091526001600160a01b03808816600081815260046020908152604080832087518154988401518816600160801b029088166001600160801b031990991698909817909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b0267ffffffffffffffff60a01b19959093166001600160a01b031990941693909317939093161790915582905b858110156119655760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461192960008884886114f6565b6119455760405162461bcd60e51b81526004016106a3906122e3565b8161194f816125b7565b925050808061195d906125b7565b9150506118dc565b5060008181556113f190878588610ed9565b3b151590565b8280546119899061257c565b90600052602060002090601f0160209004810192826119ab57600085556119f1565b82601f106119c457805160ff19168380011785556119f1565b828001600101855582156119f1579182015b828111156119f15782518255916020019190600101906119d6565b50610a4f929150611a14565b604080518082019091526000808252602082015290565b5b80821115610a4f5760008155600101611a15565b600067ffffffffffffffff80841115611a4457611a44612612565b604051601f8501601f191681016020018281118282101715611a6857611a68612612565b604052848152915081838501861015611a8057600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b038116811461065f57600080fd5b8035801515811461065f57600080fd5b600060208284031215611ad1578081fd5b611ada82611a99565b9392505050565b60008060408385031215611af3578081fd5b611afc83611a99565b9150611b0a60208401611a99565b90509250929050565b600080600060608486031215611b27578081fd5b611b3084611a99565b9250611b3e60208501611a99565b9150604084013590509250925092565b60008060008060808587031215611b63578081fd5b611b6c85611a99565b9350611b7a60208601611a99565b925060408501359150606085013567ffffffffffffffff811115611b9c578182fd5b8501601f81018713611bac578182fd5b611bbb87823560208401611a29565b91505092959194509250565b60008060408385031215611bd9578182fd5b611be283611a99565b9150611b0a60208401611ab0565b60008060408385031215611c02578182fd5b611c0b83611a99565b946020939093013593505050565b600060208284031215611c2a578081fd5b611ada82611ab0565b600060208284031215611c44578081fd5b8135611ada81612628565b600060208284031215611c60578081fd5b8151611ada81612628565b600060208284031215611c7c578081fd5b813567ffffffffffffffff811115611c92578182fd5b8201601f81018413611ca2578182fd5b61160a84823560208401611a29565b600060208284031215611cc2578081fd5b5035919050565b60008151808452611ce1816020860160208601612539565b601f01601f19169290920160200192915050565b60008151611d07818560208601612539565b9290920192915050565b8354600090819060028104600180831680611d2d57607f831692505b6020808410821415611d4d57634e487b7160e01b87526022600452602487fd5b818015611d615760018114611d7257611d9e565b60ff19861689528489019650611d9e565b611d7b8c6124a0565b885b86811015611d965781548b820152908501908301611d7d565b505084890196505b505050505050611db7611db18287611cf5565b85611cf5565b9695505050505050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611db790830184611cc9565b901515815260200190565b600060208252611ada6020830184611cc9565b60208082526022908201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526006908201526514185d5cd95960d21b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252602a908201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736040820152693a32b73a103a37b5b2b760b11b606082015260800190565b6020808252600a90820152694e6f2030206d696e747360b01b604082015260600190565b60208082526016908201527508af0c6cae6e640dac2f040e0cae440e0c2d2c840e8f60531b604082015260600190565b60208082526023908201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756040820152626e647360e81b606082015260800190565b60208082526025908201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526016908201527508af0c6cae6e640dac2f040e0cae440cce4caca40e8f60531b604082015260600190565b60208082526039908201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60408201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606082015260800190565b60208082526012908201527145786365656473206d617820737570706c7960701b604082015260600190565b6020808252602b908201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b6020808252601590820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b604082015260600190565b60208082526026908201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746040820152651037bbb732b960d11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601a908201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604082015260600190565b60208082526032908201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b602080825260169082015275125b9d985b1a5908199d5b991cc81c1c9bdd9a59195960521b604082015260600190565b60208082526022908201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60408201526132b960f11b606082015260800190565b60208082526023908201527f455243373231413a207175616e74697479206d7573742062652067726561746560408201526207220360ec1b606082015260800190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6020808252601d908201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604082015260600190565b60208082526021908201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6020808252600e908201526d11985a5b1959081d1bc81cd95b9960921b604082015260600190565b6020808252602e908201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060408201526d0deeedccae440c4f240d2dcc8caf60931b606082015260800190565b6020808252602d908201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560408201526c3c34b9ba32b73a103a37b5b2b760991b606082015260800190565b6020808252600c908201526b4e6f20636f6e74726163747360a01b604082015260600190565b90815260200190565b60009081526020902090565b60006001600160801b038083168185168083038211156124ce576124ce6125e6565b01949350505050565b600082198211156124ea576124ea6125e6565b500190565b6000826124fe576124fe6125fc565b500490565b600081600019048311821515161561251d5761251d6125e6565b500290565b600082821015612534576125346125e6565b500390565b60005b8381101561255457818101518382015260200161253c565b83811115610ed95750506000910152565b600081612574576125746125e6565b506000190190565b60028104600182168061259057607f821691505b602082108114156125b157634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156125cb576125cb6125e6565b5060010190565b6000826125e1576125e16125fc565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146110a857600080fdfea26469706673582212207fdcc84fe0e207a4ece0edf25afa95dbbbdb9fa9d440fc5252d1b05f768740cf64736f6c63430008000033

Deployed Bytecode Sourcemap

38072:2457:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26086:372;;;;;;;;;;-1:-1:-1;26086:372:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39653:81;;;;;;;;;;-1:-1:-1;39653:81:0;;;;;:::i;:::-;;:::i;:::-;;27713:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29274:214::-;;;;;;;;;;-1:-1:-1;29274:214:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;28795:413::-;;;;;;;;;;-1:-1:-1;28795:413:0;;;;;:::i;:::-;;:::i;24527:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30150:162::-;;;;;;;;;;-1:-1:-1;30150:162:0;;;;;:::i;:::-;;:::i;25191:823::-;;;;;;;;;;-1:-1:-1;25191:823:0;;;;;:::i;:::-;;:::i;38596:32::-;;;;;;;;;;;;;:::i;39436:209::-;;;;;;;;;;;;;:::i;30383:177::-;;;;;;;;;;-1:-1:-1;30383:177:0;;;;;:::i;:::-;;:::i;38451:43::-;;;;;;;;;;;;;:::i;24704:187::-;;;;;;;;;;-1:-1:-1;24704:187:0;;;;;:::i;:::-;;:::i;39742:100::-;;;;;;;;;;-1:-1:-1;39742:100:0;;;;;:::i;:::-;;:::i;38678:26::-;;;;;;;;;;;;;:::i;27522:124::-;;;;;;;;;;-1:-1:-1;27522:124:0;;;;;:::i;:::-;;:::i;38122:81::-;;;;;;;;;;;;;:::i;26522:221::-;;;;;;;;;;-1:-1:-1;26522:221:0;;;;;:::i;:::-;;:::i;2564:103::-;;;;;;;;;;;;;:::i;1913:87::-;;;;;;;;;;;;;:::i;39970:84::-;;;;;;;;;;-1:-1:-1;39970:84:0;;;;;:::i;:::-;;:::i;39850:116::-;;;;;;;;;;-1:-1:-1;39850:116:0;;;;;:::i;:::-;;:::i;27882:104::-;;;;;;;;;;;;;:::i;38635:34::-;;;;;;;;;;;;;:::i;38767:657::-;;;;;;:::i;:::-;;:::i;29560:288::-;;;;;;;;;;-1:-1:-1;29560:288:0;;;;;:::i;:::-;;:::i;30631:355::-;;;;;;;;;;-1:-1:-1;30631:355:0;;;;;:::i;:::-;;:::i;38300:46::-;;;;;;;;;;;;;:::i;40164:362::-;;;;;;;;;;-1:-1:-1;40164:362:0;;;;;:::i;:::-;;:::i;38353:89::-;;;;;;;;;;;;;:::i;38210:83::-;;;;;;;;;;;;;:::i;29919:164::-;;;;;;;;;;-1:-1:-1;29919:164:0;;;;;:::i;:::-;;:::i;40058:96::-;;;;;;;;;;-1:-1:-1;40058:96:0;;;;;:::i;:::-;;:::i;2822:201::-;;;;;;;;;;-1:-1:-1;2822:201:0;;;;;:::i;:::-;;:::i;38501:38::-;;;;;;;;;;;;;:::i;26086:372::-;26188:4;-1:-1:-1;;;;;;26225:40:0;;-1:-1:-1;;;26225:40:0;;:105;;-1:-1:-1;;;;;;;26282:48:0;;-1:-1:-1;;;26282:48:0;26225:105;:172;;;-1:-1:-1;;;;;;;26347:50:0;;-1:-1:-1;;;26347:50:0;26225:172;:225;;;;26414:36;26438:11;26414:23;:36::i;:::-;26205:245;;26086:372;;;;:::o;39653:81::-;2144:12;:10;:12::i;:::-;-1:-1:-1;;;;;2133:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2133:23:0;;2125:68;;;;-1:-1:-1;;;2125:68:0;;;;;;;:::i;:::-;;;;;;;;;39711:6:::1;:15:::0;;-1:-1:-1;;39711:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;39653:81::o;27713:100::-;27767:13;27800:5;27793:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27713:100;:::o;29274:214::-;29342:7;29370:16;29378:7;29370;:16::i;:::-;29362:74;;;;-1:-1:-1;;;29362:74:0;;;;;;;:::i;:::-;-1:-1:-1;29456:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;29456:24:0;;29274:214::o;28795:413::-;28868:13;28884:24;28900:7;28884:15;:24::i;:::-;28868:40;;28933:5;-1:-1:-1;;;;;28927:11:0;:2;-1:-1:-1;;;;;28927:11:0;;;28919:58;;;;-1:-1:-1;;;28919:58:0;;;;;;;:::i;:::-;29028:5;-1:-1:-1;;;;;29012:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;29012:21:0;;:62;;;;29037:37;29054:5;29061:12;:10;:12::i;29037:37::-;28990:169;;;;-1:-1:-1;;;28990:169:0;;;;;;;:::i;:::-;29172:28;29181:2;29185:7;29194:5;29172:8;:28::i;:::-;28795:413;;;:::o;24527:100::-;24580:7;24607:12;24527:100;:::o;30150:162::-;30276:28;30286:4;30292:2;30296:7;30276:9;:28::i;25191:823::-;25280:7;25316:16;25326:5;25316:9;:16::i;:::-;25308:5;:24;25300:71;;;;-1:-1:-1;;;25300:71:0;;;;;;;:::i;:::-;25382:22;25407:13;:11;:13::i;:::-;25382:38;;25431:19;25465:25;25519:9;25514:426;25538:14;25534:1;:18;25514:426;;;25574:31;25608:14;;;:11;:14;;;;;;;;;25574:48;;;;;;;;;-1:-1:-1;;;;;25574:48:0;;;;;-1:-1:-1;;;25574:48:0;;;;;;;;;;;;25641:28;25637:103;;25710:14;;;-1:-1:-1;25637:103:0;25779:5;-1:-1:-1;;;;;25758:26:0;:17;-1:-1:-1;;;;;25758:26:0;;25754:175;;;25824:5;25809:11;:20;25805:77;;;-1:-1:-1;25861:1:0;-1:-1:-1;25854:8:0;;-1:-1:-1;;;25854:8:0;25805:77;25900:13;;;;:::i;:::-;;;;25754:175;-1:-1:-1;25554:3:0;;;;:::i;:::-;;;;25514:426;;;;25950:56;;-1:-1:-1;;;25950:56:0;;;;;;;:::i;25191:823::-;;;;;:::o;38596:32::-;;;;:::o;39436:209::-;2144:12;:10;:12::i;:::-;-1:-1:-1;;;;;2133:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2133:23:0;;2125:68;;;;-1:-1:-1;;;2125:68:0;;;;;;;:::i;:::-;39504:21:::1;39486:15;39555:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;39555:17:0::1;39580:7;39555:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39536:56;;;39611:7;39603:34;;;;-1:-1:-1::0;;;39603:34:0::1;;;;;;;:::i;:::-;2204:1;;39436:209::o:0;30383:177::-;30513:39;30530:4;30536:2;30540:7;30513:39;;;;;;;;;;;;:16;:39::i;38451:43::-;38493:1;38451:43;:::o;24704:187::-;24771:7;24807:13;:11;:13::i;:::-;24799:5;:21;24791:69;;;;-1:-1:-1;;;24791:69:0;;;;;;;:::i;:::-;-1:-1:-1;24878:5:0;24704:187::o;39742:100::-;2144:12;:10;:12::i;:::-;-1:-1:-1;;;;;2133:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2133:23:0;;2125:68;;;;-1:-1:-1;;;2125:68:0;;;;;;;:::i;:::-;39816:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;38678:26::-:0;;;;;;:::o;27522:124::-;27586:7;27613:20;27625:7;27613:11;:20::i;:::-;:25;;27522:124;-1:-1:-1;;27522:124:0:o;38122:81::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26522:221::-;26586:7;-1:-1:-1;;;;;26614:19:0;;26606:75;;;;-1:-1:-1;;;26606:75:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;26707:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;26707:27:0;;26522:221::o;2564:103::-;2144:12;:10;:12::i;:::-;-1:-1:-1;;;;;2133:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2133:23:0;;2125:68;;;;-1:-1:-1;;;2125:68:0;;;;;;;:::i;:::-;2629:30:::1;2656:1;2629:18;:30::i;:::-;2564:103::o:0;1913:87::-;1986:6;;-1:-1:-1;;;;;1986:6:0;1913:87;:::o;39970:84::-;2144:12;:10;:12::i;:::-;-1:-1:-1;;;;;2133:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2133:23:0;;2125:68;;;;-1:-1:-1;;;2125:68:0;;;;;;;:::i;:::-;40034:5:::1;:16:::0;39970:84::o;39850:116::-;2144:12;:10;:12::i;:::-;-1:-1:-1;;;;;2133:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2133:23:0;;2125:68;;;;-1:-1:-1;;;2125:68:0;;;;;;;:::i;:::-;39932:26;;::::1;::::0;:11:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;27882:104::-:0;27938:13;27971:7;27964:14;;;;;:::i;38635:34::-;;;;:::o;38767:657::-;38826:15;38844:12;:10;:12::i;:::-;38876:6;;38826:30;;-1:-1:-1;38876:6:0;;38875:7;38867:26;;;;-1:-1:-1;;;38867:26:0;;;;;;;:::i;:::-;38942:7;38926:13;:11;:13::i;:::-;:23;;;;:::i;:::-;38912:10;;:37;;38904:68;;;;-1:-1:-1;;;38904:68:0;;;;;;;:::i;:::-;39001:1;38991:7;:11;38983:34;;;;-1:-1:-1;;;38983:34:0;;;;;;;:::i;:::-;39036:9;-1:-1:-1;;;;;39036:20:0;;;39028:45;;;;-1:-1:-1;;;39028:45:0;;;;;;;:::i;:::-;39108:13;:11;:13::i;:::-;38588:1;39089:32;39086:291;;39164:7;38493:1;39145:26;;39137:62;;;;-1:-1:-1;;;39137:62:0;;;;;;;:::i;:::-;39086:291;;;39252:7;38538:1;39238:21;;39230:57;;;;-1:-1:-1;;;39230:57:0;;;;;;;:::i;:::-;39329:9;39320:5;;39310:7;:15;;;;:::i;:::-;:28;39302:63;;;;-1:-1:-1;;;39302:63:0;;;;;;;:::i;:::-;39389:27;39399:7;39408;39389:9;:27::i;29560:288::-;29667:12;:10;:12::i;:::-;-1:-1:-1;;;;;29655:24:0;:8;-1:-1:-1;;;;;29655:24:0;;;29647:63;;;;-1:-1:-1;;;29647:63:0;;;;;;;:::i;:::-;29768:8;29723:18;:32;29742:12;:10;:12::i;:::-;-1:-1:-1;;;;;29723:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;29723:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;29723:53:0;;;;;;;;;;;29807:12;:10;:12::i;:::-;-1:-1:-1;;;;;29792:48:0;;29831:8;29792:48;;;;;;:::i;:::-;;;;;;;;29560:288;;:::o;30631:355::-;30790:28;30800:4;30806:2;30810:7;30790:9;:28::i;:::-;30851:48;30874:4;30880:2;30884:7;30893:5;30851:22;:48::i;:::-;30829:149;;;;-1:-1:-1;;;30829:149:0;;;;;;;:::i;:::-;30631:355;;;;:::o;38300:46::-;;;;;;;;;;;;;;-1:-1:-1;;;38300:46:0;;;;:::o;40164:362::-;40230:13;40264:17;40272:8;40264:7;:17::i;:::-;40256:51;;;;-1:-1:-1;;;40256:51:0;;;;;;;:::i;:::-;40349:1;40331:7;40325:21;;;;;:::i;:::-;;;:25;:193;;;;;;;;;;;;;;;;;40407:7;40431:26;40448:8;40431:16;:26::i;:::-;40474:13;;;;;;;;;;;;;-1:-1:-1;;;40474:13:0;;;40374:128;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40318:200;;40164:362;;;:::o;38353:89::-;38400:42;38353:89;:::o;38210:83::-;;;;;;;:::i;29919:164::-;-1:-1:-1;;;;;30040:25:0;;;30016:4;30040:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;29919:164::o;40058:96::-;2144:12;:10;:12::i;:::-;-1:-1:-1;;;;;2133:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2133:23:0;;2125:68;;;;-1:-1:-1;;;2125:68:0;;;;;;;:::i;:::-;40128:10:::1;:22:::0;40058:96::o;2822:201::-;2144:12;:10;:12::i;:::-;-1:-1:-1;;;;;2133:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2133:23:0;;2125:68;;;;-1:-1:-1;;;2125:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2911:22:0;::::1;2903:73;;;;-1:-1:-1::0;;;2903:73:0::1;;;;;;;:::i;:::-;2987:28;3006:8;2987:18;:28::i;:::-;2822:201:::0;:::o;38501:38::-;38538:1;38501:38;:::o;22590:157::-;-1:-1:-1;;;;;;22699:40:0;;-1:-1:-1;;;22699:40:0;22590:157;;;:::o;654:98::-;734:10;654:98;:::o;31241:111::-;31298:4;31332:12;-1:-1:-1;31322:22:0;31241:111::o;35283:196::-;35398:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;35398:29:0;-1:-1:-1;;;;;35398:29:0;;;;;;;;;35443:28;;35398:24;;35443:28;;;;;;;35283:196;;;:::o;33382:1783::-;33497:35;33535:20;33547:7;33535:11;:20::i;:::-;33497:58;;33568:22;33610:13;:18;;;-1:-1:-1;;;;;33594:34:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;33594:34:0;;:87;;;;33669:12;:10;:12::i;:::-;-1:-1:-1;;;;;33645:36:0;:20;33657:7;33645:11;:20::i;:::-;-1:-1:-1;;;;;33645:36:0;;33594:87;:154;;;-1:-1:-1;33715:18:0;;33698:50;;33735:12;:10;:12::i;33698:50::-;33568:181;;33770:17;33762:80;;;;-1:-1:-1;;;33762:80:0;;;;;;;:::i;:::-;33885:4;-1:-1:-1;;;;;33863:26:0;:13;:18;;;-1:-1:-1;;;;;33863:26:0;;33855:77;;;;-1:-1:-1;;;33855:77:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33951:16:0;;33943:66;;;;-1:-1:-1;;;33943:66:0;;;;;;;:::i;:::-;34022:43;34044:4;34050:2;34054:7;34063:1;34022:21;:43::i;:::-;34130:49;34147:1;34151:7;34160:13;:18;;;34130:8;:49::i;:::-;-1:-1:-1;;;;;34384:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;;;;;34384:31:0;;;-1:-1:-1;;;;;34384:31:0;;;-1:-1:-1;;34384:31:0;;;;;;;34430:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;34430:29:0;;;;;;;;;;;;;34506:43;;;;;;;;;;34532:15;34506:43;;;;;;;;;;34483:20;;;:11;:20;;;;;;:66;;;;;;-1:-1:-1;;;;;;34483:66:0;;;;;;;;;-1:-1:-1;;;;34483:66:0;-1:-1:-1;;;34483:66:0;;;;;;;;;;;34384:18;34811:11;;34483:20;;34811:11;:::i;:::-;34878:1;34837:24;;;:11;:24;;;;;:29;34789:33;;-1:-1:-1;;;;;;34837:29:0;34833:227;;34901:20;34909:11;34901:7;:20::i;:::-;34897:152;;;34969:64;;;;;;;;34984:18;;-1:-1:-1;;;;;34969:64:0;;;;;;35004:28;;;;34969:64;;;;;;;;;;-1:-1:-1;34942:24:0;;;:11;:24;;;;;;;:91;;;;;;-1:-1:-1;;;;;;34942:91:0;;;;;;;;;-1:-1:-1;;;;34942:91:0;-1:-1:-1;;;34942:91:0;;;;;;;;;;;;;;34897:152;35096:7;35092:2;-1:-1:-1;;;;;35077:27:0;35086:4;-1:-1:-1;;;;;35077:27:0;;;;;;;;;;;35115:42;35136:4;35142:2;35146:7;35155:1;35115:20;:42::i;:::-;33382:1783;;;;;;:::o;26988:472::-;27049:21;;:::i;:::-;27091:16;27099:7;27091;:16::i;:::-;27083:71;;;;-1:-1:-1;;;27083:71:0;;;;;;;:::i;:::-;27187:7;27167:216;27221:31;27255:17;;;:11;:17;;;;;;;;;27221:51;;;;;;;;;-1:-1:-1;;;;;27221:51:0;;;;;-1:-1:-1;;;27221:51:0;;;;;;;;;;;;27291:28;27287:85;;27347:9;-1:-1:-1;27340:16:0;;-1:-1:-1;27340:16:0;27287:85;-1:-1:-1;27198:6:0;;;;:::i;:::-;;;;27167:216;;3183:191;3276:6;;;-1:-1:-1;;;;;3293:17:0;;;-1:-1:-1;;;;;;3293:17:0;;;;;;;3326:40;;3276:6;;;3293:17;3276:6;;3326:40;;3257:16;;3326:40;3183:191;;:::o;31360:104::-;31429:27;31439:2;31443:8;31429:27;;;;;;;;;;;;:9;:27::i;36044:804::-;36199:4;36220:15;:2;-1:-1:-1;;;;;36220:13:0;;:15::i;:::-;36216:625;;;36272:2;-1:-1:-1;;;;;36256:36:0;;36293:12;:10;:12::i;:::-;36307:4;36313:7;36322:5;36256:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36256:72:0;;;;;;;;-1:-1:-1;;36256:72:0;;;;;;;;;;;;:::i;:::-;;;36252:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36502:13:0;;36498:273;;36545:61;;-1:-1:-1;;;36545:61:0;;;;;;;:::i;36498:273::-;36721:6;36715:13;36706:6;36702:2;36698:15;36691:38;36252:534;-1:-1:-1;;;;;;36379:55:0;-1:-1:-1;;;36379:55:0;;-1:-1:-1;36372:62:0;;36216:625;-1:-1:-1;36825:4:0;36216:625;36044:804;;;;;;:::o;3731:723::-;3787:13;4008:10;4004:53;;-1:-1:-1;4035:10:0;;;;;;;;;;;;-1:-1:-1;;;4035:10:0;;;;;;4004:53;4082:5;4067:12;4123:78;4130:9;;4123:78;;4156:8;;;;:::i;:::-;;-1:-1:-1;4179:10:0;;-1:-1:-1;4187:2:0;4179:10;;:::i;:::-;;;4123:78;;;4211:19;4243:6;4233:17;;;;;;-1:-1:-1;;;4233:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4233:17:0;;4211:39;;4261:154;4268:10;;4261:154;;4295:11;4305:1;4295:11;;:::i;:::-;;-1:-1:-1;4364:10:0;4372:2;4364:5;:10;:::i;:::-;4351:24;;:2;:24;:::i;:::-;4338:39;;4321:6;4328;4321:14;;;;;;-1:-1:-1;;;4321:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;4321:56:0;;;;;;;;-1:-1:-1;4392:11:0;4401:2;4392:11;;:::i;:::-;;;4261:154;;31741:1387;31864:20;31887:12;-1:-1:-1;;;;;31918:16:0;;31910:62;;;;-1:-1:-1;;;31910:62:0;;;;;;;:::i;:::-;32117:21;32125:12;32117:7;:21::i;:::-;32116:22;32108:64;;;;-1:-1:-1;;;32108:64:0;;;;;;;:::i;:::-;32202:1;32191:8;:12;32183:60;;;;-1:-1:-1;;;32183:60:0;;;;;;;:::i;:::-;32256:61;32286:1;32290:2;32294:12;32308:8;32256:21;:61::i;:::-;-1:-1:-1;;;;;32363:16:0;;32330:30;32363:16;;;:12;:16;;;;;;;;;32330:49;;;;;;;;;-1:-1:-1;;;;;32330:49:0;;;;;-1:-1:-1;;;32330:49:0;;;;;;;;;;;32409:135;;;;;;;;32435:19;;32330:49;;32409:135;;;32435:39;;32465:8;;32435:39;:::i;:::-;-1:-1:-1;;;;;32409:135:0;;;;;32524:8;32489:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;32409:135:0;;;;;;-1:-1:-1;;;;;32390:16:0;;;;;;;:12;:16;;;;;;;;:154;;;;;;;;;;-1:-1:-1;;;32390:154:0;;;;-1:-1:-1;;;;;;32390:154:0;;;;;;;;;;;;;;;;;32583:43;;;;;;;;;;;32609:15;32583:43;;;;;;;;32555:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;32555:71:0;-1:-1:-1;;;;32555:71:0;;;;-1:-1:-1;;;;;;32555:71:0;;;;;;;;;;;;;;;32567:12;;32687:325;32711:8;32707:1;:12;32687:325;;;32746:38;;32771:12;;-1:-1:-1;;;;;32746:38:0;;;32763:1;;32746:38;;32763:1;;32746:38;32825:59;32856:1;32860:2;32864:12;32878:5;32825:22;:59::i;:::-;32799:172;;;;-1:-1:-1;;;32799:172:0;;;;;;;:::i;:::-;32986:14;;;;:::i;:::-;;;;32721:3;;;;;:::i;:::-;;;;32687:325;;;-1:-1:-1;33022:12:0;:27;;;33060:60;;33093:2;33097:12;33111:8;33060:20;:60::i;14482:387::-;14805:20;14853:8;;;14482:387::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:607:1;;110:18;151:2;143:6;140:14;137:2;;;157:18;;:::i;:::-;206:2;200:9;279:2;256:17;;-1:-1:-1;;252:31:1;240:44;;286:4;236:55;306:18;;;326:22;;;303:46;300:2;;;352:18;;:::i;:::-;388:2;381:22;436;;;421:6;-1:-1:-1;421:6:1;473:16;;;470:25;-1:-1:-1;467:2:1;;;508:1;505;498:12;467:2;558:6;553:3;546:4;538:6;534:17;521:44;613:1;606:4;597:6;589;585:19;581:30;574:41;;;90:531;;;;;:::o;626:175::-;696:20;;-1:-1:-1;;;;;745:31:1;;735:42;;725:2;;791:1;788;781:12;806:162;873:20;;929:13;;922:21;912:32;;902:2;;958:1;955;948:12;973:198;;1085:2;1073:9;1064:7;1060:23;1056:32;1053:2;;;1106:6;1098;1091:22;1053:2;1134:31;1155:9;1134:31;:::i;:::-;1124:41;1043:128;-1:-1:-1;;;1043:128:1:o;1176:274::-;;;1305:2;1293:9;1284:7;1280:23;1276:32;1273:2;;;1326:6;1318;1311:22;1273:2;1354:31;1375:9;1354:31;:::i;:::-;1344:41;;1404:40;1440:2;1429:9;1425:18;1404:40;:::i;:::-;1394:50;;1263:187;;;;;:::o;1455:342::-;;;;1601:2;1589:9;1580:7;1576:23;1572:32;1569:2;;;1622:6;1614;1607:22;1569:2;1650:31;1671:9;1650:31;:::i;:::-;1640:41;;1700:40;1736:2;1725:9;1721:18;1700:40;:::i;:::-;1690:50;;1787:2;1776:9;1772:18;1759:32;1749:42;;1559:238;;;;;:::o;1802:702::-;;;;;1974:3;1962:9;1953:7;1949:23;1945:33;1942:2;;;1996:6;1988;1981:22;1942:2;2024:31;2045:9;2024:31;:::i;:::-;2014:41;;2074:40;2110:2;2099:9;2095:18;2074:40;:::i;:::-;2064:50;;2161:2;2150:9;2146:18;2133:32;2123:42;;2216:2;2205:9;2201:18;2188:32;2243:18;2235:6;2232:30;2229:2;;;2280:6;2272;2265:22;2229:2;2308:22;;2361:4;2353:13;;2349:27;-1:-1:-1;2339:2:1;;2395:6;2387;2380:22;2339:2;2423:75;2490:7;2485:2;2472:16;2467:2;2463;2459:11;2423:75;:::i;:::-;2413:85;;;1932:572;;;;;;;:::o;2509:268::-;;;2635:2;2623:9;2614:7;2610:23;2606:32;2603:2;;;2656:6;2648;2641:22;2603:2;2684:31;2705:9;2684:31;:::i;:::-;2674:41;;2734:37;2767:2;2756:9;2752:18;2734:37;:::i;2782:266::-;;;2911:2;2899:9;2890:7;2886:23;2882:32;2879:2;;;2932:6;2924;2917:22;2879:2;2960:31;2981:9;2960:31;:::i;:::-;2950:41;3038:2;3023:18;;;;3010:32;;-1:-1:-1;;;2869:179:1:o;3053:192::-;;3162:2;3150:9;3141:7;3137:23;3133:32;3130:2;;;3183:6;3175;3168:22;3130:2;3211:28;3229:9;3211:28;:::i;3250:257::-;;3361:2;3349:9;3340:7;3336:23;3332:32;3329:2;;;3382:6;3374;3367:22;3329:2;3426:9;3413:23;3445:32;3471:5;3445:32;:::i;3512:261::-;;3634:2;3622:9;3613:7;3609:23;3605:32;3602:2;;;3655:6;3647;3640:22;3602:2;3692:9;3686:16;3711:32;3737:5;3711:32;:::i;3778:482::-;;3900:2;3888:9;3879:7;3875:23;3871:32;3868:2;;;3921:6;3913;3906:22;3868:2;3966:9;3953:23;3999:18;3991:6;3988:30;3985:2;;;4036:6;4028;4021:22;3985:2;4064:22;;4117:4;4109:13;;4105:27;-1:-1:-1;4095:2:1;;4151:6;4143;4136:22;4095:2;4179:75;4246:7;4241:2;4228:16;4223:2;4219;4215:11;4179:75;:::i;4265:190::-;;4377:2;4365:9;4356:7;4352:23;4348:32;4345:2;;;4398:6;4390;4383:22;4345:2;-1:-1:-1;4426:23:1;;4335:120;-1:-1:-1;4335:120:1:o;4460:259::-;;4541:5;4535:12;4568:6;4563:3;4556:19;4584:63;4640:6;4633:4;4628:3;4624:14;4617:4;4610:5;4606:16;4584:63;:::i;:::-;4701:2;4680:15;-1:-1:-1;;4676:29:1;4667:39;;;;4708:4;4663:50;;4511:208;-1:-1:-1;;4511:208:1:o;4724:187::-;;4806:5;4800:12;4821:52;4866:6;4861:3;4854:4;4847:5;4843:16;4821:52;:::i;:::-;4889:16;;;;;4776:135;-1:-1:-1;;4776:135:1:o;4916:1258::-;5198:13;;4916:1258;;;;5271:1;5256:17;;5292:1;5328:18;;;;5355:2;;5409:4;5401:6;5397:17;5387:27;;5355:2;5435;5483;5475:6;5472:14;5452:18;5449:38;5446:2;;;-1:-1:-1;;;5510:33:1;;5566:4;5563:1;5556:15;5596:4;5517:3;5584:17;5446:2;5627:18;5654:104;;;;5772:1;5767:324;;;;5620:471;;5654:104;-1:-1:-1;;5687:24:1;;5675:37;;5732:16;;;;-1:-1:-1;5654:104:1;;5767:324;5803:39;5835:6;5803:39;:::i;:::-;5864:3;5880:165;5894:6;5891:1;5888:13;5880:165;;;5972:14;;5959:11;;;5952:35;6015:16;;;;5909:10;;5880:165;;;5884:3;;6074:6;6069:3;6065:16;6058:23;;5620:471;;;;;;;6107:61;6135:32;6163:3;6155:6;6135:32;:::i;:::-;6127:6;6107:61;:::i;:::-;6100:68;5148:1026;-1:-1:-1;;;;;;5148:1026:1:o;6179:205::-;6379:3;6370:14::o;6389:203::-;-1:-1:-1;;;;;6553:32:1;;;;6535:51;;6523:2;6508:18;;6490:102::o;6597:490::-;-1:-1:-1;;;;;6866:15:1;;;6848:34;;6918:15;;6913:2;6898:18;;6891:43;6965:2;6950:18;;6943:34;;;7013:3;7008:2;6993:18;;6986:31;;;6597:490;;7034:47;;7061:19;;7053:6;7034:47;:::i;7092:187::-;7257:14;;7250:22;7232:41;;7220:2;7205:18;;7187:92::o;7284:221::-;;7433:2;7422:9;7415:21;7453:46;7495:2;7484:9;7480:18;7472:6;7453:46;:::i;7510:398::-;7712:2;7694:21;;;7751:2;7731:18;;;7724:30;7790:34;7785:2;7770:18;;7763:62;-1:-1:-1;;;7856:2:1;7841:18;;7834:32;7898:3;7883:19;;7684:224::o;7913:329::-;8115:2;8097:21;;;8154:1;8134:18;;;8127:29;-1:-1:-1;;;8187:2:1;8172:18;;8165:36;8233:2;8218:18;;8087:155::o;8247:402::-;8449:2;8431:21;;;8488:2;8468:18;;;8461:30;8527:34;8522:2;8507:18;;8500:62;-1:-1:-1;;;8593:2:1;8578:18;;8571:36;8639:3;8624:19;;8421:228::o;8654:406::-;8856:2;8838:21;;;8895:2;8875:18;;;8868:30;8934:34;8929:2;8914:18;;8907:62;-1:-1:-1;;;9000:2:1;8985:18;;8978:40;9050:3;9035:19;;8828:232::o;9065:334::-;9267:2;9249:21;;;9306:2;9286:18;;;9279:30;-1:-1:-1;;;9340:2:1;9325:18;;9318:40;9390:2;9375:18;;9239:160::o;9404:346::-;9606:2;9588:21;;;9645:2;9625:18;;;9618:30;-1:-1:-1;;;9679:2:1;9664:18;;9657:52;9741:2;9726:18;;9578:172::o;9755:399::-;9957:2;9939:21;;;9996:2;9976:18;;;9969:30;10035:34;10030:2;10015:18;;10008:62;-1:-1:-1;;;10101:2:1;10086:18;;10079:33;10144:3;10129:19;;9929:225::o;10159:401::-;10361:2;10343:21;;;10400:2;10380:18;;;10373:30;10439:34;10434:2;10419:18;;10412:62;-1:-1:-1;;;10505:2:1;10490:18;;10483:35;10550:3;10535:19;;10333:227::o;10565:346::-;10767:2;10749:21;;;10806:2;10786:18;;;10779:30;-1:-1:-1;;;10840:2:1;10825:18;;10818:52;10902:2;10887:18;;10739:172::o;10916:421::-;11118:2;11100:21;;;11157:2;11137:18;;;11130:30;11196:34;11191:2;11176:18;;11169:62;11267:27;11262:2;11247:18;;11240:55;11327:3;11312:19;;11090:247::o;11342:342::-;11544:2;11526:21;;;11583:2;11563:18;;;11556:30;-1:-1:-1;;;11617:2:1;11602:18;;11595:48;11675:2;11660:18;;11516:168::o;11689:407::-;11891:2;11873:21;;;11930:2;11910:18;;;11903:30;11969:34;11964:2;11949:18;;11942:62;-1:-1:-1;;;12035:2:1;12020:18;;12013:41;12086:3;12071:19;;11863:233::o;12101:345::-;12303:2;12285:21;;;12342:2;12322:18;;;12315:30;-1:-1:-1;;;12376:2:1;12361:18;;12354:51;12437:2;12422:18;;12275:171::o;12451:402::-;12653:2;12635:21;;;12692:2;12672:18;;;12665:30;12731:34;12726:2;12711:18;;12704:62;-1:-1:-1;;;12797:2:1;12782:18;;12775:36;12843:3;12828:19;;12625:228::o;12858:356::-;13060:2;13042:21;;;13079:18;;;13072:30;13138:34;13133:2;13118:18;;13111:62;13205:2;13190:18;;13032:182::o;13219:350::-;13421:2;13403:21;;;13460:2;13440:18;;;13433:30;13499:28;13494:2;13479:18;;13472:56;13560:2;13545:18;;13393:176::o;13574:414::-;13776:2;13758:21;;;13815:2;13795:18;;;13788:30;13854:34;13849:2;13834:18;;13827:62;-1:-1:-1;;;13920:2:1;13905:18;;13898:48;13978:3;13963:19;;13748:240::o;13993:346::-;14195:2;14177:21;;;14234:2;14214:18;;;14207:30;-1:-1:-1;;;14268:2:1;14253:18;;14246:52;14330:2;14315:18;;14167:172::o;14344:398::-;14546:2;14528:21;;;14585:2;14565:18;;;14558:30;14624:34;14619:2;14604:18;;14597:62;-1:-1:-1;;;14690:2:1;14675:18;;14668:32;14732:3;14717:19;;14518:224::o;14747:399::-;14949:2;14931:21;;;14988:2;14968:18;;;14961:30;15027:34;15022:2;15007:18;;15000:62;-1:-1:-1;;;15093:2:1;15078:18;;15071:33;15136:3;15121:19;;14921:225::o;15151:415::-;15353:2;15335:21;;;15392:2;15372:18;;;15365:30;15431:34;15426:2;15411:18;;15404:62;-1:-1:-1;;;15497:2:1;15482:18;;15475:49;15556:3;15541:19;;15325:241::o;15571:353::-;15773:2;15755:21;;;15812:2;15792:18;;;15785:30;15851:31;15846:2;15831:18;;15824:59;15915:2;15900:18;;15745:179::o;15929:397::-;16131:2;16113:21;;;16170:2;16150:18;;;16143:30;16209:34;16204:2;16189:18;;16182:62;-1:-1:-1;;;16275:2:1;16260:18;;16253:31;16316:3;16301:19;;16103:223::o;16331:338::-;16533:2;16515:21;;;16572:2;16552:18;;;16545:30;-1:-1:-1;;;16606:2:1;16591:18;;16584:44;16660:2;16645:18;;16505:164::o;16674:410::-;16876:2;16858:21;;;16915:2;16895:18;;;16888:30;16954:34;16949:2;16934:18;;16927:62;-1:-1:-1;;;17020:2:1;17005:18;;16998:44;17074:3;17059:19;;16848:236::o;17505:409::-;17707:2;17689:21;;;17746:2;17726:18;;;17719:30;17785:34;17780:2;17765:18;;17758:62;-1:-1:-1;;;17851:2:1;17836:18;;17829:43;17904:3;17889:19;;17679:235::o;17919:336::-;18121:2;18103:21;;;18160:2;18140:18;;;18133:30;-1:-1:-1;;;18194:2:1;18179:18;;18172:42;18246:2;18231:18;;18093:162::o;18260:177::-;18406:25;;;18394:2;18379:18;;18361:76::o;18442:129::-;;18510:17;;;18560:4;18544:21;;;18500:71::o;18576:253::-;;-1:-1:-1;;;;;18705:2:1;18702:1;18698:10;18735:2;18732:1;18728:10;18766:3;18762:2;18758:12;18753:3;18750:21;18747:2;;;18774:18;;:::i;:::-;18810:13;;18624:205;-1:-1:-1;;;;18624:205:1:o;18834:128::-;;18905:1;18901:6;18898:1;18895:13;18892:2;;;18911:18;;:::i;:::-;-1:-1:-1;18947:9:1;;18882:80::o;18967:120::-;;19033:1;19023:2;;19038:18;;:::i;:::-;-1:-1:-1;19072:9:1;;19013:74::o;19092:168::-;;19198:1;19194;19190:6;19186:14;19183:1;19180:21;19175:1;19168:9;19161:17;19157:45;19154:2;;;19205:18;;:::i;:::-;-1:-1:-1;19245:9:1;;19144:116::o;19265:125::-;;19333:1;19330;19327:8;19324:2;;;19338:18;;:::i;:::-;-1:-1:-1;19375:9:1;;19314:76::o;19395:258::-;19467:1;19477:113;19491:6;19488:1;19485:13;19477:113;;;19567:11;;;19561:18;19548:11;;;19541:39;19513:2;19506:10;19477:113;;;19608:6;19605:1;19602:13;19599:2;;;-1:-1:-1;;19643:1:1;19625:16;;19618:27;19448:205::o;19658:136::-;;19725:5;19715:2;;19734:18;;:::i;:::-;-1:-1:-1;;;19770:18:1;;19705:89::o;19799:380::-;19884:1;19874:12;;19931:1;19921:12;;;19942:2;;19996:4;19988:6;19984:17;19974:27;;19942:2;20049;20041:6;20038:14;20018:18;20015:38;20012:2;;;20095:10;20090:3;20086:20;20083:1;20076:31;20130:4;20127:1;20120:15;20158:4;20155:1;20148:15;20012:2;;19854:325;;;:::o;20184:135::-;;-1:-1:-1;;20244:17:1;;20241:2;;;20264:18;;:::i;:::-;-1:-1:-1;20311:1:1;20300:13;;20231:88::o;20324:112::-;;20382:1;20372:2;;20387:18;;:::i;:::-;-1:-1:-1;20421:9:1;;20362:74::o;20441:127::-;20502:10;20497:3;20493:20;20490:1;20483:31;20533:4;20530:1;20523:15;20557:4;20554:1;20547:15;20573:127;20634:10;20629:3;20625:20;20622:1;20615:31;20665:4;20662:1;20655:15;20689:4;20686:1;20679:15;20705:127;20766:10;20761:3;20757:20;20754:1;20747:31;20797:4;20794:1;20787:15;20821:4;20818:1;20811:15;20837:133;-1:-1:-1;;;;;;20913:32:1;;20903:43;;20893:2;;20960:1;20957;20950:12

Swarm Source

ipfs://7fdcc84fe0e207a4ece0edf25afa95dbbbdb9fa9d440fc5252d1b05f768740cf
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.