ETH Price: $3,118.22 (+0.65%)
Gas: 6 Gwei

Token

Purr Evil (PURREVIL)
 

Overview

Max Total Supply

1,136 PURREVIL

Holders

424

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 PURREVIL
0x8001edaf71dc22df812d906758754218b93b9aed
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

PURR EVIL extends the classic 1/1 [PURR EVIL ORIGINS](https://opensea.io/collection/purrevilorigins/) collection with 1,135 randomly generated and stylistically curated demonic C∀Ts. Each C∀T has its own rarity and evilness, which are separate characteristics! Some C∀Ts are ...

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
PurrEvil

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 2021-09-17
*/

// SPDX-License-Identifier: MIT

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



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


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

pragma solidity ^0.8.0;
/**
 * @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;
    }
}

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;
/**
 * @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);
}

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

// File: @openzeppelin/contracts/utils/math/SafeMath.sol



pragma solidity ^0.8.0;
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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



pragma solidity ^0.8.0;


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

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

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



// File: @openzeppelin/contracts/utils/Strings.sol
pragma solidity ^0.8.0;
/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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




pragma solidity ^0.8.0;
/**
 * @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);
}



// File: @openzeppelin/contracts/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/token/ERC721/ERC721.sol
pragma solidity ^0.8.0;
/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // 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;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @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 ||
            super.supportsInterface(interfaceId);
    }

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @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 virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: 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 virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: 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`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

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

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

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * 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
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), 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.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

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



pragma solidity ^0.8.0;
/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}


// File: @openzeppelin/contracts/access/Ownable.sol
pragma solidity ^0.8.0;
/**
 * @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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: contracts/PurrEvil.sol
/*
kkOOkkOOOOOkkxddddkkOOOOkkkkkOOkkkOOOOkkkkOOOkkkkOOOkkOkkOkkOkkkkkOOkOOOkkOOkOOkOOkkOkkOOkkOOkOOkOOO
kkOOd;;llc;,......,cxOkkOkkkkOOkkOkkkkkkkkOOkOOOkOOOOOOOkkOOkOkkOkl:lllc:::lxOkkOOkkOkkOOOkOOOOOOOOO
OOOOc.      ...''...,dOxldkkOOOOkOxxkOkkkOOOxl:;,,;;;;;lxkOOkkOkl'   ..'....'lkOOOkOOOkOOkkOOkOOkkkk
OOOO:  ..';:loxkkl. .cOo...:xOOOOk:.ckkkkkkOc           .,:okOkkl.   .'..... .ckOOkkkkkOOkkOkkOOkkkk
OkOk:  'xkOOOOOkOo.  'd:   .lOkkxx; .ckkkkOk, .looooodl.  ..lkkOo.   'lccc,.  'dOkOOOOOOkkOOOkkOOOOO
OkOk;  'xOOkkkOOd,.  .l;   .;xxdxx:  ':cdxkx, 'dOkOOkOOx,   ,xOOx'   ,xOkOk;  .lOkOOOOOOOkkOOOOOOOOO
kkOk;  .oOkkkkko' .. 'dc.   .cddxxl. .''cxxx: .cOOkkOkkko.  'xOkk;   .dOkOk:  .oOkOOOOOOOOOOOOOOOOOO
kkkk:   cOkxo:'.   .,okd,    ,dddxo.  ..,ddxl. ,xkxxxxddc. .okkkkc.  .lOko:.  ,xOkkOkkkOOOOkOOOOkkkk
kkkOl.  'c;.    ..;oxxxxl.   .ldddo'  ..'ldxo' .colllol'  .ckkkkOd.   ;l:,'. .lOkkkOkkkkkkkkOOkkkkkk
kkkOx'  .,,..';coxkkxxxdd:.   :ddoo;  ...:odd;  .......  'ldxkkkkk;   ...... ;kOkkkkkkkkkddkxxxxxkkx
kkkkkc. .ckxkkkkxkkxddddoo,   'lolc:. ...:lodc.   ...   .cdddxkkxxc.    ..  .cxkkxxkkxxxxdoooldddxdd
kkkkkd.  ,oddxxdxxxdoodoodl.   ;l:::.   .:cloo'  ':::,.  .coodxxddo'   ..    .;oxdxkxxxddolllloooddd
kkkxkk;  .:oddooxxdolooooodc.  .,::;.   '::loo;  .;;::;.  .;lodddoo;   .c:.    .cdxxddxooocclllooooo
kkxxkkc.  ,oddoldxdllloooooo:.   .''.  .,;:clo:. ..,::::,.  .:lloll:.  .:lc;.   .,ododdlclcccccllloo
kxdodxc.  .lolclodolllloolool;.        .;;;:cc:.   .::::;,.   .;cllc.  .;llol;.   .;ldolcllccccccllo
xoooooc;,..:lc:loolcclllolllll:.      .,;;;:::;.   .;:::;;;'.   'cll;.  ,clllll,.   .clc:clcccccccll
dllllc:::'.,cc:clcccccccllllllcc;....',;;;;;:::,...,;;:::;;;;...,cllc,  ,cccccc:;'.  .,:::clccccccll
occc:;;;::'':c::::ccccc'.;ccllc:;;;,;;;;;;;;::::;;;;;;::;;,;:;',;:cllc. 'c:::::;;::,. .;::clccccccll
:;:;;;;;:cc:cc::::cccc,. .;ccc:;;;;;;;;;;;;;::;;;;;;;;;:;;;;;;;;:::ccc;.,c:::;;;;::::;,;:;:ccccccccl
;.....,:clccc:::::::c,.   ':::;,;;;;;,;;;;;;;;;;;;;;;;;;;;;;;;;::::ccccc:cc::;;;;::;;;;;;;:ccccccccc
,... ..,cccc:::cc:;;,.    ':;',;;:;,,;;;;;;;;;;;;;,,,;;;;;;;;;;:::::cccc:c:;,;;;;;;;;;;;;;;:::::::cc
,. ''. ..;:c:::c:;'.   .. ':,..';;;,;;;;;;;,.';;;;,,,;,,,;;;;;;:::::ccc:::'..';;;;;;;;;;;;;;;;;;;::c
,. .;;. ..,::::;'.   .,;. .;,. .,;,,;;;;;;,. .;;,,,,,,,,,;;;;;;;;:::cc:;;;.. .',;;;;;;;;;;;;;;;;;;::
,'. ':,..,'',;,.   .';;. .';,. .';,;;;;;;;.  .;;,,,,,,,,,,,;;;;;:::::::;,,..  .,;;;;;;;;;;;;;;;;;;;:
,,'. ......  ...   .... .',,,.  .,;;;;;;;'  .';;,,'''................',;,,..  .;;;;;;;;;;;;;;;;;;;;;
,;,.               .....,,,,,.  .,;;;;;;;.  .,'..                   ..',,,..  .;;,;;;;;;;;;;;;;;;;;;
,;,.    .......'',,,,,,,,,,,,.   ';;,;,;,.  .'.             .....'',;,,,,,.   .;;,;;;;;;;;,;;;;;;;;;
,;,.   .,;;;;;,,;;;,,,,,,,,,,'   .;;,,,,.   ',.........    .,,;;,,;;;,,,,,.   .;,,;;;;;;,,,;;;;;;;;;
;;;.   .,;;;;;,;;;;,,,,,,,,,,,.  .,,,,;,.  .,,,,,,,,,,,.   .,,,,,,;;,,,,,,.   .,,,;;;;,,,,,;;;;;;;,;
;;;.   .';;;;;,;;;,,,,,,,,,,,,.  .';,;,.   .,,,,,,,,,,,.   .',,,,,,,,,,,,,.   .,,,,,,,,,,,,;;;;;;;;,
,;;'   .';,;;;,;;,,,,,,,,,,,,,'.  .,;;'.   .,,,,,,,,,,,.   .',,,,,,,,,,,,,.   .,,,,,,,,,,,,,;;;;;;;;
;;;'    ';,,;;,,,,,,,,,,,,,,,,,.  ..''.   .',,,,,,,,,,,'    .,,,,,,,,,,,,,.   .,,,,,,,,,,,,,;;;;;;;;
;;;,.   ........''...',,,,,,,,,..    ..   .,,,,,,,,,,,,'.   .,,,,,,,,,,,,,.   .',,,,,,,,,,,,,,;;;,,,
;;;,.               ..',,,,,,,,'.         ',,,,,,,,,,,,,.   .,,,,,,,,,,,,,'    ',,,,,,,,,,,,,,;;;,,,
;;;,.    ..........'',,,,,,,,,,,'.       .,,,,,,,,,,,,,,.   .',,,,,,,,,,,,'    .,,,,,,,,,,,,,,;;,,,,
,;;,.  ..';;;,;,,,,,,,,,,,,,,,,,,.       .,,,,,,,,,,,,,,.    .,,,,,,,,,,,,'     .,,,,,,,,,,,,,;,,,,,
,;;,.  ..';,,,,,,,,,,,,,,,,,,,,,,'.     .',,,,,,,,,,,,,,.    .,,,'','',,,,'.    .,,,,,,,,,,,,,,,,,,,
;;;'    .',,,,,,,,,,,,,,,,,,,,,,,,.     .,,,,,,,,,,,,,,,'.    ..   ...',,,,..   .,,,,,'''''..''',,,,
;;,.     .,,,,,,,,,,,,,,,,,,,,,,,,,.    ',,,,,,,,,,,,,'..         .....',,,'.    ...           ....,
;;,.     .,,,,,,,,,,,,,,,,,,,,,,,,,'.  .,,,,,,,,,''...         .......'',,,..           .......''',,
;;,.         .............,,,,,,,,,,,. .,,,,,,,,,...    ........'',,,,,,,,,,'.  ......',,,,;;;,,,,,,
;;,,'. .                .',,,,,,,,,,,'.',,,,,,,,'........'''',,,;,,,;,,,,,,,,'',,,,;;;;;;;,,;;,,,,;;
,,,,,.....'''''.........',,,,,,,,,,,,,,,,,,,,,,,,,,,,,;;,;,,,,,,;;,,,;,,,,,,,,;;,,,,,;;;;;,;;;;,,;;;
,,,,,,,;;,,,,,,,,,;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;,,,,,,,,,,,,,,,;;,,,,,,;,,,;,,,;;;;;;;;;;;;;;;
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;;;,,,,;,,,,;;,,,,,;;,;;;;;;;;;
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;,,;;;;,,,,,;;,,,,;,,;;;,,;;;
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;;;;;;;;,,,,,,,;;,,,,;,,;;;;,,,,
*/


pragma solidity ^0.8.0;

interface PurrEvilInterface {
    function addToWhiteList(address[] calldata addresses) external;

    function onWhiteList(address addr) external returns (bool);

    function removeFromWhiteList(address[] calldata addresses) external;

    function whiteListClaimedBy(address owner) external returns (uint256);

    function mint(uint256 numberOfTokens) external payable;

    function mintWhiteList(uint256 numberOfTokens) external;

    function setIsPublicSaleActive(bool isPublicSaleActive) external;

    function setIsWhiteListActive(bool isWhiteListActive) external;

    function setwhiteListMaxMint(uint256 maxMint) external;

    function withdraw() external;
}

pragma solidity ^0.8.0;

contract PurrEvil is ERC721Enumerable, Ownable, PurrEvilInterface {
    using Strings for uint256;

    string public provenance = "";
    uint256 public constant PurrEvil_RESERVE = 99;
    uint256 public constant PurrEvil_MAX = 9900;
    uint256 public constant PurrEvil_MAX_MINT = PurrEvil_RESERVE + PurrEvil_MAX;
    uint256 public constant PURCHASE_LIMIT = 10;
    uint256 public PRICE = 0.05 ether;

    uint256 public whiteListMaxMint = 1;

    uint256 public totalGiftSupply;
    uint256 public totalPublicSupply;

    bool public isPublicSaleActive = false;
    bool public isWhiteListActive = false;

    mapping(address => bool) private _whiteList;
    mapping(address => uint256) private _whiteListClaimed;

    string private _baseURIExtended;
    string private _baseURInoBGExtended;
    mapping (uint256 => string) _tokenURIs;
    mapping (uint256 => string) _tokenURIsnoBG;

    constructor() ERC721("Purr Evil","PURREVIL") {
    }
    
    function addToWhiteList(address[] calldata addresses) external override onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            require(addresses[i] != address(0), "Can't add the null address");

            _whiteList[addresses[i]] = true;
            _whiteListClaimed[addresses[i]] > 0 ? _whiteListClaimed[addresses[i]] : 0;
        }
    }

    function onWhiteList(address addr) external view override returns (bool) {
        return _whiteList[addr];
    }

    function removeFromWhiteList(address[] calldata addresses) external override onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            require(addresses[i] != address(0), "Can't remove the null address");

            _whiteList[addresses[i]] = false;
        }
    }

    function whiteListClaimedBy(address owner) external view override returns (uint256){
        require(owner != address(0), 'Zero address not on White List');

        return _whiteListClaimed[owner];
    }

    function mint(uint256 numberOfTokens) external override payable {
        require(isPublicSaleActive, 'Public sale is not active');
        require(totalSupply() < PurrEvil_MAX_MINT, 'All tokens have been minted');
        require(numberOfTokens <= PURCHASE_LIMIT, 'Would exceed purchase limit of 10');
        require(totalPublicSupply < PurrEvil_MAX, 'Purchase would exceed maximum public supply');
        require(PRICE * numberOfTokens <= msg.value, 'ETH amount is not sufficient');

        for (uint256 i = 0; i < numberOfTokens; i++) {
            if (totalPublicSupply < PurrEvil_MAX) {
                uint256 tokenId = PurrEvil_RESERVE + totalPublicSupply + 1;

                totalPublicSupply += 1;
                _safeMint(msg.sender, tokenId);
            }
        }
    }

    function mintWhiteList(uint256 numberOfTokens) external override {
        require(isWhiteListActive, 'White List is not active');
        require(_whiteList[msg.sender], 'You are not on the White List');
        require(totalSupply() < PurrEvil_MAX_MINT, 'All cats have been minted');
        require(numberOfTokens <= whiteListMaxMint, 'Cannot purchase this many cats');
        require(totalPublicSupply + numberOfTokens <= PurrEvil_MAX, 'Purchase would exceed maximum public supply');
        require(_whiteListClaimed[msg.sender] + numberOfTokens <= whiteListMaxMint, 'You have already minted allowed maximum of 1');
        //require(PRICE * numberOfTokens <= msg.value, 'ETH amount is not sufficient');

        for (uint256 i = 0; i < numberOfTokens; i++) {
            uint256 tokenId = PurrEvil_RESERVE + totalPublicSupply + 1;

            totalPublicSupply += 1;
            _whiteListClaimed[msg.sender] += 1;
            _safeMint(msg.sender, tokenId);
        }
    }

    function mintReserve(uint256 _count, address _to) public onlyOwner {
        require(totalSupply() < PurrEvil_MAX_MINT, 'All tokens have been minted');
        require(totalGiftSupply + _count <= PurrEvil_RESERVE, 'Not enough tokens left to reserve');

        for(uint256 i = 0; i < _count; i++) {
            uint256 tokenId = totalGiftSupply + 1;

            totalGiftSupply += 1;
            _safeMint(_to, tokenId);
        }
    }

    function setIsPublicSaleActive (bool _isPublicSaleActive) external override onlyOwner {
        isPublicSaleActive = _isPublicSaleActive;
    }

    function setIsWhiteListActive(bool _isWhiteListActive) external override onlyOwner {
        isWhiteListActive = _isWhiteListActive;
    }

    function setwhiteListMaxMint(uint256 maxMint) external override onlyOwner {
        whiteListMaxMint = maxMint;
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseURIExtended;
    }
    
    function _baseURInoBG() internal view virtual returns (string memory) {
        return _baseURInoBGExtended;
    }

    // Sets base URI for all tokens, only able to be called by contract owner
    function setBaseURI(string memory baseURI_) external onlyOwner {
        _baseURIExtended = baseURI_;
    }

    // Sets base URI for images without background for all tokens, only able to be called by contract owner
    function setBaseURI_noBG(string memory baseURInoBG_) external onlyOwner {
        _baseURInoBGExtended = baseURInoBG_;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(base, tokenId.toString()));
    }
    
    function tokenURInoBG(uint256 tokenId) public view virtual returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory _tokenURInoBG = _tokenURIsnoBG[tokenId];
        string memory basenoBG = _baseURInoBG();

        // If there is no base URI, return the token URI.
        if (bytes(basenoBG).length == 0) {
            return _tokenURInoBG;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURInoBG).length > 0) {
            return string(abi.encodePacked(basenoBG, _tokenURInoBG,".png"));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(basenoBG, tokenId.toString(),".png"));
    }


  //only owner
  function setPrice(uint256 _newPrice) public onlyOwner() {
    PRICE = _newPrice;
  }
  
  
    // Set the provenanceHash
  function setProvenanceHash(string memory provenanceHash) external onlyOwner {
    provenance = provenanceHash;
  }
 
     //Withdraw to owner
  function withdraw() external override onlyOwner {
    uint256 balance = address(this).balance;

    payable(msg.sender).transfer(balance);
  } 
}

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":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PURCHASE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PurrEvil_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PurrEvil_MAX_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PurrEvil_RESERVE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToWhiteList","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhiteListActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"mintReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"onWhiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"provenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"removeFromWhiteList","outputs":[],"stateMutability":"nonpayable","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":"baseURInoBG_","type":"string"}],"name":"setBaseURI_noBG","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isPublicSaleActive","type":"bool"}],"name":"setIsPublicSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isWhiteListActive","type":"bool"}],"name":"setIsWhiteListActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxMint","type":"uint256"}],"name":"setwhiteListMaxMint","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURInoBG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalGiftSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPublicSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"whiteListClaimedBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040819052600060808190526200001b91600b9162000125565b5066b1a2bc2ec50000600c556001600d556010805461ffff191690553480156200004457600080fd5b506040805180820182526009815268141d5c9c88115d9a5b60ba1b602080830191825283518085019094526008845267141554949155925360c21b908401528151919291620000969160009162000125565b508051620000ac90600190602084019062000125565b505050620000c9620000c3620000cf60201b60201c565b620000d3565b62000208565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200013390620001cb565b90600052602060002090601f016020900481019282620001575760008555620001a2565b82601f106200017257805160ff1916838001178555620001a2565b82800160010185558215620001a2579182015b82811115620001a257825182559160200191906001019062000185565b50620001b0929150620001b4565b5090565b5b80821115620001b05760008155600101620001b5565b600281046001821680620001e057607f821691505b602082108114156200020257634e487b7160e01b600052602260045260246000fd5b50919050565b6131a480620002186000396000f3fe60806040526004361061027d5760003560e01c806366d27c301161014f578063a22cb465116100c1578063d3ea6ceb1161007a578063d3ea6ceb1461071a578063d6f407c71461073a578063d75e61101461074f578063e6a5931e14610764578063e985e9c514610779578063f2fde38b146107995761027d565b8063a22cb4651461065a578063aa1df13f1461067a578063b11560c51461069a578063b22d0c83146106ba578063b88d4fde146106da578063c87b56dd146106fa5761027d565b8063850dd09111610113578063850dd091146105c85780638d859f3e146105e85780638da5cb5b146105fd57806391b7f5ed1461061257806395d89b4114610632578063a0712d68146106475761027d565b806366d27c301461054957806370a082311461055e578063715018a61461057e578063740d73f3146105935780637cdd702e146105b35761027d565b806323b872dd116101f357806342842e0e116101ac57806342842e0e1461049457806349ec975b146104b45780634f6ccce7146104d457806355f804b3146104f4578063573f5dae146105145780636352211e146105295761027d565b806323b872dd146103ea57806328cad13d1461040a5780632e6bf90e1461042a5780632f745c591461043f5780632fd0c6221461045f5780633ccfd60b1461047f5761027d565b80631096952311610245578063109695231461033e578063165c08641461035e57806318160ddd146103805780631984b286146103955780631e84c413146103b557806320b4aa1f146103ca5761027d565b806301ffc9a71461028257806306fdde03146102b8578063081812fc146102da578063095ea7b3146103075780630f7309e814610329575b600080fd5b34801561028e57600080fd5b506102a261029d366004612619565b6107b9565b6040516102af91906127bb565b60405180910390f35b3480156102c457600080fd5b506102cd6107e6565b6040516102af91906127c6565b3480156102e657600080fd5b506102fa6102f5366004612697565b610878565b6040516102af919061276a565b34801561031357600080fd5b50610327610322366004612567565b6108c4565b005b34801561033557600080fd5b506102cd61095c565b34801561034a57600080fd5b50610327610359366004612651565b6109ea565b34801561036a57600080fd5b50610373610a40565b6040516102af9190613015565b34801561038c57600080fd5b50610373610a46565b3480156103a157600080fd5b506103736103b0366004612437565b610a4c565b3480156103c157600080fd5b506102a2610a90565b3480156103d657600080fd5b506103276103e5366004612697565b610a99565b3480156103f657600080fd5b5061032761040536600461248a565b610add565b34801561041657600080fd5b506103276104253660046125ff565b610b15565b34801561043657600080fd5b50610373610b67565b34801561044b57600080fd5b5061037361045a366004612567565b610b6c565b34801561046b57600080fd5b5061032761047a366004612651565b610bbe565b34801561048b57600080fd5b50610327610c10565b3480156104a057600080fd5b506103276104af36600461248a565b610c7e565b3480156104c057600080fd5b506103276104cf3660046125ff565b610c99565b3480156104e057600080fd5b506103736104ef366004612697565b610cf2565b34801561050057600080fd5b5061032761050f366004612651565b610d4d565b34801561052057600080fd5b506102a2610d9f565b34801561053557600080fd5b506102fa610544366004612697565b610dad565b34801561055557600080fd5b50610373610de2565b34801561056a57600080fd5b50610373610579366004612437565b610df2565b34801561058a57600080fd5b50610327610e36565b34801561059f57600080fd5b506103276105ae366004612590565b610e81565b3480156105bf57600080fd5b50610373611062565b3480156105d457600080fd5b506103276105e33660046126af565b611068565b3480156105f457600080fd5b5061037361115b565b34801561060957600080fd5b506102fa611161565b34801561061e57600080fd5b5061032761062d366004612697565b611170565b34801561063e57600080fd5b506102cd6111b4565b610327610655366004612697565b6111c3565b34801561066657600080fd5b5061032761067536600461253e565b6112f4565b34801561068657600080fd5b50610327610695366004612697565b6113c2565b3480156106a657600080fd5b506103276106b5366004612590565b61155b565b3480156106c657600080fd5b506102a26106d5366004612437565b611678565b3480156106e657600080fd5b506103276106f53660046124c5565b611696565b34801561070657600080fd5b506102cd610715366004612697565b6116d5565b34801561072657600080fd5b506102cd610735366004612697565b611818565b34801561074657600080fd5b5061037361192b565b34801561075b57600080fd5b50610373611931565b34801561077057600080fd5b50610373611936565b34801561078557600080fd5b506102a2610794366004612458565b61193c565b3480156107a557600080fd5b506103276107b4366004612437565b61196a565b60006001600160e01b0319821663780e9d6360e01b14806107de57506107de826119db565b90505b919050565b6060600080546107f5906130ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610821906130ac565b801561086e5780601f106108435761010080835404028352916020019161086e565b820191906000526020600020905b81548152906001019060200180831161085157829003601f168201915b5050505050905090565b600061088382611a1b565b6108a85760405162461bcd60e51b815260040161089f90612d42565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108cf82610dad565b9050806001600160a01b0316836001600160a01b031614156109035760405162461bcd60e51b815260040161089f90612e92565b806001600160a01b0316610915611a38565b6001600160a01b03161480610931575061093181610794611a38565b61094d5760405162461bcd60e51b815260040161089f90612be6565b6109578383611a3c565b505050565b600b8054610969906130ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610995906130ac565b80156109e25780601f106109b7576101008083540402835291602001916109e2565b820191906000526020600020905b8154815290600101906020018083116109c557829003601f168201915b505050505081565b6109f2611a38565b6001600160a01b0316610a03611161565b6001600160a01b031614610a295760405162461bcd60e51b815260040161089f90612d8e565b8051610a3c90600b906020840190612307565b5050565b6126ac81565b60085490565b60006001600160a01b038216610a745760405162461bcd60e51b815260040161089f90612fa7565b506001600160a01b031660009081526012602052604090205490565b60105460ff1681565b610aa1611a38565b6001600160a01b0316610ab2611161565b6001600160a01b031614610ad85760405162461bcd60e51b815260040161089f90612d8e565b600d55565b610aee610ae8611a38565b82611aaa565b610b0a5760405162461bcd60e51b815260040161089f90612ed3565b610957838383611b2f565b610b1d611a38565b6001600160a01b0316610b2e611161565b6001600160a01b031614610b545760405162461bcd60e51b815260040161089f90612d8e565b6010805460ff1916911515919091179055565b606381565b6000610b7783610df2565b8210610b955760405162461bcd60e51b815260040161089f9061287e565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610bc6611a38565b6001600160a01b0316610bd7611161565b6001600160a01b031614610bfd5760405162461bcd60e51b815260040161089f90612d8e565b8051610a3c906014906020840190612307565b610c18611a38565b6001600160a01b0316610c29611161565b6001600160a01b031614610c4f5760405162461bcd60e51b815260040161089f90612d8e565b6040514790339082156108fc029083906000818181858888f19350505050158015610a3c573d6000803e3d6000fd5b61095783838360405180602001604052806000815250611696565b610ca1611a38565b6001600160a01b0316610cb2611161565b6001600160a01b031614610cd85760405162461bcd60e51b815260040161089f90612d8e565b601080549115156101000261ff0019909216919091179055565b6000610cfc610a46565b8210610d1a5760405162461bcd60e51b815260040161089f90612f5b565b60088281548110610d3b57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b610d55611a38565b6001600160a01b0316610d66611161565b6001600160a01b031614610d8c5760405162461bcd60e51b815260040161089f90612d8e565b8051610a3c906013906020840190612307565b601054610100900460ff1681565b6000818152600260205260408120546001600160a01b0316806107de5760405162461bcd60e51b815260040161089f90612c8d565b610def6126ac606361301e565b81565b60006001600160a01b038216610e1a5760405162461bcd60e51b815260040161089f90612c43565b506001600160a01b031660009081526003602052604090205490565b610e3e611a38565b6001600160a01b0316610e4f611161565b6001600160a01b031614610e755760405162461bcd60e51b815260040161089f90612d8e565b610e7f6000611c5c565b565b610e89611a38565b6001600160a01b0316610e9a611161565b6001600160a01b031614610ec05760405162461bcd60e51b815260040161089f90612d8e565b60005b81811015610957576000838383818110610eed57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610f029190612437565b6001600160a01b03161415610f295760405162461bcd60e51b815260040161089f90612dc3565b600160116000858585818110610f4f57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610f649190612437565b6001600160a01b0316815260208101919091526040016000908120805460ff191692151592909217909155601281858585818110610fb257634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610fc79190612437565b6001600160a01b03166001600160a01b031681526020019081526020016000205411610ff457600061104f565b6012600084848481811061101857634e487b7160e01b600052603260045260246000fd5b905060200201602081019061102d9190612437565b6001600160a01b03166001600160a01b03168152602001908152602001600020545b508061105a816130e7565b915050610ec3565b600d5481565b611070611a38565b6001600160a01b0316611081611161565b6001600160a01b0316146110a75760405162461bcd60e51b815260040161089f90612d8e565b6110b46126ac606361301e565b6110bc610a46565b106110d95760405162461bcd60e51b815260040161089f90612fde565b606382600e546110e9919061301e565b11156111075760405162461bcd60e51b815260040161089f90612ba5565b60005b82811015610957576000600e546001611123919061301e565b90506001600e6000828254611138919061301e565b9091555061114890508382611cae565b5080611153816130e7565b91505061110a565b600c5481565b600a546001600160a01b031690565b611178611a38565b6001600160a01b0316611189611161565b6001600160a01b0316146111af5760405162461bcd60e51b815260040161089f90612d8e565b600c55565b6060600180546107f5906130ac565b60105460ff166111e55760405162461bcd60e51b815260040161089f90612cd6565b6111f26126ac606361301e565b6111fa610a46565b106112175760405162461bcd60e51b815260040161089f90612fde565b600a8111156112385760405162461bcd60e51b815260040161089f90612b64565b6126ac600f541061125b5760405162461bcd60e51b815260040161089f906129cf565b3481600c5461126a919061304a565b11156112885760405162461bcd60e51b815260040161089f90612ae1565b60005b81811015610a3c576126ac600f5410156112e2576000600f5460636112b0919061301e565b6112bb90600161301e565b90506001600f60008282546112d0919061301e565b909155506112e090503382611cae565b505b806112ec816130e7565b91505061128b565b6112fc611a38565b6001600160a01b0316826001600160a01b0316141561132d5760405162461bcd60e51b815260040161089f90612a5e565b806005600061133a611a38565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561137e611a38565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113b691906127bb565b60405180910390a35050565b601054610100900460ff166113e95760405162461bcd60e51b815260040161089f906127d9565b3360009081526011602052604090205460ff166114185760405162461bcd60e51b815260040161089f90612847565b6114256126ac606361301e565b61142d610a46565b1061144a5760405162461bcd60e51b815260040161089f90612998565b600d5481111561146c5760405162461bcd60e51b815260040161089f90612f24565b6126ac81600f5461147d919061301e565b111561149b5760405162461bcd60e51b815260040161089f906129cf565b600d54336000908152601260205260409020546114b990839061301e565b11156114d75760405162461bcd60e51b815260040161089f90612a95565b60005b81811015610a3c576000600f5460636114f3919061301e565b6114fe90600161301e565b90506001600f6000828254611513919061301e565b909155505033600090815260126020526040812080546001929061153890849061301e565b9091555061154890503382611cae565b5080611553816130e7565b9150506114da565b611563611a38565b6001600160a01b0316611574611161565b6001600160a01b03161461159a5760405162461bcd60e51b815260040161089f90612d8e565b60005b818110156109575760008383838181106115c757634e487b7160e01b600052603260045260246000fd5b90506020020160208101906115dc9190612437565b6001600160a01b031614156116035760405162461bcd60e51b815260040161089f90612810565b60006011600085858581811061162957634e487b7160e01b600052603260045260246000fd5b905060200201602081019061163e9190612437565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611670816130e7565b91505061159d565b6001600160a01b031660009081526011602052604090205460ff1690565b6116a76116a1611a38565b83611aaa565b6116c35760405162461bcd60e51b815260040161089f90612ed3565b6116cf84848484611cc8565b50505050565b60606116e082611a1b565b6116fc5760405162461bcd60e51b815260040161089f90612e43565b60008281526015602052604081208054611715906130ac565b80601f0160208091040260200160405190810160405280929190818152602001828054611741906130ac565b801561178e5780601f106117635761010080835404028352916020019161178e565b820191906000526020600020905b81548152906001019060200180831161177157829003601f168201915b50505050509050600061179f611cfb565b90508051600014156117b3575090506107e1565b8151156117e55780826040516020016117cd9291906126fd565b604051602081830303815290604052925050506107e1565b806117ef85611d0a565b6040516020016118009291906126fd565b60405160208183030381529060405292505050919050565b606061182382611a1b565b61183f5760405162461bcd60e51b815260040161089f90612e43565b60008281526016602052604081208054611858906130ac565b80601f0160208091040260200160405190810160405280929190818152602001828054611884906130ac565b80156118d15780601f106118a6576101008083540402835291602001916118d1565b820191906000526020600020905b8154815290600101906020018083116118b457829003601f168201915b5050505050905060006118e2611e25565b90508051600014156118f6575090506107e1565b8151156119105780826040516020016117cd92919061272c565b8061191a85611d0a565b60405160200161180092919061272c565b600e5481565b600a81565b600f5481565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b611972611a38565b6001600160a01b0316611983611161565b6001600160a01b0316146119a95760405162461bcd60e51b815260040161089f90612d8e565b6001600160a01b0381166119cf5760405162461bcd60e51b815260040161089f9061291b565b6119d881611c5c565b50565b60006001600160e01b031982166380ac58cd60e01b1480611a0c57506001600160e01b03198216635b5e139f60e01b145b806107de57506107de82611e34565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611a7182610dad565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611ab582611a1b565b611ad15760405162461bcd60e51b815260040161089f90612b18565b6000611adc83610dad565b9050806001600160a01b0316846001600160a01b03161480611b175750836001600160a01b0316611b0c84610878565b6001600160a01b0316145b80611b275750611b27818561193c565b949350505050565b826001600160a01b0316611b4282610dad565b6001600160a01b031614611b685760405162461bcd60e51b815260040161089f90612dfa565b6001600160a01b038216611b8e5760405162461bcd60e51b815260040161089f90612a1a565b611b99838383611e4d565b611ba4600082611a3c565b6001600160a01b0383166000908152600360205260408120805460019290611bcd908490613069565b90915550506001600160a01b0382166000908152600360205260408120805460019290611bfb90849061301e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610a3c828260405180602001604052806000815250611ed6565b611cd3848484611b2f565b611cdf84848484611f09565b6116cf5760405162461bcd60e51b815260040161089f906128c9565b6060601380546107f5906130ac565b606081611d2f57506040805180820190915260018152600360fc1b60208201526107e1565b8160005b8115611d595780611d43816130e7565b9150611d529050600a83613036565b9150611d33565b60008167ffffffffffffffff811115611d8257634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611dac576020820181803683370190505b5090505b8415611b2757611dc1600183613069565b9150611dce600a86613102565b611dd990603061301e565b60f81b818381518110611dfc57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611e1e600a86613036565b9450611db0565b6060601480546107f5906130ac565b6001600160e01b031981166301ffc9a760e01b14919050565b611e58838383610957565b6001600160a01b038316611e7457611e6f81612024565b611e97565b816001600160a01b0316836001600160a01b031614611e9757611e978382612068565b6001600160a01b038216611eb357611eae81612105565b610957565b826001600160a01b0316826001600160a01b0316146109575761095782826121de565b611ee08383612222565b611eed6000848484611f09565b6109575760405162461bcd60e51b815260040161089f906128c9565b6000611f1d846001600160a01b0316612301565b1561201957836001600160a01b031663150b7a02611f39611a38565b8786866040518563ffffffff1660e01b8152600401611f5b949392919061277e565b602060405180830381600087803b158015611f7557600080fd5b505af1925050508015611fa5575060408051601f3d908101601f19168201909252611fa291810190612635565b60015b611fff573d808015611fd3576040519150601f19603f3d011682016040523d82523d6000602084013e611fd8565b606091505b508051611ff75760405162461bcd60e51b815260040161089f906128c9565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b27565b506001949350505050565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6000600161207584610df2565b61207f9190613069565b6000838152600760205260409020549091508082146120d2576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061211790600190613069565b6000838152600960205260408120546008805493945090928490811061214d57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061217c57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806121c257634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006121e983610df2565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166122485760405162461bcd60e51b815260040161089f90612d0d565b61225181611a1b565b1561226e5760405162461bcd60e51b815260040161089f90612961565b61227a60008383611e4d565b6001600160a01b03821660009081526003602052604081208054600192906122a390849061301e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b828054612313906130ac565b90600052602060002090601f016020900481019282612335576000855561237b565b82601f1061234e57805160ff191683800117855561237b565b8280016001018555821561237b579182015b8281111561237b578251825591602001919060010190612360565b5061238792915061238b565b5090565b5b80821115612387576000815560010161238c565b600067ffffffffffffffff808411156123bb576123bb613142565b604051601f8501601f1916810160200182811182821017156123df576123df613142565b6040528481529150818385018610156123f757600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b03811681146107e157600080fd5b803580151581146107e157600080fd5b600060208284031215612448578081fd5b61245182612410565b9392505050565b6000806040838503121561246a578081fd5b61247383612410565b915061248160208401612410565b90509250929050565b60008060006060848603121561249e578081fd5b6124a784612410565b92506124b560208501612410565b9150604084013590509250925092565b600080600080608085870312156124da578081fd5b6124e385612410565b93506124f160208601612410565b925060408501359150606085013567ffffffffffffffff811115612513578182fd5b8501601f81018713612523578182fd5b612532878235602084016123a0565b91505092959194509250565b60008060408385031215612550578182fd5b61255983612410565b915061248160208401612427565b60008060408385031215612579578182fd5b61258283612410565b946020939093013593505050565b600080602083850312156125a2578182fd5b823567ffffffffffffffff808211156125b9578384fd5b818501915085601f8301126125cc578384fd5b8135818111156125da578485fd5b86602080830285010111156125ed578485fd5b60209290920196919550909350505050565b600060208284031215612610578081fd5b61245182612427565b60006020828403121561262a578081fd5b813561245181613158565b600060208284031215612646578081fd5b815161245181613158565b600060208284031215612662578081fd5b813567ffffffffffffffff811115612678578182fd5b8201601f81018413612688578182fd5b611b27848235602084016123a0565b6000602082840312156126a8578081fd5b5035919050565b600080604083850312156126c1578182fd5b8235915061248160208401612410565b600081518084526126e9816020860160208601613080565b601f01601f19169290920160200192915050565b6000835161270f818460208801613080565b835190830190612723818360208801613080565b01949350505050565b6000835161273e818460208801613080565b835190830190612752818360208801613080565b632e706e6760e01b9101908152600401949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906127b1908301846126d1565b9695505050505050565b901515815260200190565b60006020825261245160208301846126d1565b60208082526018908201527f5768697465204c697374206973206e6f74206163746976650000000000000000604082015260600190565b6020808252601d908201527f43616e27742072656d6f766520746865206e756c6c2061646472657373000000604082015260600190565b6020808252601d908201527f596f7520617265206e6f74206f6e20746865205768697465204c697374000000604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526019908201527f416c6c20636174732068617665206265656e206d696e74656400000000000000604082015260600190565b6020808252602b908201527f507572636861736520776f756c6420657863656564206d6178696d756d20707560408201526a626c696320737570706c7960a81b606082015260800190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f596f75206861766520616c7265616479206d696e74656420616c6c6f7765642060408201526b6d6178696d756d206f66203160a01b606082015260800190565b6020808252601c908201527f45544820616d6f756e74206973206e6f742073756666696369656e7400000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526021908201527f576f756c6420657863656564207075726368617365206c696d6974206f6620316040820152600360fc1b606082015260800190565b60208082526021908201527f4e6f7420656e6f75676820746f6b656e73206c65667420746f207265736572766040820152606560f81b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b60208082526019908201527f5075626c69632073616c65206973206e6f742061637469766500000000000000604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601a908201527f43616e27742061646420746865206e756c6c2061646472657373000000000000604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601e908201527f43616e6e6f742070757263686173652074686973206d616e7920636174730000604082015260600190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b6020808252601e908201527f5a65726f2061646472657373206e6f74206f6e205768697465204c6973740000604082015260600190565b6020808252601b908201527f416c6c20746f6b656e732068617665206265656e206d696e7465640000000000604082015260600190565b90815260200190565b6000821982111561303157613031613116565b500190565b6000826130455761304561312c565b500490565b600081600019048311821515161561306457613064613116565b500290565b60008282101561307b5761307b613116565b500390565b60005b8381101561309b578181015183820152602001613083565b838111156116cf5750506000910152565b6002810460018216806130c057607f821691505b602082108114156130e157634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156130fb576130fb613116565b5060010190565b6000826131115761311161312c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146119d857600080fdfea2646970667358221220f8d6838463bb89165a3594df7352ac97a00d32df120a5c0fa9cfcd2503346aa164736f6c63430008000033

Deployed Bytecode

0x60806040526004361061027d5760003560e01c806366d27c301161014f578063a22cb465116100c1578063d3ea6ceb1161007a578063d3ea6ceb1461071a578063d6f407c71461073a578063d75e61101461074f578063e6a5931e14610764578063e985e9c514610779578063f2fde38b146107995761027d565b8063a22cb4651461065a578063aa1df13f1461067a578063b11560c51461069a578063b22d0c83146106ba578063b88d4fde146106da578063c87b56dd146106fa5761027d565b8063850dd09111610113578063850dd091146105c85780638d859f3e146105e85780638da5cb5b146105fd57806391b7f5ed1461061257806395d89b4114610632578063a0712d68146106475761027d565b806366d27c301461054957806370a082311461055e578063715018a61461057e578063740d73f3146105935780637cdd702e146105b35761027d565b806323b872dd116101f357806342842e0e116101ac57806342842e0e1461049457806349ec975b146104b45780634f6ccce7146104d457806355f804b3146104f4578063573f5dae146105145780636352211e146105295761027d565b806323b872dd146103ea57806328cad13d1461040a5780632e6bf90e1461042a5780632f745c591461043f5780632fd0c6221461045f5780633ccfd60b1461047f5761027d565b80631096952311610245578063109695231461033e578063165c08641461035e57806318160ddd146103805780631984b286146103955780631e84c413146103b557806320b4aa1f146103ca5761027d565b806301ffc9a71461028257806306fdde03146102b8578063081812fc146102da578063095ea7b3146103075780630f7309e814610329575b600080fd5b34801561028e57600080fd5b506102a261029d366004612619565b6107b9565b6040516102af91906127bb565b60405180910390f35b3480156102c457600080fd5b506102cd6107e6565b6040516102af91906127c6565b3480156102e657600080fd5b506102fa6102f5366004612697565b610878565b6040516102af919061276a565b34801561031357600080fd5b50610327610322366004612567565b6108c4565b005b34801561033557600080fd5b506102cd61095c565b34801561034a57600080fd5b50610327610359366004612651565b6109ea565b34801561036a57600080fd5b50610373610a40565b6040516102af9190613015565b34801561038c57600080fd5b50610373610a46565b3480156103a157600080fd5b506103736103b0366004612437565b610a4c565b3480156103c157600080fd5b506102a2610a90565b3480156103d657600080fd5b506103276103e5366004612697565b610a99565b3480156103f657600080fd5b5061032761040536600461248a565b610add565b34801561041657600080fd5b506103276104253660046125ff565b610b15565b34801561043657600080fd5b50610373610b67565b34801561044b57600080fd5b5061037361045a366004612567565b610b6c565b34801561046b57600080fd5b5061032761047a366004612651565b610bbe565b34801561048b57600080fd5b50610327610c10565b3480156104a057600080fd5b506103276104af36600461248a565b610c7e565b3480156104c057600080fd5b506103276104cf3660046125ff565b610c99565b3480156104e057600080fd5b506103736104ef366004612697565b610cf2565b34801561050057600080fd5b5061032761050f366004612651565b610d4d565b34801561052057600080fd5b506102a2610d9f565b34801561053557600080fd5b506102fa610544366004612697565b610dad565b34801561055557600080fd5b50610373610de2565b34801561056a57600080fd5b50610373610579366004612437565b610df2565b34801561058a57600080fd5b50610327610e36565b34801561059f57600080fd5b506103276105ae366004612590565b610e81565b3480156105bf57600080fd5b50610373611062565b3480156105d457600080fd5b506103276105e33660046126af565b611068565b3480156105f457600080fd5b5061037361115b565b34801561060957600080fd5b506102fa611161565b34801561061e57600080fd5b5061032761062d366004612697565b611170565b34801561063e57600080fd5b506102cd6111b4565b610327610655366004612697565b6111c3565b34801561066657600080fd5b5061032761067536600461253e565b6112f4565b34801561068657600080fd5b50610327610695366004612697565b6113c2565b3480156106a657600080fd5b506103276106b5366004612590565b61155b565b3480156106c657600080fd5b506102a26106d5366004612437565b611678565b3480156106e657600080fd5b506103276106f53660046124c5565b611696565b34801561070657600080fd5b506102cd610715366004612697565b6116d5565b34801561072657600080fd5b506102cd610735366004612697565b611818565b34801561074657600080fd5b5061037361192b565b34801561075b57600080fd5b50610373611931565b34801561077057600080fd5b50610373611936565b34801561078557600080fd5b506102a2610794366004612458565b61193c565b3480156107a557600080fd5b506103276107b4366004612437565b61196a565b60006001600160e01b0319821663780e9d6360e01b14806107de57506107de826119db565b90505b919050565b6060600080546107f5906130ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610821906130ac565b801561086e5780601f106108435761010080835404028352916020019161086e565b820191906000526020600020905b81548152906001019060200180831161085157829003601f168201915b5050505050905090565b600061088382611a1b565b6108a85760405162461bcd60e51b815260040161089f90612d42565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108cf82610dad565b9050806001600160a01b0316836001600160a01b031614156109035760405162461bcd60e51b815260040161089f90612e92565b806001600160a01b0316610915611a38565b6001600160a01b03161480610931575061093181610794611a38565b61094d5760405162461bcd60e51b815260040161089f90612be6565b6109578383611a3c565b505050565b600b8054610969906130ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610995906130ac565b80156109e25780601f106109b7576101008083540402835291602001916109e2565b820191906000526020600020905b8154815290600101906020018083116109c557829003601f168201915b505050505081565b6109f2611a38565b6001600160a01b0316610a03611161565b6001600160a01b031614610a295760405162461bcd60e51b815260040161089f90612d8e565b8051610a3c90600b906020840190612307565b5050565b6126ac81565b60085490565b60006001600160a01b038216610a745760405162461bcd60e51b815260040161089f90612fa7565b506001600160a01b031660009081526012602052604090205490565b60105460ff1681565b610aa1611a38565b6001600160a01b0316610ab2611161565b6001600160a01b031614610ad85760405162461bcd60e51b815260040161089f90612d8e565b600d55565b610aee610ae8611a38565b82611aaa565b610b0a5760405162461bcd60e51b815260040161089f90612ed3565b610957838383611b2f565b610b1d611a38565b6001600160a01b0316610b2e611161565b6001600160a01b031614610b545760405162461bcd60e51b815260040161089f90612d8e565b6010805460ff1916911515919091179055565b606381565b6000610b7783610df2565b8210610b955760405162461bcd60e51b815260040161089f9061287e565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610bc6611a38565b6001600160a01b0316610bd7611161565b6001600160a01b031614610bfd5760405162461bcd60e51b815260040161089f90612d8e565b8051610a3c906014906020840190612307565b610c18611a38565b6001600160a01b0316610c29611161565b6001600160a01b031614610c4f5760405162461bcd60e51b815260040161089f90612d8e565b6040514790339082156108fc029083906000818181858888f19350505050158015610a3c573d6000803e3d6000fd5b61095783838360405180602001604052806000815250611696565b610ca1611a38565b6001600160a01b0316610cb2611161565b6001600160a01b031614610cd85760405162461bcd60e51b815260040161089f90612d8e565b601080549115156101000261ff0019909216919091179055565b6000610cfc610a46565b8210610d1a5760405162461bcd60e51b815260040161089f90612f5b565b60088281548110610d3b57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b610d55611a38565b6001600160a01b0316610d66611161565b6001600160a01b031614610d8c5760405162461bcd60e51b815260040161089f90612d8e565b8051610a3c906013906020840190612307565b601054610100900460ff1681565b6000818152600260205260408120546001600160a01b0316806107de5760405162461bcd60e51b815260040161089f90612c8d565b610def6126ac606361301e565b81565b60006001600160a01b038216610e1a5760405162461bcd60e51b815260040161089f90612c43565b506001600160a01b031660009081526003602052604090205490565b610e3e611a38565b6001600160a01b0316610e4f611161565b6001600160a01b031614610e755760405162461bcd60e51b815260040161089f90612d8e565b610e7f6000611c5c565b565b610e89611a38565b6001600160a01b0316610e9a611161565b6001600160a01b031614610ec05760405162461bcd60e51b815260040161089f90612d8e565b60005b81811015610957576000838383818110610eed57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610f029190612437565b6001600160a01b03161415610f295760405162461bcd60e51b815260040161089f90612dc3565b600160116000858585818110610f4f57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610f649190612437565b6001600160a01b0316815260208101919091526040016000908120805460ff191692151592909217909155601281858585818110610fb257634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610fc79190612437565b6001600160a01b03166001600160a01b031681526020019081526020016000205411610ff457600061104f565b6012600084848481811061101857634e487b7160e01b600052603260045260246000fd5b905060200201602081019061102d9190612437565b6001600160a01b03166001600160a01b03168152602001908152602001600020545b508061105a816130e7565b915050610ec3565b600d5481565b611070611a38565b6001600160a01b0316611081611161565b6001600160a01b0316146110a75760405162461bcd60e51b815260040161089f90612d8e565b6110b46126ac606361301e565b6110bc610a46565b106110d95760405162461bcd60e51b815260040161089f90612fde565b606382600e546110e9919061301e565b11156111075760405162461bcd60e51b815260040161089f90612ba5565b60005b82811015610957576000600e546001611123919061301e565b90506001600e6000828254611138919061301e565b9091555061114890508382611cae565b5080611153816130e7565b91505061110a565b600c5481565b600a546001600160a01b031690565b611178611a38565b6001600160a01b0316611189611161565b6001600160a01b0316146111af5760405162461bcd60e51b815260040161089f90612d8e565b600c55565b6060600180546107f5906130ac565b60105460ff166111e55760405162461bcd60e51b815260040161089f90612cd6565b6111f26126ac606361301e565b6111fa610a46565b106112175760405162461bcd60e51b815260040161089f90612fde565b600a8111156112385760405162461bcd60e51b815260040161089f90612b64565b6126ac600f541061125b5760405162461bcd60e51b815260040161089f906129cf565b3481600c5461126a919061304a565b11156112885760405162461bcd60e51b815260040161089f90612ae1565b60005b81811015610a3c576126ac600f5410156112e2576000600f5460636112b0919061301e565b6112bb90600161301e565b90506001600f60008282546112d0919061301e565b909155506112e090503382611cae565b505b806112ec816130e7565b91505061128b565b6112fc611a38565b6001600160a01b0316826001600160a01b0316141561132d5760405162461bcd60e51b815260040161089f90612a5e565b806005600061133a611a38565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561137e611a38565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113b691906127bb565b60405180910390a35050565b601054610100900460ff166113e95760405162461bcd60e51b815260040161089f906127d9565b3360009081526011602052604090205460ff166114185760405162461bcd60e51b815260040161089f90612847565b6114256126ac606361301e565b61142d610a46565b1061144a5760405162461bcd60e51b815260040161089f90612998565b600d5481111561146c5760405162461bcd60e51b815260040161089f90612f24565b6126ac81600f5461147d919061301e565b111561149b5760405162461bcd60e51b815260040161089f906129cf565b600d54336000908152601260205260409020546114b990839061301e565b11156114d75760405162461bcd60e51b815260040161089f90612a95565b60005b81811015610a3c576000600f5460636114f3919061301e565b6114fe90600161301e565b90506001600f6000828254611513919061301e565b909155505033600090815260126020526040812080546001929061153890849061301e565b9091555061154890503382611cae565b5080611553816130e7565b9150506114da565b611563611a38565b6001600160a01b0316611574611161565b6001600160a01b03161461159a5760405162461bcd60e51b815260040161089f90612d8e565b60005b818110156109575760008383838181106115c757634e487b7160e01b600052603260045260246000fd5b90506020020160208101906115dc9190612437565b6001600160a01b031614156116035760405162461bcd60e51b815260040161089f90612810565b60006011600085858581811061162957634e487b7160e01b600052603260045260246000fd5b905060200201602081019061163e9190612437565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611670816130e7565b91505061159d565b6001600160a01b031660009081526011602052604090205460ff1690565b6116a76116a1611a38565b83611aaa565b6116c35760405162461bcd60e51b815260040161089f90612ed3565b6116cf84848484611cc8565b50505050565b60606116e082611a1b565b6116fc5760405162461bcd60e51b815260040161089f90612e43565b60008281526015602052604081208054611715906130ac565b80601f0160208091040260200160405190810160405280929190818152602001828054611741906130ac565b801561178e5780601f106117635761010080835404028352916020019161178e565b820191906000526020600020905b81548152906001019060200180831161177157829003601f168201915b50505050509050600061179f611cfb565b90508051600014156117b3575090506107e1565b8151156117e55780826040516020016117cd9291906126fd565b604051602081830303815290604052925050506107e1565b806117ef85611d0a565b6040516020016118009291906126fd565b60405160208183030381529060405292505050919050565b606061182382611a1b565b61183f5760405162461bcd60e51b815260040161089f90612e43565b60008281526016602052604081208054611858906130ac565b80601f0160208091040260200160405190810160405280929190818152602001828054611884906130ac565b80156118d15780601f106118a6576101008083540402835291602001916118d1565b820191906000526020600020905b8154815290600101906020018083116118b457829003601f168201915b5050505050905060006118e2611e25565b90508051600014156118f6575090506107e1565b8151156119105780826040516020016117cd92919061272c565b8061191a85611d0a565b60405160200161180092919061272c565b600e5481565b600a81565b600f5481565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b611972611a38565b6001600160a01b0316611983611161565b6001600160a01b0316146119a95760405162461bcd60e51b815260040161089f90612d8e565b6001600160a01b0381166119cf5760405162461bcd60e51b815260040161089f9061291b565b6119d881611c5c565b50565b60006001600160e01b031982166380ac58cd60e01b1480611a0c57506001600160e01b03198216635b5e139f60e01b145b806107de57506107de82611e34565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611a7182610dad565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611ab582611a1b565b611ad15760405162461bcd60e51b815260040161089f90612b18565b6000611adc83610dad565b9050806001600160a01b0316846001600160a01b03161480611b175750836001600160a01b0316611b0c84610878565b6001600160a01b0316145b80611b275750611b27818561193c565b949350505050565b826001600160a01b0316611b4282610dad565b6001600160a01b031614611b685760405162461bcd60e51b815260040161089f90612dfa565b6001600160a01b038216611b8e5760405162461bcd60e51b815260040161089f90612a1a565b611b99838383611e4d565b611ba4600082611a3c565b6001600160a01b0383166000908152600360205260408120805460019290611bcd908490613069565b90915550506001600160a01b0382166000908152600360205260408120805460019290611bfb90849061301e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610a3c828260405180602001604052806000815250611ed6565b611cd3848484611b2f565b611cdf84848484611f09565b6116cf5760405162461bcd60e51b815260040161089f906128c9565b6060601380546107f5906130ac565b606081611d2f57506040805180820190915260018152600360fc1b60208201526107e1565b8160005b8115611d595780611d43816130e7565b9150611d529050600a83613036565b9150611d33565b60008167ffffffffffffffff811115611d8257634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611dac576020820181803683370190505b5090505b8415611b2757611dc1600183613069565b9150611dce600a86613102565b611dd990603061301e565b60f81b818381518110611dfc57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611e1e600a86613036565b9450611db0565b6060601480546107f5906130ac565b6001600160e01b031981166301ffc9a760e01b14919050565b611e58838383610957565b6001600160a01b038316611e7457611e6f81612024565b611e97565b816001600160a01b0316836001600160a01b031614611e9757611e978382612068565b6001600160a01b038216611eb357611eae81612105565b610957565b826001600160a01b0316826001600160a01b0316146109575761095782826121de565b611ee08383612222565b611eed6000848484611f09565b6109575760405162461bcd60e51b815260040161089f906128c9565b6000611f1d846001600160a01b0316612301565b1561201957836001600160a01b031663150b7a02611f39611a38565b8786866040518563ffffffff1660e01b8152600401611f5b949392919061277e565b602060405180830381600087803b158015611f7557600080fd5b505af1925050508015611fa5575060408051601f3d908101601f19168201909252611fa291810190612635565b60015b611fff573d808015611fd3576040519150601f19603f3d011682016040523d82523d6000602084013e611fd8565b606091505b508051611ff75760405162461bcd60e51b815260040161089f906128c9565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b27565b506001949350505050565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6000600161207584610df2565b61207f9190613069565b6000838152600760205260409020549091508082146120d2576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061211790600190613069565b6000838152600960205260408120546008805493945090928490811061214d57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061217c57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806121c257634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006121e983610df2565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166122485760405162461bcd60e51b815260040161089f90612d0d565b61225181611a1b565b1561226e5760405162461bcd60e51b815260040161089f90612961565b61227a60008383611e4d565b6001600160a01b03821660009081526003602052604081208054600192906122a390849061301e565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b828054612313906130ac565b90600052602060002090601f016020900481019282612335576000855561237b565b82601f1061234e57805160ff191683800117855561237b565b8280016001018555821561237b579182015b8281111561237b578251825591602001919060010190612360565b5061238792915061238b565b5090565b5b80821115612387576000815560010161238c565b600067ffffffffffffffff808411156123bb576123bb613142565b604051601f8501601f1916810160200182811182821017156123df576123df613142565b6040528481529150818385018610156123f757600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b03811681146107e157600080fd5b803580151581146107e157600080fd5b600060208284031215612448578081fd5b61245182612410565b9392505050565b6000806040838503121561246a578081fd5b61247383612410565b915061248160208401612410565b90509250929050565b60008060006060848603121561249e578081fd5b6124a784612410565b92506124b560208501612410565b9150604084013590509250925092565b600080600080608085870312156124da578081fd5b6124e385612410565b93506124f160208601612410565b925060408501359150606085013567ffffffffffffffff811115612513578182fd5b8501601f81018713612523578182fd5b612532878235602084016123a0565b91505092959194509250565b60008060408385031215612550578182fd5b61255983612410565b915061248160208401612427565b60008060408385031215612579578182fd5b61258283612410565b946020939093013593505050565b600080602083850312156125a2578182fd5b823567ffffffffffffffff808211156125b9578384fd5b818501915085601f8301126125cc578384fd5b8135818111156125da578485fd5b86602080830285010111156125ed578485fd5b60209290920196919550909350505050565b600060208284031215612610578081fd5b61245182612427565b60006020828403121561262a578081fd5b813561245181613158565b600060208284031215612646578081fd5b815161245181613158565b600060208284031215612662578081fd5b813567ffffffffffffffff811115612678578182fd5b8201601f81018413612688578182fd5b611b27848235602084016123a0565b6000602082840312156126a8578081fd5b5035919050565b600080604083850312156126c1578182fd5b8235915061248160208401612410565b600081518084526126e9816020860160208601613080565b601f01601f19169290920160200192915050565b6000835161270f818460208801613080565b835190830190612723818360208801613080565b01949350505050565b6000835161273e818460208801613080565b835190830190612752818360208801613080565b632e706e6760e01b9101908152600401949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906127b1908301846126d1565b9695505050505050565b901515815260200190565b60006020825261245160208301846126d1565b60208082526018908201527f5768697465204c697374206973206e6f74206163746976650000000000000000604082015260600190565b6020808252601d908201527f43616e27742072656d6f766520746865206e756c6c2061646472657373000000604082015260600190565b6020808252601d908201527f596f7520617265206e6f74206f6e20746865205768697465204c697374000000604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526019908201527f416c6c20636174732068617665206265656e206d696e74656400000000000000604082015260600190565b6020808252602b908201527f507572636861736520776f756c6420657863656564206d6178696d756d20707560408201526a626c696320737570706c7960a81b606082015260800190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f596f75206861766520616c7265616479206d696e74656420616c6c6f7765642060408201526b6d6178696d756d206f66203160a01b606082015260800190565b6020808252601c908201527f45544820616d6f756e74206973206e6f742073756666696369656e7400000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526021908201527f576f756c6420657863656564207075726368617365206c696d6974206f6620316040820152600360fc1b606082015260800190565b60208082526021908201527f4e6f7420656e6f75676820746f6b656e73206c65667420746f207265736572766040820152606560f81b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b60208082526019908201527f5075626c69632073616c65206973206e6f742061637469766500000000000000604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601a908201527f43616e27742061646420746865206e756c6c2061646472657373000000000000604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601e908201527f43616e6e6f742070757263686173652074686973206d616e7920636174730000604082015260600190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b6020808252601e908201527f5a65726f2061646472657373206e6f74206f6e205768697465204c6973740000604082015260600190565b6020808252601b908201527f416c6c20746f6b656e732068617665206265656e206d696e7465640000000000604082015260600190565b90815260200190565b6000821982111561303157613031613116565b500190565b6000826130455761304561312c565b500490565b600081600019048311821515161561306457613064613116565b500290565b60008282101561307b5761307b613116565b500390565b60005b8381101561309b578181015183820152602001613083565b838111156116cf5750506000910152565b6002810460018216806130c057607f821691505b602082108114156130e157634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156130fb576130fb613116565b5060010190565b6000826131115761311161312c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146119d857600080fdfea2646970667358221220f8d6838463bb89165a3594df7352ac97a00d32df120a5c0fa9cfcd2503346aa164736f6c63430008000033

Deployed Bytecode Sourcemap

55570:7503:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41562:224;;;;;;;;;;-1:-1:-1;41562:224:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29460:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;31019:221::-;;;;;;;;;;-1:-1:-1;31019:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;30542:411::-;;;;;;;;;;-1:-1:-1;30542:411:0;;;;;:::i;:::-;;:::i;:::-;;55677:29;;;;;;;;;;;;;:::i;62774:116::-;;;;;;;;;;-1:-1:-1;62774:116:0;;;;;:::i;:::-;;:::i;55765:43::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;42202:113::-;;;;;;;;;;;;;:::i;57365:208::-;;;;;;;;;;-1:-1:-1;57365:208:0;;;;;:::i;:::-;;:::i;56111:38::-;;;;;;;;;;;;;:::i;60155:119::-;;;;;;;;;;-1:-1:-1;60155:119:0;;;;;:::i;:::-;;:::i;31909:339::-;;;;;;;;;;-1:-1:-1;31909:339:0;;;;;:::i;:::-;;:::i;59854:145::-;;;;;;;;;;-1:-1:-1;59854:145:0;;;;;:::i;:::-;;:::i;55713:45::-;;;;;;;;;;;;;:::i;41870:256::-;;;;;;;;;;-1:-1:-1;41870:256:0;;;;;:::i;:::-;;:::i;60840:126::-;;;;;;;;;;-1:-1:-1;60840:126:0;;;;;:::i;:::-;;:::i;62923:146::-;;;;;;;;;;;;;:::i;32319:185::-;;;;;;;;;;-1:-1:-1;32319:185:0;;;;;:::i;:::-;;:::i;60007:140::-;;;;;;;;;;-1:-1:-1;60007:140:0;;;;;:::i;:::-;;:::i;42392:233::-;;;;;;;;;;-1:-1:-1;42392:233:0;;;;;:::i;:::-;;:::i;60614:109::-;;;;;;;;;;-1:-1:-1;60614:109:0;;;;;:::i;:::-;;:::i;56156:37::-;;;;;;;;;;;;;:::i;29154:239::-;;;;;;;;;;-1:-1:-1;29154:239:0;;;;;:::i;:::-;;:::i;55815:75::-;;;;;;;;;;;;;:::i;28884:208::-;;;;;;;;;;-1:-1:-1;28884:208:0;;;;;:::i;:::-;;:::i;49351:94::-;;;;;;;;;;;;;:::i;56555:375::-;;;;;;;;;;-1:-1:-1;56555:375:0;;;;;:::i;:::-;;:::i;55989:35::-;;;;;;;;;;;;;:::i;59399:447::-;;;;;;;;;;-1:-1:-1;59399:447:0;;;;;:::i;:::-;;:::i;55947:33::-;;;;;;;;;;;;;:::i;48700:87::-;;;;;;;;;;;;;:::i;62645:86::-;;;;;;;;;;-1:-1:-1;62645:86:0;;;;;:::i;:::-;;:::i;29629:104::-;;;;;;;;;;;;;:::i;57581:804::-;;;;;;:::i;:::-;;:::i;31312:295::-;;;;;;;;;;-1:-1:-1;31312:295:0;;;;;:::i;:::-;;:::i;58393:998::-;;;;;;;;;;-1:-1:-1;58393:998:0;;;;;:::i;:::-;;:::i;57061:296::-;;;;;;;;;;-1:-1:-1;57061:296:0;;;;;:::i;:::-;;:::i;56938:115::-;;;;;;;;;;-1:-1:-1;56938:115:0;;;;;:::i;:::-;;:::i;32575:328::-;;;;;;;;;;-1:-1:-1;32575:328:0;;;;;:::i;:::-;;:::i;60974:793::-;;;;;;;;;;-1:-1:-1;60974:793:0;;;;;:::i;:::-;;:::i;61779:842::-;;;;;;;;;;-1:-1:-1;61779:842:0;;;;;:::i;:::-;;:::i;56033:30::-;;;;;;;;;;;;;:::i;55897:43::-;;;;;;;;;;;;;:::i;56070:32::-;;;;;;;;;;;;;:::i;31678:164::-;;;;;;;;;;-1:-1:-1;31678:164:0;;;;;:::i;:::-;;:::i;49600:192::-;;;;;;;;;;-1:-1:-1;49600:192:0;;;;;:::i;:::-;;:::i;41562:224::-;41664:4;-1:-1:-1;;;;;;41688:50:0;;-1:-1:-1;;;41688:50:0;;:90;;;41742:36;41766:11;41742:23;:36::i;:::-;41681:97;;41562:224;;;;:::o;29460:100::-;29514:13;29547:5;29540:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29460:100;:::o;31019:221::-;31095:7;31123:16;31131:7;31123;:16::i;:::-;31115:73;;;;-1:-1:-1;;;31115:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;31208:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;31208:24:0;;31019:221::o;30542:411::-;30623:13;30639:23;30654:7;30639:14;:23::i;:::-;30623:39;;30687:5;-1:-1:-1;;;;;30681:11:0;:2;-1:-1:-1;;;;;30681:11:0;;;30673:57;;;;-1:-1:-1;;;30673:57:0;;;;;;;:::i;:::-;30781:5;-1:-1:-1;;;;;30765:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;30765:21:0;;:62;;;;30790:37;30807:5;30814:12;:10;:12::i;30790:37::-;30743:168;;;;-1:-1:-1;;;30743:168:0;;;;;;;:::i;:::-;30924:21;30933:2;30937:7;30924:8;:21::i;:::-;30542:411;;;:::o;55677:29::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;62774:116::-;48931:12;:10;:12::i;:::-;-1:-1:-1;;;;;48920:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48920:23:0;;48912:68;;;;-1:-1:-1;;;48912:68:0;;;;;;;:::i;:::-;62857:27;;::::1;::::0;:10:::1;::::0;:27:::1;::::0;::::1;::::0;::::1;:::i;:::-;;62774:116:::0;:::o;55765:43::-;55804:4;55765:43;:::o;42202:113::-;42290:10;:17;42202:113;:::o;57365:208::-;57440:7;-1:-1:-1;;;;;57467:19:0;;57459:62;;;;-1:-1:-1;;;57459:62:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;57541:24:0;;;;;:17;:24;;;;;;;57365:208::o;56111:38::-;;;;;;:::o;60155:119::-;48931:12;:10;:12::i;:::-;-1:-1:-1;;;;;48920:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48920:23:0;;48912:68;;;;-1:-1:-1;;;48912:68:0;;;;;;;:::i;:::-;60240:16:::1;:26:::0;60155:119::o;31909:339::-;32104:41;32123:12;:10;:12::i;:::-;32137:7;32104:18;:41::i;:::-;32096:103;;;;-1:-1:-1;;;32096:103:0;;;;;;;:::i;:::-;32212:28;32222:4;32228:2;32232:7;32212:9;:28::i;59854:145::-;48931:12;:10;:12::i;:::-;-1:-1:-1;;;;;48920:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48920:23:0;;48912:68;;;;-1:-1:-1;;;48912:68:0;;;;;;;:::i;:::-;59951:18:::1;:40:::0;;-1:-1:-1;;59951:40:0::1;::::0;::::1;;::::0;;;::::1;::::0;;59854:145::o;55713:45::-;55756:2;55713:45;:::o;41870:256::-;41967:7;42003:23;42020:5;42003:16;:23::i;:::-;41995:5;:31;41987:87;;;;-1:-1:-1;;;41987:87:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;42092:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;41870:256::o;60840:126::-;48931:12;:10;:12::i;:::-;-1:-1:-1;;;;;48920:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48920:23:0;;48912:68;;;;-1:-1:-1;;;48912:68:0;;;;;;;:::i;:::-;60923:35;;::::1;::::0;:20:::1;::::0;:35:::1;::::0;::::1;::::0;::::1;:::i;62923:146::-:0;48931:12;:10;:12::i;:::-;-1:-1:-1;;;;;48920:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48920:23:0;;48912:68;;;;-1:-1:-1;;;48912:68:0;;;;;;;:::i;:::-;63026:37:::1;::::0;62996:21:::1;::::0;63034:10:::1;::::0;63026:37;::::1;;;::::0;62996:21;;62978:15:::1;63026:37:::0;62978:15;63026:37;62996:21;63034:10;63026:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;32319:185:::0;32457:39;32474:4;32480:2;32484:7;32457:39;;;;;;;;;;;;:16;:39::i;60007:140::-;48931:12;:10;:12::i;:::-;-1:-1:-1;;;;;48920:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48920:23:0;;48912:68;;;;-1:-1:-1;;;48912:68:0;;;;;;;:::i;:::-;60101:17:::1;:38:::0;;;::::1;;;;-1:-1:-1::0;;60101:38:0;;::::1;::::0;;;::::1;::::0;;60007:140::o;42392:233::-;42467:7;42503:30;:28;:30::i;:::-;42495:5;:38;42487:95;;;;-1:-1:-1;;;42487:95:0;;;;;;;:::i;:::-;42600:10;42611:5;42600:17;;;;;;-1:-1:-1;;;42600:17:0;;;;;;;;;;;;;;;;;42593:24;;42392:233;;;:::o;60614:109::-;48931:12;:10;:12::i;:::-;-1:-1:-1;;;;;48920:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48920:23:0;;48912:68;;;;-1:-1:-1;;;48912:68:0;;;;;;;:::i;:::-;60688:27;;::::1;::::0;:16:::1;::::0;:27:::1;::::0;::::1;::::0;::::1;:::i;56156:37::-:0;;;;;;;;;:::o;29154:239::-;29226:7;29262:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29262:16:0;29297:19;29289:73;;;;-1:-1:-1;;;29289:73:0;;;;;;;:::i;55815:75::-;55859:31;55804:4;55756:2;55859:31;:::i;:::-;55815:75;:::o;28884:208::-;28956:7;-1:-1:-1;;;;;28984:19:0;;28976:74;;;;-1:-1:-1;;;28976:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;29068:16:0;;;;;:9;:16;;;;;;;28884:208::o;49351:94::-;48931:12;:10;:12::i;:::-;-1:-1:-1;;;;;48920:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48920:23:0;;48912:68;;;;-1:-1:-1;;;48912:68:0;;;;;;;:::i;:::-;49416:21:::1;49434:1;49416:9;:21::i;:::-;49351:94::o:0;56555:375::-;48931:12;:10;:12::i;:::-;-1:-1:-1;;;;;48920:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48920:23:0;;48912:68;;;;-1:-1:-1;;;48912:68:0;;;;;;;:::i;:::-;56653:9:::1;56648:275;56668:20:::0;;::::1;56648:275;;;56742:1;56718:9:::0;;56728:1;56718:12;;::::1;;;-1:-1:-1::0;;;56718:12:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56718:26:0::1;;;56710:65;;;;-1:-1:-1::0;;;56710:65:0::1;;;;;;;:::i;:::-;56819:4;56792:10;:24;56803:9;;56813:1;56803:12;;;;;-1:-1:-1::0;;;56803:12:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56792:24:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;56792:24:0;;;:31;;-1:-1:-1;;56792:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;56838:17:::1;-1:-1:-1::0;56856:9:0;;56866:1;56856:12;;::::1;;;-1:-1:-1::0;;;56856:12:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56838:31:0::1;-1:-1:-1::0;;;;;56838:31:0::1;;;;;;;;;;;;;:35;:73;;56910:1;56838:73;;;56876:17;:31;56894:9;;56904:1;56894:12;;;;;-1:-1:-1::0;;;56894:12:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;56876:31:0::1;-1:-1:-1::0;;;;;56876:31:0::1;;;;;;;;;;;;;56838:73;-1:-1:-1::0;56690:3:0;::::1;::::0;::::1;:::i;:::-;;;;56648:275;;55989:35:::0;;;;:::o;59399:447::-;48931:12;:10;:12::i;:::-;-1:-1:-1;;;;;48920:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48920:23:0;;48912:68;;;;-1:-1:-1;;;48912:68:0;;;;;;;:::i;:::-;55859:31:::1;55804:4;55756:2;55859:31;:::i;:::-;59485:13;:11;:13::i;:::-;:33;59477:73;;;;-1:-1:-1::0;;;59477:73:0::1;;;;;;;:::i;:::-;55756:2;59587:6;59569:15;;:24;;;;:::i;:::-;:44;;59561:90;;;;-1:-1:-1::0;;;59561:90:0::1;;;;;;;:::i;:::-;59668:9;59664:175;59687:6;59683:1;:10;59664:175;;;59715:15;59733;;59751:1;59733:19;;;;:::i;:::-;59715:37;;59788:1;59769:15;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;59804:23:0::1;::::0;-1:-1:-1;59814:3:0;59819:7;59804:9:::1;:23::i;:::-;-1:-1:-1::0;59695:3:0;::::1;::::0;::::1;:::i;:::-;;;;59664:175;;55947:33:::0;;;;:::o;48700:87::-;48773:6;;-1:-1:-1;;;;;48773:6:0;48700:87;:::o;62645:86::-;48931:12;:10;:12::i;:::-;-1:-1:-1;;;;;48920:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48920:23:0;;48912:68;;;;-1:-1:-1;;;48912:68:0;;;;;;;:::i;:::-;62708:5:::1;:17:::0;62645:86::o;29629:104::-;29685:13;29718:7;29711:14;;;;;:::i;57581:804::-;57664:18;;;;57656:56;;;;-1:-1:-1;;;57656:56:0;;;;;;;:::i;:::-;55859:31;55804:4;55756:2;55859:31;:::i;:::-;57731:13;:11;:13::i;:::-;:33;57723:73;;;;-1:-1:-1;;;57723:73:0;;;;;;;:::i;:::-;55938:2;57815:14;:32;;57807:78;;;;-1:-1:-1;;;57807:78:0;;;;;;;:::i;:::-;55804:4;57904:17;;:32;57896:88;;;;-1:-1:-1;;;57896:88:0;;;;;;;:::i;:::-;58029:9;58011:14;58003:5;;:22;;;;:::i;:::-;:35;;57995:76;;;;-1:-1:-1;;;57995:76:0;;;;;;;:::i;:::-;58089:9;58084:294;58108:14;58104:1;:18;58084:294;;;55804:4;58148:17;;:32;58144:223;;;58201:15;58238:17;;55756:2;58219:36;;;;:::i;:::-;:40;;58258:1;58219:40;:::i;:::-;58201:58;;58301:1;58280:17;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;58321:30:0;;-1:-1:-1;58331:10:0;58343:7;58321:9;:30::i;:::-;58144:223;;58124:3;;;;:::i;:::-;;;;58084:294;;31312:295;31427:12;:10;:12::i;:::-;-1:-1:-1;;;;;31415:24:0;:8;-1:-1:-1;;;;;31415:24:0;;;31407:62;;;;-1:-1:-1;;;31407:62:0;;;;;;;:::i;:::-;31527:8;31482:18;:32;31501:12;:10;:12::i;:::-;-1:-1:-1;;;;;31482:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;31482:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;31482:53:0;;;;;;;;;;;31566:12;:10;:12::i;:::-;-1:-1:-1;;;;;31551:48:0;;31590:8;31551:48;;;;;;:::i;:::-;;;;;;;;31312:295;;:::o;58393:998::-;58477:17;;;;;;;58469:54;;;;-1:-1:-1;;;58469:54:0;;;;;;;:::i;:::-;58553:10;58542:22;;;;:10;:22;;;;;;;;58534:64;;;;-1:-1:-1;;;58534:64:0;;;;;;;:::i;:::-;55859:31;55804:4;55756:2;55859:31;:::i;:::-;58617:13;:11;:13::i;:::-;:33;58609:71;;;;-1:-1:-1;;;58609:71:0;;;;;;;:::i;:::-;58717:16;;58699:14;:34;;58691:77;;;;-1:-1:-1;;;58691:77:0;;;;;;;:::i;:::-;55804:4;58807:14;58787:17;;:34;;;;:::i;:::-;:50;;58779:106;;;;-1:-1:-1;;;58779:106:0;;;;;;;:::i;:::-;58954:16;;58922:10;58904:29;;;;:17;:29;;;;;;:46;;58936:14;;58904:46;:::i;:::-;:66;;58896:123;;;;-1:-1:-1;;;58896:123:0;;;;;;;:::i;:::-;59126:9;59121:263;59145:14;59141:1;:18;59121:263;;;59181:15;59218:17;;55756:2;59199:36;;;;:::i;:::-;:40;;59238:1;59199:40;:::i;:::-;59181:58;;59277:1;59256:17;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;59311:10:0;59293:29;;;;:17;:29;;;;;:34;;59326:1;;59293:29;:34;;59326:1;;59293:34;:::i;:::-;;;;-1:-1:-1;59342:30:0;;-1:-1:-1;59352:10:0;59364:7;59342:9;:30::i;:::-;-1:-1:-1;59161:3:0;;;;:::i;:::-;;;;59121:263;;57061:296;48931:12;:10;:12::i;:::-;-1:-1:-1;;;;;48920:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48920:23:0;;48912:68;;;;-1:-1:-1;;;48912:68:0;;;;;;;:::i;:::-;57164:9:::1;57159:191;57179:20:::0;;::::1;57159:191;;;57253:1;57229:9:::0;;57239:1;57229:12;;::::1;;;-1:-1:-1::0;;;57229:12:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;57229:26:0::1;;;57221:68;;;;-1:-1:-1::0;;;57221:68:0::1;;;;;;;:::i;:::-;57333:5;57306:10;:24;57317:9;;57327:1;57317:12;;;;;-1:-1:-1::0;;;57317:12:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;57306:24:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;57306:24:0;:32;;-1:-1:-1;;57306:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;57201:3;::::1;::::0;::::1;:::i;:::-;;;;57159:191;;56938:115:::0;-1:-1:-1;;;;;57029:16:0;57005:4;57029:16;;;:10;:16;;;;;;;;;56938:115::o;32575:328::-;32750:41;32769:12;:10;:12::i;:::-;32783:7;32750:18;:41::i;:::-;32742:103;;;;-1:-1:-1;;;32742:103:0;;;;;;;:::i;:::-;32856:39;32870:4;32876:2;32880:7;32889:5;32856:13;:39::i;:::-;32575:328;;;;:::o;60974:793::-;61047:13;61081:16;61089:7;61081;:16::i;:::-;61073:76;;;;-1:-1:-1;;;61073:76:0;;;;;;;:::i;:::-;61162:23;61188:19;;;:10;:19;;;;;61162:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61218:18;61239:10;:8;:10::i;:::-;61218:31;;61331:4;61325:18;61347:1;61325:23;61321:72;;;-1:-1:-1;61372:9:0;-1:-1:-1;61365:16:0;;61321:72;61497:23;;:27;61493:108;;61572:4;61578:9;61555:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61541:48;;;;;;61493:108;61733:4;61739:18;:7;:16;:18::i;:::-;61716:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61702:57;;;;60974:793;;;:::o;61779:842::-;61847:13;61881:16;61889:7;61881;:16::i;:::-;61873:76;;;;-1:-1:-1;;;61873:76:0;;;;;;;:::i;:::-;61962:27;61992:23;;;:14;:23;;;;;61962:53;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62026:22;62051:14;:12;:14::i;:::-;62026:39;;62147:8;62141:22;62167:1;62141:27;62137:80;;;-1:-1:-1;62192:13:0;-1:-1:-1;62185:20:0;;62137:80;62321:27;;:31;62317:127;;62400:8;62410:13;62383:48;;;;;;;;;:::i;62317:127::-;62576:8;62586:18;:7;:16;:18::i;:::-;62559:53;;;;;;;;;:::i;56033:30::-;;;;:::o;55897:43::-;55938:2;55897:43;:::o;56070:32::-;;;;:::o;31678:164::-;-1:-1:-1;;;;;31799:25:0;;;31775:4;31799:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;31678:164::o;49600:192::-;48931:12;:10;:12::i;:::-;-1:-1:-1;;;;;48920:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48920:23:0;;48912:68;;;;-1:-1:-1;;;48912:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49689:22:0;::::1;49681:73;;;;-1:-1:-1::0;;;49681:73:0::1;;;;;;;:::i;:::-;49765:19;49775:8;49765:9;:19::i;:::-;49600:192:::0;:::o;28515:305::-;28617:4;-1:-1:-1;;;;;;28654:40:0;;-1:-1:-1;;;28654:40:0;;:105;;-1:-1:-1;;;;;;;28711:48:0;;-1:-1:-1;;;28711:48:0;28654:105;:158;;;;28776:36;28800:11;28776:23;:36::i;34413:127::-;34478:4;34502:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34502:16:0;:30;;;34413:127::o;26989:98::-;27069:10;26989:98;:::o;38395:174::-;38470:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;38470:29:0;-1:-1:-1;;;;;38470:29:0;;;;;;;;:24;;38524:23;38470:24;38524:14;:23::i;:::-;-1:-1:-1;;;;;38515:46:0;;;;;;;;;;;38395:174;;:::o;34707:348::-;34800:4;34825:16;34833:7;34825;:16::i;:::-;34817:73;;;;-1:-1:-1;;;34817:73:0;;;;;;;:::i;:::-;34901:13;34917:23;34932:7;34917:14;:23::i;:::-;34901:39;;34970:5;-1:-1:-1;;;;;34959:16:0;:7;-1:-1:-1;;;;;34959:16:0;;:51;;;;35003:7;-1:-1:-1;;;;;34979:31:0;:20;34991:7;34979:11;:20::i;:::-;-1:-1:-1;;;;;34979:31:0;;34959:51;:87;;;;35014:32;35031:5;35038:7;35014:16;:32::i;:::-;34951:96;34707:348;-1:-1:-1;;;;34707:348:0:o;37699:578::-;37858:4;-1:-1:-1;;;;;37831:31:0;:23;37846:7;37831:14;:23::i;:::-;-1:-1:-1;;;;;37831:31:0;;37823:85;;;;-1:-1:-1;;;37823:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37927:16:0;;37919:65;;;;-1:-1:-1;;;37919:65:0;;;;;;;:::i;:::-;37997:39;38018:4;38024:2;38028:7;37997:20;:39::i;:::-;38101:29;38118:1;38122:7;38101:8;:29::i;:::-;-1:-1:-1;;;;;38143:15:0;;;;;;:9;:15;;;;;:20;;38162:1;;38143:15;:20;;38162:1;;38143:20;:::i;:::-;;;;-1:-1:-1;;;;;;;38174:13:0;;;;;;:9;:13;;;;;:18;;38191:1;;38174:13;:18;;38191:1;;38174:18;:::i;:::-;;;;-1:-1:-1;;38203:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;38203:21:0;-1:-1:-1;;;;;38203:21:0;;;;;;;;;38242:27;;38203:16;;38242:27;;;;;;;37699:578;;;:::o;49800:173::-;49875:6;;;-1:-1:-1;;;;;49892:17:0;;;-1:-1:-1;;;;;;49892:17:0;;;;;;;49925:40;;49875:6;;;49892:17;49875:6;;49925:40;;49856:16;;49925:40;49800:173;;:::o;35397:110::-;35473:26;35483:2;35487:7;35473:26;;;;;;;;;;;;:9;:26::i;33785:315::-;33942:28;33952:4;33958:2;33962:7;33942:9;:28::i;:::-;33989:48;34012:4;34018:2;34022:7;34031:5;33989:22;:48::i;:::-;33981:111;;;;-1:-1:-1;;;33981:111:0;;;;;;;:::i;60282:117::-;60342:13;60375:16;60368:23;;;;;:::i;15619:723::-;15675:13;15896:10;15892:53;;-1:-1:-1;15923:10:0;;;;;;;;;;;;-1:-1:-1;;;15923:10:0;;;;;;15892:53;15970:5;15955:12;16011:78;16018:9;;16011:78;;16044:8;;;;:::i;:::-;;-1:-1:-1;16067:10:0;;-1:-1:-1;16075:2:0;16067:10;;:::i;:::-;;;16011:78;;;16099:19;16131:6;16121:17;;;;;;-1:-1:-1;;;16121:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16121:17:0;;16099:39;;16149:154;16156:10;;16149:154;;16183:11;16193:1;16183:11;;:::i;:::-;;-1:-1:-1;16252:10:0;16260:2;16252:5;:10;:::i;:::-;16239:24;;:2;:24;:::i;:::-;16226:39;;16209:6;16216;16209:14;;;;;;-1:-1:-1;;;16209:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;16209:56:0;;;;;;;;-1:-1:-1;16280:11:0;16289:2;16280:11;;:::i;:::-;;;16149:154;;60411:116;60466:13;60499:20;60492:27;;;;;:::i;1674:157::-;-1:-1:-1;;;;;;1783:40:0;;-1:-1:-1;;;1783:40:0;1674:157;;;:::o;43238:589::-;43382:45;43409:4;43415:2;43419:7;43382:26;:45::i;:::-;-1:-1:-1;;;;;43444:18:0;;43440:187;;43479:40;43511:7;43479:31;:40::i;:::-;43440:187;;;43549:2;-1:-1:-1;;;;;43541:10:0;:4;-1:-1:-1;;;;;43541:10:0;;43537:90;;43568:47;43601:4;43607:7;43568:32;:47::i;:::-;-1:-1:-1;;;;;43641:16:0;;43637:183;;43674:45;43711:7;43674:36;:45::i;:::-;43637:183;;;43747:4;-1:-1:-1;;;;;43741:10:0;:2;-1:-1:-1;;;;;43741:10:0;;43737:83;;43768:40;43796:2;43800:7;43768:27;:40::i;35734:321::-;35864:18;35870:2;35874:7;35864:5;:18::i;:::-;35915:54;35946:1;35950:2;35954:7;35963:5;35915:22;:54::i;:::-;35893:154;;;;-1:-1:-1;;;35893:154:0;;;;;;;:::i;39134:799::-;39289:4;39310:15;:2;-1:-1:-1;;;;;39310:13:0;;:15::i;:::-;39306:620;;;39362:2;-1:-1:-1;;;;;39346:36:0;;39383:12;:10;:12::i;:::-;39397:4;39403:7;39412:5;39346:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39346:72:0;;;;;;;;-1:-1:-1;;39346:72:0;;;;;;;;;;;;:::i;:::-;;;39342:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39588:13:0;;39584:272;;39631:60;;-1:-1:-1;;;39631:60:0;;;;;;;:::i;39584:272::-;39806:6;39800:13;39791:6;39787:2;39783:15;39776:38;39342:529;-1:-1:-1;;;;;;39469:51:0;-1:-1:-1;;;39469:51:0;;-1:-1:-1;39462:58:0;;39306:620;-1:-1:-1;39910:4:0;39134:799;;;;;;:::o;44550:164::-;44654:10;:17;;44627:24;;;;:15;:24;;;;;:44;;;44682:24;;;;;;;;;;;;44550:164::o;45341:988::-;45607:22;45657:1;45632:22;45649:4;45632:16;:22::i;:::-;:26;;;;:::i;:::-;45669:18;45690:26;;;:17;:26;;;;;;45607:51;;-1:-1:-1;45823:28:0;;;45819:328;;-1:-1:-1;;;;;45890:18:0;;45868:19;45890:18;;;:12;:18;;;;;;;;:34;;;;;;;;;45941:30;;;;;;:44;;;46058:30;;:17;:30;;;;;:43;;;45819:328;-1:-1:-1;46243:26:0;;;;:17;:26;;;;;;;;46236:33;;;-1:-1:-1;;;;;46287:18:0;;;;;:12;:18;;;;;:34;;;;;;;46280:41;45341:988::o;46624:1079::-;46902:10;:17;46877:22;;46902:21;;46922:1;;46902:21;:::i;:::-;46934:18;46955:24;;;:15;:24;;;;;;47328:10;:26;;46877:46;;-1:-1:-1;46955:24:0;;46877:46;;47328:26;;;;-1:-1:-1;;;47328:26:0;;;;;;;;;;;;;;;;;47306:48;;47392:11;47367:10;47378;47367:22;;;;;;-1:-1:-1;;;47367:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;47472:28;;;:15;:28;;;;;;;:41;;;47644:24;;;;;47637:31;47679:10;:16;;;;;-1:-1:-1;;;47679:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;46624:1079;;;;:::o;44128:221::-;44213:14;44230:20;44247:2;44230:16;:20::i;:::-;-1:-1:-1;;;;;44261:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;44306:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;44128:221:0:o;36391:382::-;-1:-1:-1;;;;;36471:16:0;;36463:61;;;;-1:-1:-1;;;36463:61:0;;;;;;;:::i;:::-;36544:16;36552:7;36544;:16::i;:::-;36543:17;36535:58;;;;-1:-1:-1;;;36535:58:0;;;;;;;:::i;:::-;36606:45;36635:1;36639:2;36643:7;36606:20;:45::i;:::-;-1:-1:-1;;;;;36664:13:0;;;;;;:9;:13;;;;;:18;;36681:1;;36664:13;:18;;36681:1;;36664:18;:::i;:::-;;;;-1:-1:-1;;36693:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36693:21:0;-1:-1:-1;;;;;36693:21:0;;;;;;;;36732:33;;36693:16;;;36732:33;;36693:16;;36732:33;36391:382;;:::o;18144:387::-;18467:20;18515:8;;;18144: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:666::-;;;3200:2;3188:9;3179:7;3175:23;3171:32;3168:2;;;3221:6;3213;3206:22;3168:2;3266:9;3253:23;3295:18;3336:2;3328:6;3325:14;3322:2;;;3357:6;3349;3342:22;3322:2;3400:6;3389:9;3385:22;3375:32;;3445:7;3438:4;3434:2;3430:13;3426:27;3416:2;;3472:6;3464;3457:22;3416:2;3517;3504:16;3543:2;3535:6;3532:14;3529:2;;;3564:6;3556;3549:22;3529:2;3623:7;3618:2;3612;3604:6;3600:15;3596:2;3592:24;3588:33;3585:46;3582:2;;;3649:6;3641;3634:22;3582:2;3685;3677:11;;;;;3707:6;;-1:-1:-1;3158:561:1;;-1:-1:-1;;;;3158:561:1:o;3724:192::-;;3833:2;3821:9;3812:7;3808:23;3804:32;3801:2;;;3854:6;3846;3839:22;3801:2;3882:28;3900:9;3882:28;:::i;3921:257::-;;4032:2;4020:9;4011:7;4007:23;4003:32;4000:2;;;4053:6;4045;4038:22;4000:2;4097:9;4084:23;4116:32;4142:5;4116:32;:::i;4183:261::-;;4305:2;4293:9;4284:7;4280:23;4276:32;4273:2;;;4326:6;4318;4311:22;4273:2;4363:9;4357:16;4382:32;4408:5;4382:32;:::i;4449:482::-;;4571:2;4559:9;4550:7;4546:23;4542:32;4539:2;;;4592:6;4584;4577:22;4539:2;4637:9;4624:23;4670:18;4662:6;4659:30;4656:2;;;4707:6;4699;4692:22;4656:2;4735:22;;4788:4;4780:13;;4776:27;-1:-1:-1;4766:2:1;;4822:6;4814;4807:22;4766:2;4850:75;4917:7;4912:2;4899:16;4894:2;4890;4886:11;4850:75;:::i;4936:190::-;;5048:2;5036:9;5027:7;5023:23;5019:32;5016:2;;;5069:6;5061;5054:22;5016:2;-1:-1:-1;5097:23:1;;5006:120;-1:-1:-1;5006:120:1:o;5131:266::-;;;5260:2;5248:9;5239:7;5235:23;5231:32;5228:2;;;5281:6;5273;5266:22;5228:2;5322:9;5309:23;5299:33;;5351:40;5387:2;5376:9;5372:18;5351:40;:::i;5402:259::-;;5483:5;5477:12;5510:6;5505:3;5498:19;5526:63;5582:6;5575:4;5570:3;5566:14;5559:4;5552:5;5548:16;5526:63;:::i;:::-;5643:2;5622:15;-1:-1:-1;;5618:29:1;5609:39;;;;5650:4;5605:50;;5453:208;-1:-1:-1;;5453:208:1:o;5666:470::-;;5883:6;5877:13;5899:53;5945:6;5940:3;5933:4;5925:6;5921:17;5899:53;:::i;:::-;6015:13;;5974:16;;;;6037:57;6015:13;5974:16;6071:4;6059:17;;6037:57;:::i;:::-;6110:20;;5853:283;-1:-1:-1;;;;5853:283:1:o;6141:636::-;;6459:6;6453:13;6475:53;6521:6;6516:3;6509:4;6501:6;6497:17;6475:53;:::i;:::-;6591:13;;6550:16;;;;6613:57;6591:13;6550:16;6647:4;6635:17;;6613:57;:::i;:::-;-1:-1:-1;;;6692:20:1;;6721:21;;;6769:1;6758:13;;6429:348;-1:-1:-1;;;;6429:348:1:o;6782:203::-;-1:-1:-1;;;;;6946:32:1;;;;6928:51;;6916:2;6901:18;;6883:102::o;6990:490::-;-1:-1:-1;;;;;7259:15:1;;;7241:34;;7311:15;;7306:2;7291:18;;7284:43;7358:2;7343:18;;7336:34;;;7406:3;7401:2;7386:18;;7379:31;;;6990:490;;7427:47;;7454:19;;7446:6;7427:47;:::i;:::-;7419:55;7193:287;-1:-1:-1;;;;;;7193:287:1:o;7485:187::-;7650:14;;7643:22;7625:41;;7613:2;7598:18;;7580:92::o;7677:221::-;;7826:2;7815:9;7808:21;7846:46;7888:2;7877:9;7873:18;7865:6;7846:46;:::i;7903:348::-;8105:2;8087:21;;;8144:2;8124:18;;;8117:30;8183:26;8178:2;8163:18;;8156:54;8242:2;8227:18;;8077:174::o;8256:353::-;8458:2;8440:21;;;8497:2;8477:18;;;8470:30;8536:31;8531:2;8516:18;;8509:59;8600:2;8585:18;;8430:179::o;8614:353::-;8816:2;8798:21;;;8855:2;8835:18;;;8828:30;8894:31;8889:2;8874:18;;8867:59;8958:2;8943:18;;8788:179::o;8972:407::-;9174:2;9156:21;;;9213:2;9193:18;;;9186:30;9252:34;9247:2;9232:18;;9225:62;-1:-1:-1;;;9318:2:1;9303:18;;9296:41;9369:3;9354:19;;9146:233::o;9384:414::-;9586:2;9568:21;;;9625:2;9605:18;;;9598:30;9664:34;9659:2;9644:18;;9637:62;-1:-1:-1;;;9730:2:1;9715:18;;9708:48;9788:3;9773:19;;9558:240::o;9803:402::-;10005:2;9987:21;;;10044:2;10024:18;;;10017:30;10083:34;10078:2;10063:18;;10056:62;-1:-1:-1;;;10149:2:1;10134:18;;10127:36;10195:3;10180:19;;9977:228::o;10210:352::-;10412:2;10394:21;;;10451:2;10431:18;;;10424:30;10490;10485:2;10470:18;;10463:58;10553:2;10538:18;;10384:178::o;10567:349::-;10769:2;10751:21;;;10808:2;10788:18;;;10781:30;10847:27;10842:2;10827:18;;10820:55;10907:2;10892:18;;10741:175::o;10921:407::-;11123:2;11105:21;;;11162:2;11142:18;;;11135:30;11201:34;11196:2;11181:18;;11174:62;-1:-1:-1;;;11267:2:1;11252:18;;11245:41;11318:3;11303:19;;11095:233::o;11333:400::-;11535:2;11517:21;;;11574:2;11554:18;;;11547:30;11613:34;11608:2;11593:18;;11586:62;-1:-1:-1;;;11679:2:1;11664:18;;11657:34;11723:3;11708:19;;11507:226::o;11738:349::-;11940:2;11922:21;;;11979:2;11959:18;;;11952:30;12018:27;12013:2;11998:18;;11991:55;12078:2;12063:18;;11912:175::o;12092:408::-;12294:2;12276:21;;;12333:2;12313:18;;;12306:30;12372:34;12367:2;12352:18;;12345:62;-1:-1:-1;;;12438:2:1;12423:18;;12416:42;12490:3;12475:19;;12266:234::o;12505:352::-;12707:2;12689:21;;;12746:2;12726:18;;;12719:30;12785;12780:2;12765:18;;12758:58;12848:2;12833:18;;12679:178::o;12862:408::-;13064:2;13046:21;;;13103:2;13083:18;;;13076:30;13142:34;13137:2;13122:18;;13115:62;-1:-1:-1;;;13208:2:1;13193:18;;13186:42;13260:3;13245:19;;13036:234::o;13275:397::-;13477:2;13459:21;;;13516:2;13496:18;;;13489:30;13555:34;13550:2;13535:18;;13528:62;-1:-1:-1;;;13621:2:1;13606:18;;13599:31;13662:3;13647:19;;13449:223::o;13677:397::-;13879:2;13861:21;;;13918:2;13898:18;;;13891:30;13957:34;13952:2;13937:18;;13930:62;-1:-1:-1;;;14023:2:1;14008:18;;14001:31;14064:3;14049:19;;13851:223::o;14079:420::-;14281:2;14263:21;;;14320:2;14300:18;;;14293:30;14359:34;14354:2;14339:18;;14332:62;14430:26;14425:2;14410:18;;14403:54;14489:3;14474:19;;14253:246::o;14504:406::-;14706:2;14688:21;;;14745:2;14725:18;;;14718:30;14784:34;14779:2;14764:18;;14757:62;-1:-1:-1;;;14850:2:1;14835:18;;14828:40;14900:3;14885:19;;14678:232::o;14915:405::-;15117:2;15099:21;;;15156:2;15136:18;;;15129:30;15195:34;15190:2;15175:18;;15168:62;-1:-1:-1;;;15261:2:1;15246:18;;15239:39;15310:3;15295:19;;15089:231::o;15325:349::-;15527:2;15509:21;;;15566:2;15546:18;;;15539:30;15605:27;15600:2;15585:18;;15578:55;15665:2;15650:18;;15499:175::o;15679:356::-;15881:2;15863:21;;;15900:18;;;15893:30;15959:34;15954:2;15939:18;;15932:62;16026:2;16011:18;;15853:182::o;16040:408::-;16242:2;16224:21;;;16281:2;16261:18;;;16254:30;16320:34;16315:2;16300:18;;16293:62;-1:-1:-1;;;16386:2:1;16371:18;;16364:42;16438:3;16423:19;;16214:234::o;16453:356::-;16655:2;16637:21;;;16674:18;;;16667:30;16733:34;16728:2;16713:18;;16706:62;16800:2;16785:18;;16627:182::o;16814:350::-;17016:2;16998:21;;;17055:2;17035:18;;;17028:30;17094:28;17089:2;17074:18;;17067:56;17155:2;17140:18;;16988:176::o;17169:405::-;17371:2;17353:21;;;17410:2;17390:18;;;17383:30;17449:34;17444:2;17429:18;;17422:62;-1:-1:-1;;;17515:2:1;17500:18;;17493:39;17564:3;17549:19;;17343:231::o;17579:411::-;17781:2;17763:21;;;17820:2;17800:18;;;17793:30;17859:34;17854:2;17839:18;;17832:62;-1:-1:-1;;;17925:2:1;17910:18;;17903:45;17980:3;17965:19;;17753:237::o;17995:397::-;18197:2;18179:21;;;18236:2;18216:18;;;18209:30;18275:34;18270:2;18255:18;;18248:62;-1:-1:-1;;;18341:2:1;18326:18;;18319:31;18382:3;18367:19;;18169:223::o;18397:413::-;18599:2;18581:21;;;18638:2;18618:18;;;18611:30;18677:34;18672:2;18657:18;;18650:62;-1:-1:-1;;;18743:2:1;18728:18;;18721:47;18800:3;18785:19;;18571:239::o;18815:354::-;19017:2;18999:21;;;19056:2;19036:18;;;19029:30;19095:32;19090:2;19075:18;;19068:60;19160:2;19145:18;;18989:180::o;19174:408::-;19376:2;19358:21;;;19415:2;19395:18;;;19388:30;19454:34;19449:2;19434:18;;19427:62;-1:-1:-1;;;19520:2:1;19505:18;;19498:42;19572:3;19557:19;;19348:234::o;19587:354::-;19789:2;19771:21;;;19828:2;19808:18;;;19801:30;19867:32;19862:2;19847:18;;19840:60;19932:2;19917:18;;19761:180::o;19946:351::-;20148:2;20130:21;;;20187:2;20167:18;;;20160:30;20226:29;20221:2;20206:18;;20199:57;20288:2;20273:18;;20120:177::o;20302:::-;20448:25;;;20436:2;20421:18;;20403:76::o;20484:128::-;;20555:1;20551:6;20548:1;20545:13;20542:2;;;20561:18;;:::i;:::-;-1:-1:-1;20597:9:1;;20532:80::o;20617:120::-;;20683:1;20673:2;;20688:18;;:::i;:::-;-1:-1:-1;20722:9:1;;20663:74::o;20742:168::-;;20848:1;20844;20840:6;20836:14;20833:1;20830:21;20825:1;20818:9;20811:17;20807:45;20804:2;;;20855:18;;:::i;:::-;-1:-1:-1;20895:9:1;;20794:116::o;20915:125::-;;20983:1;20980;20977:8;20974:2;;;20988:18;;:::i;:::-;-1:-1:-1;21025:9:1;;20964:76::o;21045:258::-;21117:1;21127:113;21141:6;21138:1;21135:13;21127:113;;;21217:11;;;21211:18;21198:11;;;21191:39;21163:2;21156:10;21127:113;;;21258:6;21255:1;21252:13;21249:2;;;-1:-1:-1;;21293:1:1;21275:16;;21268:27;21098:205::o;21308:380::-;21393:1;21383:12;;21440:1;21430:12;;;21451:2;;21505:4;21497:6;21493:17;21483:27;;21451:2;21558;21550:6;21547:14;21527:18;21524:38;21521:2;;;21604:10;21599:3;21595:20;21592:1;21585:31;21639:4;21636:1;21629:15;21667:4;21664:1;21657:15;21521:2;;21363:325;;;:::o;21693:135::-;;-1:-1:-1;;21753:17:1;;21750:2;;;21773:18;;:::i;:::-;-1:-1:-1;21820:1:1;21809:13;;21740:88::o;21833:112::-;;21891:1;21881:2;;21896:18;;:::i;:::-;-1:-1:-1;21930:9:1;;21871:74::o;21950:127::-;22011:10;22006:3;22002:20;21999:1;21992:31;22042:4;22039:1;22032:15;22066:4;22063:1;22056:15;22082:127;22143:10;22138:3;22134:20;22131:1;22124:31;22174:4;22171:1;22164:15;22198:4;22195:1;22188:15;22214:127;22275:10;22270:3;22266:20;22263:1;22256:31;22306:4;22303:1;22296:15;22330:4;22327:1;22320:15;22346:133;-1:-1:-1;;;;;;22422:32:1;;22412:43;;22402:2;;22469:1;22466;22459:12

Swarm Source

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